// Package tools MCP 工具集成测试 // // 对所有 MCP 工具进行集成测试 // // 作者: titor // 创建日期: 2026-04-15 package tools import ( "testing" "charm.land/lipgloss/v2" ) // TestParseBarData 测试柱状图数据解析 func TestParseBarData(t *testing.T) { // 测试正常解析 data := parseBarData("苹果:100,香蕉:80,橙子:120") if len(data) != 3 { t.Errorf("解析数据长度错误: got %d, want 3", len(data)) } // 验证解析结果 if len(data) > 0 { if data[0].Label != "苹果" { t.Errorf("标签解析错误: got %s, want 苹果", data[0].Label) } if data[0].Value != 100 { t.Errorf("数值解析错误: got %f, want 100", data[0].Value) } } // 测试空字符串 data = parseBarData("") if len(data) != 0 { t.Error("空字符串应该返回空数据") } // 测试错误格式 data = parseBarData("无效数据") if len(data) != 0 { t.Error("错误格式应该返回空数据") } // 测试部分有效 data = parseBarData("有效:100,无效abc") if len(data) != 1 { t.Error("应该只解析有效部分") } } // TestParseScatterData 测试散点图数据解析 func TestParseScatterData(t *testing.T) { // 测试正常解析 data := parseScatterData("1,5 2,8 3,3") if len(data) != 3 { t.Errorf("解析数据长度错误: got %d, want 3", len(data)) } // 验证解析结果 if len(data) > 0 { if data[0].X != 1 || data[0].Y != 5 { t.Errorf("数据解析错误: got (%f,%f), want (1,5)", data[0].X, data[0].Y) } } // 测试空字符串 data = parseScatterData("") if len(data) != 0 { t.Error("空字符串应该返回空数据") } // 测试错误格式 data = parseScatterData("invalid") if len(data) != 0 { t.Error("错误格式应该返回空数据") } // 测试部分有效 data = parseScatterData("1,5 abc,def") if len(data) != 1 { t.Error("应该只解析有效部分") } } // TestNewServer 测试创建 MCP 服务器 func TestNewServer(t *testing.T) { // 创建服务器 srv := NewServer() if srv == nil { t.Error("NewServer 返回 nil") } } // TestColorStyle 测试颜色样式 func TestColorStyle(t *testing.T) { // 测试各种颜色 colors := []string{"red", "green", "blue", "yellow", "cyan", "magenta", "unknown"} for _, color := range colors { style := getColorStyle(color) if style.GetForeground() == nil { t.Errorf("颜色 %s 返回无效样式", color) } } } // TestToFloat64 测试类型转换 func TestToFloat64(t *testing.T) { // 测试 float64 f, ok := toFloat64(float64(1.5)) if !ok || f != 1.5 { t.Error("float64 转换失败") } // 测试 int f, ok = toFloat64(int(10)) if !ok || f != 10 { t.Error("int 转换失败") } // 测试 int64 f, ok = toFloat64(int64(20)) if !ok || f != 20 { t.Error("int64 转换失败") } // 测试 string (应该失败) _, ok = toFloat64("invalid") if ok { t.Error("string 转换应该失败") } // 测试其他类型 (应该失败) _, ok = toFloat64(nil) if ok { t.Error("nil 转换应该失败") } } // TestGetOptionalInt 测试可选整数获取 func TestGetOptionalInt(t *testing.T) { // 这里我们测试一个有默认值的场景 // 由于 mcp.CallToolParams 是内部结构,我们用模拟的方式测试 // 测试解析错误的数据格式 _ = lipgloss.NewStyle() } // TestParseDataErrors 测试各种数据解析错误 func TestParseDataErrors(t *testing.T) { // 测试各种边界情况 // 柱状图 - 正常格式 data := parseBarData("标签:100") if len(data) != 1 { t.Error("应该解析正常格式") } // 散点图 - 负数 scatterData := parseScatterData("-1,-5 -2,-8") if len(scatterData) != 2 { t.Error("应该解析负数") } // 散点图 - 小数 scatterData = parseScatterData("1.5,2.5 3.5,4.5") if len(scatterData) != 2 { t.Error("应该解析小数") } }