github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/golang/text/collate/build/contract_test.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package build 6 7 import ( 8 "bytes" 9 "sort" 10 "testing" 11 ) 12 13 var largetosmall = []stridx{ 14 {"a", 5}, 15 {"ab", 4}, 16 {"abc", 3}, 17 {"abcd", 2}, 18 {"abcde", 1}, 19 {"abcdef", 0}, 20 } 21 22 var offsetSortTests = [][]stridx{ 23 { 24 {"bcde", 1}, 25 {"bc", 5}, 26 {"ab", 4}, 27 {"bcd", 3}, 28 {"abcd", 0}, 29 {"abc", 2}, 30 }, 31 largetosmall, 32 } 33 34 func TestOffsetSort(t *testing.T) { 35 for i, st := range offsetSortTests { 36 sort.Sort(offsetSort(st)) 37 for j, si := range st { 38 if j != si.index { 39 t.Errorf("%d: failed: %v", i, st) 40 } 41 } 42 } 43 for i, tt := range genStateTests { 44 // ensure input is well-formed 45 sort.Sort(offsetSort(tt.in)) 46 for j, si := range tt.in { 47 if si.index != j+1 { 48 t.Errorf("%dth sort failed: %v", i, tt.in) 49 } 50 } 51 } 52 } 53 54 var genidxtest1 = []stridx{ 55 {"bcde", 3}, 56 {"bc", 6}, 57 {"ab", 2}, 58 {"bcd", 5}, 59 {"abcd", 0}, 60 {"abc", 1}, 61 {"bcdf", 4}, 62 } 63 64 var genidxSortTests = [][]stridx{ 65 genidxtest1, 66 largetosmall, 67 } 68 69 func TestGenIdxSort(t *testing.T) { 70 for i, st := range genidxSortTests { 71 sort.Sort(genidxSort(st)) 72 for j, si := range st { 73 if j != si.index { 74 t.Errorf("%dth sort failed %v", i, st) 75 break 76 } 77 } 78 } 79 } 80 81 var entrySortTests = []contractTrieSet{ 82 { 83 {10, 0, 1, 3}, 84 {99, 0, 1, 0}, 85 {20, 50, 0, 2}, 86 {30, 0, 1, 1}, 87 }, 88 } 89 90 func TestEntrySort(t *testing.T) { 91 for i, et := range entrySortTests { 92 sort.Sort(entrySort(et)) 93 for j, fe := range et { 94 if j != int(fe.i) { 95 t.Errorf("%dth sort failed %v", i, et) 96 break 97 } 98 } 99 } 100 } 101 102 type GenStateTest struct { 103 in []stridx 104 firstBlockLen int 105 out contractTrieSet 106 } 107 108 var genStateTests = []GenStateTest{ 109 {[]stridx{ 110 {"abc", 1}, 111 }, 112 1, 113 contractTrieSet{ 114 {'a', 0, 1, noIndex}, 115 {'b', 0, 1, noIndex}, 116 {'c', 'c', final, 1}, 117 }, 118 }, 119 {[]stridx{ 120 {"abc", 1}, 121 {"abd", 2}, 122 {"abe", 3}, 123 }, 124 1, 125 contractTrieSet{ 126 {'a', 0, 1, noIndex}, 127 {'b', 0, 1, noIndex}, 128 {'c', 'e', final, 1}, 129 }, 130 }, 131 {[]stridx{ 132 {"abc", 1}, 133 {"ab", 2}, 134 {"a", 3}, 135 }, 136 1, 137 contractTrieSet{ 138 {'a', 0, 1, 3}, 139 {'b', 0, 1, 2}, 140 {'c', 'c', final, 1}, 141 }, 142 }, 143 {[]stridx{ 144 {"abc", 1}, 145 {"abd", 2}, 146 {"ab", 3}, 147 {"ac", 4}, 148 {"a", 5}, 149 {"b", 6}, 150 }, 151 2, 152 contractTrieSet{ 153 {'b', 'b', final, 6}, 154 {'a', 0, 2, 5}, 155 {'c', 'c', final, 4}, 156 {'b', 0, 1, 3}, 157 {'c', 'd', final, 1}, 158 }, 159 }, 160 {[]stridx{ 161 {"bcde", 2}, 162 {"bc", 7}, 163 {"ab", 6}, 164 {"bcd", 5}, 165 {"abcd", 1}, 166 {"abc", 4}, 167 {"bcdf", 3}, 168 }, 169 2, 170 contractTrieSet{ 171 {'b', 3, 1, noIndex}, 172 {'a', 0, 1, noIndex}, 173 {'b', 0, 1, 6}, 174 {'c', 0, 1, 4}, 175 {'d', 'd', final, 1}, 176 {'c', 0, 1, 7}, 177 {'d', 0, 1, 5}, 178 {'e', 'f', final, 2}, 179 }, 180 }, 181 } 182 183 func TestGenStates(t *testing.T) { 184 for i, tt := range genStateTests { 185 si := []stridx{} 186 for _, e := range tt.in { 187 si = append(si, e) 188 } 189 // ensure input is well-formed 190 sort.Sort(genidxSort(si)) 191 ct := contractTrieSet{} 192 n, _ := ct.genStates(si) 193 if nn := tt.firstBlockLen; nn != n { 194 t.Errorf("%d: block len %v; want %v", i, n, nn) 195 } 196 if lv, lw := len(ct), len(tt.out); lv != lw { 197 t.Errorf("%d: len %v; want %v", i, lv, lw) 198 continue 199 } 200 for j, fe := range tt.out { 201 const msg = "%d:%d: value %s=%v; want %v" 202 if fe.l != ct[j].l { 203 t.Errorf(msg, i, j, "l", ct[j].l, fe.l) 204 } 205 if fe.h != ct[j].h { 206 t.Errorf(msg, i, j, "h", ct[j].h, fe.h) 207 } 208 if fe.n != ct[j].n { 209 t.Errorf(msg, i, j, "n", ct[j].n, fe.n) 210 } 211 if fe.i != ct[j].i { 212 t.Errorf(msg, i, j, "i", ct[j].i, fe.i) 213 } 214 } 215 } 216 } 217 218 func TestLookupContraction(t *testing.T) { 219 for i, tt := range genStateTests { 220 input := []string{} 221 for _, e := range tt.in { 222 input = append(input, e.str) 223 } 224 cts := contractTrieSet{} 225 h, _ := cts.appendTrie(input) 226 for j, si := range tt.in { 227 str := si.str 228 for _, s := range []string{str, str + "X"} { 229 msg := "%d:%d: %s(%s) %v; want %v" 230 idx, sn := cts.lookup(h, []byte(s)) 231 if idx != si.index { 232 t.Errorf(msg, i, j, "index", s, idx, si.index) 233 } 234 if sn != len(str) { 235 t.Errorf(msg, i, j, "sn", s, sn, len(str)) 236 } 237 } 238 } 239 } 240 } 241 242 func TestPrintContractionTrieSet(t *testing.T) { 243 testdata := contractTrieSet(genStateTests[4].out) 244 buf := &bytes.Buffer{} 245 testdata.print(buf, "test") 246 if contractTrieOutput != buf.String() { 247 t.Errorf("output differs; found\n%s", buf.String()) 248 println(string(buf.Bytes())) 249 } 250 } 251 252 const contractTrieOutput = `// testCTEntries: 8 entries, 32 bytes 253 var testCTEntries = [8]struct{l,h,n,i uint8}{ 254 {0x62, 0x3, 1, 255}, 255 {0x61, 0x0, 1, 255}, 256 {0x62, 0x0, 1, 6}, 257 {0x63, 0x0, 1, 4}, 258 {0x64, 0x64, 0, 1}, 259 {0x63, 0x0, 1, 7}, 260 {0x64, 0x0, 1, 5}, 261 {0x65, 0x66, 0, 2}, 262 } 263 var testContractTrieSet = contractTrieSet( testCTEntries[:] ) 264 `