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