4 * Copyright (c) 2013 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 /* treebase_preordertraversal_t */
316 treebase_node_t *node;
317 TREEBASE_TRAVERSAL_DIRECTION dir;
318 } test_treebase_preordertraversal_expected_t;
320 LOCAL UNITTEST_RESULT test_treebase_preordertraversal_common(treebase_node_t *root, test_treebase_preordertraversal_expected_t *expected, W expected_len)
322 treebase_node_t *node_result;
323 treebase_preordertraversal_t traversal;
324 TREEBASE_TRAVERSAL_DIRECTION dir;
326 UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
329 treebase_preordertraversal_initialize(&traversal, root);
332 cont = treebase_preordertraversal_next(&traversal, &node_result, &dir);
333 if (i < expected_len) {
334 if (expected[i].cont != cont) {
335 printf("%d: cont is not expected\n", i);
336 ret = UNITTEST_RESULT_FAIL;
338 if (expected[i].node != node_result) {
339 printf("%d: node is not expected\n", i);
340 ret = UNITTEST_RESULT_FAIL;
342 if (expected[i].dir != dir) {
343 printf("%d: direction is not expected\n", i);
344 ret = UNITTEST_RESULT_FAIL;
352 if (i != expected_len) {
353 printf("node number check fail: expected = %d, result = %d\n", expected_len, i);
354 ret = UNITTEST_RESULT_FAIL;
357 treebase_preordertraversal_finalize(&traversal);
362 LOCAL UNITTEST_RESULT test_treebase_preordertraversal_1()
364 treebase_node_t node0, node1, node2, node3, node4;
365 test_treebase_preordertraversal_expected_t expected[] = {
366 { True, &node0, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
367 { True, &node1, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
368 { True, &node2, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
369 { True, &node2, TREEBASE_TRAVERSAL_DIRECTION_UP },
370 { True, &node3, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
371 { True, &node3, TREEBASE_TRAVERSAL_DIRECTION_UP },
372 { True, &node4, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
373 { True, &node4, TREEBASE_TRAVERSAL_DIRECTION_UP },
374 { True, &node1, TREEBASE_TRAVERSAL_DIRECTION_UP },
375 { True, &node0, TREEBASE_TRAVERSAL_DIRECTION_UP },
377 W expected_len = sizeof(expected) / sizeof(test_treebase_preordertraversal_expected_t);
380 treebase_node_initialize(&node0);
381 treebase_node_initialize(&node1);
382 treebase_node_initialize(&node2);
383 treebase_node_initialize(&node3);
384 treebase_node_initialize(&node4);
386 treebase_node_appendchild(&node0, &node1);
387 treebase_node_appendchild(&node1, &node2);
388 treebase_node_appendchild(&node1, &node3);
389 treebase_node_appendchild(&node1, &node4);
391 ret = test_treebase_preordertraversal_common(&node0, expected, expected_len);
393 treebase_node_finalize(&node4);
394 treebase_node_finalize(&node3);
395 treebase_node_finalize(&node2);
396 treebase_node_finalize(&node1);
397 treebase_node_finalize(&node0);
403 EXPORT VOID test_treebase_main(unittest_driver_t *driver)
405 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_1);
406 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_2);
407 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_3);
408 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_4);
409 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_5);
410 UNITTEST_DRIVER_REGIST(driver, test_treebase_node_6);
411 UNITTEST_DRIVER_REGIST(driver, test_treebase_preordertraversal_1);