53 lines
1.4 KiB
Go
53 lines
1.4 KiB
Go
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)
|
||
}
|
||
}
|
||
}
|