import { describe, it, expect } from "vitest"; import { foldConsecutiveDuplicates } from "../../extensions/compress/stages/dedup.js"; describe("foldConsecutiveDuplicates", () => { it("returns unchanged string with no duplicates", () => { const text = "line1\nline2\nline3"; expect(foldConsecutiveDuplicates(text)).toBe(text); }); it("folds 2+ identical consecutive lines (min length 5)", () => { const input = "hello world\nhello world\nhello world"; expect(foldConsecutiveDuplicates(input)).toBe("[3×] hello world"); }); it("folds exactly 2 identical lines when length >= 5", () => { const input = "abcdef\nabcdef"; expect(foldConsecutiveDuplicates(input)).toBe("[2×] abcdef"); }); it("does not fold short lines (< 5 chars)", () => { const input = "ab\nab\nab"; expect(foldConsecutiveDuplicates(input)).toBe("ab\nab\nab"); }); it("does not fold empty lines (handled by whitespace stage)", () => { const input = "\n\n\n"; expect(foldConsecutiveDuplicates(input)).toBe("\n\n\n"); }); it("folds a run then continues with different lines", () => { const input = "line1\nduplication\nduplication\nduplication\nline2"; expect(foldConsecutiveDuplicates(input)).toBe("line1\n[3×] duplication\nline2"); }); it("handles multiple separate runs", () => { const input = "aaaaa\naaaaa\ndifferent\nbbbbb\nbbbbb\nbbbbb"; expect(foldConsecutiveDuplicates(input)).toBe("[2×] aaaaa\ndifferent\n[3×] bbbbb"); }); it("handles separator-like lines (realistic case)", () => { const sep = "────────────────────────────"; const input = [sep, sep, sep, sep, "content", sep, sep].join("\n"); expect(foldConsecutiveDuplicates(input)).toBe(`[4×] ${sep}\ncontent\n[2×] ${sep}`); }); it("handles a single line (no fold needed)", () => { expect(foldConsecutiveDuplicates("hello world")).toBe("hello world"); }); });