require_relative 'helper' # Some sanity is emerging in the testing of parsers # (Parsers are fiddly in respect to space and order, small changes may and do have unexpected effects) # For any functionality that we want to work (ie test), there are actually three tests, with the _same_ name # One in each of the parser/transform/ast classes # Parser test that the parser parses and thet the output is correct. Rules are named and and boil down to # hashes and arrays with lots of symbols for the names the rules (actually the reults) were given # Transform test really just test the tranformation. They basically take the output of the parse # and check that correct Ast classes are produced # Ast tests both steps in one. Ie string input to ast classes output # All threee classes are layed out quite similarly in that they use a check method and # each test assigns @string_input and @parse_output which the check methods then checks # The check methods have a pust in it (to be left) which is very handy for checking # also the output of parser.check can actually be used as the input of transform # Repeat: For every test in parser, there should beone in transform and ast # The test in transform should use the output of parser as input # The test in ast should expect the same result as transform class ParserTest < MiniTest::Test def setup @parser = Parser::Composed.new end def check is = @parser.parse(@string_input) #puts is.inspect assert_equal @parse_output , is end def test_function_definition @string_input = < {:name => 'foo'}, :parmeter_list => {:parmeter => {:name => 'x'}}, :expressions => [{:integer => '5'}]} @parser = @parser.function_definition check end def test_function_assignment @string_input = < { :name => "foo" } , :parmeter_list => { :parmeter => { :name => "x" } }, :expressions => [ { :asignee => { :name => "abba" }, :asigned => { :integer => "5" } } ] } @parser = @parser.function_definition check end def test_assignment @string_input = "a = 5" @parse_output = { :asignee => { :name=>"a" } , :asigned => { :integer => "5" } } @parser = @parser.assignment check end end