BitArrayTests.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. module Tests;
  2. import Core.BitArray;
  3. import Core.Test;
  4. import Core.Meta;
  5. import Core.Types;
  6. static void testSetRead() {
  7. Core::BitArray bits;
  8. bits.resize(4, 3);
  9. bits.set(0, 1).set(1, 2).set(2, 3).set(3, 4);
  10. Core::test(1, bits.get(0));
  11. Core::test(2, bits.get(1));
  12. Core::test(3, bits.get(2));
  13. Core::test(4, bits.get(3));
  14. Core::BitArray copy;
  15. copy = bits;
  16. Core::test(1, copy.get(0));
  17. Core::test(2, copy.get(1));
  18. Core::test(3, copy.get(2));
  19. Core::test(4, copy.get(3));
  20. Core::BitArray move = Core::move(copy);
  21. Core::test(1, move.get(0));
  22. Core::test(2, move.get(1));
  23. Core::test(3, move.get(2));
  24. Core::test(4, move.get(3));
  25. }
  26. static void testBigSetRead() {
  27. Core::BitArray bits;
  28. bits.resize(100, 13);
  29. for(size_t i = 0; i < bits.getLength(); i++) {
  30. bits.set(i, i);
  31. }
  32. for(size_t i = 0; i < bits.getLength(); i++) {
  33. Core::test(i, bits.get(i));
  34. }
  35. }
  36. static void testRandomSetReadResize() {
  37. constexpr int length = 100;
  38. u64 data[length];
  39. Core::BitArray bits;
  40. bits.resize(100, 13);
  41. u64 seed = 534;
  42. for(int k = 0; k < 20; k++) {
  43. for(u64 i = 0; i < bits.getLength(); i++) {
  44. seed = seed * 636'455 + 53'453;
  45. bits.set(i, seed);
  46. data[i] = seed & (0x1FFF);
  47. }
  48. }
  49. for(size_t i = 0; i < bits.getLength(); i++) {
  50. Core::test(data[i], bits.get(i));
  51. }
  52. bits.resize(bits.getLength(), bits.getBits() + 1);
  53. Core::test(14, bits.getBits());
  54. Core::test(100, bits.getLength());
  55. for(size_t i = 0; i < bits.getLength(); i++) {
  56. Core::test(data[i], bits.get(i));
  57. }
  58. }
  59. static void testReadOnly() {
  60. Core::BitArray bits;
  61. bits.resize(4, 3);
  62. bits.set(0, 1).set(1, 2).set(2, 3).set(3, 4);
  63. const Core::BitArray copy = bits;
  64. Core::test(1, copy.get(0));
  65. Core::test(2, copy.get(1));
  66. Core::test(3, copy.get(2));
  67. Core::test(4, copy.get(3));
  68. }
  69. static void testSelect() {
  70. Core::BitArray bits;
  71. bits.resize(90, 1);
  72. bits.fill(0);
  73. bits.set(0, 1).set(5, 1).set(20, 1).set(31, 1);
  74. bits.set(32, 1).set(33, 1).set(60, 1);
  75. Core::test(-1, bits.select(0));
  76. Core::test(0, bits.select(1));
  77. Core::test(5, bits.select(2));
  78. Core::test(20, bits.select(3));
  79. Core::test(31, bits.select(4));
  80. Core::test(32, bits.select(5));
  81. Core::test(33, bits.select(6));
  82. Core::test(60, bits.select(7));
  83. Core::test(-1, bits.select(8));
  84. }
  85. static void testToString1() {
  86. Core::BitArray bits;
  87. bits.resize(4, 3);
  88. bits.set(0, 1).set(1, 2).set(2, 3).set(3, 4);
  89. Core::testString("[1, 2, 3, 4]", bits);
  90. }
  91. static void testToString2() {
  92. Core::BitArray bits;
  93. bits.resize(1, 3);
  94. bits.set(0, 1);
  95. Core::testString("[1]", bits);
  96. }
  97. static void testToString3() {
  98. Core::BitArray bits;
  99. Core::testString("[]", bits);
  100. }
  101. static void testResizeExact() {
  102. Core::BitArray bits;
  103. Core::test(0, bits.getInternalByteSize());
  104. // the size in bytes matches the internal storage type
  105. size_t elements = sizeof(u64);
  106. bits.resize(elements, 8);
  107. for(size_t i = 0; i < elements; i++) {
  108. bits.set(i, i);
  109. }
  110. for(size_t i = 0; i < elements; i++) {
  111. Core::test(i, bits.get(i));
  112. }
  113. Core::test(sizeof(u64), bits.getInternalByteSize());
  114. }
  115. static void testInvalidArgument() {
  116. Core::BitArray bits;
  117. bits.resize(0, 5);
  118. Core::test(0, bits.getLength());
  119. Core::test(0, bits.getBits());
  120. bits.resize(5, 0);
  121. Core::test(0, bits.getLength());
  122. Core::test(0, bits.getBits());
  123. bits.resize(0, 0);
  124. Core::test(0, bits.getLength());
  125. Core::test(0, bits.getBits());
  126. bits.resize(1, 65);
  127. Core::test(1, bits.getLength());
  128. Core::test(64, bits.getBits());
  129. bits.resize(5, 68);
  130. Core::test(5, bits.getLength());
  131. Core::test(64, bits.getBits());
  132. }
  133. void testBitArray() {
  134. testBigSetRead();
  135. testInvalidArgument();
  136. testRandomSetReadResize();
  137. testReadOnly();
  138. testResizeExact();
  139. testSelect();
  140. testSetRead();
  141. testToString1();
  142. testToString2();
  143. testToString3();
  144. }