Files
claude-code/src/utils/__tests__/textHighlighting.test.ts
2026-04-02 20:28:08 +08:00

132 lines
4.9 KiB
TypeScript

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();
});
});