Files
2026-08-14 23:41:57 +08:00

56 lines
1.7 KiB
Go

package memory
import "testing"
func TestBuildFtsQueryMultiWordOrJoin(t *testing.T) {
got := buildFtsQuery("permission deadlock retry")
want := `"permission" OR "deadlock" OR "retry"`
if got != want {
t.Fatalf("buildFtsQuery multi-word: got %q want %q", got, want)
}
}
func TestBuildFtsQuerySingleToken(t *testing.T) {
if got := buildFtsQuery("checkpoint"); got != `"checkpoint"` {
t.Fatalf("buildFtsQuery single: got %q", got)
}
}
func TestBuildFtsQueryCJKTokensKept(t *testing.T) {
// CJK letters are \p{L} and must survive tokenization. Whitespace splits
// them into separate tokens; punctuation is a separator.
got := buildFtsQuery("配置文件 端口")
want := `"配置文件" OR "端口"`
if got != want {
t.Fatalf("buildFtsQuery CJK: got %q want %q", got, want)
}
}
func TestBuildFtsQueryPunctuationStripped(t *testing.T) {
// FTS5 special chars and punctuation become separators; underscores and
// digits are word characters.
got := buildFtsQuery(`port: 5433 (postgres-db) foo_bar`)
want := `"port" OR "5433" OR "postgres" OR "db" OR "foo_bar"`
if got != want {
t.Fatalf("buildFtsQuery punctuation: got %q want %q", got, want)
}
}
func TestBuildFtsQueryStripsEmbeddedQuotes(t *testing.T) {
// A token can only contain word chars, so a raw double-quote is a
// separator; but guard the strip explicitly.
got := buildFtsQuery(`say "hello"`)
want := `"say" OR "hello"`
if got != want {
t.Fatalf("buildFtsQuery quotes: got %q want %q", got, want)
}
}
func TestBuildFtsQueryEmptyAndWhitespace(t *testing.T) {
for _, in := range []string{"", " ", "\t\n", "!!! ??? ... ---", "()[]{}"} {
if got := buildFtsQuery(in); got != "" {
t.Fatalf("buildFtsQuery(%q): got %q want empty", in, got)
}
}
}