tests/test_tree.c

changeset 930
6540096c17b7
parent 918
ec1f2015ec79
child 931
be71809e69d1
--- a/tests/test_tree.c	Sun Oct 13 16:47:14 2024 +0200
+++ b/tests/test_tree.c	Sat Oct 19 13:08:06 2024 +0200
@@ -429,44 +429,165 @@
     CX_TEST_DO {
         for (unsigned i = 0 ; i <= 10 ; i++) {
             s = testdata[i];
-            r = cx_tree_search_data(&root, &s, test_tree_search_function,
+            r = cx_tree_search_data(&root, 0, &s, test_tree_search_function,
                                (void **) &n, tree_children(tree_node));
             CX_TEST_ASSERT(r == 0);
             CX_TEST_ASSERT(n == testnodes[i]);
         }
 
         s = -5;
-        r = cx_tree_search_data(&root, &s, test_tree_search_function,
+        r = cx_tree_search_data(&root, 0, &s, test_tree_search_function,
                            (void **) &n, tree_children(tree_node));
         CX_TEST_ASSERT(r < 0);
         CX_TEST_ASSERT(n == NULL);
 
         s = 26;
-        r = cx_tree_search_data(&root, &s, test_tree_search_function,
+        r = cx_tree_search_data(&root, 0, &s, test_tree_search_function,
                            (void **) &n, tree_children(tree_node));
         CX_TEST_ASSERT(r > 0);
         CX_TEST_ASSERT(n == &ba);
 
         s = 35;
-        r = cx_tree_search_data(&root, &s, test_tree_search_function,
+        r = cx_tree_search_data(&root, 0, &s, test_tree_search_function,
                            (void **) &n, tree_children(tree_node));
         CX_TEST_ASSERT(r > 0);
         CX_TEST_ASSERT(n == &cb);
 
         s = 38;
-        r = cx_tree_search_data(&root, &s, test_tree_search_function,
+        r = cx_tree_search_data(&root, 0, &s, test_tree_search_function,
                            (void **) &n, tree_children(tree_node));
         CX_TEST_ASSERT(r > 0);
         CX_TEST_ASSERT(n == &cba);
 
         s = 42;
-        r = cx_tree_search_data(&root, &s, test_tree_search_function,
+        r = cx_tree_search_data(&root, 0, &s, test_tree_search_function,
                            (void **) &n, tree_children(tree_node));
         CX_TEST_ASSERT(r > 0);
         CX_TEST_ASSERT(n == &cc);
     }
 }
 
+CX_TEST(test_tree_search_with_max_depth) {
+    tree_node_file root = {0};
+    root.path = "/";
+    tree_node_file usr = {0};
+    usr.path = "/usr/";
+    cx_tree_link(&root, &usr, tree_node_file_layout);
+    tree_node_file home = {0};
+    home.path = "/home/";
+    cx_tree_link(&root, &home, tree_node_file_layout);
+    tree_node_file doe = {0};
+    doe.path = "/home/doe/";
+    cx_tree_link(&home, &doe, tree_node_file_layout);
+    tree_node_file lib = {0};
+    lib.path = "/usr/lib/";
+    cx_tree_link(&usr, &lib, tree_node_file_layout);
+    tree_node_file modules = {0};
+    modules.path = "/usr/lib/modules/";
+    cx_tree_link(&lib, &modules, tree_node_file_layout);
+
+    CX_TEST_DO {
+        int result;
+        void *found;
+
+        result = cx_tree_search_data(
+                &root, 1, "/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERTM(result == 0, "root not found");
+        CX_TEST_ASSERT(found == &root);
+
+        result = cx_tree_search_data(
+                &root, 1, "/usr/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERT(result > 0);
+        CX_TEST_ASSERT(found == &root);
+
+        result = cx_tree_search_data(
+                &root, 2, "/usr/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERT(result == 0);
+        CX_TEST_ASSERT(found == &usr);
+
+        result = cx_tree_search_data(
+                &root, 2, "/usr/lib/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERT(result > 0);
+        CX_TEST_ASSERT(found == &usr);
+
+        result = cx_tree_search_data(
+                &root, 3, "/usr/lib/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERTM(result == 0, "lib not found");
+        CX_TEST_ASSERT(found == &lib);
+
+        result = cx_tree_search_data(
+                &root, 1, "/home/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERT(result > 0);
+        CX_TEST_ASSERT(found == &root);
+
+        result = cx_tree_search_data(
+                &root, 2, "/home/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERTM(result == 0, "home not found");
+        CX_TEST_ASSERT(found == &home);
+
+        result = cx_tree_search_data(
+                &root, 2, "/home/doe/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERT(result > 0);
+        CX_TEST_ASSERT(found == &home);
+
+        result = cx_tree_search_data(
+                &root, 3, "/home/doe/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERTM(result == 0, "doe not found");
+        CX_TEST_ASSERT(found == &doe);
+
+        result = cx_tree_search_data(
+                &root, 3, "/usr/lib/modules/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERT(result > 0);
+        CX_TEST_ASSERT(found == &lib);
+
+        result = cx_tree_search_data(
+                &root, 4, "/usr/lib/modules/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERTM(result == 0, "modules not found (start=root)");
+        CX_TEST_ASSERT(found == &modules);
+
+        result = cx_tree_search_data(
+                &usr, 3, "/usr/lib/modules/",
+                tree_node_file_search_data, &found,
+                tree_children(tree_node_file)
+        );
+        CX_TEST_ASSERTM(result == 0, "modules not found (start=usr)");
+        CX_TEST_ASSERT(found == &modules);
+    }
+}
+
 CX_TEST(test_tree_iterator_create_and_dispose) {
     tree_node root;
     CX_TEST_DO {
@@ -1825,8 +1946,8 @@
         CX_TEST_ASSERT(tree->size == 7);
 
         tree_node_file *home = cxTreeFind(tree, "/home/");
-        CX_TEST_ASSERT(NULL == cxTreeFindInSubtree(tree, "/usr/", foo));
-        tree_node_file *bar = cxTreeFindInSubtree(tree, "/home/foo/bar/", home);
+        CX_TEST_ASSERT(NULL == cxTreeFindInSubtree(tree, "/usr/", foo, 0));
+        tree_node_file *bar = cxTreeFindInSubtree(tree, "/home/foo/bar/", home, 0);
         CX_TEST_ASSERT(NULL != bar);
         CX_TEST_ASSERT(0 == strcmp("/home/foo/bar/", bar->path));
         CX_TEST_ASSERT(bar->parent == foo);
@@ -1916,8 +2037,8 @@
         CX_TEST_ASSERT(tree->size == 7);
 
         tree_node_file *home = cxTreeFind(tree, "/home/");
-        CX_TEST_ASSERT(NULL == cxTreeFindInSubtree(tree, "/usr/", foo));
-        tree_node_file *bar = cxTreeFindInSubtree(tree, "/home/foo/bar/", home);
+        CX_TEST_ASSERT(NULL == cxTreeFindInSubtree(tree, "/usr/", foo, 0));
+        tree_node_file *bar = cxTreeFindInSubtree(tree, "/home/foo/bar/", home, 0);
         CX_TEST_ASSERT(NULL != bar);
         CX_TEST_ASSERT(0 == strcmp("/home/foo/bar/", bar->path));
         CX_TEST_ASSERT(bar->parent == foo);
@@ -2032,6 +2153,7 @@
     cx_test_register(suite, test_tree2_link_move_to_other_parent);
     cx_test_register(suite, test_tree2_unlink);
     cx_test_register(suite, test_tree_search);
+    cx_test_register(suite, test_tree_search_with_max_depth);
     cx_test_register(suite, test_tree_iterator_create_and_dispose);
     cx_test_register(suite, test_tree_iterator_create_for_empty_tree);
     cx_test_register(suite, test_tree_iterator_basic_only_enter);

mercurial