master
  1#include "btree.h"
  2#include <cgreen/cgreen.h>
  3#include <string.h>
  4
  5Describe(BinaryTree);
  6BeforeEach(BinaryTree) {}
  7AfterEach(BinaryTree) {}
  8
  9Ensure(BinaryTree, when_the_tree_is_NULL) {
 10  BTree *tree = btree_insert(NULL, 10);
 11
 12  assert_that(tree, is_not_equal_to(NULL));
 13  assert_that(tree->data, is_equal_to(10));
 14}
 15
 16Ensure(
 17    BinaryTree,
 18    when_inserting_an_item_less_than_the_root_in_a_tree_it_creates_a_node_on_the_left_side) {
 19  BTree *tree = btree_insert(NULL, 10);
 20  btree_insert(tree, -5);
 21
 22  assert_that(tree->left, is_not_equal_to(NULL));
 23  assert_that(tree->left->data, is_equal_to(-5));
 24}
 25
 26Ensure(
 27    BinaryTree,
 28    when_inserting_an_item_greater_than_the_root_in_a_tree_it_creates_a_node_on_the_right_side) {
 29  BTree *tree = btree_insert(NULL, 10);
 30
 31  btree_insert(tree, 16);
 32
 33  assert_that(tree->right, is_not_equal_to(NULL));
 34  assert_that(tree->right->data, is_equal_to(16));
 35}
 36
 37Ensure(
 38    BinaryTree,
 39    when_inserting_an_item_equal_to_the_root_in_a_tree_it_creates_a_node_on_the_left_side) {
 40  BTree *tree = btree_insert(NULL, 10);
 41
 42  btree_insert(tree, 10);
 43
 44  assert_that(tree->left, is_not_equal_to(NULL));
 45  assert_that(tree->left->data, is_equal_to(10));
 46}
 47
 48Ensure(
 49    BinaryTree,
 50    when_inserting_multiple_items_into_a_tree_it_inserts_in_the_correct_position) {
 51  BTree *tree = btree_insert(NULL, 10);
 52
 53  btree_insert(tree, -5);
 54  btree_insert(tree, 16);
 55
 56  assert_that(tree->data, is_equal_to(10));
 57  assert_that(tree->left->data, is_equal_to(-5));
 58  assert_that(tree->right->data, is_equal_to(16));
 59
 60  btree_insert(tree, -8);
 61
 62  assert_that(tree->left->left, is_not_equal_to(NULL));
 63  assert_that(tree->left->left->data, is_equal_to(-8));
 64
 65  btree_insert(tree, 7);
 66
 67  assert_that(tree->left->right, is_not_equal_to(NULL));
 68  assert_that(tree->left->right->data, is_equal_to(7));
 69
 70  btree_insert(tree, 18);
 71
 72  assert_that(tree->right->right, is_not_equal_to(NULL));
 73  assert_that(tree->right->right->data, is_equal_to(18));
 74
 75  btree_insert(tree, 6);
 76
 77  assert_that(tree->left->right->left, is_not_equal_to(NULL));
 78  assert_that(tree->left->right->left->data, is_equal_to(6));
 79}
 80
 81Ensure(BinaryTree, when_rebalancing_a_tree) {
 82  BTree *tree = btree_insert(NULL, 1);
 83  tree->right = btree_initialize(tree, 5);
 84  tree->right->left = btree_initialize(tree->right, 2);
 85  tree->right->left->right = btree_initialize(tree->right->left, 4);
 86
 87  tree = btree_rebalance(tree->right->left->right);
 88
 89  assert_that(tree, is_not_equal_to(NULL));
 90  assert_that(tree->data, is_equal_to(2));
 91
 92  assert_that(tree->left->data, is_equal_to(1));
 93  assert_that(tree->right->data, is_equal_to(4));
 94  assert_that(tree->right->right->data, is_equal_to(5));
 95}
 96
 97Ensure(
 98    BinaryTree,
 99    when_inserting_items_described_in_the_assignment_it_inserts_in_the_expected_position_in_the_tree) {
100  BTree *tree = btree_insert(NULL, 1);
101  tree = btree_insert(tree, 5);
102  tree = btree_insert(tree, 2);
103  tree = btree_insert(tree, 4);
104  tree = btree_insert(tree, 3);
105
106  assert_that(tree, is_not_equal_to(NULL));
107  assert_that(tree->data, is_equal_to(2));
108  assert_that(tree->left->data, is_equal_to(1));
109  assert_that(tree->right->data, is_equal_to(4));
110  assert_that(tree->right->right->data, is_equal_to(5));
111}
112
113Ensure(BinaryTree, when_calculating_the_size_of_the_tree) {
114  BTree *tree = btree_insert(NULL, 1);
115  tree = btree_insert(tree, 5);
116  tree = btree_insert(tree, 2);
117  tree = btree_insert(tree, 4);
118  tree = btree_insert(tree, 3);
119
120  assert_that(btree_size(tree), is_equal_to(5));
121}
122
123TestSuite *binary_search_tree_tests() {
124  TestSuite *suite = create_test_suite();
125
126  add_test_with_context(suite, BinaryTree, when_the_tree_is_NULL);
127  add_test_with_context(
128      suite, BinaryTree,
129      when_inserting_an_item_less_than_the_root_in_a_tree_it_creates_a_node_on_the_left_side);
130  add_test_with_context(
131      suite, BinaryTree,
132      when_inserting_an_item_greater_than_the_root_in_a_tree_it_creates_a_node_on_the_right_side);
133  add_test_with_context(
134      suite, BinaryTree,
135      when_inserting_an_item_equal_to_the_root_in_a_tree_it_creates_a_node_on_the_left_side);
136  add_test_with_context(
137      suite, BinaryTree,
138      when_inserting_multiple_items_into_a_tree_it_inserts_in_the_correct_position);
139  add_test_with_context(suite, BinaryTree, when_rebalancing_a_tree);
140  add_test_with_context(
141      suite, BinaryTree,
142      when_inserting_items_described_in_the_assignment_it_inserts_in_the_expected_position_in_the_tree);
143
144  add_test_with_context(suite, BinaryTree,
145                        when_calculating_the_size_of_the_tree);
146  return suite;
147}
148
149int main(int argc, char **argv) {
150  TestSuite *suite = create_test_suite();
151  add_suite(suite, binary_search_tree_tests());
152  return run_test_suite(suite, create_text_reporter());
153}