/*
* test_treebase.c
*
- * Copyright (c) 2013 project bchan
+ * Copyright (c) 2013-2014 project bchan
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
return ret;
}
+LOCAL UNITTEST_RESULT test_treebase_node_7()
+{
+ treebase_node_t node0, node1, node2, node3;
+ test_treebase_node_expected_t expected;
+ Bool ok;
+ UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
+
+ treebase_node_initialize(&node0);
+ treebase_node_initialize(&node1);
+ treebase_node_initialize(&node2);
+ treebase_node_initialize(&node3);
+
+ treebase_node_insertbefore(&node0, &node1, NULL);
+ treebase_node_insertbefore(&node0, &node2, NULL);
+ treebase_node_insertbefore(&node0, &node3, &node2);
+
+ /**/
+ expected.parent = NULL;
+ expected.next = NULL;
+ expected.prev = NULL;
+ expected.first = &node1;
+ expected.last = &node2;
+ expected.has_child = True;
+ ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
+ if (ok == False) {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ /**/
+ expected.parent = &node0;
+ expected.next = &node3;
+ expected.prev = NULL;
+ expected.first = NULL;
+ expected.last = NULL;
+ expected.has_child = False;
+ ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
+ if (ok == False) {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ /**/
+ expected.parent = &node0;
+ expected.next = NULL;
+ expected.prev = &node3;
+ expected.first = NULL;
+ expected.last = NULL;
+ expected.has_child = False;
+ ok = test_treebase_node_commoncheck(&node2, &expected, "node2");
+ if (ok == False) {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ /**/
+ expected.parent = &node0;
+ expected.next = &node2;
+ expected.prev = &node1;
+ expected.first = NULL;
+ expected.last = NULL;
+ expected.has_child = False;
+ ok = test_treebase_node_commoncheck(&node3, &expected, "node3");
+ if (ok == False) {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+
+ treebase_node_finalize(&node3);
+ treebase_node_finalize(&node2);
+ treebase_node_finalize(&node1);
+ treebase_node_finalize(&node0);
+
+ return ret;
+}
+
+LOCAL UNITTEST_RESULT test_treebase_node_8()
+{
+ treebase_node_t node0, node1, node2, node3;
+ test_treebase_node_expected_t expected;
+ Bool ok;
+ UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
+
+ treebase_node_initialize(&node0);
+ treebase_node_initialize(&node1);
+ treebase_node_initialize(&node2);
+ treebase_node_initialize(&node3);
+
+ treebase_node_insertbefore(&node0, &node1, NULL);
+ treebase_node_insertbefore(&node0, &node2, &node1);
+ treebase_node_insertbefore(&node0, &node3, NULL);
+
+ /**/
+ expected.parent = NULL;
+ expected.next = NULL;
+ expected.prev = NULL;
+ expected.first = &node2;
+ expected.last = &node3;
+ expected.has_child = True;
+ ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
+ if (ok == False) {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ /**/
+ expected.parent = &node0;
+ expected.next = &node3;
+ expected.prev = &node2;
+ expected.first = NULL;
+ expected.last = NULL;
+ expected.has_child = False;
+ ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
+ if (ok == False) {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ /**/
+ expected.parent = &node0;
+ expected.next = &node1;
+ expected.prev = NULL;
+ expected.first = NULL;
+ expected.last = NULL;
+ expected.has_child = False;
+ ok = test_treebase_node_commoncheck(&node2, &expected, "node2");
+ if (ok == False) {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ /**/
+ expected.parent = &node0;
+ expected.next = NULL;
+ expected.prev = &node1;
+ expected.first = NULL;
+ expected.last = NULL;
+ expected.has_child = False;
+ ok = test_treebase_node_commoncheck(&node3, &expected, "node3");
+ if (ok == False) {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+
+ treebase_node_finalize(&node3);
+ treebase_node_finalize(&node2);
+ treebase_node_finalize(&node1);
+ treebase_node_finalize(&node0);
+
+ return ret;
+}
+
+/* treebase_preordertraversal_t */
+
+typedef struct {
+ Bool cont;
+ treebase_node_t *node;
+ TREEBASE_TRAVERSAL_DIRECTION dir;
+} test_treebase_preordertraversal_expected_t;
+
+LOCAL UNITTEST_RESULT test_treebase_preordertraversal_common(treebase_node_t *root, test_treebase_preordertraversal_expected_t *expected, W expected_len)
+{
+ treebase_node_t *node_result;
+ treebase_preordertraversal_t traversal;
+ TREEBASE_TRAVERSAL_DIRECTION dir;
+ Bool cont;
+ UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
+ W i;
+
+ treebase_preordertraversal_initialize(&traversal, root);
+
+ for (i = 0;; i++) {
+ cont = treebase_preordertraversal_next(&traversal, &node_result, &dir);
+ if (i < expected_len) {
+ if (expected[i].cont != cont) {
+ printf("%d: cont is not expected\n", i);
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ if (expected[i].node != node_result) {
+ printf("%d: node is not expected\n", i);
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ if (expected[i].dir != dir) {
+ printf("%d: direction is not expected\n", i);
+ ret = UNITTEST_RESULT_FAIL;
+ }
+ }
+
+ if (cont == False) {
+ break;
+ }
+ }
+ if (i != expected_len) {
+ printf("node number check fail: expected = %d, result = %d\n", expected_len, i);
+ ret = UNITTEST_RESULT_FAIL;
+ }
+
+ treebase_preordertraversal_finalize(&traversal);
+
+ return ret;
+}
+
+LOCAL UNITTEST_RESULT test_treebase_preordertraversal_1()
+{
+ treebase_node_t node0, node1, node2, node3, node4;
+ test_treebase_preordertraversal_expected_t expected[] = {
+ { True, &node0, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
+ { True, &node1, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
+ { True, &node2, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
+ { True, &node2, TREEBASE_TRAVERSAL_DIRECTION_UP },
+ { True, &node3, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
+ { True, &node3, TREEBASE_TRAVERSAL_DIRECTION_UP },
+ { True, &node4, TREEBASE_TRAVERSAL_DIRECTION_DOWN },
+ { True, &node4, TREEBASE_TRAVERSAL_DIRECTION_UP },
+ { True, &node1, TREEBASE_TRAVERSAL_DIRECTION_UP },
+ { True, &node0, TREEBASE_TRAVERSAL_DIRECTION_UP },
+ };
+ W expected_len = sizeof(expected) / sizeof(test_treebase_preordertraversal_expected_t);
+ UNITTEST_RESULT ret;
+
+ treebase_node_initialize(&node0);
+ treebase_node_initialize(&node1);
+ treebase_node_initialize(&node2);
+ treebase_node_initialize(&node3);
+ treebase_node_initialize(&node4);
+
+ treebase_node_appendchild(&node0, &node1);
+ treebase_node_appendchild(&node1, &node2);
+ treebase_node_appendchild(&node1, &node3);
+ treebase_node_appendchild(&node1, &node4);
+
+ ret = test_treebase_preordertraversal_common(&node0, expected, expected_len);
+
+ treebase_node_finalize(&node4);
+ treebase_node_finalize(&node3);
+ treebase_node_finalize(&node2);
+ treebase_node_finalize(&node1);
+ treebase_node_finalize(&node0);
+
+ return ret;
+}
+
EXPORT VOID test_treebase_main(unittest_driver_t *driver)
{
UNITTEST_DRIVER_REGIST(driver, test_treebase_node_4);
UNITTEST_DRIVER_REGIST(driver, test_treebase_node_5);
UNITTEST_DRIVER_REGIST(driver, test_treebase_node_6);
+ UNITTEST_DRIVER_REGIST(driver, test_treebase_node_7);
+ UNITTEST_DRIVER_REGIST(driver, test_treebase_node_8);
+ UNITTEST_DRIVER_REGIST(driver, test_treebase_preordertraversal_1);
}