@@ -20,6 +20,7 @@ import (
2020 "testing"
2121
2222 "github.com/stretchr/testify/assert"
23+ "github.com/stretchr/testify/require"
2324)
2425
2526func TestBitOperations (t * testing.T ) {
@@ -142,6 +143,28 @@ func TestIsEmpty(t *testing.T) {
142143 assert .False (t , ba .IsEmpty ())
143144}
144145
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+
145168func TestClear (t * testing.T ) {
146169 ba := newBitArray (10 )
147170
@@ -195,6 +218,53 @@ func BenchmarkGetBit(b *testing.B) {
195218 }
196219}
197220
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+
198268func TestEquality (t * testing.T ) {
199269 ba := newBitArray (s + 1 )
200270 other := newBitArray (s + 1 )
0 commit comments