From 933cc973645e3a59ad165af1b3b15487ccd63439 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 28 Sep 2016 22:53:15 -0500 Subject: [PATCH 001/157] Add option to set NaN != NaN for floating point assertions --- src/unity.c | 9 +++++++-- test/tests/testunity.c | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/unity.c b/src/unity.c index 58e93db..765e4e4 100644 --- a/src/unity.c +++ b/src/unity.c @@ -619,12 +619,17 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, /* Wrap this define in a function with variable types as float or double */ #define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ if (isinf(expected) && isinf(actual) && (isneg(expected) == isneg(actual))) return 1; \ - if (isnan(expected) && isnan(actual)) return 1; \ + if (UNITY_NAN_CHECK) return 1; \ diff = actual - expected; \ if (diff < 0.0f) diff = 0.0f - diff; \ if (delta < 0.0f) delta = 0.0f - delta; \ - return !(isnan(diff) || isinf(diff) || (delta < diff)); + return !(isnan(diff) || isinf(diff) || (diff > delta)) /* This first part of this condition will catch any NaN or Infinite values */ +#ifndef UNITY_NAN_NOT_EQUAL_NAN + #define UNITY_NAN_CHECK isnan(expected) && isnan(actual) +#else + #define UNITY_NAN_CHECK 0 +#endif #ifndef UNITY_EXCLUDE_FLOAT static int UnityFloatsWithin(_UF delta, _UF expected, _UF actual) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 8230163..e66de4d 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3713,7 +3713,7 @@ void testNotEqualDoubleArraysNegative3(void) #endif } -void testNotEqualDoubleArraysNaN(void) +void testEqualDoubleArraysNaN(void) { #ifdef UNITY_EXCLUDE_DOUBLE TEST_IGNORE(); From 3e30290367c4755b6c2de2f382fdf64a3b468a28 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 28 Sep 2016 22:59:17 -0500 Subject: [PATCH 002/157] Remove extra newline in verbose output format of fixture --- extras/fixture/src/unity_fixture.c | 2 +- extras/fixture/test/Makefile | 11 ++--------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/extras/fixture/src/unity_fixture.c b/extras/fixture/src/unity_fixture.c index ffc83a7..68d2945 100644 --- a/extras/fixture/src/unity_fixture.c +++ b/extras/fixture/src/unity_fixture.c @@ -41,7 +41,7 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)) UnityBegin(argv[0]); announceTestRun(r); runAllTests(); - UNITY_PRINT_EOL(); + if (!UnityFixture.Verbose) UNITY_PRINT_EOL(); UnityEnd(); } diff --git a/extras/fixture/test/Makefile b/extras/fixture/test/Makefile index 179b12a..80e124f 100644 --- a/extras/fixture/test/Makefile +++ b/extras/fixture/test/Makefile @@ -3,11 +3,7 @@ ifeq ($(shell uname -s), Darwin) CC = clang endif #DEBUG = -O0 -g -CFLAGS += -std=c99 -CFLAGS += -pedantic -CFLAGS += -Wall -CFLAGS += -Wextra -CFLAGS += -Werror +CFLAGS += -std=c99 -pedantic -Wall -Wextra -Werror CFLAGS += $(DEBUG) DEFINES = -D UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar SRC = ../src/unity_fixture.c \ @@ -44,16 +40,13 @@ C89: $(BUILD_DIR) $(CC) $(CFLAGS) $(DEFINES) $(SRC) $(INC_DIR) -o $(TARGET) -D UNITY_EXCLUDE_STDLIB_MALLOC -std=c89 ./$(TARGET) -clangEverything: - clang $(CFLAGS) $(DEFINES) $(SRC) $(INC_DIR) -o $(TARGET) -Weverything - $(BUILD_DIR): mkdir -p $(BUILD_DIR) clean: rm -f $(TARGET) $(BUILD_DIR)/*.gc* -coverage: $(BUILD_DIR) +cov: $(BUILD_DIR) cd $(BUILD_DIR) && \ $(CC) $(DEFINES) $(foreach i, $(SRC), ../test/$(i)) $(INC_DIR) -o $(TARGET) -fprofile-arcs -ftest-coverage rm -f $(BUILD_DIR)/*.gcda From 2ce861801417ababe421df69cab9a33c204d450c Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Thu, 27 Oct 2016 17:33:13 -0400 Subject: [PATCH 003/157] refactor generate_module so that it can be called as a class from within Ceedling (much like the test runner generator) --- auto/generate_module.rb | 353 +++++++++++++++++++++++----------------- 1 file changed, 206 insertions(+), 147 deletions(-) diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 8e233ec..5cf08f6 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -11,46 +11,8 @@ require 'rubygems' require 'fileutils' -HERE = File.expand_path(File.dirname(__FILE__)) + '/' - -#help text when requested -HELP_TEXT = [ "\nGENERATE MODULE\n-------- ------", - "\nUsage: ruby generate_module [options] module_name", - " -i\"include\" sets the path to output headers to 'include' (DEFAULT ../src)", - " -s\"../src\" sets the path to output source to '../src' (DEFAULT ../src)", - " -t\"C:/test\" sets the path to output source to 'C:/test' (DEFAULT ../test)", - " -p\"MCH\" sets the output pattern to MCH.", - " dh - driver hardware.", - " dih - driver interrupt hardware.", - " mch - model conductor hardware.", - " mvp - model view presenter.", - " src - just a single source module. (DEFAULT)", - " -d destroy module instead of creating it.", - " -u update subversion too (requires subversion command line)", - " -y\"my.yml\" selects a different yaml config file for module generation", - "" ].join("\n") - -#Built in patterns -PATTERNS = { 'src' => {'' => { :inc => [] } }, - 'dh' => {'Driver' => { :inc => ['%1$sHardware.h'] }, - 'Hardware' => { :inc => [] } - }, - 'dih' => {'Driver' => { :inc => ['%1$sHardware.h', '%1$sInterrupt.h'] }, - 'Interrupt'=> { :inc => ['%1$sHardware.h'] }, - 'Hardware' => { :inc => [] } - }, - 'mch' => {'Model' => { :inc => [] }, - 'Conductor'=> { :inc => ['%1$sModel.h', '%1$sHardware.h'] }, - 'Hardware' => { :inc => [] } - }, - 'mvp' => {'Model' => { :inc => [] }, - 'Presenter'=> { :inc => ['%1$sModel.h', '%1$sView.h'] }, - 'View' => { :inc => [] } - } - } - #TEMPLATE_TST -TEMPLATE_TST = %q[#include "unity.h" +TEMPLATE_TST ||= %q[#include "unity.h" %2$s#include "%1$s.h" void setUp(void) @@ -68,135 +30,232 @@ void test_%1$s_NeedToImplement(void) ] #TEMPLATE_SRC -TEMPLATE_SRC = %q[%2$s#include "%1$s.h" +TEMPLATE_SRC ||= %q[%2$s#include "%1$s.h" ] #TEMPLATE_INC -TEMPLATE_INC = %q[#ifndef _%3$s_H +TEMPLATE_INC ||= %q[#ifndef _%3$s_H #define _%3$s_H%2$s #endif // _%3$s_H ] -# Parse the command line parameters. -ARGV.each do |arg| - case(arg) - when /^-d/ then @destroy = true - when /^-u/ then @update_svn = true - when /^-p(\w+)/ then @pattern = $1 - when /^-s(.+)/ then @path_src = $1 - when /^-i(.+)/ then @path_inc = $1 - when /^-t(.+)/ then @path_tst = $1 - when /^-y(.+)/ then @yaml_config = $1 - when /^(\w+)/ - raise "ERROR: You can't have more than one Module name specified!" unless @module_name.nil? - @module_name = arg - when /^-(h|-help)/ - puts HELP_TEXT - exit - else - raise "ERROR: Unknown option specified '#{arg}'" +class UnityModuleGenerator + + ############################ + def initialize(options=nil) + + here = File.expand_path(File.dirname(__FILE__)) + '/' + + @options = UnityModuleGenerator.default_options + case(options) + when NilClass then @options + when String then @options.merge!(UnityModuleGenerator.grab_config(options)) + when Hash then @options.merge!(options) + else raise "If you specify arguments, it should be a filename or a hash of options" + end + + # Create default file paths if none were provided + @options[:path_src] = here + "../src/" if @options[:path_src].nil? + @options[:path_inc] = @options[:path_src] if @options[:path_inc].nil? + @options[:path_tst] = here + "../test/" if @options[:path_tst].nil? + @options[:path_src] += '/' unless (@options[:path_src][-1] == 47) + @options[:path_inc] += '/' unless (@options[:path_inc][-1] == 47) + @options[:path_tst] += '/' unless (@options[:path_tst][-1] == 47) + + #Built in patterns + @patterns = { 'src' => {'' => { :inc => [] } }, + 'dh' => {'Driver' => { :inc => ['%1$sHardware.h'] }, + 'Hardware' => { :inc => [] } + }, + 'dih' => {'Driver' => { :inc => ['%1$sHardware.h', '%1$sInterrupt.h'] }, + 'Interrupt'=> { :inc => ['%1$sHardware.h'] }, + 'Hardware' => { :inc => [] } + }, + 'mch' => {'Model' => { :inc => [] }, + 'Conductor'=> { :inc => ['%1$sModel.h', '%1$sHardware.h'] }, + 'Hardware' => { :inc => [] } + }, + 'mvp' => {'Model' => { :inc => [] }, + 'Presenter'=> { :inc => ['%1$sModel.h', '%1$sView.h'] }, + 'View' => { :inc => [] } + } + } end -end -raise "ERROR: You must have a Module name specified! (use option -h for help)" if @module_name.nil? -#load yaml file if one was requested -if @yaml_config - require 'yaml' - cfg = YAML.load_file(HERE + @yaml_config)[:generate_module] - @path_src = cfg[:defaults][:path_src] if @path_src.nil? - @path_inc = cfg[:defaults][:path_inc] if @path_inc.nil? - @path_tst = cfg[:defaults][:path_tst] if @path_tst.nil? - @update_svn = cfg[:defaults][:update_svn] if @update_svn.nil? - @extra_inc = cfg[:includes] - @boilerplates = cfg[:boilerplates] -else - @boilerplates = {} -end - -# Create default file paths if none were provided -@path_src = HERE + "../src/" if @path_src.nil? -@path_inc = @path_src if @path_inc.nil? -@path_tst = HERE + "../test/" if @path_tst.nil? -@path_src += '/' unless (@path_src[-1] == 47) -@path_inc += '/' unless (@path_inc[-1] == 47) -@path_tst += '/' unless (@path_tst[-1] == 47) -@pattern = 'src' if @pattern.nil? -@includes = { :src => [], :inc => [], :tst => [] } -@includes.merge!(@extra_inc) unless @extra_inc.nil? - -#create triad definition -TRIAD = [ { :ext => '.c', :path => @path_src, :template => TEMPLATE_SRC, :inc => :src, :boilerplate => @boilerplates[:src] }, - { :ext => '.h', :path => @path_inc, :template => TEMPLATE_INC, :inc => :inc, :boilerplate => @boilerplates[:inc] }, - { :ext => '.c', :path => @path_tst+'Test', :template => TEMPLATE_TST, :inc => :tst, :boilerplate => @boilerplates[:tst] }, - ] - -#prepare the pattern for use -@patterns = PATTERNS[@pattern.downcase] -raise "ERROR: The design pattern specified isn't one that I recognize!" if @patterns.nil? - -# Assemble the path/names of the files we need to work with. -files = [] -TRIAD.each do |triad| - @patterns.each_pair do |pattern_file, pattern_traits| - files << { - :path => "#{triad[:path]}#{@module_name}#{pattern_file}#{triad[:ext]}", - :name => "#{@module_name}#{pattern_file}", - :template => triad[:template], - :boilerplate => triad[:boilerplate], - :includes => case(triad[:inc]) - when :src then @includes[:src] | pattern_traits[:inc].map{|f| f % [@module_name]} - when :inc then @includes[:inc] - when :tst then @includes[:tst] | pattern_traits[:inc].map{|f| "Mock#{f}"% [@module_name]} - end + ############################ + def self.default_options + { + :pattern => "src", + :includes => + { + :src => [], + :inc => [], + :tst => [], + }, + :update_svn => false, + :boilerplates => {}, + :test_prefix => 'Test', } end -end -# destroy files if that was what was requested -if @destroy - files.each do |filespec| - file = filespec[:path] - if File.exist?(file) - if @update_svn - `svn delete \"#{file}\" --force` - puts "File #{file} deleted and removed from source control" - else - FileUtils.remove(file) - puts "File #{file} deleted" + ############################ + def self.grab_config(config_file) + options = self.default_options + unless (config_file.nil? or config_file.empty?) + require 'yaml' + yaml_guts = YAML.load_file(config_file) + options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) + raise "No :unity or :cmock section found in #{config_file}" unless options + end + return(options) + end + + ############################ + def files_to_operate_on(module_name, pattern=nil) + #create triad definition + prefix = @options[:test_prefix] || 'Test' + triad = [ { :ext => '.c', :path => @options[:path_src], :template => TEMPLATE_SRC, :inc => :src, :boilerplate => @options[:boilerplates][:src] }, + { :ext => '.h', :path => @options[:path_inc], :template => TEMPLATE_INC, :inc => :inc, :boilerplate => @options[:boilerplates][:inc] }, + { :ext => '.c', :path => @options[:path_tst]+prefix, :template => TEMPLATE_TST, :inc => :tst, :boilerplate => @options[:boilerplates][:tst] }, + ] + + #prepare the pattern for use + patterns = @patterns[(pattern || @options[:pattern] || 'src').downcase] + raise "ERROR: The design pattern '#{pattern}' specified isn't one that I recognize!" if patterns.nil? + + # Assemble the path/names of the files we need to work with. + files = [] + triad.each do |triad| + patterns.each_pair do |pattern_file, pattern_traits| + puts @options.inspect + puts pattern_traits.inspect + puts module_name.inspect + files << { + :path => "#{triad[:path]}#{module_name}#{pattern_file}#{triad[:ext]}", + :name => "#{module_name}#{pattern_file}", + :template => triad[:template], + :boilerplate => triad[:boilerplate], + :includes => case(triad[:inc]) + when :src then @options[:includes][:src] | pattern_traits[:inc].map{|f| f % [module_name]} + when :inc then @options[:includes][:inc] + when :tst then @options[:includes][:tst] | pattern_traits[:inc].map{|f| "Mock#{f}"% [module_name]} + end + } end - else - puts "File #{file} does not exist so cannot be removed." end + + return files end - puts "Destroy Complete" - exit + + ############################ + def generate(module_name, pattern=nil) + + files = files_to_operate_on(module_name, pattern) + + #Abort if any module already exists + files.each do |file| + raise "ERROR: File #{file[:name]} already exists. Exiting." if File.exist?(file[:path]) + end + + # Create Source Modules + files.each_with_index do |file, i| + File.open(file[:path], 'w') do |f| + f.write(file[:boilerplate] % [file[:name]]) unless file[:boilerplate].nil? + f.write(file[:template] % [ file[:name], + file[:includes].map{|f| "#include \"#{f}\"\n"}.join, + file[:name].upcase ] + ) + end + if (@options[:update_svn]) + `svn add \"#{file[:path]}\"` + if $?.exitstatus == 0 + puts "File #{file[:path]} created and added to source control" + else + puts "File #{file[:path]} created but FAILED adding to source control!" + end + else + puts "File #{file[:path]} created" + end + end + puts 'Generate Complete' + end + + ############################ + def destroy(module_name, pattern=nil) + + files_to_operate_on(module_name, pattern).each do |filespec| + file = filespec[:path] + if File.exist?(file) + if @options[:update_svn] + `svn delete \"#{file}\" --force` + puts "File #{file} deleted and removed from source control" + else + FileUtils.remove(file) + puts "File #{file} deleted" + end + else + puts "File #{file} does not exist so cannot be removed." + end + end + puts "Destroy Complete" + end + end -#Abort if any module already exists -files.each do |file| - raise "ERROR: File #{file[:name]} already exists. Exiting." if File.exist?(file[:path]) -end +############################ +#Handle As Command Line If Called That Way +if ($0 == __FILE__) + destroy = false + options = { } + module_name = nil -# Create Source Modules -files.each_with_index do |file, i| - File.open(file[:path], 'w') do |f| - f.write(file[:boilerplate] % [file[:name]]) unless file[:boilerplate].nil? - f.write(file[:template] % [ file[:name], - file[:includes].map{|f| "#include \"#{f}\"\n"}.join, - file[:name].upcase ] - ) - end - if (@update_svn) - `svn add \"#{file[:path]}\"` - if $?.exitstatus == 0 - puts "File #{file[:path]} created and added to source control" - else - puts "File #{file[:path]} created but FAILED adding to source control!" + # Parse the command line parameters. + ARGV.each do |arg| + case(arg) + when /^-d/ then destroy = true + when /^-u/ then options[:update_svn] = true + when /^-p(\w+)/ then options[:pattern] = $1 + when /^-s(.+)/ then options[:path_src] = $1 + when /^-i(.+)/ then options[:path_inc] = $1 + when /^-t(.+)/ then options[:path_tst] = $1 + when /^-y(.+)/ then options = UnityModuleGenerator.grab_config($1) + when /^(\w+)/ + raise "ERROR: You can't have more than one Module name specified!" unless module_name.nil? + module_name = arg + when /^-(h|-help)/ + ARGV = [] + else + raise "ERROR: Unknown option specified '#{arg}'" end + end + + if (!ARGV[0]) + puts [ "\nGENERATE MODULE\n-------- ------", + "\nUsage: ruby generate_module [options] module_name", + " -i\"include\" sets the path to output headers to 'include' (DEFAULT ../src)", + " -s\"../src\" sets the path to output source to '../src' (DEFAULT ../src)", + " -t\"C:/test\" sets the path to output source to 'C:/test' (DEFAULT ../test)", + " -p\"MCH\" sets the output pattern to MCH.", + " dh - driver hardware.", + " dih - driver interrupt hardware.", + " mch - model conductor hardware.", + " mvp - model view presenter.", + " src - just a single source module. (DEFAULT)", + " -d destroy module instead of creating it.", + " -u update subversion too (requires subversion command line)", + " -y\"my.yml\" selects a different yaml config file for module generation", + "" ].join("\n") + exit + end + + raise "ERROR: You must have a Module name specified! (use option -h for help)" if module_name.nil? + if (destroy) + UnityModuleGenerator.new(options).destroy(module_name) else - puts "File #{file[:path]} created" + UnityModuleGenerator.new(options).generate(module_name) end + end -puts 'Generate Complete' + From 661c1b2d568693e3b6b631ae66f6872b194674f1 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Thu, 27 Oct 2016 23:06:18 -0400 Subject: [PATCH 004/157] Boost version and remove some debug puts statements --- auto/generate_module.rb | 3 --- release/build.info | 2 +- release/version.info | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 5cf08f6..43f5b0d 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -128,9 +128,6 @@ class UnityModuleGenerator files = [] triad.each do |triad| patterns.each_pair do |pattern_file, pattern_traits| - puts @options.inspect - puts pattern_traits.inspect - puts module_name.inspect files << { :path => "#{triad[:path]}#{module_name}#{pattern_file}#{triad[:ext]}", :name => "#{module_name}#{pattern_file}", diff --git a/release/build.info b/release/build.info index 0eec1a0..207634b 100644 --- a/release/build.info +++ b/release/build.info @@ -1,2 +1,2 @@ -119 +120 diff --git a/release/version.info b/release/version.info index 0ba9f86..0f19985 100644 --- a/release/version.info +++ b/release/version.info @@ -1,2 +1,2 @@ -2.3.3 +2.4.0 From ae5b4c57990583222a70b5260e66f8a48a89691b Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Thu, 10 Nov 2016 10:10:13 -0500 Subject: [PATCH 005/157] Added ability to inject defines, much like what was built into Ceedling before Ceedling switched to just using this generator. --- auto/generate_test_runner.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 84696e3..134be65 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -23,6 +23,7 @@ class UnityTestRunnerGenerator def self.default_options { :includes => [], + :defines => [], :plugins => [], :framework => :unity, :test_prefix => "test|spec|should", @@ -167,6 +168,9 @@ class UnityTestRunnerGenerator output.puts('#include ') output.puts('#include ') output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) + if (@options[:defines] && !@options[:defines].empty?) + @options[:defines].each {|d| output.puts("#define #{d}")} + end if (@options[:header_file] && !@options[:header_file].empty?) output.puts("#include \"#{File.basename(@options[:header_file])}\"") else From 6ec7c78b668d06a741797440dd0a5916573e8559 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sun, 4 Sep 2016 20:48:29 -0500 Subject: [PATCH 006/157] Writing a float printing routine --- src/unity.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/src/unity.c b/src/unity.c index 5740657..068d015 100644 --- a/src/unity.c +++ b/src/unity.c @@ -263,9 +263,59 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number) void UnityPrintFloat(_UD number) { - char TempBuffer[UNITY_VERBOSE_NUMBER_MAX_LENGTH + 1]; - snprintf(TempBuffer, sizeof(TempBuffer), "%.6f", number); - UnityPrint(TempBuffer); + // char TempBuffer[UNITY_VERBOSE_NUMBER_MAX_LENGTH + 1]; + // snprintf(TempBuffer, sizeof(TempBuffer), "%.6f", number); + // UnityPrint(TempBuffer); + if (isnan(number)) + { + UnityPrint(UnityStrNaN); + return; + } + + if (number < 0) + { + UNITY_OUTPUT_CHAR('-'); + number = -number; + } + + if (isinf(number)) UnityPrintLen(UnityStrInf, 3); + else + { + _UD divisor = 1; + _U_UINT exponent = 0; + while (number / divisor >= 10.0f) + { + divisor *= 10; + exponent++; + } + /* 10000000 < 2^24, max integer cast to a float without truncation */ + #define FLOAT_SCI_FORMAT_MINIMUM 10000000 + if (number >= FLOAT_SCI_FORMAT_MINIMUM) + { /* Print in scientific format: 1.123456e38 */ + int i; + for (i = 0; i < 7; i++) + { + UNITY_OUTPUT_CHAR('0' + (int)(number / divisor) % 10); + if (i == 0) UNITY_OUTPUT_CHAR('.'); + divisor /= 10.0f; + } + UNITY_OUTPUT_CHAR('e'); + UnityPrintNumberUnsigned(exponent); + } + else + { /* Print up to 9 characters, 6 after the decimal max */ + _UD decimals = FLOAT_SCI_FORMAT_MINIMUM/divisor; + if (decimals > 1000000) decimals = 1000000; + number = number + 0.5f/decimals; /* Rounding */ + while (decimals >= 1) + { + UNITY_OUTPUT_CHAR('0' + (int)(number / divisor) % 10); + if (divisor == 1.0f) UNITY_OUTPUT_CHAR('.'); + if (divisor <= 1.0f) decimals /= 10; + divisor /= 10; + } + } + } } #endif From d4a35f0949839fecc1ef7b890906495d5cedbf75 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sun, 4 Sep 2016 21:18:25 -0500 Subject: [PATCH 007/157] Refactor to delete smaller number decimal format Generalize loop to print decimal format and exponential Add '+' to exponent when printing larger floats --- src/unity.c | 49 ++++++++++++++++++++----------------------------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/src/unity.c b/src/unity.c index 068d015..e1294c3 100644 --- a/src/unity.c +++ b/src/unity.c @@ -277,47 +277,38 @@ void UnityPrintFloat(_UD number) UNITY_OUTPUT_CHAR('-'); number = -number; } - if (isinf(number)) UnityPrintLen(UnityStrInf, 3); - else + else /* Small numbers as "%.6f" format string, but uses scientific notation for larger numbers */ { - _UD divisor = 1; + _UD divisor = 1.0f; _U_UINT exponent = 0; + int scifmt; + _U_UINT i; + while (number / divisor >= 10.0f) { divisor *= 10; exponent++; } - /* 10000000 < 2^24, max integer cast to a float without truncation */ - #define FLOAT_SCI_FORMAT_MINIMUM 10000000 - if (number >= FLOAT_SCI_FORMAT_MINIMUM) - { /* Print in scientific format: 1.123456e38 */ - int i; - for (i = 0; i < 7; i++) - { - UNITY_OUTPUT_CHAR('0' + (int)(number / divisor) % 10); - if (i == 0) UNITY_OUTPUT_CHAR('.'); - divisor /= 10.0f; - } - UNITY_OUTPUT_CHAR('e'); - UnityPrintNumberUnsigned(exponent); + + number = number + 0.5f/(1000000/divisor); /* Rounding to 6 figures */ + /* Print in scientific format: 1.123456e38 */ + scifmt = exponent > 3; + for (i = 0; i < 7; i++) /* Always print 7 digits total */ + { + UNITY_OUTPUT_CHAR('0' + (int)(number / divisor) % 10); + if ((scifmt && i == 0) || (!scifmt && i == exponent)) UNITY_OUTPUT_CHAR('.'); + divisor /= 10.0f; } - else - { /* Print up to 9 characters, 6 after the decimal max */ - _UD decimals = FLOAT_SCI_FORMAT_MINIMUM/divisor; - if (decimals > 1000000) decimals = 1000000; - number = number + 0.5f/decimals; /* Rounding */ - while (decimals >= 1) - { - UNITY_OUTPUT_CHAR('0' + (int)(number / divisor) % 10); - if (divisor == 1.0f) UNITY_OUTPUT_CHAR('.'); - if (divisor <= 1.0f) decimals /= 10; - divisor /= 10; - } + if (scifmt) + { + UNITY_OUTPUT_CHAR('e'); + UNITY_OUTPUT_CHAR('+'); + UnityPrintNumberUnsigned(exponent); } } } -#endif +#endif /* UNITY_FLOAT_VERBOSE */ /*-----------------------------------------------*/ From ac455f2798cc2f2eff7e27740af487d60fbafad1 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 15 Nov 2016 09:29:08 -0500 Subject: [PATCH 008/157] =?UTF-8?q?We=20can=E2=80=99t=20guarantee=20that?= =?UTF-8?q?=20the=20built-in=20function=20insane=20will=20return=201.=20It?= =?UTF-8?q?=20might=20return=20any=20other=20non-negative=20value.=20There?= =?UTF-8?q?fore=20we=20need=20to=20force=20it=20to=20be=201=20so=20we=20ca?= =?UTF-8?q?n=20use=20the=20comparison=20operator=20later.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/unity.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/unity.c b/src/unity.c index 5740657..a79f6d4 100644 --- a/src/unity.c +++ b/src/unity.c @@ -733,13 +733,13 @@ void UnityAssertFloatSpecial(const _UF actual, case UNITY_FLOAT_IS_NAN: case UNITY_FLOAT_IS_NOT_NAN: - is_trait = isnan(actual); + is_trait = isnan(actual) ? 1 : 0; break; /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ case UNITY_FLOAT_IS_DET: case UNITY_FLOAT_IS_NOT_DET: - if (isinf(actual) | isnan(actual)) + if (isinf(actual) || isnan(actual)) is_trait = 0; else is_trait = 1; @@ -876,13 +876,13 @@ void UnityAssertDoubleSpecial(const _UD actual, case UNITY_FLOAT_IS_NAN: case UNITY_FLOAT_IS_NOT_NAN: - is_trait = isnan(actual); + is_trait = isnan(actual) ? 1 : 0; break; /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ case UNITY_FLOAT_IS_DET: case UNITY_FLOAT_IS_NOT_DET: - if (isinf(actual) | isnan(actual)) + if (isinf(actual) || isnan(actual)) is_trait = 0; else is_trait = 1; From 4faae4435d9ee340b291ca9ef33cc79953967a09 Mon Sep 17 00:00:00 2001 From: Jean Carlo Machado Date: Wed, 16 Nov 2016 21:37:51 -0200 Subject: [PATCH 009/157] removed duplicated declaration of putcharSpy --- test/tests/testunity.c | 1 - 1 file changed, 1 deletion(-) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index e66de4d..8ef3034 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -53,7 +53,6 @@ static const _UD d_zero = 0.0; void startPutcharSpy(void); void endPutcharSpy(void); char* getBufferPutcharSpy(void); -void putcharSpy(int c); static int SetToOneToFailInTearDown; static int SetToOneMeanWeAlreadyCheckedThisGuy; From 9653fbf7ac1321573de1d6c0de41c4c423fbd5ff Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 24 Sep 2016 14:16:26 -0500 Subject: [PATCH 010/157] Use an integer cast to print floating point numbers more precisely Improve printing six decimal places, remove trailing 0's, fix the carry when numbers like 0.9999999 round up and print leading zeros in the decimal The first attempt at printing floats had precision issues where the last few digits would often be wrong. This next approach may yield a better algorithm for numbers less than 4.29 billion, those that fit in 32 bits. --- src/unity.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/unity.c b/src/unity.c index e1294c3..636881b 100644 --- a/src/unity.c +++ b/src/unity.c @@ -284,6 +284,33 @@ void UnityPrintFloat(_UD number) _U_UINT exponent = 0; int scifmt; _U_UINT i; + _UU32 integer_part; + _UD fraction_part; + // if (number <= 0xFFFFFFFF) /* Fits in an integer */ + { + integer_part = (_UU32)number; + fraction_part = number - integer_part; + } + + _U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0f + 0.5f); + if (fraction_bits == 1000000) + { + fraction_bits = 0; + integer_part += 1; + } + _U_UINT divisor_int = 100000; + + UnityPrintNumberUnsigned(integer_part); + UNITY_OUTPUT_CHAR('.'); + /* now mod and print, then divide divisor */ + do + { + UNITY_OUTPUT_CHAR((char)('0' + (fraction_bits / divisor_int))); + fraction_bits %= divisor_int; + if (fraction_bits == 0) break; // Truncate trailing 0's + divisor_int /= 10; + } while (divisor_int > 0); + UNITY_OUTPUT_CHAR(' '); while (number / divisor >= 10.0f) { From 30ba118c47cf04aa514f0d9c342c47de3463ef99 Mon Sep 17 00:00:00 2001 From: jsalling Date: Tue, 4 Oct 2016 23:18:08 -0500 Subject: [PATCH 011/157] Add printing for large numbers in exponential format Delete old method for printing --- src/unity.c | 55 ++++++++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/src/unity.c b/src/unity.c index 636881b..0cfcbea 100644 --- a/src/unity.c +++ b/src/unity.c @@ -278,19 +278,10 @@ void UnityPrintFloat(_UD number) number = -number; } if (isinf(number)) UnityPrintLen(UnityStrInf, 3); - else /* Small numbers as "%.6f" format string, but uses scientific notation for larger numbers */ + else if (number < 4294967296.0f) /* Fits in an integer */ { - _UD divisor = 1.0f; - _U_UINT exponent = 0; - int scifmt; - _U_UINT i; - _UU32 integer_part; - _UD fraction_part; - // if (number <= 0xFFFFFFFF) /* Fits in an integer */ - { - integer_part = (_UU32)number; - fraction_part = number - integer_part; - } + _UU32 integer_part = (_UU32)number; + _UD fraction_part = number - integer_part; _U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0f + 0.5f); if (fraction_bits == 1000000) @@ -310,29 +301,33 @@ void UnityPrintFloat(_UD number) if (fraction_bits == 0) break; // Truncate trailing 0's divisor_int /= 10; } while (divisor_int > 0); - UNITY_OUTPUT_CHAR(' '); - while (number / divisor >= 10.0f) + + } + else /* Won't fit in an integer type */ + { + _UU32 integer_part; + _UD divide = 10.0f; + _U_UINT exponent = 7; + + while (number / divide >= 10000000.0f) { - divisor *= 10; + divide *= 10; exponent++; } + integer_part = (_UU32)(number / divide + 0.5f); + _UU32 divisor_int = 1000000; + do + { + UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor_int))); - number = number + 0.5f/(1000000/divisor); /* Rounding to 6 figures */ - /* Print in scientific format: 1.123456e38 */ - scifmt = exponent > 3; - for (i = 0; i < 7; i++) /* Always print 7 digits total */ - { - UNITY_OUTPUT_CHAR('0' + (int)(number / divisor) % 10); - if ((scifmt && i == 0) || (!scifmt && i == exponent)) UNITY_OUTPUT_CHAR('.'); - divisor /= 10.0f; - } - if (scifmt) - { - UNITY_OUTPUT_CHAR('e'); - UNITY_OUTPUT_CHAR('+'); - UnityPrintNumberUnsigned(exponent); - } + integer_part %= divisor_int; + divisor_int /= 10; + if (divisor_int == 100000) UNITY_OUTPUT_CHAR('.'); + } while (divisor_int > 0); + UNITY_OUTPUT_CHAR('e'); + UNITY_OUTPUT_CHAR('+'); + UnityPrintNumberUnsigned(exponent); } } #endif /* UNITY_FLOAT_VERBOSE */ From e48fe0a07c087a313ed3baf2eeb47951cf3b32d1 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 12 Oct 2016 21:58:28 -0500 Subject: [PATCH 012/157] Reorganize NaN and Inf printing into if-else blocks --- src/unity.c | 58 +++++++++++++++++++----------------------- test/tests/testunity.c | 12 +++++++++ 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/src/unity.c b/src/unity.c index 0cfcbea..44c870f 100644 --- a/src/unity.c +++ b/src/unity.c @@ -251,58 +251,50 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number) /*-----------------------------------------------*/ #ifdef UNITY_FLOAT_VERBOSE -#include - -#ifndef UNITY_VERBOSE_NUMBER_MAX_LENGTH -# ifdef UNITY_DOUBLE_VERBOSE -# define UNITY_VERBOSE_NUMBER_MAX_LENGTH 317 -# else -# define UNITY_VERBOSE_NUMBER_MAX_LENGTH 47 -# endif -#endif +/* + * char buffer[19]; + * if (number > 4294967296.0 || -number > 4294967296.0) + * snprintf(buffer, sizeof buffer, "%.6e", number); + * else + * snprintf(buffer, sizeof buffer, "%.6f", number); + * UnityPrint(buffer); + */ void UnityPrintFloat(_UD number) { - // char TempBuffer[UNITY_VERBOSE_NUMBER_MAX_LENGTH + 1]; - // snprintf(TempBuffer, sizeof(TempBuffer), "%.6f", number); - // UnityPrint(TempBuffer); - if (isnan(number)) - { - UnityPrint(UnityStrNaN); - return; - } - if (number < 0) { UNITY_OUTPUT_CHAR('-'); number = -number; } - if (isinf(number)) UnityPrintLen(UnityStrInf, 3); + + if (isnan(number)) UnityPrint(UnityStrNaN); + else if (isinf(number)) UnityPrintLen(UnityStrInf, 3); + else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small number format */ else if (number < 4294967296.0f) /* Fits in an integer */ { _UU32 integer_part = (_UU32)number; _UD fraction_part = number - integer_part; _U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0f + 0.5f); + if (fraction_bits == 1000000) { fraction_bits = 0; integer_part += 1; } - _U_UINT divisor_int = 100000; + _U_UINT divisor = 100000; UnityPrintNumberUnsigned(integer_part); UNITY_OUTPUT_CHAR('.'); /* now mod and print, then divide divisor */ do { - UNITY_OUTPUT_CHAR((char)('0' + (fraction_bits / divisor_int))); - fraction_bits %= divisor_int; + UNITY_OUTPUT_CHAR((char)('0' + (fraction_bits / divisor))); + fraction_bits %= divisor; if (fraction_bits == 0) break; // Truncate trailing 0's - divisor_int /= 10; - } while (divisor_int > 0); - - + divisor /= 10; + } while (divisor > 0); } else /* Won't fit in an integer type */ { @@ -316,17 +308,19 @@ void UnityPrintFloat(_UD number) exponent++; } integer_part = (_UU32)(number / divide + 0.5f); - _UU32 divisor_int = 1000000; + + _UU32 divisor = 1000000; do { - UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor_int))); + UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor))); - integer_part %= divisor_int; - divisor_int /= 10; - if (divisor_int == 100000) UNITY_OUTPUT_CHAR('.'); - } while (divisor_int > 0); + integer_part %= divisor; + divisor /= 10; + if (divisor == 100000) UNITY_OUTPUT_CHAR('.'); + } while (divisor > 0); UNITY_OUTPUT_CHAR('e'); UNITY_OUTPUT_CHAR('+'); + if (exponent < 10) UNITY_OUTPUT_CHAR('0'); UnityPrintNumberUnsigned(exponent); } } diff --git a/test/tests/testunity.c b/test/tests/testunity.c index e66de4d..75c3552 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3228,6 +3228,18 @@ void testNotEqualFloatArraysLengthZero(void) #endif } +void testFloatVerbosePrinting(void) +{ +#ifdef UNITY_FLOAT_VERBOSE + UnityPrintFloat(123456789.0f); + UnityPrintFloat(100000000.0f); + UnityPrintFloat(65536.0f*65536.0f); + UnityPrintFloat(1000000000.0f); + UnityPrintFloat(10000000000.0f); + UnityPrintFloat(9999999000.0f); +#endif +} + // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES DOUBLE SUPPORT ================== void testDoublesWithinDelta(void) From 2de0e8285d2767c50712d035c686bdcb61c11b17 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 3 Nov 2016 23:56:32 -0500 Subject: [PATCH 013/157] Key idea is using double precision calculations makes everything better Print 9 digits --- src/unity.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/unity.c b/src/unity.c index 44c870f..7873385 100644 --- a/src/unity.c +++ b/src/unity.c @@ -255,7 +255,7 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number) /* * char buffer[19]; * if (number > 4294967296.0 || -number > 4294967296.0) - * snprintf(buffer, sizeof buffer, "%.6e", number); + * snprintf(buffer, sizeof buffer, "%.8e", number); * else * snprintf(buffer, sizeof buffer, "%.6f", number); * UnityPrint(buffer); @@ -276,7 +276,8 @@ void UnityPrintFloat(_UD number) _UU32 integer_part = (_UU32)number; _UD fraction_part = number - integer_part; - _U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0f + 0.5f); + _U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0 + 0.5); + /* Double precision calculation gives best performance for six rounded decimal places */ if (fraction_bits == 1000000) { @@ -299,24 +300,25 @@ void UnityPrintFloat(_UD number) else /* Won't fit in an integer type */ { _UU32 integer_part; - _UD divide = 10.0f; - _U_UINT exponent = 7; + double divide = 10.0; + _U_UINT exponent = 9; - while (number / divide >= 10000000.0f) + while (number / divide >= 1000000000.0) { divide *= 10; exponent++; } - integer_part = (_UU32)(number / divide + 0.5f); + integer_part = (_UU32)(number / divide + 0.5); + /* Double precision calculation required for float, to produce 9 rounded digits */ - _UU32 divisor = 1000000; + _UU32 divisor = 100000000; do { UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor))); integer_part %= divisor; divisor /= 10; - if (divisor == 100000) UNITY_OUTPUT_CHAR('.'); + if (divisor == 10000000) UNITY_OUTPUT_CHAR('.'); } while (divisor > 0); UNITY_OUTPUT_CHAR('e'); UNITY_OUTPUT_CHAR('+'); From 393f2cb5448f48ac592fdeb90cbcc8d0ef766a74 Mon Sep 17 00:00:00 2001 From: jsalling Date: Fri, 4 Nov 2016 23:56:50 -0500 Subject: [PATCH 014/157] Refactor printing after the decimal point, signed types, small numbers... Change some types to signed for simpler code and speed Added format to distinguish small numbers --- src/unity.c | 59 +++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/unity.c b/src/unity.c index 7873385..8ed1064 100644 --- a/src/unity.c +++ b/src/unity.c @@ -251,6 +251,17 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number) /*-----------------------------------------------*/ #ifdef UNITY_FLOAT_VERBOSE +static void UnityPrintDecimalAndNumberWithLeadingZeros(_US32 fraction_part, _US32 divisor) +{ + UNITY_OUTPUT_CHAR('.'); + while (divisor > 0) + { + UNITY_OUTPUT_CHAR('0' + fraction_part / divisor); + fraction_part %= divisor; + divisor /= 10; + if (fraction_part == 0) break; /* Truncate trailing 0's */ + } +} /* * char buffer[19]; @@ -270,60 +281,46 @@ void UnityPrintFloat(_UD number) if (isnan(number)) UnityPrint(UnityStrNaN); else if (isinf(number)) UnityPrintLen(UnityStrInf, 3); - else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small number format */ - else if (number < 4294967296.0f) /* Fits in an integer */ + else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small numbers */ + else if (number < 4294967296.0f) /* Rounded result fits in 32 bits, "%.6f" format */ { + _US32 divisor = (1000000/10); _UU32 integer_part = (_UU32)number; - _UD fraction_part = number - integer_part; - - _U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0 + 0.5); + _US32 fraction_part = (_US32)((number - integer_part)*1000000.0 + 0.5); /* Double precision calculation gives best performance for six rounded decimal places */ - if (fraction_bits == 1000000) + if (fraction_part == 1000000) { - fraction_bits = 0; + fraction_part = 0; integer_part += 1; } - _U_UINT divisor = 100000; UnityPrintNumberUnsigned(integer_part); - UNITY_OUTPUT_CHAR('.'); - /* now mod and print, then divide divisor */ - do - { - UNITY_OUTPUT_CHAR((char)('0' + (fraction_bits / divisor))); - fraction_bits %= divisor; - if (fraction_bits == 0) break; // Truncate trailing 0's - divisor /= 10; - } while (divisor > 0); + UnityPrintDecimalAndNumberWithLeadingZeros(fraction_part, divisor); } - else /* Won't fit in an integer type */ + else /* Number is larger, use exponential format of 9 digits, "%.8e" */ { - _UU32 integer_part; + _US32 divisor = (1000000000/10); + _US32 integer_part; double divide = 10.0; - _U_UINT exponent = 9; + int exponent = 9; while (number / divide >= 1000000000.0) { divide *= 10; exponent++; } - integer_part = (_UU32)(number / divide + 0.5); + integer_part = (_US32)(number / divide + 0.5); /* Double precision calculation required for float, to produce 9 rounded digits */ - _UU32 divisor = 100000000; - do - { - UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor))); - - integer_part %= divisor; - divisor /= 10; - if (divisor == 10000000) UNITY_OUTPUT_CHAR('.'); - } while (divisor > 0); + UNITY_OUTPUT_CHAR('0' + integer_part / divisor); + integer_part %= divisor; + divisor /= 10; + UnityPrintDecimalAndNumberWithLeadingZeros(integer_part, divisor); UNITY_OUTPUT_CHAR('e'); UNITY_OUTPUT_CHAR('+'); if (exponent < 10) UNITY_OUTPUT_CHAR('0'); - UnityPrintNumberUnsigned(exponent); + UnityPrintNumber(exponent); } } #endif /* UNITY_FLOAT_VERBOSE */ From 1dfcb54491f6c53087dc7e16874bb6f3efb5c550 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sun, 6 Nov 2016 22:22:11 -0600 Subject: [PATCH 015/157] Start adding tests. Add const and simplify code. --- src/unity.c | 8 +++---- test/tests/testunity.c | 54 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/unity.c b/src/unity.c index 8ed1064..ecc9559 100644 --- a/src/unity.c +++ b/src/unity.c @@ -284,7 +284,7 @@ void UnityPrintFloat(_UD number) else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small numbers */ else if (number < 4294967296.0f) /* Rounded result fits in 32 bits, "%.6f" format */ { - _US32 divisor = (1000000/10); + const _US32 divisor = (1000000/10); _UU32 integer_part = (_UU32)number; _US32 fraction_part = (_US32)((number - integer_part)*1000000.0 + 0.5); /* Double precision calculation gives best performance for six rounded decimal places */ @@ -300,7 +300,7 @@ void UnityPrintFloat(_UD number) } else /* Number is larger, use exponential format of 9 digits, "%.8e" */ { - _US32 divisor = (1000000000/10); + const _US32 divisor = (1000000000/10); _US32 integer_part; double divide = 10.0; int exponent = 9; @@ -314,9 +314,7 @@ void UnityPrintFloat(_UD number) /* Double precision calculation required for float, to produce 9 rounded digits */ UNITY_OUTPUT_CHAR('0' + integer_part / divisor); - integer_part %= divisor; - divisor /= 10; - UnityPrintDecimalAndNumberWithLeadingZeros(integer_part, divisor); + UnityPrintDecimalAndNumberWithLeadingZeros(integer_part % divisor, divisor / 10); UNITY_OUTPUT_CHAR('e'); UNITY_OUTPUT_CHAR('+'); if (exponent < 10) UNITY_OUTPUT_CHAR('0'); diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 75c3552..76babfc 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3228,15 +3228,57 @@ void testNotEqualFloatArraysLengthZero(void) #endif } +#ifdef UNITY_FLOAT_VERBOSE +#define TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, actual) { \ + startPutcharSpy(); UnityPrintFloat((actual)); endPutcharSpy(); \ + TEST_ASSERT_EQUAL_STRING((expected), getBufferPutcharSpy()); \ + } +#endif + void testFloatVerbosePrinting(void) { #ifdef UNITY_FLOAT_VERBOSE - UnityPrintFloat(123456789.0f); - UnityPrintFloat(100000000.0f); - UnityPrintFloat(65536.0f*65536.0f); - UnityPrintFloat(1000000000.0f); - UnityPrintFloat(10000000000.0f); - UnityPrintFloat(9999999000.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.0", 0.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.000000...", 0.000000499f); + float smallest = 0.0000005f; + *(int*)&smallest += 1; + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.000001", smallest); + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.100469499f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0", 0.9999995f); /*Rounding to int place*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0", 1.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.25", 1.25f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("7.999999", 7.999999f); /*Not rounding*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("16.000002", 16.000002f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("16.000004", 16.000004f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("16.000006", 16.000006f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4294967040.0", 4294967040.0f); /*Last full print integer*/ + + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967296.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("5.0e+09", 5000000000.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("8.0e+09", 8.0e+09f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("8.3099991e+09", 8309999104.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 1.0e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000000.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00005499e+10", 1.000055e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.10000006e+38", 1.10000005e+38f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.63529943e+10", 1.63529943e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("3.40282347e+38", 3.40282346638e38f); + + TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 3.40282346638e38f*2.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0f / f_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -3.40282346638e38f*2.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -3.40282346638e38f*2.0f * f_zero); + + //Double + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.10046949999999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4294967295.999999", 4294967295.999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967296.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("7.0e+100", 7.0e+100); + + TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.7976931348623157e308*10.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0 / d_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.7976931348623157e308*10.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -1.7976931348623157e308*10.0 * d_zero); #endif } From 4a27d147348e6698563e8a692cdcb7f29e641fc2 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sun, 6 Nov 2016 22:25:54 -0600 Subject: [PATCH 016/157] Correct boundary conditions and add tests --- src/unity.c | 6 +++--- test/tests/testunity.c | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/unity.c b/src/unity.c index ecc9559..c282873 100644 --- a/src/unity.c +++ b/src/unity.c @@ -281,8 +281,8 @@ void UnityPrintFloat(_UD number) if (isnan(number)) UnityPrint(UnityStrNaN); else if (isinf(number)) UnityPrintLen(UnityStrInf, 3); - else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small numbers */ - else if (number < 4294967296.0f) /* Rounded result fits in 32 bits, "%.6f" format */ + else if (number <= 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small number */ + else if (number < 4294967295.9999995) /* Rounded result fits in 32 bits, "%.6f" format */ { const _US32 divisor = (1000000/10); _UU32 integer_part = (_UU32)number; @@ -305,7 +305,7 @@ void UnityPrintFloat(_UD number) double divide = 10.0; int exponent = 9; - while (number / divide >= 1000000000.0) + while (number / divide >= 1000000000.0 - 0.5) { divide *= 10; exponent++; diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 76babfc..aa07dee 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3272,7 +3272,9 @@ void testFloatVerbosePrinting(void) //Double TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.10046949999999999); TEST_ASSERT_EQUAL_PRINT_FLOATING("4294967295.999999", 4294967295.999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967295.9999995); TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967296.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 9999999995.0); TEST_ASSERT_EQUAL_PRINT_FLOATING("7.0e+100", 7.0e+100); TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.7976931348623157e308*10.0); From 54fe786fae055e36082410fd0bebba7578df4c39 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 9 Nov 2016 23:07:31 -0600 Subject: [PATCH 017/157] Round ties to even by default, many C libraries follow this Linux gcc & clang and OSX clang produce output with ties round to even Windows mingw gcc does not Example 0.0078125 prints '0.007812' --- src/unity.c | 5 +++++ test/tests/testunity.c | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/unity.c b/src/unity.c index c282873..2cf327f 100644 --- a/src/unity.c +++ b/src/unity.c @@ -262,6 +262,9 @@ static void UnityPrintDecimalAndNumberWithLeadingZeros(_US32 fraction_part, _US3 if (fraction_part == 0) break; /* Truncate trailing 0's */ } } +#define ROUND_TIES_TO_EVEN(num_int, num) \ + if ((num_int & 1) == 1 && num_int > (num)) /* Odd and was rounded up */ \ + if ((num) - (_US32)(num) <= 0.5) num_int -= 1 /* and remainder was 0.5, a tie */ /* * char buffer[19]; @@ -288,6 +291,7 @@ void UnityPrintFloat(_UD number) _UU32 integer_part = (_UU32)number; _US32 fraction_part = (_US32)((number - integer_part)*1000000.0 + 0.5); /* Double precision calculation gives best performance for six rounded decimal places */ + ROUND_TIES_TO_EVEN(fraction_part, (number - integer_part)*1000000.0); if (fraction_part == 1000000) { @@ -312,6 +316,7 @@ void UnityPrintFloat(_UD number) } integer_part = (_US32)(number / divide + 0.5); /* Double precision calculation required for float, to produce 9 rounded digits */ + ROUND_TIES_TO_EVEN(integer_part, number / divide); UNITY_OUTPUT_CHAR('0' + integer_part / divisor); UnityPrintDecimalAndNumberWithLeadingZeros(integer_part % divisor, divisor / 10); diff --git a/test/tests/testunity.c b/test/tests/testunity.c index aa07dee..b08d7de 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3243,6 +3243,8 @@ void testFloatVerbosePrinting(void) float smallest = 0.0000005f; *(int*)&smallest += 1; TEST_ASSERT_EQUAL_PRINT_FLOATING("0.000001", smallest); + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.007812", 0.0078125f); /*not if ties round away from 0*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.976562", 0.9765625f); /*not if ties round away from 0*/ TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.100469499f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0", 0.9999995f); /*Rounding to int place*/ TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0", 1.0f); @@ -3259,6 +3261,7 @@ void testFloatVerbosePrinting(void) TEST_ASSERT_EQUAL_PRINT_FLOATING("8.3099991e+09", 8309999104.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 1.0e+10f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000000.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00005499e+10", 1.000055e+10f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.10000006e+38", 1.10000005e+38f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.63529943e+10", 1.63529943e+10f); @@ -3275,6 +3278,9 @@ void testFloatVerbosePrinting(void) TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967295.9999995); TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967296.0); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 9999999995.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000050.0); /*not if ties round away from 0*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719924e+15", 9007199245000000.0); /*not if ties round away from 0*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719925e+15", 9007199254740990.0); TEST_ASSERT_EQUAL_PRINT_FLOATING("7.0e+100", 7.0e+100); TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.7976931348623157e308*10.0); From 47f6a85b8c502dabbeb2b5c8381d59a1efad1d89 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sun, 13 Nov 2016 23:47:16 -0600 Subject: [PATCH 018/157] Make UnityPrintFloat on by default Remove UNITY_FLOAT_VERBOSE entirely, add option UNITY_EXCLUDE_FLOAT_PRINT Remove some questionable float casts from doubles Default to Round Ties to Even behavior, add option to Round Ties Away from Zero --- src/unity.c | 29 +++++++++++++++++------------ src/unity.h | 4 +--- src/unity_internals.h | 16 +++------------- test/tests/testunity.c | 8 +++++--- 4 files changed, 26 insertions(+), 31 deletions(-) diff --git a/src/unity.c b/src/unity.c index 2cf327f..0dad740 100644 --- a/src/unity.c +++ b/src/unity.c @@ -250,7 +250,7 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number) } /*-----------------------------------------------*/ -#ifdef UNITY_FLOAT_VERBOSE +#ifndef UNITY_EXCLUDE_FLOAT_PRINT static void UnityPrintDecimalAndNumberWithLeadingZeros(_US32 fraction_part, _US32 divisor) { UNITY_OUTPUT_CHAR('.'); @@ -262,9 +262,13 @@ static void UnityPrintDecimalAndNumberWithLeadingZeros(_US32 fraction_part, _US3 if (fraction_part == 0) break; /* Truncate trailing 0's */ } } -#define ROUND_TIES_TO_EVEN(num_int, num) \ +#ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO + #define ROUND_TIES_TO_EVEN(num_int, num) \ if ((num_int & 1) == 1 && num_int > (num)) /* Odd and was rounded up */ \ if ((num) - (_US32)(num) <= 0.5) num_int -= 1 /* and remainder was 0.5, a tie */ +#else + #define ROUND_TIES_TO_EVEN(num_int, num) +#endif /* * char buffer[19]; @@ -326,7 +330,7 @@ void UnityPrintFloat(_UD number) UnityPrintNumber(exponent); } } -#endif /* UNITY_FLOAT_VERBOSE */ +#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ /*-----------------------------------------------*/ @@ -691,6 +695,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, #endif #ifndef UNITY_EXCLUDE_FLOAT + static int UnityFloatsWithin(_UF delta, _UF expected, _UF actual) { _UF diff; @@ -753,7 +758,7 @@ void UnityAssertFloatsWithin(const _UF delta, if (!UnityFloatsWithin(delta, expected, actual)) { UnityTestResultsFailBegin(lineNumber); -#ifdef UNITY_FLOAT_VERBOSE +#ifndef UNITY_EXCLUDE_FLOAT_PRINT UnityPrint(UnityStrExpected); UnityPrintFloat(expected); UnityPrint(UnityStrWas); @@ -818,7 +823,7 @@ void UnityAssertFloatSpecial(const _UF actual, UnityPrint(UnityStrNot); UnityPrint(trait_names[trait_index]); UnityPrint(UnityStrWas); -#ifdef UNITY_FLOAT_VERBOSE +#ifndef UNITY_EXCLUDE_FLOAT_PRINT UnityPrintFloat(actual); #else if (should_be_trait) @@ -867,11 +872,11 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); -#ifdef UNITY_DOUBLE_VERBOSE +#ifndef UNITY_EXCLUDE_FLOAT_PRINT UnityPrint(UnityStrExpected); - UnityPrintFloat((float)(*ptr_expected)); + UnityPrintFloat(*ptr_expected); UnityPrint(UnityStrWas); - UnityPrintFloat((float)(*ptr_actual)); + UnityPrintFloat(*ptr_actual); #else UnityPrint(UnityStrDelta); #endif @@ -895,11 +900,11 @@ void UnityAssertDoublesWithin(const _UD delta, if (!UnityDoublesWithin(delta, expected, actual)) { UnityTestResultsFailBegin(lineNumber); -#ifdef UNITY_DOUBLE_VERBOSE +#ifndef UNITY_EXCLUDE_FLOAT_PRINT UnityPrint(UnityStrExpected); - UnityPrintFloat((float)expected); + UnityPrintFloat(expected); UnityPrint(UnityStrWas); - UnityPrintFloat((float)actual); + UnityPrintFloat(actual); #else UnityPrint(UnityStrDelta); #endif @@ -961,7 +966,7 @@ void UnityAssertDoubleSpecial(const _UD actual, UnityPrint(UnityStrNot); UnityPrint(trait_names[trait_index]); UnityPrint(UnityStrWas); -#ifdef UNITY_DOUBLE_VERBOSE +#ifndef UNITY_EXCLUDE_FLOAT_PRINT UnityPrintFloat(actual); #else if (should_be_trait) diff --git a/src/unity.h b/src/unity.h index 031ccc9..97681ad 100644 --- a/src/unity.h +++ b/src/unity.h @@ -37,13 +37,11 @@ void tearDown(void); * - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons * - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT * - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats - * - define UNITY_FLOAT_VERBOSE to print floating point values in errors (uses sprintf) * - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons * - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default) * - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE * - define UNITY_DOUBLE_TYPE to specify something other than double - * - define UNITY_DOUBLE_VERBOSE to print floating point values in errors (uses sprintf) - * - define UNITY_VERBOSE_NUMBER_MAX_LENGTH to change maximum length of printed numbers (used by sprintf) + * - define UNITY_EXCLUDE_FLOAT_PRINT to trim binary size, won't print floating point values in errors * Output * - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired diff --git a/src/unity_internals.h b/src/unity_internals.h index 8ccd66d..673150e 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -171,7 +171,6 @@ #undef UNITY_INCLUDE_FLOAT #undef UNITY_FLOAT_PRECISION #undef UNITY_FLOAT_TYPE -#undef UNITY_FLOAT_VERBOSE #else @@ -225,16 +224,13 @@ typedef UNITY_FLOAT_TYPE _UF; /* No Floating Point Support */ #undef UNITY_DOUBLE_PRECISION #undef UNITY_DOUBLE_TYPE - #undef UNITY_DOUBLE_VERBOSE #ifdef UNITY_INCLUDE_DOUBLE #undef UNITY_INCLUDE_DOUBLE #endif - #ifdef UNITY_FLOAT_VERBOSE - typedef _UF _UD; - /* For parameter in UnityPrintFloat, double promotion required */ - #endif + typedef _UF _UD; + /* For parameter in UnityPrintFloat(_UD), which aliases to double or float */ #else @@ -250,12 +246,6 @@ typedef UNITY_FLOAT_TYPE _UF; #endif -#ifdef UNITY_DOUBLE_VERBOSE -#ifndef UNITY_FLOAT_VERBOSE -#define UNITY_FLOAT_VERBOSE -#endif -#endif - /*------------------------------------------------------- * Output Method: stdout (DEFAULT) *-------------------------------------------------------*/ @@ -443,7 +433,7 @@ void UnityPrintNumber(const _U_SINT number); void UnityPrintNumberUnsigned(const _U_UINT number); void UnityPrintNumberHex(const _U_UINT number, const char nibbles); -#ifdef UNITY_FLOAT_VERBOSE +#ifndef UNITY_EXCLUDE_FLOAT_PRINT void UnityPrintFloat(const _UD number); #endif diff --git a/test/tests/testunity.c b/test/tests/testunity.c index b08d7de..08289da 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -2285,10 +2285,14 @@ void testFailureCountIncrementsAndIsReturnedAtEnd(void) void testCstringsEscapeSequence(void) { +#ifndef USING_OUTPUT_SPY + TEST_IGNORE(); +#else startPutcharSpy(); UnityPrint("\x16\x10"); endPutcharSpy(); TEST_ASSERT_EQUAL_STRING("\\x16\\x10", getBufferPutcharSpy()); +#endif } #define TEST_ASSERT_EQUAL_PRINT_NUMBERS(expected, actual) { \ @@ -3228,16 +3232,14 @@ void testNotEqualFloatArraysLengthZero(void) #endif } -#ifdef UNITY_FLOAT_VERBOSE #define TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, actual) { \ startPutcharSpy(); UnityPrintFloat((actual)); endPutcharSpy(); \ TEST_ASSERT_EQUAL_STRING((expected), getBufferPutcharSpy()); \ } -#endif void testFloatVerbosePrinting(void) { -#ifdef UNITY_FLOAT_VERBOSE +#if !defined(UNITY_EXCLUDE_FLOAT_PRINT) && defined(USING_OUTPUT_SPY) TEST_ASSERT_EQUAL_PRINT_FLOATING("0.0", 0.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("0.000000...", 0.000000499f); float smallest = 0.0000005f; From 9f4b1a332f28f1369f901abb373b6dfc3db10520 Mon Sep 17 00:00:00 2001 From: jsalling Date: Mon, 14 Nov 2016 23:10:18 -0600 Subject: [PATCH 019/157] Tests for Printing Floating Point numbers --- src/unity.c | 2 +- test/tests/testunity.c | 97 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/src/unity.c b/src/unity.c index 0dad740..48f0be3 100644 --- a/src/unity.c +++ b/src/unity.c @@ -297,7 +297,7 @@ void UnityPrintFloat(_UD number) /* Double precision calculation gives best performance for six rounded decimal places */ ROUND_TIES_TO_EVEN(fraction_part, (number - integer_part)*1000000.0); - if (fraction_part == 1000000) + if (fraction_part == 1000000) /* Carry across the decimal point */ { fraction_part = 0; integer_part += 1; diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 08289da..9a0f714 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -7,6 +7,7 @@ #include "unity.h" #include #include +#include // Dividing by these constants produces +/- infinity. // The rationale is given in UnityAssertFloatIsInf's body. @@ -2237,7 +2238,7 @@ void testIgnoredAndThenFailInTearDown(void) #endif #ifdef USING_OUTPUT_SPY -#include +int putchar(int); #define SPY_BUFFER_MAX 40 static char putcharSpyBuffer[SPY_BUFFER_MAX]; #endif @@ -3237,16 +3238,14 @@ void testNotEqualFloatArraysLengthZero(void) TEST_ASSERT_EQUAL_STRING((expected), getBufferPutcharSpy()); \ } -void testFloatVerbosePrinting(void) +void testFloatPrinting(void) { -#if !defined(UNITY_EXCLUDE_FLOAT_PRINT) && defined(USING_OUTPUT_SPY) +#if defined(UNITY_EXCLUDE_FLOAT_PRINT) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else TEST_ASSERT_EQUAL_PRINT_FLOATING("0.0", 0.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("0.000000...", 0.000000499f); - float smallest = 0.0000005f; - *(int*)&smallest += 1; - TEST_ASSERT_EQUAL_PRINT_FLOATING("0.000001", smallest); - TEST_ASSERT_EQUAL_PRINT_FLOATING("0.007812", 0.0078125f); /*not if ties round away from 0*/ - TEST_ASSERT_EQUAL_PRINT_FLOATING("0.976562", 0.9765625f); /*not if ties round away from 0*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.000001", 0.00000050000005f); TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.100469499f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0", 0.9999995f); /*Rounding to int place*/ TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0", 1.0f); @@ -3257,37 +3256,109 @@ void testFloatVerbosePrinting(void) TEST_ASSERT_EQUAL_PRINT_FLOATING("16.000006", 16.000006f); TEST_ASSERT_EQUAL_PRINT_FLOATING("4294967040.0", 4294967040.0f); /*Last full print integer*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.0", -0.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.000000...",-0.000000499f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.000001", -0.00000050000005f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.100469", -0.100469499f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-1.0", -0.9999995f); /*Rounding to int place*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("-1.0", -1.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-1.25", -1.25f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-7.999999", -7.999999f); /*Not rounding*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.000002", -16.000002f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.000004", -16.000004f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.000006", -16.000006f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-4294967040.0",-4294967040.0f); /*Last full print integer*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967296.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("5.0e+09", 5000000000.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("8.0e+09", 8.0e+09f); TEST_ASSERT_EQUAL_PRINT_FLOATING("8.3099991e+09", 8309999104.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 1.0e+10f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000000.0f); - TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00005499e+10", 1.000055e+10f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.10000006e+38", 1.10000005e+38f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.63529943e+10", 1.63529943e+10f); TEST_ASSERT_EQUAL_PRINT_FLOATING("3.40282347e+38", 3.40282346638e38f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-1.0e+10", -1.0e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-3.40282347e+38",-3.40282346638e38f); +#endif +} + +void testFloatPrintingRoundTiesToEven(void) +{ +#if defined(UNITY_EXCLUDE_FLOAT) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else + #ifdef UNITY_ROUND_TIES_AWAY_FROM_ZERO + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.007813", 0.0078125f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.976563", 0.9765625f); + #else /* Default to Round ties to even */ + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.007182", 0.0071825f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.976562", 0.9765625f); + #endif +#endif +} + +void testFloatPrintingInfinityAndNaN(void) +{ +#if defined(UNITY_EXCLUDE_FLOAT) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 3.40282346638e38f*2.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0f / f_zero); TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -3.40282346638e38f*2.0f); - TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -3.40282346638e38f*2.0f * f_zero); - //Double + TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -3.40282346638e38f*2.0f * f_zero); +#endif +} + +void testDoublePrinting(void) +{ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.10046949999999999); TEST_ASSERT_EQUAL_PRINT_FLOATING("4294967295.999999", 4294967295.999999); TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967295.9999995); TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967296.0); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 9999999995.0); - TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000050.0); /*not if ties round away from 0*/ - TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719924e+15", 9007199245000000.0); /*not if ties round away from 0*/ TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719925e+15", 9007199254740990.0); TEST_ASSERT_EQUAL_PRINT_FLOATING("7.0e+100", 7.0e+100); + TEST_ASSERT_EQUAL_PRINT_FLOATING("3.0e+200", 3.0e+200); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.23456789e+300", 9.23456789e+300); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.100469", -0.10046949999999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-4294967295.999999", -4294967295.999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-4.2949673e+09", -4294967295.9999995); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-7.0e+100", -7.0e+100); +#endif +} + +void testDoublePrintingRoundTiesToEven(void) +{ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else + #ifdef UNITY_ROUND_TIES_AWAY_FROM_ZERO + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00000001e+10", 10000000050.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719925e+15", 9007199245000000.0); + #else /* Default to Round ties to even */ + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000050.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719924e+15", 9007199245000000.0); + #endif +#endif +} + +void testDoublePrintingInfinityAndNaN(void) +{ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.7976931348623157e308*10.0); TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0 / d_zero); TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.7976931348623157e308*10.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -1.7976931348623157e308*10.0 * d_zero); #endif } From 25f641735155dfb702aa7517349a095616f6dfda Mon Sep 17 00:00:00 2001 From: jsalling Date: Mon, 14 Nov 2016 23:28:38 -0600 Subject: [PATCH 020/157] Refactor repeated code to print float expected and actual Move double tests down in the file --- src/unity.c | 49 +++++++------------- test/tests/testunity.c | 100 ++++++++++++++++++++--------------------- 2 files changed, 67 insertions(+), 82 deletions(-) diff --git a/src/unity.c b/src/unity.c index 48f0be3..6313cd5 100644 --- a/src/unity.c +++ b/src/unity.c @@ -694,6 +694,19 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, #define UNITY_NAN_CHECK 0 #endif +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ + do { \ + UnityPrint(UnityStrExpected); \ + UnityPrintFloat(expected); \ + UnityPrint(UnityStrWas); \ + UnityPrintFloat(actual); \ + } while(0) +#else + #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ + UnityPrint(UnityStrDelta) +#endif /* UNITY_EXCLUDE_FLOAT_PRINT */ + #ifndef UNITY_EXCLUDE_FLOAT static int UnityFloatsWithin(_UF delta, _UF expected, _UF actual) @@ -729,14 +742,7 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); -#ifdef UNITY_FLOAT_VERBOSE - UnityPrint(UnityStrExpected); - UnityPrintFloat(*ptr_expected); - UnityPrint(UnityStrWas); - UnityPrintFloat(*ptr_actual); -#else - UnityPrint(UnityStrDelta); -#endif + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } @@ -758,14 +764,7 @@ void UnityAssertFloatsWithin(const _UF delta, if (!UnityFloatsWithin(delta, expected, actual)) { UnityTestResultsFailBegin(lineNumber); -#ifndef UNITY_EXCLUDE_FLOAT_PRINT - UnityPrint(UnityStrExpected); - UnityPrintFloat(expected); - UnityPrint(UnityStrWas); - UnityPrintFloat(actual); -#else - UnityPrint(UnityStrDelta); -#endif + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } @@ -872,14 +871,7 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); -#ifndef UNITY_EXCLUDE_FLOAT_PRINT - UnityPrint(UnityStrExpected); - UnityPrintFloat(*ptr_expected); - UnityPrint(UnityStrWas); - UnityPrintFloat(*ptr_actual); -#else - UnityPrint(UnityStrDelta); -#endif + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } @@ -900,14 +892,7 @@ void UnityAssertDoublesWithin(const _UD delta, if (!UnityDoublesWithin(delta, expected, actual)) { UnityTestResultsFailBegin(lineNumber); -#ifndef UNITY_EXCLUDE_FLOAT_PRINT - UnityPrint(UnityStrExpected); - UnityPrintFloat(expected); - UnityPrint(UnityStrWas); - UnityPrintFloat(actual); -#else - UnityPrint(UnityStrDelta); -#endif + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 9a0f714..b9f6fdc 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3313,56 +3313,6 @@ void testFloatPrintingInfinityAndNaN(void) #endif } -void testDoublePrinting(void) -{ -#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) - TEST_IGNORE(); -#else - TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.10046949999999999); - TEST_ASSERT_EQUAL_PRINT_FLOATING("4294967295.999999", 4294967295.999999); - TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967295.9999995); - TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967296.0); - TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 9999999995.0); - TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719925e+15", 9007199254740990.0); - TEST_ASSERT_EQUAL_PRINT_FLOATING("7.0e+100", 7.0e+100); - TEST_ASSERT_EQUAL_PRINT_FLOATING("3.0e+200", 3.0e+200); - TEST_ASSERT_EQUAL_PRINT_FLOATING("9.23456789e+300", 9.23456789e+300); - - TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.100469", -0.10046949999999999); - TEST_ASSERT_EQUAL_PRINT_FLOATING("-4294967295.999999", -4294967295.999999); - TEST_ASSERT_EQUAL_PRINT_FLOATING("-4.2949673e+09", -4294967295.9999995); - TEST_ASSERT_EQUAL_PRINT_FLOATING("-7.0e+100", -7.0e+100); -#endif -} - -void testDoublePrintingRoundTiesToEven(void) -{ -#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) - TEST_IGNORE(); -#else - #ifdef UNITY_ROUND_TIES_AWAY_FROM_ZERO - TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00000001e+10", 10000000050.0); - TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719925e+15", 9007199245000000.0); - #else /* Default to Round ties to even */ - TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000050.0); - TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719924e+15", 9007199245000000.0); - #endif -#endif -} - -void testDoublePrintingInfinityAndNaN(void) -{ -#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) - TEST_IGNORE(); -#else - TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.7976931348623157e308*10.0); - TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0 / d_zero); - TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.7976931348623157e308*10.0); - - TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -1.7976931348623157e308*10.0 * d_zero); -#endif -} - // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES DOUBLE SUPPORT ================== void testDoublesWithinDelta(void) @@ -3886,6 +3836,56 @@ void testNotEqualDoubleArraysLengthZero(void) #endif } +void testDoublePrinting(void) +{ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.10046949999999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4294967295.999999", 4294967295.999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967295.9999995); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.2949673e+09", 4294967296.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 9999999995.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719925e+15", 9007199254740990.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("7.0e+100", 7.0e+100); + TEST_ASSERT_EQUAL_PRINT_FLOATING("3.0e+200", 3.0e+200); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.23456789e+300", 9.23456789e+300); + + TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.100469", -0.10046949999999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-4294967295.999999", -4294967295.999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-4.2949673e+09", -4294967295.9999995); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-7.0e+100", -7.0e+100); +#endif +} + +void testDoublePrintingRoundTiesToEven(void) +{ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else + #ifdef UNITY_ROUND_TIES_AWAY_FROM_ZERO + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00000001e+10", 10000000050.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719925e+15", 9007199245000000.0); + #else /* Default to Round ties to even */ + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000050.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.00719924e+15", 9007199245000000.0); + #endif +#endif +} + +void testDoublePrintingInfinityAndNaN(void) +{ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else + TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.7976931348623157e308*10.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0 / d_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.7976931348623157e308*10.0); + + TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -1.7976931348623157e308*10.0 * d_zero); +#endif +} + // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES DETAIL SUPPORT ================== void testThatDetailsCanBeHandleOneDetail(void) From aa4d773df28faf64f1d2964639abc7b510857346 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 16 Nov 2016 19:56:17 -0600 Subject: [PATCH 021/157] Tests for Printing All float values Takes about 10 minutes to run all floats, so split into 3 tests for parallel running later. This was useful during development for finding hard corner cases and getting the routine to high quality. Off by default. Note that all floats 16.0 and up can be represented uniquely (in this format) and will round-trip back to the exact same float with sscanf(). This property is true for UnityPrintFloat, despite a few rounding error cases, it will produce output identity. Better comments and refactor on round ties to even Add upper threshold value on round to even feature since numerical precision issues start to give approximations when dividing one large double by another. When tested on float values, using 1e22 gave the fewest rounding errors. Fix warnings from gcc. Some float constants do not behave well in existing tests. Add casts where conversions could be imprecise. --- src/unity.c | 35 ++++++----- test/tests/testunity.c | 129 +++++++++++++++++++++++++++++++++++------ 2 files changed, 132 insertions(+), 32 deletions(-) diff --git a/src/unity.c b/src/unity.c index 6313cd5..aceedb5 100644 --- a/src/unity.c +++ b/src/unity.c @@ -263,20 +263,27 @@ static void UnityPrintDecimalAndNumberWithLeadingZeros(_US32 fraction_part, _US3 } } #ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO - #define ROUND_TIES_TO_EVEN(num_int, num) \ - if ((num_int & 1) == 1 && num_int > (num)) /* Odd and was rounded up */ \ - if ((num) - (_US32)(num) <= 0.5) num_int -= 1 /* and remainder was 0.5, a tie */ +/* If rounds up && remainder 0.5 && result odd && below cutoff for double precision issues */ + #define ROUND_TIES_TO_EVEN(orig, num_int, num) \ + if (num_int > (num) && (num) - (num_int-1) <= 0.5 && (num_int & 1) == 1 && orig < 1e22) \ + num_int -= 1 /* => a tie to round down to even */ #else - #define ROUND_TIES_TO_EVEN(num_int, num) + #define ROUND_TIES_TO_EVEN(orig, num_int, num) /* Remove macro */ #endif -/* - * char buffer[19]; - * if (number > 4294967296.0 || -number > 4294967296.0) - * snprintf(buffer, sizeof buffer, "%.8e", number); - * else - * snprintf(buffer, sizeof buffer, "%.6f", number); - * UnityPrint(buffer); +/* Printing floating point numbers is hard. Some goals of this implementation: works for embedded + * systems, floats or doubles, and has a reasonable format. The key paper in this area, + * 'How to Print Floating-Point Numbers Accurately' by Steele & White, shows an approximation by + * scaling called Dragon 2. This code uses a similar idea. The other core algorithm uses casts and + * floating subtraction to give exact remainders after the decimal, to be scaled into an integer. + * Extra trailing 0's are excluded. The output defaults to rounding to nearest, ties to even. You + * can enable rounding ties away from zero. Note: the _UD parameter can typedef to float or double. + + * The old version required compiling in snprintf. For reference, with a similar format as now: + * char buf[19]; + * if (number > 4294967296.0 || -number > 4294967296.0) snprintf(buf, sizeof buf, "%.8e", number); + * else snprintf(buf, sizeof buf, "%.6f", number); + * UnityPrint(buf); */ void UnityPrintFloat(_UD number) { @@ -293,9 +300,9 @@ void UnityPrintFloat(_UD number) { const _US32 divisor = (1000000/10); _UU32 integer_part = (_UU32)number; - _US32 fraction_part = (_US32)((number - integer_part)*1000000.0 + 0.5); + _US32 fraction_part = (_US32)((number - (_UD)integer_part)*1000000.0 + 0.5); /* Double precision calculation gives best performance for six rounded decimal places */ - ROUND_TIES_TO_EVEN(fraction_part, (number - integer_part)*1000000.0); + ROUND_TIES_TO_EVEN(number, fraction_part, (number - (_UD)integer_part)*1000000.0); if (fraction_part == 1000000) /* Carry across the decimal point */ { @@ -320,7 +327,7 @@ void UnityPrintFloat(_UD number) } integer_part = (_US32)(number / divide + 0.5); /* Double precision calculation required for float, to produce 9 rounded digits */ - ROUND_TIES_TO_EVEN(integer_part, number / divide); + ROUND_TIES_TO_EVEN(number, integer_part, number / divide); UNITY_OUTPUT_CHAR('0' + integer_part / divisor); UnityPrintDecimalAndNumberWithLeadingZeros(integer_part % divisor, divisor / 10); diff --git a/test/tests/testunity.c b/test/tests/testunity.c index b9f6fdc..c52af67 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -5,7 +5,6 @@ ========================================== */ #include "unity.h" -#include #include #include @@ -61,19 +60,20 @@ static int SetToOneMeanWeAlreadyCheckedThisGuy; void setUp(void) { - SetToOneToFailInTearDown = 0; - SetToOneMeanWeAlreadyCheckedThisGuy = 0; + SetToOneToFailInTearDown = 0; + SetToOneMeanWeAlreadyCheckedThisGuy = 0; } void tearDown(void) { - if (SetToOneToFailInTearDown == 1) - TEST_FAIL_MESSAGE("<= Failed in tearDown"); - if ((SetToOneMeanWeAlreadyCheckedThisGuy == 0) && (Unity.CurrentTestFailed > 0)) - { - UnityPrint(": [[[[ Test Should Have Passed But Did Not ]]]]"); - UNITY_OUTPUT_CHAR('\n'); - } + endPutcharSpy(); /* Stop suppressing test output */ + if (SetToOneToFailInTearDown == 1) + TEST_FAIL_MESSAGE("<= Failed in tearDown"); + if ((SetToOneMeanWeAlreadyCheckedThisGuy == 0) && (Unity.CurrentTestFailed > 0)) + { + UnityPrint(": [[[[ Test Should Have Passed But Did Not ]]]]"); + UNITY_OUTPUT_CHAR('\n'); + } } void testUnitySizeInitializationReminder(void) @@ -2238,7 +2238,7 @@ void testIgnoredAndThenFailInTearDown(void) #endif #ifdef USING_OUTPUT_SPY -int putchar(int); +#include #define SPY_BUFFER_MAX 40 static char putcharSpyBuffer[SPY_BUFFER_MAX]; #endif @@ -2267,7 +2267,7 @@ void putcharSpy(int c) if (indexSpyBuffer < SPY_BUFFER_MAX - 1) putcharSpyBuffer[indexSpyBuffer++] = (char)c; } else - c = putchar(c); + putchar((char)c); #endif } @@ -3305,11 +3305,105 @@ void testFloatPrintingInfinityAndNaN(void) #if defined(UNITY_EXCLUDE_FLOAT) || !defined(USING_OUTPUT_SPY) TEST_IGNORE(); #else - TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 3.40282346638e38f*2.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0f / f_zero); - TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -3.40282346638e38f*2.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.0f / f_zero); - TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -3.40282346638e38f*2.0f * f_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", 0.0f / f_zero); +#endif +} + +#if defined(UNITY_TEST_ALL_FLOATS_PRINT_OK) && defined(USING_OUTPUT_SPY) +static void AllFloatPrinting_LessThan32Bits(void) +{ + char expected[18]; + union { float f_value; int32_t int_value; } u; + /* Float representations are laid out in integer order, walk up the list */ + for (u.f_value = 0.00000050000005f; u.f_value <= 4294967040.0f; u.int_value += 1) + { + startPutcharSpy(); + + UnityPrintFloat(u.f_value); /*1.5x as fast as sprintf 5e-7f - 0.01f, 20s vs 30s*/ + int len = sprintf(expected, "%.6f", u.f_value); + + while (expected[len - 1] == '0' && expected[len - 2] != '.') { len--; } + expected[len] = '\0'; /* delete trailing 0's */ + + if (strcmp(expected, getBufferPutcharSpy()) != 0) + { + double six_digits = ((double)u.f_value - (uint32_t)u.f_value)*1000000.0; + /* Not a tie (remainder != 0.5) => Can't explain the different strings */ + if (six_digits - (uint32_t)six_digits != 0.5) + { + /* Fail with diagnostic printing */ + TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, u.f_value); + } + } + } +} + +/* Compared to perfect, floats are occasionally rounded wrong. It doesn't affect + * correctness, though. Two examples (of 13 total found during testing): + * Printed: 6.19256349e+20, Exact: 619256348499999981568.0f <= Eliminated by ROUND_TIES_TO_EVEN + * Printed: 2.19012272e+35, Exact: 219012271499999993621766990196637696.0f */ +static void AllFloatPrinting_Larger(const float start, const float end) +{ + unsigned int wrong = 0; + char expected[18]; + union { float f_value; int32_t int_value; } u; + for (u.f_value = start; u.f_value <= end; u.int_value += 1) + { + startPutcharSpy(); + + UnityPrintFloat(u.f_value); /*Twice as fast as sprintf 2**32-1e12, 10s vs 21s*/ + sprintf(expected, "%.8e", u.f_value); + + int len = 11 - 1; /* 11th char is 'e' in exponential format */ + while (expected[len - 1] == '0' && expected[len - 2] != '.') { len --; } + if (expected[14] != '\0') memmove(&expected[12], &expected[13], 3); /* Two char exponent */ + memmove(&expected[len], &expected[11 - 1], sizeof "e+09"); /* 5 char length */ + + if (strcmp(expected, getBufferPutcharSpy()) != 0) + { + wrong++; + /* endPutcharSpy(); UnityPrint("Expected "); UnityPrint(expected); + UnityPrint(" Was "); UnityPrint(getBufferPutcharSpy()); UNITY_OUTPUT_CHAR('\n'); */ + + if (wrong > 10 || (wrong > 3 && end <= 1e25f)) + TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, u.f_value); + /* Empirical values from the current routine, don't be worse when making changes */ + } + } +} +#endif + +/* Exhaustive testing of all float values we differentiate when printing. Doubles + * are not explored here -- too many. These tests confirm that the routine works + * for all floats > 5e-7, positives only. Off by default due to test time. + * Compares Unity's routine to your sprintf() C lib, tested to pass on 3 platforms. + * Part1 takes a long time, around 3 minutes compiled with -O2 + * Runs through all floats from 0.000001 - 2**32, ~300 million values */ +void testAllFloatPrintingPart1_LessThan32Bits(void) +{ +#if defined(UNITY_TEST_ALL_FLOATS_PRINT_OK) && defined(USING_OUTPUT_SPY) + AllFloatPrinting_LessThan32Bits(); +#else + TEST_IGNORE(); /* Ignore one of three */ +#endif +} + +/* Test takes a long time, around 3.5 minutes compiled with -O2, try ~500 million values */ +void testAllFloatPrintingPart2_Larger(void) +{ +#if defined(UNITY_TEST_ALL_FLOATS_PRINT_OK) && defined(USING_OUTPUT_SPY) + AllFloatPrinting_Larger(4294967296.0f, 1e25f); +#endif +} + +/* Test takes a long time, around 3.5 minutes compiled with -O2, try ~500 million values */ +void testAllFloatPrintingPart3_LargerStill(void) +{ +#if defined(UNITY_TEST_ALL_FLOATS_PRINT_OK) && defined(USING_OUTPUT_SPY) + AllFloatPrinting_Larger(1e25f, 3.40282347e+38f); #endif } @@ -3878,11 +3972,10 @@ void testDoublePrintingInfinityAndNaN(void) #if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) TEST_IGNORE(); #else - TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.7976931348623157e308*10.0); TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0 / d_zero); - TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.7976931348623157e308*10.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.0 / d_zero); - TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", -1.7976931348623157e308*10.0 * d_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", 0.0 / d_zero); #endif } From 4e2f0381ccd5aa231167a168e9ba98fa00d34730 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 21 Nov 2016 15:19:16 -0500 Subject: [PATCH 022/157] Add ability to inject correct mock prefix --- auto/generate_module.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 43f5b0d..e68aa72 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -96,6 +96,7 @@ class UnityModuleGenerator :update_svn => false, :boilerplates => {}, :test_prefix => 'Test', + :mock_prefix => 'Mock', } end @@ -136,7 +137,7 @@ class UnityModuleGenerator :includes => case(triad[:inc]) when :src then @options[:includes][:src] | pattern_traits[:inc].map{|f| f % [module_name]} when :inc then @options[:includes][:inc] - when :tst then @options[:includes][:tst] | pattern_traits[:inc].map{|f| "Mock#{f}"% [module_name]} + when :tst then @options[:includes][:tst] | pattern_traits[:inc].map{|f| "#{@options[:mock_prefix]}#{f}"% [module_name]} end } end From 4386cf356f174a3b6ca23789f86e3decfdadc3bd Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 22 Nov 2016 14:24:24 -0500 Subject: [PATCH 023/157] Added to Module Generator: - configurable case. - better passing of includes and boilerplate information - test only pattern - optional naming conventions for case --- auto/generate_module.rb | 95 ++++++++++++++++++++++++++++------------- 1 file changed, 66 insertions(+), 29 deletions(-) diff --git a/auto/generate_module.rb b/auto/generate_module.rb index e68aa72..870c87c 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -35,7 +35,8 @@ TEMPLATE_SRC ||= %q[%2$s#include "%1$s.h" #TEMPLATE_INC TEMPLATE_INC ||= %q[#ifndef _%3$s_H -#define _%3$s_H%2$s +#define _%3$s_H +%2$s #endif // _%3$s_H ] @@ -65,19 +66,20 @@ class UnityModuleGenerator #Built in patterns @patterns = { 'src' => {'' => { :inc => [] } }, - 'dh' => {'Driver' => { :inc => ['%1$sHardware.h'] }, + 'test'=> {'' => { :inc => [] } }, + 'dh' => {'Driver' => { :inc => [create_filename('%1$s','Hardware.h')] }, 'Hardware' => { :inc => [] } }, - 'dih' => {'Driver' => { :inc => ['%1$sHardware.h', '%1$sInterrupt.h'] }, - 'Interrupt'=> { :inc => ['%1$sHardware.h'] }, + 'dih' => {'Driver' => { :inc => [create_filename('%1$s','Hardware.h'), create_filename('%1$s','Interrupt.h')] }, + 'Interrupt'=> { :inc => [create_filename('%1$s','Hardware.h')] }, 'Hardware' => { :inc => [] } }, 'mch' => {'Model' => { :inc => [] }, - 'Conductor'=> { :inc => ['%1$sModel.h', '%1$sHardware.h'] }, + 'Conductor'=> { :inc => [create_filename('%1$s','Model.h'), create_filename('%1$s','Hardware.h')] }, 'Hardware' => { :inc => [] } }, 'mvp' => {'Model' => { :inc => [] }, - 'Presenter'=> { :inc => ['%1$sModel.h', '%1$sView.h'] }, + 'Presenter'=> { :inc => [create_filename('%1$s','Model.h'), create_filename('%1$s','View.h')] }, 'View' => { :inc => [] } } } @@ -122,22 +124,29 @@ class UnityModuleGenerator ] #prepare the pattern for use - patterns = @patterns[(pattern || @options[:pattern] || 'src').downcase] + pattern = (pattern || @options[:pattern] || 'src').downcase + patterns = @patterns[pattern] raise "ERROR: The design pattern '#{pattern}' specified isn't one that I recognize!" if patterns.nil? + #single file patterns (currently just 'test') can reject the other parts of the triad + if (pattern == 'test') + triad.reject!{|v| v[:inc] != :tst } + end + # Assemble the path/names of the files we need to work with. files = [] - triad.each do |triad| + triad.each do |cfg| patterns.each_pair do |pattern_file, pattern_traits| + submodule_name = create_filename(module_name, pattern_file) files << { - :path => "#{triad[:path]}#{module_name}#{pattern_file}#{triad[:ext]}", - :name => "#{module_name}#{pattern_file}", - :template => triad[:template], - :boilerplate => triad[:boilerplate], - :includes => case(triad[:inc]) - when :src then @options[:includes][:src] | pattern_traits[:inc].map{|f| f % [module_name]} - when :inc then @options[:includes][:inc] - when :tst then @options[:includes][:tst] | pattern_traits[:inc].map{|f| "#{@options[:mock_prefix]}#{f}"% [module_name]} + :path => "#{cfg[:path]}#{submodule_name}#{cfg[:ext]}", + :name => submodule_name, + :template => cfg[:template], + :boilerplate => cfg[:boilerplate], + :includes => case(cfg[:inc]) + when :src then (@options[:includes][:src] || []) | pattern_traits[:inc].map{|f| f % [module_name]} + when :inc then (@options[:includes][:inc] || []) + when :tst then (@options[:includes][:tst] || []) | pattern_traits[:inc].map{|f| "#{@options[:mock_prefix]}#{f}" % [module_name]} end } end @@ -146,6 +155,27 @@ class UnityModuleGenerator return files end + ############################ + def create_filename(part1, part2="") + if part2.empty? + case(@options[:naming]) + when 'bumpy' then part1 + when 'camel' then part1 + when 'snake' then part1.downcase + when 'caps' then part1.upcase + else part1.downcase + end + else + case(@options[:naming]) + when 'bumpy' then part1 + part2 + when 'camel' then part1 + part2 + when 'snake' then part1.downcase + "_" + part2.downcase + when 'caps' then part1.upcase + "_" + part2.upcase + else part1.downcase + "_" + part2.downcase + end + end + end + ############################ def generate(module_name, pattern=nil) @@ -159,7 +189,7 @@ class UnityModuleGenerator # Create Source Modules files.each_with_index do |file, i| File.open(file[:path], 'w') do |f| - f.write(file[:boilerplate] % [file[:name]]) unless file[:boilerplate].nil? + f.write("#{file[:boilerplate]}\n" % [file[:name]]) unless file[:boilerplate].nil? f.write(file[:template] % [ file[:name], file[:includes].map{|f| "#include \"#{f}\"\n"}.join, file[:name].upcase ] @@ -211,13 +241,14 @@ if ($0 == __FILE__) # Parse the command line parameters. ARGV.each do |arg| case(arg) - when /^-d/ then destroy = true - when /^-u/ then options[:update_svn] = true - when /^-p(\w+)/ then options[:pattern] = $1 - when /^-s(.+)/ then options[:path_src] = $1 - when /^-i(.+)/ then options[:path_inc] = $1 - when /^-t(.+)/ then options[:path_tst] = $1 - when /^-y(.+)/ then options = UnityModuleGenerator.grab_config($1) + when /^-d/ then destroy = true + when /^-u/ then options[:update_svn] = true + when /^-p\"?(\w+)\"?/ then options[:pattern] = $1 + when /^-s\"?(.+)\"?/ then options[:path_src] = $1 + when /^-i\"?(.+)\"?/ then options[:path_inc] = $1 + when /^-t\"?(.+)\"?/ then options[:path_tst] = $1 + when /^-n\"?(.+)\"?/ then options[:naming] = $1 + when /^-y\"?(.+)\"?/ then options = UnityModuleGenerator.grab_config($1) when /^(\w+)/ raise "ERROR: You can't have more than one Module name specified!" unless module_name.nil? module_name = arg @@ -235,12 +266,18 @@ if ($0 == __FILE__) " -s\"../src\" sets the path to output source to '../src' (DEFAULT ../src)", " -t\"C:/test\" sets the path to output source to 'C:/test' (DEFAULT ../test)", " -p\"MCH\" sets the output pattern to MCH.", - " dh - driver hardware.", - " dih - driver interrupt hardware.", - " mch - model conductor hardware.", - " mvp - model view presenter.", - " src - just a single source module. (DEFAULT)", + " dh - driver hardware.", + " dih - driver interrupt hardware.", + " mch - model conductor hardware.", + " mvp - model view presenter.", + " src - just a source module, header and test. (DEFAULT)", + " test - just a test file.", " -d destroy module instead of creating it.", + " -n\"camel\" sets the file naming convention.", + " bumpy - BumpyCaseFilenames.", + " camel - camelCaseFilenames.", + " snake - snake_case_filenames. (DEFAULT)", + " caps - CAPS_CASE_FILENAMES.", " -u update subversion too (requires subversion command line)", " -y\"my.yml\" selects a different yaml config file for module generation", "" ].join("\n") From 37049a3a20ec37b8cf6fc49ec824784e5b3ac3c9 Mon Sep 17 00:00:00 2001 From: Matt Chernosky Date: Mon, 28 Nov 2016 23:57:17 -0700 Subject: [PATCH 024/157] Fixed error when path provided with module name. --- auto/generate_module.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 870c87c..2ec14c5 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -10,6 +10,7 @@ require 'rubygems' require 'fileutils' +require 'pathname' #TEMPLATE_TST TEMPLATE_TST ||= %q[#include "unity.h" @@ -116,11 +117,15 @@ class UnityModuleGenerator ############################ def files_to_operate_on(module_name, pattern=nil) + #strip any leading path information from the module name and save for later + subfolder = File.dirname(module_name) + module_name = File.basename(module_name) + #create triad definition prefix = @options[:test_prefix] || 'Test' - triad = [ { :ext => '.c', :path => @options[:path_src], :template => TEMPLATE_SRC, :inc => :src, :boilerplate => @options[:boilerplates][:src] }, - { :ext => '.h', :path => @options[:path_inc], :template => TEMPLATE_INC, :inc => :inc, :boilerplate => @options[:boilerplates][:inc] }, - { :ext => '.c', :path => @options[:path_tst]+prefix, :template => TEMPLATE_TST, :inc => :tst, :boilerplate => @options[:boilerplates][:tst] }, + triad = [ { :ext => '.c', :path => @options[:path_src], :prefix => "", :template => TEMPLATE_SRC, :inc => :src, :boilerplate => @options[:boilerplates][:src] }, + { :ext => '.h', :path => @options[:path_inc], :prefix => "", :template => TEMPLATE_INC, :inc => :inc, :boilerplate => @options[:boilerplates][:inc] }, + { :ext => '.c', :path => @options[:path_tst], :prefix => prefix, :template => TEMPLATE_TST, :inc => :tst, :boilerplate => @options[:boilerplates][:tst] }, ] #prepare the pattern for use @@ -138,8 +143,9 @@ class UnityModuleGenerator triad.each do |cfg| patterns.each_pair do |pattern_file, pattern_traits| submodule_name = create_filename(module_name, pattern_file) + filename = cfg[:prefix] + submodule_name + cfg[:ext] files << { - :path => "#{cfg[:path]}#{submodule_name}#{cfg[:ext]}", + :path => (Pathname.new("#{cfg[:path]}#{subfolder}") + filename).cleanpath, :name => submodule_name, :template => cfg[:template], :boilerplate => cfg[:boilerplate], @@ -188,6 +194,7 @@ class UnityModuleGenerator # Create Source Modules files.each_with_index do |file, i| + FileUtils.mkdir_p(File.dirname(file[:path]), :verbose => false) # Create the path first if necessary. File.open(file[:path], 'w') do |f| f.write("#{file[:boilerplate]}\n" % [file[:name]]) unless file[:boilerplate].nil? f.write(file[:template] % [ file[:name], @@ -292,5 +299,3 @@ if ($0 == __FILE__) end end - - From 8e31f5d8695e2aeac2e48b097f7ddde34971d733 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 29 Nov 2016 08:38:51 -0500 Subject: [PATCH 025/157] Revised internal type naming scheme to better sandbox Unity away from everything else. Sure, short was nice, but not at the expense of naming collisions. --- extras/fixture/src/unity_fixture.c | 2 +- extras/fixture/src/unity_fixture_internals.h | 4 +- extras/fixture/test/unity_fixture_Test.c | 6 +- src/unity.c | 210 +++++++------- src/unity.h | 16 +- src/unity_internals.h | 272 +++++++++--------- test/tests/testunity.c | 282 +++++++++---------- 7 files changed, 396 insertions(+), 396 deletions(-) diff --git a/extras/fixture/src/unity_fixture.c b/extras/fixture/src/unity_fixture.c index 68d2945..125d1b7 100644 --- a/extras/fixture/src/unity_fixture.c +++ b/extras/fixture/src/unity_fixture.c @@ -9,7 +9,7 @@ #include "unity_fixture.h" #include "unity_internals.h" -struct _UnityFixture UnityFixture; +struct UNITY_FIXTURE_T UnityFixture; /* If you decide to use the function pointer approach. * Build with -D UNITY_OUTPUT_CHAR=outputChar and include diff --git a/extras/fixture/src/unity_fixture_internals.h b/extras/fixture/src/unity_fixture_internals.h index 6076092..12a6acb 100644 --- a/extras/fixture/src/unity_fixture_internals.h +++ b/extras/fixture/src/unity_fixture_internals.h @@ -13,14 +13,14 @@ extern "C" { #endif -struct _UnityFixture +struct UNITY_FIXTURE_T { int Verbose; unsigned int RepeatCount; const char* NameFilter; const char* GroupFilter; }; -extern struct _UnityFixture UnityFixture; +extern struct UNITY_FIXTURE_T UnityFixture; typedef void unityfunction(void); void UnityTestRunner(unityfunction* setup, diff --git a/extras/fixture/test/unity_fixture_Test.c b/extras/fixture/test/unity_fixture_Test.c index a4d5dbb..9bdbd5b 100644 --- a/extras/fixture/test/unity_fixture_Test.c +++ b/extras/fixture/test/unity_fixture_Test.c @@ -138,8 +138,8 @@ TEST(UnityFixture, FreeNULLSafety) TEST(UnityFixture, ConcludeTestIncrementsFailCount) { - _U_UINT savedFails = Unity.TestFailures; - _U_UINT savedIgnores = Unity.TestIgnores; + UNITY_UINT savedFails = Unity.TestFailures; + UNITY_UINT savedIgnores = Unity.TestIgnores; UnityOutputCharSpy_Enable(1); Unity.CurrentTestFailed = 1; UnityConcludeFixtureTest(); /* Resets TestFailed for this test to pass */ @@ -301,7 +301,7 @@ TEST(UnityCommandOptions, GroupOrNameFilterWithoutStringFails) TEST(UnityCommandOptions, GroupFilterReallyFilters) { - _U_UINT saved = Unity.NumberOfTests; + UNITY_UINT saved = Unity.NumberOfTests; TEST_ASSERT_EQUAL(0, UnityGetCommandLineOptions(4, unknownCommand)); UnityIgnoreTest(NULL, "non-matching", NULL); TEST_ASSERT_EQUAL(saved, Unity.NumberOfTests); diff --git a/src/unity.c b/src/unity.c index a79f6d4..483e484 100644 --- a/src/unity.c +++ b/src/unity.c @@ -19,7 +19,7 @@ void UNITY_OUTPUT_CHAR(int); /* return prematurely if we are already in failure or ignore state */ #define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } -struct _Unity Unity; +struct UNITY_STORAGE_T Unity; static const char UnityStrOk[] = "OK"; static const char UnityStrPass[] = "PASS"; @@ -55,7 +55,7 @@ static const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; static const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; /* compiler-generic print formatting masks */ -static const _U_UINT UnitySizeMask[] = +static const UNITY_UINT UnitySizeMask[] = { 255u, /* 0xFF */ 65535u, /* 0xFFFF */ @@ -103,21 +103,21 @@ void UnityPrint(const char* string) { UNITY_OUTPUT_CHAR('\\'); UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((_U_UINT)*pch, 2); + UnityPrintNumberHex((UNITY_UINT)*pch, 2); } pch++; } } } -void UnityPrintLen(const char* string, const _UU32 length); -void UnityPrintLen(const char* string, const _UU32 length) +void UnityPrintLen(const char* string, const UNITY_UINT32 length); +void UnityPrintLen(const char* string, const UNITY_UINT32 length) { const char* pch = string; if (pch != NULL) { - while (*pch && (_UU32)(pch - string) < length) + while (*pch && (UNITY_UINT32)(pch - string) < length) { /* printable characters plus CR & LF are printed */ if ((*pch <= 126) && (*pch >= 32)) @@ -141,7 +141,7 @@ void UnityPrintLen(const char* string, const _UU32 length) { UNITY_OUTPUT_CHAR('\\'); UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((_U_UINT)*pch, 2); + UnityPrintNumberHex((UNITY_UINT)*pch, 2); } pch++; } @@ -149,7 +149,7 @@ void UnityPrintLen(const char* string, const _UU32 length) } /*-----------------------------------------------*/ -void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style) +void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style) { if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) { @@ -157,35 +157,35 @@ void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T s } else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) { - UnityPrintNumberUnsigned( (_U_UINT)number & UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1] ); + UnityPrintNumberUnsigned( (UNITY_UINT)number & UnitySizeMask[((UNITY_UINT)style & (UNITY_UINT)0x0F) - 1] ); } else { UNITY_OUTPUT_CHAR('0'); UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1)); + UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0x000F) << 1)); } } /*-----------------------------------------------*/ -void UnityPrintNumber(const _U_SINT number_to_print) +void UnityPrintNumber(const UNITY_INT number_to_print) { - _U_UINT number = (_U_UINT)number_to_print; + UNITY_UINT number = (UNITY_UINT)number_to_print; if (number_to_print < 0) { /* A negative number, including MIN negative */ UNITY_OUTPUT_CHAR('-'); - number = (_U_UINT)(-number_to_print); + number = (UNITY_UINT)(-number_to_print); } UnityPrintNumberUnsigned(number); } /*----------------------------------------------- * basically do an itoa using as little ram as possible */ -void UnityPrintNumberUnsigned(const _U_UINT number) +void UnityPrintNumberUnsigned(const UNITY_UINT number) { - _U_UINT divisor = 1; + UNITY_UINT divisor = 1; /* figure out initial divisor */ while (number / divisor > 9) @@ -203,9 +203,9 @@ void UnityPrintNumberUnsigned(const _U_UINT number) } /*-----------------------------------------------*/ -void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print) +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) { - _U_UINT nibble; + UNITY_UINT nibble; char nibbles = nibbles_to_print; while (nibbles > 0) @@ -223,10 +223,10 @@ void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print) } /*-----------------------------------------------*/ -void UnityPrintMask(const _U_UINT mask, const _U_UINT number) +void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) { - _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1); - _US32 i; + UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1); + UNITY_INT32 i; for (i = 0; i < UNITY_INT_WIDTH; i++) { @@ -261,7 +261,7 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number) # endif #endif -void UnityPrintFloat(_UD number) +void UnityPrintFloat(UNITY_DOUBLE number) { char TempBuffer[UNITY_VERBOSE_NUMBER_MAX_LENGTH + 1]; snprintf(TempBuffer, sizeof(TempBuffer), "%.6f", number); @@ -290,7 +290,7 @@ static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) #ifndef UNITY_FIXTURES UnityPrint(file); UNITY_OUTPUT_CHAR(':'); - UnityPrintNumber((_U_SINT)line); + UnityPrintNumber((UNITY_INT)line); UNITY_OUTPUT_CHAR(':'); UnityPrint(Unity.CurrentTestName); UNITY_OUTPUT_CHAR(':'); @@ -389,7 +389,7 @@ static void UnityPrintExpectedAndActualStrings(const char* expected, const char* } /*-----------------------------------------------*/ -static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const _UU32 length) +static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const UNITY_UINT32 length) { UnityPrint(UnityStrExpected); if (expected != NULL) @@ -453,9 +453,9 @@ static int UnityCheckArraysForNull(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_P * Assertion Functions *-----------------------------------------------*/ -void UnityAssertBits(const _U_SINT mask, - const _U_SINT expected, - const _U_SINT actual, +void UnityAssertBits(const UNITY_INT mask, + const UNITY_INT expected, + const UNITY_INT actual, const char* msg, const UNITY_LINE_TYPE lineNumber) { @@ -465,17 +465,17 @@ void UnityAssertBits(const _U_SINT mask, { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrExpected); - UnityPrintMask((_U_UINT)mask, (_U_UINT)expected); + UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected); UnityPrint(UnityStrWas); - UnityPrintMask((_U_UINT)mask, (_U_UINT)actual); + UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } } /*-----------------------------------------------*/ -void UnityAssertEqualNumber(const _U_SINT expected, - const _U_SINT actual, +void UnityAssertEqualNumber(const UNITY_INT expected, + const UNITY_INT actual, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style) @@ -504,12 +504,12 @@ void UnityAssertEqualNumber(const _U_SINT expected, /*-----------------------------------------------*/ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, - const _UU32 num_elements, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style) { - _UU32 elements = num_elements; + UNITY_UINT32 elements = num_elements; UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected; UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual; @@ -533,20 +533,20 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, case UNITY_DISPLAY_STYLE_UINT8: while (elements--) { - if (*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act) + if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_act) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp, style); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_exp, style); UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act, style); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_act, style); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); + ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 1); + ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 1); } break; case UNITY_DISPLAY_STYLE_HEX16: @@ -554,20 +554,20 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, case UNITY_DISPLAY_STYLE_UINT16: while (elements--) { - if (*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act) + if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_act) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp, style); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_exp, style); UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act, style); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_act, style); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 2); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 2); + ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 2); + ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 2); } break; #ifdef UNITY_SUPPORT_64 @@ -576,40 +576,40 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, case UNITY_DISPLAY_STYLE_UINT64: while (elements--) { - if (*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act) + if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_act) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp, style); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_exp, style); UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act, style); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_act, style); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 8); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 8); + ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 8); + ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 8); } break; #endif default: while (elements--) { - if (*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act) + if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_act) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp, style); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_exp, style); UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act, style); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_act, style); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 4); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 4); + ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 4); + ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 4); } break; } @@ -632,21 +632,21 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, #endif #ifndef UNITY_EXCLUDE_FLOAT -static int UnityFloatsWithin(_UF delta, _UF expected, _UF actual) +static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) { - _UF diff; + UNITY_FLOAT diff; UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); } -void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, - UNITY_PTR_ATTRIBUTE const _UF* actual, - const _UU32 num_elements, +void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber) { - _UU32 elements = num_elements; - UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected; - UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual; + UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; UNITY_SKIP_EXECUTION; @@ -682,9 +682,9 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, } /*-----------------------------------------------*/ -void UnityAssertFloatsWithin(const _UF delta, - const _UF expected, - const _UF actual, +void UnityAssertFloatsWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, const char* msg, const UNITY_LINE_TYPE lineNumber) { @@ -708,15 +708,15 @@ void UnityAssertFloatsWithin(const _UF delta, } /*-----------------------------------------------*/ -void UnityAssertFloatSpecial(const _UF actual, +void UnityAssertFloatSpecial(const UNITY_FLOAT actual, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_FLOAT_TRAIT_T style) { const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; - _U_SINT should_be_trait = ((_U_SINT)style & 1); - _U_SINT is_trait = !should_be_trait; - _U_SINT trait_index = (_U_SINT)(style >> 1); + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); UNITY_SKIP_EXECUTION; @@ -775,21 +775,21 @@ void UnityAssertFloatSpecial(const _UF actual, /*-----------------------------------------------*/ #ifndef UNITY_EXCLUDE_DOUBLE -static int UnityDoublesWithin(_UD delta, _UD expected, _UD actual) +static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual) { - _UD diff; + UNITY_DOUBLE diff; UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); } -void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, - UNITY_PTR_ATTRIBUTE const _UD* actual, - const _UU32 num_elements, +void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber) { - _UU32 elements = num_elements; - UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected; - UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual; + UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; UNITY_SKIP_EXECUTION; @@ -825,9 +825,9 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, } /*-----------------------------------------------*/ -void UnityAssertDoublesWithin(const _UD delta, - const _UD expected, - const _UD actual, +void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, const char* msg, const UNITY_LINE_TYPE lineNumber) { @@ -851,15 +851,15 @@ void UnityAssertDoublesWithin(const _UD delta, /*-----------------------------------------------*/ -void UnityAssertDoubleSpecial(const _UD actual, +void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_FLOAT_TRAIT_T style) { const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; - _U_SINT should_be_trait = ((_U_SINT)style & 1); - _U_SINT is_trait = !should_be_trait; - _U_SINT trait_index = (_U_SINT)(style >> 1); + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); UNITY_SKIP_EXECUTION; @@ -918,9 +918,9 @@ void UnityAssertDoubleSpecial(const _UD actual, #endif /* not UNITY_EXCLUDE_DOUBLE */ /*-----------------------------------------------*/ -void UnityAssertNumbersWithin( const _U_UINT delta, - const _U_SINT expected, - const _U_SINT actual, +void UnityAssertNumbersWithin( const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style) @@ -930,23 +930,23 @@ void UnityAssertNumbersWithin( const _U_UINT delta, if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) { if (actual > expected) - Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > delta); + Unity.CurrentTestFailed = ((UNITY_UINT)(actual - expected) > delta); else - Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > delta); + Unity.CurrentTestFailed = ((UNITY_UINT)(expected - actual) > delta); } else { - if ((_U_UINT)actual > (_U_UINT)expected) - Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > delta); + if ((UNITY_UINT)actual > (UNITY_UINT)expected) + Unity.CurrentTestFailed = ((UNITY_UINT)(actual - expected) > delta); else - Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > delta); + Unity.CurrentTestFailed = ((UNITY_UINT)(expected - actual) > delta); } if (Unity.CurrentTestFailed) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrDelta); - UnityPrintNumberByStyle((_U_SINT)delta, style); + UnityPrintNumberByStyle((UNITY_INT)delta, style); UnityPrint(UnityStrExpected); UnityPrintNumberByStyle(expected, style); UnityPrint(UnityStrWas); @@ -962,7 +962,7 @@ void UnityAssertEqualString(const char* expected, const char* msg, const UNITY_LINE_TYPE lineNumber) { - _UU32 i; + UNITY_UINT32 i; UNITY_SKIP_EXECUTION; @@ -998,11 +998,11 @@ void UnityAssertEqualString(const char* expected, /*-----------------------------------------------*/ void UnityAssertEqualStringLen(const char* expected, const char* actual, - const _UU32 length, + const UNITY_UINT32 length, const char* msg, const UNITY_LINE_TYPE lineNumber) { - _UU32 i; + UNITY_UINT32 i; UNITY_SKIP_EXECUTION; @@ -1039,11 +1039,11 @@ void UnityAssertEqualStringLen(const char* expected, /*-----------------------------------------------*/ void UnityAssertEqualStringArray( const char** expected, const char** actual, - const _UU32 num_elements, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber) { - _UU32 i, j = 0; + UNITY_UINT32 i, j = 0; UNITY_SKIP_EXECUTION; @@ -1096,15 +1096,15 @@ void UnityAssertEqualStringArray( const char** expected, /*-----------------------------------------------*/ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, - const _UU32 length, - const _UU32 num_elements, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber) { UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; - _UU32 elements = num_elements; - _UU32 bytes; + UNITY_UINT32 elements = num_elements; + UNITY_UINT32 bytes; UNITY_SKIP_EXECUTION; @@ -1139,8 +1139,8 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); + ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 1); + ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 1); } } } @@ -1249,11 +1249,11 @@ int UnityEnd(void) UNITY_PRINT_EOL(); UnityPrint(UnityStrBreaker); UNITY_PRINT_EOL(); - UnityPrintNumber((_U_SINT)(Unity.NumberOfTests)); + UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests)); UnityPrint(UnityStrResultsTests); - UnityPrintNumber((_U_SINT)(Unity.TestFailures)); + UnityPrintNumber((UNITY_INT)(Unity.TestFailures)); UnityPrint(UnityStrResultsFailures); - UnityPrintNumber((_U_SINT)(Unity.TestIgnores)); + UnityPrintNumber((UNITY_INT)(Unity.TestIgnores)); UnityPrint(UnityStrResultsIgnored); UNITY_PRINT_EOL(); if (Unity.TestFailures == 0U) diff --git a/src/unity.h b/src/unity.h index 031ccc9..df59683 100644 --- a/src/unity.h +++ b/src/unity.h @@ -107,10 +107,10 @@ void tearDown(void); #define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL) #define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL) -#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(-1), (actual), __LINE__, NULL) -#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(0), (actual), __LINE__, NULL) -#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(-1), (actual), __LINE__, NULL) -#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(0), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(0), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(0), (actual), __LINE__, NULL) /* Integer Ranges (of all sizes) */ #define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL) @@ -212,10 +212,10 @@ void tearDown(void); #define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message)) #define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message)) -#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(-1), (actual), __LINE__, (message)) -#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (_UU32)(0), (actual), __LINE__, (message)) -#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(-1), (actual), __LINE__, (message)) -#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((_UU32)1 << (bit)), (_UU32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(0), (actual), __LINE__, (message)) /* 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)) diff --git a/src/unity_internals.h b/src/unity_internals.h index 8ccd66d..a49be92 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -87,19 +87,19 @@ *-------------------------------------------------------*/ #if (UNITY_INT_WIDTH == 32) - typedef unsigned char _UU8; - typedef unsigned short _UU16; - typedef unsigned int _UU32; - typedef signed char _US8; - typedef signed short _US16; - typedef signed int _US32; + typedef unsigned char UNITY_UINT8; + typedef unsigned short UNITY_UINT16; + typedef unsigned int UNITY_UINT32; + typedef signed char UNITY_INT8; + typedef signed short UNITY_INT16; + typedef signed int UNITY_INT32; #elif (UNITY_INT_WIDTH == 16) - typedef unsigned char _UU8; - typedef unsigned int _UU16; - typedef unsigned long _UU32; - typedef signed char _US8; - typedef signed int _US16; - typedef signed long _US32; + typedef unsigned char UNITY_UINT8; + typedef unsigned int UNITY_UINT16; + typedef unsigned long UNITY_UINT32; + typedef signed char UNITY_INT8; + typedef signed int UNITY_INT16; + typedef signed long UNITY_INT32; #else #error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported) #endif @@ -116,22 +116,22 @@ #ifndef UNITY_SUPPORT_64 /* No 64-bit Support */ - typedef _UU32 _U_UINT; - typedef _US32 _U_SINT; + typedef UNITY_UINT32 UNITY_UINT; + typedef UNITY_INT32 UNITY_INT; #else /* 64-bit Support */ #if (UNITY_LONG_WIDTH == 32) - typedef unsigned long long _UU64; - typedef signed long long _US64; + typedef unsigned long long UNITY_UINT64; + typedef signed long long UNITY_INT64; #elif (UNITY_LONG_WIDTH == 64) - typedef unsigned long _UU64; - typedef signed long _US64; + typedef unsigned long UNITY_UINT64; + typedef signed long UNITY_INT64; #else #error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported) #endif - typedef _UU64 _U_UINT; - typedef _US64 _U_SINT; + typedef UNITY_UINT64 UNITY_UINT; + typedef UNITY_INT64 UNITY_INT; #endif @@ -140,13 +140,13 @@ *-------------------------------------------------------*/ #if (UNITY_POINTER_WIDTH == 32) - typedef _UU32 _UP; + typedef UNITY_UINT32 UNITY_PTR; #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 #elif (UNITY_POINTER_WIDTH == 64) - typedef _UU64 _UP; + typedef UNITY_UINT64 UNITY_PTR; #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 #elif (UNITY_POINTER_WIDTH == 16) - typedef _UU16 _UP; + typedef UNITY_UINT16 UNITY_PTR; #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 #else #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) @@ -158,7 +158,7 @@ #ifndef UNITY_INTERNAL_PTR #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void* -/* #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const _UU8* */ +/* #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const UNITY_UINT8* */ #endif /*------------------------------------------------------- @@ -186,7 +186,7 @@ #ifndef UNITY_FLOAT_TYPE #define UNITY_FLOAT_TYPE float #endif -typedef UNITY_FLOAT_TYPE _UF; +typedef UNITY_FLOAT_TYPE UNITY_FLOAT; #ifndef isinf /* The value of Inf - Inf is NaN */ @@ -232,7 +232,7 @@ typedef UNITY_FLOAT_TYPE _UF; #endif #ifdef UNITY_FLOAT_VERBOSE - typedef _UF _UD; + typedef UNITY_FLOAT UNITY_DOUBLE; /* For parameter in UnityPrintFloat, double promotion required */ #endif @@ -246,7 +246,7 @@ typedef UNITY_FLOAT_TYPE _UF; #ifndef UNITY_DOUBLE_TYPE #define UNITY_DOUBLE_TYPE double #endif - typedef UNITY_DOUBLE_TYPE _UD; + typedef UNITY_DOUBLE_TYPE UNITY_DOUBLE; #endif @@ -304,11 +304,11 @@ extern void UNITY_OUTPUT_FLUSH(void); *-------------------------------------------------------*/ #ifndef UNITY_LINE_TYPE -#define UNITY_LINE_TYPE _U_UINT +#define UNITY_LINE_TYPE UNITY_UINT #endif #ifndef UNITY_COUNTER_TYPE -#define UNITY_COUNTER_TYPE _U_UINT +#define UNITY_COUNTER_TYPE UNITY_UINT #endif /*------------------------------------------------------- @@ -368,7 +368,7 @@ UNITY_DISPLAY_STYLE_UINT = sizeof(unsigned) + UNITY_DISPLAY_RANGE_UINT + UNITY_D } UNITY_DISPLAY_STYLE_T; #ifndef UNITY_EXCLUDE_FLOAT -typedef enum _UNITY_FLOAT_TRAIT_T +typedef enum UNITY_FLOAT_TRAIT { UNITY_FLOAT_IS_NOT_INF = 0, UNITY_FLOAT_IS_INF, @@ -382,7 +382,7 @@ typedef enum _UNITY_FLOAT_TRAIT_T } UNITY_FLOAT_TRAIT_T; #endif -struct _Unity +struct UNITY_STORAGE_T { const char* TestFile; const char* CurrentTestName; @@ -399,7 +399,7 @@ struct _Unity jmp_buf AbortFrame; }; -extern struct _Unity Unity; +extern struct UNITY_STORAGE_T Unity; /*------------------------------------------------------- * Test Suite Management @@ -437,14 +437,14 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int *-------------------------------------------------------*/ void UnityPrint(const char* string); -void UnityPrintMask(const _U_UINT mask, const _U_UINT number); -void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style); -void UnityPrintNumber(const _U_SINT number); -void UnityPrintNumberUnsigned(const _U_UINT number); -void UnityPrintNumberHex(const _U_UINT number, const char nibbles); +void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number); +void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style); +void UnityPrintNumber(const UNITY_INT number); +void UnityPrintNumberUnsigned(const UNITY_UINT number); +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles); #ifdef UNITY_FLOAT_VERBOSE -void UnityPrintFloat(const _UD number); +void UnityPrintFloat(const UNITY_DOUBLE number); #endif /*------------------------------------------------------- @@ -455,22 +455,22 @@ void UnityPrintFloat(const _UD number); * convention and will pull in file and line information * for you. */ -void UnityAssertEqualNumber(const _U_SINT expected, - const _U_SINT actual, +void UnityAssertEqualNumber(const UNITY_INT expected, + const UNITY_INT actual, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style); void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, - const _UU32 num_elements, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style); -void UnityAssertBits(const _U_SINT mask, - const _U_SINT expected, - const _U_SINT actual, +void UnityAssertBits(const UNITY_INT mask, + const UNITY_INT expected, + const UNITY_INT actual, const char* msg, const UNITY_LINE_TYPE lineNumber); @@ -481,26 +481,26 @@ void UnityAssertEqualString(const char* expected, void UnityAssertEqualStringLen(const char* expected, const char* actual, - const _UU32 length, + const UNITY_UINT32 length, const char* msg, const UNITY_LINE_TYPE lineNumber); void UnityAssertEqualStringArray( const char** expected, const char** actual, - const _UU32 num_elements, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber); void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, - const _UU32 length, - const _UU32 num_elements, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber); -void UnityAssertNumbersWithin(const _U_UINT delta, - const _U_SINT expected, - const _U_SINT actual, +void UnityAssertNumbersWithin(const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style); @@ -510,38 +510,38 @@ void UnityFail(const char* message, const UNITY_LINE_TYPE line); void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); #ifndef UNITY_EXCLUDE_FLOAT -void UnityAssertFloatsWithin(const _UF delta, - const _UF expected, - const _UF actual, +void UnityAssertFloatsWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, const char* msg, const UNITY_LINE_TYPE lineNumber); -void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, - UNITY_PTR_ATTRIBUTE const _UF* actual, - const _UU32 num_elements, +void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber); -void UnityAssertFloatSpecial(const _UF actual, +void UnityAssertFloatSpecial(const UNITY_FLOAT actual, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_FLOAT_TRAIT_T style); #endif #ifndef UNITY_EXCLUDE_DOUBLE -void UnityAssertDoublesWithin(const _UD delta, - const _UD expected, - const _UD actual, +void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, const char* msg, const UNITY_LINE_TYPE lineNumber); -void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, - UNITY_PTR_ATTRIBUTE const _UD* actual, - const _UU32 num_elements, +void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, + const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber); -void UnityAssertDoubleSpecial(const _UD actual, +void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, const char* msg, const UNITY_LINE_TYPE lineNumber, const UNITY_FLOAT_TRAIT_T style); @@ -626,61 +626,61 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message)) #define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU8 )(expected), (_U_SINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU16)(expected), (_U_SINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UU32)(expected), (_U_SINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((_U_SINT)(mask), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((UNITY_INT)(mask), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_US8 )(expected), (_U_SINT)(_US8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_US16)(expected), (_U_SINT)(_US16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_US32)(expected), (_U_SINT)(_US32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU8 )(delta), (_U_SINT)(_U_UINT)(_UU8 )(expected), (_U_SINT)(_U_UINT)(_UU8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU16)(delta), (_U_SINT)(_U_UINT)(_UU16)(expected), (_U_SINT)(_U_UINT)(_UU16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((_UU32)(delta), (_U_SINT)(_U_UINT)(_UU32)(expected), (_U_SINT)(_U_UINT)(_UU32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(_UP)(expected), (_U_SINT)(_UP)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_PTR)(expected), (UNITY_INT)(UNITY_PTR)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) #define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (_UU32)(len), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(len), 1, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(_UP*)(expected), (UNITY_INTERNAL_PTR)(_UP*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) -#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(len), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_INT_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_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8_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_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16_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_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32_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_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT_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_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8_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_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16_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_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32_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_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8_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_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16_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_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32_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_HEX32) +#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(UNITY_PTR*)(expected), (UNITY_INTERNAL_PTR)(UNITY_PTR*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#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)) #ifdef UNITY_SUPPORT_64 -#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) -#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) -#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) -#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (_U_SINT)(expected), (_U_SINT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#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) +#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) +#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) +#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_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) #else #define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) #define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) @@ -706,17 +706,17 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #else -#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((_UF)(delta), (_UF)(expected), (_UF)(actual), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((_UF)(expected) * (_UF)UNITY_FLOAT_PRECISION, (_UF)(expected), (_UF)(actual), (UNITY_LINE_TYPE)(line), (message)) -#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray((_UF*)(expected), (_UF*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) -#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) -#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) -#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) -#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((_UF)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray((UNITY_FLOAT*)(expected), (UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) #endif #ifdef UNITY_EXCLUDE_DOUBLE @@ -732,17 +732,17 @@ 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_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #else -#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((_UD)(delta), (_UD)(expected), (_UD)(actual), (message), (UNITY_LINE_TYPE)line) -#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((_UD)(expected) * (_UD)UNITY_DOUBLE_PRECISION, (_UD)expected, (_UD)actual, (UNITY_LINE_TYPE)(line), message) -#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((_UD*)(expected), (_UD*)(actual), (_UU32)(num_elements), (message), (UNITY_LINE_TYPE)line) -#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) -#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) -#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((_UD)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#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_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((UNITY_DOUBLE*)(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line) +#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_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) #endif /* End of UNITY_INTERNALS_H */ diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 8ef3034..36465b7 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -11,11 +11,11 @@ // Dividing by these constants produces +/- infinity. // The rationale is given in UnityAssertFloatIsInf's body. #ifndef UNITY_EXCLUDE_FLOAT -static const _UF f_zero = 0.0f; +static const UNITY_FLOAT f_zero = 0.0f; #endif #ifndef UNITY_EXCLUDE_DOUBLE -static const _UD d_zero = 0.0; +static const UNITY_DOUBLE d_zero = 0.0; #endif #define EXPECT_ABORT_BEGIN \ @@ -76,14 +76,14 @@ void tearDown(void) void testUnitySizeInitializationReminder(void) { - /* This test ensures that sizeof(struct _Unity) doesn't change. If this + /* This test ensures that sizeof(struct UNITY_STORAGE_T) doesn't change. If this * test breaks, go look at the initialization of the Unity global variable * in unity.c and make sure we're filling in the proper fields. */ - const char* message = "Unexpected size for _Unity struct. Please check that " + const char* message = "Unexpected size for UNITY_STORAGE_T struct. Please check that " "the initialization of the Unity symbol in unity.c is " "still correct."; - /* Define a structure with all the same fields as `struct _Unity`. */ + /* Define a structure with all the same fields as `struct UNITY_STORAGE_T`. */ #ifdef UNITY_EXCLUDE_DETAILS struct { const char* TestFile; @@ -267,7 +267,7 @@ void testNotEqualBits(void) void testNotEqualUInts(void) { - _UU16 v0, v1; + UNITY_UINT16 v0, v1; v0 = 9000; v1 = 9001; @@ -279,7 +279,7 @@ void testNotEqualUInts(void) void testNotEqualUInt8s(void) { - _UU8 v0, v1; + UNITY_UINT8 v0, v1; v0 = 254; v1 = 255; @@ -291,7 +291,7 @@ void testNotEqualUInt8s(void) void testNotEqualUInt16s(void) { - _UU16 v0, v1; + UNITY_UINT16 v0, v1; v0 = 65535; v1 = 65534; @@ -303,7 +303,7 @@ void testNotEqualUInt16s(void) void testNotEqualUInt32s(void) { - _UU32 v0, v1; + UNITY_UINT32 v0, v1; v0 = 4294967295; v1 = 4294967294; @@ -315,7 +315,7 @@ void testNotEqualUInt32s(void) void testNotEqualHex8s(void) { - _UU8 v0, v1; + UNITY_UINT8 v0, v1; v0 = 0x23; v1 = 0x22; @@ -327,7 +327,7 @@ void testNotEqualHex8s(void) void testNotEqualHex8sIfSigned(void) { - _US8 v0, v1; + UNITY_INT8 v0, v1; v0 = -2; v1 = 2; @@ -339,7 +339,7 @@ void testNotEqualHex8sIfSigned(void) void testNotEqualHex16s(void) { - _UU16 v0, v1; + UNITY_UINT16 v0, v1; v0 = 0x1234; v1 = 0x1235; @@ -351,7 +351,7 @@ void testNotEqualHex16s(void) void testNotEqualHex16sIfSigned(void) { - _US16 v0, v1; + UNITY_INT16 v0, v1; v0 = -1024; v1 = -1028; @@ -363,7 +363,7 @@ void testNotEqualHex16sIfSigned(void) void testNotEqualHex32s(void) { - _UU32 v0, v1; + UNITY_UINT32 v0, v1; v0 = 900000; v1 = 900001; @@ -375,7 +375,7 @@ void testNotEqualHex32s(void) void testNotEqualHex32sIfSigned(void) { - _US32 v0, v1; + UNITY_INT32 v0, v1; v0 = -900000; v1 = 900001; @@ -407,8 +407,8 @@ void testEqualInts(void) void testEqualInt8s(void) { - _US8 v0, v1; - _US8 *p0, *p1; + UNITY_INT8 v0, v1; + UNITY_INT8 *p0, *p1; v0 = 0x22; v1 = 0x22; @@ -432,8 +432,8 @@ void testEqualInt8sWhenThereAreDifferencesOutside8Bits(void) void testEqualInt16s(void) { - _US16 v0, v1; - _US16 *p0, *p1; + UNITY_INT16 v0, v1; + UNITY_INT16 *p0, *p1; v0 = 0x7876; v1 = 0x7876; @@ -451,8 +451,8 @@ void testEqualInt16s(void) void testEqualInt16sNegatives(void) { - _US16 v0, v1; - _US16 *p0, *p1; + UNITY_INT16 v0, v1; + UNITY_INT16 *p0, *p1; v0 = -7876; v1 = -7876; @@ -476,8 +476,8 @@ void testEqualInt16sWhenThereAreDifferencesOutside16Bits(void) void testEqualInt32s(void) { - _US32 v0, v1; - _US32 *p0, *p1; + UNITY_INT32 v0, v1; + UNITY_INT32 *p0, *p1; v0 = 0x78760000; v1 = 0x78760000; @@ -495,8 +495,8 @@ void testEqualInt32s(void) void testEqualInt32sNegatives(void) { - _US32 v0, v1; - _US32 *p0, *p1; + UNITY_INT32 v0, v1; + UNITY_INT32 *p0, *p1; v0 = -123456789; v1 = -123456789; @@ -536,8 +536,8 @@ void testEqualUints(void) void testEqualUint8s(void) { - _UU8 v0, v1; - _UU8 *p0, *p1; + UNITY_UINT8 v0, v1; + UNITY_UINT8 *p0, *p1; v0 = 0x22; v1 = 0x22; @@ -561,8 +561,8 @@ void testEqualUint8sWhenThereAreDifferencesOutside8Bits(void) void testEqualUint16s(void) { - _UU16 v0, v1; - _UU16 *p0, *p1; + UNITY_UINT16 v0, v1; + UNITY_UINT16 *p0, *p1; v0 = 0x9876; v1 = 0x9876; @@ -586,8 +586,8 @@ void testEqualUint16sWhenThereAreDifferencesOutside16Bits(void) void testEqualUint32s(void) { - _UU32 v0, v1; - _UU32 *p0, *p1; + UNITY_UINT32 v0, v1; + UNITY_UINT32 *p0, *p1; v0 = 0x98760000; v1 = 0x98760000; @@ -616,8 +616,8 @@ void testNotEqual(void) void testEqualHex8s(void) { - _UU8 v0, v1; - _UU8 *p0, *p1; + UNITY_UINT8 v0, v1; + UNITY_UINT8 *p0, *p1; v0 = 0x22; v1 = 0x22; @@ -641,8 +641,8 @@ void testEqualHex8sWhenThereAreDifferencesOutside8Bits(void) void testEqualHex8sNegatives(void) { - _UU8 v0, v1; - _UU8 *p0, *p1; + UNITY_UINT8 v0, v1; + UNITY_UINT8 *p0, *p1; v0 = 0xDD; v1 = 0xDD; @@ -660,8 +660,8 @@ void testEqualHex8sNegatives(void) void testEqualHex16s(void) { - _UU16 v0, v1; - _UU16 *p0, *p1; + UNITY_UINT16 v0, v1; + UNITY_UINT16 *p0, *p1; v0 = 0x9876; v1 = 0x9876; @@ -685,8 +685,8 @@ void testEqualHex16sWhenThereAreDifferencesOutside16Bits(void) void testEqualHex32s(void) { - _UU32 v0, v1; - _UU32 *p0, *p1; + UNITY_UINT32 v0, v1; + UNITY_UINT32 *p0, *p1; v0 = 0x98765432ul; v1 = 0x98765432ul; @@ -704,8 +704,8 @@ void testEqualHex32s(void) void testEqualBits(void) { - _UU32 v0 = 0xFF55AA00; - _UU32 v1 = 0x55550000; + UNITY_UINT32 v0 = 0xFF55AA00; + UNITY_UINT32 v1 = 0x55550000; TEST_ASSERT_BITS(v1, v0, 0x55550000); TEST_ASSERT_BITS(v1, v0, 0xFF55CC00); @@ -720,7 +720,7 @@ void testEqualBits(void) void testNotEqualBitHigh(void) { - _UU32 v0 = 0x7F55AA00; + UNITY_UINT32 v0 = 0x7F55AA00; EXPECT_ABORT_BEGIN TEST_ASSERT_BIT_HIGH(31, v0); @@ -729,7 +729,7 @@ void testNotEqualBitHigh(void) void testNotEqualBitLow(void) { - _UU32 v0 = 0xFF55AA00; + UNITY_UINT32 v0 = 0xFF55AA00; EXPECT_ABORT_BEGIN TEST_ASSERT_BIT_LOW(30, v0); @@ -738,8 +738,8 @@ void testNotEqualBitLow(void) void testNotEqualBitsHigh(void) { - _UU32 v0 = 0xFF55AA00; - _UU32 v1 = 0x55550000; + UNITY_UINT32 v0 = 0xFF55AA00; + UNITY_UINT32 v1 = 0x55550000; EXPECT_ABORT_BEGIN TEST_ASSERT_BITS_HIGH(v0, v1); @@ -749,8 +749,8 @@ void testNotEqualBitsHigh(void) void testNotEqualBitsLow(void) { - _UU32 v0 = 0xFF55AA00; - _UU32 v1 = 0x55550000; + UNITY_UINT32 v0 = 0xFF55AA00; + UNITY_UINT32 v1 = 0x55550000; EXPECT_ABORT_BEGIN TEST_ASSERT_BITS_LOW(v0, v1); @@ -1624,8 +1624,8 @@ void testNotEqualIntArrays3(void) void testNotEqualIntArraysLengthZero(void) { - _UU32 p0[1] = {1}; - _UU32 p1[1] = {1}; + UNITY_UINT32 p0[1] = {1}; + UNITY_UINT32 p1[1] = {1}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_INT_ARRAY(p0, p1, 0); @@ -1714,10 +1714,10 @@ void testNotEqualPtrArrays3(void) void testEqualInt8Arrays(void) { - _US8 p0[] = {1, 8, 117, -2}; - _US8 p1[] = {1, 8, 117, -2}; - _US8 p2[] = {1, 8, 117, 2}; - _US8 p3[] = {1, 50, 60, 70}; + UNITY_INT8 p0[] = {1, 8, 117, -2}; + UNITY_INT8 p1[] = {1, 8, 117, -2}; + UNITY_INT8 p2[] = {1, 8, 117, 2}; + UNITY_INT8 p3[] = {1, 50, 60, 70}; TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p0, 4); @@ -1728,8 +1728,8 @@ void testEqualInt8Arrays(void) void testNotEqualInt8Arrays(void) { - _US8 p0[] = {1, 8, 36, -2}; - _US8 p1[] = {1, 8, 36, 2}; + UNITY_INT8 p0[] = {1, 8, 36, -2}; + UNITY_INT8 p1[] = {1, 8, 36, 2}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_INT8_ARRAY(p0, p1, 4); @@ -1782,10 +1782,10 @@ void testNotEqualUIntArrays3(void) void testEqualInt16Arrays(void) { - _US16 p0[] = {1, 8, 117, 3}; - _US16 p1[] = {1, 8, 117, 3}; - _US16 p2[] = {1, 8, 117, 2}; - _US16 p3[] = {1, 50, 60, 70}; + UNITY_INT16 p0[] = {1, 8, 117, 3}; + UNITY_INT16 p1[] = {1, 8, 117, 3}; + UNITY_INT16 p2[] = {1, 8, 117, 2}; + UNITY_INT16 p3[] = {1, 50, 60, 70}; TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p0, 4); @@ -1796,8 +1796,8 @@ void testEqualInt16Arrays(void) void testNotEqualInt16Arrays(void) { - _US16 p0[] = {1, 8, 127, 3}; - _US16 p1[] = {1, 8, 127, 2}; + UNITY_INT16 p0[] = {1, 8, 127, 3}; + UNITY_INT16 p1[] = {1, 8, 127, 2}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_INT16_ARRAY(p0, p1, 4); @@ -1806,10 +1806,10 @@ void testNotEqualInt16Arrays(void) void testEqualInt32Arrays(void) { - _US32 p0[] = {1, 8, 117, 3}; - _US32 p1[] = {1, 8, 117, 3}; - _US32 p2[] = {1, 8, 117, 2}; - _US32 p3[] = {1, 50, 60, 70}; + UNITY_INT32 p0[] = {1, 8, 117, 3}; + UNITY_INT32 p1[] = {1, 8, 117, 3}; + UNITY_INT32 p2[] = {1, 8, 117, 2}; + UNITY_INT32 p3[] = {1, 50, 60, 70}; TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p0, 4); @@ -1820,8 +1820,8 @@ void testEqualInt32Arrays(void) void testNotEqualInt32Arrays(void) { - _US32 p0[] = {1, 8, 127, 3}; - _US32 p1[] = {1, 8, 127, 2}; + UNITY_INT32 p0[] = {1, 8, 127, 3}; + UNITY_INT32 p1[] = {1, 8, 127, 2}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_INT32_ARRAY(p0, p1, 4); @@ -1830,10 +1830,10 @@ void testNotEqualInt32Arrays(void) void testEqualUINT8Arrays(void) { - _UU8 p0[] = {1, 8, 100, 127}; - _UU8 p1[] = {1, 8, 100, 127}; - _UU8 p2[] = {1, 8, 100, 2}; - _UU8 p3[] = {1, 50, 60, 70}; + UNITY_UINT8 p0[] = {1, 8, 100, 127}; + UNITY_UINT8 p1[] = {1, 8, 100, 127}; + UNITY_UINT8 p2[] = {1, 8, 100, 2}; + UNITY_UINT8 p3[] = {1, 50, 60, 70}; TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_UINT8_ARRAY(p0, p0, 4); @@ -1919,10 +1919,10 @@ void testNotEqualUINT16Arrays3(void) void testEqualUINT32Arrays(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 987, 65132u}; - _UU32 p2[] = {1, 8, 987, 2}; - _UU32 p3[] = {1, 500, 600, 700}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p2[] = {1, 8, 987, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p0, 4); @@ -1933,8 +1933,8 @@ void testEqualUINT32Arrays(void) void testNotEqualUINT32Arrays1(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 987, 65131u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 987, 65131u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); @@ -1943,8 +1943,8 @@ void testNotEqualUINT32Arrays1(void) void testNotEqualUINT32Arrays2(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {2, 8, 987, 65132u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {2, 8, 987, 65132u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); @@ -1953,8 +1953,8 @@ void testNotEqualUINT32Arrays2(void) void testNotEqualUINT32Arrays3(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 986, 65132u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 986, 65132u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_UINT32_ARRAY(p0, p1, 4); @@ -1963,10 +1963,10 @@ void testNotEqualUINT32Arrays3(void) void testEqualHEXArrays(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 987, 65132u}; - _UU32 p2[] = {1, 8, 987, 2}; - _UU32 p3[] = {1, 500, 600, 700}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p2[] = {1, 8, 987, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; TEST_ASSERT_EQUAL_HEX_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_HEX_ARRAY(p0, p0, 4); @@ -1977,8 +1977,8 @@ void testEqualHEXArrays(void) void testNotEqualHEXArrays1(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 987, 65131u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 987, 65131u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); @@ -1987,8 +1987,8 @@ void testNotEqualHEXArrays1(void) void testNotEqualHEXArrays2(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {2, 8, 987, 65132u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {2, 8, 987, 65132u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); @@ -1997,8 +1997,8 @@ void testNotEqualHEXArrays2(void) void testNotEqualHEXArrays3(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 986, 65132u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 986, 65132u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_HEX_ARRAY(p0, p1, 4); @@ -2007,10 +2007,10 @@ void testNotEqualHEXArrays3(void) void testEqualHEX32Arrays(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 987, 65132u}; - _UU32 p2[] = {1, 8, 987, 2}; - _UU32 p3[] = {1, 500, 600, 700}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p2[] = {1, 8, 987, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p0, 4); @@ -2021,8 +2021,8 @@ void testEqualHEX32Arrays(void) void testNotEqualHEX32Arrays1(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 987, 65131u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 987, 65131u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); @@ -2031,8 +2031,8 @@ void testNotEqualHEX32Arrays1(void) void testNotEqualHEX32Arrays2(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {2, 8, 987, 65132u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {2, 8, 987, 65132u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); @@ -2041,8 +2041,8 @@ void testNotEqualHEX32Arrays2(void) void testNotEqualHEX32Arrays3(void) { - _UU32 p0[] = {1, 8, 987, 65132u}; - _UU32 p1[] = {1, 8, 986, 65132u}; + UNITY_UINT32 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT32 p1[] = {1, 8, 986, 65132u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_HEX32_ARRAY(p0, p1, 4); @@ -2309,8 +2309,8 @@ void testPrintNumbers32(void) TEST_ASSERT_EQUAL_PRINT_NUMBERS("1", 1); TEST_ASSERT_EQUAL_PRINT_NUMBERS("-1", -1); TEST_ASSERT_EQUAL_PRINT_NUMBERS("2000000000", 2000000000); - TEST_ASSERT_EQUAL_PRINT_NUMBERS("-2147483648", (_US32)0x80000000); - TEST_ASSERT_EQUAL_PRINT_NUMBERS("-1", (_US32)0xFFFFFFFF); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-2147483648", (UNITY_INT32)0x80000000); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-1", (UNITY_INT32)0xFFFFFFFF); #endif } @@ -2322,8 +2322,8 @@ void testPrintNumbersUnsigned32(void) TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("0", 0); TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("1", 1); TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("1500000000", 1500000000); - TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("2147483648", (_UU32)0x80000000); - TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("4294967295", (_UU32)0xFFFFFFFF); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("2147483648", (UNITY_UINT32)0x80000000); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("4294967295", (UNITY_UINT32)0xFFFFFFFF); #endif } @@ -2339,8 +2339,8 @@ void testPrintNumbersInt64(void) #else TEST_ASSERT_EQUAL_PRINT_NUMBERS("0", 0); TEST_ASSERT_EQUAL_PRINT_NUMBERS("10000000000", 10000000000); - TEST_ASSERT_EQUAL_PRINT_NUMBERS("-9223372036854775808", (_U_SINT)0x8000000000000000); - TEST_ASSERT_EQUAL_PRINT_NUMBERS("-1", (_U_SINT)0xFFFFFFFFFFFFFFFF); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-9223372036854775808", (UNITY_INT)0x8000000000000000); + TEST_ASSERT_EQUAL_PRINT_NUMBERS("-1", (UNITY_INT)0xFFFFFFFFFFFFFFFF); #endif #endif } @@ -2355,8 +2355,8 @@ void testPrintNumbersUInt64(void) #else TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("0", 0); TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("70000000000", 70000000000); - TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("9223372036854775808", (_U_UINT)0x8000000000000000); - TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("18446744073709551615", (_U_UINT)0xFFFFFFFFFFFFFFFF); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("9223372036854775808", (UNITY_UINT)0x8000000000000000); + TEST_ASSERT_EQUAL_PRINT_UNSIGNED_NUMBERS("18446744073709551615", (UNITY_UINT)0xFFFFFFFFFFFFFFFF); #endif #endif } @@ -2366,8 +2366,8 @@ void testEqualHex64s(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 v0, v1; - _UU64 *p0, *p1; + UNITY_UINT64 v0, v1; + UNITY_UINT64 *p0, *p1; v0 = 0x9876543201234567; v1 = 0x9876543201234567; @@ -2389,8 +2389,8 @@ void testEqualUint64s(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 v0, v1; - _UU64 *p0, *p1; + UNITY_UINT64 v0, v1; + UNITY_UINT64 *p0, *p1; v0 = 0x9876543201234567; v1 = 0x9876543201234567; @@ -2412,11 +2412,11 @@ void testEqualInt64s(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _US64 v0, v1; - _US64 *p0, *p1; + UNITY_INT64 v0, v1; + UNITY_INT64 *p0, *p1; - v0 = (_US64)0x9876543201234567; - v1 = (_US64)0x9876543201234567; + v0 = (UNITY_INT64)0x9876543201234567; + v1 = (UNITY_INT64)0x9876543201234567; p0 = &v0; p1 = &v1; @@ -2436,7 +2436,7 @@ void testNotEqualHex64s(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 v0, v1; + UNITY_UINT64 v0, v1; v0 = 9000000000; v1 = 9100000000; @@ -2452,7 +2452,7 @@ void testNotEqualUint64s(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 v0, v1; + UNITY_UINT64 v0, v1; v0 = 9000000000; v1 = 9100000000; @@ -2468,7 +2468,7 @@ void testNotEqualInt64s(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _US64 v0, v1; + UNITY_INT64 v0, v1; v0 = -9000000000; v1 = 9100000000; @@ -2484,7 +2484,7 @@ void testNotEqualHex64sIfSigned(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _US64 v0, v1; + UNITY_INT64 v0, v1; v0 = -9000000000; v1 = 9000000000; @@ -2599,10 +2599,10 @@ void testEqualHEX64Arrays(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 p0[] = {1, 8, 987, 65132u}; - _UU64 p1[] = {1, 8, 987, 65132u}; - _UU64 p2[] = {1, 8, 987, 2}; - _UU64 p3[] = {1, 500, 600, 700}; + UNITY_UINT64 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT64 p1[] = {1, 8, 987, 65132u}; + UNITY_UINT64 p2[] = {1, 8, 987, 2}; + UNITY_UINT64 p3[] = {1, 500, 600, 700}; TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p0, 4); @@ -2617,10 +2617,10 @@ void testEqualUint64Arrays(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 p0[] = {1, 8, 987, 65132u}; - _UU64 p1[] = {1, 8, 987, 65132u}; - _UU64 p2[] = {1, 8, 987, 2}; - _UU64 p3[] = {1, 500, 600, 700}; + UNITY_UINT64 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT64 p1[] = {1, 8, 987, 65132u}; + UNITY_UINT64 p2[] = {1, 8, 987, 2}; + UNITY_UINT64 p3[] = {1, 500, 600, 700}; TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p0, 4); @@ -2635,10 +2635,10 @@ void testEqualInt64Arrays(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _US64 p0[] = {1, 8, 987, -65132}; - _US64 p1[] = {1, 8, 987, -65132}; - _US64 p2[] = {1, 8, 987, -2}; - _US64 p3[] = {1, 500, 600, 700}; + UNITY_INT64 p0[] = {1, 8, 987, -65132}; + UNITY_INT64 p1[] = {1, 8, 987, -65132}; + UNITY_INT64 p2[] = {1, 8, 987, -2}; + UNITY_INT64 p3[] = {1, 500, 600, 700}; TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p0, 4); @@ -2654,8 +2654,8 @@ void testNotEqualHEX64Arrays1(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 p0[] = {1, 8, 987, 65132u}; - _UU64 p1[] = {1, 8, 987, 65131u}; + UNITY_UINT64 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT64 p1[] = {1, 8, 987, 65131u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p1, 4); @@ -2668,8 +2668,8 @@ void testNotEqualHEX64Arrays2(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 p0[] = {1, 8, 987, 65132u}; - _UU64 p1[] = {2, 8, 987, 65132u}; + UNITY_UINT64 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT64 p1[] = {2, 8, 987, 65132u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_HEX64_ARRAY(p0, p1, 4); @@ -2682,8 +2682,8 @@ void testNotEqualUint64Arrays(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _UU64 p0[] = {1, 8, 987, 65132u}; - _UU64 p1[] = {1, 8, 987, 65131u}; + UNITY_UINT64 p0[] = {1, 8, 987, 65132u}; + UNITY_UINT64 p1[] = {1, 8, 987, 65131u}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_UINT64_ARRAY(p0, p1, 4); @@ -2696,8 +2696,8 @@ void testNotEqualInt64Arrays(void) #ifndef UNITY_SUPPORT_64 TEST_IGNORE(); #else - _US64 p0[] = {1, 8, 987, -65132}; - _US64 p1[] = {1, 8, 987, -65131}; + UNITY_INT64 p0[] = {1, 8, 987, -65132}; + UNITY_INT64 p1[] = {1, 8, 987, -65131}; EXPECT_ABORT_BEGIN TEST_ASSERT_EQUAL_INT64_ARRAY(p0, p1, 4); From 7b51355e5a621021bd5e5e16b74a575202bb87f5 Mon Sep 17 00:00:00 2001 From: Matt Chernosky Date: Tue, 29 Nov 2016 23:19:52 -0700 Subject: [PATCH 026/157] Module generator finishes for partially existing files This resolves #219. When generating a new module, if all the files to generate already exist then it fails as before. If some of the files already exist, then the files that need to be created are created. Any existing files are not changed. Also added a bunch of tests for this feature via rspec. Run them from the test folder with `rake spec`. --- .gitignore | 1 + auto/generate_module.rb | 16 +- test/rakefile | 9 +- .../generate_module_existing_file_spec.rb | 158 ++++++++++++++++++ 4 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 test/spec/generate_module_existing_file_spec.rb diff --git a/.gitignore b/.gitignore index c4901d0..f0c7c3e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/ +test/sandbox .DS_Store examples/example_1/test1.out examples/example_1/test2.out diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 2ec14c5..0fbaf55 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -187,14 +187,24 @@ class UnityModuleGenerator files = files_to_operate_on(module_name, pattern) - #Abort if any module already exists + #Abort if all of the module files already exist + all_files_exist = true files.each do |file| - raise "ERROR: File #{file[:name]} already exists. Exiting." if File.exist?(file[:path]) + if not File.exist?(file[:path]) + all_files_exist = false + end end + raise "ERROR: File #{files[0][:name]} already exists. Exiting." if all_files_exist # Create Source Modules files.each_with_index do |file, i| - FileUtils.mkdir_p(File.dirname(file[:path]), :verbose => false) # Create the path first if necessary. + # If this file already exists, don't overwrite it. + if File.exist?(file[:path]) + puts "File #{file[:path]} already exists!" + next + end + # Create the path first if necessary. + FileUtils.mkdir_p(File.dirname(file[:path]), :verbose => false) File.open(file[:path], 'w') do |f| f.write("#{file[:boilerplate]}\n" % [file[:name]]) unless file[:boilerplate].nil? f.write(file[:template] % [ file[:name], diff --git a/test/rakefile b/test/rakefile index 5df66fb..000ab00 100644 --- a/test/rakefile +++ b/test/rakefile @@ -10,9 +10,11 @@ $verbose = false require 'rake' require 'rake/clean' require UNITY_ROOT + 'rakefile_helper' +require 'rspec/core/rake_task' TEMP_DIRS = [ - File.join(UNITY_ROOT, 'build') + File.join(UNITY_ROOT, 'build'), + File.join(UNITY_ROOT, 'sandbox') ] TEMP_DIRS.each do |dir| @@ -40,6 +42,11 @@ task :scripts => [:prepare_for_tests] do end end +desc "Run all rspecs" +RSpec::Core::RakeTask.new(:spec) do |t| + t.pattern = 'spec/**/*_spec.rb' +end + desc "Generate test summary" task :summary do report_summary diff --git a/test/spec/generate_module_existing_file_spec.rb b/test/spec/generate_module_existing_file_spec.rb new file mode 100644 index 0000000..74e7fc8 --- /dev/null +++ b/test/spec/generate_module_existing_file_spec.rb @@ -0,0 +1,158 @@ + +require '../auto/generate_module.rb' +require 'fileutils' + +def touch_src(file) + FileUtils.touch "sandbox/src/#{file}" +end + +def touch_test(file) + FileUtils.touch "sandbox/test/#{file}" +end + +def create_src_with_known_content(file) + File.open("sandbox/src/#{file}", "w") {|f| f.write("the original #{file}")} +end + +def create_test_with_known_content(file) + File.open("sandbox/test/#{file}", "w") {|f| f.write("the original #{file}")} +end + +def expect_src_content_didnt_change(file) + expect(File.read("sandbox/src/#{file}")).to eq("the original #{file}") +end + +def expect_test_content_didnt_change(file) + expect(File.read("sandbox/test/#{file}")).to eq("the original #{file}") +end + +def expect_src_file_to_exist(file) + expect(File.exist?("sandbox/src/#{file}")).to be true +end + +def expect_test_file_to_exist(file) + expect(File.exist?("sandbox/test/#{file}")).to be true +end + +describe "UnityModuleGenerator" do + + before do + # clean sandbox and setup our "project" folders + FileUtils.rm_rf "sandbox" + FileUtils.mkdir_p "sandbox" + FileUtils.mkdir_p "sandbox/src" + FileUtils.mkdir_p "sandbox/test" + + @options = { + :path_src => "sandbox/src", + :path_tst => "sandbox/test", + } + end + + context "with src pattern" do + before do + @options[:pattern] = "src" + end + + it "fails when all files already exist" do + # create an existing triad of files + touch_src "meh.c" + touch_src "meh.h" + touch_test "Testmeh.c" + expect { + UnityModuleGenerator.new(@options).generate("meh") + }.to raise_error("ERROR: File meh already exists. Exiting.") + end + + it "creates the test file if the source and header files exist" do + # Create the existing files. + touch_src "meh.c" + touch_src "meh.h" + + UnityModuleGenerator.new(@options).generate("meh") + + expect_test_file_to_exist "Testmeh.c" + end + + it "does not alter existing files" do + # Create some files with known content. + create_src_with_known_content "meh.c" + create_src_with_known_content "meh.h" + + UnityModuleGenerator.new(@options).generate("meh") + + expect_src_content_didnt_change "meh.c" + expect_src_content_didnt_change "meh.c" + end + + it "does not alter existing test files" do + # Create some files with known content. + create_test_with_known_content "Testmeh.c" + + UnityModuleGenerator.new(@options).generate("meh") + + expect_test_content_didnt_change "Testmeh.c" + end + + end + + context "with mch pattern" do + before do + @options[:pattern] = "mch" + end + + it "fails when all files exist" do + touch_src "meh_model.c" + touch_src "meh_conductor.c" + touch_src "meh_hardware.c" + touch_src "meh_model.h" + touch_src "meh_conductor.h" + touch_src "meh_hardware.h" + touch_test "Testmeh_model.c" + touch_test "Testmeh_conductor.c" + touch_test "Testmeh_hardware.c" + expect { + UnityModuleGenerator.new(@options).generate("meh") + }.to raise_error("ERROR: File meh_model already exists. Exiting.") + end + + it "creates files that don't exist" do + touch_src "meh_model.c" + touch_src "meh_conductor.c" + touch_src "meh_hardware.c" + touch_src "meh_model.h" + touch_src "meh_conductor.h" + + UnityModuleGenerator.new(@options).generate("meh") + + expect_src_file_to_exist "meh_hardware.h" + expect_test_file_to_exist "Testmeh_model.c" + expect_test_file_to_exist "Testmeh_conductor.c" + expect_test_file_to_exist "Testmeh_hardware.c" + end + + it "does not alter existing source files" do + create_src_with_known_content "meh_model.c" + create_src_with_known_content "meh_model.c" + create_src_with_known_content "meh_model.c" + create_src_with_known_content "meh_model.h" + create_src_with_known_content "meh_model.c" + + UnityModuleGenerator.new(@options).generate("meh") + + expect_src_content_didnt_change "meh_model.c" + expect_src_content_didnt_change "meh_model.c" + expect_src_content_didnt_change "meh_model.c" + expect_src_content_didnt_change "meh_model.c" + end + + it "does not alter existing test files" do + create_test_with_known_content "Testmeh_model.c" + + UnityModuleGenerator.new(@options).generate("meh") + + expect_test_content_didnt_change "Testmeh_model.c" + end + + end +end From df2d37459bc51cdbc7a0352970995be4dff38408 Mon Sep 17 00:00:00 2001 From: Matt Chernosky Date: Fri, 2 Dec 2016 22:57:10 -0700 Subject: [PATCH 027/157] Try manually installing rspec in Travis CI. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 3b45fd7..c9af107 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ matrix: before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then rvm install 2.1 && rvm use 2.1 && ruby -v; fi +install: gem install rspec script: - cd test && rake ci - make -s From 5f386a42ff52332187d24981697664fbea850668 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 24 Nov 2016 23:12:41 -0600 Subject: [PATCH 028/157] Refactor of IntArray function with switch inside loop, remove repeated code --- src/unity.c | 132 +++++++++++++----------------------------- src/unity_internals.h | 5 +- 2 files changed, 43 insertions(+), 94 deletions(-) diff --git a/src/unity.c b/src/unity.c index c755ebb..f45e440 100644 --- a/src/unity.c +++ b/src/unity.c @@ -580,12 +580,13 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, const UNITY_DISPLAY_STYLE_T style) { UNITY_UINT32 elements = num_elements; - UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected; - UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual; + const unsigned int length = style & 0xF; + UNITY_INT expect_val = 0; + UNITY_INT actual_val = 0; UNITY_SKIP_EXECUTION; - if (elements == 0) + if (num_elements == 0) { UnityPrintPointlessAndBail(); } @@ -593,95 +594,44 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) return; - /* If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case - * as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific - * variants do not. Therefore remove this flag. */ - switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO)) + while (elements--) { - case UNITY_DISPLAY_STYLE_HEX8: - case UNITY_DISPLAY_STYLE_INT8: - case UNITY_DISPLAY_STYLE_UINT8: - while (elements--) - { - if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_exp, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_act, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 1); - ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 1); - } - break; - case UNITY_DISPLAY_STYLE_HEX16: - case UNITY_DISPLAY_STYLE_INT16: - case UNITY_DISPLAY_STYLE_UINT16: - while (elements--) - { - if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_exp, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_act, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 2); - ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 2); - } - break; + switch (length) + { + case 1: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; + break; + case 2: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; + break; + default: /* length 4 bytes */ + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; + break; #ifdef UNITY_SUPPORT_64 - case UNITY_DISPLAY_STYLE_HEX64: - case UNITY_DISPLAY_STYLE_INT64: - case UNITY_DISPLAY_STYLE_UINT64: - while (elements--) - { - if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_exp, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_act, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 8); - ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 8); - } - break; + case 8: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; + break; #endif - default: - while (elements--) - { - if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberUnsigned(num_elements - elements - 1); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_exp, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_act, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 4); - ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 4); - } - break; + } + + if (expect_val != actual_val) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expect_val, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual_val, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + expected = length + (const char*)expected; + actual = length + (const char*)actual; } } @@ -1194,8 +1144,8 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 1); - ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 1); + ptr_exp++; + ptr_act++; } } } diff --git a/src/unity_internals.h b/src/unity_internals.h index 34f0bd3..4dc8ab7 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -334,11 +334,10 @@ typedef void (*UnityTestFunction)(void); #define UNITY_DISPLAY_RANGE_INT (0x10) #define UNITY_DISPLAY_RANGE_UINT (0x20) #define UNITY_DISPLAY_RANGE_HEX (0x40) -#define UNITY_DISPLAY_RANGE_AUTO (0x80) typedef enum { -UNITY_DISPLAY_STYLE_INT = sizeof(int)+ UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_RANGE_AUTO, +UNITY_DISPLAY_STYLE_INT = sizeof(int)+ UNITY_DISPLAY_RANGE_INT, UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT, UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT, UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT, @@ -346,7 +345,7 @@ UNITY_DISPLAY_STYLE_INT = sizeof(int)+ UNITY_DISPLAY_RANGE_INT + UNITY_DISPLAY_R UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT, #endif -UNITY_DISPLAY_STYLE_UINT = sizeof(unsigned) + UNITY_DISPLAY_RANGE_UINT + UNITY_DISPLAY_RANGE_AUTO, +UNITY_DISPLAY_STYLE_UINT = sizeof(unsigned) + UNITY_DISPLAY_RANGE_UINT, UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT, UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT, UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT, From 46560a8030e10cfe86bef21d076b023ec9903d69 Mon Sep 17 00:00:00 2001 From: jsalling Date: Mon, 28 Nov 2016 23:39:11 -0600 Subject: [PATCH 029/157] Add correct masking behavior on unsigned values --- src/unity.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/unity.c b/src/unity.c index f45e440..c1be293 100644 --- a/src/unity.c +++ b/src/unity.c @@ -620,6 +620,13 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, if (expect_val != actual_val) { + if (style & UNITY_DISPLAY_RANGE_UINT && length < sizeof expect_val) + { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ + UNITY_INT mask = 1; + mask = (mask << 8 * length) - 1; + expect_val &= mask; + actual_val &= mask; + } UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); From e1e866ab4527a009de380be2bc4ecdd6eaed6b93 Mon Sep 17 00:00:00 2001 From: jsalling Date: Mon, 5 Dec 2016 23:20:03 -0600 Subject: [PATCH 030/157] Delete old UNITY_PTR type, no longer used The old type was really just used as a cast-to-int to do pointer math in char size. --- src/unity_internals.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/unity_internals.h b/src/unity_internals.h index 4dc8ab7..de6f3f1 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -140,13 +140,10 @@ *-------------------------------------------------------*/ #if (UNITY_POINTER_WIDTH == 32) - typedef UNITY_UINT32 UNITY_PTR; #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 #elif (UNITY_POINTER_WIDTH == 64) - typedef UNITY_UINT64 UNITY_PTR; #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 #elif (UNITY_POINTER_WIDTH == 16) - typedef UNITY_UINT16 UNITY_PTR; #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 #else #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) @@ -158,7 +155,6 @@ #ifndef UNITY_INTERNAL_PTR #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void* -/* #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const UNITY_UINT8* */ #endif /*------------------------------------------------------- @@ -647,7 +643,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) #define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_PTR)(expected), (UNITY_INT)(UNITY_PTR)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) #define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) #define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line)) #define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line)) @@ -663,7 +659,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EQUAL_HEX8_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_HEX8) #define UNITY_TEST_ASSERT_EQUAL_HEX16_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_HEX16) #define UNITY_TEST_ASSERT_EQUAL_HEX32_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_HEX32) -#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(UNITY_PTR*)(expected), (UNITY_INTERNAL_PTR)(UNITY_PTR*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_PTR_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_POINTER) #define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) #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)) From 53bdb6897fb375d6e8c1c07d4775ef175eabcc4f Mon Sep 17 00:00:00 2001 From: jsalling Date: Fri, 23 Dec 2016 22:53:24 -0600 Subject: [PATCH 031/157] Ability to set size of pointer list, smaller default size --- extras/fixture/src/unity_fixture.c | 5 ++--- extras/fixture/src/unity_fixture_internals.h | 3 +++ extras/fixture/test/unity_fixture_Test.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/extras/fixture/src/unity_fixture.c b/extras/fixture/src/unity_fixture.c index 125d1b7..ce02c4a 100644 --- a/extras/fixture/src/unity_fixture.c +++ b/extras/fixture/src/unity_fixture.c @@ -305,8 +305,7 @@ struct PointerPair void* old_value; }; -enum { MAX_POINTERS = 50 }; -static struct PointerPair pointer_store[MAX_POINTERS]; +static struct PointerPair pointer_store[UNITY_MAX_POINTERS]; static int pointer_index = 0; void UnityPointer_Init(void) @@ -316,7 +315,7 @@ void UnityPointer_Init(void) void UnityPointer_Set(void** pointer, void* newValue, UNITY_LINE_TYPE line) { - if (pointer_index >= MAX_POINTERS) + if (pointer_index >= UNITY_MAX_POINTERS) { UNITY_TEST_FAIL(line, "Too many pointers set"); } diff --git a/extras/fixture/src/unity_fixture_internals.h b/extras/fixture/src/unity_fixture_internals.h index 12a6acb..aa0d9e7 100644 --- a/extras/fixture/src/unity_fixture_internals.h +++ b/extras/fixture/src/unity_fixture_internals.h @@ -40,6 +40,9 @@ void UnityConcludeFixtureTest(void); void UnityPointer_Set(void** ptr, void* newValue, UNITY_LINE_TYPE line); void UnityPointer_UndoAllSets(void); void UnityPointer_Init(void); +#ifndef UNITY_MAX_POINTERS +#define UNITY_MAX_POINTERS 5 +#endif #ifdef __cplusplus } diff --git a/extras/fixture/test/unity_fixture_Test.c b/extras/fixture/test/unity_fixture_Test.c index 9bdbd5b..a842b08 100644 --- a/extras/fixture/test/unity_fixture_Test.c +++ b/extras/fixture/test/unity_fixture_Test.c @@ -465,7 +465,7 @@ TEST(LeakDetection, PointerSettingMax) TEST_IGNORE(); #else int i; - for (i = 0; i < 50; i++) UT_PTR_SET(pointer1, &int1); + for (i = 0; i < UNITY_MAX_POINTERS; i++) UT_PTR_SET(pointer1, &int1); UnityOutputCharSpy_Enable(1); EXPECT_ABORT_BEGIN UT_PTR_SET(pointer1, &int1); From 64f90b1925173a7767e58e73d261cec0bf0aed0b Mon Sep 17 00:00:00 2001 From: jsalling Date: Mon, 28 Nov 2016 23:36:52 -0600 Subject: [PATCH 032/157] Fix test that failed when any other test failed, too distracting --- test/tests/testunity.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 08c621a..5fc71bc 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -2272,15 +2272,18 @@ void putcharSpy(int c) void testFailureCountIncrementsAndIsReturnedAtEnd(void) { + UNITY_UINT savedFailures = Unity.TestFailures; Unity.CurrentTestFailed = 1; startPutcharSpy(); // Suppress output UnityConcludeTest(); - TEST_ASSERT_EQUAL(1, Unity.TestFailures); + endPutcharSpy(); + TEST_ASSERT_EQUAL(savedFailures + 1, Unity.TestFailures); + startPutcharSpy(); // Suppress output int failures = UnityEnd(); Unity.TestFailures--; endPutcharSpy(); - TEST_ASSERT_EQUAL(1, failures); + TEST_ASSERT_EQUAL(savedFailures + 1, failures); } void testCstringsEscapeSequence(void) From 65e401f3dea82b308153829e8e002ebf0011995f Mon Sep 17 00:00:00 2001 From: jsalling Date: Mon, 5 Dec 2016 21:21:03 -0600 Subject: [PATCH 033/157] Always run the tearDown() even if test is ignored --- auto/generate_test_runner.rb | 2 +- src/unity.c | 2 +- test/tests/testunity.c | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 134be65..8e8e5bb 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -276,7 +276,7 @@ class UnityTestRunnerGenerator output.puts(" TestFunc(#{va_args2}); \\") output.puts(" } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, \"Unhandled Exception!\"); } \\") if cexception output.puts(" } \\") - output.puts(" if (TEST_PROTECT() && !TEST_IS_IGNORED) \\") + output.puts(" if (TEST_PROTECT()) \\") output.puts(" { \\") output.puts(" #{@options[:teardown_name]}(); \\") output.puts(" CMock_Verify(); \\") unless (used_mocks.empty?) diff --git a/src/unity.c b/src/unity.c index c755ebb..1255af5 100644 --- a/src/unity.c +++ b/src/unity.c @@ -1275,7 +1275,7 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int setUp(); Func(); } - if (TEST_PROTECT() && !(Unity.CurrentTestIgnored)) + if (TEST_PROTECT()) { tearDown(); } diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 08c621a..bab24dc 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -67,7 +67,11 @@ void tearDown(void) { endPutcharSpy(); /* Stop suppressing test output */ if (SetToOneToFailInTearDown == 1) + { + /* These will be skipped internally if already failed/ignored */ TEST_FAIL_MESSAGE("<= Failed in tearDown"); + TEST_IGNORE_MESSAGE("<= Ignored in tearDown"); + } if ((SetToOneMeanWeAlreadyCheckedThisGuy == 0) && (Unity.CurrentTestFailed > 0)) { UnityPrint(": [[[[ Test Should Have Passed But Did Not ]]]]"); From 03e2209e1bd0c9a391af567d7ebc51c8d8689611 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 3 Dec 2016 21:38:40 -0600 Subject: [PATCH 034/157] Rename UNITY_SKIP_EXECUTION to RETURN_IF_FAIL_OR_IGNORE --- src/unity.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/unity.c b/src/unity.c index c755ebb..1a8dc4b 100644 --- a/src/unity.c +++ b/src/unity.c @@ -12,12 +12,10 @@ void UNITY_OUTPUT_CHAR(int); #endif -/* Helpful macros for us to use here */ +/* Helpful macros for us to use here in Assert functions */ #define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } #define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } - -/* return prematurely if we are already in failure or ignore state */ -#define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } +#define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return struct UNITY_STORAGE_T Unity; @@ -529,7 +527,7 @@ void UnityAssertBits(const UNITY_INT mask, const char* msg, const UNITY_LINE_TYPE lineNumber) { - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if ((mask & expected) != (mask & actual)) { @@ -550,7 +548,7 @@ void UnityAssertEqualNumber(const UNITY_INT expected, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style) { - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if (expected != actual) { @@ -583,7 +581,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected; UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual; - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if (elements == 0) { @@ -731,7 +729,7 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if (elements == 0) { @@ -764,7 +762,7 @@ void UnityAssertFloatsWithin(const UNITY_FLOAT delta, const char* msg, const UNITY_LINE_TYPE lineNumber) { - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if (!UnityFloatsWithin(delta, expected, actual)) @@ -787,7 +785,7 @@ void UnityAssertFloatSpecial(const UNITY_FLOAT actual, UNITY_INT is_trait = !should_be_trait; UNITY_INT trait_index = (UNITY_INT)(style >> 1); - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; switch(style) { @@ -860,7 +858,7 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if (elements == 0) { @@ -893,7 +891,7 @@ void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, const char* msg, const UNITY_LINE_TYPE lineNumber) { - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if (!UnityDoublesWithin(delta, expected, actual)) { @@ -916,7 +914,7 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, UNITY_INT is_trait = !should_be_trait; UNITY_INT trait_index = (UNITY_INT)(style >> 1); - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; switch(style) { @@ -980,7 +978,7 @@ void UnityAssertNumbersWithin( const UNITY_UINT delta, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style) { - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) { @@ -1019,7 +1017,7 @@ void UnityAssertEqualString(const char* expected, { UNITY_UINT32 i; - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; /* if both pointers not null compare the strings */ if (expected && actual) @@ -1059,7 +1057,7 @@ void UnityAssertEqualStringLen(const char* expected, { UNITY_UINT32 i; - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; /* if both pointers not null compare the strings */ if (expected && actual) @@ -1100,7 +1098,7 @@ void UnityAssertEqualStringArray( const char** expected, { UNITY_UINT32 i, j = 0; - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; /* if no elements, it's an error */ if (num_elements == 0) @@ -1161,7 +1159,7 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, UNITY_UINT32 elements = num_elements; UNITY_UINT32 bytes; - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; if ((elements == 0) || (length == 0)) { @@ -1206,7 +1204,7 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, void UnityFail(const char* msg, const UNITY_LINE_TYPE line) { - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; UnityTestResultsBegin(Unity.TestFile, line); UnityPrintFail(); @@ -1240,7 +1238,7 @@ void UnityFail(const char* msg, const UNITY_LINE_TYPE line) /*-----------------------------------------------*/ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) { - UNITY_SKIP_EXECUTION; + RETURN_IF_FAIL_OR_IGNORE; UnityTestResultsBegin(Unity.TestFile, line); UnityPrint(UnityStrIgnore); From 5f33721924cccbf48c8842841a30adb2295b2613 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 3 Dec 2016 22:24:03 -0600 Subject: [PATCH 035/157] Remove duplicate output of test name, Fixture verbose mode Remove UNITY_FIXTURES option, which was probably not doing what was originally indended. It was suppressing the test name even in quiet mode. --- examples/example_2/makefile | 1 - extras/fixture/src/unity_fixture.c | 5 +++++ src/unity.c | 9 --------- src/unity_internals.h | 2 -- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/examples/example_2/makefile b/examples/example_2/makefile index a834e78..36d3cd7 100644 --- a/examples/example_2/makefile +++ b/examples/example_2/makefile @@ -43,7 +43,6 @@ CFLAGS += -Wundef CFLAGS += -Wold-style-definition CFLAGS += -Wmissing-prototypes CFLAGS += -Wmissing-declarations -CFLAGS += -DUNITY_FIXTURES TARGET_BASE1=all_tests TARGET1 = $(TARGET_BASE1)$(TARGET_EXTENSION) diff --git a/extras/fixture/src/unity_fixture.c b/extras/fixture/src/unity_fixture.c index 125d1b7..7875242 100644 --- a/extras/fixture/src/unity_fixture.c +++ b/extras/fixture/src/unity_fixture.c @@ -81,7 +81,12 @@ void UnityTestRunner(unityfunction* setup, if (!UnityFixture.Verbose) UNITY_OUTPUT_CHAR('.'); else + { UnityPrint(printableName); + #ifndef UNITY_REPEAT_TEST_NAME + Unity.CurrentTestName = NULL; + #endif + } Unity.NumberOfTests++; UnityMalloc_StartTest(); diff --git a/src/unity.c b/src/unity.c index c755ebb..c178d93 100644 --- a/src/unity.c +++ b/src/unity.c @@ -357,28 +357,19 @@ void UnityPrintOk(void) static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line); static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) { -#ifndef UNITY_FIXTURES UnityPrint(file); UNITY_OUTPUT_CHAR(':'); UnityPrintNumber((UNITY_INT)line); UNITY_OUTPUT_CHAR(':'); UnityPrint(Unity.CurrentTestName); UNITY_OUTPUT_CHAR(':'); -#else - UNITY_UNUSED(file); - UNITY_UNUSED(line); -#endif } /*-----------------------------------------------*/ static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line); static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) { -#ifndef UNITY_FIXTURES UnityTestResultsBegin(Unity.TestFile, line); -#else - UNITY_UNUSED(line); -#endif UnityPrint(UnityStrFail); UNITY_OUTPUT_CHAR(':'); } diff --git a/src/unity_internals.h b/src/unity_internals.h index 34f0bd3..1abb1bd 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -597,8 +597,6 @@ extern const char UnityStrErr64[]; #define UNITY_END() UnityEnd() #endif -#define UNITY_UNUSED(x) (void)(sizeof(x)) - /*----------------------------------------------- * Command Line Argument Support *-----------------------------------------------*/ From a0cb138533711c51edf7d82f57c6666b746d3241 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 29 Dec 2016 20:46:06 -0600 Subject: [PATCH 036/157] Organize Makefile so clang works on all platforms, warnings are set Delete warning flags included by -Wall, -Wextra, or produce false postives --- test/Makefile | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/test/Makefile b/test/Makefile index 6c1120f..c24d58a 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,18 +1,20 @@ CC = gcc ifeq ($(shell uname -s), Darwin) CC = clang -CFLAGS += -std=c99 -pedantic -Wall -Weverything -Werror -CFLAGS += -Wno-unknown-warning-option -Wno-switch-enum -CFLAGS += -Wno-padded -Wno-double-promotion -Wno-missing-noreturn -CFLAGS += -Wno-missing-prototypes endif -ifeq ($(shell uname -s), Linux) -CFLAGS += -std=c99 -pedantic -Wall -Wextra -Werror +ifeq ($(findstring clang, $(CC)), clang) +E = -Weverything +CFLAGS += $E -Wno-unknown-warning-option -Wno-missing-prototypes +CFLAGS += -Wno-unused-macros -Wno-padded -Wno-missing-noreturn endif +CFLAGS += -std=c99 -pedantic -Wall -Wextra -Wconversion -Werror +CFLAGS += -Wno-switch-enum -Wno-double-promotion +CFLAGS += -Wbad-function-cast -Wcast-qual -Wold-style-definition -Wshadow -Wstrict-overflow \ + -Wstrict-prototypes -Wswitch-default -Wundef #DEBUG = -O0 -g CFLAGS += $(DEBUG) DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy -DEFINES += -D UNITY_SUPPORT_64 -D UNITY_INCLUDE_DOUBLE -D UNITY_NO_WEAK +DEFINES += -D UNITY_SUPPORT_64 -D UNITY_INCLUDE_DOUBLE SRC = ../src/unity.c tests/testunity.c build/testunityRunner.c INC_DIR = -I ../src COV_FLAGS = -fprofile-arcs -ftest-coverage -I ../../src @@ -23,6 +25,7 @@ TARGET = build/testunity-cov.exe # For verbose output of all the tests, run 'make test'. default: coverage .PHONY: default coverage test clean +coverage: DEFINES += -D UNITY_NO_WEAK coverage: $(BUILD_DIR)/testunityRunner.c cd $(BUILD_DIR) && \ $(CC) $(CFLAGS) $(DEFINES) $(foreach i,$(SRC), ../$i) $(COV_FLAGS) -o ../$(TARGET) @@ -32,9 +35,6 @@ coverage: $(BUILD_DIR)/testunityRunner.c gcov unity.c | head -3 grep '###' $(BUILD_DIR)/unity.c.gcov -C2 || true -test: CFLAGS += -Wbad-function-cast -Wcast-qual -Wconversion -Wformat=2 -Wold-style-definition \ --Wpointer-arith -Wredundant-decls -Wshadow -Wstrict-overflow=5 -Wstrict-prototypes \ --Wswitch-default -Wundef -Wunreachable-code -Wunused -fstrict-aliasing test: $(BUILD_DIR)/testunityRunner.c $(CC) $(CFLAGS) $(DEFINES) $(INC_DIR) $(SRC) -o $(TARGET) ./$(TARGET) @@ -50,11 +50,11 @@ $(BUILD_DIR)/testunityRunner.c: tests/testunity.c | $(BUILD_DIR) AWK_SCRIPT=\ '/^void test/{ declarations[d++]=$$0; gsub(/\(?void\)? ?/,""); tests[t++]=$$0; line[u++]=NR } \ - END{ print "\#include \"unity.h\" /* Autogenerated by awk in Makefile */" ; \ - for (i=0; i Date: Thu, 29 Dec 2016 20:47:03 -0600 Subject: [PATCH 037/157] Inline the isneg/ispos macros, remove promotion warnings on constants Originated from commit c6dc96f3 but are rarely used and not in math.h Removes float to double promotion warning and simplifies the code 'gcc -std=gnu99 -Wdouble-promotion' spits out these warnings --- src/unity.c | 30 +++++++++++------------------- src/unity_internals.h | 11 ++--------- test/tests/testunity.c | 5 +++-- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/unity.c b/src/unity.c index c755ebb..af5f838 100644 --- a/src/unity.c +++ b/src/unity.c @@ -688,11 +688,11 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, /*-----------------------------------------------*/ /* Wrap this define in a function with variable types as float or double */ #define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ - if (isinf(expected) && isinf(actual) && (isneg(expected) == isneg(actual))) return 1; \ + if (isinf(expected) && isinf(actual) && ((expected < 0) == (actual < 0))) return 1; \ if (UNITY_NAN_CHECK) return 1; \ diff = actual - expected; \ - if (diff < 0.0f) diff = 0.0f - diff; \ - if (delta < 0.0f) delta = 0.0f - delta; \ + if (diff < 0) diff = -diff; \ + if (delta < 0) delta = -delta; \ return !(isnan(diff) || isinf(diff) || (diff > delta)) /* This first part of this condition will catch any NaN or Infinite values */ #ifndef UNITY_NAN_NOT_EQUAL_NAN @@ -793,11 +793,11 @@ void UnityAssertFloatSpecial(const UNITY_FLOAT actual, { case UNITY_FLOAT_IS_INF: case UNITY_FLOAT_IS_NOT_INF: - is_trait = isinf(actual) & ispos(actual); + is_trait = isinf(actual) && (actual > 0); break; case UNITY_FLOAT_IS_NEG_INF: case UNITY_FLOAT_IS_NOT_NEG_INF: - is_trait = isinf(actual) & isneg(actual); + is_trait = isinf(actual) && (actual < 0); break; case UNITY_FLOAT_IS_NAN: @@ -805,13 +805,9 @@ void UnityAssertFloatSpecial(const UNITY_FLOAT actual, is_trait = isnan(actual) ? 1 : 0; break; - /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ - case UNITY_FLOAT_IS_DET: + case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ case UNITY_FLOAT_IS_NOT_DET: - if (isinf(actual) || isnan(actual)) - is_trait = 0; - else - is_trait = 1; + is_trait = !isinf(actual) && !isnan(actual); break; default: @@ -922,11 +918,11 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, { case UNITY_FLOAT_IS_INF: case UNITY_FLOAT_IS_NOT_INF: - is_trait = isinf(actual) & ispos(actual); + is_trait = isinf(actual) && (actual > 0); break; case UNITY_FLOAT_IS_NEG_INF: case UNITY_FLOAT_IS_NOT_NEG_INF: - is_trait = isinf(actual) & isneg(actual); + is_trait = isinf(actual) && (actual < 0); break; case UNITY_FLOAT_IS_NAN: @@ -934,13 +930,9 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, is_trait = isnan(actual) ? 1 : 0; break; - /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ - case UNITY_FLOAT_IS_DET: + case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ case UNITY_FLOAT_IS_NOT_DET: - if (isinf(actual) || isnan(actual)) - is_trait = 0; - else - is_trait = 1; + is_trait = !isinf(actual) && !isnan(actual); break; default: diff --git a/src/unity_internals.h b/src/unity_internals.h index 34f0bd3..b0311dc 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -187,6 +187,7 @@ #endif typedef UNITY_FLOAT_TYPE UNITY_FLOAT; +/* isinf & isnan macros should be provided by math.h */ #ifndef isinf /* The value of Inf - Inf is NaN */ #define isinf(n) (isnan((n) - (n)) && !isnan(n)) @@ -198,14 +199,6 @@ typedef UNITY_FLOAT_TYPE UNITY_FLOAT; #define isnan(n) ((n != n) ? 1 : 0) #endif -#ifndef isneg -#define isneg(n) ((n < 0.0f) ? 1 : 0) -#endif - -#ifndef ispos -#define ispos(n) ((n > 0.0f) ? 1 : 0) -#endif - #endif /*------------------------------------------------------- @@ -243,7 +236,7 @@ typedef UNITY_FLOAT_TYPE UNITY_FLOAT; /* Double Floating Point Support */ #ifndef UNITY_DOUBLE_PRECISION - #define UNITY_DOUBLE_PRECISION (1e-12f) + #define UNITY_DOUBLE_PRECISION (1e-12) #endif #ifndef UNITY_DOUBLE_TYPE diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 08c621a..e81e57a 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3274,8 +3274,9 @@ void testFloatPrinting(void) TEST_ASSERT_EQUAL_PRINT_FLOATING("8.3099991e+09", 8309999104.0f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 1.0e+10f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.0e+10", 10000000000.0f); - TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00005499e+10", 1.000055e+10f); - TEST_ASSERT_EQUAL_PRINT_FLOATING("1.10000006e+38", 1.10000005e+38f); + /* Some compilers have trouble with inexact float constants, a float cast works generally */ + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00005499e+10", (float)1.000055e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.10000006e+38", (float)1.10000005e+38f); TEST_ASSERT_EQUAL_PRINT_FLOATING("1.63529943e+10", 1.63529943e+10f); TEST_ASSERT_EQUAL_PRINT_FLOATING("3.40282347e+38", 3.40282346638e38f); From f771f0b98f0279fa90e5da174be8ee0af2a7b705 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 29 Dec 2016 23:06:34 -0600 Subject: [PATCH 038/157] Finish cleaning up float options in testunity --- src/unity_internals.h | 1 + test/tests/testunity.c | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/unity_internals.h b/src/unity_internals.h index 34f0bd3..00d1a16 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -230,6 +230,7 @@ typedef UNITY_FLOAT_TYPE UNITY_FLOAT; #endif #ifdef UNITY_EXCLUDE_FLOAT + #undef UNITY_EXCLUDE_FLOAT_PRINT #define UNITY_EXCLUDE_FLOAT_PRINT #else #ifndef UNITY_DOUBLE_TYPE diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 08c621a..3d2a366 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3286,7 +3286,7 @@ void testFloatPrinting(void) void testFloatPrintingRoundTiesToEven(void) { -#if defined(UNITY_EXCLUDE_FLOAT) || !defined(USING_OUTPUT_SPY) +#if defined(UNITY_EXCLUDE_FLOAT_PRINT) || !defined(USING_OUTPUT_SPY) TEST_IGNORE(); #else #ifdef UNITY_ROUND_TIES_AWAY_FROM_ZERO @@ -3301,7 +3301,7 @@ void testFloatPrintingRoundTiesToEven(void) void testFloatPrintingInfinityAndNaN(void) { -#if defined(UNITY_EXCLUDE_FLOAT) || !defined(USING_OUTPUT_SPY) +#if defined(UNITY_EXCLUDE_FLOAT_PRINT) || !defined(USING_OUTPUT_SPY) TEST_IGNORE(); #else TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0f / f_zero); @@ -3931,7 +3931,7 @@ void testNotEqualDoubleArraysLengthZero(void) void testDoublePrinting(void) { -#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) +#if defined(UNITY_EXCLUDE_FLOAT_PRINT) || defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) TEST_IGNORE(); #else TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.10046949999999999); @@ -3953,7 +3953,7 @@ void testDoublePrinting(void) void testDoublePrintingRoundTiesToEven(void) { -#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) +#if defined(UNITY_EXCLUDE_FLOAT_PRINT) || defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) TEST_IGNORE(); #else #ifdef UNITY_ROUND_TIES_AWAY_FROM_ZERO @@ -3968,7 +3968,7 @@ void testDoublePrintingRoundTiesToEven(void) void testDoublePrintingInfinityAndNaN(void) { -#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) +#if defined(UNITY_EXCLUDE_FLOAT_PRINT) || defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) TEST_IGNORE(); #else TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0 / d_zero); From e92f2c276204507ce79e30af3a97a5957ca18383 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 29 Dec 2016 23:10:43 -0600 Subject: [PATCH 039/157] Update comments to reflect changes to floating point --- examples/unity_config.h | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/examples/unity_config.h b/examples/unity_config.h index 744be9c..355d9bf 100644 --- a/examples/unity_config.h +++ b/examples/unity_config.h @@ -1,6 +1,6 @@ /* Unity Configuration * As of May 11th, 2016 at ThrowTheSwitch/Unity commit 837c529 - * Update: August 25th, 2016 + * Update: December 29th, 2016 * See Also: Unity/docs/UnityConfigurationGuide.pdf * * Unity is designed to run on almost anything that is targeted by a C compiler. @@ -37,11 +37,6 @@ #ifndef UNITY_CONFIG_H #define UNITY_CONFIG_H -#ifdef __cplusplus -extern "C" -{ -#endif - /* ************************* AUTOMATIC INTEGER TYPES *************************** * C's concept of an integer varies from target to target. The C Standard has * rules about the `int` matching the register size of the target @@ -122,10 +117,9 @@ extern "C" /* By default, Unity guesses that you will want single precision floating point * support, but not double precision. It's easy to change either of these using - * the include and exclude options here. You may include neither, either, or - * both, as suits your needs. + * the include and exclude options here. You may include neither, just float, + * or both, as suits your needs. */ -/* #define UNITY_INCLUDE_FLOAT */ /* #define UNITY_EXCLUDE_FLOAT */ /* #define UNITY_INCLUDE_DOUBLE */ /* #define UNITY_EXCLUDE_DOUBLE */ @@ -137,18 +131,15 @@ extern "C" /* Unity aims for as small of a footprint as possible and avoids most standard * library calls (some embedded platforms don't have a standard library!). * Because of this, its routines for printing integer values are minimalist and - * hand-coded. To keep Unity universal, though, we chose to _not_ develop our - * own floating point print routines. Instead, the display of floating point - * values during a failure are optional. By default, Unity will not print the - * actual results of floating point assertion failure. So a failed assertion - * will produce a message like `"Values Not Within Delta"`. If you would like - * verbose failure messages for floating point assertions, use these options to - * give more explicit failure messages (e.g. `"Expected 4.56 Was 4.68"`). Note - * that this feature requires the use of `sprintf` so might not be desirable in - * all cases. + * hand-coded. To keep Unity universal, though, we eventually chose to develop + * our own floating point print routines. Still, the display of floating point + * values during a failure are optional. By default, Unity will print the + * actual results of floating point assertion failures. So a failed assertion + * will produce a message like "Expected 4.0 Was 4.25". If you would like less + * verbose failure messages for floating point assertions, use this option to + * give a failure message `"Values Not Within Delta"` and trim the binary size. */ -/* #define UNITY_FLOAT_VERBOSE */ -/* #define UNITY_DOUBLE_VERBOSE */ +/* #define UNITY_EXCLUDE_FLOAT_PRINT */ /* If enabled, Unity assumes you want your `FLOAT` asserts to compare standard C * floats. If your compiler supports a specialty floating point type, you can @@ -211,8 +202,8 @@ extern "C" * serial `RS232_putc()` function you wrote like thus: */ /* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ -/* #define UNITY_OUTPUT_FLUSH() RS232_config(115200,1,8,0) */ -/* #define UNITY_OUTPUT_START() RS232_flush() */ +/* #define UNITY_OUTPUT_FLUSH() RS232_flush() */ +/* #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) */ /* #define UNITY_OUTPUT_COMPLETE() RS232_close() */ /* For some targets, Unity can make the otherwise required `setUp()` and @@ -232,6 +223,7 @@ extern "C" */ /* #define UNITY_SUPPORT_WEAK weak */ /* #define UNITY_SUPPORT_WEAK __attribute__((weak)) */ +/* #define UNITY_NO_WEAK */ /* Some compilers require a custom attribute to be assigned to pointers, like * `near` or `far`. In these cases, you can give Unity a safe default for these @@ -242,8 +234,4 @@ extern "C" /* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ /* #define UNITY_PTR_ATTRIBUTE near */ -#ifdef __cplusplus -} -#endif /* extern "C" */ - #endif /* UNITY_CONFIG_H */ From 4c78cde202ce7e1d77668b21c5f5968f819972b6 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 29 Dec 2016 23:52:03 -0600 Subject: [PATCH 040/157] Finish clean up of float support options --- src/unity.c | 2 +- src/unity_internals.h | 41 +++++++++++++++-------------------------- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/unity.c b/src/unity.c index c755ebb..91ff0b9 100644 --- a/src/unity.c +++ b/src/unity.c @@ -686,6 +686,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, } /*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT /* Wrap this define in a function with variable types as float or double */ #define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ if (isinf(expected) && isinf(actual) && (isneg(expected) == isneg(actual))) return 1; \ @@ -714,7 +715,6 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UnityPrint(UnityStrDelta) #endif /* UNITY_EXCLUDE_FLOAT_PRINT */ -#ifndef UNITY_EXCLUDE_FLOAT static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) { UNITY_FLOAT diff; diff --git a/src/unity_internals.h b/src/unity_internals.h index 00d1a16..e432e25 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -168,16 +168,15 @@ #ifdef UNITY_EXCLUDE_FLOAT /* No Floating Point Support */ -#undef UNITY_INCLUDE_FLOAT -#undef UNITY_FLOAT_PRECISION -#undef UNITY_FLOAT_TYPE +#ifndef UNITY_EXCLUDE_DOUBLE +#define UNITY_EXCLUDE_DOUBLE /* Remove double when excluding float support */ +#endif +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +#define UNITY_EXCLUDE_FLOAT_PRINT +#endif #else -#ifndef UNITY_INCLUDE_FLOAT -#define UNITY_INCLUDE_FLOAT -#endif - /* Floating Point Support */ #ifndef UNITY_FLOAT_PRECISION #define UNITY_FLOAT_PRECISION (0.00001f) @@ -212,30 +211,20 @@ typedef UNITY_FLOAT_TYPE UNITY_FLOAT; * Double Float Support *-------------------------------------------------------*/ -/* unlike FLOAT, we DON'T include by default */ -#ifndef UNITY_EXCLUDE_DOUBLE - #ifndef UNITY_INCLUDE_DOUBLE - #define UNITY_EXCLUDE_DOUBLE - #endif -#endif - -#ifdef UNITY_EXCLUDE_DOUBLE +/* unlike float, we DON'T include by default */ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(UNITY_INCLUDE_DOUBLE) /* No Floating Point Support */ - #undef UNITY_DOUBLE_PRECISION - #undef UNITY_DOUBLE_TYPE - - #ifdef UNITY_INCLUDE_DOUBLE + #ifndef UNITY_EXCLUDE_DOUBLE + #define UNITY_EXCLUDE_DOUBLE + #else #undef UNITY_INCLUDE_DOUBLE #endif - #ifdef UNITY_EXCLUDE_FLOAT - #undef UNITY_EXCLUDE_FLOAT_PRINT - #define UNITY_EXCLUDE_FLOAT_PRINT - #else - #ifndef UNITY_DOUBLE_TYPE - #define UNITY_DOUBLE_TYPE double - #endif + #ifndef UNITY_EXCLUDE_FLOAT + #ifndef UNITY_DOUBLE_TYPE + #define UNITY_DOUBLE_TYPE double + #endif typedef UNITY_FLOAT UNITY_DOUBLE; /* For parameter in UnityPrintFloat(UNITY_DOUBLE), which aliases to double or float */ #endif From 41df8feaee32474cf98dfee8f4d80b0584db537c Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 31 Dec 2016 13:59:07 -0600 Subject: [PATCH 041/157] Fix test for counting CMock_Verify calls --- test/testdata/testRunnerGeneratorWithMocks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/testdata/testRunnerGeneratorWithMocks.c b/test/testdata/testRunnerGeneratorWithMocks.c index de749c0..7eb0b67 100644 --- a/test/testdata/testRunnerGeneratorWithMocks.c +++ b/test/testdata/testRunnerGeneratorWithMocks.c @@ -183,9 +183,9 @@ void suitetest_ThisTestPassesWhenCustomSuiteSetupAndTeardownRan(void) void test_ShouldCallMockInitAndVerifyFunctionsForEachTest(void) { - int passes = (int)(Unity.NumberOfTests - Unity.TestFailures - Unity.TestIgnores); + int passesOrIgnores = (int)(Unity.NumberOfTests - Unity.TestFailures); TEST_ASSERT_EQUAL_MESSAGE(Unity.NumberOfTests, mockMock_Init_Counter, "Mock Init Should Be Called Once Per Test Started"); - TEST_ASSERT_EQUAL_MESSAGE(passes, mockMock_Verify_Counter, "Mock Verify Should Be Called Once Per Test Passed"); + TEST_ASSERT_EQUAL_MESSAGE(passesOrIgnores, mockMock_Verify_Counter, "Mock Verify Should Be Called Once Per Test Passed"); TEST_ASSERT_EQUAL_MESSAGE(Unity.NumberOfTests - 1, mockMock_Destroy_Counter, "Mock Destroy Should Be Called Once Per Test Completed"); TEST_ASSERT_EQUAL_MESSAGE(0, CMockMemFreeFinalCounter, "Mock MemFreeFinal Should Not Be Called Until End"); } From 5112d7dfbd24faf8483dcb7a0052add48c21cad3 Mon Sep 17 00:00:00 2001 From: jsalling Date: Fri, 6 Jan 2017 20:45:33 -0600 Subject: [PATCH 042/157] Use default int size for any bad STYLE_T enum value Defensive coding --- src/unity.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/unity.c b/src/unity.c index c1be293..a0e9986 100644 --- a/src/unity.c +++ b/src/unity.c @@ -580,9 +580,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, const UNITY_DISPLAY_STYLE_T style) { UNITY_UINT32 elements = num_elements; - const unsigned int length = style & 0xF; - UNITY_INT expect_val = 0; - UNITY_INT actual_val = 0; + unsigned int length = style & 0xF; UNITY_SKIP_EXECUTION; @@ -596,6 +594,8 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, while (elements--) { + UNITY_INT expect_val; + UNITY_INT actual_val; switch (length) { case 1: @@ -609,6 +609,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, default: /* length 4 bytes */ expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; + length = 4; break; #ifdef UNITY_SUPPORT_64 case 8: @@ -637,8 +638,8 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - expected = length + (const char*)expected; - actual = length + (const char*)actual; + expected = (UNITY_INTERNAL_PTR)(length + (const char*)expected); + actual = (UNITY_INTERNAL_PTR)(length + (const char*)actual); } } From 5449f1e4d1822c222dc21a9511db935bea4e765c Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 14 Jan 2017 10:41:03 -0600 Subject: [PATCH 043/157] Condense all longjmp calls into TEST_ABORT() The setjmp calls are all in TEST_PROTECT() already --- src/unity.c | 4 ++-- src/unity.h | 2 +- src/unity_internals.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/unity.c b/src/unity.c index 4c00f7e..8fb0b38 100644 --- a/src/unity.c +++ b/src/unity.c @@ -13,8 +13,8 @@ void UNITY_OUTPUT_CHAR(int); #endif /* Helpful macros for us to use here in Assert functions */ -#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } -#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } +#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; TEST_ABORT(); } +#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; TEST_ABORT(); } #define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return struct UNITY_STORAGE_T Unity; diff --git a/src/unity.h b/src/unity.h index a544bb2..30d0e91 100644 --- a/src/unity.h +++ b/src/unity.h @@ -72,7 +72,7 @@ void tearDown(void); /* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ -#define TEST_PASS() longjmp(Unity.AbortFrame, 1) +#define TEST_PASS() TEST_ABORT() /*------------------------------------------------------- * Test Asserts (simple) diff --git a/src/unity_internals.h b/src/unity_internals.h index 2faea1a..e5cfe5e 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -536,7 +536,7 @@ extern const char UnityStrErr64[]; #define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) -#define TEST_ABORT() {longjmp(Unity.AbortFrame, 1);} +#define TEST_ABORT() longjmp(Unity.AbortFrame, 1) /* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ #ifndef RUN_TEST From 4d747080a9350c87860e00319f57c2c4f54b05b4 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 14 Jan 2017 10:56:24 -0600 Subject: [PATCH 044/157] Rename Array Check helper, always return, never longjmp Move longjump inside caller, to functions returning 'void' This single function needed to change to allow optional setjmp.h --- src/unity.c | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/unity.c b/src/unity.c index 8fb0b38..50a00bc 100644 --- a/src/unity.c +++ b/src/unity.c @@ -480,32 +480,32 @@ static void UnityPrintExpectedAndActualStringsLen(const char* expected, const ch * Assertion & Control Helpers *-----------------------------------------------*/ -static int UnityCheckArraysForNull(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, const UNITY_LINE_TYPE lineNumber, const char* msg) +static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_LINE_TYPE lineNumber, + const char* msg) { - /* return true if they are both NULL */ - if ((expected == NULL) && (actual == NULL)) - return 1; + if (expected == actual) return 0; /* Both are NULL or same pointer */ - /* throw error if just expected is NULL */ + /* print and return true if just expected is NULL */ if (expected == NULL) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrNullPointerForExpected); UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; + return 1; } - /* throw error if just actual is NULL */ + /* print and return true if just actual is NULL */ if (actual == NULL) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrNullPointerForActual); UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; + return 1; } - /* return false if neither is NULL */ - return 0; + return 0; /* return false if neither is NULL */ } /*----------------------------------------------- @@ -578,8 +578,9 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UnityPrintPointlessAndBail(); } - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; + if (expected == actual) return; /* Both are NULL or same pointer */ + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + UNITY_FAIL_AND_BAIL; while (elements--) { @@ -685,8 +686,9 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, UnityPrintPointlessAndBail(); } - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; + if (expected == actual) return; /* Both are NULL or same pointer */ + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + UNITY_FAIL_AND_BAIL; while (elements--) { @@ -810,8 +812,9 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte UnityPrintPointlessAndBail(); } - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; + if (expected == actual) return; /* Both are NULL or same pointer */ + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + UNITY_FAIL_AND_BAIL; while (elements--) { @@ -1047,8 +1050,9 @@ void UnityAssertEqualStringArray( const char** expected, UnityPrintPointlessAndBail(); } - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; + if (expected == actual) return; /* Both are NULL or same pointer */ + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + UNITY_FAIL_AND_BAIL; do { @@ -1107,8 +1111,9 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, UnityPrintPointlessAndBail(); } - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; + if (expected == actual) return; /* Both are NULL or same pointer */ + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + UNITY_FAIL_AND_BAIL; while (elements--) { From ee3821949870afb38b844b6a5a2f688bface2bd7 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 14 Jan 2017 11:10:58 -0600 Subject: [PATCH 045/157] Cleanup Assert Array idiom to be the same everywhere --- src/unity.c | 45 +++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/src/unity.c b/src/unity.c index 50a00bc..c2f7925 100644 --- a/src/unity.c +++ b/src/unity.c @@ -573,10 +573,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, RETURN_IF_FAIL_OR_IGNORE; - if (num_elements == 0) - { - UnityPrintPointlessAndBail(); - } + if (num_elements == 0) UnityPrintPointlessAndBail(); if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) @@ -676,15 +673,10 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, const UNITY_LINE_TYPE lineNumber) { UNITY_UINT32 elements = num_elements; - UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; - UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; RETURN_IF_FAIL_OR_IGNORE; - if (elements == 0) - { - UnityPrintPointlessAndBail(); - } + if (num_elements == 0) UnityPrintPointlessAndBail(); if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) @@ -692,17 +684,17 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, while (elements--) { - if (!UnityFloatsWithin(*ptr_expected * UNITY_FLOAT_PRECISION, *ptr_expected, *ptr_actual)) + if (!UnityFloatsWithin(*expected * UNITY_FLOAT_PRECISION, *expected, *actual)) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*expected, *actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_expected++; - ptr_actual++; + expected++; + actual++; } } @@ -802,15 +794,10 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte const UNITY_LINE_TYPE lineNumber) { UNITY_UINT32 elements = num_elements; - UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; - UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; RETURN_IF_FAIL_OR_IGNORE; - if (elements == 0) - { - UnityPrintPointlessAndBail(); - } + if (num_elements == 0) UnityPrintPointlessAndBail(); if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) @@ -818,17 +805,17 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte while (elements--) { - if (!UnityDoublesWithin(*ptr_expected * UNITY_DOUBLE_PRECISION, *ptr_expected, *ptr_actual)) + if (!UnityDoublesWithin(*expected * UNITY_DOUBLE_PRECISION, *expected, *actual)) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*expected, *actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_expected++; - ptr_actual++; + expected++; + actual++; } } @@ -1045,10 +1032,7 @@ void UnityAssertEqualStringArray( const char** expected, RETURN_IF_FAIL_OR_IGNORE; /* if no elements, it's an error */ - if (num_elements == 0) - { - UnityPrintPointlessAndBail(); - } + if (num_elements == 0) UnityPrintPointlessAndBail(); if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) @@ -1106,10 +1090,7 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, RETURN_IF_FAIL_OR_IGNORE; - if ((elements == 0) || (length == 0)) - { - UnityPrintPointlessAndBail(); - } + if (num_elements == 0 || length == 0) UnityPrintPointlessAndBail(); if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) From ef1e2ad58c61f42c070e09d4ba0e8bc7b27d9b92 Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 14 Jan 2017 11:15:30 -0600 Subject: [PATCH 046/157] Option to exclude setjump/longjmp, setjmp.h Using this option changes the control flow of Unity, but is useful on constrained embedded systems. You can't fully simulate the power of 'longjmp' with just 'return', but Unity still works well, all tests pass. --- src/unity_internals.h | 10 +++++++++- test/tests/testunity.c | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/unity_internals.h b/src/unity_internals.h index e5cfe5e..a36eadd 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -11,7 +11,9 @@ #include "unity_config.h" #endif +#ifndef UNITY_EXCLUDE_SETJMP_H #include +#endif #ifndef UNITY_EXCLUDE_MATH_H #include @@ -371,7 +373,9 @@ struct UNITY_STORAGE_T UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifndef UNITY_EXCLUDE_SETJMP_H jmp_buf AbortFrame; +#endif }; extern struct UNITY_STORAGE_T Unity; @@ -534,9 +538,13 @@ extern const char UnityStrErr64[]; * Test Running Macros *-------------------------------------------------------*/ +#ifndef UNITY_EXCLUDE_SETJMP_H #define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) - #define TEST_ABORT() longjmp(Unity.AbortFrame, 1) +#else +#define TEST_PROTECT() 1 +#define TEST_ABORT() return +#endif /* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ #ifndef RUN_TEST diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 5f52ce2..7a1548a 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -99,7 +99,9 @@ void testUnitySizeInitializationReminder(void) UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifndef UNITY_EXCLUDE_SETJMP_H jmp_buf AbortFrame; +#endif } _Expected_Unity; #else struct { @@ -113,7 +115,9 @@ void testUnitySizeInitializationReminder(void) UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifndef UNITY_EXCLUDE_SETJMP_H jmp_buf AbortFrame; +#endif } _Expected_Unity; #endif From 836d7886cf648919bb3b2ffc18cfd176adf14463 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 11 Jan 2017 23:07:02 -0600 Subject: [PATCH 047/157] Pointer-to-int-cast warnings with different widths With a wider integer width than a pointer, gcc can still warn when you cast a pointer. Strange but true. To see these warnings compile with gcc -m32, 32-bit target, and enable UNITY_SUPPORT_64 --- src/unity_internals.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/unity_internals.h b/src/unity_internals.h index 2faea1a..0cfb507 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -140,10 +140,13 @@ *-------------------------------------------------------*/ #if (UNITY_POINTER_WIDTH == 32) +#define UNITY_PTR_TO_INT UNITY_INT32 #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 #elif (UNITY_POINTER_WIDTH == 64) +#define UNITY_PTR_TO_INT UNITY_INT64 #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 #elif (UNITY_POINTER_WIDTH == 16) +#define UNITY_PTR_TO_INT UNITY_INT16 #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 #else #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) @@ -624,7 +627,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) #define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_PTR_TO_INT)(expected), (UNITY_PTR_TO_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) #define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) #define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line)) #define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line)) From 01ca3899c2aadfc2da6eb51898d6ac39d55cccbc Mon Sep 17 00:00:00 2001 From: jsalling Date: Sat, 14 Jan 2017 12:22:00 -0600 Subject: [PATCH 048/157] Fix bug in DOUBLES_EQUAL in unity_fixture.h --- extras/fixture/src/unity_fixture.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extras/fixture/src/unity_fixture.h b/extras/fixture/src/unity_fixture.h index 93d76ea..e992b99 100644 --- a/extras/fixture/src/unity_fixture.h +++ b/extras/fixture/src/unity_fixture.h @@ -49,6 +49,7 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); }\ void TEST_##group##_##name##_(void) +/* Call this for each test, insider the group runner */ #define RUN_TEST_CASE(group, name) \ { void TEST_##group##_##name##_run(void);\ TEST_##group##_##name##_run(); } @@ -64,6 +65,7 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); TEST_##group##_GROUP_RUNNER(); } /* CppUTest Compatibility Macros */ +/* Sets a pointer and automatically restores it to its old value after teardown */ #define UT_PTR_SET(ptr, newPointerValue) UnityPointer_Set((void**)&(ptr), (void*)(newPointerValue), __LINE__) #define TEST_ASSERT_POINTERS_EQUAL(expected, actual) TEST_ASSERT_EQUAL_PTR((expected), (actual)) #define TEST_ASSERT_BYTES_EQUAL(expected, actual) TEST_ASSERT_EQUAL_HEX8(0xff & (expected), 0xff & (actual)) @@ -71,8 +73,9 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); #define CHECK(condition) TEST_ASSERT_TRUE((condition)) #define LONGS_EQUAL(expected, actual) TEST_ASSERT_EQUAL_INT((expected), (actual)) #define STRCMP_EQUAL(expected, actual) TEST_ASSERT_EQUAL_STRING((expected), (actual)) -#define DOUBLES_EQUAL(expected, actual, delta) TEST_ASSERT_FLOAT_WITHIN(((expected), (actual), (delta)) +#define DOUBLES_EQUAL(expected, actual, delta) TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual)) +/* You must compile with malloc replacement, as defined in unity_fixture_malloc_overrides.h */ void UnityMalloc_MakeMallocFailAfterCount(int count); #endif /* UNITY_FIXTURE_H_ */ From 480335061c1afbf7e5ac796e919f85d91a119a72 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 12 Jan 2017 22:18:14 -0600 Subject: [PATCH 049/157] No print masking of integers, bounds on hex printing --- src/unity.c | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/src/unity.c b/src/unity.c index 4c00f7e..9e9ebb7 100644 --- a/src/unity.c +++ b/src/unity.c @@ -52,21 +52,6 @@ static const char UnityStrResultsIgnored[] = " Ignored "; static const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; static const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; -/* compiler-generic print formatting masks */ -static const UNITY_UINT UnitySizeMask[] = -{ - 255u, /* 0xFF */ - 65535u, /* 0xFFFF */ - 65535u, - 4294967295u, /* 0xFFFFFFFF */ - 4294967295u, - 4294967295u, - 4294967295u -#ifdef UNITY_SUPPORT_64 - ,0xFFFFFFFFFFFFFFFF -#endif -}; - /*----------------------------------------------- * Pretty Printers & Test Result Output Handlers *-----------------------------------------------*/ @@ -155,13 +140,13 @@ void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T } else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) { - UnityPrintNumberUnsigned( (UNITY_UINT)number & UnitySizeMask[((UNITY_UINT)style & (UNITY_UINT)0x0F) - 1] ); + UnityPrintNumberUnsigned((UNITY_UINT)number); } else { UNITY_OUTPUT_CHAR('0'); UNITY_OUTPUT_CHAR('x'); - UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0x000F) << 1)); + UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2)); } } @@ -203,19 +188,21 @@ void UnityPrintNumberUnsigned(const UNITY_UINT number) /*-----------------------------------------------*/ void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) { - UNITY_UINT nibble; + int nibble; char nibbles = nibbles_to_print; + if ((unsigned)nibbles > 2 * sizeof number) nibbles = 2 * sizeof number; while (nibbles > 0) { - nibble = (number >> (--nibbles << 2)) & 0x0000000F; + nibbles--; + nibble = (number >> (nibbles * 4)) & 0x0F; if (nibble <= 9) { - UNITY_OUTPUT_CHAR((char)('0' + nibble)); + UNITY_OUTPUT_CHAR('0' + nibble); } else { - UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); + UNITY_OUTPUT_CHAR('A' - 10 + nibble); } } } From d460a89a040f4f0572da4f9041aa09aa27707d61 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 29 Dec 2016 22:13:06 -0600 Subject: [PATCH 050/157] Get example 1 to compile easily on systems without ruby --- examples/example_1/makefile | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/examples/example_1/makefile b/examples/example_1/makefile index 01abb55..8b8fa84 100644 --- a/examples/example_1/makefile +++ b/examples/example_1/makefile @@ -29,7 +29,6 @@ C_COMPILER=gcc CFLAGS=-std=c89 CFLAGS += -Wall CFLAGS += -Wextra -CFLAGS += -Werror CFLAGS += -Wpointer-arith CFLAGS += -Wcast-align CFLAGS += -Wwrite-strings @@ -53,14 +52,17 @@ SYMBOLS=-DTEST all: clean default -default: - ruby $(UNITY_ROOT)/auto/generate_test_runner.rb test/TestProductionCode.c test/test_runners/TestProductionCode_Runner.c - ruby $(UNITY_ROOT)/auto/generate_test_runner.rb test/TestProductionCode2.c test/test_runners/TestProductionCode2_Runner.c +default: $(SRC_FILES1) $(SRC_FILES2) $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $(SRC_FILES1) -o $(TARGET1) $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $(SRC_FILES2) -o $(TARGET2) - ./$(TARGET1) + - ./$(TARGET1) ./$(TARGET2) +test/test_runners/TestProductionCode_Runner.c: test/TestProductionCode.c + ruby $(UNITY_ROOT)/auto/generate_test_runner.rb test/TestProductionCode.c test/test_runners/TestProductionCode_Runner.c +test/test_runners/TestProductionCode2_Runner.c: test/TestProductionCode2.c + ruby $(UNITY_ROOT)/auto/generate_test_runner.rb test/TestProductionCode2.c test/test_runners/TestProductionCode2_Runner.c + clean: - $(CLEANUP) + $(CLEANUP) $(TARGET1) $(TARGET2) From 437c474b0771de405a18815135d7ea3d93072329 Mon Sep 17 00:00:00 2001 From: jsalling Date: Tue, 17 Jan 2017 21:26:15 -0600 Subject: [PATCH 051/157] Put back (char) casts, better formatting --- src/unity.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/unity.c b/src/unity.c index 9e9ebb7..c1bbeec 100644 --- a/src/unity.c +++ b/src/unity.c @@ -190,7 +190,8 @@ void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) { int nibble; char nibbles = nibbles_to_print; - if ((unsigned)nibbles > 2 * sizeof number) nibbles = 2 * sizeof number; + if ((unsigned)nibbles > (2 * sizeof(number))) + nibbles = 2 * sizeof(number); while (nibbles > 0) { @@ -198,11 +199,11 @@ void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) nibble = (number >> (nibbles * 4)) & 0x0F; if (nibble <= 9) { - UNITY_OUTPUT_CHAR('0' + nibble); + UNITY_OUTPUT_CHAR((char)('0' + nibble)); } else { - UNITY_OUTPUT_CHAR('A' - 10 + nibble); + UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); } } } From de6f516330d2c1c06ad2e1e4a02ef901764c5a2f Mon Sep 17 00:00:00 2001 From: jsalling Date: Tue, 17 Jan 2017 21:43:25 -0600 Subject: [PATCH 052/157] Revert "Cleanup Assert Array idiom to be the same everywhere" This reverts commit ee3821949870afb38b844b6a5a2f688bface2bd7. Removing these changes per coding standard, after the code review --- src/unity.c | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/src/unity.c b/src/unity.c index c2f7925..50a00bc 100644 --- a/src/unity.c +++ b/src/unity.c @@ -573,7 +573,10 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, RETURN_IF_FAIL_OR_IGNORE; - if (num_elements == 0) UnityPrintPointlessAndBail(); + if (num_elements == 0) + { + UnityPrintPointlessAndBail(); + } if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) @@ -673,10 +676,15 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, const UNITY_LINE_TYPE lineNumber) { UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; RETURN_IF_FAIL_OR_IGNORE; - if (num_elements == 0) UnityPrintPointlessAndBail(); + if (elements == 0) + { + UnityPrintPointlessAndBail(); + } if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) @@ -684,17 +692,17 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, while (elements--) { - if (!UnityFloatsWithin(*expected * UNITY_FLOAT_PRECISION, *expected, *actual)) + if (!UnityFloatsWithin(*ptr_expected * UNITY_FLOAT_PRECISION, *ptr_expected, *ptr_actual)) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*expected, *actual); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - expected++; - actual++; + ptr_expected++; + ptr_actual++; } } @@ -794,10 +802,15 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte const UNITY_LINE_TYPE lineNumber) { UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; RETURN_IF_FAIL_OR_IGNORE; - if (num_elements == 0) UnityPrintPointlessAndBail(); + if (elements == 0) + { + UnityPrintPointlessAndBail(); + } if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) @@ -805,17 +818,17 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte while (elements--) { - if (!UnityDoublesWithin(*expected * UNITY_DOUBLE_PRECISION, *expected, *actual)) + if (!UnityDoublesWithin(*ptr_expected * UNITY_DOUBLE_PRECISION, *ptr_expected, *ptr_actual)) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*expected, *actual); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - expected++; - actual++; + ptr_expected++; + ptr_actual++; } } @@ -1032,7 +1045,10 @@ void UnityAssertEqualStringArray( const char** expected, RETURN_IF_FAIL_OR_IGNORE; /* if no elements, it's an error */ - if (num_elements == 0) UnityPrintPointlessAndBail(); + if (num_elements == 0) + { + UnityPrintPointlessAndBail(); + } if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) @@ -1090,7 +1106,10 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, RETURN_IF_FAIL_OR_IGNORE; - if (num_elements == 0 || length == 0) UnityPrintPointlessAndBail(); + if ((elements == 0) || (length == 0)) + { + UnityPrintPointlessAndBail(); + } if (expected == actual) return; /* Both are NULL or same pointer */ if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) From 185fb4938007bcf9701ac6fac15d8e315ec9e38c Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 18 Jan 2017 08:13:41 -0600 Subject: [PATCH 053/157] Cleanup example Makefiles, update test runners Delete clang flags that were disabled with -Wno-* --- examples/example_1/makefile | 23 +++++++------- .../test_runners/TestProductionCode2_Runner.c | 2 +- .../test_runners/TestProductionCode_Runner.c | 2 +- examples/example_2/makefile | 30 +++++++++---------- test/targets/clang_file.yml | 6 ---- test/targets/clang_strict.yml | 6 ---- 6 files changed, 28 insertions(+), 41 deletions(-) diff --git a/examples/example_1/makefile b/examples/example_1/makefile index 8b8fa84..c5a3ca4 100644 --- a/examples/example_1/makefile +++ b/examples/example_1/makefile @@ -5,17 +5,14 @@ # ========================================== #We try to detect the OS we are running on, and adjust commands as needed -ifeq ($(OSTYPE),cygwin) - CLEANUP = rm -f - MKDIR = mkdir -p - TARGET_EXTENSION=.out -elseifeq ($(OSTYPE),msys) - CLEANUP = rm -f - MKDIR = mkdir -p - TARGET_EXTENSION=.exe -elseifeq ($(OS),Windows_NT) +ifeq ($(OS),Windows_NT) + ifeq ($(shell uname -s),) # not in a bash-like shell CLEANUP = del /F /Q MKDIR = mkdir + else # in a bash-like shell, like msys + CLEANUP = rm -f + MKDIR = mkdir -p + endif TARGET_EXTENSION=.exe else CLEANUP = rm -f @@ -23,8 +20,12 @@ else TARGET_EXTENSION=.out endif -UNITY_ROOT=../.. C_COMPILER=gcc +ifeq ($(shell uname -s), Darwin) +C_COMPILER=clang +endif + +UNITY_ROOT=../.. CFLAGS=-std=c89 CFLAGS += -Wall @@ -48,7 +49,7 @@ TARGET2 = $(TARGET_BASE2)$(TARGET_EXTENSION) SRC_FILES1=$(UNITY_ROOT)/src/unity.c src/ProductionCode.c test/TestProductionCode.c test/test_runners/TestProductionCode_Runner.c SRC_FILES2=$(UNITY_ROOT)/src/unity.c src/ProductionCode2.c test/TestProductionCode2.c test/test_runners/TestProductionCode2_Runner.c INC_DIRS=-Isrc -I$(UNITY_ROOT)/src -SYMBOLS=-DTEST +SYMBOLS= all: clean default diff --git a/examples/example_1/test/test_runners/TestProductionCode2_Runner.c b/examples/example_1/test/test_runners/TestProductionCode2_Runner.c index ebe858f..cf72c21 100644 --- a/examples/example_1/test/test_runners/TestProductionCode2_Runner.c +++ b/examples/example_1/test/test_runners/TestProductionCode2_Runner.c @@ -11,7 +11,7 @@ setUp(); \ TestFunc(); \ } \ - if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + if (TEST_PROTECT()) \ { \ tearDown(); \ } \ diff --git a/examples/example_1/test/test_runners/TestProductionCode_Runner.c b/examples/example_1/test/test_runners/TestProductionCode_Runner.c index f15a76f..3b49af7 100644 --- a/examples/example_1/test/test_runners/TestProductionCode_Runner.c +++ b/examples/example_1/test/test_runners/TestProductionCode_Runner.c @@ -11,7 +11,7 @@ setUp(); \ TestFunc(); \ } \ - if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + if (TEST_PROTECT()) \ { \ tearDown(); \ } \ diff --git a/examples/example_2/makefile b/examples/example_2/makefile index 36d3cd7..cfde2cc 100644 --- a/examples/example_2/makefile +++ b/examples/example_2/makefile @@ -5,17 +5,14 @@ # ========================================== #We try to detect the OS we are running on, and adjust commands as needed -ifeq ($(OSTYPE),cygwin) - CLEANUP = rm -f - MKDIR = mkdir -p - TARGET_EXTENSION=.out -elseifeq ($(OSTYPE),msys) - CLEANUP = rm -f - MKDIR = mkdir -p - TARGET_EXTENSION=.exe -elseifeq ($(OS),Windows_NT) +ifeq ($(OS),Windows_NT) + ifeq ($(shell uname -s),) # not in a bash-like shell CLEANUP = del /F /Q MKDIR = mkdir + else # in a bash-like shell, like msys + CLEANUP = rm -f + MKDIR = mkdir -p + endif TARGET_EXTENSION=.exe else CLEANUP = rm -f @@ -23,13 +20,16 @@ else TARGET_EXTENSION=.out endif -UNITY_ROOT=../.. C_COMPILER=gcc +ifeq ($(shell uname -s), Darwin) +C_COMPILER=clang +endif -CFLAGS = -std=c99 +UNITY_ROOT=../.. + +CFLAGS=-std=c99 CFLAGS += -Wall CFLAGS += -Wextra -CFLAGS += -Werror CFLAGS += -Wpointer-arith CFLAGS += -Wcast-align CFLAGS += -Wwrite-strings @@ -41,8 +41,6 @@ CFLAGS += -Wno-unknown-pragmas CFLAGS += -Wstrict-prototypes CFLAGS += -Wundef CFLAGS += -Wold-style-definition -CFLAGS += -Wmissing-prototypes -CFLAGS += -Wmissing-declarations TARGET_BASE1=all_tests TARGET1 = $(TARGET_BASE1)$(TARGET_EXTENSION) @@ -63,8 +61,8 @@ all: clean default default: $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $(SRC_FILES1) -o $(TARGET1) - ./$(TARGET1) -v + - ./$(TARGET1) -v clean: - $(CLEANUP) + $(CLEANUP) $(TARGET1) diff --git a/test/targets/clang_file.yml b/test/targets/clang_file.yml index 0d38e73..df1bd24 100644 --- a/test/targets/clang_file.yml +++ b/test/targets/clang_file.yml @@ -16,13 +16,10 @@ compiler: - '-Winit-self' - '-Winline' - '-Winvalid-pch' - - '-Wmissing-declarations' - '-Wmissing-include-dirs' - - '-Wmissing-prototypes' - '-Wnonnull' - '-Wpacked' - '-Wpointer-arith' - - '-Wredundant-decls' - '-Wswitch-default' - '-Wstrict-aliasing' - '-Wstrict-overflow=5' @@ -33,10 +30,7 @@ compiler: - '-Wshadow' - '-Wundef' - '-Wwrite-strings' - - '-Wno-missing-declarations' - - '-Wno-missing-prototypes' - '-Wno-nested-externs' - - '-Wno-redundant-decls' - '-Wno-unused-parameter' - '-Wno-variadic-macros' - '-Wbad-function-cast' diff --git a/test/targets/clang_strict.yml b/test/targets/clang_strict.yml index b862266..b399d76 100644 --- a/test/targets/clang_strict.yml +++ b/test/targets/clang_strict.yml @@ -16,13 +16,10 @@ compiler: - '-Winit-self' - '-Winline' - '-Winvalid-pch' - - '-Wmissing-declarations' - '-Wmissing-include-dirs' - - '-Wmissing-prototypes' - '-Wnonnull' - '-Wpacked' - '-Wpointer-arith' - - '-Wredundant-decls' - '-Wswitch-default' - '-Wstrict-aliasing' - '-Wstrict-overflow=5' @@ -33,10 +30,7 @@ compiler: - '-Wshadow' - '-Wundef' - '-Wwrite-strings' - - '-Wno-missing-declarations' - - '-Wno-missing-prototypes' - '-Wno-nested-externs' - - '-Wno-redundant-decls' - '-Wno-unused-parameter' - '-Wno-variadic-macros' - '-Wbad-function-cast' From 9cdc3d678b1c2b3bb1b60478f59cbf5a456c1a70 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 18 Jan 2017 08:43:29 -0600 Subject: [PATCH 054/157] Option to exclude CppUTest compatibility asserts --- extras/fixture/src/unity_fixture.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extras/fixture/src/unity_fixture.h b/extras/fixture/src/unity_fixture.h index e992b99..6f8d623 100644 --- a/extras/fixture/src/unity_fixture.h +++ b/extras/fixture/src/unity_fixture.h @@ -65,6 +65,7 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); TEST_##group##_GROUP_RUNNER(); } /* CppUTest Compatibility Macros */ +#ifndef UNITY_EXCLUDE_CPPUTEST_ASSERTS /* Sets a pointer and automatically restores it to its old value after teardown */ #define UT_PTR_SET(ptr, newPointerValue) UnityPointer_Set((void**)&(ptr), (void*)(newPointerValue), __LINE__) #define TEST_ASSERT_POINTERS_EQUAL(expected, actual) TEST_ASSERT_EQUAL_PTR((expected), (actual)) @@ -74,6 +75,7 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); #define LONGS_EQUAL(expected, actual) TEST_ASSERT_EQUAL_INT((expected), (actual)) #define STRCMP_EQUAL(expected, actual) TEST_ASSERT_EQUAL_STRING((expected), (actual)) #define DOUBLES_EQUAL(expected, actual, delta) TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual)) +#endif /* You must compile with malloc replacement, as defined in unity_fixture_malloc_overrides.h */ void UnityMalloc_MakeMallocFailAfterCount(int count); From b29ad2ee68c5cd22f183050ff8f5dd33fafffd14 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 18 Jan 2017 09:14:02 -0600 Subject: [PATCH 055/157] Removing unnecessary function prototypes, inline PrintOk/Fail --- src/unity.c | 25 +++---------------------- src/unity_internals.h | 1 + 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/unity.c b/src/unity.c index c76b85a..22abb4c 100644 --- a/src/unity.c +++ b/src/unity.c @@ -93,7 +93,6 @@ 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; @@ -326,21 +325,6 @@ void UnityPrintFloat(UNITY_DOUBLE number) #endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ /*-----------------------------------------------*/ - -void UnityPrintFail(void); -void UnityPrintFail(void) -{ - UnityPrint(UnityStrFail); -} - -void UnityPrintOk(void); -void UnityPrintOk(void) -{ - UnityPrint(UnityStrOk); -} - -/*-----------------------------------------------*/ -static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line); static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) { UnityPrint(file); @@ -352,7 +336,6 @@ static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) } /*-----------------------------------------------*/ -static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line); static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) { UnityTestResultsBegin(Unity.TestFile, line); @@ -384,7 +367,6 @@ void UnityConcludeTest(void) } /*-----------------------------------------------*/ -static void UnityAddMsgIfSpecified(const char* msg); static void UnityAddMsgIfSpecified(const char* msg) { if (msg) @@ -408,7 +390,6 @@ static void UnityAddMsgIfSpecified(const char* msg) } /*-----------------------------------------------*/ -static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual); static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) { UnityPrint(UnityStrExpected); @@ -1141,7 +1122,7 @@ void UnityFail(const char* msg, const UNITY_LINE_TYPE line) RETURN_IF_FAIL_OR_IGNORE; UnityTestResultsBegin(Unity.TestFile, line); - UnityPrintFail(); + UnityPrint(UnityStrFail); if (msg != NULL) { UNITY_OUTPUT_CHAR(':'); @@ -1245,11 +1226,11 @@ int UnityEnd(void) UNITY_PRINT_EOL(); if (Unity.TestFailures == 0U) { - UnityPrintOk(); + UnityPrint(UnityStrOk); } else { - UnityPrintFail(); + UnityPrint(UnityStrFail); #ifdef UNITY_DIFFERENTIATE_FINAL_FAIL UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); #endif diff --git a/src/unity_internals.h b/src/unity_internals.h index de22c86..e9fef63 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -419,6 +419,7 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int *-------------------------------------------------------*/ void UnityPrint(const char* string); +void UnityPrintLen(const char* string, const UNITY_UINT32 length); void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number); void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style); void UnityPrintNumber(const UNITY_INT number); From bb7f889f03d0148b847d4a0d85e29eeb1d561943 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 18 Jan 2017 08:18:37 -0600 Subject: [PATCH 056/157] Compile examples in continuous integration, update example_3 readme Altered the rake build so that it passes. The example_3 shows off some failing tests, so the rake build has to ignore those. Update .gitignore file with executables from examples --- .gitignore | 7 +++---- .travis.yml | 4 ++++ examples/example_3/rakefile_helper.rb | 4 +++- examples/example_3/readme.txt | 14 ++++---------- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index f0c7c3e..a383c3c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,9 @@ build/ test/sandbox .DS_Store +examples/example_1/test1.exe +examples/example_1/test2.exe +examples/example_2/all_tests.exe examples/example_1/test1.out examples/example_1/test2.out examples/example_2/all_tests.out -examples/example_3/test1.out -examples/example_3/test2.out -test/testparameterized.c.results -test/testunity.c.results diff --git a/.travis.yml b/.travis.yml index c9af107..b90fd42 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,10 @@ install: gem install rspec script: - cd test && rake ci - make -s + - make -s DEBUG=-m32 - cd ../extras/fixture/test && rake ci - make -s default noStdlibMalloc - make -s C89 + - cd ../../../examples/example_1 && make -s + - cd ../example_2 && make -s + - cd ../example_3 && rake \ No newline at end of file diff --git a/examples/example_3/rakefile_helper.rb b/examples/example_3/rakefile_helper.rb index 6702145..ed41d80 100644 --- a/examples/example_3/rakefile_helper.rb +++ b/examples/example_3/rakefile_helper.rb @@ -251,6 +251,8 @@ module RakefileHelpers def fail_out(msg) puts msg - exit(-1) + puts "Not returning exit code so continuous integration can pass" +# exit(-1) # Only removed to pass example_3, which has failing tests on purpose. +# Still fail if the build fails for any other reason. end end diff --git a/examples/example_3/readme.txt b/examples/example_3/readme.txt index df6fb18..7371fea 100644 --- a/examples/example_3/readme.txt +++ b/examples/example_3/readme.txt @@ -4,16 +4,10 @@ Example 3 This example project gives an example of some passing, ignored, and failing tests. It's simple and meant for you to look over and get an idea for what all of this stuff does. -You can build and test using the makefile if you have gcc installed (you may need to tweak -the locations of some tools in the makefile). Otherwise, the rake version will let you -test with gcc or a couple versions of IAR. You can tweak the yaml files to get those versions -running. +You can build and test using rake. The rake version will let you test with gcc or a couple +versions of IAR. You can tweak the yaml files to get those versions running. Ruby is required if you're using the rake version (obviously). This version shows off most of Unity's advanced features (automatically creating test runners, fancy summaries, etc.) - -The makefile version doesn't require anything outside of your normal build tools, but won't do the -extras for you. So that you can test right away, we've written the test runners for you and -put them in the test\no_ruby subdirectory. If you make changes to the tests or source, you might -need to update these (like when you add or remove tests). Do that for a while and you'll learn -why you really want to start using the Ruby tools. \ No newline at end of file +Without ruby, you have to maintain your own test runners. Do that for a while and you'll learn +why you really want to start using the Ruby tools. From 97e4bd252af1890a54a9af7e4ec17f5acbe9cf7e Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 18 Jan 2017 19:48:40 -0600 Subject: [PATCH 057/157] Ran Unity into a source code formatter, no code changes Used clang-format, which produces noise on stuff you don't care about and requires setting it up to match the existing code base. Kept the potentially useful changes, discarded the rest, some manual tweaking required. It did catch lots of pesky indentation mistakes. --- extras/fixture/src/unity_fixture.c | 13 +-- src/unity.c | 129 ++++++++++++++--------------- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/extras/fixture/src/unity_fixture.c b/extras/fixture/src/unity_fixture.c index 5f1bc27..3872bd8 100644 --- a/extras/fixture/src/unity_fixture.c +++ b/extras/fixture/src/unity_fixture.c @@ -5,9 +5,9 @@ * [Released under MIT License. Please refer to license.txt for details] * ========================================== */ -#include #include "unity_fixture.h" #include "unity_internals.h" +#include struct UNITY_FIXTURE_T UnityFixture; @@ -71,7 +71,8 @@ void UnityTestRunner(unityfunction* setup, const char* printableName, const char* group, const char* name, - const char* file, unsigned int line) + const char* file, + unsigned int line) { if (testSelected(name) && groupSelected(group)) { @@ -198,7 +199,7 @@ void* unity_malloc(size_t size) } else { - guard = (Guard*) &unity_heap[heap_index]; + guard = (Guard*)&unity_heap[heap_index]; heap_index += total_size; } #else @@ -290,7 +291,7 @@ void* unity_realloc(void* oldMem, size_t size) if (oldMem == unity_heap + heap_index - guard->size - sizeof(end) && heap_index + size - guard->size <= UNITY_INTERNAL_HEAP_SIZE_BYTES) { - release_memory(oldMem); /* Not thread-safe, like unity_heap generally */ + release_memory(oldMem); /* Not thread-safe, like unity_heap generally */ return unity_malloc(size); /* No memcpy since data is in place */ } #endif @@ -395,7 +396,9 @@ int UnityGetCommandLineOptions(int argc, const char* argv[]) i++; } } - } else { + } + else + { /* ignore unknown parameter */ i++; } diff --git a/src/unity.c b/src/unity.c index c76b85a..dbd6640 100644 --- a/src/unity.c +++ b/src/unity.c @@ -181,8 +181,7 @@ void UnityPrintNumberUnsigned(const UNITY_UINT number) { UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); divisor /= 10; - } - while (divisor > 0); + } while (divisor > 0); } /*-----------------------------------------------*/ @@ -420,7 +419,7 @@ static void UnityPrintExpectedAndActualStrings(const char* expected, const char* } else { - UnityPrint(UnityStrNull); + UnityPrint(UnityStrNull); } UnityPrint(UnityStrWas); if (actual != NULL) @@ -431,12 +430,14 @@ static void UnityPrintExpectedAndActualStrings(const char* expected, const char* } else { - UnityPrint(UnityStrNull); + UnityPrint(UnityStrNull); } } /*-----------------------------------------------*/ -static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const UNITY_UINT32 length) +static void UnityPrintExpectedAndActualStringsLen(const char* expected, + const char* actual, + const UNITY_UINT32 length) { UnityPrint(UnityStrExpected); if (expected != NULL) @@ -447,7 +448,7 @@ static void UnityPrintExpectedAndActualStringsLen(const char* expected, const ch } else { - UnityPrint(UnityStrNull); + UnityPrint(UnityStrNull); } UnityPrint(UnityStrWas); if (actual != NULL) @@ -458,12 +459,10 @@ static void UnityPrintExpectedAndActualStringsLen(const char* expected, const ch } else { - UnityPrint(UnityStrNull); + UnityPrint(UnityStrNull); } } - - /*----------------------------------------------- * Assertion & Control Helpers *-----------------------------------------------*/ @@ -599,7 +598,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, if (expect_val != actual_val) { - if (style & UNITY_DISPLAY_RANGE_UINT && length < sizeof expect_val) + if (style & UNITY_DISPLAY_RANGE_UINT && length < sizeof(expect_val)) { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ UNITY_INT mask = 1; mask = (mask << 8 * length) - 1; @@ -640,12 +639,11 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, #ifndef UNITY_EXCLUDE_FLOAT_PRINT #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ - do { \ + { \ UnityPrint(UnityStrExpected); \ UnityPrintFloat(expected); \ UnityPrint(UnityStrWas); \ - UnityPrintFloat(actual); \ - } while(0) + UnityPrintFloat(actual); } #else #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ UnityPrint(UnityStrDelta) @@ -719,14 +717,14 @@ void UnityAssertFloatSpecial(const UNITY_FLOAT actual, const UNITY_LINE_TYPE lineNumber, const UNITY_FLOAT_TRAIT_T style) { - const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; - UNITY_INT should_be_trait = ((UNITY_INT)style & 1); - UNITY_INT is_trait = !should_be_trait; - UNITY_INT trait_index = (UNITY_INT)(style >> 1); + const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); RETURN_IF_FAIL_OR_IGNORE; - switch(style) + switch (style) { case UNITY_FLOAT_IS_INF: case UNITY_FLOAT_IS_NOT_INF: @@ -845,14 +843,14 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, const UNITY_LINE_TYPE lineNumber, const UNITY_FLOAT_TRAIT_T style) { - const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; - UNITY_INT should_be_trait = ((UNITY_INT)style & 1); - UNITY_INT is_trait = !should_be_trait; - UNITY_INT trait_index = (UNITY_INT)(style >> 1); + const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); RETURN_IF_FAIL_OR_IGNORE; - switch(style) + switch (style) { case UNITY_FLOAT_IS_INF: case UNITY_FLOAT_IS_NOT_INF: @@ -899,16 +897,15 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, } } - #endif /* not UNITY_EXCLUDE_DOUBLE */ /*-----------------------------------------------*/ -void UnityAssertNumbersWithin( const UNITY_UINT delta, - const UNITY_INT expected, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) +void UnityAssertNumbersWithin(const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) { RETURN_IF_FAIL_OR_IGNORE; @@ -973,19 +970,19 @@ void UnityAssertEqualString(const char* expected, if (Unity.CurrentTestFailed) { - UnityTestResultsFailBegin(lineNumber); - UnityPrintExpectedAndActualStrings(expected, actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStrings(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; } } /*-----------------------------------------------*/ void UnityAssertEqualStringLen(const char* expected, - const char* actual, - const UNITY_UINT32 length, - const char* msg, - const UNITY_LINE_TYPE lineNumber) + const char* actual, + const UNITY_UINT32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber) { UNITY_UINT32 i; @@ -1013,20 +1010,19 @@ void UnityAssertEqualStringLen(const char* expected, if (Unity.CurrentTestFailed) { - UnityTestResultsFailBegin(lineNumber); - UnityPrintExpectedAndActualStringsLen(expected, actual, length); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStringsLen(expected, actual, length); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; } } - /*-----------------------------------------------*/ -void UnityAssertEqualStringArray( const char** expected, - const char** actual, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber) +void UnityAssertEqualStringArray(const char** expected, + const char** actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) { UNITY_UINT32 i, j = 0; @@ -1080,12 +1076,12 @@ void UnityAssertEqualStringArray( const char** expected, } /*-----------------------------------------------*/ -void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const UNITY_UINT32 length, - const UNITY_UINT32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber) +void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) { UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; @@ -1178,22 +1174,22 @@ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) UnityPrint(UnityStrIgnore); if (msg != NULL) { - UNITY_OUTPUT_CHAR(':'); - UNITY_OUTPUT_CHAR(' '); - UnityPrint(msg); + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); } UNITY_IGNORE_AND_BAIL; } /*-----------------------------------------------*/ #if defined(UNITY_WEAK_ATTRIBUTE) - UNITY_WEAK_ATTRIBUTE void setUp(void) { } - UNITY_WEAK_ATTRIBUTE void tearDown(void) { } + UNITY_WEAK_ATTRIBUTE void setUp(void) { } + UNITY_WEAK_ATTRIBUTE void tearDown(void) { } #elif defined(UNITY_WEAK_PRAGMA) -# pragma weak setUp - void setUp(void) { } -# pragma weak tearDown - void tearDown(void) { } + #pragma weak setUp + void setUp(void) { } + #pragma weak tearDown + void tearDown(void) { } #endif /*-----------------------------------------------*/ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) @@ -1267,7 +1263,7 @@ int UnityEnd(void) char* UnityOptionIncludeNamed = NULL; char* UnityOptionExcludeNamed = NULL; -int UnityVerbosity = 1; +int UnityVerbosity = 1; int UnityParseOptions(int argc, char** argv) { @@ -1278,7 +1274,7 @@ int UnityParseOptions(int argc, char** argv) { if (argv[i][0] == '-') { - switch(argv[i][1]) + switch (argv[i][1]) { case 'l': /* list tests */ return -1; @@ -1383,7 +1379,8 @@ int UnityStringArgumentMatches(const char* str) /* look for the start of the next partial */ ptr2 = ptr1; ptrf = 0; - do { + do + { ptr2++; if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) ptrf = &ptr2[1]; From e0104179ed4f9ff6d567156b63a3ac5cd0dc27ad Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 18 Jan 2017 22:18:11 -0600 Subject: [PATCH 058/157] Fix 32-bit build issues on Travis-CI by installing multilib If, longer term, the Travis-CI support for 32-bit is inconsistent the lines that failed are: - make -s DEBUG=-m32 - cd ../example_3 && rake Add target 'ci' for building examples with -Werror --- .travis.yml | 7 ++++--- examples/example_1/makefile | 2 ++ examples/example_2/makefile | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b90fd42..edf25ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ matrix: before_install: - if [ "$TRAVIS_OS_NAME" == "osx" ]; then rvm install 2.1 && rvm use 2.1 && ruby -v; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --assume-yes --quiet gcc-multilib; fi install: gem install rspec script: - cd test && rake ci @@ -19,6 +20,6 @@ script: - cd ../extras/fixture/test && rake ci - make -s default noStdlibMalloc - make -s C89 - - cd ../../../examples/example_1 && make -s - - cd ../example_2 && make -s - - cd ../example_3 && rake \ No newline at end of file + - cd ../../../examples/example_1 && make -s ci + - cd ../example_2 && make -s ci + - cd ../example_3 && rake diff --git a/examples/example_1/makefile b/examples/example_1/makefile index c5a3ca4..cca79b4 100644 --- a/examples/example_1/makefile +++ b/examples/example_1/makefile @@ -67,3 +67,5 @@ test/test_runners/TestProductionCode2_Runner.c: test/TestProductionCode2.c clean: $(CLEANUP) $(TARGET1) $(TARGET2) +ci: CFLAGS += -Werror +ci: default diff --git a/examples/example_2/makefile b/examples/example_2/makefile index cfde2cc..99d8d96 100644 --- a/examples/example_2/makefile +++ b/examples/example_2/makefile @@ -66,3 +66,5 @@ default: clean: $(CLEANUP) $(TARGET1) +ci: CFLAGS += -Werror +ci: default From b4f6afa4cf4f2b3b117ffcad43846f47aaa26c4c Mon Sep 17 00:00:00 2001 From: jsalling Date: Sun, 22 Jan 2017 21:18:53 -0600 Subject: [PATCH 059/157] Test for printing max width of a hex number, back to 100% test coverage Correct clean target and print test fails during coverage in Makefile --- test/Makefile | 4 ++-- test/tests/testunity.c | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/test/Makefile b/test/Makefile index c24d58a..03b59bc 100644 --- a/test/Makefile +++ b/test/Makefile @@ -30,7 +30,7 @@ coverage: $(BUILD_DIR)/testunityRunner.c cd $(BUILD_DIR) && \ $(CC) $(CFLAGS) $(DEFINES) $(foreach i,$(SRC), ../$i) $(COV_FLAGS) -o ../$(TARGET) rm -f $(BUILD_DIR)/*.gcda - ./$(TARGET) | grep Tests -A1 + ./$(TARGET) | grep 'Tests\|]]]' -A1 cd $(BUILD_DIR) && \ gcov unity.c | head -3 grep '###' $(BUILD_DIR)/unity.c.gcov -C2 || true @@ -60,4 +60,4 @@ $(BUILD_DIR): mkdir -p $(BUILD_DIR) clean: - rm -f $(BUILD_DIR)/$(TARGET) $(BUILD_DIR)/*.gc* $(BUILD_DIR)/testunityRunner.c + rm -f $(TARGET) $(BUILD_DIR)/*.gc* $(BUILD_DIR)/testunityRunner.c diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 7a1548a..f062894 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -2306,6 +2306,18 @@ void testCstringsEscapeSequence(void) #endif } +void testHexPrintsUpToMaxNumberOfNibbles(void) +{ +#ifndef USING_OUTPUT_SPY + TEST_IGNORE(); +#else + startPutcharSpy(); + UnityPrintNumberHex(0xBEE, 21); + endPutcharSpy(); + TEST_ASSERT_EQUAL_INT(sizeof(UNITY_INT)*2, strlen(getBufferPutcharSpy())); +#endif +} + #define TEST_ASSERT_EQUAL_PRINT_NUMBERS(expected, actual) { \ startPutcharSpy(); UnityPrintNumber((actual)); endPutcharSpy(); \ TEST_ASSERT_EQUAL_STRING((expected), getBufferPutcharSpy()); \ From 3588e5b6d3a282391fc253cc7ca02a096e153983 Mon Sep 17 00:00:00 2001 From: Crt Mori Date: Tue, 24 Jan 2017 22:52:43 +0100 Subject: [PATCH 060/157] Aligning definition and declaration of UnityPrintFloat There was a mismatch of definition and declaration of UnityPrintFloat and this commit aligns both on const UNITY_DOUBLE, but then inside it actually uses a positive version of the variable only. --- src/unity.c | 11 ++++++++--- src/unity_internals.h | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/unity.c b/src/unity.c index 91589e8..54a3452 100644 --- a/src/unity.c +++ b/src/unity.c @@ -269,12 +269,17 @@ static void UnityPrintDecimalAndNumberWithLeadingZeros(UNITY_INT32 fraction_part * else snprintf(buf, sizeof buf, "%.6f", number); * UnityPrint(buf); */ -void UnityPrintFloat(UNITY_DOUBLE number) +void UnityPrintFloat(const UNITY_DOUBLE input_number) { - if (number < 0) + UNITY_DOUBLE number; + + if (input_number < 0) { UNITY_OUTPUT_CHAR('-'); - number = -number; + number = -input_number; + } else + { + number = input_number; } if (isnan(number)) UnityPrint(UnityStrNaN); diff --git a/src/unity_internals.h b/src/unity_internals.h index e9fef63..bdcee92 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -427,7 +427,7 @@ void UnityPrintNumberUnsigned(const UNITY_UINT number); void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles); #ifndef UNITY_EXCLUDE_FLOAT_PRINT -void UnityPrintFloat(const UNITY_DOUBLE number); +void UnityPrintFloat(const UNITY_DOUBLE input_number); #endif /*------------------------------------------------------- From 1782bab0bacd349a45bc215ff91f082912cd7a64 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 31 Jan 2017 10:10:31 -0500 Subject: [PATCH 061/157] handle undetailed lines test summary python script. --- auto/unity_test_summary.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/auto/unity_test_summary.py b/auto/unity_test_summary.py index 8b4574e..4c20e52 100644 --- a/auto/unity_test_summary.py +++ b/auto/unity_test_summary.py @@ -86,9 +86,13 @@ class UnityTestSummary: results = { 'failures': [], 'ignores': [], 'successes': [] } for line in lines: parts = line.split(':') - if len(parts) != 5: + if len(parts) == 5: + src_file,src_line,test_name,status,msg = parts + elif len(parts) == 4: + src_file,src_line,test_name,status = parts + msg = '' + else: continue - src_file,src_line,test_name,status,msg = parts if len(self.root) > 0: line_out = "%s%s" % (self.root, line) else: From 4dc04d39776b266aaebe372a2144db076cfdc62a Mon Sep 17 00:00:00 2001 From: Jeremy Hannon Date: Tue, 7 Feb 2017 10:38:49 -0600 Subject: [PATCH 062/157] Enhance parseOutput.rb to support Unity fixture output unity.h and unity_fixture.h output their results in different string formats. This parseOutput.rb script already parsed the unity.h output to generate a JUnit-style XML summary which could be parsed by CI servers to graph the history of test pass/fail results. The changes in this commit allow the script to also handle the output format of unity_fixture.h which utilizes groups to add a layer of organization for tests. The changes in this commit were authored by Justin Seifi, my coworker, who has approved of me submitting his work back to this open source framework repo. --- auto/parseOutput.rb | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/auto/parseOutput.rb b/auto/parseOutput.rb index 7ea180f..e8dbf08 100644 --- a/auto/parseOutput.rb +++ b/auto/parseOutput.rb @@ -65,6 +65,17 @@ class ParseOutput @arrayList.push " " end end + +# Test was flagged as having passed so format the output. +# This is using the Unity fixture output and not the original Unity output. + def testPassedUnityFixture(array) + testSuite = array[0].sub("TEST(", "") + testSuite = testSuite.sub(",", "") + testName = array[1].sub(")", "") + if @xmlOut == true + @arrayList.push " " + end + end # Test was flagged as being ingored so format the output def testIgnored(array) @@ -73,6 +84,14 @@ class ParseOutput reason = array[lastItem].chomp testSuiteVerify(array[@className]) printf "%-40s IGNORED\n", testName + + if testName.start_with? "TEST(" + array2 = testName.split(" ") + @testSuite = array2[0].sub("TEST(", "") + @testSuite = @testSuite.sub(",", "") + testName = array2[1].sub(")", "") + end + if @xmlOut == true @arrayList.push " " @arrayList.push " " + reason + " " @@ -87,6 +106,14 @@ class ParseOutput reason = array[lastItem].chomp + " at line: " + array[lastItem - 3] testSuiteVerify(array[@className]) printf "%-40s FAILED\n", testName + + if testName.start_with? "TEST(" + array2 = testName.split(" ") + @testSuite = array2[0].sub("TEST(", "") + @testSuite = @testSuite.sub(",", "") + testName = array2[1].sub(")", "") + end + if @xmlOut == true @arrayList.push " " @arrayList.push " " + reason + " " @@ -138,7 +165,7 @@ class ParseOutput lineSize = lineArray.size # If we were able to split the line then we can look to see if any of our target words # were found. Case is important. - if lineSize >= 4 + if ((lineSize >= 4) || (line.start_with? "TEST(")) # Determine if this test passed if line.include? ":PASS" testPassed(lineArray) @@ -149,6 +176,12 @@ class ParseOutput elsif line.include? ":IGNORE:" testIgnored(lineArray) testIgnore += 1 + elsif line.start_with? "TEST(" + if line.include? " PASS" + lineArray = line.split(" ") + testPassedUnityFixture(lineArray) + testPass += 1 + end # If none of the keywords are found there are no more tests for this suite so clear # the test flag else From 65ce72729caf8652f2b90b60be044a48850cb6b6 Mon Sep 17 00:00:00 2001 From: Kate Hart Date: Mon, 13 Feb 2017 16:15:12 -0800 Subject: [PATCH 063/157] Fixed typo for TEST_PROTECT in readme `setjmp` returns 0 on direct invocation, and non-zero when returned to from `longjmp`. Because `TEST_PROTECT` checks the return value of `setjmp` against 0, checking the return value of `TEST_PROTECT` against 0 is incorrect in the readme. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fef275c..7a84ec6 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Example: main() { - if (TEST_PROTECT() == 0) + if (TEST_PROTECT()) { MyTest(); } From 1732698324ac1fd48c52deb2aeeb3372be9b1768 Mon Sep 17 00:00:00 2001 From: Kate Hart Date: Tue, 14 Feb 2017 09:55:40 -0800 Subject: [PATCH 064/157] Fixed incorrect TEST_PROTECT explanation in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7a84ec6..11759c8 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Example: } } -If MyTest calls `TEST_ABORT`, program control will immediately return to `TEST_PROTECT` with a non-zero return value. +If MyTest calls `TEST_ABORT`, program control will immediately return to `TEST_PROTECT` with a return value of zero. Unity Assertion Summary From 1bf22d39f5437f0ef11c784f613275c2dfa7cf5a Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 1 Mar 2017 10:15:06 +0100 Subject: [PATCH 065/157] Fix warnings with -Wdouble-promotion This fixes compiler warnings that clang produces with the -Wdouble-promotion compiler option. This only happens if double precision floating point numbers are enabled. The implicit double promotion occurs because numbers of type UNITY_FLOAT are passed into UnityPrintFloat, which expects const UNITY_DOUBLE. This commit fixes it by explicitly casting to UNITY_DOUBLE. --- src/unity.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/unity.c b/src/unity.c index 54a3452..1fcf3f3 100644 --- a/src/unity.c +++ b/src/unity.c @@ -669,7 +669,7 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(num_elements - elements - 1); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } @@ -691,7 +691,7 @@ void UnityAssertFloatsWithin(const UNITY_FLOAT delta, if (!UnityFloatsWithin(delta, expected, actual)) { UnityTestResultsFailBegin(lineNumber); - UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } @@ -746,7 +746,7 @@ void UnityAssertFloatSpecial(const UNITY_FLOAT actual, UnityPrint(trait_names[trait_index]); UnityPrint(UnityStrWas); #ifndef UNITY_EXCLUDE_FLOAT_PRINT - UnityPrintFloat(actual); + UnityPrintFloat((UNITY_DOUBLE)actual); #else if (should_be_trait) UnityPrint(UnityStrNot); From 7bce0b4f0c6dc3c362117a7d98bb51e5674a6383 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 1 Mar 2017 17:07:05 +0100 Subject: [PATCH 066/157] Fix warning with ubsan and -Wconversion This fixes a compiler warning about a lossy conversion from long unsigned int to int when compiling unity with gcc 6.3.1 and the options -std=c89 -Wconversion -fsanitize=undefined --- src/unity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unity.c b/src/unity.c index 1fcf3f3..5266364 100644 --- a/src/unity.c +++ b/src/unity.c @@ -194,7 +194,7 @@ void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) while (nibbles > 0) { nibbles--; - nibble = (number >> (nibbles * 4)) & 0x0F; + nibble = (int)(number >> (nibbles * 4)) & 0x0F; if (nibble <= 9) { UNITY_OUTPUT_CHAR((char)('0' + nibble)); From 41ee499e632e0432069bd9efbeeeb3245e160750 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 13 Mar 2017 16:46:41 -0400 Subject: [PATCH 067/157] Tiny tweaks to make Unity fit in more smoothly with Ceedling --- auto/generate_test_runner.rb | 1 + src/unity.h | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 8e8e5bb..5c5ead4 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -27,6 +27,7 @@ class UnityTestRunnerGenerator :plugins => [], :framework => :unity, :test_prefix => "test|spec|should", + :mock_prefix => "Mock", :setup_name => "setUp", :teardown_name => "tearDown", :main_name => "main", #set to :auto to automatically generate each time diff --git a/src/unity.h b/src/unity.h index 30d0e91..2cdd151 100644 --- a/src/unity.h +++ b/src/unity.h @@ -74,6 +74,10 @@ void tearDown(void); * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ #define TEST_PASS() TEST_ABORT() +/* This macro does nothing, but it is useful for build tools (like Ceedling) to make use of this to figure out + * which files should be linked to in order to perform a test. Use it like TEST_FILE("sandwiches.c") */ +#define TEST_FILE(a) + /*------------------------------------------------------- * Test Asserts (simple) *-------------------------------------------------------*/ From c67a4ffcf399a048040c34080358f17a65934200 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 13 Mar 2017 17:23:26 -0400 Subject: [PATCH 068/157] =?UTF-8?q?-=20Add=20ability=20to=20detect=20TEST?= =?UTF-8?q?=5FFILE(=E2=80=9Cfilename.c=E2=80=9D)=20specifications=20in=20t?= =?UTF-8?q?est=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto/generate_test_runner.rb | 4 +++- test/testdata/testRunnerGeneratorSmall.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 5c5ead4..fbb7d9c 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -73,6 +73,7 @@ class UnityTestRunnerGenerator all_files_used = [input_file, output_file] all_files_used += testfile_includes.map {|filename| filename + '.c'} unless testfile_includes.empty? all_files_used += @options[:includes] unless @options[:includes].empty? + all_files_used += headers[:linkonly] unless headers[:linkonly].empty? return all_files_used.uniq end @@ -146,7 +147,8 @@ class UnityTestRunnerGenerator #parse out includes includes = { :local => source.scan(/^\s*#include\s+\"\s*(.+)\.[hH]\s*\"/).flatten, - :system => source.scan(/^\s*#include\s+<\s*(.+)\s*>/).flatten.map { |inc| "<#{inc}>" } + :system => source.scan(/^\s*#include\s+<\s*(.+)\s*>/).flatten.map { |inc| "<#{inc}>" }, + :linkonly => source.scan(/^TEST_FILE\(\s*\"\s*(.+)\.[cC]\w*\s*\"/).flatten } return includes end diff --git a/test/testdata/testRunnerGeneratorSmall.c b/test/testdata/testRunnerGeneratorSmall.c index 9f4ec19..c683749 100644 --- a/test/testdata/testRunnerGeneratorSmall.c +++ b/test/testdata/testRunnerGeneratorSmall.c @@ -4,6 +4,8 @@ #include "unity.h" #include "Defs.h" +TEST_FILE("some_file.c") + /* Notes about prefixes: test - normal default prefix. these are "always run" tests for this procedure spec - normal default prefix. required to run default setup/teardown calls. From 8723d50f0e345fb43c5448d2bdabe6766ca9286d Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 14 Mar 2017 23:23:19 -0400 Subject: [PATCH 069/157] Turn UNITY_OUTPUT_FLUSH off by default. Added a quick-define for the most common case: UNITY_USE_FLUSH_STDOUT. Clarified documentation. Fixes issue #269 --- docs/UnityConfigurationGuide.pdf | Bin 253175 -> 143711 bytes src/unity_internals.h | 13 +++++++++---- test/targets/clang_strict.yml | 2 -- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/UnityConfigurationGuide.pdf b/docs/UnityConfigurationGuide.pdf index 5ca1a7f9a31fb4e079d97f38bad777301f9c7164..c14e88dc3a47c8d2bd0dca9366ef2718acd0a9e1 100644 GIT binary patch delta 51112 zcmb@tQ*QHdan%W&ooUKo`Kp&JAE;VFu^}7!?65Yyd`a05=;qCo6za z0l*DlR0I6m%*w)&VC0#wObW`H#uN;Sl~%n0&YdI!%5Cspi>!eE>td7^1L*QG85?tR znp?258=G0MGqam8n{qQTo3L6~7;|!&va)dr{QvGq+5;uy!J=~^6oV@dl)6+y8B+r% zS%~VtSOch-@Mv}O#G6&;fn(;ulc;0&?Jpt7MSqvcfoDzjaVe33ByT1OfSo2$f?I$x zC&hx}0C&$VP|O0rn6eptfM6K{r*gk(fR$+^lzVx_wR{%vTt=4s2?2ZN#qbQ=v)k(>;P6S1{QVz3o9Fdo$22w z4fGjQA#J-BlnvoO^Q_zeb{19!_Oya3urN%{{~Tc9_|L+B&HnGhX@Lx242@7wD4;+# zCJttRfB>AUn~S-zJ)BqerM`CDCI_njwPC>th=vzYpGjbD{l*L)_9*fwg#q0%XyOOZ zNIJ5ZsyR}{c{Pl{XE(zkqSy=lyef*E2j%%bw!?6}VK0rbOiG0WK@nzl`zhEtJ`Bj{$qmH9H**OBy!R` z9N72J&%b-La5e&ula3?s=~3uDqrM|FLj1w_jG@_D|x#6jggN(-R#XbydL^{h)^uKK5A<8Ix@N=a6sl-YqP89>$`Y#)4s! zxky)d{Kdp&hEE*BpYjV*c#nuwG&CqyII%{Yy?EtQu!12^VW)H?W@Q>H<4aNeW`PnhNGUSyqW70T3HfJe?S4; zj5);;2&*l5goz7TgL;>ElN!RFSug>|uo{??uo8clz~vm2McUb-BM&C01vUgmD)z~2 zmO560jhFePD~#ZU#ODrj9fZRGVQrI}Z99$gOOLH%v@$?B#}TMB4q{oeuIHy190e24 z&1VEgjLCILM6-Y-2%VjamAwiAj+W|Q7lhE}QxG8nCx&S226N51`xmgIk(w6W8F&^o z`5-UG|HC~=wxF?VdcBDbecnw_FRDX+^`W*tr+g??Ph~8@mON(L5GtI`4AX_f%OP3o zM$*}_S-qaf4AY9)166po=+9kuWwa1#sm@rk zYD1oWr`4MHUMN9xs)}p(PDP@%jWAO91>y$cXY|Qxa6Brs2tICu2gj>1$UJ#C8%Vs$ zk%CsR6wAE?q8MDFd^;$VKygGiqQ&05Ofak+XA5fvA}O%bvShE{5T4`l#YY_w=|#Js2w6D`+63R| z+J%$0DrBHQ5(81>H4`vcKdzB~#D@FjFftJ~aHd}2EO#DlonlELQ-t3vg8_dBmmEui z5a3s>O6DZ2F;_%VVJs(Wg?XprgD}eY6I51G76}u7ml^_krPO&F{(`syH%6qP>~wM0 z#MW&xNC<2_i1+6aNFW#^SH0#%Y``+GmZwY0k&8>fV?biohqN#W?4$QC!xtGYxu1AC}5Fh|^gRpyVI=SCX$?y#y3 zi=6<(Rc3?+$l@{o$P+MkK-Y38Sv1sd`oV;~>=aDDYCwQRLF@Bbe)qW-F+3j6>|bKK zcn9E_{5fa4WN2Hun4OVAR@h5|%U;&uu!7rjzZ?&)%#UCl5A$ov+y=YR*6gg#wJyb7oW=gzPI8b!PTo+l;c zMrBJIr}(9PFdgd?XFl@s9e`pxEJHWqD**Td2JZW3b^*xssrdNHC;F8?N=QmapJeaY zo10n`Yw=JOR5dI4GC4in%T8opT&5!Z3a=YJsR=$&^RY`_s*4ap z%$O`r=jduVJ*D_o2XX#j&0j3p@Zm5CHZfcXG4_i>+~Qz&ume5F#5xz(ea;rI;3}Yy zStCl+oGy1zl@Wxl!!N96<7IAN1zHwpR+`?wI{-AVC`Z2EL{+s!ST1G~^DY=;i4QLY zn4>``;UxFB#ckmbFU%(PoLTbp zZ*Toi89GY4ZqR#?rxpx@ChXe?k(xlS>w$J11@FBf^(m}Q!Z^A8@U{*_%tM3#~ z(zXG_X4qhmKVTFI%TJzlg^Gb!7Bbm3eQhOG1+#-e$r5n<4BAlkbflDWq-Q-NLfTqC z$k&ie6d2q&aOGpHcLdb;qw!xws357TljLE7Ja0)S&IuBL3 znGG6+IS4Zba^ZgC?cb!9QLq!Sog1qco_zpryinGwj<<&k3}z8x8|3 zC>HJ(w(Q*)KgJ~A{0ifcu0cW-hmk!Vx_OpMRW?5B$*r~LUdOB?n2GwKLZxMbe36n? zO3-8aoh4cwD~Zqw)l7<8Ns(pE-3~uO#F;K+Td?8v3AQQG4u4FOwqu4+D~zPp=xK*7 z&~Go%YNVioEdBhj{zdk$wg4<%gMbll>Dl;WRgKvlx+vr^cVu=up5 z)uSc2N~SK*ZNf?IYpx?My)(nCPsaUyq(Nwe_7YLGi=#7C)yPrZvfR>JZ#h`m^FEG4 z_D~<2Sr`bfhbos!)<$B;tkj)ExhDA~=kD$N#TCED4MmvZ4H*S2_noGAwaWSM#>i_} zfG(9OJpAxs2A`eQ~ zsb5E5W9fvjc8Gg$}~mEoBCp1fuPqr=SLAg{m+qL=&cNK$d);CrS5(S zy2t)aK&{ybZn(+qfHK$s3vt@~*?aFjW6d$V#;P_;x2VfiPmPG%>3BhF7?P~Ae};kO zku^rmYyR?iVB%g?tDD)6_qmbf+?88D>~i!{^ar{HB)$SWi3YXicW zWAAW=?Ur#NnruwU99oYshgAY;oAAuufW@Oz2A9J4+^IS`z)w=GgHkg+O*`kC(i+w! zDf0+?R66m=M)lIbT#`_pu}(Zcdj(Bbzy2NQH>r8P%%5G5m5Sfd-&oM7`)izHW_S~X zQBDyanSp*%scQ9!+(Rtrp;6?s3Jz;R>)vEwvhs=KY{~7?T;3&KY%2-NRH9UV-G-za zwP-Sd99vt=IJLe0qso;Oolw4PXlazHv0)x~-yPpQMbRVi^w}r3r|2!0+65wq;fK;P z*0*!ryp5c;p%krq7nAdAzthD23%Q^uZPfGNwGbUkmtsrS;K=S54T*y9DlNt)VFbzG zTVGwJ^6B-t-EOyl>>B=Gw~5)9VO4ieBTz5p-(NQTN zBctA6){MHvnpCaNpTbY{0y=v}kG`xiN94rJQ`8e3A(uVUox6_N@@zfxdVOlvg-*6K zxxjYkPL9_=vBFg|wJl_O!5mny3SVgs8OqTc7x{#7O{*X+U5>pOWbWT|_=C5WpS@jWKt7B8r*LZy@`7g!jrE;Q@0o-lUb@HFRmxVSAZI(&@lYz5c7H316`e`3TZV{$hoAy` zzdqld&v$Bpcq_{f18e7Q;HWcpi zy}_)Fb!J>o+jI?}MQvw;l}*K5_f&E?`LsSkLjjp`N2=-Cg9O}uo?X~-g2XAcII4}> z3SI{v*Y3Nv^g-SQZjLJVoAJWduyPuS<136s@nk0kDu3T`SJZTWT;Xd_7VyN1>ya#p zVI+(lXA@o4FC@Id75|DZW{0$PyNk|?#xJfS zN@O{)t@BSdiqE#hft2<~ucBvZurqJ(wm-VN(p%*)V6O4juH&ftg!E{Nvhnr@9Sh2R zZTtq-SOWhEFaK{HMPFs&ACM?r_ZR}DVK4_mg;Fro@e=#9VVO_h;oZejf3!mJU*6XV zGo_j#td?0DJ1>US{i@wL>tD8z?&Q#Hd4JQz3{J_IV0C!#$Uvy(WMiUlH#o|n^WJ(B zQvS8wLQ>9U#RRr(I5)8B5-d6u0L!TS8zb$?YV97?a|i@>qF)PgABMct(B+iRvkh?X z*B^%V0lF*WTb>JD9+}Vwt{g*ReXx}Y!G&{diFQS`=trA5K}VFHk>O2mp1r|;=f|&y ze|j`{+D&tA43H8BC&r}N;R66YDFoEGAWl&JIdf;_>tEWb<5$kLL8_4?KVU8EJ z8Dc^Ze-;QyWsT~WUM8MZpf;Pcwq6J4YDvV!U89;NX|25orB*Wv{`f}QnP2&;pv)8M zb*=-aNay1oX1BBZA(72r(E)m5&(qDdo;w2jHr^x}Zyp_z*TbveV3CEzpS?#7gxSe~TFHRl z@WpCAd9%4>d@!OI4(7AO)%h-28SY`{uS2olka_p#oYKAars}bPrxU?UmO#Xn*r0NX zX%~uj1|HGzzS1K1odW&($2=UC6c3bge{!EFXOr@ym55Omf=T1Y@AJJ&TM#p8CusKV6bCneFb>;8l$^s(XV@XSrTDeox z(AD&ysVbygrBq~8N{f?=<*3AD#>omu9zEuGK*SCFKU{>abk#LaK16QO_bAc`JfN7R)j+8eU}zu>b0m;nEI3VeL6|8#5s8Ibe8*J9#^&ES9DouB9(7Ys7<*&QM< z$;l!N9!6_~fcli_I<8@7#=9ri;>3OgB;Vc#SrG*_&a`1G!ctdnK7ZX40(c-#6gg=Kf2@x+H!5^H0cz!q}JycYY?W6 zW76}?WG+q&<^X6%9Uz`dX!IZCHa3R+D-;fsTuHK+9T;Qdi(MX?`-v(|HUVu03eU91 zM1$-v{@=rtVUB0(C20?D?*4vtZCRYjRv#N~F0vT0>ex256 zymzQG``rdYiw2dCVD)hE({e*XYO4*;LxIjI+T3{89$yNXN%OEI4oZv@h zZQkq8k3hN@#piPE?Il}A#~$`;g{;c{19QmE=H9<8{+&XTw`&bwE}pN=4zY^XzFIp5 z%lFdkjxXelFoupPhgq*jCM-FIb1zmwc4bqar~Ct3e%3Akq%g8+OyFc$x>gd>k&R0o z5wsu|4_|k$J@D^&(W@c+enc-LvD1qQQf|r8AgS6B|Pb-Z>Lz@{L+746d15B1V&{T=v}wpD(OWqWe42(jS(^ zsOywMw?WEaLoa{;->{vR)b#X1rGSEh|d*klX;2k>Cs` ziA^8Y4bnhWzDllX5&9Tpgfk!aVg!j}Q60s|6L*Wp0NELLi@ZX)-IRZFtaO1>cAX4O zTy@gTB{t@-3$EP90Wl)BO5~Pl+ceU1Gx2#iZ%NV+1ZUG4R>It5x&tP5u|4n&Eo<@c zSW^l{J7Cjl$##c+ue=16W66jJ!*ckVsa7F}JUT2q`cV;?fO@ z&T5AwL{dOwv9eJ<+g1y=! zz;-8O54ewLz4J8%8=j8(S3=j~A`!*=)NW1}d6C{S1NvYAq9<*W^$%;3k^09W&(o!? z!1%a7_+D9bUL&EY!5zvdQIv+qD9d)M$QZgy1*AkccsN-9AV^l%}GqKQSA>qBXR2>bpQaVP}FCgT=JG zg4W0$RAl^hx3IerGcWZChhl>`8HxAjXM)O54{_gK)FJZ`XN9dMXzQ%l zd>vpSOF@_GtupbE9O6=h;7iid>l-I67MLRNy-;K~zJQq5qGy(>u|A49(*q^o!p?-&(aFijpYe%LkA&>lp zw`+jw6I4#ONawSf+EkO=`m7F`zAA=j4BQou+1~lq_)cR~)s{_RW1+sFn za{adt_@(|vEFLGSUtaC$3CP)vKPV==mswmMCsRD~=;Ovoxa89sRRv^EQs2uk@PI zr0>_)1N0r=_dDRjf+UOI>%xx$vC1(ej2$kKJaBWve+Fo~*&~Y#d6XuNN+s%!lJ5cT z&##Av1^5i?oc3?ZQpLPHt9AkwzqdEDly{++%zrNE8#J*V8cFU}E%85g#<8jGWE>$WNpO??aw582~6SN)$FS4*kNm@He75v`cxV!q}yehRHw z=MiaQj2`he02g`wOL;}0908YMzs7ab*SMCF8(i1C5{;T))QIQz9eIavcK2lu}d*C(%jF+?J^Oh4`rQSe!*>MYt91-1GI}too6D-(i zJY18xX63ED<+=IH=eI`UQV`tTzNAsID~fRDUj~62pxAk!Mq;MW|LD89RJKgU!8X%kQf~ zDru=|nunt!Kef$yfM#aivIE3sgS8p+l%02M64O;qUGysyJR=HJV&1y98FF`CH$ za7K;hvVh$pOn7OfxY*$zDC0t~(7;EK-=O;?%vi}+U{-~^6{n{ZanK_KtPw3stt zq^02TOFg6!Al1HbR2BcE*B~Cax6)gLC{{ES|4=8dr6BrBNa=VgS}8U0C76xRL&<52 zz(1@0rHK$lpA|y(m)I&ppjpR{D!23_HLNVI)-fF+>4@)7a1e`=2y>Ad(ZKmfLw6ro z52yM+tJ z6pWhZM}c_MShvd0KIwH;O5hbYh7TRm?288p_G|%Pm^R~Z^*J<+Y{;2L^&Y9Q9uv23 zItC{SQeb1mj`kCH1d_XeP_t1z@+}Tq-VFmpI|jB>5dl^a_!5YHfL0y&2(m5TcDmyS z*g!0g$DhGA7zkVbSKy)W*NkDNcFE&up#8#ho=J2%bcGfu>sqFIG@r&bs|*Q=bLm#2n9Ei zUb12>yH&&bLLdlQKD~xv4zxHt*(rbb^w5s%F)=14Iv|F^Et?tLjQPSJduR+Cyjch@ zPN)30m{VYC_;ycHArRkqJRB-X0tC@T&*23^)Vw~OqFt0*!IUCWF?!EGfeXU4=Y!iK ztuD=rV4;2!crB{^`B-p)ZvAT$VEByV%86u|MYuN{1Sgnivi6*NLTO%Q#lf;%FuK=a zhWIF~A@6O13>_aWYjMWW*?ruNq>{+Tvk8jYkzcuR=D20a3beJrwwFM3B*wl=5Le|R za~*yHbl;34b`oOu!o}1@mg1XjGOISuDfHVdQ?cA|&E+G;bftz+s0)cAbfC48mUJ>ImQpH=2Y` zQCGJ(c^^#h0$CgOH7M`7+m~b97bqOuYZhSE2MRHUtkoOy(DYjdgku2A0+B_jbd8(N zH7(u#j?oW15t``;FL23Wxh>I1-VvoqH%F13PokF3h)EauCm_v((K*n6MYV{dkes;a z++cyo&^)^ahDu-QL9lWvJ9KU~lcEZ?E=1gESzYrNz_w<qyS_BkPqb<`VK8)j_wr?y z@O|$GHH-|h+OlJh;;-f={FnYd8yoMi$?rMbx z1i2k zyYLqhOiz+nbgQLdbsi@xc3Z~ng5`wcHle%4voDn+hutc`%g+4kZ3pTyu*cOKN#dci z$Z-)P@SBomZYN+V!3%8XW8#ncsbD>vY2EBohWn_ImE9W~msM{0c|~R~`OIw2vw_G; z%?l98MfZhJu^dwTJyKWvt6XcXnT7M!i|PVy>UY%)AA8Nu02;2SJpJQq=8GAwEJXLA zOpgSQPjy`A^~Z=T-(j!XC|!$Bb<{_l^1_8Mmt5nX9&d(KKNBuz-#@=I2sCkjLK>3e zj>8W#=i#LRmK`=E07z415Vc32mJAS7V0cebj~G_D+0Fj0o1ZM2Hv(Nrc~6{6 zyRA+ZSF(c&pkoH=?*;@{R((Ztp3ig)M+#ePJ1)my5;J85yR?Osye-zN<#X79hhoN* z+R5m=9O_=JMB#*|tQ9bUGcvxcy*(L*trQ=ta#hg$2oa6i3E>eIH)fCSxZLVwge0Ql zXa*m*LX>huTUL`aMh<0hy1>p@cidGJ#95h00V{a=?I-*a^;RY$xNy#Tljf`3HLq1P z$dEsiR?#Az>9Y85Dd<0klyL-j?72VSd=DLeh-?vaj9 zMk=mhi31&92sH}7%j=VE4>f!2_C?XfJBG~ZH6Y^$&M4%`2=T|72)0O_XY~tOdWtS-0>l$hIgJ?EuN_ONl!_2>=h-)fpaUn|YYA`~b`NOKE1l8{F03+Mh- z@=qYz%r!-3iR;wG61iLE@<;;+j0&%A-1eQg_Y8F16{#vX0D)XT6{`;rmy6=uL`Nuv z4R=3GMJg;Ri23!FM-(!vx@S5NA|4xk z3VzeRDf^)Fzcy9h&|Q>am}xtY|I-}2=NS|n6v)EO#{PeCaBW9YPE`Nr|8VeyJwK2r zNV~Y46a9brV<{GGh%vCSFQAdPdn2`by*4^IFDvdKVT284t;v!mG&RqU=lh5b!S#l- zGC{&G-y8DC2Bn)7Mr1*M&d-&UX`N8ZgYUd@wgEu}%J2JYqSBXrV67oh&v&3)@7Ij7 z@!}6=HTh(zBWgd`V!wzKF*@?jIA#esUzG&Cl$X$b_?6j(jlt(yvqBS%ue{vt9==&V zLYD5&Tcf3i2QMY!b=CpVyZ8EOvcG{F4jekGnxZxRU(w;)nU@D}72 zp};#EV8I#|YCcr6!%9h+3#Nk)Y|_dX1~%C!dIAvC1;vsNNNqK4c7>k@Tb7xHIqf?% z1=?lSH!pK@`(mB!(qx z&S(>aUZ(u^vx1(mNDY~fK9S9TdL~B(_^lWJKq2iW8CH6dKHVu-kw~o>WCjIGC|LDe z?y`>LC)q(VO0guU0t)87w$biBMmn{Zu8nEJR(zvESfe|E#XvI z>iFF7DDIV76+MTHn8(?tX@hER(y;I3QzRpDEx+Y`G2#-BrrN@qN_R>t;GEAh!kSOe zO?cP%cKR+47x5_Yi$S%)}lqw%X(=o z2S(2cFdL-VI#_Is+M4eE`qh-~esw*qo>HzTdZBQs2DFxB z^_f_Tr!yha;{4B8ZoaBC_2F5g^A0lyt4aH0I$XEDkRoJp*eD#*3;`FDkgkuB1uX$| zr5ylaaUI19GR4W>a{rSJ8fs#It9qJib6mR<_}d2li5Pvb10GR*R%?|3v9n%qz&Rr| zc}xcwOEx1Ab1AZpISA4qVAE0FlM2WK7Z7248Pcui*D7LCDmO!%DqmDYJ3x8BpM;zPTH6(~vwJ>#OyygW$#DEk)v!^ogGD93p1&cn zLww-dk7vnCS)i$2E)y;8k_Eq3Y!^M^RqGKw>ZMiV@Yx_L;U$07DPW;M2;E`Ugn{)8 zS5r@zpC#-TKZfR+hCIGh>r;^YiPCmm7hy|q_TzMvT7c(1vB;G73};m80&%|#IL60Q zBo@e^40d|x3|3sTB`gL}0w;20R5@u8&_RB3OOs#5?kuw)66|)Cx3o^br#jD1c9x#} z++imB+u0)XVbK;f$AM5UW9@>+sMt#l(vr&BX+oH{gk;7i89J9c-Wt;A_5Cb89TVhC zpuD$|g4hQQCRD3Zq;75P6?FaxC?D9UhJ{<5?;KcCNkG!DsP^t=R&li;WP6(FX*vlf zW$EiIo7`;#`DC3;8!x8yTq!j{fb3GlsD%+QjF?Xh@*tEDE-Ad4+!CcEm2k8YA)>Q% z`DL@Wc=?wIiM#o1G@SE2h*zLOvqxGk*1=Bj?;(jF1$VdXZ<`e=^FJ1AKpDYNZ57H3 zC}|xgnupyZmSMKl_}1~ipI&9+H?h&+*|+R@1pzHo>)@d+X7x4sl_Bt;jC$!xEV`o* z*<#9ai#D7gu;z~8EXy1#a4a&T70c*mYKQv(Q`P+6ytCMB5r5e>wfbD(=0)ifB*_pF7PCZ;AzynYk&J)@>zmMyFeg)H&$TgAd{L%Q zXBve>nRL4c_ap@@1p6+(NAjEiIx#md49mlHx{Ht)SeS?VOa)_rx5m<3Z#p=B4FYs-W{&xU`kW^rbLR}op<@%i*VmNuQ(f>xX)p%jf zVV|X4V%gs`GQ?yP=V(JCkUq*^v8>XzQNuk_@YD8q`$uTa~gF6gJ!u}L57BAlL7qp zR&hro@&)f+RQT9N&@lcZREu@poOC~S$36RPXyEDBN=)xlyzI{VH%~QEAFjv5>vTVH z<7YHRc%V=;{)S#6ZQ*IQ-Vxv9nF-omeM=3ZxFtRVi{m`Caj&sst`U(n1_@6O=Z!Ox zPm{CWh>^^`$PKzQYBMAio$|n{@bBNVGm1V3{wS}sA_>&6{$2e+_p@bm$1)E-PGvW z%%1iF+~h?;!hSI<*@mG!K7N6WOt8hlIQ?LL7!Ryq^Rm0$V{q?*Eqq&d6eb)czV`Tu z*}L5a(}P+)3(n8%wSn`k*u2(E@{-}A2(c3>OZsvUysVedVELle83H1zdbG{T^0{pbIalzd5`YEC~cMw?0?LIYyH=L$oJ2F_eCn67)np_ocH6@lsCx?HsgevRcZjP|s{_&&%GyUKrz4lv|N-vn$m$#Y=&itE7$@N)Z^( zZ?7)GiBEpj_V?tTNk6P%ze*r--k0aw%^6ThGQCh-5r#3>!<16u=-VnDfm10WdX;_W zcf_xgS@Oh=;~qGi9(V%a{_|NznNVS}F<0qb+Dlihu3}D+Otgw@Vf*!;#XDC(W}F<2 zr}h+9ai(>lo13U?H2Q=(k3KVLN^(O9&sf0SEGRRo{1%)RO{Bb@K|EABtd(|oyE~9Z za&NhVX+o6j>lYpuUI~lL*p^QJ6)gNC9xf>NiiHGi#=e931yUS}ll?xm(uCwd#W4jQ zywyd%g$D(mFG4;BVY8*t9f0LhZt|#jKo+{4YcF!K3yE_X9a<-Fyg%fJE@vne%^HSJ zsj;$!y{-FH2Noj=Dd;-X3H~O$WjPQsoSe`21drSOlu&#f2@aN%G$h&T2eaN3n^~el zO)+^?qOy1bF(&m{uObO~WD=Q0V)!0bb>pFSgs{G2~fEh-fa{xEh$CZHyAwkrYz4)08X|lqa~ti6Wb&4$ zRKjoAN;X-`z^yHlV4MHs;)JKn`fL3oF)3d4HurfGh;7Uq zcyzRcy>hc9&Q1U8MXr~qYBnw^c8M=jR|LZP&vkXd zP`Or)vNW-zyxLd|41MKpSfvx5K&`0VPy|)Z7CUrjS@^=WuUpl8H-Fx?1x7bpMC@0k zpXnjhpK*sDQKXd}xIgpr`#EiAXhWYyS9o4Dn`EZOtM8*5WRR zq^S4~mTt&~3j2-V%jp1qEX1fN9q!iJoTuj9*cwx0w&7|fYn#A9{V^rh_->c`j6yDE zO7s3!y!4)ceFI)NAuq2dM3<2xZbTILxR+gnded7^!z)a5AJ}JR&zuaetznmM{YkzD zBg%BzX`eZfpiT1rG{K#8h|xnnv7nxxm~N+EY7B$?llh~w=88I_b(%9`j4ZgE=okhB zsqouU7CmQ&&n-aZ-{VV#R!8stimBh+$ulzoQ-vWcmy6_ze~AfL7D#dM5a;xEV#hpL zH7PwAss7A0KzMK-^}S!z8Xrn_2lUOtB+`t+lMwZjW1 zfrc43w8ZntyV!y<&;1e2F-uYCnQ4S1xfIl8A;4f6=?i{6#YOndGd4zF#)tUuXj*`wU&MH zy7!WP&?pYl6>@})Hyc5rP-3F1nT7spe{-$~U7Hv{51q6*&>af@pBwrp7_u3CCs zQZ>A7Ks|uw8lRFo8!kg4q*p^}h9Es3I!7=az4B%1LNPz^gu|@tluR}@|F9Df3YzoA zG`}DTf#>fih&b3QnyL9Rr&FPbyTuhzYnfwb?~*pUL11lyd8Wkd=210bJ}8PjS0j0o z;jrg%7Z>ogR$(5_*opqIXXiIce_Cj&3(LL{V08k@?-O`zsjYH;Pv?B{)-r&#n%)-m zPdA6Nt?R1svZ!#U;xW`E{21Xmqrb?wMsN*7XtdF|c}g)u2_pkXSLJzV(lL>t!1W~2 zVqjGp+2FrsR%0fK%5)~~T&-OjD5CrDlA6`If`q4Cw{xpsLPcF38L}{|qL}C(OE)mO zw9N+QDw_pjlZ)Aj%pF^;k%gJ!m}1kAmqDh;n>JaYM-LnuP21}UvqW#QMZyu_?d5wr#6o+cqjmMJM04|1-w< zPkWEmc$!aVb?!BOPF@ht?%>*21gx=~i4j>b_Mgng_^6g_MZdsGyHNfxbK_Qbv3>Sf+)Y%a{n~7F3Uu`klA1UVO zBNI06ft~ngg#P(p9{mofd~%in@0KI1f1n8|}DvV4VQKq=@L zYKNud)eGoMx+1+R%uxG3a{&)B%K|UEV@P_SRp)4)P(Aovh99L{yd!m$4NI|$RlHo| z&#snmb1JPI8q;JmC*J5WV_{fY*LE$VMTI2`Sh$DKCRz`7Cli{OY+dEq^)iC5&^Q#t z^qTd@-3^_en#@r)tA$D|&>tg;BzO3RqWH)bg`i=CG$Ih2c>WBq&zvp(AoY8m-XCK? zEDj@@RllcOaw_2r0GckwH>vF})oJU>zYuysAc_GEbU76_NBZ>Fj()CC70@BE-c={n z{=3WUQc{g8MeQLxeUA4}{?WWMW@Hm9*{@ULUcDOsXQRxbR}UusdJXvIrxb>|-iOB! zNJ?zp&w7j(rYI8+Ubp*oBiOuAu7gQn2=qCUZ{WILw7NL17b0J)QvWYizMrcu;Boum zBhoDcjfx(@@HJ6rv(7L8GFI7mmb=kc7LnfMT{Gr6BG${!_1D^dnqb}J=10_3E(`*k z75X}8J0Uj3G9Ho-Wv!NsgIc7`(9l}fN3H82-8v2?H^%@SbX}bfBw!C%<5N8_Y}fva zAkmxJCanLk-hYU#|EqU~6Ay{d$Ce6isz zq)HN1TEy!t`|wFwSx9i1m9q>$b8Z)LmbKCX-KmdB#(rJIez+#lw1+vRU!HRm4EE=4 z_%kHCI+#VJZ_}2?2-w~ZZdn>9F`XOm!ub&La=XEB z?^JvN{v$UIk`UkT)Zg|4W=*@euN7A6C-2nLZ1M#Oo{+)v6H8(pZL-8-tZ}gd$|wn4 zqGHVIYpeT#C;+y8OY|b}kn`d;!-uCJa~nK^&-Jyk$jXNm?8#*n5P%7v{lI_C<10aX zDHE0DphfDaV6aoQ-!&1fuo&P&omIeYa`}6nCo2?Cj<`dR7hYW*4%YIO!A1zcb{^SDQ)8>5)Xy)Nlh4gX zdL|Ig9G4H1@}p1=ltE@*Aa%oSfw7fhL76(aD<5>;Ifsr5Mjb zk&#eLf@=bo|1&%EWCbe)buJ-Ap%~o1ojKDvcfA)(ZAn6xqRNS{pMh4A;MzM;=zGnM zbS#SxJL5KgjedN*4JBh8<+VF~0r{;s&L1~`xo6)Uw`UK7PyX$v(X*A@&|Y1&Pjf+` zy$Ae2j2uQ!|UIP2P(B=sv(`cK926CuzQ*Fif>9$2%I`h0^KM6cmKF;@ z*fyzfLHtqH#~ldv3Gk1*Av`%l5N@3azw+s;HgjDIpT`Ik(PK5$EAr>k?%$uqUh%AB z)Q~iA@Tx40RnqRA37>pA+CFC*l6|=k)x(U?8fT}%>61Xe`H2LxEefYq3Tp?zaD1VS zc3g0kBDuWmr%;MZ@0>^)LLstWKgB)JS8k!rax@YlRlSO`WV!(GU37a;k#n=8>_EtC zx$ah7JvXFGaizmO?mN{8^X&|ZL;c;uq7#UV>I;6kK>biM+K#N*M$ zTO*Z~oZN4UEOuMuB8CgEgIEZ$-oFO+VxNp(Hd-fZQ)i9a(s2CVMvrQNSfAk4g-Z+F zcOSnGM?yAUe|&x&l@j~CT%`ghkp=7bQoq2^$%Aq5IKeH}A*2Kq@cK zJwEW%QA8M~^&5E*wEwh;`HlDs@#-)<#Gih?jL0DOa; zA(&mXpga6scDMXK>UY|fGtW}6SJw)Ilf4WE25yK5iWTwcRbCHn_BBA&(`x4%CW9kz zbdNB0OU5xq{m z2a^68seF;gCb>?}0wDl&n~`bq3$dCTY1%h71v}Q;%XEaRCdZOlVS9)yk$#xRFx0lz zd05XghJb20ppr-HH%~w>G*MsoT0slkI&Ee`J#I|YXYPU1nQmOZMgcx&s-H>9!gDWc*d6`+g#&|o5qD|-J5ZQ^N3BB1vG?CJd0hiE(k#T zF^>c^tscT5AVQOYg!XgnNCnR^Gazgf3U(;`Hoyi&qf$`q`e7By zSBQjL5JJI%Sib?xTxF6&Oug*^LtJBPXc?7`w?hzEnYxjn&D!0VADWTU)S@bBbBGQ_ z!Kq*!ufRL%piTaZC{CPaxxOZPK6J93$cl!SZtbM%<77A_(tWx=1)v!!@_wOX=0c|0 z6}e=BnBHtF*(Eo|!CW+Dj&#eD{S~Dbm(M+}6{oGf=pYG{bqdR^^)NV*3jg(YNt~z( z5WE&6&4KV0-$3PXNi*jDuzq_n-xb+xUXUut9AWUIhgKg5bRlIh-qFUL?yik)FW(jR+_u0J0!$^re*dTfMK%{=Y7d zU0z6WAwpHS0@>~Ll}cH3?L?v){`Du`GXSJ2=`7Ap;y@*sRY+QDyvdg zx?=ovcvnCYkVE`PoAj8KS9~FV1Gfz&Aa*i(_seH zexL$zUzx?k-j!z~@caRMZNE^JQw-AxlQnelh2X#nXFT)Iu{*3Hso|p{>K{Q1DsIzx z=1aC!)M6cS!L3fWLSFYngv)bX;UNz^@&GX2{CxR z@cVcDy3r(8>1F}@5Db#D6zUzM+@L(;rwu?zS~N?od}n_aH-p%xJYMnAaW@1AG@rDW z{0aV~R;IU8G4JO$ILxc$-B2}_HcIkBU*3PBN>7`-OjKD%vN>qpCy55 zi;TTt7i1gyTzY>>OsG=`otCHdVl_Q&(ZLPGFF<6pCyHy zf^r!k`PiC>&Q-q(p|r@YTPsv5UVx+6X*X_B>I-B*iB>Vfu-xsi}^yFl*ek_H%xyydGj#KkVdG*vkg%*JBjJLERJ^ zdsu9t5++;EcEv-H3~kvf%J4Dp3$c`_BbKhU7B$H9SPj*!u`wYi&0JJ+l!K7AUIgZ; z!g4}dJ_$TY@0m=CYuKmV0MYW8NjB?Ph;ly#-O@L3h;howoNZ;t#Zc;1~M3 zhfvz|6KKet=$(|%5vb^0c5eBs(He^AuCC(iy}Q<2K&VK03&4UHW6sWEMcv_{X#%>! zvr1)5U_NKIP!Vvm3)=y_rL;zAy6!%*+BGA@ADIwIQ-?lf_H?MzhQVc+U1Dv)j)ld) zsbNVn|rH(P}PrRH^1k9C#I`6Ah zkOwU66Bg~-gTNLrYYU$;F}dMVx%nvW=e>VuyUR5C(u9>-74bo#SXQ<81@{(~gvqY1 zT|bjRBCPDgocn{-V1ifEx|BwL!BVO^(=mH>E=SB^(Mb7-6S4Z-!aqcMS8aq+g`@b` zcaxt8rpMletX8WW1>kv3C)GKT0XMMi_e5c1m_ zC<({OHxgF}=D)%z54KBC(?~`S3c0uPm0>w8D#R+)8Szy!9tTzC8)s|;sKog~OT^h( z?ugQnyFcZTBsOIp z6bx})HUw(opH|suSZrT+A8hIw*3)qgt<_Ss(-HP(W5N%IM(oV|{hxDF=<6=AtYO?X zcDo|z583ma7c_zy7?N^(p;nJ*lc{0rKuFk^pOzsKaG{r|z$rcBESYP##i{n8p7(|Q z`Q;Ta5$#ns-?w9rNjre-HEjPiz0(vna|Y}=I&oPM^ai3u1#wr3R*CjO+hqt|Lh>I~ zaD>$O!y1_{WL67YXfm+So{yT+rF+bnPSw3B#zyh@_^OsllBTmRt&%sfu;gXV0>a+K`LjD1{huTiPi@j#{5xT%mR|T zbY&WZ$`0in;(?;Ws={knqS|rpl}eo8 zBII-y0tHhEUk}Zihx@d&$X?ofL~d|0Q+|5>Y*)V_l@5#ko)a+Jq8wFtUiK?Ipji58 zr=nh%Uo4BRc107|AQm!B#cbKzy-EB7NucN8;V%&K;t-Uk?UdW=nChRJqIwW+2g4N# zS{TCuj0aOrZ0(t36OoXpb1=-ix7j}5&~7X3wv>WwEr)&(9yo^fqy|>}?-8&63O8Gg zs=&UDo2(q)cGUl`DdGx$%?^+A-nXY97rbro4Fm&Ts^RDa5#bQLp&s+M>wl@&jGeM^ zeJ9tV6f>RhIkwva4aNlnhhF%bujH1X?b`ju%49C4K>-y!1OLAH`{-aS1KD}qHg6&(S>=X zjF049(8cNJ!qJIjgJQSS7io$@E~85>vX+2vw`Ox!Vqn?PLT~DK+Krt!VOa3)v}Qst zy0gP+0M_WbldWF&*kX(RZnx%UOKs@>c5A2bOZU5kcE7h!-p`~5j19f5XbH;IO#Yg? zRZWvlPA3G59{f9q%Jad`hi~jdp+E`5cy>JB>jcIK)}HkLSO+427t7QJ(-!hU4Jn0( zIfT^$Xexr&?ZjY4ez~|FkV-^$XTZ8o$&eRE-5ho36$fF8Nw zq9<26lrc_izmd)YdAX|C9!5NF0`9;-;++UF-TS_?Z?t_Z?c5%p=%<7k6l*C_@yW8* zi`=V4C}~SFC2bpAlJN9&Ui8FC>8&H>#3tbd33|+AG59oXzWD@sA!-{AxEp%g!@Q=+ zBT7t_F-DMxfU;_3lfpodAZQS`$M9}Yd%|YW$JaFS2+mdDMEG1_ov2U18>mL3xe9cY zgqEIT1_}rHR7+ok_54`Q;h?h{SxlRqvC3wV8|v=|+pWr>jKyE{t@Bx8(&57XS+F9i z;q&XZ{5YD>cC`f3;Lcgluma}MG*Gi>TIw1VMAr2KLE zGBG=wLsyGW>;s~PjhGtYOvt%O6GhR^%Z!=cy)WfNWFy0}H)-0v?LgKsVCG9fH0M`I zAL@<~MLHMLn|SKIi6SAB3Yqmb3*_bu-bIn=Ka1Mo-22@e#>xFL zs<>BHbAw2~aaioO23mq4XjZ|4d0KZ37>R(gSvMTo~*cnh{5?L9c?dCXsr=QOHh+m!_II|_(tcXDI z8u1E;+#zp2GtG{h+81iafl8%44(y-$e5#%H>ep^TyNT>`Za-iGzuvK6!99Z!H-yg* zBE%{8a;zjt@c(5o4fzME?9d?1Ki2>K_bI_$G!=tnrkFHE)rb5;s&a{Df|id6JtU|c zR;@Wco1~ylg`c?;A3@HcL0hiuGWrS#G8n)y`*||Hx>ApPS+*q96@&RefqIh%iJ!!# zaJE*QF6L9l>-{Thh!#~*G7q}+;Kw;cjK6BWb@jkoyb$Y*P3a{9sozRSAZxeE`uZN1 z0975BCaWfQYHq?YO0fj zaT1c$lh#w%LNYFeDWqM|=YkFJ!0RInx7~@5cOG{Glmyh)WeIszCidxe20k@Z#GDA& z8`*?jRQT}D+SoF7Ni_w!LNeqsR|$!Frlk#^vorH>?T>T77w@Nz46e+C=dcuin{e{R zX1z%NE7&Bu1Yr^Jk-dI+3@-uiO|xz)C8lLqv{>t6iHC+$v~I1;O!OYu8-TEoxM#3( z6PEo>OnrlGB5cpbQPPO{2r=VYaSa*2r*8+R|CUv^jm<)sWeeYbC^IP?e{kSf%s~|BIJP-K&%8I?h#9dZB9r0&!x?{BQ)v zyNeX6ar-#KM_(YiYQ-Cf3Bm7<*hP85qhu&L|2r&k3Q-6yN?l0kBGeQaN^rV3s~ZC2 zN5q^tMH2&rDu~*_%EL?4{*Kl}m8H0j;~ZuLOQR<ygOpB_DTfsamy|AK{59xv@@{!TQLKP&W@yk72{byugy*ef1{G!hCe zo6m7}-`##s0QfWTADJi+la)R=TaIoxhs4Hm&)9Afda#ep&PlWd%s`;KZDm~ zCk1m5gDK6hch_tvx4X`P>cl}Bm}4Bt2C`pHGRW4S`y45tip6NvexYxEe)Ou51^zCG z)2_bFuwl{KPSjr)L?hPfE0rq)kJ8TPiU8T@$tUG3)uCHh>YtP>)@-H?f@OGTb!$^H zbY|$#esUy?$oa}OSv{kGNEEGRz5&81yE5m^`?Xi*bRZj$15Z4J z)(_&ri*L2qr;=U@F$~oFgb5mh7v7SHD%CR9B7629d)#m-jX99FW*P{VU}jdI6nA|# zv@NJSq^8#ZBc)YYyz7@^1;vbxMXOjd9YBz25 zdhe;P6vY+L#8e@J1`(3-9C&@(|D7+xR=?K%RoIMzyRoMY(0pTL# z+&@*a&-KAoG#aUqj~2@O1Ycdqv#DVhz8y|<0JU4X^~(1m^)9OEfUrrtzD0^g4~{To ze3?WCyIY%V2*Rg%@B5dwRFn4&mVXU|*nf(Frs2E|8cKrR(E-!ZJ_o~1hiWsYFG|+y z>ea-f`-eyJSFBuxW3J4WCrG9|GKi)zVJwrCdqk|@nQ~E(VFk9LW1^SPM;jW8n0{@a z2I}rZ-hD=hZJ6TGekP;t2avb|S(q1u0%M3_^0?o1{`IC)ywET1RaNtWtfP22TaIa< zX(H}*-8$ogIuCI~#lHco-YX6vfn?9P08bTi-iw4*qhpHA36?99PabDpo{7q}5uq|x z$at^yy)Mr2Xix8Q$e_K#hx_b$dTC3kA27mFM&6+q_WRNt;Gn-3Se@*i^s~V!NSJ~p z7AVO)g0&VMjiOV<%m}|&#kt--X<2uH=JSQB+D;?soPUU;$dQ8V6@vkjma$h?c)1qI z?8O=qAJ#@PT|zm`iR*@HxX$Q`Q@Ui0@_j@dys4xnVx5RCP+NT3KErd-FHNKAr6E1n zN=TZoqPE?JEK>%bT|Wh35IJtgK=ThOB+r{4kXKS>T zbaKESC7xt8>o1({tymbMWzFg1Qk6W&qJI@kUr@_r4^B~IFr^p1TFYB&trA74r8g*Lc9xTZza$o^-Z z33=2sHn!Xrc*IvvVp55y8`WV7tRMjWm2FezGyEonj{l_k*E-iDHqz;lsE{M`1M|7L zgmx+G=OIdD(1+4z;k)E(?EOvQd(*rnElbyegT~y)|2s**6k-gc>tT`h96nE;XpZ1t zcxfN!7XCg!%$GuYZ5k^HYb$OqkhA5duDD>={z`rOco<05JSu1hI(_x(zh?$Lw0<4g z&v(q6wck5?oeQQK0JT3I4kYMR z?9Jonpl|}YCub+q)isPjdsw|p8^yI#Nb~WVzOh!J1k*tIUKMJe7FqDB4XxcPt+L`q z56WpETHoixjNK2&u=G4g-Hdx8jYYT93M(>Psp!qgc=5kx>RYuG2%9GHdrX_`y!ss84#5n%HU#nyU+rg;Gsp#h!xRj91R!{Q z8?*1aD&%CN=jWMIIL9LT*U znEG-+_A8Rbi1k^3+ffY4S&YR14Dph34P&`3vsD!cpEYEvo#jZjKk?$zh*=0II9ogC zQ%wuX^J|R}j(OhSPAOA|=$02SIj0i9ty{=HXCN8kJUSBUMXH|&)nU2Rq+7^>cFe;7 z9|L|X&#l_b9ZIw4BTI9Naoyjndse_|LrHZqn8_apzulR(KPv7!t(zj<;hIlm!A4Y7+c&)C9mGh^MRYpV- zp>S~sAvB4IkC3W~SxC}qFc58C69@tQL zEoxpSe@U~*#wpFwk5EJuGyOm#3%Sh$mRK^dBEu0-ZZD53CJl&@@rG+EmeAH&E~$Mj zc`QFbj1mleh#3(>)@ENR3Qj;iNpyvc*Tj9*SnZTz6a>nVYneKn@14>WluemyDsVhc zh8F4y(qwftI{C`Q;U%dBz)dY@|FTGoC2dj7#H7a1_=e<1XRMO1qd1h+lhM}%t8N%x z3EP6RP2@HTo;;GeUAC}97-hiMGTB)3*DIx9K|{Zc1t&E&HRoR-;DwUcw0KX-#q`tP zMeH=n8N5gYwUPGjDm_s@@*>$m7l?UE6Q54a#v_9Pzyj4DYYe(fz*4zZlA$TW8-}+f zv<{%-xg|(g49L^ziZbQEX}|rI{bz*4&XZyCc<<6RQ*Q7j{b-6VClLqbTqG!jHaVWw zFLIg{K=3yk#NJLjs*a5ZO&vA+j|I>DtleKkg&w+`P!n`^GNq8>6D!?n8{lNo$#f)r z%E_zuct*+@3ao{N_3tR?`I1VLDe=6xi`5<>~6Q$F!1F zGfEfl3pUu$&h%LdCiTCYdcc6PBD`BrH=CTs#WJn{41-6<+U&(-m`KknfF|qM&5(ec z1^?2~rxA>V#dew)>E!)f{ke6}1L8OtG%@wx_22r`lx@MK3yd9CM=i5Xr$QbCsa5NyD`P)yUrZlcdb8lg&=Uj+o;G z#7ctk^G4b4*BuVVtKwM4Nv=AH*8ZT=NUK3EjbRV(KhFo6r>4XK+o#1+g<1X+YTh-& ztdv7m4FBZif!uS(L*i)MAkt5MSs1Tkl*l6R4VL+}rZzi%Be4lO1k_XZLu)P||Rb3)34) z{&Th1kpk-ts>#SM;XraNkX4U!)aWIX&*7(I#JpN^MWW8qN1p9Pp|t6MWa7u;r= zjW%1n<*9dJB}(!6sr0?g^>9bVJ5TKJKz1tuxcMK5;IpBQ+ep0CU<>NwxFZFK`-Pef zzVr-sz;Q`4YV*r@L}nZKA7Een^M23s-SUrdJ?%&ABM|aZ^w?XnUN4W(bJ~e){aUR6 zLGvIQ`vqw*=2GyYo!myH=5^`JV6pk-MxyA45}Tv?K6ViYHGd=@ zFN^YaXH%tk7)M;{-i{*UsME{I&g3yC<=qLJHbk*v2Dk~EFA)m4i(;Xpq^l4;Xdile1^ zq9P2n-lAi0zo34e3dyX?yv{3#nm>N$%)p&%p~suPfWolYUN8^|nR=s+A+#TvOc>Br z$1Bp&-dtLFId@hYNRbP6JpeSQwVHKUAH1vh)G32SOfr%)6QrUVA@lDY#>L(e_? zJO|v+y#5~@>;i0RMstd0%haibzb7T2JJs+}yKTBh8=+0{O(TdwAtUF`>*{zZF@eT0 zqDebX4N<*E5Tf@;9oOo<71XiFeOBcms`zO9&cQt=&(qgw+jlyT&LUq#*ai03XfL;= zmWaU}&t)E5i?*EeR#Gjtg~1B6+-`lXj@{xWf1!_r5fP?3>ejDZdXokce;Q`M6%=j$ z@ESTgwRdt49aeE_8D!Z^Vj!r{<^Y~|k-nwdx$mllcx-xN+BrRjZs2zZxm={_dQWeo z-y>r+&L^S+hJiS)yioRGw7d+1ie_`Q-HkHJX5^-OH20SZZj&$+SqZeo=nr~6j9>bn z-S6J7qf~-bRAGp?HGJ<+xczJ}*dB{=%J-V61}E&PS|1$q2*%%GC&tK^m|d7 zaAjsw%@y%XFT_(|$XBm`kQ|0i{q6HbP~sh;#lsSCA{q9USFrUnJNMtpsq8!i)gqDU z6xm)_-41}@OtWLjF3$W{n*Bda*;s$5d#tDMg;rT zbHv6-?@p^u9#ZTuPqYh#Dd1?2O^ti!B2>=LDods0n4z&+Z7nV8+ZRpV+)Yn~2ZTUv(*(z0M7kUwaPQU)icQ&Q}ALscxV6UAr_ zN(5WFcv;0$u!2j1j(0gA|q4Ge7;ca{p_o%Gft-ezb8V+9+wltZ>2Wv1T6i(uEy2K>=Sx~ zM`)K!I*d#(xi7&wvarLrd%S79$b>`=4pZ4I>}}5;XUy#XawcBO~Deh&bBCB%twuah8GZP>ZJ z$80llddh)Dlc0@hFEYKnDCtg@AdJMkpj>CvxP;9?n9pt{*gn8kkce9m>F+5X!+*t$ znWtMAREjlD?$p^^x@e@o%^{e84zP>g7KsN_C2n~4;E=Uk`m!f8c>3nMbcc%eHNvyP zz!HQEQxEL?7|=IReR>DqdR|$+U3G|SR3=|V@RtP$S6F@y%Y<8axaGz5*7*DIHLQX% zUD#N@69JoS>hQEpKXDKm@R%OFJoRC44DQ&RxItDCYPasTm@Cb1g(MbmQMUXD8{B%` zHGim?KvDH<55$Iim0yy{M|O;e+)0!>vDkXrDMbPBDi2Gv?DEm)nOP5prgh+Qzw2!XJlrU*eHInl7jqR{S$>~j#& z90%)MS04HZdC1-yH$-$)loly%v*0umM{+2zehDPD#J1vRbG=}zWmMu3YWt7R@l;xK zQ~}D`QYJI7iUo_s=Euvq<+Lq3RB$()1f_mKfY&Rh=`JW&;0K2oZ3XfoZ`7J1zw+!e z1?$8zOA=rV%6fA+)Z}^mYB-`^F_r>QX9z~mHZ&s48d4nYK3f%M){$N)X}9WLcSkV?f%{OEs4v z>LE?cFJ&1Pa25CT*n2E`Jrol}3#$AbL9-HV3HWu9%mx3e2GR(+W>fzZmvR=YGF&6L z-fZitsyQj+;v>313CkD&3C@o-z!EC98Hd8z045s;v;mcYt5vikmCw?!fz6d3!fvMN zP6^T*BR5VFi4c8v-SMKJHZRKS&;%!6KUvR#RLIGFdxMG{vFD zn1W>i%AGCE_O)EM(DB~&$R)%;u zGzC5`BRIHY(oy?QG`dw z&?Uh_%5o8C(a~*yT|EQ%)4CVzB)Uy8*$FL$@7`$R)IZv1V5r}Oa9 z&n=4e%gOu9?47Y$n31q$#{$F%y@!@xlXf52RWFeHC36jO8*m6gNbA&wX{GCOX*lRL zEouywe51qqXN-^L!p@v)Kt`F*g_XbW{h z0XQoxrZgF2Es1hfnyptUZGgfS*1~_c^_Qw6d-$!ys8OyJeGAG7&t+C}U){sZXjX7(l%MWr;o%r(y)Y5J()_;t{L#!BvsMSDh_4Q1jn zt$+A0!;_+HZ0g!x-ju!4C;@}l5Nh<#E}cXWPqf@NuSu@kM!(-`SP09Su#$Z$Ivwac zE!xNjT?JQR>BJ(DTn+rU?EhsAtF;k5ob^DE(yb4Hon+*J@BmSx8!qV)U^X3tEiKf42UUur-Gr+h;7Jrf|Tchdn!9nW;3bn$An zx1tl!S}0S4Nn__$d`BFIa4|!1U3#w}Bt)YVl!6;BijjPD#ZKMEylAxP<-jDbwM!}C z_)RCns(W|y3RO;y$ipzlAPcfuLw%d|I(qF zNm`NFgR&Or+oeI5wrA-;5ZJG!78)YBP5*v*?AOG*ft?=OT&{49g*x_-4~ka0pqil$ z(H@ksK-YOl_9hJjV5s}YK0Ix-?IrGiiJFP1PJ5)V=qq>CXG0 zkPib}gl5jUV&0J|ChROXGX{OS@Llg8YQH;HI%o+tuHDXDv7?WqLPqy7hX8nEpg6n= zS`Jdv*m+6SVKI9MauN`no*^Ct*OcC(2K_*duugbc$F;AcU$NDREE;u0gYl2JQMf2I zyR$7&4?lYPW{t4*qEE85Sw-LQVUtl?y{v;b?NkDqVB6ViSG)ny3ce+o6n`=^FIg(h zS|3(+;%~jgxIpl=tBDV9KUD1uUWy*fA`+g`;nH|ud}M&*Y^(wac$lIwDdMaJ9G)91 z#sh+MkQ82PkwgFzUhl}gs2Vv71-yJz5+LQq}$YHO{8j(G-v zRfG2F-R3g$)G^=y5JNBzpAJFNw`M!0*VM_3_A}Q#Gq-Qj`**bu|5a9hN{b?zL#Sm2 z`8A+zJQ|VuQV4x5_jn(Bv9Kd97!{F6HCq9FuC9am2njMCpZ`*j&ZB@hUX!j>SuqJL zN}Uw;$v$;*(VcB8ihQ}Gv(5Ps*ue-yP7~$P-h?-_!_(wr`0?6NCKabe0dlj2cEcap zdIqnGgAvO%`v+7ubq+Le)nqCD(F(7s`RMoHTB>IVIljCD6827X@X0c7=a|?K^_+!r7kIQo+K(|1cI=kM{v$|S`uht!H`{~d^`vy|rCv4H zJ*-L3^DddhifEg3k0q4WgLqQ0A)ctFHPZnL5H!*+uIJeb-*$2(R3vQJN1_;w|I)wl5r8c*p=FxAZf z{C}CMsT=)w`eo<-zZX7zQ?-~4uKWK~%0LTl1-?xwwxzr?yf93JOuXa9%-Du3|52sf zB~%rtvRzG^ci>*Pn3b!FFYAd%A`N}?6kf-+*t|SloXsQ(7Eom(eeWrFoKzSjygn^E za=Cv0%HG#~T{znXeqYNe`yO8)clXz~DFw()B>}^VRRJYabRQ?6koSQ?8xbzap}?vf z{t6JkFCN;l^gFO~`E>F6`mZSkICOjV5Mk~$c6)X)Ua^-QzwY~dvqu>0aHc=fO+_5o z{+03LSdjMXGk37`D(dpCT%n1>Bm{1vPdRN*a%6 zHKQ^BA#;(F1^+Q*cx7bup@^d;?qo3rf|d0ni~?n#8&7}UH_k?Yf#JG4ANbH!Bpbm!61^i-{cx5FmEFS zb2TE)AX=p6b7GRdRb}0@rGmVLq&CI8ta^<{*lm$|^(PaTqFV?IQWHlgffhnIwm?z@ zy9-9}|MnKr`uTU}S%ncvvn2kJkch$v-YW6{VF$B9~ zL{%YRt{XT2vY=LFTR2Jj!Oqv*(_$uH+gbzftppf#1|0+tPby!(iX_!~^z|G3Em`4c zj^w7&^3vzNiSQayDZ`Pp%tvhQD(5uPsi zwWhH1qqdHV?CTNuw4iW}^MB{U z37+b>dNhi--a-7O8;Ux|i5 z_IZm(3gMjiT9^lNu8>J)4fmLMV0Y3}(^Jmoiaq~COp{+mB)#289t2A;vOP2T$F|bx zr1!JJ+vb}2t=wNODx}6ganv&wf!DoLEPLI+l0dpy%Vi54lEA6kW`3bbI2A7!5>8yf zH454dCLqr-htOFd|4HP^{LDfawbCqoS3K;%#DBagzmD4ZEqW)uS1*6BYEiL#9wQOAyd%e#1+V`mChWCX4Q|ImYHWv zXM5cgBWb0jyCeG*KJ)}HZ_XWHE0QbS2pj;3?ctC5BuLznh>WMTnJvPCi{GywEEFr& z6aIe~JBQ#-y0}rllVoDs=ESx=(ZrcJ6Wd0|wl%Rcv2EKn|FMmmZ}Hv5UEQi)oU=LA zi&Ne8)AJ1ELxg*AempL%U4_F_H15cqh#x$jnX56QdEsoI7HaPV%PO_y;R+h%jQV2N zW+k>qkxbB+_4tJg44gv`1r2XCzZIh~+Sa?j`wgYv*)M`!L5q>ZP&B8}{$Pxo!azR==bphHgQ>A{-zR6uOt@brX>})r zPZ25zQ=pr%EsXW}LTA6U1Nq2&{Zn!vRVOr)t{#iA5uwK(vj2|Yx@Sa=dPfEFqEt|l zX$j{WL#(BaQ%g>__B`3dCH8xx8?bxC(STl~J7XpdN()=1`V@@P+G)3HsU&MQ{QjaK zY{x*6DI@5H+`x+%raB>$a?9J*tx9@ay=Px;0_*6SUCnbPu%wvrJH3=}9+U2uG_m^8 z;|=L3+mJvyr2b=KEdHOVgfkr>R{L&&<2~;O&PGU0{WC$r=FrO4;r3OmDscLqGC&Fh z0nAKh*!N%is}%o9K|f(utVb3U@lPXG#;eS6_dGir_|0psh&Tcv2&J!u{IWx~rb+Z@ zc(&S$$|tQAYbWYX8;UEEuiMS|8wab4MkZCJwrG$H`Jp|(VFi@ri*$$8xS{lO+6bz} zC+0iR*3+G@Z$1#H1!aLhmdC(yEl@+hDKzk#W&-5ctL%S`DjJa)tPm#g7cHI!2j@%< z$F?VGk7STEzk2p$J$xEFdTZ;t;-|DOcmJ|krre^WA-~b(3!7WY)8BvsnT+-FcmVkJ zfyXs|eB6+n8?TB8o}#ze1p=QBl=Oft<*QY?Qw$3q4C=7PEHLymv|M&t2c$YzQHTDb zzwXF)6b4x`$CSpVjQ>rS+iZc)6?x2pHc%xvK0>58cN-yT)|lYyuyxT|3hnsxxo5t`%Aj18z&JPX_iNw5xuP2Ik7r zs|sCj^JNnk%$X0K0_7pd0uvix4K@=GyVfJoiX~NF-6s=En-O`PQoE{HcLF8e^%QC= zk6MUJOUFw5c?cO4?yn(cso^|YD}MwCXz}Fs@^q7YtlcS93k97C`43@(uBa46JI)cLhXJ z!Y-$l?O;3AT2Gc%0l#91ic8_y>#$gxa#msffS9c5&6S3q;@sfwe)^$hW07yI;dodG zH%X$zDj$5tM~1DW5+?@kO%9t}6lXJ9=P%j;70mAaS7Dn81|*%S1-;0a6ZgAD<NKd zK{gcuvOUTgHVpnWbOCfs13HZo2O@+EPENCx>RRwk*3z?01PzxiV@StXtDw&C!nxDU z)E7i^`d9c~rQoV;m($+M)1PEX3Qa?b`uxuAM^B@`d)9Kr@XPtkmfZdo@7D-L7`HK~ z7r%ZPRhRPcq6WUEo-t@7C!OnJ{!FL`Uy}&&IL}7h9}1JB`lZeQ=oma8T&PCq63fr% z=vU8wY1EU~ve{{5c<`jf09zuhXxiVVNsQhB&*w#gsf!%7V~+3+;A`KlWUdJkfpk~k z0e1vg2S;{o5S&1Bf0!3Z2NrLb@&y$#xqd0r=fg|(w<>_li(bxlbOk+MFGS56{)#NxqH zWM5n$=fa^a;P|g=^JkOUsN_QrMiG! zO@})}CK4^Ehu`QkOoItK3X1daNB=a$!Wse{48}F-a^;e*g7zuE%Dt(I?`^Go!dSL2 z{_NhhS1;e7E%m{`i^yJmmq6Hu#>{R%Z}L5Ug?$N(mgmNtK%KUEwjJ7v?jitqKLYRt zwbN_h*fX7*+osb{}&^WlYQM@wP|`D7ML~T$CfT zpFRp}^*>8*Gy4t5yZ;GE71m8@peB-DPqXLwPM$!IPa^|4T|>8{k30W9Gku=TpZff6 zs9wLNe|9NnmhUW8;fdaSkl}Q`9e@$-*zJCCP7qXC)r`P)CbPDh>-GY#CV-8BP}^o? zmS=pt^JW@=;HG}J&#FmWaVgJ;`Ez{3X424hYhhT?o~2@Y>~Ye%Isdj95_o6ART$g7 zWsqL$c9+*I4!oUXiQ~8KeoqXGnS`Uqx-Sm&?u==R5*>7<;F^jdXDIsvV$j~f+95TK zRfhd99Y=*F!F{$0JYn)u0T{;;{0d3?m9dBr9Y7_eI5$Ls=3``Owq)E^%Ir*+n=o;( z2u4{k&m=4)4L7nkd!zZHIHWvjgyhF0Utiz9KfYLF932fyvh1^1L1`jg@Pz!2 z%=^eNgXA!58M`^H>)m`*r;Pq~`b4{RxBFeH=i5f>`R9Lff@;ty`uX5|05=N<6EUN# zv5l#d88I^(^ZyGb@rH3z5r4QWEnCy#k#>EEDzKfEh6d5a20}2!L&ie~d$S6IfynPz;=UKE_iZ?sabFzeBq9BcKz2%_TWRgc3FP-BUZ-V@v1($P<{KG_UU=s z@#uXCkX^6yG@Z+?1%2$P8{Pi!!^5a zr09R?BhD4~a`qc34gZlt?!F$s3{JL6lGtE(V|yX-ekDWa3IBB{OGHf(AAHHbbELCl z-f#-`gDI!tyGhTX|MN%pYON_8{5C-5^KCe65O`#ji>9bpJ@DXf+~Xadh^9Q+GlVJz z8~4H@?(AroSb5p@p7i{tLf$f_-W^nRhin%PsxZ`h=Q68y@Yj!tG!-28%sSW#JD?At z2e8NaRZ$imeV35&5rj>_IWFk{+TAgpuyRZNM~=Dy1{7$uTmI(rqPGsRNhAn%zO6aS zA?tX|dn1U?Ffwd`D8(p61#uKm#rlY}BAK&~Hr;k=hh(pd&1&U{v#z~j;a7>=vYd&w zqCU6GQvE6=2yv_E!*eD_Nx}V!o-*XBqGIeT+&8Ww zT$72L8oC~Wap#=Ri>~4_35B^7Ofw9-q>Tk2&NZm~nxNc;e&%Z#kRXJZ9;;o-0-2u@ z#+y=%eXL%SAKba`WpY^YfA;)80u32X6}%gDglH%8z3EZ{_1y*I3C!8};pJwkp z{P-^ev}D)D@jXl8vlZ-qE2JL78F2X`Yy_n(3(6cnqyLEmu)|{hp7ezo2DBOFU#K-> z+6xZ3!asce2lBpQnIZf3py#*8xRZM8OjYOEDa1ebYtSz-^q$^-U0>|q!)~ij#K-%$ z6V1Yxo%K%C!!n;!Dw}|q!0b};>MgL4I7H$OeL3P+qUFf!BOx(ev5${pGn+~YyldXVbtvX&_a;5G># z%Rul#vXkn~cuTv(EL$}35)e)}Ii>ZY*eb?{16m*}k=<-V{thomTmPD<3_%4={gUy_ zm0<;2a>#Y%&c=I(#XLp&FQ!2G>b>)J)RP;uNe0ITwTqaa$7IReWd5vM-A5fo09ye5i(FhE|39gom*44z(~~wqG6hxL z(rWq)ZZX)-D5>BV!Po+r-b9sq{r83|t5Y$MPwUT}`?TI49zG+6ohQn9Dvz7BdNh)G z3aD9lZeEzr-@Y^iJ3!T@N!J%`Zb3u->iI}W@V;|>O0Y|!W9I1f;JI*^9(&9CHSrQ* z>&@M3pE-I+ity-ID*iA*uVQnf|fKf%QO{(hZ>% zYj-DL5hoO1bNiSVfaPD6nlANLxb~)g*e0dkX;CZ-Xe;FH`0RFn^E(%5uhDG<^PyV( z4|c`;(x7zp_4`zqRYj<9!>rCG+8M+P;U(|XT7f$h;k+(bgO9g1q>S#+`H}!swhWi# z#2)EU)%Aek*SP3Q(k7#`r2WTKU-2wqVpzx&d(}+~F=XFB<`1zg$@V2Xoz|62{#n5s zi8`#)Sh4K#4!u&h@r#(CD}(6oC-ajS+@4*B)>h?yWUW7&MbxAA82qQ46*Y#2S}~Rc z;bdYSRpYAE^?k+yH6I9G)bg(ezNcGuFxJ{sKix2S;sB2u&YMVV>W05#`i~fXM!q%! z{qEr2Vz1~~Q%~-H=ntQankCy%cp7X)ito^zEChs~cYgKD?+C=lGT!^-4xXbH4ZILB zALaqHrZ@+D`FNM_LT&Pq>ZDfNN9de%hQ&Lutx(}i$+B~{!g^`6H+K`q01=6IK61OS zO2I5d5MV~!*bybrioUhP%-Vwf+-A^=(8m-VxSh6Z?H2e3 zkHm!LR;a%7trYJ=#AlEX2Xd>9A+^V)ms|0ZvOY(f*&7PB(39B*i!``=8_rxnyRWh5 z_XERZE}|j-!`wRLmRURrnmyp_EqRwYOm#((0U+pE*akv9xoIPUaOU+Uq;Zkb^7I5z z8()t3GR$%43{v_K%q~rbw>Z0X>lbW~emu!8KhZwG@HXq74H*|eZS(whsaSwsc=mU( zD)J5K*sM$GkfIVKk%d)1#(dZjQ&R;tMVISl>#y6scDMbdus|A3GJIxV)baPiMExoX z0SFpPeg}wj0dXhQgvRYqHI*9SeI0rIrRCK&-x^&F-^(?2|BhvZ9gO{VBv1OCb{;MI zfIv!}Y$Hr19O9?@gXjR^r3zh&A;Af+E7rp^%9dkX7ZS*{Kw0WE)@D#(sG1+V6n-m( znB8uxb6fjXj}hR{elMno(OQ?MliU_~19sms?}$=5@838No?FJ6K0YhYTp{_ZRP3%M z^7R*hwEe6DfBdVEVgw^J9P7p{t1pzZB^bcMhT{$1J?KXHt`OPrBvDRyn-@4msTI1r7> zSdqgxr+yp~$utN*KAK#&aEAH7q1Ue#H}lkG!rOUozK?dLjF^8I8;lpGsyi13PPSKOqtm76CIrjVedq$r{^p_r7- zOmS1+HI!zP&M^83D;F*mE>}yA07%zTL@79sb63n;G*T7`!OFqNG8YFHixtEFl$IZn z8j+!qHJAMz=iohBmZ+t)Sj3lE%WmvB+L>tj6*#vi-rJeTm(qFv~aSKw>avX_y~is?rT$-<~;3tw{#UTWQ zAS9kq?1~tk{4*(w3+o_I04YIUFqGUNmzhU!vLDQIRWu(`k= z<$5MdE9R2nLbRiC^KO%*!yLP2d{f`n7t3Snp77H9Xg%a8I?MBP-7;GR?CrheCT;v0 zFZSZ)X>@Oi=<|7RD4KDQGqQPTiMT?b^K9=S2GeWa-D_(IDthYym@y>U@IJdRjKS|a zcCkXcd{vyU5g$6-Tbnj~Fl-r$k4Yw^=hk#{+MjvLZ;=ckByeB@nXS)UMMBgiuyy4^=}BEOW1dl z%O&m_&iN*FK>j>FBQFeIi@JKy-)hOfDxH~O~ zi@oMgm^MM4`WWs1N$#M(eQWF%+~MT{kLgz9f?(_+%Eh$+^brQL)O%nU`)IEq+aas^ z44&{$wyoXJHvOq`2|N9Gw{_g0KHw3qke*;|{J(Ge2TemnO~aq&e#aE1t@p!Q?ExpK z#_sf`s7B{u-eU+TH$dWpU+Q*<{VW<=mOr;>g$eUtK zM;wg=xrMT*7-OkX5fp^6!bocN750h4$O5GJq=^}U_>^tar|%z#*~oBl(xlS8yfY*> zurO10gVrWXDV({A7a7y>?^BhxSF`SeS8o}2RZm2-!BmwW0gGIvO=D+Vn|#e zmQoZzpK$cc9RH|9b(|G?TOdZQ%!-*>|Ctp$-q>KxAGO|}E5=rQ z8Qlz~##W>m{gibyRzETZi|TN!C^H63>S#3p?s9#{VHa--X2FSP;uf9VU=nukWt z|FYPbu(Y}{Yb6%@(|^NR8b@g0IkF;Ini5zsYxVN1D7j#?rPKF?`XFfaR2p{~E*V&L z`E3lV)vBIR-oSACtz4KyJ~aJl?;>d2p$FJU0(7eJKEwoq2&&N#doQ=$HKexIBeL7*5)gPITgu}6BHHm3J)0kjR3p%hdLxZ}8HEq3e3!an(P zuz6~-I1|Bp+=m!Y)HPj4hkF|pH&Fc_=9s?*K3@OsZ?HP1wC}ZS$;0tXcocQ$$&+LYz;D ze2n@AB{{8q&aUYdsw)7mo6<__HP^HC22X{@O>YIk+cU>kB)-qyY{br|*|88^_xpw= zq^|2jt*ZxKz~`~!@$;rf?-Ov@KMolZXmuNH`QHar-ub`F=g*@=!=|+e2|Z1>k&-wv z*x;jsLwLOOze#BZGDPtlT50@@sJl=D1A}6c;u3)&LBXkVJ;Hv2{{`q4FGxkA z4pY}8tBvTCs_H0}Iln#0e%Ltc2j%ODtENP%7J>uDt@}SnD3KED^Nlv#<6XpOFH*=& zT99E`S@%)P*PWY}f4C-a&yB`)H7skAxc)_dBkz$Z-KBumLq)3z(MH|)Mdup#qots{ zKHtDuT9x@^%>*9Xl;8+{c-+_en}ku+u(SAYt){q=88IfdGNXA8*camZGTKE=?O6;% z`a?>J}e9)4M)dFJF1}-?w?_sEC&hLUO$u0s=W>mbL83XoL|O) zH4c>8)~t2#$qz04iiSnzruGQ#A5YjM9QaMmv=*SS<4$!ILY_)5N$5QfDU&sherd{2Ys&OP=_DWcC+W$11{f#O)VhC9iX=cd9)+j-s*K@L8)VSPe6{ z#e^NTs-=y=0$y04r<(Y)B;abcUB<2KCe*a7xk29b^$ZwU}?=o}w zac<1|&v@=Iag3t8T*Ye41kp`-Rq|;~rIOZ4n>!-^hvZ(WnYcpcDb^w5fuD{N>_;(1 zmiAi3Tt00$E@_HOTKORDRJd<{|7W#w(<9p@MR=!8S(;A175Ek-&XquSd-nnWkC3cn zzB0~Tt_}rnMmx}4=iywc%AljuusU1?NfUDD&=SS_Gx-X5jN)~Wpt%I~B|h#aW?BxWf+VzWm3Pg1O*xcMX4$1s z5j*WA#oA{lkSE)$mr?Li3|AF6bNV6AnuJrEdkB3ea+T|qo$lsS!EP`tw5YO{LXW(z z=}@PvuGvZ}^loMb9J|~ED6&>|f0Jh^_t%N@1@RTtC+u6keZY2gk?R4gq9g&nL8;9D zv_kmx@SB=(wd?Zj6)R>FA}@3uBs$NGXc2v|z8?oX4cw97Wq4913c6q{cxP23SZ$96Gn z-S5KAlk3tpj2>LZ7?S}T{uP_&m07tk{_&fHgTMpHvAN_+`V=i)X`r_jtMFpW2Gr;z zL){?Iks)Bf`P-&ZR&q~XBUuBNexlaQLbkuxrhZ<(nEQ*ceSrPLE^(w5`+x9oN^TH!ti>GFZFY3=D;P}}k_NNra^`pRT9`wa~xFani7Xe^gDGHIq3$58tBk{>R0 zd2*Xis=+zsw`Kr|eX*v1wjO@eBs%H>*MRnP(Y@FeV|ldINx6z{OJdj>Lt{-`-5D+Q z_omz*w*>@yzNzy8)u@)8MJ`5e@ij=VB)RkT zh;r>tQPUQckSf+IX9Pf}PcMJ3?SdggakGJ-Wp>WPN0}`=O3f4ETQfzL~%HNP;h9Wa`$t1dCUzR6OQ}vCZR$RpZu{ueU9ED zh4W8j5|;)kR)!eZcL22uwUq3|67QqtML#C2HBMk{7J(w zN&K}2NC7drK-johfjC)J@-fDE3W+}j3WIsW5F-Lf-ery4J$vj*VT)XZRh%y zVaLJpBH5avF;5B6Szl(Fy{`~oVIxza!LP`T>!XA6^2{;lM{ZHU}utyv76p`&M}@gA_wDbF25DBz|q3FQyBUP1AlvR zU`cV?ij87vFqM2MRhHMyU=inugk$j7UWp~9DMOQ#NN~Gfxo5H3&z#-6cC0(-H@lQS zxPe}Vq{J#yeZh5q*F?Fe4uo;B-ZnR?%>&!P*U^+}T-y`Z*uQR7y5XF!lH2Atbk;%K zZZXlluMgS!)CQYPR}5W|5Pp~<*B?IECVd2(Ytq=*B#?tUf4vxa`#*NygA?OTBGK%B z!Ot0RzCsERqjspERoHv73WGzs!643snE|fQVnW|!eMgwEtXCr&JE0||(oHfS$)q57 z$GhWrcQ}^+tBPMMO=z5pI*T<)e)M6C_D{cyg)Q6`q2Z(pezhkozPca`ZaPu;U4N&4 z>DnRa`FuneK!P+V1XI6fh1hH9hWCN)Ls}>Y)SsP9s?zV$zeowp-mwU8ZKx3QQW&nJDBtZ`z7+N{h0 zyjv*``VA?d-%}gc=co?B3hOo2yT3DOP)4R;s$Rl2y=i=HTW442Xyfu7o4G*W;3GNjs<_{7E%vSJ0oxrY|~AE2n=ey4_y(wN%>17wgjTb^UO*m>;JbZ z{t(MK!doBDb4+%}v2f)?S=GTGTJ)V+ zL0F767eABh2Eh($Q;8^u>Zus*sRJpxTk#2s)U?}{6^2TYJPn>C&FyxIN*NeoV+ol@ zLjsX^ku}A!?+e@zgGhO&(~pKD_H6@!{wD&`048NJc11Y3JRG(JlbMnFtjYq*W3|=@ zfq*UB8CMY09rQc;<+$M920MONg2oTLDTbj}?}+AdMpFgitg4#5_`p-s_}Kz@kOxQ+ zL<5oo(Sl5)6df~6Dh_ogfZ}w8h8%WF#s&EW4ztTy7t7Bw!&dWFo(+c$_SP+si{WbB zNmH-OI>DM<(R=5ywj1_`Y*v7w5gJ^vLTsrMYfA=1otefkA+fFH=r*OMRNF8)?#M?N z=M!S6eoO+Z9i)qLn2(UvtVu0lR?lB2I31}JDN2W+yXJXOzFA&3AWGm{#xbWCzIAgw zj^t@~|Eib-nL3i(6%;OF)sFoIqy_|IH&H!gE9BCu1Cc}OKHYT$27QzlD|)XDeyv%?xts4=W#j`pag#bjFsCzHj;=)xPiS2hN2jv z9mmP^yu0DOSV9bPfM47wMQWoN5I!Tijys1c2}lQwu)$!?GV}b#L(IWD%Z@tw{6_FH z71n-r88-2L8RwJ}!)8k(2z{dP(&B9-)WshC9a{SvvdVX4uacPYFT*I#)IpX2EU!}> z!>o9#6c&gS&?$)czq?OV#gAJN1fM+wU8oe>{C)HI@0!yy{^vPytqo0V&?h#Oc z1e*vS3_-l}*2K#m=FuS!CHqr0KM)cdbuKbzspCJ*yz`>lM>Do~zYZaqn+LamKmq_k z-Omp>0H*dCN#G|qLO;A>A>4Be7HpU`$mrG_^{-BtSEDtE{I=;S@2dSJ@M-!*_5em~ zco95kl-0?|CAX#6u8?x9aoj65Ffe)^1GAEih%Z#RVw@tZRjg=QJD!%}_Y}X-u^*qcV(^rmQgW___3WR9@&GP}IaeOcAMW4I*B4jmJ@t%keQ1o8 zqXq3>wT^7MTPCl4NDgH34Vd6Vj?U*Q$H{5F(MVY8{~V-t;GQu#l{~4E`lpb1!!jGC z2Pp-I?6A>_VBDsvgIjxJ5wHj;e? zvr@~!zC}(Y)UvW_QK)9?&ri;VggOpG4@0+u(+UAgjFCOlIC41k!#csIgwI?cjMqg8 z$-&DKIv88W3>k3HTZWv>PrmAwPa7I3hLc5QUvcHTz43q?s|a|&9wU)jV&>jIw$Gg! z_ri)gO;12mfWlOl@Oj*b17htkDpP|WfQzAs3caR1ey6PNHuMBYHa)#UxXBq4Kc5_Y z?4+{%%mWIaun%F+5LXHQMZhD*5arcLXk&VbS99=%8zuDnMux6@bN-gDNKTc*louI^ z(99=-XU($X0?i2_k~xsW`W-4ztAzRZe*30-X`<-42y@OO!RUl?qz!GNmQq!ILq-Xr z+mw=|UQk7zXT}lm7u5<4#|UHL{z@`Noto9N z@w0WljZgMo&41U}0RmXy(sufcl*Fl#S<}KJ#Z08^Yj8*`MV3Nlr+-N|LY(B$ z#WUAuY?{ZwrQDY;x~&++#NT!saWte0h!jXr6-OUlz4?9=KV|tIk&7sgI7%oS2d6Z>w@cO|)B99cPRK|wr@1|)j9;*H{@ zcp(QYN`KbOPw533Pg9+4u6F7SlulNS2oA=aYLNaRL(vT~D??bU}y+-T5XQrEAI?XPULo+hpc%UQ5*yEBf0)}v`V&VBg3 zBT&}Ccp`9`5T`)NpLFe%*hucy=%aRpk?Y*EWMqawE}f0er=5+bUAAOm*H;XYcDo$w z^mA^GJ6?<<=1za{J8E{Ue#7t%OI2*x0BMGZXobPf&Q3dNW?)cIu|_>}a<`Dv0b8D2 z6L}!X8_vc)f#+E1e&>+sVty1yie&xa&5f-TiU@Wsn^$U_ip%P$@P*LiA|XBLH#Vf3t_Xt% zaYQDAMsr>TYL`_~i$M!dRs@sj5p9qE@4k8JT!P^k-bUJimde`0;81g33!7$=6W~F| zH8_es^FgDq!G3Aukl8(fP%m~rUMX9XZH>LE(ZqeNTAZI1=&Ew&JDm?h5l;xpw0=RW88p9%NR^(ulHx+ofwy!SF9je%!Nf&@3MA4#$L zm^k7T^!bX4e=5!n<0}4CT-_NVumB+$HF*=V{{G_znDzA;cdMe*6sz^!B{{^<#QKOV zc&#H@=Y9t!bZ5fi!u|Mc6lOlZWMa|p*mQ#9vg5ti@<*jPS4@#kn>c2WF$xB8JF)qs z4Qim_?74PRu`pM|VMzwPNLxcMJu&R}Rr;T=^$R~^_a(jlTjWvmvfA4YdIj*8Dx-8- zP8UOAC^$dan{&Z#p`3nbAc#=S{&cl!Y zvS$&1#FJ80vP505*d^^n(-42k3|)b#qo+qv#XRRixK8EmtqRvkuTC(B{7tS?GGN9w zqCYi088F|EjpJmZQyvXkmj+7ZDV{^u18}4|ehD3rD*YZolS^$8N`u4z75NsY&dg`W zSU#@bzWY`AYxyp1*@ppm95h_riy` z?WAnXqEfrgW;MX}&(p2X!fE{A-kS(9icbwyl7@-Qt*j#{W;$CwX)vJmvp~8C1|=Px zX3QvpIu=$A*Rkob-Wylm2U#+Q)B^?-*%`JDE=XZvn5PUb8GBu@xsF`1KoviYJi422 zCKZY+Fmbr;7Ezm!PuDXT%LdIcT!YLjm^|n*C+5krZNGtxs)QJa|Wbu=@O)C0lolqQ;@74zlW&M`;S?9R}3iv&^fT|0ShZTV5` zg=AqHUBG%UUH6bL_9PFkTes8xVsY>_w%YJBCQbPvaR}++cqg$}L|mHajH{0GHN)=k zC*D~sha3v`H=l$q9R+FTooM8B?S||)VSG=FFr*R#_#qhB2HU#L zJ|6e5@=9?H}gRofTc^k%>3t(|-~hau@wk}vT#0-lu7SK)7i<#9t@ z3Z1k(=$*@2`#Se;$mZ8%KJDt!7qO4dlNM;)J4o7C(gkENaj7^{)S^b@6}orW1Iia2H>0%n{x+AKck&a4$Z+Lnpp=XgS%RXZBF}(JxHYR| zTqpf$ECXy(m;h|FKwMT4Fy=L;e2^3LV8gkI!m+?CoB^ASq+1I~b;h7I(hYWYuDu&r zC^)#k5ggh*nbnm)joldRyTjb3<7pusM>gs~223Tz=fq zO;W z5w z812%ILSj(;oTu@*8>(qBYE9@bKSo_G95AHQ>E+U6af3?;AJzoLdPv?sFXn%~lY5BF z9f-)WB3cwYpT^@nBwA166(Bp@POe}X%BFuYmj|aBTXuT)!;QbZhl|xB;ho6}-sAM&R4Rk7mM2%EPoX(!WG8!+n0ueI3TN?@K4+Sh_+$8lJLduH3{av+zIno+L zc>-B%_x#5pQAdYasmYKIL+R~Y;Jb9=W&m3>Znn-gak+=U%Q)fBK#E=!sow zyRYiuvTr^%|9$e4_9#Qodx3X$SXSc-Zm3Sd%pkY?r^u%Id41K~z_D?r%m;C<0C~P$k(PJs*9Wi?Qg4<)s z{h`QN%J+w`LH3GA@w0jqxP58+q5|AcmGf0?QMd)PcEVQutLmjaEx#Il`O#kc|F<1` z_Vv;De%Ch|dcSkB9;Lxp?ufJxcypXo{b20LDe3b^8uajtaxr1IOXsffm^aY>0eNIu2wNlc6X_$)bKps0Ggk%=JXf`xl2tgQdOV)VF zr1U+pM@Y_nQh3hLRLVbE6A}+mJ~B z9M7u{Z9~>9m1pYq0TPKaMQ8463D62T+YJs|&b^#SKAaYxNULzd?ExQ9GDq{v-k|ij@{2G2eb%eurM*D>pG<~Oz2e^Sh&c_?E@N%ZpR}4i}uNCBcsm_TFOSg-h?$h47kF@rqf1xv_bkeV+x0+I`%2 z|LO=@G}HE%_* zCR7K%7S-C=I8$-HoSUKAdT*X`Gj29dW#~omNHk1OGsIRBY-h-81l|i6wb(8_nQBmZ zX<-Ufi|L9_(ys;&G}wep2BKFgtuo%Hq(;v69ajHN_7w2S1<5RKIlaB^C@iaLRp@o)DDc8qro z{4@^|8Mw6Rf#PuQKG$6tREZ7$)bop#qr$vvN-2KbS4w z?A3cJb?(k1QskW_uS*uO_L7!&mG)Y+qB!qGBIbyyxEnD}%=m7cO6)sVvuTo;`9HyM zvY{9rB;|{75i&pC7b*W_NJgK>d|0>ng zi+(S>S<KKaqMb7#Y?&T(DbV>*9*2hb^SSZCDU|&yVmJA z&?OPBwM2gR`c?)Q`*sfedB+N0I3tqts%cZG{cfDZHOGK_^n&+xt9W*Dxglp!uYRTO zqFR1JdDgG)n=}#6G(dZb?zN{E`jOA#>7gj`5~FMvYDD=NY*>7^i}By|sKxZpX;XnS{7_k z%QDs~JUXLD`AT$PCq~D~B8)sHl(+tZ5kx3!t`Zg zgpn^ASy`spTVHP;j?$J)C|B%0ReT?;h*l5aFZ=7zw)VR`2c$he8D(9y^EBp6&t*Ih zgeKg$X;0jHomk6jyTXzR)##jPI}( zL_v}8lX40k78*8n#W!MK3%pZbn^_+3`YQDPdM&`Swy<+zW_6loaA(b*Ok)F}ac!)> z&0=47ooRhI)Z9rqra!jm-J8+UK0czpD6w_qY0)zs!C0>7@snRrn&6~(xPxa325(N~ zEk@hu9$BiG_`N4wRobTts*B(ilj%?ng$}uX>|Lhl9EEqCdBB?px zwhp`r8X6cn2ahSONehgxPB{E3LNShT7LF|(u3>hFMQrS4)|Is&^+ZTLruv16eB*ZXGB;fEg zoZ|}_Q|zqb@~}G)QI`&Q!RgJ-&I1Zu2fG|Yf1A6uRf=`RM{QX7Nun))H7Tu07xp zO;axgd|3aV9Ziv%Ht%yz-b?dy>(95vpQ=B*&9AV=zWz)9)yL-;a)Z{G_-*n|ULqKD zZvBg2qA4c={`-jWy)YDw>Tr$;nst8jj>wq2m=8-I{MtTc!Mdf7BHlAJ{AXpIb6*j1 z0BdSuE*FrMpOnRAXfd7Z7Bg@V0Ohv9*on8Z4jb^az5gq+>y4gQpRXB5qh73{xb=n{ z{t36d(j#OZ?+~y2Z5ed^Adg|q#DDRdL`>fGGTqd@mAwpQnYs&{X_?Uh_qZg0~%vNe92a}JVEw&X3Y92G98<21FQU}yzki5^0HIod}mk7%ET&# zTed<|zh61HHSAmT&ubZRn-opLHH*rugx>C0yD0H+Q+-j|%-GtSnYB-L_1tE8dUU6O z%`FMv+_}@uDxz1-eX}ZRzkEd1)Trr6x0wx@EDWX_G&71%Uvrz;z1|=((b7CM&D1n8 zCC${(G|4d8(!emuI4v#F+#=c7#KO*opo&K$ii V9A{vNn$Bl7*?}ow`lCC{q5$W#rBna_ delta 161476 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"@v+`_HD<-W6t=Y-9Qg6mYYb+KKUWxF zVVc3<;J!qPu8lwCKBt~^(K4i5h=O2>=oQzJ$Dp@)9)7+6To!A2hTW||09G^juw}ms zhGtir`Sx?szjGn{JFa({GW}9y_<_i-RJv+GJtGC#z(C2`GGXfNMu{Kq&kJT z18SJ}$+^(N2;U^xZGrb63`XOFtZv;WEnt^+pu2 zPD^HIrd)U;I!Kd-HoGzseYheuno5gOBiRV6tF4a~^l<_sg#nU)njzT)VdXf4sj1I| z&j^I+piRI96H00@Na9x=?f}djUIPCXIxKu@-N)zYZ%#zVfvmn^a70IDkgi!;SqY8a zk_)zAOrkTpk;XQ~K8ErStu*f+SijF^Bk$%cV+GPRqa*MKB-l`Om?ShF;WPA@xRw

t?{nC=rwgpBZOtqlxTKPXJ4aAaQ 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