| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 | 
							- /*
 
-  * Public Domain Software
 
-  *
 
-  * I (Matthias Ladkau) am the author of the source code in this file.
 
-  * I have placed the source code in this file in the public domain.
 
-  *
 
-  * For further information see: http://creativecommons.org/publicdomain/zero/1.0/
 
-  */
 
- package bitutil
 
- import (
 
- 	"fmt"
 
- 	"math"
 
- 	"testing"
 
- )
 
- func TestListPacking(t *testing.T) {
 
- 	mylist := make([]uint64, 7)
 
- 	mylist[0] = 3
 
- 	mylist[1] = 7
 
- 	mylist[2] = 63
 
- 	mylist[3] = math.MaxUint8
 
- 	mylist[4] = math.MaxUint16
 
- 	mylist[5] = math.MaxUint32
 
- 	mylist[6] = math.MaxUint64
 
- 	res := UnpackList(PackList(mylist, 3))
 
- 	if res[0] != 3 {
 
- 		t.Error("Unexpected result:", res)
 
- 		return
 
- 	}
 
- 	res = UnpackList(PackList(mylist, 7))
 
- 	if fmt.Sprint(res[:2]) != "[3 7]" {
 
- 		t.Error("Unexpected result:", res[:2])
 
- 		return
 
- 	}
 
- 	res = UnpackList(PackList(mylist, 63))
 
- 	if fmt.Sprint(res[:3]) != "[3 7 63]" {
 
- 		t.Error("Unexpected result:", res[:3])
 
- 		return
 
- 	}
 
- 	res = UnpackList(PackList(mylist, math.MaxUint8))
 
- 	if fmt.Sprint(res[:4]) != "[3 7 63 255]" {
 
- 		t.Error("Unexpected result:", res[:4])
 
- 		return
 
- 	}
 
- 	res = UnpackList(PackList(mylist, math.MaxUint16))
 
- 	if fmt.Sprint(res[:5]) != "[3 7 63 255 65535]" {
 
- 		t.Error("Unexpected result:", res[:5])
 
- 		return
 
- 	}
 
- 	res = UnpackList(PackList(mylist, math.MaxUint32))
 
- 	if fmt.Sprint(res[:6]) != "[3 7 63 255 65535 4294967295]" {
 
- 		t.Error("Unexpected result:", res[:6])
 
- 		return
 
- 	}
 
- 	res = UnpackList(PackList(mylist, math.MaxUint64))
 
- 	if fmt.Sprint(res[:7]) != "[3 7 63 255 65535 4294967295 18446744073709551615]" {
 
- 		t.Error("Unexpected result:", res[:7])
 
- 		return
 
- 	}
 
- 	res = UnpackList(PackList([]uint64{10, 12, 80}, 80))
 
- 	if fmt.Sprint(res) != "[10 12 80]" {
 
- 		t.Error("Unexpected result:", res)
 
- 		return
 
- 	}
 
- }
 
- func TestListPacking8(t *testing.T) {
 
- 	list1 := PackList3Bit([]byte{1, 2, 3, 4, 5, 6, 7})
 
- 	list2 := PackList16Bit([]uint16{1, 2, 3, 4})
 
- 	if len(list1) != 4 || len(list2) != 9 {
 
- 		t.Error("Unexpected lengths:", len(list1), len(list2))
 
- 		return
 
- 	}
 
- 	res1 := UnpackList(list1)
 
- 	res2 := UnpackList(list2)
 
- 	if fmt.Sprint(res1) != "[1 2 3 4 5 6 7]" {
 
- 		t.Error("Unexpected result:", res1)
 
- 		return
 
- 	}
 
- 	if fmt.Sprint(res2) != "[1 2 3 4]" {
 
- 		t.Error("Unexpected result:", res2)
 
- 		return
 
- 	}
 
- 	if UnpackList("") != nil {
 
- 		t.Error("Unexpected result")
 
- 		return
 
- 	}
 
- }
 
- func TestVarBitListPacking8(t *testing.T) {
 
- 	scale := 3
 
- 	testlist := make([]uint8, scale)
 
- 	for i := 0; i < scale; i++ {
 
- 		testlist[i] = math.MaxUint8
 
- 	}
 
- 	res := PackList8Bit(testlist)
 
- 	if len(res) != scale+1 {
 
- 		t.Error("Unexpected length:", len(res))
 
- 		return
 
- 	}
 
- 	res2 := UnpackBigList(res)
 
- 	for i := 0; i < scale; i++ {
 
- 		if testlist[i] != uint8(res2[i]) {
 
- 			t.Error("Unexpected result at:", i)
 
- 		}
 
- 	}
 
- }
 
