def test_charSet(self):
     g = VisualRegexGrammar()
     self._parseStringFailTest(g.charSet(), '[]')
     self._parseStringTest(
         g.charSet(), '[abc]',
         Schema.CharSet(items=[
             Schema.CharSetChar(char=Schema.LiteralChar(char='a')),
             Schema.CharSetChar(char=Schema.LiteralChar(char='b')),
             Schema.CharSetChar(char=Schema.LiteralChar(char='c'))
         ]))
     self._parseStringTest(
         g.charSet(), '[^abc]',
         Schema.CharSet(
             invert='1',
             items=[
                 Schema.CharSetChar(char=Schema.LiteralChar(char='a')),
                 Schema.CharSetChar(char=Schema.LiteralChar(char='b')),
                 Schema.CharSetChar(char=Schema.LiteralChar(char='c'))
             ]))
     self._parseStringTest(
         g.charSet(), '[a-z]',
         Schema.CharSet(items=[
             Schema.CharSetRange(min=Schema.LiteralChar(char='a'),
                                 max=Schema.LiteralChar(char='z'))
         ]))
     self._parseStringTest(
         g.charSet(), '[a-zA-Z0-9_]',
         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')),
             Schema.CharSetRange(min=Schema.LiteralChar(char='0'),
                                 max=Schema.LiteralChar(char='9')),
             Schema.CharSetChar(char=Schema.LiteralChar(char='_'))
         ]))
     self._parseStringTest(
         g.charSet(), '[^^]',
         Schema.CharSet(
             invert='1',
             items=[Schema.CharSetChar(char=Schema.LiteralChar(char='^'))]))
     self._parseStringTest(
         g.charSet(), '[-]',
         Schema.CharSet(
             items=[Schema.CharSetChar(char=Schema.LiteralChar(char='-'))]))
     self._parseStringTest(
         g.charSet(), '[a-]',
         Schema.CharSet(items=[
             Schema.CharSetChar(char=Schema.LiteralChar(char='a')),
             Schema.CharSetChar(char=Schema.LiteralChar(char='-'))
         ]))
     self._parseStringTest(
         g.charSet(), '[+--]',
         Schema.CharSet(items=[
             Schema.CharSetRange(min=Schema.LiteralChar(char='+'),
                                 max=Schema.LiteralChar(char='-'))
         ]))
 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_sequence(self):
     g = VisualRegexGrammar()
     self._parseStringTest(
         g.sequence(), 'abc',
         Schema.Sequence(subexps=[
             Schema.LiteralChar(char='a'),
             Schema.LiteralChar(char='b'),
             Schema.LiteralChar(char='c')
         ]))
     self._parseStringTest(
         g.sequence(), 'a*bc',
         Schema.Sequence(subexps=[
             Schema.ZeroOrMore(subexp=Schema.LiteralChar(char='a')),
             Schema.LiteralChar(char='b'),
             Schema.LiteralChar(char='c')
         ]))
     self._parseStringTest(
         g.sequence(), 'ab*c',
         Schema.Sequence(subexps=[
             Schema.LiteralChar(char='a'),
             Schema.ZeroOrMore(subexp=Schema.LiteralChar(char='b')),
             Schema.LiteralChar(char='c')
         ]))
     self._parseStringTest(
         g.sequence(), 'abc*',
         Schema.Sequence(subexps=[
             Schema.LiteralChar(char='a'),
             Schema.LiteralChar(char='b'),
             Schema.ZeroOrMore(subexp=Schema.LiteralChar(char='c'))
         ]))
     self._parseStringTest(
         g.sequence(), '[a-z]bc',
         Schema.Sequence(subexps=[
             Schema.CharSet(items=[
                 Schema.CharSetRange(min=Schema.LiteralChar(char='a'),
                                     max=Schema.LiteralChar(char='z'))
             ]),
             Schema.LiteralChar(char='b'),
             Schema.LiteralChar(char='c')
         ]))
     self._parseStringTest(
         g.sequence(), '\\wbc*',
         Schema.Sequence(subexps=[
             Schema.CharClass(cls='w'),
             Schema.LiteralChar(char='b'),
             Schema.ZeroOrMore(subexp=Schema.LiteralChar(char='c'))
         ]))
 def charSetItemRange(self):
     return (
         self.charSetChar() + Literal('-') +
         self.charSetChar()).action(lambda input, begin, end, x, bindings:
                                    Schema.CharSetRange(min=x[0], max=x[2]))