Class: Rails::TestUnit::TestParser
- Defined in:
- railties/lib/rails/test_unit/test_parser.rb
Overview
Parse a test file to extract the line ranges of all tests in both method-style (def test_foo) and declarative-style (test “foo” do)
Instance Method Summary collapse
- #first_arg(arg) ⇒ Object (also: #on_method_add_arg, #on_command, #on_stmts_add, #on_arg_paren, #on_bodystmt)
- 
  
    
      #initialize  ⇒ TestParser 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of TestParser. 
- #just_lineno ⇒ Object (also: #on_ident, #on_do_block, #on_stmts_new, #on_brace_block)
- #on_args_add(parts, part) ⇒ Object
- #on_args_add_block(args, *rest) ⇒ Object
- #on_args_new ⇒ Object
- #on_command_call(begin_lineno, _args) ⇒ Object
- 
  
    
      #on_def(begin_line)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    method test e.g. 
- 
  
    
      #on_method_add_block(begin_line, end_line)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Everything past this point is to support declarative tests, which require more work to get right because of the many different ways methods can be invoked in ruby, all of which are parsed differently. 
- #parse ⇒ Object
Constructor Details
#initialize ⇒ TestParser
| 67 68 69 70 71 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 67 def initialize(*) # A hash mapping the 1-indexed line numbers that tests start on to where they end. @begins_to_ends = {} super end | 
Instance Method Details
#first_arg(arg) ⇒ Object Also known as: on_method_add_arg, on_command, on_stmts_add, on_arg_paren, on_bodystmt
| 104 105 106 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 104 def first_arg(arg, *) arg end | 
#just_lineno ⇒ Object Also known as: on_ident, on_do_block, on_stmts_new, on_brace_block
| 108 109 110 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 108 def just_lineno(*) lineno end | 
#on_args_add(parts, part) ⇒ Object
| 127 128 129 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 127 def on_args_add(parts, part) parts << part end | 
#on_args_add_block(args, *rest) ⇒ Object
| 131 132 133 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 131 def on_args_add_block(args, *rest) args.first end | 
#on_args_new ⇒ Object
| 123 124 125 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 123 def on_args_new [] end | 
#on_command_call(begin_lineno, _args) ⇒ Object
| 100 101 102 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 100 def on_command_call(*, begin_lineno, _args) begin_lineno end | 
#on_def(begin_line) ⇒ Object
method test e.g. ‘def test_some_description` This event’s first argument gets the ‘ident` node containing the method name, which we have overridden to return the line number of the ident instead.
| 82 83 84 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 82 def on_def(begin_line, *) @begins_to_ends[begin_line] = lineno end | 
#on_method_add_block(begin_line, end_line) ⇒ Object
Everything past this point is to support declarative tests, which require more work to get right because of the many different ways methods can be invoked in ruby, all of which are parsed differently.
The approach is just to store the current line number when the “test” method is called and pass it up the tree so it’s available at the point when we also know the line where the associated block ends.
| 94 95 96 97 98 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 94 def on_method_add_block(begin_line, end_line) if begin_line && end_line @begins_to_ends[begin_line] = end_line end end | 
#parse ⇒ Object
| 73 74 75 76 | # File 'railties/lib/rails/test_unit/test_parser.rb', line 73 def parse super @begins_to_ends end |