locale_test.go

 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}