2
#include <usual/cbtree.h>
4
#include <usual/string.h>
5
#include "test_common.h"
7
static char *OK = "OK";
14
static unsigned int my_getkey(void *ctx, void *obj, const void **dst_p)
16
struct MyNode *node = obj;
21
static struct MyNode *make_node(int value)
23
struct MyNode *node = malloc(sizeof(*node));
24
memset(node, 0, sizeof(*node));
25
snprintf(node->str, sizeof(node->str), "%d", value);
26
node->len = strlen(node->str);
30
static bool my_node_free(void *ctx, void *obj)
44
static const char *my_search(struct CBTree *tree, int value)
48
snprintf(buf, sizeof(buf), "%d", value);
49
res = cbtree_lookup(tree, buf, strlen(buf));
50
return res ? OK : "not found";
53
static const char *my_insert(struct CBTree *tree, int value)
55
struct MyNode *my = make_node(value);
56
if (!cbtree_insert(tree, my))
57
return "insert failed";
58
return my_search(tree, value);
61
static const char *my_remove(struct CBTree *tree, int value)
65
snprintf(buf, sizeof(buf), "%d", value);
67
my = cbtree_lookup(tree, buf, strlen(buf));
69
return "nonexsist element";
70
cbtree_delete(tree, buf, strlen(buf));
71
if (cbtree_lookup(tree, buf, strlen(buf)) != NULL)
80
static void test_cbtree_basic(void *p)
85
tree = cbtree_create(my_getkey, my_node_free, NULL, USUAL_ALLOC);
87
str_check(my_search(tree, 1), "not found");
89
for (i = 0; i < 15; i++) {
90
str_check(my_insert(tree, i), "OK");
92
for (i = -1; i > -15; i--) {
93
str_check(my_insert(tree, i), "OK");
95
for (i = 30; i < 45; i++) {
96
str_check(my_insert(tree, i), "OK");
98
for (i = 15; i < 30; i++) {
99
str_check(my_insert(tree, i), "OK");
102
for (i = -14; i < 45; i++) {
103
str_check(my_remove(tree, i), "OK");
106
cbtree_destroy(tree);
115
static int get_next(bool with_stat, bool added[])
117
int r = random() % RSIZE;
120
if (added[i] == with_stat)
129
static void test_cbtree_random(void *p)
131
bool is_added[RSIZE];
132
int prefer_remove = 0; // 0 - insert, 1 - delete
134
int op; // 0 - insert, 1 - delete
136
unsigned long long total = 0;
138
//printf("\n\n*** rand test ***\n\n");
140
memset(is_added, 0, sizeof(is_added));
142
tree = cbtree_create(my_getkey, my_node_free, NULL, USUAL_ALLOC);
144
while (total < 20000) {
145
int r = random() & 15;
152
n = get_next(op, is_added);
155
if (prefer_remove == op) {
156
prefer_remove = !prefer_remove;
157
//printf("** toggling remove to %d\n", prefer_remove);
163
str_check(my_insert(tree, n), "OK");
166
str_check(my_remove(tree, n), "OK");
172
cbtree_destroy(tree);
175
struct testcase_t cbtree_tests[] = {
176
{ "basic", test_cbtree_basic },
177
{ "random", test_cbtree_random },