8bbdcd2727
Russian names a half hour by the hour it is entering, in the genitive, so "половина восьмого" is 07:30 and never 08:30. Neither date parser read that shape, so the reminder parsed to nothing. rewriteHalfPast runs in front of the token pass in SpellOutDigits, so the python parser and the stub both see "в 7:30". It also reads the contracted "полвосьмого" and the quarter-to shape "без четверти восемь", which counts from a cardinal and is 07:45. Minus one is in one place, clockHourBefore, with twelve rather than zero before one. Ordinals eleven and twelve added to the lexicon, because a clock reaches them. Minutes a spoken clock does not use are left alone: a guess here is a missed dose. Classifier + onnx over the routing fixture 58/82 to 62/87, three new cases, none regressed. Python dateparser is not installed on this host, so only the stub was measured. See docs/evals/2026-08-05-half-past-hours.md.
39 lines
1.4 KiB
Go
39 lines
1.4 KiB
Go
package router
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestSpellOutDigits(t *testing.T) {
|
|
for _, tc := range []struct{ in, want string }{
|
|
{"напомни мне позвонить маме в семь вечера", "напомни мне позвонить маме в 7 вечера"},
|
|
{"в три часа дня", "в 3 часа дня"},
|
|
{"напомни в половине шестого", "напомни в 5:30"},
|
|
{"через двадцать минут", "через 20 минут"},
|
|
// Untouched: no time word stands beside the number.
|
|
{"купить три яблока", "купить три яблока"},
|
|
{"семь раз отмерь", "семь раз отмерь"},
|
|
{"напомни в 19:00", "напомни в 19:00"},
|
|
{"", ""},
|
|
} {
|
|
if got := SpellOutDigits(tc.in); got != tc.want {
|
|
t.Errorf("SpellOutDigits(%q) = %q, want %q", tc.in, got, tc.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// The utterance from the QA sitting that named this bug: the numeric form
|
|
// parsed and the spoken form did not.
|
|
func TestStubParsesASpokenHour(t *testing.T) {
|
|
now := time.Date(2026, 8, 2, 9, 0, 0, 0, time.Local)
|
|
got, ok, err := StubDateTimeParser{}.Parse(context.Background(), "напомни мне позвонить маме в семь вечера", now)
|
|
if err != nil || !ok {
|
|
t.Fatalf("Parse ok=%v err=%v, want a time", ok, err)
|
|
}
|
|
if got.Hour() != 19 {
|
|
t.Fatalf("hour = %d, want 19", got.Hour())
|
|
}
|
|
}
|