QueueTests.cpp 6.2 KB

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