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 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});