Spaces:
Running
Running
File size: 4,161 Bytes
a23aa7d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | import {
indexOfArrayNonEscaped,
indexOfArrayWithBracketAndQuoteSupport,
MAX_LOOP,
splitWithBracketAndQuoteSupport,
} from './stringSearch';
describe('indexOfArrayNonEscaped', () => {
it('should find first non-escaped occurrence', () => {
expect(indexOfArrayNonEscaped('abc def', ['d'])).toBe(4);
expect(indexOfArrayNonEscaped('abc \\def ghi def', ['d'])).toBe(13);
});
it('should handle multiple search strings', () => {
expect(indexOfArrayNonEscaped('abc def ghi', ['d', 'g'])).toBe(4);
expect(indexOfArrayNonEscaped('abc ghi def', ['d', 'g'])).toBe(4);
});
it('should return -1 when not found', () => {
expect(indexOfArrayNonEscaped('abc def', ['x'])).toBe(-1);
expect(indexOfArrayNonEscaped('abc \\xyz def', ['x'])).toBe(-1);
});
it('should respect start position', () => {
expect(indexOfArrayNonEscaped('abc def def', ['def'], 5)).toBe(8);
});
it('should throw error on too many escapes', () => {
const tooManyEscapes = '\\a\\b\\c\\d'.repeat(MAX_LOOP / 2);
expect(() => indexOfArrayNonEscaped(tooManyEscapes, ['x'])).toThrow(
'Too many escaping',
);
});
});
describe('indexOfArrayWithBracketAndQuoteSupport', () => {
it('should find first non-escaped occurrence', () => {
expect(indexOfArrayWithBracketAndQuoteSupport('abc def', ['d'])).toBe(4);
expect(
indexOfArrayWithBracketAndQuoteSupport('abc \\def ghi def', ['d']),
).toBe(13);
});
it('should handle brackets correctly', () => {
expect(indexOfArrayWithBracketAndQuoteSupport('abc (def) ghi', ['g'])).toBe(
10,
);
expect(
indexOfArrayWithBracketAndQuoteSupport('abc (d(e)f) ghi', ['g']),
).toBe(12);
expect(indexOfArrayWithBracketAndQuoteSupport('abc (def ghi', ['g'])).toBe(
-1,
);
});
it('should handle double quotes correctly', () => {
expect(indexOfArrayWithBracketAndQuoteSupport('abc "def" ghi', ['g'])).toBe(
10,
);
expect(
indexOfArrayWithBracketAndQuoteSupport('abc "d\\"ef" ghi', ['g']),
).toBe(12);
expect(indexOfArrayWithBracketAndQuoteSupport('abc "def ghi', ['g'])).toBe(
-1,
);
});
it('should handle single quotes correctly', () => {
expect(indexOfArrayWithBracketAndQuoteSupport("abc 'def' ghi", ['g'])).toBe(
10,
);
expect(
indexOfArrayWithBracketAndQuoteSupport("abc 'd\\'ef' ghi", ['g']),
).toBe(12);
expect(indexOfArrayWithBracketAndQuoteSupport("abc 'def ghi", ['g'])).toBe(
-1,
);
});
it('should handle multiple search strings', () => {
expect(
indexOfArrayWithBracketAndQuoteSupport('abc def ghi', ['d', 'g']),
).toBe(4);
expect(
indexOfArrayWithBracketAndQuoteSupport('abc (def) ghi', ['d', 'g']),
).toBe(10);
});
it('should throw error on too many escapes or nested structures', () => {
const tooManyEscapes = '\\a\\b\\c\\d'.repeat(MAX_LOOP / 2);
expect(() =>
indexOfArrayWithBracketAndQuoteSupport(tooManyEscapes, ['x']),
).toThrow('Too many escaping');
const tooManyBrackets = '()'.repeat(MAX_LOOP + 1);
expect(() =>
indexOfArrayWithBracketAndQuoteSupport(tooManyBrackets, [')']),
).toThrow('Too many escaping');
});
});
describe('splitWithBracketAndQuoteSupport', () => {
test('splits string by search tokens', () => {
expect(splitWithBracketAndQuoteSupport('a,b', [','])).toEqual(['a', 'b']);
});
test('respects brackets', () => {
expect(splitWithBracketAndQuoteSupport('a,(b,c)', [','])).toEqual([
'a',
'(b,c)',
]);
});
test('respects double quotes', () => {
expect(splitWithBracketAndQuoteSupport('a,"b,c"', [','])).toEqual([
'a',
'"b,c"',
]);
});
test('respects single quotes', () => {
expect(splitWithBracketAndQuoteSupport("a,'b,c'", [','])).toEqual([
'a',
"'b,c'",
]);
});
test('handles multiple search tokens', () => {
expect(splitWithBracketAndQuoteSupport('a;b,c', [';', ','])).toEqual([
'a',
'b',
'c',
]);
});
test('handles empty strings', () => {
expect(splitWithBracketAndQuoteSupport('', [','])).toEqual([]);
});
});
|