🏷️ Created Language domain with tests

This commit is contained in:
Maxim Lebedev 2023-11-13 04:32:34 +06:00
parent a756c76631
commit 104814a633
Signed by: toby3d
GPG Key ID: 1F14E25B7C119FC5
2 changed files with 165 additions and 0 deletions

View File

@ -0,0 +1,58 @@
package domain
import (
"strings"
"golang.org/x/text/language"
"golang.org/x/text/language/display"
)
type Language struct {
code string
lang string
name string
dir string
}
func NewLanguage(tag language.Tag) Language {
out := Language{dir: "ltr"}
switch tag {
case language.Und:
return out
case language.Arabic, language.Persian, language.Hebrew, language.Urdu:
out.dir = "rtl"
}
out.name = strings.ToLower(display.Self.Name(tag))
out.code = tag.String()
base, _ := tag.Base()
out.lang = base.String()
return out
}
func (l Language) Lang() string {
return l.lang
}
func (l Language) Code() string {
return l.code
}
func (l Language) Dir() string {
return l.dir
}
func (l Language) Name() string {
return l.name
}
func (l Language) String() string {
return l.code
}
func (l Language) GoString() string {
return "domain.Language(" + l.code + ")"
}

View File

@ -0,0 +1,107 @@
package domain_test
import (
"testing"
"golang.org/x/text/language"
"source.toby3d.me/toby3d/home/internal/domain"
)
func TestLanguage_Lang(t *testing.T) {
t.Parallel()
for name, tc := range map[string]struct {
input language.Tag
expect string
}{
"2letter": {language.Make("en"), "en"},
"3letter": {language.Make("eng"), "en"},
"region": {language.Make("en-US"), "en"},
"und": {language.Und, ""},
} {
name, tc := name, tc
t.Run(name, func(t *testing.T) {
t.Parallel()
if actual := domain.NewLanguage(tc.input).Lang(); actual != tc.expect {
t.Errorf("Lang() = %s, want %s", actual, tc.expect)
}
})
}
}
func TestLanguage_Code(t *testing.T) {
t.Parallel()
for name, tc := range map[string]struct {
input language.Tag
expect string
}{
"2letter": {language.Make("en"), "en"},
"3letter": {language.Make("eng"), "en"},
"region": {language.Make("en-US"), "en-US"},
"und": {language.Und, ""},
} {
name, tc := name, tc
t.Run(name, func(t *testing.T) {
t.Parallel()
if actual := domain.NewLanguage(tc.input).Code(); actual != tc.expect {
t.Errorf("Code() = %s, want %s", actual, tc.expect)
}
})
}
}
func TestLanguage_Dir(t *testing.T) {
t.Parallel()
for name, tc := range map[string]struct {
input language.Tag
expect string
}{
"2letter": {language.Make("en"), "ltr"},
"rtl": {language.Urdu, "rtl"},
"3letter": {language.Make("eng"), "ltr"},
"region": {language.Make("en-US"), "ltr"},
"und": {language.Und, "ltr"},
} {
name, tc := name, tc
t.Run(name, func(t *testing.T) {
t.Parallel()
if actual := domain.NewLanguage(tc.input).Dir(); actual != tc.expect {
t.Errorf("Dir() = %s, want %s", actual, tc.expect)
}
})
}
}
func TestLanguage_Name(t *testing.T) {
t.Parallel()
for name, tc := range map[string]struct {
input language.Tag
expect string
}{
"localized": {language.Russian, "русский"},
"2letter": {language.Make("en"), "english"},
"3letter": {language.Make("eng"), "english"},
"region": {language.Make("en-US"), "american english"},
"und": {language.Und, ""},
} {
name, tc := name, tc
t.Run(name, func(t *testing.T) {
t.Parallel()
if actual := domain.NewLanguage(tc.input).Name(); actual != tc.expect {
t.Errorf("Name() = %s, want %s", actual, tc.expect)
}
})
}
}