def test_round_trip(self):
        """Test a simple round trip.

        Parse a simple grammar, turn the parse tree into a map of expressions,
        and use that to parse another piece of text.

        Not everything was implemented yet, but it was a big milestone and a
        proof of concept.

        """
        tree = peg_grammar.parse("""number = ~"[0-9]+"\n""")
        rules, default_rule = PegVisitor().visit(tree)

        text = "98"
        eq_(default_rule.parse(text), Node("number", text, 0, 2))
    def test_successes(self):
        """Make sure the PEG recognition grammar succeeds on various inputs."""
        assert peg_grammar["label"].parse("_")
        assert peg_grammar["label"].parse("jeff")
        assert peg_grammar["label"].parse("_THIS_THING")

        assert peg_grammar["atom"].parse("some_label")
        assert peg_grammar["atom"].parse('"some literal"')
        assert peg_grammar["atom"].parse('~"some regex"i')

        assert peg_grammar["quantified"].parse('~"some regex"i*')
        assert peg_grammar["quantified"].parse("thing+")
        assert peg_grammar["quantified"].parse('"hi"?')

        assert peg_grammar["term"].parse("this")
        assert peg_grammar["term"].parse("that+")

        assert peg_grammar["sequence"].parse("this that? other")

        assert peg_grammar["ored"].parse('this / that+ / "other"')

        assert peg_grammar["anded"].parse('this & that+ & "other"')

        assert peg_grammar["poly_term"].parse('this & that+ & "other"')
        assert peg_grammar["poly_term"].parse('this / that? / "other"+')
        assert peg_grammar["poly_term"].parse("this? that other*")

        assert peg_grammar["rhs"].parse("this")
        assert peg_grammar["rhs"].parse("this? that other*")

        assert peg_grammar["rule"].parse("this = that\r")
        assert peg_grammar["rule"].parse("this = the? that other* \t\r")
        assert peg_grammar["rule"].parse('the=~"hi*"\n')

        assert peg_grammar.parse(
            """
            this = the? that other*
            that = "thing"
            the=~"hi*"
            other = "ahoy hoy"
            """
        )
 def test_undefined_rule(self):
     """Make sure we throw the right exception on undefined rules."""
     tree = peg_grammar.parse("boy = howdy\n")
     assert_raises(UndefinedLabel, PegVisitor().visit, tree)