| 1 | #include "unit-test.h" |
| 2 | #include "prio-queue.h" |
| 3 | |
| 4 | static int intcmp(const void *va, const void *vb, void *data UNUSED) |
| 5 | { |
| 6 | const int *a = va, *b = vb; |
| 7 | return *a - *b; |
| 8 | } |
| 9 | |
| 10 | |
| 11 | #define MISSING -1 |
| 12 | #define DUMP -2 |
| 13 | #define STACK -3 |
| 14 | #define GET -4 |
| 15 | #define REVERSE -5 |
| 16 | #define REPLACE -6 |
| 17 | |
| 18 | static int show(int *v) |
| 19 | { |
| 20 | return v ? *v : MISSING; |
| 21 | } |
| 22 | |
| 23 | static void test_prio_queue(int *input, size_t input_size, |
| 24 | int *result, size_t result_size) |
| 25 | { |
| 26 | struct prio_queue pq = { intcmp }; |
| 27 | size_t j = 0; |
| 28 | |
| 29 | for (size_t i = 0; i < input_size; i++) { |
| 30 | void *peek, *get; |
| 31 | switch(input[i]) { |
| 32 | case GET: |
| 33 | peek = prio_queue_peek(&pq); |
| 34 | get = prio_queue_get(&pq); |
| 35 | cl_assert(peek == get); |
| 36 | cl_assert(j < result_size); |
| 37 | cl_assert_equal_i(result[j], show(get)); |
| 38 | j++; |
| 39 | break; |
| 40 | case DUMP: |
| 41 | while ((peek = prio_queue_peek(&pq))) { |
| 42 | get = prio_queue_get(&pq); |
| 43 | cl_assert(peek == get); |
| 44 | cl_assert(j < result_size); |
| 45 | cl_assert_equal_i(result[j], show(get)); |
| 46 | j++; |
| 47 | } |
| 48 | break; |
| 49 | case STACK: |
| 50 | pq.compare = NULL; |
| 51 | break; |
| 52 | case REVERSE: |
| 53 | prio_queue_reverse(&pq); |
| 54 | break; |
| 55 | case REPLACE: |
| 56 | peek = prio_queue_peek(&pq); |
| 57 | cl_assert(i + 1 < input_size); |
| 58 | cl_assert(input[i + 1] >= 0); |
| 59 | cl_assert(j < result_size); |
| 60 | cl_assert_equal_i(result[j], show(peek)); |
| 61 | j++; |
| 62 | prio_queue_replace(&pq, &input[++i]); |
| 63 | break; |
| 64 | default: |
| 65 | prio_queue_put(&pq, &input[i]); |
| 66 | break; |
| 67 | } |
| 68 | } |
| 69 | cl_assert_equal_i(j, result_size); |
| 70 | clear_prio_queue(&pq); |
| 71 | } |
| 72 | |
| 73 | #define TEST_INPUT(input, result) \ |
| 74 | test_prio_queue(input, ARRAY_SIZE(input), result, ARRAY_SIZE(result)) |
| 75 | |
| 76 | void test_prio_queue__basic(void) |
| 77 | { |
| 78 | TEST_INPUT(((int []){ 2, 6, 3, 10, 9, 5, 7, 4, 5, 8, 1, DUMP }), |
| 79 | ((int []){ 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10 })); |
| 80 | } |
| 81 | |
| 82 | void test_prio_queue__mixed(void) |
| 83 | { |
| 84 | TEST_INPUT(((int []){ 6, 2, 4, GET, 5, 3, GET, GET, 1, DUMP }), |
| 85 | ((int []){ 2, 3, 4, 1, 5, 6 })); |
| 86 | } |
| 87 | |
| 88 | void test_prio_queue__empty(void) |
| 89 | { |
| 90 | TEST_INPUT(((int []){ 1, 2, GET, GET, GET, 1, 2, GET, GET, GET }), |
| 91 | ((int []){ 1, 2, MISSING, 1, 2, MISSING })); |
| 92 | } |
| 93 | |
| 94 | void test_prio_queue__replace(void) |
| 95 | { |
| 96 | TEST_INPUT(((int []){ REPLACE, 6, 2, 4, REPLACE, 5, 7, GET, |
| 97 | REPLACE, 1, DUMP }), |
| 98 | ((int []){ MISSING, 2, 4, 5, 1, 6, 7 })); |
| 99 | } |
| 100 | |
| 101 | void test_prio_queue__stack(void) |
| 102 | { |
| 103 | TEST_INPUT(((int []){ STACK, 8, 1, 5, 4, 6, 2, 3, DUMP }), |
| 104 | ((int []){ 3, 2, 6, 4, 5, 1, 8 })); |
| 105 | } |
| 106 | |
| 107 | void test_prio_queue__reverse_stack(void) |
| 108 | { |
| 109 | TEST_INPUT(((int []){ STACK, 1, 2, 3, 4, 5, 6, REVERSE, DUMP }), |
| 110 | ((int []){ 1, 2, 3, 4, 5, 6 })); |
| 111 | } |
| 112 | |
| 113 | void test_prio_queue__replace_stack(void) |
| 114 | { |
| 115 | TEST_INPUT(((int []){ STACK, 8, 1, 5, REPLACE, 4, 6, 2, 3, DUMP }), |
| 116 | ((int []){ 5, 3, 2, 6, 4, 1, 8 })); |
| 117 | } |