BitArrayTests.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #define IMPORT_CORE
  2. #include "../Tests.h"
  3. #include "core/BitArray.h"
  4. #include "core/ToString.h"
  5. static void testSetRead() {
  6. BitArray bits;
  7. initBitArray(&bits, 4, 3);
  8. setBits(&bits, 0, 1);
  9. setBits(&bits, 1, 2);
  10. setBits(&bits, 2, 3);
  11. setBits(&bits, 3, 4);
  12. TEST_U64(1, getBits(&bits, 0));
  13. TEST_U64(2, getBits(&bits, 1));
  14. TEST_U64(3, getBits(&bits, 2));
  15. TEST_U64(4, getBits(&bits, 3));
  16. destroyBitArray(&bits);
  17. }
  18. static void testBigSetRead() {
  19. BitArray bits;
  20. initBitArray(&bits, 100, 13);
  21. for(size_t i = 0; i < bits.length; i++) {
  22. setBits(&bits, i, i);
  23. }
  24. for(size_t i = 0; i < bits.length; i++) {
  25. TEST_U64(i, getBits(&bits, i));
  26. }
  27. destroyBitArray(&bits);
  28. }
  29. static void testRandomSetReadResize() {
  30. u64 data[100];
  31. BitArray bits;
  32. initBitArray(&bits, 100, 13);
  33. u64 seed = 534;
  34. for(int k = 0; k < 20; k++) {
  35. for(u64 i = 0; i < bits.length; i++) {
  36. seed = seed * 636455 + 53453;
  37. setBits(&bits, i, seed);
  38. data[i] = seed & 0x1FFF;
  39. }
  40. }
  41. for(size_t i = 0; i < bits.length; i++) {
  42. TEST_U64(data[i], getBits(&bits, i));
  43. }
  44. setBitLength(&bits, bits.length, bits.bits + 1u);
  45. TEST_U64(14, bits.bits);
  46. TEST_U64(100, bits.length);
  47. for(size_t i = 0; i < bits.length; i++) {
  48. TEST_U64(data[i], getBits(&bits, i));
  49. }
  50. destroyBitArray(&bits);
  51. }
  52. static void testSelect() {
  53. BitArray bits;
  54. initBitArray(&bits, 90, 1);
  55. setAllBits(&bits, 0);
  56. setBits(&bits, 0, 1);
  57. setBits(&bits, 5, 1);
  58. setBits(&bits, 20, 1);
  59. setBits(&bits, 31, 1);
  60. setBits(&bits, 32, 1);
  61. setBits(&bits, 33, 1);
  62. setBits(&bits, 60, 1);
  63. TEST_I64(-1, selectBits(&bits, 0));
  64. TEST_I64(0, selectBits(&bits, 1));
  65. TEST_I64(5, selectBits(&bits, 2));
  66. TEST_I64(20, selectBits(&bits, 3));
  67. TEST_I64(31, selectBits(&bits, 4));
  68. TEST_I64(32, selectBits(&bits, 5));
  69. TEST_I64(33, selectBits(&bits, 6));
  70. TEST_I64(60, selectBits(&bits, 7));
  71. TEST_I64(-1, selectBits(&bits, 8));
  72. destroyBitArray(&bits);
  73. }
  74. static void testToString1() {
  75. BitArray bits;
  76. initBitArray(&bits, 4, 3);
  77. setBits(&bits, 0, 1);
  78. setBits(&bits, 1, 2);
  79. setBits(&bits, 2, 3);
  80. setBits(&bits, 3, 4);
  81. char buffer[128];
  82. size_t n = toString(&bits, buffer, sizeof(buffer));
  83. TEST_SIZE(12, n);
  84. TEST_STRING("[1, 2, 3, 4]", buffer);
  85. destroyBitArray(&bits);
  86. }
  87. static void testToString2() {
  88. BitArray bits;
  89. initBitArray(&bits, 1, 3);
  90. setBits(&bits, 0, 1);
  91. char buffer[128];
  92. size_t n = toString(&bits, buffer, sizeof(buffer));
  93. TEST_SIZE(3, n);
  94. TEST_STRING("[1]", buffer);
  95. destroyBitArray(&bits);
  96. }
  97. static void testToString3() {
  98. BitArray bits;
  99. initBitArray(&bits, 0, 0);
  100. char buffer[128];
  101. size_t n = toString(&bits, buffer, sizeof(buffer));
  102. TEST_SIZE(2, n);
  103. TEST_STRING("[]", buffer);
  104. destroyBitArray(&bits);
  105. }
  106. static void testResizeExact() {
  107. BitArray bits;
  108. // the size in bytes matches the internal storage type
  109. size_t elements = sizeof(u64);
  110. initBitArray(&bits, elements, 8);
  111. for(size_t i = 0; i < elements; i++) {
  112. setBits(&bits, i, i);
  113. }
  114. for(size_t i = 0; i < elements; i++) {
  115. TEST_U64(i, getBits(&bits, i));
  116. }
  117. destroyBitArray(&bits);
  118. }
  119. static void testInvalidArgument() {
  120. BitArray bits;
  121. initBitArray(&bits, 0, 0);
  122. setBitLength(&bits, 0, 5);
  123. TEST_SIZE(0, bits.length);
  124. TEST_SIZE(0, bits.bits);
  125. setBitLength(&bits, 5, 0);
  126. TEST_SIZE(0, bits.length);
  127. TEST_SIZE(0, bits.bits);
  128. setBitLength(&bits, 0, 0);
  129. TEST_SIZE(0, bits.length);
  130. TEST_SIZE(0, bits.bits);
  131. setBitLength(&bits, 1, 65);
  132. TEST_SIZE(1, bits.length);
  133. TEST_SIZE(64, bits.bits);
  134. setBitLength(&bits, 5, 68);
  135. TEST_SIZE(5, bits.length);
  136. TEST_SIZE(64, bits.bits);
  137. destroyBitArray(&bits);
  138. }
  139. void testBitArray() {
  140. testSetRead();
  141. testBigSetRead();
  142. testRandomSetReadResize();
  143. testSelect();
  144. testToString1();
  145. testToString2();
  146. testToString3();
  147. testResizeExact();
  148. testInvalidArgument();
  149. }