Merge branch 'master' into float-printing

This commit is contained in:
John Lindgren
2018-11-28 14:02:41 -05:00
39 changed files with 638 additions and 304 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ before_install:
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --assume-yes --quiet gcc-multilib; fi - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --assume-yes --quiet gcc-multilib; fi
install: install:
- gem install rspec - gem install rspec
- gem install rubocop - gem install rubocop -v 0.57.2
script: script:
- cd test && rake ci - cd test && rake ci
- make -s - make -s
View File
+8 -8
View File
@@ -9,7 +9,7 @@ Running Tests
RUN_TEST(func, linenum) RUN_TEST(func, linenum)
Each Test is run within the macro `RUN_TEST`. This macro performs necessary setup before the test is called and handles cleanup and result tabulation afterwards. Each Test is run within the macro `RUN_TEST`. This macro performs necessary setup before the test is called and handles cleanup and result tabulation afterwards.
Ignoring Tests Ignoring Tests
-------------- --------------
@@ -75,7 +75,7 @@ Another way of calling `TEST_ASSERT_FALSE`
TEST_FAIL() TEST_FAIL()
TEST_FAIL_MESSAGE(message) TEST_FAIL_MESSAGE(message)
This test is automatically marked as a failure. The message is output stating why. This test is automatically marked as a failure. The message is output stating why.
Numerical Assertions: Integers Numerical Assertions: Integers
------------------------------ ------------------------------
@@ -87,7 +87,7 @@ Numerical Assertions: Integers
TEST_ASSERT_EQUAL_INT64(expected, actual) TEST_ASSERT_EQUAL_INT64(expected, actual)
Compare two integers for equality and display errors as signed integers. A cast will be performed Compare two integers for equality and display errors as signed integers. A cast will be performed
to your natural integer size so often this can just be used. When you need to specify the exact size, to your natural integer size so often this can just be used. When you need to specify the exact size,
like when comparing arrays, you can use a specific version: like when comparing arrays, you can use a specific version:
TEST_ASSERT_EQUAL_UINT(expected, actual) TEST_ASSERT_EQUAL_UINT(expected, actual)
@@ -96,7 +96,7 @@ like when comparing arrays, you can use a specific version:
TEST_ASSERT_EQUAL_UINT32(expected, actual) TEST_ASSERT_EQUAL_UINT32(expected, actual)
TEST_ASSERT_EQUAL_UINT64(expected, actual) TEST_ASSERT_EQUAL_UINT64(expected, actual)
Compare two integers for equality and display errors as unsigned integers. Like INT, there are Compare two integers for equality and display errors as unsigned integers. Like INT, there are
variants for different sizes also. variants for different sizes also.
TEST_ASSERT_EQUAL_HEX(expected, actual) TEST_ASSERT_EQUAL_HEX(expected, actual)
@@ -105,7 +105,7 @@ variants for different sizes also.
TEST_ASSERT_EQUAL_HEX32(expected, actual) TEST_ASSERT_EQUAL_HEX32(expected, actual)
TEST_ASSERT_EQUAL_HEX64(expected, actual) TEST_ASSERT_EQUAL_HEX64(expected, actual)
Compares two integers for equality and display errors as hexadecimal. Like the other integer comparisons, Compares two integers for equality and display errors as hexadecimal. Like the other integer comparisons,
you can specify the size... here the size will also effect how many nibbles are shown (for example, `HEX16` you can specify the size... here the size will also effect how many nibbles are shown (for example, `HEX16`
will show 4 nibbles). will show 4 nibbles).
@@ -115,7 +115,7 @@ Another way of calling TEST_ASSERT_EQUAL_INT
TEST_ASSERT_INT_WITHIN(delta, expected, actual) TEST_ASSERT_INT_WITHIN(delta, expected, actual)
Asserts that the actual value is within plus or minus delta of the expected value. This also comes in Asserts that the actual value is within plus or minus delta of the expected value. This also comes in
size specific variants. size specific variants.
@@ -199,12 +199,12 @@ Compare two null-terminate strings. Fail if any character is different or if th
TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message)
Compare two strings. Fail if any character is different, stop comparing after len characters. Output a custom message on failure. Compare two strings. Fail if any character is different, stop comparing after len characters. Output a custom message on failure.
Pointer Assertions Pointer Assertions
------------------ ------------------
Most pointer operations can be performed by simply using the integer comparisons above. However, a couple of special cases are added for clarity. Most pointer operations can be performed by simply using the integer comparisons above. However, a couple of special cases are added for clarity.
TEST_ASSERT_NULL(pointer) TEST_ASSERT_NULL(pointer)
+2 -2
View File
@@ -24,7 +24,7 @@ class ColourCommandLine
return unless RUBY_PLATFORM =~ /(win|w)32$/ return unless RUBY_PLATFORM =~ /(win|w)32$/
get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L')
@set_console_txt_attrb = @set_console_txt_attrb =
Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') Win32API.new('kernel32', 'SetConsoleTextAttribute', %w[L N], 'I')
@hout = get_std_handle.call(-11) @hout = get_std_handle.call(-11)
end end
@@ -107,7 +107,7 @@ class ColourCommandLine
$stdout.print("#{change_to(colour)}#{str}\033[0m") if mode == :print $stdout.print("#{change_to(colour)}#{str}\033[0m") if mode == :print
end end
end end
end # ColourCommandLine end
def colour_puts(role, str) def colour_puts(role, str)
ColourCommandLine.new.out_c(:puts, role, str) ColourCommandLine.new.out_c(:puts, role, str)
+1 -1
View File
@@ -4,7 +4,7 @@
# [Released under MIT License. Please refer to license.txt for details] # [Released under MIT License. Please refer to license.txt for details]
# ========================================== # ==========================================
require "#{File.expand_path(File.dirname(__FILE__))}/colour_prompt" require_relative 'colour_prompt'
$colour_output = true $colour_output = true
+3 -5
View File
@@ -45,8 +45,6 @@ TEMPLATE_INC ||= '#ifndef _%3$s_H
class UnityModuleGenerator class UnityModuleGenerator
############################ ############################
def initialize(options = nil) def initialize(options = nil)
here = File.expand_path(File.dirname(__FILE__)) + '/'
@options = UnityModuleGenerator.default_options @options = UnityModuleGenerator.default_options
case options case options
when NilClass then @options when NilClass then @options
@@ -56,9 +54,9 @@ class UnityModuleGenerator
end end
# Create default file paths if none were provided # Create default file paths if none were provided
@options[:path_src] = here + '../src/' if @options[:path_src].nil? @options[:path_src] = "#{__dir__}/../src/" if @options[:path_src].nil?
@options[:path_inc] = @options[:path_src] if @options[:path_inc].nil? @options[:path_inc] = @options[:path_src] if @options[:path_inc].nil?
@options[:path_tst] = here + '../test/' if @options[:path_tst].nil? @options[:path_tst] = "#{__dir__}/../test/" if @options[:path_tst].nil?
@options[:path_src] += '/' unless @options[:path_src][-1] == 47 @options[:path_src] += '/' unless @options[:path_src][-1] == 47
@options[:path_inc] += '/' unless @options[:path_inc][-1] == 47 @options[:path_inc] += '/' unless @options[:path_inc][-1] == 47
@options[:path_tst] += '/' unless @options[:path_tst][-1] == 47 @options[:path_tst] += '/' unless @options[:path_tst][-1] == 47
+9 -5
View File
@@ -4,8 +4,6 @@
# [Released under MIT License. Please refer to license.txt for details] # [Released under MIT License. Please refer to license.txt for details]
# ========================================== # ==========================================
File.expand_path(File.join(File.dirname(__FILE__), 'colour_prompt'))
class UnityTestRunnerGenerator class UnityTestRunnerGenerator
def initialize(options = nil) def initialize(options = nil)
@options = UnityTestRunnerGenerator.default_options @options = UnityTestRunnerGenerator.default_options
@@ -15,7 +13,7 @@ class UnityTestRunnerGenerator
when Hash then @options.merge!(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 end
require "#{File.expand_path(File.dirname(__FILE__))}/type_sanitizer" require_relative 'type_sanitizer'
end end
def self.default_options def self.default_options
@@ -26,6 +24,7 @@ class UnityTestRunnerGenerator
framework: :unity, framework: :unity,
test_prefix: 'test|spec|should', test_prefix: 'test|spec|should',
mock_prefix: 'Mock', mock_prefix: 'Mock',
mock_suffix: '',
setup_name: 'setUp', setup_name: 'setUp',
teardown_name: 'tearDown', teardown_name: 'tearDown',
main_name: 'main', # set to :auto to automatically generate each time main_name: 'main', # set to :auto to automatically generate each time
@@ -148,7 +147,7 @@ class UnityTestRunnerGenerator
mock_headers = [] mock_headers = []
includes.each do |include_path| includes.each do |include_path|
include_file = File.basename(include_path) include_file = File.basename(include_path)
mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}/i mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}.*#{@options[:mock_suffix]}$/i
end end
mock_headers mock_headers
end end
@@ -162,7 +161,9 @@ class UnityTestRunnerGenerator
output.puts('#endif') output.puts('#endif')
output.puts("#include \"#{@options[:framework]}.h\"") output.puts("#include \"#{@options[:framework]}.h\"")
output.puts('#include "cmock.h"') unless mocks.empty? output.puts('#include "cmock.h"') unless mocks.empty?
output.puts('#ifndef UNITY_EXCLUDE_SETJMP_H')
output.puts('#include <setjmp.h>') output.puts('#include <setjmp.h>')
output.puts('#endif')
output.puts('#include <stdio.h>') output.puts('#include <stdio.h>')
if @options[:defines] && !@options[:defines].empty? if @options[:defines] && !@options[:defines].empty?
@options[:defines].each { |d| output.puts("#define #{d}") } @options[:defines].each { |d| output.puts("#define #{d}") }
@@ -194,9 +195,11 @@ class UnityTestRunnerGenerator
output.puts("\n/*=======External Functions This Runner Calls=====*/") output.puts("\n/*=======External Functions This Runner Calls=====*/")
output.puts("extern void #{@options[:setup_name]}(void);") output.puts("extern void #{@options[:setup_name]}(void);")
output.puts("extern void #{@options[:teardown_name]}(void);") output.puts("extern void #{@options[:teardown_name]}(void);")
output.puts("\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif") if @options[:externc]
tests.each do |test| tests.each do |test|
output.puts("extern void #{test[:test]}(#{test[:call] || 'void'});") output.puts("extern void #{test[:test]}(#{test[:call] || 'void'});")
end end
output.puts("#ifdef __cplusplus\n}\n#endif") if @options[:externc]
output.puts('') output.puts('')
end end
@@ -374,7 +377,7 @@ class UnityTestRunnerGenerator
end end
output.puts output.puts
output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty? output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty?
output.puts(" return suite_teardown(UnityEnd());") output.puts(' return suite_teardown(UnityEnd());')
output.puts('}') output.puts('}')
end end
@@ -436,6 +439,7 @@ if $0 == __FILE__
' *.h - header files are added as #includes in runner', ' *.h - header files are added as #includes in runner',
' options:', ' options:',
' -cexception - include cexception support', ' -cexception - include cexception support',
' -externc - add extern "C" for cpp support',
' --setup_name="" - redefine setUp func name to something else', ' --setup_name="" - redefine setUp func name to something else',
' --teardown_name="" - redefine tearDown func name to something else', ' --teardown_name="" - redefine tearDown func name to something else',
' --main_name="" - redefine main func name to something else', ' --main_name="" - redefine main func name to something else',
+226 -124
View File
@@ -1,206 +1,308 @@
#============================================================ #============================================================
# Author: John Theofanopoulos # Author: John Theofanopoulos
# A simple parser. Takes the output files generated during the build process and # A simple parser. Takes the output files generated during the
# extracts information relating to the tests. # build process and extracts information relating to the tests.
# #
# Notes: # Notes:
# To capture an output file under VS builds use the following: # To capture an output file under VS builds use the following:
# devenv [build instructions] > Output.txt & type Output.txt # devenv [build instructions] > Output.txt & type Output.txt
# #
# To capture an output file under GCC/Linux builds use the following: # To capture an output file under Linux builds use the following:
# make | tee Output.txt # make | tee Output.txt
# #
# This script can handle the following output formats:
# - normal output (raw unity)
# - fixture output (unity_fixture.h/.c)
# - fixture output with verbose flag set ("-v")
#
# To use this parser use the following command # To use this parser use the following command
# ruby parseOutput.rb [options] [file] # ruby parseOutput.rb [options] [file]
# options: -xml : produce a JUnit compatible XML file # options: -xml : produce a JUnit compatible XML file
# file : file to scan for results # file: file to scan for results
#============================================================ #============================================================
# Parser class for handling the input file
class ParseOutput class ParseOutput
def initialize def initialize
@test_flag = false # internal data
@class_name_idx = 0
@path_delim = nil
# xml output related
@xml_out = false @xml_out = false
@array_list = false @array_list = false
@total_tests = false
@class_index = false # current suite name and statistics
@test_suite = nil
@total_tests = 0
@test_passed = 0
@test_failed = 0
@test_ignored = 0
end end
# Set the flag to indicate if there will be an XML output file or not # Set the flag to indicate if there will be an XML output file or not
def set_xml_output def set_xml_output
@xml_out = true @xml_out = true
end end
# if write our output to XML # If write our output to XML
def write_xml_output def write_xml_output
output = File.open('report.xml', 'w') output = File.open('report.xml', 'w')
output << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" output << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
@array_list.each do |item| @array_list.each do |item|
output << item << "\n" output << item << "\n"
end end
output << "</testsuite>\n"
end end
# This function will try and determine when the suite is changed. This is # Pushes the suite info as xml to the array list, which will be written later
def push_xml_output_suite_info
# Insert opening tag at front
heading = '<testsuite name="Unity" tests="' + @total_tests.to_s + '" failures="' + @test_failed.to_s + '"' + ' skips="' + @test_ignored.to_s + '">'
@array_list.insert(0, heading)
# Push back the closing tag
@array_list.push '</testsuite>'
end
# Pushes xml output data to the array list, which will be written later
def push_xml_output_passed(test_name)
@array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '"/>'
end
# Pushes xml output data to the array list, which will be written later
def push_xml_output_failed(test_name, reason)
@array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
@array_list.push ' <failure type="ASSERT FAILED">' + reason + '</failure>'
@array_list.push ' </testcase>'
end
# Pushes xml output data to the array list, which will be written later
def push_xml_output_ignored(test_name, reason)
@array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
@array_list.push ' <skipped type="TEST IGNORED">' + reason + '</skipped>'
@array_list.push ' </testcase>'
end
# This function will try and determine when the suite is changed. This is
# is the name that gets added to the classname parameter. # is the name that gets added to the classname parameter.
def test_suite_verify(test_suite_name) def test_suite_verify(test_suite_name)
return if @test_flag
@test_flag = true
# Split the path name # Split the path name
test_name = test_suite_name.split('/') test_name = test_suite_name.split(@path_delim)
# Remove the extension
base_name = test_name[test_name.size - 1].split('.') # Remove the extension and extract the base_name
@test_suite = 'test.' + base_name[0] base_name = test_name[test_name.size - 1].split('.')[0]
# Return if the test suite hasn't changed
return unless base_name.to_s != @test_suite.to_s
@test_suite = base_name
printf "New Test: %s\n", @test_suite printf "New Test: %s\n", @test_suite
end end
# Prepares the line for verbose fixture output ("-v")
def prepare_fixture_line(line)
line = line.sub('IGNORE_TEST(', '')
line = line.sub('TEST(', '')
line = line.sub(')', ',')
line = line.chomp
array = line.split(',')
array.map { |x| x.to_s.lstrip.chomp }
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)
class_name = array[0]
test_name = array[1]
test_suite_verify(class_name)
printf "%-40s PASS\n", test_name
push_xml_output_passed(test_name) if @xml_out
end
# Test was flagged as having failed so format the output.
# This is using the Unity fixture output and not the original Unity output.
def test_failed_unity_fixture(array)
class_name = array[0]
test_name = array[1]
test_suite_verify(class_name)
reason_array = array[2].split(':')
reason = reason_array[-1].lstrip.chomp + ' at line: ' + reason_array[-4]
printf "%-40s FAILED\n", test_name
push_xml_output_failed(test_name, reason) if @xml_out
end
# Test was flagged as being ignored so format the output.
# This is using the Unity fixture output and not the original Unity output.
def test_ignored_unity_fixture(array)
class_name = array[0]
test_name = array[1]
reason = 'No reason given'
if array.size > 2
reason_array = array[2].split(':')
tmp_reason = reason_array[-1].lstrip.chomp
reason = tmp_reason == 'IGNORE' ? 'No reason given' : tmp_reason
end
test_suite_verify(class_name)
printf "%-40s IGNORED\n", test_name
push_xml_output_ignored(test_name, reason) if @xml_out
end
# Test was flagged as having passed so format the output # Test was flagged as having passed so format the output
def test_passed(array) def test_passed(array)
last_item = array.length - 1 last_item = array.length - 1
test_name = array[last_item - 1] test_name = array[last_item - 1]
test_suite_verify(array[@class_name]) test_suite_verify(array[@class_name_idx])
printf "%-40s PASS\n", test_name printf "%-40s PASS\n", test_name
return unless @xml_out return unless @xml_out
@array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '"/>' push_xml_output_passed(test_name) if @xml_out
end end
# Test was flagged as having passed so format the output. # Test was flagged as having failed so format the line
# 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 ' <testcase classname="' + test_suite + '" name="' + test_name + '"/>'
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 ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
@array_list.push ' <skipped type="TEST IGNORED"> ' + reason + ' </skipped>'
@array_list.push ' </testcase>'
end
# Test was flagged as having failed so format the line
def test_failed(array) def test_failed(array)
last_item = array.length - 1 last_item = array.length - 1
test_name = array[last_item - 2] test_name = array[last_item - 2]
reason = array[last_item].chomp + ' at line: ' + array[last_item - 3] reason = array[last_item].chomp.lstrip + ' at line: ' + array[last_item - 3]
test_suite_verify(array[@class_name]) class_name = array[@class_name_idx]
printf "%-40s FAILED\n", test_name
if test_name.start_with? 'TEST(' if test_name.start_with? 'TEST('
array2 = test_name.split(' ') array2 = test_name.split(' ')
@test_suite = array2[0].sub('TEST(', '')
@test_suite = @test_suite.sub(',', '') test_suite = array2[0].sub('TEST(', '')
test_suite = test_suite.sub(',', '')
class_name = test_suite
test_name = array2[1].sub(')', '') test_name = array2[1].sub(')', '')
end end
return unless @xml_out test_suite_verify(class_name)
printf "%-40s FAILED\n", test_name
@array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">' push_xml_output_failed(test_name, reason) if @xml_out
@array_list.push ' <failure type="ASSERT FAILED"> ' + reason + ' </failure>'
@array_list.push ' </testcase>'
end end
# Figure out what OS we are running on. For now we are assuming if it's not Windows it must # Test was flagged as being ignored so format the output
# be Unix based. def test_ignored(array)
def detect_os last_item = array.length - 1
os = RUBY_PLATFORM.split('-') test_name = array[last_item - 2]
@class_name = if os.size == 2 reason = array[last_item].chomp.lstrip
if os[1] == 'mingw32' class_name = array[@class_name_idx]
1
else if test_name.start_with? 'TEST('
0 array2 = test_name.split(' ')
end
else test_suite = array2[0].sub('TEST(', '')
0 test_suite = test_suite.sub(',', '')
end class_name = test_suite
test_name = array2[1].sub(')', '')
end
test_suite_verify(class_name)
printf "%-40s IGNORED\n", test_name
push_xml_output_ignored(test_name, reason) if @xml_out
end
# Adjusts the os specific members according to the current path style
# (Windows or Unix based)
def detect_os_specifics(line)
if line.include? '\\'
# Windows X:\Y\Z
@class_name_idx = 1
@path_delim = '\\'
else
# Unix Based /X/Y/Z
@class_name_idx = 0
@path_delim = '/'
end
end end
# Main function used to parse the file that was captured. # Main function used to parse the file that was captured.
def process(name) def process(file_name)
@test_flag = false
@array_list = [] @array_list = []
detect_os puts 'Parsing file: ' + file_name
puts 'Parsing file: ' + name @test_passed = 0
@test_failed = 0
test_pass = 0 @test_ignored = 0
test_fail = 0
test_ignore = 0
puts '' puts ''
puts '=================== RESULTS =====================' puts '=================== RESULTS ====================='
puts '' puts ''
File.open(name).each do |line| File.open(file_name).each do |line|
# Typical test lines look like this: # Typical test lines look like these:
# ----------------------------------------------------
# 1. normal output:
# <path>/<test_file>.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 # <path>/<test_file>.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0
# <path>/<test_file>.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented # <path>/<test_file>.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented
# <path>/<test_file>.c:115:test_tc5100_initCanVoidPtrs:PASS # <path>/<test_file>.c:115:test_tc5100_initCanVoidPtrs:PASS
# #
# where path is different on Unix vs Windows devices (Windows leads with a drive letter) # 2. fixture output
# <path>/<test_file>.c:63:TEST(<test_group>, <test_function>):FAIL: Expected 0x00001234 Was 0x00005A5A
# <path>/<test_file>.c:36:TEST(<test_group>, <test_function>):IGNORE
# Note: "PASS" information won't be generated in this mode
#
# 3. fixture output with verbose information ("-v")
# TEST(<test_group, <test_file>)<path>/<test_file>:168::FAIL: Expected 0x8D Was 0x8C
# TEST(<test_group>, <test_file>)<path>/<test_file>:22::IGNORE: This Test Was Ignored On Purpose
# IGNORE_TEST(<test_group, <test_file>)
# TEST(<test_group, <test_file>) PASS
#
# Note: Where path is different on Unix vs Windows devices (Windows leads with a drive letter)!
detect_os_specifics(line)
line_array = line.split(':') line_array = line.split(':')
# If we were able to split the line then we can look to see if any of our target words # 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. # were found. Case is important.
if (line_array.size >= 4) || (line.start_with? 'TEST(') next unless (line_array.size >= 4) || (line.start_with? 'TEST(') || (line.start_with? 'IGNORE_TEST(')
# Determine if this test passed
if line.include? ':PASS' # check if the output is fixture output (with verbose flag "-v")
test_passed(line_array) if (line.start_with? 'TEST(') || (line.start_with? 'IGNORE_TEST(')
test_pass += 1 line_array = prepare_fixture_line(line)
elsif line.include? ':FAIL:' if line.include? ' PASS'
test_failed(line_array) test_passed_unity_fixture(line_array)
test_fail += 1 @test_passed += 1
elsif line.include? ':IGNORE:' elsif line.include? 'FAIL'
test_ignored(line_array) test_failed_unity_fixture(line_array)
test_ignore += 1 @test_failed += 1
elsif line.start_with? 'TEST(' elsif line.include? 'IGNORE'
if line.include? ' PASS' test_ignored_unity_fixture(line_array)
line_array = line.split(' ') @test_ignored += 1
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 end
else # normal output / fixture output (without verbose "-v")
@test_flag = false elsif line.include? ':PASS'
test_passed(line_array)
@test_passed += 1
elsif line.include? ':FAIL'
test_failed(line_array)
@test_failed += 1
elsif line.include? ':IGNORE:'
test_ignored(line_array)
@test_ignored += 1
elsif line.include? ':IGNORE'
line_array.push('No reason given')
test_ignored(line_array)
@test_ignored += 1
end end
@total_tests = @test_passed + @test_failed + @test_ignored
end end
puts '' puts ''
puts '=================== SUMMARY =====================' puts '=================== SUMMARY ====================='
puts '' puts ''
puts 'Tests Passed : ' + test_pass.to_s puts 'Tests Passed : ' + @test_passed.to_s
puts 'Tests Failed : ' + test_fail.to_s puts 'Tests Failed : ' + @test_failed.to_s
puts 'Tests Ignored : ' + test_ignore.to_s puts 'Tests Ignored : ' + @test_ignored.to_s
@total_tests = test_pass + test_fail + test_ignore
return unless @xml_out return unless @xml_out
heading = '<testsuite tests="' + @total_tests.to_s + '" failures="' + test_fail.to_s + '"' + ' skips="' + test_ignore.to_s + '">' # push information about the suite
@array_list.insert(0, heading) push_xml_output_suite_info
# write xml output file
write_xml_output write_xml_output
end end
end end
@@ -209,11 +311,11 @@ end
parse_my_file = ParseOutput.new parse_my_file = ParseOutput.new
if ARGV.size >= 1 if ARGV.size >= 1
ARGV.each do |a| ARGV.each do |arg|
if a == '-xml' if arg == '-xml'
parse_my_file.set_xml_output parse_my_file.set_xml_output
else else
parse_my_file.process(a) parse_my_file.process(arg)
break break
end end
end end
+4 -8
View File
@@ -61,8 +61,8 @@ class ArgvParser
opts.parse!(args) opts.parse!(args)
options options
end # parse() end
end # class OptparseExample end
class UnityToJUnit class UnityToJUnit
include FileUtils::Verbose include FileUtils::Verbose
@@ -155,10 +155,6 @@ class UnityToJUnit
[Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i]
end end
def here
File.expand_path(File.dirname(__FILE__))
end
private private
def results_structure def results_structure
@@ -221,9 +217,9 @@ class UnityToJUnit
def write_suites_footer(stream) def write_suites_footer(stream)
stream.puts '</testsuites>' stream.puts '</testsuites>'
end end
end # UnityToJUnit end
if __FILE__ == $0 if $0 == __FILE__
# parse out the command options # parse out the command options
options = ArgvParser.parse(ARGV) options = ArgvParser.parse(ARGV)
+2 -2
View File
@@ -11,8 +11,8 @@ module RakefileHelpers
def initialize(all_files = false) def initialize(all_files = false)
@all_files = all_files @all_files = all_files
return false unless @all_files return unless @all_files
return false unless File.exist?('test_file_filter.yml') return unless File.exist?('test_file_filter.yml')
filters = YAML.load_file('test_file_filter.yml') filters = YAML.load_file('test_file_filter.yml')
@all_files = filters[:all_files] @all_files = filters[:all_files]
-4
View File
@@ -101,10 +101,6 @@ class UnityTestSummary
raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } 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] [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i]
end end
def here
File.expand_path(File.dirname(__FILE__))
end
end end
if $0 == __FILE__ if $0 == __FILE__
+9 -10
View File
@@ -1,4 +1,4 @@
# ThrowTheSwitch.org Coding Standard # ThrowTheSwitch.org Coding Standard
Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part, Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part,
we try to follow these standards to unify our contributors' code into a cohesive we try to follow these standards to unify our contributors' code into a cohesive
@@ -11,7 +11,7 @@ and we'll try to be polite when we notice yours.
## Why Have A Coding Standard? ## Why Have A Coding Standard?
Being consistent makes code easier to understand. We've made an attempt to keep Being consistent makes code easier to understand. We've tried to keep
our standard simple because we also believe that we can only expect someone to our standard simple because we also believe that we can only expect someone to
follow something that is understandable. Please do your best. follow something that is understandable. Please do your best.
@@ -51,11 +51,11 @@ much as they can, but give the user the power to override it when it's wrong.
Let's talk about naming things. Programming is all about naming things. We name Let's talk about naming things. Programming is all about naming things. We name
files, functions, variables, and so much more. While we're not always going to files, functions, variables, and so much more. While we're not always going to
find the best name for something, we actually put quite a bit of effort into find the best name for something, we actually put a bit of effort into
finding *What Something WANTS to be Called*™. finding *What Something WANTS to be Called*™.
When naming things, we more or less follow this hierarchy, the first being the When naming things, we follow this hierarchy, the first being the
most important to us (but we do all four whenever possible): most important to us (but we do all four when possible):
1. Readable 1. Readable
2. Descriptive 2. Descriptive
3. Consistent 3. Consistent
@@ -74,7 +74,7 @@ abbreviations (sticking to ones we feel are common).
We like descriptive names for things, especially functions and variables. We like descriptive names for things, especially functions and variables.
Finding the right name for something is an important endeavor. You might notice Finding the right name for something is an important endeavor. You might notice
from poking around our code that this often results in names that are a little from poking around our code that this often results in names that are a little
longer than the average. Guilty. We're okay with a tiny bit more typing if it longer than the average. Guilty. We're okay with a bit more typing if it
means our code is easier to understand. means our code is easier to understand.
There are two exceptions to this rule that we also stick to as religiously as There are two exceptions to this rule that we also stick to as religiously as
@@ -82,8 +82,7 @@ possible:
First, while we realize hungarian notation (and similar systems for encoding First, while we realize hungarian notation (and similar systems for encoding
type information into variable names) is providing a more descriptive name, we type information into variable names) is providing a more descriptive name, we
feel that (for the average developer) it takes away from readability and feel that (for the average developer) it takes away from readability and is to be avoided.
therefore is to be avoided.
Second, loop counters and other local throw-away variables often have a purpose Second, loop counters and other local throw-away variables often have a purpose
which is obvious. There's no need, therefore, to get carried away with complex which is obvious. There's no need, therefore, to get carried away with complex
@@ -128,7 +127,7 @@ the same. It will only hurt a little. We promise.
#### Whitespace #### Whitespace
Our C-style is to use spaces and to use 4 of them per indent level. It's a nice Our C-style is to use spaces and to use 4 of them per indent level. It's a nice
power-of-2 number that looks decent on a wide screen. We have no more reason power-of-2 number that looks decent on a wide-screen. We have no more reason
than that. We break that rule when we have lines that wrap (macros or function than that. We break that rule when we have lines that wrap (macros or function
arguments or whatnot). When that happens, we like to indent further to line arguments or whatnot). When that happens, we like to indent further to line
things up in nice tidy columns. things up in nice tidy columns.
@@ -200,7 +199,7 @@ that happens, we like to indent further to line things up in nice tidy columns.
## Documentation ## Documentation
Egad. Really? We use markdown and we like pdf files because they can be made to Egad. Really? We use mark down and we like pdf files because they can be made to
look nice while still being portable. Good enough? look nice while still being portable. Good enough?
+11 -2
View File
@@ -80,7 +80,7 @@ marked as an optional parameter because some assertions only need a single
"actual" parameter (e.g. null check). "actual" parameter (e.g. null check).
"Size/count" refers to string lengths, number of array elements, etc. "Size/count" refers to string lengths, number of array elements, etc.
Many of Unity's assertions are apparent duplications in that the same data type Many of Unity's assertions are clear duplications in that the same data type
is handled by several assertions. The differences among these are in how failure is handled by several assertions. The differences among these are in how failure
messages are presented. For instance, a `_HEX` variant of an assertion prints messages are presented. For instance, a `_HEX` variant of an assertion prints
the expected and actual values of that assertion formatted as hexadecimal. the expected and actual values of that assertion formatted as hexadecimal.
@@ -104,6 +104,15 @@ becomes messageified like thus...
TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message ) TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message )
Notes:
- The `_MESSAGE` variants intentionally do not support `printf` style formatting
since many embedded projects don't support or avoid `printf` for various reasons.
It is possible to use `sprintf` before the assertion to assemble a complex fail
message, if necessary.
- If you want to output a counter value within an assertion fail message (e.g. from
a loop) , building up an array of results and then using one of the `_ARRAY`
assertions (see below) might be a handy alternative to `sprintf`.
#### TEST_ASSERT_X_ARRAY Variants #### TEST_ASSERT_X_ARRAY Variants
@@ -694,7 +703,7 @@ point value.
So what happens when it's zero? Zero - even more than other floating point So what happens when it's zero? Zero - even more than other floating point
values - can be represented many different ways. It doesn't matter if you have values - can be represented many different ways. It doesn't matter if you have
0 x 20or 0 x 263.It's still zero, right? Luckily, if you 0 x 20 or 0 x 263.It's still zero, right? Luckily, if you
subtract these values from each other, they will always produce a difference of subtract these values from each other, they will always produce a difference of
zero, which will still fall between 0 plus or minus a delta of 0. So it still zero, which will still fall between 0 plus or minus a delta of 0. So it still
works! works!
+19 -9
View File
@@ -1,4 +1,4 @@
# Unity Configuration Guide # Unity Configuration Guide
## C Standards, Compilers and Microcontrollers ## C Standards, Compilers and Microcontrollers
@@ -19,7 +19,7 @@ definitions. A couple are macros with arguments. They live inside the
unity_internals.h header file. We don't necessarily recommend opening that file unity_internals.h header file. We don't necessarily recommend opening that file
unless you really need to. That file is proof that a cross-platform library is unless you really need to. That file is proof that a cross-platform library is
challenging to build. From a more positive perspective, it is also proof that a challenging to build. From a more positive perspective, it is also proof that a
great deal of complexity can be centralized primarily to one place in order to great deal of complexity can be centralized primarily to one place to
provide a more consistent and simple experience elsewhere. provide a more consistent and simple experience elsewhere.
@@ -58,7 +58,7 @@ sizes. It starts off by trying to do it automatically.
##### `UNITY_EXCLUDE_STDINT_H` ##### `UNITY_EXCLUDE_STDINT_H`
The first thing that Unity does to guess your types is check `stdint.h`. The first thing that Unity does to guess your types is check `stdint.h`.
This file includes defines like `UINT_MAX` that Unity can make use of to This file includes defines like `UINT_MAX` that Unity can use to
learn a lot about your system. It's possible you don't want it to do this learn a lot about your system. It's possible you don't want it to do this
(um. why not?) or (more likely) it's possible that your system doesn't (um. why not?) or (more likely) it's possible that your system doesn't
support `stdint.h`. If that's the case, you're going to want to define this. support `stdint.h`. If that's the case, you're going to want to define this.
@@ -215,6 +215,18 @@ Guide.
_Example:_ _Example:_
#define UNITY_FLOAT_PRECISION 0.001f #define UNITY_FLOAT_PRECISION 0.001f
### Miscellaneous
##### `UNITY_EXCLUDE_STDDEF_H`
Unity uses the `NULL` macro, which defines the value of a null pointer constant,
defined in `stddef.h` by default. If you want to provide
your own macro for this, you should exclude the `stddef.h` header file by adding this
define to your configuration.
_Example:_
#define UNITY_EXCLUDE_STDDEF_H
### Toolset Customization ### Toolset Customization
@@ -222,7 +234,7 @@ In addition to the options listed above, there are a number of other options
which will come in handy to customize Unity's behavior for your specific which will come in handy to customize Unity's behavior for your specific
toolchain. It is possible that you may not need to touch any of these... but toolchain. It is possible that you may not need to touch any of these... but
certain platforms, particularly those running in simulators, may need to jump certain platforms, particularly those running in simulators, may need to jump
through extra hoops to operate properly. These macros will help in those through extra hoops to run properly. These macros will help in those
situations. situations.
@@ -248,7 +260,8 @@ _Example:_
Say you are forced to run your test suite on an embedded processor with no Say you are forced to run your test suite on an embedded processor with no
`stdout` option. You decide to route your test result output to a custom serial `stdout` option. You decide to route your test result output to a custom serial
`RS232_putc()` function you wrote like thus: `RS232_putc()` function you wrote like thus:
#include "RS232_header.h"
...
#define UNITY_OUTPUT_CHAR(a) RS232_putc(a) #define UNITY_OUTPUT_CHAR(a) RS232_putc(a)
#define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0)
#define UNITY_OUTPUT_FLUSH() RS232_flush() #define UNITY_OUTPUT_FLUSH() RS232_flush()
@@ -256,10 +269,7 @@ Say you are forced to run your test suite on an embedded processor with no
_Note:_ _Note:_
`UNITY_OUTPUT_FLUSH()` can be set to the standard out flush function simply by `UNITY_OUTPUT_FLUSH()` can be set to the standard out flush function simply by
specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required. If you specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required.
specify a custom flush function instead with `UNITY_OUTPUT_FLUSH` directly, it
will declare an instance of your function by default. If you want to disable
this behavior, add `UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION`.
##### `UNITY_WEAK_ATTRIBUTE` ##### `UNITY_WEAK_ATTRIBUTE`
+6 -5
View File
@@ -11,7 +11,7 @@ functional. The core Unity test framework is three files: a single C file and a
couple header files. These team up to provide functions and macros to make couple header files. These team up to provide functions and macros to make
testing easier. testing easier.
Unity was designed to be cross platform. It works hard to stick with C standards Unity was designed to be cross-platform. It works hard to stick with C standards
while still providing support for the many embedded C compilers that bend the while still providing support for the many embedded C compilers that bend the
rules. Unity has been used with many compilers, including GCC, IAR, Clang, rules. Unity has been used with many compilers, including GCC, IAR, Clang,
Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to
@@ -100,10 +100,11 @@ find setUp or tearDown when it links, you'll know you need to at least include
an empty function for these. an empty function for these.
The majority of the file will be a series of test functions. Test functions The majority of the file will be a series of test functions. Test functions
follow the convention of starting with the word "test" or "spec". You don't HAVE follow the convention of starting with the word "test_" or "spec_". You don't HAVE
to name them this way, but it makes it clear what functions are tests for other to name them this way, but it makes it clear what functions are tests for other
developers. Test functions take no arguments and return nothing. All test developers. Also, the automated scripts that come with Unity or Ceedling will default
accounting is handled internally in Unity. to looking for test functions to be prefixed this way. Test functions take no arguments
and return nothing. All test accounting is handled internally in Unity.
Finally, at the bottom of your test file, you will write a `main()` function. Finally, at the bottom of your test file, you will write a `main()` function.
This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and
@@ -148,7 +149,7 @@ int main(void) {
} }
``` ```
It's possible that you will require more customization than this, eventually. It's possible that you will need more customization than this, eventually.
For that sort of thing, you're going to want to look at the configuration guide. For that sort of thing, you're going to want to look at the configuration guide.
This should be enough to get you going, though. This should be enough to get you going, though.
+14 -2
View File
@@ -3,7 +3,7 @@
## With a Little Help From Our Friends ## With a Little Help From Our Friends
Sometimes what it takes to be a really efficient C programmer is a little non-C. Sometimes what it takes to be a really efficient C programmer is a little non-C.
The Unity project includes a couple Ruby scripts for making your life just a tad The Unity project includes a couple of Ruby scripts for making your life just a tad
easier. They are completely optional. If you choose to use them, you'll need a easier. They are completely optional. If you choose to use them, you'll need a
copy of Ruby, of course. Just install whatever the latest version is, and it is copy of Ruby, of course. Just install whatever the latest version is, and it is
likely to work. You can find Ruby at [ruby-lang.org](https://ruby-labg.org/). likely to work. You can find Ruby at [ruby-lang.org](https://ruby-labg.org/).
@@ -105,7 +105,7 @@ UnityTestRunnerGenerator.new.run(testfile, runner_name, options)
If you have multiple files to generate in a build script (such as a Rakefile), If you have multiple files to generate in a build script (such as a Rakefile),
you might want to instantiate a generator object with your options and call it you might want to instantiate a generator object with your options and call it
to generate each runner thereafter. Like thus: to generate each runner afterwards. Like thus:
```Ruby ```Ruby
gen = UnityTestRunnerGenerator.new(options) gen = UnityTestRunnerGenerator.new(options)
@@ -160,6 +160,18 @@ everything to run smoothly. If you provide the same YAML to the generator as
used in CMock's configuration, you've already configured the generator properly. used in CMock's configuration, you've already configured the generator properly.
##### `:externc`
This option should be defined if you are mixing C and CPP and want your test
runners to automatically include extern "C" support when they are generated.
##### `:mock_prefix` and `:mock_suffix`
Unity automatically generates calls to Init, Verify and Destroy for every file
included in the main test file that starts with the given mock prefix and ends
with the given mock suffix, file extension not included. By default, Unity
assumes a `Mock` prefix and no suffix.
##### `:plugins` ##### `:plugins`
This option specifies an array of plugins to be used (of course, the array can This option specifies an array of plugins to be used (of course, the array can
+4 -4
View File
@@ -4,14 +4,14 @@
int Counter = 0; int Counter = 0;
int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; /* some obnoxious array to search that is 1-based indexing instead of 0. */ int NumbersToFind[9] = { 0, 34, 55, 66, 32, 11, 1, 77, 888 }; /* some obnoxious array to search that is 1-based indexing instead of 0. */
/* This function is supposed to search through NumbersToFind and find a particular number. /* This function is supposed to search through NumbersToFind and find a particular number.
* If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since * If it finds it, the index is returned. Otherwise 0 is returned which sorta makes sense since
* NumbersToFind is indexed from 1. Unfortunately it's broken * NumbersToFind is indexed from 1. Unfortunately it's broken
* (and should therefore be caught by our tests) */ * (and should therefore be caught by our tests) */
int FindFunction_WhichIsBroken(int NumberToFind) int FindFunction_WhichIsBroken(int NumberToFind)
{ {
int i = 0; int i = 0;
while (i <= 8) /* Notice I should have been in braces */ while (i < 8) /* Notice I should have been in braces */
i++; i++;
if (NumbersToFind[i] == NumberToFind) /* Yikes! I'm getting run after the loop finishes instead of during it! */ if (NumbersToFind[i] == NumberToFind) /* Yikes! I'm getting run after the loop finishes instead of during it! */
return i; return i;
+4 -7
View File
@@ -1,12 +1,9 @@
HERE = File.expand_path(File.dirname(__FILE__)) + '/'
UNITY_ROOT = File.expand_path(File.dirname(__FILE__)) + '/../..'
require 'rake' require 'rake'
require 'rake/clean' require 'rake/clean'
require HERE + 'rakefile_helper' require_relative 'rakefile_helper'
TEMP_DIRS = [ TEMP_DIRS = [
File.join(HERE, 'build') File.join(__dir__, 'build')
].freeze ].freeze
TEMP_DIRS.each do |dir| TEMP_DIRS.each do |dir|
@@ -32,8 +29,8 @@ task :summary do
end end
desc 'Build and test Unity' desc 'Build and test Unity'
task all: %i(clean unit summary) task all: %i[clean unit summary]
task default: %i(clobber all) task default: %i[clobber all]
task ci: [:default] task ci: [:default]
task cruise: [:default] task cruise: [:default]
+4 -4
View File
@@ -1,8 +1,8 @@
require 'yaml' require 'yaml'
require 'fileutils' require 'fileutils'
require UNITY_ROOT + '/auto/unity_test_summary' require_relative '../../auto/unity_test_summary'
require UNITY_ROOT + '/auto/generate_test_runner' require_relative '../../auto/generate_test_runner'
require UNITY_ROOT + '/auto/colour_reporter' require_relative '../../auto/colour_reporter'
module RakefileHelpers module RakefileHelpers
C_EXTENSION = '.c'.freeze C_EXTENSION = '.c'.freeze
@@ -149,7 +149,7 @@ module RakefileHelpers
def report_summary def report_summary
summary = UnityTestSummary.new summary = UnityTestSummary.new
summary.root = HERE summary.root = __dir__
results_glob = "#{$cfg['compiler']['build_path']}*.test*" results_glob = "#{$cfg['compiler']['build_path']}*.test*"
results_glob.tr!('\\', '/') results_glob.tr!('\\', '/')
results = Dir[results_glob] results = Dir[results_glob]
+8
View File
@@ -236,4 +236,12 @@
/* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ /* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */
/* #define UNITY_PTR_ATTRIBUTE near */ /* #define UNITY_PTR_ATTRIBUTE near */
/* Print execution time of each test when executed in verbose mode
*
* Example:
*
* TEST - PASS (10 ms)
*/
/* #define UNITY_INCLUDE_EXEC_TIME */
#endif /* UNITY_CONFIG_H */ #endif /* UNITY_CONFIG_H */
+6 -8
View File
@@ -4,15 +4,13 @@
# [Released under MIT License. Please refer to license.txt for details] # [Released under MIT License. Please refer to license.txt for details]
# ========================================== # ==========================================
HERE = File.expand_path(File.dirname(__FILE__)) + '/'
require 'rake' require 'rake'
require 'rake/clean' require 'rake/clean'
require 'rake/testtask' require 'rake/testtask'
require HERE + 'rakefile_helper' require_relative 'rakefile_helper'
TEMP_DIRS = [ TEMP_DIRS = [
File.join(HERE, 'build') File.join(__dir__, 'build')
].freeze ].freeze
TEMP_DIRS.each do |dir| TEMP_DIRS.each do |dir|
@@ -33,10 +31,10 @@ task unit: [:prepare_for_tests] do
end end
desc 'Build and test Unity Framework' desc 'Build and test Unity Framework'
task all: %i(clean unit) task all: %i[clean unit]
task default: %i(clobber all) task default: %i[clobber all]
task ci: %i(no_color default) task ci: %i[no_color default]
task cruise: %i(no_color default) task cruise: %i[no_color default]
desc 'Load configuration' desc 'Load configuration'
task :config, :config_file do |_t, args| task :config, :config_file do |_t, args|
+8 -8
View File
@@ -6,9 +6,9 @@
require 'yaml' require 'yaml'
require 'fileutils' require 'fileutils'
require HERE + '../../auto/unity_test_summary' require_relative '../../auto/unity_test_summary'
require HERE + '../../auto/generate_test_runner' require_relative '../../auto/generate_test_runner'
require HERE + '../../auto/colour_reporter' require_relative '../../auto/colour_reporter'
module RakefileHelpers module RakefileHelpers
C_EXTENSION = '.c'.freeze C_EXTENSION = '.c'.freeze
@@ -16,7 +16,7 @@ module RakefileHelpers
def load_configuration(config_file) def load_configuration(config_file)
return if $configured return if $configured
$cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/ $cfg_file = "#{__dir__}/../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/
$cfg = YAML.load(File.read($cfg_file)) $cfg = YAML.load(File.read($cfg_file))
$colour_output = false unless $cfg['colour'] $colour_output = false unless $cfg['colour']
$configured = true if config_file != DEFAULT_CONFIG_FILE $configured = true if config_file != DEFAULT_CONFIG_FILE
@@ -128,7 +128,7 @@ module RakefileHelpers
def report_summary def report_summary
summary = UnityTestSummary.new summary = UnityTestSummary.new
summary.root = HERE summary.root = __dir__
results_glob = "#{$cfg['compiler']['build_path']}*.test*" results_glob = "#{$cfg['compiler']['build_path']}*.test*"
results_glob.tr!('\\', '/') results_glob.tr!('\\', '/')
results = Dir[results_glob] results = Dir[results_glob]
@@ -145,9 +145,9 @@ module RakefileHelpers
$cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil?
# Get a list of all source files needed # Get a list of all source files needed
src_files = Dir[HERE + 'src/*.c'] src_files = Dir["#{__dir__}/src/*.c"]
src_files += Dir[HERE + 'test/*.c'] src_files += Dir["#{__dir__}/test/*.c"]
src_files += Dir[HERE + 'test/main/*.c'] src_files += Dir["#{__dir__}/test/main/*.c"]
src_files << '../../src/unity.c' src_files << '../../src/unity.c'
# Build object files # Build object files
+4
View File
@@ -93,6 +93,8 @@ void UnityTestRunner(unityfunction* setup,
UnityMalloc_StartTest(); UnityMalloc_StartTest();
UnityPointer_Init(); UnityPointer_Init();
UNITY_EXEC_TIME_START();
if (TEST_PROTECT()) if (TEST_PROTECT())
{ {
setup(); setup();
@@ -418,6 +420,8 @@ void UnityConcludeFixtureTest(void)
if (UnityFixture.Verbose) if (UnityFixture.Verbose)
{ {
UnityPrint(" PASS"); UnityPrint(" PASS");
UNITY_EXEC_TIME_STOP();
UNITY_PRINT_EXEC_TIME();
UNITY_PRINT_EOL(); UNITY_PRINT_EOL();
} }
} }
+1 -1
View File
@@ -78,6 +78,6 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void));
#endif #endif
/* You must compile with malloc replacement, as defined in unity_fixture_malloc_overrides.h */ /* You must compile with malloc replacement, as defined in unity_fixture_malloc_overrides.h */
void UnityMalloc_MakeMallocFailAfterCount(int count); void UnityMalloc_MakeMallocFailAfterCount(int countdown);
#endif /* UNITY_FIXTURE_H_ */ #endif /* UNITY_FIXTURE_H_ */
+2 -2
View File
@@ -24,7 +24,7 @@ extern struct UNITY_FIXTURE_T UnityFixture;
typedef void unityfunction(void); typedef void unityfunction(void);
void UnityTestRunner(unityfunction* setup, void UnityTestRunner(unityfunction* setup,
unityfunction* body, unityfunction* testBody,
unityfunction* teardown, unityfunction* teardown,
const char* printableName, const char* printableName,
const char* group, const char* group,
@@ -37,7 +37,7 @@ void UnityMalloc_EndTest(void);
int UnityGetCommandLineOptions(int argc, const char* argv[]); int UnityGetCommandLineOptions(int argc, const char* argv[]);
void UnityConcludeFixtureTest(void); void UnityConcludeFixtureTest(void);
void UnityPointer_Set(void** ptr, void* newValue, UNITY_LINE_TYPE line); void UnityPointer_Set(void** pointer, void* newValue, UNITY_LINE_TYPE line);
void UnityPointer_UndoAllSets(void); void UnityPointer_UndoAllSets(void);
void UnityPointer_Init(void); void UnityPointer_Init(void);
#ifndef UNITY_MAX_POINTERS #ifndef UNITY_MAX_POINTERS
+1 -1
View File
@@ -1,2 +1,2 @@
121 122
+1 -1
View File
@@ -1,2 +1,2 @@
2.4.2 2.4.3
+117 -22
View File
@@ -14,8 +14,8 @@ void UNITY_OUTPUT_CHAR(int);
#endif #endif
/* Helpful macros for us to use here in Assert functions */ /* Helpful macros for us to use here in Assert functions */
#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; TEST_ABORT(); } #define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); }
#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; TEST_ABORT(); } #define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); }
#define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return #define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return
struct UNITY_STORAGE_T Unity; struct UNITY_STORAGE_T Unity;
@@ -67,6 +67,7 @@ static const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " ";
* Pretty Printers & Test Result Output Handlers * Pretty Printers & Test Result Output Handlers
*-----------------------------------------------*/ *-----------------------------------------------*/
/*-----------------------------------------------*/
void UnityPrint(const char* string) void UnityPrint(const char* string)
{ {
const char* pch = string; const char* pch = string;
@@ -116,6 +117,7 @@ void UnityPrint(const char* string)
} }
} }
/*-----------------------------------------------*/
void UnityPrintLen(const char* string, const UNITY_UINT32 length) void UnityPrintLen(const char* string, const UNITY_UINT32 length)
{ {
const char* pch = string; const char* pch = string;
@@ -212,7 +214,9 @@ void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print)
int nibble; int nibble;
char nibbles = nibbles_to_print; char nibbles = nibbles_to_print;
if ((unsigned)nibbles > (2 * sizeof(number))) if ((unsigned)nibbles > (2 * sizeof(number)))
{
nibbles = 2 * sizeof(number); nibbles = 2 * sizeof(number);
}
while (nibbles > 0) while (nibbles > 0)
{ {
@@ -287,15 +291,24 @@ void UnityPrintFloat(const UNITY_DOUBLE input_number)
} }
/* handle zero, NaN, and +/- infinity */ /* handle zero, NaN, and +/- infinity */
if (number == 0.0f) UnityPrint("0"); if (number == 0.0f)
else if (isnan(number)) UnityPrint("nan"); {
else if (isinf(number)) UnityPrint("inf"); UnityPrint("0");
}
else if (isnan(number))
{
UnityPrint("nan");
}
else if (isinf(number))
{
UnityPrint("inf");
}
else else
{ {
UNITY_INT32 n_int = 0, n; UNITY_INT32 n_int = 0, n;
int exponent = 0; int exponent = 0;
int decimals, digits; int decimals, digits;
char buf[16]; char buf[16] = {0};
/* /*
* Scale up or down by powers of 10. To minimize rounding error, * Scale up or down by powers of 10. To minimize rounding error,
@@ -447,6 +460,7 @@ void UnityConcludeTest(void)
Unity.CurrentTestFailed = 0; Unity.CurrentTestFailed = 0;
Unity.CurrentTestIgnored = 0; Unity.CurrentTestIgnored = 0;
UNITY_EXEC_TIME_RESET();
UNITY_PRINT_EOL(); UNITY_PRINT_EOL();
UNITY_FLUSH_CALL(); UNITY_FLUSH_CALL();
} }
@@ -534,6 +548,7 @@ static void UnityPrintExpectedAndActualStringsLen(const char* expected,
* Assertion & Control Helpers * Assertion & Control Helpers
*-----------------------------------------------*/ *-----------------------------------------------*/
/*-----------------------------------------------*/
static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected,
UNITY_INTERNAL_PTR actual, UNITY_INTERNAL_PTR actual,
const UNITY_LINE_TYPE lineNumber, const UNITY_LINE_TYPE lineNumber,
@@ -566,6 +581,7 @@ static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected,
* Assertion Functions * Assertion Functions
*-----------------------------------------------*/ *-----------------------------------------------*/
/*-----------------------------------------------*/
void UnityAssertBits(const UNITY_INT mask, void UnityAssertBits(const UNITY_INT mask,
const UNITY_INT expected, const UNITY_INT expected,
const UNITY_INT actual, const UNITY_INT actual,
@@ -672,11 +688,17 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (expected == actual) return; /* Both are NULL or same pointer */ if (expected == actual)
if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) {
UNITY_FAIL_AND_BAIL; return; /* Both are NULL or same pointer */
}
while (elements--) if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
{
UNITY_FAIL_AND_BAIL;
}
while ((elements > 0) && elements--)
{ {
UNITY_INT expect_val; UNITY_INT expect_val;
UNITY_INT actual_val; UNITY_INT actual_val;
@@ -733,13 +755,13 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
/*-----------------------------------------------*/ /*-----------------------------------------------*/
#ifndef UNITY_EXCLUDE_FLOAT #ifndef UNITY_EXCLUDE_FLOAT
/* Wrap this define in a function with variable types as float or double */ /* Wrap this define in a function with variable types as float or double */
#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ #define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \
if (isinf(expected) && isinf(actual) && ((expected < 0) == (actual < 0))) return 1; \ if (isinf(expected) && isinf(actual) && (((expected) < 0) == ((actual) < 0))) return 1; \
if (UNITY_NAN_CHECK) return 1; \ if (UNITY_NAN_CHECK) return 1; \
diff = actual - expected; \ (diff) = (actual) - (expected); \
if (diff < 0) diff = -diff; \ if ((diff) < 0) (diff) = -(diff); \
if (delta < 0) delta = -delta; \ if ((delta) < 0) (delta) = -(delta); \
return !(isnan(diff) || isinf(diff) || (diff > delta)) return !(isnan(diff) || isinf(diff) || ((diff) > (delta)))
/* This first part of this condition will catch any NaN or Infinite values */ /* This first part of this condition will catch any NaN or Infinite values */
#ifndef UNITY_NAN_NOT_EQUAL_NAN #ifndef UNITY_NAN_NOT_EQUAL_NAN
#define UNITY_NAN_CHECK isnan(expected) && isnan(actual) #define UNITY_NAN_CHECK isnan(expected) && isnan(actual)
@@ -759,12 +781,14 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
UnityPrint(UnityStrDelta) UnityPrint(UnityStrDelta)
#endif /* UNITY_EXCLUDE_FLOAT_PRINT */ #endif /* UNITY_EXCLUDE_FLOAT_PRINT */
/*-----------------------------------------------*/
static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual)
{ {
UNITY_FLOAT diff; UNITY_FLOAT diff;
UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff);
} }
/*-----------------------------------------------*/
void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected,
UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual,
const UNITY_UINT32 num_elements, const UNITY_UINT32 num_elements,
@@ -783,9 +807,15 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected,
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (expected == actual) return; /* Both are NULL or same pointer */ if (expected == actual)
{
return; /* Both are NULL or same pointer */
}
if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
{
UNITY_FAIL_AND_BAIL; UNITY_FAIL_AND_BAIL;
}
while (elements--) while (elements--)
{ {
@@ -870,14 +900,18 @@ void UnityAssertFloatSpecial(const UNITY_FLOAT actual,
UnityTestResultsFailBegin(lineNumber); UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrExpected); UnityPrint(UnityStrExpected);
if (!should_be_trait) if (!should_be_trait)
{
UnityPrint(UnityStrNot); UnityPrint(UnityStrNot);
}
UnityPrint(trait_names[trait_index]); UnityPrint(trait_names[trait_index]);
UnityPrint(UnityStrWas); UnityPrint(UnityStrWas);
#ifndef UNITY_EXCLUDE_FLOAT_PRINT #ifndef UNITY_EXCLUDE_FLOAT_PRINT
UnityPrintFloat((UNITY_DOUBLE)actual); UnityPrintFloat((UNITY_DOUBLE)actual);
#else #else
if (should_be_trait) if (should_be_trait)
{
UnityPrint(UnityStrNot); UnityPrint(UnityStrNot);
}
UnityPrint(trait_names[trait_index]); UnityPrint(trait_names[trait_index]);
#endif #endif
UnityAddMsgIfSpecified(msg); UnityAddMsgIfSpecified(msg);
@@ -895,6 +929,7 @@ static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_D
UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff);
} }
/*-----------------------------------------------*/
void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected,
UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual,
const UNITY_UINT32 num_elements, const UNITY_UINT32 num_elements,
@@ -913,9 +948,15 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (expected == actual) return; /* Both are NULL or same pointer */ if (expected == actual)
{
return; /* Both are NULL or same pointer */
}
if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
{
UNITY_FAIL_AND_BAIL; UNITY_FAIL_AND_BAIL;
}
while (elements--) while (elements--)
{ {
@@ -955,7 +996,6 @@ void UnityAssertDoublesWithin(const UNITY_DOUBLE delta,
} }
/*-----------------------------------------------*/ /*-----------------------------------------------*/
void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual,
const char* msg, const char* msg,
const UNITY_LINE_TYPE lineNumber, const UNITY_LINE_TYPE lineNumber,
@@ -1000,14 +1040,18 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual,
UnityTestResultsFailBegin(lineNumber); UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrExpected); UnityPrint(UnityStrExpected);
if (!should_be_trait) if (!should_be_trait)
{
UnityPrint(UnityStrNot); UnityPrint(UnityStrNot);
}
UnityPrint(trait_names[trait_index]); UnityPrint(trait_names[trait_index]);
UnityPrint(UnityStrWas); UnityPrint(UnityStrWas);
#ifndef UNITY_EXCLUDE_FLOAT_PRINT #ifndef UNITY_EXCLUDE_FLOAT_PRINT
UnityPrintFloat(actual); UnityPrintFloat(actual);
#else #else
if (should_be_trait) if (should_be_trait)
{
UnityPrint(UnityStrNot); UnityPrint(UnityStrNot);
}
UnityPrint(trait_names[trait_index]); UnityPrint(trait_names[trait_index]);
#endif #endif
UnityAddMsgIfSpecified(msg); UnityAddMsgIfSpecified(msg);
@@ -1030,16 +1074,24 @@ void UnityAssertNumbersWithin(const UNITY_UINT delta,
if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
{ {
if (actual > expected) if (actual > expected)
Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); {
Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta);
}
else else
{
Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta);
}
} }
else else
{ {
if ((UNITY_UINT)actual > (UNITY_UINT)expected) if ((UNITY_UINT)actual > (UNITY_UINT)expected)
{
Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta);
}
else else
{
Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta);
}
} }
if (Unity.CurrentTestFailed) if (Unity.CurrentTestFailed)
@@ -1235,9 +1287,15 @@ void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected,
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (expected == actual) return; /* Both are NULL or same pointer */ if (expected == actual)
{
return; /* Both are NULL or same pointer */
}
if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
{
UNITY_FAIL_AND_BAIL; UNITY_FAIL_AND_BAIL;
}
while (elements--) while (elements--)
{ {
@@ -1314,6 +1372,7 @@ UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size)
} }
#ifndef UNITY_EXCLUDE_FLOAT #ifndef UNITY_EXCLUDE_FLOAT
/*-----------------------------------------------*/
UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) UNITY_INTERNAL_PTR UnityFloatToPtr(const float num)
{ {
UnityQuickCompare.f = num; UnityQuickCompare.f = num;
@@ -1322,6 +1381,7 @@ UNITY_INTERNAL_PTR UnityFloatToPtr(const float num)
#endif #endif
#ifndef UNITY_EXCLUDE_DOUBLE #ifndef UNITY_EXCLUDE_DOUBLE
/*-----------------------------------------------*/
UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num)
{ {
UnityQuickCompare.d = num; UnityQuickCompare.d = num;
@@ -1333,6 +1393,7 @@ UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num)
* Control Functions * Control Functions
*-----------------------------------------------*/ *-----------------------------------------------*/
/*-----------------------------------------------*/
void UnityFail(const char* msg, const UNITY_LINE_TYPE line) void UnityFail(const char* msg, const UNITY_LINE_TYPE line)
{ {
RETURN_IF_FAIL_OR_IGNORE; RETURN_IF_FAIL_OR_IGNORE;
@@ -1412,6 +1473,7 @@ void UnityBegin(const char* filename)
Unity.TestIgnores = 0; Unity.TestIgnores = 0;
Unity.CurrentTestFailed = 0; Unity.CurrentTestFailed = 0;
Unity.CurrentTestIgnored = 0; Unity.CurrentTestIgnored = 0;
UNITY_EXEC_TIME_RESET();
UNITY_CLR_DETAILS(); UNITY_CLR_DETAILS();
UNITY_OUTPUT_START(); UNITY_OUTPUT_START();
@@ -1456,6 +1518,7 @@ char* UnityOptionIncludeNamed = NULL;
char* UnityOptionExcludeNamed = NULL; char* UnityOptionExcludeNamed = NULL;
int UnityVerbosity = 1; int UnityVerbosity = 1;
/*-----------------------------------------------*/
int UnityParseOptions(int argc, char** argv) int UnityParseOptions(int argc, char** argv)
{ {
UnityOptionIncludeNamed = NULL; UnityOptionIncludeNamed = NULL;
@@ -1472,9 +1535,13 @@ int UnityParseOptions(int argc, char** argv)
case 'n': /* include tests with name including this string */ case 'n': /* include tests with name including this string */
case 'f': /* an alias for -n */ case 'f': /* an alias for -n */
if (argv[i][2] == '=') if (argv[i][2] == '=')
{
UnityOptionIncludeNamed = &argv[i][3]; UnityOptionIncludeNamed = &argv[i][3];
}
else if (++i < argc) else if (++i < argc)
{
UnityOptionIncludeNamed = argv[i]; UnityOptionIncludeNamed = argv[i];
}
else else
{ {
UnityPrint("ERROR: No Test String to Include Matches For"); UnityPrint("ERROR: No Test String to Include Matches For");
@@ -1490,9 +1557,13 @@ int UnityParseOptions(int argc, char** argv)
break; break;
case 'x': /* exclude tests with name including this string */ case 'x': /* exclude tests with name including this string */
if (argv[i][2] == '=') if (argv[i][2] == '=')
{
UnityOptionExcludeNamed = &argv[i][3]; UnityOptionExcludeNamed = &argv[i][3];
}
else if (++i < argc) else if (++i < argc)
{
UnityOptionExcludeNamed = argv[i]; UnityOptionExcludeNamed = argv[i];
}
else else
{ {
UnityPrint("ERROR: No Test String to Exclude Matches For"); UnityPrint("ERROR: No Test String to Exclude Matches For");
@@ -1512,6 +1583,7 @@ int UnityParseOptions(int argc, char** argv)
return 0; return 0;
} }
/*-----------------------------------------------*/
int IsStringInBiggerString(const char* longstring, const char* shortstring) int IsStringInBiggerString(const char* longstring, const char* shortstring)
{ {
const char* lptr = longstring; const char* lptr = longstring;
@@ -1519,7 +1591,9 @@ int IsStringInBiggerString(const char* longstring, const char* shortstring)
const char* lnext = lptr; const char* lnext = lptr;
if (*sptr == '*') if (*sptr == '*')
{
return 1; return 1;
}
while (*lptr) while (*lptr)
{ {
@@ -1550,9 +1624,11 @@ int IsStringInBiggerString(const char* longstring, const char* shortstring)
lptr = lnext; lptr = lnext;
sptr = shortstring; sptr = shortstring;
} }
return 0; return 0;
} }
/*-----------------------------------------------*/
int UnityStringArgumentMatches(const char* str) int UnityStringArgumentMatches(const char* str)
{ {
int retval; int retval;
@@ -1565,7 +1641,9 @@ int UnityStringArgumentMatches(const char* str)
while (ptr1[0] != 0) while (ptr1[0] != 0)
{ {
if ((ptr1[0] == '"') || (ptr1[0] == '\'')) if ((ptr1[0] == '"') || (ptr1[0] == '\''))
{
ptr1++; ptr1++;
}
/* look for the start of the next partial */ /* look for the start of the next partial */
ptr2 = ptr1; ptr2 = ptr1;
@@ -1574,26 +1652,37 @@ int UnityStringArgumentMatches(const char* str)
{ {
ptr2++; ptr2++;
if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ','))
{
ptrf = &ptr2[1]; ptrf = &ptr2[1];
}
} while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')); } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ','));
while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ','))) while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ',')))
{
ptr2++; ptr2++;
}
/* done if complete filename match */ /* done if complete filename match */
retval = IsStringInBiggerString(Unity.TestFile, ptr1); retval = IsStringInBiggerString(Unity.TestFile, ptr1);
if (retval == 1) if (retval == 1)
{
return retval; return retval;
}
/* done if testname match after filename partial match */ /* done if testname match after filename partial match */
if ((retval == 2) && (ptrf != 0)) if ((retval == 2) && (ptrf != 0))
{ {
if (IsStringInBiggerString(Unity.CurrentTestName, ptrf)) if (IsStringInBiggerString(Unity.CurrentTestName, ptrf))
{
return 1; return 1;
}
} }
/* done if complete testname match */ /* done if complete testname match */
if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1) if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1)
{
return 1; return 1;
}
ptr1 = ptr2; ptr1 = ptr2;
} }
@@ -1602,6 +1691,7 @@ int UnityStringArgumentMatches(const char* str)
return 0; return 0;
} }
/*-----------------------------------------------*/
int UnityTestMatches(void) int UnityTestMatches(void)
{ {
/* Check if this test name matches the included test pattern */ /* Check if this test name matches the included test pattern */
@@ -1611,14 +1701,19 @@ int UnityTestMatches(void)
retval = UnityStringArgumentMatches(UnityOptionIncludeNamed); retval = UnityStringArgumentMatches(UnityOptionIncludeNamed);
} }
else else
{
retval = 1; retval = 1;
}
/* Check if this test name matches the excluded test pattern */ /* Check if this test name matches the excluded test pattern */
if (UnityOptionExcludeNamed) if (UnityOptionExcludeNamed)
{ {
if (UnityStringArgumentMatches(UnityOptionExcludeNamed)) if (UnityStringArgumentMatches(UnityOptionExcludeNamed))
{
retval = 0; retval = 0;
}
} }
return retval; return retval;
} }
+2 -2
View File
@@ -402,8 +402,8 @@ int suiteTearDown(int num_failures);
#define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message))
#define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message))
#define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message))
#define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message))
#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message))
/* Integer Ranges (of all sizes) */ /* Integer Ranges (of all sizes) */
#define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message)) #define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message))
+100 -42
View File
@@ -19,6 +19,10 @@
#include <math.h> #include <math.h>
#endif #endif
#ifndef UNITY_EXCLUDE_STDDEF_H
#include <stddef.h>
#endif
/* Unity Attempts to Auto-Detect Integer Types /* Unity Attempts to Auto-Detect Integer Types
* Attempt 1: UINT_MAX, ULONG_MAX in <limits.h>, or default to 32 bits * Attempt 1: UINT_MAX, ULONG_MAX in <limits.h>, or default to 32 bits
* Attempt 2: UINTPTR_MAX in <stdint.h>, or default to same size as long * Attempt 2: UINTPTR_MAX in <stdint.h>, or default to same size as long
@@ -32,6 +36,10 @@
#include <limits.h> #include <limits.h>
#endif #endif
#ifndef UNITY_EXCLUDE_TIME_H
#include <time.h>
#endif
/*------------------------------------------------------- /*-------------------------------------------------------
* Guess Widths If Not Specified * Guess Widths If Not Specified
*-------------------------------------------------------*/ *-------------------------------------------------------*/
@@ -241,30 +249,30 @@ typedef UNITY_FLOAT_TYPE UNITY_FLOAT;
* Output Method: stdout (DEFAULT) * Output Method: stdout (DEFAULT)
*-------------------------------------------------------*/ *-------------------------------------------------------*/
#ifndef UNITY_OUTPUT_CHAR #ifndef UNITY_OUTPUT_CHAR
/* Default to using putchar, which is defined in stdio.h */ /* Default to using putchar, which is defined in stdio.h */
#include <stdio.h> #include <stdio.h>
#define UNITY_OUTPUT_CHAR(a) (void)putchar(a) #define UNITY_OUTPUT_CHAR(a) (void)putchar(a)
#else #else
/* If defined as something else, make sure we declare it here so it's ready for use */ /* If defined as something else, make sure we declare it here so it's ready for use */
#ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION #ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION
extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION;
#endif #endif
#endif #endif
#ifndef UNITY_OUTPUT_FLUSH #ifndef UNITY_OUTPUT_FLUSH
#ifdef UNITY_USE_FLUSH_STDOUT #ifdef UNITY_USE_FLUSH_STDOUT
/* We want to use the stdout flush utility */ /* We want to use the stdout flush utility */
#include <stdio.h> #include <stdio.h>
#define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) #define UNITY_OUTPUT_FLUSH() (void)fflush(stdout)
#else
/* We've specified nothing, therefore flush should just be ignored */
#define UNITY_OUTPUT_FLUSH()
#endif
#else #else
/* We've specified nothing, therefore flush should just be ignored */ /* If defined as something else, make sure we declare it here so it's ready for use */
#define UNITY_OUTPUT_FLUSH() #ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION
#endif extern void UNITY_OUTPUT_FLUSH_HEADER_DECLARATION;
#else #endif
/* We've defined flush as something else, so make sure we declare it here so it's ready for use */
#ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION
extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION;
#endif
#endif #endif
#ifndef UNITY_OUTPUT_FLUSH #ifndef UNITY_OUTPUT_FLUSH
@@ -285,6 +293,44 @@ extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION;
#define UNITY_OUTPUT_COMPLETE() #define UNITY_OUTPUT_COMPLETE()
#endif #endif
#ifndef UNITY_EXEC_TIME_RESET
#ifdef UNITY_INCLUDE_EXEC_TIME
#define UNITY_EXEC_TIME_RESET()\
Unity.CurrentTestStartTime = 0;\
Unity.CurrentTestStopTime = 0;
#else
#define UNITY_EXEC_TIME_RESET()
#endif
#endif
#ifndef UNITY_EXEC_TIME_START
#ifdef UNITY_INCLUDE_EXEC_TIME
#define UNITY_EXEC_TIME_START() Unity.CurrentTestStartTime = UNITY_CLOCK_MS();
#else
#define UNITY_EXEC_TIME_START()
#endif
#endif
#ifndef UNITY_EXEC_TIME_STOP
#ifdef UNITY_INCLUDE_EXEC_TIME
#define UNITY_EXEC_TIME_STOP() Unity.CurrentTestStopTime = UNITY_CLOCK_MS();
#else
#define UNITY_EXEC_TIME_STOP()
#endif
#endif
#ifndef UNITY_PRINT_EXEC_TIME
#ifdef UNITY_INCLUDE_EXEC_TIME
#define UNITY_PRINT_EXEC_TIME() \
UnityPrint(" (");\
UNITY_COUNTER_TYPE execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime);\
UnityPrintNumberUnsigned(execTimeMs);\
UnityPrint(" ms)");
#else
#define UNITY_PRINT_EXEC_TIME()
#endif
#endif
/*------------------------------------------------------- /*-------------------------------------------------------
* Footprint * Footprint
*-------------------------------------------------------*/ *-------------------------------------------------------*/
@@ -313,7 +359,6 @@ extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION;
# undef UNITY_WEAK_PRAGMA # undef UNITY_WEAK_PRAGMA
#endif #endif
/*------------------------------------------------------- /*-------------------------------------------------------
* Internal Structs Needed * Internal Structs Needed
*-------------------------------------------------------*/ *-------------------------------------------------------*/
@@ -354,11 +399,13 @@ UNITY_DISPLAY_STYLE_UINT = sizeof(unsigned) + UNITY_DISPLAY_RANGE_UINT,
typedef enum typedef enum
{ {
UNITY_WITHIN = 0,
UNITY_EQUAL_TO = 1, UNITY_EQUAL_TO = 1,
UNITY_GREATER_THAN = 2, UNITY_GREATER_THAN = 2,
UNITY_GREATER_OR_EQUAL = 2 + UNITY_EQUAL_TO, UNITY_GREATER_OR_EQUAL = 2 + UNITY_EQUAL_TO,
UNITY_SMALLER_THAN = 4, UNITY_SMALLER_THAN = 4,
UNITY_SMALLER_OR_EQUAL = 4 + UNITY_EQUAL_TO UNITY_SMALLER_OR_EQUAL = 4 + UNITY_EQUAL_TO,
UNITY_UNKNOWN
} UNITY_COMPARISON_T; } UNITY_COMPARISON_T;
#ifndef UNITY_EXCLUDE_FLOAT #ifndef UNITY_EXCLUDE_FLOAT
@@ -379,7 +426,8 @@ typedef enum UNITY_FLOAT_TRAIT
typedef enum typedef enum
{ {
UNITY_ARRAY_TO_VAL = 0, UNITY_ARRAY_TO_VAL = 0,
UNITY_ARRAY_TO_ARRAY UNITY_ARRAY_TO_ARRAY,
UNITY_ARRAY_UNKNOWN
} UNITY_FLAGS_T; } UNITY_FLAGS_T;
struct UNITY_STORAGE_T struct UNITY_STORAGE_T
@@ -396,6 +444,10 @@ struct UNITY_STORAGE_T
UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE TestIgnores;
UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestFailed;
UNITY_COUNTER_TYPE CurrentTestIgnored; UNITY_COUNTER_TYPE CurrentTestIgnored;
#ifdef UNITY_INCLUDE_EXEC_TIME
UNITY_COUNTER_TYPE CurrentTestStartTime;
UNITY_COUNTER_TYPE CurrentTestStopTime;
#endif
#ifndef UNITY_EXCLUDE_SETJMP_H #ifndef UNITY_EXCLUDE_SETJMP_H
jmp_buf AbortFrame; jmp_buf AbortFrame;
#endif #endif
@@ -422,8 +474,8 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int
#define UNITY_SET_DETAILS(d1,d2) #define UNITY_SET_DETAILS(d1,d2)
#else #else
#define UNITY_CLR_DETAILS() { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } #define UNITY_CLR_DETAILS() { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; }
#define UNITY_SET_DETAIL(d1) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = 0; } #define UNITY_SET_DETAIL(d1) { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = 0; }
#define UNITY_SET_DETAILS(d1,d2) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = d2; } #define UNITY_SET_DETAILS(d1,d2) { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = (d2); }
#ifndef UNITY_DETAIL1_NAME #ifndef UNITY_DETAIL1_NAME
#define UNITY_DETAIL1_NAME "Function" #define UNITY_DETAIL1_NAME "Function"
@@ -442,9 +494,9 @@ void UnityPrint(const char* string);
void UnityPrintLen(const char* string, const UNITY_UINT32 length); void UnityPrintLen(const char* string, const UNITY_UINT32 length);
void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number); void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number);
void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style); void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style);
void UnityPrintNumber(const UNITY_INT number); void UnityPrintNumber(const UNITY_INT number_to_print);
void UnityPrintNumberUnsigned(const UNITY_UINT number); void UnityPrintNumberUnsigned(const UNITY_UINT number);
void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles); void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print);
#ifndef UNITY_EXCLUDE_FLOAT_PRINT #ifndef UNITY_EXCLUDE_FLOAT_PRINT
void UnityPrintFloat(const UNITY_DOUBLE input_number); void UnityPrintFloat(const UNITY_DOUBLE input_number);
@@ -594,6 +646,12 @@ extern const char UnityStrErr64[];
#define TEST_ABORT() return #define TEST_ABORT() return
#endif #endif
#ifndef UNITY_EXCLUDE_TIME_H
#define UNITY_CLOCK_MS() (UNITY_COUNTER_TYPE)((clock() * 1000) / CLOCKS_PER_SEC)
#else
#define UNITY_CLOCK_MS()
#endif
/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ /* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */
#ifndef RUN_TEST #ifndef RUN_TEST
#ifdef __STDC_VERSION__ #ifdef __STDC_VERSION__
@@ -748,18 +806,18 @@ int UnityTestMatches(void);
#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY)
#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY)
#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(unsigned int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), sizeof(unsigned int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) (expected), sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL)
@@ -770,9 +828,9 @@ int UnityTestMatches(void);
#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY)
#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY)
#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY)
#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) #define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64)
#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) #define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64)
#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) #define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64)
@@ -854,10 +912,10 @@ int UnityTestMatches(void);
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble)
#else #else
#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)line) #define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line))
#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual, (UNITY_LINE_TYPE)(line), message) #define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message))
#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((UNITY_DOUBLE*)(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((UNITY_DOUBLE*)(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY)
#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray(UnityDoubleToPtr(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray(UnityDoubleToPtr(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL)
#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) #define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF)
#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) #define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF)
#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) #define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN)
+1 -1
View File
@@ -18,7 +18,7 @@ Style/HashSyntax:
EnforcedStyle: no_mixed_keys EnforcedStyle: no_mixed_keys
# This is disabled because it seems to get confused over nested hashes # This is disabled because it seems to get confused over nested hashes
Style/AlignHash: Layout/AlignHash:
Enabled: false Enabled: false
EnforcedHashRocketStyle: table EnforcedHashRocketStyle: table
EnforcedColonStyle: table EnforcedColonStyle: table
+2
View File
@@ -15,6 +15,8 @@ CFLAGS += -Wbad-function-cast -Wcast-qual -Wold-style-definition -Wshadow -Wstri
CFLAGS += $(DEBUG) CFLAGS += $(DEBUG)
DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy
DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\) DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\)
DEFINES += -D UNITY_OUTPUT_FLUSH=flushSpy
DEFINES += -D UNITY_OUTPUT_FLUSH_HEADER_DECLARATION=flushSpy\(void\)
DEFINES += $(UNITY_SUPPORT_64) $(UNITY_INCLUDE_DOUBLE) DEFINES += $(UNITY_SUPPORT_64) $(UNITY_INCLUDE_DOUBLE)
UNITY_SUPPORT_64 = -D UNITY_SUPPORT_64 UNITY_SUPPORT_64 = -D UNITY_SUPPORT_64
UNITY_INCLUDE_DOUBLE = -D UNITY_INCLUDE_DOUBLE UNITY_INCLUDE_DOUBLE = -D UNITY_INCLUDE_DOUBLE
+3 -4
View File
@@ -4,17 +4,16 @@
# [Released under MIT License. Please refer to license.txt for details] # [Released under MIT License. Please refer to license.txt for details]
# ========================================== # ==========================================
UNITY_ROOT = File.expand_path(File.dirname(__FILE__)) + '/'
$verbose = false $verbose = false
require 'rake' require 'rake'
require 'rake/clean' require 'rake/clean'
require UNITY_ROOT + 'rakefile_helper' require_relative 'rakefile_helper'
require 'rspec/core/rake_task' require 'rspec/core/rake_task'
TEMP_DIRS = [ TEMP_DIRS = [
File.join(UNITY_ROOT, 'build'), File.join(__dir__, 'build'),
File.join(UNITY_ROOT, 'sandbox') File.join(__dir__, 'sandbox')
] ]
TEMP_DIRS.each do |dir| TEMP_DIRS.each do |dir|
+4 -4
View File
@@ -6,9 +6,9 @@
require 'yaml' require 'yaml'
require 'fileutils' require 'fileutils'
require UNITY_ROOT + '../auto/unity_test_summary' require_relative '../auto/unity_test_summary'
require UNITY_ROOT + '../auto/generate_test_runner' require_relative '../auto/generate_test_runner'
require UNITY_ROOT + '../auto/colour_reporter' require_relative '../auto/colour_reporter'
module RakefileHelpers module RakefileHelpers
C_EXTENSION = '.c'.freeze C_EXTENSION = '.c'.freeze
@@ -179,7 +179,7 @@ module RakefileHelpers
def report_summary def report_summary
summary = UnityTestSummary.new summary = UnityTestSummary.new
summary.root = UNITY_ROOT summary.root = __dir__
results_glob = "#{$cfg['compiler']['build_path']}*.test*" results_glob = "#{$cfg['compiler']['build_path']}*.test*"
results_glob.tr!('\\', '/') results_glob.tr!('\\', '/')
results = Dir[results_glob] results = Dir[results_glob]
+4 -1
View File
@@ -21,7 +21,10 @@
/* Support for Meta Test Rig */ /* Support for Meta Test Rig */
#define TEST_CASE(a) #define TEST_CASE(a)
void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests
/* Include Passthroughs for Linking Tests */
void putcharSpy(int c) { (void)putchar(c);}
void flushSpy(void) {}
/* Global Variables Used During These Tests */ /* Global Variables Used During These Tests */
int CounterSetup = 0; int CounterSetup = 0;
+4 -1
View File
@@ -13,7 +13,10 @@ TEST_FILE("some_file.c")
/* Support for Meta Test Rig */ /* Support for Meta Test Rig */
#define TEST_CASE(a) #define TEST_CASE(a)
void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests
/* Include Passthroughs for Linking Tests */
void putcharSpy(int c) { (void)putchar(c);}
void flushSpy(void) {}
/* Global Variables Used During These Tests */ /* Global Variables Used During These Tests */
int CounterSetup = 0; int CounterSetup = 0;
+4 -1
View File
@@ -22,7 +22,10 @@
/* Support for Meta Test Rig */ /* Support for Meta Test Rig */
#define TEST_CASE(a) #define TEST_CASE(a)
void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests
/* Include Passthroughs for Linking Tests */
void putcharSpy(int c) { (void)putchar(c);}
void flushSpy(void) {}
/* Global Variables Used During These Tests */ /* Global Variables Used During These Tests */
int CounterSetup = 0; int CounterSetup = 0;
+5 -2
View File
@@ -8,10 +8,13 @@
#include <stdio.h> #include <stdio.h>
#include "unity.h" #include "unity.h"
void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests /* Support for Meta Test Rig */
#define TEST_CASE(...) #define TEST_CASE(...)
/* Include Passthroughs for Linking Tests */
void putcharSpy(int c) { (void)putchar(c);}
void flushSpy(void) {}
#define EXPECT_ABORT_BEGIN \ #define EXPECT_ABORT_BEGIN \
if (TEST_PROTECT()) \ if (TEST_PROTECT()) \
{ {
+34
View File
@@ -54,6 +54,10 @@ void startPutcharSpy(void);
void endPutcharSpy(void); void endPutcharSpy(void);
char* getBufferPutcharSpy(void); char* getBufferPutcharSpy(void);
void startFlushSpy(void);
void endFlushSpy(void);
int getFlushSpyCalls(void);
static int SetToOneToFailInTearDown; static int SetToOneToFailInTearDown;
static int SetToOneMeanWeAlreadyCheckedThisGuy; static int SetToOneMeanWeAlreadyCheckedThisGuy;
@@ -99,6 +103,10 @@ void testUnitySizeInitializationReminder(void)
UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE TestIgnores;
UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestFailed;
UNITY_COUNTER_TYPE CurrentTestIgnored; UNITY_COUNTER_TYPE CurrentTestIgnored;
#ifdef UNITY_INCLUDE_EXEC_TIME
UNITY_COUNTER_TYPE CurrentTestStartTime;
UNITY_COUNTER_TYPE CurrentTestStopTime;
#endif
#ifndef UNITY_EXCLUDE_SETJMP_H #ifndef UNITY_EXCLUDE_SETJMP_H
jmp_buf AbortFrame; jmp_buf AbortFrame;
#endif #endif
@@ -115,6 +123,10 @@ void testUnitySizeInitializationReminder(void)
UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE TestIgnores;
UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestFailed;
UNITY_COUNTER_TYPE CurrentTestIgnored; UNITY_COUNTER_TYPE CurrentTestIgnored;
#ifdef UNITY_INCLUDE_EXEC_TIME
UNITY_COUNTER_TYPE CurrentTestStartTime;
UNITY_COUNTER_TYPE CurrentTestStopTime;
#endif
#ifndef UNITY_EXCLUDE_SETJMP_H #ifndef UNITY_EXCLUDE_SETJMP_H
jmp_buf AbortFrame; jmp_buf AbortFrame;
#endif #endif
@@ -3335,14 +3347,35 @@ void putcharSpy(int c)
#endif #endif
} }
/* This is for counting the calls to the flushSpy */
static int flushSpyEnabled;
static int flushSpyCalls = 0;
void startFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 1; }
void endFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 0; }
int getFlushSpyCalls(void) { return flushSpyCalls; }
void flushSpy(void)
{
if (flushSpyEnabled){ flushSpyCalls++; }
}
void testFailureCountIncrementsAndIsReturnedAtEnd(void) void testFailureCountIncrementsAndIsReturnedAtEnd(void)
{ {
UNITY_UINT savedFailures = Unity.TestFailures; UNITY_UINT savedFailures = Unity.TestFailures;
Unity.CurrentTestFailed = 1; Unity.CurrentTestFailed = 1;
startPutcharSpy(); // Suppress output startPutcharSpy(); // Suppress output
startFlushSpy();
TEST_ASSERT_EQUAL(0, getFlushSpyCalls());
UnityConcludeTest(); UnityConcludeTest();
endPutcharSpy(); endPutcharSpy();
TEST_ASSERT_EQUAL(savedFailures + 1, Unity.TestFailures); TEST_ASSERT_EQUAL(savedFailures + 1, Unity.TestFailures);
#if defined(UNITY_OUTPUT_FLUSH) && defined(UNITY_OUTPUT_FLUSH_HEADER_DECLARATION)
TEST_ASSERT_EQUAL(1, getFlushSpyCalls());
#else
TEST_ASSERT_EQUAL(0, getFlushSpyCalls());
#endif
endFlushSpy();
startPutcharSpy(); // Suppress output startPutcharSpy(); // Suppress output
int failures = UnityEnd(); int failures = UnityEnd();
@@ -3412,6 +3445,7 @@ void testPrintNumbersUnsigned32(void)
#endif #endif
} }
// ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES 64 BIT SUPPORT ================== // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES 64 BIT SUPPORT ==================
void testPrintNumbersInt64(void) void testPrintNumbersInt64(void)