package language import ( "testing" "voicesnap/internal/config" "voicesnap/internal/model" ) type fakeDetector struct { locale string } func (f fakeDetector) Detect() string { return f.locale } func TestNormalizeLocale(t *testing.T) { tests := map[string]string{ "zh-CN": model.DefaultLanguageID, "zh_Hans_CN": model.DefaultLanguageID, "zh-HK": model.DefaultLanguageID, "yue-HK": model.CantoneseLanguageID, "yue": model.CantoneseLanguageID, "en-US": model.EnglishLanguageID, "en_GB.UTF-8": model.EnglishLanguageID, "fr-FR": model.FrenchLanguageID, "de-DE": model.GermanLanguageID, "es-MX": model.SpanishLanguageID, "it-IT": model.ItalianLanguageID, "pt-BR": model.PortugueseLanguageID, "ja-JP": model.JapaneseLanguageID, "ko-KR": model.KoreanLanguageID, "": model.EnglishLanguageID, } for input, want := range tests { if got := NormalizeLocale(input); got != want { t.Fatalf("NormalizeLocale(%q) = %q, want %q", input, got, want) } } } func TestResolveAutoUsesDetector(t *testing.T) { settings := Resolve(config.LanguageModeAuto, model.DefaultLanguageID, fakeDetector{locale: "en-US"}) if settings.EffectiveLanguageID != model.EnglishLanguageID { t.Fatalf("effective language = %q, want %q", settings.EffectiveLanguageID, model.EnglishLanguageID) } if settings.UILocale != "en" { t.Fatalf("ui locale = %q, want en", settings.UILocale) } if settings.DefaultModelID != model.MoonshineModelID { t.Fatalf("default model = %q, want %q", settings.DefaultModelID, model.MoonshineModelID) } } func TestResolveManualIgnoresDetector(t *testing.T) { settings := Resolve(config.LanguageModeManual, model.DefaultLanguageID, fakeDetector{locale: "en-US"}) if settings.EffectiveLanguageID != model.DefaultLanguageID { t.Fatalf("effective language = %q, want %q", settings.EffectiveLanguageID, model.DefaultLanguageID) } if settings.UILocale != "zh" { t.Fatalf("ui locale = %q, want zh", settings.UILocale) } } func TestResolveFallsBackInvalidValues(t *testing.T) { settings := Resolve("bad-mode", "bad-language", fakeDetector{locale: "fr-FR"}) if settings.LanguageMode != config.LanguageModeAuto { t.Fatalf("mode = %q, want %q", settings.LanguageMode, config.LanguageModeAuto) } if settings.EffectiveLanguageID != model.FrenchLanguageID { t.Fatalf("effective language = %q, want %q", settings.EffectiveLanguageID, model.FrenchLanguageID) } if settings.DefaultModelID != model.ParakeetV3ModelID { t.Fatalf("default model = %q, want %q", settings.DefaultModelID, model.ParakeetV3ModelID) } } func TestResolveOptionsAreStable(t *testing.T) { settings := Resolve(config.LanguageModeAuto, model.DefaultLanguageID, fakeDetector{locale: "zh-CN"}) if len(settings.Options) != 10 { t.Fatalf("options len = %d, want 10", len(settings.Options)) } if settings.Options[0].ID != model.DefaultLanguageID { t.Fatalf("first option = %q, want %q", settings.Options[0].ID, model.DefaultLanguageID) } if settings.Options[1].ID != model.CantoneseLanguageID { t.Fatalf("second option = %q, want %q", settings.Options[1].ID, model.CantoneseLanguageID) } if settings.Options[2].ID != model.EnglishLanguageID { t.Fatalf("third option = %q, want %q", settings.Options[2].ID, model.EnglishLanguageID) } }