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) } }