omni-tools/src/pages/tools/string/remove-duplicate-lines/remove-duplicate-lines.service.test.ts
2025-03-02 02:58:50 +00:00

201 lines
6.3 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import removeDuplicateLines, { DuplicateRemoverOptions } from './service';
describe('removeDuplicateLines function', () => {
// Test for 'all' duplicate removal mode
describe('mode: all', () => {
it('should remove all duplicates keeping first occurrence', () => {
const input = 'line1\nline2\nline1\nline3\nline2';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line1\nline2\nline3');
});
it('should handle case-sensitive duplicates correctly', () => {
const input = 'Line1\nline1\nLine2\nline2';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('Line1\nline1\nLine2\nline2');
});
});
// Test for 'consecutive' duplicate removal mode
describe('mode: consecutive', () => {
it('should remove only consecutive duplicates', () => {
const input = 'line1\nline1\nline2\nline3\nline3\nline1';
const options: DuplicateRemoverOptions = {
mode: 'consecutive',
newlines: 'filter',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line1\nline2\nline3\nline1');
});
});
// Test for 'unique' duplicate removal mode
describe('mode: unique', () => {
it('should keep only lines that appear exactly once', () => {
const input = 'line1\nline2\nline1\nline3\nline4\nline4';
const options: DuplicateRemoverOptions = {
mode: 'unique',
newlines: 'filter',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line2\nline3');
});
});
// Test for newlines handling
describe('newlines option', () => {
it('should filter newlines when newlines is set to filter', () => {
const input = 'line1\n\nline2\n\n\nline3';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line1\n\nline2\nline3');
});
it('should delete newlines when newlines is set to delete', () => {
const input = 'line1\n\nline2\n\n\nline3';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'delete',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line1\nline2\nline3');
});
it('should preserve newlines when newlines is set to preserve', () => {
const input = 'line1\n\nline2\n\nline2\nline3';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'preserve',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
// This test needs careful consideration of the expected behavior
expect(result).not.toContain('line2\nline2');
expect(result).toContain('line1');
expect(result).toContain('line2');
expect(result).toContain('line3');
});
});
// Test for sorting
describe('sortLines option', () => {
it('should sort lines when sortLines is true', () => {
const input = 'line3\nline1\nline2';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: true,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line1\nline2\nline3');
});
});
// Test for trimming
describe('trimTextLines option', () => {
it('should trim lines when trimTextLines is true', () => {
const input = ' line1 \n line2 \nline3';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: false,
trimTextLines: true
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line1\nline2\nline3');
});
it('should consider trimmed lines as duplicates', () => {
const input = ' line1 \nline1\n line2\nline2 ';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: false,
trimTextLines: true
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line1\nline2');
});
});
// Combined scenarios
describe('combined options', () => {
it('should handle all options together correctly', () => {
const input = ' line3 \nline1\n\nline3\nline2\nline1';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'delete',
sortLines: true,
trimTextLines: true
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('line1\nline2\nline3');
});
});
// Edge cases
describe('edge cases', () => {
it('should handle empty input', () => {
const input = '';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('');
});
it('should handle input with only newlines', () => {
const input = '\n\n\n';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: false,
trimTextLines: false
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('');
});
it('should handle input with only whitespace', () => {
const input = ' \n \n ';
const options: DuplicateRemoverOptions = {
mode: 'all',
newlines: 'filter',
sortLines: false,
trimTextLines: true
};
const result = removeDuplicateLines(input, options);
expect(result).toBe('');
});
});
});