165 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			165 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | require 'constants' | ||
|  | 
 | ||
|  | 
 | ||
|  | class Generator | ||
|  | 
 | ||
|  |   constructor :configurator, | ||
|  |               :generator_helper, | ||
|  |               :preprocessinator, | ||
|  |               :cmock_builder, | ||
|  |               :generator_test_runner, | ||
|  |               :generator_test_results, | ||
|  |               :flaginator, | ||
|  |               :test_includes_extractor, | ||
|  |               :tool_executor, | ||
|  |               :file_finder, | ||
|  |               :file_path_utils, | ||
|  |               :streaminator, | ||
|  |               :plugin_manager, | ||
|  |               :file_wrapper | ||
|  | 
 | ||
|  | 
 | ||
|  |   def generate_shallow_includes_list(context, file) | ||
|  |     @preprocessinator.preprocess_shallow_includes(file) | ||
|  |   end | ||
|  | 
 | ||
|  |   def generate_preprocessed_file(context, file) | ||
|  |     @streaminator.stdout_puts("Preprocessing #{File.basename(file)}...", Verbosity::NORMAL) | ||
|  |     @preprocessinator.preprocess_file(file) | ||
|  |   end | ||
|  | 
 | ||
|  |   def generate_dependencies_file(tool, context, source, object, dependencies) | ||
|  |     @streaminator.stdout_puts("Generating dependencies for #{File.basename(source)}...", Verbosity::NORMAL) | ||
|  |      | ||
|  |     command =  | ||
|  |       @tool_executor.build_command_line( | ||
|  |         tool, | ||
|  |         source, | ||
|  |         dependencies, | ||
|  |         object) | ||
|  |      | ||
|  |     @tool_executor.exec( command[:line], command[:options] ) | ||
|  |   end | ||
|  | 
 | ||
|  |   def generate_mock(context, header_filepath) | ||
|  |     arg_hash = {:header_file => header_filepath, :context => context} | ||
|  |     @plugin_manager.pre_mock_generate( arg_hash ) | ||
|  |      | ||
|  |     begin | ||
|  |       @cmock_builder.cmock.setup_mocks( arg_hash[:header_file] ) | ||
|  |     rescue | ||
|  |       raise | ||
|  |     ensure | ||
|  |       @plugin_manager.post_mock_generate( arg_hash ) | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   # test_filepath may be either preprocessed test file or original test file | ||
|  |   def generate_test_runner(context, test_filepath, runner_filepath) | ||
|  |     arg_hash = {:context => context, :test_file => test_filepath, :runner_file => runner_filepath} | ||
|  |     @plugin_manager.pre_runner_generate(arg_hash) | ||
|  |      | ||
|  |     # collect info we need | ||
|  |     module_name = File.basename(arg_hash[:test_file]) | ||
|  |     test_cases  = @generator_test_runner.find_test_cases( @file_finder.find_test_from_runner_path(runner_filepath) ) | ||
|  |     mock_list   = @test_includes_extractor.lookup_raw_mock_list(arg_hash[:test_file]) | ||
|  | 
 | ||
|  |     @streaminator.stdout_puts("Generating runner for #{module_name}...", Verbosity::NORMAL) | ||
|  |      | ||
|  |     # build runner file | ||
|  |     begin | ||
|  |       @generator_test_runner.generate(module_name, runner_filepath, test_cases, mock_list) | ||
|  |     rescue | ||
|  |       raise | ||
|  |     ensure | ||
|  |       @plugin_manager.post_runner_generate(arg_hash)     | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   def generate_object_file(tool, context, source, object, list='')     | ||
|  |     shell_result = {} | ||
|  |     arg_hash = {:tool => tool, :context => context, :source => source, :object => object, :list => list} | ||
|  |     @plugin_manager.pre_compile_execute(arg_hash) | ||
|  | 
 | ||
|  |     @streaminator.stdout_puts("Compiling #{File.basename(arg_hash[:source])}...", Verbosity::NORMAL) | ||
|  |     command = | ||
|  |       @tool_executor.build_command_line( arg_hash[:tool], | ||
|  |                                          arg_hash[:source], | ||
|  |                                          arg_hash[:object], | ||
|  |                                          arg_hash[:list], | ||
|  |                                          @flaginator.flag_down( OPERATION_COMPILE_SYM, context, source ) ) | ||
|  | 
 | ||
