Main.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include <iostream>
  2. #include <vector>
  3. #include "utils/HashMap.h"
  4. #include "utils/List.h"
  5. constexpr int MAP_MIN_CAPACITY = 5;
  6. typedef HashMap<int, int, MAP_MIN_CAPACITY> IntMap;
  7. typedef List<int, 20> IntList;
  8. const char* RED = "\033[0;31m";
  9. const char* GREEN = "\033[0;32m";
  10. int tests = 0;
  11. int successTests = 0;
  12. void finalizeTest() {
  13. std::cout << ((successTests == tests) ? GREEN : RED);
  14. std::cout << successTests << " / " << tests << " succeeded\n\n";
  15. tests = 0;
  16. successTests = 0;
  17. }
  18. template<typename T>
  19. void checkEqual(const T& wanted, const T& actual, const char* text) {
  20. if(wanted == actual) {
  21. tests++;
  22. successTests++;
  23. std::cout << GREEN << tests << ": " << text << "\n";
  24. } else {
  25. tests++;
  26. std::cout << RED << tests << ": " << text << " - ";
  27. std::cout << RED << "expected '" << wanted << "' got '" << actual << "'\n";
  28. }
  29. }
  30. namespace Map {
  31. void testAdd() {
  32. IntMap map;
  33. map.add(5, 4);
  34. checkEqual(true, map.contains(5), "map contains added value");
  35. checkEqual(true, map.search(5, -1) == 4, "map search finds added value");
  36. }
  37. void testMultipleAdd() {
  38. IntMap map;
  39. map.add(5, 4);
  40. map.add(10, 3);
  41. map.add(15, 2);
  42. checkEqual(true, map.contains(5), "map contains added value 1");
  43. checkEqual(true, map.contains(10), "map contains added value 2");
  44. checkEqual(true, map.contains(15), "map contains added value 3");
  45. checkEqual(true, map.search(5, -1) == 4, "map search finds added value 1");
  46. checkEqual(true, map.search(10, -1) == 3, "map search finds added value 2");
  47. checkEqual(true, map.search(15, -1) == 2, "map search finds added value 3");
  48. }
  49. void testAddReplace() {
  50. IntMap map;
  51. map.add(5, 4);
  52. map.add(5, 10);
  53. checkEqual(true, map.contains(5), "map contains replaced value");
  54. checkEqual(true, map.search(5, -1) == 10, "map search finds replaced value");
  55. }
  56. void testClear() {
  57. IntMap map;
  58. map.add(5, 4);
  59. map.add(4, 10);
  60. map.clear();
  61. checkEqual(false, map.contains(5), "map does not contain cleared values");
  62. checkEqual(false, map.contains(4), "map does not contain cleared values");
  63. }
  64. void testOverflow() {
  65. IntMap map;
  66. for(int i = 0; i < 1000000; i++) {
  67. map.add(i, i);
  68. }
  69. for(int i = 0; i < MAP_MIN_CAPACITY; i++) {
  70. checkEqual(true, map.contains(i), "map still contains values after overflow");
  71. }
  72. checkEqual(true, true, "map survives overflow");
  73. }
  74. void test() {
  75. testAdd();
  76. testMultipleAdd();
  77. testAddReplace();
  78. testClear();
  79. testOverflow();
  80. finalizeTest();
  81. }
  82. }
  83. namespace TestList {
  84. void testAdd() {
  85. IntList list;
  86. list.add(5);
  87. checkEqual(5, list[0], "list contains added value");
  88. checkEqual(1, list.getLength(), "list sizes is increased by add");
  89. }
  90. void testMultipleAdd() {
  91. IntList list;
  92. list.add(4);
  93. list.add(3);
  94. list.add(2);
  95. checkEqual(4, list[0], "list contains added value");
  96. checkEqual(3, list[1], "list contains added value");
  97. checkEqual(2, list[2], "list contains added value");
  98. checkEqual(3, list.getLength(), "list sizes is increased by add");
  99. }
  100. void testAddReplace() {
  101. IntList list;
  102. list.add(5);
  103. list[0] = 3;
  104. checkEqual(3, list[0], "list value is overwritten");
  105. }
  106. void testClear() {
  107. IntList list;
  108. list.add(5);
  109. list.add(4);
  110. list.clear();
  111. checkEqual(0, list.getLength(), "list length is 0 after clear");
  112. }
  113. void testOverflow() {
  114. IntList list;
  115. for(int i = 0; i < 1000000; i++) {
  116. list.add(i);
  117. }
  118. for(int i = 0; i < list.getLength(); i++) {
  119. checkEqual(i, list[i], "list still contains values after overflow");
  120. }
  121. checkEqual(true, true, "list survives overflow");
  122. }
  123. void testCopy() {
  124. IntList list;
  125. list.add(1);
  126. list.add(2);
  127. list.add(3);
  128. IntList copy(list);
  129. checkEqual(list.getLength(), copy.getLength(), "list copy has same length");
  130. for(int i = 0; i < copy.getLength() && i < list.getLength(); i++) {
  131. checkEqual(list[i], copy[i], "list copy has same values");
  132. }
  133. }
  134. void testCopyAssignment() {
  135. IntList list;
  136. list.add(1);
  137. list.add(2);
  138. list.add(3);
  139. IntList copy;
  140. copy = list;
  141. checkEqual(list.getLength(), copy.getLength(), "list copy assignment has same length");
  142. for(int i = 0; i < copy.getLength() && i < list.getLength(); i++) {
  143. checkEqual(list[i], copy[i], "list copy assignment has same values");
  144. }
  145. }
  146. void testMove() {
  147. IntList list;
  148. list.add(1);
  149. list.add(2);
  150. list.add(3);
  151. IntList move(std::move(list));
  152. checkEqual(0, list.getLength(), "moved list has length 0");
  153. checkEqual(3, move.getLength(), "moved list passes length");
  154. checkEqual(1, move[0], "moved list passes values");
  155. checkEqual(2, move[1], "moved list passes values");
  156. checkEqual(3, move[2], "moved list passes values");
  157. }
  158. void testMoveAssignment() {
  159. IntList list;
  160. list.add(1);
  161. list.add(2);
  162. list.add(3);
  163. IntList move(std::move(list));
  164. checkEqual(0, list.getLength(), "assignment moved list has length 0");
  165. checkEqual(3, move.getLength(), "assignment moved list passes length");
  166. checkEqual(1, move[0], "assignment moved list passes values");
  167. checkEqual(2, move[1], "assignment moved list passes values");
  168. checkEqual(3, move[2], "assignment moved list passes values");
  169. }
  170. void test() {
  171. testAdd();
  172. testMultipleAdd();
  173. testAddReplace();
  174. testClear();
  175. testOverflow();
  176. testCopy();
  177. testCopyAssignment();
  178. testMove();
  179. testMoveAssignment();
  180. finalizeTest();
  181. }
  182. }
  183. int main() {
  184. Map::test();
  185. TestList::test();
  186. return 0;
  187. }