tests: vector: test heap-related functions
This commit is contained in:
parent
3436d30a04
commit
d3c8f05ffc
230
tests/vector.c
230
tests/vector.c
|
@ -420,3 +420,233 @@ Test(vector, pop_at) {
|
||||||
cr_assert_not(vector_pop_at(&v, &res, 0));
|
cr_assert_not(vector_pop_at(&v, &res, 0));
|
||||||
cr_assert_eq(v.nmemb, 0);
|
cr_assert_eq(v.nmemb, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int int_cmp(const void *lhs, const void *rhs, void *cookie) {
|
||||||
|
const int *l = lhs;
|
||||||
|
const int *r = rhs;
|
||||||
|
int *count = cookie;
|
||||||
|
|
||||||
|
++*count;
|
||||||
|
|
||||||
|
if (*l < *r)
|
||||||
|
return -1;
|
||||||
|
return (*l > *r);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, is_max_heap_null) {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert(vector_is_max_heap(NULL, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, is_max_heap_empty) {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, is_max_heap_one) {
|
||||||
|
int *arr = v.arr;
|
||||||
|
arr[v.nmemb++] = 42;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, is_max_heap_sorted) {
|
||||||
|
int count = 0;
|
||||||
|
fill_v();
|
||||||
|
|
||||||
|
cr_assert_not(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_gt(count, 0);
|
||||||
|
// A complete tree has (N - 1) internal connections
|
||||||
|
cr_assert_leq(count, init_n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, is_max_heap_inverse_sorted) {
|
||||||
|
for (size_t i = 0; i < init_n; ++i) {
|
||||||
|
int *arr = v.arr;
|
||||||
|
arr[v.nmemb++] = init_n - i - 1;
|
||||||
|
}
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
|
||||||
|
// A complete tree has (N - 1) internal connections, we check all of them
|
||||||
|
cr_assert_eq(count, init_n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, make_heap_null) {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert_not(vector_make_heap(NULL, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, make_heap_empty) {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert_not(vector_make_heap(&v, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, make_heap_one) {
|
||||||
|
int *arr = v.arr;
|
||||||
|
arr[v.nmemb++] = 42;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert(vector_make_heap(&v, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, make_heap) {
|
||||||
|
fill_v();
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert(vector_make_heap(&v, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
cr_assert_neq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fill_v_heap(void) {
|
||||||
|
int *arr = v.arr;
|
||||||
|
for (size_t i = 0; i < v.cap; ++i) {
|
||||||
|
arr[v.nmemb++] = init_n - i - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
vector_make_heap(&v, int_cmp, &count);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, push_heap_null) {
|
||||||
|
int count = 0;
|
||||||
|
cr_assert_not(vector_push_heap(NULL, NULL, int_cmp, &count));
|
||||||
|
|
||||||
|
int n = 42;
|
||||||
|
cr_assert_not(vector_push_heap(&v, NULL, int_cmp, &count));
|
||||||
|
cr_assert_not(vector_push_heap(NULL, &n, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, push_heap_empty) {
|
||||||
|
int n = 42;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
cr_assert(vector_push_heap(&v, &n, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, push_heap_full) {
|
||||||
|
fill_v_heap();
|
||||||
|
int n = 42;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
cr_assert(vector_push_heap(&v, &n, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_neq(count, 0);
|
||||||
|
cr_assert_eq(v.nmemb, init_n + 1);
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, push_heap_sorted) {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < init_n; ++i) {
|
||||||
|
int n = i;
|
||||||
|
cr_assert(vector_push_heap(&v, &n, int_cmp, &count));
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
cr_assert_eq(v.nmemb, i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, push_heap_inverse_sorted) {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < init_n; ++i) {
|
||||||
|
int n = init_n - i - 1;
|
||||||
|
cr_assert(vector_push_heap(&v, &n, int_cmp, &count));
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
cr_assert_eq(v.nmemb, i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, push_heap_same) {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < init_n; ++i) { // Use underflow to stop
|
||||||
|
int n = 0;
|
||||||
|
cr_assert(vector_push_heap(&v, &n, int_cmp, &count));
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
cr_assert_eq(v.nmemb, i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, pop_heap_null) {
|
||||||
|
int count = 0;
|
||||||
|
cr_assert_not(vector_pop_heap(NULL, NULL, int_cmp, &count));
|
||||||
|
|
||||||
|
int n = 42;
|
||||||
|
cr_assert_not(vector_pop_heap(&v, NULL, int_cmp, &count));
|
||||||
|
cr_assert_not(vector_pop_heap(NULL, &n, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, pop_heap_empty) {
|
||||||
|
int n = 42;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
cr_assert_not(vector_pop_heap(&v, &n, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_eq(count, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, pop_heap_one_null_output) {
|
||||||
|
int *arr = v.arr;
|
||||||
|
arr[v.nmemb++] = 42;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
cr_assert(vector_pop_heap(&v, NULL, int_cmp, &count));
|
||||||
|
cr_assert_eq(v.nmemb, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, pop_heap_full) {
|
||||||
|
fill_v_heap();
|
||||||
|
int n = 42;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
cr_assert(vector_pop_heap(&v, &n, int_cmp, &count));
|
||||||
|
|
||||||
|
cr_assert_neq(count, 0);
|
||||||
|
cr_assert_eq(n, init_n - 1);
|
||||||
|
cr_assert_eq(v.nmemb, init_n - 1);
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vector, pop_heap) {
|
||||||
|
fill_v_heap();
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (size_t i = 0; i < init_n; ++i) { // Use underflow to stop
|
||||||
|
int n = 42;
|
||||||
|
cr_assert(vector_pop_heap(&v, &n, int_cmp, &count));
|
||||||
|
cr_assert_eq(n, init_n - i - 1);
|
||||||
|
cr_assert(vector_is_max_heap(&v, int_cmp, &count));
|
||||||
|
}
|
||||||
|
|
||||||
|
cr_assert_eq(v.nmemb, 0);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue