Files
ttychart-mcp/tools/provider_test.go
titor d3e04c5d1a feat: 初始版本 - ttychart-mcp 终端图表 MCP 服务
- 支持三种图表: 折线图、柱状图、散点图
- MCP 协议支持 (stdio + HTTP)
- 完整的单元测试和集成测试
- Docker 支持
- Makefile 构建脚本
2026-04-15 21:03:36 +08:00

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("应该解析小数")
}
}