ListTests.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. module Tests;
  2. import Core.List;
  3. import Core.Test;
  4. import Core.Types;
  5. import Core.Math;
  6. import Core.Meta;
  7. template class Core::List<size_t>;
  8. using IntList = Core::List<size_t>;
  9. static void testAdd() {
  10. IntList list;
  11. list.add(5u);
  12. const IntList& cList = list;
  13. Core::test(5, list[0]);
  14. Core::test(5, list.getLast());
  15. Core::test(5, cList[0]);
  16. Core::test(5, cList.getLast());
  17. Core::test(1, list.getLength());
  18. }
  19. static void testMultipleAdd() {
  20. IntList list;
  21. list.add(4u).add(3u).add(2u);
  22. Core::test(4, list[0]);
  23. Core::test(3, list[1]);
  24. Core::test(2, list[2]);
  25. Core::test(3, list.getLength());
  26. }
  27. static void testAddReplace() {
  28. IntList list;
  29. list.add(5u);
  30. list[0] = 3;
  31. Core::test(3, list[0]);
  32. }
  33. static void testClear() {
  34. IntList list;
  35. list.add(5u).add(4u);
  36. list.clear();
  37. Core::test(0, list.getLength());
  38. }
  39. static void testShrink() {
  40. IntList list;
  41. list.add(5u).add(4u).add(3u);
  42. Core::testTrue(list.getCapacity() >= 3);
  43. list.shrink();
  44. Core::testTrue(list.getLength() == 3);
  45. Core::testTrue(list.getCapacity() == 3);
  46. Core::test(5, list[0]);
  47. Core::test(4, list[1]);
  48. Core::test(3, list[2]);
  49. }
  50. static void testBigAdd(bool light) {
  51. size_t limit = light ? 10'000 : 100'000;
  52. IntList list;
  53. for(size_t i = 0; i < limit; i++) {
  54. list.add(i);
  55. }
  56. for(size_t i = 0; i < list.getLength(); i++) {
  57. Core::test(i, list[i]);
  58. }
  59. Core::test(limit, list.getLength());
  60. }
  61. static void testCopy() {
  62. IntList list;
  63. list.add(1u).add(2u).add(3u);
  64. IntList copy = list;
  65. Core::test(list.getLength(), copy.getLength());
  66. size_t limit = Core::min(copy.getLength(), list.getLength());
  67. for(size_t i = 0; i < limit; i++) {
  68. Core::test(list[i], copy[i]);
  69. }
  70. }
  71. static void testMove() {
  72. IntList list;
  73. list.add(1u).add(2u).add(3u);
  74. IntList move(Core::move(list));
  75. Core::test(0, list.getLength());
  76. Core::test(3, move.getLength());
  77. Core::test(1, move[0]);
  78. Core::test(2, move[1]);
  79. Core::test(3, move[2]);
  80. }
  81. static void testMoveAssignment() {
  82. IntList list;
  83. list.add(1u).add(2u).add(3u);
  84. IntList move;
  85. move = Core::move(list);
  86. Core::test(0, list.getLength());
  87. Core::test(3, move.getLength());
  88. Core::test(1, move[0]);
  89. Core::test(2, move[1]);
  90. Core::test(3, move[2]);
  91. }
  92. static void testToString1() {
  93. IntList list;
  94. list.add(1u).add(243u).add(423u);
  95. Core::testString("[1, 243, 423]", list);
  96. }
  97. static void testToString2() {
  98. IntList list;
  99. list.add(1u);
  100. Core::testString("[1]", list);
  101. }
  102. static void testToString3() {
  103. IntList list;
  104. Core::testString("[]", list);
  105. }
  106. static void testRemoveBySwap() {
  107. IntList list;
  108. list.add(4u).add(3u).add(2u);
  109. list.removeBySwap(0);
  110. Core::test(2, list[0]);
  111. Core::test(3, list[1]);
  112. Core::test(2, list.getLength());
  113. list.removeBySwap(1);
  114. Core::test(2, list[0]);
  115. Core::test(1, list.getLength());
  116. list.removeBySwap(0);
  117. Core::test(0, list.getLength());
  118. }
  119. static void testRemove() {
  120. IntList list;
  121. list.add(4u).add(3u).add(2u);
  122. list.remove(0);
  123. Core::test(3, list[0]);
  124. Core::test(2, list[1]);
  125. Core::test(2, list.getLength());
  126. list.remove(1);
  127. Core::test(3, list[0]);
  128. Core::test(1, list.getLength());
  129. list.remove(0);
  130. Core::test(0, list.getLength());
  131. }
  132. static void testRemoveLast() {
  133. IntList list;
  134. list.add(4u).add(3u).add(2u);
  135. list.removeLast();
  136. Core::test(4, list[0]);
  137. Core::test(3, list[1]);
  138. Core::test(2, list.getLength());
  139. list.removeLast();
  140. Core::test(4, list[0]);
  141. Core::test(1, list.getLength());
  142. list.removeLast();
  143. Core::test(0, list.getLength());
  144. }
  145. static void testResize() {
  146. IntList list;
  147. list.resize(5, 10);
  148. Core::test(5, list.getLength());
  149. for(size_t i = 0; i < 5; i++) {
  150. Core::test(10, list[i]);
  151. }
  152. }
  153. static void testDefaultResize() {
  154. IntList list;
  155. list.resize(5);
  156. Core::test(5, list.getLength());
  157. for(size_t i = 0; i < 5; i++) {
  158. Core::test(0, list[i]);
  159. }
  160. }
  161. static void testInvalidReserve() {
  162. IntList list;
  163. list.reserve(0);
  164. }
  165. static void testShrinkExact() {
  166. IntList list;
  167. list.resize(50);
  168. list.shrink();
  169. }
  170. static void testShrinkResize() {
  171. IntList list;
  172. list.resize(50);
  173. list.resize(20, 5);
  174. list.resize(10);
  175. }
  176. static void testCopyEmpty() {
  177. IntList list;
  178. IntList copy = list;
  179. }
  180. static int listInstances = 0;
  181. struct ListTest final {
  182. int value;
  183. ListTest(int i) noexcept : value(i) {
  184. listInstances++;
  185. }
  186. ListTest(const ListTest& o) = delete;
  187. ListTest(ListTest&& o) noexcept : value(o.value) {
  188. listInstances++;
  189. }
  190. ~ListTest() {
  191. listInstances--;
  192. }
  193. ListTest& operator=(ListTest&& o) noexcept {
  194. value = o.value;
  195. return *this;
  196. }
  197. ListTest& operator=(const ListTest& o) = delete;
  198. };
  199. static void testInsert() {
  200. Core::List<ListTest> l;
  201. l.addAt(0, 1);
  202. Core::test(1, l.getLength());
  203. Core::test(1, l[0].value);
  204. Core::test(1, listInstances);
  205. l.addAt(0, 2);
  206. Core::test(2, l.getLength());
  207. Core::test(2, l[0].value);
  208. Core::test(1, l[1].value);
  209. Core::test(2, listInstances);
  210. l.addAt(0, 3);
  211. Core::test(3, l.getLength());
  212. Core::test(3, l[0].value);
  213. Core::test(2, l[1].value);
  214. Core::test(1, l[2].value);
  215. Core::test(3, listInstances);
  216. l.addAt(1, 4);
  217. Core::test(4, l.getLength());
  218. Core::test(3, l[0].value);
  219. Core::test(4, l[1].value);
  220. Core::test(2, l[2].value);
  221. Core::test(1, l[3].value);
  222. Core::test(4, listInstances);
  223. l.addAt(2, 5);
  224. Core::test(5, l.getLength());
  225. Core::test(3, l[0].value);
  226. Core::test(4, l[1].value);
  227. Core::test(5, l[2].value);
  228. Core::test(2, l[3].value);
  229. Core::test(1, l[4].value);
  230. Core::test(5, listInstances);
  231. l.addAt(5, 4);
  232. Core::test(6, l.getLength());
  233. Core::test(3, l[0].value);
  234. Core::test(4, l[1].value);
  235. Core::test(5, l[2].value);
  236. Core::test(2, l[3].value);
  237. Core::test(1, l[4].value);
  238. Core::test(4, l[5].value);
  239. Core::test(6, listInstances);
  240. l.clear();
  241. Core::test(0, listInstances);
  242. }
  243. void testList(bool light) {
  244. testAdd();
  245. testMultipleAdd();
  246. testAddReplace();
  247. testClear();
  248. testShrink();
  249. testBigAdd(light);
  250. testCopy();
  251. testMove();
  252. testMoveAssignment();
  253. testToString1();
  254. testToString2();
  255. testToString3();
  256. testRemoveBySwap();
  257. testRemove();
  258. testRemoveLast();
  259. testResize();
  260. testDefaultResize();
  261. testInvalidReserve();
  262. testShrinkExact();
  263. testShrinkResize();
  264. testCopyEmpty();
  265. testInsert();
  266. }