UtilityTests.cpp 4.7 KB

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