tests: avl: test merging functions
This commit is contained in:
parent
96971e9c8e
commit
564aae3d55
259
tests/avl.c
259
tests/avl.c
|
@ -573,3 +573,262 @@ Test(avl, height_right) {
|
||||||
|
|
||||||
cr_assert_eq(avl_height(&tree), 2);
|
cr_assert_eq(avl_height(&tree), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_null) {
|
||||||
|
avl_merge(NULL, NULL);
|
||||||
|
|
||||||
|
size_t count = 0;
|
||||||
|
struct avl tree = init_avl(NULL, &count);
|
||||||
|
avl_merge(&tree, NULL);
|
||||||
|
avl_merge(NULL, &tree);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_none_right) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct avl right = init_avl(NULL, &count);
|
||||||
|
|
||||||
|
avl_merge(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_none_left) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(NULL, &count);
|
||||||
|
struct avl right = init_avl(&t.avl, &count);
|
||||||
|
|
||||||
|
avl_merge(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_one) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct int_tree t2 = { 43, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl right = init_avl(&t2.avl, &count);
|
||||||
|
|
||||||
|
avl_merge(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 1);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_eq(left.root->right, &t2.avl);
|
||||||
|
cr_assert_null(left.root->left);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_one_same) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct int_tree t2 = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl right = init_avl(&t2.avl, &count);
|
||||||
|
|
||||||
|
avl_merge(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 1);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_null(left.root->left);
|
||||||
|
cr_assert_null(left.root->right);
|
||||||
|
cr_assert_eq(right.root, &t2.avl);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void assert_all_between(const struct avl_node *n,
|
||||||
|
const struct int_tree *b, const struct int_tree *e) {
|
||||||
|
if (!n)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const struct int_tree *v = CONTAINER_OF(const struct int_tree, avl, n);
|
||||||
|
cr_assert_geq(v, b);
|
||||||
|
cr_assert_lt(v, e);
|
||||||
|
|
||||||
|
assert_all_between(n->left, b, e);
|
||||||
|
assert_all_between(n->right, b, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_same) {
|
||||||
|
struct int_tree arr1[5];
|
||||||
|
struct int_tree arr2[ARR_SIZE(arr1)];
|
||||||
|
size_t count = 0;
|
||||||
|
struct avl left = init_int_tree_avl(&count, arr1, ARR_SIZE(arr1));
|
||||||
|
struct avl right = init_int_tree_avl(&count, arr2, ARR_SIZE(arr2));
|
||||||
|
|
||||||
|
avl_merge(&left, &right);
|
||||||
|
|
||||||
|
assert_all_between(left.root, arr1, arr1 + ARR_SIZE(arr1));
|
||||||
|
assert_all_between(right.root, arr2, arr2 + ARR_SIZE(arr2));
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, update_null) {
|
||||||
|
avl_update(NULL, NULL);
|
||||||
|
|
||||||
|
size_t count = 0;
|
||||||
|
struct avl tree = init_avl(NULL, &count);
|
||||||
|
avl_update(&tree, NULL);
|
||||||
|
avl_update(NULL, &tree);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, update_none_right) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct avl right = init_avl(NULL, &count);
|
||||||
|
|
||||||
|
avl_update(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, update_none_left) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(NULL, &count);
|
||||||
|
struct avl right = init_avl(&t.avl, &count);
|
||||||
|
|
||||||
|
avl_update(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, update_one) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct int_tree t2 = { 43, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl right = init_avl(&t2.avl, &count);
|
||||||
|
|
||||||
|
avl_update(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 1);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_eq(left.root->right, &t2.avl);
|
||||||
|
cr_assert_null(left.root->left);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, update_one_same) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct int_tree t2 = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl right = init_avl(&t2.avl, &count);
|
||||||
|
|
||||||
|
avl_update(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 1);
|
||||||
|
cr_assert_eq(left.root, &t2.avl);
|
||||||
|
cr_assert_null(left.root->left);
|
||||||
|
cr_assert_null(left.root->right);
|
||||||
|
cr_assert_eq(right.root, &t.avl);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, update_same) {
|
||||||
|
struct int_tree arr1[5];
|
||||||
|
struct int_tree arr2[ARR_SIZE(arr1)];
|
||||||
|
size_t count = 0;
|
||||||
|
struct avl left = init_int_tree_avl(&count, arr1, ARR_SIZE(arr1));
|
||||||
|
struct avl right = init_int_tree_avl(&count, arr2, ARR_SIZE(arr2));
|
||||||
|
|
||||||
|
avl_update(&left, &right);
|
||||||
|
|
||||||
|
assert_all_between(left.root, arr2, arr2 + ARR_SIZE(arr2));
|
||||||
|
assert_all_between(right.root, arr1, arr1 + ARR_SIZE(arr1));
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_all_null) {
|
||||||
|
avl_merge_all(NULL, NULL);
|
||||||
|
|
||||||
|
size_t count = 0;
|
||||||
|
struct avl tree = init_avl(NULL, &count);
|
||||||
|
avl_merge_all(&tree, NULL);
|
||||||
|
avl_merge_all(NULL, &tree);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_all_none_right) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct avl right = init_avl(NULL, &count);
|
||||||
|
|
||||||
|
avl_merge_all(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_all_none_left) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(NULL, &count);
|
||||||
|
struct avl right = init_avl(&t.avl, &count);
|
||||||
|
|
||||||
|
avl_merge_all(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_all_one) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct int_tree t2 = { 43, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl right = init_avl(&t2.avl, &count);
|
||||||
|
|
||||||
|
avl_merge_all(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 1);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_eq(left.root->right, &t2.avl);
|
||||||
|
cr_assert_null(left.root->left);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_all_one_same) {
|
||||||
|
size_t count = 0;
|
||||||
|
struct int_tree t = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl left = init_avl(&t.avl, &count);
|
||||||
|
struct int_tree t2 = { 42, AVL_NODE_INIT_VAL };
|
||||||
|
struct avl right = init_avl(&t2.avl, &count);
|
||||||
|
|
||||||
|
avl_merge_all(&left, &right);
|
||||||
|
|
||||||
|
cr_assert_eq(count, 1);
|
||||||
|
cr_assert_eq(left.root, &t.avl);
|
||||||
|
cr_assert_eq(left.root->right, &t2.avl);
|
||||||
|
cr_assert_null(left.root->left);
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(avl, merge_all_same) {
|
||||||
|
struct int_tree arr1[5];
|
||||||
|
struct int_tree arr2[ARR_SIZE(arr1)];
|
||||||
|
size_t count = 0;
|
||||||
|
struct avl left = init_int_tree_avl(&count, arr1, ARR_SIZE(arr1));
|
||||||
|
struct avl right = init_int_tree_avl(&count, arr2, ARR_SIZE(arr2));
|
||||||
|
|
||||||
|
avl_merge_all(&left, &right);
|
||||||
|
|
||||||
|
// NOTE: does not check that all values are inside the merged tree
|
||||||
|
cr_assert_null(right.root);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue