import { describe, it, expect } from "vitest"; import { highlightCode, highlightLine } from "../highlighter.js"; describe("highlightCode", () => { it("highlights JavaScript code with correct token styles", () => { const code = "const x = 42;"; const result = highlightCode(code, "test.js"); expect(result).toHaveLength(1); const tokens = result[0]; expect(tokens.length).toBeGreaterThan(1); const keywordToken = tokens.find((t) => t.text === "const"); expect(keywordToken?.style).toBe("keyword"); const numberToken = tokens.find((t) => t.text === "42"); expect(numberToken?.style).toBe("number"); }); it("highlights Python code", () => { const code = 'def hello():\n print("world")'; const result = highlightCode(code, "test.py"); expect(result).toHaveLength(2); const defToken = result[0].find((t) => t.text === "def"); expect(defToken?.style).toBe("keyword"); const stringToken = result[1].find((t) => t.text.includes("world")); expect(stringToken?.style).toBe("string"); }); it("highlights TSX code with correct dialect", () => { const code = 'const el =
hello
;'; const result = highlightCode(code, "test.tsx"); expect(result).toHaveLength(1); const tokens = result[0]; const constToken = tokens.find((t) => t.text === "const"); expect(constToken?.style).toBe("keyword"); const tagToken = tokens.find((t) => t.text === "div"); expect(tagToken).toBeDefined(); }); it("returns unhighlighted tokens for unsupported extensions", () => { const code = "hello world\nsecond line"; const result = highlightCode(code, "test.xyz"); expect(result).toHaveLength(2); expect(result[0]).toEqual([{ text: "hello world", style: null }]); expect(result[1]).toEqual([{ text: "second line", style: null }]); }); it("splits multi-line code into separate line arrays", () => { const code = "line1\nline2\nline3"; const result = highlightCode(code, "test.txt"); expect(result).toHaveLength(3); }); it("handles empty lines", () => { const code = "const a = 1;\n\nconst b = 2;"; const result = highlightCode(code, "test.js"); expect(result).toHaveLength(3); expect(result[1]).toEqual([{ text: "", style: null }]); }); it("returns a single empty line for empty input", () => { expect(highlightCode("", "test.ts")).toEqual([[{ text: "", style: null }]]); }); it("returns valid HighlightStyle values for all tokens", () => { const validStyles = new Set([ "keyword", "comment", "string", "number", "literal", "function", "definition", "class", "type", "tag", "attribute", "property", "variable", "operator", "punctuation", "regexp", "escape", "meta", "heading", "link", null, ]); const code = '// comment\nconst x: number = 42;\nfunction foo() { return "bar"; }'; const result = highlightCode(code, "test.ts"); for (const line of result) { for (const token of line) { expect(validStyles.has(token.style)).toBe(true); } } }); }); describe("highlightLine", () => { it("highlights a single line", () => { const tokens = highlightLine("const x = 1;", "test.js"); expect(tokens.length).toBeGreaterThan(1); const keywordToken = tokens.find((t) => t.text === "const"); expect(keywordToken?.style).toBe("keyword"); }); it("returns unhighlighted token for unsupported files", () => { const tokens = highlightLine("hello", "test.xyz"); expect(tokens).toEqual([{ text: "hello", style: null }]); }); });