Mirror: The magical sticky regex-based parser generator 馃
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});