You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

411 lines
9.4 KiB

  1. #include "gtest/gtest.h"
  2. #include "src/storage/BitVector.h"
  3. #include "src/exceptions/InvalidArgumentException.h"
  4. #include "src/exceptions/OutOfRangeException.h"
  5. TEST(BitVectorTest, InitToZero) {
  6. storm::storage::BitVector vector(32);
  7. for (uint_fast64_t i = 0; i < 32; ++i) {
  8. ASSERT_FALSE(vector.get(i));
  9. }
  10. ASSERT_TRUE(vector.empty());
  11. ASSERT_FALSE(vector.full());
  12. }
  13. TEST(BitVectorTest, InitToOne) {
  14. storm::storage::BitVector vector(32, true);
  15. for (uint_fast64_t i = 0; i < 32; ++i) {
  16. ASSERT_TRUE(vector.get(i));
  17. }
  18. ASSERT_FALSE(vector.empty());
  19. ASSERT_TRUE(vector.full());
  20. }
  21. TEST(BitVectorTest, InitFromIterator) {
  22. std::vector<uint_fast64_t> valueVector = {0, 4, 10};
  23. storm::storage::BitVector vector(32, valueVector.begin(), valueVector.end());
  24. ASSERT_EQ(32, vector.size());
  25. for (uint_fast64_t i = 0; i < 32; ++i) {
  26. if (i == 0 || i == 4 || i == 10) {
  27. ASSERT_TRUE(vector.get(i));
  28. } else {
  29. ASSERT_FALSE(vector.get(i));
  30. }
  31. }
  32. }
  33. TEST(BitVectorTest, GetSet) {
  34. storm::storage::BitVector vector(32);
  35. for (uint_fast64_t i = 0; i < 32; ++i) {
  36. vector.set(i, i % 2 == 0);
  37. }
  38. for (uint_fast64_t i = 0; i < 32; ++i) {
  39. ASSERT_EQ(i % 2 == 0, vector.get(i));
  40. }
  41. }
  42. TEST(BitVectorTest, GetSetException) {
  43. storm::storage::BitVector vector(32);
  44. ASSERT_THROW(vector.get(32), storm::exceptions::OutOfRangeException);
  45. ASSERT_THROW(vector.set(32), storm::exceptions::OutOfRangeException);
  46. }
  47. TEST(BitVectorTest, Resize) {
  48. storm::storage::BitVector vector(32);
  49. for (uint_fast64_t i = 0; i < 32; ++i) {
  50. vector.set(i);
  51. }
  52. vector.resize(70);
  53. ASSERT_EQ(70, vector.size());
  54. ASSERT_EQ(32, vector.getNumberOfSetBits());
  55. for (uint_fast64_t i = 0; i < 32; ++i) {
  56. ASSERT_TRUE(vector.get(i));
  57. }
  58. bool result;
  59. for (uint_fast64_t i = 32; i < 70; ++i) {
  60. result = true;
  61. ASSERT_NO_THROW(result = vector.get(i));
  62. ASSERT_FALSE(result);
  63. }
  64. vector.resize(72, true);
  65. ASSERT_EQ(72, vector.size());
  66. ASSERT_EQ(34, vector.getNumberOfSetBits());
  67. for (uint_fast64_t i = 0; i < 32; ++i) {
  68. ASSERT_TRUE(vector.get(i));
  69. }
  70. for (uint_fast64_t i = 32; i < 70; ++i) {
  71. result = true;
  72. ASSERT_NO_THROW(result = vector.get(i));
  73. ASSERT_FALSE(result);
  74. }
  75. for (uint_fast64_t i = 70; i < 72; ++i) {
  76. ASSERT_TRUE(vector.get(i));
  77. }
  78. vector.resize(16, 0);
  79. ASSERT_EQ(16, vector.size());
  80. ASSERT_EQ(16, vector.getNumberOfSetBits());
  81. for (uint_fast64_t i = 0; i < 16; ++i) {
  82. ASSERT_TRUE(vector.get(i));
  83. }
  84. vector.resize(65, 1);
  85. ASSERT_EQ(65, vector.size());
  86. ASSERT_TRUE(vector.full());
  87. }
  88. TEST(BitVectorTest, OperatorAnd) {
  89. storm::storage::BitVector vector1(32);
  90. storm::storage::BitVector vector2(32);
  91. for (int i = 0; i < 32; ++i) {
  92. vector1.set(i, i % 2 == 0);
  93. vector2.set(i, i % 2 == 1);
  94. }
  95. vector1.set(31);
  96. vector2.set(31);
  97. storm::storage::BitVector andResult = vector1 & vector2;
  98. for (uint_fast64_t i = 0; i < 31; ++i) {
  99. ASSERT_FALSE(andResult.get(i));
  100. }
  101. ASSERT_TRUE(andResult.get(31));
  102. }
  103. TEST(BitVectorTest, OperatorAndEqual) {
  104. storm::storage::BitVector vector1(32);
  105. storm::storage::BitVector vector2(32);
  106. for (int i = 0; i < 32; ++i) {
  107. vector1.set(i, i % 2 == 0);
  108. vector2.set(i, i % 2 == 1);
  109. }
  110. vector1.set(31);
  111. vector2.set(31);
  112. vector1 &= vector2;
  113. for (uint_fast64_t i = 0; i < 31; ++i) {
  114. ASSERT_FALSE(vector1.get(i));
  115. }
  116. ASSERT_TRUE(vector1.get(31));
  117. }
  118. TEST(BitVectorTest, OperatorOr) {
  119. storm::storage::BitVector vector1(32);
  120. storm::storage::BitVector vector2(32);
  121. for (uint_fast64_t i = 0; i < 32; ++i) {
  122. vector1.set(i, i % 2 == 0);
  123. vector2.set(i, i % 2 == 1);
  124. }
  125. vector1.set(31, false);
  126. vector2.set(31, false);
  127. storm::storage::BitVector orResult = vector1 | vector2;
  128. for (uint_fast64_t i = 0; i < 31; ++i) {
  129. ASSERT_TRUE(orResult.get(i));
  130. }
  131. ASSERT_FALSE(orResult.get(31));
  132. }
  133. TEST(BitVectorTest, OperatorOrEqual) {
  134. storm::storage::BitVector vector1(32);
  135. storm::storage::BitVector vector2(32);
  136. for (uint_fast64_t i = 0; i < 32; ++i) {
  137. vector1.set(i, i % 2 == 0);
  138. vector2.set(i, i % 2 == 1);
  139. }
  140. vector1.set(31, false);
  141. vector2.set(31, false);
  142. vector1 |= vector2;
  143. for (uint_fast64_t i = 0; i < 31; ++i) {
  144. ASSERT_TRUE(vector1.get(i));
  145. }
  146. ASSERT_FALSE(vector1.get(31));
  147. }
  148. TEST(BitVectorTest, OperatorXor) {
  149. storm::storage::BitVector vector1(32);
  150. storm::storage::BitVector vector2(32);
  151. for (uint_fast64_t i = 0; i < 32; ++i) {
  152. vector1.set(i);
  153. vector2.set(i, i % 2 == 1);
  154. }
  155. storm::storage::BitVector vector3 = vector1 ^ vector2;
  156. storm::storage::BitVector vector4 = ~vector2;
  157. storm::storage::BitVector vector5 = vector1 ^ vector1;
  158. for (uint_fast64_t i = 0; i < 32; ++i) {
  159. ASSERT_EQ(vector3.get(i), vector4.get(i));
  160. ASSERT_FALSE(vector5.get(i));
  161. }
  162. }
  163. TEST(BitVectorTest, OperatorModulo) {
  164. storm::storage::BitVector vector1(32);
  165. storm::storage::BitVector vector2(32);
  166. for (uint_fast64_t i = 0; i < 15; ++i) {
  167. vector2.set(i, i % 2 == 0);
  168. }
  169. vector1.set(2);
  170. vector1.set(5);
  171. vector1.set(6);
  172. storm::storage::BitVector moduloResult = vector1 % vector2;
  173. ASSERT_EQ(moduloResult.size(), 8);
  174. ASSERT_EQ(moduloResult.getNumberOfSetBits(), 2);
  175. for (uint_fast64_t i = 0; i < 8; ++i) {
  176. if (i == 1 || i == 3) {
  177. ASSERT_TRUE(moduloResult.get(i));
  178. } else {
  179. ASSERT_FALSE(moduloResult.get(i));
  180. }
  181. }
  182. storm::storage::BitVector vector3(31);
  183. for (uint_fast64_t i = 0; i < 15; ++i) {
  184. vector3.set(i, i % 2 == 0);
  185. }
  186. ASSERT_THROW(vector1 % vector3, storm::exceptions::InvalidArgumentException);
  187. }
  188. TEST(BitVectorTest, OperatorNot) {
  189. storm::storage::BitVector vector1(32);
  190. storm::storage::BitVector vector2(32);
  191. for (uint_fast64_t i = 0; i < 32; ++i) {
  192. vector1.set(i, i % 2 == 0);
  193. vector2.set(i, i % 2 == 1);
  194. }
  195. storm::storage::BitVector notResult = ~vector2;
  196. for (uint_fast64_t i = 0; i < 32; ++i) {
  197. ASSERT_EQ(vector1.get(i), notResult.get(i));
  198. }
  199. }
  200. TEST(BitVectorTest, Complement) {
  201. storm::storage::BitVector vector1(32);
  202. storm::storage::BitVector vector2(32);
  203. for (uint_fast64_t i = 0; i < 32; ++i) {
  204. vector1.set(i, i % 2 == 0);
  205. vector2.set(i, i % 2 == 1);
  206. }
  207. vector2.complement();
  208. for (uint_fast64_t i = 0; i < 32; ++i) {
  209. ASSERT_EQ(vector1.get(i), vector2.get(i));
  210. }
  211. }
  212. TEST(BitVectorTest, Implies) {
  213. storm::storage::BitVector vector1(32);
  214. storm::storage::BitVector vector2(32, true);
  215. for (uint_fast64_t i = 0; i < 32; ++i) {
  216. vector1.set(i, i % 2 == 0);
  217. }
  218. vector2.set(31, false);
  219. vector2.set(30, false);
  220. storm::storage::BitVector impliesResult = vector1.implies(vector2);
  221. for (uint_fast64_t i = 0; i < 30; ++i) {
  222. ASSERT_TRUE(impliesResult.get(i));
  223. }
  224. ASSERT_FALSE(impliesResult.get(30));
  225. ASSERT_TRUE(impliesResult.get(31));
  226. }
  227. TEST(BitVectorTest, Subset) {
  228. storm::storage::BitVector vector1(32);
  229. storm::storage::BitVector vector2(32, true);
  230. for (uint_fast64_t i = 0; i < 32; ++i) {
  231. vector1.set(i, i % 2 == 0);
  232. }
  233. ASSERT_TRUE(vector1.isSubsetOf(vector2));
  234. vector2.set(16, false);
  235. ASSERT_FALSE(vector1.isSubsetOf(vector2));
  236. }
  237. TEST(BitVectorTest, Disjoint) {
  238. storm::storage::BitVector vector1(32);
  239. storm::storage::BitVector vector2(32);
  240. for (uint_fast64_t i = 0; i < 32; ++i) {
  241. vector1.set(i, i % 2 == 0);
  242. vector2.set(i, i % 2 == 1);
  243. }
  244. ASSERT_TRUE(vector1.isDisjointFrom(vector2));
  245. vector2.set(16, true);
  246. ASSERT_FALSE(vector1.isDisjointFrom(vector2));
  247. }
  248. TEST(BitVectorTest, Empty) {
  249. storm::storage::BitVector vector(32);
  250. ASSERT_TRUE(vector.empty());
  251. vector.set(17, true);
  252. ASSERT_FALSE(vector.empty());
  253. vector.set(17, false);
  254. vector.set(18, false);
  255. ASSERT_TRUE(vector.empty());
  256. }
  257. TEST(BitVectorTest, Full) {
  258. storm::storage::BitVector vector(32, true);
  259. ASSERT_TRUE(vector.full());
  260. vector.set(17, false);
  261. ASSERT_FALSE(vector.full());
  262. vector.set(17, true);
  263. vector.set(18, true);
  264. ASSERT_TRUE(vector.full());
  265. }
  266. TEST(BitVectorTest, NumberOfSetBits) {
  267. storm::storage::BitVector vector(32);
  268. for (uint_fast64_t i = 0; i < 32; ++i) {
  269. vector.set(i, i % 2 == 0);
  270. }
  271. ASSERT_EQ(16, vector.getNumberOfSetBits());
  272. }
  273. TEST(BitVectorTest, NumberOfSetBitsBeforeIndex) {
  274. storm::storage::BitVector vector(32);
  275. for (uint_fast64_t i = 0; i < 32; ++i) {
  276. vector.set(i, i % 2 == 0);
  277. }
  278. ASSERT_EQ(7, vector.getNumberOfSetBitsBeforeIndex(14));
  279. }
  280. TEST(BitVectorTest, BeginEnd) {
  281. storm::storage::BitVector vector(32);
  282. ASSERT_TRUE(vector.begin() == vector.end());
  283. vector.set(17);
  284. ASSERT_FALSE(vector.begin() == vector.end());
  285. vector.set(17, false);
  286. ASSERT_TRUE(vector.begin() == vector.end());
  287. }
  288. TEST(BitVectorTest, NextSetIndex) {
  289. storm::storage::BitVector vector(32);
  290. vector.set(14);
  291. vector.set(17);
  292. ASSERT_EQ(14, vector.getNextSetIndex(14));
  293. ASSERT_EQ(17, vector.getNextSetIndex(15));
  294. ASSERT_EQ(17, vector.getNextSetIndex(16));
  295. ASSERT_EQ(17, vector.getNextSetIndex(17));
  296. ASSERT_EQ(vector.size(), vector.getNextSetIndex(18));
  297. }
  298. TEST(BitVectorTest, Iterator) {
  299. storm::storage::BitVector vector(32);
  300. for (uint_fast64_t i = 0; i < 32; ++i) {
  301. vector.set(i, i % 2 == 0);
  302. }
  303. for (auto bit : vector) {
  304. ASSERT_TRUE(bit % 2 == 0);
  305. }
  306. }