c21d8fdcee
IsDayPlanQuery fires on the token "планы" and its other-day list does not know weekday names, so "какие у меня обычно планы по вторникам?" was claimed by the day plan, which answered today's calendar stamped with today's date. The habit source never ran. The matcher now declines any utterance ParseHabitQuery claims, which keeps the decision out of the source table's ordering. Two gaps in the same matcher. Sunday had only its dative plural listed, so "в воскресенье" found no weekday. "по выходным" named days that no weekday word matches, so it was answered with the whole-week profile. Both are recognised now, and the weekend is read back as two days rather than pooled. Found in review of #59.
91 lines
3.1 KiB
Go
91 lines
3.1 KiB
Go
package router
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestParseHabitQuery(t *testing.T) {
|
|
tests := []struct {
|
|
in string
|
|
ok bool
|
|
wd time.Weekday
|
|
hasWD bool
|
|
}{
|
|
{"что я обычно делаю по вторникам?", true, time.Tuesday, true},
|
|
{"что я обычно делаю?", true, 0, false},
|
|
{"какие у меня привычки", true, 0, false},
|
|
{"что я каждую пятницу делаю", true, time.Friday, true},
|
|
{"what do i usually do on mondays?", true, time.Monday, true},
|
|
// No habit marker: this is a question about the coming Wednesday, and
|
|
// the calendar owns it. Answering with an average answers the wrong
|
|
// question.
|
|
{"что я делаю в среду?", false, 0, false},
|
|
{"что у меня сегодня?", false, 0, false},
|
|
{"какие планы на сегодня?", false, 0, false},
|
|
{"", false, 0, false},
|
|
}
|
|
for _, tt := range tests {
|
|
q, ok := ParseHabitQuery(tt.in)
|
|
if ok != tt.ok {
|
|
t.Errorf("ParseHabitQuery(%q) ok = %v, want %v", tt.in, ok, tt.ok)
|
|
continue
|
|
}
|
|
if !ok {
|
|
continue
|
|
}
|
|
if q.HasWeekday != tt.hasWD {
|
|
t.Errorf("ParseHabitQuery(%q) hasWeekday = %v, want %v", tt.in, q.HasWeekday, tt.hasWD)
|
|
continue
|
|
}
|
|
if q.HasWeekday && q.Weekday != tt.wd {
|
|
t.Errorf("ParseHabitQuery(%q) weekday = %v, want %v", tt.in, q.Weekday, tt.wd)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestHabitQueryBeatsDayPlan — "какие у меня обычно планы по вторникам?" is a
|
|
// habit question that happens to carry a plan word. The day plan claimed it
|
|
// first and answered today's calendar stamped with today's date, and the habit
|
|
// source never ran.
|
|
func TestHabitQueryBeatsDayPlan(t *testing.T) {
|
|
for _, q := range []string{
|
|
"какие у меня обычно планы по вторникам?",
|
|
"что обычно по плану в среду?",
|
|
"какие планы обычно по выходным?",
|
|
} {
|
|
if IsDayPlanQuery(q) {
|
|
t.Errorf("%q was claimed as a day plan", q)
|
|
}
|
|
if _, ok := ParseHabitQuery(q); !ok {
|
|
t.Errorf("%q is not parsed as a habit question", q)
|
|
}
|
|
}
|
|
// A plan question without a habit marker still belongs to the day plan.
|
|
for _, q := range []string{"какие планы на сегодня?", "что у меня по плану?"} {
|
|
if !IsDayPlanQuery(q) {
|
|
t.Errorf("%q must still be a day plan", q)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestHabitQueryWeekendAndSundayForms — "по выходным" names days but no
|
|
// weekday, so it used to be answered with the whole-week profile. Sunday had
|
|
// only its dative plural listed.
|
|
func TestHabitQueryWeekendAndSundayForms(t *testing.T) {
|
|
q, ok := ParseHabitQuery("что я обычно делаю по выходным?")
|
|
if !ok || !q.Weekend || q.HasWeekday {
|
|
t.Errorf("weekend query parsed as %+v (ok=%v)", q, ok)
|
|
}
|
|
for _, s := range []string{
|
|
"что я обычно делаю в воскресенье?",
|
|
"чем я обычно занят по воскресеньям?",
|
|
"что обычно бывает в воскресенья?",
|
|
} {
|
|
q, ok := ParseHabitQuery(s)
|
|
if !ok || !q.HasWeekday || q.Weekday != time.Sunday {
|
|
t.Errorf("%q parsed as %+v (ok=%v)", s, q, ok)
|
|
}
|
|
}
|
|
}
|