package calculator import ( "strings" "testing" ) func TestEvaluateBasicArithmetic(t *testing.T) { tests := []struct { expression string want float64 }{ {expression: "1+2*3", want: 7}, {expression: "(1+2)*3", want: 9}, {expression: "12.5*(3+4)/2", want: 43.75}, {expression: "-2 + 3", want: 1}, {expression: "(8+4)÷3", want: 4}, } for _, tt := range tests { got, err := Evaluate(tt.expression) if err != nil { t.Fatalf("Evaluate(%q) error: %v", tt.expression, err) } if got != tt.want { t.Fatalf("Evaluate(%q) = %v, want %v", tt.expression, got, tt.want) } } } func TestEvaluateErrors(t *testing.T) { for _, expression := range []string{"1/0", "1+", "(1+2", "2^3"} { if _, err := Evaluate(expression); err == nil { t.Fatalf("Evaluate(%q) expected error", expression) } } } func TestToolDefinitionAndExecuteTool(t *testing.T) { definition := ToolDefinition("custom calculator") if definition.Function == nil || definition.Function.Name != ToolName || definition.Function.Description != "custom calculator" { t.Fatalf("unexpected definition: %#v", definition) } text, err := ExecuteTool(`{"expression":"12.5*(3+4)/2","reason":"用户询问计算结果"}`) if err != nil { t.Fatal(err) } for _, want := range []string{"计算器工具结果", "12.5*(3+4)/2", "43.75", "用户询问计算结果"} { if !strings.Contains(text, want) { t.Fatalf("tool result missing %q:\n%s", want, text) } } }