4 * Copyright (c) 2013-2014 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
27 #include "test_coll.h"
34 #include <unittest_driver.h>
37 treebase_node_t *parent;
38 treebase_node_t *next;
39 treebase_node_t *prev;
40 treebase_node_t *first;
41 treebase_node_t *last;
43 } test_treebase_node_expected_t;
45 LOCAL Bool test_treebase_node_commoncheck(treebase_node_t *node, test_treebase_node_expected_t *expected, UB *msg)
47 treebase_node_t *node1;
50 node1 = treebase_node_getparent(node);
51 if (node1 != expected->parent) {
52 printf("%s: parent is not expected\n", msg);
55 node1 = treebase_node_getnextsibling(node);
56 if (node1 != expected->next) {
57 printf("%s: next sibling is not expected\n", msg);
60 node1 = treebase_node_getprevsibling(node);
61 if (node1 != expected->prev) {
62 printf("%s: prev sibling is not expected\n", msg);
65 node1 = treebase_node_getfirstchild(node);
66 if (node1 != expected->first) {
67 printf("%s: first child is not expected\n", msg);
70 node1 = treebase_node_getlastchild(node);
71 if (node1 != expected->last) {
72 printf("%s: last child is not expected\n", msg);
75 ok = treebase_node_haschild(node);
76 if (ok != expected->has_child) {
77 printf("%s: has child is not expected\n", msg);
84 LOCAL UNITTEST_RESULT test_treebase_node_1()
88 treebase_node_initialize(&node);
89 treebase_node_finalize(&node);
91 return UNITTEST_RESULT_PASS;
94 LOCAL UNITTEST_RESULT test_treebase_node_2()
97 test_treebase_node_expected_t expected;
99 UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
101 treebase_node_initialize(&node);
103 expected.parent = NULL;
104 expected.next = NULL;
105 expected.prev = NULL;
106 expected.first = NULL;
107 expected.last = NULL;
108 expected.has_child = False;
109 ok = test_treebase_node_commoncheck(&node, &expected, "node");
111 ret = UNITTEST_RESULT_FAIL;
114 treebase_node_finalize(&node);
119 LOCAL UNITTEST_RESULT test_treebase_node_3()
121 treebase_node_t node0, node1;
122 test_treebase_node_expected_t expected;
124 UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
126 treebase_node_initialize(&node0);
127 treebase_node_initialize(&node1);
129 treebase_node_appendchild(&node0, &node1);
132 expected.parent = NULL;
133 expected.next = NULL;
134 expected.prev = NULL;
135 expected.first = &node1;
136 expected.last = &node1;
137 expected.has_child = True;
138 ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
140 ret = UNITTEST_RESULT_FAIL;
143 expected.parent = &node0;
144 expected.next = NULL;
145 expected.prev = NULL;
146 expected.first = NULL;
147 expected.last = NULL;
148 expected.has_child = False;
149 ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
151 ret = UNITTEST_RESULT_FAIL;
154 treebase_node_finalize(&node1);
155 treebase_node_finalize(&node0);
160 LOCAL UNITTEST_RESULT test_treebase_node_4()
162 treebase_node_t node0, node1;
163 test_treebase_node_expected_t expected;
165 UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
167 treebase_node_initialize(&node0);
168 treebase_node_initialize(&node1);
170 treebase_node_appendchild(&node0, &node1);
171 treebase_node_remove(&node1);
174 expected.parent = NULL;
175 expected.next = NULL;
176 expected.prev = NULL;
177 expected.first = NULL;
178 expected.last = NULL;
179 expected.has_child = False;
180 ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
182 ret = UNITTEST_RESULT_FAIL;
185 expected.parent = NULL;
186 expected.next = NULL;
187 expected.prev = NULL;
188 expected.first = NULL;
189 expected.last = NULL;
190 expected.has_child = False;
191 ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
193 ret = UNITTEST_RESULT_FAIL;
196 treebase_node_finalize(&node1);
197 treebase_node_finalize(&node0);
202 LOCAL UNITTEST_RESULT test_treebase_node_5()
204 treebase_node_t node0, node1, node2;
205 test_treebase_node_expected_t expected;
207 UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
209 treebase_node_initialize(&node0);
210 treebase_node_initialize(&node1);
211 treebase_node_initialize(&node2);
213 treebase_node_appendchild(&node0, &node1);
214 treebase_node_appendchild(&node0, &node2);
217 expected.parent = NULL;
218 expected.next = NULL;
219 expected.prev = NULL;
220 expected.first = &node1;
221 expected.last = &node2;
222 expected.has_child = True;
223 ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
225 ret = UNITTEST_RESULT_FAIL;
228 expected.parent = &node0;
229 expected.next = &node2;
230 expected.prev = NULL;
231 expected.first = NULL;
232 expected.last = NULL;
233 expected.has_child = False;
234 ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
236 ret = UNITTEST_RESULT_FAIL;
239 expected.parent = &node0;
240 expected.next = NULL;
241 expected.prev = &node1;
242 expected.first = NULL;
243 expected.last = NULL;
244 expected.has_child = False;
245 ok = test_treebase_node_commoncheck(&node2, &expected, "node2");
247 ret = UNITTEST_RESULT_FAIL;
250 treebase_node_finalize(&node2);
251 treebase_node_finalize(&node1);
252 treebase_node_finalize(&node0);
257 LOCAL UNITTEST_RESULT test_treebase_node_6()
259 treebase_node_t node0, node1, node2;
260 test_treebase_node_expected_t expected;
262 UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
264 treebase_node_initialize(&node0);
265 treebase_node_initialize(&node1);
266 treebase_node_initialize(&node2);
268 treebase_node_appendchild(&node0, &node1);
269 treebase_node_appendchild(&node1, &node2);
272 expected.parent = NULL;
273 expected.next = NULL;
274 expected.prev = NULL;
275 expected.first = &node1;
276 expected.last = &node1;
277 expected.has_child = True;
278 ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
280 ret = UNITTEST_RESULT_FAIL;
283 expected.parent = &node0;
284 expected.next = NULL;
285 expected.prev = NULL;
286 expected.first = &node2;
287 expected.last = &node2;
288 expected.has_child = True;
289 ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
291 ret = UNITTEST_RESULT_FAIL;
294 expected.parent = &node1;
295 expected.next = NULL;
296 expected.prev = NULL;
297 expected.first = NULL;
298 expected.last = NULL;
299 expected.has_child = False;
300 ok = test_treebase_node_commoncheck(&node2, &expected, "node2");
302 ret = UNITTEST_RESULT_FAIL;
305 treebase_node_finalize(&node2);
306 treebase_node_finalize(&node1);
307 treebase_node_finalize(&node0);
312 LOCAL UNITTEST_RESULT test_treebase_node_7()
314 treebase_node_t node0, node1, node2, node3;
315 test_treebase_node_expected_t expected;
317 UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
319 treebase_node_initialize(&node0);
320 treebase_node_initialize(&node1);
321 treebase_node_initialize(&node2);
322 treebase_node_initialize(&node3);
324 treebase_node_insertbefore(&node0, &node1, NULL);
325 treebase_node_insertbefore(&node0, &node2, NULL);
326 treebase_node_insertbefore(&node0, &node3, &node2);
329 expected.parent = NULL;
330 expected.next = NULL;
331 expected.prev = NULL;
332 expected.first = &node1;
333 expected.last = &node2;
334 expected.has_child = True;
335 ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
337 ret = UNITTEST_RESULT_FAIL;
340 expected.parent = &node0;
341 expected.next = &node3;
342 expected.prev = NULL;
343 expected.first = NULL;
344 expected.last = NULL;
345 expected.has_child = False;
346 ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
348 ret = UNITTEST_RESULT_FAIL;
351 expected.parent = &node0;
352 expected.next = NULL;
353 expected.prev = &node3;
354 expected.first = NULL;
355 expected.last = NULL;
356 expected.has_child = False;
357 ok = test_treebase_node_commoncheck(&node2, &expected, "node2");
359 ret = UNITTEST_RESULT_FAIL;
362 expected.parent = &node0;
363 expected.next = &node2;
364 expected.prev = &node1;
365 expected.first = NULL;
366 expected.last = NULL;
367 expected.has_child = False;
368 ok = test_treebase_node_commoncheck(&node3, &expected, "node3");
370 ret = UNITTEST_RESULT_FAIL;
373 treebase_node_finalize(&node3);
374 treebase_node_finalize(&node2);
375 treebase_node_finalize(&node1);
376 treebase_node_finalize(&node0);
381 /* treebase_preordertraversal_t */
385 treebase_node_t *node;
386 TREEBASE_TRAVERSAL_DIRECTION dir;
387 } test_treebase_preordertraversal_expected_t;
389 LOCAL UNITTEST_RESULT test_treebase_preordertraversal_common(treebase_node_t *root, test_treebase_preordertraversal_expected_t *expected, W expected_len)
391 treebase_node_t *node_result;
392 treebase_preordertraversal_t traversal;
393 TREEBASE_TRAVERSAL_DIRECTION dir;
395 UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
398 treebase_preordertraversal_initialize(&traversal, root);
401 cont = treebase_preordertraversal_next(&traversal, &node_result, &dir);
402 if (i < expected_len) {
403 if (expected[i].cont != cont) {
404 printf("%d: cont is not expected\n", i);
405 ret = UNITTEST_RESULT_FAIL;
407 if (expected[i].node != node_result) {
408 printf("%d: node is not expected\n", i);
409 ret = UNITTEST_RESULT_FAIL;
411 if (expected[i].dir != dir) {
412 printf("%d: direction is not expected\n", i);
413 ret = UNITTEST_RESULT_FAIL;
421 if (i != expected_len) {
422 printf("node number check fail: expected = %d, result = %d\n", expected_len, i);
423 ret = UNITTEST_RESULT_FAIL;
426 treebase_preordertraversal_finalize(&traversal);
431 LOCAL UNITTEST_RESULT test_treebase_preordertraversal_1()
433 treebase_node_t node0, node1, node2, node3, node4;
434 test_treebase_preordertraversal_expected_t expected[] = {
435 { True, &node0, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
436 { True, &node1, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
437 { True, &node2, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
438 { True, &node2, TREEBASE_TRAVERSAL_DIRECTION_UP },
439 { True, &node3, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
440 { True, &node3, TREEBASE_TRAVERSAL_DIRECTION_UP },
441 { True, &node4, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
442 { True, &node4, TREEBASE_TRAVERSAL_DIRECTION_UP },
443 { True, &node1, TREEBASE_TRAVERSAL_DIRECTION_UP },
444 { True, &node0, TREEBASE_TRAVERSAL_DIRECTION_UP },
446 W expected_len = sizeof(expected) / sizeof(test_treebase_preordertraversal_expected_t);
449 treebase_node_initialize(&node0);
450 treebase_node_initialize(&node1);
451 treebase_node_initialize(&node2);
452 treebase_node_initialize(&node3);
453 treebase_node_initialize(&node4);
455 treebase_node_appendchild(&node0, &node1);
456 treebase_node_appendchild(&node1, &node2);
457 treebase_node_appendchild(&node1, &node3);
458 treebase_node_appendchild(&node1, &node4);
460 ret = test_treebase_preordertraversal_common(&node0, expected, expected_len);
462 treebase_node_finalize(&node4);
463 treebase_node_finalize(&node3);
464 treebase_node_finalize(&node2);
465 treebase_node_finalize(&node1);
466 treebase_node_finalize(&node0);
472 EXPORT VOID test_treebase_main(unittest_driver_t *driver)
474 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_1);
475 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_2);
476 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_3);
477 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_4);
478 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_5);
479 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_6);
480 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_7);
481 UNITTEST_DRIVER_REGIST(driver, test_treebase_preordertraversal_1);