package evidence import ( "context" "testing" "time" ) 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()) defer cancel() got := make(chan WindowSnapshot, 1) src := fakeSource{snaps: []WindowSnapshot{ {Title: "a", Class: "code", Health: EvidenceHealth{Available: true}}, }} // The channel synchronizes the producing goroutine with this one, so the // read below is race-free and we can actually assert the emission. go src.Watch(ctx, func(s WindowSnapshot) { select { case got <- s: default: } }) select { case s := <-got: if s.Class != "code" { t.Errorf("got class %q, want code", s.Class) } case <-time.After(time.Second): t.Fatal("fakeSource emitted no snapshot") } }