// go-qrcode // Copyright 2014 Tom Harwood package bitset import ( rand "math/rand" "testing" ) func TestNewBitset(t *testing.T) { tests := [][]bool{ {}, {b1}, {b0}, {b1, b0}, {b1, b0, b1}, {b0, b0, b1}, } for _, v := range tests { result := New(v...) if !equal(result.Bits(), v) { t.Errorf("%s", result.String()) t.Errorf("%v => %v, want %v", v, result.Bits(), v) } } } func TestAppend(t *testing.T) { randomBools := make([]bool, 128) rng := rand.New(rand.NewSource(1)) for i := 0; i < len(randomBools); i++ { randomBools[i] = rng.Intn(2) == 1 } for i := 0; i < len(randomBools)-1; i++ { a := New(randomBools[0:i]...) b := New(randomBools[i:]...) a.Append(b) if !equal(a.Bits(), randomBools) { t.Errorf("got %v, want %v", a.Bits(), randomBools) } } } func TestAppendByte(t *testing.T) { tests := []struct { initial *Bitset value byte numBits int expected *Bitset }{ { New(), 0x01, 1, New(b1), }, { New(b1), 0x01, 1, New(b1, b1), }, { New(b0), 0x01, 1, New(b0, b1), }, { New(b1, b0, b1, b0, b1, b0, b1), 0xAA, // 0b10101010 2, New(b1, b0, b1, b0, b1, b0, b1, b1, b0), }, { New(b1, b0, b1, b0, b1, b0, b1), 0xAA, // 0b10101010 8, New(b1, b0, b1, b0, b1, b0, b1, b1, b0, b1, b0, b1, b0, b1, b0), }, } for _, test := range tests { test.initial.AppendByte(test.value, test.numBits) if !equal(test.initial.Bits(), test.expected.Bits()) { t.Errorf("Got %v, expected %v", test.initial.Bits(), test.expected.Bits()) } } } func TestAppendUint32(t *testing.T) { tests := []struct { initial *Bitset value uint32 numBits int expected *Bitset }{ { New(), 0xAAAAAAAF, 4, New(b1, b1, b1, b1), }, { New(), 0xFFFFFFFF, 32, New(b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1), }, { New(), 0x0, 32, New(b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0), }, { New(), 0xAAAAAAAA, 32, New(b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0), }, { New(), 0xAAAAAAAA, 31, New(b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0, b1, b0), }, } for _, test := range tests { test.initial.AppendUint32(test.value, test.numBits) if !equal(test.initial.Bits(), test.expected.Bits()) { t.Errorf("Got %v, expected %v", test.initial.Bits(), test.expected.Bits()) } } } func TestAppendBools(t *testing.T) { randomBools := make([]bool, 128) rng := rand.New(rand.NewSource(1)) for i := 0; i < len(randomBools); i++ { randomBools[i] = rng.Intn(2) == 1 } for i := 0; i < len(randomBools)-1; i++ { result := New(randomBools[0:i]...) result.AppendBools(randomBools[i:]...) if !equal(result.Bits(), randomBools) { t.Errorf("got %v, want %v", result.Bits(), randomBools) } } } func BenchmarkShortAppend(b *testing.B) { bitset := New() for i := 0; i < b.N; i++ { bitset.AppendBools(b0, b1, b0, b1, b0, b1, b0) } } func TestLen(t *testing.T) { randomBools := make([]bool, 128) rng := rand.New(rand.NewSource(1)) for i := 0; i < len(randomBools); i++ { randomBools[i] = rng.Intn(2) == 1 } for i := 0; i < len(randomBools)-1; i++ { result := New(randomBools[0:i]...) if result.Len() != i { t.Errorf("Len = %d, want %d", result.Len(), i) } } } func TestAt(t *testing.T) { test := []bool{b0, b1, b0, b1, b0, b1, b1, b0, b1} bitset := New(test...) for i, v := range test { result := bitset.At(i) if result != test[i] { t.Errorf("bitset[%d] => %t, want %t", i, result, v) } } } func equal(a []bool, b []bool) bool { if len(a) != len(b) { return false } for i := 0; i < len(a); i++ { if a[i] != b[i] { return false } } return true } func TestExample(t *testing.T) { b := New() // {} b.AppendBools(true, true, false) // {1, 1, 0} b.AppendBools(true) // {1, 1, 0, 1} b.AppendByte(0x02, 4) // {1, 1, 0, 1, 0, 0, 1, 0} expected := []bool{b1, b1, b0, b1, b0, b0, b1, b0} if !equal(b.Bits(), expected) { t.Errorf("Got %v, expected %v", b.Bits(), expected) } } func TestByteAt(t *testing.T) { data := []bool{b0, b1, b0, b1, b0, b1, b1, b0, b1} tests := []struct { index int expected byte }{ { 0, 0x56, }, { 1, 0xad, }, { 2, 0x2d, }, { 5, 0x0d, }, { 8, 0x01, }, } for _, test := range tests { b := New() b.AppendBools(data...) result := b.ByteAt(test.index) if result != test.expected { t.Errorf("Got %#x, expected %#x", result, test.expected) } } } func TestSubstr(t *testing.T) { data := []bool{b0, b1, b0, b1, b0, b1, b1, b0} tests := []struct { start int end int expected []bool }{ { 0, 8, []bool{b0, b1, b0, b1, b0, b1, b1, b0}, }, { 0, 0, []bool{}, }, { 0, 1, []bool{b0}, }, { 2, 4, []bool{b0, b1}, }, } for _, test := range tests { b := New() b.AppendBools(data...) result := b.Substr(test.start, test.end) expected := New() expected.AppendBools(test.expected...) if !result.Equals(expected) { t.Errorf("Got %s, expected %s", result.String(), expected.String()) } } }