Files

100 lines
5.5 KiB
Go

package language
import (
"testing"
"ai-operator/internal/dialogue/state"
)
func TestNormalize(t *testing.T) {
cases := map[string]string{
" RU ": "ru",
"Қазақша!": "қазақша",
"по-русски": "по русски",
"ёж тест": "еж тест",
"kk.": "kk",
"қазақ тілі": "қазақ тілі",
}
for in, want := range cases {
if got := Normalize(in); got != want {
t.Fatalf("Normalize(%q)=%q want=%q", in, got, want)
}
}
}
func TestRUDetection(t *testing.T) {
d := NewDetector()
inputs := []string{"ru", "rus", "русский", "русский язык", "на русском", "по русски", "по-русски", "хочу русский", "хочу на русском", "давайте на русском", "говорите на русском", "продолжим на русском", "выбираю русский", "мне русский", "нужен русский", "русский пожалуйста", "russian", "in russian", "speak russian", "russki", "russkiy", "po russki", "руский", "русски", "порусски", "по руски"}
for _, in := range inputs {
got := d.Detect(in, SourceUserText)
if got.Language != LanguageRU || got.Confidence < MediumConfidence || got.NeedsClarification {
t.Fatalf("%q => %+v", in, got)
}
}
}
func TestKKDetection(t *testing.T) {
d := NewDetector()
inputs := []string{"kk", "kz", "қазақша", "қазақ тілі", "қазақ тілінде", "қазақша сөйлейік", "қазақша болсын", "қазақ тілін таңдадым", "қазақша жауап беріңіз", "маған қазақша", "мен қазақша", "қазакша", "казакша", "казахский", "казахский язык", "на казахском", "по казахски", "по-казахски", "хочу казахский", "говорите на казахском", "qazaqsha", "qazaq tili", "kazakh", "in kazakh", "kazaksha", "казақша", "показахски"}
for _, in := range inputs {
got := d.Detect(in, SourceUserText)
if got.Language != LanguageKK || got.Confidence < MediumConfidence || got.NeedsClarification {
t.Fatalf("%q => %+v", in, got)
}
}
}
func TestAmbiguousAndFalsePositive(t *testing.T) {
d := NewDetector()
amb := []string{"я русский", "я казах", "русский или қазақша?", "можно русский, нет қазақша", "сначала русский потом казахский", "я не знаю русский или қазақша"}
for _, in := range amb {
got := d.Detect(in, SourceUserText)
if !got.NeedsClarification || got.Intent != IntentAmbiguous {
t.Fatalf("ambiguous %q => %+v", in, got)
}
}
falsePos := []string{"Казахтелеком", "русский клиент спрашивает", "У меня вопрос на русском сайте", "Алматы русский театр", "тариф ru123", "abckkdef", "какой у меня тариф", "хочу узнать баланс", "оператор нужен"}
for _, in := range falsePos {
got := d.Detect(in, SourceUserText)
if got.Language != LanguageUnknown || got.Intent != IntentNotLanguage {
t.Fatalf("false positive %q => %+v", in, got)
}
}
}
func TestExplicitChangeAndPolicy(t *testing.T) {
d := NewDetector()
cases := map[string]Language{"перейдите на русский": LanguageRU, "переключите на русский": LanguageRU, "switch to russian": LanguageRU, "қазақшаға ауысайық": LanguageKK, "қазақша сөйлейік": LanguageKK, "switch to kazakh": LanguageKK}
for in, want := range cases {
got := d.Detect(in, SourceTranscript)
if got.Intent != IntentLanguageChange || got.Language != want {
t.Fatalf("change %q => %+v", in, got)
}
}
clarify := d.Detect("сменить язык", SourceTranscript)
if !clarify.NeedsClarification || clarify.Language != LanguageUnknown {
t.Fatalf("expected clarification: %+v", clarify)
}
if !ShouldApplyLanguageDetection(SelectionContext{CurrentState: state.StateLanguageSelection}, d.Detect("русский", SourceUserText)).Apply {
t.Fatal("language selection did not apply ru")
}
if !ShouldApplyLanguageDetection(SelectionContext{CurrentState: state.StateLanguageSelection}, d.Detect("қазақша", SourceUserText)).Apply {
t.Fatal("language selection did not apply kk")
}
if ShouldApplyLanguageDetection(SelectionContext{CurrentState: state.StateLanguageSelection}, d.Detect("какой у меня тариф", SourceUserText)).Apply {
t.Fatal("business question applied language")
}
if !ShouldApplyLanguageDetection(SelectionContext{CurrentState: state.StateLanguageSelection}, d.Detect("русский или қазақша?", SourceUserText)).NeedsClarification {
t.Fatal("ambiguous did not request clarification")
}
if ShouldApplyLanguageDetection(SelectionContext{CurrentState: state.StateRegionSelection, AllowChange: true}, d.Detect("русский клиент", SourceUserText)).Apply {
t.Fatal("random mention switched language")
}
if !ShouldApplyLanguageDetection(SelectionContext{CurrentState: state.StateReadyToHelp, AllowChange: true}, d.Detect("перейдите на казахский", SourceUserText)).Apply {
t.Fatal("explicit ready switch did not apply")
}
if ShouldApplyLanguageDetection(SelectionContext{CurrentState: state.StateEnded, AllowChange: true}, d.Detect("русский", SourceUserText)).Apply {
t.Fatal("ended state applied language")
}
}