diff options
| author | mo khan <mo.khan@gmail.com> | 2020-06-29 13:52:49 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-06-29 13:52:49 -0600 |
| commit | f708624f4223bd6ac31883dd9990502226a06f26 (patch) | |
| tree | d6471a193377f0125303a2178ea9114ffa3d7c4e /src/01 | |
| parent | b0cc0eac66fce61a21cd0567e7721cc877e2599e (diff) | |
Add test to reproduce bug
Diffstat (limited to 'src/01')
| -rw-r--r-- | src/01/01a/main.c | 17 | ||||
| -rw-r--r-- | src/01/01a/priority_queue.c | 10 | ||||
| -rw-r--r-- | src/01/01a/priority_queue_test.c | 39 |
3 files changed, 63 insertions, 3 deletions
diff --git a/src/01/01a/main.c b/src/01/01a/main.c index 9f50782..0d9ec46 100644 --- a/src/01/01a/main.c +++ b/src/01/01a/main.c @@ -4,5 +4,22 @@ int main(int argc, char *argv[]) { printf("hello world\n"); + + PriorityQueue *queue = initialize(); + + add(queue, create_node(2, 200)); + add(queue, create_node(1, 100)); + add(queue, create_node(3, 300)); + + printf("%d\n", size(queue)); + + while (size(queue) > 0) { + Node *tmp = delete_min(queue); + if (tmp) + printf("%d\n", tmp->data); + else + printf("%d\n", size(queue)); + } + printf("Bye\n"); return 0; } diff --git a/src/01/01a/priority_queue.c b/src/01/01a/priority_queue.c index 2d0670d..cf59302 100644 --- a/src/01/01a/priority_queue.c +++ b/src/01/01a/priority_queue.c @@ -49,9 +49,13 @@ void add(PriorityQueue *queue, Node *node) { // This function is constant time O(1) Node *delete_min(PriorityQueue *queue) { - Node *tmp = queue->head; - queue->head = tmp->next; - return tmp; + if (queue->head) { + Node *tmp = queue->head; + queue->head = tmp->next; + queue->size--; + return tmp; + } + return NULL; } void destroy(PriorityQueue *queue) { diff --git a/src/01/01a/priority_queue_test.c b/src/01/01a/priority_queue_test.c index f443142..d9abfd7 100644 --- a/src/01/01a/priority_queue_test.c +++ b/src/01/01a/priority_queue_test.c @@ -57,16 +57,55 @@ Ensure(PriorityQueue, removes_the_node_with_the_lowest_priority){ assert_that(size(queue), is_equal_to(3)); assert_that(delete_min(queue), is_equal_to(min)); assert_that(queue->head, is_equal_to(mid)); + assert_that(size(queue), is_equal_to(2)); destroy(queue); }; +Ensure(PriorityQueue, when_removing_node_from_empty_queue) { + PriorityQueue *queue = initialize(); + + assert_that(delete_min(queue), is_equal_to(NULL)); + assert_that(size(queue), is_equal_to(0)); + + destroy(queue); +} + +Ensure(PriorityQueue, when_removing_it_decreases_the_size) { + PriorityQueue *queue = initialize(); + + add(queue, create_node(1, 0)); + delete_min(queue); + + assert_that(size(queue), is_equal_to(0)); + + destroy(queue); +} + +Ensure(PriorityQueue, when_removing_the_last_node_it_decrements_the_count_correctly) { + PriorityQueue *queue = initialize(); + + add(queue, create_node(2, 200)); + add(queue, create_node(1, 100)); + add(queue, create_node(3, 300)); + + delete_min(queue); + delete_min(queue); + delete_min(queue); + + assert_that(size(queue), is_equal_to(0)); + destroy(queue); +} + TestSuite *priority_queue_tests() { TestSuite *suite = create_test_suite(); add_test_with_context(suite, PriorityQueue, returns_size); add_test_with_context(suite, PriorityQueue, adds_a_node); add_test_with_context(suite, PriorityQueue, removes_the_node_with_the_lowest_priority); + add_test_with_context(suite, PriorityQueue, when_removing_node_from_empty_queue); + add_test_with_context(suite, PriorityQueue, when_removing_it_decreases_the_size); + add_test_with_context(suite, PriorityQueue, when_removing_the_last_node_it_decrements_the_count_correctly); return suite; } |
