import { describe, expect, test } from "bun:test";
import * as cheerio from "cheerio";
import {
convertBlockCodeToMarkdown,
convertGrammarToMarkdown,
convertInlineCodeToMarkdown,
convertLinksToMarkdown,
convertListsToMarkdown,
convertTablesToMarkdown,
DEFAULT_CONFIG,
formatForIngestion,
} from "./formatHTMLForIngestion";
describe("formatHTMLForIngestion", () => {
test("convertLinksToMarkdown converts emu-xref links to markdown and strips filenames", () => {
const html = `ToNumber`;
const $ = cheerio.load(html);
convertLinksToMarkdown($, DEFAULT_CONFIG.links.join(", "));
expect($.html()).toContain(
'[ToNumber](#sec-tonumber)',
);
});
test("convertLinksToMarkdown skips external links", () => {
const html = `External`;
const $ = cheerio.load(html);
convertLinksToMarkdown($, DEFAULT_CONFIG.links.join(", "));
expect($.html()).toContain('External');
});
test("convertInlineCodeToMarkdown converts var, emu-val, emu-const to inline code", () => {
const html = `
x y z w
`;
const $ = cheerio.load(html);
convertInlineCodeToMarkdown($, DEFAULT_CONFIG.codeBlocks.inline);
expect($.html()).toContain('`x`');
expect($.html()).toContain('`y`');
expect($.html()).toContain('`z`');
expect($.html()).toContain('`w`');
});
test("convertInlineCodeToMarkdown skips code inside pre", () => {
const html = `x
`;
const $ = cheerio.load(html);
convertInlineCodeToMarkdown($, DEFAULT_CONFIG.codeBlocks.inline);
expect($.html()).toContain("x
"); // unchanged
});
test("convertBlockCodeToMarkdown converts pre>code and emu-eqn", () => {
const html = `
const x = 1;
y = x + 1
z = 2
`;
const $ = cheerio.load(html);
convertBlockCodeToMarkdown($, DEFAULT_CONFIG.codeBlocks.block);
expect($.html()).toContain(
'```javascript\nconst x = 1;\n```
',
);
expect($.html()).toContain(
'```\ny = x + 1\n```
',
);
expect($.html()).toContain('z = 2'); // unchanged
});
test("convertGrammarToMarkdown converts emu-grammar to fenced bnf", () => {
const html = `Statement :: BlockStatement`;
const $ = cheerio.load(html);
convertGrammarToMarkdown($, DEFAULT_CONFIG.codeBlocks.grammar.join(", "));
expect($.html()).toContain(
'```bnf\nStatement :: BlockStatement\n```
',
);
});
test("convertListsToMarkdown converts ol and ul with nesting to markdown lists", () => {
const html = `
- Item 1
- Item 2
- Subitem 1
- Subitem 2
`;
const $ = cheerio.load(html);
convertListsToMarkdown(
$,
DEFAULT_CONFIG.lists.ordered,
DEFAULT_CONFIG.lists.unordered,
);
const result = $("pre.list-markdown").text();
expect(result).toContain("- Item 1");
expect(result).toContain("- Item 2");
expect(result).toContain(" 1. Subitem 1");
expect(result).toContain(" 2. Subitem 2");
});
test("convertTablesToMarkdown converts tables to markdown tables", () => {
const html = `
`;
const $ = cheerio.load(html);
convertTablesToMarkdown($);
const result = $("pre.table-markdown").text();
expect(result).toContain("| Col 1 | Col 2 |");
expect(result).toContain("| --- | --- |");
expect(result).toContain("| Data 1 | Data 2 |");
});
test("formatForIngestion runs the full pipeline", () => {
const html = `
`;
const $ = cheerio.load(html);
formatForIngestion($);
// Check links
expect($.html()).toContain(
'[Example](#sec-example)',
);
// Check inline code
expect($.html()).toContain('`x`');
// Check block code
expect($.html()).toContain(
'```javascript\nlet y = x;\n```
',
);
// Check lists
expect($.html()).toContain(
'- One\n- Two\n
',
);
});
});