132 lines
2.2 KiB
Go
132 lines
2.2 KiB
Go
|
// Copyright 2012 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package colltab
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
type lookupStrings struct {
|
||
|
str string
|
||
|
offset int
|
||
|
n int // bytes consumed from input
|
||
|
}
|
||
|
|
||
|
type LookupTest struct {
|
||
|
lookup []lookupStrings
|
||
|
n int
|
||
|
tries ContractTrieSet
|
||
|
}
|
||
|
|
||
|
var lookupTests = []LookupTest{{
|
||
|
[]lookupStrings{
|
||
|
{"abc", 1, 3},
|
||
|
{"a", 0, 0},
|
||
|
{"b", 0, 0},
|
||
|
{"c", 0, 0},
|
||
|
{"d", 0, 0},
|
||
|
},
|
||
|
1,
|
||
|
ContractTrieSet{
|
||
|
{'a', 0, 1, 0xFF},
|
||
|
{'b', 0, 1, 0xFF},
|
||
|
{'c', 'c', 0, 1},
|
||
|
},
|
||
|
}, {
|
||
|
[]lookupStrings{
|
||
|
{"abc", 1, 3},
|
||
|
{"abd", 2, 3},
|
||
|
{"abe", 3, 3},
|
||
|
{"a", 0, 0},
|
||
|
{"ab", 0, 0},
|
||
|
{"d", 0, 0},
|
||
|
{"f", 0, 0},
|
||
|
},
|
||
|
1,
|
||
|
ContractTrieSet{
|
||
|
{'a', 0, 1, 0xFF},
|
||
|
{'b', 0, 1, 0xFF},
|
||
|
{'c', 'e', 0, 1},
|
||
|
},
|
||
|
}, {
|
||
|
[]lookupStrings{
|
||
|
{"abc", 1, 3},
|
||
|
{"ab", 2, 2},
|
||
|
{"a", 3, 1},
|
||
|
{"abcd", 1, 3},
|
||
|
{"abe", 2, 2},
|
||
|
},
|
||
|
1,
|
||
|
ContractTrieSet{
|
||
|
{'a', 0, 1, 3},
|
||
|
{'b', 0, 1, 2},
|
||
|
{'c', 'c', 0, 1},
|
||
|
},
|
||
|
}, {
|
||
|
[]lookupStrings{
|
||
|
{"abc", 1, 3},
|
||
|
{"abd", 2, 3},
|
||
|
{"ab", 3, 2},
|
||
|
{"ac", 4, 2},
|
||
|
{"a", 5, 1},
|
||
|
{"b", 6, 1},
|
||
|
{"ba", 6, 1},
|
||
|
},
|
||
|
2,
|
||
|
ContractTrieSet{
|
||
|
{'b', 'b', 0, 6},
|
||
|
{'a', 0, 2, 5},
|
||
|
{'c', 'c', 0, 4},
|
||
|
{'b', 0, 1, 3},
|
||
|
{'c', 'd', 0, 1},
|
||
|
},
|
||
|
}, {
|
||
|
[]lookupStrings{
|
||
|
{"bcde", 2, 4},
|
||
|
{"bc", 7, 2},
|
||
|
{"ab", 6, 2},
|
||
|
{"bcd", 5, 3},
|
||
|
{"abcd", 1, 4},
|
||
|
{"abc", 4, 3},
|
||
|
{"bcdf", 3, 4},
|
||
|
},
|
||
|
2,
|
||
|
ContractTrieSet{
|
||
|
{'b', 3, 1, 0xFF},
|
||
|
{'a', 0, 1, 0xFF},
|
||
|
{'b', 0, 1, 6},
|
||
|
{'c', 0, 1, 4},
|
||
|
{'d', 'd', 0, 1},
|
||
|
{'c', 0, 1, 7},
|
||
|
{'d', 0, 1, 5},
|
||
|
{'e', 'f', 0, 2},
|
||
|
},
|
||
|
}}
|
||
|
|
||
|
func lookup(c *ContractTrieSet, nnode int, s []uint8) (i, n int) {
|
||
|
scan := c.scanner(0, nnode, s)
|
||
|
scan.scan(0)
|
||
|
return scan.result()
|
||
|
}
|
||
|
|
||
|
func TestLookupContraction(t *testing.T) {
|
||
|
for i, tt := range lookupTests {
|
||
|
cts := ContractTrieSet(tt.tries)
|
||
|
for j, lu := range tt.lookup {
|
||
|
str := lu.str
|
||
|
for _, s := range []string{str, str + "X"} {
|
||
|
const msg = `%d:%d: %s of "%s" %v; want %v`
|
||
|
offset, n := lookup(&cts, tt.n, []byte(s))
|
||
|
if offset != lu.offset {
|
||
|
t.Errorf(msg, i, j, "offset", s, offset, lu.offset)
|
||
|
}
|
||
|
if n != lu.n {
|
||
|
t.Errorf(msg, i, j, "bytes consumed", s, n, len(str))
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|