package bitset32 import ( "math" "math/rand" "testing" "time" "github.com/bits-and-blooms/bitset" ) var opc int var opcT int var ft string = "%v|pos:%9X|opc:%9X|result:%v\n" var rt string = "%v|opc:%9d|pass:%9d\n" var opNum = 100 var bitTestNum = 10000 var randNum = math.MaxInt32 / 2 func TestBitSet(t *testing.T) { var b32 = New(1) var b64 = bitset.New(1) res := true pos := uint(0) rand.Seed(time.Now().Unix()) for j := 0; j < 1; j++ { // Test, Set, for i := 0; i < opNum; i++ { pos = uint(rand.Intn(randNum)) b32 = b32.Set(uint(pos)) b64 = b64.Set(uint(pos)) res = b32.Test(pos) == b64.Test(pos) opc++ if res { opcT++ } else { t.Log(ft, time.Now(), pos, opc, res) } } // Clear for i := 0; i < opNum; i++ { pos = uint(rand.Intn(randNum)) b32 = b32.Clear(uint(pos)) b64 = b64.Clear(uint(pos)) res = b32.Test(pos) == b64.Test(pos) opc++ if res { opcT++ } else { t.Logf(ft, time.Now().Unix(), pos, opc, res) } } // SetTo = Set + Clear for i := 0; i < opNum; i++ { pos = uint(rand.Intn(randNum)) value := rand.Intn(randNum)%2 == 1 b32 = b32.SetTo(uint(pos), value) b64 = b64.SetTo(uint(pos), value) res = b32.Test(pos) == b64.Test(pos) opc++ if res { opcT++ } else { t.Logf(ft, time.Now().Unix(), pos, opc, res) } } // Flip for i := 0; i < opNum; i++ { pos = uint(rand.Intn(randNum)) b64 = b64.Flip(pos) b32 = b32.Flip(pos) res = isSameBitset(b32, b64) opc++ if res { opcT++ } else { t.Logf(ft, time.Now().Unix(), pos, opc, res) } } // Flip Range for i := 0; i < opNum; i++ { start, end := uint(rand.Intn(randNum)), uint(rand.Intn(randNum)) if start > end { start, end = end, start } b64 = b64.FlipRange(start, end) b32 = b32.FlipRange(start, end) res = isSameBitset(b32, b64) opc++ if res { opcT++ } else { t.Logf(ft, time.Now().Unix(), pos, opc, res) } } // InsertAt for i := 0; i < opNum; i++ { pos = uint(rand.Intn(randNum)) b64 = b64.InsertAt(pos) b32 = b32.InsertAt(pos) res = isSameBitset(b32, b64) opc++ if res { opcT++ } else { t.Logf(ft, time.Now().Unix(), pos, opc, res) } } // DeleteAt for i := 0; i < opNum; i++ { pos = uint(rand.Intn(randNum)) if b64.Len() < pos || b32.Len() < pos { continue } b64 = b64.DeleteAt(pos) b32 = b32.DeleteAt(pos) res = isSameBitset(b32, b64) opc++ if res { opcT++ } else { t.Logf(ft, time.Now().Unix(), pos, opc, res) } } // Compact, Shrink for i := 0; i < opNum; i++ { b32 = b32.Compact() b64 = b64.Compact() res = isSameBitset(b32, b64) opc++ if res { opcT++ } else { t.Logf(ft, time.Now().Unix(), pos, opc, res) } } } // Compact b32 = b32.Compact() b64 = b64.Compact() res = isSameBitset(b32, b64) t.Log("Compact:", res) bs64 := &BitSet64{b64} t.Log("Max Count:", b32.MaxConsecutiveOne(0, b32.Len()), bs64.MaxConsecutiveOne(0, b64.Len())) t.Log("String:", b32.String() == b64.String()) t.Logf(rt, time.Now().Unix(), opc, opcT) } func isSameBitset(b32 *BitSet32, b64 *bitset.BitSet) bool { if b32.Len() != b64.Len() { return false } for i := 0; i < bitTestNum; i++ { pos := uint(rand.Intn(randNum)) if b32.Test(pos) != b64.Test(pos) { return false } } return true } /* Running tool: C:\support\go\bin\go.exe test -timeout 30s -run ^TestBitSet$ bitset -v === RUN TestBitSet d:\workspace\DataStruct\go\bitset\bitset_test.go:139: Max Count: 23067608 23067608 d:\workspace\DataStruct\go\bitset\bitset_test.go:140: true d:\workspace\DataStruct\go\bitset\bitset_test.go:141: 1678626066|opc: 800|pass: 800 --- PASS: TestBitSet (23.61s) PASS ok bitset 24.243s */