Add <functional> to files that use std::function
[lsnes.git] / src / test / rrdata-test.cpp
blob304081b3e0d41a4307c2b78b31912a7339e0444f
1 #include "rrdata.hpp"
2 #include "string.hpp"
3 #include "minmax.hpp"
4 #include <functional>
5 #include <iostream>
6 #include "library/directory.hpp"
7 #include <sstream>
9 uint64_t get_file_size(const std::string& filename)
11 uintmax_t size = directory::size(filename);
12 if(size == static_cast<uintmax_t>(-1))
13 return 0;
14 return size;
17 struct test
19 const char* name;
20 std::function<bool()> run;
23 struct test tests[] = {
24 {"instance default ctor", []() {
25 rrdata_set::instance i;
26 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000000";
27 }},{"instance bytes ctor", []() {
28 uint8_t buf[32] = {0};
29 buf[30] = 1;
30 rrdata_set::instance i(buf);
31 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000100";
32 }},{"instance string ctor #1", []() {
33 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000763234676");
34 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000763234676";
35 }},{"instance string ctor #2", []() {
36 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000763afba76");
37 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000763AFBA76";
38 }},{"instance string ctor #3", []() {
39 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000763AFBA76");
40 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000763AFBA76";
41 }},{"< #1", []() {
42 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000000");
43 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000000");
44 return !(i1 < i2);
45 }},{"< #2", []() {
46 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000000");
47 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000001");
48 return i1 < i2;
49 }},{"< #3", []() {
50 rrdata_set::instance i1("00000000000000000000000000000000000000000000000000000000000000FF");
51 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000100");
52 return i1 < i2;
53 }},{"< #4", []() {
54 rrdata_set::instance i1("00000000000000000000000000000000000000000000000000000000000000FF");
55 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000100");
56 return !(i2 < i1);
57 }},{"== #1", []() {
58 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000001");
59 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000001");
60 return (i2 == i1);
61 }},{"== #2", []() {
62 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000001");
63 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000101");
64 return !(i2 == i1);
65 }},{"== #3", []() {
66 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000001");
67 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000000");
68 return !(i2 == i1);
69 }},{"post-++ #1", []() {
70 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000000");
71 i++;
72 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000001";
73 }},{"post-++ #2", []() {
74 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000001");
75 i++;
76 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000002";
77 }},{"post-++ #3", []() {
78 rrdata_set::instance i("000000000000000000000000000000000000000000000000000000000000000F");
79 i++;
80 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000010";
81 }},{"post-++ #4", []() {
82 rrdata_set::instance i("00000000000000000000000000000000000000000000000000000000000000FF");
83 i++;
84 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000100";
85 }},{"post-++ #5", []() {
86 rrdata_set::instance i("000000000000000000000000000000000000000000000000000000000000FFFF");
87 i++;
88 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000010000";
89 }},{"post-++ #6", []() {
90 rrdata_set::instance i("000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF");
91 i++;
92 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000010000000000000000";
93 }},{"post-++ #7", []() {
94 rrdata_set::instance i("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
95 i++;
96 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000000";
97 }},{"post-++ #8", []() {
98 rrdata_set::instance i("00000000000000000000000000000000000000000000000000000000000000FE");
99 i++;
100 return (stringfmt() << i).str() == "00000000000000000000000000000000000000000000000000000000000000FF";
101 }},{"pre-++ #1", []() {
102 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000000");
103 ++i;
104 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000001";
105 }},{"pre-++ #2", []() {
106 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000001");
107 ++i;
108 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000002";
109 }},{"pre-++ #3", []() {
110 rrdata_set::instance i("000000000000000000000000000000000000000000000000000000000000000F");
111 ++i;
112 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000010";
113 }},{"pre-++ #4", []() {
114 rrdata_set::instance i("00000000000000000000000000000000000000000000000000000000000000FF");
115 ++i;
116 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000100";
117 }},{"pre-++ #5", []() {
118 rrdata_set::instance i("000000000000000000000000000000000000000000000000000000000000FFFF");
119 ++i;
120 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000010000";
121 }},{"pre-++ #6", []() {
122 rrdata_set::instance i("000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF");
123 ++i;
124 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000010000000000000000";
125 }},{"pre-++ #7", []() {
126 rrdata_set::instance i("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
127 ++i;
128 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000000";
129 }},{"pre-++ #8", []() {
130 rrdata_set::instance i("00000000000000000000000000000000000000000000000000000000000000FE");
131 ++i;
132 return (stringfmt() << i).str() == "00000000000000000000000000000000000000000000000000000000000000FF";
133 }},{"Operator+ #1", []() {
134 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000000");
135 i = i + 0x12;
136 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000012";
137 }},{"Operator+ #2", []() {
138 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000000");
139 i = i + 0x1234;
140 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000001234";
141 }},{"Operator+ #3", []() {
142 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000001");
143 i = i + 0xFF;
144 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000000100";
145 }},{"Operator+ #4", []() {
146 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000001");
147 i = i + 0xFFFF;
148 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000010000";
149 }},{"Operator+ #4", []() {
150 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000102");
151 i = i + 0xFEFF;
152 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000000010001";
153 }},{"Operator+ #4", []() {
154 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000002");
155 i = i + 0xFFFFFFFFU;
156 return (stringfmt() << i).str() == "0000000000000000000000000000000000000000000000000000000100000001";
157 }},{"Operator- #1", []() {
158 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000002");
159 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000002");
160 return (i1 - i2) == 0;
161 }},{"Operator- #2", []() {
162 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000001");
163 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000002");
164 return (i1 - i2) == std::numeric_limits<unsigned>::max();
165 }},{"Operator- #3", []() {
166 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000002");
167 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000001");
168 return (i1 - i2) == 1;
169 }},{"Operator- #4", []() {
170 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000001");
171 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000007");
172 return (i1 - i2) == std::numeric_limits<unsigned>::max();
173 }},{"Operator- #5", []() {
174 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000236");
175 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000123");
176 return (i1 - i2) == 0x113;
177 }},{"Operator- #6", []() {
178 rrdata_set::instance i1("00000000000000000000000000000000000000000000000000000000FFFFFFFE");
179 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000000");
180 return (i1 - i2) == 0xFFFFFFFEU;
181 }},{"Operator- #7", []() {
182 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000100000000");
183 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000002");
184 return (i1 - i2) == 0xFFFFFFFEU;
185 }},{"Operator- #8", []() {
186 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000001000000001");
187 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000002");
188 return (i1 - i2) == 0xFFFFFFFFU;
189 }},{"Operator- #9", []() {
190 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000000");
191 rrdata_set::instance i2("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
192 return (i1 - i2) == 1;
193 }},{"rrdata init", []() {
194 rrdata_set s;
195 return s.debug_dump() == "0[]";
196 }},{"rrdata add", []() {
197 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000002");
198 rrdata_set s;
199 if(!s.debug_add(i2))
200 return false;
201 return s.debug_dump() == "1[{0000000000000000000000000000000000000000000000000000000000000002,"
202 "0000000000000000000000000000000000000000000000000000000000000003}]";
203 }},{"rrdata add disjoint", []() {
204 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000002");
205 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000004");
206 rrdata_set s;
207 if(!s.debug_add(i1))
208 return false;
209 if(!s.debug_add(i2))
210 return false;
211 return s.debug_dump() == "2[{0000000000000000000000000000000000000000000000000000000000000002,"
212 "0000000000000000000000000000000000000000000000000000000000000003}{"
213 "0000000000000000000000000000000000000000000000000000000000000004,"
214 "0000000000000000000000000000000000000000000000000000000000000005}]";
215 }},{"rrdata add again", []() {
216 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000002");
217 rrdata_set s;
218 if(!s.debug_add(i2))
219 return false;
220 if(s.debug_add(i2))
221 return false;
222 return s.debug_dump() == "1[{0000000000000000000000000000000000000000000000000000000000000002,"
223 "0000000000000000000000000000000000000000000000000000000000000003}]";
224 }},{"rrdata extend range low", []() {
225 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000000");
226 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000001");
227 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000004");
228 rrdata_set s;
229 s.debug_add(i1, i2);
230 if(!s.debug_add(i)) {
231 std::cout << "Collides..." << std::flush;
232 return false;
234 if(s.debug_dump() == "4[{0000000000000000000000000000000000000000000000000000000000000000,"
235 "0000000000000000000000000000000000000000000000000000000000000004}]")
236 return true;
237 std::cout << s.debug_dump() << "..." << std::flush;
238 return false;
239 }},{"rrdata extend range high", []() {
240 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000004");
241 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000001");
242 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000004");
243 rrdata_set s;
244 s.debug_add(i1, i2);
245 if(!s.debug_add(i))
246 return false;
247 return s.debug_dump() == "4[{0000000000000000000000000000000000000000000000000000000000000001,"
248 "0000000000000000000000000000000000000000000000000000000000000005}]";
249 }},{"rrdata add again (range)", []() {
250 rrdata_set::instance i("0000000000000000000000000000000000000000000000000000000000000002");
251 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000001");
252 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000004");
253 rrdata_set s;
254 s.debug_add(i1, i2);
255 if(s.debug_add(i))
256 return false;
257 return s.debug_dump() == "3[{0000000000000000000000000000000000000000000000000000000000000001,"
258 "0000000000000000000000000000000000000000000000000000000000000004}]";
259 }},{"rrdata partial overlap (previous)", []() {
260 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
261 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000009");
262 rrdata_set::instance i3("0000000000000000000000000000000000000000000000000000000000000007");
263 rrdata_set::instance i4("000000000000000000000000000000000000000000000000000000000000000F");
264 rrdata_set s;
265 s.debug_add(i1, i2);
266 s.debug_add(i3, i4);
267 return s.debug_dump() == "10[{0000000000000000000000000000000000000000000000000000000000000005,"
268 "000000000000000000000000000000000000000000000000000000000000000F}]";
269 }},{"rrdata bridging add", []() {
270 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
271 rrdata_set::instance i2("000000000000000000000000000000000000000000000000000000000000000A");
272 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000B");
273 rrdata_set::instance i4("000000000000000000000000000000000000000000000000000000000000000F");
274 rrdata_set::instance i5("000000000000000000000000000000000000000000000000000000000000000A");
275 rrdata_set s;
276 s.debug_add(i1, i2);
277 s.debug_add(i3, i4);
278 s.debug_add(i5);
279 return s.debug_dump() == "10[{0000000000000000000000000000000000000000000000000000000000000005,"
280 "000000000000000000000000000000000000000000000000000000000000000F}]";
281 }},{"rrdata bridging add #2", []() {
282 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
283 rrdata_set::instance i2("000000000000000000000000000000000000000000000000000000000000000A");
284 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000B");
285 rrdata_set::instance i4("000000000000000000000000000000000000000000000000000000000000000F");
286 rrdata_set::instance i5("0000000000000000000000000000000000000000000000000000000000000008");
287 rrdata_set::instance i6("000000000000000000000000000000000000000000000000000000000000000D");
288 rrdata_set s;
289 s.debug_add(i1, i2);
290 s.debug_add(i3, i4);
291 s.debug_add(i5, i6);
292 return s.debug_dump() == "10[{0000000000000000000000000000000000000000000000000000000000000005,"
293 "000000000000000000000000000000000000000000000000000000000000000F}]";
294 }},{"rrdata discontinuous reverse", []() {
295 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
296 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000009");
297 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
298 rrdata_set::instance i4("000000000000000000000000000000000000000000000000000000000000000F");
299 rrdata_set s;
300 s.debug_add(i3, i4);
301 s.debug_add(i1, i2);
302 return s.debug_dump() == "9[{0000000000000000000000000000000000000000000000000000000000000005,"
303 "0000000000000000000000000000000000000000000000000000000000000009}{"
304 "000000000000000000000000000000000000000000000000000000000000000A,"
305 "000000000000000000000000000000000000000000000000000000000000000F}]";
306 }},{"rrdata elide next #1", []() {
307 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
308 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000010");
309 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
310 rrdata_set::instance i4("000000000000000000000000000000000000000000000000000000000000000F");
311 rrdata_set s;
312 s.debug_add(i3, i4);
313 s.debug_add(i1, i2);
314 return s.debug_dump() == "11[{0000000000000000000000000000000000000000000000000000000000000005,"
315 "0000000000000000000000000000000000000000000000000000000000000010}]";
316 }},{"rrdata elide next #2", []() {
317 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
318 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000010");
319 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
320 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000010");
321 rrdata_set s;
322 s.debug_add(i3, i4);
323 s.debug_add(i1, i2);
324 return s.debug_dump() == "11[{0000000000000000000000000000000000000000000000000000000000000005,"
325 "0000000000000000000000000000000000000000000000000000000000000010}]";
326 }},{"rrdata elide next multiple", []() {
327 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
328 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000050");
329 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
330 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000014");
331 rrdata_set::instance i5("0000000000000000000000000000000000000000000000000000000000000020");
332 rrdata_set::instance i6("000000000000000000000000000000000000000000000000000000000000002F");
333 rrdata_set s;
334 s.debug_add(i3, i4);
335 s.debug_add(i5, i6);
336 s.debug_add(i1, i2);
337 return s.debug_dump() == "75[{0000000000000000000000000000000000000000000000000000000000000005,"
338 "0000000000000000000000000000000000000000000000000000000000000050}]";
339 }},{"rrdata elide next multiple (OOR)", []() {
340 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
341 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000050");
342 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
343 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000014");
344 rrdata_set::instance i5("0000000000000000000000000000000000000000000000000000000000000020");
345 rrdata_set::instance i6("000000000000000000000000000000000000000000000000000000000000002F");
346 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000060");
347 rrdata_set::instance i8("0000000000000000000000000000000000000000000000000000000000000070");
348 rrdata_set s;
349 s.debug_add(i3, i4);
350 s.debug_add(i5, i6);
351 s.debug_add(i7, i8);
352 s.debug_add(i1, i2);
353 return s.debug_dump() == "91[{0000000000000000000000000000000000000000000000000000000000000005,"
354 "0000000000000000000000000000000000000000000000000000000000000050}{"
355 "0000000000000000000000000000000000000000000000000000000000000060,"
356 "0000000000000000000000000000000000000000000000000000000000000070}]";
357 }},{"rrdata elide next onehalf", []() {
358 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
359 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000050");
360 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
361 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000014");
362 rrdata_set::instance i5("0000000000000000000000000000000000000000000000000000000000000020");
363 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
364 rrdata_set s;
365 s.debug_add(i3, i4);
366 s.debug_add(i5, i6);
367 s.debug_add(i1, i2);
368 return s.debug_dump() == "80[{0000000000000000000000000000000000000000000000000000000000000005,"
369 "0000000000000000000000000000000000000000000000000000000000000055}]";
370 }},{"rrdata elide next onehalf (OOR)", []() {
371 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
372 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000050");
373 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
374 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000014");
375 rrdata_set::instance i5("0000000000000000000000000000000000000000000000000000000000000020");
376 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
377 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000056");
378 rrdata_set::instance i8("0000000000000000000000000000000000000000000000000000000000000057");
379 rrdata_set s;
380 s.debug_add(i3, i4);
381 s.debug_add(i5, i6);
382 s.debug_add(i7, i8);
383 s.debug_add(i1, i2);
384 return s.debug_dump() == "81[{0000000000000000000000000000000000000000000000000000000000000005,"
385 "0000000000000000000000000000000000000000000000000000000000000055}{"
386 "0000000000000000000000000000000000000000000000000000000000000056,"
387 "0000000000000000000000000000000000000000000000000000000000000057}]";
388 }},{"rrdata elide next onehalf and prev", []() {
389 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
390 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000050");
391 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
392 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000014");
393 rrdata_set::instance i5("0000000000000000000000000000000000000000000000000000000000000020");
394 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
395 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000001");
396 rrdata_set::instance i8("0000000000000000000000000000000000000000000000000000000000000006");
397 rrdata_set s;
398 s.debug_add(i3, i4);
399 s.debug_add(i5, i6);
400 s.debug_add(i7, i8);
401 s.debug_add(i1, i2);
402 return s.debug_dump() == "84[{0000000000000000000000000000000000000000000000000000000000000001,"
403 "0000000000000000000000000000000000000000000000000000000000000055}]";
404 }},{"rrdata elide next onehalf and prev (exact)", []() {
405 rrdata_set::instance i1("0000000000000000000000000000000000000000000000000000000000000005");
406 rrdata_set::instance i2("0000000000000000000000000000000000000000000000000000000000000050");
407 rrdata_set::instance i3("000000000000000000000000000000000000000000000000000000000000000A");
408 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000014");
409 rrdata_set::instance i5("0000000000000000000000000000000000000000000000000000000000000020");
410 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
411 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000001");
412 rrdata_set::instance i8("0000000000000000000000000000000000000000000000000000000000000005");
413 rrdata_set s;
414 s.debug_add(i3, i4);
415 s.debug_add(i5, i6);
416 s.debug_add(i7, i8);
417 s.debug_add(i1, i2);
418 return s.debug_dump() == "84[{0000000000000000000000000000000000000000000000000000000000000001,"
419 "0000000000000000000000000000000000000000000000000000000000000055}]";
420 }},{"In set (empty set, empty data)", []() {
421 rrdata_set s;
422 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
423 return s.debug_in_set(i6, i6);
424 }},{"In set (non empty set, empty data)", []() {
425 rrdata_set s;
426 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
427 return !s.debug_in_set(i6);
428 }},{"In set (empty set, non empty data)", []() {
429 rrdata_set s;
430 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
431 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000058");
432 s.debug_add(i6);
433 return s.debug_in_set(i7, i7);
434 }},{"In set (match)", []() {
435 rrdata_set s;
436 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
437 s.debug_add(i6);
438 return s.debug_in_set(i6);
439 }},{"In set (adjacent low)", []() {
440 rrdata_set s;
441 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
442 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000056");
443 s.debug_add(i7);
444 return !s.debug_in_set(i6);
445 }},{"In set (adjacent)", []() {
446 rrdata_set s;
447 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
448 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000056");
449 s.debug_add(i6);
450 return !s.debug_in_set(i7);
451 }},{"In set (match to larger)", []() {
452 rrdata_set s;
453 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
454 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000059");
455 rrdata_set::instance i8("0000000000000000000000000000000000000000000000000000000000000056");
456 s.debug_add(i6, i7);
457 return s.debug_in_set(i8);
458 }},{"In set (match to larger, exact end)", []() {
459 rrdata_set s;
460 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
461 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000059");
462 rrdata_set::instance i8("0000000000000000000000000000000000000000000000000000000000000058");
463 s.debug_add(i6, i7);
464 return s.debug_in_set(i8);
465 }},{"In set (match to larger, multiple)", []() {
466 rrdata_set s;
467 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000045");
468 rrdata_set::instance i5("0000000000000000000000000000000000000000000000000000000000000049");
469 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000055");
470 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000059");
471 rrdata_set::instance i8("0000000000000000000000000000000000000000000000000000000000000046");
472 s.debug_add(i4, i5);
473 s.debug_add(i6, i7);
474 return s.debug_in_set(i8);
475 }},{"In set (split)", []() {
476 rrdata_set s;
477 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000045");
478 rrdata_set::instance i5("000000000000000000000000000000000000000000000000000000000000004F");
479 rrdata_set::instance i6("0000000000000000000000000000000000000000000000000000000000000050");
480 rrdata_set::instance i7("0000000000000000000000000000000000000000000000000000000000000059");
481 rrdata_set::instance i8("0000000000000000000000000000000000000000000000000000000000000046");
482 rrdata_set::instance i9("0000000000000000000000000000000000000000000000000000000000000053");
483 s.debug_add(i4, i5);
484 s.debug_add(i6, i7);
485 return !s.debug_in_set(i8, i9);
486 }},{"Set internal, add internal", []() {
487 rrdata_set s;
488 rrdata_set::instance i4("0000000000000000000000000000000000000000000000000000000000000045");
489 s.set_internal(i4);
490 s.add_internal();
491 return s.debug_dump() == "1[{0000000000000000000000000000000000000000000000000000000000000045,"
492 "0000000000000000000000000000000000000000000000000000000000000046}]";
493 }},{"Empty count", []() {
494 rrdata_set s;
495 return s.count() == 0;
496 }},{"count 1 node", []() {
497 rrdata_set s;
498 s.add_internal();
499 return s.count() == 0;
500 }},{"count 2 node", []() {
501 rrdata_set s;
502 s.add_internal();
503 s.add_internal();
504 return s.count() == 1;
505 }},{"count 3 node", []() {
506 rrdata_set s;
507 s.add_internal();
508 s.add_internal();
509 s.add_internal();
510 return s.count() == 2;
511 }},{"Count rrdata #1", []() {
512 rrdata_set s;
513 std::vector<char> data;
514 return s.count(data) == 0;
515 }},{"Count rrdata #2", []() {
516 rrdata_set s;
517 char _data[] = {0x1F,0x00};
518 std::vector<char> data(_data, _data + sizeof(_data));
519 return s.count(data) == 0;
520 }},{"Count rrdata #2", []() {
521 rrdata_set s;
522 char _data[] = {0x1F,0x00,0x1F,0x02};
523 std::vector<char> data(_data, _data + sizeof(_data));
524 return s.count(data) == 1;
525 }},{"Count rrdata #3", []() {
526 rrdata_set s;
527 char _data[] = {0x3F,0x01,0x07,0x1F,0x12};
528 std::vector<char> data(_data, _data + sizeof(_data));
529 return s.count(data) == 9;
530 }},{"Count rrdata #4", []() {
531 rrdata_set s;
532 char _data[] = {0x5F,0x01,0x07,0x45,0x1F,-1};
533 std::vector<char> data(_data, _data + sizeof(_data));
534 return s.count(data) == 0x847;
535 }},{"Count rrdata #5", []() {
536 rrdata_set s;
537 char _data[] = {0x7F,0x01,0x07,0x45,0x14,0x1F,-1};
538 std::vector<char> data(_data, _data + sizeof(_data));
539 return s.count(data) == 0x84616;
540 }},{"read rrdata #1", []() {
541 rrdata_set s;
542 char _data[] = {0x7F,0x01,0x07,0x45,0x14,0x1F,-1,0x1F,0x00};
543 std::vector<char> data(_data, _data + sizeof(_data));
544 s.read(data);
545 std::string ans = "542232[{0000000000000000000000000000000000000000000000000000000000000001,"
546 "0000000000000000000000000000000000000000000000000000000000084617}{"
547 "00000000000000000000000000000000000000000000000000000000000846FF,"
548 "0000000000000000000000000000000000000000000000000000000000084701}]";
549 return s.debug_dump() == ans;
550 }},{"read/write rrdata #1", []() {
551 rrdata_set s;
552 char _data[] = {0x7F,0x01,0x07,0x45,0x14,0x1F,-1,0x1F,0x00};
553 std::vector<char> data(_data, _data + sizeof(_data));
554 s.read(data);
555 std::vector<char> data2;
556 if(s.write(data2) != 0x84617)
557 return false;
558 char _data2[] = {0x7F,0x01,0x07,0x45,0x14,0x3F,-1,0x00};
559 return sizeof(_data2) == data2.size() && !memcmp(_data2, &data2[0], min(sizeof(_data2),
560 data2.size()));
561 }},{"Write blank", []() {
562 rrdata_set s;
563 std::vector<char> data2;
564 if(s.write(data2))
565 return false;
566 return data2.size() == 0;
567 }},{"Write oversize rrdata run", []() {
568 rrdata_set s;
569 rrdata_set::instance i;
570 s.debug_add(i,i + 0x2000000);
571 std::vector<char> data2;
572 if(s.write(data2) != 0x1FFFFFF)
573 return false;
574 char _data2[] = {0x7F,0x00,-1,-1,-1,0x7F,0x01,-3,-3,-3};
575 return sizeof(_data2) == data2.size() && !memcmp(_data2, &data2[0], min(sizeof(_data2),
576 data2.size()));
577 }},{"Decode split", []() {
578 rrdata_set s;
579 char _data[] = {0x7F,0x00,-1,-1,-1,0x7F,0x01,-3,-3,-3};
580 std::vector<char> data(_data, _data + sizeof(_data));
581 s.read(data);
582 std::string ans = "33554432[{0000000000000000000000000000000000000000000000000000000000000000,"
583 "0000000000000000000000000000000000000000000000000000000002000000}]";
584 return s.debug_dump() == ans;
585 }},{"Write 0-byte length", []() {
586 rrdata_set s;
587 rrdata_set::instance i;
588 s.debug_add(i);
589 std::vector<char> data2;
590 if(s.write(data2) != 0)
591 return false;
592 char _data2[] = {0x1F,0x00};
593 return sizeof(_data2) == data2.size() && !memcmp(_data2, &data2[0], min(sizeof(_data2),
594 data2.size()));
595 }},{"Write 1-byte length", []() {
596 rrdata_set s;
597 rrdata_set::instance i;
598 s.debug_add(i,i + 0x100);
599 std::vector<char> data2;
600 if(s.write(data2) != 0xFF)
601 return false;
602 char _data2[] = {0x3F,0x00,-2};
603 return sizeof(_data2) == data2.size() && !memcmp(_data2, &data2[0], min(sizeof(_data2),
604 data2.size()));
605 }},{"Write 2-byte length", []() {
606 rrdata_set s;
607 rrdata_set::instance i;
608 s.debug_add(i,i + 0x10000);
609 std::vector<char> data2;
610 if(s.write(data2) != 0xFFFF)
611 return false;
612 char _data2[] = {0x5F,0x00,-2,-2};
613 return sizeof(_data2) == data2.size() && !memcmp(_data2, &data2[0], min(sizeof(_data2),
614 data2.size()));
615 }},{"Write 2-byte length #2", []() {
616 rrdata_set s;
617 rrdata_set::instance i;
618 s.debug_add(i + 0x1424,i + 0x11425);
619 std::vector<char> data2;
620 if(s.write(data2) != 0x10000)
621 return false;
622 char _data2[] = {0x5E,0x14, 0x24,-2,-1};
623 return sizeof(_data2) == data2.size() && !memcmp(_data2, &data2[0], min(sizeof(_data2),
624 data2.size()));
625 }},{"Basic rrdata with backing file", []() {
626 rrdata_set s;
627 unlink("foo.tmp");
628 s.read_base("foo.tmp", false);
629 s.set_internal(rrdata_set::instance(
630 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD0A"));
631 if(get_file_size("foo.tmp") != 0)
632 return false;
633 s.add_internal();
634 if(get_file_size("foo.tmp") != 32)
635 return false;
636 s.add_internal();
637 if(get_file_size("foo.tmp") != 64)
638 return false;
639 s.add_internal();
640 if(get_file_size("foo.tmp") != 96)
641 return false;
642 s.add_internal();
643 if(get_file_size("foo.tmp") != 128)
644 return false;
645 s.add_internal();
646 if(get_file_size("foo.tmp") != 160)
647 return false;
648 return true;
649 }},{"Reopen backing file", []() {
650 rrdata_set s;
651 unlink("foo.tmp");
652 s.read_base("foo.tmp", false);
653 s.set_internal(rrdata_set::instance(
654 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD0A"));
655 if(get_file_size("foo.tmp") != 0)
656 return false;
657 s.add_internal();
658 if(get_file_size("foo.tmp") != 32)
659 return false;
660 s.close();
661 s.read_base("foo.tmp", false);
662 s.add_internal();
663 if(get_file_size("foo.tmp") != 64)
664 return false;
665 return true;
666 }},{"Close with no project", []() {
667 rrdata_set s;
668 unlink("foo.tmp");
669 s.close();
670 return true;
671 }},{"Switch to self", []() {
672 rrdata_set s;
673 unlink("foo.tmp");
674 s.read_base("foo.tmp", false);
675 s.set_internal(rrdata_set::instance(
676 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD0A"));
677 s.add_internal();
678 s.read_base("foo.tmp", false);
679 s.add_internal();
680 return s.count() == 1;
681 }},{"Switch to another", []() {
682 rrdata_set s;
683 unlink("foo.tmp");
684 unlink("foo2.tmp");
685 s.read_base("foo.tmp", false);
686 s.set_internal(rrdata_set::instance(
687 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD0A"));
688 s.add_internal();
689 s.read_base("foo2.tmp", false);
690 s.add_internal();
691 s.add_internal();
692 //std::cerr << s.debug_dump() << std::endl;
693 return s.count() == 1;
694 }},{"Lazy mode", []() {
695 rrdata_set s;
696 unlink("foo.tmp");
697 s.read_base("foo.tmp", true);
698 s.set_internal(rrdata_set::instance(
699 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD0A"));
700 s.add_internal();
701 s.add_internal();
702 s.read_base("foo.tmp", false);
703 s.add_internal();
704 s.add_internal();
705 if(get_file_size("foo.tmp") != 128)
706 return false;
707 return s.count() == 3;
708 }},{"Lazy mode with previous file", []() {
709 rrdata_set s;
710 unlink("foo.tmp");
711 unlink("foo2.tmp");
712 s.read_base("foo2.tmp", false);
713 s.read_base("foo.tmp", true);
714 s.set_internal(rrdata_set::instance(
715 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD0A"));
716 s.add_internal();
717 s.add_internal();
718 s.read_base("foo.tmp", false);
719 s.add_internal();
720 s.add_internal();
721 if(get_file_size("foo.tmp") != 128)
722 return false;
723 return s.count() == 3;
724 }},{"Reading a file", []() {
725 rrdata_set s;
726 unlink("foo.tmp");
727 s.read_base("foo.tmp", false);
728 char _data[] = {0x3F,0x01,0x07,0x1F,0x12};
729 std::vector<char> data(_data, _data + sizeof(_data));
730 s.read(data);
731 if(get_file_size("foo.tmp") != 320)
732 return false;
733 return true;
734 }},{"Reading a file /w existing entry", []() {
735 rrdata_set s;
736 unlink("foo.tmp");
737 rrdata_set::instance i;
738 i = i + 5;
739 s.add(i);
740 s.read_base("foo.tmp", false);
741 char _data[] = {0x3F,0x01,0x07,0x1F,0x12};
742 std::vector<char> data(_data, _data + sizeof(_data));
743 s.read(data);
744 if(get_file_size("foo.tmp") != 320)
745 return false;
746 return true;
750 int main()
752 struct test* t = tests;
753 while(t->name) {
754 std::cout << t->name << "..." << std::flush;
755 try {
756 if(t->run())
757 std::cout << "\e[32mPASS\e[0m" << std::endl;
758 else {
759 std::cout << "\e[31mFAILED\e[0m" << std::endl;
760 return 1;
762 } catch(std::exception& e) {
763 std::cout << "\e[31mEXCEPTION: " << e.what() << "\e[0m" << std::endl;
764 return 1;
765 } catch(...) {
766 std::cout << "\e[31mUNKNOWN EXCEPTION\e[0m" << std::endl;
767 return 1;
769 t++;
771 return 0;