import { describe, expect, it } from "vitest"; import { markdownToIR } from "./ir.js"; describe("markdownToIR tableMode bullets", () => { it("converts simple table to bullets", () => { const md = ` | Name | Value | |------|-------| | A | 1 | | B | 2 | `.trim(); const ir = markdownToIR(md, { tableMode: "bullets" }); // Should contain bullet points with header:value format expect(ir.text).toContain("• Value: 1"); expect(ir.text).toContain("• Value: 2"); // Should use first column as labels expect(ir.text).toContain("A"); expect(ir.text).toContain("B"); }); it("handles table with multiple columns", () => { const md = ` | Feature | SQLite | Postgres | |---------|--------|----------| | Speed | Fast | Medium | | Scale | Small | Large | `.trim(); const ir = markdownToIR(md, { tableMode: "bullets" }); // First column becomes row label expect(ir.text).toContain("Speed"); expect(ir.text).toContain("Scale"); // Other columns become bullet points expect(ir.text).toContain("• SQLite: Fast"); expect(ir.text).toContain("• Postgres: Medium"); expect(ir.text).toContain("• SQLite: Small"); expect(ir.text).toContain("• Postgres: Large"); }); it("leaves table syntax untouched by default", () => { const md = ` | A | B | |---|---| | 1 | 2 | `.trim(); const ir = markdownToIR(md); // No table conversion by default expect(ir.text).toContain("| A | B |"); expect(ir.text).toContain("| 1 | 2 |"); expect(ir.text).not.toContain("•"); expect(ir.styles.some((style) => style.style === "code_block")).toBe(false); }); it("handles empty cells gracefully", () => { const md = ` | Name | Value | |------|-------| | A | | | B | 2 | `.trim(); const ir = markdownToIR(md, { tableMode: "bullets" }); // Should handle empty cell without crashing expect(ir.text).toContain("B"); expect(ir.text).toContain("• Value: 2"); }); it("bolds row labels in bullets mode", () => { const md = ` | Name | Value | |------|-------| | Row1 | Data1 | `.trim(); const ir = markdownToIR(md, { tableMode: "bullets" }); // Should have bold style for row label const hasRowLabelBold = ir.styles.some( (s) => s.style === "bold" && ir.text.slice(s.start, s.end) === "Row1", ); expect(hasRowLabelBold).toBe(true); }); it("renders tables as code blocks in code mode", () => { const md = ` | A | B | |---|---| | 1 | 2 | `.trim(); const ir = markdownToIR(md, { tableMode: "code" }); expect(ir.text).toContain("| A | B |"); expect(ir.text).toContain("| 1 | 2 |"); expect(ir.styles.some((style) => style.style === "code_block")).toBe(true); }); it("preserves inline styles and links in bullets mode", () => { const md = ` | Name | Value | |------|-------| | _Row_ | [Link](https://example.com) | `.trim(); const ir = markdownToIR(md, { tableMode: "bullets" }); const hasItalic = ir.styles.some( (s) => s.style === "italic" && ir.text.slice(s.start, s.end) === "Row", ); expect(hasItalic).toBe(true); expect(ir.links.some((link) => link.href === "https://example.com")).toBe(true); }); });