Files
tamabox/internal/shared/state_test.go
T
tamakyi e3e59e7c69 chore: baseline snapshot before moderation-strictness feature
Repo .git was damaged (refs/ missing, index truncated, object store near-empty).
Repaired via git init (rebuilt refs), stale index preserved as .git/index.corrupt-20260910.bak,
then full worktree committed as a rollback baseline.
2026-09-10 10:56:27 +08:00

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