-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathencoder.test.tsx
88 lines (74 loc) · 2.81 KB
/
encoder.test.tsx
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
import {
buildPattern,
buildRegExp,
capture,
choiceOf,
oneOrMore,
optional,
repeat,
zeroOrMore,
} from '../..';
test('basic quantifies', () => {
expect('a').toEqualRegex(/a/);
expect(['a', 'b']).toEqualRegex(/ab/);
expect(oneOrMore('a')).toEqualRegex(/a+/);
expect(optional('a')).toEqualRegex(/a?/);
expect(['a', oneOrMore('b')]).toEqualRegex(/ab+/);
expect(['a', oneOrMore('bc')]).toEqualRegex(/a(?:bc)+/);
expect(['a', oneOrMore('bc')]).toEqualRegex(/a(?:bc)+/);
expect(['a', repeat('b', { min: 1, max: 5 })]).toEqualRegex(/ab{1,5}/);
expect(['a', zeroOrMore('b')]).toEqualRegex(/ab*/);
expect(['a', zeroOrMore('bc')]).toEqualRegex(/a(?:bc)*/);
expect(['a', zeroOrMore('bc')]).toEqualRegex(/a(?:bc)*/);
expect([optional('a'), 'b']).toEqualRegex(/a?b/);
expect([optional('a'), 'b', oneOrMore('d')]).toEqualRegex(/a?bd+/);
});
test('`buildRegExp` escapes special characters', () => {
expect('.').toEqualRegex(/\./);
expect('*').toEqualRegex(/\*/);
expect('+').toEqualRegex(/\+/);
expect('?').toEqualRegex(/\?/);
expect('^').toEqualRegex(/\^/);
expect('$').toEqualRegex(/\$/);
expect('{').toEqualRegex(/\{/);
expect('}').toEqualRegex(/\}/);
expect('|').toEqualRegex(/\|/);
expect('[').toEqualRegex(/\[/);
expect(']').toEqualRegex(/\]/);
expect('\\').toEqualRegex(/\\/);
expect('*.*').toEqualRegex(/\*\.\*/);
expect([oneOrMore('.*'), zeroOrMore('[]{}')]).toEqualRegex(/(?:\.\*)+(?:\[\]\{\})*/);
});
test('`buildRegExp` accepts RegExp object', () => {
expect(buildRegExp(/abc/)).toEqual(/abc/);
expect(buildRegExp(oneOrMore(/abc/))).toEqual(/(?:abc)+/);
expect(buildRegExp(repeat(/abc/, 5))).toEqual(/(?:abc){5}/);
expect(buildRegExp(capture(/abc/))).toEqual(/(abc)/);
expect(buildRegExp(choiceOf(/a/, /b/))).toEqual(/a|b/);
expect(buildRegExp(choiceOf(/a|b/, /c/))).toEqual(/a|b|c/);
});
test('`buildRegExp` detects common atomic patterns', () => {
expect(buildRegExp(/a/)).toEqual(/a/);
expect(buildRegExp(/[a-z]/)).toEqual(/[a-z]/);
expect(buildRegExp(/(abc)/)).toEqual(/(abc)/);
expect(buildRegExp(oneOrMore(/a/))).toEqual(/a+/);
expect(buildRegExp(oneOrMore(/[a-z]/))).toEqual(/[a-z]+/);
expect(buildRegExp(oneOrMore(/(abc)/))).toEqual(/(abc)+/);
expect(buildRegExp(repeat(/a/, 5))).toEqual(/a{5}/);
expect(buildRegExp(oneOrMore(/(a|b|c)/))).toEqual(/(a|b|c)+/);
});
test('`buildRegExp` throws error on unknown element', () => {
expect(() =>
// @ts-expect-error intentionally passing incorrect object
buildRegExp({ type: 'unknown' }),
).toThrowErrorMatchingInlineSnapshot(`
"\`encodeElement\`: unknown element: {
"type": "unknown"
}"
`);
});
test('`buildPattern` throws on empty text', () => {
expect(() => buildPattern('')).toThrowErrorMatchingInlineSnapshot(
`"\`encodeText\`: received text should not be empty"`,
);
});