Sat, 26 Apr 2025 19:37:24 +0200
add test case that shows issue #656
tests/test_tree.c | file | annotate | diff | comparison | revisions |
--- a/tests/test_tree.c Sun Apr 20 10:41:25 2025 +0200 +++ b/tests/test_tree.c Sat Apr 26 19:37:24 2025 +0200 @@ -810,6 +810,60 @@ } } +CX_TEST(test_tree_iterator_subtree_enter_and_exit) { + tree_node root = { 0 }; + tree_node a = { 0 }; + tree_node b = { 0 }; + tree_node c = { 0 }; + tree_node aa = { 0 }; + tree_node ab = { 0 }; + tree_node ba = { 0 }; + tree_node ca = { 0 }; + tree_node cb = { 0 }; + tree_node cc = { 0 }; + tree_node cba = { 0 }; + + 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(&a, &aa, tree_node_layout); + cx_tree_link(&a, &ab, tree_node_layout); + cx_tree_link(&b, &ba, tree_node_layout); + cx_tree_link(&c, &ca, tree_node_layout); + cx_tree_link(&c, &cb, tree_node_layout); + cx_tree_link(&c, &cc, tree_node_layout); + cx_tree_link(&cb, &cba, tree_node_layout); + CX_TEST_DO{ + CxTreeIterator iter = cx_tree_iterator(&b, true, tree_children(tree_node)); + unsigned 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 == &b) { + CX_TEST_ASSERT(iter.depth == 1); + } else if (node == &ba) { + CX_TEST_ASSERT(iter.depth == 2); + } + } + CX_TEST_ASSERT(iter.counter == 2); + CX_TEST_ASSERT(chk == 4); + 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 == 0); + CX_TEST_ASSERT(aa.data == 0); + CX_TEST_ASSERT(ab.data == 0); + CX_TEST_ASSERT(ba.data == 2); + CX_TEST_ASSERT(ca.data == 0); + CX_TEST_ASSERT(cb.data == 0); + CX_TEST_ASSERT(cc.data == 0); + CX_TEST_ASSERT(cba.data == 0); + } +} + typedef struct test_xml_node { struct tree_node base; const char *name; @@ -2220,6 +2274,7 @@ cx_test_register(suite, test_tree_iterator_create_for_empty_tree); cx_test_register(suite, test_tree_iterator_basic_only_enter); cx_test_register(suite, test_tree_iterator_basic_enter_and_exit); + cx_test_register(suite, test_tree_iterator_subtree_enter_and_exit); cx_test_register(suite, test_tree_iterator_xml); cx_test_register(suite, test_tree_iterator_free_nodes); cx_test_register(suite, test_tree_visitor);