package execute import ( "encoding/json" "testing" ) func TestResultTierArgs_CallToolCold(t *testing.T) { s := &Server{} args := json.RawMessage(`{"calls":[{"tool":"file_read","args":["/tmp/x"]}]}`) if got := s.ResultTierArgs("call_tool", args); got != "cold" { t.Errorf("ResultTierArgs(call_tool, file_read) = %q; want cold", got) } } func TestResultTierArgs_CallToolMultipleCold(t *testing.T) { s := &Server{} args := json.RawMessage(`{"calls":[{"tool":"file_read","args":["/a"]},{"tool":"file_grep","args":["pat"]}]}`) if got := s.ResultTierArgs("call_tool", args); got != "cold" { t.Errorf("ResultTierArgs(call_tool, file_read+file_grep) = %q; want cold", got) } } func TestResultTierArgs_CallToolMixedHot(t *testing.T) { s := &Server{} // file_write is not in defaultColdTools and has no script, so falls back to hot args := json.RawMessage(`{"calls":[{"tool":"file_read","args":["/a"]},{"tool":"file_write","args":["/b","x"]}]}`) if got := s.ResultTierArgs("call_tool", args); got != "cold" { t.Errorf("ResultTierArgs(call_tool, file_read+file_write) = %q; want cold (coldest wins)", got) } } func TestResultTierArgs_CallToolParallel(t *testing.T) { s := &Server{} args := json.RawMessage(`{"calls":[{"parallel":[{"tool":"file_grep","args":["x"]},{"tool":"lsp_hover","args":["/f","1","1"]}]}]}`) if got := s.ResultTierArgs("call_tool", args); got != "cold" { t.Errorf("ResultTierArgs(call_tool, parallel cold tools) = %q; want cold", got) } } func TestResultTierArgs_PipeCold(t *testing.T) { s := &Server{} args := json.RawMessage(`{"stages":[{"tool":"file_grep","args":["TODO"]},{"code":"wc -l"}]}`) if got := s.ResultTierArgs("pipe", args); got != "cold" { t.Errorf("ResultTierArgs(pipe, file_grep+code) = %q; want cold", got) } } func TestResultTierArgs_ExecuteCode(t *testing.T) { s := &Server{} args := json.RawMessage(`{"steps":[{"code":"date"}]}`) if got := s.ResultTierArgs("execute_code", args); got != "warm" { t.Errorf("ResultTierArgs(execute_code) = %q; want warm", got) } } func TestResultTierArgs_BadJSON(t *testing.T) { s := &Server{} if got := s.ResultTierArgs("call_tool", json.RawMessage(`{invalid`)); got != "hot" { t.Errorf("ResultTierArgs(bad json) = %q; want hot", got) } } func TestResultTierArgs_EmptyCalls(t *testing.T) { s := &Server{} if got := s.ResultTierArgs("call_tool", json.RawMessage(`{"calls":[]}`)); got != "hot" { t.Errorf("ResultTierArgs(empty calls) = %q; want hot", got) } } func TestResultTier_DefaultColdTools(t *testing.T) { s := &Server{} coldTools := []string{"file_read", "file_grep", "file_glob", "memory_recall", "web_fetch", "web_search", "lsp_definition", "lsp_references", "lsp_hover", "lsp_symbols", "lsp_completion", "lsp_diagnostics", "reasoning_think"} for _, name := range coldTools { if got := s.ResultTier(name); got != "cold" { t.Errorf("ResultTier(%q) = %q; want cold", name, got) } } } func TestColderTier(t *testing.T) { tests := []struct{ a, b, want string }{ {"hot", "cold", "cold"}, {"cold", "hot", "cold"}, {"warm", "cold", "cold"}, {"hot", "warm", "warm"}, {"hot", "hot", "hot"}, {"cold", "cold", "cold"}, } for _, tt := range tests { if got := colderTier(tt.a, tt.b); got != tt.want { t.Errorf("colderTier(%q, %q) = %q; want %q", tt.a, tt.b, got, tt.want) } } }