diff --git a/auto/colour_prompt.rb b/auto/colour_prompt.rb index a5c72ed453721c121c7da6919ab752c62771be22..0f1dc4e025d919c41a1a61dfe950621253600d37 100644 --- a/auto/colour_prompt.rb +++ b/auto/colour_prompt.rb @@ -21,12 +21,11 @@ end class ColourCommandLine def initialize - if RUBY_PLATFORM =~ /(win|w)32$/ - get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') - @set_console_txt_attrb = - Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') - @hout = get_std_handle.call(-11) - end + return unless RUBY_PLATFORM =~ /(win|w)32$/ + get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') + @set_console_txt_attrb = + Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') + @hout = get_std_handle.call(-11) end def change_to(new_colour) @@ -34,7 +33,7 @@ class ColourCommandLine @set_console_txt_attrb.call(@hout, win32_colour(new_colour)) else "\033[30;#{posix_colour(new_colour)};22m" - end + end end def win32_colour(colour) diff --git a/auto/colour_reporter.rb b/auto/colour_reporter.rb index ba1cea3ca9dc547b76d026f5883cae80c0e6b1a3..bb1fbfce34715544b15d63ec11b827eccf298a4a 100644 --- a/auto/colour_reporter.rb +++ b/auto/colour_reporter.rb @@ -17,7 +17,7 @@ def report(message) line.chomp! colour = case line when /(?:total\s+)?tests:?\s+(\d+)\s+(?:total\s+)?failures:?\s+\d+\s+Ignored:?/i - Regexp.last_match(1).to_i == 0 ? :green : :red + Regexp.last_match(1).to_i.zero? ? :green : :red when /PASS/ :green when /^OK$/ @@ -30,7 +30,7 @@ def report(message) :white else :silver - end + end colour_puts(colour, line) end end diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 32c9ca54bbf57cd0f4632ea04f6229525689e656..2c5e56a9a71c8c8956d6a6e75213cabf7a514e40 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -9,11 +9,11 @@ File.expand_path(File.join(File.dirname(__FILE__), 'colour_prompt')) class UnityTestRunnerGenerator def initialize(options = nil) @options = UnityTestRunnerGenerator.default_options - case (options) + case options when NilClass then @options when String then @options.merge!(UnityTestRunnerGenerator.grab_config(options)) when Hash then @options.merge!(options) - else raise 'If you specify arguments, it should be a filename or a hash of options' + else raise 'If you specify arguments, it should be a filename or a hash of options' end require "#{File.expand_path(File.dirname(__FILE__))}/type_sanitizer" end @@ -43,16 +43,11 @@ class UnityTestRunnerGenerator options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) raise "No :unity or :cmock section found in #{config_file}" unless options end - (options) + options end def run(input_file, output_file, options = nil) - tests = [] - testfile_includes = [] - used_mocks = [] - @options.merge!(options) unless options.nil? - module_name = File.basename(input_file) # pull required data from source file source = File.read(input_file) @@ -80,15 +75,16 @@ class UnityTestRunnerGenerator create_header(output, used_mocks, testfile_includes) create_externs(output, tests, used_mocks) create_mock_management(output, used_mocks) - create_suite_setup_and_teardown(output) + create_suite_setup(output) + create_suite_teardown(output) create_reset(output, used_mocks) create_main(output, input_file, tests, used_mocks) end - if @options[:header_file] && !@options[:header_file].empty? - File.open(@options[:header_file], 'w') do |output| - create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) - end + return unless @options[:header_file] && !@options[:header_file].empty? + + File.open(@options[:header_file], 'w') do |output| + create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) end end @@ -123,7 +119,7 @@ class UnityTestRunnerGenerator source_index = 0 tests_and_line_numbers.size.times do |i| source_lines[source_index..-1].each_with_index do |line, index| - next unless (line =~ /#{tests_and_line_numbers[i][:test]}/) + next unless line =~ /#{tests_and_line_numbers[i][:test]}/ source_index += index tests_and_line_numbers[i][:line_number] = source_index + 1 break @@ -182,12 +178,13 @@ class UnityTestRunnerGenerator output.puts("#include \"#{mock.gsub('.h', '')}.h\"") end output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) - if @options[:enforce_strict_ordering] - output.puts('') - output.puts('int GlobalExpectCount;') - output.puts('int GlobalVerifyOrder;') - output.puts('char* GlobalOrderError;') - end + + return unless @options[:enforce_strict_ordering] + + output.puts('') + output.puts('int GlobalExpectCount;') + output.puts('int GlobalVerifyOrder;') + output.puts('char* GlobalOrderError;') end def create_externs(output, tests, _mocks) @@ -201,55 +198,60 @@ class UnityTestRunnerGenerator end def create_mock_management(output, mock_headers) - unless mock_headers.empty? - output.puts("\n/*=======Mock Management=====*/") - output.puts('static void CMock_Init(void)') - output.puts('{') - if @options[:enforce_strict_ordering] - output.puts(' GlobalExpectCount = 0;') - output.puts(' GlobalVerifyOrder = 0;') - output.puts(' GlobalOrderError = NULL;') - end - mocks = mock_headers.map { |mock| File.basename(mock) } - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Init();") - end - output.puts("}\n") + return if mock_headers.empty? - output.puts('static void CMock_Verify(void)') - output.puts('{') - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Verify();") - end - output.puts("}\n") + output.puts("\n/*=======Mock Management=====*/") + output.puts('static void CMock_Init(void)') + output.puts('{') - output.puts('static void CMock_Destroy(void)') - output.puts('{') - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Destroy();") - end - output.puts("}\n") + if @options[:enforce_strict_ordering] + output.puts(' GlobalExpectCount = 0;') + output.puts(' GlobalVerifyOrder = 0;') + output.puts(' GlobalOrderError = NULL;') end - end - def create_suite_setup_and_teardown(output) - unless @options[:suite_setup].nil? - output.puts("\n/*=======Suite Setup=====*/") - output.puts('static void suite_setup(void)') - output.puts('{') - output.puts(@options[:suite_setup]) - output.puts('}') + mocks = mock_headers.map { |mock| File.basename(mock) } + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Init();") end - unless @options[:suite_teardown].nil? - output.puts("\n/*=======Suite Teardown=====*/") - output.puts('static int suite_teardown(int num_failures)') - output.puts('{') - output.puts(@options[:suite_teardown]) - output.puts('}') + output.puts("}\n") + + output.puts('static void CMock_Verify(void)') + output.puts('{') + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Verify();") end + output.puts("}\n") + + output.puts('static void CMock_Destroy(void)') + output.puts('{') + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Destroy();") + end + output.puts("}\n") + end + + def create_suite_setup(output) + return if @options[:suite_setup].nil? + + output.puts("\n/*=======Suite Setup=====*/") + output.puts('static void suite_setup(void)') + output.puts('{') + output.puts(@options[:suite_setup]) + output.puts('}') + end + + def create_suite_teardown(output) + return if @options[:suite_teardown].nil? + + output.puts("\n/*=======Suite Teardown=====*/") + output.puts('static int suite_teardown(int num_failures)') + output.puts('{') + output.puts(@options[:suite_teardown]) + output.puts('}') end def create_runtest(output, used_mocks) @@ -384,22 +386,25 @@ class UnityTestRunnerGenerator end end -if $PROGRAM_NAME == __FILE__ +if $0 == __FILE__ options = { includes: [] } - yaml_file = nil # parse out all the options first (these will all be removed as we go) ARGV.reject! do |arg| - case (arg) + case arg when '-cexception' - options[:plugins] = [:cexception]; true + options[:plugins] = [:cexception] + true when /\.*\.ya?ml/ - options = UnityTestRunnerGenerator.grab_config(arg); true + options = UnityTestRunnerGenerator.grab_config(arg) + true when /--(\w+)=\"?(.*)\"?/ - options[Regexp.last_match(1).to_sym] = Regexp.last_match(2); true + options[Regexp.last_match(1).to_sym] = Regexp.last_match(2) + true when /\.*\.h/ - options[:includes] << arg; true - else false + options[:includes] << arg + true + else false end end diff --git a/auto/parseOutput.rb b/auto/parseOutput.rb deleted file mode 100644 index 3e026e50875596e7c34b600d682b57802a920ba7..0000000000000000000000000000000000000000 --- a/auto/parseOutput.rb +++ /dev/null @@ -1,218 +0,0 @@ -#============================================================ -# Author: John Theofanopoulos -# A simple parser. Takes the output files generated during the build process and -# extracts information relating to the tests. -# -# Notes: -# To capture an output file under VS builds use the following: -# devenv [build instructions] > Output.txt & type Output.txt -# -# To capture an output file under GCC/Linux builds use the following: -# make | tee Output.txt -# -# To use this parser use the following command -# ruby parseOutput.rb [options] [file] -# options: -xml : produce a JUnit compatible XML file -# file : file to scan for results -#============================================================ - -class ParseOutput - # The following flag is set to true when a test is found or false otherwise. - @testFlag - @xmlOut - @arrayList - @totalTests - @classIndex - - # Set the flag to indicate if there will be an XML output file or not - def setXmlOutput - @xmlOut = true - end - - # if write our output to XML - def writeXmlOuput - output = File.open('report.xml', 'w') - output << "\n" - @arrayList.each do |item| - output << item << "\n" - end - output << "\n" - end - - # This function will try and determine when the suite is changed. This is - # is the name that gets added to the classname parameter. - def testSuiteVerify(testSuiteName) - if @testFlag == false - @testFlag = true - # Split the path name - testName = testSuiteName.split('/') - # Remove the extension - baseName = testName[testName.size - 1].split('.') - @testSuite = 'test.' + baseName[0] - printf "New Test: %s\n", @testSuite - end - end - - # Test was flagged as having passed so format the output - def testPassed(array) - lastItem = array.length - 1 - testName = array[lastItem - 1] - testSuiteVerify(array[@className]) - printf "%-40s PASS\n", testName - if @xmlOut == true - @arrayList.push ' ' - end - end - - # Test was flagged as having passed so format the output. - # This is using the Unity fixture output and not the original Unity output. - def testPassedUnityFixture(array) - testSuite = array[0].sub('TEST(', '') - testSuite = testSuite.sub(',', '') - testName = array[1].sub(')', '') - if @xmlOut == true - @arrayList.push ' ' - end - end - - # Test was flagged as being ingored so format the output - def testIgnored(array) - lastItem = array.length - 1 - testName = array[lastItem - 2] - reason = array[lastItem].chomp - testSuiteVerify(array[@className]) - printf "%-40s IGNORED\n", testName - - if testName.start_with? 'TEST(' - array2 = testName.split(' ') - @testSuite = array2[0].sub('TEST(', '') - @testSuite = @testSuite.sub(',', '') - testName = array2[1].sub(')', '') - end - - if @xmlOut == true - @arrayList.push ' ' - @arrayList.push ' ' + reason + ' ' - @arrayList.push ' ' - end - end - - # Test was flagged as having failed so format the line - def testFailed(array) - lastItem = array.length - 1 - testName = array[lastItem - 2] - reason = array[lastItem].chomp + ' at line: ' + array[lastItem - 3] - testSuiteVerify(array[@className]) - printf "%-40s FAILED\n", testName - - if testName.start_with? 'TEST(' - array2 = testName.split(' ') - @testSuite = array2[0].sub('TEST(', '') - @testSuite = @testSuite.sub(',', '') - testName = array2[1].sub(')', '') - end - - if @xmlOut == true - @arrayList.push ' ' - @arrayList.push ' ' + reason + ' ' - @arrayList.push ' ' - end - end - - # Figure out what OS we are running on. For now we are assuming if it's not Windows it must - # be Unix based. - def detectOS - myOS = RUBY_PLATFORM.split('-') - @className = if myOS.size == 2 - if myOS[1] == 'mingw32' - 1 - else - 0 - end - else - 0 - end - end - - # Main function used to parse the file that was captured. - def process(name) - @testFlag = false - @arrayList = [] - - detectOS - - puts 'Parsing file: ' + name - - testPass = 0 - testFail = 0 - testIgnore = 0 - puts '' - puts '=================== RESULTS =====================' - puts '' - File.open(name).each do |line| - # Typical test lines look like this: - # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 - # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented - # /.c:115:test_tc5100_initCanVoidPtrs:PASS - # - # where path is different on Unix vs Windows devices (Windows leads with a drive letter) - lineArray = line.split(':') - lineSize = lineArray.size - # If we were able to split the line then we can look to see if any of our target words - # were found. Case is important. - if (lineSize >= 4) || (line.start_with? 'TEST(') - # Determine if this test passed - if line.include? ':PASS' - testPassed(lineArray) - testPass += 1 - elsif line.include? ':FAIL:' - testFailed(lineArray) - testFail += 1 - elsif line.include? ':IGNORE:' - testIgnored(lineArray) - testIgnore += 1 - elsif line.start_with? 'TEST(' - if line.include? ' PASS' - lineArray = line.split(' ') - testPassedUnityFixture(lineArray) - testPass += 1 - end - # If none of the keywords are found there are no more tests for this suite so clear - # the test flag - else - @testFlag = false - end - else - @testFlag = false - end - end - puts '' - puts '=================== SUMMARY =====================' - puts '' - puts 'Tests Passed : ' + testPass.to_s - puts 'Tests Failed : ' + testFail.to_s - puts 'Tests Ignored : ' + testIgnore.to_s - @totalTests = testPass + testFail + testIgnore - if @xmlOut == true - heading = '' - @arrayList.insert(0, heading) - writeXmlOuput - end - - # return result - end - end - -# If the command line has no values in, used a default value of Output.txt -parseMyFile = ParseOutput.new - -if ARGV.size >= 1 - ARGV.each do |a| - if a == '-xml' - parseMyFile.setXmlOutput - else - parseMyFile.process(a) - break - end - end -end diff --git a/auto/parse_output.rb b/auto/parse_output.rb new file mode 100644 index 0000000000000000000000000000000000000000..f16cdb036f340b866ede1ef948b5b407fd8f1e2a --- /dev/null +++ b/auto/parse_output.rb @@ -0,0 +1,220 @@ +#============================================================ +# Author: John Theofanopoulos +# A simple parser. Takes the output files generated during the build process and +# extracts information relating to the tests. +# +# Notes: +# To capture an output file under VS builds use the following: +# devenv [build instructions] > Output.txt & type Output.txt +# +# To capture an output file under GCC/Linux builds use the following: +# make | tee Output.txt +# +# To use this parser use the following command +# ruby parseOutput.rb [options] [file] +# options: -xml : produce a JUnit compatible XML file +# file : file to scan for results +#============================================================ + +class ParseOutput + def initialize + @test_flag = false + @xml_out = false + @array_list = false + @total_tests = false + @class_index = false + end + + # Set the flag to indicate if there will be an XML output file or not + def set_xml_output + @xml_out = true + end + + # if write our output to XML + def write_xml_output + output = File.open('report.xml', 'w') + output << "\n" + @array_list.each do |item| + output << item << "\n" + end + output << "\n" + end + + # This function will try and determine when the suite is changed. This is + # is the name that gets added to the classname parameter. + def test_suite_verify(test_suite_name) + return if @test_flag + + @test_flag = true + # Split the path name + test_name = test_suite_name.split('/') + # Remove the extension + base_name = test_name[test_name.size - 1].split('.') + @test_suite = 'test.' + base_name[0] + printf "New Test: %s\n", @test_suite + end + + # Test was flagged as having passed so format the output + def test_passed(array) + last_item = array.length - 1 + test_name = array[last_item - 1] + test_suite_verify(array[@class_name]) + printf "%-40s PASS\n", test_name + + return unless @xml_out + + @array_list.push ' ' + end + + # Test was flagged as having passed so format the output. + # This is using the Unity fixture output and not the original Unity output. + def test_passed_unity_fixture(array) + test_suite = array[0].sub('TEST(', '') + test_suite = test_suite.sub(',', '') + test_name = array[1].sub(')', '') + + return unless @xml_out + + @array_list.push ' ' + end + + # Test was flagged as being ingored so format the output + def test_ignored(array) + last_item = array.length - 1 + test_name = array[last_item - 2] + reason = array[last_item].chomp + test_suite_verify(array[@class_name]) + printf "%-40s IGNORED\n", test_name + + if test_name.start_with? 'TEST(' + array2 = test_name.split(' ') + @test_suite = array2[0].sub('TEST(', '') + @test_suite = @test_suite.sub(',', '') + test_name = array2[1].sub(')', '') + end + + return unless @xml_out + + @array_list.push ' ' + @array_list.push ' ' + reason + ' ' + @array_list.push ' ' + end + + # Test was flagged as having failed so format the line + def test_failed(array) + last_item = array.length - 1 + test_name = array[last_item - 2] + reason = array[last_item].chomp + ' at line: ' + array[last_item - 3] + test_suite_verify(array[@class_name]) + printf "%-40s FAILED\n", test_name + + if test_name.start_with? 'TEST(' + array2 = test_name.split(' ') + @test_suite = array2[0].sub('TEST(', '') + @test_suite = @test_suite.sub(',', '') + test_name = array2[1].sub(')', '') + end + + return unless @xml_out + + @array_list.push ' ' + @array_list.push ' ' + reason + ' ' + @array_list.push ' ' + end + + # Figure out what OS we are running on. For now we are assuming if it's not Windows it must + # be Unix based. + def detect_os + os = RUBY_PLATFORM.split('-') + @class_name = if os.size == 2 + if os[1] == 'mingw32' + 1 + else + 0 + end + else + 0 + end + end + + # Main function used to parse the file that was captured. + def process(name) + @test_flag = false + @array_list = [] + + detect_os + + puts 'Parsing file: ' + name + + test_pass = 0 + test_fail = 0 + test_ignore = 0 + puts '' + puts '=================== RESULTS =====================' + puts '' + File.open(name).each do |line| + # Typical test lines look like this: + # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 + # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented + # /.c:115:test_tc5100_initCanVoidPtrs:PASS + # + # where path is different on Unix vs Windows devices (Windows leads with a drive letter) + line_array = line.split(':') + + # If we were able to split the line then we can look to see if any of our target words + # were found. Case is important. + if (line_array.size >= 4) || (line.start_with? 'TEST(') + # Determine if this test passed + if line.include? ':PASS' + test_passed(line_array) + test_pass += 1 + elsif line.include? ':FAIL:' + test_failed(line_array) + test_fail += 1 + elsif line.include? ':IGNORE:' + test_ignored(line_array) + test_ignore += 1 + elsif line.start_with? 'TEST(' + if line.include? ' PASS' + line_array = line.split(' ') + test_passed_unity_fixture(line_array) + test_pass += 1 + end + # If none of the keywords are found there are no more tests for this suite so clear + # the test flag + else + @test_flag = false + end + else + @test_flag = false + end + end + puts '' + puts '=================== SUMMARY =====================' + puts '' + puts 'Tests Passed : ' + test_pass.to_s + puts 'Tests Failed : ' + test_fail.to_s + puts 'Tests Ignored : ' + test_ignore.to_s + @total_tests = test_pass + test_fail + test_ignore + + return unless @xml_out + + heading = '' + @array_list.insert(0, heading) + write_xml_output + end +end + +# If the command line has no values in, used a default value of Output.txt +parse_my_file = ParseOutput.new + +if ARGV.size >= 1 + ARGV.each do |a| + if a == '-xml' + parse_my_file.set_xml_output + else + parse_my_file.process(a) + break + end + end +end diff --git a/auto/stylize_as_junit.rb b/auto/stylize_as_junit.rb index 0e8ed4b27b9ef4724419677ee8550322c7b3716a..b3d8f4097bacf6c9322805bff5939e941f634006 100644 --- a/auto/stylize_as_junit.rb +++ b/auto/stylize_as_junit.rb @@ -23,37 +23,37 @@ class ArgvParser options.root_path = '.' options.out_file = 'results.xml' - opts = OptionParser.new do |opts| - opts.banner = 'Usage: unity_to_junit.rb [options]' + opts = OptionParser.new do |o| + o.banner = 'Usage: unity_to_junit.rb [options]' - opts.separator '' - opts.separator 'Specific options:' + o.separator '' + o.separator 'Specific options:' - opts.on('-r', '--results ', 'Look for Unity Results files here.') do |results| + o.on('-r', '--results ', 'Look for Unity Results files here.') do |results| # puts "results #{results}" options.results_dir = results end - opts.on('-p', '--root_path ', 'Prepend this path to files in results.') do |root_path| + o.on('-p', '--root_path ', 'Prepend this path to files in results.') do |root_path| options.root_path = root_path end - opts.on('-o', '--output ', 'XML file to generate.') do |out_file| + o.on('-o', '--output ', 'XML file to generate.') do |out_file| # puts "out_file: #{out_file}" options.out_file = out_file end - opts.separator '' - opts.separator 'Common options:' + o.separator '' + o.separator 'Common options:' # No argument, shows at tail. This will print an options summary. - opts.on_tail('-h', '--help', 'Show this message') do - puts opts + o.on_tail('-h', '--help', 'Show this message') do + puts o exit end # Another typical switch to print the version. - opts.on_tail('--version', 'Show version') do + o.on_tail('--version', 'Show version') do puts "unity_to_junit.rb version #{VERSION}" exit end @@ -67,6 +67,7 @@ end # class OptparseExample class UnityToJUnit include FileUtils::Verbose attr_reader :report, :total_tests, :failures, :ignored + attr_writer :targets, :root, :out_file def initialize @report = '' @@ -82,16 +83,16 @@ class UnityToJUnit write_suites_header(f) results.each do |result_file| lines = File.readlines(result_file).map(&:chomp) - if lines.empty? - raise "Empty test result file: #{result_file}" - else - result_output = get_details(result_file, lines) - tests, failures, ignored = parse_test_summary(lines) - result_output[:counts][:total] = tests - result_output[:counts][:failed] = failures - result_output[:counts][:ignored] = ignored - result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) - end + + raise "Empty test result file: #{result_file}" if lines.empty? + + result_output = get_details(result_file, lines) + tests, failures, ignored = parse_test_summary(lines) + result_output[:counts][:total] = tests + result_output[:counts][:failed] = failures + result_output[:counts][:ignored] = ignored + result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) + # use line[0] from the test output to get the test_file path and name test_file_str = lines[0].tr('\\', '/') test_file_str = test_file_str.split(':') @@ -99,7 +100,7 @@ class UnityToJUnit result_file else test_file_str[0] + ':' + test_file_str[1] - end + end result_output[:source][:path] = File.dirname(test_file) result_output[:source][:file] = File.basename(test_file) @@ -116,18 +117,6 @@ class UnityToJUnit f.close end - def set_targets(target_array) - @targets = target_array - end - - def set_root_path(path) - @root = path - end - - def set_out_file(filename) - @out_file = filename - end - def usage(err_msg = nil) puts "\nERROR: " puts err_msg if err_msg @@ -148,11 +137,10 @@ class UnityToJUnit protected def get_details(_result_file, lines) - results = get_results_structure + results = results_structure lines.each do |line| line = line.tr('\\', '/') - src_file, src_line, test_name, status, msg = line.split(/:/) - line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\') + _src_file, src_line, test_name, status, msg = line.split(/:/) case status when 'IGNORE' then results[:ignores] << { test: test_name, line: src_line, message: msg } when 'FAIL' then results[:failures] << { test: test_name, line: src_line, message: msg } @@ -163,11 +151,8 @@ class UnityToJUnit end def parse_test_summary(summary) - if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } - [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] - else - raise "Couldn't parse test results: #{summary}" - end + raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } + [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] end def here @@ -176,7 +161,7 @@ class UnityToJUnit private - def get_results_structure + def results_structure { source: { path: '', file: '' }, successes: [], @@ -213,7 +198,6 @@ class UnityToJUnit def write_tests(results, stream) result = results[:successes] result.each do |item| - filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) stream.puts "\t\t" end end @@ -239,7 +223,7 @@ class UnityToJUnit end end # UnityToJUnit -if __FILE__ == $PROGRAM_NAME +if __FILE__ == $0 # parse out the command options options = ArgvParser.parse(ARGV) @@ -251,18 +235,18 @@ if __FILE__ == $PROGRAM_NAME results = Dir[targets] raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? - utj.set_targets(results) + utj.targets = results # set the root path - utj.set_root_path(options.root_path) + utj.root = options.root_path # set the output XML file name # puts "Output File from options: #{options.out_file}" - utj.set_out_file(options.out_file) + utj.out_file = options.out_file # run the summarizer puts utj.run - rescue Exception => e + rescue StandardError => e utj.usage e.message end end diff --git a/auto/test_file_filter.rb b/auto/test_file_filter.rb index 2067112c481b4b54e0ddd2d02799c6b710c28e70..aad28e38e77ff484ec2888e74f1a13a45cf412b0 100644 --- a/auto/test_file_filter.rb +++ b/auto/test_file_filter.rb @@ -10,15 +10,16 @@ module RakefileHelpers class TestFileFilter def initialize(all_files = false) @all_files = all_files - if @all_files != true - if File.exist?('test_file_filter.yml') - filters = YAML.load_file('test_file_filter.yml') - @all_files = filters[:all_files] - @only_files = filters[:only_files] - @exclude_files = filters[:exclude_files] - end - end + + return false unless @all_files + return false unless File.exist?('test_file_filter.yml') + + filters = YAML.load_file('test_file_filter.yml') + @all_files = filters[:all_files] + @only_files = filters[:only_files] + @exclude_files = filters[:exclude_files] end + attr_accessor :all_files, :only_files, :exclude_files end end diff --git a/auto/unity_test_summary.rb b/auto/unity_test_summary.rb index 8ae670266de0fe8ba6a4cd17f99f7bedb897296c..b37dc5fa7cb3cfa084799320ccb1cfc5a29bb158 100644 --- a/auto/unity_test_summary.rb +++ b/auto/unity_test_summary.rb @@ -15,6 +15,7 @@ class UnityTestSummary include FileUtils::Verbose attr_reader :report, :total_tests, :failures, :ignored + attr_writer :targets, :root def initialize(_opts = {}) @report = '' @@ -33,17 +34,16 @@ class UnityTestSummary results.each do |result_file| lines = File.readlines(result_file).map(&:chomp) - if lines.empty? - raise "Empty test result file: #{result_file}" - else - output = get_details(result_file, lines) - failure_output << output[:failures] unless output[:failures].empty? - ignore_output << output[:ignores] unless output[:ignores].empty? - tests, failures, ignored = parse_test_summary(lines) - @total_tests += tests - @failures += failures - @ignored += ignored - end + + raise "Empty test result file: #{result_file}" if lines.empty? + + output = get_details(result_file, lines) + failure_output << output[:failures] unless output[:failures].empty? + ignore_output << output[:ignores] unless output[:ignores].empty? + tests, failures, ignored = parse_test_summary(lines) + @total_tests += tests + @failures += failures + @ignored += ignored end if @ignored > 0 @@ -70,14 +70,6 @@ class UnityTestSummary @report += "\n" end - def set_targets(target_array) - @targets = target_array - end - - def set_root_path(path) - @root = path - end - def usage(err_msg = nil) puts "\nERROR: " puts err_msg if err_msg @@ -94,7 +86,7 @@ class UnityTestSummary def get_details(_result_file, lines) results = { failures: [], ignores: [], successes: [] } lines.each do |line| - src_file, src_line, test_name, status, msg = line.split(/:/) + _src_file, _src_line, _test_name, status, _msg = line.split(/:/) line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\') case status when 'IGNORE' then results[:ignores] << line_out @@ -106,11 +98,8 @@ class UnityTestSummary end def parse_test_summary(summary) - if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } - [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] - else - raise "Couldn't parse test results: #{summary}" - end + raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } + [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] end def here @@ -118,7 +107,7 @@ class UnityTestSummary end end -if $PROGRAM_NAME == __FILE__ +if $0 == __FILE__ # parse out the command options opts, args = ARGV.partition { |v| v =~ /^--\w+/ } @@ -133,15 +122,15 @@ if $PROGRAM_NAME == __FILE__ targets = "#{ARGV[0].tr('\\', '/')}**/*.test*" results = Dir[targets] raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? - uts.set_targets(results) + uts.targets = results # set the root path args[1] ||= Dir.pwd + '/' - uts.set_root_path(ARGV[1]) + uts.root = ARGV[1] # run the summarizer puts uts.run - rescue Exception => e + rescue StandardError => e uts.usage e.message end end diff --git a/examples/example_3/rakefile.rb b/examples/example_3/rakefile.rb index becc6142c7a78b9f298ba9f2119a3078e10ea843..bf9f42be126b3962d1ed60976286bb6ebb36c503 100644 --- a/examples/example_3/rakefile.rb +++ b/examples/example_3/rakefile.rb @@ -23,7 +23,7 @@ DEFAULT_CONFIG_FILE = 'target_gcc_32.yml'.freeze configure_toolchain(DEFAULT_CONFIG_FILE) task unit: [:prepare_for_tests] do - run_tests get_unit_test_files + run_tests unit_test_files end desc 'Generate test summary' diff --git a/examples/example_3/rakefile_helper.rb b/examples/example_3/rakefile_helper.rb index d51cef72fbad550ff06557add7bc65ec9b0bb880..a186cf0ff5260995993aff7cfa500e3566db14c8 100644 --- a/examples/example_3/rakefile_helper.rb +++ b/examples/example_3/rakefile_helper.rb @@ -22,13 +22,13 @@ module RakefileHelpers configure_clean end - def get_unit_test_files + def unit_test_files path = $cfg['compiler']['unit_tests_path'] + 'Test*' + C_EXTENSION path.tr!('\\', '/') FileList.new(path) end - def get_local_include_dirs + def local_include_dirs include_dirs = $cfg['compiler']['includes']['items'].dup include_dirs.delete_if { |dir| dir.is_a?(Array) } include_dirs @@ -69,14 +69,15 @@ module RakefileHelpers def build_compiler_fields command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items']) - end + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items']) + end options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + { command: command, defines: defines, options: options, includes: includes } end @@ -96,12 +97,12 @@ module RakefileHelpers else squash('', $cfg['linker']['options']) end - if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + { command: command, options: options, includes: includes } end @@ -127,11 +128,12 @@ module RakefileHelpers else squash('', $cfg['simulator']['pre_support']) end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end + { command: command, pre_support: pre_support, post_support: post_support } end @@ -139,7 +141,7 @@ module RakefileHelpers report command_string output = `#{command_string}`.chomp report(output) if verbose && !output.nil? && !output.empty? - if ($?.exitstatus != 0) && raise_on_fail + if !$?.exitstatus.zero? && raise_on_fail raise "Command failed. (Returned #{$?.exitstatus})" end output @@ -147,11 +149,11 @@ module RakefileHelpers def report_summary summary = UnityTestSummary.new - summary.set_root_path(HERE) + summary.root = HERE results_glob = "#{$cfg['compiler']['build_path']}*.test*" results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results summary.run fail_out 'FAIL: There were failures' if summary.failures > 0 end @@ -165,7 +167,7 @@ module RakefileHelpers $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? $cfg['compiler']['defines']['items'] << 'TEST' - include_dirs = get_local_include_dirs + include_dirs = local_include_dirs # Build and execute each unit test test_files.each do |test| @@ -200,11 +202,11 @@ module RakefileHelpers # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str, true, false) test_results = $cfg['compiler']['build_path'] + test_base test_results += if output.match(/OK$/m).nil? diff --git a/extras/fixture/rakefile_helper.rb b/extras/fixture/rakefile_helper.rb index de753b16a2cf67a55a1b8bbbacc54d4fe21645a4..5aa8e56af085aa808008571f6b910eeababbe376 100644 --- a/extras/fixture/rakefile_helper.rb +++ b/extras/fixture/rakefile_helper.rb @@ -14,12 +14,12 @@ module RakefileHelpers C_EXTENSION = '.c'.freeze def load_configuration(config_file) - unless $configured - $cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/ - $cfg = YAML.load(File.read($cfg_file)) - $colour_output = false unless $cfg['colour'] - $configured = true if config_file != DEFAULT_CONFIG_FILE - end + return if $configured + + $cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/ + $cfg = YAML.load(File.read($cfg_file)) + $colour_output = false unless $cfg['colour'] + $configured = true if config_file != DEFAULT_CONFIG_FILE end def configure_clean @@ -50,14 +50,15 @@ module RakefileHelpers def build_compiler_fields command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar']) - end + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar']) + end options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + { command: command, defines: defines, options: options, includes: includes } end @@ -67,6 +68,7 @@ module RakefileHelpers cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{unity_include} #{file} " \ "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" \ "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" + execute(cmd_str) end @@ -77,12 +79,12 @@ module RakefileHelpers else squash('', $cfg['linker']['options']) end - if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + { command: command, options: options, includes: includes } end @@ -108,11 +110,11 @@ module RakefileHelpers else squash('', $cfg['simulator']['pre_support']) end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end { command: command, pre_support: pre_support, post_support: post_support } end @@ -126,11 +128,11 @@ module RakefileHelpers def report_summary summary = UnityTestSummary.new - summary.set_root_path(HERE) + summary.root = HERE results_glob = "#{$cfg['compiler']['build_path']}*.test*" results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results summary.run end @@ -159,11 +161,11 @@ module RakefileHelpers # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable + ' -v -r' - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + ' -v -r' + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str) test_results = $cfg['compiler']['build_path'] + test_base test_results += if output.match(/OK$/m).nil? diff --git a/test/.rubocop.yml b/test/.rubocop.yml index e8d89b2334182de9fbf7b495b85fccbc65682895..c074ca9ac8507a7ce95a54fefbe71bcad9c80c0b 100644 --- a/test/.rubocop.yml +++ b/test/.rubocop.yml @@ -1,19 +1,21 @@ # This is the configuration used to check the rubocop source code. -inherit_from: .rubocop_todo.yml +#inherit_from: .rubocop_todo.yml AllCops: TargetRubyVersion: 2.1 # These are areas where ThrowTheSwitch's coding style diverges from the Ruby standard -# (Maybe we will make these conform over time) Style/SpecialGlobalVars: - SupportedStyles: - - use_perl_names - - use_english_names EnforcedStyle: use_perl_names Style/FormatString: Enabled: false +Style/GlobalVars: + Enabled: false +Style/RegexpLiteral: + AllowInnerSlashes: true +Style/HashSyntax: + EnforcedStyle: no_mixed_keys # This is disabled because it seems to get confused over nested hashes Style/AlignHash: @@ -48,6 +50,8 @@ Metrics/LineLength: Enabled: false Metrics/MethodLength: Enabled: false +Metrics/ModuleLength: + Enabled: false Metrics/ParameterLists: Enabled: false Metrics/PerceivedComplexity: diff --git a/test/.rubocop_todo.yml b/test/.rubocop_todo.yml deleted file mode 100644 index dd4bf87df0a5f82196dee9c39296cf2836349fe9..0000000000000000000000000000000000000000 --- a/test/.rubocop_todo.yml +++ /dev/null @@ -1,443 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2017-03-28 15:45:51 -0400 using RuboCop version 0.48.0. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 1 -# Cop supports --auto-correct. -Lint/DeprecatedClassMethods: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 6 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleAlignWith, SupportedStylesAlignWith, AutoCorrect. -# SupportedStylesAlignWith: keyword, variable, start_of_line -Lint/EndAlignment: - Exclude: - - '../auto/colour_prompt.rb' - - '../auto/colour_reporter.rb' - - '../auto/parseOutput.rb' - - '../auto/stylize_as_junit.rb' - -# Offense count: 2 -Lint/RescueException: - Exclude: - - '../auto/stylize_as_junit.rb' - - '../auto/unity_test_summary.rb' - -# Offense count: 1 -Lint/ShadowingOuterLocalVariable: - Exclude: - - '../auto/stylize_as_junit.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Lint/StringConversionInInterpolation: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 13 -Lint/UselessAssignment: - Exclude: - - '../auto/generate_test_runner.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/unity_test_summary.rb' - - 'rakefile_helper.rb' - -# Offense count: 5 -Lint/Void: - Exclude: - - '../auto/parseOutput.rb' - -# Offense count: 3 -# Configuration parameters: CountComments. -Metrics/ModuleLength: - Max: 204 - -# Offense count: 2 -# Cop supports --auto-correct. -Performance/StringReplacement: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 10 -Style/AccessorMethodName: - Exclude: - - '../auto/stylize_as_junit.rb' - - '../auto/unity_test_summary.rb' - - '../examples/example_3/rakefile_helper.rb' - - 'rakefile_helper.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods. -# SupportedStyles: line_count_based, semantic, braces_for_chaining -# ProceduralMethods: benchmark, bm, bmbm, create, each_with_object, measure, new, realtime, tap, with_object -# FunctionalMethods: let, let!, subject, watch -# IgnoredMethods: lambda, proc, it -Style/BlockDelimiters: - Exclude: - - 'spec/generate_module_existing_file_spec.rb' - -# Offense count: 17 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, SingleLineConditionsOnly, IncludeTernaryExpressions. -# SupportedStyles: assign_to_condition, assign_inside_condition -Style/ConditionalAssignment: - Exclude: - - '../examples/example_3/rakefile_helper.rb' - - '../extras/fixture/rakefile_helper.rb' - - 'rakefile_helper.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Style/ElseAlignment: - Exclude: - - '../auto/generate_test_runner.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Style/EmptyLines: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: empty_lines, no_empty_lines -Style/EmptyLinesAroundBlockBody: - Exclude: - - 'rakefile_helper.rb' - - 'spec/generate_module_existing_file_spec.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines -Style/EmptyLinesAroundModuleBody: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 14 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment, ForceEqualSignAlignment. -Style/ExtraSpacing: - Exclude: - - '../auto/generate_test_runner.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms. -# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS -Style/FileName: - Exclude: - - '../auto/parseOutput.rb' - -# Offense count: 164 -# Configuration parameters: AllowedVariables. -Style/GlobalVars: - Exclude: - - '../auto/colour_reporter.rb' - - '../examples/example_3/rakefile_helper.rb' - - '../extras/fixture/rakefile.rb' - - '../extras/fixture/rakefile_helper.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 20 -# Configuration parameters: MinBodyLength. -Style/GuardClause: - Exclude: - - '../auto/colour_prompt.rb' - - '../auto/generate_test_runner.rb' - - '../auto/parseOutput.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/test_file_filter.rb' - - '../auto/unity_test_summary.rb' - - '../extras/fixture/rakefile_helper.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 630 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols. -# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys -Style/HashSyntax: - Exclude: - - 'rakefile_helper.rb' - - 'spec/generate_module_existing_file_spec.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: MaxLineLength. -Style/IfUnlessModifier: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: IndentationWidth. -Style/IndentAssignment: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: Width, IgnoredPatterns. -Style/IndentationWidth: - Exclude: - - '../auto/generate_test_runner.rb' - - 'spec/generate_module_existing_file_spec.rb' - -# Offense count: 17 -# Cop supports --auto-correct. -Style/LeadingCommentSpace: - Exclude: - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/LineEndConcatenation: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 8 -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: snake_case, camelCase -Style/MethodName: - Exclude: - - '../auto/parseOutput.rb' - -# Offense count: 40 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: symmetrical, new_line, same_line -Style/MultilineArrayBraceLayout: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 63 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: symmetrical, new_line, same_line -Style/MultilineHashBraceLayout: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth. -# SupportedStyles: aligned, indented -Style/MultilineOperationIndentation: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Style/MutableConstant: - Exclude: - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: both, prefix, postfix -Style/NegatedIf: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/Not: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles. -# SupportedStyles: predicate, comparison -Style/NumericPredicate: - Exclude: - - 'spec/**/*' - - '../auto/colour_reporter.rb' - -# Offense count: 17 -# Cop supports --auto-correct. -# Configuration parameters: AllowSafeAssignment. -Style/ParenthesesAroundCondition: - Exclude: - - '../auto/generate_test_runner.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 7 -# Cop supports --auto-correct. -Style/RedundantParentheses: - Exclude: - - '../auto/generate_test_runner.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: AllowMultipleReturnValues. -Style/RedundantReturn: - Exclude: - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes. -# SupportedStyles: slashes, percent_r, mixed -Style/RegexpLiteral: - Exclude: - - '../auto/generate_test_runner.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/type_sanitizer.rb' - - '../auto/unity_test_summary.rb' - - '../extras/fixture/rakefile_helper.rb' - - 'rakefile_helper.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: AllowAsExpressionSeparator. -Style/Semicolon: - Exclude: - - '../auto/generate_test_runner.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -Style/SpaceAfterComma: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleInsidePipes, SupportedStylesInsidePipes. -# SupportedStylesInsidePipes: space, no_space -Style/SpaceAroundBlockParameters: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: space, no_space -Style/SpaceAroundEqualsInParameterDefault: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment. -Style/SpaceAroundOperators: - Exclude: - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: space, no_space -Style/SpaceBeforeBlockBraces: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces, SpaceBeforeBlockParameters. -# SupportedStyles: space, no_space -# SupportedStylesForEmptyBraces: space, no_space -Style/SpaceInsideBlockBraces: - Exclude: - - 'rakefile_helper.rb' - - 'spec/generate_module_existing_file_spec.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 295 -# Cop supports --auto-correct. -Style/SpaceInsideBrackets: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 6 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces. -# SupportedStyles: space, no_space, compact -# SupportedStylesForEmptyBraces: space, no_space -Style/SpaceInsideHashLiteralBraces: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -Style/SpaceInsideParens: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: use_perl_names, use_english_names -Style/SpecialGlobalVars: - Exclude: - - '../auto/generate_test_runner.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/unity_test_summary.rb' - -# Offense count: 167 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, ConsistentQuotesInMultiline. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiterals: - Exclude: - - 'rakefile_helper.rb' - - 'spec/generate_module_existing_file_spec.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, AllowSafeAssignment. -# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex -Style/TernaryParentheses: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 152 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, no_comma -Style/TrailingCommaInLiteral: - Exclude: - - 'spec/generate_module_existing_file_spec.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 39 -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: snake_case, camelCase -Style/VariableName: - Exclude: - - '../auto/parseOutput.rb' - -# Offense count: 69 -# Cop supports --auto-correct. -# Configuration parameters: SupportedStyles, WordRegex. -# SupportedStyles: percent, brackets -Style/WordArray: - EnforcedStyle: percent - MinSize: 12 - -# Offense count: 1 -# Cop supports --auto-correct. -Style/ZeroLengthPredicate: - Exclude: - - 'rakefile_helper.rb' diff --git a/test/rakefile b/test/rakefile index 33c36f8d043ee0f8a2f77ccf87ed3a7f1f03aae0..9bcf2300d0a02e71f88388c3060f5bb40de88324 100644 --- a/test/rakefile +++ b/test/rakefile @@ -32,7 +32,7 @@ configure_toolchain(DEFAULT_CONFIG_FILE) desc "Test unity with its own unit tests" task :unit => [:prepare_for_tests] do - run_tests get_unit_test_files + run_tests unit_test_files end desc "Test unity's helper scripts" @@ -74,32 +74,35 @@ end namespace :style do desc "Check style" task :check do - report execute("rubocop ../ --config .rubocop.yml", true) - report "Style Checked." + report "\nVERIFYING RUBY STYLE" + report execute("rubocop ../auto ../examples ../extras --config .rubocop.yml", true) + report "Style PASSED." end namespace :check do Dir['../**/*.rb'].each do |f| - task File.basename(f, '.rb').to_sym do + task File.basename(f, '.rb').to_sym => ['style:clean'] do report execute("rubocop #{f} --color --config .rubocop.yml", true) - report "Style Checked." + report "Style Checked for #{f}" end end end desc "Attempt to Autocorrect style" - task :auto do - File.delete(".rubocop_todo.yml") - execute("rubocop ../ --auto-correct --config .rubocop.yml") + task :auto => ['style:clean'] do + execute("rubocop ../auto ../examples ../extras --auto-correct --config .rubocop.yml") report "Autocorrected What We Could." end desc "Update style todo list" - task :todo do - File.delete(".rubocop_todo.yml") - execute("rubocop ../ --auto-gen-config --config .rubocop.yml") + task :todo => ['style:clean'] do + execute("rubocop ../auto ../examples ../extras --auto-gen-config --config .rubocop.yml") report "Updated Style TODO List." end + + task :clean do + File.delete(".rubocop_todo.yml") if File.exists?(".rubocop_todo.yml") + end end task :style => ['style:check'] diff --git a/test/rakefile_helper.rb b/test/rakefile_helper.rb index 17bfb27e5637cc66710bb4b1b7a2063b588ac20b..410da7fcfd7e427aefa9a10fc8c37682311d8b48 100644 --- a/test/rakefile_helper.rb +++ b/test/rakefile_helper.rb @@ -11,39 +11,37 @@ require UNITY_ROOT + '../auto/generate_test_runner' require UNITY_ROOT + '../auto/colour_reporter' module RakefileHelpers - - C_EXTENSION = '.c' - + C_EXTENSION = '.c'.freeze def load_configuration(config_file) - unless ($configured) - $cfg_file = "targets/#{config_file}" unless (config_file =~ /[\\|\/]/) - $cfg = YAML.load(File.read($cfg_file)) - $colour_output = false unless $cfg['colour'] - $configured = true if (config_file != DEFAULT_CONFIG_FILE) - end + return if $configured + + $cfg_file = "targets/#{config_file}" unless config_file =~ /[\\|\/]/ + $cfg = YAML.load(File.read($cfg_file)) + $colour_output = false unless $cfg['colour'] + $configured = true if config_file != DEFAULT_CONFIG_FILE end def configure_clean CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? end - def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + def configure_toolchain(config_file = DEFAULT_CONFIG_FILE) config_file += '.yml' unless config_file =~ /\.yml$/ config_file = config_file unless config_file =~ /[\\|\/]/ load_configuration(config_file) configure_clean end - def get_unit_test_files + def unit_test_files path = $cfg['compiler']['unit_tests_path'] + 'test*' + C_EXTENSION - path.gsub!(/\\/, '/') + path.tr!('\\', '/') FileList.new(path) end - def get_local_include_dirs + def local_include_dirs include_dirs = $cfg['compiler']['includes']['items'].dup - include_dirs.delete_if {|dir| dir.is_a?(Array)} - return include_dirs + include_dirs.delete_if { |dir| dir.is_a?(Array) } + include_dirs end def extract_headers(filename) @@ -51,41 +49,37 @@ module RakefileHelpers lines = File.readlines(filename) lines.each do |line| m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/) - if not m.nil? - includes << m[1] - end + includes << m[1] unless m.nil? end - return includes + includes end def find_source_file(header, paths) paths.each do |dir| src_file = dir + header.ext(C_EXTENSION) - if (File.exists?(src_file)) - return src_file - end + return src_file if File.exist?(src_file) end - return nil + nil end def tackit(strings) - if strings.is_a?(Array) - result = "\"#{strings.join}\"" - else - result = strings - end - return result + result = if strings.is_a?(Array) + "\"#{strings.join}\"" + else + strings + end + result end def squash(prefix, items) result = '' items.each { |item| result += " #{prefix}#{tackit(item)}" } - return result + result end def should(behave, &block) if block - puts "Should " + behave + puts 'Should ' + behave yield block else puts "UNIMPLEMENTED CASE: Should #{behave}" @@ -93,91 +87,91 @@ module RakefileHelpers end def build_compiler_fields(inject_defines) - command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'] + inject_defines) - end - options = squash('', $cfg['compiler']['options']) + command = tackit($cfg['compiler']['path']) + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'] + inject_defines) + end + options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :defines => defines, :options => options, :includes => includes} + + { :command => command, :defines => defines, :options => options, :includes => includes } end - def compile(file, defines=[]) + def compile(file, defines = []) compiler = build_compiler_fields(defines) - defines = - cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " + + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " \ "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" execute(cmd_str + obj_file) - return obj_file + + obj_file end def build_linker_fields - command = tackit($cfg['linker']['path']) - if $cfg['linker']['options'].nil? - options = '' - else - options = squash('', $cfg['linker']['options']) - end - if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :options => options, :includes => includes} + command = tackit($cfg['linker']['path']) + options = if $cfg['linker']['options'].nil? + '' + else + squash('', $cfg['linker']['options']) + end + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + + { :command => command, :options => options, :includes => includes } end def link_it(exe_name, obj_list) linker = build_linker_fields cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + - (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + - $cfg['linker']['bin_files']['prefix'] + ' ' + - $cfg['linker']['bin_files']['destination'] + - exe_name + $cfg['linker']['bin_files']['extension'] + (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] execute(cmd_str) end def build_simulator_fields return nil if $cfg['simulator'].nil? - if $cfg['simulator']['path'].nil? - command = '' - else - command = (tackit($cfg['simulator']['path']) + ' ') - end - if $cfg['simulator']['pre_support'].nil? - pre_support = '' - else - pre_support = squash('', $cfg['simulator']['pre_support']) - end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end - return {:command => command, :pre_support => pre_support, :post_support => post_support} - end - - def execute(command_string, ok_to_fail=false) + command = if $cfg['simulator']['path'].nil? + '' + else + (tackit($cfg['simulator']['path']) + ' ') + end + pre_support = if $cfg['simulator']['pre_support'].nil? + '' + else + squash('', $cfg['simulator']['pre_support']) + end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end + + { :command => command, :pre_support => pre_support, :post_support => post_support } + end + + def execute(command_string, ok_to_fail = false) report command_string if $verbose output = `#{command_string}`.chomp - report(output) if ($verbose && !output.nil? && (output.length > 0)) - if (($?.exitstatus != 0) && !ok_to_fail) - raise "Command failed. (Returned #{$?.exitstatus})" - end - return output + report(output) if $verbose && !output.nil? && !output.empty? + raise "Command failed. (Returned #{$?.exitstatus})" if !$?.exitstatus.zero? && !ok_to_fail + output end def report_summary summary = UnityTestSummary.new - summary.set_root_path(UNITY_ROOT) + summary.root = UNITY_ROOT results_glob = "#{$cfg['compiler']['build_path']}*.test*" - results_glob.gsub!(/\\/, '/') + results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results report summary.run end @@ -187,16 +181,16 @@ module RakefileHelpers # Tack on TEST define for compiling unit tests load_configuration($cfg_file) test_defines = ['TEST'] - $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? + $cfg['compiler']['defines']['items'] ||= [] $cfg['compiler']['defines']['items'] << 'TEST' - include_dirs = get_local_include_dirs + include_dirs = local_include_dirs # Build and execute each unit test test_files.each do |test| obj_list = [] - if !$cfg['compiler']['aux_sources'].nil? + unless $cfg['compiler']['aux_sources'].nil? $cfg['compiler']['aux_sources'].each do |aux| obj_list << compile(aux, test_defines) end @@ -206,25 +200,23 @@ module RakefileHelpers extract_headers(test).each do |header| # Compile corresponding source file if it exists src_file = find_source_file(header, include_dirs) - if !src_file.nil? - obj_list << compile(src_file, test_defines) - end + + obj_list << compile(src_file, test_defines) unless src_file.nil? end # Build the test runner (generate if configured to do so) test_base = File.basename(test, C_EXTENSION) runner_name = test_base + '_Runner.c' - runner_path = '' - if $cfg['compiler']['runner_path'].nil? - runner_path = $cfg['compiler']['build_path'] + runner_name - else - runner_path = $cfg['compiler']['runner_path'] + runner_name - end + runner_path = if $cfg['compiler']['runner_path'].nil? + $cfg['compiler']['build_path'] + runner_name + else + $cfg['compiler']['runner_path'] + runner_name + end options = $cfg[:unity] - options[:use_param_tests] = (test =~ /parameterized/) ? true : false + options[:use_param_tests] = test =~ /parameterized/ ? true : false UnityTestRunnerGenerator.new(options).run(test, runner_path) obj_list << compile(runner_path, test_defines) @@ -237,21 +229,20 @@ module RakefileHelpers # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str) test_results = $cfg['compiler']['build_path'] + test_base if output.match(/OK$/m).nil? test_results += '.testfail' else - report output if (!$verbose) #verbose already prints this line, as does a failure + report output unless $verbose # Verbose already prints this line, as does a failure test_results += '.testpass' end File.open(test_results, 'w') { |f| f.print output } - end end end