# http://ananelson.com/blog/2008/06/jruby-wrapping-for-antlr require 'test/unit' require 'antlr_velvet' class Expr include AntlrVelvet end class TestColander < Test::Unit::TestCase ### @export "custom-assertions" def assert_nothing_left(parser) assert(parser.token_stream.index == parser.token_stream.size) end def assert_something_left(parser) assert(parser.token_stream.index < parser.token_stream.size) end def assert_valid_input(method, input_string) assert_nothing_raised do parser = Expr.string_parser(input_string) parser.send(method) assert_nothing_left(parser) end end def assert_too_much_input(method, input_string) parser = Expr.string_parser(input_string) parser.send(method) assert_something_left(parser) end def assert_invalid_input(method, input_string) assert_raise(AntlrError) { Expr.string_parser(input_string).send(method) } end def parsed_value(method, input_string) Expr.string_parser(input_string).send(method) end def parser_output(method, input_string) parser = Expr.string_parser(input_string) parser.send(method) parser.output end ### @export "tests" def test_prog_without_newline assert_invalid_input(:prog, "1 + 1") end def test_prog_with_newline assert_valid_input(:prog, "1 + 1\n") end def test_expr assert_equal 2, parsed_value(:expr, "1 + 1") end def test_stat_output assert_equal ["2"], parser_output(:stat, "1 + 1\n") end def test_prog_output str = " 1 + 1 x = 1 y = 2 3*(x+y) " assert_equal ["2", "9"], parser_output(:prog, str) end def test_nasty_expr assert_equal 3839, parsed_value(:expr, "1 + 2 * (3 + 4 * (5 + 6 * (7 + 8 * 9)))") end ### @end end