|
|
1.1 root 1: #include "test_tool.h"
2: #include "event.h"
3: #include "eventqueue.h"
4: #include <string>
5:
6: static void
7: do_test()
8: {
9: eventqueue q {};
10: std::vector<Event> events {};
11: Event *e;
12: int N;
13:
14: // 実体を用意する
15: N = 9;
16: for (int i = 0; i < N; i++) {
17: Event ev;
18: ev.vtime = i + 1;
19: events.emplace_back(ev);
20: }
21:
22: //
23: // Test1. 正順に追加
24: //
25: for (int i = 0; i < N; i++) {
26: q.push(&events[i]);
27: }
28: // 取り出して検査
29: for (int i = 0; i < N; i++) {
30: // 先頭を参照
31: e = q.front();
32: if (e == NULL) {
33: printf("%s:%d: e expects non-null but null\n", __func__, __LINE__);
34: exit(1);
35: }
36: xp_eq(i + 1, e->vtime, string_format("i=%d", i));
37:
38: // 取り出す
39: q.pop_front();
40: xp_eq(N - 1 - i, q.size());
41: }
42: // 全部なくなった (q.front() は empty() 時に呼んではいけない)
43: xp_eq(true, q.empty());
44:
45: //
46: // Test2. 逆順に追加
47: //
48: for (int i = N - 1; i >= 0; i--) {
49: q.push(&events[i]);
50: }
51: // 取り出して検査
52: for (int i = 0; i < N; i++) {
53: // 先頭を参照
54: e = q.front();
55: if (e == NULL) {
56: printf("%s:%d: e expects non-null but null\n", __func__, __LINE__);
57: exit(1);
58: }
59: xp_eq(i + 1, e->vtime);
60:
61: // 取り出す
62: q.pop_front();
63: xp_eq(N - 1 - i, q.size());
64: }
65: // 全部なくなった (q.front() は empty() 時に呼んではいけない)
66: xp_eq(true, q.empty());
67:
68: //
69: // Test3. 同値を含む。(同値同士はどう評価しても構わない)
70: //
71: N = 4;
72: events[0].vtime = 10;
73: events[1].vtime = 40;
74: events[2].vtime = 20;
75: events[3].vtime = 20;
76: for (int i = 0; i < N; i++) {
77: q.push(&events[i]);
78: }
79: // 取り出して検査
80: for (int i = 0; i < N; i++) {
81: // 先頭を取り出す。この辺が動いてることはすでに確認済み
82: e = q.front();
83: q.pop_front();
84: // 評価する。同値同士の順序は問わない
85: switch (i) {
86: case 0:
87: xp_eq(10, e->vtime);
88: break;
89: case 1:
90: case 2:
91: xp_eq(20, e->vtime);
92: break;
93: case 3:
94: xp_eq(40, e->vtime);
95: break;
96: }
97: }
98:
99: //
100: // Test4. 削除
101: //
102: N = 4;
103: // 中間の events[2] を削除
104: events[0].vtime = 10;
105: events[1].vtime = 40;
106: events[2].vtime = 20;
107: events[3].vtime = 20;
108: for (int i = 0; i < N; i++) {
109: q.push(&events[i]);
110: }
111: q.erase(&events[2]);
112: e = q.front(); q.pop_front(); xp_eq(10, e->vtime);
113: e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
114: e = q.front(); q.pop_front(); xp_eq(40, e->vtime);
115: xp_eq(true, q.empty());
116:
117: // 末尾を削除
118: N = 4;
119: events[0].vtime = 10;
120: events[1].vtime = 40;
121: events[2].vtime = 20;
122: events[3].vtime = 20;
123: for (int i = 0; i < N; i++) {
124: q.push(&events[i]);
125: }
126: q.erase(&events[1]);
127: e = q.front(); q.pop_front(); xp_eq(10, e->vtime);
128: e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
129: e = q.front(); q.pop_front(); xp_eq(20, e->vtime);
130: xp_eq(true, q.empty());
131:
132: // 先頭を削除
133: N = 2;
134: events[0].vtime = 10;
135: events[1].vtime = 20;
136: for (int i = 0; i < N; i++) {
137: q.push(&events[i]);
138: }
139: q.erase(&events[0]);
140: e = q.front(); xp_eq(20, e->vtime);
141: xp_eq(false, q.empty());
142: // 最後の一つを削除
143: q.erase(&events[1]);
144: xp_eq(true, q.empty());
145: }
146:
147: static void
148: do_perf()
149: {
150: }
151:
152: static void
153: usage()
154: {
155: fprintf(stderr, "usage: %s [test | perf]\n", getprogname());
156: exit(1);
157: }
158:
159: int
160: main(int ac, char *av[])
161: {
162: bool perf = false;
163:
164: for (int i = 1; i < ac; i++) {
165: std::string cmd = av[i];
166: if (cmd == "test") {
167: // default
168: } else if (cmd == "perf") {
169: perf = true;
170: } else {
171: usage();
172: }
173: }
174:
175: // テストは常に実施
176: do_test();
177: // 測定は指定された時だけ
178: if (perf) {
179: do_perf();
180: }
181: return 0;
182: }
183:
184: // 以下リンカを通すためのダミー
185: Event::Event()
186: {
187: }
188: Event::~Event()
189: {
190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.