UtilityTests.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. TEST(
  89. 8, Core::formatBuffer(buffer, sizeof(buffer), "# # # #", c, s, cu, su));
  90. TEST_STRING("a 4 h 67", buffer);
  91. unsigned char text[] = "fgsdf";
  92. TEST(5, Core::toString(text, buffer, sizeof(buffer)));
  93. TEST_STRING("fgsdf", buffer);
  94. }
  95. void testUtility() {
  96. testPopCount();
  97. testIf();
  98. testZeroRellocate();
  99. testMemoryInfoList();
  100. testZeroAllocate();
  101. testSwap();
  102. testSort();
  103. testToString();
  104. }
  105. static void outOfMemory(void*) {
  106. Core::setOutOfMemoryHandler(nullptr, nullptr);
  107. }
  108. void testInvalidAllocate(void) {
  109. Core::setOutOfMemoryHandler(outOfMemory, nullptr);
  110. Core::allocateRaw(0xFFF'FFFF'FFFF);
  111. TEST_TRUE(false);
  112. Core::finalizeTests();
  113. EXIT(0);
  114. }
  115. void testInvalidReallocate(void) {
  116. Core::setOutOfMemoryHandler(outOfMemory, nullptr);
  117. void* p = Core::allocateRaw(0xFF);
  118. Core::printMemoryReport();
  119. Core::reallocateRaw(p, 0xFFF'FFFF'FFFF);
  120. TEST_TRUE(false);
  121. Core::finalizeTests();
  122. EXIT(0);
  123. }
  124. [[noreturn]] void testPreCanary(void) {
  125. #ifdef CHECK_MEMORY
  126. char* p = static_cast<char*>(Core::allocateRaw(16));
  127. p[-1] = 0;
  128. Core::deallocateRaw(p);
  129. TEST_TRUE(false);
  130. #endif
  131. Core::finalizeTests();
  132. EXIT(0);
  133. }
  134. [[noreturn]] void testPreCanaryNew(void) {
  135. #ifdef CHECK_MEMORY
  136. volatile char* p2 = new char[3];
  137. volatile char* p = coreNewN(char, 16);
  138. delete[] p2;
  139. coreDeleteN(p);
  140. p = coreNewN(char, 16);
  141. p[-1] = 0;
  142. coreDeleteN(p);
  143. TEST_TRUE(false);
  144. #endif
  145. Core::finalizeTests();
  146. EXIT(0);
  147. }
  148. [[noreturn]] void testPreCanaryNewArray(void) {
  149. #ifdef CHECK_MEMORY
  150. volatile char* p = coreNew(char);
  151. p[-1] = 0;
  152. coreDelete(p);
  153. TEST_TRUE(false);
  154. #endif
  155. Core::finalizeTests();
  156. EXIT(0);
  157. }
  158. [[noreturn]] void testPostCanary(void) {
  159. #ifdef CHECK_MEMORY
  160. char* p = static_cast<char*>(Core::allocateRaw(16));
  161. p[17] = 0;
  162. Core::deallocateRaw(p);
  163. TEST_TRUE(false);
  164. #endif
  165. Core::finalizeTests();
  166. EXIT(0);
  167. }