rubyx/test/parser
2014-05-30 14:25:08 +03:00
..
helper.rb define modules and tests, no compiling 2014-05-29 15:57:33 +03:00
README.markdown improved the framework a bit 2014-04-29 16:21:28 +03:00
test_all.rb fix class tests and link them into all. 352 tests 2014-05-30 12:24:38 +03:00
test_arguments.rb upgrades ast to first class 2014-05-05 09:51:16 +03:00
test_basic.rb add module names and instance variables as parse rules 2014-05-30 12:06:42 +03:00
test_call_site.rb upgrade calls with operator argument and chaining. Almost feels like cheating, too easy 2014-05-28 15:22:37 +03:00
test_class.rb add instance variables and module name as basic types (as name was there already) and add tests 2014-05-30 14:25:08 +03:00
test_compound.rb fix the compound type parser tests 2014-05-27 15:41:34 +03:00
test_conditional.rb rename conditional to if expression 2014-05-24 10:18:54 +03:00
test_expressions.rb rename function_call to call_site in all levels to avoid confusion 2014-05-13 21:15:02 +03:00
test_function_definition.rb add some return test to functions 2014-05-27 16:51:37 +03:00
test_module.rb add instance variables and module name as basic types (as name was there already) and add tests 2014-05-30 14:25:08 +03:00
test_operators.rb add instance variables and module name as basic types (as name was there already) and add tests 2014-05-30 14:25:08 +03:00
test_return.rb add a simple return, ie the normal kind, not with trailing statements 2014-05-27 16:33:24 +03:00
test_root.rb fixing module and class rules to actually use module names. fix all tests 2014-05-30 12:17:11 +03:00
test_while.rb rename function_call to call_site in all levels to avoid confusion 2014-05-13 21:15:02 +03:00

Parsing

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)

Parsing is a two step process with parslet:

  • parse takes an input and outputs hashes/arrays with basic types
  • tramsform takes the output of parse and generates an ast (as specified by the transformation)

A test tests both phases seperately and again together. Each test must thus specify (as instance variables):

  • the string input
  • the parse output
  • the transform output

Magic

Test are grouped by functionality into cases (classes) and define methods test_* Test cases must include ParserHelper, which includes the magic to write the 3 test methods for each test method. See test_basic for easy example.

Example:

def test_number @string_input = '42 ' @test_output = {:integer => '42'} @transform_output = Parser::IntegerExpression.new(42) @parser = @parser.integer end

The first three lines define the data as described above. The last line tells the parser what to parse. This is off couse only needed when a non-root rule is tested and should be left out if possible.

As can be seen, there are no asserts. All asserting is done by the created methods, which call the check_* methods in helper.