QueueTests.cpp 6.2 KB

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