import { describe, expect, test } from "bun:test"; import { segmentTextByHighlights, type TextHighlight } from "../textHighlighting"; describe("segmentTextByHighlights", () => { // Basic test("returns single segment with no highlights", () => { const segments = segmentTextByHighlights("hello world", []); expect(segments).toHaveLength(1); expect(segments[0].text).toBe("hello world"); expect(segments[0].highlight).toBeUndefined(); }); test("returns highlighted segment for single highlight", () => { const highlights: TextHighlight[] = [ { start: 0, end: 5, color: undefined, priority: 0 }, ]; const segments = segmentTextByHighlights("hello world", highlights); expect(segments.length).toBeGreaterThanOrEqual(2); expect(segments.some(s => s.highlight !== undefined)).toBe(true); }); test("returns three segments for highlight in the middle", () => { const highlights: TextHighlight[] = [ { start: 3, end: 7, color: undefined, priority: 0 }, ]; const segments = segmentTextByHighlights("hello world", highlights); expect(segments.length).toBeGreaterThanOrEqual(2); }); test("highlight covering entire text", () => { const highlights: TextHighlight[] = [ { start: 0, end: 5, color: undefined, priority: 0 }, ]; const segments = segmentTextByHighlights("hello", highlights); expect(segments).toHaveLength(1); expect(segments[0].highlight).toBeDefined(); }); // Multiple highlights test("handles non-overlapping highlights", () => { const highlights: TextHighlight[] = [ { start: 0, end: 3, color: undefined, priority: 0 }, { start: 6, end: 9, color: undefined, priority: 0 }, ]; const segments = segmentTextByHighlights("abcXYZdef", highlights); const highlighted = segments.filter(s => s.highlight); expect(highlighted.length).toBe(2); }); test("handles overlapping highlights (priority-based)", () => { const highlights: TextHighlight[] = [ { start: 0, end: 5, color: undefined, priority: 0 }, { start: 3, end: 8, color: undefined, priority: 1 }, ]; const segments = segmentTextByHighlights("hello world", highlights); // Overlapping: higher priority wins or they don't overlap expect(segments.length).toBeGreaterThan(0); }); test("handles adjacent highlights", () => { const highlights: TextHighlight[] = [ { start: 0, end: 3, color: undefined, priority: 0 }, { start: 3, end: 6, color: undefined, priority: 0 }, ]; const segments = segmentTextByHighlights("abcdef", highlights); const highlighted = segments.filter(s => s.highlight); expect(highlighted.length).toBe(2); }); // Boundary test("highlight starting at 0", () => { const highlights: TextHighlight[] = [ { start: 0, end: 3, color: undefined, priority: 0 }, ]; const segments = segmentTextByHighlights("abcdef", highlights); expect(segments[0].start).toBe(0); }); test("highlight ending at text length", () => { const text = "hello"; const highlights: TextHighlight[] = [ { start: 3, end: 5, color: undefined, priority: 0 }, ]; const segments = segmentTextByHighlights(text, highlights); expect(segments.length).toBeGreaterThan(0); }); test("empty highlights array returns single segment", () => { const segments = segmentTextByHighlights("text", []); expect(segments).toHaveLength(1); expect(segments[0].highlight).toBeUndefined(); }); // Properties test("preserves highlight color property", () => { const highlights: TextHighlight[] = [ { start: 0, end: 3, color: "primary" as any, priority: 0 }, ]; const segments = segmentTextByHighlights("abc", highlights); const highlighted = segments.find(s => s.highlight); expect(highlighted?.highlight?.color).toBe("primary"); }); test("preserves highlight priority property", () => { const highlights: TextHighlight[] = [ { start: 0, end: 3, color: undefined, priority: 5 }, ]; const segments = segmentTextByHighlights("abc", highlights); const highlighted = segments.find(s => s.highlight); expect(highlighted?.highlight?.priority).toBe(5); }); test("preserves dimColor and inverse flags", () => { const highlights: TextHighlight[] = [ { start: 0, end: 3, color: undefined, priority: 0, dimColor: true, inverse: true }, ]; const segments = segmentTextByHighlights("abc", highlights); const highlighted = segments.find(s => s.highlight); expect(highlighted?.highlight?.dimColor).toBe(true); expect(highlighted?.highlight?.inverse).toBe(true); }); test("highlights with start === end are skipped", () => { const highlights: TextHighlight[] = [ { start: 3, end: 3, color: undefined, priority: 0 }, ]; const segments = segmentTextByHighlights("abcdef", highlights); expect(segments).toHaveLength(1); expect(segments[0].highlight).toBeUndefined(); }); });