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, space collapsed {"-3.0 delta", "delta"}, // leading sign + decimal: stripped {"Download 50.5% complete", "Download complete"}, // embedded percent decimal {"⠸ antidrift", "antidrift"}, // braille spinner frame stripped {"⠼ antidrift", "antidrift"}, // different frame collapses to same key {"✳ Check latest commit date", "Check latest commit date"}, // dingbat-star indicator {"⠂ Check latest commit date", "Check latest commit date"}, // same task, different frame {"✳ ⠼ done", "done"}, // multiple glyphs in one title {"C++ build", "C++ build"}, // ASCII symbols kept (not all-symbols) {"日本語 window", "日本語 window"}, // non-ASCII letters preserved } 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") } }