- 支持三种图表: 折线图、柱状图、散点图 - MCP 协议支持 (stdio + HTTP) - 完整的单元测试和集成测试 - Docker 支持 - Makefile 构建脚本
172 lines
3.8 KiB
Go
172 lines
3.8 KiB
Go
// 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("应该解析小数")
|
|
}
|
|
}
|