QueueTests.cpp 5.7 KB

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