BitArrayTests.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "../Tests.h"
  2. #include "core/BitArray.h"
  3. static void testSetRead() {
  4. CoreBitArray bits = CORE_BIT_ARRAY;
  5. coreResizeBitArray(&bits, 4, 3);
  6. coreBitArraySet(&bits, 0, 1);
  7. coreBitArraySet(&bits, 1, 2);
  8. coreBitArraySet(&bits, 2, 3);
  9. coreBitArraySet(&bits, 3, 4);
  10. CORE_TEST_U64(1, coreBitArrayGet(&bits, 0));
  11. CORE_TEST_U64(2, coreBitArrayGet(&bits, 1));
  12. CORE_TEST_U64(3, coreBitArrayGet(&bits, 2));
  13. CORE_TEST_U64(4, coreBitArrayGet(&bits, 3));
  14. coreDestroyBitArray(&bits);
  15. }
  16. static void testBigSetRead() {
  17. CoreBitArray bits = CORE_BIT_ARRAY;
  18. coreResizeBitArray(&bits, 100, 13);
  19. for(size_t i = 0; i < bits.length; i++) {
  20. coreBitArraySet(&bits, i, i);
  21. }
  22. for(size_t i = 0; i < bits.length; i++) {
  23. CORE_TEST_U64(i, coreBitArrayGet(&bits, i));
  24. }
  25. coreDestroyBitArray(&bits);
  26. }
  27. static void testRandomSetReadResize() {
  28. u64 data[100];
  29. CoreBitArray bits = CORE_BIT_ARRAY;
  30. coreResizeBitArray(&bits, 100, 13);
  31. u64 seed = 534;
  32. for(int k = 0; k < 20; k++) {
  33. for(u64 i = 0; i < bits.length; i++) {
  34. seed = seed * 636455 + 53453;
  35. coreBitArraySet(&bits, i, seed);
  36. data[i] = seed & 0x1FFF;
  37. }
  38. }
  39. for(size_t i = 0; i < bits.length; i++) {
  40. CORE_TEST_U64(data[i], coreBitArrayGet(&bits, i));
  41. }
  42. coreResizeBitArray(&bits, bits.length, bits.bits + 1u);
  43. CORE_TEST_U64(14, bits.bits);
  44. CORE_TEST_U64(100, bits.length);
  45. for(size_t i = 0; i < bits.length; i++) {
  46. CORE_TEST_U64(data[i], coreBitArrayGet(&bits, i));
  47. }
  48. coreDestroyBitArray(&bits);
  49. }
  50. static void testCopy() {
  51. CoreBitArray bits = CORE_BIT_ARRAY;
  52. coreResizeBitArray(&bits, 4, 3);
  53. coreBitArraySet(&bits, 0, 1);
  54. coreBitArraySet(&bits, 1, 2);
  55. coreBitArraySet(&bits, 2, 3);
  56. coreBitArraySet(&bits, 3, 4);
  57. CoreBitArray copy = CORE_BIT_ARRAY;
  58. coreCopyBitArray(&copy, &bits);
  59. coreCopyBitArray(&copy, &copy);
  60. CORE_TEST_U64(1, coreBitArrayGet(&copy, 0));
  61. CORE_TEST_U64(2, coreBitArrayGet(&copy, 1));
  62. CORE_TEST_U64(3, coreBitArrayGet(&copy, 2));
  63. CORE_TEST_U64(4, coreBitArrayGet(&copy, 3));
  64. coreDestroyBitArray(&copy);
  65. coreDestroyBitArray(&bits);
  66. }
  67. static void testSelect() {
  68. CoreBitArray bits = CORE_BIT_ARRAY;
  69. coreResizeBitArray(&bits, 90, 1);
  70. coreFillBitArray(&bits, 0);
  71. coreBitArraySet(&bits, 0, 1);
  72. coreBitArraySet(&bits, 5, 1);
  73. coreBitArraySet(&bits, 20, 1);
  74. coreBitArraySet(&bits, 31, 1);
  75. coreBitArraySet(&bits, 32, 1);
  76. coreBitArraySet(&bits, 33, 1);
  77. coreBitArraySet(&bits, 60, 1);
  78. CORE_TEST_I64(-1, coreBitArraySelect(&bits, 0));
  79. CORE_TEST_I64(0, coreBitArraySelect(&bits, 1));
  80. CORE_TEST_I64(5, coreBitArraySelect(&bits, 2));
  81. CORE_TEST_I64(20, coreBitArraySelect(&bits, 3));
  82. CORE_TEST_I64(31, coreBitArraySelect(&bits, 4));
  83. CORE_TEST_I64(32, coreBitArraySelect(&bits, 5));
  84. CORE_TEST_I64(33, coreBitArraySelect(&bits, 6));
  85. CORE_TEST_I64(60, coreBitArraySelect(&bits, 7));
  86. CORE_TEST_I64(-1, coreBitArraySelect(&bits, 8));
  87. coreDestroyBitArray(&bits);
  88. }
  89. static void testToString1() {
  90. CoreBitArray bits = CORE_BIT_ARRAY;
  91. coreResizeBitArray(&bits, 4, 3);
  92. coreBitArraySet(&bits, 0, 1);
  93. coreBitArraySet(&bits, 1, 2);
  94. coreBitArraySet(&bits, 2, 3);
  95. coreBitArraySet(&bits, 3, 4);
  96. char buffer[128];
  97. size_t n = coreToStringBitArray(&bits, buffer, sizeof(buffer));
  98. CORE_TEST_SIZE(12, n);
  99. CORE_TEST_STRING("[1, 2, 3, 4]", buffer);
  100. coreDestroyBitArray(&bits);
  101. }
  102. static void testToString2() {
  103. CoreBitArray bits = CORE_BIT_ARRAY;
  104. coreResizeBitArray(&bits, 1, 3);
  105. coreBitArraySet(&bits, 0, 1);
  106. char buffer[128];
  107. size_t n = coreToStringBitArray(&bits, buffer, sizeof(buffer));
  108. CORE_TEST_SIZE(3, n);
  109. CORE_TEST_STRING("[1]", buffer);
  110. coreDestroyBitArray(&bits);
  111. }
  112. static void testToString3() {
  113. CoreBitArray bits = CORE_BIT_ARRAY;
  114. char buffer[128];
  115. size_t n = coreToStringBitArray(&bits, buffer, sizeof(buffer));
  116. CORE_TEST_SIZE(2, n);
  117. CORE_TEST_STRING("[]", buffer);
  118. coreDestroyBitArray(&bits);
  119. }
  120. static void testResizeExact() {
  121. CoreBitArray bits = CORE_BIT_ARRAY;
  122. CORE_TEST_U64(0, coreBitArrayBytes(&bits));
  123. // the size in bytes matches the internal storage type
  124. size_t elements = sizeof(u64);
  125. coreResizeBitArray(&bits, elements, 8);
  126. for(size_t i = 0; i < elements; i++) {
  127. coreBitArraySet(&bits, i, i);
  128. }
  129. for(size_t i = 0; i < elements; i++) {
  130. CORE_TEST_U64(i, coreBitArrayGet(&bits, i));
  131. }
  132. CORE_TEST_U64(sizeof(u64), coreBitArrayBytes(&bits));
  133. coreDestroyBitArray(&bits);
  134. }
  135. static void testMove() {
  136. CoreBitArray bits = CORE_BIT_ARRAY;
  137. coreResizeBitArray(&bits, 8, 8);
  138. for(size_t i = 0; i < bits.length; i++) {
  139. coreBitArraySet(&bits, i, i);
  140. }
  141. CoreBitArray m = CORE_BIT_ARRAY;
  142. coreMoveBitArray(&m, &bits);
  143. coreMoveBitArray(&m, &m);
  144. CORE_TEST_U64(8, m.length);
  145. for(size_t i = 0; i < m.length; i++) {
  146. CORE_TEST_U64(i, coreBitArrayGet(&m, i));
  147. }
  148. coreDestroyBitArray(&m);
  149. coreDestroyBitArray(&bits);
  150. }
  151. static void testInvalidArgument() {
  152. CoreBitArray bits = CORE_BIT_ARRAY;
  153. coreResizeBitArray(&bits, 0, 5);
  154. CORE_TEST_SIZE(0, bits.length);
  155. CORE_TEST_SIZE(0, bits.bits);
  156. coreResizeBitArray(&bits, 5, 0);
  157. CORE_TEST_SIZE(0, bits.length);
  158. CORE_TEST_SIZE(0, bits.bits);
  159. coreResizeBitArray(&bits, 0, 0);
  160. CORE_TEST_SIZE(0, bits.length);
  161. CORE_TEST_SIZE(0, bits.bits);
  162. coreResizeBitArray(&bits, 1, 65);
  163. CORE_TEST_SIZE(1, bits.length);
  164. CORE_TEST_SIZE(64, bits.bits);
  165. coreResizeBitArray(&bits, 5, 68);
  166. CORE_TEST_SIZE(5, bits.length);
  167. CORE_TEST_SIZE(64, bits.bits);
  168. coreDestroyBitArray(&bits);
  169. }
  170. void coreTestBitArray() {
  171. testSetRead();
  172. testBigSetRead();
  173. testRandomSetReadResize();
  174. testCopy();
  175. testSelect();
  176. testToString1();
  177. testToString2();
  178. testToString3();
  179. testResizeExact();
  180. testMove();
  181. testInvalidArgument();
  182. }