LinkedListTests.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #include "tests/LinkedListTests.h"
  2. #include "data/LinkedList.h"
  3. #include "test/Test.h"
  4. struct LinkedListTester {
  5. int a;
  6. LinkedListTester(int a_) : a(a_) {
  7. }
  8. LinkedListTester(const LinkedListTester&) = delete;
  9. LinkedListTester(LinkedListTester&&) = delete;
  10. LinkedListTester& operator=(const LinkedListTester&) = delete;
  11. LinkedListTester& operator=(LinkedListTester&&) = delete;
  12. };
  13. using IntList = Core::LinkedList<int>;
  14. static void testWithoutCopyOrMove(Core::Test& test) {
  15. Core::LinkedList<LinkedListTester> list;
  16. test.checkFalse(list.add(3) == nullptr, "without copy or move");
  17. }
  18. static void testAdd(Core::Test& test) {
  19. IntList list;
  20. test.checkFalse(list.add(5) == nullptr, "add works 1");
  21. auto iter = list.begin();
  22. test.checkEqual(5, *iter, "contains added value");
  23. test.checkEqual(1, list.getLength(), "sizes is increased by add");
  24. }
  25. static void testMultipleAdd(Core::Test& test) {
  26. IntList list;
  27. test.checkFalse(list.add(4) == nullptr, "add works 2");
  28. test.checkFalse(list.add(3) == nullptr, "add works 3");
  29. test.checkFalse(list.add(2) == nullptr, "add works 4");
  30. auto iter = list.begin();
  31. test.checkEqual(4, *iter, "contains added value 1");
  32. test.checkEqual(3, *(++iter), "contains added value 2");
  33. test.checkEqual(2, *(++iter), "contains added value 3");
  34. test.checkEqual(3, list.getLength(), "sizes is increased by add");
  35. }
  36. static void testClear(Core::Test& test) {
  37. IntList list;
  38. test.checkFalse(list.add(5) == nullptr, "add works 6");
  39. test.checkFalse(list.add(4) == nullptr, "add works 7");
  40. list.clear();
  41. test.checkEqual(0, list.getLength(), "length is 0 after clear");
  42. test.checkFalse(list.begin() != list.end(),
  43. "iterator is at end after clear");
  44. }
  45. static void testBigAdd(Core::Test& test) {
  46. IntList list;
  47. for(int i = 0; i < 1000000; i++) {
  48. test.checkFalse(list.add(i) == nullptr, "add works in big add");
  49. }
  50. auto iter = list.begin();
  51. for(int i = 0; i < list.getLength(); i++) {
  52. test.checkEqual(i, *iter, "big add");
  53. ++iter;
  54. }
  55. test.checkEqual(1000000, list.getLength(), "big add length");
  56. }
  57. static void testCopy(Core::Test& test) {
  58. IntList list;
  59. test.checkFalse(list.add(1) == nullptr, "add works 11");
  60. test.checkFalse(list.add(2) == nullptr, "add works 12");
  61. test.checkFalse(list.add(3) == nullptr, "add works 13");
  62. IntList copy;
  63. test.checkFalse(copy.copyFrom(list), "copy works 1");
  64. test.checkEqual(list.getLength(), copy.getLength(), "copy has same length");
  65. auto iterA = list.begin();
  66. auto iterB = copy.begin();
  67. for(int i = 0; i < copy.getLength() && i < list.getLength(); i++) {
  68. test.checkEqual(*iterA, *iterB, "copy has same values");
  69. ++iterA;
  70. ++iterB;
  71. }
  72. }
  73. static void testMove(Core::Test& test) {
  74. IntList list;
  75. test.checkFalse(list.add(1) == nullptr, "add works 14");
  76. test.checkFalse(list.add(2) == nullptr, "add works 15");
  77. test.checkFalse(list.add(3) == nullptr, "add works 16");
  78. const IntList move(Core::move(list));
  79. test.checkEqual(0, list.getLength(), "moved has length 0");
  80. test.checkEqual(3, move.getLength(), "moved passes length");
  81. auto iter = move.begin();
  82. test.checkEqual(1, *iter, "moved passes values");
  83. test.checkEqual(2, *(++iter), "moved passes values");
  84. test.checkEqual(3, *(++iter), "moved passes values");
  85. }
  86. static void testMoveAssignment(Core::Test& test) {
  87. IntList list;
  88. test.checkFalse(list.add(1) == nullptr, "add works 17");
  89. test.checkFalse(list.add(2) == nullptr, "add works 18");
  90. test.checkFalse(list.add(3) == nullptr, "add works 19");
  91. IntList move;
  92. move = Core::move(list);
  93. test.checkEqual(0, list.getLength(), "assignment moved has length 0");
  94. test.checkEqual(3, move.getLength(), "assignment moved passes length");
  95. auto iter = move.begin();
  96. test.checkEqual(1, *iter, "assignment moved passes values");
  97. test.checkEqual(2, *(++iter), "assignment moved passes values");
  98. test.checkEqual(3, *(++iter), "assignment moved passes values");
  99. }
  100. static void testToString1(Core::Test& test) {
  101. IntList list;
  102. test.checkFalse(list.add(1) == nullptr, "add works 20");
  103. test.checkFalse(list.add(243) == nullptr, "add works 21");
  104. test.checkFalse(list.add(-423) == nullptr, "add works 22");
  105. test.checkEqual(Core::String("[1, 243, -423]"), Core::String(list),
  106. "to string 1");
  107. }
  108. static void testToString2(Core::Test& test) {
  109. IntList list;
  110. test.checkFalse(list.add(1) == nullptr, "add works 23");
  111. test.checkEqual(Core::String("[1]"), Core::String(list), "to string 2");
  112. }
  113. static void testToString3(Core::Test& test) {
  114. IntList list;
  115. test.checkEqual(Core::String("[]"), Core::String(list), "to string 3");
  116. }
  117. static void testRemove(Core::Test& test) {
  118. IntList list;
  119. IntList::Node* a = list.add(4);
  120. IntList::Node* b = list.add(3);
  121. IntList::Node* c = list.add(2);
  122. IntList::Node* d = list.add(1);
  123. test.checkFalse(a == nullptr, "add works 24");
  124. test.checkFalse(b == nullptr, "add works 25");
  125. test.checkFalse(c == nullptr, "add works 26");
  126. test.checkFalse(c == nullptr, "add works 27");
  127. list.remove(b);
  128. auto iter = list.begin();
  129. test.checkEqual(4, *iter, "value after remove 1");
  130. test.checkEqual(2, *(++iter), "value after remove 2");
  131. test.checkEqual(1, *(++iter), "value after remove 3");
  132. test.checkEqual(3, list.getLength(), "size after remove 1");
  133. list.remove(a);
  134. iter = list.begin();
  135. test.checkEqual(2, *iter, "value after remove 4");
  136. test.checkEqual(1, *(++iter), "value after remove 5");
  137. test.checkEqual(2, list.getLength(), "size after remove 2");
  138. list.remove(d);
  139. iter = list.begin();
  140. test.checkEqual(2, *iter, "value after remove 6");
  141. test.checkEqual(1, list.getLength(), "size after remove 3");
  142. list.remove(c);
  143. test.checkFalse(list.begin() != list.end(), "empty iterator after remove");
  144. test.checkEqual(0, list.getLength(), "size after remove 4");
  145. test.checkTrue(a == nullptr, "nodes are null after remove 1");
  146. test.checkTrue(b == nullptr, "nodes are null after remove 2");
  147. test.checkTrue(c == nullptr, "nodes are null after remove 3");
  148. test.checkTrue(c == nullptr, "nodes are null after remove 4");
  149. }
  150. static void testRemoveFirst(Core::Test& test) {
  151. IntList list;
  152. test.checkFalse(list.add(4) == nullptr, "add works 28");
  153. test.checkFalse(list.add(3) == nullptr, "add works 29");
  154. test.checkFalse(list.add(2) == nullptr, "add works 30");
  155. test.checkFalse(list.add(1) == nullptr, "add works 31");
  156. list.removeFirst();
  157. auto iter = list.begin();
  158. test.checkEqual(3, *iter, "value after remove first 1");
  159. test.checkEqual(2, *(++iter), "value after remove first 2");
  160. test.checkEqual(1, *(++iter), "value after remove first 3");
  161. test.checkEqual(3, list.getLength(), "size after remove first 1");
  162. list.removeFirst();
  163. iter = list.begin();
  164. test.checkEqual(2, *iter, "value after remove first 4");
  165. test.checkEqual(1, *(++iter), "value after remove first 5");
  166. test.checkEqual(2, list.getLength(), "size after remove first 2");
  167. list.removeFirst();
  168. iter = list.begin();
  169. test.checkEqual(1, *iter, "value after remove first 6");
  170. test.checkEqual(1, list.getLength(), "size after remove first 3");
  171. list.removeFirst();
  172. test.checkFalse(list.begin() != list.end(),
  173. "empty iterator after remove first");
  174. test.checkEqual(0, list.getLength(), "size after remove first 4");
  175. list.removeFirst();
  176. test.checkFalse(list.begin() != list.end(),
  177. "empty iterator after remove first");
  178. test.checkEqual(0, list.getLength(), "size after remove first 5");
  179. }
  180. static void testRemoveLast(Core::Test& test) {
  181. IntList list;
  182. test.checkFalse(list.add(4) == nullptr, "add works 32");
  183. test.checkFalse(list.add(3) == nullptr, "add works 33");
  184. test.checkFalse(list.add(2) == nullptr, "add works 34");
  185. test.checkFalse(list.add(1) == nullptr, "add works 35");
  186. list.removeLast();
  187. auto iter = list.begin();
  188. test.checkEqual(4, *iter, "value after remove last 1");
  189. test.checkEqual(3, *(++iter), "value after remove last 2");
  190. test.checkEqual(2, *(++iter), "value after remove last 3");
  191. test.checkEqual(3, list.getLength(), "size after remove last 1");
  192. list.removeLast();
  193. iter = list.begin();
  194. test.checkEqual(4, *iter, "value after remove last 4");
  195. test.checkEqual(3, *(++iter), "value after remove last 5");
  196. test.checkEqual(2, list.getLength(), "size after remove last 2");
  197. list.removeLast();
  198. iter = list.begin();
  199. test.checkEqual(4, *iter, "value after remove last 6");
  200. test.checkEqual(1, list.getLength(), "size after remove last 3");
  201. list.removeLast();
  202. test.checkFalse(list.begin() != list.end(),
  203. "empty iterator after remove last");
  204. test.checkEqual(0, list.getLength(), "size after remove last 4");
  205. list.removeLast();
  206. test.checkFalse(list.begin() != list.end(),
  207. "empty iterator after remove last");
  208. test.checkEqual(0, list.getLength(), "size after remove 5");
  209. }
  210. void Core::LinkedListTests::test() {
  211. Core::Test test("LinkedList");
  212. testWithoutCopyOrMove(test);
  213. testAdd(test);
  214. testMultipleAdd(test);
  215. testClear(test);
  216. testBigAdd(test);
  217. testCopy(test);
  218. testMove(test);
  219. testMoveAssignment(test);
  220. testToString1(test);
  221. testToString2(test);
  222. testToString3(test);
  223. testRemove(test);
  224. testRemoveFirst(test);
  225. testRemoveLast(test);
  226. test.finalize();
  227. }