UtilityTests.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. module;
  2. #include <cstring>
  3. module Tests;
  4. import Core.Test;
  5. import Core.ToString;
  6. import Core.Utility;
  7. import Core.Meta;
  8. import Core.Types;
  9. static void testPopCount() {
  10. Core::test(4, Core::popCount(0xF));
  11. Core::test(0, Core::popCount(0x0));
  12. Core::test(2, Core::popCount(0x6));
  13. Core::test(7, Core::popCount(0x7F));
  14. Core::test(3, Core::popCount(0x2A));
  15. Core::test(32, Core::popCount(0xFFFF'FFFF));
  16. Core::test(64, Core::popCount(0xFFFF'FFFF'FFFF'FFFF));
  17. Core::test(44, Core::popCount(0xFFFF'0FFF'FFFF));
  18. }
  19. static void testIf() {
  20. Core::testTrue(Core::IsSame<Core::If<true, int, double>, int>);
  21. Core::testTrue(Core::IsSame<Core::If<false, int, double>, double>);
  22. }
  23. static void testZeroRellocate() {
  24. void* buffer = Core::reallocateRaw(nullptr, 16);
  25. Core::testNotNull(buffer);
  26. buffer = Core::reallocateRaw(buffer, 0);
  27. Core::testNull(buffer);
  28. }
  29. static void testMemoryInfoList() {
  30. void* a = Core::allocateRaw(8);
  31. void* b = Core::allocateRaw(8);
  32. void* c = Core::allocateRaw(8);
  33. void* d = Core::allocateRaw(8);
  34. Core::deallocateRaw(b); // remove middle element
  35. Core::deallocateRaw(a); // remove first
  36. Core::deallocateRaw(d); // remove last
  37. Core::deallocateRaw(c); // remove single
  38. Core::deallocateRaw(nullptr);
  39. }
  40. static void testZeroAllocate() {
  41. constexpr size_t n = 1024 * 1024;
  42. void* a = Core::allocateRaw(n);
  43. memset(a, 0, n);
  44. void* b = Core::zeroAllocateRaw(n);
  45. Core::testTrue(memcmp(a, b, n) == 0);
  46. Core::deallocateRaw(a);
  47. Core::deallocateRaw(b);
  48. }
  49. typedef struct {
  50. int i;
  51. i64 d;
  52. } SwapTest;
  53. static void testSwap() {
  54. SwapTest a = {3, 20};
  55. SwapTest b = {7, 30};
  56. Core::swap(a, b);
  57. Core::test(7, a.i);
  58. Core::test(3, b.i);
  59. Core::test(30l, a.d);
  60. Core::test(20l, b.d);
  61. }
  62. static void testSort() {
  63. size_t data[] = {9, 0, 3, 1, 8, 4, 6, 2, 5, 7};
  64. size_t n = 10;
  65. Core::bubbleSort(data, n);
  66. Core::bubbleSort(data, n);
  67. Core::bubbleSort(data, 0);
  68. for(size_t i = 0; i < n; i++) {
  69. Core::test(data[i], i);
  70. }
  71. }
  72. static void testToString() {
  73. char buffer[512];
  74. Core::test(
  75. 10, Core::formatBuffer(buffer, sizeof(buffer), "a#a##a", 1.0, 2, 3));
  76. Core::testString("a1.00a#a23", buffer);
  77. Core::test(5, Core::formatBuffer(buffer, sizeof(buffer), "aa##ab"));
  78. Core::testString("aa#ab", buffer);
  79. Core::test(6, Core::formatBuffer(buffer, 3, "aaaaaa"));
  80. Core::testString("aa", buffer);
  81. Core::test(4, Core::formatBuffer(buffer, 4, "a#", 456));
  82. Core::testString("a45", buffer);
  83. Core::test(10, Core::formatBuffer(buffer, 4, "# # #", 456, 567, 78));
  84. Core::testString("456", buffer);
  85. Core::test(10, Core::formatBuffer(buffer, 1, "# # #", 456, 567, 78));
  86. Core::testString("", buffer);
  87. Core::test(10, Core::formatBuffer(nullptr, 0, "# # #", 456ll, 567l, 78ull));
  88. char c = 'a';
  89. short s = 4;
  90. unsigned char cu = 'h';
  91. unsigned short su = 67;
  92. signed char cs = 'x';
  93. Core::test(
  94. 10, Core::formatBuffer(
  95. buffer, sizeof(buffer), "# # # # #", c, s, cu, su, cs));
  96. Core::testString("a 4 h 67 x", buffer);
  97. unsigned char text[] = "fgsdf";
  98. Core::test(5, Core::toString(text, buffer, sizeof(buffer)));
  99. Core::testString("fgsdf", buffer);
  100. }
  101. void testUtility() {
  102. testPopCount();
  103. testIf();
  104. testZeroRellocate();
  105. testMemoryInfoList();
  106. testZeroAllocate();
  107. testSwap();
  108. testSort();
  109. testToString();
  110. }
  111. static void outOfMemory(void*) {
  112. Core::setOutOfMemoryHandler(nullptr, nullptr);
  113. }
  114. [[noreturn]] void testInvalidAllocate() {
  115. Core::setOutOfMemoryHandler(outOfMemory, nullptr);
  116. Core::allocateRaw(0xFFF'FFFF'FFFF);
  117. Core::testTrue(false);
  118. Core::finalizeTests();
  119. Core::exitWithHandler(0);
  120. }
  121. [[noreturn]] void testInvalidReallocate() {
  122. Core::setOutOfMemoryHandler(outOfMemory, nullptr);
  123. void* p = Core::allocateRaw(0xFF);
  124. Core::printMemoryReport();
  125. Core::reallocateRaw(p, 0xFFF'FFFF'FFFF);
  126. Core::testTrue(false);
  127. Core::finalizeTests();
  128. Core::exitWithHandler(0);
  129. }
  130. [[noreturn]] void testInvalidNew() {
  131. Core::setOutOfMemoryHandler(outOfMemory, nullptr);
  132. volatile char* p2 = new char[0xFF];
  133. p2[2] = 3;
  134. Core::printMemoryReport();
  135. #pragma GCC diagnostic push
  136. #pragma GCC diagnostic ignored "-Wpragmas"
  137. #pragma GCC diagnostic ignored "-Wunknown-warning-option"
  138. #pragma GCC diagnostic error "-Wlarger-than=17592186044416"
  139. volatile char* p = Core::newWithSourceN<char>(0xFFF'FFFF'FFFF);
  140. p[3] = 3;
  141. #pragma GCC diagnostic pop
  142. Core::testTrue(false);
  143. Core::finalizeTests();
  144. Core::exitWithHandler(0);
  145. }
  146. [[noreturn]] void testPreCanary() {
  147. #ifdef CHECK_MEMORY
  148. char* p = static_cast<char*>(Core::allocateRaw(16));
  149. p[-1] = 0;
  150. Core::deallocateRaw(p);
  151. Core::testTrue(false);
  152. #endif
  153. Core::finalizeTests();
  154. Core::exitWithHandler(0);
  155. }
  156. [[noreturn]] void testPreCanaryNew() {
  157. #ifdef CHECK_MEMORY
  158. volatile char* p2 = new char[3];
  159. volatile char* p = Core::newWithSourceN<char>(16);
  160. delete[] p2;
  161. Core::deleteWithSourceN(p);
  162. p = Core::newWithSourceN<char>(16);
  163. p[-1] = 0;
  164. Core::deleteWithSourceN(p);
  165. Core::testTrue(false);
  166. #endif
  167. Core::finalizeTests();
  168. Core::exitWithHandler(0);
  169. }
  170. [[noreturn]] void testPreCanaryNewArray() {
  171. #ifdef CHECK_MEMORY
  172. volatile char* p = Core::newWithSource<char>();
  173. p[-1] = 0;
  174. Core::deleteWithSource(p);
  175. Core::testTrue(false);
  176. #endif
  177. Core::finalizeTests();
  178. Core::exitWithHandler(0);
  179. }
  180. [[noreturn]] void testPostCanary() {
  181. #ifdef CHECK_MEMORY
  182. char* p = static_cast<char*>(Core::allocateRaw(16));
  183. p[17] = 0;
  184. Core::deallocateRaw(p);
  185. Core::testTrue(false);
  186. #endif
  187. Core::finalizeTests();
  188. Core::exitWithHandler(0);
  189. }