mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-12-29 16:16:02 +00:00
201 lines
6.3 KiB
TypeScript
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('');
|
|
});
|
|
});
|
|
});
|