package router

import "testing"

func TestIsQuestionShaped(t *testing.T) {
	// The seven utterances #470 recorded, plus the captures that must keep
	// working. A capture misread as a question loses a fact; a question
	// misread as a capture poisons recall, so the captures are the ones worth
	// pinning here.
	cases := []struct {
		text string
		want bool
	}{
		{"какая последняя версия языка Go?", true},
		{"что дальше?", true},
		{"расскажи про битву при Ватерлоо", true},
		{"почему небо синее?", true},
		{"какая столица Австралии?", true},
		{"кто такой Никола Тесла?", true},
		{"сколько стоит доллар", true},
		{"who is the premier of Japan", true},
		{"объясни линии Фраунгофера", true},

		{"запиши что я пил воду", false},
		{"запомни какая у меня машина", false},
		{"отметь что я поужинал", false},
		{"поужинал", false},
		{"я выпил кофе", false},
		{"вода", false},
		{"привет", false},
		{"", false},
	}
	for _, c := range cases {
		if got := IsQuestionShaped(c.text); got != c.want {
			t.Errorf("IsQuestionShaped(%q) = %v, want %v", c.text, got, c.want)
		}
	}
}

// Substring matching is what made the day-plan predicates wrong before, and
// this predicate gates a write, so it gets the same guard.
func TestIsQuestionShapedIsTokenized(t *testing.T) {
	for _, text := range []string{"чтобы не забыть, я полил кактус", "какао выпил"} {
		if IsQuestionShaped(text) {
			t.Errorf("IsQuestionShaped(%q) = true; a question word inside a longer word is not a question", text)
		}
	}
}

func TestIsOpenQuestionShapedDistinguishesWordsFromPunctuation(t *testing.T) {
	for _, text := range []string{
		"где лежит запасной ключ?",
		"как я восстановил конфиги",
		"which colour scheme do i like",
		"расскажи про домашний сервер",
	} {
		if !IsOpenQuestionShaped(text) {
			t.Errorf("IsOpenQuestionShaped(%q) = false, want an explicit information request", text)
		}
	}
	for _, text := range []string{
		"я отменил напоминание про молоко?",
		"сервер работает?",
		"запиши что я пил воду?",
	} {
		if IsOpenQuestionShaped(text) {
			t.Errorf("IsOpenQuestionShaped(%q) = true; punctuation alone is not an open question", text)
		}
	}
	// Existing callers still need polar punctuation to count as a question.
	if !IsQuestionShaped("сервер работает?") {
		t.Error("IsQuestionShaped stopped recognising a polar question")
	}
}

func TestIsLocativeQuestionShaped(t *testing.T) {
	for _, text := range []string{
		"где мой паспорт?",
		"куда я спрятал второй ключ",
		"откуда берётся токен",
		"докуда идёт автобус",
		"where is the big disk mounted",
	} {
		if !IsLocativeQuestionShaped(text) {
			t.Errorf("IsLocativeQuestionShaped(%q) = false, want true", text)
		}
	}
	for _, text := range []string{
		"во сколько я обычно засыпаю",
		"which colour scheme do i like",
		"сервер работает?",
		"запиши где лежит ключ",
	} {
		if IsLocativeQuestionShaped(text) {
			t.Errorf("IsLocativeQuestionShaped(%q) = true, want false", text)
		}
	}
}
