import { truncateFileNameForLine } from "./truncateFileNameForLine"; describe("truncateFileNameForLine", () => { it("returns an empty string when the input is undefined", () => { expect(truncateFileNameForLine(undefined)).toBe(""); }); it("returns the name unchanged when it fits inside the budget", () => { expect(truncateFileNameForLine("report.pdf")).toBe("report.pdf"); }); it("preserves a short extension and truncates the stem with a middle ellipsis", () => { expect(truncateFileNameForLine("file-sample_2_dx.docx")).toBe( "file-samp….docx", ); }); it("preserves an uncommon extension like .fodt", () => { expect(truncateFileNameForLine("very-long-name-for-document.fodt")).toBe( "very-long….fodt", ); }); it("preserves longer extensions like .numbers", () => { expect(truncateFileNameForLine("quarterly-budget.numbers")).toBe( "quarte….numbers", ); }); it("treats overly long trailing tokens as not-an-extension and tail truncates", () => { expect(truncateFileNameForLine("file.verylongextensionname")).toBe( "file.verylonge…", ); }); it("truncates a URL-shaped filename with no detectable extension using a tail ellipsis", () => { expect(truncateFileNameForLine("vertopal.com/converter")).toBe( "vertopal.com/c…", ); }); it("falls back to tail truncation when the extension cannot fit", () => { const long = "a".repeat(50) + ".verylongextension"; expect(truncateFileNameForLine(long, 24)).toMatch(/^a+…$/); }); it("respects a caller-supplied maxLength", () => { expect(truncateFileNameForLine("report.pdf", 6)).toBe("r….pdf"); }); it("returns a name shorter than the budget unchanged regardless of extension", () => { expect(truncateFileNameForLine("notes.txt")).toBe("notes.txt"); expect(truncateFileNameForLine("a/b/c")).toBe("a/b/c"); }); it("clamps maxLength to a sensible minimum to preserve the single-line guarantee", () => { expect(truncateFileNameForLine("report.pdf", 0)).toBe("r…"); expect(truncateFileNameForLine("report.pdf", -5)).toBe("r…"); expect(truncateFileNameForLine("report.pdf", 1)).toBe("r…"); }); });