diff -r 109567325fe7 -r 5ed7f634f046 tests/test_tree.c --- 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; +}