From 34dca5671fec8c592f1ca80ce11dc808cf6b83ed Mon Sep 17 00:00:00 2001 From: Dave Watson Date: Mon, 29 Feb 2016 11:30:34 -0800 Subject: [PATCH] Unittest for pairing heap --- Makefile.in | 1 + test/unit/ph.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 test/unit/ph.c diff --git a/Makefile.in b/Makefile.in index 3d725be1..7f2d668a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -148,6 +148,7 @@ TESTS_UNIT := $(srcroot)test/unit/atomic.c \ $(srcroot)test/unit/math.c \ $(srcroot)test/unit/mq.c \ $(srcroot)test/unit/mtx.c \ + $(srcroot)test/unit/ph.c \ $(srcroot)test/unit/prng.c \ $(srcroot)test/unit/prof_accum.c \ $(srcroot)test/unit/prof_active.c \ diff --git a/test/unit/ph.c b/test/unit/ph.c new file mode 100644 index 00000000..b0e44028 --- /dev/null +++ b/test/unit/ph.c @@ -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)); +}