71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
package autocomplete_test
|
|
|
|
import (
|
|
"slices"
|
|
"testing"
|
|
|
|
"git.sunturtle.xyz/zephyr/horsebot/autocomplete"
|
|
)
|
|
|
|
func these(s ...string) []string { return s }
|
|
|
|
func TestAutocomplete(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
add []string
|
|
search string
|
|
want []string
|
|
}{
|
|
{
|
|
name: "empty",
|
|
add: nil,
|
|
search: "",
|
|
want: nil,
|
|
},
|
|
{
|
|
name: "exact",
|
|
add: these("bocchi"),
|
|
search: "bocchi",
|
|
want: these("bocchi"),
|
|
},
|
|
{
|
|
name: "extra",
|
|
add: these("bocchi", "ryo", "nijika", "kita"),
|
|
search: "bocchi",
|
|
want: these("bocchi"),
|
|
},
|
|
{
|
|
name: "short",
|
|
add: these("bocchi", "ryo", "nijika", "kita"),
|
|
search: "o",
|
|
want: these("bocchi", "ryo"),
|
|
},
|
|
{
|
|
name: "unrelated",
|
|
add: these("bocchi", "ryo", "nijika", "kita"),
|
|
search: "x",
|
|
want: nil,
|
|
},
|
|
{
|
|
name: "map",
|
|
add: these("Corazón ☆ Ardiente"),
|
|
search: "corazo",
|
|
want: these("Corazón ☆ Ardiente"),
|
|
},
|
|
}
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
var set autocomplete.Set[string]
|
|
for _, s := range c.add {
|
|
set.Add(s, s)
|
|
}
|
|
got := set.Find(nil, c.search)
|
|
slices.Sort(c.want)
|
|
slices.Sort(got)
|
|
if !slices.Equal(c.want, got) {
|
|
t.Errorf("wrong results: want %q, got %q", c.want, got)
|
|
}
|
|
})
|
|
}
|
|
}
|