
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 <ps@pks.im> Mentored-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Chandra Pratap <chandrapratap3519@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
85 lines
1.7 KiB
C
85 lines
1.7 KiB
C
/*
|
|
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_search(&values[i], &root, &t_compare, 1);
|
|
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(&values[i], &root, &t_compare, 0));
|
|
}
|
|
|
|
check(!tree_search(values, &root, t_compare, 0));
|
|
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 {
|
|
tree_search(&values[i], &root, t_compare, 1);
|
|
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, const char *argv[])
|
|
{
|
|
TEST(t_tree_search(), "tree_search works");
|
|
TEST(t_infix_walk(), "infix_walk works");
|
|
|
|
return test_done();
|
|
}
|