bucket_hash_set.t.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. //
  2. // bucket_hash_set.t.h
  3. // bucket_hash_map
  4. //
  5. // Created by Sam Jaffe on 2/17/17.
  6. //
  7. #pragma once
  8. #include <cxxtest/TestSuite.h>
  9. #include "bucket_hash_set.hpp"
  10. class bucket_hash_set_TestSuite : public CxxTest::TestSuite {
  11. public:
  12. using hashset = bucket_hash_set<int>;
  13. public:
  14. // Construction Postconditions
  15. void test_default_is_empty() {
  16. TS_ASSERT( hashset{}.empty() );
  17. }
  18. void test_construct_from_initializer_list() {
  19. hashset hm{0, 1, 2};
  20. TS_ASSERT_EQUALS(hm.size(), 3);
  21. }
  22. void test_swap_hashsets() {
  23. hashset hm1{};
  24. hashset hm2{0, 1, 2};
  25. swap(hm1, hm2);
  26. TS_ASSERT(hm2.empty());
  27. TS_ASSERT_EQUALS(hm1.size(), 3);
  28. }
  29. // Insertion Behaviors
  30. void test_insert_elements_effects_size() {
  31. hashset hm{};
  32. TS_ASSERT_THROWS_NOTHING( hm.insert(0) );
  33. TS_ASSERT_EQUALS(hm.size(), 1);
  34. }
  35. void test_insert_element_return_true() {
  36. hashset hm{};
  37. TS_ASSERT( hm.insert(0).second );
  38. }
  39. void test_insert_element_return_iterator_to_elements() {
  40. hashset hm{};
  41. auto it = hm.insert(0).first;
  42. TS_ASSERT_EQUALS( *it, 0 );
  43. }
  44. void test_insert_same_element_does_not_create_duplicate() {
  45. hashset hm{};
  46. hm.insert(0);
  47. TS_ASSERT_THROWS_NOTHING( hm.insert(0) );
  48. TS_ASSERT_EQUALS(hm.size(), 1);
  49. }
  50. void test_insert_same_element_returns_false() {
  51. hashset hm{};
  52. hm.insert(0);
  53. TS_ASSERT( !hm.insert(0).second );
  54. }
  55. void test_insert_same_element_return_same_iterator() {
  56. hashset hm{};
  57. auto it = hm.insert(0).first;
  58. TS_ASSERT_EQUALS(hm.insert(0).first, it);
  59. }
  60. void test_can_insert_range() {
  61. hashset hm{};
  62. TS_ASSERT_THROWS_NOTHING(hm.insert({0, 0, 1}));
  63. }
  64. // Find/Access Behaviors
  65. void test_can_find_element_in_map() {
  66. hashset hm{};
  67. hm.insert(0);
  68. TS_ASSERT_DIFFERS(hm.find(0), hm.end());
  69. }
  70. void test_count_element_in_map() {
  71. hashset hm{};
  72. hm.insert(0);
  73. TS_ASSERT_EQUALS(hm.count(0), 1);
  74. }
  75. void test_count_element_not_in_map() {
  76. hashset hm{};
  77. hm.insert(0);
  78. TS_ASSERT_EQUALS(hm.count(1), 0);
  79. }
  80. void test_equal_range_contains_element_if_present() {
  81. hashset hm{};
  82. hm.insert(0);
  83. auto p = hm.equal_range(0);
  84. TS_ASSERT_DIFFERS(p.first, p.second);
  85. TS_ASSERT_EQUALS(std::distance(p.first, p.second), 1);
  86. }
  87. void test_equal_range_contains_end_if_absent() {
  88. hashset hm{};
  89. hm.insert(0);
  90. auto p = hm.equal_range(1);
  91. TS_ASSERT_EQUALS(p.first, p.second);
  92. TS_ASSERT_EQUALS(p.first, hm.end());
  93. }
  94. void test_found_element_is_as_expected() {
  95. hashset hm{};
  96. hm.insert(0);
  97. TS_ASSERT_EQUALS(*hm.find(0), 0);
  98. }
  99. void test_cannot_find_fake_element() {
  100. hashset hm{};
  101. hm.insert(0);
  102. TS_ASSERT_EQUALS(hm.find(1), hm.end());
  103. }
  104. // Iteration Behaviors
  105. void test_iterator_advance_different() {
  106. hashset hm{};
  107. hm.insert(0);
  108. hm.insert(1);
  109. auto it = hm.begin();
  110. auto it2 = ++hm.begin();
  111. TS_ASSERT_DIFFERS(*it, *it2);
  112. }
  113. void test_iterator_begin_is_end_if_empty() { // Test case in join iterator for empty first element
  114. hashset hm{};
  115. TS_ASSERT_EQUALS(hm.begin(), hm.end());
  116. }
  117. void test_iterator_reaches_end() {
  118. hashset hm{};
  119. hm.insert(0);
  120. TS_ASSERT_EQUALS(++hm.begin(), hm.end());
  121. }
  122. // Erase Behaviors
  123. void test_erasing_element_reduces_size() {
  124. hashset hm{};
  125. hm.insert(0);
  126. TS_ASSERT_THROWS_NOTHING( hm.erase(hm.find(0)) );
  127. TS_ASSERT_EQUALS(hm.size(), 0);
  128. }
  129. void test_erase_end_is_fine() {
  130. hashset hm{};
  131. TS_ASSERT_THROWS_NOTHING(hm.erase(hm.end()));
  132. hm.insert(0);
  133. TS_ASSERT_THROWS_NOTHING(hm.erase(hm.end()));
  134. }
  135. void test_erase_end_does_not_effect_size() {
  136. hashset hm{};
  137. hm.insert(0);
  138. hm.erase(hm.end());
  139. TS_ASSERT_EQUALS(hm.size(), 1);
  140. }
  141. void test_erase_end_returns_end() {
  142. hashset hm{};
  143. TS_ASSERT_EQUALS(hm.erase(hm.end()), hm.end());
  144. }
  145. void test_erase_key_missing_key_no_result() {
  146. hashset hm{};
  147. TS_ASSERT_EQUALS(hm.erase(0), 0);
  148. }
  149. void test_erase_key_incorrect_key_no_result() {
  150. hashset hm{};
  151. hm.insert(0);
  152. TS_ASSERT_EQUALS(hm.erase(1), 0);
  153. }
  154. void test_erase_key_correct_key_one() {
  155. hashset hm{};
  156. hm.insert(0);
  157. TS_ASSERT_EQUALS(hm.erase(0), 1);
  158. }
  159. void test_erase_range() {
  160. hashset hm{0, 1, 2};
  161. auto it = hm.begin();
  162. auto it2 = it;
  163. std::advance(it2, 2);
  164. TS_ASSERT_THROWS_NOTHING(hm.erase(it, it2));
  165. TS_ASSERT_EQUALS(hm.size(), 1);
  166. }
  167. void test_clear() {
  168. hashset hm{0, 1, 2};
  169. TS_ASSERT_THROWS_NOTHING(hm.clear());
  170. TS_ASSERT(hm.empty());
  171. }
  172. void test_resize_not_destructive() {
  173. hashset hm{0, 1, 2, 3, 4, 5};
  174. hashset const copy{hm};
  175. hm.reserve(6);
  176. TS_ASSERT_EQUALS(hm, copy);
  177. }
  178. };