You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

161 lines
3.4 KiB

package binary
import (
"bytes"
"fmt"
"testing"
. "github.com/tendermint/tendermint/common"
)
func randBitArray(bits uint) (BitArray, []byte) {
src := RandBytes(int((bits + 7) / 8))
bA := NewBitArray(bits)
for i := uint(0); i < uint(len(src)); i++ {
for j := uint(0); j < 8; j++ {
if i*8+j >= bits {
return bA, src
}
setBit := src[i]&(1<<j) > 0
bA.SetIndex(i*8+j, setBit)
}
}
return bA, src
}
func TestReadWriteEmptyBitarray(t *testing.T) {
bA1 := BitArray{}
buf, n, err := new(bytes.Buffer), new(int64), new(error)
WriteBinary(bA1, buf, n, err)
if *err != nil {
t.Error("Failed to write empty bitarray")
}
bA2 := ReadBinary(BitArray{}, buf, n, err).(BitArray)
if *err != nil {
t.Error("Failed to read empty bitarray")
}
if bA2.Bits != 0 {
t.Error("Expected to get bA2.Bits 0")
}
}
func TestReadWriteBitarray(t *testing.T) {
// Make random bA1
bA1, testData := randBitArray(64*10 + 8) // not divisible by 64
// Write it
buf, n, err := new(bytes.Buffer), new(int64), new(error)
WriteBinary(bA1, buf, n, err)
if *err != nil {
t.Error("Failed to write bitarray")
}
fmt.Printf("Bytes: %X", buf.Bytes())
// Read it
bA2 := ReadBinary(BitArray{}, buf, n, err).(BitArray)
if *err != nil {
t.Error("Failed to read bitarray")
}
testData2 := make([]byte, len(testData))
for i := uint(0); i < uint(len(testData)); i++ {
for j := uint(0); j < 8; j++ {
if bA2.GetIndex(i*8 + j) {
testData2[i] |= 1 << j
}
}
}
// Compare testData
if !bytes.Equal(testData, testData2) {
t.Errorf("Not the same:\n%X\n%X", testData, testData2)
}
}
func TestAnd(t *testing.T) {
bA1, _ := randBitArray(51)
bA2, _ := randBitArray(31)
bA3 := bA1.And(bA2)
if bA3.Bits != 31 {
t.Error("Expected min bits", bA3.Bits)
}
if len(bA3.Elems) != len(bA2.Elems) {
t.Error("Expected min elems length")
}
for i := uint(0); i < bA3.Bits; i++ {
expected := bA1.GetIndex(i) && bA2.GetIndex(i)
if bA3.GetIndex(i) != expected {
t.Error("Wrong bit from bA3", i, bA1.GetIndex(i), bA2.GetIndex(i), bA3.GetIndex(i))
}
}
}
func TestOr(t *testing.T) {
bA1, _ := randBitArray(51)
bA2, _ := randBitArray(31)
bA3 := bA1.Or(bA2)
if bA3.Bits != 51 {
t.Error("Expected max bits")
}
if len(bA3.Elems) != len(bA1.Elems) {
t.Error("Expected max elems length")
}
for i := uint(0); i < bA3.Bits; i++ {
expected := bA1.GetIndex(i) || bA2.GetIndex(i)
if bA3.GetIndex(i) != expected {
t.Error("Wrong bit from bA3", i, bA1.GetIndex(i), bA2.GetIndex(i), bA3.GetIndex(i))
}
}
}
func TestSub1(t *testing.T) {
bA1, _ := randBitArray(31)
bA2, _ := randBitArray(51)
bA3 := bA1.Sub(bA2)
if bA3.Bits != bA1.Bits {
t.Error("Expected bA1 bits")
}
if len(bA3.Elems) != len(bA1.Elems) {
t.Error("Expected bA1 elems length")
}
for i := uint(0); i < bA3.Bits; i++ {
expected := bA1.GetIndex(i)
if bA2.GetIndex(i) {
expected = false
}
if bA3.GetIndex(i) != expected {
t.Error("Wrong bit from bA3", i, bA1.GetIndex(i), bA2.GetIndex(i), bA3.GetIndex(i))
}
}
}
func TestSub2(t *testing.T) {
bA1, _ := randBitArray(51)
bA2, _ := randBitArray(31)
bA3 := bA1.Sub(bA2)
if bA3.Bits != bA1.Bits {
t.Error("Expected bA1 bits")
}
if len(bA3.Elems) != len(bA1.Elems) {
t.Error("Expected bA1 elems length")
}
for i := uint(0); i < bA3.Bits; i++ {
expected := bA1.GetIndex(i)
if i < bA2.Bits && bA2.GetIndex(i) {
expected = false
}
if bA3.GetIndex(i) != expected {
t.Error("Wrong bit from bA3")
}
}
}