Skip to content

Commit 43b5bc8

Browse files
Add comprehensive test cases for BitmapRangeIterator covering edge cases and complex scenarios (#29)
* Initial plan * Add comprehensive test cases for BitmapRangeIterator covering edge cases and complex scenarios Co-authored-by: SergiusTheBest <4660722+SergiusTheBest@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: SergiusTheBest <4660722+SergiusTheBest@users.noreply.github.com>
1 parent 659e9b5 commit 43b5bc8

File tree

1 file changed

+229
-0
lines changed

1 file changed

+229
-0
lines changed

test/BitmapRangeIterator.cpp

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,234 @@ SCENARIO("BitmapRangeIterator")
3939
REQUIRE(!iterator.next());
4040
}
4141
}
42+
43+
WHEN("set bitmap to [1,0,1,0,1,0,0,0,0,0]")
44+
{
45+
bitmap.setBits(0, 1);
46+
bitmap.setBits(2, 1);
47+
bitmap.setBits(4, 1);
48+
49+
THEN("iterator returns ranges: {0,1}, {2,1}, {4,1}")
50+
{
51+
REQUIRE(*iterator.next() == std::make_pair(0UL, 1UL));
52+
REQUIRE(*iterator.next() == std::make_pair(2UL, 1UL));
53+
REQUIRE(*iterator.next() == std::make_pair(4UL, 1UL));
54+
REQUIRE(!iterator.next());
55+
}
56+
}
57+
58+
WHEN("set bitmap to [0,0,0,0,0,0,0,1,1,1]")
59+
{
60+
bitmap.setBits(7, 3);
61+
62+
THEN("iterator returns ranges: {7,3}")
63+
{
64+
REQUIRE(*iterator.next() == std::make_pair(7UL, 3UL));
65+
REQUIRE(!iterator.next());
66+
}
67+
}
68+
69+
WHEN("set bitmap to [1,1,1,1,1,1,1,1,1,1]")
70+
{
71+
bitmap.setBits(0, 10);
72+
73+
THEN("iterator returns ranges: {0,10}")
74+
{
75+
REQUIRE(*iterator.next() == std::make_pair(0UL, 10UL));
76+
REQUIRE(!iterator.next());
77+
}
78+
}
79+
80+
WHEN("set bitmap to [1,1,0,0,1,1,1,0,0,1]")
81+
{
82+
bitmap.setBits(0, 2);
83+
bitmap.setBits(4, 3);
84+
bitmap.setBits(9, 1);
85+
86+
THEN("iterator returns ranges: {0,2}, {4,3}, {9,1}")
87+
{
88+
REQUIRE(*iterator.next() == std::make_pair(0UL, 2UL));
89+
REQUIRE(*iterator.next() == std::make_pair(4UL, 3UL));
90+
REQUIRE(*iterator.next() == std::make_pair(9UL, 1UL));
91+
REQUIRE(!iterator.next());
92+
}
93+
}
94+
95+
WHEN("set bitmap to [0,0,0,0,0,0,0,0,0,1]")
96+
{
97+
bitmap.setBits(9, 1);
98+
99+
THEN("iterator returns ranges: {9,1}")
100+
{
101+
REQUIRE(*iterator.next() == std::make_pair(9UL, 1UL));
102+
REQUIRE(!iterator.next());
103+
}
104+
}
105+
}
106+
107+
GIVEN("initialized Bitmap with size 32")
108+
{
109+
kf::Bitmap<PagedPool> bitmap;
110+
REQUIRE_NT_SUCCESS(bitmap.initialize(32));
111+
112+
auto iterator = bitmap.rangeIterator();
113+
114+
WHEN("set alternating bits [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]")
115+
{
116+
for (ULONG i = 0; i < 32; i += 2)
117+
{
118+
bitmap.setBits(i, 1);
119+
}
120+
121+
THEN("iterator returns 16 ranges of single bits")
122+
{
123+
for (ULONG i = 0; i < 32; i += 2)
124+
{
125+
REQUIRE(*iterator.next() == std::make_pair(i, 1UL));
126+
}
127+
REQUIRE(!iterator.next());
128+
}
129+
}
130+
131+
WHEN("set large contiguous range [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0]")
132+
{
133+
bitmap.setBits(4, 24);
134+
135+
THEN("iterator returns ranges: {4,24}")
136+
{
137+
REQUIRE(*iterator.next() == std::make_pair(4UL, 24UL));
138+
REQUIRE(!iterator.next());
139+
}
140+
}
141+
142+
WHEN("set bits with large gaps [1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1]")
143+
{
144+
bitmap.setBits(0, 1);
145+
bitmap.setBits(10, 1);
146+
bitmap.setBits(20, 1);
147+
bitmap.setBits(31, 1);
148+
149+
THEN("iterator returns ranges: {0,1}, {10,1}, {20,1}, {31,1}")
150+
{
151+
REQUIRE(*iterator.next() == std::make_pair(0UL, 1UL));
152+
REQUIRE(*iterator.next() == std::make_pair(10UL, 1UL));
153+
REQUIRE(*iterator.next() == std::make_pair(20UL, 1UL));
154+
REQUIRE(*iterator.next() == std::make_pair(31UL, 1UL));
155+
REQUIRE(!iterator.next());
156+
}
157+
}
158+
}
159+
160+
GIVEN("initialized Bitmap with size 10 and iterator with custom starting position")
161+
{
162+
kf::Bitmap<PagedPool> bitmap;
163+
REQUIRE_NT_SUCCESS(bitmap.initialize(10));
164+
165+
WHEN("set bitmap to [1,1,0,1,1,0,1,1,1,0] and start iterator from index 3")
166+
{
167+
bitmap.setBits(0, 2);
168+
bitmap.setBits(3, 2);
169+
bitmap.setBits(6, 3);
170+
171+
auto iterator = bitmap.rangeIterator(3);
172+
173+
THEN("iterator returns ranges starting from index 3: {3,2}, {6,3}")
174+
{
175+
REQUIRE(*iterator.next() == std::make_pair(3UL, 2UL));
176+
REQUIRE(*iterator.next() == std::make_pair(6UL, 3UL));
177+
REQUIRE(!iterator.next());
178+
}
179+
}
180+
181+
WHEN("set bitmap to [1,1,1,1,1,1,1,1,1,1] and start iterator from index 5")
182+
{
183+
bitmap.setBits(0, 10);
184+
185+
auto iterator = bitmap.rangeIterator(5);
186+
187+
THEN("iterator returns ranges starting from index 5: {5,5}")
188+
{
189+
REQUIRE(*iterator.next() == std::make_pair(5UL, 5UL));
190+
REQUIRE(!iterator.next());
191+
}
192+
}
193+
194+
WHEN("start iterator from index beyond bitmap size")
195+
{
196+
bitmap.setBits(0, 10);
197+
198+
auto iterator = bitmap.rangeIterator(15);
199+
200+
THEN("iterator returns no ranges")
201+
{
202+
REQUIRE(!iterator.next());
203+
}
204+
}
205+
206+
WHEN("start iterator from last index with bit set")
207+
{
208+
bitmap.setBits(9, 1);
209+
210+
auto iterator = bitmap.rangeIterator(9);
211+
212+
THEN("iterator returns ranges: {9,1}")
213+
{
214+
REQUIRE(*iterator.next() == std::make_pair(9UL, 1UL));
215+
REQUIRE(!iterator.next());
216+
}
217+
}
218+
}
219+
220+
GIVEN("edge cases with different bitmap patterns")
221+
{
222+
kf::Bitmap<PagedPool> bitmap;
223+
REQUIRE_NT_SUCCESS(bitmap.initialize(16));
224+
225+
WHEN("set only first and last bits [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]")
226+
{
227+
bitmap.setBits(0, 1);
228+
bitmap.setBits(15, 1);
229+
230+
auto iterator = bitmap.rangeIterator();
231+
232+
THEN("iterator returns ranges: {0,1}, {15,1}")
233+
{
234+
REQUIRE(*iterator.next() == std::make_pair(0UL, 1UL));
235+
REQUIRE(*iterator.next() == std::make_pair(15UL, 1UL));
236+
REQUIRE(!iterator.next());
237+
}
238+
}
239+
240+
WHEN("set bits creating two adjacent ranges [0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0]")
241+
{
242+
bitmap.setBits(2, 4);
243+
244+
auto iterator = bitmap.rangeIterator();
245+
246+
THEN("iterator returns single range: {2,4}")
247+
{
248+
REQUIRE(*iterator.next() == std::make_pair(2UL, 4UL));
249+
REQUIRE(!iterator.next());
250+
}
251+
}
252+
253+
WHEN("set complex pattern [0,1,1,0,0,1,0,1,1,1,0,0,1,1,0,0]")
254+
{
255+
bitmap.setBits(1, 2);
256+
bitmap.setBits(5, 1);
257+
bitmap.setBits(7, 3);
258+
bitmap.setBits(12, 2);
259+
260+
auto iterator = bitmap.rangeIterator();
261+
262+
THEN("iterator returns ranges: {1,2}, {5,1}, {7,3}, {12,2}")
263+
{
264+
REQUIRE(*iterator.next() == std::make_pair(1UL, 2UL));
265+
REQUIRE(*iterator.next() == std::make_pair(5UL, 1UL));
266+
REQUIRE(*iterator.next() == std::make_pair(7UL, 3UL));
267+
REQUIRE(*iterator.next() == std::make_pair(12UL, 2UL));
268+
REQUIRE(!iterator.next());
269+
}
270+
}
42271
}
43272
}

0 commit comments

Comments
 (0)