Unittest for pairing heap
This commit is contained in:
parent
6bafa6678f
commit
34dca5671f
@ -148,6 +148,7 @@ TESTS_UNIT := $(srcroot)test/unit/atomic.c \
|
|||||||
$(srcroot)test/unit/math.c \
|
$(srcroot)test/unit/math.c \
|
||||||
$(srcroot)test/unit/mq.c \
|
$(srcroot)test/unit/mq.c \
|
||||||
$(srcroot)test/unit/mtx.c \
|
$(srcroot)test/unit/mtx.c \
|
||||||
|
$(srcroot)test/unit/ph.c \
|
||||||
$(srcroot)test/unit/prng.c \
|
$(srcroot)test/unit/prng.c \
|
||||||
$(srcroot)test/unit/prof_accum.c \
|
$(srcroot)test/unit/prof_accum.c \
|
||||||
$(srcroot)test/unit/prof_active.c \
|
$(srcroot)test/unit/prof_active.c \
|
||||||
|
92
test/unit/ph.c
Normal file
92
test/unit/ph.c
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
#include "test/jemalloc_test.h"
|
||||||
|
|
||||||
|
typedef struct node_s node_t;
|
||||||
|
|
||||||
|
struct node_s {
|
||||||
|
ph_node_t link;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_BEGIN(test_ph_empty)
|
||||||
|
{
|
||||||
|
ph_heap_t heap;
|
||||||
|
|
||||||
|
ph_new(&heap);
|
||||||
|
|
||||||
|
assert_ptr_null(ph_first(&heap), "Unexpected node");
|
||||||
|
}
|
||||||
|
TEST_END
|
||||||
|
|
||||||
|
TEST_BEGIN(test_ph_random)
|
||||||
|
{
|
||||||
|
#define NNODES 25
|
||||||
|
#define NBAGS 250
|
||||||
|
#define SEED 42
|
||||||
|
sfmt_t *sfmt;
|
||||||
|
uint64_t bag[NNODES];
|
||||||
|
ph_heap_t heap;
|
||||||
|
node_t nodes[NNODES];
|
||||||
|
unsigned i, j, k;
|
||||||
|
|
||||||
|
sfmt = init_gen_rand(SEED);
|
||||||
|
for (i = 0; i < NBAGS; i++) {
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
/* Insert in order. */
|
||||||
|
for (j = 0; j < NNODES; j++)
|
||||||
|
bag[j] = j;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
/* Insert in reverse order. */
|
||||||
|
for (j = 0; j < NNODES; j++)
|
||||||
|
bag[j] = NNODES - j - 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
for (j = 0; j < NNODES; j++)
|
||||||
|
bag[j] = gen_rand64_range(sfmt, NNODES);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 1; j <= NNODES; j++) {
|
||||||
|
/* Initialize heap and nodes. */
|
||||||
|
ph_new(&heap);
|
||||||
|
|
||||||
|
/* Insert nodes. */
|
||||||
|
for (k = 0; k < j; k++) {
|
||||||
|
ph_insert(&heap, &nodes[k].link);
|
||||||
|
|
||||||
|
assert_ptr_not_null(ph_first(&heap),
|
||||||
|
"Heap should not be empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove nodes. */
|
||||||
|
switch (i % 2) {
|
||||||
|
case 0:
|
||||||
|
for (k = 0; k < j; k++)
|
||||||
|
ph_remove(&heap, &nodes[k].link);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
for (k = j; k > 0; k--)
|
||||||
|
ph_remove(&heap, &nodes[k-1].link);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
not_reached();
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_ptr_null(ph_first(&heap),
|
||||||
|
"Heap should not be empty");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fini_gen_rand(sfmt);
|
||||||
|
#undef NNODES
|
||||||
|
#undef NBAGS
|
||||||
|
#undef SEED
|
||||||
|
}
|
||||||
|
TEST_END
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (test(
|
||||||
|
test_ph_empty,
|
||||||
|
test_ph_random));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user