1package i18n
2
3import (
4 "errors"
5 "testing"
6
7 "golang.org/x/text/language"
8)
9
10func TestParseLocale(t *testing.T) {
11 RegisterLanguage(&Locale{
12 Tag: language.Arabic,
13 Code: "ar",
14 Name: "Arabic",
15 NativeName: "Arabic",
16 Direction: "rtl",
17 PluralFunc: ArabicPlural,
18 })
19
20 tests := []struct {
21 name string
22 code string
23 wantCode string
24 wantDirection string
25 wantErr error
26 }{
27 {
28 name: "language code",
29 code: "en",
30 wantCode: "en",
31 wantDirection: "ltr",
32 },
33 {
34 name: "hyphenated region",
35 code: "en-US",
36 wantCode: "en",
37 wantDirection: "ltr",
38 },
39 {
40 name: "underscored region",
41 code: "en_US",
42 wantCode: "en",
43 wantDirection: "ltr",
44 },
45 {
46 name: "unregistered language fallback",
47 code: "eo",
48 wantCode: "eo",
49 wantDirection: "ltr",
50 },
51 {
52 name: "registered rtl language",
53 code: "ar",
54 wantCode: "ar",
55 wantDirection: "rtl",
56 },
57 {
58 name: "empty code",
59 code: "",
60 wantErr: ErrInvalidLocale,
61 },
62 {
63 name: "malformed code",
64 code: "@@@",
65 wantErr: ErrInvalidLocale,
66 },
67 }
68
69 for _, tt := range tests {
70 t.Run(tt.name, func(t *testing.T) {
71 locale, err := ParseLocale(tt.code)
72 if tt.wantErr != nil {
73 if !errors.Is(err, tt.wantErr) {
74 t.Fatalf("ParseLocale(%q) error = %v, want %v", tt.code, err, tt.wantErr)
75 }
76 return
77 }
78 if err != nil {
79 t.Fatalf("ParseLocale(%q) returned error: %v", tt.code, err)
80 }
81 if locale.Code != tt.wantCode {
82 t.Errorf("ParseLocale(%q).Code = %q, want %q", tt.code, locale.Code, tt.wantCode)
83 }
84 if locale.Direction != tt.wantDirection {
85 t.Errorf("ParseLocale(%q).Direction = %q, want %q", tt.code, locale.Direction, tt.wantDirection)
86 }
87 })
88 }
89}