github.com/go-xe2/third@v1.0.3/golang.org/x/text/unicode/cldr/resolve_test.go (about) 1 package cldr 2 3 import ( 4 "fmt" 5 "log" 6 "reflect" 7 "testing" 8 ) 9 10 func failOnError(err error) { 11 if err != nil { 12 log.Panic(err) 13 } 14 } 15 16 func data() *CLDR { 17 d := Decoder{} 18 data, err := d.Decode(testLoader{}) 19 failOnError(err) 20 return data 21 } 22 23 type h struct { 24 A string `xml:"ha,attr"` 25 E string `xml:"he"` 26 D string `xml:",chardata"` 27 X string 28 } 29 30 type fieldTest struct { 31 Common 32 To string `xml:"to,attr"` 33 Key string `xml:"key,attr"` 34 E string `xml:"e"` 35 D string `xml:",chardata"` 36 X string 37 h 38 } 39 40 var testStruct = fieldTest{ 41 Common: Common{ 42 name: "mapping", // exclude "type" as distinguishing attribute 43 Type: "foo", 44 Alt: "foo", 45 }, 46 To: "nyc", 47 Key: "k", 48 E: "E", 49 D: "D", 50 h: h{ 51 A: "A", 52 E: "E", 53 D: "D", 54 }, 55 } 56 57 func TestIter(t *testing.T) { 58 tests := map[string]string{ 59 "Type": "foo", 60 "Alt": "foo", 61 "To": "nyc", 62 "A": "A", 63 "Alias": "<nil>", 64 } 65 k := 0 66 for i := iter(reflect.ValueOf(testStruct)); !i.done(); i.next() { 67 v := i.value() 68 if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.String { 69 v = v.Elem() 70 } 71 name := i.field().Name 72 if w, ok := tests[name]; ok { 73 s := fmt.Sprint(v.Interface()) 74 if w != s { 75 t.Errorf("value: found %q; want %q", w, s) 76 } 77 delete(tests, name) 78 } 79 k++ 80 } 81 if len(tests) != 0 { 82 t.Errorf("missing fields: %v", tests) 83 } 84 } 85 86 func TestFindField(t *testing.T) { 87 tests := []struct { 88 name, val string 89 exist bool 90 }{ 91 {"type", "foo", true}, 92 {"alt", "foo", true}, 93 {"to", "nyc", true}, 94 {"he", "E", true}, 95 {"q", "", false}, 96 } 97 vf := reflect.ValueOf(testStruct) 98 for i, tt := range tests { 99 v, err := findField(vf, tt.name) 100 if (err == nil) != tt.exist { 101 t.Errorf("%d: field %q present is %v; want %v", i, tt.name, err == nil, tt.exist) 102 } else if tt.exist { 103 if v.Kind() == reflect.Ptr { 104 if v.IsNil() { 105 continue 106 } 107 v = v.Elem() 108 } 109 if v.String() != tt.val { 110 t.Errorf("%d: found value %q; want %q", i, v.String(), tt.val) 111 } 112 } 113 } 114 } 115 116 var keyTests = []struct { 117 exclude []string 118 key string 119 }{ 120 {[]string{}, "alt=foo;key=k;to=nyc"}, 121 {[]string{"type"}, "alt=foo;key=k;to=nyc"}, 122 {[]string{"choice"}, "alt=foo;key=k;to=nyc"}, 123 {[]string{"alt"}, "key=k;to=nyc"}, 124 {[]string{"a"}, "alt=foo;key=k;to=nyc"}, 125 {[]string{"to"}, "alt=foo;key=k"}, 126 {[]string{"alt", "to"}, "key=k"}, 127 {[]string{"alt", "to", "key"}, ""}, 128 } 129 130 func TestAttrKey(t *testing.T) { 131 v := reflect.ValueOf(&testStruct) 132 for i, tt := range keyTests { 133 key := attrKey(v, tt.exclude...) 134 if key != tt.key { 135 t.Errorf("%d: found %q, want %q", i, key, tt.key) 136 } 137 } 138 } 139 140 func TestKey(t *testing.T) { 141 for i, tt := range keyTests { 142 key := Key(&testStruct, tt.exclude...) 143 if key != tt.key { 144 t.Errorf("%d: found %q, want %q", i, key, tt.key) 145 } 146 } 147 } 148 149 func testEnclosing(t *testing.T, x *LDML, name string) { 150 eq := func(a, b Elem, i int) { 151 for ; i > 0; i-- { 152 b = b.enclosing() 153 } 154 if a != b { 155 t.Errorf("%s: found path %q, want %q", name, getPath(a), getPath(b)) 156 } 157 } 158 eq(x, x, 0) 159 eq(x, x.Identity, 1) 160 eq(x, x.Dates.Calendars, 2) 161 eq(x, x.Dates.Calendars.Calendar[0], 3) 162 eq(x, x.Dates.Calendars.Calendar[1], 3) 163 //eq(x, x.Dates.Calendars.Calendar[0].Months, 4) 164 eq(x, x.Dates.Calendars.Calendar[1].Months, 4) 165 } 166 167 func TestEnclosing(t *testing.T) { 168 testEnclosing(t, data().RawLDML("de"), "enclosing-raw") 169 de, _ := data().LDML("de") 170 testEnclosing(t, de, "enclosing") 171 } 172 173 func TestDeepCopy(t *testing.T) { 174 eq := func(have, want string) { 175 if have != want { 176 t.Errorf("found %q; want %q", have, want) 177 } 178 } 179 x, _ := data().LDML("de") 180 vc := deepCopy(reflect.ValueOf(x)) 181 c := vc.Interface().(*LDML) 182 linkEnclosing(nil, c) 183 if x == c { 184 t.Errorf("did not copy") 185 } 186 187 eq(c.name, "ldml") 188 eq(c.Dates.name, "dates") 189 testEnclosing(t, c, "deepCopy") 190 } 191 192 type getTest struct { 193 loc string 194 path string 195 field string // used in combination with length 196 data string 197 altData string // used for buddhist calendar if value != "" 198 typ string 199 length int 200 missing bool 201 } 202 203 const ( 204 budMon = "dates/calendars/calendar[@type='buddhist']/months/" 205 chnMon = "dates/calendars/calendar[@type='chinese']/months/" 206 greMon = "dates/calendars/calendar[@type='gregorian']/months/" 207 ) 208 209 func monthVal(path, context, width string, month int) string { 210 const format = "%s/monthContext[@type='%s']/monthWidth[@type='%s']/month[@type='%d']" 211 return fmt.Sprintf(format, path, context, width, month) 212 } 213 214 var rootGetTests = []getTest{ 215 {loc: "root", path: "identity/language", typ: "root"}, 216 {loc: "root", path: "characters/moreInformation", data: "?"}, 217 {loc: "root", path: "characters", field: "exemplarCharacters", length: 3}, 218 {loc: "root", path: greMon, field: "monthContext", length: 2}, 219 {loc: "root", path: greMon + "monthContext[@type='format']/monthWidth[@type='narrow']", field: "month", length: 4}, 220 {loc: "root", path: greMon + "monthContext[@type='stand-alone']/monthWidth[@type='wide']", field: "month", length: 4}, 221 // unescaping character data 222 {loc: "root", path: "characters/exemplarCharacters[@type='punctuation']", data: `[\- ‐ – — … ' ‘ ‚ " “ „ \& #]`}, 223 // default resolution 224 {loc: "root", path: "dates/calendars/calendar", typ: "gregorian"}, 225 // alias resolution 226 {loc: "root", path: budMon, field: "monthContext", length: 2}, 227 // crossing but non-circular alias resolution 228 {loc: "root", path: budMon + "monthContext[@type='format']/monthWidth[@type='narrow']", field: "month", length: 4}, 229 {loc: "root", path: budMon + "monthContext[@type='stand-alone']/monthWidth[@type='wide']", field: "month", length: 4}, 230 {loc: "root", path: monthVal(greMon, "format", "wide", 1), data: "11"}, 231 {loc: "root", path: monthVal(greMon, "format", "narrow", 2), data: "2"}, 232 {loc: "root", path: monthVal(greMon, "stand-alone", "wide", 3), data: "33"}, 233 {loc: "root", path: monthVal(greMon, "stand-alone", "narrow", 4), data: "4"}, 234 {loc: "root", path: monthVal(budMon, "format", "wide", 1), data: "11"}, 235 {loc: "root", path: monthVal(budMon, "format", "narrow", 2), data: "2"}, 236 {loc: "root", path: monthVal(budMon, "stand-alone", "wide", 3), data: "33"}, 237 {loc: "root", path: monthVal(budMon, "stand-alone", "narrow", 4), data: "4"}, 238 } 239 240 // 19 241 var deGetTests = []getTest{ 242 {loc: "de", path: "identity/language", typ: "de"}, 243 {loc: "de", path: "posix", length: 2}, 244 {loc: "de", path: "characters", field: "exemplarCharacters", length: 4}, 245 {loc: "de", path: "characters/exemplarCharacters[@type='auxiliary']", data: `[á à ă]`}, 246 // identity is a blocking element, so de should not inherit generation from root. 247 {loc: "de", path: "identity/generation", missing: true}, 248 // default resolution 249 {loc: "root", path: "dates/calendars/calendar", typ: "gregorian"}, 250 251 // absolute path alias resolution 252 {loc: "gsw", path: "posix", field: "messages", length: 1}, 253 {loc: "gsw", path: "posix/messages/yesstr", data: "yes:y"}, 254 } 255 256 // 27(greMon) - 52(budMon) - 77(chnMon) 257 func calGetTests(s string) []getTest { 258 tests := []getTest{ 259 {loc: "de", path: s, length: 2}, 260 {loc: "de", path: s + "monthContext[@type='format']/monthWidth[@type='wide']", field: "month", length: 5}, 261 {loc: "de", path: monthVal(s, "format", "wide", 1), data: "11"}, 262 {loc: "de", path: monthVal(s, "format", "wide", 2), data: "22"}, 263 {loc: "de", path: monthVal(s, "format", "wide", 3), data: "Maerz", altData: "bbb"}, 264 {loc: "de", path: monthVal(s, "format", "wide", 4), data: "April"}, 265 {loc: "de", path: monthVal(s, "format", "wide", 5), data: "Mai"}, 266 267 {loc: "de", path: s + "monthContext[@type='format']/monthWidth[@type='narrow']", field: "month", length: 5}, 268 {loc: "de", path: monthVal(s, "format", "narrow", 1), data: "1"}, 269 {loc: "de", path: monthVal(s, "format", "narrow", 2), data: "2"}, 270 {loc: "de", path: monthVal(s, "format", "narrow", 3), data: "M", altData: "BBB"}, 271 {loc: "de", path: monthVal(s, "format", "narrow", 4), data: "A"}, 272 {loc: "de", path: monthVal(s, "format", "narrow", 5), data: "m"}, 273 274 {loc: "de", path: s + "monthContext[@type='stand-alone']/monthWidth[@type='wide']", field: "month", length: 5}, 275 {loc: "de", path: monthVal(s, "stand-alone", "wide", 1), data: "11"}, 276 {loc: "de", path: monthVal(s, "stand-alone", "wide", 2), data: "22"}, 277 {loc: "de", path: monthVal(s, "stand-alone", "wide", 3), data: "Maerz", altData: "bbb"}, 278 {loc: "de", path: monthVal(s, "stand-alone", "wide", 4), data: "april"}, 279 {loc: "de", path: monthVal(s, "stand-alone", "wide", 5), data: "mai"}, 280 281 {loc: "de", path: s + "monthContext[@type='stand-alone']/monthWidth[@type='narrow']", field: "month", length: 5}, 282 {loc: "de", path: monthVal(s, "stand-alone", "narrow", 1), data: "1"}, 283 {loc: "de", path: monthVal(s, "stand-alone", "narrow", 2), data: "2"}, 284 {loc: "de", path: monthVal(s, "stand-alone", "narrow", 3), data: "m"}, 285 {loc: "de", path: monthVal(s, "stand-alone", "narrow", 4), data: "4"}, 286 {loc: "de", path: monthVal(s, "stand-alone", "narrow", 5), data: "m"}, 287 } 288 if s == budMon { 289 for i, t := range tests { 290 if t.altData != "" { 291 tests[i].data = t.altData 292 } 293 } 294 } 295 return tests 296 } 297 298 var getTests = append(rootGetTests, 299 append(deGetTests, 300 append(calGetTests(greMon), 301 append(calGetTests(budMon), 302 calGetTests(chnMon)...)...)...)...) 303 304 func TestPath(t *testing.T) { 305 d := data() 306 for i, tt := range getTests { 307 x, _ := d.LDML(tt.loc) 308 e, err := walkXPath(x, tt.path) 309 if err != nil { 310 if !tt.missing { 311 t.Errorf("%d:error: %v %v", i, err, tt.missing) 312 } 313 continue 314 } 315 if tt.missing { 316 t.Errorf("%d: missing is %v; want %v", i, e == nil, tt.missing) 317 continue 318 } 319 if tt.data != "" && e.GetCommon().Data() != tt.data { 320 t.Errorf("%d: data is %v; want %v", i, e.GetCommon().Data(), tt.data) 321 continue 322 } 323 if tt.typ != "" && e.GetCommon().Type != tt.typ { 324 t.Errorf("%d: type is %v; want %v", i, e.GetCommon().Type, tt.typ) 325 continue 326 } 327 if tt.field != "" { 328 slice, _ := findField(reflect.ValueOf(e), tt.field) 329 if slice.Len() != tt.length { 330 t.Errorf("%d: length is %v; want %v", i, slice.Len(), tt.length) 331 continue 332 } 333 } 334 } 335 } 336 337 func TestGet(t *testing.T) { 338 d := data() 339 for i, tt := range getTests { 340 x, _ := d.LDML(tt.loc) 341 e, err := Get(x, tt.path) 342 if err != nil { 343 if !tt.missing { 344 t.Errorf("%d:error: %v %v", i, err, tt.missing) 345 } 346 continue 347 } 348 if tt.missing { 349 t.Errorf("%d: missing is %v; want %v", i, e == nil, tt.missing) 350 continue 351 } 352 if tt.data != "" && e.GetCommon().Data() != tt.data { 353 t.Errorf("%d: data is %v; want %v", i, e.GetCommon().Data(), tt.data) 354 continue 355 } 356 if tt.typ != "" && e.GetCommon().Type != tt.typ { 357 t.Errorf("%d: type is %v; want %v", i, e.GetCommon().Type, tt.typ) 358 continue 359 } 360 if tt.field != "" { 361 slice, _ := findField(reflect.ValueOf(e), tt.field) 362 if slice.Len() != tt.length { 363 t.Errorf("%d: length is %v; want %v", i, slice.Len(), tt.length) 364 continue 365 } 366 } 367 } 368 }