- func TestVarBitListPacking16(t *testing.T) {
 
- 	scale := 3
 
- 	testlist := make([]uint16, scale)
 
- 	for i := 0; i < scale; i++ {
 
- 		testlist[i] = math.MaxUint16
 
- 	}
 
- 	res := PackList16Bit(testlist)
 
- 	if len(res) != scale*2+1 {
 
- 		t.Error("Unexpected length:", len(res))
 
- 		return
 
- 	}
 
- 	res2 := UnpackBigList(res)
 
- 	for i := 0; i < scale; i++ {
 
- 		if testlist[i] != uint16(res2[i]) {
 
- 			t.Error("Unexpected result at:", i)
 
- 		}
 
- 	}
 
- }
 
- func TestVarBitListPacking32(t *testing.T) {
 
- 	scale := 3
 
- 	testlist := make([]uint32, scale)
 
- 	for i := 0; i < scale; i++ {
 
- 		testlist[i] = math.MaxUint32
 
- 	}
 
- 	res := PackList32Bit(testlist)
 
- 	if len(res) != scale*4+1 {
 
- 		t.Error("Unexpected length:", len(res))
 
- 		return
 
- 	}
 
- 	res2 := UnpackBigList(res)
 
- 	for i := 0; i < scale; i++ {
 
- 		if testlist[i] != uint32(res2[i]) {
 
- 			t.Error("Unexpected result at:", i)
 
- 		}
 
- 	}
 
- }
 
- func TestVarBitListPacking64(t *testing.T) {
 
- 	scale := 3
 
- 	testlist := make([]uint64, scale)
 
- 	for i := 0; i < scale; i++ {
 
- 		testlist[i] = math.MaxUint64
 
- 	}
 
- 	res := PackList64Bit(testlist)
 
- 	if len(res) != scale*8+1 {
 
- 		t.Error("Unexpected length:", len(res))
 
- 		return
 
- 	}
 
- 	res2 := UnpackBigList(res)
 
- 	for i := 0; i < scale; i++ {
 
- 		if testlist[i] != uint64(res2[i]) {
 
- 			t.Error("Unexpected result at:", i)
 
- 		}
 
- 	}
 
- }
 
- func TestSmallListPacking(t *testing.T) {
 
- 	// Test simple cases
 
- 	if PackList2Bit([]byte{}) != "" {
 
- 		t.Error("Unexpected result")
 
- 		return
 
- 	}
 
- 	if PackList3Bit([]byte{}) != "" {
 
- 		t.Error("Unexpected result")
 
- 		return
 
- 	}
 
- 	if PackList6Bit([]byte{}) != "" {
 
- 		t.Error("Unexpected result")
 
- 		return
 
- 	}
 
- 	if string(UnpackSmallList("")) != "" {
 
- 		t.Error("Unexpected result")
 
- 		return
 
- 	}
 
- 	// Simulates a gob encoded string
 
- 	if string(UnpackSmallList(string([]byte{0x00}))) != string(0x00) {
 
- 		t.Error("Unexpected result")
 
- 		return
 
- 	}
 
- 	// Test normal cases
 
- 	checkListAndPresentation2bit(t, []byte{1, 2, 3, 1, 2, 3}, []byte{0x5b, 0x6c}, 2)
 
- 	checkListAndPresentation2bit(t, []byte{1}, []byte{0x50}, 1)
 
- 	checkListAndPresentation2bit(t, []byte{1, 2}, []byte{0x58}, 1)
 
- 	checkListAndPresentation2bit(t, []byte{1, 2, 3}, []byte{0x5B}, 1)
 
- 	checkListAndPresentation2bit(t, []byte{1, 2, 3, 3}, []byte{0x5B, 0xC0}, 2)
 
- 	checkListAndPresentation2bit(t, []byte{1, 2, 3, 3, 2}, []byte{0x5B, 0xE0}, 2)
 
- 	checkListAndPresentation2bit(t, []byte{1, 2, 3, 3, 2, 1, 3}, []byte{0x5B, 0xE7}, 2)
 
- 	checkListAndPresentation3bit(t, []byte{1, 2, 3, 1, 2, 3}, []byte{0x8A, 0x19, 0x13}, 3)
 
- 	checkListAndPresentation3bit(t, []byte{1}, []byte{0x88}, 1)
 
- 	checkListAndPresentation3bit(t, []byte{1, 2}, []byte{0x8A}, 1)
 
- 	checkListAndPresentation3bit(t, []byte{1, 2, 3}, []byte{0x8A, 0x18}, 2)
 
- 	checkListAndPresentation3bit(t, []byte{1, 2, 3, 3}, []byte{0x8A, 0x1B}, 2)
 
- 	checkListAndPresentation3bit(t, []byte{1, 2, 3, 4, 5, 6, 7}, []byte{0x8A, 0x1C, 0x2E, 0x38}, 4)
 
- 	checkListAndPresentation6bit(t, []byte{1, 2, 3, 1, 2, 3})
 
- 	checkListAndPresentation6bit(t, []byte{1})
 
- 	checkListAndPresentation6bit(t, []byte{1, 2})
 
- 	checkListAndPresentation6bit(t, []byte{1, 2, 3})
 
- 	checkListAndPresentation6bit(t, []byte{1, 2, 3, 3})
 
- 	checkListAndPresentation6bit(t, []byte{1, 2, 3, 4, 35, 45, 63})
 
- }
 
