import { expect, test } from "bun:test";
import { ansiToHtml, trimLineEndPreserveAnsi } from "./ansi";
// 1. XSS/HTML escaping tests
test("escapes < to <", () => {
const result = ansiToHtml("
");
expect(result).toBe("<div>");
});
test("escapes > to >", () => {
const result = ansiToHtml("a > b");
expect(result).toBe("a > b");
});
test("escapes & to &", () => {
const result = ansiToHtml("foo & bar");
expect(result).toBe("foo & bar");
});
test("escapes ");
expect(result).toBe("<script>alert('xss')</script>");
});
test("escapes HTML in styled text", () => {
const result = ansiToHtml("\x1b[31m\x1b[0m");
expect(result).toContain("<script>");
expect(result).toContain("</script>");
expect(result).not.toContain("\x1b[0m");
expect(result).toContain("<script>");
expect(result).toContain("&alert");
expect(result).toContain("color:#f85149");
});
test("preserves internal spaces", () => {
const result = ansiToHtml("hello world");
expect(result).toBe("hello world");
});
test("handles only ANSI codes with no text", () => {
const result = ansiToHtml("\x1b[31m\x1b[0m");
// Opens and closes span even with no text
expect(result).toBe('');
});