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));
});
