add test case that shows issue #656

Sat, 26 Apr 2025 19:37:24 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 26 Apr 2025 19:37:24 +0200
changeset 1306
c1a4d8c42fb8
parent 1305
c34a72d8e104
child 1307
b2547ff3d1ce

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);

mercurial