64 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
 | 
						|
class GeneratorTestRunner
 | 
						|
 | 
						|
  constructor :configurator, :file_path_utils, :file_wrapper
 | 
						|
 | 
						|
  def find_test_cases(test_file)
 | 
						|
    tests = []
 | 
						|
    tests_and_line_numbers = []
 | 
						|
    lines = []
 | 
						|
    
 | 
						|
    # if we don't have preprocessor assistance, do some basic preprocessing of our own
 | 
						|
    if (not @configurator.project_use_test_preprocessor)
 | 
						|
      source = @file_wrapper.read(test_file)
 | 
						|
    
 | 
						|
      # remove line comments
 | 
						|
      source = source.gsub(/\/\/.*$/, '')
 | 
						|
      # remove block comments
 | 
						|
      source = source.gsub(/\/\*.*?\*\//m, '')
 | 
						|
    
 | 
						|
      # treat preprocessor directives as a logical line
 | 
						|
      lines = source.split(/(^\s*\#.*$) | (;|\{|\}) /x) # match ;, {, and } as end of lines
 | 
						|
    # otherwise, read the preprocessed file raw
 | 
						|
    else
 | 
						|
      lines = @file_wrapper.read( @file_path_utils.form_preprocessed_file_filepath(test_file) ).split(/;|\{|\}/)
 | 
						|
    end
 | 
						|
    
 | 
						|
    # step 1. find test functions in (possibly preprocessed) file
 | 
						|
    # (note that lines are not broken up at end of lines)
 | 
						|
    lines.each do |line|
 | 
						|
      if (line =~ /^\s*void\s+((T|t)est.*)\s*\(\s*(void)?\s*\)/m)
 | 
						|
        tests << ($1.strip)
 | 
						|
      end
 | 
						|
    end
 | 
						|
    
 | 
						|
    # step 2. associate test functions with line numbers in (non-preprocessed) original file
 | 
						|
    # (note that this time we must scan file contents broken up by end of lines)
 | 
						|
    raw_lines = @file_wrapper.read(test_file).split("\n")
 | 
						|
    raw_index = 0
 | 
						|
    
 | 
						|
    tests.each do |test|
 | 
						|
      raw_lines[raw_index..-1].each_with_index do |line, index|
 | 
						|
        # test function might be declared across lines; look for it by its name followed
 | 
						|
        #  by a few tell-tale signs
 | 
						|
        if (line =~ /#{test}\s*($|\(|\()/)
 | 
						|
          raw_index += (index + 1)
 | 
						|
          tests_and_line_numbers << {:test => test, :line_number => raw_index}
 | 
						|
          break
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
    
 | 
						|
    return tests_and_line_numbers
 | 
						|
  end
 | 
						|
  
 | 
						|
  def generate(module_name, runner_filepath, test_cases, mock_list)
 | 
						|
    require 'generate_test_runner.rb'
 | 
						|
    @test_runner_generator ||= UnityTestRunnerGenerator.new( @configurator.get_runner_config )
 | 
						|
    @test_runner_generator.generate( module_name, 
 | 
						|
                                     runner_filepath, 
 | 
						|
                                     test_cases, 
 | 
						|
                                     mock_list)
 | 
						|
  end
 | 
						|
end
 |