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', '?');
25
26 ast = parseTag`${1}+`;
27 expect(ast).toHaveProperty('sequence.0.type', 'expression');
28 expect(ast).toHaveProperty('sequence.0.quantifier', '+');
29
30 ast = parseTag`${1}*`;
31 expect(ast).toHaveProperty('sequence.0.type', 'expression');
32 expect(ast).toHaveProperty('sequence.0.quantifier', '*');
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', '?');
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', '?');
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.capture', ':');
71 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
72});
73
74it('supports positive lookahead groups', () => {
75 const ast = parseTag`(?= ${1})`;
76 expect(ast).toHaveProperty('sequence.length', 1);
77 expect(ast).toHaveProperty('sequence.0.type', 'group');
78 expect(ast).toHaveProperty('sequence.0.capture', '=');
79 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
80});
81
82it('supports negative lookahead groups', () => {
83 const ast = parseTag`(?! ${1})`;
84 expect(ast).toHaveProperty('sequence.length', 1);
85 expect(ast).toHaveProperty('sequence.0.type', 'group');
86 expect(ast).toHaveProperty('sequence.0.capture', '!');
87 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
88});
89
90it('supports groups with alternates', () => {
91 expect(parseTag`(${1} | ${2}) ${3}`).toMatchInlineSnapshot(`
92 Object {
93 "alternation": null,
94 "sequence": Array [
95 Object {
96 "capture": null,
97 "quantifier": null,
98 "sequence": Object {
99 "alternation": Object {
100 "alternation": null,
101 "sequence": Array [
102 Object {
103 "expression": 2,
104 "quantifier": null,
105 "type": "expression",
106 },
107 ],
108 "type": "sequence",
109 },
110 "sequence": Array [
111 Object {
112 "expression": 1,
113 "quantifier": null,
114 "type": "expression",
115 },
116 ],
117 "type": "sequence",
118 },
119 "type": "group",
120 },
121 Object {
122 "expression": 3,
123 "quantifier": null,
124 "type": "expression",
125 },
126 ],
127 "type": "sequence",
128 }
129 `);
130});