master
  1#include "priority_queue.h"
  2#include <cgreen/cgreen.h>
  3#include <string.h>
  4
  5Describe(PriorityQueue);
  6BeforeEach(PriorityQueue) {}
  7AfterEach(PriorityQueue) {}
  8
  9Ensure(PriorityQueue, returns_size) {
 10  PriorityQueue *queue = initialize();
 11
 12  assert_that(size(queue), is_equal_to(0));
 13
 14  destroy(queue);
 15}
 16
 17Ensure(PriorityQueue, adds_a_node) {
 18  PriorityQueue *queue = initialize();
 19
 20  add(queue, 1, 0);
 21
 22  assert_that(size(queue), is_equal_to(1));
 23
 24  destroy(queue);
 25}
 26
 27Ensure(PriorityQueue, removes_the_node_with_the_lowest_priority) {
 28  PriorityQueue *queue = initialize();
 29
 30  add(queue, 3, 300);
 31  add(queue, 1, 100);
 32  add(queue, 2, 200);
 33
 34  assert_that(size(queue), is_equal_to(3));
 35  assert_that(delete_min(queue), is_equal_to(100));
 36  assert_that(queue->head->data, is_equal_to(200));
 37  assert_that(size(queue), is_equal_to(2));
 38
 39  destroy(queue);
 40};
 41
 42Ensure(PriorityQueue, when_removing_node_from_empty_queue) {
 43  PriorityQueue *queue = initialize();
 44
 45  assert_that(delete_min(queue), is_equal_to(NULL));
 46  assert_that(size(queue), is_equal_to(0));
 47
 48  destroy(queue);
 49}
 50
 51Ensure(PriorityQueue, when_removing_it_decreases_the_size) {
 52  PriorityQueue *queue = initialize();
 53
 54  add(queue, 1, 0);
 55  delete_min(queue);
 56
 57  assert_that(size(queue), is_equal_to(0));
 58
 59  destroy(queue);
 60}
 61
 62Ensure(PriorityQueue,
 63       when_removing_the_last_node_it_decrements_the_count_correctly) {
 64  PriorityQueue *queue = initialize();
 65
 66  add(queue, 2, 200);
 67  add(queue, 1, 100);
 68  add(queue, 3, 300);
 69
 70  delete_min(queue);
 71  delete_min(queue);
 72  delete_min(queue);
 73
 74  assert_that(size(queue), is_equal_to(0));
 75  destroy(queue);
 76}
 77
 78Ensure(PriorityQueue, when_adding_data_out_of_order) {
 79  PriorityQueue *queue = initialize();
 80
 81  add(queue, 7, 700);
 82  add(queue, 3, 300);
 83  add(queue, 0, 100);
 84  add(queue, 4, 400);
 85
 86  assert_that(size(queue), is_equal_to(4));
 87  assert_that(delete_min(queue), is_equal_to(100));
 88  assert_that(delete_min(queue), is_equal_to(300));
 89  assert_that(delete_min(queue), is_equal_to(400));
 90  assert_that(delete_min(queue), is_equal_to(700));
 91  assert_that(size(queue), is_equal_to(0));
 92
 93  destroy(queue);
 94}
 95
 96Ensure(
 97    PriorityQueue,
 98    when_adding_random_values_with_random_priority_it_returns_the_minimum_priority_value_correctly) {
 99  PriorityQueue *queue = initialize();
100  int n = 10;
101
102  for (int i = 0; i < n; i++)
103    add(queue, rand() % 10, rand() % 1000);
104
105  while (size(queue) > 0)
106    delete_min(queue);
107
108  assert_that(size(queue), is_equal_to(0));
109  destroy(queue);
110}
111
112TestSuite *priority_queue_tests() {
113  TestSuite *suite = create_test_suite();
114
115  add_test_with_context(suite, PriorityQueue, adds_a_node);
116  add_test_with_context(suite, PriorityQueue,
117                        removes_the_node_with_the_lowest_priority);
118  add_test_with_context(suite, PriorityQueue, returns_size);
119  add_test_with_context(suite, PriorityQueue, when_adding_data_out_of_order);
120  add_test_with_context(
121      suite, PriorityQueue,
122      when_adding_random_values_with_random_priority_it_returns_the_minimum_priority_value_correctly);
123  add_test_with_context(suite, PriorityQueue,
124                        when_removing_it_decreases_the_size);
125  add_test_with_context(suite, PriorityQueue,
126                        when_removing_node_from_empty_queue);
127  add_test_with_context(
128      suite, PriorityQueue,
129      when_removing_the_last_node_it_decrements_the_count_correctly);
130
131  return suite;
132}
133
134int main(int argc, char **argv) {
135  TestSuite *suite = create_test_suite();
136  add_suite(suite, priority_queue_tests());
137  return run_test_suite(suite, create_text_reporter());
138}