// 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)) } } } } }