@@ -20,6 +20,7 @@ import (
20
20
"testing"
21
21
22
22
"github.com/stretchr/testify/assert"
23
+ "github.com/stretchr/testify/require"
23
24
)
24
25
25
26
func TestBitOperations (t * testing.T ) {
@@ -142,6 +143,28 @@ func TestIsEmpty(t *testing.T) {
142
143
assert .False (t , ba .IsEmpty ())
143
144
}
144
145
146
+ func TestCount (t * testing.T ) {
147
+ ba := newBitArray (500 )
148
+ assert .Equal (t , 0 , ba .Count ())
149
+
150
+ require .NoError (t , ba .SetBit (0 ))
151
+ assert .Equal (t , 1 , ba .Count ())
152
+
153
+ require .NoError (t , ba .SetBit (40 ))
154
+ require .NoError (t , ba .SetBit (64 ))
155
+ require .NoError (t , ba .SetBit (100 ))
156
+ require .NoError (t , ba .SetBit (200 ))
157
+ require .NoError (t , ba .SetBit (469 ))
158
+ require .NoError (t , ba .SetBit (500 ))
159
+ assert .Equal (t , 7 , ba .Count ())
160
+
161
+ require .NoError (t , ba .ClearBit (200 ))
162
+ assert .Equal (t , 6 , ba .Count ())
163
+
164
+ ba .Reset ()
165
+ assert .Equal (t , 0 , ba .Count ())
166
+ }
167
+
145
168
func TestClear (t * testing.T ) {
146
169
ba := newBitArray (10 )
147
170
@@ -195,6 +218,53 @@ func BenchmarkGetBit(b *testing.B) {
195
218
}
196
219
}
197
220
221
+ func TestGetSetBits (t * testing.T ) {
222
+ ba := newBitArray (1000 )
223
+ buf := make ([]uint64 , 0 , 5 )
224
+
225
+ require .NoError (t , ba .SetBit (1 ))
226
+ require .NoError (t , ba .SetBit (4 ))
227
+ require .NoError (t , ba .SetBit (8 ))
228
+ require .NoError (t , ba .SetBit (63 ))
229
+ require .NoError (t , ba .SetBit (64 ))
230
+ require .NoError (t , ba .SetBit (200 ))
231
+ require .NoError (t , ba .SetBit (1000 ))
232
+
233
+ assert .Equal (t , []uint64 (nil ), ba .GetSetBits (0 , nil ))
234
+ assert .Equal (t , []uint64 {}, ba .GetSetBits (0 , []uint64 {}))
235
+
236
+ assert .Equal (t , []uint64 {1 , 4 , 8 , 63 , 64 }, ba .GetSetBits (0 , buf ))
237
+ assert .Equal (t , []uint64 {63 , 64 , 200 , 1000 }, ba .GetSetBits (10 , buf ))
238
+ assert .Equal (t , []uint64 {63 , 64 , 200 , 1000 }, ba .GetSetBits (63 , buf ))
239
+ assert .Equal (t , []uint64 {200 , 1000 }, ba .GetSetBits (128 , buf ))
240
+
241
+ require .NoError (t , ba .ClearBit (4 ))
242
+ require .NoError (t , ba .ClearBit (64 ))
243
+ assert .Equal (t , []uint64 {1 , 8 , 63 , 200 , 1000 }, ba .GetSetBits (0 , buf ))
244
+ assert .Empty (t , ba .GetSetBits (1001 , buf ))
245
+
246
+ ba .Reset ()
247
+ assert .Empty (t , ba .GetSetBits (0 , buf ))
248
+ }
249
+
250
+ func BenchmarkGetSetBits (b * testing.B ) {
251
+ numItems := uint64 (168000 )
252
+
253
+ ba := newBitArray (numItems )
254
+ for i := uint64 (0 ); i < numItems ; i ++ {
255
+ if i % 13 == 0 || i % 5 == 0 {
256
+ require .NoError (b , ba .SetBit (i ))
257
+ }
258
+ }
259
+
260
+ buf := make ([]uint64 , 0 , ba .Capacity ())
261
+
262
+ b .ResetTimer ()
263
+ for i := 0 ; i < b .N ; i ++ {
264
+ ba .GetSetBits (0 , buf )
265
+ }
266
+ }
267
+
198
268
func TestEquality (t * testing.T ) {
199
269
ba := newBitArray (s + 1 )
200
270
other := newBitArray (s + 1 )
0 commit comments