BitArrayTests.c 4.0 KB

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