// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package i18n
import (
"html/template"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestLocaleStore(t *testing.T) {
testData1 := []byte(`
{
".dot.name": "Dot Name",
"fmt": "%[1]s %[2]s",
"section.sub": "Sub String",
"section.mixed": "test value; %s"
}`)
testData2 := []byte(`
{
"fmt": "%[2]s %[1]s",
"section.sub": "Changed Sub String"
}`)
ls := NewLocaleStore()
assert.NoError(t, ls.AddLocaleByJSON("lang1", "Lang1", testData1, nil))
assert.NoError(t, ls.AddLocaleByJSON("lang2", "Lang2", testData2, nil))
ls.SetDefaultLang("lang1")
lang1, _ := ls.Locale("lang1")
lang2, _ := ls.Locale("lang2")
result := lang1.TrString("fmt", "a", "b")
assert.Equal(t, "a b", result)
result = lang2.TrString("fmt", "a", "b")
assert.Equal(t, "b a", result)
result = lang1.TrString("section.sub")
assert.Equal(t, "Sub String", result)
result = lang2.TrString("section.sub")
assert.Equal(t, "Changed Sub String", result)
langNone, _ := ls.Locale("none")
result = langNone.TrString(".dot.name")
assert.Equal(t, "Dot Name", result)
result2 := lang2.TrHTML("section.mixed", "a&b")
assert.EqualValues(t, `test value; a&b`, result2)
langs, descs := ls.ListLangNameDesc()
assert.ElementsMatch(t, []string{"lang1", "lang2"}, langs)
assert.ElementsMatch(t, []string{"Lang1", "Lang2"}, descs)
found := lang1.HasKey("no-such")
assert.False(t, found)
assert.NoError(t, ls.Close())
res := lang1.TrHTML("")
assert.Equal(t, "<no-such>", string(res))
}
func TestLocaleStoreMoreSource(t *testing.T) {
testData1 := []byte(`
{
"a": "11",
"b": "12"
}
`)
testData2 := []byte(`
{
"b": "21",
"c": "22"
}
`)
ls := NewLocaleStore()
assert.NoError(t, ls.AddLocaleByJSON("lang1", "Lang1", testData1, testData2))
lang1, _ := ls.Locale("lang1")
assert.Equal(t, "11", lang1.TrString("a"))
assert.Equal(t, "21", lang1.TrString("b"))
assert.Equal(t, "22", lang1.TrString("c"))
}
type stringerPointerReceiver struct {
s string
}
func (s *stringerPointerReceiver) String() string {
return s.s
}
type stringerStructReceiver struct {
s string
}
func (s stringerStructReceiver) String() string {
return s.s
}
type errorStructReceiver struct {
s string
}
func (e errorStructReceiver) Error() string {
return e.s
}
type errorPointerReceiver struct {
s string
}
func (e *errorPointerReceiver) Error() string {
return e.s
}
func TestLocaleWithTemplate(t *testing.T) {
ls := NewLocaleStore()
assert.NoError(t, ls.AddLocaleByJSON("lang1", "Lang1", []byte(`{"key":"%s"}`), nil))
lang1, _ := ls.Locale("lang1")
tmpl := template.New("test").Funcs(template.FuncMap{"tr": lang1.TrHTML})
tmpl = template.Must(tmpl.Parse(`{{tr "key" .var}}`))
cases := []struct {
in any
want string
}{
{"", "<str>"},
{[]byte(""), "[60 98 121 116 101 115 62]"},
{template.HTML(""), ""},
{stringerPointerReceiver{""}, "{<stringerPointerReceiver>}"},
{&stringerPointerReceiver{""}, "<stringerPointerReceiver ptr>"},
{stringerStructReceiver{""}, "<stringerStructReceiver>"},
{&stringerStructReceiver{""}, "<stringerStructReceiver ptr>"},
{errorStructReceiver{""}, "<errorStructReceiver>"},
{&errorStructReceiver{""}, "<errorStructReceiver ptr>"},
{errorPointerReceiver{""}, "{<errorPointerReceiver>}"},
{&errorPointerReceiver{""}, "<errorPointerReceiver ptr>"},
}
buf := &strings.Builder{}
for _, c := range cases {
buf.Reset()
assert.NoError(t, tmpl.Execute(buf, map[string]any{"var": c.in}))
assert.Equal(t, c.want, buf.String())
}
}