| /* |
| Copyright 2020 Google LLC |
| |
| Use of this source code is governed by a BSD-style |
| license that can be found in the LICENSE file or at |
| https://developers.google.com/open-source/licenses/bsd |
| */ |
| |
| #include "test-lib.h" |
| #include "reftable/tree.h" |
| |
| static int t_compare(const void *a, const void *b) |
| { |
| return (char *)a - (char *)b; |
| } |
| |
| struct curry { |
| void **arr; |
| size_t len; |
| }; |
| |
| static void store(void *arg, void *key) |
| { |
| struct curry *c = arg; |
| c->arr[c->len++] = key; |
| } |
| |
| static void t_tree_search(void) |
| { |
| struct tree_node *root = NULL; |
| void *values[11] = { 0 }; |
| struct tree_node *nodes[11] = { 0 }; |
| size_t i = 1; |
| |
| /* |
| * Pseudo-randomly insert the pointers for elements between |
| * values[1] and values[10] (inclusive) in the tree. |
| */ |
| do { |
| nodes[i] = tree_insert(&root, &values[i], &t_compare); |
| check(nodes[i] != NULL); |
| i = (i * 7) % 11; |
| } while (i != 1); |
| |
| for (i = 1; i < ARRAY_SIZE(nodes); i++) { |
| check_pointer_eq(&values[i], nodes[i]->key); |
| check_pointer_eq(nodes[i], tree_search(root, &values[i], &t_compare)); |
| } |
| |
| check(!tree_search(root, values, t_compare)); |
| tree_free(root); |
| } |
| |
| static void t_infix_walk(void) |
| { |
| struct tree_node *root = NULL; |
| void *values[11] = { 0 }; |
| void *out[11] = { 0 }; |
| struct curry c = { |
| .arr = (void **) &out, |
| }; |
| size_t i = 1; |
| size_t count = 0; |
| |
| do { |
| struct tree_node *node = tree_insert(&root, &values[i], t_compare); |
| check(node != NULL); |
| i = (i * 7) % 11; |
| count++; |
| } while (i != 1); |
| |
| infix_walk(root, &store, &c); |
| for (i = 1; i < ARRAY_SIZE(values); i++) |
| check_pointer_eq(&values[i], out[i - 1]); |
| check(!out[i - 1]); |
| check_int(c.len, ==, count); |
| tree_free(root); |
| } |
| |
| int cmd_main(int argc UNUSED, const char *argv[] UNUSED) |
| { |
| TEST(t_tree_search(), "tree_search works"); |
| TEST(t_infix_walk(), "infix_walk works"); |
| |
| return test_done(); |
| } |