78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
package shared
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/tamakyi/TamaBox/internal/i18n"
|
|
)
|
|
|
|
func TestAppState_Default(t *testing.T) {
|
|
s := NewAppState()
|
|
if got := s.Lang(); got != i18n.Default {
|
|
t.Errorf("默认语言 = %q, 期望 %q", got, i18n.Default)
|
|
}
|
|
}
|
|
|
|
func TestAppState_SetLang_Normalize(t *testing.T) {
|
|
cases := []struct {
|
|
in string
|
|
want string
|
|
}{
|
|
{"zh-CN", i18n.LangZhCN},
|
|
{"zh_CN", i18n.LangZhCN}, // 下划线变体
|
|
{"zh", i18n.LangZhCN},
|
|
{"zh-TW", i18n.LangZhTW},
|
|
{"zh_hk", i18n.LangZhTW}, // 港繁统一映射到繁体中文
|
|
{"zh-hant", i18n.LangZhTW},
|
|
{"en", i18n.LangEn},
|
|
{"en-US", i18n.LangEn},
|
|
{"ja", i18n.LangJa},
|
|
{"ja_JP", i18n.LangJa},
|
|
{" En ", i18n.LangEn}, // 自动去空白
|
|
{"fr", i18n.Default}, // 未知回退
|
|
{"", i18n.Default}, // 空值回退
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
s := NewAppState()
|
|
s.SetLang(tc.in)
|
|
if got := s.Lang(); got != tc.want {
|
|
t.Errorf("SetLang(%q) 后 Lang() = %q, 期望 %q", tc.in, got, tc.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAppState_Concurrent(t *testing.T) {
|
|
s := NewAppState()
|
|
const n = 100
|
|
|
|
// 并发读写,覆盖 RWMutex 的多读单写路径。
|
|
// 用 channel 计数替代 WaitGroup(部分受限环境对 WaitGroup 信号量支持异常)。
|
|
done := make(chan struct{}, n)
|
|
for i := 0; i < n; i++ {
|
|
go func(i int) {
|
|
defer func() { done <- struct{}{} }()
|
|
if i%2 == 0 {
|
|
s.SetLang("en")
|
|
} else {
|
|
_ = s.Lang()
|
|
}
|
|
}(i)
|
|
}
|
|
for i := 0; i < n; i++ {
|
|
select {
|
|
case <-done:
|
|
case <-time.After(10 * time.Second):
|
|
t.Fatalf("并发测试超时:仅 %d/%d 完成", i, n)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestApp_Singleton(t *testing.T) {
|
|
// 单例默认语言为 zh-CN
|
|
if App.Lang() != i18n.Default {
|
|
t.Errorf("App.Lang() = %q, 期望默认 %q", App.Lang(), i18n.Default)
|
|
}
|
|
}
|