tests/test_tree.c

changeset 902
5ed7f634f046
parent 895
ea1ac0e8225c
child 903
a018f5916d3b
--- a/tests/test_tree.c	Wed Oct 02 19:11:40 2024 +0200
+++ b/tests/test_tree.c	Thu Oct 03 15:38:05 2024 +0200
@@ -54,7 +54,7 @@
     const char *path;
 } tree_node_file;
 
-static void *create_tree_node_file(
+static void *tree_node_file_create(
         const void *dptr,
         void *allocator) {
     if (allocator == NULL) allocator = cxDefaultAllocator;
@@ -1057,7 +1057,7 @@
         result = cx_tree_add(
                 "/home/foo/",
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 (void **) &foo, &root,
                 tree_node_file_layout
         );
@@ -1068,7 +1068,7 @@
         size_t added = cx_tree_add_array(
                 bar_path, 1, sizeof(const char *),
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 &failed, &root,
                 tree_node_file_layout
         );
@@ -1084,7 +1084,7 @@
         result = cx_tree_add(
                 "newroot",
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 (void **) &new_node, &root,
                 tree_node_file_layout
         );
@@ -1126,7 +1126,7 @@
         int result = cx_tree_add(
                 "/usr/lib/",
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 (void **) &node, &root,
                 tree_node_file_layout
         );
@@ -1151,7 +1151,7 @@
         int result = cx_tree_add(
                 "/usr/lib/",
                 tree_node_file_search,
-                create_tree_node_file, NULL,
+                tree_node_file_create, NULL,
                 (void **) &node, &root,
                 tree_node_file_layout
         );
@@ -1164,7 +1164,7 @@
         size_t added = cx_tree_add_array(
                 "/", 1, sizeof(const char *),
                 tree_node_file_search,
-                create_tree_node_file, NULL,
+                tree_node_file_create, NULL,
                 (void **) &node, &root,
                 tree_node_file_layout
         );
@@ -1184,7 +1184,7 @@
         int result = cx_tree_add(
                 "/",
                 tree_node_file_search,
-                create_tree_node_file, NULL,
+                tree_node_file_create, NULL,
                 (void **) &node, &root,
                 tree_node_file_layout
         );
@@ -1207,7 +1207,7 @@
         size_t processed = cx_tree_add_array(
                 (void *) 0xc0ffee, 0, sizeof(void *),
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 &failed, &root, tree_node_file_layout
         );
         CX_TEST_ASSERT(failed == NULL);
@@ -1219,7 +1219,7 @@
                 cxIteratorRef(iter),
                 10, // deliberately specify more than the iter has
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 &failed, &root, tree_node_file_layout
         );
         CX_TEST_ASSERT(processed == 0);
@@ -1263,7 +1263,7 @@
         size_t processed = cx_tree_add_array(
                 paths, 4, sizeof(const char *),
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 &failed, &root, tree_node_file_layout
         );
 
@@ -1328,7 +1328,7 @@
         size_t processed = cx_tree_add_iter(
                 cxIteratorRef(iter), 3,
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 &failed, &root, tree_node_file_layout
         );
 
@@ -1384,7 +1384,7 @@
         size_t processed = cx_tree_add_array(
                 paths, 5, sizeof(const char *),
                 tree_node_file_search,
-                create_tree_node_file, alloc,
+                tree_node_file_create, alloc,
                 (void **) &failed, &root, tree_node_file_layout
         );
 
@@ -1428,7 +1428,7 @@
     size_t processed = cx_tree_add_array(
             paths, 10, sizeof(const char *),
             tree_node_file_search,
-            create_tree_node_file, alloc,
+            tree_node_file_create, alloc,
             &failed, &root, tree_node_file_layout
     );
 
@@ -1526,6 +1526,88 @@
     cx_testing_allocator_destroy(&talloc);
 }
 
