import { describe, it, expect } from "vitest"; import { extractChartBlocks, isChartSpec, hasChart } from "./chartspec"; const spec = { type: "bar", title: "销量", labels: ["Q1", "Q2"], series: [{ name: "销量", data: [120, 180] }] }; describe("isChartSpec", () => { it("合法 spec 通过", () => expect(isChartSpec(spec)).toBe(true)); it.each([ {}, { type: "x", labels: ["a"], series: [{ data: [1] }] }, { type: "bar", labels: [], series: [{ data: [] }] }, { type: "bar", labels: ["a"], series: [] }, { type: "bar", labels: ["a"], series: [{ name: "x" }] }, // 无 data ])("非法 spec 拒绝 %#", (bad) => expect(isChartSpec(bad)).toBe(false)); }); describe("extractChartBlocks", () => { it("纯文本 → 单个 text 段", () => { const segs = extractChartBlocks("你好世界"); expect(segs).toEqual([{ kind: "text", text: "你好世界" }]); }); it("文本 + chart 块 + 文本 → 三段且顺序正确", () => { const out = "看图:\n```chart\n" + JSON.stringify(spec) + "\n```\n以上。"; const segs = extractChartBlocks(out); expect(segs.map((s) => s.kind)).toEqual(["text", "chart", "text"]); expect(segs[1].kind === "chart" && segs[1].spec.title).toBe("销量"); }); it("非法 JSON 的 chart 块 → 回退为文本,不丢内容", () => { const out = "```chart\n{坏的}\n```"; const segs = extractChartBlocks(out); expect(segs).toHaveLength(1); expect(segs[0].kind).toBe("text"); }); it("两个 chart 块都解析", () => { const blk = "```chart\n" + JSON.stringify(spec) + "\n```"; const segs = extractChartBlocks(blk + "\n中间\n" + blk); expect(segs.filter((s) => s.kind === "chart")).toHaveLength(2); }); }); describe("hasChart", () => { it("含 chart 围栏 → true", () => expect(hasChart("a\n```chart\n{}\n```")).toBe(true)); it("不含 → false", () => expect(hasChart("```json\n{}\n```")).toBe(false)); });