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 |