f3c0540b42
Also fixes a flake this stack introduced: the feeds test matched "ничего нового" as a substring, and query_ru_v1.json can answer with "в лентах тихо". It asks the entry now, like the others.
63 lines
2.1 KiB
Go
63 lines
2.1 KiB
Go
package eval
|
|
|
|
import (
|
|
"math/rand"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/kami/maven/internal/phraser"
|
|
)
|
|
|
|
// TestFallbackPersona scores every line in every hand-written line family on the persona checks the nudges already pass. These lines are
|
|
// heard out loud and they live in a JSON file now, so a reworded variant that
|
|
// says "рад" or "вы" would otherwise reach him with nothing in between.
|
|
//
|
|
// Only the persona checks run. Mood and topic belong to a nudge, and these are
|
|
// not nudges.
|
|
func TestFallbackPersona(t *testing.T) {
|
|
fb, err := phraser.LoadFallbacks(rand.NewSource(20260804))
|
|
if err != nil {
|
|
t.Fatalf("LoadFallbacks: %v", err)
|
|
}
|
|
// No CheckHisGender. It reads a feminine verb near a second-person pronoun
|
|
// as addressing him as a woman, which is right for a nudge and wrong here:
|
|
// "не знаю — не нашла у тебя такой записи" is her own verb in her own
|
|
// sentence. CheckFeminine still holds her side of the rule.
|
|
persona := map[string]bool{
|
|
CheckLang: true, CheckFeminine: true,
|
|
CheckAddress: true, CheckCringe: true, CheckLength: true,
|
|
}
|
|
ack, err := phraser.LoadAcks(rand.NewSource(20260804))
|
|
if err != nil {
|
|
t.Fatalf("LoadAcks: %v", err)
|
|
}
|
|
qry, err := phraser.LoadQueries(rand.NewSource(20260804))
|
|
if err != nil {
|
|
t.Fatalf("LoadQueries: %v", err)
|
|
}
|
|
variants := append(fb.Variants(), ack.Variants()...)
|
|
variants = append(variants, qry.Variants()...)
|
|
act, err := phraser.LoadActs(rand.NewSource(20260804))
|
|
if err != nil {
|
|
t.Fatalf("LoadActs: %v", err)
|
|
}
|
|
variants = append(variants, act.Variants()...)
|
|
if len(variants) == 0 {
|
|
t.Fatal("no variants — the file loaded empty")
|
|
}
|
|
for _, v := range variants {
|
|
// The placeholders stand for his own words and carry no persona.
|
|
body := v
|
|
for _, ph := range []string{"{sources}", "{key}", "{value}", "{fn}", "{text}", "{when}", "{items}",
|
|
"{location}", "{temp}", "{condition}", "{tail}", "{out}", "{name}",
|
|
"{entity}", "{count}", "{word}"} {
|
|
body = strings.ReplaceAll(body, ph, "вода")
|
|
}
|
|
for _, r := range RunChecks(Case{}, body, "neutral") {
|
|
if persona[r.Name] && !r.Pass {
|
|
t.Errorf("%q fails %s: %s", v, r.Name, r.Detail)
|
|
}
|
|
}
|
|
}
|
|
}
|