|  |     begin | ||
|  |       shell_result = @tool_executor.exec( command[:line], command[:options] ) | ||
|  |     rescue ShellExecutionException => ex | ||
|  |       shell_result = ex.shell_result | ||
|  |       raise '' | ||
|  |     ensure | ||
|  |       arg_hash[:shell_result] = shell_result | ||
|  |       @plugin_manager.post_compile_execute(arg_hash) | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   def generate_executable_file(tool, context, objects, executable, map='') | ||
|  |     shell_result = {} | ||
|  |     arg_hash = {:tool => tool, :context => context, :objects => objects, :executable => executable, :map => map} | ||
|  |     @plugin_manager.pre_link_execute(arg_hash) | ||
|  |      | ||
|  |     @streaminator.stdout_puts("Linking #{File.basename(arg_hash[:executable])}...", Verbosity::NORMAL) | ||
|  |     command = | ||
|  |       @tool_executor.build_command_line( arg_hash[:tool], | ||
|  |                                          arg_hash[:objects], | ||
|  |                                          arg_hash[:executable], | ||
|  |                                          arg_hash[:map], | ||
|  |                                          @flaginator.flag_down( OPERATION_LINK_SYM, context, executable ) ) | ||
|  |      | ||
|  |     begin | ||
|  |       shell_result = @tool_executor.exec( command[:line], command[:options] ) | ||
|  |     rescue ShellExecutionException => ex | ||
|  |       notice =    "\n" + | ||
|  |                   "NOTICE: If the linker reports missing symbols, the following may be to blame:\n" + | ||
|  |                   "  1. Test lacks #include statements corresponding to needed source files.\n" + | ||
|  |                   "  2. Project search paths do not contain source files corresponding to #include statements in the test.\n" | ||
|  |        | ||
|  |       if (@configurator.project_use_mocks) | ||
|  |         notice += "  3. Test does not #include needed mocks.\n\n" | ||
|  |       else | ||
|  |         notice += "\n" | ||
|  |       end | ||
|  |        | ||
|  |       @streaminator.stderr_puts(notice, Verbosity::COMPLAIN) | ||
|  |       shell_result = ex.shell_result | ||
|  |       raise '' | ||
|  |     ensure | ||
|  |       arg_hash[:shell_result] = shell_result | ||
|  |       @plugin_manager.post_link_execute(arg_hash) | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   def generate_test_results(tool, context, executable, result) | ||
|  |     arg_hash = {:tool => tool, :context => context, :executable => executable, :result_file => result} | ||
|  |     @plugin_manager.pre_test_fixture_execute(arg_hash) | ||
|  |      | ||
|  |     @streaminator.stdout_puts("Running #{File.basename(arg_hash[:executable])}...", Verbosity::NORMAL) | ||
|  |      | ||
|  |     # Unity's exit code is equivalent to the number of failed tests, so we tell @tool_executor not to fail out if there are failures | ||
|  |     # so that we can run all tests and collect all results | ||
|  |     command = @tool_executor.build_command_line(arg_hash[:tool], arg_hash[:executable]) | ||
|  |     command[:options][:boom] = false | ||
|  |     shell_result = @tool_executor.exec( command[:line], command[:options] ) | ||
|  |      | ||
|  |     @generator_helper.test_results_error_handler(executable, shell_result) | ||
|  |      | ||
|  |     processed = @generator_test_results.process_and_write_results( shell_result, | ||
|  |                                                                    arg_hash[:result_file], | ||
|  |                                                                    @file_finder.find_test_from_file_path(arg_hash[:executable]) ) | ||
|  |      | ||
|  |     arg_hash[:result_file]  = processed[:result_file] | ||
|  |     arg_hash[:results]      = processed[:results] | ||
|  |     arg_hash[:shell_result] = shell_result # for raw output display if no plugins for formatted display | ||
|  |      | ||
|  |     @plugin_manager.post_test_fixture_execute(arg_hash) | ||
|  |   end | ||
|  |    | ||
|  | end |