test(tui): add tier 1 unit tests for pure logic functions
Cover search filtering, intent matching, card affordances, checklist parsing, template slot discovery/resolve, date grouping, and truncation.
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestDiscoverSlots(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
body string
|
||||
wantNames []string
|
||||
}{
|
||||
{"no slots", "plain text", nil},
|
||||
{"single slot", "Hello ${name}", []string{"name"}},
|
||||
{"multiple slots", "${greeting} ${name}, welcome to ${place}", []string{"greeting", "name", "place"}},
|
||||
{"duplicate slot deduped", "${x} and ${x} again", []string{"x"}},
|
||||
{"adjacent slots", "${a}${b}", []string{"a", "b"}},
|
||||
{"nested braces ignored", "${{bad}}", nil},
|
||||
{"empty body", "", nil},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := discoverSlots(tt.body)
|
||||
if len(tt.wantNames) == 0 && len(got) == 0 {
|
||||
return
|
||||
}
|
||||
if len(got) != len(tt.wantNames) {
|
||||
t.Fatalf("got %d slots, want %d", len(got), len(tt.wantNames))
|
||||
}
|
||||
for i, s := range got {
|
||||
if s.Name != tt.wantNames[i] {
|
||||
t.Fatalf("slot[%d].Name = %q, want %q", i, s.Name, tt.wantNames[i])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolve(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
body string
|
||||
slots []fillSlot
|
||||
want string
|
||||
}{
|
||||
{
|
||||
"all filled",
|
||||
"Hello ${name}, welcome to ${place}",
|
||||
[]fillSlot{{Name: "name", Value: "Alice"}, {Name: "place", Value: "Nib"}},
|
||||
"Hello Alice, welcome to Nib",
|
||||
},
|
||||
{
|
||||
"unfilled stays as placeholder",
|
||||
"${greeting} ${name}",
|
||||
[]fillSlot{{Name: "greeting", Value: "Hi"}, {Name: "name"}},
|
||||
"Hi ${name}",
|
||||
},
|
||||
{
|
||||
"no slots",
|
||||
"plain text",
|
||||
nil,
|
||||
"plain text",
|
||||
},
|
||||
{
|
||||
"repeated slot filled everywhere",
|
||||
"${x} and ${x}",
|
||||
[]fillSlot{{Name: "x", Value: "Y"}},
|
||||
"Y and Y",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
f := fillModel{body: tt.body, slots: tt.slots}
|
||||
if got := f.resolve(); got != tt.want {
|
||||
t.Fatalf("resolve() = %q, want %q", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user