1#include <gtest/gtest.h>
2
3#include <c10/util/Bitset.h>
4#include <c10/util/irange.h>
5
6using c10::utils::bitset;
7
8TEST(BitsetTest, givenEmptyBitset_whenGettingBit_thenIsZero) {
9 bitset b;
10 for (size_t i = 0; i < bitset::NUM_BITS(); ++i) {
11 EXPECT_FALSE(b.get(i));
12 }
13}
14
15TEST(BitsetTest, givenEmptyBitset_whenUnsettingBit_thenIsZero) {
16 bitset b;
17 b.unset(4);
18 for (size_t i = 0; i < bitset::NUM_BITS(); ++i) {
19 EXPECT_FALSE(b.get(i));
20 }
21}
22
23TEST(BitsetTest, givenEmptyBitset_whenSettingAndUnsettingBit_thenIsZero) {
24 bitset b;
25 b.set(4);
26 b.unset(4);
27 for (size_t i = 0; i < bitset::NUM_BITS(); ++i) {
28 EXPECT_FALSE(b.get(i));
29 }
30}
31
32TEST(BitsetTest, givenEmptyBitset_whenSettingBit_thenIsSet) {
33 bitset b;
34 b.set(6);
35 EXPECT_TRUE(b.get(6));
36}
37
38TEST(BitsetTest, givenEmptyBitset_whenSettingBit_thenOthersStayUnset) {
39 bitset b;
40 b.set(6);
41 for (const auto i : c10::irange(6)) {
42 EXPECT_FALSE(b.get(i));
43 }
44 for (size_t i = 7; i < bitset::NUM_BITS(); ++i) {
45 EXPECT_FALSE(b.get(i));
46 }
47}
48
49TEST(BitsetTest, givenNonemptyBitset_whenSettingBit_thenIsSet) {
50 bitset b;
51 b.set(6);
52 b.set(30);
53 EXPECT_TRUE(b.get(30));
54}
55
56TEST(BitsetTest, givenNonemptyBitset_whenSettingBit_thenOthersStayAtOldValue) {
57 bitset b;
58 b.set(6);
59 b.set(30);
60 for (const auto i : c10::irange(6)) {
61 EXPECT_FALSE(b.get(i));
62 }
63 for (const auto i : c10::irange(7, 30)) {
64 EXPECT_FALSE(b.get(i));
65 }
66 for (size_t i = 31; i < bitset::NUM_BITS(); ++i) {
67 EXPECT_FALSE(b.get(i));
68 }
69}
70
71TEST(BitsetTest, givenNonemptyBitset_whenUnsettingBit_thenIsUnset) {
72 bitset b;
73 b.set(6);
74 b.set(30);
75 b.unset(6);
76 EXPECT_FALSE(b.get(6));
77}
78
79TEST(
80 BitsetTest,
81 givenNonemptyBitset_whenUnsettingBit_thenOthersStayAtOldValue) {
82 bitset b;
83 b.set(6);
84 b.set(30);
85 b.unset(6);
86 for (const auto i : c10::irange(30)) {
87 EXPECT_FALSE(b.get(i));
88 }
89 EXPECT_TRUE(b.get(30));
90 for (size_t i = 31; i < bitset::NUM_BITS(); ++i) {
91 EXPECT_FALSE(b.get(i));
92 }
93}
94
95struct IndexCallbackMock final {
96 std::vector<size_t> called_for_indices;
97
98 void operator()(size_t index) {
99 called_for_indices.push_back(index);
100 }
101
102 void expect_was_called_for_indices(std::vector<size_t> expected_indices) {
103 EXPECT_EQ(expected_indices.size(), called_for_indices.size());
104 for (const auto i : c10::irange(expected_indices.size())) {
105 EXPECT_EQ(expected_indices[i], called_for_indices[i]);
106 }
107 }
108};
109
110TEST(BitsetTest, givenEmptyBitset_whenCallingForEachBit_thenDoesntCall) {
111 IndexCallbackMock callback;
112 bitset b;
113 b.for_each_set_bit(callback);
114 callback.expect_was_called_for_indices({});
115}
116
117TEST(
118 BitsetTest,
119 givenBitsetWithOneBitSet_whenCallingForEachBit_thenCallsForEachBit) {
120 IndexCallbackMock callback;
121 bitset b;
122 b.set(5);
123 b.for_each_set_bit(callback);
124 callback.expect_was_called_for_indices({5});
125}
126
127TEST(
128 BitsetTest,
129 givenBitsetWithMultipleBitsSet_whenCallingForEachBit_thenCallsForEachBit) {
130 IndexCallbackMock callback;
131 bitset b;
132 b.set(5);
133 b.set(2);
134 b.set(25);
135 b.set(32);
136 b.set(50);
137 b.set(0);
138 b.unset(25);
139 b.set(10);
140 b.for_each_set_bit(callback);
141 callback.expect_was_called_for_indices({0, 2, 5, 10, 32, 50});
142}
143