add a test case that proves that visitors are not affected by issue #656

Sun, 27 Apr 2025 12:37:29 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 27 Apr 2025 12:37:29 +0200
changeset 1307
b2547ff3d1ce
parent 1306
c1a4d8c42fb8
child 1308
ce01b482daa3

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

mercurial