// Copyright 2017 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 date import ( "strconv" "strings" "testing" "golang.org/x/text/internal/cldrtree" "golang.org/x/text/internal/gen" "golang.org/x/text/internal/language/compact" "golang.org/x/text/internal/testtext" "golang.org/x/text/language" "golang.org/x/text/unicode/cldr" ) func TestTables(t *testing.T) { testtext.SkipIfNotLong(t) r := gen.OpenCLDRCoreZip() defer r.Close() d := &cldr.Decoder{} d.SetDirFilter("supplemental", "main") d.SetSectionFilter("dates") data, err := d.DecodeZip(r) if err != nil { t.Fatalf("DecodeZip: %v", err) } count := 0 for _, lang := range data.Locales() { ldml := data.RawLDML(lang) if ldml.Dates == nil { continue } tag, _ := compact.RegionalID(compact.Tag(language.MustParse(lang))) test := func(want cldrtree.Element, path ...string) { if count > 30 { return } t.Run(lang+"/"+strings.Join(path, "/"), func(t *testing.T) { p := make([]uint16, len(path)) for i, s := range path { if v, err := strconv.Atoi(s); err == nil { p[i] = uint16(v) } else if v, ok := enumMap[s]; ok { p[i] = v } else { count++ t.Fatalf("Unknown key %q", s) } } wantStr := want.GetCommon().Data() if got := tree.Lookup(tag, p...); got != wantStr { count++ t.Errorf("got %q; want %q", got, wantStr) } }) } width := func(s string) string { return "width" + strings.Title(s) } if ldml.Dates.Calendars != nil { for _, cal := range ldml.Dates.Calendars.Calendar { if cal.Months != nil { for _, mc := range cal.Months.MonthContext { for _, mw := range mc.MonthWidth { for _, m := range mw.Month { test(m, "calendars", cal.Type, "months", mc.Type, width(mw.Type), m.Yeartype+m.Type) } } } } if cal.MonthPatterns != nil { for _, mc := range cal.MonthPatterns.MonthPatternContext { for _, mw := range mc.MonthPatternWidth { for _, m := range mw.MonthPattern { test(m, "calendars", cal.Type, "monthPatterns", mc.Type, width(mw.Type)) } } } } if cal.CyclicNameSets != nil { for _, cns := range cal.CyclicNameSets.CyclicNameSet { for _, cc := range cns.CyclicNameContext { for _, cw := range cc.CyclicNameWidth { for _, c := range cw.CyclicName { test(c, "calendars", cal.Type, "cyclicNameSets", cns.Type+"CycleType", cc.Type, width(cw.Type), c.Type) } } } } } if cal.Days != nil { for _, dc := range cal.Days.DayContext { for _, dw := range dc.DayWidth { for _, d := range dw.Day { test(d, "calendars", cal.Type, "days", dc.Type, width(dw.Type), d.Type) } } } } if cal.Quarters != nil { for _, qc := range cal.Quarters.QuarterContext { for _, qw := range qc.QuarterWidth { for _, q := range qw.Quarter { test(q, "calendars", cal.Type, "quarters", qc.Type, width(qw.Type), q.Type) } } } } if cal.DayPeriods != nil { for _, dc := range cal.DayPeriods.DayPeriodContext { for _, dw := range dc.DayPeriodWidth { for _, d := range dw.DayPeriod { test(d, "calendars", cal.Type, "dayPeriods", dc.Type, width(dw.Type), d.Type, d.Alt) } } } } if cal.Eras != nil { if cal.Eras.EraNames != nil { for _, e := range cal.Eras.EraNames.Era { test(e, "calendars", cal.Type, "eras", "widthWide", e.Alt, e.Type) } } if cal.Eras.EraAbbr != nil { for _, e := range cal.Eras.EraAbbr.Era { test(e, "calendars", cal.Type, "eras", "widthAbbreviated", e.Alt, e.Type) } } if cal.Eras.EraNarrow != nil { for _, e := range cal.Eras.EraNarrow.Era { test(e, "calendars", cal.Type, "eras", "widthNarrow", e.Alt, e.Type) } } } if cal.DateFormats != nil { for _, dfl := range cal.DateFormats.DateFormatLength { for _, df := range dfl.DateFormat { for _, p := range df.Pattern { test(p, "calendars", cal.Type, "dateFormats", dfl.Type, p.Alt) } } } } if cal.TimeFormats != nil { for _, tfl := range cal.TimeFormats.TimeFormatLength { for _, tf := range tfl.TimeFormat { for _, p := range tf.Pattern { test(p, "calendars", cal.Type, "timeFormats", tfl.Type, p.Alt) } } } } if cal.DateTimeFormats != nil { for _, dtfl := range cal.DateTimeFormats.DateTimeFormatLength { for _, dtf := range dtfl.DateTimeFormat { for _, p := range dtf.Pattern { test(p, "calendars", cal.Type, "dateTimeFormats", dtfl.Type, p.Alt) } } } // TODO: // - appendItems // - intervalFormats } } } // TODO: this is a lot of data and is probably relatively little used. // Store this somewhere else. if ldml.Dates.Fields != nil { for _, f := range ldml.Dates.Fields.Field { field := f.Type + "Field" for _, d := range f.DisplayName { test(d, "fields", field, "displayName", d.Alt) } for _, r := range f.Relative { i, _ := strconv.Atoi(r.Type) v := []string{"before2", "before1", "current", "after1", "after2", "after3"}[i+2] test(r, "fields", field, "relative", v) } for _, rt := range f.RelativeTime { for _, p := range rt.RelativeTimePattern { test(p, "fields", field, "relativeTime", rt.Type, p.Count) } } for _, rp := range f.RelativePeriod { test(rp, "fields", field, "relativePeriod", rp.Alt) } } } if ldml.Dates.TimeZoneNames != nil { for _, h := range ldml.Dates.TimeZoneNames.HourFormat { test(h, "timeZoneNames", "zoneFormat", h.Element()) } for _, g := range ldml.Dates.TimeZoneNames.GmtFormat { test(g, "timeZoneNames", "zoneFormat", g.Element()) } for _, g := range ldml.Dates.TimeZoneNames.GmtZeroFormat { test(g, "timeZoneNames", "zoneFormat", g.Element()) } for _, r := range ldml.Dates.TimeZoneNames.RegionFormat { s := r.Type if s == "" { s = "generic" } test(r, "timeZoneNames", "regionFormat", s+"Time") } testZone := func(zoneType, zoneWidth, zone string, a ...[]*cldr.Common) { for _, e := range a { for _, n := range e { test(n, "timeZoneNames", zoneType, zoneWidth, n.Element()+"Time", zone) } } } for _, z := range ldml.Dates.TimeZoneNames.Zone { for _, l := range z.Long { testZone("zone", l.Element(), z.Type, l.Generic, l.Standard, l.Daylight) } for _, l := range z.Short { testZone("zone", l.Element(), z.Type, l.Generic, l.Standard, l.Daylight) } } for _, z := range ldml.Dates.TimeZoneNames.Metazone { for _, l := range z.Long { testZone("metaZone", l.Element(), z.Type, l.Generic, l.Standard, l.Daylight) } for _, l := range z.Short { testZone("metaZone", l.Element(), z.Type, l.Generic, l.Standard, l.Daylight) } } } } }