ArrayListTests.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #include "../Tests.hpp"
  2. #include "core/ArrayList.hpp"
  3. #include "core/Test.hpp"
  4. template class Core::ArrayList<size_t, 20>;
  5. using IntList = Core::ArrayList<size_t, 20>;
  6. static void testAdd() {
  7. IntList list;
  8. list.add(5u);
  9. TEST(5, list[0]);
  10. TEST(5, list.getLast());
  11. const IntList& cList = list;
  12. TEST(5, cList.getLast());
  13. TEST(1, list.getLength());
  14. }
  15. static void testMultipleAdd() {
  16. IntList list;
  17. list.add(4u).add(3u).add(2u);
  18. TEST(4, list[0]);
  19. TEST(3, list[1]);
  20. TEST(2, list[2]);
  21. TEST(3, list.getLength());
  22. }
  23. static void testAddReplace() {
  24. IntList list;
  25. list.add(5u);
  26. list[0] = 3;
  27. TEST(3, list[0]);
  28. }
  29. static void testClear() {
  30. IntList list;
  31. list.add(5u).add(4u);
  32. list.clear();
  33. TEST(0, list.getLength());
  34. }
  35. static void testOverflow(bool light) {
  36. IntList list;
  37. for(size_t i = 0; i < 20; i++) {
  38. list.add(i);
  39. }
  40. size_t limit = light ? 1000 : 100'000;
  41. for(size_t i = 0; i < limit; i++) {
  42. list.add(i);
  43. }
  44. for(size_t i = 0; i < list.getLength(); i++) {
  45. TEST(i, list[i]);
  46. }
  47. }
  48. static void testCopy() {
  49. IntList list;
  50. list.add(1u).add(2u).add(3u);
  51. IntList copy(list);
  52. TEST(list.getLength(), copy.getLength());
  53. for(size_t i = 0; i < copy.getLength() && i < list.getLength(); i++) {
  54. TEST(list[i], copy[i]);
  55. }
  56. }
  57. static void testCopyAssignment() {
  58. IntList list;
  59. list.add(1u).add(2u).add(3u);
  60. IntList copy;
  61. copy = list;
  62. TEST(list.getLength(), copy.getLength());
  63. for(size_t i = 0; i < copy.getLength() && i < list.getLength(); i++) {
  64. TEST(list[i], copy[i]);
  65. }
  66. }
  67. static void testMove() {
  68. IntList list;
  69. list.add(1u).add(2u).add(3u);
  70. IntList move(Core::move(list));
  71. TEST(0, list.getLength());
  72. TEST(3, move.getLength());
  73. TEST(1, move[0]);
  74. TEST(2, move[1]);
  75. TEST(3, move[2]);
  76. }
  77. static void testMoveAssignment() {
  78. IntList list;
  79. list.add(1u).add(2u).add(3u);
  80. IntList move;
  81. move = Core::move(list);
  82. TEST(0, list.getLength());
  83. TEST(3, move.getLength());
  84. TEST(1, move[0]);
  85. TEST(2, move[1]);
  86. TEST(3, move[2]);
  87. }
  88. static void testToString() {
  89. IntList list;
  90. list.add(1u).add(243u).add(423u);
  91. TEST_STRING("[1, 243, 423]", list);
  92. TEST_STRING("[1]", IntList().add(1u));
  93. TEST_STRING("[]", IntList());
  94. }
  95. static void testRemoveBySwap() {
  96. IntList list;
  97. list.add(4u).add(3u).add(2u);
  98. list.removeBySwap(0);
  99. TEST(2, list[0]);
  100. TEST(3, list[1]);
  101. TEST(2, list.getLength());
  102. list.removeBySwap(1);
  103. TEST(2, list[0]);
  104. TEST(1, list.getLength());
  105. list.removeBySwap(0);
  106. TEST(0, list.getLength());
  107. }
  108. static void testRemove() {
  109. IntList list;
  110. list.add(4u).add(3u).add(2u);
  111. list.remove(0);
  112. TEST(3, list[0]);
  113. TEST(2, list[1]);
  114. TEST(2, list.getLength());
  115. list.remove(1);
  116. TEST(3, list[0]);
  117. TEST(1, list.getLength());
  118. list.removeLast();
  119. TEST(0, list.getLength());
  120. }
  121. static void testForRange() {
  122. IntList list;
  123. list.add(1u).add(2u).add(3u);
  124. for(size_t& i : list) {
  125. i++;
  126. }
  127. for(size_t i = 0; i < list.getLength(); i++) {
  128. TEST(i + 2, list[i]);
  129. }
  130. }
  131. static int arrayListInstances = 0;
  132. struct ArrayListTest final {
  133. int value;
  134. ArrayListTest(int i) : value(i) {
  135. arrayListInstances++;
  136. }
  137. ArrayListTest(const ArrayListTest& o) = delete;
  138. ArrayListTest(ArrayListTest&& o) noexcept : value(o.value) {
  139. arrayListInstances++;
  140. }
  141. ~ArrayListTest() {
  142. arrayListInstances--;
  143. }
  144. ArrayListTest& operator=(ArrayListTest&& o) noexcept {
  145. value = o.value;
  146. return *this;
  147. }
  148. ArrayListTest& operator=(const ArrayListTest& o) = delete;
  149. };
  150. static void testInsert() {
  151. Core::ArrayList<ArrayListTest, 5> l;
  152. l.addAt(0, 1);
  153. TEST(1, l.getLength());
  154. TEST(1, l[0].value);
  155. TEST(1, arrayListInstances);
  156. l.addAt(0, 2);
  157. TEST(2, l.getLength());
  158. TEST(2, l[0].value);
  159. TEST(1, l[1].value);
  160. TEST(2, arrayListInstances);
  161. l.addAt(0, 3);
  162. TEST(3, l.getLength());
  163. TEST(3, l[0].value);
  164. TEST(2, l[1].value);
  165. TEST(1, l[2].value);
  166. TEST(3, arrayListInstances);
  167. l.addAt(1, 4);
  168. TEST(4, l.getLength());
  169. TEST(3, l[0].value);
  170. TEST(4, l[1].value);
  171. TEST(2, l[2].value);
  172. TEST(1, l[3].value);
  173. TEST(4, arrayListInstances);
  174. l.addAt(2, 5);
  175. TEST(5, l.getLength());
  176. TEST(3, l[0].value);
  177. TEST(4, l[1].value);
  178. TEST(5, l[2].value);
  179. TEST(2, l[3].value);
  180. TEST(1, l[4].value);
  181. TEST(5, arrayListInstances);
  182. l.addAt(5, 4);
  183. TEST(5, l.getLength());
  184. TEST(3, l[0].value);
  185. TEST(4, l[1].value);
  186. TEST(5, l[2].value);
  187. TEST(2, l[3].value);
  188. TEST(1, l[4].value);
  189. TEST(5, arrayListInstances);
  190. l.clear();
  191. TEST(0, arrayListInstances);
  192. }
  193. void testArrayList(bool light) {
  194. testAdd();
  195. testMultipleAdd();
  196. testAddReplace();
  197. testClear();
  198. testOverflow(light);
  199. testCopy();
  200. testCopyAssignment();
  201. testMove();
  202. testMoveAssignment();
  203. testToString();
  204. testRemoveBySwap();
  205. testRemove();
  206. testForRange();
  207. testInsert();
  208. }