UtilityTests.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #include <cstring>
  2. #include "../../src/ErrorSimulator.hpp"
  3. #include "../Tests.hpp"
  4. #include "core/Test.hpp"
  5. #include "core/ToString.hpp"
  6. #include "core/Utility.hpp"
  7. static void testPopCount() {
  8. TEST(4, Core::popCount(0xF));
  9. TEST(0, Core::popCount(0x0));
  10. TEST(2, Core::popCount(0x6));
  11. TEST(7, Core::popCount(0x7F));
  12. TEST(3, Core::popCount(0x2A));
  13. TEST(32, Core::popCount(0xFFFF'FFFF));
  14. TEST(64, Core::popCount(0xFFFF'FFFF'FFFF'FFFF));
  15. TEST(44, Core::popCount(0xFFFF'0FFF'FFFF));
  16. }
  17. static void testIf() {
  18. TEST_TRUE((Core::IsSame<Core::If<true, int, double>, int>));
  19. TEST_TRUE((Core::IsSame<Core::If<false, int, double>, double>));
  20. }
  21. static void testZeroRellocate() {
  22. void* buffer = Core::reallocateRaw(nullptr, 16);
  23. TEST_NOT_NULL(buffer);
  24. buffer = Core::reallocateRaw(buffer, 0);
  25. TEST_NULL(buffer);
  26. }
  27. static void testMemoryInfoList() {
  28. void* a = Core::allocateRaw(8);
  29. void* b = Core::allocateRaw(8);
  30. void* c = Core::allocateRaw(8);
  31. void* d = Core::allocateRaw(8);
  32. Core::deallocateRaw(b); // remove middle element
  33. Core::deallocateRaw(a); // remove first
  34. Core::deallocateRaw(d); // remove last
  35. Core::deallocateRaw(c); // remove single
  36. Core::deallocateRaw(nullptr);
  37. }
  38. static void testZeroAllocate() {
  39. constexpr size_t n = 1024 * 1024;
  40. void* a = Core::allocateRaw(n);
  41. memset(a, 0, n);
  42. void* b = Core::zeroAllocateRaw(n);
  43. TEST_TRUE(memcmp(a, b, n) == 0);
  44. Core::deallocateRaw(a);
  45. Core::deallocateRaw(b);
  46. }
  47. static void testSleep(i64 nanos) {
  48. i64 time = -Core::getNanos();
  49. TEST_FALSE(Core::sleepNanos(nanos));
  50. time += Core::getNanos();
  51. TEST_TRUE(time >= nanos && time <= (nanos * 13) / 10);
  52. }
  53. static void testSleepMillis(i64 millis) {
  54. i64 time = -Core::getNanos();
  55. TEST_FALSE(Core::sleepMillis(millis));
  56. time += Core::getNanos();
  57. i64 nanos = millis * 1'000'000;
  58. TEST_TRUE(time >= nanos && time <= (nanos * 13) / 10);
  59. }
  60. typedef struct {
  61. int i;
  62. i64 d;
  63. } SwapTest;
  64. static void testSwap() {
  65. SwapTest a = {3, 20};
  66. SwapTest b = {7, 30};
  67. Core::swap(a, b);
  68. TEST(7, a.i);
  69. TEST(3, b.i);
  70. TEST(30l, a.d);
  71. TEST(20l, b.d);
  72. }
  73. static void testFail() {
  74. #ifdef ERROR_SIMULATOR
  75. failStepThrow = 1;
  76. TEST(-1l, Core::getNanos());
  77. failStepThrow = 1;
  78. TEST_TRUE(Core::sleepMillis(5));
  79. failStepThrow = 0;
  80. #endif
  81. }
  82. static void testSort() {
  83. size_t data[] = {9, 0, 3, 1, 8, 4, 6, 2, 5, 7};
  84. size_t n = 10;
  85. Core::bubbleSort(data, n);
  86. Core::bubbleSort(data, n);
  87. Core::bubbleSort(data, 0);
  88. for(size_t i = 0; i < n; i++) {
  89. TEST(data[i], i);
  90. }
  91. }
  92. static void testToString() {
  93. char buffer[512];
  94. TEST(10, formatBuffer(buffer, sizeof(buffer), "a#a##a", 1.0, 2, 3));
  95. TEST_STRING("a1.00a#a23", buffer);
  96. TEST(5, formatBuffer(buffer, sizeof(buffer), "aa##ab"));
  97. TEST_STRING("aa#ab", buffer);
  98. TEST(6, formatBuffer(buffer, 3, "aaaaaa"));
  99. TEST_STRING("aa", buffer);
  100. TEST(4, formatBuffer(buffer, 4, "a#", 456));
  101. TEST_STRING("a45", buffer);
  102. TEST(10, formatBuffer(buffer, 4, "# # #", 456, 567, 78));
  103. TEST_STRING("456", buffer);
  104. TEST(10, formatBuffer(buffer, 1, "# # #", 456, 567, 78));
  105. TEST_STRING("", buffer);
  106. TEST(10, formatBuffer(nullptr, 0, "# # #", 456ll, 567l, 78ull));
  107. }
  108. void testUtility(bool light) {
  109. testPopCount();
  110. testIf();
  111. testZeroRellocate();
  112. testMemoryInfoList();
  113. testZeroAllocate();
  114. testSleep(light ? 5'000'000 : 50'000'000);
  115. testSleep(light ? 50'000'000 : 1'300'000'000);
  116. testSleepMillis(light ? 5 : 50);
  117. testSleepMillis(light ? 50 : 1300);
  118. testSwap();
  119. testFail();
  120. testSort();
  121. testToString();
  122. }
  123. static void outOfMemory(void*) {
  124. Core::setOutOfMemoryHandler(nullptr, nullptr);
  125. }
  126. void testInvalidAllocate(void) {
  127. Core::setOutOfMemoryHandler(outOfMemory, nullptr);
  128. Core::allocateRaw(0xFFF'FFFF'FFFF);
  129. TEST_TRUE(false);
  130. Core::finalizeTests();
  131. EXIT(0);
  132. }
  133. void testInvalidReallocate(void) {
  134. Core::setOutOfMemoryHandler(outOfMemory, nullptr);
  135. void* p = Core::allocateRaw(0xFF);
  136. Core::printMemoryReport();
  137. Core::reallocateRaw(p, 0xFFF'FFFF'FFFF);
  138. TEST_TRUE(false);
  139. Core::finalizeTests();
  140. EXIT(0);
  141. }
  142. [[noreturn]] void testPreCanary(void) {
  143. #ifdef CHECK_MEMORY
  144. char* p = static_cast<char*>(Core::allocateRaw(16));
  145. p[-1] = 0;
  146. Core::deallocateRaw(p);
  147. TEST_TRUE(false);
  148. #endif
  149. Core::finalizeTests();
  150. EXIT(0);
  151. }
  152. [[noreturn]] void testPreCanaryNew(void) {
  153. #ifdef CHECK_MEMORY
  154. volatile char* p2 = new char[3];
  155. volatile char* p = coreNewN(char, 16);
  156. delete[] p2;
  157. coreDeleteN(p);
  158. p = coreNewN(char, 16);
  159. p[-1] = 0;
  160. coreDeleteN(p);
  161. TEST_TRUE(false);
  162. #endif
  163. Core::finalizeTests();
  164. EXIT(0);
  165. }
  166. [[noreturn]] void testPreCanaryNewArray(void) {
  167. #ifdef CHECK_MEMORY
  168. volatile char* p = coreNew(char);
  169. p[-1] = 0;
  170. coreDelete(p);
  171. TEST_TRUE(false);
  172. #endif
  173. Core::finalizeTests();
  174. EXIT(0);
  175. }
  176. [[noreturn]] void testPostCanary(void) {
  177. #ifdef CHECK_MEMORY
  178. char* p = static_cast<char*>(Core::allocateRaw(16));
  179. p[17] = 0;
  180. Core::deallocateRaw(p);
  181. TEST_TRUE(false);
  182. #endif
  183. Core::finalizeTests();
  184. EXIT(0);
  185. }