feat(llm): fake supports per-call response sequences

Add VisionResponses to Fake. Vision returns the element matching the
call index (clamped to last beyond length), falling back to VisionResp
when empty. Enables self-consistency voting tests.
This commit is contained in:
2026-06-07 17:37:10 +01:00
parent a49c6ab08d
commit c8edd4aa06
2 changed files with 39 additions and 1 deletions
+25
View File
@@ -19,3 +19,28 @@ func TestFakeClient(t *testing.T) {
t.Fatalf("transcribe got %q err %v", tr, err)
}
}
func TestFakeVisionResponsesCycle(t *testing.T) {
f := &Fake{VisionResponses: []string{"a", "b", "c"}}
want := []string{"a", "b", "c", "c", "c"} // clamps to last beyond slice length
for i, w := range want {
got, err := f.Vision(context.Background(), "p", nil, Options{})
if err != nil {
t.Fatalf("call %d err %v", i, err)
}
if got != w {
t.Fatalf("call %d got %q want %q", i, got, w)
}
}
if len(f.VisionCalls) != len(want) {
t.Fatalf("recorded %d calls, want %d", len(f.VisionCalls), len(want))
}
}
func TestFakeVisionFallsBackToVisionResp(t *testing.T) {
f := &Fake{VisionResp: "single"}
got, err := f.Vision(context.Background(), "p", nil, Options{})
if err != nil || got != "single" {
t.Fatalf("got %q err %v, want single", got, err)
}
}