tests/test_tree.c

changeset 826
21840975d541
parent 816
425234b05dff
child 833
5c926801f052
     1.1 --- a/tests/test_tree.c	Wed Feb 14 22:32:13 2024 +0100
     1.2 +++ b/tests/test_tree.c	Thu Feb 15 21:54:43 2024 +0100
     1.3 @@ -42,6 +42,8 @@
     1.4      offsetof(tree_node, parent), offsetof(tree_node, children), \
     1.5      offsetof(tree_node, prev), offsetof(tree_node, next)
     1.6  
     1.7 +#define tree_child_list offsetof(tree_node, children),offsetof(tree_node, next)
     1.8 +
     1.9  CX_TEST(test_tree_link_new_child) {
    1.10      tree_node parent = {0};
    1.11      tree_node child = {0};
    1.12 @@ -160,6 +162,94 @@
    1.13      }
    1.14  }
    1.15  
    1.16 +static int test_tree_search_function(void const *n, void const *d) {
    1.17 +    tree_node const *node = n;
    1.18 +    int data = *((int const*)d);
    1.19 +
    1.20 +    if (data < node->data) return -1;
    1.21 +    else if (data == node->data) return 0;
    1.22 +    else return data - node->data;
    1.23 +}
    1.24 +
    1.25 +CX_TEST(test_tree_search) {
    1.26 +    tree_node root = {0};
    1.27 +    tree_node a = {0};
    1.28 +    tree_node b = {0};
    1.29 +    tree_node c = {0};
    1.30 +    tree_node aa = {0};
    1.31 +    tree_node ab = {0};
    1.32 +    tree_node ba = {0};
    1.33 +    tree_node ca = {0};
    1.34 +    tree_node cb = {0};
    1.35 +    tree_node cc = {0};
    1.36 +    tree_node cba = {0};
    1.37 +
    1.38 +    int testdata[] = {0, 10, 14, 18, 20, 25, 30, 32, 34, 36, 40};
    1.39 +    tree_node* testnodes[] = {&root, &a, &aa, &ab, &b, &ba, &c, &ca, &cb, &cba, &cc};
    1.40 +
    1.41 +    for (unsigned i = 0 ; i <= 10 ; i++) {
    1.42 +        testnodes[i]->data = testdata[i];
    1.43 +    }
    1.44 +
    1.45 +    cx_tree_link(&root, &a, tree_node_layout);
    1.46 +    cx_tree_link(&root, &b, tree_node_layout);
    1.47 +    cx_tree_link(&root, &c, tree_node_layout);
    1.48 +
    1.49 +    cx_tree_link(&a, &aa, tree_node_layout);
    1.50 +    cx_tree_link(&a, &ab, tree_node_layout);
    1.51 +
    1.52 +    cx_tree_link(&b, &ba, tree_node_layout);
    1.53 +
    1.54 +    cx_tree_link(&c, &ca, tree_node_layout);
    1.55 +    cx_tree_link(&c, &cb, tree_node_layout);
    1.56 +    cx_tree_link(&c, &cc, tree_node_layout);
    1.57 +
    1.58 +    cx_tree_link(&cb, &cba, tree_node_layout);
    1.59 +
    1.60 +    int s;
    1.61 +    int r;
    1.62 +    tree_node *n;
    1.63 +    CX_TEST_DO {
    1.64 +        for (unsigned i = 0 ; i <= 10 ; i++) {
    1.65 +            s = testdata[i];
    1.66 +            r = cx_tree_search(&root, &s, test_tree_search_function,
    1.67 +                               (void **) &n, tree_child_list);
    1.68 +            CX_TEST_ASSERT(r == 0);
    1.69 +            CX_TEST_ASSERT(n == testnodes[i]);
    1.70 +        }
    1.71 +
    1.72 +        s = -5;
    1.73 +        r = cx_tree_search(&root, &s, test_tree_search_function,
    1.74 +                           (void **) &n, tree_child_list);
    1.75 +        CX_TEST_ASSERT(r < 0);
    1.76 +        CX_TEST_ASSERT(n == NULL);
    1.77 +
    1.78 +        s = 26;
    1.79 +        r = cx_tree_search(&root, &s, test_tree_search_function,
    1.80 +                           (void **) &n, tree_child_list);
    1.81 +        CX_TEST_ASSERT(r > 0);
    1.82 +        CX_TEST_ASSERT(n == &ba);
    1.83 +
    1.84 +        s = 35;
    1.85 +        r = cx_tree_search(&root, &s, test_tree_search_function,
    1.86 +                           (void **) &n, tree_child_list);
    1.87 +        CX_TEST_ASSERT(r > 0);
    1.88 +        CX_TEST_ASSERT(n == &cb);
    1.89 +
    1.90 +        s = 38;
    1.91 +        r = cx_tree_search(&root, &s, test_tree_search_function,
    1.92 +                           (void **) &n, tree_child_list);
    1.93 +        CX_TEST_ASSERT(r > 0);
    1.94 +        CX_TEST_ASSERT(n == &cba);
    1.95 +
    1.96 +        s = 42;
    1.97 +        r = cx_tree_search(&root, &s, test_tree_search_function,
    1.98 +                           (void **) &n, tree_child_list);
    1.99 +        CX_TEST_ASSERT(r > 0);
   1.100 +        CX_TEST_ASSERT(n == &cc);
   1.101 +    }
   1.102 +}
   1.103 +
   1.104  CxTestSuite *cx_test_suite_tree_low_level(void) {
   1.105      CxTestSuite *suite = cx_test_suite_new("tree (low level)");
   1.106  
   1.107 @@ -167,6 +257,7 @@
   1.108      cx_test_register(suite, test_tree_link_add_child);
   1.109      cx_test_register(suite, test_tree_link_move_to_other_parent);
   1.110      cx_test_register(suite, test_tree_unlink);
   1.111 +    cx_test_register(suite, test_tree_search);
   1.112  
   1.113      return suite;
   1.114  }

mercurial