package evidence import ( "context" "testing" ) func TestScrubTitle(t *testing.T) { cases := []struct{ in, want string }{ {"Plain title", "Plain title"}, // no digits-with-separator: untouched {"Buy 2 eggs", "Buy 2 eggs"}, // bare integer: untouched (group is mandatory) {"12.5%", ""}, // percent decimal: stripped whole {"1:23:45 remaining", " remaining"}, // clock ratio: stripped {"-3.0 delta", " delta"}, // leading sign + decimal: stripped {"Download 50.5% complete", "Download complete"}, // embedded percent decimal } for _, c := range cases { if got := ScrubTitle(c.in); got != c.want { t.Errorf("ScrubTitle(%q) = %q, want %q", c.in, got, c.want) } } } // fakeSource satisfies Source for downstream tests and proves the interface shape. type fakeSource struct{ snaps []WindowSnapshot } func (f fakeSource) Watch(ctx context.Context, onChange func(WindowSnapshot)) { for _, s := range f.snaps { onChange(s) } <-ctx.Done() } func TestFakeSourceEmits(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var got []WindowSnapshot src := fakeSource{snaps: []WindowSnapshot{ {Title: "a", Class: "code", Health: EvidenceHealth{Available: true}}, }} go src.Watch(ctx, func(s WindowSnapshot) { got = append(got, s) }) // Give the goroutine a chance, then cancel. cancel() // We can't assert timing deterministically here; this test only confirms the // types and signature compile and Watch accepts the callback. _ = got }