mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2024-12-04 18:00:19 +01:00
322 lines
5.4 KiB
Go
322 lines
5.4 KiB
Go
|
// 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())
|
||
|
}
|
||
|
}
|
||
|
}
|