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