- func checkListAndPresentation2bit(t *testing.T, list []byte, packedlist []byte, packedLen int) {
 
- 	res := PackList2Bit(list)
 
- 	if res != string(packedlist) {
 
- 		t.Errorf("Unexpected result: %X", []byte(res))
 
- 		return
 
- 	}
 
- 	if len(res) != packedLen {
 
- 		t.Error("Unexpected size", len(res))
 
- 		return
 
- 	}
 
- 	if dres := UnpackSmallList(res); string(dres) != string(list) {
 
- 		t.Errorf("Unexpected result: %X", []byte(dres))
 
- 		return
 
- 	}
 
- }
 
- func checkListAndPresentation3bit(t *testing.T, list []byte, packedlist []byte, packedLen int) {
 
- 	res := PackList3Bit(list)
 
- 	if res != string(packedlist) {
 
- 		t.Errorf("Unexpected result: %X", []byte(res))
 
- 		return
 
- 	}
 
- 	if len(res) != packedLen {
 
- 		t.Error("Unexpected size", len(res))
 
- 		return
 
- 	}
 
- 	if dres := UnpackSmallList(res); string(dres) != string(list) {
 
- 		t.Errorf("Unexpected result: %X", []byte(dres))
 
- 		return
 
- 	}
 
- }
 
- func checkListAndPresentation6bit(t *testing.T, list []byte) {
 
- 	res := PackList6Bit(list)
 
- 	packedlist := make([]byte, len(list))
 
- 	copy(packedlist, list)
 
- 	packedlist[0] = packedlist[0] | 0xC0
 
- 	if res != string(packedlist) {
 
- 		t.Errorf("Unexpected result: %X vs %X", []byte(res), packedlist)
 
- 		return
 
- 	}
 
- 	if len(res) != len(list) {
 
- 		t.Error("Unexpected size", len(res))
 
- 		return
 
- 	}
 
- 	if dres := UnpackSmallList(res); string(dres) != string(list) {
 
- 		t.Errorf("Unexpected result: %X", []byte(dres))
 
- 		return
 
- 	}
 
- }
 
- func TestList2byte2bit(t *testing.T) {
 
- 	if res := list2byte2bit(0x01, 0x2, 0x03, 0x01); res != 0x6D {
 
- 		t.Errorf("Unexpected result: %X", res)
 
- 		return
 
- 	}
 
- 	if res := list2byte3bitAndHeader(0x00, 0x07, 0x03); res != 0x3B {
 
- 		t.Errorf("Unexpected result: %X", res)
 
- 		return
 
- 	}
 
- }
 
- func TestByte2list2bit(t *testing.T) {
 
- 	if a, b, c, d := byte2list2bit(0x30); a != 00 || b != 03 || c != 00 || d != 00 {
 
- 		t.Error("Unexpected result:", a, b, c, d)
 
- 		return
 
- 	}
 
- 	if a, b, c, d := byte2list2bit(0x80); a != 02 || b != 00 || c != 00 || d != 00 {
 
- 		t.Error("Unexpected result:", a, b, c, d)
 
- 		return
 
- 	}
 
- 	if a, b, c, d := byte2list2bit(0x01); a != 00 || b != 00 || c != 00 || d != 01 {
 
- 		t.Error("Unexpected result:", a, b, c, d)
 
- 		return
 
- 	}
 
- 	if a, b, c, d := byte2list2bit(0x31); a != 00 || b != 03 || c != 00 || d != 01 {
 
- 		t.Error("Unexpected result:", a, b, c, d)
 
- 		return
 
- 	}
 
- 	if a, b, c, d := byte2list2bit(0x05); a != 00 || b != 00 || c != 01 || d != 01 {
 
- 		t.Error("Unexpected result:", a, b, c, d)
 
- 		return
 
- 	}
 
- }
 
- func TestByte2list3bit(t *testing.T) {
 
- 	if a, b := byte2list3bit(0x01); a != 00 || b != 01 {
 
- 		t.Error("Unexpected result:", a, b)
 
- 		return
 
- 	}
 
- 	if a, b := byte2list3bit(0x31); a != 06 || b != 01 {
 
- 		t.Error("Unexpected result:", a, b)
 
- 		return
 
- 	}
 
- 	if a, b := byte2list3bit(0x05); a != 00 || b != 05 {
 
- 		t.Error("Unexpected result:", a, b)
 
- 		return
 
- 	}
 
- }
 
 
  |