libvieter/test/tree/test_tree.c

107 lines
2.9 KiB
C

#include "acutest.h"
#include "vieter_tree_internal.h"
#define TEST_SIZE(tree, size) \
TEST_CHECK(vieter_tree_size(tree) == size); \
TEST_MSG("Size: %zu", vieter_tree_size(tree))
void test_init() {
vieter_tree *tree = vieter_tree_init();
TEST_CHECK(tree != NULL);
TEST_SIZE(tree, 0);
vieter_tree_free(tree);
}
void test_insert() {
vieter_tree *tree = vieter_tree_init();
for (uint64_t i = 0; i < 250; i++) {
TEST_CHECK(vieter_tree_insert(tree, i, (void *)i) == vieter_tree_ok);
TEST_SIZE(tree, i + 1);
TEST_CHECK(vieter_tree_validate(tree));
}
vieter_tree_iterator *iter = vieter_tree_iterator_from(tree);
void *out = NULL;
for (uint64_t i = 0; i < 250; i++) {
TEST_CHECK(vieter_tree_search(&out, tree, i) == vieter_tree_ok);
TEST_CHECK(out == (void *)i);
TEST_CHECK(vieter_tree_insert(tree, i, NULL) == vieter_tree_already_present);
TEST_CHECK(vieter_tree_search(&out, tree, i) == vieter_tree_ok);
out = NULL;
TEST_CHECK(vieter_tree_iterator_next(&out, iter) == vieter_tree_ok);
TEST_CHECK(out == (void *)i);
}
TEST_CHECK(vieter_tree_iterator_next(&out, iter) == vieter_tree_iterator_done);
vieter_tree_iterator_free(&iter);
vieter_tree_free(tree);
}
void test_remove() {
vieter_tree *tree = vieter_tree_init();
for (uint64_t i = 0; i < 250; i++) {
TEST_CHECK(vieter_tree_insert(tree, i, NULL) == vieter_tree_ok);
TEST_CHECK(vieter_tree_validate(tree));
}
void *out;
for (uint64_t i = 0; i < 250; i++) {
TEST_CHECK(vieter_tree_search(&out, tree, i) == vieter_tree_ok);
TEST_CHECK(vieter_tree_remove(&out, tree, i) == vieter_tree_ok);
TEST_CHECK(vieter_tree_validate(tree));
TEST_CHECK(vieter_tree_search(&out, tree, i) == vieter_tree_not_present);
TEST_SIZE(tree, 250 - i - 1);
}
vieter_tree_free(tree);
}
int uint64_t_compare(const void *a, const void *b) {
if ((*(uint64_t *)a) < (*(uint64_t *)b)) {
return -1;
} else if ((*(uint64_t *)a) > (*(uint64_t *)b)) {
return 1;
} else {
return 0;
}
}
void test_random() {
const uint64_t n = 500;
srand(0);
vieter_tree *tree = vieter_tree_init();
uint64_t *numbers = malloc(n * sizeof(uint64_t));
uint64_t num;
void *out = NULL;
for (uint64_t i = 0; i < n; i++) {
num = rand();
vieter_tree_insert(tree, num, (void *)num);
TEST_SIZE(tree, i + 1);
TEST_CHECK(vieter_tree_validate(tree));
TEST_CHECK(vieter_tree_search(&out, tree, i) == vieter_tree_ok);
TEST_CHECK(out == (void *)num);
numbers[i] = num;
}
qsort(numbers, n, sizeof(uint64_t), uint64_t_compare);
}
TEST_LIST = {
{"tree init", test_init},
{"tree insert", test_insert},
{"tree remove", test_remove},
{NULL, NULL}
};