package executor import ( "fmt" "testing" "github.com/tidwall/gjson" ) func TestClaudeBuiltinToolRegistry_DefaultSeedFallback(t *testing.T) { registry := augmentClaudeBuiltinToolRegistry(nil, nil) for _, name := range defaultClaudeBuiltinToolNames { if !registry[name] { t.Fatalf("default builtin %q missing from fallback registry", name) } } } func TestApplyClaudeToolPrefix_KnownFallbackBuiltinsRemainUnprefixed(t *testing.T) { for _, builtin := range defaultClaudeBuiltinToolNames { t.Run(builtin, func(t *testing.T) { input := []byte(fmt.Sprintf(`{ "tools":[{"name":"Read"}], "tool_choice":{"type":"tool","name":%q}, "messages":[{"role":"assistant","content":[{"type":"tool_use","name":%q,"id":"toolu_1","input":{}},{"type":"tool_reference","tool_name":%q},{"type":"tool_result","tool_use_id":"toolu_1","content":[{"type":"tool_reference","tool_name":%q}]}]}] }`, builtin, builtin, builtin, builtin)) out := applyClaudeToolPrefix(input, "proxy_") if got := gjson.GetBytes(out, "tool_choice.name").String(); got != builtin { t.Fatalf("tool_choice.name = %q, want %q", got, builtin) } if got := gjson.GetBytes(out, "messages.0.content.0.name").String(); got != builtin { t.Fatalf("messages.0.content.0.name = %q, want %q", got, builtin) } if got := gjson.GetBytes(out, "messages.0.content.1.tool_name").String(); got != builtin { t.Fatalf("messages.0.content.1.tool_name = %q, want %q", got, builtin) } if got := gjson.GetBytes(out, "messages.0.content.2.content.0.tool_name").String(); got != builtin { t.Fatalf("messages.0.content.2.content.0.tool_name = %q, want %q", got, builtin) } if got := gjson.GetBytes(out, "tools.0.name").String(); got != "proxy_Read" { t.Fatalf("tools.0.name = %q, want %q", got, "proxy_Read") } }) } }