117 lines
3.2 KiB
C
117 lines
3.2 KiB
C
#include <r_util.h>
|
|
|
|
void sum_node(RTreeNode *n, RTreeVisitor *vis) {
|
|
int cur = (int)vis->data;
|
|
vis->data = (void *)(size_t)(cur + (int)n->data);
|
|
}
|
|
|
|
void add_to_list(RTreeNode *n, RTreeVisitor *vis) {
|
|
RList *res = (RList *)vis->data;
|
|
r_list_append(res, n->data);
|
|
}
|
|
|
|
void check_list(RList *act, RList *exp, char *descr) {
|
|
RListIter *ita = r_list_iterator(act);
|
|
RListIter *ite = r_list_iterator(exp);
|
|
|
|
while (r_list_iter_next(ita) && r_list_iter_next(ite)) {
|
|
int a = (int)r_list_iter_get(ita);
|
|
int e = (int)r_list_iter_get(ite);
|
|
|
|
if (a != e) {
|
|
printf("[-][%s] test failed (actual: %d; expected: %d)\n", descr, a, e);
|
|
}
|
|
}
|
|
|
|
if (!ita && !ite) {
|
|
printf("[+][%s] test passed (lists have same elements)\n", descr);
|
|
} else {
|
|
printf("[-][%s] test failed (one list shorter or different)\n", descr);
|
|
}
|
|
}
|
|
|
|
void check (int n, int exp, char *descr) {
|
|
if (n == exp) {
|
|
printf("[+][%s] test passed (actual: %d; expected: %d)\n", descr, n, exp);
|
|
} else {
|
|
printf("[-][%s] test failed (actual: %d; expected: %d)\n", descr, n, exp);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
RTreeVisitor calc = { 0 };
|
|
RTreeVisitor lister = { 0 };
|
|
RTree *t = r_tree_new();
|
|
|
|
calc.pre_visit = (RTreeNodeVisitCb)sum_node;
|
|
calc.data = (void *)0;
|
|
|
|
r_tree_add_node (t, NULL, (void *)1);
|
|
r_tree_bfs(t, &calc);
|
|
check((int)calc.data, 1, "calc.data.root");
|
|
|
|
r_tree_add_node(t, t->root, (void *)2);
|
|
RTreeNode *s = r_tree_add_node(t, t->root, (void *)3);
|
|
RTreeNode *u = r_tree_add_node(t, t->root, (void *)4);
|
|
calc.data = (void *)0;
|
|
r_tree_bfs(t, &calc);
|
|
check((int)calc.data, 10, "calc.data.childs");
|
|
|
|
r_tree_add_node(t, s, (void *)5);
|
|
r_tree_add_node(t, s, (void *)10);
|
|
r_tree_add_node(t, u, (void *)11);
|
|
lister.pre_visit = (RTreeNodeVisitCb)add_to_list;
|
|
|
|
RList *exp1 = r_list_new();
|
|
r_list_append(exp1, (void *)1);
|
|
r_list_append(exp1, (void *)2);
|
|
r_list_append(exp1, (void *)3);
|
|
r_list_append(exp1, (void *)4);
|
|
r_list_append(exp1, (void *)5);
|
|
r_list_append(exp1, (void *)10);
|
|
r_list_append(exp1, (void *)11);
|
|
lister.data = r_list_new();
|
|
r_tree_bfs(t, &lister);
|
|
check_list((RList *)lister.data, exp1, "lister.bfs");
|
|
r_list_free(exp1);
|
|
r_list_free((RList *)lister.data);
|
|
|
|
RList *exp2 = r_list_new();
|
|
r_list_append(exp2, (void *)1);
|
|
r_list_append(exp2, (void *)2);
|
|
r_list_append(exp2, (void *)3);
|
|
r_list_append(exp2, (void *)5);
|
|
r_list_append(exp2, (void *)10);
|
|
r_list_append(exp2, (void *)4);
|
|
r_list_append(exp2, (void *)11);
|
|
lister.data = r_list_new();
|
|
r_tree_dfs(t, &lister);
|
|
check_list((RList *)lister.data, exp2, "lister.preorder");
|
|
r_list_free(exp2);
|
|
r_list_free((RList *)lister.data);
|
|
|
|
|
|
r_tree_reset(t);
|
|
RTreeNode *root = r_tree_add_node(t, NULL, "root");
|
|
RTreeNode *first = r_tree_add_node(t, root, "first");
|
|
r_tree_add_node(t, root, "second");
|
|
r_tree_add_node(t, root, "third");
|
|
r_tree_add_node(t, first, "f_first");
|
|
r_tree_add_node(t, first, "f_second");
|
|
|
|
RList *exp3 = r_list_new();
|
|
r_list_append(exp3, "root");
|
|
r_list_append(exp3, "first");
|
|
r_list_append(exp3, "f_first");
|
|
r_list_append(exp3, "f_second");
|
|
r_list_append(exp3, "second");
|
|
r_list_append(exp3, "third");
|
|
lister.data = r_list_new();
|
|
r_tree_dfs(t, &lister);
|
|
check_list((RList *)lister.data, exp3, "lister.reset.preorder");
|
|
r_list_free(exp3);
|
|
r_list_free((RList *)lister.data);
|
|
|
|
r_tree_free(t);
|
|
return 0;
|
|
}
|