Keep observer composition storage proportional to selected callbacks

This commit is contained in:
2026-11-14 14:29:39 +00:00
parent 64cf84c9b5
commit 892cb74e6e
3 changed files with 47 additions and 5 deletions

View File

@@ -31,6 +31,31 @@ func TestComposeObserversCopiesAndOrders(t *testing.T) {
promptkit.ComposeObservers(func(promptkit.ExecutionEvent) { panic("panic") }, second)(promptkit.ExecutionEvent{})
}
func TestComposeObserversSparseSelection(t *testing.T) {
for _, selected := range []int{0, 1, 2} {
calls := 0
observers := make([]promptkit.ExecutionObserver, 1024)
callback := func(promptkit.ExecutionEvent) { calls++ }
for index := 0; index < selected; index++ {
observers[len(observers)-1-index] = callback
}
composed := promptkit.ComposeObservers(observers...)
for index := range observers {
observers[index] = func(promptkit.ExecutionEvent) { calls += 100 }
}
if selected == 0 {
if composed != nil {
t.Fatal("all-nil composition must be nil")
}
continue
}
composed(promptkit.ExecutionEvent{})
if calls != selected {
t.Fatalf("selected %d callbacks, got %d calls", selected, calls)
}
}
}
func TestCoordinateObserverCompositionAndNestedSelection(t *testing.T) {
engine := newSimpleEngine(t, "question", promptkit.WithLLMClient(&fakeLLMClient{response: &promptkit.GenerateResponse{Content: "answer"}}))
ctx := context.Background()