diff -r 3f324ea53152 -r 21840975d541 tests/test_tree.c --- a/tests/test_tree.c Wed Feb 14 22:32:13 2024 +0100 +++ b/tests/test_tree.c Thu Feb 15 21:54:43 2024 +0100 @@ -42,6 +42,8 @@ offsetof(tree_node, parent), offsetof(tree_node, children), \ offsetof(tree_node, prev), offsetof(tree_node, next) +#define tree_child_list offsetof(tree_node, children),offsetof(tree_node, next) + CX_TEST(test_tree_link_new_child) { tree_node parent = {0}; tree_node child = {0}; @@ -160,6 +162,94 @@ } } +static int test_tree_search_function(void const *n, void const *d) { + tree_node const *node = n; + int data = *((int const*)d); + + if (data < node->data) return -1; + else if (data == node->data) return 0; + else return data - node->data; +} + +CX_TEST(test_tree_search) { + 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}; + + int testdata[] = {0, 10, 14, 18, 20, 25, 30, 32, 34, 36, 40}; + tree_node* testnodes[] = {&root, &a, &aa, &ab, &b, &ba, &c, &ca, &cb, &cba, &cc}; + + for (unsigned i = 0 ; i <= 10 ; i++) { + testnodes[i]->data = testdata[i]; + } + + 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); + + int s; + int r; + tree_node *n; + CX_TEST_DO { + for (unsigned i = 0 ; i <= 10 ; i++) { + s = testdata[i]; + r = cx_tree_search(&root, &s, test_tree_search_function, + (void **) &n, tree_child_list); + CX_TEST_ASSERT(r == 0); + CX_TEST_ASSERT(n == testnodes[i]); + } + + s = -5; + r = cx_tree_search(&root, &s, test_tree_search_function, + (void **) &n, tree_child_list); + CX_TEST_ASSERT(r < 0); + CX_TEST_ASSERT(n == NULL); + + s = 26; + r = cx_tree_search(&root, &s, test_tree_search_function, + (void **) &n, tree_child_list); + CX_TEST_ASSERT(r > 0); + CX_TEST_ASSERT(n == &ba); + + s = 35; + r = cx_tree_search(&root, &s, test_tree_search_function, + (void **) &n, tree_child_list); + CX_TEST_ASSERT(r > 0); + CX_TEST_ASSERT(n == &cb); + + s = 38; + r = cx_tree_search(&root, &s, test_tree_search_function, + (void **) &n, tree_child_list); + CX_TEST_ASSERT(r > 0); + CX_TEST_ASSERT(n == &cba); + + s = 42; + r = cx_tree_search(&root, &s, test_tree_search_function, + (void **) &n, tree_child_list); + CX_TEST_ASSERT(r > 0); + CX_TEST_ASSERT(n == &cc); + } +} + CxTestSuite *cx_test_suite_tree_low_level(void) { CxTestSuite *suite = cx_test_suite_new("tree (low level)"); @@ -167,6 +257,7 @@ cx_test_register(suite, test_tree_link_add_child); cx_test_register(suite, test_tree_link_move_to_other_parent); cx_test_register(suite, test_tree_unlink); + cx_test_register(suite, test_tree_search); return suite; }