Sun, 27 Apr 2025 12:37:29 +0200
add a test case that proves that visitors are not affected by issue #656
tests/test_tree.c | file | annotate | diff | comparison | revisions |
--- a/tests/test_tree.c Sat Apr 26 19:37:24 2025 +0200 +++ b/tests/test_tree.c Sun Apr 27 12:37:29 2025 +0200 @@ -861,6 +861,37 @@ CX_TEST_ASSERT(cb.data == 0); CX_TEST_ASSERT(cc.data == 0); CX_TEST_ASSERT(cba.data == 0); + + // now perform with other subtree + iter = cx_tree_iterator(&c, true, tree_children(tree_node)); + chk = 0; + cx_foreach(tree_node*, node, iter) { + CX_TEST_ASSERT(iter.exiting || node->data == 0); + node->data++; + chk++; + CX_TEST_ASSERT(node == iter.node); + if (node == &c) { + CX_TEST_ASSERT(iter.depth == 1); + } else if (node == &ca || node == &cb || node == &cc) { + CX_TEST_ASSERT(iter.depth == 2); + } else if (node == &cba) { + CX_TEST_ASSERT(iter.depth == 3); + } + } + CX_TEST_ASSERT(iter.counter == 5); + CX_TEST_ASSERT(chk == 10); + CX_TEST_ASSERT(iter.stack == NULL); + CX_TEST_ASSERT(root.data == 0); + CX_TEST_ASSERT(a.data == 0); + CX_TEST_ASSERT(b.data == 2); + CX_TEST_ASSERT(c.data == 2); + CX_TEST_ASSERT(aa.data == 0); + CX_TEST_ASSERT(ab.data == 0); + CX_TEST_ASSERT(ba.data == 2); + CX_TEST_ASSERT(ca.data == 2); + CX_TEST_ASSERT(cb.data == 2); + CX_TEST_ASSERT(cc.data == 2); + CX_TEST_ASSERT(cba.data == 2); } } @@ -1113,6 +1144,50 @@ } } +CX_TEST(test_tree_visitor_subtree) { + tree_node root = {0}; + tree_node a = {0}; + tree_node b = {0}; + tree_node c = {0}; + tree_node ba = {0}; + tree_node bb = {0}; + tree_node bc = {0}; + tree_node bba = {0}; + + tree_node* expected_order[] = { + &b, &ba, &bb, &bc, &bba + }; + tree_node* actual_order[5]; + + cx_tree_link(&root, &a, tree_node_layout); + cx_tree_link(&root, &b, tree_node_layout); + cx_tree_link(&root, &c, tree_node_layout); + cx_tree_link(&b, &ba, tree_node_layout); + cx_tree_link(&b, &bb, tree_node_layout); + cx_tree_link(&b, &bc, tree_node_layout); + cx_tree_link(&bb, &bba, tree_node_layout); + + CX_TEST_DO { + CxTreeVisitor iter = cx_tree_visitor(&b, tree_children(tree_node)); + unsigned chk = 0; + cx_foreach(tree_node*, node, iter) { + CX_TEST_ASSERT(node == iter.node); + CX_TEST_ASSERT(node->data == 0); + node->data++; + actual_order[chk] = node; + chk++; + } + CX_TEST_ASSERT(iter.counter == 5); + CX_TEST_ASSERT(chk == 5); + CX_TEST_ASSERT(iter.queue_next == NULL); + CX_TEST_ASSERT(iter.queue_last == NULL); + for (unsigned i = 0 ; i < chk ; i++) { + CX_TEST_ASSERT(actual_order[i] == expected_order[i]); + CX_TEST_ASSERT(actual_order[i]->data == 1); + } + } +} + CX_TEST(test_tree_visitor_continue) { tree_node root = {0}; tree_node a = {0}; @@ -2280,6 +2355,7 @@ cx_test_register(suite, test_tree_visitor); cx_test_register(suite, test_tree_visitor_no_children); cx_test_register(suite, test_tree_visitor_no_branching); + cx_test_register(suite, test_tree_visitor_subtree); cx_test_register(suite, test_tree_visitor_continue); cx_test_register(suite, test_tree_iterator_continue); cx_test_register(suite, test_tree_iterator_continue_with_exit);