+CX_TEST(test_tree_high_create) {
+    CxTestingAllocator talloc;
+    cx_testing_allocator_init(&talloc);
+    CX_TEST_DO {
+        CxTree *tree = cxTreeCreate(
+                &talloc.base,
+                tree_node_file_create,
+                tree_node_file_search,
+                tree_node_file_layout
+        );
+        CX_TEST_ASSERT(tree->cl != NULL);
+        CX_TEST_ASSERT(tree->allocator == &talloc.base);
+        CX_TEST_ASSERT(tree->node_create == tree_node_file_create);
+        CX_TEST_ASSERT(tree->search == tree_node_file_search);
+        CX_TEST_ASSERT(tree->size == 0);
+        CX_TEST_ASSERT(tree->simple_destructor == NULL);
+        CX_TEST_ASSERT(tree->advanced_destructor == (cx_destructor_func2) cxFree);
+        CX_TEST_ASSERT(tree->destructor_data == &talloc.base);
+        CX_TEST_ASSERT(tree->root == NULL);
+        CX_TEST_ASSERT(tree->loc_parent == offsetof(tree_node_file, parent));
+        CX_TEST_ASSERT(tree->loc_children == offsetof(tree_node_file, children));
+        CX_TEST_ASSERT(tree->loc_last_child == offsetof(tree_node_file, last_child));
+        CX_TEST_ASSERT(tree->loc_prev == offsetof(tree_node_file, prev));
+        CX_TEST_ASSERT(tree->loc_next == offsetof(tree_node_file, next));
+
+        CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
+        CX_TEST_ASSERT(talloc.alloc_total == 1);
+
+        cxTreeDestroy(tree);
+        CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
+    }
+    cx_testing_allocator_destroy(&talloc);
+}
+
+CX_TEST(test_tree_high_create_simple) {
+    CX_TEST_DO {
+        CxTree *tree = cxTreeCreateSimple(
+                tree_node_file_create,
+                tree_node_file_search
+        );
+        CX_TEST_ASSERT(tree->cl != NULL);
+        CX_TEST_ASSERT(tree->allocator == cxDefaultAllocator);
+        CX_TEST_ASSERT(tree->node_create == tree_node_file_create);
+        CX_TEST_ASSERT(tree->search == tree_node_file_search);
+        CX_TEST_ASSERT(tree->size == 0);
+        CX_TEST_ASSERT(tree->simple_destructor == NULL);
+        CX_TEST_ASSERT(tree->advanced_destructor == (cx_destructor_func2) cxFree);
+        CX_TEST_ASSERT(tree->destructor_data == cxDefaultAllocator);
+        CX_TEST_ASSERT(tree->root == NULL);
+        CX_TEST_ASSERT(tree->loc_parent == offsetof(struct cx_tree_node_base_s, parent));
+        CX_TEST_ASSERT(tree->loc_children == offsetof(struct cx_tree_node_base_s, children));
+        CX_TEST_ASSERT(tree->loc_last_child == offsetof(struct cx_tree_node_base_s, last_child));
+        CX_TEST_ASSERT(tree->loc_prev == offsetof(struct cx_tree_node_base_s, prev));
+        CX_TEST_ASSERT(tree->loc_next == offsetof(struct cx_tree_node_base_s, next));
+        cxTreeDestroy(tree);
+    }
+}
+
+CX_TEST(test_tree_high_create_wrapped) {
+    tree_node root = {0}, child1 = {0}, child2 = {0}, child3 = {0};
+    cx_tree_link(&root, &child1, tree_node_layout);
+    cx_tree_link(&root, &child2, tree_node_layout);
+    cx_tree_link(&child1, &child3, tree_node_layout);
+    CX_TEST_DO {
+        CxTree *tree = cxTreeCreateWrapped(&root, tree_node_layout);
+        CX_TEST_ASSERT(tree->cl != NULL);
+        CX_TEST_ASSERT(tree->allocator == cxDefaultAllocator);
+        CX_TEST_ASSERT(tree->node_create == NULL);
+        CX_TEST_ASSERT(tree->search == NULL);
+        CX_TEST_ASSERT(tree->root == &root);
+        CX_TEST_ASSERT(tree->size == 4);
+        CX_TEST_ASSERT(tree->simple_destructor == NULL);
+        CX_TEST_ASSERT(tree->advanced_destructor == NULL);
+        CX_TEST_ASSERT(tree->destructor_data == NULL);
+        CX_TEST_ASSERT(tree->loc_parent == offsetof(tree_node, parent));
+        CX_TEST_ASSERT(tree->loc_children == offsetof(tree_node, children));
+        CX_TEST_ASSERT(tree->loc_last_child == -1);
+        CX_TEST_ASSERT(tree->loc_prev == offsetof(tree_node, prev));
+        CX_TEST_ASSERT(tree->loc_next == offsetof(tree_node, next));
+        cxTreeDestroy(tree);
+    }
+}
 
 CxTestSuite *cx_test_suite_tree_low_level(void) {
     CxTestSuite *suite = cx_test_suite_new("tree (low level)");
@@ -1562,3 +1644,13 @@
 
     return suite;
 }
+
+CxTestSuite *cx_test_suite_tree_high_level(void) {
+    CxTestSuite *suite = cx_test_suite_new("tree (high level)");
+
+    cx_test_register(suite, test_tree_high_create);
+    cx_test_register(suite, test_tree_high_create_simple);
+    cx_test_register(suite, test_tree_high_create_wrapped);
+
+    return suite;
+}

mercurial