Commit f708624

mo khan <mo.khan@gmail.com>
2020-06-29 19:52:49
Add test to reproduce bug
1 parent b0cc0ea
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;
 }
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) {
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;
 }