| // 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 build |
| |
| import ( |
| "bytes" |
| "sort" |
| "testing" |
| |
| "golang.org/x/text/internal/colltab" |
| ) |
| |
| var largetosmall = []stridx{ |
| {"a", 5}, |
| {"ab", 4}, |
| {"abc", 3}, |
| {"abcd", 2}, |
| {"abcde", 1}, |
| {"abcdef", 0}, |
| } |
| |
| var offsetSortTests = [][]stridx{ |
| { |
| {"bcde", 1}, |
| {"bc", 5}, |
| {"ab", 4}, |
| {"bcd", 3}, |
| {"abcd", 0}, |
| {"abc", 2}, |
| }, |
| largetosmall, |
| } |
| |
| func TestOffsetSort(t *testing.T) { |
| for i, st := range offsetSortTests { |
| sort.Sort(offsetSort(st)) |
| for j, si := range st { |
| if j != si.index { |
| t.Errorf("%d: failed: %v", i, st) |
| } |
| } |
| } |
| for i, tt := range genStateTests { |
| // ensure input is well-formed |
| sort.Sort(offsetSort(tt.in)) |
| for j, si := range tt.in { |
| if si.index != j+1 { |
| t.Errorf("%dth sort failed: %v", i, tt.in) |
| } |
| } |
| } |
| } |
| |
| var genidxtest1 = []stridx{ |
| {"bcde", 3}, |
| {"bc", 6}, |
| {"ab", 2}, |
| {"bcd", 5}, |
| {"abcd", 0}, |
| {"abc", 1}, |
| {"bcdf", 4}, |
| } |
| |
| var genidxSortTests = [][]stridx{ |
| genidxtest1, |
| largetosmall, |
| } |
| |
| func TestGenIdxSort(t *testing.T) { |
| for i, st := range genidxSortTests { |
| sort.Sort(genidxSort(st)) |
| for j, si := range st { |
| if j != si.index { |
| t.Errorf("%dth sort failed %v", i, st) |
| break |
| } |
| } |
| } |
| } |
| |
| var entrySortTests = []colltab.ContractTrieSet{ |
| { |
| {10, 0, 1, 3}, |
| {99, 0, 1, 0}, |
| {20, 50, 0, 2}, |
| {30, 0, 1, 1}, |
| }, |
| } |
| |
| func TestEntrySort(t *testing.T) { |
| for i, et := range entrySortTests { |
| sort.Sort(entrySort(et)) |
| for j, fe := range et { |
| if j != int(fe.I) { |
| t.Errorf("%dth sort failed %v", i, et) |
| break |
| } |
| } |
| } |
| } |
| |
| type GenStateTest struct { |
| in []stridx |
| firstBlockLen int |
| out colltab.ContractTrieSet |
| } |
| |
| var genStateTests = []GenStateTest{ |
| {[]stridx{ |
| {"abc", 1}, |
| }, |
| 1, |
| colltab.ContractTrieSet{ |
| {'a', 0, 1, noIndex}, |
| {'b', 0, 1, noIndex}, |
| {'c', 'c', final, 1}, |
| }, |
| }, |
| {[]stridx{ |
| {"abc", 1}, |
| {"abd", 2}, |
| {"abe", 3}, |
| }, |
| 1, |
| colltab.ContractTrieSet{ |
| {'a', 0, 1, noIndex}, |
| {'b', 0, 1, noIndex}, |
| {'c', 'e', final, 1}, |
| }, |
| }, |
| {[]stridx{ |
| {"abc", 1}, |
| {"ab", 2}, |
| {"a", 3}, |
| }, |
| 1, |
| colltab.ContractTrieSet{ |
| {'a', 0, 1, 3}, |
| {'b', 0, 1, 2}, |
| {'c', 'c', final, 1}, |
| }, |
| }, |
| {[]stridx{ |
| {"abc", 1}, |
| {"abd", 2}, |
| {"ab", 3}, |
| {"ac", 4}, |
| {"a", 5}, |
| {"b", 6}, |
| }, |
| 2, |
| colltab.ContractTrieSet{ |
| {'b', 'b', final, 6}, |
| {'a', 0, 2, 5}, |
| {'c', 'c', final, 4}, |
| {'b', 0, 1, 3}, |
| {'c', 'd', final, 1}, |
| }, |
| }, |
| {[]stridx{ |
| {"bcde", 2}, |
| {"bc", 7}, |
| {"ab", 6}, |
| {"bcd", 5}, |
| {"abcd", 1}, |
| {"abc", 4}, |
| {"bcdf", 3}, |
| }, |
| 2, |
| colltab.ContractTrieSet{ |
| {'b', 3, 1, noIndex}, |
| {'a', 0, 1, noIndex}, |
| {'b', 0, 1, 6}, |
| {'c', 0, 1, 4}, |
| {'d', 'd', final, 1}, |
| {'c', 0, 1, 7}, |
| {'d', 0, 1, 5}, |
| {'e', 'f', final, 2}, |
| }, |
| }, |
| } |
| |
| func TestGenStates(t *testing.T) { |
| for i, tt := range genStateTests { |
| si := []stridx{} |
| for _, e := range tt.in { |
| si = append(si, e) |
| } |
| // ensure input is well-formed |
| sort.Sort(genidxSort(si)) |
| ct := colltab.ContractTrieSet{} |
| n, _ := genStates(&ct, si) |
| if nn := tt.firstBlockLen; nn != n { |
| t.Errorf("%d: block len %v; want %v", i, n, nn) |
| } |
| if lv, lw := len(ct), len(tt.out); lv != lw { |
| t.Errorf("%d: len %v; want %v", i, lv, lw) |
| continue |
| } |
| for j, fe := range tt.out { |
| const msg = "%d:%d: value %s=%v; want %v" |
| if fe.L != ct[j].L { |
| t.Errorf(msg, i, j, "l", ct[j].L, fe.L) |
| } |
| if fe.H != ct[j].H { |
| t.Errorf(msg, i, j, "h", ct[j].H, fe.H) |
| } |
| if fe.N != ct[j].N { |
| t.Errorf(msg, i, j, "n", ct[j].N, fe.N) |
| } |
| if fe.I != ct[j].I { |
| t.Errorf(msg, i, j, "i", ct[j].I, fe.I) |
| } |
| } |
| } |
| } |
| |
| func TestLookupContraction(t *testing.T) { |
| for i, tt := range genStateTests { |
| input := []string{} |
| for _, e := range tt.in { |
| input = append(input, e.str) |
| } |
| cts := colltab.ContractTrieSet{} |
| h, _ := appendTrie(&cts, input) |
| for j, si := range tt.in { |
| str := si.str |
| for _, s := range []string{str, str + "X"} { |
| msg := "%d:%d: %s(%s) %v; want %v" |
| idx, sn := lookup(&cts, h, []byte(s)) |
| if idx != si.index { |
| t.Errorf(msg, i, j, "index", s, idx, si.index) |
| } |
| if sn != len(str) { |
| t.Errorf(msg, i, j, "sn", s, sn, len(str)) |
| } |
| } |
| } |
| } |
| } |
| |
| func TestPrintContractionTrieSet(t *testing.T) { |
| testdata := colltab.ContractTrieSet(genStateTests[4].out) |
| buf := &bytes.Buffer{} |
| print(&testdata, buf, "test") |
| if contractTrieOutput != buf.String() { |
| t.Errorf("output differs; found\n%s", buf.String()) |
| println(string(buf.Bytes())) |
| } |
| } |
| |
| const contractTrieOutput = `// testCTEntries: 8 entries, 32 bytes |
| var testCTEntries = [8]struct{L,H,N,I uint8}{ |
| {0x62, 0x3, 1, 255}, |
| {0x61, 0x0, 1, 255}, |
| {0x62, 0x0, 1, 6}, |
| {0x63, 0x0, 1, 4}, |
| {0x64, 0x64, 0, 1}, |
| {0x63, 0x0, 1, 7}, |
| {0x64, 0x0, 1, 5}, |
| {0x65, 0x66, 0, 2}, |
| } |
| var testContractTrieSet = colltab.ContractTrieSet( testCTEntries[:] ) |
| ` |