QueueTests.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. module Tests;
  2. import Core.Std;
  3. import Core.Queue;
  4. import Core.Test;
  5. import Core.Types;
  6. import Core.Meta;
  7. import Core.ToString;
  8. template class Core::Queue<int, 5>;
  9. struct Tester final {
  10. static int ids;
  11. static int sum;
  12. int id;
  13. Tester() noexcept : id(++ids) {
  14. sum += id;
  15. }
  16. Tester(const Tester&) noexcept : id(++ids) {
  17. sum += id;
  18. }
  19. Tester(Tester&&) noexcept : id(++ids) {
  20. sum += id;
  21. }
  22. Tester& operator=(const Tester&) noexcept {
  23. return *this;
  24. }
  25. Tester& operator=(Tester&&) noexcept {
  26. return *this;
  27. }
  28. ~Tester() {
  29. sum -= id;
  30. }
  31. size_t toString(Core::StringBase& b) const {
  32. return b.addFormat("{}", id);
  33. }
  34. };
  35. int Tester::ids = 0;
  36. int Tester::sum = 0;
  37. static void resetTester() {
  38. Tester::ids = 0;
  39. Tester::sum = 0;
  40. }
  41. static void testReadAndWrite() {
  42. Core::Queue<int, 5> buffer;
  43. Core::testFalse(buffer.canRemove());
  44. Core::test(0, buffer.getLength());
  45. buffer.add(4);
  46. Core::test(1, buffer.getLength());
  47. Core::testTrue(buffer.canRemove());
  48. Core::test(4, buffer[0]);
  49. buffer.remove();
  50. Core::testFalse(buffer.canRemove());
  51. Core::test(0, buffer.getLength());
  52. }
  53. static void testOverflow() {
  54. Core::Queue<int, 3> buffer;
  55. buffer.add(1).add(2).add(3).add(4).add(5);
  56. Core::test(3, buffer.getLength());
  57. Core::test(1, buffer[0]);
  58. buffer.remove();
  59. Core::test(2, buffer.getLength());
  60. Core::test(2, buffer[0]);
  61. buffer.remove();
  62. Core::test(1, buffer.getLength());
  63. Core::test(3, buffer[0]);
  64. buffer.remove();
  65. Core::testFalse(buffer.canRemove());
  66. Core::test(0, buffer.getLength());
  67. }
  68. static void testRefill() {
  69. Core::Queue<int, 3> buffer;
  70. buffer.add(1).add(2).add(3).add(4);
  71. Core::test(3, buffer.getLength());
  72. Core::testTrue(buffer.canRemove());
  73. Core::test(1, buffer[0]);
  74. buffer.remove();
  75. Core::test(2, buffer[0]);
  76. buffer.remove();
  77. Core::test(3, buffer[0]);
  78. buffer.remove();
  79. Core::test(0, buffer.getLength());
  80. Core::testFalse(buffer.canRemove());
  81. buffer.add(5).add(6);
  82. Core::test(2, buffer.getLength());
  83. Core::testTrue(buffer.canRemove());
  84. Core::test(5, buffer[0]);
  85. buffer.remove();
  86. Core::test(6, buffer[0]);
  87. buffer.remove();
  88. Core::testFalse(buffer.canRemove());
  89. Core::test(0, buffer.getLength());
  90. }
  91. static void testClear() {
  92. Core::Queue<int, 3> buffer;
  93. buffer.add(1).add(2);
  94. Core::test(2, buffer.getLength());
  95. buffer.clear();
  96. Core::testFalse(buffer.canRemove());
  97. Core::test(0, buffer.getLength());
  98. }
  99. static void testConstructDestruct() {
  100. resetTester();
  101. Core::Queue<Tester, 3> buffer;
  102. buffer.add();
  103. Core::test(1, Tester::sum);
  104. buffer.add();
  105. Core::test(3, Tester::sum);
  106. buffer.add();
  107. Core::test(6, Tester::sum);
  108. buffer.remove();
  109. Core::test(5, Tester::sum);
  110. buffer.remove();
  111. Core::test(3, Tester::sum);
  112. buffer.remove();
  113. Core::test(0, Tester::sum);
  114. }
  115. static void testCopyDestruct() {
  116. resetTester();
  117. {
  118. Core::Queue<Tester, 3> buffer;
  119. buffer.add();
  120. Core::test(1, Tester::sum);
  121. buffer.add();
  122. Core::test(3, Tester::sum);
  123. buffer.add();
  124. Core::test(6, Tester::sum);
  125. {
  126. Core::Queue<Tester, 3> copy = buffer;
  127. Core::test(6 + 4 + 5 + 6, Tester::sum);
  128. }
  129. Core::test(6, Tester::sum);
  130. }
  131. Core::test(0, Tester::sum);
  132. }
  133. static void testCopyAssignmentDestruct() {
  134. resetTester();
  135. {
  136. Core::Queue<Tester, 3> buffer;
  137. buffer.add();
  138. Core::test(1, Tester::sum);
  139. buffer.add();
  140. Core::test(3, Tester::sum);
  141. buffer.add();
  142. Core::test(6, Tester::sum);
  143. {
  144. Core::Queue<Tester, 3> copy;
  145. copy = buffer;
  146. Core::test(6 + 4 + 5 + 6, Tester::sum);
  147. }
  148. Core::test(6, Tester::sum);
  149. }
  150. Core::test(0, Tester::sum);
  151. }
  152. static void testMoveDestruct() {
  153. resetTester();
  154. {
  155. Core::Queue<Tester, 3> buffer;
  156. buffer.add();
  157. Core::test(1, Tester::sum);
  158. buffer.add();
  159. Core::test(3, Tester::sum);
  160. buffer.add();
  161. Core::test(6, Tester::sum);
  162. {
  163. Core::Queue<Tester, 3> move = Core::move(buffer);
  164. Core::test(4 + 5 + 6, Tester::sum);
  165. Core::test(0, buffer.getLength());
  166. }
  167. Core::test(0, Tester::sum);
  168. }
  169. Core::test(0, Tester::sum);
  170. }
  171. static void testMoveAssignmentDestruct() {
  172. resetTester();
  173. {
  174. Core::Queue<Tester, 3> buffer;
  175. buffer.add();
  176. Core::test(1, Tester::sum);
  177. buffer.add();
  178. Core::test(3, Tester::sum);
  179. buffer.add();
  180. Core::test(6, Tester::sum);
  181. {
  182. Core::Queue<Tester, 3> move;
  183. move = Core::move(buffer);
  184. Core::test(4 + 5 + 6, Tester::sum);
  185. Core::test(0, buffer.getLength());
  186. }
  187. Core::test(0, Tester::sum);
  188. }
  189. Core::test(0, Tester::sum);
  190. }
  191. static void testOverall() {
  192. resetTester();
  193. Core::Queue<Tester, 3> buffer;
  194. buffer.add().add().add();
  195. Core::testString("[1, 2, 3]", buffer);
  196. Core::test(3, buffer.getLength());
  197. Core::test(6, Tester::sum);
  198. buffer.remove();
  199. Core::testString("[2, 3]", buffer);
  200. Core::test(2, buffer.getLength());
  201. Core::test(5, Tester::sum);
  202. buffer.add();
  203. Core::testString("[2, 3, 4]", buffer);
  204. Core::test(3, buffer.getLength());
  205. Core::test(9, Tester::sum);
  206. buffer.remove();
  207. Core::testString("[3, 4]", buffer);
  208. Core::test(2, buffer.getLength());
  209. Core::test(7, Tester::sum);
  210. buffer.add();
  211. Core::testString("[3, 4, 5]", buffer);
  212. Core::test(3, buffer.getLength());
  213. Core::test(12, Tester::sum);
  214. buffer.remove();
  215. Core::testString("[4, 5]", buffer);
  216. Core::test(2, buffer.getLength());
  217. Core::test(9, Tester::sum);
  218. buffer.clear();
  219. Core::testString("[]", buffer);
  220. Core::test(0, buffer.getLength());
  221. Core::test(0, Tester::sum);
  222. }
  223. void testQueue() {
  224. testReadAndWrite();
  225. testOverflow();
  226. testRefill();
  227. testClear();
  228. testConstructDestruct();
  229. testCopyDestruct();
  230. testCopyAssignmentDestruct();
  231. testMoveDestruct();
  232. testMoveAssignmentDestruct();
  233. testOverall();
  234. }