1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
package day
import "testing"
var types = []ActivityType{
{ID: "1", Name: "ARCHER", Color: "#c04000"},
{ID: "2", Name: "Archery practice", Color: "#00c040"},
{ID: "3", Name: "Foofaraw", Color: "#4000c0"},
{ID: "4", Name: "Reading", Color: "#404040"},
}
var typesWithDuplicates = []ActivityType{
{ID: "4a", Name: "Reading", Color: "#404040"},
{ID: "4b", Name: "READING", Color: "#505050"},
}
func names(ms []ActivityType) []string {
out := make([]string, len(ms))
for i, m := range ms {
out[i] = m.Name
}
return out
}
func ids(ms []ActivityType) []string {
out := make([]string, len(ms))
for i, m := range ms {
out[i] = m.ID
}
return out
}
func TestMatchActivity(t *testing.T) {
cases := []struct {
query string
want []string
}{
{"archer", []string{"ARCHER"}}, // exact beats prefix
{"arch", []string{"ARCHER", "Archery practice"}}, // prefix, both
{"foo", []string{"Foofaraw"}},
{"ading", []string{"Reading"}}, // substring fallback
{"xyz", []string{}},
{"READING", []string{"Reading"}},
{"", []string{}}, // empty query
{" ", []string{}}, // whitespace-only query
}
for _, c := range cases {
got := names(MatchActivity(c.query, types))
if len(got) != len(c.want) {
t.Fatalf("%q: got %v, want %v", c.query, got, c.want)
}
for i := range got {
if got[i] != c.want[i] {
t.Fatalf("%q: got %v, want %v", c.query, got, c.want)
}
}
}
}
func TestMatchActivityExactTies(t *testing.T) {
// When multiple names match exactly (case-insensitive), first wins
got := ids(MatchActivity("reading", typesWithDuplicates))
if len(got) != 1 {
t.Fatalf("reading: got %d results, want 1", len(got))
}
if got[0] != "4a" {
t.Fatalf("reading: got ID %q, want %q (first match)", got[0], "4a")
}
}
|