Skip to content

Commit

Permalink
t-reftable-tree: improve the test for infix_walk()
Browse files Browse the repository at this point in the history
In the current testing setup for infix_walk(), the following
properties of an infix traversal of a tree remain untested:
- every node of the tree must be visited
- every node must be visited exactly once
In fact, only the property 'traversal in increasing order' is tested.
Modify test_infix_walk() to check for all the properties above.

This can be achieved by storing the nodes' keys linearly, in a nullified
buffer, as we visit them and then checking the input keys against this
buffer in increasing order. By checking that the element just after
the last input key is 'NULL' in the output buffer, we ensure that
every node is traversed exactly once.

Mentored-by: Patrick Steinhardt <[email protected]>
Mentored-by: Christian Couder <[email protected]>
Signed-off-by: Chandra Pratap <[email protected]>
  • Loading branch information
Chandra Pratap committed Jul 18, 2024
1 parent c1ce799 commit d1a5ced
Showing 1 changed file with 15 additions and 7 deletions.
22 changes: 15 additions & 7 deletions t/unit-tests/t-reftable-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,14 @@ static int t_compare(const void *a, const void *b)
}

struct curry {
void *last;
void **arr;
size_t len;
};

static void check_increasing(void *arg, void *key)
static void store(void *arg, void *key)
{
struct curry *c = arg;
if (c->last)
check_int(t_compare(c->last, key), <, 0);
c->last = key;
c->arr[c->len++] = key;
}

static void t_tree_search(void)
Expand Down Expand Up @@ -54,15 +53,24 @@ static void t_infix_walk(void)
{
struct tree_node *root = NULL;
void *values[11] = { 0 };
struct curry c = { 0 };
void *out[11] = { 0 };
struct curry c = {
.arr = (void **) &out,
};
size_t i = 1;
size_t count = 0;

do {
tree_search(&values[i], &root, t_compare, 1);
i = (i * 7) % 11;
count++;
} while (i != 1);

infix_walk(root, &check_increasing, &c);
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);
}

Expand Down

0 comments on commit d1a5ced

Please sign in to comment.