1import { parse } from './parser';
2
3const parseTag = (quasis, ...expressions) => parse(quasis, expressions);
4
5it('supports parsing expressions', () => {
6 expect(parseTag`${1}`).toEqual({
7 type: 'sequence',
8 sequence: [
9 {
10 type: 'expression',
11 expression: 1,
12 quantifier: null,
13 },
14 ],
15 alternation: null,
16 });
17});
18
19it('supports parsing expressions with quantifiers', () => {
20 let ast;
21
22 ast = parseTag`${1}?`;
23 expect(ast).toHaveProperty('sequence.0.type', 'expression');
24 expect(ast).toHaveProperty('sequence.0.quantifier', 'optional');
25
26 ast = parseTag`${1}+`;
27 expect(ast).toHaveProperty('sequence.0.type', 'expression');
28 expect(ast).toHaveProperty('sequence.0.quantifier', 'repeating');
29
30 ast = parseTag`${1}*`;
31 expect(ast).toHaveProperty('sequence.0.type', 'expression');
32 expect(ast).toHaveProperty('sequence.0.quantifier', 'multiple');
33});
34
35it('supports top-level alternations', () => {
36 let ast;
37
38 ast = parseTag`${1} | ${2}`;
39 expect(ast).toHaveProperty('sequence.length', 1);
40 expect(ast).toHaveProperty('sequence.0.type', 'expression');
41 expect(ast).toHaveProperty('sequence.0.expression', 1);
42 expect(ast).toHaveProperty('alternation.type', 'sequence');
43 expect(ast).toHaveProperty('alternation.sequence.0.expression', 2);
44
45 ast = parseTag`${1}? | ${2}?`;
46 expect(ast).toHaveProperty('sequence.0.quantifier', 'optional');
47});
48
49it('supports groups with quantifiers', () => {
50 let ast;
51
52 ast = parseTag`(${1} ${2})`;
53 expect(ast).toHaveProperty('sequence.length', 1);
54 expect(ast).toHaveProperty('sequence.0.type', 'group');
55 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 2);
56 expect(ast).toHaveProperty('sequence.0.sequence.sequence.0.expression', 1);
57 expect(ast).toHaveProperty('sequence.0.sequence.sequence.1.expression', 2);
58
59 ast = parseTag`(${1} ${2}?)?`;
60 expect(ast).toHaveProperty('sequence.length', 1);
61 expect(ast).toHaveProperty('sequence.0.type', 'group');
62 expect(ast).toHaveProperty('sequence.0.quantifier', 'optional');
63 expect(ast).toHaveProperty('sequence.0.sequence.sequence.0.quantifier', null);
64});
65
66it('supports non-capturing groups', () => {
67 const ast = parseTag`(?: ${1})`;
68 expect(ast).toHaveProperty('sequence.length', 1);
69 expect(ast).toHaveProperty('sequence.0.type', 'group');
70 expect(ast).toHaveProperty('sequence.0.capturing', false);
71 expect(ast).toHaveProperty('sequence.0.lookahead', null);
72 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
73});
74
75it('supports positive lookahead groups', () => {
76 const ast = parseTag`(?= ${1})`;
77 expect(ast).toHaveProperty('sequence.length', 1);
78 expect(ast).toHaveProperty('sequence.0.type', 'group');
79 expect(ast).toHaveProperty('sequence.0.capturing', false);
80 expect(ast).toHaveProperty('sequence.0.lookahead', 'positive');
81 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
82});
83
84it('supports negative lookahead groups', () => {
85 const ast = parseTag`(?! ${1})`;
86 expect(ast).toHaveProperty('sequence.length', 1);
87 expect(ast).toHaveProperty('sequence.0.type', 'group');
88 expect(ast).toHaveProperty('sequence.0.capturing', false);
89 expect(ast).toHaveProperty('sequence.0.lookahead', 'negative');
90 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
91});
92
93it('supports groups with alternates', () => {
94 expect(parseTag`(${1} | ${2}) ${3}`).toMatchInlineSnapshot(`
95 Object {
96 "alternation": null,
97 "sequence": Array [
98 Object {
99 "capturing": true,
100 "lookahead": null,
101 "quantifier": null,
102 "sequence": Object {
103 "alternation": Object {
104 "alternation": null,
105 "sequence": Array [
106 Object {
107 "expression": 2,
108 "quantifier": null,
109 "type": "expression",
110 },
111 ],
112 "type": "sequence",
113 },
114 "sequence": Array [
115 Object {
116 "expression": 1,
117 "quantifier": null,
118 "type": "expression",
119 },
120 ],
121 "type": "sequence",
122 },
123 "type": "group",
124 },
125 Object {
126 "expression": 3,
127 "quantifier": null,
128 "type": "expression",
129 },
130 ],
131 "type": "sequence",
132 }
133 `);
134});