/**
* Tests for visualization utilities
*/
import {
createVisualBreakdown,
createIndexedList,
createDensitySummary,
formatFrequencyTable,
} from '../src/utils/visualization.js';
describe('createVisualBreakdown', () => {
it('should create visual breakdown with highlights', () => {
const result = createVisualBreakdown('cat', [1], 'a');
expect(result).toContain('Characters:');
expect(result).toContain('Indices:');
expect(result).toContain('Found:');
});
it('should mark highlighted positions', () => {
const result = createVisualBreakdown('aaa', [0, 1, 2], 'a');
// Should have ^ markers at all positions
expect(result).toContain('^');
});
it('should handle empty highlights', () => {
const result = createVisualBreakdown('cat', [], 'z');
expect(result).toContain('Characters:');
// Should not have markers
expect(result.split('^').length).toBe(1);
});
});
describe('createIndexedList', () => {
it('should create indexed list of characters', () => {
const result = createIndexedList('abc');
expect(result).toEqual([
{ index: 0, char: 'a' },
{ index: 1, char: 'b' },
{ index: 2, char: 'c' },
]);
});
it('should handle empty string', () => {
const result = createIndexedList('');
expect(result).toEqual([]);
});
it('should handle unicode characters', () => {
const result = createIndexedList('a😀b');
expect(result).toHaveLength(3);
expect(result[1].char).toBe('😀');
});
});
describe('createDensitySummary', () => {
it('should calculate percentage correctly', () => {
const result = createDensitySummary(3, 10, 'a');
expect(result).toContain('30.0%');
expect(result).toContain('3 out of 10');
});
it('should handle 100% density', () => {
const result = createDensitySummary(5, 5, 'a');
expect(result).toContain('100.0%');
});
it('should handle 0% density', () => {
const result = createDensitySummary(0, 10, 'z');
expect(result).toContain('0.0%');
});
it('should handle empty text (0 total)', () => {
const result = createDensitySummary(0, 0, 'a');
expect(result).toContain('0.0%');
});
it('should include the character in output', () => {
const result = createDensitySummary(2, 10, 'x');
expect(result).toContain("'x'");
});
});
describe('formatFrequencyTable', () => {
it('should format frequency as table', () => {
const frequency = { a: 3, b: 1 };
const result = formatFrequencyTable(frequency);
expect(result).toContain("'a':");
expect(result).toContain("'b':");
expect(result).toContain('3');
expect(result).toContain('1');
});
it('should sort by count by default', () => {
const frequency = { a: 1, b: 3, c: 2 };
const result = formatFrequencyTable(frequency, 'count');
const lines = result.split('\n');
expect(lines[0]).toContain('b');
expect(lines[1]).toContain('c');
expect(lines[2]).toContain('a');
});
it('should sort alphabetically when requested', () => {
const frequency = { c: 1, a: 2, b: 3 };
const result = formatFrequencyTable(frequency, 'alpha');
const lines = result.split('\n');
expect(lines[0]).toContain('a');
expect(lines[1]).toContain('b');
expect(lines[2]).toContain('c');
});
it('should display space as "(space)"', () => {
const frequency = { ' ': 2 };
const result = formatFrequencyTable(frequency);
expect(result).toContain('(space)');
});
it('should include visual bars', () => {
const frequency = { a: 5 };
const result = formatFrequencyTable(frequency);
expect(result).toContain('â–ˆ');
});
});