nub/internal/tool/tool_test.go
Tom a97013d876 initial commit
- v 0.1.0 siehe CHANGELOG.md
2026-07-25 11:08:01 +02:00

48 lines
1.5 KiB
Go

package tool
import (
"context"
"encoding/json"
"testing"
)
type stubTool struct{ name string }
func (s stubTool) Name() string { return s.name }
func (s stubTool) Description() string { return "" }
func (s stubTool) Schema() json.RawMessage { return json.RawMessage(`{}`) }
func (s stubTool) Run(ctx context.Context, input json.RawMessage, env Env) (Result, error) {
return Result{}, nil
}
// TestRegistry_Defs_StableOrder sichert einen konkreten Bug ab: Defs()
// iterierte früher direkt über die interne Map, deren Reihenfolge Go pro
// Aufruf zufällig mischt. Da tools im Request vor messages steht und Teil
// des gecachten Prefix ist (E-06), hat das Prompt-Caching bei jedem Turn
// neu gebrochen. Defs() muss deterministisch (nach Name) sortiert sein.
func TestRegistry_Defs_StableOrder(t *testing.T) {
r := NewRegistry()
names := []string{"read", "write", "edit", "bash", "glob", "grep", "todo", "read_skill"}
for _, n := range names {
r.Register(stubTool{name: n})
}
first := r.Defs()
for i := 0; i < 20; i++ {
got := r.Defs()
if len(got) != len(first) {
t.Fatalf("Defs() length changed between calls: %d vs %d", len(got), len(first))
}
for j := range got {
if got[j].Name != first[j].Name {
t.Fatalf("Defs() order not stable across calls (iteration %d): %+v vs %+v", i, got, first)
}
}
}
for i := 1; i < len(first); i++ {
if first[i-1].Name > first[i].Name {
t.Errorf("Defs() not sorted by name: %q before %q", first[i-1].Name, first[i].Name)
}
}
}