1 #include <gtest/gtest.h>
2 #include <marnav/utils/bitset.hpp>
7 using namespace marnav::utils
;
9 class Test_utils_bitset
: public ::testing::Test
12 template <class T
> std::string
to_string(const bitset
<T
> & bits
)
15 result
.reserve(bits
.size());
16 for (auto const & b
: bits
)
22 TEST_F(Test_utils_bitset
, uint8__construction_bit_size
)
24 bitset
<uint8_t> b
{16};
26 // 0 8 16 24 32 40 48 56
27 // +-------+-------+-------+-------+-------+-------+-------+-------
28 EXPECT_STREQ("0000000000000000", to_string(b
).c_str());
31 TEST_F(Test_utils_bitset
, uint8__construction_container_iterator
)
35 vector
<uint8_t> v
{0xaa, 0x55};
36 bitset
<uint8_t> b(begin(v
), end(v
));
38 // 0 8 16 24 32 40 48 56
39 // +-------+-------+-------+-------+-------+-------+-------+-------
40 EXPECT_STREQ("1010101001010101", to_string(b
).c_str());
43 TEST_F(Test_utils_bitset
, uint8__construction_container_move
)
45 bitset
<uint8_t> b(std::vector
<uint8_t>{0xaa, 0x55});
47 // 0 8 16 24 32 40 48 56
48 // +-------+-------+-------+-------+-------+-------+-------+-------
49 EXPECT_STREQ("1010101001010101", to_string(b
).c_str());
52 TEST_F(Test_utils_bitset
, const_iterator_comparison_less
)
54 bitset
<uint8_t> b
{16};
65 TEST_F(Test_utils_bitset
, const_iterator_comparison_greater
)
67 bitset
<uint8_t> b
{16};
78 TEST_F(Test_utils_bitset
, uint8__append_single_bits
)
83 // 0 8 16 24 32 40 48 56
84 // +-------+-------+-------+-------+-------+-------+-------+-------
85 EXPECT_STREQ("1", to_string(bits
).c_str());
93 // 0 8 16 24 32 40 48 56
94 // +-------+-------+-------+-------+-------+-------+-------+-------
95 EXPECT_STREQ("1001", to_string(bits
).c_str());
98 bitset
<uint8_t> bits
{8};
100 // 0 8 16 24 32 40 48 56
101 // +-------+-------+-------+-------+-------+-------+-------+-------
102 EXPECT_STREQ("000000001", to_string(bits
).c_str());
106 TEST_F(Test_utils_bitset
, uint8__append_block_size_plus_one
)
108 bitset
<uint8_t> bits
;
109 bits
.append(0x00000001, 9);
110 // 0 8 16 24 32 40 48 56
111 // +-------+-------+-------+-------+-------+-------+-------+-------
112 EXPECT_STREQ("000000001", to_string(bits
).c_str());
115 TEST_F(Test_utils_bitset
, uint8__append_multiple_bits
)
118 bitset
<uint8_t> bits
;
119 bits
.append(0x00000001, 2);
120 // 0 8 16 24 32 40 48 56
121 // +-------+-------+-------+-------+-------+-------+-------+-------
122 EXPECT_STREQ("01", to_string(bits
).c_str());
125 bitset
<uint8_t> bits
;
126 bits
.append(0x00000001, 1);
127 bits
.append(0x00000001, 2);
128 bits
.append(0x00000001, 3);
129 bits
.append(0x00000001, 4);
130 bits
.append(0x00000001, 5);
131 bits
.append(0x00000001, 6);
132 bits
.append(0x00000001, 7);
133 bits
.append(0x00000001, 8);
134 bits
.append(0x00000001, 9);
135 bits
.append(0x00000001, 10);
136 // 0 8 16 24 32 40 48 56
137 // +-------+-------+-------+-------+-------+-------+-------+-------
139 "1010010001000010000010000001000000010000000010000000001", to_string(bits
).c_str());
142 bitset
<uint8_t> bits
;
144 // 0 8 16 24 32 40 48 56
145 // +-------+-------+-------+-------+-------+-------+-------+-------
146 // 111010011110101011001111111111
147 const uint32_t value
= 981119999; // 30 bits of information
149 bits
.append(value
, 32);
151 // 0 8 16 24 32 40 48 56
152 // +-------+-------+-------+-------+-------+-------+-------+-------
153 EXPECT_STREQ("00111010011110101011001111111111", to_string(bits
).c_str());
156 bitset
<uint8_t> bits
;
158 // 0 8 16 24 32 40 48 56
159 // +-------+-------+-------+-------+-------+-------+-------+-------
160 // 111010011110101011001111111111
161 const uint32_t value
= 981119999; // 30 bits of information
163 bits
.append(value
, 30);
165 // 0 8 16 24 32 40 48 56
166 // +-------+-------+-------+-------+-------+-------+-------+-------
167 EXPECT_STREQ("111010011110101011001111111111", to_string(bits
).c_str());
171 TEST_F(Test_utils_bitset
, uint8__set_single_bits
)
174 bitset
<uint8_t> bits
{64};
176 // 0 8 16 24 32 40 48 56
177 // +-------+-------+-------+-------+-------+-------+-------+-------
178 EXPECT_STREQ("1000000000000000000000000000000000000000000000000000000000000000",
179 to_string(bits
).c_str());
182 bitset
<uint8_t> bits
{64};
184 // 0 8 16 24 32 40 48 56
185 // +-------+-------+-------+-------+-------+-------+-------+-------
186 EXPECT_STREQ("0100000000000000000000000000000000000000000000000000000000000000",
187 to_string(bits
).c_str());
190 bitset
<uint8_t> bits
{64};
192 // 0 8 16 24 32 40 48 56
193 // +-------+-------+-------+-------+-------+-------+-------+-------
194 EXPECT_STREQ("0000000000000001000000000000000000000000000000000000000000000000",
195 to_string(bits
).c_str());
198 bitset
<uint8_t> bits
{64};
200 // 0 8 16 24 32 40 48 56
201 // +-------+-------+-------+-------+-------+-------+-------+-------
202 EXPECT_STREQ("0000000000000000100000000000000000000000000000000000000000000000",
203 to_string(bits
).c_str());
207 TEST_F(Test_utils_bitset
, uint8__set_block_size_plus_one
)
209 bitset
<uint8_t> bits
{32};
210 bits
.set(0x00000001, 0, 9);
211 // 0 8 16 24 32 40 48 56
212 // +-------+-------+-------+-------+-------+-------+-------+-------
213 EXPECT_STREQ("00000000100000000000000000000000", to_string(bits
).c_str());
216 TEST_F(Test_utils_bitset
, uint8__set_multiple_bits
)
219 bitset
<uint8_t> bits
{64};
220 bits
.set(0x00000001, 0, 2);
221 // 0 8 16 24 32 40 48 56
222 // +-------+-------+-------+-------+-------+-------+-------+-------
223 EXPECT_STREQ("0100000000000000000000000000000000000000000000000000000000000000",
224 to_string(bits
).c_str());
227 bitset
<uint8_t> bits
{64};
228 bits
.set(0x00000001, 1, 2);
229 // 0 8 16 24 32 40 48 56
230 // +-------+-------+-------+-------+-------+-------+-------+-------
231 EXPECT_STREQ("0010000000000000000000000000000000000000000000000000000000000000",
232 to_string(bits
).c_str());
235 bitset
<uint8_t> bits
{64};
236 bits
.set(0x00000001, 15, 2);
237 // 0 8 16 24 32 40 48 56
238 // +-------+-------+-------+-------+-------+-------+-------+-------
239 EXPECT_STREQ("0000000000000000100000000000000000000000000000000000000000000000",
240 to_string(bits
).c_str());
243 bitset
<uint8_t> bits
{64};
244 bits
.set(0x00000001, 16, 2);
245 // 0 8 16 24 32 40 48 56
246 // +-------+-------+-------+-------+-------+-------+-------+-------
247 EXPECT_STREQ("0000000000000000010000000000000000000000000000000000000000000000",
248 to_string(bits
).c_str());
251 bitset
<uint8_t> bits
{64};
253 // 0 8 16 24 32 40 48 56
254 // +-------+-------+-------+-------+-------+-------+-------+-------
255 // 111010011110101011001111111111
256 const uint32_t value
= 981119999; // 30 bits of information
258 bits
.set(value
, 8, 30);
259 // 0 8 16 24 32 40 48 56
260 // +-------+-------+-------+-------+-------+-------+-------+-------
261 EXPECT_STREQ("0000000011101001111010101100111111111100000000000000000000000000",
262 to_string(bits
).c_str());
266 TEST_F(Test_utils_bitset
, uint8__get_multiple_bits_ending_on_block_boundary
)
268 bitset
<uint8_t> bits
{64};
270 // 0 8 16 24 32 40 48 56
271 // +-------+-------+-------+-------+-------+-------+-------+-------
272 ASSERT_STREQ("0000011100000000000000000000000000000000000000000000000000000000",
273 to_string(bits
).c_str());
275 uint32_t value
= 0xffffffff;
276 bits
.get(value
, 0, 6);
277 EXPECT_EQ(1u, value
);
280 TEST_F(Test_utils_bitset
, uint8__get_multiple_bits_completely_within_block
)
282 bitset
<uint8_t> bits
{64};
283 bits
.set(0xff, 4, 3);
284 // 0 8 16 24 32 40 48 56
285 // +-------+-------+-------+-------+-------+-------+-------+-------
286 ASSERT_STREQ("0000111000000000000000000000000000000000000000000000000000000000",
287 to_string(bits
).c_str());
289 uint32_t value
= 0xffffffff;
290 bits
.get(value
, 0, 6);
291 EXPECT_EQ(3u, value
);
294 TEST_F(Test_utils_bitset
, uint8__get_multiple_bits_fractions_of_two_blocks
)
296 bitset
<uint8_t> bits
{64};
297 bits
.set(0xff, 4, 6);
298 // 0 8 16 24 32 40 48 56
299 // +-------+-------+-------+-------+-------+-------+-------+-------
300 ASSERT_STREQ("0000111111000000000000000000000000000000000000000000000000000000",
301 to_string(bits
).c_str());
303 uint32_t value
= 0xffffffff;
304 bits
.get(value
, 0, 6);
305 EXPECT_EQ(3u, value
);
308 TEST_F(Test_utils_bitset
, uint8__get_multiple_bits_using_three_blocks
)
310 bitset
<uint8_t> bits
{64};
311 bits
.set(0xffff, 4, 14);
312 // 0 8 16 24 32 40 48 56
313 // +-------+-------+-------+-------+-------+-------+-------+-------
314 ASSERT_STREQ("0000111111111111110000000000000000000000000000000000000000000000",
315 to_string(bits
).c_str());
317 uint32_t value
= 0xffffffff;
318 bits
.get(value
, 2, 6);
319 EXPECT_EQ(15u, value
);
322 TEST_F(Test_utils_bitset
, uint8__set_enum
)
324 enum class ids
: uint8_t { A
= 1, B
, C
};
326 bitset
<uint8_t> bits
{64};
327 bits
.set(ids::A
, 4, 6);
328 // 0 8 16 24 32 40 48 56
329 // +-------+-------+-------+-------+-------+-------+-------+-------
330 ASSERT_STREQ("0000000001000000000000000000000000000000000000000000000000000000",
331 to_string(bits
).c_str());
334 TEST_F(Test_utils_bitset
, uint16__get_multiple_bits_ending_on_block_boundary
)
336 bitset
<uint16_t> bits
{64};
337 bits
.set(0xff, 13, 3);
338 // 0 8 16 24 32 40 48 56
339 // +-------+-------+-------+-------+-------+-------+-------+-------
340 ASSERT_STREQ("0000000000000111000000000000000000000000000000000000000000000000",
341 to_string(bits
).c_str());
343 uint32_t value
= 0xffffffff;
344 bits
.get(value
, 8, 6);
345 EXPECT_EQ(1u, value
);
348 TEST_F(Test_utils_bitset
, uint16__get_multiple_bits_completely_within_block
)
350 bitset
<uint16_t> bits
{64};
352 // 0 8 16 24 32 40 48 56
353 // +-------+-------+-------+-------+-------+-------+-------+-------
354 ASSERT_STREQ("0000111000000000000000000000000000000000000000000000000000000000",
355 to_string(bits
).c_str());
357 uint32_t value
= 0xffffffff;
358 bits
.get(value
, 0, 6);
359 EXPECT_EQ(3u, value
);
362 TEST_F(Test_utils_bitset
, uint16__get_multiple_bits_fractions_of_two_blocks
)
364 bitset
<uint16_t> bits
{64};
365 bits
.set(0xffff, 4, 6);
366 // 0 8 16 24 32 40 48 56
367 // +-------+-------+-------+-------+-------+-------+-------+-------
368 ASSERT_STREQ("0000111111000000000000000000000000000000000000000000000000000000",
369 to_string(bits
).c_str());
371 uint32_t value
= 0xffffffff;
372 bits
.get(value
, 0, 6);
373 EXPECT_EQ(3u, value
);
376 TEST_F(Test_utils_bitset
, uint16__get_multiple_bits_using_three_blocks
)
378 bitset
<uint16_t> bits
{64};
380 bits
.set(val
, 4, 40);
381 // 0 8 16 24 32 40 48 56
382 // +-------+-------+-------+-------+-------+-------+-------+-------
383 ASSERT_STREQ("0000111111111111111111111111111111111111111100000000000000000000",
384 to_string(bits
).c_str());
386 uint32_t value
= 0xffffffff;
387 bits
.get(value
, 2, 6);
388 EXPECT_EQ(15u, value
);
391 TEST_F(Test_utils_bitset
, uint8__copy_constructor
)
393 bitset
<uint8_t> bits
{32};
396 bitset
<uint8_t> copy(bits
);
398 // 0 8 16 24 32 40 48 56
399 // +-------+-------+-------+-------+
400 ASSERT_STREQ("00000100000000000000000000000000", to_string(bits
).c_str());
401 EXPECT_STREQ("00000100000000000000000000000000", to_string(copy
).c_str());
404 TEST_F(Test_utils_bitset
, uint8__assignment
)
406 bitset
<uint8_t> bits
{32};
409 bitset
<uint8_t> copy
{16};
410 ASSERT_STREQ("0000000000000000", to_string(copy
).c_str());
413 // 0 8 16 24 32 40 48 56
414 // +-------+-------+-------+-------+
415 ASSERT_STREQ("00000100000000000000000000000000", to_string(bits
).c_str());
416 EXPECT_STREQ("00000100000000000000000000000000", to_string(copy
).c_str());
419 template <class T
> bitset
<uint8_t> get_test_data(unsigned int size
)
421 bitset
<T
> result
{size
};
428 TEST_F(Test_utils_bitset
, uint8__as_return_value_small
)
430 auto bits
= get_test_data
<uint8_t>(32);
432 // 0 8 16 24 32 40 48 56
433 // +-------+-------+-------+-------+
434 ASSERT_STREQ("00000100000000000000000000000000", to_string(bits
).c_str());
437 TEST_F(Test_utils_bitset
, uint8__as_return_value_medium
)
439 auto bits
= get_test_data
<uint8_t>(168);
441 // 0 8 16 24 32 40 48 56
442 // +-------+-------+-------+-------+
443 ASSERT_STREQ("00000100000000000000000000000000000000000000000000000000000000000000000000000"
444 "00000000000000000000000000000000000000000000000000000000000000000000000000000"
446 to_string(bits
).c_str());
449 TEST_F(Test_utils_bitset
, uint8__set_multiple_values
)
451 bitset
<uint8_t> bits
{64};
453 // 0 8 16 24 32 40 48 56
454 // +-------+-------+-------+-------+-------+-------+-------+-------
455 ASSERT_STREQ("0000000000000000000000000000000000000000000000000000000000000000",
456 to_string(bits
).c_str());
460 // 0 8 16 24 32 40 48 56
461 // +-------+-------+-------+-------+-------+-------+-------+-------
462 ASSERT_STREQ("0000010000000000000000000000000000000000000000000000000000000000",
463 to_string(bits
).c_str());
467 // 0 8 16 24 32 40 48 56
468 // +-------+-------+-------+-------+-------+-------+-------+-------
469 ASSERT_STREQ("0000010100000000000000000000000000000000000000000000000000000000",
470 to_string(bits
).c_str());
473 TEST_F(Test_utils_bitset
, uint8__flip
)
475 bitset
<uint8_t> bits
{64};
477 // 0 8 16 24 32 40 48 56
478 // +-------+-------+-------+-------+-------+-------+-------+-------
479 EXPECT_STREQ("0000000000000000000000000000000000000000000000000000000000000000",
480 to_string(bits
).c_str());
483 // 0 8 16 24 32 40 48 56
484 // +-------+-------+-------+-------+-------+-------+-------+-------
485 EXPECT_STREQ("1000000000000000000000000000000000000000000000000000000000000000",
486 to_string(bits
).c_str());
489 // 0 8 16 24 32 40 48 56
490 // +-------+-------+-------+-------+-------+-------+-------+-------
491 EXPECT_STREQ("1000000000100000000000000000000000000000000000000000000000000000",
492 to_string(bits
).c_str());
495 // 0 8 16 24 32 40 48 56
496 // +-------+-------+-------+-------+-------+-------+-------+-------
497 EXPECT_STREQ("1000000000100000000000000000000010000000000000000000000000000000",
498 to_string(bits
).c_str());
501 TEST_F(Test_utils_bitset
, uint8__append_bitset_to_empty_bitset
)
509 // 0 8 16 24 32 40 48 56
511 EXPECT_STREQ("01010101", to_string(b0
).c_str());
512 EXPECT_STREQ("01010101", to_string(b1
).c_str());
515 TEST_F(Test_utils_bitset
, uint8__append_bitset_to_nonempty_bitset
)
524 // 0 8 16 24 32 40 48 56
526 EXPECT_STREQ("01010101", to_string(b0
).c_str());
527 EXPECT_STREQ("1010101001010101", to_string(b1
).c_str());
530 TEST_F(Test_utils_bitset
, uint8__set_bitset_to_empty_bitset
)
538 // 0 8 16 24 32 40 48 56
540 EXPECT_STREQ("01010101", to_string(b0
).c_str());
541 EXPECT_STREQ("01010101", to_string(b1
).c_str());
544 TEST_F(Test_utils_bitset
, uint8__set_bitset_to_empty_bitset_mixed_type_bitsets_8_to_16
)
552 // 0 8 16 24 32 40 48 56
554 EXPECT_STREQ("01010101", to_string(b0
).c_str());
555 EXPECT_STREQ("01010101", to_string(b1
).c_str());
558 TEST_F(Test_utils_bitset
, uint8__set_bitset_to_empty_bitset_mixed_type_bitsets_16_to_8
)
566 // 0 8 16 24 32 40 48 56
568 EXPECT_STREQ("01010101", to_string(b0
).c_str());
569 EXPECT_STREQ("01010101", to_string(b1
).c_str());
572 TEST_F(Test_utils_bitset
, uint8__set_bitset_to_nonempty_bitset
)
581 // 0 8 16 24 32 40 48 56
583 EXPECT_STREQ("01010101", to_string(b0
).c_str());
584 EXPECT_STREQ("01010101", to_string(b1
).c_str());
587 TEST_F(Test_utils_bitset
, uint8__set_bit
)
589 bitset
<uint8_t> b
{8};
591 EXPECT_STREQ("00000000", to_string(b
).c_str());
593 EXPECT_STREQ("10000000", to_string(b
).c_str());
595 EXPECT_STREQ("10000001", to_string(b
).c_str());
597 EXPECT_STREQ("00000001", to_string(b
).c_str());
599 EXPECT_STREQ("00000000", to_string(b
).c_str());
602 TEST_F(Test_utils_bitset
, uint8__reset_all
)
604 bitset
<uint8_t> b
{8};
607 EXPECT_STREQ("10101010", to_string(b
).c_str());
609 EXPECT_STREQ("00000000", to_string(b
).c_str());
612 TEST_F(Test_utils_bitset
, uint8__all
)
615 bitset
<uint8_t> b
{8};
616 EXPECT_FALSE(b
.all());
619 bitset
<uint8_t> b
{8};
621 EXPECT_FALSE(b
.all());
624 bitset
<uint8_t> b
{8};
626 EXPECT_FALSE(b
.all());
629 bitset
<uint8_t> b
{8};
631 EXPECT_TRUE(b
.all());
635 TEST_F(Test_utils_bitset
, uint8__any
)
638 bitset
<uint8_t> b
{8};
639 EXPECT_FALSE(b
.any());
642 bitset
<uint8_t> b
{8};
644 EXPECT_TRUE(b
.any());
647 bitset
<uint8_t> b
{8};
649 EXPECT_TRUE(b
.any());
652 bitset
<uint8_t> b
{8};
654 EXPECT_TRUE(b
.any());
658 TEST_F(Test_utils_bitset
, uint8__none
)
661 bitset
<uint8_t> b
{8};
662 EXPECT_TRUE(b
.none());
665 bitset
<uint8_t> b
{8};
667 EXPECT_FALSE(b
.none());
670 bitset
<uint8_t> b
{8};
672 EXPECT_FALSE(b
.none());
675 bitset
<uint8_t> b
{8};
677 EXPECT_FALSE(b
.none());
681 TEST_F(Test_utils_bitset
, uint8__count
)
684 bitset
<uint8_t> b
{8};
685 EXPECT_EQ(0u, b
.count());
688 bitset
<uint8_t> b
{8};
690 EXPECT_EQ(4u, b
.count());
693 bitset
<uint8_t> b
{8};
695 EXPECT_EQ(1u, b
.count());
698 bitset
<uint8_t> b
{8};
700 EXPECT_EQ(8u, b
.count());
704 TEST_F(Test_utils_bitset
, uint8__comparison_equal
)
721 EXPECT_FALSE(a
== c
);
722 EXPECT_FALSE(c
== a
);
723 EXPECT_FALSE(b
== c
);
724 EXPECT_FALSE(c
== b
);
727 TEST_F(Test_utils_bitset
, uint8__comparison_not_equal
)
737 EXPECT_FALSE(a
!= a
);
738 EXPECT_FALSE(b
!= b
);
739 EXPECT_FALSE(c
!= c
);
741 EXPECT_FALSE(a
!= b
);
742 EXPECT_FALSE(b
!= a
);
750 TEST_F(Test_utils_bitset
, uint8__append_bits_exceeds_type
)
752 bitset
<uint8_t> b
{32};
753 const uint8_t data
= 0xff;
754 EXPECT_ANY_THROW(b
.append(data
, 16));
757 TEST_F(Test_utils_bitset
, uint8__set_bits_exceeds_type
)
759 bitset
<uint8_t> b
{32};
760 const uint8_t data
= 0xff;
761 EXPECT_ANY_THROW(b
.set(data
, 0, 16));
764 TEST_F(Test_utils_bitset
, uint8__get_bits_out_of_range
)
766 bitset
<uint8_t> b
{32};
768 EXPECT_ANY_THROW(b
.get(data
, 0, 16));
769 EXPECT_ANY_THROW(b
.get(data
, 28, 8));
770 EXPECT_NO_THROW(b
.get(data
, 0, 0));
773 TEST_F(Test_utils_bitset
, uint8__get_uint32
)
775 bitset
<uint8_t> b
{64};
776 b
.set(0xaaaaaaaa, 0, 32);
777 b
.set(0xaaaaaaaa, 32, 32);
778 const uint32_t expected
= 0xaaaaaaaa;
781 EXPECT_EQ(expected
, data
);
784 TEST_F(Test_utils_bitset
, uint8__get_bit_out_of_range
)
786 bitset
<uint8_t> b
{32};
788 EXPECT_ANY_THROW(b
.get_bit(64));
791 TEST_F(Test_utils_bitset
, uint8__set_bit_out_of_range
)
793 bitset
<uint8_t> b
{32};
795 EXPECT_ANY_THROW(b
.set_bit(64, 1));