def test_regex(self):
     g = VisualRegexGrammar()
     self._parseStringTest(g.regex(), 'a', Schema.LiteralChar(char='a'))
     self._parseStringTest(
         g.regex(), 'abc|def',
         Schema.Choice(subexps=[
             Schema.Sequence(subexps=[
                 Schema.LiteralChar(char='a'),
                 Schema.LiteralChar(char='b'),
                 Schema.LiteralChar(char='c')
             ]),
             Schema.Sequence(subexps=[
                 Schema.LiteralChar(char='d'),
                 Schema.LiteralChar(char='e'),
                 Schema.LiteralChar(char='f')
             ])
         ]))
     self._parseStringTest(
         g.regex(), r'[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}',
         Schema.Sequence(subexps=[
             Schema.CharSet(items=[
                 Schema.CharSetChar(char=Schema.CharClass(cls='w')),
                 Schema.CharSetChar(char=Schema.EscapedChar(char='-'))
             ]),
             Schema.OneOrMore(subexp=Schema.CharSet(items=[
                 Schema.CharSetChar(char=Schema.CharClass(cls='w')),
                 Schema.CharSetChar(char=Schema.EscapedChar(char='-')),
                 Schema.CharSetChar(char=Schema.EscapedChar(char='.'))
             ])),
             Schema.LiteralChar(char='@'),
             Schema.CharSet(items=[
                 Schema.CharSetChar(char=Schema.CharClass(cls='w')),
                 Schema.CharSetChar(char=Schema.EscapedChar(char='-'))
             ]),
             Schema.OneOrMore(subexp=Schema.CharSet(items=[
                 Schema.CharSetChar(char=Schema.CharClass(cls='w')),
                 Schema.CharSetChar(char=Schema.EscapedChar(char='-')),
                 Schema.CharSetChar(char=Schema.EscapedChar(char='.'))
             ])),
             Schema.RepeatRange(subexp=Schema.CharSet(items=[
                 Schema.CharSetRange(min=Schema.LiteralChar(char='a'),
                                     max=Schema.LiteralChar(char='z')),
                 Schema.CharSetRange(min=Schema.LiteralChar(char='A'),
                                     max=Schema.LiteralChar(char='Z'))
             ]),
                                min='1',
                                max='4',
                                greedy='1')
         ]))
 def test_choice(self):
     g = VisualRegexGrammar()
     self._parseStringTest(
         g.choice(), 'abc|def',
         Schema.Choice(subexps=[
             Schema.Sequence(subexps=[
                 Schema.LiteralChar(char='a'),
                 Schema.LiteralChar(char='b'),
                 Schema.LiteralChar(char='c')
             ]),
             Schema.Sequence(subexps=[
                 Schema.LiteralChar(char='d'),
                 Schema.LiteralChar(char='e'),
                 Schema.LiteralChar(char='f')
             ])
         ]))
 def choice(self):
     return (self.sequence() + (Literal('|') + self.sequence()).oneOrMore()
             ).action(lambda input, begin, end, x, bindings: Schema.Choice(
                 subexps=[x[0]] + [p[1] for p in x[1]])) | self.sequence()