trie: rework and document key encoding
'encode' and 'decode' are meaningless because the code deals with three encodings. Document the encodings and give a name to each one.
This commit is contained in:
@@ -17,113 +17,88 @@
|
||||
package trie
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"bytes"
|
||||
"testing"
|
||||
|
||||
checker "gopkg.in/check.v1"
|
||||
)
|
||||
|
||||
func TestEncoding(t *testing.T) { checker.TestingT(t) }
|
||||
|
||||
type TrieEncodingSuite struct{}
|
||||
|
||||
var _ = checker.Suite(&TrieEncodingSuite{})
|
||||
|
||||
func (s *TrieEncodingSuite) TestCompactEncode(c *checker.C) {
|
||||
// even compact encode
|
||||
test1 := []byte{1, 2, 3, 4, 5}
|
||||
res1 := compactEncode(test1)
|
||||
c.Assert(res1, checker.DeepEquals, []byte("\x11\x23\x45"))
|
||||
|
||||
// odd compact encode
|
||||
test2 := []byte{0, 1, 2, 3, 4, 5}
|
||||
res2 := compactEncode(test2)
|
||||
c.Assert(res2, checker.DeepEquals, []byte("\x00\x01\x23\x45"))
|
||||
|
||||
//odd terminated compact encode
|
||||
test3 := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
|
||||
res3 := compactEncode(test3)
|
||||
c.Assert(res3, checker.DeepEquals, []byte("\x20\x0f\x1c\xb8"))
|
||||
|
||||
// even terminated compact encode
|
||||
test4 := []byte{15, 1, 12, 11, 8 /*term*/, 16}
|
||||
res4 := compactEncode(test4)
|
||||
c.Assert(res4, checker.DeepEquals, []byte("\x3f\x1c\xb8"))
|
||||
}
|
||||
|
||||
func (s *TrieEncodingSuite) TestCompactHexDecode(c *checker.C) {
|
||||
exp := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16}
|
||||
res := compactHexDecode([]byte("verb"))
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
}
|
||||
|
||||
func (s *TrieEncodingSuite) TestCompactHexEncode(c *checker.C) {
|
||||
exp := []byte("verb")
|
||||
res := compactHexEncode([]byte{7, 6, 6, 5, 7, 2, 6, 2, 16})
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
}
|
||||
|
||||
func (s *TrieEncodingSuite) TestCompactDecode(c *checker.C) {
|
||||
// odd compact decode
|
||||
exp := []byte{1, 2, 3, 4, 5}
|
||||
res := compactDecode([]byte("\x11\x23\x45"))
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
|
||||
// even compact decode
|
||||
exp = []byte{0, 1, 2, 3, 4, 5}
|
||||
res = compactDecode([]byte("\x00\x01\x23\x45"))
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
|
||||
// even terminated compact decode
|
||||
exp = []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
|
||||
res = compactDecode([]byte("\x20\x0f\x1c\xb8"))
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
|
||||
// even terminated compact decode
|
||||
exp = []byte{15, 1, 12, 11, 8 /*term*/, 16}
|
||||
res = compactDecode([]byte("\x3f\x1c\xb8"))
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
}
|
||||
|
||||
func (s *TrieEncodingSuite) TestDecodeCompact(c *checker.C) {
|
||||
exp, _ := hex.DecodeString("012345")
|
||||
res := decodeCompact([]byte{0, 1, 2, 3, 4, 5})
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
|
||||
exp, _ = hex.DecodeString("012345")
|
||||
res = decodeCompact([]byte{0, 1, 2, 3, 4, 5, 16})
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
|
||||
exp, _ = hex.DecodeString("abcdef")
|
||||
res = decodeCompact([]byte{10, 11, 12, 13, 14, 15})
|
||||
c.Assert(res, checker.DeepEquals, exp)
|
||||
}
|
||||
|
||||
func BenchmarkCompactEncode(b *testing.B) {
|
||||
|
||||
testBytes := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
|
||||
for i := 0; i < b.N; i++ {
|
||||
compactEncode(testBytes)
|
||||
func TestHexCompact(t *testing.T) {
|
||||
tests := []struct{ hex, compact []byte }{
|
||||
// empty keys, with and without terminator.
|
||||
{hex: []byte{}, compact: []byte{0x00}},
|
||||
{hex: []byte{16}, compact: []byte{0x20}},
|
||||
// odd length, no terminator
|
||||
{hex: []byte{1, 2, 3, 4, 5}, compact: []byte{0x11, 0x23, 0x45}},
|
||||
// even length, no terminator
|
||||
{hex: []byte{0, 1, 2, 3, 4, 5}, compact: []byte{0x00, 0x01, 0x23, 0x45}},
|
||||
// odd length, terminator
|
||||
{hex: []byte{15, 1, 12, 11, 8, 16 /*term*/}, compact: []byte{0x3f, 0x1c, 0xb8}},
|
||||
// even length, terminator
|
||||
{hex: []byte{0, 15, 1, 12, 11, 8, 16 /*term*/}, compact: []byte{0x20, 0x0f, 0x1c, 0xb8}},
|
||||
}
|
||||
for _, test := range tests {
|
||||
if c := hexToCompact(test.hex); !bytes.Equal(c, test.compact) {
|
||||
t.Errorf("hexToCompact(%x) -> %x, want %x", test.hex, c, test.compact)
|
||||
}
|
||||
if h := compactToHex(test.compact); !bytes.Equal(h, test.hex) {
|
||||
t.Errorf("compactToHex(%x) -> %x, want %x", test.compact, h, test.hex)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkCompactDecode(b *testing.B) {
|
||||
testBytes := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
|
||||
for i := 0; i < b.N; i++ {
|
||||
compactDecode(testBytes)
|
||||
func TestHexKeybytes(t *testing.T) {
|
||||
tests := []struct{ key, hexIn, hexOut []byte }{
|
||||
{key: []byte{}, hexIn: []byte{16}, hexOut: []byte{16}},
|
||||
{key: []byte{}, hexIn: []byte{}, hexOut: []byte{16}},
|
||||
{
|
||||
key: []byte{0x12, 0x34, 0x56},
|
||||
hexIn: []byte{1, 2, 3, 4, 5, 6, 16},
|
||||
hexOut: []byte{1, 2, 3, 4, 5, 6, 16},
|
||||
},
|
||||
{
|
||||
key: []byte{0x12, 0x34, 0x5},
|
||||
hexIn: []byte{1, 2, 3, 4, 0, 5, 16},
|
||||
hexOut: []byte{1, 2, 3, 4, 0, 5, 16},
|
||||
},
|
||||
{
|
||||
key: []byte{0x12, 0x34, 0x56},
|
||||
hexIn: []byte{1, 2, 3, 4, 5, 6},
|
||||
hexOut: []byte{1, 2, 3, 4, 5, 6, 16},
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
if h := keybytesToHex(test.key); !bytes.Equal(h, test.hexOut) {
|
||||
t.Errorf("keybytesToHex(%x) -> %x, want %x", test.key, h, test.hexOut)
|
||||
}
|
||||
if k := hexToKeybytes(test.hexIn); !bytes.Equal(k, test.key) {
|
||||
t.Errorf("hexToKeybytes(%x) -> %x, want %x", test.hexIn, k, test.key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkCompactHexDecode(b *testing.B) {
|
||||
func BenchmarkHexToCompact(b *testing.B) {
|
||||
testBytes := []byte{0, 15, 1, 12, 11, 8, 16 /*term*/}
|
||||
for i := 0; i < b.N; i++ {
|
||||
hexToCompact(testBytes)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkCompactToHex(b *testing.B) {
|
||||
testBytes := []byte{0, 15, 1, 12, 11, 8, 16 /*term*/}
|
||||
for i := 0; i < b.N; i++ {
|
||||
compactToHex(testBytes)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkKeybytesToHex(b *testing.B) {
|
||||
testBytes := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16}
|
||||
for i := 0; i < b.N; i++ {
|
||||
compactHexDecode(testBytes)
|
||||
keybytesToHex(testBytes)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkDecodeCompact(b *testing.B) {
|
||||
func BenchmarkHexToKeybytes(b *testing.B) {
|
||||
testBytes := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16}
|
||||
for i := 0; i < b.N; i++ {
|
||||
decodeCompact(testBytes)
|
||||
hexToKeybytes(testBytes)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user