package claude import ( "testing" "github.com/tidwall/gjson" ) func TestConvertClaudeRequestToGemini_ToolChoice_SpecificTool(t *testing.T) { inputJSON := []byte(`{ "model": "gemini-3-flash-preview", "messages": [ { "role": "user", "content": [ {"type": "text", "text": "hi"} ] } ], "tools": [ { "name": "json", "description": "A JSON tool", "input_schema": { "type": "object", "properties": {} } } ], "tool_choice": {"type": "tool", "name": "json"} }`) output := ConvertClaudeRequestToGemini("gemini-3-flash-preview", inputJSON, false) if got := gjson.GetBytes(output, "toolConfig.functionCallingConfig.mode").String(); got != "ANY" { t.Fatalf("Expected toolConfig.functionCallingConfig.mode 'ANY', got '%s'", got) } allowed := gjson.GetBytes(output, "toolConfig.functionCallingConfig.allowedFunctionNames").Array() if len(allowed) != 1 || allowed[0].String() != "json" { t.Fatalf("Expected allowedFunctionNames ['json'], got %s", gjson.GetBytes(output, "toolConfig.functionCallingConfig.allowedFunctionNames").Raw) } } func TestConvertClaudeRequestToGemini_ImageContent(t *testing.T) { inputJSON := []byte(`{ "model": "gemini-3-flash-preview", "messages": [ { "role": "user", "content": [ {"type": "text", "text": "describe this image"}, { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "aGVsbG8=" } } ] } ] }`) output := ConvertClaudeRequestToGemini("gemini-3-flash-preview", inputJSON, false) parts := gjson.GetBytes(output, "contents.0.parts").Array() if len(parts) != 2 { t.Fatalf("Expected 2 parts, got %d", len(parts)) } if got := parts[0].Get("text").String(); got != "describe this image" { t.Fatalf("Expected first part text 'describe this image', got '%s'", got) } if got := parts[1].Get("inline_data.mime_type").String(); got != "image/png" { t.Fatalf("Expected image mime type 'image/png', got '%s'", got) } if got := parts[1].Get("inline_data.data").String(); got != "aGVsbG8=" { t.Fatalf("Expected image data 'aGVsbG8=', got '%s'", got) } }