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 | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 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) -clean: - $(CLEANUP) +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) $(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 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 H5jwwj+pHVv&*fg{yp%7!Rrasw%PW!j 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 delta 161476 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
p`|20$VspAGH*Z^O-`cOwGWYMW;E}yNMNw$( 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�byao5@M$;f}(_rrkVu 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 diff --git a/src/unity_internals.h b/src/unity_internals.h index bdcee92..1edb961 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -252,14 +252,19 @@ extern void UNITY_OUTPUT_CHAR(int); #endif #ifndef UNITY_OUTPUT_FLUSH -/* Default to using fflush, which is defined in stdio.h */ +#ifdef UNITY_USE_FLUSH_STDOUT +/* We want to use the stdout flush utility */ #include #define UNITY_OUTPUT_FLUSH (void)fflush(stdout) #else - /* If defined as something else, make sure we declare it here so it's ready for use */ - #ifndef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION +/* We've specified nothing, therefore flush should just be ignored */ +#define UNITY_OUTPUT_FLUSH +#endif +#else +/* We've defined flush as something else, so make sure we declare it here so it's ready for use */ +#ifndef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION extern void UNITY_OUTPUT_FLUSH(void); - #endif +#endif #endif #ifndef UNITY_OUTPUT_FLUSH diff --git a/test/targets/clang_strict.yml b/test/targets/clang_strict.yml index b399d76..e5b41ab 100644 --- a/test/targets/clang_strict.yml +++ b/test/targets/clang_strict.yml @@ -55,8 +55,6 @@ compiler: - UNITY_INCLUDE_DOUBLE - UNITY_SUPPORT_TEST_CASES - UNITY_SUPPORT_64 - - UNITY_OUTPUT_FLUSH - - UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION object_files: prefix: '-o' extension: '.o' From 1c556d2e4cd7258f302b752e845bd81cac11112f Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Sat, 18 Mar 2017 17:42:02 +0100 Subject: [PATCH 070/157] Fix -Wconversion with gcc-4.3 --- src/unity.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/unity.c b/src/unity.c index 5266364..2642efa 100644 --- a/src/unity.c +++ b/src/unity.c @@ -898,16 +898,16 @@ void UnityAssertNumbersWithin(const UNITY_UINT delta, if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) { if (actual > expected) - Unity.CurrentTestFailed = ((UNITY_UINT)(actual - expected) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); else - Unity.CurrentTestFailed = ((UNITY_UINT)(expected - actual) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); } else { if ((UNITY_UINT)actual > (UNITY_UINT)expected) - Unity.CurrentTestFailed = ((UNITY_UINT)(actual - expected) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); else - Unity.CurrentTestFailed = ((UNITY_UINT)(expected - actual) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); } if (Unity.CurrentTestFailed) From 43c751173d363c3e7bceb171873a60a4bf132105 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 20 Mar 2017 14:09:26 -0400 Subject: [PATCH 071/157] stdlib.h explicitly called in fixtures when malloc used, now. (Fixes issue #268) --- extras/fixture/src/unity_fixture_malloc_overrides.h | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/fixture/src/unity_fixture_malloc_overrides.h b/extras/fixture/src/unity_fixture_malloc_overrides.h index 1b176e7..7daba50 100644 --- a/extras/fixture/src/unity_fixture_malloc_overrides.h +++ b/extras/fixture/src/unity_fixture_malloc_overrides.h @@ -26,6 +26,7 @@ * For example, when using FreeRTOS UNITY_FIXTURE_MALLOC becomes pvPortMalloc() * and UNITY_FIXTURE_FREE becomes vPortFree(). */ #if !defined(UNITY_FIXTURE_MALLOC) || !defined(UNITY_FIXTURE_FREE) + #include #define UNITY_FIXTURE_MALLOC(size) malloc(size) #define UNITY_FIXTURE_FREE(ptr) free(ptr) #else From 689610b864d4dbbaa17bea06ce177e141fbfd9e3 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 20 Mar 2017 15:49:28 -0400 Subject: [PATCH 072/157] reorder includes in generated test runners --- auto/generate_test_runner.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index fbb7d9c..865a22c 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -170,7 +170,6 @@ class UnityTestRunnerGenerator output.puts('#include "cmock.h"') unless (mocks.empty?) 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 @@ -187,6 +186,7 @@ class UnityTestRunnerGenerator mocks.each do |mock| output.puts("#include \"#{mock.gsub('.h','')}.h\"") end + output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) if @options[:enforce_strict_ordering] output.puts('') output.puts('int GlobalExpectCount;') From 8a45ccf4066c8f159a049bce0ac6b44fbd7fcb57 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 20 Mar 2017 15:56:05 -0400 Subject: [PATCH 073/157] Use custom mock prefix when searching for mock header files. #263 --- auto/generate_test_runner.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 865a22c..d609fcb 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -157,7 +157,7 @@ class UnityTestRunnerGenerator mock_headers = [] includes.each do |include_path| include_file = File.basename(include_path) - mock_headers << include_path if (include_file =~ /^mock/i) + mock_headers << include_path if (include_file =~ /^#{@options[:mock_prefix]}/i) end return mock_headers end From c3658a065de1b9bce53652a80c5904c990b65099 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 20 Mar 2017 16:07:40 -0400 Subject: [PATCH 074/157] Dropped support for pre-2.0 versions of Ruby (not even rubylang supports them anymore) --- auto/generate_test_runner.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index d609fcb..2d3f931 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -4,7 +4,6 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -$QUICK_RUBY_VERSION = RUBY_VERSION.split('.').inject(0){|vv,v| vv * 100 + v.to_i } File.expand_path(File.join(File.dirname(__FILE__),'colour_prompt')) class UnityTestRunnerGenerator @@ -58,7 +57,7 @@ class UnityTestRunnerGenerator #pull required data from source file source = File.read(input_file) - source = source.force_encoding("ISO-8859-1").encode("utf-8", :replace => nil) if ($QUICK_RUBY_VERSION > 10900) + source = source.force_encoding("ISO-8859-1").encode("utf-8", :replace => nil) tests = find_tests(source) headers = find_includes(source) testfile_includes = (headers[:local] + headers[:system]) From 0781e74ac61fe49426b01a7661701986e072f480 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 20 Mar 2017 16:29:40 -0400 Subject: [PATCH 075/157] Add our coding standard to documentation --- docs/ThrowTheSwitchCodingStandard.pdf | Bin 0 -> 95714 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/ThrowTheSwitchCodingStandard.pdf diff --git a/docs/ThrowTheSwitchCodingStandard.pdf b/docs/ThrowTheSwitchCodingStandard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..193bfc7dffe1b672ca1526f8d93068480008b821 GIT binary patch literal 95714 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 CAcq_P literal 0 HcmV?d00001 From 56eeacd0b2400966a8fe51595c3bf4e4354eb5f2 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 21 Mar 2017 08:00:48 -0400 Subject: [PATCH 076/157] prepare for comparing value to array by setting up explicit compare of array to array in ints --- src/unity.c | 8 +++++-- src/unity_internals.h | 54 ++++++++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/unity.c b/src/unity.c index 2642efa..da42de4 100644 --- a/src/unity.c +++ b/src/unity.c @@ -539,7 +539,8 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags) { UNITY_UINT32 elements = num_elements; unsigned int length = style & 0xF; @@ -601,7 +602,10 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - expected = (UNITY_INTERNAL_PTR)(length + (const char*)expected); + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expected = (UNITY_INTERNAL_PTR)(length + (const char*)expected); + } actual = (UNITY_INTERNAL_PTR)(length + (const char*)actual); } } diff --git a/src/unity_internals.h b/src/unity_internals.h index 1edb961..6454665 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -367,6 +367,12 @@ typedef enum UNITY_FLOAT_TRAIT } UNITY_FLOAT_TRAIT_T; #endif +typedef enum +{ + UNITY_ARRAY_TO_VAL = 0, + UNITY_ARRAY_TO_ARRAY +} UNITY_FLAGS_T; + struct UNITY_STORAGE_T { const char* TestFile; @@ -454,7 +460,8 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, const UNITY_UINT32 num_elements, const char* msg, const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style); + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags); void UnityAssertBits(const UNITY_INT mask, const UNITY_INT expected, @@ -646,28 +653,43 @@ int UnityTestMatches(void); #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), (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)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) +#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, UNITY_ARRAY_TO_ARRAY) #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)) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(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_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) + #ifdef UNITY_SUPPORT_64 #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_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_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) From 7fe31915d04ea3b9184935662b6f1dd6038831db Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 21 Mar 2017 14:37:52 -0400 Subject: [PATCH 077/157] Added some tests to prove this works. Still work in progress --- src/unity.c | 46 +++++++++++++-- src/unity.h | 40 +++++++++++++ src/unity_internals.h | 29 +++++---- test/tests/testunity.c | 130 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 228 insertions(+), 17 deletions(-) diff --git a/src/unity.c b/src/unity.c index da42de4..ac3dd36 100644 --- a/src/unity.c +++ b/src/unity.c @@ -570,17 +570,17 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, 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; - length = 4; - break; #ifdef UNITY_SUPPORT_64 case 8: expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; break; #endif + 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; } if (expect_val != actual_val) @@ -1118,6 +1118,41 @@ void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, } } +/*-----------------------------------------------*/ + +static union +{ + UNITY_INT8 i8; + UNITY_INT16 i16; + UNITY_INT32 i32; +#ifdef UNITY_SUPPORT_64 + UNITY_INT64 i64; +#endif +} UnityQuickCompare; + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) +{ + switch(size) + { + case 1: + UnityQuickCompare.i8 = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); + + case 2: + UnityQuickCompare.i16 = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); + +#ifdef UNITY_SUPPORT_64 + case 8: + UnityQuickCompare.i64 = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); +#endif + default: //4 bytes + UnityQuickCompare.i32 = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); + } +} + /*----------------------------------------------- * Control Functions *-----------------------------------------------*/ @@ -1181,6 +1216,7 @@ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) #pragma weak tearDown void tearDown(void) { } #endif + /*-----------------------------------------------*/ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) { diff --git a/src/unity.h b/src/unity.h index 2cdd151..da132ff 100644 --- a/src/unity.h +++ b/src/unity.h @@ -157,6 +157,26 @@ void tearDown(void); #define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) +/* Arrays Compared To Single Value */ +#define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) +//#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) +//#define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) + /* Floating Point (If Enabled) */ #define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) @@ -262,6 +282,26 @@ void tearDown(void); #define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) +/* Arrays Compared To Single Value*/ +#define TEST_ASSERT_EACH_EQUAL_INT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) +//#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) +//#define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) + /* Floating Point (If Enabled) */ #define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) diff --git a/src/unity_internals.h b/src/unity_internals.h index 6454665..3a2b359 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -542,6 +542,8 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, const UNITY_FLOAT_TRAIT_T style); #endif +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size); + /*------------------------------------------------------- * Error Strings We Might Need *-------------------------------------------------------*/ @@ -668,18 +670,18 @@ int UnityTestMatches(void); #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)) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(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, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(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, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(uint)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) #define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) @@ -690,6 +692,9 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) #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) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index f062894..696a1d6 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -1641,6 +1641,65 @@ void testNotEqualIntArraysLengthZero(void) VERIFY_FAILS_END } +void testEqualIntEachEqual(void) +{ + int p0[] = {1, 1, 1, 1}; + int p1[] = {987, 987, 987, 987}; + int p2[] = {-2, -2, -2, -3}; + int p3[] = {1, 5, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_INT(1, p0, 1); + TEST_ASSERT_EACH_EQUAL_INT(1, p0, 4); + TEST_ASSERT_EACH_EQUAL_INT(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_INT(-2, p2, 3); + TEST_ASSERT_EACH_EQUAL_INT(1, p3, 1); +} + +void testNotEqualIntEachEqualNullActual(void) +{ + int* p1 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(1, p1, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntEachEqual1(void) +{ + int p0[] = {1, 1, 1, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(1, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntEachEqual2(void) +{ + int p0[] = {-5, -5, -1, -5}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(-5, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualIntEachEqual3(void) +{ + int p0[] = {1, 88, 88, 88}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(88, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualEachEqualLengthZero(void) +{ + UNITY_UINT32 p0[1] = {1}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT(0, p0, 0); + VERIFY_FAILS_END +} + void testEqualPtrArrays(void) { char A = 1; @@ -1721,6 +1780,77 @@ void testNotEqualPtrArrays3(void) VERIFY_FAILS_END } +void testEqualPtrEachEqual(void) +{ + char A = 1; + char B = 2; + char C = 3; + char* p0[] = {&A, &A, &A}; + char* p1[] = {&A, &B, &C, &A}; + char* p2[] = {&B, &B}; + char* p3[] = {&C}; + + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 1); + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 3); + TEST_ASSERT_EACH_EQUAL_PTR(&A, p1, 1); + TEST_ASSERT_EACH_EQUAL_PTR(&B, p2, 2); + TEST_ASSERT_EACH_EQUAL_PTR(&C, p3, 1); +} + +void testNotEqualPtrEachEqualNullExpected(void) +{ + char A = 1; + char B = 1; + char* p0[] = {&A, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 2); + VERIFY_FAILS_END +} + +void testNotEqualPtrEachEqualNullActual(void) +{ + char A = 1; + char** p0 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 2); + VERIFY_FAILS_END +} + +void testNotEqualPtrEachEqual1(void) +{ + char A = 1; + char B = 1; + char* p0[] = {&A, &A, &A, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&A, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualPtrEachEqual2(void) +{ + char A = 1; + char B = 1; + char* p0[] = {&B, &B, &A, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&B, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualPtrEachEqual3(void) +{ + char A = 1; + char B = 1; + char* p0[] = {&A, &B, &B, &B}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_PTR(&B, p0, 4); + VERIFY_FAILS_END +} + void testEqualInt8Arrays(void) { UNITY_INT8 p0[] = {1, 8, 117, -2}; From b7956ea9886e5f0206bb9afc2bcd7f1bb4f23bf6 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 21 Mar 2017 16:24:16 -0400 Subject: [PATCH 078/157] Added more tests for all the numerical types when performing each_equal assertions --- src/unity_internals.h | 2 +- test/tests/testunity.c | 405 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 402 insertions(+), 5 deletions(-) diff --git a/src/unity_internals.h b/src/unity_internals.h index 3a2b359..cf957a6 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -674,7 +674,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(uint)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(unsigned int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 696a1d6..2f878b4 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -1875,6 +1875,29 @@ void testNotEqualInt8Arrays(void) VERIFY_FAILS_END } +void testEqualInt8EachEqual(void) +{ + UNITY_INT8 p0[] = {1, 1, 1, 1}; + UNITY_INT8 p1[] = {117, 117, 117, -2}; + UNITY_INT8 p2[] = {-1, -1, 117, 2}; + UNITY_INT8 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EACH_EQUAL_INT8(1, p0, 1); + TEST_ASSERT_EACH_EQUAL_INT8(1, p0, 4); + TEST_ASSERT_EACH_EQUAL_INT8(117, p1, 3); + TEST_ASSERT_EACH_EQUAL_INT8(-1, p2, 2); + TEST_ASSERT_EACH_EQUAL_INT8(1, p3, 1); +} + +void testNotEqualInt8EachEqual(void) +{ + UNITY_INT8 p0[] = {1, 8, 36, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT8(1, p0, 2); + VERIFY_FAILS_END +} + void testEqualUIntArrays(void) { unsigned int p0[] = {1, 8, 987, 65132u}; @@ -1919,6 +1942,47 @@ void testNotEqualUIntArrays3(void) VERIFY_FAILS_END } +void testEqualUIntEachEqual(void) +{ + unsigned int p0[] = {1, 1, 1, 1}; + unsigned int p1[] = {65132u, 65132u, 65132u, 65132u}; + unsigned int p2[] = {8, 8, 987, 2}; + unsigned int p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_UINT(1, p0, 1); + TEST_ASSERT_EACH_EQUAL_UINT(1, p0, 4); + TEST_ASSERT_EACH_EQUAL_UINT(65132u, p1, 4); + TEST_ASSERT_EACH_EQUAL_UINT(8, p2, 2); + TEST_ASSERT_EACH_EQUAL_UINT(1, p3, 1); +} + +void testNotEqualUIntEachEqual1(void) +{ + unsigned int p0[] = {1, 65132u, 65132u, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUIntEachEqual2(void) +{ + unsigned int p0[] = {987, 8, 987, 987}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUIntEachEqual3(void) +{ + unsigned int p0[] = {1, 1, 1, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT(1, p0, 4); + VERIFY_FAILS_END +} + void testEqualInt16Arrays(void) { UNITY_INT16 p0[] = {1, 8, 117, 3}; @@ -1943,6 +2007,29 @@ void testNotEqualInt16Arrays(void) VERIFY_FAILS_END } +void testEqualInt16EachEqual(void) +{ + UNITY_INT16 p0[] = {1, 1, 1, 1}; + UNITY_INT16 p1[] = {32111, 32111, 32111, 3}; + UNITY_INT16 p2[] = {-1, -1, -1, 2}; + UNITY_INT16 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EACH_EQUAL_INT16(1, p0, 1); + TEST_ASSERT_EACH_EQUAL_INT16(1, p0, 4); + TEST_ASSERT_EACH_EQUAL_INT16(32111, p1, 3); + TEST_ASSERT_EACH_EQUAL_INT16(-1, p2, 3); + TEST_ASSERT_EACH_EQUAL_INT16(1, p3, 1); +} + +void testNotEqualInt16EachEqual(void) +{ + UNITY_INT16 p0[] = {127, 127, 127, 3}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT16(127, p0, 4); + VERIFY_FAILS_END +} + void testEqualInt32Arrays(void) { UNITY_INT32 p0[] = {1, 8, 117, 3}; @@ -1967,6 +2054,29 @@ void testNotEqualInt32Arrays(void) VERIFY_FAILS_END } +void testEqualInt32EachEqual(void) +{ + UNITY_INT32 p0[] = {8, 8, 8, 8}; + UNITY_INT32 p1[] = {65537, 65537, 65537, 65537}; + UNITY_INT32 p2[] = {-3, -3, -3, 2}; + UNITY_INT32 p3[] = {1, 50, 60, 70}; + + TEST_ASSERT_EACH_EQUAL_INT32(8, p0, 1); + TEST_ASSERT_EACH_EQUAL_INT32(8, p0, 4); + TEST_ASSERT_EACH_EQUAL_INT32(65537, p1, 4); + TEST_ASSERT_EACH_EQUAL_INT32(-3, p2, 3); + TEST_ASSERT_EACH_EQUAL_INT32(1, p3, 1); +} + +void testNotEqualInt32EachEqual(void) +{ + UNITY_INT32 p0[] = {127, 8, 127, 127}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_INT32(127, p0, 4); + VERIFY_FAILS_END +} + void testEqualUINT8Arrays(void) { UNITY_UINT8 p0[] = {1, 8, 100, 127}; @@ -2234,10 +2344,10 @@ void testNotEqualHEX16Arrays3(void) void testEqualHEX8Arrays(void) { - unsigned short p0[] = {1, 8, 254u, 123}; - unsigned short p1[] = {1, 8, 254u, 123}; - unsigned short p2[] = {1, 8, 254u, 2}; - unsigned short p3[] = {1, 23, 25, 26}; + unsigned char p0[] = {1, 8, 254u, 123}; + unsigned char p1[] = {1, 8, 254u, 123}; + unsigned char p2[] = {1, 8, 254u, 2}; + unsigned char p3[] = {1, 23, 25, 26}; TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p0, 1); TEST_ASSERT_EQUAL_HEX8_ARRAY(p0, p0, 4); @@ -2276,6 +2386,293 @@ void testNotEqualHEX8Arrays3(void) VERIFY_FAILS_END } +void testEqualUINT8EachEqual(void) +{ + UNITY_UINT8 p0[] = {127u, 127u, 127u, 127u}; + UNITY_UINT8 p1[] = {1u, 1u, 1u, 1u}; + UNITY_UINT8 p2[] = {128u, 128u, 128u, 2u}; + UNITY_UINT8 p3[] = {1u, 50u, 60u, 70u}; + + TEST_ASSERT_EACH_EQUAL_UINT8(127u, p0, 1); + TEST_ASSERT_EACH_EQUAL_UINT8(127u, p0, 4); + TEST_ASSERT_EACH_EQUAL_UINT8(1u, p1, 4); + TEST_ASSERT_EACH_EQUAL_UINT8(128u, p2, 3); + TEST_ASSERT_EACH_EQUAL_UINT8(1u, p3, 1); +} + +void testNotEqualUINT8EachEqual1(void) +{ + unsigned char p0[] = {127u, 127u, 128u, 127u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT8(127u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT8EachEqual2(void) +{ + unsigned char p0[] = {1, 1, 1, 127u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT8(1, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT8EachEqual3(void) +{ + unsigned char p0[] = {54u, 55u, 55u, 55u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT8(55u, p0, 4); + VERIFY_FAILS_END +} + +void testEqualUINT16EachEqual(void) +{ + unsigned short p0[] = {65132u, 65132u, 65132u, 65132u}; + unsigned short p1[] = {987, 987, 987, 987}; + unsigned short p2[] = {1, 1, 1, 2}; + unsigned short p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_UINT16(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_UINT16(1, p2, 3); + TEST_ASSERT_EACH_EQUAL_UINT16(1, p3, 1); +} + +void testNotEqualUINT16EachEqual1(void) +{ + unsigned short p0[] = {1, 65132u, 65132u, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT16EachEqual2(void) +{ + unsigned short p0[] = {65132u, 65132u, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT16EachEqual3(void) +{ + unsigned short p0[] = {65132u, 65132u, 65132u, 65133u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT16(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testEqualUINT32EachEqual(void) +{ + UNITY_UINT32 p0[] = {65132u, 65132u, 65132u, 65132u}; + UNITY_UINT32 p1[] = {987, 987, 987, 987}; + UNITY_UINT32 p2[] = {8, 8, 8, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_UINT32(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_UINT32(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_UINT32(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_UINT32(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_UINT32(1, p3, 1); +} + +void testNotEqualUINT32EachEqual1(void) +{ + UNITY_UINT32 p0[] = {65132u, 65132u, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT32(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT32EachEqual2(void) +{ + UNITY_UINT32 p0[] = {1, 987, 987, 987}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT32(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualUINT32EachEqual3(void) +{ + UNITY_UINT32 p0[] = {1, 1, 1, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_UINT32(1, p0, 4); + VERIFY_FAILS_END +} + +void testEqualHEXEachEqual(void) +{ + UNITY_UINT32 p0[] = {65132u, 65132u, 65132u, 65132u}; + UNITY_UINT32 p1[] = {987, 987, 987, 987}; + UNITY_UINT32 p2[] = {8, 8, 8, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_HEX(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_HEX(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_HEX(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_HEX(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_HEX(1, p3, 1); +} + +void testNotEqualHEXEachEqual1(void) +{ + UNITY_UINT32 p0[] = {1, 65132u, 65132u, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEXEachEqual2(void) +{ + UNITY_UINT32 p0[] = {987, 987, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEXEachEqual3(void) +{ + UNITY_UINT32 p0[] = {8, 8, 987, 8}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX(8, p0, 4); + VERIFY_FAILS_END +} + +void testEqualHEX32EachEqual(void) +{ + UNITY_UINT32 p0[] = {65132u, 65132u, 65132u, 65132u}; + UNITY_UINT32 p1[] = {987, 987, 987, 987}; + UNITY_UINT32 p2[] = {8, 8, 8, 2}; + UNITY_UINT32 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_HEX32(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_HEX32(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_HEX32(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_HEX32(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_HEX32(1, p3, 1); +} + +void testNotEqualHEX32EachEqual1(void) +{ + UNITY_UINT32 p0[] = {65132u, 8, 65132u, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX32EachEqual2(void) +{ + UNITY_UINT32 p0[] = {1, 987, 987, 987}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX32EachEqual3(void) +{ + UNITY_UINT32 p0[] = {8, 8, 8, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX32(8, p0, 4); + VERIFY_FAILS_END +} + +void testEqualHEX16EachEqual(void) +{ + UNITY_UINT16 p0[] = {65132u, 65132u, 65132u, 65132u}; + UNITY_UINT16 p1[] = {987, 987, 987, 987}; + UNITY_UINT16 p2[] = {8, 8, 8, 2}; + UNITY_UINT16 p3[] = {1, 500, 600, 700}; + + TEST_ASSERT_EACH_EQUAL_HEX16(65132u, p0, 1); + TEST_ASSERT_EACH_EQUAL_HEX16(65132u, p0, 4); + TEST_ASSERT_EACH_EQUAL_HEX16(987, p1, 4); + TEST_ASSERT_EACH_EQUAL_HEX16(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_HEX16(1, p3, 1); +} + +void testNotEqualHEX16EachEqual1(void) +{ + unsigned short p0[] = {65132u, 65132u, 987, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX16(65132u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX16EachEqual2(void) +{ + unsigned short p0[] = {1, 987, 987, 987}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX16(987, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX16EachEqual3(void) +{ + unsigned short p0[] = {8, 8, 8, 65132u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX16(8, p0, 4); + VERIFY_FAILS_END +} + +void testEqualHEX8EachEqual(void) +{ + unsigned char p0[] = {254u, 254u, 254u, 254u}; + unsigned char p1[] = {123, 123, 123, 123}; + unsigned char p2[] = {8, 8, 8, 2}; + unsigned char p3[] = {1, 23, 25, 26}; + + TEST_ASSERT_EACH_EQUAL_HEX8(254u, p0, 1); + TEST_ASSERT_EACH_EQUAL_HEX8(254u, p0, 4); + TEST_ASSERT_EACH_EQUAL_HEX8(123, p1, 4); + TEST_ASSERT_EACH_EQUAL_HEX8(8, p2, 3); + TEST_ASSERT_EACH_EQUAL_HEX8(1, p3, 1); +} + +void testNotEqualHEX8EachEqual1(void) +{ + unsigned char p0[] = {253u, 253u, 254u, 253u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX8(253u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX8EachEqual2(void) +{ + unsigned char p0[] = {254u, 254u, 254u, 253u}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX8(254u, p0, 4); + VERIFY_FAILS_END +} + +void testNotEqualHEX8EachEqual3(void) +{ + unsigned char p0[] = {1, 8, 8, 8}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_HEX8(8, p0, 4); + VERIFY_FAILS_END +} + void testEqualMemoryArrays(void) { int p0[] = {1, 8, 987, -2}; From d8d67a708ceee36a288637e3cabbd886f6ba4632 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 21 Mar 2017 17:05:19 -0400 Subject: [PATCH 079/157] Added each_equal assertions for float and double --- src/unity.c | 38 +++++- src/unity.h | 4 + src/unity_internals.h | 24 +++- test/tests/testunity.c | 288 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 346 insertions(+), 8 deletions(-) diff --git a/src/unity.c b/src/unity.c index ac3dd36..779b43b 100644 --- a/src/unity.c +++ b/src/unity.c @@ -649,7 +649,8 @@ 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) + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) { UNITY_UINT32 elements = num_elements; UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; @@ -677,7 +678,10 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_expected++; + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } ptr_actual++; } } @@ -775,7 +779,8 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber) + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) { UNITY_UINT32 elements = num_elements; UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; @@ -803,7 +808,10 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } - ptr_expected++; + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } ptr_actual++; } } @@ -1128,6 +1136,12 @@ static union #ifdef UNITY_SUPPORT_64 UNITY_INT64 i64; #endif +#ifndef UNITY_EXCLUDE_FLOAT + float f; +#endif +#ifndef UNITY_EXCLUDE_DOUBLE + double d; +#endif } UnityQuickCompare; UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) @@ -1153,6 +1167,22 @@ UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) } } +#ifndef UNITY_EXCLUDE_FLOAT +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) +{ + UnityQuickCompare.f = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); +} +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) +{ + UnityQuickCompare.d = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); +} +#endif + /*----------------------------------------------- * Control Functions *-----------------------------------------------*/ diff --git a/src/unity.h b/src/unity.h index da132ff..42c9e6f 100644 --- a/src/unity.h +++ b/src/unity.h @@ -181,6 +181,7 @@ void tearDown(void); #define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) #define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) #define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) @@ -194,6 +195,7 @@ void tearDown(void); #define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) #define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) #define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) #define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) @@ -306,6 +308,7 @@ void tearDown(void); #define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_FLOAT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) #define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) #define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) @@ -319,6 +322,7 @@ void tearDown(void); #define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) #define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) #define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) #define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) diff --git a/src/unity_internals.h b/src/unity_internals.h index cf957a6..7662935 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -515,7 +515,8 @@ 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); + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); void UnityAssertFloatSpecial(const UNITY_FLOAT actual, const char* msg, @@ -534,7 +535,8 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber); + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, const char* msg, @@ -542,7 +544,17 @@ void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, const UNITY_FLOAT_TRAIT_T style); #endif +/*------------------------------------------------------- + * Helpers + *-------------------------------------------------------*/ + UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size); +#ifndef UNITY_EXCLUDE_FLOAT +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num); +#endif +#ifndef UNITY_EXCLUDE_DOUBLE +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num); +#endif /*------------------------------------------------------- * Error Strings We Might Need @@ -714,6 +726,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) #define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) @@ -725,7 +738,8 @@ int UnityTestMatches(void); #else #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_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), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UnityAssertEqualFloatArray(UnityFloatToPtr(expected), (UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #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) @@ -740,6 +754,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) #define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) @@ -751,7 +766,8 @@ int UnityTestMatches(void); #else #define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)line) #define UNITY_TEST_ASSERT_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_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray((UNITY_DOUBLE*)(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertEqualDoubleArray(UnityDoubleToPtr(expected), (UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)line, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_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) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 2f878b4..7f8f1e5 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3782,6 +3782,150 @@ void testNotEqualFloatArraysLengthZero(void) #endif } +void testEqualFloatEachEqual(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 1.0f, 1.0f, 1.0f}; + float p1[] = {-0.123f, -0.123f, -0.123f, -0.123f}; + float p2[] = {25.4f, 25.4f, 25.4f, -0.2f}; + float p3[] = {1.0f, -23.0f, 25.0f, -0.26f}; + + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 1); + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 4); + TEST_ASSERT_EACH_EQUAL_FLOAT(-0.123f, p1, 4); + TEST_ASSERT_EACH_EQUAL_FLOAT(25.4f, p2, 3); + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p3, 1); +#endif +} + +void testNotEqualFloatEachEqualActualNull(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float* p0 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(5, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqual1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {0.253f, 8.0f, 0.253f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(0.253f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqual2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {8.0f, 8.0f, 8.0f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(8.0f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqual3(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f, 1.0f, 1.0f, 0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqualNegative1(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-1.0f, -0.253f, -0.253f, -0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(-0.253f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqualNegative2(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-25.4f, -8.0f, -25.4f, -25.4f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(-25.4f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualFloatEachEqualNegative3(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {-8.0f, -8.0f, -8.0f, -0.253f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(-8.0f, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testEqualFloatEachEqualNaN(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {0.0f / f_zero, 0.0f / f_zero, 0.0f / f_zero, 0.0f / f_zero}; + + TEST_ASSERT_EACH_EQUAL_FLOAT(0.0f / f_zero, p0, 4); +#endif +} + +void testEqualFloatEachEqualInf(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[] = {1.0f / f_zero, 1.0f / f_zero, 25.4f, 0.253f}; + + TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f / f_zero, p0, 2); +#endif +} + +void testNotEqualFloatEachEqualLengthZero(void) +{ +#ifdef UNITY_EXCLUDE_FLOAT + TEST_IGNORE(); +#else + float p0[1] = {0.0f}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_FLOAT(0.0f, p0, 0); + VERIFY_FAILS_END +#endif +} + #define TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, actual) { \ startPutcharSpy(); UnityPrintFloat((actual)); endPutcharSpy(); \ TEST_ASSERT_EQUAL_STRING((expected), getBufferPutcharSpy()); \ @@ -4480,6 +4624,150 @@ void testNotEqualDoubleArraysLengthZero(void) #endif } +void testEqualDoubleEachEqual(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 1.0, 1.0, 1.0}; + double p1[] = {-0.123, -0.123, -0.123, -0.123}; + double p2[] = {25.4, 25.4, 25.4, -0.2}; + double p3[] = {1.0, -23.0, 25.0, -0.26}; + + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0, p0, 1); + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0, p0, 4); + TEST_ASSERT_EACH_EQUAL_DOUBLE(-0.123, p1, 4); + TEST_ASSERT_EACH_EQUAL_DOUBLE(25.4, p2, 3); + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0, p3, 1); +#endif +} + +void testNotEqualDoubleEachEqualActualNull(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double* p0 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(5, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqual1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {0.253, 8.0, 0.253, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(0.253, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqual2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {8.0, 8.0, 8.0, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(8.0, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqual3(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0, 1.0, 1.0, 0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqualNegative1(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-1.0, -0.253, -0.253, -0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(-0.253, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqualNegative2(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-25.4, -8.0, -25.4, -25.4}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(-25.4, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testNotEqualDoubleEachEqualNegative3(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {-8.0, -8.0, -8.0, -0.253}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(-8.0, p0, 4); + VERIFY_FAILS_END +#endif +} + +void testEqualDoubleEachEqualNaN(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {0.0 / d_zero, 0.0 / d_zero, 0.0 / d_zero, 0.0 / d_zero}; + + TEST_ASSERT_EACH_EQUAL_DOUBLE(0.0 / d_zero, p0, 4); +#endif +} + +void testEqualDoubleEachEqualInf(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[] = {1.0 / d_zero, 1.0 / d_zero, 25.4, 0.253}; + + TEST_ASSERT_EACH_EQUAL_DOUBLE(1.0 / d_zero, p0, 2); +#endif +} + +void testNotEqualDoubleEachEqualLengthZero(void) +{ +#ifdef UNITY_EXCLUDE_DOUBLE + TEST_IGNORE(); +#else + double p0[1] = {0.0}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_DOUBLE(0.0, p0, 0); + VERIFY_FAILS_END +#endif +} + void testDoublePrinting(void) { #if defined(UNITY_EXCLUDE_FLOAT_PRINT) || defined(UNITY_EXCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY) From a11a13750d10b70653f40878558fa44e1533db7a Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 21 Mar 2017 18:28:49 -0400 Subject: [PATCH 080/157] Added memory each equal assertion --- src/unity.c | 7 ++++- src/unity.h | 4 +-- src/unity_internals.h | 9 +++--- test/tests/testunity.c | 65 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/unity.c b/src/unity.c index 779b43b..f4fe99b 100644 --- a/src/unity.c +++ b/src/unity.c @@ -1079,7 +1079,8 @@ void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, const UNITY_UINT32 length, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber) + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) { 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; @@ -1123,6 +1124,10 @@ void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, ptr_exp++; ptr_act++; } + if (flags == UNITY_ARRAY_TO_VAL) + { + ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + } } } diff --git a/src/unity.h b/src/unity.h index 42c9e6f..19e32ed 100644 --- a/src/unity.h +++ b/src/unity.h @@ -175,7 +175,7 @@ void tearDown(void); #define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) //#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) -//#define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) /* Floating Point (If Enabled) */ #define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) @@ -302,7 +302,7 @@ void tearDown(void); #define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) //#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) -//#define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) /* Floating Point (If Enabled) */ #define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) diff --git a/src/unity_internals.h b/src/unity_internals.h index 7662935..93bbe98 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -491,7 +491,8 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, const UNITY_UINT32 length, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber); + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); void UnityAssertNumbersWithin(const UNITY_UINT delta, const UNITY_INT expected, @@ -665,7 +666,7 @@ int UnityTestMatches(void); #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)) +#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), UNITY_ARRAY_TO_ARRAY) #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, UNITY_ARRAY_TO_ARRAY) #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, UNITY_ARRAY_TO_ARRAY) @@ -680,7 +681,7 @@ int UnityTestMatches(void); #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, UNITY_ARRAY_TO_ARRAY) #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, UNITY_ARRAY_TO_ARRAY) #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)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) @@ -695,7 +696,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((const char**)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) -#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #ifdef UNITY_SUPPORT_64 #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) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 7f8f1e5..b5d593a 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -2737,6 +2737,71 @@ void testNotEqualMemoryArrays3(void) VERIFY_FAILS_END } +void testEqualMemoryEachEqual(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, -2, 1, 8, 987, -2}; + int p2[] = {8, 8, 8, 2}; + int p3[] = {8, 500, 600, 700}; + int v = 8; + + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p0, sizeof(int)*4, 1); + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 2); + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 1); + TEST_ASSERT_EACH_EQUAL_MEMORY(&v, p2, sizeof(int), 3); + TEST_ASSERT_EACH_EQUAL_MEMORY(&v, p3, sizeof(int), 1); +} + +void testNotEqualMemoryEachEqualExpectedNull(void) +{ + int* p0 = NULL; + int p1[] = {1, 8, 987, 2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryEachEqualActualNull(void) +{ + int p0[] = {1, 8, 987, -2}; + int* p1 = NULL; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int), 4); + VERIFY_FAILS_END +} + +void testNotEqualMemoryEachEqual1(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {9, 8, 987, -2, 1, 8, 987, -2, 1, 8, 987, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 3); + VERIFY_FAILS_END +} + +void testNotEqualMemoryEachEqual2(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, -2, 1, 8, 987, -2, 1, 8, 987, 9}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 3); + VERIFY_FAILS_END +} + +void testNotEqualMemoryEachEqual3(void) +{ + int p0[] = {1, 8, 987, -2}; + int p1[] = {1, 8, 987, -2, 1, 9, 987, -2, 1, 8, 987, -2}; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_MEMORY(p0, p1, sizeof(int)*4, 3); + VERIFY_FAILS_END +} + void testProtection(void) { volatile int mask = 0; From 0dddf498c22affed0070a9315eba8fa6f5854347 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 21 Mar 2017 23:57:15 -0400 Subject: [PATCH 081/157] also update strings to support each element of an array. --- src/unity.c | 41 +++++++++++++++++++++++-------- src/unity.h | 4 +-- src/unity_internals.h | 9 ++++--- test/tests/testunity.c | 55 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 16 deletions(-) diff --git a/src/unity.c b/src/unity.c index f4fe99b..f7cae0a 100644 --- a/src/unity.c +++ b/src/unity.c @@ -1016,13 +1016,17 @@ void UnityAssertEqualStringLen(const char* expected, } /*-----------------------------------------------*/ -void UnityAssertEqualStringArray(const char** expected, +void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, const char** actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber) + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) { - UNITY_UINT32 i, j = 0; + UNITY_UINT32 i = 0; + UNITY_UINT32 j = 0; + const char* exp; + const char* act; RETURN_IF_FAIL_OR_IGNORE; @@ -1032,18 +1036,35 @@ void UnityAssertEqualStringArray(const char** expected, UnityPrintPointlessAndBail(); } - if (expected == actual) return; /* Both are NULL or same pointer */ + if ((const char**)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; + } + + if (flags != UNITY_ARRAY_TO_ARRAY) + { + exp = (const char*)expected; + } do { - /* if both pointers not null compare the strings */ - if (expected[j] && actual[j]) + act = actual[j]; + if (flags == UNITY_ARRAY_TO_ARRAY) { - for (i = 0; expected[j][i] || actual[j][i]; i++) + exp = ((const char**)expected)[j]; + } + + /* if both pointers not null compare the strings */ + if (exp && act) + { + for (i = 0; exp[i] || act[i]; i++) { - if (expected[j][i] != actual[j][i]) + if (exp[i] != act[i]) { Unity.CurrentTestFailed = 1; break; @@ -1052,7 +1073,7 @@ void UnityAssertEqualStringArray(const char** expected, } else { /* handle case of one pointers being null (if both null, test should pass) */ - if (expected[j] != actual[j]) + if (exp != act) { Unity.CurrentTestFailed = 1; } @@ -1066,7 +1087,7 @@ void UnityAssertEqualStringArray(const char** expected, UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(j); } - UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j])); + UnityPrintExpectedAndActualStrings(exp, act); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } diff --git a/src/unity.h b/src/unity.h index 19e32ed..6434238 100644 --- a/src/unity.h +++ b/src/unity.h @@ -174,7 +174,7 @@ void tearDown(void); #define TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) -//#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) /* Floating Point (If Enabled) */ @@ -301,7 +301,7 @@ void tearDown(void); #define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) -//#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) /* Floating Point (If Enabled) */ diff --git a/src/unity_internals.h b/src/unity_internals.h index 93bbe98..b213ee9 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -480,11 +480,12 @@ void UnityAssertEqualStringLen(const char* expected, const char* msg, const UNITY_LINE_TYPE lineNumber); -void UnityAssertEqualStringArray( const char** expected, +void UnityAssertEqualStringArray( UNITY_INTERNAL_PTR expected, const char** actual, const UNITY_UINT32 num_elements, const char* msg, - const UNITY_LINE_TYPE lineNumber); + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, @@ -680,7 +681,7 @@ int UnityTestMatches(void); #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, UNITY_ARRAY_TO_ARRAY) #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, UNITY_ARRAY_TO_ARRAY) #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, UNITY_ARRAY_TO_ARRAY) -#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_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) @@ -695,7 +696,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(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_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #ifdef UNITY_SUPPORT_64 diff --git a/test/tests/testunity.c b/test/tests/testunity.c index b5d593a..3555fb2 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -1519,6 +1519,61 @@ void testNotEqualStringArrayLengthZero(void) VERIFY_FAILS_END } +void testEqualStringEachEqual(void) +{ + const char *testStrings1[] = { "foo", "foo", "foo", "foo" }; + const char *testStrings2[] = { "boo", "boo", "boo", "zoo" }; + const char *testStrings3[] = { "", "", "", "" }; + + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings1, 4); + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings1, 1); + TEST_ASSERT_EACH_EQUAL_STRING("boo", testStrings2, 3); + TEST_ASSERT_EACH_EQUAL_STRING("", testStrings3, 4); +} + +void testNotEqualStringEachEqual1(void) +{ + const char *testStrings[] = { "foo", "foo", "foo", "moo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringEachEqual2(void) +{ + const char *testStrings[] = { "boo", "foo", "foo", "foo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringEachEqual3(void) +{ + const char *testStrings[] = { "foo", "foo", "foo", NULL }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringEachEqual4(void) +{ + const char *testStrings[] = { "foo", "foo", "woo", "foo" }; + + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", testStrings, 4); + VERIFY_FAILS_END +} + +void testNotEqualStringEachEqual5(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_EACH_EQUAL_STRING("foo", NULL, 1); + VERIFY_FAILS_END +} + void testEqualMemory(void) { const char *testString = "whatever"; From 083564b8370864c64812317d7822c06430946fd7 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Sun, 26 Mar 2017 17:54:28 -0400 Subject: [PATCH 082/157] Update docs to also understand the new Each Equal handlers --- ...tSuitableforPrintingandPossiblyFraming.pdf | Bin 146272 -> 144467 bytes docs/UnityAssertionsReference.pdf | Bin 320499 -> 181413 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf b/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf index 2bce0ab30f3d8324983e9adcb70741413c0da66e..28f0c32144c4f2b55ff07007555e5777480320ac 100644 GIT binary patch delta 71833 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

cb<}YfED>>6Ly_o4R>zP%)#xV*X%2xanVi(v` z$bMo~=DC>nuj=oa7u{Sq-G9^5+3V(8Y+4@e7kjJd+lKO~6R&^jV6HnB{XWivah1Xx zu1g**Vz1p^hpkpIwXWE!xH0H}kf^Gyk>w=IG?!I>daFg39{js%RaE*1uUV{d=YHOo z2?&%;)HZ7s^G-Q6>*KxOk6y1iPXXmxe1GBD>tDaD z?{C-mZkGGWbn8aO`;R5=7slu7|G0PjV%+_0eX%cI3WzSwpJ+4voA8tM653zY<~o_4 zKa^Z^>-VO9zRaCmGkNNMQJqi!roVT;|NIim`-f-Lzy15^ zc$jU8>yeGT({`_U5&$+xgZh#y3NPCq`XaxbXkhST#|P zxwrUdEo1FI!jh17G%WV&nK0#C8M`<9EH**`USC**79F%oJyh>EH}ul2yRo0ow8?1d z*QZ7|m(QNFtHL*EL7%Me9NsqWcg#^LudM31Szjw@vb~rg-?^qi@rk=a{pyL{rv3YU z9_n*`d9dQalLu=aG$o`af4KHw?m^ju$D7Zy#&cY2nkqT-;?Ijd-F-cNUFUk%b>;Qt z_1+WOt6WvT#nOuBP+G~1jiFOcx1TwFX6`fjGg33^lg|oXcUjY&(LG`J${SXBj#^)o zm7WTCZg#(QQ|!0mZ^PYFT-}!`{HvOpCAYFd;p#tTT}Q^l)tk>G*I$0T@;T!q>Dayd zbKX=n@Anch^;2A3 zJH8$7p3I+qe@1nEhU3>3Ny*;#cfKV&%&xrZynM~Au=4-GdU{tciiGYD)jE0q)ZNK% z{^(}xySFC)V)={TrM~JvSE-#0xxysg@RNUKv_spI3u^+{4mxt#A6~gENn@ImhJDB0 z($wza9|w*8Rh@P&zgbd#$@!?i##L*{nU7>O&%c`aP|4Z0_HOCj887O8??`xfNK&;w z=f19P_3y{7`}Xg7D}67*?3aA={QHV)COvZ6HODKma8mUOxh{#Al;t~0E`IWAd7HVQ zHKHqZ!K#?>x35$KPoCy3Y88Lv*RFi`;OZWqtfhsL`e#1ey;hrW&o=Pxj)E5H{Pf>@ zyZff}r7y3qn!bLW#Ol=>uG;qR@2XF5S}So*D1vP=+loKmwLC9<)z}+#f93wA+8Y87 zhIMYb<+JRJNUMeZ&KbMpZd6T4&3GhiB5i+VrAGM|yC;0l^F@s{R~yB;O?Z8A(JG%e zjq<&1lTCK_+@H5cCH!OXqC}~hXuWwZk8fOQ-Pb7L)Tt-pn;61vzTy5SS(dN!!Z&BI z*N0g=+~=iiev#2s@?v~K%FU=8>0Ikxr|Uddv${|H_$}G?%IB!j!)X_olG+} zYrLXzm{;v5+g!uoV3nQo;#}E^J*Jm#{!x1N$IP>~UCB8iE++rWT0Z1wPl%dvM%avL z_4Tt~S6n@vF|jisTvYjE=N|QKI&tEk%9k|WzjLJi^~D$6>)n`xIOc5j;PPnVI9kHv zJ6(SFsqY)#Pj=lGb)|3NE`jFrf317&K92QF+Bxy=gV^(V&vq@Hv%NXs}2-};K0Nbl$R%W%!_ zSJJUm4*gf-De?|hQlJ2INlcqj0 z6isWJb5eWP3W>*}uLDnA|H@lifAEXo!}k3ZV#nWEOxaP|+V;sw_j3L9ug&i*rl#&c zcw_(f2MY13`?}=rC+Bc%{=t{9?|b!o&WEN`ejl5Z()>X3`xhVCnMqvcsxwrIFElJj zbeuGWNB2O)rdF-Z2~RH0+&bZI{*vnMqg=XLt2ULUg$an)2W+TJn{-FV_-4wcNUN&& zo5y)O_dFBbe)*8^ssHP=PBukOW2*OFd1G^o&dsKfdRZ@bA33|9r=RC|*~BWbUc8?8 zFMFN+mT$6#C%Zy!PIX*9S!KU>sLJoU8nMS|Kff(#aSm|K{Qk+>?_O+Oz^o^-C+wcj z>@0fLza>~W$C6>q_bt|!($urX*BI{Z{2%sk%g_2&yS@G8LZ5oAr}J-#_%P?#ecn$k z_4}JkH_6WkI(6Ylh>@0%V`qr!Rxj%%e*cu_?T=lWk`$C$JI!;J>g+R{vYrV4*YB~} zF88g*;fM62=ZvS;|EqsDZC+!cWZ^>zal4sMtL{%JtGb_>{M_?H;mYt|5r3lBuDrBi z-+vbqL8ku;JO2NF+sSrLJ!d~GYdmehGEZoS*I%ug#0N$e4`myJ9a*eq@x-)M{D^vB^)D;BAdu^SyJ=4PQ9#wD~H{JLk#Da88?^&x`Go9vtbvr}d%W z760MGYm{^c@1|8kzoX4d7`_oXZ@zW!%>tl;mgB;Gk+vg?Cb>^eRtzbF)V ze%vJF!N#V#&c@l0^m#j@(oj*aIQ%~IuEEfuaC{dUf-RSWY%osYhn z6{_uSrGEXI6>I9^%?mee+>}`F`}ESpVreaLbKRBeV&3Y^dOT;-ssik71nT;4_a-pDGNpftnzzVVB7UOnsDy5bi`^ZH7# zXrDYIZvBFP*-`e982e)%-rKp#kjKo!i(!30 zJ9)H@^kuaksb9sC+x=qwpP64jnojGQyH@F5xKz*zkv*o8+g?7e+B)H2kaN)L&U>2w zUMoDWnkw;E^`}LzEnCXn439JWnf(IYZx~f&b-s8Q6_=PXbN##P2Z9Wv|6kQ+VfWq8 zw=T*tUiVtQfQe{ZYJApY&9)_4yxv?Mo93mh68R={!E^HlrsY5Cd4OVo<)PvAe9bR<7n`lH_cQJQUBUC_T>Dpw$X%FkwRHa65aCo~A0^G0D-WK2 z+vRgcV#CI6yJ}1As6WQGA2jM;Y=3-f-#@P8bF=KazntECa6yvPS-uv8tF3!!~H|t&SfA*Q1pY1<6=W=J$>3rU^vC1{Sre}UWdaGCI-Wsu8Key(@ z{$hQZZuw_++P|h1bu)|h?fCulBU9qnY?muPO?UmX{wI3wNkrwMnpT^seMOO*qUR}y zpL$%EdTr%JFAcB;ICzd#84@X?e5Rse?ALb69R2j+CBMylTrAZLfUG zvS}#?@91rA-)MN)WmVUuH_9RD@5Odih6MAMtJGH)bImbJ-}TdK8{>BI?D_hbYAJr>=Es$G+p}Pv`%_wSGm*S z%LKlO%AH=`eO`^Hnp8ucc+8uiGx1I$yUj!cGc@M~G|hd_*Qs+cZr-KB^Vj(g zOncn(NN+v&1o7vG-dsL(`NHEJTN_{7C#p-we*DRL`q)CB$#b4t*PB=xn_0kj3>cXi znp>a*@SDBm2_Z*+ng2U8XLGH2^|tLf`JQE$xfNM92{efa3J5Tc#Undul4+8Rd_Ga@MhiWW&U$+)qL14$uLj&#=h@IG|l6$UbXwn z*zm8YLGhHQ@Ugg^*|WS4sLQ!%&1_*^6`g6xV3=fAZ;<)w%xt?x-m5d@`4;S{Ikn|u z^2shei)oiM8IC;-K7P+6)-bTv_S*EM>hoKZm-_|e>--UT;JN4io|<2!!pr98+*{Ac zk+}DhYr=as`(Mxh-aoodcCoI#YWM?#58q1)E<}jszue_H@y7S#Nu9BB2iGv&7T(C% zcIo+TIpzoD>fcoB?Vg=qa_am)i!dclLHRF@uN{~~SWdLQi`d9C|1{&%^209I1d^{k z^mpOB{g5MQPK|T6hgl7Gwl_wIvTX@QNKwkZ~7aJ5=#wN_|;t{e+@7k|$1Y zkl6IG&-z2(-vVo%*6;-5HwP}xNZ_(*DBZlVjNgVsc_H_dN5RvbxFfwzpLD+A)_z^* z&3xNTgKs6@qT0W!u77srXjS%pw`J?Xj5yp2rFE1p9|`QvQM~QRYUkdcJh#iXx4C_S zn*+1U0+xBL`5tVXj^Q=4Ul!C)`P1^=Qr_%Q1l!};XAk|pF+)x9<-^7!`ak}$dq{I8 z*`F?W@_6EBqaAI0jV1;MB%h?P@FmAv)v&uAo>+a7djtOgyPH>iPJNvDbV(1>O^;cg z;+yz)mb2OwOBX#0&RF=g(`<)ub$r+P({3-9PLw_oU}U#c&_{23^87Vlb!z+Mb9U`*UgvmsFWWA~`SF(h*B07^FLtxPaq#?2kA^=jBL0*A>{;48{jG>gZMxB2 zeY^O6DRY5ki$gbkDmzqlWqr{OargDd%CrgsEMFZjQ)-V`B)WA?^&^uM)o%yaFIwt% zK)p^YD$}&SsQKm#p($^tt}x$S!1MScr=Q00TiS^-Ub&1n`3`gN?>!;9fx#?LH_NMB zf~nS1wC}I2%y)w+iJ~$7Mh0IQE`433cK%TI>=nmfALxI-vRPWOt9Fy1LHmFD?{~?+Py6>o^b5!Ag$5suz22zpc`Q}) zX>rEGp9Y<5p7EF3zbs_@Box;_$=&d3KU)T8*4M>b=0r2xKEb}?wsr^SytdFMZkO1X zT6dmth|F!9`@;0ug1<`-*E9J1=c+$&{e#FJPW=Py8@QI*uxFPa*dMs>_=dkhf%fG| zcg-e#>k6+vFMQ$hytn0jH`HHmTx?&Y?3H3XZI6TYNv9xhrYE_d%;qf22zjDV$?{U6 zQtG8`QA3U6I+ychlg=nPd#Ed^8ws_wZ~Pi~YkG~#KUWhKpAwCmo4G{TBS_XkGTj;CT)16Z{fZi)L_F zJoK0`-*1||(>t~Kk50^2exF#aeoFC@;P&PJ_5T#SIek=;Z+Xs^BGommM#OIC1{o+Su z_ZEGtQ#&?$VaS^4&T}QqC%J93>5Dr1>HndPo8*{OVoSO2lZ>A>mF z7qh*3kbdRc^p922a_;{Pr(b#SRVz+^^6`@kH{W^pfa$WxvGnCD_#N~PW?TH>-lwvE z;U0m^&SH^YzA}fCGq&zN@jFHR*Fp2Z;_VYTqS~hRsM+qkUH?$_SARf=uCZn0x`{y^s%^Kl!`IVT;qRJy(N zbXnD-HgUx&h6>e3Sw^zP^+s1tSqJ>;KGFQd^HM|9j0IP}?4Dfx!%!z;-xhz!{*e7a`?L9vwttTQVDGWb^WKC%8kU-&-m*d4xA;`;{37)- zBy(=bvM+ouV_q)4boJ8nrP52}J?y8-P5k$6*5hAy7k`~$qt}04_|ub0F5A?3^+o>X z{{H86&S#z9JWqU&(E5Yf-+t{;%JrD&01m0pDv{%VqV}X%=a=*PgQ2F0`0f-Zt;!98JsMx@EU# zzDuu~Ct0%W*O@EE+vi6Xq`jQ!vU-u}+R*z^7jA7Xb;vG#z2n-+wU?vU=f__8(?%Ndv9C(PQZRv{2BW*_UG)6?muDvasKDyD!h~4PTD(3ShKHs zsbQvWQO&RTqCYL!+p?#+zcsATk?TM4k;(r#U!Q%iOnkN6arSEWD)I7yn0A@%KVvle zuK!vmV)^c;bRYkl2R|M?SoPo*U*Gx@5rux+pZ|7_=BbGbTBZ!zVo^85bI ze$DS|SMvGcvw9c4`}Hq&I`h~6{czpCb}z$&*XcKE+jZiv*V?ibSH>UTr}xLIzF@=k zgR7dKvRljRSVmMByia)Mc;E53<73C72hW-9Wi84c>}I~dX*b`V(uCuU;rtJR`Sw&M zoNeS~U&Z&u;=*5t2MzBVzBioScllnHee(aq|9U@YW$RXke(QO|d9&!I(apz3F$YiG zo0>a$?Q~ns=+2ihkuK8|gS{SK3ce)vlK)bD{?hiP@!t0*?bEDv{(|5|5wO+q!{X8R z{?Qx-&WW}u`iu7TpHxqgH&I@9USXyRci(~XC&4b0+aGZM5aN4qD#gCWwZ3n%@DuSl z-Sw_4m6PVE{daTuYW+C`4N)6Y#`;<@FEMY(#pxp{m2?Bi#jzk4iJ=)Ggh9X!_x&KJMl@%0W{ zp7QqA+sF1E+Iwv8$-SrFE>qvpzr%m0{*LuK@^`%7A-_ZHoyB+Vzpekg{=52L3jSj9 z*Zgnqpr1SN<>j-+y20|C#pZ=0B)^SpW2YYrVv8j`~UVN9RBLfA;^e z|9sL5CtjPZbb~4SA@3*Ibqmau|Ly0FYp(2gvTwQd&)b5@_H4Qt?b#0;V@h?E?iR{b zF?>8A6k}^P@wNx|&zbYjUH`cG=j$K4f6ja{|J}p&&!2xVU)VqU`2Ex8-Tk*W>=!J& z;q=e$UtOKxqvoZ5k~;*ZeXKt%IMcT0$D6=^W_7IlC&eGN_uRj%{YBz0-oMlSHOno$ ze{u1b>T@S|?nqkK@>{%I=S?xWTVHCZ_ zY`5~=mqpck?CKRHxYAS7To>K6+*$dPwbk{g>Rd1D>7|?3jw%0xN{HnO=U+Ujo z-hO}SUwvtVf(uWZ+j;gT-T3fIP}%)zk6f^|*s-RrAHalD?|GKR&+l6AuRD0?_q+HlKN{Jm+idyr&|R+f&BxT! z^CLDEU7hT2ySM7B@p-%Ne{PlD;eH)|=fZ}Kg_rA}=|;zA-MY5t@6+(OyBj}my?+13 z*JsiB`#-;{eqX=g_hH-Whl~5|Z+?H7{@eclqtndn`+xnq;2KgRC>rl_R6Ot_3iHo@ zE3LkxNuqamO)J-Y9dm2tjujge?Dfsnt))($I>XW4#JK%!f0Uh?fen`Jn=hiz}Y z--TtFSG1No=}q>k=o9J)`&oUpO3G;~Z_SDOyUWc^|302{@J2CLmb6X8mDhjFc;`iJ zoca9EG{cW5 zOuRdjciG;!JqLqR=U%yd*&)j|ly`65jF9-y+rss`Z?6an`=za}v3c=^z?FxVa0T;< z{r}Q?1)@|e>PboW%B1vls@reLO ziIjLA%k#OsOepK@&Q4C*(j>2(b3uRg-apVuRQ~kcu{GmE&-Vu&ZNERx^@=oDDDvv~ z^d#dyp~8DsKlGY%;wo>~sasVGd!}ywEv@3nvhnNk3oEbxivCwwck)I^r-{ZKrfDfv zmlkG4+@F`%;UcwZ(~PbYT7kF-s}MY0@k67HnOUmR{YPsj+(I-MGtz)obNVD>v_$V`_TB zS@!>yrkeq#E7vs6`0xC+C8c)%!GCqlZam*Zu3leOaXbG+<<6AaO!ru=s|hP)&RJ$? z)w{~hiRkvST(#KnG*7ts2gg6^qEmmJQkyBWHAqKsUL3De?)#L8wO^|KpPoHSNc~1^ zQpvY%R}7?2DLsF_d(L$G{EAmqeC%i1GxjSgzj{6O`PHvZ{2}r8PrrW|8Xs-HP1CS? z&VA({ueTQ}>V??vU9~NCk#FZS*1onl?$sYv)h2GLf0Nre_s+Rv3tKm;^_)7A5gfH3 z!K^z}$}lfPB&_88)3QS)OL#r1Csar@KU@>S$)3lfJt5+y(#AT`?Xpr6%9P%^CaIo{ zxYPq7L^&pNeiz!l)$qYF_xyV)+#)jX^PZbIGIbX57jPfwuI=|bnjG{|sb{l6+?=lW zkHt*N>I<`XYa94KuxR5{>3Y9y&&NrOthbN2EH5(LxMpw4O*Ngu^6iRK@*NJTS*&_$ zvFfpe(3?`pY5IphrAF-Y(TQhsd2?#^%vV}dBkrv*UG8OYG4^C=akv9xnW2p+|KoKT zItA}v#GU3ny3V}gp;jJ8TlbNI9tl2y!;wjEbqsBNef;Z%FN-GaQkt5U_|9@+G|yI@ zCwkA>oYkiBJo?r3(P14|lLY?(n{NHbzd8!*-w7G+6FI$B;``yUs-E9Pdymw}pZR`d zhxxO}8qVvhH!inc|GVT&|3Ry+^T|(b3wdk{eQYOsu1OKRq_xC3>7)cty5d{MM@Oc$ zyzUHFjk~+^U4=W(@A{5JUmgp+ws6+CyF2nCE{onSJ8E!jYWMqyzO|=5dOkg|y6DYL znWMpdk2KjO!}}JtYq!}fk+|frBua(zoAA-!i!9b@*eRY$b!Pbe=~8RLksFh{?v^m_ zFetmo+N)Q-W_MFwTcgKTkINI&E}!ic+PiJH;O&juc6u;RIHqvcDXMczJ)r``B4m-lxB5Ei&Wi2Qn&0Qd zMP#x~OG(gUet+`7Hpz%84rir%2Vd2*E9pAjnz-t7=czZsQ!lsI{w&zCQzEQGQ@1Ve z+;tDpTWU}AH7}RFZ>f=QXqo!O?#Z*-6Wf2!XbVU?vNIxhV%A2EOy)@}6MvcM39mPZ zldSmp;nSn12f0-{I4-)1Kijjk6yDXPtJ-tm?h=r0-QJVYrEY1*Vm;pc*c?Y%_c8?JMLGsUBf$9>F=zR&ePIf%73Lq znBDpAdz|=tbw>7r?`DD$MteF{A}-3XJ9po1nDAoGZ<&=lcFnqLT%+v&ZuferGv*-? z+F$OL%&q?Vr+a~!sN1=JYbF*OTL`5eKKz%BKR@F2nmmn!&X&!)m4`ijVr2tm_5yjiYm3#4nOxUvUZzn#fCl4%|2}M$YGbe#%CkGrTC)Xn%D`hC(HCU z&V9Y7OnP_K>Z-giRkv@Kh~6%--GBDT=i5Faw|#uJKAe=h=lPb2vTW;b9MiV`v)pXm z|3$tZ^l#5Oe3sKz>HkCbZI1DuZXP>TA1z_D{%g3e!>Zhfg2O7=hu;*+oi|&dGJmN< z^@_4PKRk8htQU6HJez-E^TJE_FK^!XUblW-{*Knr?_a;);n*I+E4lCEv>Pq+dTWzw zSN}<_4$I$_l5_3XXF2oze+#8IAN%K;o*bDT`6hDun*ZIezOMNt^li=8H<7PzZr1CJ zRkHK0zfu+AZTV$|n})`**(_2>WipeR+51tvg4v_a44@hPje2q@(BRj#HNu zHm-W}?&jS{(J0B)Udh}WLZ*K0(~EOAuG9-vP1tzuKJ%K;@b5?JjnkG0{eQY&(m3sm zjBWB49-=e&5Un28oyz?p)h$a!++aL z%?}RTINE#or<728(3jjleJQnjbSEzOebJWJGw_o+%lf5B7A;@=j}@rCXXeyhLE{d5CMUW`%c488A|#e zwQru>KU;#`e`3)u$^S|<47x{-JO6oir0K|}BSjv~ljm%H+v`%7q;=0!q(19m)ec^F z1L?2>c|pFrFUfZPe6;fiXT&d|J^o57{I+&H*E@dg`+>z9c;i}aKUmhdb6lLnV>J8i z8_xx~;Wgol{F7pmq(Tm+8VIB%ubs@|S#H%NeQ@pbZ`=PW*I7I~w6FaDZ-MX~uI?lI zC2#P@A7DHbs4DB!UiA7PW9-q(Z}=7J&xa|f-*0tx@$2%C?3}ps32PPe`K@mc{hZ4# zT(n{PiNEX#lAlU=a~fhdh}#{qt9P7Nbfj&OyqDX=+b3m;>?=FgDC$oTKj|OhWdGda zo!>v*f6ITQbEZD}c;xes81^O2>=W}uQVTRs6`TL*ct72B(UPVbA7ztMf^m1n`o-1s zJnPSR?U{Llzm6mM_PUO&)eG!-4hP=nDL-6R!TtU&ul%9FALd1!%3h1y<0?Al$M~^L zetop|*5f6;vjXdumT=`R`MrZ<`)v7R`)_Qs%KinRin zObujtdpvWv?VkHuFxel_tZAFFqj1e$Py3qt?i>HtJ1-Hv>go4>f&K-Sr29wj?B3H` zZ&DXollAA~k7X`_i|k*CwNE(B=2|gzp&4&$)|=mYPo7=gAf~#RbL(^CA2TC5yPr(7 zd%|Tj=gK6{6sehhuTHFeV)o?K=M>|ces;?2C(ch<9+c%|=lY_eN<7xd{BrCUncDtlP>vHX+W6aVhmRng17N^$u@>k{?50cG*WGP`n9+n;6Qg5a{C#kIk3*EfyJoQ;tXcoe zSnB64{gard_|}_0;igE0Q{3V5JAA<}%07vlS}OAPqm|JFo#&q(@&&cudBHRJrSpTu zmsj$Cte&08G&AnTLHcjidv-G>=w95}mR?}@`7gKNsy30Pk1xwj^n~b!{`u$6Hyzx;Bl#|1H?U{zql)8-v!D|7`{5EI-Mf&Z+uC{gGEdwsfFchVrK4 zlb8Ik@LVPTKi%szqrj#~OS0MO4HE2+DKk7<%V4Inx!>BmkBQ-VKEu1k4Ey95>T={y zF`Sse(%`Ge{d$qVs^)j&hNkZfU4H*fMW?H*6#f>uOMJl^X$Ntc>YvX&UzO!g(mJNP z@_16isiKBe77qC=rL|#b4dtedcL(^{6CPmJ56l&5p5 zpZ>jlYP{MUz4!WCraHS;Mq4iaW3&F;YVIV5hW0T2?VC-H_5H2>G53xCr>sY7@38%= zE;w)?!XkLCYCxyz*#%c-*Dnp~OfZ!8xyv)@A6IK)XcU731J|}M-)D8QtT|%VZo7F| z{q2)Q3tcUm_}6G$e`#H=rgP%Fvgs0!_3uN1A`;9bQ-iXMUfoPgTX|oc@1nq3&3Ngs zN&W8%|IHue4l;Hh zw$0z-=9Ox(E1)oNxlnDPAa634d%of8vnAK!`@T(={OD4%*FX30#eLpY>*JiO_O~zI zx~k^m+MF#Df7tyJJjuu^a%|1|!^aCG{1(*nZ2R;i{)_342<_t2E8e7j($GlMDr_=s zI&6KZjHM|02xFyZmPLyC#iQS?oy_dri*DKJf4Ds*tE}cJ$EuTt|ID8pJLb0c&c!J| zbeCQAbX-?(M27h*v+N$H+dlKzO(VsEIkL8fRfH-oU*poGTBS5G;L|Fb(ql2p$|YvM zth;crvtGZ^MKS#LibCtX!X*g{<&RA<2wbi#?5J=^yToeA;mJ>&Q!-2Vq>H?FUbv<- zMe{wi{z6#{;ew1aX|j| zfjK{{#7bGZs31&_SNR;nkH3CcSgj{I-34#bBti}jj0dAr9*u? z>yMe(zluIn|Kj$UnzlW2J=x>EK6-rOvTOlW`}N#(@{)UAFiUJ$%>HBd=W{CBAK6Qn=v_Lgt+nQ6 z$|o^)tJ1|sT^0BHYfWCZWtU23SI|nHl-!a&(VsVV^&ePY>U>B4Ue(*E`q?21#Y(2F z-rigL==OyZ(vRkw^M5q@7GHn+;{4^lQWFfH&a}>2W3<%uM6~U%)4w)tG)_ClZ+CLb zhu$OGZ9Z`ZESbG*icp5vA1Q4e4UKD4S%0zoV$=3s&-_y7{hdoo|4e$+?tNXvK6uyJ z3pthdKkO^q{KF4rU6$>{xGY&IcwMNgQAvy*-w`gMdaD~T z^LhfVTyt^D`&9AeqFT}YWdYX@ne=RbvD@o!toN)AwPhxyPcL1zF8;RZPTCX)tG%C9 zr>-qt=(6f(y7A1pQ+Mn24x5qFPd^|tG%YmIfKvBf_;Pgo@VGaCB$s|chLNJ-rB;Ox!dlQdduz4z0n-# zxcpLN``tf3PVpbRSn3*m%=XjY6*i9g5nGMpX5GvGSf7xlx}@&Oi=$6n-CA8wys#=c zZtE=PR{leBv&fePejg6G8}gnrmV5QdYtFk8<4s>*gf0IZy7}6Ye5I|1wNbZLtMy;E zo>=7et=&IvJGb^7AaDUW-UrflDE ze6QmHF82A1ll3osV5`&W+oWUvK+rr|j1| z{FN!WK64)%vvt+1>p12!sG{o0(@QM_ONwW1@|bo+$@enLr@*f4Z7JnXEm{|M*2o&~ z-Yup2a2;3gSLw{~6GEG8A}b?nu4$K;i#Rl}IQY)5JbB$zzjw*aPunL46{TNVugqW^K|BNvyHo_kWm`7ciQAtrdqsH-F~i-_$X21`=oUS zr_(71o~A|~OEEWu)gOMR`s*o9yS2Xgfl`m9_kXY3 zQu?#4wS2$94&htZzjx;Ee6RZEh_}F}lY1ik|8Cy*{XzPV$g{UAmupV4)iG-H3d!7a zbz<6S-sw8vAf&UjaD zs=6=h%;)DO>id|2A8kKtRq5u|Ff}#x$1LIhEeVf~AKP&L^fU8X6=k*WGx$ zsHBQ}?(*^QOP;r)aT|_A(A{ z!POCIA>lLD+_-b(l+T(oM^2sC$^L6qy|s;TRh!@2cabiu=DM`!7#Ynqm^1kqPk4NB z#nn}ZulvYN4gL1=aQ_?a(^qUN|DI6~zgO_s>ooV~^!*#^uC4i6;`ng$R`30PieAo0 z@9whZmkQsX?*Dg3W2(JRwzStFEX<@mVAfiZSubAAh}`V4Imnqm zvqLR-`9%(^2v+%H_#O*_M7nH1&9`l937!!nt&IRzhH zBrJ;loZ&HD_LBMJyanEG?kouod$44`v06g(+P;RohIc#k7CtV$Q5KwcRU|u@E9=@q z0m(8iwc9RdPCnyU)?aV>sEIwjvr?$AX~y*A-ZQ&ppL15S|NFCanV$H^7nZF5SFfqq z&Xca>=Gk#B*5K%bD@Wd`iiZ@;ng2L1_xGN6o@}cg%Du^6v)qqww>@~R<8VOxs=)S3iae}OR@L9omfm#D z^y|*dBHEg=a)NewL>rQN~ytKD(f%55zudk=MJ~8Lk zXTNvuX;tMfmi!NAzFv8*`*qF7oR23K7uB-}3NkF8c}i8#Y0f7bf2rr^J+wcx%$=!N zY@t$a8T*r!HO42b=~l1(8Esi>vw8TA23b6Ew<^;Y?b0O4eM;>cNy;M zw6TA&Ebpqe*b#fVNh05;Ma#)g-d*!$0_)=$Co((jYm1iGGZsgk-K$>SclQeK-{V{# z_b>UNptMsX@c5qZ+Rs!K}r({H{hiF_hB-N`YwNQxtKtIO)I z87r^N6E1zYiHB{&+lDvwZ9UFR3Z50VI5ayn zDo%>4ty%Km83ldQ7rj+lU)eTKX_R?n__Np}K>DPj-Ck>T)?J04&U>wG6JVU9EzcdN zHl_c~8r7~KO+Bu~m(wQ|#wpEuuT+)N4kAd&tJWfwZ4i)jIZmx zCueHK%NZyCuAf)=e7$m&!OAQ9&3;`xy(^5r=bPhFnZ8daTq{L{YtPsnv-P#|KJ_vr zQ*iISm7kXG?*3bsZnb>EqWQO%l!k7w5W9LyYe{&(ms4)LRg(-X-nv@eswuZS+b<$+ zU3};!PxZw$9vV;1xP35I4a-}uvg8wcz0Sjb~W@mXf<$vQ}%P#JprKInC8p5o1GORTqCdbA_@%i@n`)Ay$S z5zxLV``+Ab&Ci*w$pK#4H|tATmWHtGKjL=Xt0Qb-A4gO0!_pmHwRX!F8${23er|E) z#6?Q!X1g{DJv;WrEZAjv@hzvo6Cy^LX(|#WZngg=tgYt|%;GrE78H16g;Si!8NN0J zEf;pTof?nJO$0tLb8_wzu(08?y0G!o#_&1ps(q(R-Nh4K_O^h0C{`c353h=x=ar z``x;I0_SG0H#xPxUX1ZnLfIn$`}TPLrz#@au`ep`I2X5aB{m%R8u*yN3`Bz3JRDM957+_W1X;5cM}zF zJH&`(n=9N@jm%qqpi=hf!bx`mPKF*my62#@&trkQ7}?Jfy==2YpVW)4TU}JNDYm6y zZ?wgdsk@(sxx`b*6{~6=HZjS6rb!l z@NM5O(-myrvpIOA4EO97Vrh9X>4;~CT3w6JlAa^|(M)OcZ|3K*AH4eF9K*uCzFht% z0VUB@+qx&*I-MDRMa5je;Iy(&{o5;f36q}W@z0OmoqT4`-S7M}{(nC7UHsIUOdmHZ z?um6Jug|<~_Ts21ei?gs(jq1Poo|{ZnjDkY)sx(@qwwG3uP#CMy7yOX-5pnYTj$)u zV6{8(#fOvS=YC6>;HQzKy-~s>P15U&)RtA58KG03e4P>Xf633IcYL48?yM17waR2- zy@=D+YL_RP7M;eAO08_;mfJ=th&k$=Jgal&tgc3h+v(~JN{-PF*DVm8c&e*QZtA&D zDt)1z%9;|hSvG1Fr*R#2Yf7@e#WP8eGbM$E`JBh}q_7aq9m_gIrcM(Rx7_`sR!@QD zy6M6UlSiC4n-_YhbVi=uT@t9YK(~aoE2i;OME$Pa8L3a(ymqbl6rj2`XVLBCKCQi{ zUtit%DWgYk*&T*m(}Q$notFpp?ep30?Efu2DTn`i3U8DivwX&}iA9Br`y+EKomVNT zB`(xs4b%&ny8q1I+GqB6OB3Z6u?tKO-f8hwW6LqFVxH!hIUR9c#tCfAPcEJKy}Wnw zl-2KUM11^Lzw(LGj_UH;>Wg;w$%~xb*TH!EzAL}e=HlT)biCmFR!c zf&Zp%`M1UWoh^HX*WWLV+}}>}cPo5W6#I1doY89?W7qfH+pJ`MK5Nz77{sD+lxM+) zm;8;pnHf(tipXiERkXB)@Uhh!ZsA(A;jzy%qZhgROwH$i-uW_v_nglQ#prW$>;IW( zKYYF5(jQqSk9~YUr#$P}eQE0()_axiH7noWif@ZKHbuqmSChC>!qM+HJKqO;9p1Pp zf3AD%7V$5-cR8yc3V*8n<$msR!K^uDTFnAwZLte4d0%Q@YXAJ!vs>)HPuM;0e=?&! z*!Yg?l|>VHwIz>~Djzv(lCia_Iry#E-7bcGjdrh2^ZcwiIN|bKZ7Z=*$3#y@$HGqI za8<$2pPb_Krho98dU(p4GhSQ5woi>R?hRXg@w*|!v?Moj%vxc*tccY)uYUXKsqc6Mr@fy&@14e57t7!ij>ScX zRTtignd)^`+9|72BPQxq$<8@*y<#3pyit7jVaA6oAKE_jZBUWnP8VxU{*{zl5m=G` zqu>Y2G}DXuNovby_b8SK-gMSbtf{i{*X;LhnVp>0-2S+CPj*9M|HBCncQl&cu-ZTG zQ1@R+osGBaTf|ncE6)2A?<<>@tu)bUb-@+Ach@!rvBkMuQDQpriK{K^h);J!+pNRW z-s}jQuYTNgH_P>Rg0JuI-n#3*@%;$(TUSag=3f)E|M~e|!ER^eC;8j^|CYGs{t-=_ z`C{|E2^37wd=`pWX9FE1oDPh4X3uw}aB*%KWua~)On z%_fQ#8A+ahSduOBdB>&=5j`1a7{yQj-qY&0{`%7rHkm0eI<@a6y5uVH8MrtdT%aw& zv4D9`>gvN1PN)5kr}%h=c-5;;w7wk6(inJ#QJ|N#d+SBUi-s37FS=fI4$QnV&)IVN zy@Ru)za;Zq=IQ29=h<`3foI#BP1#lqp|a7b94AGSSoR*fxMZ=8zol2<^7t5?vU$^m z51!OordpKj#%lQLlA(aiBfYq-JJx>QU$&}#o`$Rz&s`O7KW>X)9L z8)B2(HpYi9q*Zhb0t7gV-cXqKByj9T;nX>wHi&O2wooBSpFA^+W zCvb)R?9OX?A>THYwO?3~Z(=e_>WuZ8vt~c5-gY07`WxJ~+;{a^={4E8pAy>~pGm#; zN?e)PS-JD8;p{!90#a8Qecu|FCB0BqF=pNL^r+KYRNMTPox65=OKq#x-Wb);Q?fzr zHo?+nExsM~p1Cd4rMF1QrHHlM-nC$oH}|Go8U7~+wI&?sJ+|P?wv%y{-KIMa-Z}Oy zUm&SF+U!j-?}RUyh;nVlL7jBmf0)9ulI{)97(IeN1*}AkrLau~q z0oSWk*DLQAt0|{_vAI)S^Y8b^@17rjf3BZr|K)kO**wKfrtAOsRNIRGPZM3Kmg(Z% zw!W+W_n*8=+W+1ilz;sD=KuN&?T6I9s3>2Y{6kUN@5q`xbIVV}JTSBP@@~Q68-Y)6 zhy|v-JnY*!Kl#wtZ`E&1bk0xG->6@DxhzG*Q*rTrH>aOF#Qc;NuIOm~^MLEs*2XRd zUY0c+?MBVFN+#ufNJru)p<)%sN` zpCT?6OP)_zdv4-u_2==i9#a$b9&t!3AA2M48-5i~)7hBf8S$iV7a-U79`ju~MQ%~7c zHmLfWJv+@kb5of6mBh-lvb5)qdb-wZdb81Am0HZD?_k$LjTpRO&d7hQ14lJe|s_vOF#=#Ii|rjIV47p-12 z=|%6+gA>+rM^ywLPgmJe^swZ%;I<{}PNZsQEqr@I@OF7vkBiELvijfaHuEj`+ta*b zr+S@0*Vj+eZ*LK`4Bz!dbRrK=(F|ve!o+|hO+t&ES7;gIDxsS>bMUdnYbDQ(@E4BqDwI(zeeJ(%>+`Sjk@ z=}T6B6LsRH^(A4azoqvt)?I9S{JY$X4QcNM<{qE4db`9Ht<}fF z7F~O(61F&S#&pkLa>?Ih>-GM5{|WgMS@o1P>|B|2ysP&4Hoqq)b07G=>56^!v8-D{ z_gbEE_xe-&?dDH*J@x7Lv;GbI=jXqiDY3M?3e7 z`afFb`tN-&TE6@Bg8AL@JFgeLuekSBt~Vp*w($N&rY-d^1-Z_D=7>F4#j;&p`_a^2 zn-%eFh1#fn~L*w^8$!L!V{ zqa|SOwliMwQ~G{1ryRLaAD6Kpe`@~v_bvV34gajJzj~BqlJ*>d6$#pJt)KqMXEZH! z&+5Cv@#x*m0;{cm@&xw_E_|H2Zt2oLfApFEubr*gTF3kA%0J)5(Qh;T=D3`je@7-z zeD+-nc~h~B-yKU>WH>)oxh*=*~J|J1JP`EGmPcW>?Qj;TlQPW!JlkA35wD4UcA zQ!Xj?E8V-(#&M+M-YRvOj?_}!Jy#4DY*_Ze?Q_g$o8L9Z51s4(8u0Domsfr>y=?CP z-6=OesxQhfGKKHkB(`i$>xIFxovCGSleTB6x+%=P#P#VGV#y=D6MPA$K7Kc4sbY|*IX(QE{ z+g7R1>ij+DGmCqafP|X=yR94FzUbmA6lOiTTA2TpO225w48xuB)8`-GrzXrM?(w^G zMRD0FA2;#T`K&?i3_0Txex~ok`Xe_1Drr@?QE_&ENSZ?D&M8-N(dY;$B=^YJK?YV)6a< z_Whx<#mQG!xQF??G`yI)>38+_dBx{f=g4m0c)KfR&ffR^shOg$lD1jC^)8>j;XHeY zUcF}8?~81+cd~@PHQO&IE+umI#5I>?xuPtxzr9O+j@dX>A{MA+r)Du{%8LF;jeXPUuKP&qjMk))zSMZ) zT>0Y19bYnj^}oCSQuC$e@%(qja;;sTf*u9zd~Pw#b7@s}(b7C2pDQ65#xvKLEw|Iw z-|2Bm?dHr0bLX<3)0u0uQ+?*j3mH?mmg`+U|7m&)SFMlroSBs`X8u`t#wXijJ0)2wd1nC5Mh-~{)e9hAI(LBS;w`N@_ zyi+W0@!vhVnuq&(N8ZvYDw2IN?{6H)kKf$oF6z~#AF;h4_kT^EZp;|-mOp|I_Uu1=LX+(_K_RCWz zW@;`}eOBYGf9v#}yFtEgv)ZHIZM8|SoW3vl-=(B09lv*3B`$DiNm{HR(c{;9@d@wd zpzs62GvpQs2rw}-TQgTPPdf0Zr`|zf&ciQh4N+QVff=HCtXH+lH25_8w1qUL9~EkK z(kfh~y65=0SrT)T=NyU5DYklRw)}V+Yu2`kS&!$`5lgi7eI7joy$4><(veW9u=!C)AX;+>hFGD)|S6)V}POG1#@#R zn`Pl23f&%jxM*{-Z{{7hO_x1-6dj!$j2t$3Y^rxZ=3kSqFX$SJ(Mh?6@w2^RJYX1%LWOn?FKxecy`hzBzAJ;cwF$!NylF8M*lCwVJA9dHRl79)!%x=yz(mH6Vxpn1zE(}&e&WSfG0`8admkvV zx;b%aEYeb3!mG)vSbIYHQ_CA$r>P4U1r)CEu3Mq-By*AZ(My6;HJ_GMiqCTG7oWH& zAT`xBGqd&n{K>-WQXG8ZFUHm@wQx*aaaCw}aITp(r}ni>)t!^LLRK3JbsmWe75J3= za@vPbzZ#*{;d~C0XFq!~XWP8no*p(j30_s6(f=o36MMLX*ZG-t?%)21uWze6&D09R zG^gD(xEvTUxrtH9B*W4?;n(pn4n4&*?G*w^({gxvBt@J2->(w5WRk{nCHntF~=AKKrQ6z4MQbecpZHk^h%-N%pOs@kwna-mQMC zz1Lsx^wAOU5zTq7kaj?6y{NW!q(a2jV=4b7#1sAq9ouE%@?lA`uTtHFogWM?va+g1 z6de3M!(Q~l@e_-lM12nzJJ-9u)80P(%>0yk`M+GAwSVFQkMB>GvYqus#nx@}mB6rP z3lHDAW#uQoSL*#lpXD=`z7XI4{zp)-^E^BE=f@YH^LLu7uW)*MqyERgYTdgJU7zy9 zE-Yt5XwFx`*7(4L&$qeOeT$D(kXrvfStpZ>O)g(e zNXxbA+n>sMWc|s99riMOKjuc(&F|;1lPxfFZM;80zKg|aqK?1D>33IOA6?(dvGdQu zM%E<@I^W%B^0QqcY#@5M%6WnOg7_nSp(69T*?w)GlX6>9y*@iCD8ajAdee{G6?^u` z?w|Mgx!>I9U;nWPKY9MRWq-crD%C3wcO7kuGwg^f6pknj`<6O$?z)!!QM3M>-?e24 z^Rt_G;*W`oZn*PZN5bcn$HS+xRlyFe73cZ(R?d7@vchXdP2oH9mH%?9RlexG;FJ`X-V(O$)?TxA z?vqXL^#1r9?)@e$v$?nU4Zqa%Th~v9NrvB!KXX^9+A?=>;pW=eum5hD{8LSJ<3yc9 zw(F`-_~oBnc|LO5X0zPbbF+WWe^x(T|NH^d=iP?Y2G^x|e(l-Ev-fhsNu7^Q^`2@E zxvq9)cnVv}NISke%aFQoda&l6oZrb+Q@Yd20#_UNoMv4gd`!#a!N-c^7tUMaCcR$! zf$u}#$8}%wKD_%N_vzH$Z$YOQ*{q*()qnE3Deor8P5KlRy?o8v^s5~%zqZTn)v5ep z__KH8-;UBeUvB3ak51m{yBd%l`<#1<;!^gU`m#HWMlIJ|JB0&!QoQHfSu*|kiQwaW z1${oUp$18p-#$2`)^@}%thsxYRDR*BCpytaOV9ak|NqhNlW@FO=#B{y(`_7XcS`@e zbkF^o+`ag+_YF5UAJ6@w!P0G%`{z@mw)Ar2sg;{g+t$X-s<_#E-S@8Dzh}qgXP2E0 zTU(HSHFR$M)UdsNE4QZG8t%)TzoW0#OP%LM(a)um+jn<%PWRVx>SlYX)v**6hCoP+}IfsuO-?XEI!EafB z<=&_#HdAkH{^RWM)==^$W7yilSsy1%G`?lze!qU5#SDSIE&27CVIfnDb6U)LgRf1z zGIPTJFYN(;rLJfu9%=Iln_v?f_h3?ww$ZvX75BEQeGt02tm@`g(>>mw_SMMO2h_QI zS{#%9?6YU%lGUpw@dSJ=jCE}D%1SX^rF}AVlIE({FV~)mjy2!?eD|!o>wj!xIcxEF zPDTi)q;IFZ`K~i3?S)qvsTZDj?El`U4Tw0eD*(#HK~oL+u$K7FQ1 zIC_uQ)M>e^=J&Z8e%$sl;Y0U_#P5mk{SV3?-qfI(^X}zK`9J@&eoK8=)~9`Orgr_y zSO5QeZPU5AYtoAYEyzg&2Rgr`o#NE&gab+{(48vQoU)`@b}!zYE^HuC2#lDZZiFT zXXo>IGcBK=nQ2^nK4z`XYti3cW>a&G^NWvqy{j*foU>!eye-_)Z_O>XP3M_f8@AvP zcZ`_3h&>e?N>dq z{jYsq{K9OfS-tIhzT~|(jyo3}p!vfq@I<@U%AHrDtIAg{y0Y~{$h0{Nw{NsquuoQ7 z-{bbS2k+O&{H<5c6=aG$?agoD&OE!j+wSF2cDw42jbB^7JW4v?FV(zcVcbWVV*wX! zcANG;mf!#UW%_-aJO58bwI7`&Ui;u^_%i*VzuNWd4XQRw|C68ZIPdqYmGytWG3V<< zD?f=8*SqN_s=vpH_l9^LYo2{i{&d#5`VWVniXIk~>8tNQC=%gXA8MMz@g=+Kli}${ z>rNK${`~omtJU)Q#%=!WcOSf9lK&vRtNF!uPS+y~#IO8V^u}g=*qlS(*9AodL_V6` zwDV?R)$@z3qQNguypc7kFF48TeATMp1Q@b?JslMpD}E zqrpp(<-KW8UxjZ}@-C_u}OjpRWACvUA#^ z`s};cE6sPCS3Z6x_>$~hW>|J$BjQlP9EBrM5ZpMAu6LKVb-e$25r8A0aTld*) zy_9}c`kHtPpP&_=?F$QA@pGTM6{W0HF6<}>vfy3jp}C_*v_EC#i&OoP0e_CCU*2sL z!BEmS(ejZzo{uc8Yv0=6~I7bGhm# zdRNZupRq5rQoCS%kI98a1$ToIV;NTUGKLh)m8t@xax4$;qcjG(WlBy z?nK&MEvWx_udTlQG{5N_4WmM-D>v$v9f_LiwfJlCl8nUIeHkZ(7up10+-Eg^Mf3~h z-(FV@Y9DI)i;HxHTzRQ;%lVf27Ou@=)3fBR&%3s23v2JyeJc;#ZFFu_XF4^x@p9vL z=I6|(8nhz>PbO+y&gjWuT*@}}-;T#RWxxAMVk%$DxSo6TzIe-S9c#; zw{;z3_^GeqdRy;i>3i@nd=F z9OcPDD}`iNvuf?&T7TbGS|xSoonuT4R(8KD{0<15?29gCk$U?%X<^E?g7W*DX2*5U zt^ZkMH+xe2Z%w!O6>IYM+t&VF>VN5;`gf72h%cu8PN%;$_U1f!SJ^e?yiM_y%r_dx zSL7T#(D(4FS?%$#-{0TdS*fsAK+9{@Y3(L%spxKNFR|(6EZaG6GyPJu=Djid%^j!2 z(x10g^V#jSeri-~e3BHfc|}TKLG;IM$J$%lnQIE`lNB6Pu3k<5a;^E?6T?SKl3y$|@FW)l9RXZ!2@xZ?0*|EOP?` z_fJf032P^AtgGL0L{udD$x8_{ngn;d zru?$_J74gd#7moJZOiuimiyJ))}N03Jtr*bxkJS-^UKo4!rN57Ok2KiJI96SPoD7> zH{N?#{hQ6)v+|)^_tEuFO;$;3{t(_)bG&Z#)%pHgq+WbobTuh5*D^COB4*v2edpr% z3%=UbUH!M$e0zC)(_U-anDb^#)!UfMuN;)PeE8!-v*OJ=k6y`&OUX0VH)}r|`)p}c zee}wOCkxKhE(wZso2_yE^~><@)j_YOxL;ke?z>K?{?{+7LbuL(c681Az1utVUS-B_ z$tc{t|7PN`HA)xVuHUH3tG-`$Z<&f&w=R$HUpa7-NLDrOS%~2NqvwBCcm1i$pSXX? z%CJ*88%zp#ZB2Q3x0?Q2HqRiO*FU4C2i?Ye9&xwGeIEoa!ULAUq>i|T2|RWD6BqP2heyNG{3+j;8sTHMKzY+vW&$FF)omS^OvbI$h>%_Ngjx{Z4(L8VL{=j1f=ZnqOH+ZI2wr-w$sUh@M(fsOl z=T6PI%=o|Zw@3Q^^{P8xc>7-8aM$Vk+N>3Fuihj+c(rTQsiUzvzw4dF{vLI3t;56`oz9-*?JC*}1-||5EatLyzx1d&&`76f^Od+Rtxk z?bi=lR^3Q8*uQp98?Wrt+1c9K_1Rf}pI!<`Qc}x$HPKx-v-hx*myT-8$+XIair;=F6Dg+PRu;QWa4^0y14 z)?K?=<*SmtAzixrQdjv;CW)W+_N)GOWvT73)#{BpoNaM$G1J`I-Mw$)pHKP5LE$-nvaZ+f|FhdN>cGUk2A4CKbuUb|*`;$Q zsaR{S)4br1LbaatZNHbklE0GvwLLQ(tS0UK=^X22yf0sR|vyOS=uzTX>g-04Nk{Cpw)~j)9_KSRrMKl?mbb6Y`elBl z>{Vpe`@at^Ead;-EnlDZ%Vz7mBjNAo{QtfG=hf=(|G)lz|1e9q{!H?Q_D6C5Ru#C< zJ$EOH?f$V0XB;s%$2*Q8*AFCH+}hq_fy;?_r5(kM{()pc;$YzD-m(Ye3mwf0U^P?{_C~B zU##^q{n+O9BWQl4vnea@)FUeOVl%mys_UI{3a|avBwD=t(&MOArED4LukbYDnBEYI+w*W0YSX1Dcj%WkXw`TK3wvzhH*?}?}C-+60s z(3Z_F+hWbsx!HG8zC=`fZ3@k4pIE=}p2~*!r=cr*ulTV{b`6gaQsSua&0D^;Re~Mda|U;q;h%{xhT9gH?O}oUQ+}CU^6WnNGL7561BwG27+F!Qc%cez~-ge=v?)J8K89SA~EGTffP;2~U$@JZEn>W}5 zM2W}U5z{$gKKlxvvo`0o>ugi5`ld~GT&T>oT6;^y#`CXUUy@zkd%Rvm$xd(4_cq(5 zzIO7QE32bxS9crOcm{@C2;OcdpjH0kP=@*31jWPBkDqS2vvrI2+6UgHc7LZoy{iAs zVA7`JHsUXwdQ#80XfIUxo#s3>YID=nCwrUCUbbrJp7qXIwERfir0efKOq#I!s`qSH zj~wp@S8h&xuUh%@ZMV4Swu2AC1nRT0Kblo`UdT-46X9DPq-1ZF(i|7{=eUzo!1JFU z&)84gGqc~r+{fouYns6t_rK@N&c8XuTrHzwdmx8#^=ejkBNc~BO=cGNA2k?z?7H}( zj5{H1H|vZIRTKCM*e2GsIQKSqPP@ojJzu&ZRL!3ML~&Yc0%uJa$F(=FBTjjBdq1rg zSQEYEC+E7pZEN=aT^G7=-mUev_hfH=y2Y*k=9)#14#(-K;uZq`-z|K7-EaSf=ex|m z*)EHS;8;~v9@u#KYS^_)yEbghZ9JZHp8w9KoZt6d|2C~$@FMU+y!+Pe+a5oA7iwyn zRInpA#r)Ol?FoN)AI9-~3fl2w(QK)^ta$>n!QfWufA?X^uy&K#s z=h%seX=$5AZM^c`=3|7-qVzk(mlih}KD={LtK{y-+=5&S|9ungRdq$DEqVH^^7qS` zVl%n!Snb{C@LILrYWqR&3(S-5$6Ro~9D7IWOzaEovo74GCzKe}``_-Hl{fRo#oslX z6Sh2&KKlR0#`lI|dL{B)&KLXl{{Eyt?Ynu0TMhs0{HNE|cSxN{soprTKXAkL+aiCL zbnmv@b3gm*EsN;x(&nkfi`gH2z3<|lTNrOs5PaSLrN8d_n{l7_N>$Wv{de=h=GZje zGv@mrhsS6hXk<0*2nt~4E)!Uqz^>=w{A_~ilFjWoit!#iqE}j9IUilsy4ihFa{|JZ^^xC7gQ2>_?9**A}_moaXV0 zb^7kRP1}~q^>WMPe%i=gvv;u=YR)28c zEn%bkw?X{(%^>v>dCq4ET;+>-v`?tDwQextX1{;cQsuDC#|zP^5x)D}`A=~4K44a^JSU)vlX6s@lw#AWcl}SdsQX_n?NuExPaDH7Np$Mu=VV*e8 zM=3n}G$p-NVhg4*NL=Q4a$KT~!&14R-qhi)j{T?q9xK&?jVG>Y)>ckYYM$J(=V`%| zQ>&HNehBwom7;N?$ogTQpvAh@>TOQ4L2uS=bS zS}>>O&)hdQGgqeCPPxRi(nE}4s>Bsl#_&lWWSO#_u356yA(Q3SGzIgRr|<4uTC(Yy zL-oh$KE>;P{^^;1Vx^;nd}_#cXSr$L=Re=Xu`}Yl#1-A6uNq6QrO$~^l|=#bqh)=%3$HPG>;tE70K zzxk=9yobNe<hU>7%lIqn9M9}KDwjFVbZ#o+JzXl(VthuvVUOUoeTv8SUex}i zt+$=qQta#^BhAZuf-0LgeOuu7WpkX?)m`z^&dl)n=_RCwY) znSZt$XQtimQjFA3Gkn~j9XXNnSm6@;Ihp+->vP_^Rkz+!_!$2x^zo*;C0k3@@zvG` zcBg$!w#@!rb5gN=;y=C<{YJN5UgO!YIOX=SXD1X4+wX6lvaz->?L2$x>YbBs9yqCE z{b9L>y|4eP$v48wPhFbvHaWBE^HYsN?<~izn+;b)e-}n2O|;x2_iJ;O_35WSRe22f zlJ)z~t)6&A?#cpJNv^#K|E(3bcRlF1$+Wn{xTk)S(vs4Gw*6D2TJm)r<=0JLGr=(X zVV3M~*A&h?HQoJ*WR(9s?N9Hr1bd!H|+Z?T0 zmk_3O^o;}4p6MFW%eSYk$yZ5Ey;Pz$vu{btZHw&g%Q5kO(-@9#Sby%Tnp$dB=IPF9 z2|>@4y;e+qT7NX<-ZuuFO514T)YRz>^8%+_t#){4&FquCDDv^<6DyXzmP;;@PMnhT zM7xOlcw{!)jCZ_gTlY`;ddGzS^0b&wtZFmgdHqc(bMZB*Uv9rz%sJ)SY>)4|3oG9^ z|DJtjqw9+5N$00*V+em#F{dzf&eF{`o(881p9y1(I)CTvIA3npk z#L}1}g1I1km-v~eL$BpGuBZQK@C4Peqr#6rx~PbD_jf*4 zX16L)D}f2pA0b(lod%%e&k>>vFm}Mo#8a5`k<4q zLRVkce;;}8>dv~KuRkn+Gwq^xXooRFHQ9hUu*uVXV=%m8<))RDi%uA zD6$chXD`~lfotZYM(2-fJ5T)hpl4{r=E|h4HYspp{q!B$c8%qHN6I&y^6BAaGM~T~ zl4sKCqV&ikN5P8i#l*Fp86_rG(^iR@AIhyiJaKNI;k|y-cI#lvsgB2d-Gl-SrI?dA z3k{}q@GWsG>vZn?@gisMqkyoQ>?sRym}DK5on?Yd$sUr5EFR zqctb)@D#Y*k(8X-@ulBk>*SLeTEE|AZ7k1GndP(T*yb>Y*(s4r9u;I4*;olkck!Od z-^mdpQ}2EB*tSj8%FWG&BAF>JJ_f9-kGx@dtUG1;tmu^!Z)EUDv$PuQIa!fZZKRrc zRNzBX>M?akSG8a6NhcF^*fTue$o0MvTKG?4)yLQqJ0kg>iXHi}u_j|%;lz!xkNP?@ zCW#sg$TR0kPmZ22;q}=GlMjFFoah*EcJ9U(Dwi97o^`jWpO9k0HrHd4#G}+(99Nr| zf+jXzS<|yIQE=xq=Ww;ttLE%XR4`Ke=6<z1xE zi-=x*_1n6JGq-l_N)Wj8tSxQh&XpUtZoIle+HdJG@vB#S{QScDm$BLl$j6Gc&*JOS zUbOOxhsi}*-(%Yr{c;PaPZdZvVpQ_#@af+8>h$zAYeX)mB?(;!uoM;)5L%J?JVA+V z>s!x;mp8l0Jmt?16np!~F;|sr!+*`85^1}OuSBGnL>bSzW2CS#S;s1} zH~im`-D-=KCrJN&y!}CB?-~`J*=v#(f7Xz0Jw9VTkDZ|Dp^iT1&TD*pXv_igWs;Obyp*_!&S`~UZbB@SuT-){XmdNplwD!3j{%}6+ zaki+?zHdf{cK(RceYE-0=k$+1S3i1P!eehgdtcnbwCi7|3!XcA{k3GB!R&o;nvdh1 zEX408B>cFZ`dE6(rNgd=Ra=Tb_PVv%RspYpMHy1==k<})S!>E8TmzG92e-)@fQ zk7l3cv3K9+Hq~!Yz2L)`n(o$z&re*}c|2QRX-;?kR-->MKWByhTK(vD4oI0=+#&PY zz5=~{cl&&FDxB(p*<&!24h zWuM!Jm#ey`oZb06P-H3R@sp?PXH=h;zL68;GpqQsrqLZgu?a_uKTT)UnZPA%6UYyz$eR z7BV0*wNsF0K zx80R3@(ynlUA2xGr5wC}eO{x>E2ayQ_p|RO%7lF_Uc0-qRlaOO`izL%nW>2~d0|Yu z4{W{cs50Z#lPv=KQt!`DD0%kT#_z)QU9wG!5_JBQtbUx5zRhyQLneR6A9(H9AB4J)#sjxzRb*haogId(eIa4zP8~%dOfFs^GV006OIQn zq&T--4CmlFR~fRYX}OXv^MzOUfAz&o5Bp~#c6DR;XJ-A0ejbaQy1sc7x|OKhQdDKq zv=x+{uxZW;rCZ8NpPVkAk#1SJ|5?QmHA(gL3xXH1Xr6lcf}^{sYn|hN&uK~f)Q%^) zI~~0&H8W5rzDG0L=Tu3jPqo^TGa2Wfw5ojR-lV*B@;bXWUOKUX^8ea@cNflIwkPs6 zTjzFm^%v>aGk3%r7)!kWbY8y3XT$R8mn9gjxBE6R=1EMS*ubb!Z)9YGas^TB1V{fP z3IeU~|8!ZtlQX+8>&4Q{MX#5(hbDhz510`qWIaLC_RD?l8&{4ntMq^0cQX0O*6MdB zTqoqe@$DCMbDviDQCqr&QQdvfs)JU-<)L}TuN6|7e&=>tl$%stG-3E;yVLs#uV4Q) z{tB^AQ*}4hFXr@{f8Fk79q&Ww^d%f#TXZ92E-#tQr(fkZfpvF@*-yQ^=|}#k+HGqH z5Rd)4&G6nMp)HQrOcrKL2@2)z-L<~5J9}k^e5TaA6zFwUsd*{+NmqF`uYgc3S?BVvn#%>`=TufL#d6EQ99zOhf55R-}SLLSf4&d2%H z_VLbBD?7Gx=A`=jng&prFLr$M-7hUiTB+e?kU>8r$Vvqz4+&oXCpTYocH@T zx3B#@e|)#M`}w2y;^OKo_s`tgbmYVLmrtVp=ss90B;RswzOtds-o051QfltStgqiD zBh&qG_s>T~HH~k73&`%P<^1^Y_We)K-T&FtX|Iu(_oln7@ba21dwyNoXPJ3iSML0= z8{03L@5_rj|M2LCl8ZIFEPvnGa$G&B;zrDT)6FLnTF#H#-W~lhr{3uQ6`OSVb?fwId3zjqbT95&iB)}ZNrlb6 zTNTkY4}|rWg}<#i$Z(2pU4KKa&LO_wlaZ#8!zGT0#6Le_lbdq)I)4jb$uO&If|lr*YI3SU3}6znlC1YL za;fR$#fEOHdVKfkoikMqJ{YYU>searvQF?^I@?yO z=S}L4)_W<}U?zES#f!YqNj3t)#jegP)m~0hz3e{af5WB;Gmompdo4T8KbI?TQj`z3_D%5e|^o&Og#$pDiROegGZT2?0{%?swl+nG#Qm>sOGan|^I8#$&6VD-Z~VKX=B&+P_^GvM z{=^i{>2Ck^lT{d06;JJ0Sfgtyeq?=#uye1^TcGkcj}!B zw;Fc*tmKy8(%WBZ^V^zNJ9ojF=ZeBU&sNrXZTzsJ+>Tg7#>&FD`cnh7V$hfpYi`s-y`)~C)WMDeZT(C^ZvzGe{O&N|Nq(7?;rdBd+uNVr}E!J`TD;f zZ`-%cudn~RUjAV^PiWmYjpy?JKEAjA_o;dR^ZQFAF8|J#JHfn3Y z<^HLw{`k92{iGbrBAq0#;7Bg0K5H^bsh!mF(|bT526XT_{6naHA3cKh38e4TX8KCb0@ z$zhw&y=~*9MO_P|Ha>aqw#@6L#{-vKIrSi^2dlQ!>g;v?v19QSwud*%Jo-afCMm1t z?$O_`q4h3VB4PjW-zr5t^>G{b^m?6i$$F5LpEzCSY<0oI4%_}$UWzONueD5bR-gYR z?QS2Hy))&#wDGye85Yj(%%55GMW}3h7?jvv)bv2*y>u~~`iF_O)%Rz3TN(K!zq)7s zOsZdIv6XD-dhbVp&SwoPgywGSw++qNwfk2X--+yy=Yem{&V3aOlIvRi%BKEVU?0=G zw%RrJ8LJ9=TK1opd+*I-k!kvV)2f|ONv!X)-_K6dat?fG!?h!7b@?`Lwos^^=~>gkHDy?>WvMy~bji*e^) z=ellY^3#~I-jx=C3&YvZ?GGuBHI)sGx_^H0y|-GKS<9YyDORw)ot;#i>;CrPfk*9| zYTCGNED67vJL{f%&X>Rs(XGByM7&P8OE32NaBdq*#uBtBCc$#MkGq z9O7K@w#og!+E*EwXP;I27w0_rS?GJkdj5P#8}aOa8=fw@v`dMJeb3EJ0h#xkr!i(( zJelg1Z545Rak7`vqE@eJ(GBvpsb0sd7RzzJkd2DSxISm2RZhxr$;@}=d@r00G?vcJ zui3ow&W4{2^XBfbV+gEQm6Yyx`cnS&VYt+GC-uINtUKR6iNED_c`+~Q0pE_~qfGj) zMq5w0PBop!HYszVZ_d7gu*WqI!Xhq<9Clk;SeJL9Q@8KII_^4^nzI5a(x-pOzx8N4 zRpGzY;r;iEv(?vg2HkC#QhxLLr&$VDFU(O+_dh1I#o$3`&!dysO>d^>_tal))IJmO zOIq=&Xx+sR`vrsUDwl2Axu^YkRM7jy6|2urxEkPeyF7ZmHv78(f%@%@b^UxTLfUHx((mb|AXuUl>rRWRO^o6_b zb9ClK9+S`$6=42aa$m*$v8)I0gq~$a^?Rll7$?il;`*I&eW|TWMJa1k)%9mmqNyGw z%rYq~C$`4aRJb6(8BOU2Ctldf|TP!M51nQuanCCZ3w` zm&f(3IOF!RPSahRxbBy^)w`7(_qyS};QxbLeM}{@4HIu&6Ro=#^5HtypX-_NW|8-*K3+`?*v<)AGbOA&XW@)v!4)Ew47IQReBd_!P>V6VkGaIe>hjx8kbw9bC&bPRYQe@ z-+8YkxowVEWXYJPzYy#{7`$I_p}s?<-hQqr&(+!GGGvYwo-w%On(An|K>0&f-1LNl z>r-<4&)s&?Ey*{~=baH_rp0`>P$D|NHhM4b%HXeuczSc!{EAhOwHDDdskv46Uvxs< zkEzdem=CbNxnFOwy3wTMFXN2hNfpV0yS&e@Tr$;b_2eTCu1BX_l+`};bAlD~Pww+3 zq9S%GRR$Gbb;LDI8+KYHeSgA~)ciOw$zxuOz^=zTTIbp9^x&y-c-r&uq^nlLR@n(( z{q)3M@EvEKw*L2@RYgx!-gcLU?otnEx7*+H&U5|QsWJ|?nA0@+>wSxQsxL9j(wSN| z+bYEJ&Xcg%I>AFzCam6J%y%Hld+8$i3y;i`B^L<4s918tY@HN?n55UK#r*xNKR-%- zqWCWF`ILtT4jU|LuSwX<;vQTPrr7^ddDw*7L+(?;aoG>WxY}Bcv_EFK71Y! z$ZS5NyH|_Nm-Sxp&a>8;m2u(qZ6>qSg?Bct7J8tVmz?>XMIdtDvZm~eJ} zUM(@2U>~NH+_Au~>O~?;`I=7G#*QOTZ$7XUXZu`fR?wky)z@Z~`hicqr!)*Sy6PGD zdFuE(_6%uH?G?h{Bom_^T7)Y@A#J5Jota;@y#-i>XV$W zmPl$9x5sAQ^VYjKUYQGw;fw3x!jFT>rfw-z0qpx;-< zz5i9lcKOQciu@EQ92kk3FVeJ-6bz>-4QtLyp9X$A&TPk=Ijis9jj(#dABt z{D!!edVg>ItJBPu%9s6{eitZI{|{yV^w;>y{P*Y|2K!ei_v#h zyxEw`;Im;usr2fa-#4~Z8JsbW?KuB_zs}crgw6GH{Z$s}~Ew?zi_}iTrzmj`wQ;cIi z?76+zz`^j*w_Y{jo|~q7=hW-{Q{Ml=;gHT3xjlE!1+G}Kd&isw%$lJ~O#Q8c)p^x3?kg6@Pre+O zpyK`6B5+fHd-zS2TX%w{6nRWnIw`x_Kzh&eyL>a(9OXJIvaz@PTiL=Swd@%)FL6&j z$>+m<e2V=V)zwV|Tn$zg2I&P1feuDo|9 zskWzGTJPMJe0!JQIOl6bnp?%w3(t(*zea}5^yU1qG+@@X)&hl@wX0U} z>|Z6*)Oxi3%{uP}^{Q!aikl?2rRf~5&iIsn=EkSHJyB`}R&RQqxve!eHr7(f+H7;& zaNn{dz0QS3mebFuc19+Bs5l=J@Iy}Z?e7(9Rv1iQ!W6aB=wQr+3)%0ir7l%Yn(&)v zx_itMKJ(`i3?*FaUzI+Utn)a|m+W*tpH}<4J%7*1)khwk-gi6Rebei++kQ80o>LbpcKmtz zJJqYMsZL48FXXFkuJoyRd+O1S6>(mVq7@A-tb?RCN3XkIFDtbB@6}!|i47uqUhZA- z&M8S}^O}RQtBo5BjJTEcv}!L~J13>-NH4BulW7xpW<5{$xY%)Lm!exg);nu*9#8H# z^5m^hvDOOpW5@J`rzLLSUQr~{FU(WM`6lg7`1)q^RI#$NE(cR%pH1p&D@|ciNq4(f zxp~RX9rsUIzn4nZm>2SS64$HFXXm9?J8nGXap|t?tBHO&c?V^=Cj~dQPxYBmlF=Zw z;O?G}r|UH~Fsd(}+q#E)D&JBTHRmj?*};YjA|6k8boPWxdQQOWcX^M0$XgzaEjcgX zoWz{9HTU%<%`*@7E;VZ0%%-_!t6BedRpW&Qq+Alse@afd4x~T@w$^&cnpKE!+TW@4A`SQB^_0NMoJqwTe z%XRs&+oQ8TTuY}<6}aW0xjUKhGh^%ditnyVjRRMHXw95e`*`L_uY|J!b0)q?Kldrf zsK-M1{=Dn1XRdGP+w*?XPR+(sCdrX!j-PsNvG`G%zWJH<{c}3=Pe=R`Yn(ob;pwK2 zr&laHv-sFHHo5&lo&irQuhqL+&Y7{3d+U~5`CQ$zKE87TKc>3nCN=OZ^iB)8GgI&w z^Bu0(JNYdi6PjBl+|AF~Q^>P7y}Ugty{u^ZqjlVB%MKTPpZoomK(EPr)#c@1ZIoA^ zdsyl5=~&WVZ{ydSJWG0Ko~ylXZPux0c)4=Q+||33lzcOmuITxg&~t0ey({+**MDY^ z$l5(`!&Kc52Tw`tK4*BJqu|o58C(CHjyP7q@p_-hR5Q5`^=~7#{bP+g(~)~Ue%tDU zJ7!*7_Lg(uRUhAyv=%*GtyI-Q$gy6IY&D>&?7{Ns4RUnooAFZhE!b zU3YagmbSLN(w-cXv^VkO>^*ijZ%8U-yuTIST>ppp>ijub&zw^aDNJ;_4@3xC`Hd)d$bKk4V=-4kx5rg6&e zS){C)kd|nBKVqei{9KQ@vMsYtEnf9zt76ZR*pO*6f3C1S!>4vS!piPwbZeNJMBECW z@T_<_M=blpm=`kl`t92hQ3+iP7r)HZ-yV?pu(_G#t7LYGWgvV0vqR^qySG%x zA3bMqJAzC2jLJqOp(B6YZtRFm35lsYD^Y*C@V;X6mPc#0XZ?F6+3cPE^04dFt$SOV zk36sqJh9p5%q8|ezuy#@ZcGnr4HKT;wKb2q?zx&}`OEk-uLA1l7*z1YylvIpx993* z#`bkD&psBH{SbHj%=4%psWJr?(K^?9-@Tfd%e2aHkFiPYYqk?Q?;;#NZJoRG)ai(0 zjPfo~Uhj0@39ga*p;Q%g!e$cVoeACMVsq0@w#ur%F|S)$QoP1|cH{h3&%*2Nhs@G6 zH0v(UoO2~-#>W*YOE-$uF0D866^sZLbjptp=v8L=^r`6YBBS=nOMkzS4%xnO%cQ7If zIk8RrPS@>SIg8oiY_3Ok>_KTRB;5LUP+s>>I4R|?0 zM(t~EawcoY%{T68T&p%$dH9_b`n=D1nN#=6##yJ9J#?Ho)vRlOzrjk`e{Q!{^knly z#7itGecF9BPS7fB(&_aVXKo4c{#0@PM2hO}`far)eJs&DQd+ay!WZsOb5}@@EpcSr z{`~I|%xXI9YxFhepvtV~;C)Te#1U|d@w5G4{mTZDnh;lK>D)eG+CZ1dIFdS>;P=e0VW z32)Za#I7iLC6mpf}x{9He6_Idpkhc117^L|&r-$g4WLR%x>y?e!OeD9%RY5vzU zW!}1)7ZN{hQfQg_rs&|}BZsoYSgm~CJA9jIn0#}N1;djwPZsCusD3+iI^TP#@j)Zw zUr7O{o~Ws>d%R`qqoPFyi~FygvX%{+c~M+a|MQQ~nHQ)3dKWOGZc+b3HduP7wAYVi+`@3cHQ_|hyWiFcbGd1%_-zu|Byk#{85=^@n*0cHUFQ=uCJI>tJN;K$xwaDnAv72Dr%+k{l zR^Qk!1jK__w;r-&WYo@S`{$e*<9TfUy>s>dOsAC<&Sdyh_HBM7>jeScsc-k)TR-7| zad>u;YJlW#^LwFJzZ+GD>W8Q$W)?o4fBmRN=%mXbaml>CN9|l%6yDh#N|jF2+1&p| zm~V1$>@{PKTTe}Pi%;G6F8$7exi8DlsT<`b9NWbDRmX11|bu9J3lZ|&db`6-Kc z$4u6b+mn~~UgF5&2OoAto{3PK#~Aq5sr=a7iElsL``DB2XCkHN;rf|RO4{bxjp|Ij z{cQS?nI3ma85>+UgSym(B^gwLt3&;t8d%)kzpSgscv@~vy}yNkN=W|poBvr?tZ02! zICZVGePI9byXR&;JKK}0w^aF@z=x>MDNU|*$~-r}2QJ@WlsDml(fh8Kr+b#&$}_uS zzQSVZ_A7a(Q`DZ$-*40y7`JVoP=vnLWy2P)msi`~EHctE<=a*|%k$&u2&+3b+Xe2q z-dWM}_eewzm(@1OtyOyUd)`ac{&$<*+nU^a)Ia;%!mj_HZ2ujdYkL2tN?F~WrFCbl zX7Bf!|6=PupE)pf=gWaPg3e&6=>8(U}h*Zud2Db&c{oABx7jTy>w4z_onn)8O^tDAY{Vxw@w!nSPd z_h05pE}SEL`%g~Dvt6B@=N*lDZ*J0CtIE||Kf9Fw+^!qk<+uFjuaZx7yAtbXpfA*C zboPqTG%;PJ0HdwD<|N$UI@LK-h)?~O#j^UTw^mG=H}R+S#D$xBPwi1{X+GFA^Ud0B z-Y_Sb#_4S5|0LPB&pWioqbknUT8DAjIXj=zyG%+>e)>3h?$zm^IIru4{F2+ZY0-{z z6BZgP@0m33+2knhsjMx$tL^o3#IzVv9X_Jq__qvvE3!FLc*v2zQ-YLncS0pya&XW7``PEF7f8X|qt(u*8W3GQo zP6*pP#(&Af_ce>%|+DQmqH`Bm?NV?*SUqOO5BvD`_YR_GmhQjp~6b2@@AsmNlZf?B&UH&}XE z>nTT{^RJ@>FB|U-<#gTjc(i7Bg zMm?83`jQ1|(+H|LN3wdhu_P zT7H`RvD!7#7LGGEtiLDb5a2eZU8?_PX*kt9@d zgpZM1dur|LMV}|WR5BEWG9|_Fa1S zhK5z`z46;x)%7#IeWj;zGO;XMIz_4e>hed-XHuU<>drB675$u7WTp{y%*ebo+0OZ9 ztltusNZ-Yw{oiZ2`b;%kzMcQ=G2?R79M#72)-E%YD|=?;TYOCYRln+C+Ub8Mztlfi zRPUDhb$Ph+N|R&S><<@h@^ZGjTdSwF+T_&o-RF&_1xl?^wksBxwz21u#{8z{?o-o* zzSJ+?7x?FM&zn2nPU%IYT{*sPiT}ZaM$=9@a?Jl{ac)=EzZ7wuJ^Qo&=N>bPSt?rd z^;YBxA9EEmCy&pqD^tHdn_DqWec7(!t8dEEr*X{P)_ZD->Vf~sTp>l4hH1$!Z%#~) z+#4u0RWxbVt7Ssj_nP}b3Jm@~eq;YWK=oPul2?WGbz(wOLL#1T513h|Ik!LO%DYpa zd2|jaO02UvFVezj8)J4ZJMUusrjTXL2FzIr&Dvi#Yb?CBV}9@M>c zuH#o=-j5wTn-jimPSn2l`*~26q__50!`)u1H|7M3KI=JEbM@2Dl=F*P^qdPr129C^>U+mDhnd!nOfho z+th6EnDOG&>R;NSC)zrPs81@BD``}u=q_KTfP z_3`fiRHj)=n>?8uv9D+88N=B>>zG#b`%EqPCggoKdHM#SDv_JMO?-P8KiymNT0C~r zgd0J(Y8Gq8c$m*I(EL{O>)M%&V_L#$8Ct>j3=$9d9I3yTQ{h!0oRGKJTQ$`zC~w{C zj{377)?az@X}?aI7tZMuFnLyBFXqLfelj7cp8KKyI%p18jFv~9Hdtd+6+ zdt>*qP5HnVr?>al9lela&hu3{-|lSnXb`M4J(SzeD?Y>8{FTI}z{uxw`VY_TEx28L zoB!LAEy*)G;(lyN&FDX?m-Ni}=m&c9(s5hf2<0RsCE#`d`T1?Z>A{Z0>m=%2!ZUeP;W@G>Zd~;{&_vE;-g|W! zcdL9&bIYAP>C0|O-|0;^b;AR1ZgAZH+s*b`ko$)kx$9O;?W>#5-umTJP!YB=TlS#w z`%25%Zz7%*nK65OyS6ifN8Xrtme}`BA%mWp3eoJumgqo1lWY zjh6RMsIPt#vFw%u-@e1MVs-1yUvvCO%lMSi)ca`{&&}@_S!_F`GOXHm>n&(2=Xeyk zFD;$XIkjxX<{t$ziFHx_x44m@Q=j>vA}(T-KJp8M=H68G8t z&=Ia-%XrqzQ@$poPwtXWaMiTVn~?|lmc|}AvyLy_cJJrjoG(9DEjJH)xYP9hzWM|C z50`(r8_uC#T32&6FSETQ@TL>XhTqa5Z`0Q7c53aVU=zh1P-_W7abPg_#I{yNr`Z}Ld^ zMXvSg_N)r?;-Vd=_AIzQw|}#qg~-Fuz+G!z*FT$h`OmJ;g=sC$it+2Sr<{+y^0`O2 zXz#oJX&ZgqBLDCC{b7%D&gGQjn{?;@dLH+B=J!3(mFX{S-Ye^;JY7>#s&?k*<=>|y zwNAGl(%1SNr*$}^O6T^*xEViXy3SYGrA+>nV>Q#9~MpRZ#mb0C(R_>V9T#$yG3t5bQenfkPNz;pHlmLb^O)O=6*5X zUWI=>6Z&Y=$5-KB|Mcc0=&Y{`Jst6E(X!fIQMT{P{GMLE`YLi?1nVrN{D&`IUZtdz#UG?ZzKJOQu|~3lBR#=YewH zd+pV&rygwjv2#<^GjXw!D>I&N_Bg$(y~###(;V@I$Bj5d|GmqowCnny^S$-_mDbOiRqevL z+qwf7julK5H!aiY?OYh{o+fVW|BidU>fFDkG3!1>UJ7&bn78JWp!=z3b(hX8b($kM zM{nKMN6LMLX`a>hBhu3n{vERWBzRoW_2%*2?lRfd!UyMnpBQesnfr_0#a-V;*Jsu5 zb2QC6W|X@&;jXio=f%rDp^s`7Yp6~at|^$Z{wDAA?}u6#ji=o^eypX@`0ve|3(w7N z(DIr+LtXTzM8`5C>mw>JjX!-q!>-Vch2hLc3k(Oz%2hlhD2L!>*8$u>JL0W)y|(-!h}<$JQ+~s_wnsdUVR> zUrUc(+5Ap4(X&VHw8=Xmvv=~Flb>!b`FKq|N~?H&@Vm4tzd0)THe0w8-Be>^ z?&?~eHT&X}u==>jNvC_3v0t95x-(#A82j7FH(#vbX8Qh7%|1je@9^o#5$SR#HvQVY zO5b?e(pQ@$kBaPge)nBXqr`)%#h31xGrSYzy&Ai}YWFYe`u}&mDra7N64bZ2#&_$M z)Vg~Mx9Wa2-XGBrd0*V6f70P~-`}iXaA9v+c+0@H!uKc|E?c~Fp zJ3bu_SSj!{`R|Duk2^VU7C9_ne{S!rE!1$%pXJ(}tLJ{DYSd4Eb@c|@qNjmp^EORb z^Cp<_u=9hWl9e-LwR!#*@gR%*_aEZ-J^Ao0uO#zd-r*y1f-mme&plSp(emf+xw&roF7?}gz6g=c zaeEqQxO3aoDSz)i+k5Br$%6i_d#;-CbE4FaFfna;^J(9P3kyz&?-H0So4V!UYyD-r zyd({G?9pF;?fAaXgqhD)FwE3@FDc#GkozxBd|A-psrBE>cQfdTX2{fUKR@s0*5A9& zehD$l{#-7tFgtba!TY((=3V;#xx89!DwE}}-LW%o@UT93Z}vs{vg_*ow~b>(+|S;B zd+H3o#gu<};oA&*OMmP>D|7z9xn#Td>3!+`2cO!uH0}-E=U{M%-B9@aEN|2GDa!Yo zzO4`{)||{U{ri{4?DaM7^7SWcUTxx$H|CUGrgrdtZq*Cbt@;}}H!Nv?oBT)eA=k#~ z+xOr8vZ|W@>it~HXr&Wx^XfZWXC`g`^QP&-57vL5m)rld`TwDR|38i8yxBRq2lxN{ zE?-~yH&*}K`v`Ns-lBh^(VtiBm(pKk^XPZ`W7BE>R=+JbU;O`d|NlRZtLww-&E~xO z_4&QM)Pc*t>;Jy}yZ?dCpSQl-|NV6RDsTVqdj0R8^#&rHC+B|t|9_dI!2h@J&Hwy( zD}VU>{(sl`?aFvBK4&-j_$4N2hH_1;Z`HpY`lUBnSo>b2r_@bW?17|d^36RLzn!a! zwfv}mD|zNl`#rNGR{Cg5+tr($775q7tiNiHJo}d&rFe-(l@^^?d#X(oow*`A$QSw#vi}94B7r?2JhIfRwefI_s_HDeads69$4)&V@$nyqsH&;FLy-~a6yg_^U zzAehF2XfxmyexGScAHpka6a0$I6(NXyube(%N4a>9(k5z?Kx8!rVV`7;5o%zq}Ek#FmyfrG0yixNo`QW|(!ppzp%U^n1UvvJ7tS(a*ll`^%-|Lqw z`qA~wXu^AaU+WJuIzC-K6lLCa zF;&h#@vKdL>#r*=E*gK@P8m!+C~bXh`RDW5^}qe?US09uw`%j}7LVU&*>2eTmh({-b~2JS%BAR(;vPw)tDgQTFwp6J}4ZpBJVT z9n8)>Sz7*l?D0#t&x)_)nQAHfvh3?Fr3q)bqu(mMdsUbvz57?r{fxZu%Ci%Sd~ci2 zI^Lj_|5W<)%y6w*8cQl54oZyfvgJ^-R<4 z>))2Fywa*$JMa6k$IqAK>Gg*3O)|Ic6qEhp<=y>xOGIPAQOC?_X$n&d%)53=SRWS3 z&%1u};f)t{NvWI@_WXYJ<_*{E$#d5II4~)^Ui+e!?SW^T^K7?w8{W5ARCXXTwDHKj z@~U@dyv>zVE^fb+`j6q_}LlWc*%RoUCp4fo+;uk{VvZvD&;cg3r#HYKh;zvS25>7S@^f= z&$So+Xr9vL^1C-{PrB8bl}A5bYw~$$tN6V-B5C8b=OXs%Y$A&SrQZKfR}+p&{LAoX z>O{`%5uX@K>@mXZbk<=50oU)pxO6YOez=`?KtgDGlXz`_x%>l<#~}fyox;Ta{q{1> z^~5iIc-Ud)G)c1Ww`wlR7->YB4vii%^_vdoo@7yo>nO8XDc=9!qm_sk} zt0d37Hel?(urY9mx7O<#3{kV8z#KZMoD=QW}>g;+tts$+gv?YD_`=~o>zGffW ze)MnKSuNi0&&@Y;uKVzp!Q>A X14BbMYbh6K>(OK{CiUrdCQPCLG-(^= diff --git a/docs/UnityAssertionsReference.pdf b/docs/UnityAssertionsReference.pdf index d8b10cc8f964cb5f689906b19b80485b1fc9a1b8..e4f99cddef2bce7f4e4aa7ced1f80a82b360effd 100644 GIT binary patch delta 105797 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 delta 246495 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

d}|>p!l{9ZRZg8YeV)w+M6T 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 MgehzKgdOV From 4ffafce309afca95ab98863851a801e49ce838df Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Sun, 26 Mar 2017 17:58:46 -0400 Subject: [PATCH 083/157] Finish updating documentation to match --- README.md | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 11759c8..17ab574 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Unity Test API ============== [![Unity Build Status](https://api.travis-ci.org/ThrowTheSwitch/Unity.png?branch=master)](https://travis-ci.org/ThrowTheSwitch/Unity) -__Copyright (c) 2007 - 2014 Unity Project by Mike Karlesky, Mark VanderVoord, and Greg Williams__ +__Copyright (c) 2007 - 2017 Unity Project by Mike Karlesky, Mark VanderVoord, and Greg Williams__ Running Tests ------------- @@ -109,14 +109,6 @@ Compares two integers for equality and display errors as hexadecimal. Like the you can specify the size... here the size will also effect how many nibbles are shown (for example, `HEX16` will show 4 nibbles). - _ARRAY - -You can append `_ARRAY` to any of these macros to make an array comparison of that type. Here you will -need to care a bit more about the actual size of the value being checked. You will also specify an -additional argument which is the number of elements to compare. For example: - - TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, elements) - TEST_ASSERT_EQUAL(expected, actual) Another way of calling TEST_ASSERT_EQUAL_INT @@ -126,6 +118,23 @@ Another way of calling TEST_ASSERT_EQUAL_INT Asserts that the actual value is within plus or minus delta of the expected value. This also comes in size specific variants. +Arrays +------ + + _ARRAY + +You can append `_ARRAY` to any of these macros to make an array comparison of that type. Here you will +need to care a bit more about the actual size of the value being checked. You will also specify an +additional argument which is the number of elements to compare. For example: + + TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, elements) + + _EACH_EQUAL + +Another array comparison option is to check that EVERY element of an array is equal to a single expected +value. You do this by specifying the EACH_EQUAL macro. For example: + + TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, elements) Numerical Assertions: Bitwise ----------------------------- From d6b350874ba9d6eb1558df5e883ee985aca02387 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Sun, 26 Mar 2017 18:25:25 -0400 Subject: [PATCH 084/157] Clean up some const issues, particularly when moving between single and double pointers --- src/unity.c | 24 ++++++++++++------------ test/targets/clang_strict.yml | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/unity.c b/src/unity.c index f7cae0a..05f463d 100644 --- a/src/unity.c +++ b/src/unity.c @@ -1025,8 +1025,8 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, { UNITY_UINT32 i = 0; UNITY_UINT32 j = 0; - const char* exp; - const char* act; + const char* exp = NULL; + const char* act = NULL; RETURN_IF_FAIL_OR_IGNORE; @@ -1036,7 +1036,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, UnityPrintPointlessAndBail(); } - if ((const char**)expected == actual) + if ((const void*)expected == (const void*)actual) { return; /* Both are NULL or same pointer */ } @@ -1056,7 +1056,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, act = actual[j]; if (flags == UNITY_ARRAY_TO_ARRAY) { - exp = ((const char**)expected)[j]; + exp = ((const char* const*)expected)[j]; } /* if both pointers not null compare the strings */ @@ -1175,20 +1175,20 @@ UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) switch(size) { case 1: - UnityQuickCompare.i8 = num; + UnityQuickCompare.i8 = (UNITY_INT8)num; return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); case 2: - UnityQuickCompare.i16 = num; + UnityQuickCompare.i16 = (UNITY_INT16)num; return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); #ifdef UNITY_SUPPORT_64 case 8: - UnityQuickCompare.i64 = num; + UnityQuickCompare.i64 = (UNITY_INT64)num; return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); #endif default: //4 bytes - UnityQuickCompare.i32 = num; + UnityQuickCompare.i32 = (UNITY_INT32)num; return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); } } @@ -1405,9 +1405,9 @@ int UnityParseOptions(int argc, char** argv) int IsStringInBiggerString(const char* longstring, const char* shortstring) { - char* lptr = (char*)longstring; - char* sptr = (char*)shortstring; - char* lnext = lptr; + const char* lptr = longstring; + const char* sptr = shortstring; + const char* lnext = lptr; if (*sptr == '*') return 1; @@ -1439,7 +1439,7 @@ int IsStringInBiggerString(const char* longstring, const char* shortstring) /* Otherwise we start in the long pointer 1 character further and try again */ lptr = lnext; - sptr = (char*)shortstring; + sptr = shortstring; } return 0; } diff --git a/test/targets/clang_strict.yml b/test/targets/clang_strict.yml index e5b41ab..ee05b2a 100644 --- a/test/targets/clang_strict.yml +++ b/test/targets/clang_strict.yml @@ -36,7 +36,7 @@ compiler: - '-Wbad-function-cast' - '-fms-extensions' - '-fno-omit-frame-pointer' - - '-ffloat-store' + #- '-ffloat-store' - '-fno-common' - '-fstrict-aliasing' - '-std=gnu99' From ee038c248cb1a764dd5376b01ed0065c2a4c66c0 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Sun, 26 Mar 2017 18:30:22 -0400 Subject: [PATCH 085/157] Ha! Forgot to add the correct comment style --- src/unity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unity.c b/src/unity.c index 05f463d..177af0f 100644 --- a/src/unity.c +++ b/src/unity.c @@ -1187,7 +1187,7 @@ UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) UnityQuickCompare.i64 = (UNITY_INT64)num; return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); #endif - default: //4 bytes + default: /* 4 bytes */ UnityQuickCompare.i32 = (UNITY_INT32)num; return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); } From 550d58ba2d482659492524a2faf977b5bbbff7a9 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Sun, 26 Mar 2017 19:46:42 -0400 Subject: [PATCH 086/157] Attempt to fix remaining issues with casting --- src/unity_internals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unity_internals.h b/src/unity_internals.h index b213ee9..cc20ea4 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -695,7 +695,7 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) From 3062c39725e9078604eaf74fa36eeadc9c05fc17 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 28 Mar 2017 08:44:32 -0400 Subject: [PATCH 087/157] =?UTF-8?q?Starting=20to=20enforce=20our=20coding?= =?UTF-8?q?=20style.=20The=20first=20step=20is=20that=20we=E2=80=99ve=20pu?= =?UTF-8?q?lled=20in=20Rubocop=20to=20check=20out=20Ruby=20syntax.=20There?= =?UTF-8?q?=20is=20likely=20a=20bit=20of=20customization=20to=20do=20yet?= =?UTF-8?q?=20AND=20there=20is=20definitely=20that=20backlog=20of=20todo?= =?UTF-8?q?=E2=80=99s=20that=20we=20just=20told=20it=20to=20ignore.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 4 +- auto/colour_prompt.rb | 126 +++--- auto/colour_reporter.rb | 38 +- auto/generate_module.rb | 267 ++++++------- auto/generate_test_runner.rb | 371 +++++++++-------- auto/parseOutput.rb | 380 +++++++++--------- auto/stylize_as_junit.rb | 182 ++++----- auto/test_file_filter.rb | 13 +- auto/type_sanitizer.rb | 4 +- auto/unity_test_summary.rb | 67 ++-- examples/example_3/rakefile.rb | 28 +- examples/example_3/rakefile_helper.rb | 143 +++---- extras/fixture/rakefile.rb | 24 +- extras/fixture/rakefile_helper.rb | 127 +++--- test/.rubocop.yml | 6 + test/.rubocop_todo.yml | 510 ++++++++++++++++++++++++ test/rakefile | 24 +- test/tests/test_generate_test_runner.rb | 10 +- 18 files changed, 1414 insertions(+), 910 deletions(-) create mode 100644 test/.rubocop.yml create mode 100644 test/.rubocop_todo.yml diff --git a/.travis.yml b/.travis.yml index edf25ee..8ae9fa0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,9 @@ 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 +install: + - gem install rspec + - gem install rubocop script: - cd test && rake ci - make -s diff --git a/auto/colour_prompt.rb b/auto/colour_prompt.rb index 8adab6e..a5c72ed 100644 --- a/auto/colour_prompt.rb +++ b/auto/colour_prompt.rb @@ -4,63 +4,63 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -if RUBY_PLATFORM =~/(win|w)32$/ - begin - require 'Win32API' - rescue LoadError - puts "ERROR! \"Win32API\" library not found" - puts "\"Win32API\" is required for colour on a windows machine" - puts " try => \"gem install Win32API\" on the command line" - puts - end - # puts +if RUBY_PLATFORM =~ /(win|w)32$/ + begin + require 'Win32API' + rescue LoadError + puts 'ERROR! "Win32API" library not found' + puts '"Win32API" is required for colour on a windows machine' + puts ' try => "gem install Win32API" on the command line' + puts + end + # puts # puts 'Windows Environment Detected...' - # puts 'Win32API Library Found.' - # puts + # puts 'Win32API Library Found.' + # puts end class ColourCommandLine def initialize - if RUBY_PLATFORM =~/(win|w)32$/ - get_std_handle = Win32API.new("kernel32", "GetStdHandle", ['L'], 'L') + if RUBY_PLATFORM =~ /(win|w)32$/ + get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') @set_console_txt_attrb = - Win32API.new("kernel32","SetConsoleTextAttribute",['L','N'], 'I') + Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') @hout = get_std_handle.call(-11) end end def change_to(new_colour) - if RUBY_PLATFORM =~/(win|w)32$/ - @set_console_txt_attrb.call(@hout,self.win32_colour(new_colour)) + if RUBY_PLATFORM =~ /(win|w)32$/ + @set_console_txt_attrb.call(@hout, win32_colour(new_colour)) else - "\033[30;#{posix_colour(new_colour)};22m" - end + "\033[30;#{posix_colour(new_colour)};22m" + end end def win32_colour(colour) case colour - when :black then 0 - when :dark_blue then 1 - when :dark_green then 2 - when :dark_cyan then 3 - when :dark_red then 4 - when :dark_purple then 5 - when :dark_yellow, :narrative then 6 - when :default_white, :default, :dark_white then 7 - when :silver then 8 - when :blue then 9 - when :green, :success then 10 - when :cyan, :output then 11 - when :red, :failure then 12 - when :purple then 13 - when :yellow then 14 - when :white then 15 - else - 0 + when :black then 0 + when :dark_blue then 1 + when :dark_green then 2 + when :dark_cyan then 3 + when :dark_red then 4 + when :dark_purple then 5 + when :dark_yellow, :narrative then 6 + when :default_white, :default, :dark_white then 7 + when :silver then 8 + when :blue then 9 + when :green, :success then 10 + when :cyan, :output then 11 + when :red, :failure then 12 + when :purple then 13 + when :yellow then 14 + when :white then 15 + else + 0 end end - def posix_colour(colour) + def posix_colour(colour) # ANSI Escape Codes - Foreground colors # | Code | Color | # | 39 | Default foreground color | @@ -81,35 +81,39 @@ class ColourCommandLine # | 96 | Light cyan | # | 97 | White | - case colour - when :black then 30 - when :red, :failure then 31 - when :green, :success then 32 - when :yellow then 33 - when :blue, :narrative then 34 - when :purple, :magenta then 35 - when :cyan, :output then 36 - when :white, :default_white then 37 - when :default then 39 - else - 39 + case colour + when :black then 30 + when :red, :failure then 31 + when :green, :success then 32 + when :yellow then 33 + when :blue, :narrative then 34 + when :purple, :magenta then 35 + when :cyan, :output then 36 + when :white, :default_white then 37 + when :default then 39 + else + 39 end end def out_c(mode, colour, str) case RUBY_PLATFORM - when /(win|w)32$/ - change_to(colour) - $stdout.puts str if mode == :puts - $stdout.print str if mode == :print - change_to(:default_white) - else - $stdout.puts("#{change_to(colour)}#{str}\033[0m") if mode == :puts - $stdout.print("#{change_to(colour)}#{str}\033[0m") if mode == :print - end + when /(win|w)32$/ + change_to(colour) + $stdout.puts str if mode == :puts + $stdout.print str if mode == :print + change_to(:default_white) + else + $stdout.puts("#{change_to(colour)}#{str}\033[0m") if mode == :puts + $stdout.print("#{change_to(colour)}#{str}\033[0m") if mode == :print + end end end # ColourCommandLine -def colour_puts(role,str) ColourCommandLine.new.out_c(:puts, role, str) end -def colour_print(role,str) ColourCommandLine.new.out_c(:print, role, str) end +def colour_puts(role, str) + ColourCommandLine.new.out_c(:puts, role, str) +end +def colour_print(role, str) + ColourCommandLine.new.out_c(:print, role, str) +end diff --git a/auto/colour_reporter.rb b/auto/colour_reporter.rb index 5aa1d27..ba1cea3 100644 --- a/auto/colour_reporter.rb +++ b/auto/colour_reporter.rb @@ -2,38 +2,38 @@ # Unity Project - A Test Framework for C # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams # [Released under MIT License. Please refer to license.txt for details] -# ========================================== +# ========================================== require "#{File.expand_path(File.dirname(__FILE__))}/colour_prompt" $colour_output = true def report(message) - if not $colour_output + if !$colour_output $stdout.puts(message) else - message = message.join('\n') if (message.class == Array) + message = message.join('\n') if message.class == Array message.each_line do |line| line.chomp! - colour = case(line) - when /(?:total\s+)?tests:?\s+(\d+)\s+(?:total\s+)?failures:?\s+\d+\s+Ignored:?/i - ($1.to_i == 0) ? :green : :red - when /PASS/ - :green - when /^OK$/ - :green - when /(?:FAIL|ERROR)/ - :red - when /IGNORE/ - :yellow - when /^(?:Creating|Compiling|Linking)/ - :white - else - :silver + colour = case line + when /(?:total\s+)?tests:?\s+(\d+)\s+(?:total\s+)?failures:?\s+\d+\s+Ignored:?/i + Regexp.last_match(1).to_i == 0 ? :green : :red + when /PASS/ + :green + when /^OK$/ + :green + when /(?:FAIL|ERROR)/ + :red + when /IGNORE/ + :yellow + when /^(?:Creating|Compiling|Linking)/ + :white + else + :silver end colour_puts(colour, line) end end $stdout.flush $stderr.flush -end \ No newline at end of file +end diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 0fbaf55..560612b 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -12,8 +12,8 @@ require 'rubygems' require 'fileutils' require 'pathname' -#TEMPLATE_TST -TEMPLATE_TST ||= %q[#include "unity.h" +# TEMPLATE_TST +TEMPLATE_TST ||= '#include "unity.h" %2$s#include "%1$s.h" void setUp(void) @@ -28,115 +28,104 @@ void test_%1$s_NeedToImplement(void) { TEST_IGNORE_MESSAGE("Need to Implement %1$s"); } -] +'.freeze -#TEMPLATE_SRC -TEMPLATE_SRC ||= %q[%2$s#include "%1$s.h" -] +# TEMPLATE_SRC +TEMPLATE_SRC ||= '%2$s#include "%1$s.h" +'.freeze -#TEMPLATE_INC -TEMPLATE_INC ||= %q[#ifndef _%3$s_H +# TEMPLATE_INC +TEMPLATE_INC ||= '#ifndef _%3$s_H #define _%3$s_H %2$s #endif // _%3$s_H -] +'.freeze class UnityModuleGenerator - ############################ - def initialize(options=nil) - + 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" + 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_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) + @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 => [] } }, - 'test'=> {'' => { :inc => [] } }, - 'dh' => {'Driver' => { :inc => [create_filename('%1$s','Hardware.h')] }, - 'Hardware' => { :inc => [] } - }, - '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 => [create_filename('%1$s','Model.h'), create_filename('%1$s','Hardware.h')] }, - 'Hardware' => { :inc => [] } - }, - 'mvp' => {'Model' => { :inc => [] }, - 'Presenter'=> { :inc => [create_filename('%1$s','Model.h'), create_filename('%1$s','View.h')] }, - 'View' => { :inc => [] } - } - } + # Built in patterns + @patterns = { 'src' => { '' => { inc: [] } }, + 'test' => { '' => { inc: [] } }, + 'dh' => { 'Driver' => { inc: [create_filename('%1$s', 'Hardware.h')] }, + 'Hardware' => { inc: [] } }, + '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: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'Hardware.h')] }, + 'Hardware' => { inc: [] } }, + 'mvp' => { 'Model' => { inc: [] }, + 'Presenter' => { inc: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'View.h')] }, + 'View' => { inc: [] } } } end ############################ def self.default_options { - :pattern => "src", - :includes => - { - :src => [], - :inc => [], - :tst => [], + pattern: 'src', + includes: { + src: [], + inc: [], + tst: [] }, - :update_svn => false, - :boilerplates => {}, - :test_prefix => 'Test', - :mock_prefix => 'Mock', + update_svn: false, + boilerplates: {}, + test_prefix: 'Test', + mock_prefix: 'Mock' } end ############################ def self.grab_config(config_file) - options = self.default_options - unless (config_file.nil? or config_file.empty?) + options = default_options + unless config_file.nil? || 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) + options end ############################ - def files_to_operate_on(module_name, pattern=nil) - #strip any leading path information from the module name and save for later + 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 + # create triad definition prefix = @options[:test_prefix] || 'Test' - 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] }, - ] + 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 + # prepare the pattern for use 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 + # single file patterns (currently just 'test') can reject the other parts of the triad + triad.select! { |v| v[:inc] == :tst } if pattern == 'test' # Assemble the path/names of the files we need to work with. files = [] @@ -145,26 +134,26 @@ class UnityModuleGenerator submodule_name = create_filename(module_name, pattern_file) filename = cfg[:prefix] + submodule_name + cfg[:ext] files << { - :path => (Pathname.new("#{cfg[:path]}#{subfolder}") + filename).cleanpath, - :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]} + path: (Pathname.new("#{cfg[:path]}#{subfolder}") + filename).cleanpath, + 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 end - return files + files end ############################ - def create_filename(part1, part2="") + def create_filename(part1, part2 = '') if part2.empty? - case(@options[:naming]) + case (@options[:naming]) when 'bumpy' then part1 when 'camel' then part1 when 'snake' then part1.downcase @@ -172,49 +161,45 @@ class UnityModuleGenerator else part1.downcase end else - case(@options[:naming]) + 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 + 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) - + def generate(module_name, pattern = nil) files = files_to_operate_on(module_name, pattern) - #Abort if all of the module files already exist + # Abort if all of the module files already exist all_files_exist = true files.each do |file| - if not File.exist?(file[:path]) - all_files_exist = false - end + all_files_exist = false unless File.exist?(file[:path]) end raise "ERROR: File #{files[0][:name]} already exists. Exiting." if all_files_exist # Create Source Modules - files.each_with_index do |file, i| + files.each_with_index do |file, _i| # 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) + 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], - file[:includes].map{|f| "#include \"#{f}\"\n"}.join, - file[:name].upcase ] - ) + f.write(file[:template] % [file[:name], + file[:includes].map { |f| "#include \"#{f}\"\n" }.join, + file[:name].upcase]) end - if (@options[:update_svn]) + if @options[:update_svn] `svn add \"#{file[:path]}\"` - if $?.exitstatus == 0 + if $CHILD_STATUS.exitstatus == 0 puts "File #{file[:path]} created and added to source control" else puts "File #{file[:path]} created but FAILED adding to source control!" @@ -227,8 +212,7 @@ class UnityModuleGenerator end ############################ - def destroy(module_name, pattern=nil) - + def destroy(module_name, pattern = nil) files_to_operate_on(module_name, pattern).each do |filespec| file = filespec[:path] if File.exist?(file) @@ -243,66 +227,65 @@ class UnityModuleGenerator puts "File #{file} does not exist so cannot be removed." end end - puts "Destroy Complete" + puts 'Destroy Complete' end - end ############################ -#Handle As Command Line If Called That Way -if ($0 == __FILE__) +# Handle As Command Line If Called That Way +if $PROGRAM_NAME == __FILE__ destroy = false - options = { } + options = {} module_name = nil # 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 /^-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 - when /^-(h|-help)/ - ARGV = [] - else - raise "ERROR: Unknown option specified '#{arg}'" + case arg + when /^-d/ then destroy = true + when /^-u/ then options[:update_svn] = true + when /^-p\"?(\w+)\"?/ then options[:pattern] = Regexp.last_match(1) + when /^-s\"?(.+)\"?/ then options[:path_src] = Regexp.last_match(1) + when /^-i\"?(.+)\"?/ then options[:path_inc] = Regexp.last_match(1) + when /^-t\"?(.+)\"?/ then options[:path_tst] = Regexp.last_match(1) + when /^-n\"?(.+)\"?/ then options[:naming] = Regexp.last_match(1) + when /^-y\"?(.+)\"?/ then options = UnityModuleGenerator.grab_config(Regexp.last_match(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 = [].freeze + 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 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") + unless 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 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") exit end - raise "ERROR: You must have a Module name specified! (use option -h for help)" if module_name.nil? - if (destroy) + 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 UnityModuleGenerator.new(options).generate(module_name) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 2d3f931..32c9ca5 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -4,50 +4,49 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -File.expand_path(File.join(File.dirname(__FILE__),'colour_prompt')) +File.expand_path(File.join(File.dirname(__FILE__), 'colour_prompt')) class UnityTestRunnerGenerator - def initialize(options = nil) @options = UnityTestRunnerGenerator.default_options - case(options) - when NilClass then @options - when String then @options.merge!(UnityTestRunnerGenerator.grab_config(options)) - when Hash then @options.merge!(options) - else raise "If you specify arguments, it should be a filename or a hash of options" + case (options) + when NilClass then @options + when String then @options.merge!(UnityTestRunnerGenerator.grab_config(options)) + when Hash then @options.merge!(options) + else raise 'If you specify arguments, it should be a filename or a hash of options' end require "#{File.expand_path(File.dirname(__FILE__))}/type_sanitizer" end def self.default_options { - :includes => [], - :defines => [], - :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 - :main_export_decl => "", - :cmdline_args => false, - :use_param_tests => false, + includes: [], + defines: [], + 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 + main_export_decl: '', + cmdline_args: false, + use_param_tests: false } end def self.grab_config(config_file) - options = self.default_options - unless (config_file.nil? or config_file.empty?) + options = default_options + unless config_file.nil? || 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) + (options) end - def run(input_file, output_file, options=nil) + def run(input_file, output_file, options = nil) tests = [] testfile_includes = [] used_mocks = [] @@ -55,25 +54,25 @@ class UnityTestRunnerGenerator @options.merge!(options) unless options.nil? module_name = File.basename(input_file) - #pull required data from source file + # pull required data from source file source = File.read(input_file) - source = source.force_encoding("ISO-8859-1").encode("utf-8", :replace => nil) + source = source.force_encoding('ISO-8859-1').encode('utf-8', replace: nil) tests = find_tests(source) headers = find_includes(source) testfile_includes = (headers[:local] + headers[:system]) used_mocks = find_mocks(testfile_includes) testfile_includes = (testfile_includes - used_mocks) - testfile_includes.delete_if{|inc| inc =~ /(unity|cmock)/} + testfile_includes.delete_if { |inc| inc =~ /(unity|cmock)/ } - #build runner file + # build runner file generate(input_file, output_file, tests, used_mocks, testfile_includes) - #determine which files were used to return them + # determine which files were used to return them all_files_used = [input_file, output_file] - all_files_used += testfile_includes.map {|filename| filename + '.c'} unless testfile_includes.empty? + 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 + all_files_used.uniq end def generate(input_file, output_file, tests, used_mocks, testfile_includes) @@ -86,7 +85,7 @@ class UnityTestRunnerGenerator create_main(output, input_file, tests, used_mocks) end - if (@options[:header_file] && !@options[:header_file].empty?) + if @options[:header_file] && !@options[:header_file].empty? File.open(@options[:header_file], 'w') do |output| create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) end @@ -97,93 +96,90 @@ class UnityTestRunnerGenerator tests_and_line_numbers = [] source_scrubbed = source.clone - source_scrubbed = source_scrubbed.gsub(/"[^"\n]*"/, '') # remove things in strings + source_scrubbed = source_scrubbed.gsub(/"[^"\n]*"/, '') # remove things in strings source_scrubbed = source_scrubbed.gsub(/\/\/.*$/, '') # remove line comments source_scrubbed = source_scrubbed.gsub(/\/\*.*?\*\//m, '') # remove block comments lines = source_scrubbed.split(/(^\s*\#.*$) # Treat preprocessor directives as a logical line | (;|\{|\}) /x) # Match ;, {, and } as end of lines - lines.each_with_index do |line, index| - #find tests - if line =~ /^((?:\s*TEST_CASE\s*\(.*?\)\s*)*)\s*void\s+((?:#{@options[:test_prefix]}).*)\s*\(\s*(.*)\s*\)/ - arguments = $1 - name = $2 - call = $3 - params = $4 - args = nil - if (@options[:use_param_tests] and !arguments.empty?) - args = [] - arguments.scan(/\s*TEST_CASE\s*\((.*)\)\s*$/) {|a| args << a[0]} - end - tests_and_line_numbers << { :test => name, :args => args, :call => call, :params => params, :line_number => 0 } + lines.each_with_index do |line, _index| + # find tests + next unless line =~ /^((?:\s*TEST_CASE\s*\(.*?\)\s*)*)\s*void\s+((?:#{@options[:test_prefix]}).*)\s*\(\s*(.*)\s*\)/ + arguments = Regexp.last_match(1) + name = Regexp.last_match(2) + call = Regexp.last_match(3) + params = Regexp.last_match(4) + args = nil + if @options[:use_param_tests] && !arguments.empty? + args = [] + arguments.scan(/\s*TEST_CASE\s*\((.*)\)\s*$/) { |a| args << a[0] } end + tests_and_line_numbers << { test: name, args: args, call: call, params: params, line_number: 0 } end - tests_and_line_numbers.uniq! {|v| v[:test] } + tests_and_line_numbers.uniq! { |v| v[:test] } - #determine line numbers and create tests to run + # determine line numbers and create tests to run source_lines = source.split("\n") - source_index = 0; + source_index = 0 tests_and_line_numbers.size.times do |i| source_lines[source_index..-1].each_with_index do |line, index| - if (line =~ /#{tests_and_line_numbers[i][:test]}/) - source_index += index - tests_and_line_numbers[i][:line_number] = source_index + 1 - break - end + next unless (line =~ /#{tests_and_line_numbers[i][:test]}/) + source_index += index + tests_and_line_numbers[i][:line_number] = source_index + 1 + break end end - return tests_and_line_numbers + tests_and_line_numbers end def find_includes(source) - - #remove comments (block and line, in three steps to ensure correct precedence) + # remove comments (block and line, in three steps to ensure correct precedence) source.gsub!(/\/\/(?:.+\/\*|\*(?:$|[^\/])).*$/, '') # remove line comments that comment out the start of blocks source.gsub!(/\/\*.*?\*\//m, '') # remove block comments source.gsub!(/\/\/.*$/, '') # remove line comments (all that remain) - #parse out includes + # 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}>" }, - :linkonly => source.scan(/^TEST_FILE\(\s*\"\s*(.+)\.[cC]\w*\s*\"/).flatten + local: source.scan(/^\s*#include\s+\"\s*(.+)\.[hH]\s*\"/).flatten, + 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 + includes end def find_mocks(includes) mock_headers = [] includes.each do |include_path| include_file = File.basename(include_path) - mock_headers << include_path if (include_file =~ /^#{@options[:mock_prefix]}/i) + mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}/i end - return mock_headers + mock_headers end - def create_header(output, mocks, testfile_includes=[]) + def create_header(output, mocks, testfile_includes = []) output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') create_runtest(output, mocks) output.puts("\n/*=======Automagically Detected Files To Include=====*/") - output.puts("#include \"#{@options[:framework].to_s}.h\"") - output.puts('#include "cmock.h"') unless (mocks.empty?) + output.puts("#include \"#{@options[:framework]}.h\"") + output.puts('#include "cmock.h"') unless mocks.empty? output.puts('#include ') output.puts('#include ') - if (@options[:defines] && !@options[:defines].empty?) - @options[:defines].each {|d| output.puts("#define #{d}")} + if @options[:defines] && !@options[:defines].empty? + @options[:defines].each { |d| output.puts("#define #{d}") } end - if (@options[:header_file] && !@options[:header_file].empty?) + if @options[:header_file] && !@options[:header_file].empty? output.puts("#include \"#{File.basename(@options[:header_file])}\"") else @options[:includes].flatten.uniq.compact.each do |inc| - output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}") end testfile_includes.each do |inc| - output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}") end end mocks.each do |mock| - output.puts("#include \"#{mock.gsub('.h','')}.h\"") + output.puts("#include \"#{mock.gsub('.h', '')}.h\"") end output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) if @options[:enforce_strict_ordering] @@ -194,7 +190,7 @@ class UnityTestRunnerGenerator end end - def create_externs(output, tests, mocks) + def create_externs(output, tests, _mocks) output.puts("\n/*=======External Functions This Runner Calls=====*/") output.puts("extern void #{@options[:setup_name]}(void);") output.puts("extern void #{@options[:teardown_name]}(void);") @@ -205,32 +201,32 @@ class UnityTestRunnerGenerator end def create_mock_management(output, mock_headers) - unless (mock_headers.empty?) + unless mock_headers.empty? output.puts("\n/*=======Mock Management=====*/") - output.puts("static void CMock_Init(void)") - output.puts("{") + output.puts('static void CMock_Init(void)') + output.puts('{') if @options[:enforce_strict_ordering] - output.puts(" GlobalExpectCount = 0;") - output.puts(" GlobalVerifyOrder = 0;") - output.puts(" GlobalOrderError = NULL;") + output.puts(' GlobalExpectCount = 0;') + output.puts(' GlobalVerifyOrder = 0;') + output.puts(' GlobalOrderError = NULL;') end - mocks = mock_headers.map {|mock| File.basename(mock)} + mocks = mock_headers.map { |mock| File.basename(mock) } mocks.each do |mock| mock_clean = TypeSanitizer.sanitize_c_identifier(mock) output.puts(" #{mock_clean}_Init();") end output.puts("}\n") - output.puts("static void CMock_Verify(void)") - output.puts("{") + output.puts('static void CMock_Verify(void)') + output.puts('{') mocks.each do |mock| mock_clean = TypeSanitizer.sanitize_c_identifier(mock) output.puts(" #{mock_clean}_Verify();") end output.puts("}\n") - output.puts("static void CMock_Destroy(void)") - output.puts("{") + output.puts('static void CMock_Destroy(void)') + output.puts('{') mocks.each do |mock| mock_clean = TypeSanitizer.sanitize_c_identifier(mock) output.puts(" #{mock_clean}_Destroy();") @@ -240,19 +236,19 @@ class UnityTestRunnerGenerator end def create_suite_setup_and_teardown(output) - unless (@options[:suite_setup].nil?) + unless @options[:suite_setup].nil? output.puts("\n/*=======Suite Setup=====*/") - output.puts("static void suite_setup(void)") - output.puts("{") + output.puts('static void suite_setup(void)') + output.puts('{') output.puts(@options[:suite_setup]) - output.puts("}") + output.puts('}') end - unless (@options[:suite_teardown].nil?) + unless @options[:suite_teardown].nil? output.puts("\n/*=======Suite Teardown=====*/") - output.puts("static int suite_teardown(int num_failures)") - output.puts("{") + output.puts('static int suite_teardown(int num_failures)') + output.puts('{') output.puts(@options[:suite_teardown]) - output.puts("}") + output.puts('}') end end @@ -261,124 +257,124 @@ class UnityTestRunnerGenerator va_args1 = @options[:use_param_tests] ? ', ...' : '' va_args2 = @options[:use_param_tests] ? '__VA_ARGS__' : '' output.puts("\n/*=======Test Runner Used To Run Each Test Below=====*/") - output.puts("#define RUN_TEST_NO_ARGS") if @options[:use_param_tests] + output.puts('#define RUN_TEST_NO_ARGS') if @options[:use_param_tests] output.puts("#define RUN_TEST(TestFunc, TestLineNum#{va_args1}) \\") - output.puts("{ \\") + output.puts('{ \\') output.puts(" Unity.CurrentTestName = #TestFunc#{va_args2.empty? ? '' : " \"(\" ##{va_args2} \")\""}; \\") - output.puts(" Unity.CurrentTestLineNumber = TestLineNum; \\") - output.puts(" if (UnityTestMatches()) { \\") if (@options[:cmdline_args]) - output.puts(" Unity.NumberOfTests++; \\") - output.puts(" CMock_Init(); \\") unless (used_mocks.empty?) - output.puts(" UNITY_CLR_DETAILS(); \\") unless (used_mocks.empty?) - output.puts(" if (TEST_PROTECT()) \\") - output.puts(" { \\") - output.puts(" CEXCEPTION_T e; \\") if cexception - output.puts(" Try { \\") if cexception + output.puts(' Unity.CurrentTestLineNumber = TestLineNum; \\') + output.puts(' if (UnityTestMatches()) { \\') if @options[:cmdline_args] + output.puts(' Unity.NumberOfTests++; \\') + output.puts(' CMock_Init(); \\') unless used_mocks.empty? + output.puts(' UNITY_CLR_DETAILS(); \\') unless used_mocks.empty? + output.puts(' if (TEST_PROTECT()) \\') + output.puts(' { \\') + output.puts(' CEXCEPTION_T e; \\') if cexception + output.puts(' Try { \\') if cexception output.puts(" #{@options[:setup_name]}(); \\") 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()) \\") - output.puts(" { \\") + output.puts(' } Catch(e) { TEST_ASSERT_EQUAL_HEX32_MESSAGE(CEXCEPTION_NONE, e, "Unhandled Exception!"); } \\') if cexception + output.puts(' } \\') + output.puts(' if (TEST_PROTECT()) \\') + output.puts(' { \\') output.puts(" #{@options[:teardown_name]}(); \\") - output.puts(" CMock_Verify(); \\") unless (used_mocks.empty?) - output.puts(" } \\") - output.puts(" CMock_Destroy(); \\") unless (used_mocks.empty?) - output.puts(" UnityConcludeTest(); \\") - output.puts(" } \\") if (@options[:cmdline_args]) + output.puts(' CMock_Verify(); \\') unless used_mocks.empty? + output.puts(' } \\') + output.puts(' CMock_Destroy(); \\') unless used_mocks.empty? + output.puts(' UnityConcludeTest(); \\') + output.puts(' } \\') if @options[:cmdline_args] output.puts("}\n") end def create_reset(output, used_mocks) output.puts("\n/*=======Test Reset Option=====*/") - output.puts("void resetTest(void);") - output.puts("void resetTest(void)") - output.puts("{") - output.puts(" CMock_Verify();") unless (used_mocks.empty?) - output.puts(" CMock_Destroy();") unless (used_mocks.empty?) + output.puts('void resetTest(void);') + output.puts('void resetTest(void)') + output.puts('{') + output.puts(' CMock_Verify();') unless used_mocks.empty? + output.puts(' CMock_Destroy();') unless used_mocks.empty? output.puts(" #{@options[:teardown_name]}();") - output.puts(" CMock_Init();") unless (used_mocks.empty?) + output.puts(' CMock_Init();') unless used_mocks.empty? output.puts(" #{@options[:setup_name]}();") - output.puts("}") + output.puts('}') end def create_main(output, filename, tests, used_mocks) output.puts("\n\n/*=======MAIN=====*/") - main_name = (@options[:main_name].to_sym == :auto) ? "main_#{filename.gsub('.c','')}" : "#{@options[:main_name]}" - if (@options[:cmdline_args]) - if (main_name != "main") + main_name = @options[:main_name].to_sym == :auto ? "main_#{filename.gsub('.c', '')}" : (@options[:main_name]).to_s + if @options[:cmdline_args] + if main_name != 'main' output.puts("#{@options[:main_export_decl]} int #{main_name}(int argc, char** argv);") end output.puts("#{@options[:main_export_decl]} int #{main_name}(int argc, char** argv)") - output.puts("{") - output.puts(" int parse_status = UnityParseOptions(argc, argv);") - output.puts(" if (parse_status != 0)") - output.puts(" {") - output.puts(" if (parse_status < 0)") - output.puts(" {") - output.puts(" UnityPrint(\"#{filename.gsub('.c','')}.\");") - output.puts(" UNITY_PRINT_EOL();") - if (@options[:use_param_tests]) + output.puts('{') + output.puts(' int parse_status = UnityParseOptions(argc, argv);') + output.puts(' if (parse_status != 0)') + output.puts(' {') + output.puts(' if (parse_status < 0)') + output.puts(' {') + output.puts(" UnityPrint(\"#{filename.gsub('.c', '')}.\");") + output.puts(' UNITY_PRINT_EOL();') + if @options[:use_param_tests] tests.each do |test| - if ((test[:args].nil?) or (test[:args].empty?)) + if test[:args].nil? || test[:args].empty? output.puts(" UnityPrint(\" #{test[:test]}(RUN_TEST_NO_ARGS)\");") - output.puts(" UNITY_PRINT_EOL();") + output.puts(' UNITY_PRINT_EOL();') else test[:args].each do |args| output.puts(" UnityPrint(\" #{test[:test]}(#{args})\");") - output.puts(" UNITY_PRINT_EOL();") + output.puts(' UNITY_PRINT_EOL();') end end end else - tests.each { |test| output.puts(" UnityPrint(\" #{test[:test]}\");\n UNITY_PRINT_EOL();")} + tests.each { |test| output.puts(" UnityPrint(\" #{test[:test]}\");\n UNITY_PRINT_EOL();") } end - output.puts(" return 0;") - output.puts(" }") - output.puts(" return parse_status;") - output.puts(" }") + output.puts(' return 0;') + output.puts(' }') + output.puts(' return parse_status;') + output.puts(' }') else - if (main_name != "main") + if main_name != 'main' output.puts("#{@options[:main_export_decl]} int #{main_name}(void);") end output.puts("int #{main_name}(void)") - output.puts("{") + output.puts('{') end - output.puts(" suite_setup();") unless @options[:suite_setup].nil? - output.puts(" UnityBegin(\"#{filename.gsub(/\\/,'\\\\\\')}\");") - if (@options[:use_param_tests]) + output.puts(' suite_setup();') unless @options[:suite_setup].nil? + output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");") + if @options[:use_param_tests] tests.each do |test| - if ((test[:args].nil?) or (test[:args].empty?)) + if test[:args].nil? || test[:args].empty? output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, RUN_TEST_NO_ARGS);") else - test[:args].each {|args| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, #{args});")} + test[:args].each { |args| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]}, #{args});") } end end else - tests.each { |test| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]});") } + tests.each { |test| output.puts(" RUN_TEST(#{test[:test]}, #{test[:line_number]});") } end - output.puts() - output.puts(" CMock_Guts_MemFreeFinal();") unless used_mocks.empty? - output.puts(" return #{@options[:suite_teardown].nil? ? "" : "suite_teardown"}(UnityEnd());") - output.puts("}") + output.puts + output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty? + output.puts(" return #{@options[:suite_teardown].nil? ? '' : 'suite_teardown'}(UnityEnd());") + output.puts('}') end def create_h_file(output, filename, tests, testfile_includes, used_mocks) - filename = File.basename(filename).gsub(/[-\/\\\.\,\s]/, "_").upcase - output.puts("/* AUTOGENERATED FILE. DO NOT EDIT. */") + filename = File.basename(filename).gsub(/[-\/\\\.\,\s]/, '_').upcase + output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') output.puts("#ifndef _#{filename}") output.puts("#define _#{filename}\n\n") - output.puts("#include \"#{@options[:framework].to_s}.h\"") - output.puts('#include "cmock.h"') unless (used_mocks.empty?) + output.puts("#include \"#{@options[:framework]}.h\"") + output.puts('#include "cmock.h"') unless used_mocks.empty? @options[:includes].flatten.uniq.compact.each do |inc| - output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}") end testfile_includes.each do |inc| - output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h','')}.h\""}") + output.puts("#include #{inc.include?('<') ? inc : "\"#{inc.gsub('.h', '')}.h\""}") end output.puts "\n" tests.each do |test| - if ((test[:params].nil?) or (test[:params].empty?)) + if test[:params].nil? || test[:params].empty? output.puts("void #{test[:test]}(void);") else output.puts("void #{test[:test]}(#{test[:params]});") @@ -388,50 +384,49 @@ class UnityTestRunnerGenerator end end -if ($0 == __FILE__) - options = { :includes => [] } +if $PROGRAM_NAME == __FILE__ + options = { includes: [] } yaml_file = nil - #parse out all the options first (these will all be removed as we go) + # parse out all the options first (these will all be removed as we go) ARGV.reject! do |arg| - case(arg) - when '-cexception' + case (arg) + when '-cexception' options[:plugins] = [:cexception]; true - when /\.*\.ya?ml/ + when /\.*\.ya?ml/ options = UnityTestRunnerGenerator.grab_config(arg); true - when /--(\w+)=\"?(.*)\"?/ - options[$1.to_sym] = $2; true - when /\.*\.h/ + when /--(\w+)=\"?(.*)\"?/ + options[Regexp.last_match(1).to_sym] = Regexp.last_match(2); true + when /\.*\.h/ options[:includes] << arg; true else false end end - #make sure there is at least one parameter left (the input file) - if !ARGV[0] + # make sure there is at least one parameter left (the input file) + unless ARGV[0] puts ["\nusage: ruby #{__FILE__} (files) (options) input_test_file (output)", - "\n input_test_file - this is the C file you want to create a runner for", - " output - this is the name of the runner file to generate", - " defaults to (input_test_file)_Runner", - " files:", - " *.yml / *.yaml - loads configuration from here in :unity or :cmock", - " *.h - header files are added as #includes in runner", - " options:", - " -cexception - include cexception support", - " --setup_name=\"\" - redefine setUp func name to something else", - " --teardown_name=\"\" - redefine tearDown func name to something else", - " --main_name=\"\" - redefine main func name to something else", - " --test_prefix=\"\" - redefine test prefix from default test|spec|should", - " --suite_setup=\"\" - code to execute for setup of entire suite", - " --suite_teardown=\"\" - code to execute for teardown of entire suite", - " --use_param_tests=1 - enable parameterized tests (disabled by default)", - " --header_file=\"\" - path/name of test header file to generate too" - ].join("\n") + "\n input_test_file - this is the C file you want to create a runner for", + ' output - this is the name of the runner file to generate', + ' defaults to (input_test_file)_Runner', + ' files:', + ' *.yml / *.yaml - loads configuration from here in :unity or :cmock', + ' *.h - header files are added as #includes in runner', + ' options:', + ' -cexception - include cexception support', + ' --setup_name="" - redefine setUp func name to something else', + ' --teardown_name="" - redefine tearDown func name to something else', + ' --main_name="" - redefine main func name to something else', + ' --test_prefix="" - redefine test prefix from default test|spec|should', + ' --suite_setup="" - code to execute for setup of entire suite', + ' --suite_teardown="" - code to execute for teardown of entire suite', + ' --use_param_tests=1 - enable parameterized tests (disabled by default)', + ' --header_file="" - path/name of test header file to generate too'].join("\n") exit 1 end - #create the default test runner name if not specified - ARGV[1] = ARGV[0].gsub(".c","_Runner.c") if (!ARGV[1]) + # create the default test runner name if not specified + ARGV[1] = ARGV[0].gsub('.c', '_Runner.c') unless ARGV[1] UnityTestRunnerGenerator.new(options).run(ARGV[0], ARGV[1]) end diff --git a/auto/parseOutput.rb b/auto/parseOutput.rb index e8dbf08..3e026e5 100644 --- a/auto/parseOutput.rb +++ b/auto/parseOutput.rb @@ -1,12 +1,12 @@ #============================================================ # Author: John Theofanopoulos # A simple parser. Takes the output files generated during the build process and -# extracts information relating to the tests. +# extracts information relating to the tests. # # Notes: # To capture an output file under VS builds use the following: # devenv [build instructions] > Output.txt & type Output.txt -# +# # To capture an output file under GCC/Linux builds use the following: # make | tee Output.txt # @@ -16,209 +16,203 @@ # file : file to scan for results #============================================================ - class ParseOutput -# The following flag is set to true when a test is found or false otherwise. - @testFlag - @xmlOut - @arrayList - @totalTests - @classIndex + # The following flag is set to true when a test is found or false otherwise. + @testFlag + @xmlOut + @arrayList + @totalTests + @classIndex -# Set the flag to indicate if there will be an XML output file or not - def setXmlOutput() - @xmlOut = true + # Set the flag to indicate if there will be an XML output file or not + def setXmlOutput + @xmlOut = true + end + + # if write our output to XML + def writeXmlOuput + output = File.open('report.xml', 'w') + output << "\n" + @arrayList.each do |item| + output << item << "\n" end - -# if write our output to XML - def writeXmlOuput() - output = File.open("report.xml", "w") - output << "\n" - @arrayList.each do |item| - output << item << "\n" - end - output << "\n" + output << "\n" + end + + # This function will try and determine when the suite is changed. This is + # is the name that gets added to the classname parameter. + def testSuiteVerify(testSuiteName) + if @testFlag == false + @testFlag = true + # Split the path name + testName = testSuiteName.split('/') + # Remove the extension + baseName = testName[testName.size - 1].split('.') + @testSuite = 'test.' + baseName[0] + printf "New Test: %s\n", @testSuite end - -# This function will try and determine when the suite is changed. This is -# is the name that gets added to the classname parameter. - def testSuiteVerify(testSuiteName) - if @testFlag == false - @testFlag = true; - # Split the path name - testName = testSuiteName.split("/") - # Remove the extension - baseName = testName[testName.size - 1].split(".") - @testSuite = "test." + baseName[0] - printf "New Test: %s\n", @testSuite + end + + # Test was flagged as having passed so format the output + def testPassed(array) + lastItem = array.length - 1 + testName = array[lastItem - 1] + testSuiteVerify(array[@className]) + printf "%-40s PASS\n", testName + if @xmlOut == true + @arrayList.push ' ' + end + end + + # Test was flagged as having passed so format the output. + # This is using the Unity fixture output and not the original Unity output. + def testPassedUnityFixture(array) + testSuite = array[0].sub('TEST(', '') + testSuite = testSuite.sub(',', '') + testName = array[1].sub(')', '') + if @xmlOut == true + @arrayList.push ' ' + end + end + + # Test was flagged as being ingored so format the output + def testIgnored(array) + lastItem = array.length - 1 + testName = array[lastItem - 2] + reason = array[lastItem].chomp + testSuiteVerify(array[@className]) + printf "%-40s IGNORED\n", testName + + if testName.start_with? 'TEST(' + array2 = testName.split(' ') + @testSuite = array2[0].sub('TEST(', '') + @testSuite = @testSuite.sub(',', '') + testName = array2[1].sub(')', '') + end + + if @xmlOut == true + @arrayList.push ' ' + @arrayList.push ' ' + reason + ' ' + @arrayList.push ' ' + end + end + + # Test was flagged as having failed so format the line + def testFailed(array) + lastItem = array.length - 1 + testName = array[lastItem - 2] + reason = array[lastItem].chomp + ' at line: ' + array[lastItem - 3] + testSuiteVerify(array[@className]) + printf "%-40s FAILED\n", testName + + if testName.start_with? 'TEST(' + array2 = testName.split(' ') + @testSuite = array2[0].sub('TEST(', '') + @testSuite = @testSuite.sub(',', '') + testName = array2[1].sub(')', '') + end + + if @xmlOut == true + @arrayList.push ' ' + @arrayList.push ' ' + reason + ' ' + @arrayList.push ' ' + end + end + + # Figure out what OS we are running on. For now we are assuming if it's not Windows it must + # be Unix based. + def detectOS + myOS = RUBY_PLATFORM.split('-') + @className = if myOS.size == 2 + if myOS[1] == 'mingw32' + 1 + else + 0 + end + else + 0 + end + end + + # Main function used to parse the file that was captured. + def process(name) + @testFlag = false + @arrayList = [] + + detectOS + + puts 'Parsing file: ' + name + + testPass = 0 + testFail = 0 + testIgnore = 0 + puts '' + puts '=================== RESULTS =====================' + puts '' + File.open(name).each do |line| + # Typical test lines look like this: + # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 + # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented + # /.c:115:test_tc5100_initCanVoidPtrs:PASS + # + # where path is different on Unix vs Windows devices (Windows leads with a drive letter) + lineArray = line.split(':') + lineSize = lineArray.size + # If we were able to split the line then we can look to see if any of our target words + # were found. Case is important. + if (lineSize >= 4) || (line.start_with? 'TEST(') + # Determine if this test passed + if line.include? ':PASS' + testPassed(lineArray) + testPass += 1 + elsif line.include? ':FAIL:' + testFailed(lineArray) + testFail += 1 + elsif line.include? ':IGNORE:' + testIgnored(lineArray) + testIgnore += 1 + elsif line.start_with? 'TEST(' + if line.include? ' PASS' + lineArray = line.split(' ') + testPassedUnityFixture(lineArray) + testPass += 1 + end + # If none of the keywords are found there are no more tests for this suite so clear + # the test flag + else + @testFlag = false end - end - - -# Test was flagged as having passed so format the output - def testPassed(array) - lastItem = array.length - 1 - testName = array[lastItem - 1] - testSuiteVerify(array[@className]) - printf "%-40s PASS\n", testName - if @xmlOut == true - @arrayList.push " " - end - end - -# Test was flagged as having passed so format the output. -# This is using the Unity fixture output and not the original Unity output. - def testPassedUnityFixture(array) - testSuite = array[0].sub("TEST(", "") - testSuite = testSuite.sub(",", "") - testName = array[1].sub(")", "") - if @xmlOut == true - @arrayList.push " " - end - end - -# Test was flagged as being ingored so format the output - def testIgnored(array) - lastItem = array.length - 1 - testName = array[lastItem - 2] - reason = array[lastItem].chomp - testSuiteVerify(array[@className]) - printf "%-40s IGNORED\n", testName - - if testName.start_with? "TEST(" - array2 = testName.split(" ") - @testSuite = array2[0].sub("TEST(", "") - @testSuite = @testSuite.sub(",", "") - testName = array2[1].sub(")", "") - end - - if @xmlOut == true - @arrayList.push " " - @arrayList.push " " + reason + " " - @arrayList.push " " - end - end - -# Test was flagged as having failed so format the line - def testFailed(array) - lastItem = array.length - 1 - testName = array[lastItem - 2] - reason = array[lastItem].chomp + " at line: " + array[lastItem - 3] - testSuiteVerify(array[@className]) - printf "%-40s FAILED\n", testName - - if testName.start_with? "TEST(" - array2 = testName.split(" ") - @testSuite = array2[0].sub("TEST(", "") - @testSuite = @testSuite.sub(",", "") - testName = array2[1].sub(")", "") - end - - if @xmlOut == true - @arrayList.push " " - @arrayList.push " " + reason + " " - @arrayList.push " " - end - end - - -# Figure out what OS we are running on. For now we are assuming if it's not Windows it must -# be Unix based. - def detectOS() - myOS = RUBY_PLATFORM.split("-") - if myOS.size == 2 - if myOS[1] == "mingw32" - @className = 1 - else - @className = 0 - end - else - @className = 0 - end - - end - -# Main function used to parse the file that was captured. - def process(name) + else @testFlag = false - @arrayList = Array.new - - detectOS() - - puts "Parsing file: " + name - - - testPass = 0 - testFail = 0 - testIgnore = 0 - puts "" - puts "=================== RESULTS =====================" - puts "" - File.open(name).each do |line| - # Typical test lines look like this: - # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 - # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented - # /.c:115:test_tc5100_initCanVoidPtrs:PASS - # - # where path is different on Unix vs Windows devices (Windows leads with a drive letter) - lineArray = line.split(":") - lineSize = lineArray.size - # If we were able to split the line then we can look to see if any of our target words - # were found. Case is important. - if ((lineSize >= 4) || (line.start_with? "TEST(")) - # Determine if this test passed - if line.include? ":PASS" - testPassed(lineArray) - testPass += 1 - elsif line.include? ":FAIL:" - testFailed(lineArray) - testFail += 1 - elsif line.include? ":IGNORE:" - testIgnored(lineArray) - testIgnore += 1 - elsif line.start_with? "TEST(" - if line.include? " PASS" - lineArray = line.split(" ") - testPassedUnityFixture(lineArray) - testPass += 1 - end - # If none of the keywords are found there are no more tests for this suite so clear - # the test flag - else - @testFlag = false - end - else - @testFlag = false - end - end - puts "" - puts "=================== SUMMARY =====================" - puts "" - puts "Tests Passed : " + testPass.to_s - puts "Tests Failed : " + testFail.to_s - puts "Tests Ignored : " + testIgnore.to_s - @totalTests = testPass + testFail + testIgnore - if @xmlOut == true - heading = "" - @arrayList.insert(0, heading) - writeXmlOuput() - end + end + end + puts '' + puts '=================== SUMMARY =====================' + puts '' + puts 'Tests Passed : ' + testPass.to_s + puts 'Tests Failed : ' + testFail.to_s + puts 'Tests Ignored : ' + testIgnore.to_s + @totalTests = testPass + testFail + testIgnore + if @xmlOut == true + heading = '' + @arrayList.insert(0, heading) + writeXmlOuput + end # return result - end - + end end # If the command line has no values in, used a default value of Output.txt parseMyFile = ParseOutput.new -if ARGV.size >= 1 - ARGV.each do |a| - if a == "-xml" - parseMyFile.setXmlOutput(); - else - parseMyFile.process(a) - break - end +if ARGV.size >= 1 + ARGV.each do |a| + if a == '-xml' + parseMyFile.setXmlOutput + else + parseMyFile.process(a) + break end + end end diff --git a/auto/stylize_as_junit.rb b/auto/stylize_as_junit.rb index 27ac76d..0e8ed4b 100644 --- a/auto/stylize_as_junit.rb +++ b/auto/stylize_as_junit.rb @@ -12,7 +12,6 @@ require 'pp' VERSION = 1.0 class ArgvParser - # # Return a structure describing the options. # @@ -20,41 +19,41 @@ class ArgvParser # The options specified on the command line will be collected in *options*. # We set default values here. options = OpenStruct.new - options.results_dir = "." - options.root_path = "." - options.out_file = "results.xml" + options.results_dir = '.' + options.root_path = '.' + options.out_file = 'results.xml' opts = OptionParser.new do |opts| - opts.banner = "Usage: unity_to_junit.rb [options]" + opts.banner = 'Usage: unity_to_junit.rb [options]' - opts.separator "" - opts.separator "Specific options:" + opts.separator '' + opts.separator 'Specific options:' - opts.on("-r", "--results

", "Look for Unity Results files here.") do |results| - #puts "results #{results}" + opts.on('-r', '--results ', 'Look for Unity Results files here.') do |results| + # puts "results #{results}" options.results_dir = results end - opts.on("-p", "--root_path ", "Prepend this path to files in results.") do |root_path| + opts.on('-p', '--root_path ', 'Prepend this path to files in results.') do |root_path| options.root_path = root_path end - opts.on("-o", "--output ", "XML file to generate.") do |out_file| - #puts "out_file: #{out_file}" + opts.on('-o', '--output ', 'XML file to generate.') do |out_file| + # puts "out_file: #{out_file}" options.out_file = out_file end - opts.separator "" - opts.separator "Common options:" + opts.separator '' + opts.separator 'Common options:' # No argument, shows at tail. This will print an options summary. - opts.on_tail("-h", "--help", "Show this message") do + opts.on_tail('-h', '--help', 'Show this message') do puts opts exit end # Another typical switch to print the version. - opts.on_tail("--version", "Show version") do + opts.on_tail('--version', 'Show version') do puts "unity_to_junit.rb version #{VERSION}" exit end @@ -62,9 +61,8 @@ class ArgvParser opts.parse!(args) options - end # parse() - -end # class OptparseExample + end # parse() +end # class OptparseExample class UnityToJUnit include FileUtils::Verbose @@ -77,44 +75,44 @@ class UnityToJUnit def run # Clean up result file names - results = @targets.map {|target| target.gsub(/\\/,"/")} - #puts "Output File: #{@out_file}" - f = File.new(@out_file, "w") + results = @targets.map { |target| target.tr('\\', '/') } + # puts "Output File: #{@out_file}" + f = File.new(@out_file, 'w') write_xml_header(f) - write_suites_header( f ) + write_suites_header(f) results.each do |result_file| - lines = File.readlines(result_file).map { |line| line.chomp } - if lines.length == 0 + lines = File.readlines(result_file).map(&:chomp) + if lines.empty? raise "Empty test result file: #{result_file}" else result_output = get_details(result_file, lines) - tests,failures,ignored = parse_test_summary(lines) + tests, failures, ignored = parse_test_summary(lines) result_output[:counts][:total] = tests result_output[:counts][:failed] = failures result_output[:counts][:ignored] = ignored result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) end - #use line[0] from the test output to get the test_file path and name - test_file_str = lines[0].gsub("\\","/") - test_file_str = test_file_str.split(":") - test_file = if (test_file_str.length < 2) - result_file - else - test_file_str[0] + ':' + test_file_str[1] + # use line[0] from the test output to get the test_file path and name + test_file_str = lines[0].tr('\\', '/') + test_file_str = test_file_str.split(':') + test_file = if test_file_str.length < 2 + result_file + else + test_file_str[0] + ':' + test_file_str[1] end result_output[:source][:path] = File.dirname(test_file) result_output[:source][:file] = File.basename(test_file) # save result_output - @unit_name = File.basename(test_file, ".*") + @unit_name = File.basename(test_file, '.*') - write_suite_header( result_output[:counts], f) - write_failures( result_output, f ) - write_tests( result_output, f ) - write_ignored( result_output, f ) - write_suite_footer( f ) + write_suite_header(result_output[:counts], f) + write_failures(result_output, f) + write_tests(result_output, f) + write_ignored(result_output, f) + write_suite_footer(f) end - write_suites_footer( f ) + write_suites_footer(f) f.close end @@ -125,77 +123,83 @@ class UnityToJUnit def set_root_path(path) @root = path end + def set_out_file(filename) @out_file = filename end - def usage(err_msg=nil) + + def usage(err_msg = nil) puts "\nERROR: " puts err_msg if err_msg - puts "Usage: unity_to_junit.rb [options]" - puts "" - puts "Specific options:" - puts " -r, --results Look for Unity Results files here." - puts " -p, --root_path Prepend this path to files in results." - puts " -o, --output XML file to generate." - puts "" - puts "Common options:" - puts " -h, --help Show this message" - puts " --version Show version" + puts 'Usage: unity_to_junit.rb [options]' + puts '' + puts 'Specific options:' + puts ' -r, --results Look for Unity Results files here.' + puts ' -p, --root_path Prepend this path to files in results.' + puts ' -o, --output XML file to generate.' + puts '' + puts 'Common options:' + puts ' -h, --help Show this message' + puts ' --version Show version' exit 1 end protected - def get_details(result_file, lines) + + def get_details(_result_file, lines) results = get_results_structure lines.each do |line| - line = line.gsub("\\","/") - src_file,src_line,test_name,status,msg = line.split(/:/) - line_out = ((@root and (@root != 0)) ? "#{@root}#{line}" : line ).gsub(/\//, "\\") - case(status) - when 'IGNORE' then results[:ignores] << {:test => test_name, :line => src_line, :message => msg} - when 'FAIL' then results[:failures] << {:test => test_name, :line => src_line, :message => msg} - when 'PASS' then results[:successes] << {:test => test_name, :line => src_line, :message => msg} + line = line.tr('\\', '/') + src_file, src_line, test_name, status, msg = line.split(/:/) + line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\') + case status + when 'IGNORE' then results[:ignores] << { test: test_name, line: src_line, message: msg } + when 'FAIL' then results[:failures] << { test: test_name, line: src_line, message: msg } + when 'PASS' then results[:successes] << { test: test_name, line: src_line, message: msg } end end - return results + results end def parse_test_summary(summary) if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } - [$1.to_i,$2.to_i,$3.to_i] + [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] else raise "Couldn't parse test results: #{summary}" end end - def here; File.expand_path(File.dirname(__FILE__)); end + + def here + File.expand_path(File.dirname(__FILE__)) + end private def get_results_structure - return { - :source => {:path => '', :file => ''}, - :successes => [], - :failures => [], - :ignores => [], - :counts => {:total => 0, :passed => 0, :failed => 0, :ignored => 0}, - :stdout => [], + { + source: { path: '', file: '' }, + successes: [], + failures: [], + ignores: [], + counts: { total: 0, passed: 0, failed: 0, ignored: 0 }, + stdout: [] } end - def write_xml_header( stream ) + def write_xml_header(stream) stream.puts "" end - def write_suites_header( stream ) - stream.puts "" + def write_suites_header(stream) + stream.puts '' end - def write_suite_header( counts, stream ) + def write_suite_header(counts, stream) stream.puts "\t" end - def write_failures( results, stream ) + def write_failures(results, stream) result = results[:failures] result.each do |item| filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) @@ -206,7 +210,7 @@ class UnityToJUnit end end - def write_tests( results, stream ) + def write_tests(results, stream) result = results[:successes] result.each do |item| filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) @@ -214,7 +218,7 @@ class UnityToJUnit end end - def write_ignored( results, stream ) + def write_ignored(results, stream) result = results[:ignores] result.each do |item| filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) @@ -226,37 +230,37 @@ class UnityToJUnit end end - def write_suite_footer( stream ) + def write_suite_footer(stream) stream.puts "\t" end - def write_suites_footer( stream ) - stream.puts "" + def write_suites_footer(stream) + stream.puts '' end -end #UnityToJUnit +end # UnityToJUnit -if __FILE__ == $0 - #parse out the command options +if __FILE__ == $PROGRAM_NAME + # parse out the command options options = ArgvParser.parse(ARGV) - #create an instance to work with + # create an instance to work with utj = UnityToJUnit.new begin - #look in the specified or current directory for result files - targets = "#{options.results_dir.gsub(/\\/, '/')}**/*.test*" + # look in the specified or current directory for result files + targets = "#{options.results_dir.tr('\\', '/')}**/*.test*" results = Dir[targets] raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? utj.set_targets(results) - #set the root path + # set the root path utj.set_root_path(options.root_path) - #set the output XML file name - #puts "Output File from options: #{options.out_file}" + # set the output XML file name + # puts "Output File from options: #{options.out_file}" utj.set_out_file(options.out_file) - #run the summarizer + # run the summarizer puts utj.run rescue Exception => e utj.usage e.message diff --git a/auto/test_file_filter.rb b/auto/test_file_filter.rb index 3dbc26a..2067112 100644 --- a/auto/test_file_filter.rb +++ b/auto/test_file_filter.rb @@ -2,7 +2,7 @@ # Unity Project - A Test Framework for C # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams # [Released under MIT License. Please refer to license.txt for details] -# ========================================== +# ========================================== require'yaml' @@ -10,14 +10,15 @@ module RakefileHelpers class TestFileFilter def initialize(all_files = false) @all_files = all_files - if not @all_files == true + if @all_files != true if File.exist?('test_file_filter.yml') - filters = YAML.load_file( 'test_file_filter.yml' ) - @all_files, @only_files, @exclude_files = - filters[:all_files], filters[:only_files], filters[:exclude_files] + filters = YAML.load_file('test_file_filter.yml') + @all_files = filters[:all_files] + @only_files = filters[:only_files] + @exclude_files = filters[:exclude_files] end end - end + end attr_accessor :all_files, :only_files, :exclude_files end end diff --git a/auto/type_sanitizer.rb b/auto/type_sanitizer.rb index 7c2c0ac..dafb882 100644 --- a/auto/type_sanitizer.rb +++ b/auto/type_sanitizer.rb @@ -1,8 +1,6 @@ module TypeSanitizer - def self.sanitize_c_identifier(unsanitized) # convert filename to valid C identifier by replacing invalid chars with '_' - return unsanitized.gsub(/[-\/\\\.\,\s]/, "_") + unsanitized.gsub(/[-\/\\\.\,\s]/, '_') end - end diff --git a/auto/unity_test_summary.rb b/auto/unity_test_summary.rb index 8f992e5..8ae6702 100644 --- a/auto/unity_test_summary.rb +++ b/auto/unity_test_summary.rb @@ -4,7 +4,7 @@ # [Released under MIT License. Please refer to license.txt for details] # ========================================== -#!/usr/bin/ruby +# !/usr/bin/ruby # # unity_test_summary.rb # @@ -16,32 +16,30 @@ class UnityTestSummary attr_reader :report, :total_tests, :failures, :ignored - def initialize(opts = {}) + def initialize(_opts = {}) @report = '' @total_tests = 0 @failures = 0 @ignored = 0 - - end def run # Clean up result file names - results = @targets.map {|target| target.gsub(/\\/,'/')} + results = @targets.map { |target| target.tr('\\', '/') } # Dig through each result file, looking for details on pass/fail: failure_output = [] ignore_output = [] results.each do |result_file| - lines = File.readlines(result_file).map { |line| line.chomp } - if lines.length == 0 + lines = File.readlines(result_file).map(&:chomp) + if lines.empty? raise "Empty test result file: #{result_file}" else output = get_details(result_file, lines) failure_output << output[:failures] unless output[:failures].empty? ignore_output << output[:ignores] unless output[:ignores].empty? - tests,failures,ignored = parse_test_summary(lines) + tests, failures, ignored = parse_test_summary(lines) @total_tests += tests @failures += failures @ignored += ignored @@ -80,67 +78,68 @@ class UnityTestSummary @root = path end - def usage(err_msg=nil) + def usage(err_msg = nil) puts "\nERROR: " puts err_msg if err_msg puts "\nUsage: unity_test_summary.rb result_file_directory/ root_path/" - puts " result_file_directory - The location of your results files." - puts " Defaults to current directory if not specified." - puts " Should end in / if specified." - puts " root_path - Helpful for producing more verbose output if using relative paths." + puts ' result_file_directory - The location of your results files.' + puts ' Defaults to current directory if not specified.' + puts ' Should end in / if specified.' + puts ' root_path - Helpful for producing more verbose output if using relative paths.' exit 1 end protected - def get_details(result_file, lines) - results = { :failures => [], :ignores => [], :successes => [] } + def get_details(_result_file, lines) + results = { failures: [], ignores: [], successes: [] } lines.each do |line| - src_file,src_line,test_name,status,msg = line.split(/:/) - line_out = ((@root && (@root != 0)) ? "#{@root}#{line}" : line ).gsub(/\//, "\\") - case(status) - when 'IGNORE' then results[:ignores] << line_out - when 'FAIL' then results[:failures] << line_out - when 'PASS' then results[:successes] << line_out + src_file, src_line, test_name, status, msg = line.split(/:/) + line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\') + case status + when 'IGNORE' then results[:ignores] << line_out + when 'FAIL' then results[:failures] << line_out + when 'PASS' then results[:successes] << line_out end end - return results + results end def parse_test_summary(summary) if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } - [$1.to_i,$2.to_i,$3.to_i] + [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] else raise "Couldn't parse test results: #{summary}" end end - def here; File.expand_path(File.dirname(__FILE__)); end - + def here + File.expand_path(File.dirname(__FILE__)) + end end -if $0 == __FILE__ +if $PROGRAM_NAME == __FILE__ - #parse out the command options - opts, args = ARGV.partition {|v| v =~ /^--\w+/} - opts.map! {|v| v[2..-1].to_sym } + # parse out the command options + opts, args = ARGV.partition { |v| v =~ /^--\w+/ } + opts.map! { |v| v[2..-1].to_sym } - #create an instance to work with + # create an instance to work with uts = UnityTestSummary.new(opts) begin - #look in the specified or current directory for result files + # look in the specified or current directory for result files args[0] ||= './' - targets = "#{ARGV[0].gsub(/\\/, '/')}**/*.test*" + targets = "#{ARGV[0].tr('\\', '/')}**/*.test*" results = Dir[targets] raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? uts.set_targets(results) - #set the root path + # set the root path args[1] ||= Dir.pwd + '/' uts.set_root_path(ARGV[1]) - #run the summarizer + # run the summarizer puts uts.run rescue Exception => e uts.usage e.message diff --git a/examples/example_3/rakefile.rb b/examples/example_3/rakefile.rb index 9f1dbeb..becc614 100644 --- a/examples/example_3/rakefile.rb +++ b/examples/example_3/rakefile.rb @@ -3,41 +3,41 @@ UNITY_ROOT = File.expand_path(File.dirname(__FILE__)) + '/../..' require 'rake' require 'rake/clean' -require HERE+'rakefile_helper' +require HERE + 'rakefile_helper' TEMP_DIRS = [ - File.join(HERE, 'build') -] + File.join(HERE, 'build') +].freeze TEMP_DIRS.each do |dir| directory(dir) CLOBBER.include(dir) end -task :prepare_for_tests => TEMP_DIRS +task prepare_for_tests: TEMP_DIRS include RakefileHelpers # Load default configuration, for now -DEFAULT_CONFIG_FILE = 'target_gcc_32.yml' +DEFAULT_CONFIG_FILE = 'target_gcc_32.yml'.freeze configure_toolchain(DEFAULT_CONFIG_FILE) -task :unit => [:prepare_for_tests] do +task unit: [:prepare_for_tests] do run_tests get_unit_test_files end -desc "Generate test summary" +desc 'Generate test summary' task :summary do report_summary end -desc "Build and test Unity" -task :all => [:clean, :unit, :summary] -task :default => [:clobber, :all] -task :ci => [:default] -task :cruise => [:default] +desc 'Build and test Unity' +task all: %i(clean unit summary) +task default: %i(clobber all) +task ci: [:default] +task cruise: [:default] -desc "Load configuration" -task :config, :config_file do |t, args| +desc 'Load configuration' +task :config, :config_file do |_t, args| configure_toolchain(args[:config_file]) end diff --git a/examples/example_3/rakefile_helper.rb b/examples/example_3/rakefile_helper.rb index ed41d80..8f43708 100644 --- a/examples/example_3/rakefile_helper.rb +++ b/examples/example_3/rakefile_helper.rb @@ -1,23 +1,22 @@ require 'yaml' require 'fileutils' -require UNITY_ROOT+'/auto/unity_test_summary' -require UNITY_ROOT+'/auto/generate_test_runner' -require UNITY_ROOT+'/auto/colour_reporter' +require UNITY_ROOT + '/auto/unity_test_summary' +require UNITY_ROOT + '/auto/generate_test_runner' +require UNITY_ROOT + '/auto/colour_reporter' module RakefileHelpers - - C_EXTENSION = '.c' + C_EXTENSION = '.c'.freeze def load_configuration(config_file) $cfg_file = config_file - $cfg = YAML.load(File.read($cfg_file)) + $cfg = YAML.safe_load(File.read($cfg_file)) end def configure_clean CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? end - def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + def configure_toolchain(config_file = DEFAULT_CONFIG_FILE) config_file += '.yml' unless config_file =~ /\.yml$/ load_configuration(config_file) configure_clean @@ -25,14 +24,14 @@ module RakefileHelpers def get_unit_test_files path = $cfg['compiler']['unit_tests_path'] + 'Test*' + C_EXTENSION - path.gsub!(/\\/, '/') + path.tr!('\\', '/') FileList.new(path) end def get_local_include_dirs include_dirs = $cfg['compiler']['includes']['items'].dup - include_dirs.delete_if {|dir| dir.is_a?(Array)} - return include_dirs + include_dirs.delete_if { |dir| dir.is_a?(Array) } + include_dirs end def extract_headers(filename) @@ -40,40 +39,36 @@ module RakefileHelpers lines = File.readlines(filename) lines.each do |line| m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/) - if not m.nil? - includes << m[1] - end + includes << m[1] unless m.nil? end - return includes + includes end def find_source_file(header, paths) paths.each do |dir| src_file = dir + header.ext(C_EXTENSION) - if (File.exists?(src_file)) - return src_file - end + return src_file if File.exist?(src_file) end - return nil + nil end def tackit(strings) - if strings.is_a?(Array) - result = "\"#{strings.join}\"" - else - result = strings - end - return result + result = if strings.is_a?(Array) + "\"#{strings.join}\"" + else + strings + end + result end def squash(prefix, items) result = '' items.each { |item| result += " #{prefix}#{tackit(item)}" } - return result + result end def build_compiler_fields - command = tackit($cfg['compiler']['path']) + command = tackit($cfg['compiler']['path']) if $cfg['compiler']['defines']['items'].nil? defines = '' else @@ -82,87 +77,86 @@ module RakefileHelpers options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :defines => defines, :options => options, :includes => includes} + { command: command, defines: defines, options: options, includes: includes } end - def compile(file, defines=[]) + def compile(file, _defines = []) compiler = build_compiler_fields - cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " + + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " \ "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" execute(cmd_str + obj_file) - return obj_file + obj_file end def build_linker_fields - command = tackit($cfg['linker']['path']) - if $cfg['linker']['options'].nil? - options = '' - else - options = squash('', $cfg['linker']['options']) - end - if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) + command = tackit($cfg['linker']['path']) + options = if $cfg['linker']['options'].nil? + '' + else + squash('', $cfg['linker']['options']) + end + if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? includes = '' else includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) end includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :options => options, :includes => includes} + { command: command, options: options, includes: includes } end def link_it(exe_name, obj_list) linker = build_linker_fields cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + - (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + - $cfg['linker']['bin_files']['prefix'] + ' ' + - $cfg['linker']['bin_files']['destination'] + - exe_name + $cfg['linker']['bin_files']['extension'] + (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] execute(cmd_str) end def build_simulator_fields return nil if $cfg['simulator'].nil? - if $cfg['simulator']['path'].nil? - command = '' - else - command = (tackit($cfg['simulator']['path']) + ' ') - end - if $cfg['simulator']['pre_support'].nil? - pre_support = '' - else - pre_support = squash('', $cfg['simulator']['pre_support']) - end + command = if $cfg['simulator']['path'].nil? + '' + else + (tackit($cfg['simulator']['path']) + ' ') + end + pre_support = if $cfg['simulator']['pre_support'].nil? + '' + else + squash('', $cfg['simulator']['pre_support']) + end if $cfg['simulator']['post_support'].nil? post_support = '' else post_support = squash('', $cfg['simulator']['post_support']) end - return {:command => command, :pre_support => pre_support, :post_support => post_support} + { command: command, pre_support: pre_support, post_support: post_support } end - def execute(command_string, verbose=true, raise_on_fail=true) + def execute(command_string, verbose = true, raise_on_fail = true) report command_string output = `#{command_string}`.chomp - report(output) if (verbose && !output.nil? && (output.length > 0)) - if (($?.exitstatus != 0) and (raise_on_fail)) - raise "Command failed. (Returned #{$?.exitstatus})" + report(output) if verbose && !output.nil? && !output.empty? + if ($CHILD_STATUS.exitstatus != 0) && raise_on_fail + raise "Command failed. (Returned #{$CHILD_STATUS.exitstatus})" end - return output + output end def report_summary summary = UnityTestSummary.new summary.set_root_path(HERE) results_glob = "#{$cfg['compiler']['build_path']}*.test*" - results_glob.gsub!(/\\/, '/') + results_glob.tr!('\\', '/') results = Dir[results_glob] summary.set_targets(results) summary.run - fail_out "FAIL: There were failures" if (summary.failures > 0) + fail_out 'FAIL: There were failures' if summary.failures > 0 end def run_tests(test_files) - report 'Running system tests...' # Tack on TEST define for compiling unit tests @@ -181,9 +175,7 @@ module RakefileHelpers extract_headers(test).each do |header| # Compile corresponding source file if it exists src_file = find_source_file(header, include_dirs) - if !src_file.nil? - obj_list << compile(src_file, test_defines) - end + obj_list << compile(src_file, test_defines) unless src_file.nil? end # Build the test runner (generate if configured to do so) @@ -215,18 +207,17 @@ module RakefileHelpers end output = execute(cmd_str, true, false) test_results = $cfg['compiler']['build_path'] + test_base - if output.match(/OK$/m).nil? - test_results += '.testfail' - else - test_results += '.testpass' - end + test_results += if output.match(/OK$/m).nil? + '.testfail' + else + '.testpass' + end File.open(test_results, 'w') { |f| f.print output } end end def build_application(main) - - report "Building application..." + report 'Building application...' obj_list = [] load_configuration($cfg_file) @@ -236,9 +227,7 @@ module RakefileHelpers include_dirs = get_local_include_dirs extract_headers(main_path).each do |header| src_file = find_source_file(header, include_dirs) - if !src_file.nil? - obj_list << compile(src_file) - end + obj_list << compile(src_file) unless src_file.nil? end # Build the main source file @@ -251,8 +240,8 @@ module RakefileHelpers def fail_out(msg) puts msg - 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. + 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/extras/fixture/rakefile.rb b/extras/fixture/rakefile.rb index eb51d02..7603e57 100644 --- a/extras/fixture/rakefile.rb +++ b/extras/fixture/rakefile.rb @@ -12,34 +12,34 @@ require 'rake/testtask' require HERE + 'rakefile_helper' TEMP_DIRS = [ - File.join(HERE, 'build') -] + File.join(HERE, 'build') +].freeze TEMP_DIRS.each do |dir| directory(dir) CLOBBER.include(dir) end -task :prepare_for_tests => TEMP_DIRS +task prepare_for_tests: TEMP_DIRS include RakefileHelpers # Load default configuration, for now -DEFAULT_CONFIG_FILE = 'gcc_auto_stdint.yml' +DEFAULT_CONFIG_FILE = 'gcc_auto_stdint.yml'.freeze configure_toolchain(DEFAULT_CONFIG_FILE) -task :unit => [:prepare_for_tests] do +task unit: [:prepare_for_tests] do run_tests end -desc "Build and test Unity Framework" -task :all => [:clean, :unit] -task :default => [:clobber, :all] -task :ci => [:no_color, :default] -task :cruise => [:no_color, :default] +desc 'Build and test Unity Framework' +task all: %i(clean unit) +task default: %i(clobber all) +task ci: %i(no_color default) +task cruise: %i(no_color default) -desc "Load configuration" -task :config, :config_file do |t, args| +desc 'Load configuration' +task :config, :config_file do |_t, args| configure_toolchain(args[:config_file]) end diff --git a/extras/fixture/rakefile_helper.rb b/extras/fixture/rakefile_helper.rb index 85d714f..09b2d15 100644 --- a/extras/fixture/rakefile_helper.rb +++ b/extras/fixture/rakefile_helper.rb @@ -6,20 +6,19 @@ require 'yaml' require 'fileutils' -require HERE+'../../auto/unity_test_summary' -require HERE+'../../auto/generate_test_runner' -require HERE+'../../auto/colour_reporter' +require HERE + '../../auto/unity_test_summary' +require HERE + '../../auto/generate_test_runner' +require HERE + '../../auto/colour_reporter' module RakefileHelpers - - C_EXTENSION = '.c' + C_EXTENSION = '.c'.freeze def load_configuration(config_file) - unless ($configured) - $cfg_file = HERE+"../../test/targets/#{config_file}" unless (config_file =~ /[\\|\/]/) - $cfg = YAML.load(File.read($cfg_file)) + unless $configured + $cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/ + $cfg = YAML.safe_load(File.read($cfg_file)) $colour_output = false unless $cfg['colour'] - $configured = true if (config_file != DEFAULT_CONFIG_FILE) + $configured = true if config_file != DEFAULT_CONFIG_FILE end end @@ -27,7 +26,7 @@ module RakefileHelpers CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? end - def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + def configure_toolchain(config_file = DEFAULT_CONFIG_FILE) config_file += '.yml' unless config_file =~ /\.yml$/ config_file = config_file unless config_file =~ /[\\|\/]/ load_configuration(config_file) @@ -35,22 +34,22 @@ module RakefileHelpers end def tackit(strings) - if strings.is_a?(Array) - result = "\"#{strings.join}\"" - else - result = strings - end - return result + result = if strings.is_a?(Array) + "\"#{strings.join}\"" + else + strings + end + result end def squash(prefix, items) result = '' items.each { |item| result += " #{prefix}#{tackit(item)}" } - return result + result end def build_compiler_fields - command = tackit($cfg['compiler']['path']) + command = tackit($cfg['compiler']['path']) if $cfg['compiler']['defines']['items'].nil? defines = '' else @@ -59,79 +58,77 @@ module RakefileHelpers options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :defines => defines, :options => options, :includes => includes} + { command: command, defines: defines, options: options, includes: includes } end - def compile(file, defines=[]) + def compile(file, _defines = []) compiler = build_compiler_fields - unity_include = $cfg['compiler']['includes']['prefix']+'../../src' - cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{unity_include} #{file} " + - "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" + - "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" + unity_include = $cfg['compiler']['includes']['prefix'] + '../../src' + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{unity_include} #{file} " \ + "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" \ + "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" execute(cmd_str) end def build_linker_fields - command = tackit($cfg['linker']['path']) - if $cfg['linker']['options'].nil? - options = '' - else - options = squash('', $cfg['linker']['options']) - end - if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) + command = tackit($cfg['linker']['path']) + options = if $cfg['linker']['options'].nil? + '' + else + squash('', $cfg['linker']['options']) + end + if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? includes = '' else includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) end includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :options => options, :includes => includes} + { command: command, options: options, includes: includes } end def link_it(exe_name, obj_list) linker = build_linker_fields cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + - (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + - $cfg['linker']['bin_files']['prefix'] + ' ' + - $cfg['linker']['bin_files']['destination'] + - exe_name + $cfg['linker']['bin_files']['extension'] + (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] execute(cmd_str) end def build_simulator_fields return nil if $cfg['simulator'].nil? - if $cfg['simulator']['path'].nil? - command = '' - else - command = (tackit($cfg['simulator']['path']) + ' ') - end - if $cfg['simulator']['pre_support'].nil? - pre_support = '' - else - pre_support = squash('', $cfg['simulator']['pre_support']) - end + command = if $cfg['simulator']['path'].nil? + '' + else + (tackit($cfg['simulator']['path']) + ' ') + end + pre_support = if $cfg['simulator']['pre_support'].nil? + '' + else + squash('', $cfg['simulator']['pre_support']) + end if $cfg['simulator']['post_support'].nil? post_support = '' else post_support = squash('', $cfg['simulator']['post_support']) end - return {:command => command, :pre_support => pre_support, :post_support => post_support} + { command: command, pre_support: pre_support, post_support: post_support } end - def execute(command_string, verbose=true) + def execute(command_string, verbose = true) report command_string output = `#{command_string}`.chomp - report(output) if (verbose && !output.nil? && (output.length > 0)) - if ($?.exitstatus != 0) - raise "Command failed. (Returned #{$?.exitstatus})" - end - return output + report(output) if verbose && !output.nil? && !output.empty? + raise "Command failed. (Returned #{$CHILD_STATUS.exitstatus})" if $CHILD_STATUS.exitstatus != 0 + output end def report_summary summary = UnityTestSummary.new summary.set_root_path(HERE) results_glob = "#{$cfg['compiler']['build_path']}*.test*" - results_glob.gsub!(/\\/, '/') + results_glob.tr!('\\', '/') results = Dir[results_glob] summary.set_targets(results) summary.run @@ -146,34 +143,34 @@ module RakefileHelpers $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? # Get a list of all source files needed - src_files = Dir[HERE+'src/*.c'] - src_files += Dir[HERE+'test/*.c'] - src_files += Dir[HERE+'test/main/*.c'] + src_files = Dir[HERE + 'src/*.c'] + src_files += Dir[HERE + 'test/*.c'] + src_files += Dir[HERE + 'test/main/*.c'] src_files << '../../src/unity.c' # Build object files src_files.each { |f| compile(f, test_defines) } - obj_list = src_files.map {|f| File.basename(f.ext($cfg['compiler']['object_files']['extension'])) } + obj_list = src_files.map { |f| File.basename(f.ext($cfg['compiler']['object_files']['extension'])) } # Link the test executable - test_base = "framework_test" + test_base = 'framework_test' link_it(test_base, obj_list) # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] if simulator.nil? - cmd_str = executable + " -v -r" + cmd_str = executable + ' -v -r' else cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" end output = execute(cmd_str) test_results = $cfg['compiler']['build_path'] + test_base - if output.match(/OK$/m).nil? - test_results += '.testfail' - else - test_results += '.testpass' - end + test_results += if output.match(/OK$/m).nil? + '.testfail' + else + '.testpass' + end File.open(test_results, 'w') { |f| f.print output } end end diff --git a/test/.rubocop.yml b/test/.rubocop.yml new file mode 100644 index 0000000..f43d36e --- /dev/null +++ b/test/.rubocop.yml @@ -0,0 +1,6 @@ +# This is the configuration used to check the rubocop source code. + +inherit_from: .rubocop_todo.yml + +AllCops: + TargetRubyVersion: 2.1 diff --git a/test/.rubocop_todo.yml b/test/.rubocop_todo.yml new file mode 100644 index 0000000..3292c64 --- /dev/null +++ b/test/.rubocop_todo.yml @@ -0,0 +1,510 @@ +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2017-03-28 08:23:05 -0400 using RuboCop version 0.48.0. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 2 +Lint/AmbiguousBlockAssociation: + Exclude: + - '../auto/generate_module.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +Lint/DeprecatedClassMethods: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 7 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyleAlignWith, SupportedStylesAlignWith, AutoCorrect. +# SupportedStylesAlignWith: keyword, variable, start_of_line +Lint/EndAlignment: + Exclude: + - '../auto/colour_prompt.rb' + - '../auto/colour_reporter.rb' + - '../auto/generate_module.rb' + - '../auto/parseOutput.rb' + - '../auto/stylize_as_junit.rb' + +# Offense count: 2 +Lint/RescueException: + Exclude: + - '../auto/stylize_as_junit.rb' + - '../auto/unity_test_summary.rb' + +# Offense count: 2 +Lint/ShadowingOuterLocalVariable: + Exclude: + - '../auto/generate_module.rb' + - '../auto/stylize_as_junit.rb' + +# Offense count: 3 +# Cop supports --auto-correct. +Lint/StringConversionInInterpolation: + Exclude: + - 'tests/test_generate_test_runner.rb' + +# Offense count: 13 +Lint/UselessAssignment: + Exclude: + - '../auto/generate_test_runner.rb' + - '../auto/stylize_as_junit.rb' + - '../auto/unity_test_summary.rb' + - 'rakefile_helper.rb' + +# Offense count: 5 +Lint/Void: + Exclude: + - '../auto/parseOutput.rb' + +# Offense count: 45 +Metrics/AbcSize: + Max: 80 + +# Offense count: 6 +# Configuration parameters: CountComments, ExcludedMethods. +Metrics/BlockLength: + Max: 89 + +# Offense count: 4 +# Configuration parameters: CountComments. +Metrics/ClassLength: + Max: 341 + +# Offense count: 14 +Metrics/CyclomaticComplexity: + Max: 17 + +# Offense count: 226 +# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. +# URISchemes: http, https +Metrics/LineLength: + Max: 154 + +# Offense count: 39 +# Configuration parameters: CountComments. +Metrics/MethodLength: + Max: 58 + +# Offense count: 3 +# Configuration parameters: CountComments. +Metrics/ModuleLength: + Max: 204 + +# Offense count: 13 +Metrics/PerceivedComplexity: + Max: 19 + +# Offense count: 2 +# Cop supports --auto-correct. +Performance/StringReplacement: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +Security/YAMLLoad: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 10 +Style/AccessorMethodName: + Exclude: + - '../auto/stylize_as_junit.rb' + - '../auto/unity_test_summary.rb' + - '../examples/example_3/rakefile_helper.rb' + - 'rakefile_helper.rb' + +# Offense count: 2 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods. +# SupportedStyles: line_count_based, semantic, braces_for_chaining +# ProceduralMethods: benchmark, bm, bmbm, create, each_with_object, measure, new, realtime, tap, with_object +# FunctionalMethods: let, let!, subject, watch +# IgnoredMethods: lambda, proc, it +Style/BlockDelimiters: + Exclude: + - 'spec/generate_module_existing_file_spec.rb' + +# Offense count: 4 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, SingleLineConditionsOnly, IncludeTernaryExpressions. +# SupportedStyles: assign_to_condition, assign_inside_condition +Style/ConditionalAssignment: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 12 +Style/Documentation: + Exclude: + - 'spec/**/*' + - 'test/**/*' + - '../auto/colour_prompt.rb' + - '../auto/generate_module.rb' + - '../auto/generate_test_runner.rb' + - '../auto/parseOutput.rb' + - '../auto/stylize_as_junit.rb' + - '../auto/test_file_filter.rb' + - '../auto/type_sanitizer.rb' + - '../auto/unity_test_summary.rb' + - '../examples/example_3/rakefile_helper.rb' + - '../extras/fixture/rakefile_helper.rb' + - 'rakefile_helper.rb' + +# Offense count: 2 +# Cop supports --auto-correct. +Style/ElseAlignment: + Exclude: + - '../auto/generate_test_runner.rb' + +# Offense count: 3 +# Cop supports --auto-correct. +Style/EmptyLines: + Exclude: + - 'tests/test_generate_test_runner.rb' + +# Offense count: 4 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: empty_lines, no_empty_lines +Style/EmptyLinesAroundBlockBody: + Exclude: + - 'rakefile_helper.rb' + - 'spec/generate_module_existing_file_spec.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines +Style/EmptyLinesAroundModuleBody: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 14 +# Cop supports --auto-correct. +# Configuration parameters: AllowForAlignment, ForceEqualSignAlignment. +Style/ExtraSpacing: + Exclude: + - '../auto/generate_test_runner.rb' + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 1 +# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms. +# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS +Style/FileName: + Exclude: + - '../auto/parseOutput.rb' + +# Offense count: 4 +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: format, sprintf, percent +Style/FormatString: + Exclude: + - '../auto/generate_module.rb' + +# Offense count: 164 +# Configuration parameters: AllowedVariables. +Style/GlobalVars: + Exclude: + - '../auto/colour_reporter.rb' + - '../examples/example_3/rakefile_helper.rb' + - '../extras/fixture/rakefile.rb' + - '../extras/fixture/rakefile_helper.rb' + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 20 +# Configuration parameters: MinBodyLength. +Style/GuardClause: + Exclude: + - '../auto/colour_prompt.rb' + - '../auto/generate_test_runner.rb' + - '../auto/parseOutput.rb' + - '../auto/stylize_as_junit.rb' + - '../auto/test_file_filter.rb' + - '../auto/unity_test_summary.rb' + - '../extras/fixture/rakefile_helper.rb' + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 630 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols. +# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys +Style/HashSyntax: + Exclude: + - 'rakefile_helper.rb' + - 'spec/generate_module_existing_file_spec.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 3 +# Cop supports --auto-correct. +# Configuration parameters: MaxLineLength. +Style/IfUnlessModifier: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: IndentationWidth. +Style/IndentAssignment: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 5 +# Cop supports --auto-correct. +# Configuration parameters: Width, IgnoredPatterns. +Style/IndentationWidth: + Exclude: + - '../auto/generate_test_runner.rb' + - 'spec/generate_module_existing_file_spec.rb' + +# Offense count: 17 +# Cop supports --auto-correct. +Style/LeadingCommentSpace: + Exclude: + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +Style/LineEndConcatenation: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 8 +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: snake_case, camelCase +Style/MethodName: + Exclude: + - '../auto/parseOutput.rb' + +# Offense count: 40 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: symmetrical, new_line, same_line +Style/MultilineArrayBraceLayout: + Exclude: + - 'tests/test_generate_test_runner.rb' + +# Offense count: 63 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: symmetrical, new_line, same_line +Style/MultilineHashBraceLayout: + Exclude: + - 'tests/test_generate_test_runner.rb' + +# Offense count: 4 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth. +# SupportedStyles: aligned, indented +Style/MultilineOperationIndentation: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 3 +# Cop supports --auto-correct. +Style/MutableConstant: + Exclude: + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 4 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: both, prefix, postfix +Style/NegatedIf: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +Style/Not: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 2 +# Cop supports --auto-correct. +# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles. +# SupportedStyles: predicate, comparison +Style/NumericPredicate: + Exclude: + - 'spec/**/*' + - '../auto/colour_reporter.rb' + - '../auto/generate_module.rb' + +# Offense count: 17 +# Cop supports --auto-correct. +# Configuration parameters: AllowSafeAssignment. +Style/ParenthesesAroundCondition: + Exclude: + - '../auto/generate_test_runner.rb' + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 7 +# Cop supports --auto-correct. +Style/RedundantParentheses: + Exclude: + - '../auto/generate_test_runner.rb' + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 13 +# Cop supports --auto-correct. +# Configuration parameters: AllowMultipleReturnValues. +Style/RedundantReturn: + Exclude: + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 13 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes. +# SupportedStyles: slashes, percent_r, mixed +Style/RegexpLiteral: + Exclude: + - '../auto/generate_test_runner.rb' + - '../auto/stylize_as_junit.rb' + - '../auto/type_sanitizer.rb' + - '../auto/unity_test_summary.rb' + - '../extras/fixture/rakefile_helper.rb' + - 'rakefile_helper.rb' + +# Offense count: 4 +# Cop supports --auto-correct. +# Configuration parameters: AllowAsExpressionSeparator. +Style/Semicolon: + Exclude: + - '../auto/generate_test_runner.rb' + +# Offense count: 5 +# Cop supports --auto-correct. +Style/SpaceAfterComma: + Exclude: + - 'tests/test_generate_test_runner.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyleInsidePipes, SupportedStylesInsidePipes. +# SupportedStylesInsidePipes: space, no_space +Style/SpaceAroundBlockParameters: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 3 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: space, no_space +Style/SpaceAroundEqualsInParameterDefault: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 3 +# Cop supports --auto-correct. +# Configuration parameters: AllowForAlignment. +Style/SpaceAroundOperators: + Exclude: + - 'rakefile_helper.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: space, no_space +Style/SpaceBeforeBlockBraces: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 13 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces, SpaceBeforeBlockParameters. +# SupportedStyles: space, no_space +# SupportedStylesForEmptyBraces: space, no_space +Style/SpaceInsideBlockBraces: + Exclude: + - 'rakefile_helper.rb' + - 'spec/generate_module_existing_file_spec.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 295 +# Cop supports --auto-correct. +Style/SpaceInsideBrackets: + Exclude: + - 'tests/test_generate_test_runner.rb' + +# Offense count: 6 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces. +# SupportedStyles: space, no_space, compact +# SupportedStylesForEmptyBraces: space, no_space +Style/SpaceInsideHashLiteralBraces: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 5 +# Cop supports --auto-correct. +Style/SpaceInsideParens: + Exclude: + - 'tests/test_generate_test_runner.rb' + +# Offense count: 2 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: use_perl_names, use_english_names +Style/SpecialGlobalVars: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 167 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, ConsistentQuotesInMultiline. +# SupportedStyles: single_quotes, double_quotes +Style/StringLiterals: + Exclude: + - 'rakefile_helper.rb' + - 'spec/generate_module_existing_file_spec.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, AllowSafeAssignment. +# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex +Style/TernaryParentheses: + Exclude: + - 'rakefile_helper.rb' + +# Offense count: 152 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline. +# SupportedStylesForMultiline: comma, consistent_comma, no_comma +Style/TrailingCommaInLiteral: + Exclude: + - 'spec/generate_module_existing_file_spec.rb' + - 'tests/test_generate_test_runner.rb' + +# Offense count: 39 +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: snake_case, camelCase +Style/VariableName: + Exclude: + - '../auto/parseOutput.rb' + +# Offense count: 69 +# Cop supports --auto-correct. +# Configuration parameters: SupportedStyles, WordRegex. +# SupportedStyles: percent, brackets +Style/WordArray: + EnforcedStyle: percent + MinSize: 12 + +# Offense count: 1 +# Cop supports --auto-correct. +Style/ZeroLengthPredicate: + Exclude: + - 'rakefile_helper.rb' diff --git a/test/rakefile b/test/rakefile index 000ab00..55323af 100644 --- a/test/rakefile +++ b/test/rakefile @@ -53,7 +53,7 @@ task :summary do end desc "Build and test Unity" -task :all => [:clean, :prepare_for_tests, :scripts, :unit, :summary] +task :all => [:clean, :prepare_for_tests, :scripts, :unit, :style, :summary] task :default => [:clobber, :all] task :ci => [:no_color, :default] task :cruise => [:no_color, :default] @@ -70,3 +70,25 @@ end task :verbose do $verbose = true end + +namespace :style do + desc "Check style" + task :check do + `rubocop ../` + report "Style Checked." + end + + desc "Attempt to Autocorrect style" + task :auto do + `rubocop ../ --auto-correct` + report "Autocorrected What We Could." + end + + desc "Update style todo list" + task :todo do + `rubocop ../ --auto-gen-config` + report "Updated Style TODO List." + end +end + +task :style => ['style:check'] diff --git a/test/tests/test_generate_test_runner.rb b/test/tests/test_generate_test_runner.rb index 55a64c0..a3536d3 100644 --- a/test/tests/test_generate_test_runner.rb +++ b/test/tests/test_generate_test_runner.rb @@ -1170,11 +1170,11 @@ def runner_test(test, runner, expected, test_defines, cmdline_args) simulator = build_simulator_fields cmdline_args ||= "" executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] + " #{cmdline_args}" - if simulator.nil? - cmd_str = executable - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str, true) #compare to the expected pass/fail From 3a6cca39c5406aa72dcdcb403a209b684f0d4a4b Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 28 Mar 2017 08:52:10 -0400 Subject: [PATCH 088/157] =?UTF-8?q?Fixed=20things=20that=20the=20stylizer?= =?UTF-8?q?=20=E2=80=9Cautocorrected=E2=80=9D=20to=20wrong.=20;)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/example_3/rakefile_helper.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/example_3/rakefile_helper.rb b/examples/example_3/rakefile_helper.rb index 8f43708..d51cef7 100644 --- a/examples/example_3/rakefile_helper.rb +++ b/examples/example_3/rakefile_helper.rb @@ -9,7 +9,7 @@ module RakefileHelpers def load_configuration(config_file) $cfg_file = config_file - $cfg = YAML.safe_load(File.read($cfg_file)) + $cfg = YAML.load(File.read($cfg_file)) end def configure_clean @@ -139,8 +139,8 @@ module RakefileHelpers report command_string output = `#{command_string}`.chomp report(output) if verbose && !output.nil? && !output.empty? - if ($CHILD_STATUS.exitstatus != 0) && raise_on_fail - raise "Command failed. (Returned #{$CHILD_STATUS.exitstatus})" + if ($?.exitstatus != 0) && raise_on_fail + raise "Command failed. (Returned #{$?.exitstatus})" end output end From 23f9c16aaabe3cc9312306f68563aa5ac1377fc4 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 28 Mar 2017 08:59:58 -0400 Subject: [PATCH 089/157] =?UTF-8?q?Another=20round=20of=20fixing=20things?= =?UTF-8?q?=20that=20the=20stylizer=20=E2=80=9Ccorrected=E2=80=9D=20for=20?= =?UTF-8?q?me.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extras/fixture/rakefile_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/fixture/rakefile_helper.rb b/extras/fixture/rakefile_helper.rb index 09b2d15..de753b1 100644 --- a/extras/fixture/rakefile_helper.rb +++ b/extras/fixture/rakefile_helper.rb @@ -16,7 +16,7 @@ module RakefileHelpers def load_configuration(config_file) unless $configured $cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/ - $cfg = YAML.safe_load(File.read($cfg_file)) + $cfg = YAML.load(File.read($cfg_file)) $colour_output = false unless $cfg['colour'] $configured = true if config_file != DEFAULT_CONFIG_FILE end @@ -120,7 +120,7 @@ module RakefileHelpers report command_string output = `#{command_string}`.chomp report(output) if verbose && !output.nil? && !output.empty? - raise "Command failed. (Returned #{$CHILD_STATUS.exitstatus})" if $CHILD_STATUS.exitstatus != 0 + raise "Command failed. (Returned #{$?.exitstatus})" if $?.exitstatus != 0 output end From 3e0a7121fb13ced285c2fbdb3ef2cf1ee5181f99 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 28 Mar 2017 15:48:28 -0400 Subject: [PATCH 090/157] Started to flesh out rubocop settings for this project. Added rakefile tasks to do so. Updated first script to make it compliant. --- auto/generate_module.rb | 54 ++++++++++++++++---------- test/.rubocop.yml | 48 +++++++++++++++++++++++ test/.rubocop_todo.yml | 85 +++++------------------------------------ test/rakefile | 17 +++++++-- 4 files changed, 105 insertions(+), 99 deletions(-) diff --git a/auto/generate_module.rb b/auto/generate_module.rb index 560612b..ade4f1a 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -64,26 +64,40 @@ class UnityModuleGenerator @options[:path_tst] += '/' unless @options[:path_tst][-1] == 47 # Built in patterns - @patterns = { 'src' => { '' => { inc: [] } }, - 'test' => { '' => { inc: [] } }, - 'dh' => { 'Driver' => { inc: [create_filename('%1$s', 'Hardware.h')] }, - 'Hardware' => { inc: [] } }, - '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: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'Hardware.h')] }, - 'Hardware' => { inc: [] } }, - 'mvp' => { 'Model' => { inc: [] }, - 'Presenter' => { inc: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'View.h')] }, - 'View' => { inc: [] } } } + @patterns = { + 'src' => { + '' => { inc: [] } + }, + 'test' => { + '' => { inc: [] } + }, + 'dh' => { + 'Driver' => { inc: [create_filename('%1$s', 'Hardware.h')] }, + 'Hardware' => { inc: [] } + }, + '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: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'Hardware.h')] }, + 'Hardware' => { inc: [] } + }, + 'mvp' => { + 'Model' => { inc: [] }, + 'Presenter' => { inc: [create_filename('%1$s', 'Model.h'), create_filename('%1$s', 'View.h')] }, + 'View' => { inc: [] } + } + } end ############################ def self.default_options { pattern: 'src', - includes: { + includes: { src: [], inc: [], tst: [] @@ -139,10 +153,10 @@ class UnityModuleGenerator 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 :src then (@options[:includes][:src] || []) | (pattern_traits[:inc].map { |f| format(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 + when :tst then (@options[:includes][:tst] || []) | (pattern_traits[:inc].map { |f| format("#{@options[:mock_prefix]}#{f}", module_name) }) + end } end end @@ -194,12 +208,12 @@ class UnityModuleGenerator File.open(file[:path], 'w') do |f| 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[:includes].map { |ff| "#include \"#{ff}\"\n" }.join, file[:name].upcase]) end if @options[:update_svn] `svn add \"#{file[:path]}\"` - if $CHILD_STATUS.exitstatus == 0 + if $!.exitstatus.zero? puts "File #{file[:path]} created and added to source control" else puts "File #{file[:path]} created but FAILED adding to source control!" @@ -233,7 +247,7 @@ end ############################ # Handle As Command Line If Called That Way -if $PROGRAM_NAME == __FILE__ +if $0 == __FILE__ destroy = false options = {} module_name = nil diff --git a/test/.rubocop.yml b/test/.rubocop.yml index f43d36e..e8d89b2 100644 --- a/test/.rubocop.yml +++ b/test/.rubocop.yml @@ -4,3 +4,51 @@ inherit_from: .rubocop_todo.yml AllCops: TargetRubyVersion: 2.1 + +# These are areas where ThrowTheSwitch's coding style diverges from the Ruby standard +# (Maybe we will make these conform over time) +Style/SpecialGlobalVars: + SupportedStyles: + - use_perl_names + - use_english_names + EnforcedStyle: use_perl_names +Style/FormatString: + Enabled: false + +# This is disabled because it seems to get confused over nested hashes +Style/AlignHash: + Enabled: false + EnforcedHashRocketStyle: table + EnforcedColonStyle: table + +# We purposefully use these insecure features because they're what makes Ruby awesome +Security/Eval: + Enabled: false +Security/YAMLLoad: + Enabled: false + +# At this point, we're not ready to enforce inline documentation requirements +Style/Documentation: + Enabled: false +Style/DocumentationMethod: + Enabled: false + +# At this point, we're not ready to enforce any metrics +Metrics/AbcSize: + Enabled: false +Metrics/BlockLength: + Enabled: false +Metrics/BlockNesting: + Enabled: false +Metrics/ClassLength: + Enabled: false +Metrics/CyclomaticComplexity: + Enabled: false +Metrics/LineLength: + Enabled: false +Metrics/MethodLength: + Enabled: false +Metrics/ParameterLists: + Enabled: false +Metrics/PerceivedComplexity: + Enabled: false diff --git a/test/.rubocop_todo.yml b/test/.rubocop_todo.yml index 3292c64..dd4bf87 100644 --- a/test/.rubocop_todo.yml +++ b/test/.rubocop_todo.yml @@ -1,23 +1,18 @@ # This configuration was generated by # `rubocop --auto-gen-config` -# on 2017-03-28 08:23:05 -0400 using RuboCop version 0.48.0. +# on 2017-03-28 15:45:51 -0400 using RuboCop version 0.48.0. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 2 -Lint/AmbiguousBlockAssociation: - Exclude: - - '../auto/generate_module.rb' - # Offense count: 1 # Cop supports --auto-correct. Lint/DeprecatedClassMethods: Exclude: - 'rakefile_helper.rb' -# Offense count: 7 +# Offense count: 6 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyleAlignWith, SupportedStylesAlignWith, AutoCorrect. # SupportedStylesAlignWith: keyword, variable, start_of_line @@ -25,7 +20,6 @@ Lint/EndAlignment: Exclude: - '../auto/colour_prompt.rb' - '../auto/colour_reporter.rb' - - '../auto/generate_module.rb' - '../auto/parseOutput.rb' - '../auto/stylize_as_junit.rb' @@ -35,10 +29,9 @@ Lint/RescueException: - '../auto/stylize_as_junit.rb' - '../auto/unity_test_summary.rb' -# Offense count: 2 +# Offense count: 1 Lint/ShadowingOuterLocalVariable: Exclude: - - '../auto/generate_module.rb' - '../auto/stylize_as_junit.rb' # Offense count: 3 @@ -60,56 +53,17 @@ Lint/Void: Exclude: - '../auto/parseOutput.rb' -# Offense count: 45 -Metrics/AbcSize: - Max: 80 - -# Offense count: 6 -# Configuration parameters: CountComments, ExcludedMethods. -Metrics/BlockLength: - Max: 89 - -# Offense count: 4 -# Configuration parameters: CountComments. -Metrics/ClassLength: - Max: 341 - -# Offense count: 14 -Metrics/CyclomaticComplexity: - Max: 17 - -# Offense count: 226 -# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. -# URISchemes: http, https -Metrics/LineLength: - Max: 154 - -# Offense count: 39 -# Configuration parameters: CountComments. -Metrics/MethodLength: - Max: 58 - # Offense count: 3 # Configuration parameters: CountComments. Metrics/ModuleLength: Max: 204 -# Offense count: 13 -Metrics/PerceivedComplexity: - Max: 19 - # Offense count: 2 # Cop supports --auto-correct. Performance/StringReplacement: Exclude: - 'rakefile_helper.rb' -# Offense count: 1 -# Cop supports --auto-correct. -Security/YAMLLoad: - Exclude: - - 'rakefile_helper.rb' - # Offense count: 10 Style/AccessorMethodName: Exclude: @@ -129,27 +83,12 @@ Style/BlockDelimiters: Exclude: - 'spec/generate_module_existing_file_spec.rb' -# Offense count: 4 +# Offense count: 17 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyle, SupportedStyles, SingleLineConditionsOnly, IncludeTernaryExpressions. # SupportedStyles: assign_to_condition, assign_inside_condition Style/ConditionalAssignment: Exclude: - - 'rakefile_helper.rb' - -# Offense count: 12 -Style/Documentation: - Exclude: - - 'spec/**/*' - - 'test/**/*' - - '../auto/colour_prompt.rb' - - '../auto/generate_module.rb' - - '../auto/generate_test_runner.rb' - - '../auto/parseOutput.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/test_file_filter.rb' - - '../auto/type_sanitizer.rb' - - '../auto/unity_test_summary.rb' - '../examples/example_3/rakefile_helper.rb' - '../extras/fixture/rakefile_helper.rb' - 'rakefile_helper.rb' @@ -199,13 +138,6 @@ Style/FileName: Exclude: - '../auto/parseOutput.rb' -# Offense count: 4 -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: format, sprintf, percent -Style/FormatString: - Exclude: - - '../auto/generate_module.rb' - # Offense count: 164 # Configuration parameters: AllowedVariables. Style/GlobalVars: @@ -328,7 +260,7 @@ Style/Not: Exclude: - 'rakefile_helper.rb' -# Offense count: 2 +# Offense count: 1 # Cop supports --auto-correct. # Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles. # SupportedStyles: predicate, comparison @@ -336,7 +268,6 @@ Style/NumericPredicate: Exclude: - 'spec/**/*' - '../auto/colour_reporter.rb' - - '../auto/generate_module.rb' # Offense count: 17 # Cop supports --auto-correct. @@ -453,13 +384,15 @@ Style/SpaceInsideParens: Exclude: - 'tests/test_generate_test_runner.rb' -# Offense count: 2 +# Offense count: 3 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyle, SupportedStyles. # SupportedStyles: use_perl_names, use_english_names Style/SpecialGlobalVars: Exclude: - - 'rakefile_helper.rb' + - '../auto/generate_test_runner.rb' + - '../auto/stylize_as_junit.rb' + - '../auto/unity_test_summary.rb' # Offense count: 167 # Cop supports --auto-correct. diff --git a/test/rakefile b/test/rakefile index 55323af..33c36f8 100644 --- a/test/rakefile +++ b/test/rakefile @@ -74,19 +74,30 @@ end namespace :style do desc "Check style" task :check do - `rubocop ../` + report execute("rubocop ../ --config .rubocop.yml", true) report "Style Checked." end + namespace :check do + Dir['../**/*.rb'].each do |f| + task File.basename(f, '.rb').to_sym do + report execute("rubocop #{f} --color --config .rubocop.yml", true) + report "Style Checked." + end + end + end + desc "Attempt to Autocorrect style" task :auto do - `rubocop ../ --auto-correct` + File.delete(".rubocop_todo.yml") + execute("rubocop ../ --auto-correct --config .rubocop.yml") report "Autocorrected What We Could." end desc "Update style todo list" task :todo do - `rubocop ../ --auto-gen-config` + File.delete(".rubocop_todo.yml") + execute("rubocop ../ --auto-gen-config --config .rubocop.yml") report "Updated Style TODO List." end end From 2a5b24f7bf39d81ca6ef3193582575c1b1d84551 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 28 Mar 2017 20:02:53 -0400 Subject: [PATCH 091/157] Finished updating all Ruby scripts to match our coding standard. Woo! --- auto/colour_prompt.rb | 13 +- auto/colour_reporter.rb | 4 +- auto/generate_test_runner.rb | 149 ++++----- auto/parseOutput.rb | 218 ------------- auto/parse_output.rb | 220 +++++++++++++ auto/stylize_as_junit.rb | 84 ++--- auto/test_file_filter.rb | 17 +- auto/unity_test_summary.rb | 47 ++- examples/example_3/rakefile.rb | 2 +- examples/example_3/rakefile_helper.rb | 56 ++-- extras/fixture/rakefile_helper.rb | 60 ++-- test/.rubocop.yml | 14 +- test/.rubocop_todo.yml | 443 -------------------------- test/rakefile | 25 +- test/rakefile_helper.rb | 201 ++++++------ 15 files changed, 546 insertions(+), 1007 deletions(-) delete mode 100644 auto/parseOutput.rb create mode 100644 auto/parse_output.rb delete mode 100644 test/.rubocop_todo.yml diff --git a/auto/colour_prompt.rb b/auto/colour_prompt.rb index a5c72ed..0f1dc4e 100644 --- a/auto/colour_prompt.rb +++ b/auto/colour_prompt.rb @@ -21,12 +21,11 @@ end class ColourCommandLine def initialize - if RUBY_PLATFORM =~ /(win|w)32$/ - get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') - @set_console_txt_attrb = - Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') - @hout = get_std_handle.call(-11) - end + return unless RUBY_PLATFORM =~ /(win|w)32$/ + get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') + @set_console_txt_attrb = + Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') + @hout = get_std_handle.call(-11) end def change_to(new_colour) @@ -34,7 +33,7 @@ class ColourCommandLine @set_console_txt_attrb.call(@hout, win32_colour(new_colour)) else "\033[30;#{posix_colour(new_colour)};22m" - end + end end def win32_colour(colour) diff --git a/auto/colour_reporter.rb b/auto/colour_reporter.rb index ba1cea3..bb1fbfc 100644 --- a/auto/colour_reporter.rb +++ b/auto/colour_reporter.rb @@ -17,7 +17,7 @@ def report(message) line.chomp! colour = case line when /(?:total\s+)?tests:?\s+(\d+)\s+(?:total\s+)?failures:?\s+\d+\s+Ignored:?/i - Regexp.last_match(1).to_i == 0 ? :green : :red + Regexp.last_match(1).to_i.zero? ? :green : :red when /PASS/ :green when /^OK$/ @@ -30,7 +30,7 @@ def report(message) :white else :silver - end + end colour_puts(colour, line) end end diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 32c9ca5..2c5e56a 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -9,11 +9,11 @@ File.expand_path(File.join(File.dirname(__FILE__), 'colour_prompt')) class UnityTestRunnerGenerator def initialize(options = nil) @options = UnityTestRunnerGenerator.default_options - case (options) + case options when NilClass then @options when String then @options.merge!(UnityTestRunnerGenerator.grab_config(options)) when Hash then @options.merge!(options) - else raise 'If you specify arguments, it should be a filename or a hash of options' + else raise 'If you specify arguments, it should be a filename or a hash of options' end require "#{File.expand_path(File.dirname(__FILE__))}/type_sanitizer" end @@ -43,16 +43,11 @@ class UnityTestRunnerGenerator options.merge!(yaml_guts[:unity] || yaml_guts[:cmock]) raise "No :unity or :cmock section found in #{config_file}" unless options end - (options) + options end def run(input_file, output_file, options = nil) - tests = [] - testfile_includes = [] - used_mocks = [] - @options.merge!(options) unless options.nil? - module_name = File.basename(input_file) # pull required data from source file source = File.read(input_file) @@ -80,15 +75,16 @@ class UnityTestRunnerGenerator create_header(output, used_mocks, testfile_includes) create_externs(output, tests, used_mocks) create_mock_management(output, used_mocks) - create_suite_setup_and_teardown(output) + create_suite_setup(output) + create_suite_teardown(output) create_reset(output, used_mocks) create_main(output, input_file, tests, used_mocks) end - if @options[:header_file] && !@options[:header_file].empty? - File.open(@options[:header_file], 'w') do |output| - create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) - end + return unless @options[:header_file] && !@options[:header_file].empty? + + File.open(@options[:header_file], 'w') do |output| + create_h_file(output, @options[:header_file], tests, testfile_includes, used_mocks) end end @@ -123,7 +119,7 @@ class UnityTestRunnerGenerator source_index = 0 tests_and_line_numbers.size.times do |i| source_lines[source_index..-1].each_with_index do |line, index| - next unless (line =~ /#{tests_and_line_numbers[i][:test]}/) + next unless line =~ /#{tests_and_line_numbers[i][:test]}/ source_index += index tests_and_line_numbers[i][:line_number] = source_index + 1 break @@ -182,12 +178,13 @@ class UnityTestRunnerGenerator output.puts("#include \"#{mock.gsub('.h', '')}.h\"") end output.puts('#include "CException.h"') if @options[:plugins].include?(:cexception) - if @options[:enforce_strict_ordering] - output.puts('') - output.puts('int GlobalExpectCount;') - output.puts('int GlobalVerifyOrder;') - output.puts('char* GlobalOrderError;') - end + + return unless @options[:enforce_strict_ordering] + + output.puts('') + output.puts('int GlobalExpectCount;') + output.puts('int GlobalVerifyOrder;') + output.puts('char* GlobalOrderError;') end def create_externs(output, tests, _mocks) @@ -201,55 +198,60 @@ class UnityTestRunnerGenerator end def create_mock_management(output, mock_headers) - unless mock_headers.empty? - output.puts("\n/*=======Mock Management=====*/") - output.puts('static void CMock_Init(void)') - output.puts('{') - if @options[:enforce_strict_ordering] - output.puts(' GlobalExpectCount = 0;') - output.puts(' GlobalVerifyOrder = 0;') - output.puts(' GlobalOrderError = NULL;') - end - mocks = mock_headers.map { |mock| File.basename(mock) } - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Init();") - end - output.puts("}\n") + return if mock_headers.empty? - output.puts('static void CMock_Verify(void)') - output.puts('{') - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Verify();") - end - output.puts("}\n") + output.puts("\n/*=======Mock Management=====*/") + output.puts('static void CMock_Init(void)') + output.puts('{') - output.puts('static void CMock_Destroy(void)') - output.puts('{') - mocks.each do |mock| - mock_clean = TypeSanitizer.sanitize_c_identifier(mock) - output.puts(" #{mock_clean}_Destroy();") - end - output.puts("}\n") + if @options[:enforce_strict_ordering] + output.puts(' GlobalExpectCount = 0;') + output.puts(' GlobalVerifyOrder = 0;') + output.puts(' GlobalOrderError = NULL;') end + + mocks = mock_headers.map { |mock| File.basename(mock) } + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Init();") + end + output.puts("}\n") + + output.puts('static void CMock_Verify(void)') + output.puts('{') + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Verify();") + end + output.puts("}\n") + + output.puts('static void CMock_Destroy(void)') + output.puts('{') + mocks.each do |mock| + mock_clean = TypeSanitizer.sanitize_c_identifier(mock) + output.puts(" #{mock_clean}_Destroy();") + end + output.puts("}\n") end - def create_suite_setup_and_teardown(output) - unless @options[:suite_setup].nil? - output.puts("\n/*=======Suite Setup=====*/") - output.puts('static void suite_setup(void)') - output.puts('{') - output.puts(@options[:suite_setup]) - output.puts('}') - end - unless @options[:suite_teardown].nil? - output.puts("\n/*=======Suite Teardown=====*/") - output.puts('static int suite_teardown(int num_failures)') - output.puts('{') - output.puts(@options[:suite_teardown]) - output.puts('}') - end + def create_suite_setup(output) + return if @options[:suite_setup].nil? + + output.puts("\n/*=======Suite Setup=====*/") + output.puts('static void suite_setup(void)') + output.puts('{') + output.puts(@options[:suite_setup]) + output.puts('}') + end + + def create_suite_teardown(output) + return if @options[:suite_teardown].nil? + + output.puts("\n/*=======Suite Teardown=====*/") + output.puts('static int suite_teardown(int num_failures)') + output.puts('{') + output.puts(@options[:suite_teardown]) + output.puts('}') end def create_runtest(output, used_mocks) @@ -384,22 +386,25 @@ class UnityTestRunnerGenerator end end -if $PROGRAM_NAME == __FILE__ +if $0 == __FILE__ options = { includes: [] } - yaml_file = nil # parse out all the options first (these will all be removed as we go) ARGV.reject! do |arg| - case (arg) + case arg when '-cexception' - options[:plugins] = [:cexception]; true + options[:plugins] = [:cexception] + true when /\.*\.ya?ml/ - options = UnityTestRunnerGenerator.grab_config(arg); true + options = UnityTestRunnerGenerator.grab_config(arg) + true when /--(\w+)=\"?(.*)\"?/ - options[Regexp.last_match(1).to_sym] = Regexp.last_match(2); true + options[Regexp.last_match(1).to_sym] = Regexp.last_match(2) + true when /\.*\.h/ - options[:includes] << arg; true - else false + options[:includes] << arg + true + else false end end diff --git a/auto/parseOutput.rb b/auto/parseOutput.rb deleted file mode 100644 index 3e026e5..0000000 --- a/auto/parseOutput.rb +++ /dev/null @@ -1,218 +0,0 @@ -#============================================================ -# Author: John Theofanopoulos -# A simple parser. Takes the output files generated during the build process and -# extracts information relating to the tests. -# -# Notes: -# To capture an output file under VS builds use the following: -# devenv [build instructions] > Output.txt & type Output.txt -# -# To capture an output file under GCC/Linux builds use the following: -# make | tee Output.txt -# -# To use this parser use the following command -# ruby parseOutput.rb [options] [file] -# options: -xml : produce a JUnit compatible XML file -# file : file to scan for results -#============================================================ - -class ParseOutput - # The following flag is set to true when a test is found or false otherwise. - @testFlag - @xmlOut - @arrayList - @totalTests - @classIndex - - # Set the flag to indicate if there will be an XML output file or not - def setXmlOutput - @xmlOut = true - end - - # if write our output to XML - def writeXmlOuput - output = File.open('report.xml', 'w') - output << "\n" - @arrayList.each do |item| - output << item << "\n" - end - output << "\n" - end - - # This function will try and determine when the suite is changed. This is - # is the name that gets added to the classname parameter. - def testSuiteVerify(testSuiteName) - if @testFlag == false - @testFlag = true - # Split the path name - testName = testSuiteName.split('/') - # Remove the extension - baseName = testName[testName.size - 1].split('.') - @testSuite = 'test.' + baseName[0] - printf "New Test: %s\n", @testSuite - end - end - - # Test was flagged as having passed so format the output - def testPassed(array) - lastItem = array.length - 1 - testName = array[lastItem - 1] - testSuiteVerify(array[@className]) - printf "%-40s PASS\n", testName - if @xmlOut == true - @arrayList.push ' ' - end - end - - # Test was flagged as having passed so format the output. - # This is using the Unity fixture output and not the original Unity output. - def testPassedUnityFixture(array) - testSuite = array[0].sub('TEST(', '') - testSuite = testSuite.sub(',', '') - testName = array[1].sub(')', '') - if @xmlOut == true - @arrayList.push ' ' - end - end - - # Test was flagged as being ingored so format the output - def testIgnored(array) - lastItem = array.length - 1 - testName = array[lastItem - 2] - reason = array[lastItem].chomp - testSuiteVerify(array[@className]) - printf "%-40s IGNORED\n", testName - - if testName.start_with? 'TEST(' - array2 = testName.split(' ') - @testSuite = array2[0].sub('TEST(', '') - @testSuite = @testSuite.sub(',', '') - testName = array2[1].sub(')', '') - end - - if @xmlOut == true - @arrayList.push ' ' - @arrayList.push ' ' + reason + ' ' - @arrayList.push ' ' - end - end - - # Test was flagged as having failed so format the line - def testFailed(array) - lastItem = array.length - 1 - testName = array[lastItem - 2] - reason = array[lastItem].chomp + ' at line: ' + array[lastItem - 3] - testSuiteVerify(array[@className]) - printf "%-40s FAILED\n", testName - - if testName.start_with? 'TEST(' - array2 = testName.split(' ') - @testSuite = array2[0].sub('TEST(', '') - @testSuite = @testSuite.sub(',', '') - testName = array2[1].sub(')', '') - end - - if @xmlOut == true - @arrayList.push ' ' - @arrayList.push ' ' + reason + ' ' - @arrayList.push ' ' - end - end - - # Figure out what OS we are running on. For now we are assuming if it's not Windows it must - # be Unix based. - def detectOS - myOS = RUBY_PLATFORM.split('-') - @className = if myOS.size == 2 - if myOS[1] == 'mingw32' - 1 - else - 0 - end - else - 0 - end - end - - # Main function used to parse the file that was captured. - def process(name) - @testFlag = false - @arrayList = [] - - detectOS - - puts 'Parsing file: ' + name - - testPass = 0 - testFail = 0 - testIgnore = 0 - puts '' - puts '=================== RESULTS =====================' - puts '' - File.open(name).each do |line| - # Typical test lines look like this: - # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 - # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented - # /.c:115:test_tc5100_initCanVoidPtrs:PASS - # - # where path is different on Unix vs Windows devices (Windows leads with a drive letter) - lineArray = line.split(':') - lineSize = lineArray.size - # If we were able to split the line then we can look to see if any of our target words - # were found. Case is important. - if (lineSize >= 4) || (line.start_with? 'TEST(') - # Determine if this test passed - if line.include? ':PASS' - testPassed(lineArray) - testPass += 1 - elsif line.include? ':FAIL:' - testFailed(lineArray) - testFail += 1 - elsif line.include? ':IGNORE:' - testIgnored(lineArray) - testIgnore += 1 - elsif line.start_with? 'TEST(' - if line.include? ' PASS' - lineArray = line.split(' ') - testPassedUnityFixture(lineArray) - testPass += 1 - end - # If none of the keywords are found there are no more tests for this suite so clear - # the test flag - else - @testFlag = false - end - else - @testFlag = false - end - end - puts '' - puts '=================== SUMMARY =====================' - puts '' - puts 'Tests Passed : ' + testPass.to_s - puts 'Tests Failed : ' + testFail.to_s - puts 'Tests Ignored : ' + testIgnore.to_s - @totalTests = testPass + testFail + testIgnore - if @xmlOut == true - heading = '' - @arrayList.insert(0, heading) - writeXmlOuput - end - - # return result - end - end - -# If the command line has no values in, used a default value of Output.txt -parseMyFile = ParseOutput.new - -if ARGV.size >= 1 - ARGV.each do |a| - if a == '-xml' - parseMyFile.setXmlOutput - else - parseMyFile.process(a) - break - end - end -end diff --git a/auto/parse_output.rb b/auto/parse_output.rb new file mode 100644 index 0000000..f16cdb0 --- /dev/null +++ b/auto/parse_output.rb @@ -0,0 +1,220 @@ +#============================================================ +# Author: John Theofanopoulos +# A simple parser. Takes the output files generated during the build process and +# extracts information relating to the tests. +# +# Notes: +# To capture an output file under VS builds use the following: +# devenv [build instructions] > Output.txt & type Output.txt +# +# To capture an output file under GCC/Linux builds use the following: +# make | tee Output.txt +# +# To use this parser use the following command +# ruby parseOutput.rb [options] [file] +# options: -xml : produce a JUnit compatible XML file +# file : file to scan for results +#============================================================ + +class ParseOutput + def initialize + @test_flag = false + @xml_out = false + @array_list = false + @total_tests = false + @class_index = false + end + + # Set the flag to indicate if there will be an XML output file or not + def set_xml_output + @xml_out = true + end + + # if write our output to XML + def write_xml_output + output = File.open('report.xml', 'w') + output << "\n" + @array_list.each do |item| + output << item << "\n" + end + output << "\n" + end + + # This function will try and determine when the suite is changed. This is + # is the name that gets added to the classname parameter. + def test_suite_verify(test_suite_name) + return if @test_flag + + @test_flag = true + # Split the path name + test_name = test_suite_name.split('/') + # Remove the extension + base_name = test_name[test_name.size - 1].split('.') + @test_suite = 'test.' + base_name[0] + printf "New Test: %s\n", @test_suite + end + + # Test was flagged as having passed so format the output + def test_passed(array) + last_item = array.length - 1 + test_name = array[last_item - 1] + test_suite_verify(array[@class_name]) + printf "%-40s PASS\n", test_name + + return unless @xml_out + + @array_list.push ' ' + end + + # Test was flagged as having passed so format the output. + # This is using the Unity fixture output and not the original Unity output. + def test_passed_unity_fixture(array) + test_suite = array[0].sub('TEST(', '') + test_suite = test_suite.sub(',', '') + test_name = array[1].sub(')', '') + + return unless @xml_out + + @array_list.push ' ' + end + + # Test was flagged as being ingored so format the output + def test_ignored(array) + last_item = array.length - 1 + test_name = array[last_item - 2] + reason = array[last_item].chomp + test_suite_verify(array[@class_name]) + printf "%-40s IGNORED\n", test_name + + if test_name.start_with? 'TEST(' + array2 = test_name.split(' ') + @test_suite = array2[0].sub('TEST(', '') + @test_suite = @test_suite.sub(',', '') + test_name = array2[1].sub(')', '') + end + + return unless @xml_out + + @array_list.push ' ' + @array_list.push ' ' + reason + ' ' + @array_list.push ' ' + end + + # Test was flagged as having failed so format the line + def test_failed(array) + last_item = array.length - 1 + test_name = array[last_item - 2] + reason = array[last_item].chomp + ' at line: ' + array[last_item - 3] + test_suite_verify(array[@class_name]) + printf "%-40s FAILED\n", test_name + + if test_name.start_with? 'TEST(' + array2 = test_name.split(' ') + @test_suite = array2[0].sub('TEST(', '') + @test_suite = @test_suite.sub(',', '') + test_name = array2[1].sub(')', '') + end + + return unless @xml_out + + @array_list.push ' ' + @array_list.push ' ' + reason + ' ' + @array_list.push ' ' + end + + # Figure out what OS we are running on. For now we are assuming if it's not Windows it must + # be Unix based. + def detect_os + os = RUBY_PLATFORM.split('-') + @class_name = if os.size == 2 + if os[1] == 'mingw32' + 1 + else + 0 + end + else + 0 + end + end + + # Main function used to parse the file that was captured. + def process(name) + @test_flag = false + @array_list = [] + + detect_os + + puts 'Parsing file: ' + name + + test_pass = 0 + test_fail = 0 + test_ignore = 0 + puts '' + puts '=================== RESULTS =====================' + puts '' + File.open(name).each do |line| + # Typical test lines look like this: + # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 + # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented + # /.c:115:test_tc5100_initCanVoidPtrs:PASS + # + # where path is different on Unix vs Windows devices (Windows leads with a drive letter) + line_array = line.split(':') + + # If we were able to split the line then we can look to see if any of our target words + # were found. Case is important. + if (line_array.size >= 4) || (line.start_with? 'TEST(') + # Determine if this test passed + if line.include? ':PASS' + test_passed(line_array) + test_pass += 1 + elsif line.include? ':FAIL:' + test_failed(line_array) + test_fail += 1 + elsif line.include? ':IGNORE:' + test_ignored(line_array) + test_ignore += 1 + elsif line.start_with? 'TEST(' + if line.include? ' PASS' + line_array = line.split(' ') + test_passed_unity_fixture(line_array) + test_pass += 1 + end + # If none of the keywords are found there are no more tests for this suite so clear + # the test flag + else + @test_flag = false + end + else + @test_flag = false + end + end + puts '' + puts '=================== SUMMARY =====================' + puts '' + puts 'Tests Passed : ' + test_pass.to_s + puts 'Tests Failed : ' + test_fail.to_s + puts 'Tests Ignored : ' + test_ignore.to_s + @total_tests = test_pass + test_fail + test_ignore + + return unless @xml_out + + heading = '' + @array_list.insert(0, heading) + write_xml_output + end +end + +# If the command line has no values in, used a default value of Output.txt +parse_my_file = ParseOutput.new + +if ARGV.size >= 1 + ARGV.each do |a| + if a == '-xml' + parse_my_file.set_xml_output + else + parse_my_file.process(a) + break + end + end +end diff --git a/auto/stylize_as_junit.rb b/auto/stylize_as_junit.rb index 0e8ed4b..b3d8f40 100644 --- a/auto/stylize_as_junit.rb +++ b/auto/stylize_as_junit.rb @@ -23,37 +23,37 @@ class ArgvParser options.root_path = '.' options.out_file = 'results.xml' - opts = OptionParser.new do |opts| - opts.banner = 'Usage: unity_to_junit.rb [options]' + opts = OptionParser.new do |o| + o.banner = 'Usage: unity_to_junit.rb [options]' - opts.separator '' - opts.separator 'Specific options:' + o.separator '' + o.separator 'Specific options:' - opts.on('-r', '--results ', 'Look for Unity Results files here.') do |results| + o.on('-r', '--results ', 'Look for Unity Results files here.') do |results| # puts "results #{results}" options.results_dir = results end - opts.on('-p', '--root_path ', 'Prepend this path to files in results.') do |root_path| + o.on('-p', '--root_path ', 'Prepend this path to files in results.') do |root_path| options.root_path = root_path end - opts.on('-o', '--output ', 'XML file to generate.') do |out_file| + o.on('-o', '--output ', 'XML file to generate.') do |out_file| # puts "out_file: #{out_file}" options.out_file = out_file end - opts.separator '' - opts.separator 'Common options:' + o.separator '' + o.separator 'Common options:' # No argument, shows at tail. This will print an options summary. - opts.on_tail('-h', '--help', 'Show this message') do - puts opts + o.on_tail('-h', '--help', 'Show this message') do + puts o exit end # Another typical switch to print the version. - opts.on_tail('--version', 'Show version') do + o.on_tail('--version', 'Show version') do puts "unity_to_junit.rb version #{VERSION}" exit end @@ -67,6 +67,7 @@ end # class OptparseExample class UnityToJUnit include FileUtils::Verbose attr_reader :report, :total_tests, :failures, :ignored + attr_writer :targets, :root, :out_file def initialize @report = '' @@ -82,16 +83,16 @@ class UnityToJUnit write_suites_header(f) results.each do |result_file| lines = File.readlines(result_file).map(&:chomp) - if lines.empty? - raise "Empty test result file: #{result_file}" - else - result_output = get_details(result_file, lines) - tests, failures, ignored = parse_test_summary(lines) - result_output[:counts][:total] = tests - result_output[:counts][:failed] = failures - result_output[:counts][:ignored] = ignored - result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) - end + + raise "Empty test result file: #{result_file}" if lines.empty? + + result_output = get_details(result_file, lines) + tests, failures, ignored = parse_test_summary(lines) + result_output[:counts][:total] = tests + result_output[:counts][:failed] = failures + result_output[:counts][:ignored] = ignored + result_output[:counts][:passed] = (result_output[:counts][:total] - result_output[:counts][:failed] - result_output[:counts][:ignored]) + # use line[0] from the test output to get the test_file path and name test_file_str = lines[0].tr('\\', '/') test_file_str = test_file_str.split(':') @@ -99,7 +100,7 @@ class UnityToJUnit result_file else test_file_str[0] + ':' + test_file_str[1] - end + end result_output[:source][:path] = File.dirname(test_file) result_output[:source][:file] = File.basename(test_file) @@ -116,18 +117,6 @@ class UnityToJUnit f.close end - def set_targets(target_array) - @targets = target_array - end - - def set_root_path(path) - @root = path - end - - def set_out_file(filename) - @out_file = filename - end - def usage(err_msg = nil) puts "\nERROR: " puts err_msg if err_msg @@ -148,11 +137,10 @@ class UnityToJUnit protected def get_details(_result_file, lines) - results = get_results_structure + results = results_structure lines.each do |line| line = line.tr('\\', '/') - src_file, src_line, test_name, status, msg = line.split(/:/) - line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\') + _src_file, src_line, test_name, status, msg = line.split(/:/) case status when 'IGNORE' then results[:ignores] << { test: test_name, line: src_line, message: msg } when 'FAIL' then results[:failures] << { test: test_name, line: src_line, message: msg } @@ -163,11 +151,8 @@ class UnityToJUnit end def parse_test_summary(summary) - if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } - [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] - else - raise "Couldn't parse test results: #{summary}" - end + raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } + [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] end def here @@ -176,7 +161,7 @@ class UnityToJUnit private - def get_results_structure + def results_structure { source: { path: '', file: '' }, successes: [], @@ -213,7 +198,6 @@ class UnityToJUnit def write_tests(results, stream) result = results[:successes] result.each do |item| - filename = File.join(results[:source][:path], File.basename(results[:source][:file], '.*')) stream.puts "\t\t" end end @@ -239,7 +223,7 @@ class UnityToJUnit end end # UnityToJUnit -if __FILE__ == $PROGRAM_NAME +if __FILE__ == $0 # parse out the command options options = ArgvParser.parse(ARGV) @@ -251,18 +235,18 @@ if __FILE__ == $PROGRAM_NAME results = Dir[targets] raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? - utj.set_targets(results) + utj.targets = results # set the root path - utj.set_root_path(options.root_path) + utj.root = options.root_path # set the output XML file name # puts "Output File from options: #{options.out_file}" - utj.set_out_file(options.out_file) + utj.out_file = options.out_file # run the summarizer puts utj.run - rescue Exception => e + rescue StandardError => e utj.usage e.message end end diff --git a/auto/test_file_filter.rb b/auto/test_file_filter.rb index 2067112..aad28e3 100644 --- a/auto/test_file_filter.rb +++ b/auto/test_file_filter.rb @@ -10,15 +10,16 @@ module RakefileHelpers class TestFileFilter def initialize(all_files = false) @all_files = all_files - if @all_files != true - if File.exist?('test_file_filter.yml') - filters = YAML.load_file('test_file_filter.yml') - @all_files = filters[:all_files] - @only_files = filters[:only_files] - @exclude_files = filters[:exclude_files] - end - end + + return false unless @all_files + return false unless File.exist?('test_file_filter.yml') + + filters = YAML.load_file('test_file_filter.yml') + @all_files = filters[:all_files] + @only_files = filters[:only_files] + @exclude_files = filters[:exclude_files] end + attr_accessor :all_files, :only_files, :exclude_files end end diff --git a/auto/unity_test_summary.rb b/auto/unity_test_summary.rb index 8ae6702..b37dc5f 100644 --- a/auto/unity_test_summary.rb +++ b/auto/unity_test_summary.rb @@ -15,6 +15,7 @@ class UnityTestSummary include FileUtils::Verbose attr_reader :report, :total_tests, :failures, :ignored + attr_writer :targets, :root def initialize(_opts = {}) @report = '' @@ -33,17 +34,16 @@ class UnityTestSummary results.each do |result_file| lines = File.readlines(result_file).map(&:chomp) - if lines.empty? - raise "Empty test result file: #{result_file}" - else - output = get_details(result_file, lines) - failure_output << output[:failures] unless output[:failures].empty? - ignore_output << output[:ignores] unless output[:ignores].empty? - tests, failures, ignored = parse_test_summary(lines) - @total_tests += tests - @failures += failures - @ignored += ignored - end + + raise "Empty test result file: #{result_file}" if lines.empty? + + output = get_details(result_file, lines) + failure_output << output[:failures] unless output[:failures].empty? + ignore_output << output[:ignores] unless output[:ignores].empty? + tests, failures, ignored = parse_test_summary(lines) + @total_tests += tests + @failures += failures + @ignored += ignored end if @ignored > 0 @@ -70,14 +70,6 @@ class UnityTestSummary @report += "\n" end - def set_targets(target_array) - @targets = target_array - end - - def set_root_path(path) - @root = path - end - def usage(err_msg = nil) puts "\nERROR: " puts err_msg if err_msg @@ -94,7 +86,7 @@ class UnityTestSummary def get_details(_result_file, lines) results = { failures: [], ignores: [], successes: [] } lines.each do |line| - src_file, src_line, test_name, status, msg = line.split(/:/) + _src_file, _src_line, _test_name, status, _msg = line.split(/:/) line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\') case status when 'IGNORE' then results[:ignores] << line_out @@ -106,11 +98,8 @@ class UnityTestSummary end def parse_test_summary(summary) - if summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } - [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] - else - raise "Couldn't parse test results: #{summary}" - end + raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ } + [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i] end def here @@ -118,7 +107,7 @@ class UnityTestSummary end end -if $PROGRAM_NAME == __FILE__ +if $0 == __FILE__ # parse out the command options opts, args = ARGV.partition { |v| v =~ /^--\w+/ } @@ -133,15 +122,15 @@ if $PROGRAM_NAME == __FILE__ targets = "#{ARGV[0].tr('\\', '/')}**/*.test*" results = Dir[targets] raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty? - uts.set_targets(results) + uts.targets = results # set the root path args[1] ||= Dir.pwd + '/' - uts.set_root_path(ARGV[1]) + uts.root = ARGV[1] # run the summarizer puts uts.run - rescue Exception => e + rescue StandardError => e uts.usage e.message end end diff --git a/examples/example_3/rakefile.rb b/examples/example_3/rakefile.rb index becc614..bf9f42b 100644 --- a/examples/example_3/rakefile.rb +++ b/examples/example_3/rakefile.rb @@ -23,7 +23,7 @@ DEFAULT_CONFIG_FILE = 'target_gcc_32.yml'.freeze configure_toolchain(DEFAULT_CONFIG_FILE) task unit: [:prepare_for_tests] do - run_tests get_unit_test_files + run_tests unit_test_files end desc 'Generate test summary' diff --git a/examples/example_3/rakefile_helper.rb b/examples/example_3/rakefile_helper.rb index d51cef7..a186cf0 100644 --- a/examples/example_3/rakefile_helper.rb +++ b/examples/example_3/rakefile_helper.rb @@ -22,13 +22,13 @@ module RakefileHelpers configure_clean end - def get_unit_test_files + def unit_test_files path = $cfg['compiler']['unit_tests_path'] + 'Test*' + C_EXTENSION path.tr!('\\', '/') FileList.new(path) end - def get_local_include_dirs + def local_include_dirs include_dirs = $cfg['compiler']['includes']['items'].dup include_dirs.delete_if { |dir| dir.is_a?(Array) } include_dirs @@ -69,14 +69,15 @@ module RakefileHelpers def build_compiler_fields command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items']) - end + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items']) + end options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + { command: command, defines: defines, options: options, includes: includes } end @@ -96,12 +97,12 @@ module RakefileHelpers else squash('', $cfg['linker']['options']) end - if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + { command: command, options: options, includes: includes } end @@ -127,11 +128,12 @@ module RakefileHelpers else squash('', $cfg['simulator']['pre_support']) end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end + { command: command, pre_support: pre_support, post_support: post_support } end @@ -139,7 +141,7 @@ module RakefileHelpers report command_string output = `#{command_string}`.chomp report(output) if verbose && !output.nil? && !output.empty? - if ($?.exitstatus != 0) && raise_on_fail + if !$?.exitstatus.zero? && raise_on_fail raise "Command failed. (Returned #{$?.exitstatus})" end output @@ -147,11 +149,11 @@ module RakefileHelpers def report_summary summary = UnityTestSummary.new - summary.set_root_path(HERE) + summary.root = HERE results_glob = "#{$cfg['compiler']['build_path']}*.test*" results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results summary.run fail_out 'FAIL: There were failures' if summary.failures > 0 end @@ -165,7 +167,7 @@ module RakefileHelpers $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? $cfg['compiler']['defines']['items'] << 'TEST' - include_dirs = get_local_include_dirs + include_dirs = local_include_dirs # Build and execute each unit test test_files.each do |test| @@ -200,11 +202,11 @@ module RakefileHelpers # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str, true, false) test_results = $cfg['compiler']['build_path'] + test_base test_results += if output.match(/OK$/m).nil? diff --git a/extras/fixture/rakefile_helper.rb b/extras/fixture/rakefile_helper.rb index de753b1..5aa8e56 100644 --- a/extras/fixture/rakefile_helper.rb +++ b/extras/fixture/rakefile_helper.rb @@ -14,12 +14,12 @@ module RakefileHelpers C_EXTENSION = '.c'.freeze def load_configuration(config_file) - unless $configured - $cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/ - $cfg = YAML.load(File.read($cfg_file)) - $colour_output = false unless $cfg['colour'] - $configured = true if config_file != DEFAULT_CONFIG_FILE - end + return if $configured + + $cfg_file = HERE + "../../test/targets/#{config_file}" unless config_file =~ /[\\|\/]/ + $cfg = YAML.load(File.read($cfg_file)) + $colour_output = false unless $cfg['colour'] + $configured = true if config_file != DEFAULT_CONFIG_FILE end def configure_clean @@ -50,14 +50,15 @@ module RakefileHelpers def build_compiler_fields command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar']) - end + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar']) + end options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + { command: command, defines: defines, options: options, includes: includes } end @@ -67,6 +68,7 @@ module RakefileHelpers cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{unity_include} #{file} " \ "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" \ "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" + execute(cmd_str) end @@ -77,12 +79,12 @@ module RakefileHelpers else squash('', $cfg['linker']['options']) end - if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + { command: command, options: options, includes: includes } end @@ -108,11 +110,11 @@ module RakefileHelpers else squash('', $cfg['simulator']['pre_support']) end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end { command: command, pre_support: pre_support, post_support: post_support } end @@ -126,11 +128,11 @@ module RakefileHelpers def report_summary summary = UnityTestSummary.new - summary.set_root_path(HERE) + summary.root = HERE results_glob = "#{$cfg['compiler']['build_path']}*.test*" results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results summary.run end @@ -159,11 +161,11 @@ module RakefileHelpers # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable + ' -v -r' - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + ' -v -r' + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str) test_results = $cfg['compiler']['build_path'] + test_base test_results += if output.match(/OK$/m).nil? diff --git a/test/.rubocop.yml b/test/.rubocop.yml index e8d89b2..c074ca9 100644 --- a/test/.rubocop.yml +++ b/test/.rubocop.yml @@ -1,19 +1,21 @@ # This is the configuration used to check the rubocop source code. -inherit_from: .rubocop_todo.yml +#inherit_from: .rubocop_todo.yml AllCops: TargetRubyVersion: 2.1 # These are areas where ThrowTheSwitch's coding style diverges from the Ruby standard -# (Maybe we will make these conform over time) Style/SpecialGlobalVars: - SupportedStyles: - - use_perl_names - - use_english_names EnforcedStyle: use_perl_names Style/FormatString: Enabled: false +Style/GlobalVars: + Enabled: false +Style/RegexpLiteral: + AllowInnerSlashes: true +Style/HashSyntax: + EnforcedStyle: no_mixed_keys # This is disabled because it seems to get confused over nested hashes Style/AlignHash: @@ -48,6 +50,8 @@ Metrics/LineLength: Enabled: false Metrics/MethodLength: Enabled: false +Metrics/ModuleLength: + Enabled: false Metrics/ParameterLists: Enabled: false Metrics/PerceivedComplexity: diff --git a/test/.rubocop_todo.yml b/test/.rubocop_todo.yml deleted file mode 100644 index dd4bf87..0000000 --- a/test/.rubocop_todo.yml +++ /dev/null @@ -1,443 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2017-03-28 15:45:51 -0400 using RuboCop version 0.48.0. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 1 -# Cop supports --auto-correct. -Lint/DeprecatedClassMethods: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 6 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleAlignWith, SupportedStylesAlignWith, AutoCorrect. -# SupportedStylesAlignWith: keyword, variable, start_of_line -Lint/EndAlignment: - Exclude: - - '../auto/colour_prompt.rb' - - '../auto/colour_reporter.rb' - - '../auto/parseOutput.rb' - - '../auto/stylize_as_junit.rb' - -# Offense count: 2 -Lint/RescueException: - Exclude: - - '../auto/stylize_as_junit.rb' - - '../auto/unity_test_summary.rb' - -# Offense count: 1 -Lint/ShadowingOuterLocalVariable: - Exclude: - - '../auto/stylize_as_junit.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Lint/StringConversionInInterpolation: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 13 -Lint/UselessAssignment: - Exclude: - - '../auto/generate_test_runner.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/unity_test_summary.rb' - - 'rakefile_helper.rb' - -# Offense count: 5 -Lint/Void: - Exclude: - - '../auto/parseOutput.rb' - -# Offense count: 3 -# Configuration parameters: CountComments. -Metrics/ModuleLength: - Max: 204 - -# Offense count: 2 -# Cop supports --auto-correct. -Performance/StringReplacement: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 10 -Style/AccessorMethodName: - Exclude: - - '../auto/stylize_as_junit.rb' - - '../auto/unity_test_summary.rb' - - '../examples/example_3/rakefile_helper.rb' - - 'rakefile_helper.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods. -# SupportedStyles: line_count_based, semantic, braces_for_chaining -# ProceduralMethods: benchmark, bm, bmbm, create, each_with_object, measure, new, realtime, tap, with_object -# FunctionalMethods: let, let!, subject, watch -# IgnoredMethods: lambda, proc, it -Style/BlockDelimiters: - Exclude: - - 'spec/generate_module_existing_file_spec.rb' - -# Offense count: 17 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, SingleLineConditionsOnly, IncludeTernaryExpressions. -# SupportedStyles: assign_to_condition, assign_inside_condition -Style/ConditionalAssignment: - Exclude: - - '../examples/example_3/rakefile_helper.rb' - - '../extras/fixture/rakefile_helper.rb' - - 'rakefile_helper.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Style/ElseAlignment: - Exclude: - - '../auto/generate_test_runner.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Style/EmptyLines: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: empty_lines, no_empty_lines -Style/EmptyLinesAroundBlockBody: - Exclude: - - 'rakefile_helper.rb' - - 'spec/generate_module_existing_file_spec.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines -Style/EmptyLinesAroundModuleBody: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 14 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment, ForceEqualSignAlignment. -Style/ExtraSpacing: - Exclude: - - '../auto/generate_test_runner.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms. -# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS -Style/FileName: - Exclude: - - '../auto/parseOutput.rb' - -# Offense count: 164 -# Configuration parameters: AllowedVariables. -Style/GlobalVars: - Exclude: - - '../auto/colour_reporter.rb' - - '../examples/example_3/rakefile_helper.rb' - - '../extras/fixture/rakefile.rb' - - '../extras/fixture/rakefile_helper.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 20 -# Configuration parameters: MinBodyLength. -Style/GuardClause: - Exclude: - - '../auto/colour_prompt.rb' - - '../auto/generate_test_runner.rb' - - '../auto/parseOutput.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/test_file_filter.rb' - - '../auto/unity_test_summary.rb' - - '../extras/fixture/rakefile_helper.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 630 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols. -# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys -Style/HashSyntax: - Exclude: - - 'rakefile_helper.rb' - - 'spec/generate_module_existing_file_spec.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: MaxLineLength. -Style/IfUnlessModifier: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: IndentationWidth. -Style/IndentAssignment: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: Width, IgnoredPatterns. -Style/IndentationWidth: - Exclude: - - '../auto/generate_test_runner.rb' - - 'spec/generate_module_existing_file_spec.rb' - -# Offense count: 17 -# Cop supports --auto-correct. -Style/LeadingCommentSpace: - Exclude: - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/LineEndConcatenation: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 8 -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: snake_case, camelCase -Style/MethodName: - Exclude: - - '../auto/parseOutput.rb' - -# Offense count: 40 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: symmetrical, new_line, same_line -Style/MultilineArrayBraceLayout: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 63 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: symmetrical, new_line, same_line -Style/MultilineHashBraceLayout: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth. -# SupportedStyles: aligned, indented -Style/MultilineOperationIndentation: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Style/MutableConstant: - Exclude: - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: both, prefix, postfix -Style/NegatedIf: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/Not: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles. -# SupportedStyles: predicate, comparison -Style/NumericPredicate: - Exclude: - - 'spec/**/*' - - '../auto/colour_reporter.rb' - -# Offense count: 17 -# Cop supports --auto-correct. -# Configuration parameters: AllowSafeAssignment. -Style/ParenthesesAroundCondition: - Exclude: - - '../auto/generate_test_runner.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 7 -# Cop supports --auto-correct. -Style/RedundantParentheses: - Exclude: - - '../auto/generate_test_runner.rb' - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: AllowMultipleReturnValues. -Style/RedundantReturn: - Exclude: - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes. -# SupportedStyles: slashes, percent_r, mixed -Style/RegexpLiteral: - Exclude: - - '../auto/generate_test_runner.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/type_sanitizer.rb' - - '../auto/unity_test_summary.rb' - - '../extras/fixture/rakefile_helper.rb' - - 'rakefile_helper.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: AllowAsExpressionSeparator. -Style/Semicolon: - Exclude: - - '../auto/generate_test_runner.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -Style/SpaceAfterComma: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleInsidePipes, SupportedStylesInsidePipes. -# SupportedStylesInsidePipes: space, no_space -Style/SpaceAroundBlockParameters: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: space, no_space -Style/SpaceAroundEqualsInParameterDefault: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment. -Style/SpaceAroundOperators: - Exclude: - - 'rakefile_helper.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: space, no_space -Style/SpaceBeforeBlockBraces: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces, SpaceBeforeBlockParameters. -# SupportedStyles: space, no_space -# SupportedStylesForEmptyBraces: space, no_space -Style/SpaceInsideBlockBraces: - Exclude: - - 'rakefile_helper.rb' - - 'spec/generate_module_existing_file_spec.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 295 -# Cop supports --auto-correct. -Style/SpaceInsideBrackets: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 6 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces. -# SupportedStyles: space, no_space, compact -# SupportedStylesForEmptyBraces: space, no_space -Style/SpaceInsideHashLiteralBraces: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -Style/SpaceInsideParens: - Exclude: - - 'tests/test_generate_test_runner.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: use_perl_names, use_english_names -Style/SpecialGlobalVars: - Exclude: - - '../auto/generate_test_runner.rb' - - '../auto/stylize_as_junit.rb' - - '../auto/unity_test_summary.rb' - -# Offense count: 167 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, ConsistentQuotesInMultiline. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiterals: - Exclude: - - 'rakefile_helper.rb' - - 'spec/generate_module_existing_file_spec.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, AllowSafeAssignment. -# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex -Style/TernaryParentheses: - Exclude: - - 'rakefile_helper.rb' - -# Offense count: 152 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, no_comma -Style/TrailingCommaInLiteral: - Exclude: - - 'spec/generate_module_existing_file_spec.rb' - - 'tests/test_generate_test_runner.rb' - -# Offense count: 39 -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: snake_case, camelCase -Style/VariableName: - Exclude: - - '../auto/parseOutput.rb' - -# Offense count: 69 -# Cop supports --auto-correct. -# Configuration parameters: SupportedStyles, WordRegex. -# SupportedStyles: percent, brackets -Style/WordArray: - EnforcedStyle: percent - MinSize: 12 - -# Offense count: 1 -# Cop supports --auto-correct. -Style/ZeroLengthPredicate: - Exclude: - - 'rakefile_helper.rb' diff --git a/test/rakefile b/test/rakefile index 33c36f8..9bcf230 100644 --- a/test/rakefile +++ b/test/rakefile @@ -32,7 +32,7 @@ configure_toolchain(DEFAULT_CONFIG_FILE) desc "Test unity with its own unit tests" task :unit => [:prepare_for_tests] do - run_tests get_unit_test_files + run_tests unit_test_files end desc "Test unity's helper scripts" @@ -74,32 +74,35 @@ end namespace :style do desc "Check style" task :check do - report execute("rubocop ../ --config .rubocop.yml", true) - report "Style Checked." + report "\nVERIFYING RUBY STYLE" + report execute("rubocop ../auto ../examples ../extras --config .rubocop.yml", true) + report "Style PASSED." end namespace :check do Dir['../**/*.rb'].each do |f| - task File.basename(f, '.rb').to_sym do + task File.basename(f, '.rb').to_sym => ['style:clean'] do report execute("rubocop #{f} --color --config .rubocop.yml", true) - report "Style Checked." + report "Style Checked for #{f}" end end end desc "Attempt to Autocorrect style" - task :auto do - File.delete(".rubocop_todo.yml") - execute("rubocop ../ --auto-correct --config .rubocop.yml") + task :auto => ['style:clean'] do + execute("rubocop ../auto ../examples ../extras --auto-correct --config .rubocop.yml") report "Autocorrected What We Could." end desc "Update style todo list" - task :todo do - File.delete(".rubocop_todo.yml") - execute("rubocop ../ --auto-gen-config --config .rubocop.yml") + task :todo => ['style:clean'] do + execute("rubocop ../auto ../examples ../extras --auto-gen-config --config .rubocop.yml") report "Updated Style TODO List." end + + task :clean do + File.delete(".rubocop_todo.yml") if File.exists?(".rubocop_todo.yml") + end end task :style => ['style:check'] diff --git a/test/rakefile_helper.rb b/test/rakefile_helper.rb index 17bfb27..410da7f 100644 --- a/test/rakefile_helper.rb +++ b/test/rakefile_helper.rb @@ -11,39 +11,37 @@ require UNITY_ROOT + '../auto/generate_test_runner' require UNITY_ROOT + '../auto/colour_reporter' module RakefileHelpers - - C_EXTENSION = '.c' - + C_EXTENSION = '.c'.freeze def load_configuration(config_file) - unless ($configured) - $cfg_file = "targets/#{config_file}" unless (config_file =~ /[\\|\/]/) - $cfg = YAML.load(File.read($cfg_file)) - $colour_output = false unless $cfg['colour'] - $configured = true if (config_file != DEFAULT_CONFIG_FILE) - end + return if $configured + + $cfg_file = "targets/#{config_file}" unless config_file =~ /[\\|\/]/ + $cfg = YAML.load(File.read($cfg_file)) + $colour_output = false unless $cfg['colour'] + $configured = true if config_file != DEFAULT_CONFIG_FILE end def configure_clean CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? end - def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) + def configure_toolchain(config_file = DEFAULT_CONFIG_FILE) config_file += '.yml' unless config_file =~ /\.yml$/ config_file = config_file unless config_file =~ /[\\|\/]/ load_configuration(config_file) configure_clean end - def get_unit_test_files + def unit_test_files path = $cfg['compiler']['unit_tests_path'] + 'test*' + C_EXTENSION - path.gsub!(/\\/, '/') + path.tr!('\\', '/') FileList.new(path) end - def get_local_include_dirs + def local_include_dirs include_dirs = $cfg['compiler']['includes']['items'].dup - include_dirs.delete_if {|dir| dir.is_a?(Array)} - return include_dirs + include_dirs.delete_if { |dir| dir.is_a?(Array) } + include_dirs end def extract_headers(filename) @@ -51,41 +49,37 @@ module RakefileHelpers lines = File.readlines(filename) lines.each do |line| m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/) - if not m.nil? - includes << m[1] - end + includes << m[1] unless m.nil? end - return includes + includes end def find_source_file(header, paths) paths.each do |dir| src_file = dir + header.ext(C_EXTENSION) - if (File.exists?(src_file)) - return src_file - end + return src_file if File.exist?(src_file) end - return nil + nil end def tackit(strings) - if strings.is_a?(Array) - result = "\"#{strings.join}\"" - else - result = strings - end - return result + result = if strings.is_a?(Array) + "\"#{strings.join}\"" + else + strings + end + result end def squash(prefix, items) result = '' items.each { |item| result += " #{prefix}#{tackit(item)}" } - return result + result end def should(behave, &block) if block - puts "Should " + behave + puts 'Should ' + behave yield block else puts "UNIMPLEMENTED CASE: Should #{behave}" @@ -93,91 +87,91 @@ module RakefileHelpers end def build_compiler_fields(inject_defines) - command = tackit($cfg['compiler']['path']) - if $cfg['compiler']['defines']['items'].nil? - defines = '' - else - defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'] + inject_defines) - end - options = squash('', $cfg['compiler']['options']) + command = tackit($cfg['compiler']['path']) + defines = if $cfg['compiler']['defines']['items'].nil? + '' + else + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'] + inject_defines) + end + options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :defines => defines, :options => options, :includes => includes} + + { :command => command, :defines => defines, :options => options, :includes => includes } end - def compile(file, defines=[]) + def compile(file, defines = []) compiler = build_compiler_fields(defines) - defines = - cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " + + cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " \ "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" execute(cmd_str + obj_file) - return obj_file + + obj_file end def build_linker_fields - command = tackit($cfg['linker']['path']) - if $cfg['linker']['options'].nil? - options = '' - else - options = squash('', $cfg['linker']['options']) - end - if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) - includes = '' - else - includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) - end - includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) - return {:command => command, :options => options, :includes => includes} + command = tackit($cfg['linker']['path']) + options = if $cfg['linker']['options'].nil? + '' + else + squash('', $cfg['linker']['options']) + end + includes = if $cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil? + '' + else + squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) + end.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) + + { :command => command, :options => options, :includes => includes } end def link_it(exe_name, obj_list) linker = build_linker_fields cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + - (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + - $cfg['linker']['bin_files']['prefix'] + ' ' + - $cfg['linker']['bin_files']['destination'] + - exe_name + $cfg['linker']['bin_files']['extension'] + (obj_list.map { |obj| "#{$cfg['linker']['object_files']['path']}#{obj} " }).join + + $cfg['linker']['bin_files']['prefix'] + ' ' + + $cfg['linker']['bin_files']['destination'] + + exe_name + $cfg['linker']['bin_files']['extension'] execute(cmd_str) end def build_simulator_fields return nil if $cfg['simulator'].nil? - if $cfg['simulator']['path'].nil? - command = '' - else - command = (tackit($cfg['simulator']['path']) + ' ') - end - if $cfg['simulator']['pre_support'].nil? - pre_support = '' - else - pre_support = squash('', $cfg['simulator']['pre_support']) - end - if $cfg['simulator']['post_support'].nil? - post_support = '' - else - post_support = squash('', $cfg['simulator']['post_support']) - end - return {:command => command, :pre_support => pre_support, :post_support => post_support} + command = if $cfg['simulator']['path'].nil? + '' + else + (tackit($cfg['simulator']['path']) + ' ') + end + pre_support = if $cfg['simulator']['pre_support'].nil? + '' + else + squash('', $cfg['simulator']['pre_support']) + end + post_support = if $cfg['simulator']['post_support'].nil? + '' + else + squash('', $cfg['simulator']['post_support']) + end + + { :command => command, :pre_support => pre_support, :post_support => post_support } end - def execute(command_string, ok_to_fail=false) + def execute(command_string, ok_to_fail = false) report command_string if $verbose output = `#{command_string}`.chomp - report(output) if ($verbose && !output.nil? && (output.length > 0)) - if (($?.exitstatus != 0) && !ok_to_fail) - raise "Command failed. (Returned #{$?.exitstatus})" - end - return output + report(output) if $verbose && !output.nil? && !output.empty? + raise "Command failed. (Returned #{$?.exitstatus})" if !$?.exitstatus.zero? && !ok_to_fail + output end def report_summary summary = UnityTestSummary.new - summary.set_root_path(UNITY_ROOT) + summary.root = UNITY_ROOT results_glob = "#{$cfg['compiler']['build_path']}*.test*" - results_glob.gsub!(/\\/, '/') + results_glob.tr!('\\', '/') results = Dir[results_glob] - summary.set_targets(results) + summary.targets = results report summary.run end @@ -187,16 +181,16 @@ module RakefileHelpers # Tack on TEST define for compiling unit tests load_configuration($cfg_file) test_defines = ['TEST'] - $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? + $cfg['compiler']['defines']['items'] ||= [] $cfg['compiler']['defines']['items'] << 'TEST' - include_dirs = get_local_include_dirs + include_dirs = local_include_dirs # Build and execute each unit test test_files.each do |test| obj_list = [] - if !$cfg['compiler']['aux_sources'].nil? + unless $cfg['compiler']['aux_sources'].nil? $cfg['compiler']['aux_sources'].each do |aux| obj_list << compile(aux, test_defines) end @@ -206,25 +200,23 @@ module RakefileHelpers extract_headers(test).each do |header| # Compile corresponding source file if it exists src_file = find_source_file(header, include_dirs) - if !src_file.nil? - obj_list << compile(src_file, test_defines) - end + + obj_list << compile(src_file, test_defines) unless src_file.nil? end # Build the test runner (generate if configured to do so) test_base = File.basename(test, C_EXTENSION) runner_name = test_base + '_Runner.c' - runner_path = '' - if $cfg['compiler']['runner_path'].nil? - runner_path = $cfg['compiler']['build_path'] + runner_name - else - runner_path = $cfg['compiler']['runner_path'] + runner_name - end + runner_path = if $cfg['compiler']['runner_path'].nil? + $cfg['compiler']['build_path'] + runner_name + else + $cfg['compiler']['runner_path'] + runner_name + end options = $cfg[:unity] - options[:use_param_tests] = (test =~ /parameterized/) ? true : false + options[:use_param_tests] = test =~ /parameterized/ ? true : false UnityTestRunnerGenerator.new(options).run(test, runner_path) obj_list << compile(runner_path, test_defines) @@ -237,21 +229,20 @@ module RakefileHelpers # Execute unit test and generate results file simulator = build_simulator_fields executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] - if simulator.nil? - cmd_str = executable - else - cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" - end + cmd_str = if simulator.nil? + executable + else + "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" + end output = execute(cmd_str) test_results = $cfg['compiler']['build_path'] + test_base if output.match(/OK$/m).nil? test_results += '.testfail' else - report output if (!$verbose) #verbose already prints this line, as does a failure + report output unless $verbose # Verbose already prints this line, as does a failure test_results += '.testpass' end File.open(test_results, 'w') { |f| f.print output } - end end end From c48f6c942014bd3d154da888d004a6a63dc3ffe8 Mon Sep 17 00:00:00 2001 From: toby Date: Tue, 21 Mar 2017 11:00:59 +0000 Subject: [PATCH 092/157] Add Github Markdown versions of documents Add GFM version of getting started guide PDF Add GFM version of configuration guide PDF Add GFM version of helper scripts guide PDF Add GFM version of coding standard PDF Add GFM version of assertions reference PDF Change markdown used to italicise line. Switched to use asterisk markdown instead --- docs/ThrowTheSwitchCodingStandard.md | 170 ++++++++++ docs/UnityAssertionsReference.md | 486 +++++++++++++++++++++++++++ docs/UnityConfigurationGuide.md | 340 +++++++++++++++++++ docs/UnityGettingStartedGuide.md | 171 ++++++++++ docs/UnityHelperScriptsGuide.md | 222 ++++++++++++ 5 files changed, 1389 insertions(+) create mode 100644 docs/ThrowTheSwitchCodingStandard.md create mode 100644 docs/UnityAssertionsReference.md create mode 100644 docs/UnityConfigurationGuide.md create mode 100644 docs/UnityGettingStartedGuide.md create mode 100644 docs/UnityHelperScriptsGuide.md diff --git a/docs/ThrowTheSwitchCodingStandard.md b/docs/ThrowTheSwitchCodingStandard.md new file mode 100644 index 0000000..a48a832 --- /dev/null +++ b/docs/ThrowTheSwitchCodingStandard.md @@ -0,0 +1,170 @@ +# ThrowTheSwitch.org Coding Standard +Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part, +we try to follow these standards to unify our contributors' code into a cohesive +unit (puns intended). You might find places where these standards aren't +followed. We're not perfect. Please be polite where +you notice these discrepancies and we'll try to be polite when we notice yours. +;) + +## Why Have A Coding Standard? +Being consistent makes code easier to understand. We've made an attempt to keep +our standard simple because we also believe that we can only expect someone to +follow something that is understandable. Please do your best. + +## Our Philosophy +Before we get into details on syntax, let's take a moment to talk about our +vision for these tools. We're C developers and embedded software developers. +These tools are great to test any C code, but catering to embedded software has +made us more tolerant of compiler quirks. There are a LOT of quirky compilers +out there. By quirky I mean "doesn't follow standards because they feel like +they have a license to do as they wish." + +Our philosophy is "support every compiler we can". Most often, this means that +we aim for writing C code that is standards compliant (often C89... that seems +to be a sweet spot that is almost always compatible). But it also means these +tools are tolerant of things that aren't common. Some that aren't even +compliant. There are configuration options to override the size of standard +types. There are configuration options to force Unity to not use certain +standard library functions. A lot of Unity is configurable and we have worked +hard to make it not TOO ugly in the process. + +Similarly, our tools that parse C do their best. They aren't full C parsers +(yet) and, even if they were, they would still have to accept non-standard +additions like gcc extensions or specifying `@0x1000` to force a variable to +compile to a particular location. It's just what we do, because we like +everything to Just Work™. + +Speaking of having things Just Work™, that's our second philosophy. By that, we +mean that we do our best to have EVERY configuration option have a logical +default. We believe that if you're working with a simple compiler and target, +you shouldn't need to configure very much... we try to make the tools guess as +much as they can, but give the user the power to override it when it's wrong. + +## Naming Things +Let's talk about naming things. Programming is all about naming things. We name +files, functions, variables, and so much more. While we're not always going to +find the best name for something, we actually put quite a bit of effort into +finding *What Something WANTS to be Called*™. + +When naming things, we more or less follow this hierarchy, the first being the +most important to us (but we do all four whenever possible): +1. Readable +2. Descriptive +3. Consistent +4. Memorable + +#### Readable +We want to read our code. This means we like names and flow that are more +naturally read. We try to avoid double negatives. We try to avoid cryptic +abbreviations (sticking to ones we feel are common). + +#### Descriptive +We like descriptive names for things, especially functions and variables. +Finding the right name for something is an important endeavor. You might notice +from poking around our code that this often results in names that are a little +longer than the average. Guilty. We're okay with a tiny bit more typing if it +means our code is easier to understand. + +There are two exceptions to this rule that we also stick to as religiously as +possible: + +First, while we realize hungarian notation (and similar systems for encoding +type information into variable names) is providing a more descriptive name, we +feel that (for the average developer) it takes away from readability and +therefore is to be avoided. + +Second, loop counters and other local throw-away variables often have a purpose +which is obvious. There's no need, therefore, to get carried away with complex +naming. We find i, j, and k are better loop counters than loopCounterVar or +whatnot. We only break this rule when we see that more description could improve +understanding of an algorithm. + +#### Consistent +We like consistency, but we're not really obsessed with it. We try to name our +configuration macros in a consistent fashion... you'll notice a repeated use of +UNITY_EXCLUDE_BLAH or UNITY_USES_BLAH macros. This helps users avoid having to +remember each macro's details. + +#### Memorable +Where ever it doesn't violate the above principles, we try to apply memorable +names. Sometimes this means using something that is simply descriptive, but +often we strive for descriptive AND unique... we like quirky names that stand +out in our memory and are easier to search for. Take a look through the file +names in Ceedling and you'll get a good idea of what we are talking about here. +Why use preprocess when you can use preprocessinator? Or what better describes a +module in charge of invoking tasks during releases than release_invoker? Don't +get carried away. The names are still descriptive and fulfill the above +requirements, but they don't feel stale. + +## C and C++ Details +We don't really want to add to the style battles out there. Tabs or spaces? +How many spaces? Where do the braces go? These are age-old questions that will +never be answered... or at least not answered in a way that will make everyone +happy. + +We've decided on our own style preferences. If you'd like to contribute to these +projects (and we hope that you do), then we ask if you do your best to follow +the same. It will only hurt a little. We promise. + +#### Whitespace +Our C-style is to use spaces and to use 4 of them per indent level. It's a nice +power-of-2 number that looks decent on a wide screen. We have no more reason +than that. We break that rule when we have lines that wrap (macros or function +arguments or whatnot). When that happens, we like to indent further to line +things up in nice tidy columns. + +```C + if (stuff_happened) + { + do_something(); + } +``` + +#### Case +- Files - all lower case with underscores. +- Variables - all lower case with underscores +- Macros - all caps with underscores. +- Typedefs - all caps with underscores. (also ends with _T). +- Functions - camel cased. Usually named ModuleName_FuncName +- Constants and Globals - camel cased. + +#### Braces +The left brace is on the next line after the declaration. The right brace is +directly below that. Everything in between in indented one level. If you're +catching an error and you have a one-line, go ahead and to it on the same line. + +```C + while (blah) + { + //Like so. Even if only one line, we use braces. + } +``` + +#### Comments +Do you know what we hate? Old-school C block comments. BUT, we're using them +anyway. As we mentioned, our goal is to support every compiler we can, +especially embedded compilers. There are STILL C compilers out there that only +support old-school block comments. So that is what we're using. We apologize. We +think they are ugly too. + +## Ruby Details +Is there really such thing as a Ruby coding standard? Ruby is such a free form +language, it seems almost sacrilegious to suggest that people should comply to +one method! We'll keep it really brief! + +#### Whitespace +Our Ruby style is to use spaces and to use 2 of them per indent level. It's a +nice power-of-2 number that really grooves with Ruby's compact style. We have no +more reason than that. We break that rule when we have lines that wrap. When +that happens, we like to indent further to line things up in nice tidy columns. + +#### Case +- Files - all lower case with underscores. +- Variables - all lower case with underscores +- Classes, Modules, etc - Camel cased. +- Functions - all lower case with underscores +- Constants - all upper case with underscores + +## Documentation +Egad. Really? We use markdown and we like pdf files because they can be made to +look nice while still being portable. Good enough? diff --git a/docs/UnityAssertionsReference.md b/docs/UnityAssertionsReference.md new file mode 100644 index 0000000..bc2ce7d --- /dev/null +++ b/docs/UnityAssertionsReference.md @@ -0,0 +1,486 @@ +# Unity Assertions Reference +## Background and Overview +### Super Condensed Version +- An assertion establishes truth (i.e. boolean True) for a single condition. +Upon boolean False, an assertion stops execution and reports the failure. +- Unity is mainly a rich collection of assertions and the support to gather up +and easily execute those assertions. +- The structure of Unity allows you to easily separate test assertions from +source code in, well, test code. +- Unity's assertions: +- Come in many, many flavors to handle different C types and assertion cases. +- Use context to provide detailed and helpful failure messages. +- Document types, expected values, and basic behavior in your source code for +free. + +### Unity Is Several Things But Mainly It's Assertions +One way to think of Unity is simply as a rich collection of assertions you can +use to establish whether your source code behaves the way you think it does. +Unity provides a framework to easily organize and execute those assertions in +test code separate from your source code. + +### What's an Assertion? +At their core, assertions are an establishment of truth—boolean truth. Was this +thing equal to that thing? Does that code doohickey have such-and-such property +or not? You get the idea. Assertions are executable code (to appreciate the big +picture on this read up on the difference between +[link:Dynamic Verification and Static Analysis]). A failing assertion stops +execution and reports an error through some appropriate I/O channel (e.g. +stdout, GUI, file, blinky light). + +Fundamentally, for dynamic verification all you need is a single assertion +mechanism. In fact, that's what the [assert() macro in C's standard library](http://en.wikipedia.org/en/wiki/Assert.h) +is for. So why not just use it? Well, we can do far better in the reporting +department. C's `assert()` is pretty dumb as-is and is particularly poor for +handling common data types like arrays, structs, etc. And, without some other +support, it's far too tempting to litter source code with C's `assert()`'s. It's +generally much cleaner, manageable, and more useful to separate test and source +code in the way Unity facilitates. + +### Unity's Assertions: Helpful Messages _and_ Free Source Code Documentation +Asserting a simple truth condition is valuable, but using the context of the +assertion is even more valuable. For instance, if you know you're comparing bit +flags and not just integers, then why not use that context to give explicit, +readable, bit-level feedback when an assertion fails? + +That's what Unity's collection of assertions do - capture context to give you +helpful, meaningful assertion failure messages. In fact, the assertions +themselves also serve as executable documentation about types and values in your +source code. So long as your tests remain current with your source and all those +tests pass, you have a detailed, up-to-date view of the intent and mechanisms in +your source code. And due to a wondrous mystery, well-tested code usually tends +to be well designed code. + +## Assertion Conventions and Configurations +### Naming and Parameter Conventions +The convention of assertion parameters generally follows this order: + + TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} ) + +The very simplest assertion possible uses only a single "actual" parameter (e.g. +a simple null check). + +"Actual" is the value being tested and unlike the other parameters in an +assertion construction is the only parameter present in all assertion variants. +"Modifiers" are masks, ranges, bit flag specifiers, floating point deltas. +"Expected" is your expected value (duh) to compare to an "actual" value; it's +marked as an optional parameter because some assertions only need a single +"actual" parameter (e.g. null check). +"Size/count" refers to string lengths, number of array elements, etc. + +Many of Unity's assertions are apparent duplications in that the same data type +is handled by several assertions. The differences among these are in how failure +messages are presented. For instance, a `_HEX` variant of an assertion prints +the expected and actual values of that assertion formatted as hexadecimal. + +#### TEST_ASSERT_X_MESSAGE Variants +_All_ assertions are complemented with a variant that includes a simple string +message as a final parameter. The string you specify is appended to an assertion +failure message in Unity output. + +For brevity, the assertion variants with a message parameter are not listed +below. Just tack on `_MESSAGE` as the final component to any assertion name in +the reference list below and add a string as the final parameter. + +_Example:_ + + TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} ) + +becomes messageified like thus... + + TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message ) + +#### TEST_ASSERT_X_ARRAY Variants +Unity provides a collection of assertions for arrays containing a variety of +types. These are documented in the Array section below. These are almost on par +with the `_MESSAGE`variants of Unity's Asserts in that for pretty much any Unity +type assertion you can tack on `_ARRAY` and run assertions on an entire block of +memory. + + TEST_ASSERT_EQUAL_TYPEX_ARRAY( expected, actual, {size/count} ) + +"Expected" is an array itself. +"Size/count" is one or two parameters necessary to establish the number of array +elements and perhaps the length of elements within the array. + +Notes: +- The `_MESSAGE` variant convention still applies here to array assertions. The +`_MESSAGE` variants of the `_ARRAY` assertions have names ending with +`_ARRAY_MESSAGE`. +- Assertions for handling arrays of floating point values are grouped with float +and double assertions (see immediately following section). + +### Configuration +#### Floating Point Support Is Optional +Support for floating point types is configurable. That is, by defining the +appropriate preprocessor symbols, floats and doubles can be individually enabled +or disabled in Unity code. This is useful for embedded targets with no floating +point math support (i.e. Unity compiles free of errors for fixed point only +platforms). See Unity documentation for specifics. + +#### Maximum Data Type Width Is Configurable +Not all targets support 64 bit wide types or even 32 bit wide types. Define the +appropriate preprocessor symbols and Unity will omit all operations from +compilation that exceed the maximum width of your target. See Unity +documentation for specifics. + +## The Assertions in All Their Blessed Glory +### Basic Fail and Ignore + +##### `TEST_FAIL()` +This fella is most often used in special conditions where your test code is +performing logic beyond a simple assertion. That is, in practice, `TEST_FAIL()` +will always be found inside a conditional code block. + +_Examples:_ +- Executing a state machine multiple times that increments a counter your test +code then verifies as a final step. +- Triggering an exception and verifying it (as in Try / Catch / Throw - see the +[CException](https://github.com/ThrowTheSwitch/CException) project). + +##### `TEST_IGNORE()` +Marks a test case (i.e. function meant to contain test assertions) as ignored. +Usually this is employed as a breadcrumb to come back and implement a test case. +An ignored test case has effects if other assertions are in the enclosing test +case (see Unity documentation for more). + +### Boolean +##### `TEST_ASSERT (condition)` +##### `TEST_ASSERT_TRUE (condition)` +##### `TEST_ASSERT_FALSE (condition)` +##### `TEST_ASSERT_UNLESS (condition)` +A simple wording variation on `TEST_ASSERT_FALSE`.The semantics of +`TEST_ASSERT_UNLESS` aid readability in certain test constructions or +conditional statements. + +##### `TEST_ASSERT_NULL (pointer)` +##### `TEST_ASSERT_NOT_NULL (pointer)` + + +### Signed and Unsigned Integers (of all sizes) +Large integer sizes can be disabled for build targets that do not support them. +For example, if your target only supports up to 16 bit types, by defining the +appropriate symbols Unity can be configured to omit 32 and 64 bit operations +that would break compilation (see Unity documentation for more). Refer to +Advanced Asserting later in this document for advice on dealing with other word +sizes. + +##### `TEST_ASSERT_EQUAL_INT (expected, actual)` +##### `TEST_ASSERT_EQUAL_INT8 (expected, actual)` +##### `TEST_ASSERT_EQUAL_INT16 (expected, actual)` +##### `TEST_ASSERT_EQUAL_INT32 (expected, actual)` +##### `TEST_ASSERT_EQUAL_INT64 (expected, actual)` +##### `TEST_ASSERT_EQUAL (expected, actual)` +##### `TEST_ASSERT_NOT_EQUAL (expected, actual)` +##### `TEST_ASSERT_EQUAL_UINT (expected, actual)` +##### `TEST_ASSERT_EQUAL_UINT8 (expected, actual)` +##### `TEST_ASSERT_EQUAL_UINT16 (expected, actual)` +##### `TEST_ASSERT_EQUAL_UINT32 (expected, actual)` +##### `TEST_ASSERT_EQUAL_UINT64 (expected, actual)` + +### Unsigned Integers (of all sizes) in Hexadecimal +All `_HEX` assertions are identical in function to unsigned integer assertions +but produce failure messages with the `expected` and `actual` values formatted +in hexadecimal. Unity output is big endian. + +##### `TEST_ASSERT_EQUAL_HEX (expected, actual)` +##### `TEST_ASSERT_EQUAL_HEX8 (expected, actual)` +##### `TEST_ASSERT_EQUAL_HEX16 (expected, actual)` +##### `TEST_ASSERT_EQUAL_HEX32 (expected, actual)` +##### `TEST_ASSERT_EQUAL_HEX64 (expected, actual)` + +### Masked and Bit-level Assertions +Masked and bit-level assertions produce output formatted in hexadecimal. Unity +output is big endian. + +##### `TEST_ASSERT_BITS (mask, expected, actual)` +Only compares the masked (i.e. high) bits of `expected` and `actual` parameters. + +##### `TEST_ASSERT_BITS_HIGH (mask, actual)` +Asserts the masked bits of the `actual` parameter are high. + +##### `TEST_ASSERT_BITS_LOW (mask, actual)` +Asserts the masked bits of the `actual` parameter are low. + +##### `TEST_ASSERT_BIT_HIGH (bit, actual)` +Asserts the specified bit of the `actual` parameter is high. + +##### `TEST_ASSERT_BIT_LOW (bit, actual)` +Asserts the specified bit of the `actual` parameter is low. + +### Integer Ranges (of all sizes) +These assertions verify that the `expected` parameter is within +/- `delta` +(inclusive) of the `actual` parameter. For example, if the expected value is 10 +and the delta is 3 then the assertion will fail for any value outside the range +of 7 - 13. + +##### `TEST_ASSERT_INT_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_INT8_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_INT16_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_INT32_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_INT64_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_UINT_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_UINT8_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_UINT16_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_UINT32_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_UINT64_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_HEX_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_HEX8_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_HEX16_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_HEX32_WITHIN (delta, expected, actual)` +##### `TEST_ASSERT_HEX64_WITHIN (delta, expected, actual)` + +### Structs and Strings +##### `TEST_ASSERT_EQUAL_PTR (expected, actual)` +Asserts that the pointers point to the same memory location. + +##### `TEST_ASSERT_EQUAL_STRING (expected, actual)` +Asserts that the null terminated (`‘\0'`)strings are identical. If strings are +of different lengths or any portion of the strings before their terminators +differ, the assertion fails. Two NULL strings (i.e. zero length) are considered +equivalent. + +##### `TEST_ASSERT_EQUAL_MEMORY (expected, actual, len)` +Asserts that the contents of the memory specified by the `expected` and `actual` +pointers is identical. The size of the memory blocks in bytes is specified by +the `len` parameter. + +### Arrays +`expected` and `actual` parameters are both arrays. `num_elements` specifies the +number of elements in the arrays to compare. + +`_HEX` assertions produce failure messages with expected and actual array +contents formatted in hexadecimal. + +For array of strings comparison behavior, see comments for +`TEST_ASSERT_EQUAL_STRING` in the preceding section. + +Assertions fail upon the first element in the compared arrays found not to +match. Failure messages specify the array index of the failed comparison. + +##### `TEST_ASSERT_EQUAL_INT_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_INT8_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_INT16_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_INT32_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_INT64_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_UINT_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_UINT8_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_UINT16_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_UINT32_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_UINT64_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_HEX_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_HEX8_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_HEX16_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_HEX32_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_HEX64_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_PTR_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_STRING_ARRAY (expected, actual, num_elements)` +##### `TEST_ASSERT_EQUAL_MEMORY_ARRAY (expected, actual, len, num_elements)` +`len` is the memory in bytes to be compared at each array element. + +### Floating Point (If enabled) +##### `TEST_ASSERT_FLOAT_WITHIN (delta, expected, actual)` +Asserts that the `actual` value is within +/- `delta` of the `expected` value. +The nature of floating point representation is such that exact evaluations of +equality are not guaranteed. + +##### `TEST_ASSERT_EQUAL_FLOAT (expected, actual)` +Asserts that the ?actual?value is "close enough to be considered equal" to the +`expected` value. If you are curious about the details, refer to the Advanced +Asserting section for more details on this. Omitting a user-specified delta in a +floating point assertion is both a shorthand convenience and a requirement of +code generation conventions for CMock. + +##### `TEST_ASSERT_EQUAL_FLOAT_ARRAY (expected, actual, num_elements)` +See Array assertion section for details. Note that individual array element +float comparisons are executed using T?EST_ASSERT_EQUAL_FLOAT?.That is, user +specified delta comparison values requires a custom-implemented floating point +array assertion. + +##### `TEST_ASSERT_FLOAT_IS_INF (actual)` +Asserts that `actual` parameter is equivalent to positive infinity floating +point representation. + +##### `TEST_ASSERT_FLOAT_IS_NEG_INF (actual)` +Asserts that `actual` parameter is equivalent to negative infinity floating +point representation. + +##### `TEST_ASSERT_FLOAT_IS_NAN (actual)` +Asserts that `actual` parameter is a Not A Number floating point representation. + +##### `TEST_ASSERT_FLOAT_IS_DETERMINATE (actual)` +Asserts that ?actual?parameter is a floating point representation usable for +mathematical operations. That is, the `actual` parameter is neither positive +infinity nor negative infinity nor Not A Number floating point representations. + +##### `TEST_ASSERT_FLOAT_IS_NOT_INF (actual)` +Asserts that `actual` parameter is a value other than positive infinity floating +point representation. + +##### `TEST_ASSERT_FLOAT_IS_NOT_NEG_INF (actual)` +Asserts that `actual` parameter is a value other than negative infinity floating +point representation. + +##### `TEST_ASSERT_FLOAT_IS_NOT_NAN (actual)` +Asserts that `actual` parameter is a value other than Not A Number floating +point representation. + +##### `TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE (actual)` +Asserts that `actual` parameter is not usable for mathematical operations. That +is, the `actual` parameter is either positive infinity or negative infinity or +Not A Number floating point representations. + +### Double (If enabled) +##### `TEST_ASSERT_DOUBLE_WITHIN (delta, expected, actual)` +Asserts that the `actual` value is within +/- `delta` of the `expected` value. +The nature of floating point representation is such that exact evaluations of +equality are not guaranteed. + +##### `TEST_ASSERT_EQUAL_DOUBLE (expected, actual)` +Asserts that the `actual` value is "close enough to be considered equal" to the +`expected` value. If you are curious about the details, refer to the Advanced +Asserting section for more details. Omitting a user-specified delta in a +floating point assertion is both a shorthand convenience and a requirement of +code generation conventions for CMock. + +##### `TEST_ASSERT_EQUAL_DOUBLE_ARRAY (expected, actual, num_elements)` +See Array assertion section for details. Note that individual array element +double comparisons are executed using `TEST_ASSERT_EQUAL_DOUBLE`.That is, user +specified delta comparison values requires a custom­implemented double array +assertion. + +##### `TEST_ASSERT_DOUBLE_IS_INF (actual)` +Asserts that `actual` parameter is equivalent to positive infinity floating +point representation. + +##### `TEST_ASSERT_DOUBLE_IS_NEG_INF (actual)` +Asserts that `actual` parameter is equivalent to negative infinity floating point +representation. + +##### `TEST_ASSERT_DOUBLE_IS_NAN (actual)` +Asserts that `actual` parameter is a Not A Number floating point representation. + +##### `TEST_ASSERT_DOUBLE_IS_DETERMINATE (actual)` +Asserts that `actual` parameter is a floating point representation usable for +mathematical operations. That is, the ?actual?parameter is neither positive +infinity nor negative infinity nor Not A Number floating point representations. + +##### `TEST_ASSERT_DOUBLE_IS_NOT_INF (actual)` +Asserts that `actual` parameter is a value other than positive infinity floating +point representation. + +##### `TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF (actual)` +Asserts that `actual` parameter is a value other than negative infinity floating +point representation. + +##### `TEST_ASSERT_DOUBLE_IS_NOT_NAN (actual)` +Asserts that `actual` parameter is a value other than Not A Number floating +point representation. + +##### `TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE (actual)` +Asserts that `actual` parameter is not usable for mathematical operations. That +is, the `actual` parameter is either positive infinity or negative infinity or +Not A Number floating point representations. + +## Advanced Asserting: Details On Tricky Assertions +This section helps you understand how to deal with some of the trickier +assertion situations you may run into. It will give you a glimpse into some of +the under-the-hood details of Unity's assertion mechanisms. If you're one of +those people who likes to know what is going on in the background, read on. If +not, feel free to ignore the rest of this document until you need it. + +### How do the EQUAL assertions work for FLOAT and DOUBLE? +As you may know, directly checking for equality between a pair of floats or a +pair of doubles is sloppy at best and an outright no-no at worst. Floating point +values can often be represented in multiple ways, particularly after a series of +operations on a value. Initializing a variable to the value of 2.0 is likely to +result in a floating point representation of 2 x 20,but a series of +mathematical operations might result in a representation of 8 x 2-2 +that also evaluates to a value of 2. At some point repeated operations cause +equality checks to fail. + +So Unity doesn't do direct floating point comparisons for equality. Instead, it +checks if two floating point values are "really close." If you leave Unity +running with defaults, "really close" means "within a significant bit or two." +Under the hood, `TEST_ASSERT_EQUAL_FLOAT` is really `TEST_ASSERT_FLOAT_WITHIN` +with the `delta` parameter calculated on the fly. For single precision, delta is +the expected value multiplied by 0.00001, producing a very small proportional +range around the expected value. + +If you are expecting a value of 20,000.0 the delta is calculated to be 0.2. So +any value between 19,999.8 and 20,000.2 will satisfy the equality check. This +works out to be roughly a single bit of range for a single-precision number, and +that's just about as tight a tolerance as you can reasonably get from a floating +point value. + +So what happens when it's zero? Zero - even more than other floating point +values - can be represented many different ways. It doesn't matter if you have +0 x 20or 0 x 263.It's still zero, right? Luckily, if you +subtract these values from each other, they will always produce a difference of +zero, which will still fall between 0 plus or minus a delta of 0. So it still +works! + +Double precision floating point numbers use a much smaller multiplier, again +approximating a single bit of error. + +If you don't like these ranges and you want to make your floating point equality +assertions less strict, you can change these multipliers to whatever you like by +defining UNITY_FLOAT_PRECISION and UNITY_DOUBLE_PRECISION. See Unity +documentation for more. + +### How do we deal with targets with non-standard int sizes? +It's "fun" that C is a standard where something as fundamental as an integer +varies by target. According to the C standard, an `int` is to be the target's +natural register size, and it should be at least 16-bits and a multiple of a +byte. It also guarantees an order of sizes: + +```C +char <= short <= int <= long <= long long +``` + +Most often, `int` is 32-bits. In many cases in the embedded world, `int` is +16-bits. There are rare microcontrollers out there that have 24-bit integers, +and this remains perfectly standard C. + +To make things even more interesting, there are compilers and targets out there +that have a hard choice to make. What if their natural register size is 10-bits +or 12-bits? Clearly they can't fulfill _both_ the requirement to be at least +16-bits AND the requirement to match the natural register size. In these +situations, they often choose the natural register size, leaving us with +something like this: + +```C +char (8 bit) <= short (12 bit) <= int (12 bit) <= long (16 bit) +``` + +Um... yikes. It's obviously breaking a rule or two... but they had to break SOME +rules, so they made a choice. + +When the C99 standard rolled around, it introduced alternate standard-size types. +It also introduced macros for pulling in MIN/MAX values for your integer types. +It's glorious! Unfortunately, many embedded compilers can't be relied upon to +use the C99 types (Sometimes because they have weird register sizes as described +above. Sometimes because they don't feel like it?). + +A goal of Unity from the beginning was to support every combination of +microcontroller or microprocessor and C compiler. Over time, we've gotten really +close to this. There are a few tricks that you should be aware of, though, if +you're going to do this effectively on some of these more idiosyncratic targets. + +First, when setting up Unity for a new target, you're going to want to pay +special attention to the macros for automatically detecting types +(where available) or manually configuring them yourself. You can get information +on both of these in Unity's documentation. + +What about the times where you suddenly need to deal with something odd, like a +24-bit `int`? The simplest solution is to use the next size up. If you have a +24-bit `int`, configure Unity to use 32-bit integers. If you have a 12-bit +`int`, configure Unity to use 16 bits. There are two ways this is going to +affect you: + +1. When Unity displays errors for you, it's going to pad the upper unused bits +with zeros. +2. You're going to have to be careful of assertions that perform signed +operations, particularly `TEST_ASSERT_INT_WITHIN`.Such assertions might wrap +your `int` in the wrong place, and you could experience false failures. You can +always back down to a simple `TEST_ASSERT` and do the operations yourself. \ No newline at end of file diff --git a/docs/UnityConfigurationGuide.md b/docs/UnityConfigurationGuide.md new file mode 100644 index 0000000..0a0c0ab --- /dev/null +++ b/docs/UnityConfigurationGuide.md @@ -0,0 +1,340 @@ +# Unity Configuration Guide + +## C Standards, Compilers and Microcontrollers +The embedded software world contains its challenges. Compilers support different +revisions of the C Standard. They ignore requirements in places, sometimes to +make the language more usable in some special regard. Sometimes it's to simplify +their support. Sometimes it's due to specific quirks of the microcontroller they +are targeting. Simulators add another dimension to this menagerie. + +Unity is designed to run on almost anything that is targeted by a C compiler. It +would be awesome if this could be done with zero configuration. While there are +some targets that come close to this dream, it is sadly not universal. It is +likely that you are going to need at least a couple of the configuration options +described in this document. + +All of Unity's configuration options are `#defines`. Most of these are simple +definitions. A couple are macros with arguments. They live inside the +unity_internals.h header file. We don't necessarily recommend opening that file +unless you really need to. That file is proof that a cross-platform library is +challenging to build. From a more positive perspective, it is also proof that a +great deal of complexity can be centralized primarily to one place in order to +provide a more consistent and simple experience elsewhere. + +### Using These Options +It doesn't matter if you're using a target-specific compiler and a simulator or +a native compiler. In either case, you've got a couple choices for configuring +these options: + +1. Because these options are specified via C defines, you can pass most of these +options to your compiler through command line compiler flags. Even if you're +using an embedded target that forces you to use their overbearing IDE for all +configuration, there will be a place somewhere in your project to configure +defines for your compiler. +2. You can create a custom `unity_config.h` configuration file (present in your +toolchain's search paths). In this file, you will list definitions and macros +specific to your target. All you must do is define `UNITY_INCLUDE_CONFIG_H` and +Unity will rely on `unity_config.h` for any further definitions it may need. + +## The Options + +### Integer Types +If you've been a C developer for long, you probably already know that 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 microprocessor. It has +rules about the `int` and how its size relates to other integer types. An `int` +on one target might be 16 bits while on another target it might be 64. There are +more specific types in compilers compliant with C99 or later, but that's +certainly not every compiler you are likely to encounter. Therefore, Unity has a +number of features for helping to adjust itself to match your required integer +sizes. It starts off by trying to do it automatically. + +##### `UNITY_EXCLUDE_STDINT_H` +The first thing that Unity does to guess your types is check `stdint.h`. +This file includes defines like `UINT_MAX` that Unity can make use of to +learn a lot about your system. It's possible you don't want it to do this +(um. why not?) or (more likely) it's possible that your system doesn't +support `stdint.h`. If that's the case, you're going to want to define this. +That way, Unity will know to skip the inclusion of this file and you won't +be left with a compiler error. + +_Example:_ + #define UNITY_EXCLUDE_STDINT_H + +##### `UNITY_EXCLUDE_LIMITS_H` +The second attempt to guess your types is to check `limits.h`. Some compilers +that don't support `stdint.h` could include `limits.h` instead. If you don't +want Unity to check this file either, define this to make it skip the inclusion. + +_Example:_ + #define UNITY_EXCLUDE_LIMITS_H + +##### `UNITY_EXCLUDE_SIZEOF` +The third and final attempt to guess your types is to use the `sizeof()` +operator. Even if the first two options don't work, this one covers most cases. +There _is_ a rare compiler or two out there that doesn't support sizeof() in the +preprocessing stage, though. For these, you have the ability to disable this +feature as well. + +_Example:_ + #define UNITY_EXCLUDE_SIZEOF + +If you've disabled all of the automatic options above, you're going to have to +do the configuration yourself. Don't worry. Even this isn't too bad... there are +just a handful of defines that you are going to specify if you don't like the +defaults. + +##### `UNITY_INT_WIDTH` +Define this to be the number of bits an `int` takes up on your system. The +default, if not autodetected, is 32 bits. + +_Example:_ + #define UNITY_INT_WIDTH 16 + +##### `UNITY_LONG_WIDTH` +Define this to be the number of bits a `long` takes up on your system. The +default, if not autodetected, is 32 bits. This is used to figure out what kind +of 64-bit support your system can handle. Does it need to specify a `long` or a +`long long` to get a 64-bit value. On 16-bit systems, this option is going to be +ignored. + +_Example:_ + #define UNITY_LONG_WIDTH 16 + +##### `UNITY_POINTER_WIDTH` +Define this to be the number of bits a pointer takes up on your system. The +default, if not autodetected, is 32-bits. If you're getting ugly compiler +warnings about casting from pointers, this is the one to look at. + +_Example:_ + #define UNITY_POINTER_WIDTH 64 + +##### `UNITY_INCLUDE_64` +Unity will automatically include 64-bit support if it auto-detects it, or if +your `int`, `long`, or pointer widths are greater than 32-bits. Define this to +enable 64-bit support if none of the other options already did it for you. There +can be a significant size and speed impact to enabling 64-bit support on small +targets, so don't define it if you don't need it. + +_Example:_ + #define UNITY_INCLUDE_64 + +### Floating Point Types +In the embedded world, it's not uncommon for targets to have no support for +floating point operations at all or to have support that is limited to only +single precision. We are able to guess integer sizes on the fly because integers +are always available in at least one size. Floating point, on the other hand, is +sometimes not available at all. Trying to include `float.h` on these platforms +would result in an error. This leaves manual configuration as the only option. + +##### `UNITY_INCLUDE_FLOAT` +##### `UNITY_EXCLUDE_FLOAT` +##### `UNITY_INCLUDE_DOUBLE` +##### `UNITY_EXCLUDE_DOUBLE` +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. For features that are enabled, the following floating point +options also become available. + +_Example:_ + + //what manner of strange processor is this? + #define UNITY_EXCLUDE_FLOAT + #define UNITY_INCLUDE_DOUBLE + +##### `UNITY_FLOAT_VERBOSE` +##### `UNITY_DOUBLE_VERBOSE` +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. + +_Example:_ + #define UNITY_DOUBLE_VERBOSE + +##### `UNITY_FLOAT_TYPE` +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 +always override this behavior by using this definition. + +_Example:_ + #define UNITY_FLOAT_TYPE float16_t + +##### `UNITY_DOUBLE_TYPE` +If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard C +doubles. If you would like to change this, you can specify something else by +using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long double` +could enable gargantuan floating point types on your 64-bit processor instead of +the standard `double`. + +_Example:_ + #define UNITY_DOUBLE_TYPE long double + +##### `UNITY_FLOAT_PRECISION` +##### `UNITY_DOUBLE_PRECISION` +If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as +documented in the big daddy Unity Assertion Guide, you will learn that they are +not really asserting that two values are equal but rather that two values are +"close enough" to equal. "Close enough" is controlled by these precision +configuration options. If you are working with 32-bit floats and/or 64-bit +doubles (the normal on most processors), you should have no need to change these +options. They are both set to give you approximately 1 significant bit in either +direction. The float precision is 0.00001 while the double is 10-12. +For further details on how this works, see the appendix of the Unity Assertion +Guide. + +_Example:_ + #define UNITY_FLOAT_PRECISION 0.001f + +### Toolset Customization +In addition to the options listed above, there are a number of other options +which will come in handy to customize Unity's behavior for your specific +toolchain. It is possible that you may not need to touch any of these... but +certain platforms, particularly those running in simulators, may need to jump +through extra hoops to operate properly. These macros will help in those +situations. + +##### `UNITY_OUTPUT_CHAR(a)` +##### `UNITY_OUTPUT_FLUSH()` +##### `UNITY_OUTPUT_START()` +##### `UNITY_OUTPUT_COMPLETE()` +By default, Unity prints its results to `stdout` as it runs. This works +perfectly fine in most situations where you are using a native compiler for +testing. It works on some simulators as well so long as they have `stdout` +routed back to the command line. There are times, however, where the simulator +will lack support for dumping results or you will want to route results +elsewhere for other reasons. In these cases, you should define the +`UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time (as +an `int`, since this is the parameter type of the standard C `putchar` function +most commonly used). You may replace this with whatever function call you like. + +_Example:_ +Say you are forced to run your test suite on an embedded processor with no +`stdout` option. You decide to route your test result output to a custom serial +`RS232_putc()` function you wrote like thus: + + #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) + #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) + #define UNITY_OUTPUT_FLUSH() RS232_flush() + #define UNITY_OUTPUT_COMPLETE() RS232_close() + +_Note:_ +`UNITY_OUTPUT_FLUSH()` can be set to the standard out flush function simply by +specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required. If you +specify a custom flush function instead with `UNITY_OUTPUT_FLUSH` directly, it +will declare an instance of your function by default. If you want to disable +this behavior, add `UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION`. + +##### `UNITY_SUPPORT_WEAK` +For some targets, Unity can make the otherwise required `setUp()` and +`tearDown()` functions optional. This is a nice convenience for test writers +since `setUp` and `tearDown` don't often actually _do_ anything. If you're using +gcc or clang, this option is automatically defined for you. Other compilers can +also support this behavior, if they support a C feature called weak functions. A +weak function is a function that is compiled into your executable _unless_ a +non-weak version of the same function is defined elsewhere. If a non-weak +version is found, the weak version is ignored as if it never existed. If your +compiler supports this feature, you can let Unity know by defining +`UNITY_SUPPORT_WEAK` as the function attributes that would need to be applied to +identify a function as weak. If your compiler lacks support for weak functions, +you will always need to define `setUp` and `tearDown` functions (though they can +be and often will be just empty). The most common options for this feature are: + +_Example:_ + #define UNITY_SUPPORT_WEAK weak + #define UNITY_SUPPORT_WEAK __attribute__((weak)) + +##### `UNITY_PTR_ATTRIBUTE` +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 by +defining this option with the attribute you would like. + +_Example:_ + #define UNITY_PTR_ATTRIBUTE __attribute__((far)) + #define UNITY_PTR_ATTRIBUTE near + +## Getting Into The Guts +There will be cases where the options above aren't quite going to get everything +perfect. They are likely sufficient for any situation where you are compiling +and executing your tests with a native toolchain (e.g. clang on Mac). These +options may even get you through the majority of cases encountered in working +with a target simulator run from your local command line. But especially if you +must run your test suite on your target hardware, your Unity configuration will +require special help. This special help will usually reside in one of two +places: the `main()` function or the `RUN_TEST` macro. Let's look at how these +work. + +##### `main()` +Each test module is compiled and run on its own, separate from the other test +files in your project. Each test file, therefore, has a `main` function. This +`main` function will need to contain whatever code is necessary to initialize +your system to a workable state. This is particularly true for situations where +you must set up a memory map or initialize a communication channel for the +output of your test results. + +A simple main function looks something like this: + + int main(void) { + UNITY_BEGIN(); + RUN_TEST(test_TheFirst); + RUN_TEST(test_TheSecond); + RUN_TEST(test_TheThird); + return UNITY_END(); + } + +You can see that our main function doesn't bother taking any arguments. For our +most barebones case, we'll never have arguments because we just run all the +tests each time. Instead, we start by calling `UNITY_BEGIN`. We run each test +(in whatever order we wish). Finally, we call `UNITY_END`, returning its return +value (which is the total number of failures). + +It should be easy to see that you can add code before any test cases are run or +after all the test cases have completed. This allows you to do any needed +system-wide setup or teardown that might be required for your special +circumstances. + +##### `RUN_TEST` +The `RUN_TEST` macro is called with each test case function. Its job is to +perform whatever setup and teardown is necessary for executing a single test +case function. This includes catching failures, calling the test module's +`setUp()` and `tearDown()` functions, and calling `UnityConcludeTest()`. If +using CMock or test coverage, there will be additional stubs in use here. A +simple minimalist RUN_TEST macro looks something like this: + + #define RUN_TEST(testfunc) \ + UNITY_NEW_TEST(#testfunc) \ + if (TEST_PROTECT()) { \ + setUp(); \ + testfunc(); \ + } \ + if (TEST_PROTECT() && (!TEST_IS_IGNORED)) \ + tearDown(); \ + UnityConcludeTest(); + +So that's quite a macro, huh? It gives you a glimpse of what kind of stuff Unity +has to deal with for every single test case. For each test case, we declare that +it is a new test. Then we run `setUp` and our test function. These are run +within a `TEST_PROTECT` block, the function of which is to handle failures that +occur during the test. Then, assuming our test is still running and hasn't been +ignored, we run `tearDown`. No matter what, our last step is to conclude this +test before moving on to the next. + +Let's say you need to add a call to `fsync` to force all of your output data to +flush to a file after each test. You could easily insert this after your +`UnityConcludeTest` call. Maybe you want to write an xml tag before and after +each result set. Again, you could do this by adding lines to this macro. Updates +to this macro are for the occasions when you need an action before or after +every single test case throughout your entire suite of tests. + +## Happy Porting +The defines and macros in this guide should help you port Unity to just about +any C target we can imagine. If you run into a snag or two, don't be afraid of +asking for help on the forums. We love a good challenge! \ No newline at end of file diff --git a/docs/UnityGettingStartedGuide.md b/docs/UnityGettingStartedGuide.md new file mode 100644 index 0000000..a118331 --- /dev/null +++ b/docs/UnityGettingStartedGuide.md @@ -0,0 +1,171 @@ +# Unity - Getting Started + +## Welcome +Congratulations. You're now the proud owner of your very own pile of bits! What +are you going to do with all these ones and zeros? This document should be able +to help you decide just that. + +Unity is a unit test framework. The goal has been to keep it small and +functional. The core Unity test framework is three files: a single C file and a +couple header files. These team up to provide functions and macros to make +testing easier. + +Unity was designed to be cross platform. It works hard to stick with C standards +while still providing support for the many embedded C compilers that bend the +rules. Unity has been used with many compilers, including GCC, IAR, Clang, +Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to +work with a new target. + +### Overview of the Documents + +#### Unity Assertions reference +This document will guide you through all the assertion options provided by +Unity. This is going to be your unit testing bread and butter. You'll spend more +time with assertions than any other part of Unity. + +#### Unity Assertions Cheat Sheet +This document contains an abridged summary of the assertions described in the +previous document. It's perfect for printing and referencing while you +familiarize yourself with Unity's options. + +#### Unity Configuration Guide +This document is the one to reference when you are going to use Unity with a new +target or compiler. It'll guide you through the configuration options and will +help you customize your testing experience to meet your needs. + +#### Unity Helper Scripts +This document describes the helper scripts that are available for simplifying +your testing workflow. It describes the collection of optional Ruby scripts +included in the auto directory of your Unity installation. Neither Ruby nor +these scripts are necessary for using Unity. They are provided as a convenience +for those who wish to use them. + +#### Unity License +What's an open source project without a license file? This brief document +describes the terms you're agreeing to when you use this software. Basically, we +want it to be useful to you in whatever context you want to use it, but please +don't blame us if you run into problems. + +### Overview of the Folders +If you have obtained Unity through Github or something similar, you might be +surprised by just how much stuff you suddenly have staring you in the face. +Don't worry, Unity itself is very small. The rest of it is just there to make +your life easier. You can ignore it or use it at your convenience. Here's an +overview of everything in the project. + +- `src` — This is the code you care about! This folder contains a C file and two +header files. These three files _are_ Unity. +- `docs` — You're reading this document, so it's possible you have found your way +into this folder already. This is where all the handy documentation can be +found. +- `examples` — This contains a few examples of using Unity. +- `extras` — These are optional add ons to Unity that are not part of the core +project. If you've reached us through James Grenning's book, you're going to +want to look here. +- `test` — This is how Unity and its scripts are all tested. If you're just using +Unity, you'll likely never need to go in here. If you are the lucky team member +who gets to port Unity to a new toolchain, this is a good place to verify +everything is configured properly. +- `auto` — Here you will find helpful Ruby scripts for simplifying your test +workflow. They are purely optional and are not required to make use of Unity. + +## How to Create A Test File +Test files are C files. Most often you will create a single test file for each C +module that you want to test. The test file should include unity.h and the +header for your C module to be tested. + +Next, a test file will include a `setUp()` and `tearDown()` function. The setUp +function can contain anything you would like to run before each test. The +tearDown function can contain anything you would like to run after each test. +Both functions accept no arguments and return nothing. You may leave either or +both of these blank if you have no need for them. If you're using a compiler +that is configured to make these functions optional, you may leave them off +completely. Not sure? Give it a try. If you compiler complains that it can't +find setUp or tearDown when it links, you'll know you need to at least include +an empty function for these. + +The majority of the file will be a series of test functions. Test functions +follow the convention of starting with the word "test" or "spec". You don't HAVE +to name them this way, but it makes it clear what functions are tests for other +developers. Test functions take no arguments and return nothing. All test +accounting is handled internally in Unity. + +Finally, at the bottom of your test file, you will write a `main()` function. +This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and +finally `UNITY_END()`.This is what will actually trigger each of those test +functions to run, so it is important that each function gets its own `RUN_TEST` +call. + +Remembering to add each test to the main function can get to be tedious. If you +enjoy using helper scripts in your build process, you might consider making use +of our handy generate_test_runner.rb script. This will create the main function +and all the calls for you, assuming that you have followed the suggested naming +conventions. In this case, there is no need for you to include the main function +in your test file at all. + +When you're done, your test file will look something like this: + +```C +#include "unity.h" +#include "file_to_test.h" + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void test_function_should_doBlahAndBlah(void) { + //test stuff +} + +void test_function_should_doAlsoDoBlah(void) { + //more test stuff +} + +int main(void) { + UNITY_BEGIN(); + RUN_TEST(test_function_should_doBlahAndBlah); + RUN_TEST(test_function_should_doAlsoDoBlah); + return UNITY_END(); +} +``` + +It's possible that you will require more customization than this, eventually. +For that sort of thing, you're going to want to look at the configuration guide. +This should be enough to get you going, though. + +## How to Build and Run A Test File +This is the single biggest challenge to picking up a new unit testing framework, +at least in a language like C or C++. These languages are REALLY good at getting +you "close to the metal" (why is the phrase metal? Wouldn't it be more accurate +to say "close to the silicon"?). While this feature is usually a good thing, it +can make testing more challenging. + +You have two really good options for toolchains. Depending on where you're +coming from, it might surprise you that neither of these options is running the +unit tests on your hardware. +There are many reasons for this, but here's a short version: +- On hardware, you have too many constraints (processing power, memory, etc), +- On hardware, you don't have complete control over all registers, +- On hardware, unit testing is more challenging, +- Unit testing isn't System testing. Keep them separate. + +Instead of running your tests on your actual hardware, most developers choose to +develop them as native applications (using gcc or MSVC for example) or as +applications running on a simulator. Either is a good option. Native apps have +the advantages of being faster and easier to set up. Simulator apps have the +advantage of working with the same compiler as your target application. The +options for configuring these are discussed in the configuration guide. + +To get either to work, you might need to make a few changes to the file +containing your register set (discussed later). + +In either case, a test is built by linking unity, the test file, and the C +file(s) being tested. These files create an executable which can be run as the +test set for that module. Then, this process is repeated for the next test file. +This flexibility of separating tests into individual executables allows us to +much more thoroughly unit test our system and it keeps all the test code out of +our final release! diff --git a/docs/UnityHelperScriptsGuide.md b/docs/UnityHelperScriptsGuide.md new file mode 100644 index 0000000..0ea498c --- /dev/null +++ b/docs/UnityHelperScriptsGuide.md @@ -0,0 +1,222 @@ +# Unity Helper Scripts +## With a Little Help From Our Friends +Sometimes what it takes to be a really efficient C programmer is a little non-C. +The Unity project includes a couple Ruby scripts for making your life just a tad +easier. They are completely optional. If you choose to use them, you'll need a +copy of Ruby, of course. Just install whatever the latest version is, and it is +likely to work. You can find Ruby at [ruby-lang.org](https://ruby-labg.org/). + +### `generate_test_runner.rb` +Are you tired of creating your own `main` function in your test file? Do you +keep forgetting to add a `RUN_TEST` call when you add a new test case to your +suite? Do you want to use CMock or other fancy add-ons but don't want to figure +out how to create your own `RUN_TEST` macro? + +Well then we have the perfect script for you! + +The `generate_test_runner` script processes a given test file and automatically +creates a separate test runner file that includes ?main?to execute the test +cases within the scanned test file. All you do then is add the generated runner +to your list of files to be compiled and linked, and presto you're done! + +This script searches your test file for void function signatures having a +function name beginning with "test" or "spec". It treats each of these +functions as a test case and builds up a test suite of them. For example, the +following includes three test cases: + +```C +void testVerifyThatUnityIsAwesomeAndWillMakeYourLifeEasier(void) +{ + ASSERT_TRUE(1); +} +void test_FunctionName_should_WorkProperlyAndReturn8(void) { + ASSERT_EQUAL_INT(8, FunctionName()); +} +void spec_Function_should_DoWhatItIsSupposedToDo(void) { + ASSERT_NOT_NULL(Function(5)); +} +``` + +You can run this script a couple of ways. The first is from the command line: + +```Shell +ruby generate_test_runner.rb TestFile.c NameOfRunner.c +``` + +Alternatively, if you include only the test file parameter, the script will copy +the name of the test file and automatically append "_Runner" to the name of the +generated file. The example immediately below will create TestFile_Runner.c. + +```Shell +ruby generate_test_runner.rb TestFile.c +``` + +You can also add a [YAML](http://www.yaml.org/) file to configure extra options. +Conveniently, this YAML file is of the same format as that used by Unity and +CMock. So if you are using YAML files already, you can simply pass the very same +file into the generator script. + +```Shell +ruby generate_test_runner.rb TestFile.c my_config.yml +``` + +The contents of the YAML file `my_config.yml` could look something like the +example below. If you're wondering what some of these options do, you're going +to love the next section of this document. + +```YAML +:unity: + :includes: + - stdio.h + - microdefs.h + :cexception: 1 + :suit_setup: "blah = malloc(1024);" + :suite_teardown: "free(blah);" +``` + +If you would like to force your generated test runner to include one or more +header files, you can just include those at the command line too. Just make sure +these are _after_ the YAML file, if you are using one: + +```Shell +ruby generate_test_runner.rb TestFile.c my_config.yml extras.h +``` + +Another option, particularly if you are already using Ruby to orchestrate your +builds - or more likely the Ruby-based build tool Rake - is requiring this +script directly. Anything that you would have specified in a YAML file can be +passed to the script as part of a hash. Let's push the exact same requirement +set as we did above but this time through Ruby code directly: + +```Ruby +require "generate_test_runner.rb" +options = { + :includes => ["stdio.h", "microdefs.h"], + :cexception => 1, + :suite_setup => "blah = malloc(1024);", + :suite_teardown => "free(blah);" +} +UnityTestRunnerGenerator.new.run(testfile, runner_name, options) +``` + +If you have multiple files to generate in a build script (such as a Rakefile), +you might want to instantiate a generator object with your options and call it +to generate each runner thereafter. Like thus: + +```Ruby +gen = UnityTestRunnerGenerator.new(options) +test_files.each do |f| + gen.run(f, File.basename(f,'.c')+"Runner.c" +end +``` + +#### Options accepted by generate_test_runner.rb: +The following options are available when executing `generate_test_runner`. You +may pass these as a Ruby hash directly or specify them in a YAML file, both of +which are described above. In the `examples` directory, Example 3's Rakefile +demonstrates using a Ruby hash. + +##### `:includes` +This option specifies an array of file names to be ?#include?'d at the top of +your runner C file. You might use it to reference custom types or anything else +universally needed in your generated runners. + +##### `:suite_setup` +Define this option with C code to be executed _before any_ test cases are run. + +##### `:suite_teardown` +Define this option with C code to be executed ?after all?test cases have +finished. + +##### `:enforce_strict_ordering` +This option should be defined if you have the strict order feature enabled in +CMock (see CMock documentation). This generates extra variables required for +everything to run smoothly. If you provide the same YAML to the generator as +used in CMock's configuration, you've already configured the generator properly. + +##### `:plugins` +This option specifies an array of plugins to be used (of course, the array can +contain only a single plugin). This is your opportunity to enable support for +CException support, which will add a check for unhandled exceptions in each +test, reporting a failure if one is detected. To enable this feature using Ruby: + +```Ruby +:plugins => [ :cexception ] +``` + +Or as a yaml file: + +```YAML +:plugins: + -:cexception +``` + +If you are using CMock, it is very likely that you are already passing an array +of plugins to CMock. You can just use the same array here. This script will just +ignore the plugins that don't require additional support. + +### `unity_test_summary.rb` +A Unity test file contains one or more test case functions. Each test case can +pass, fail, or be ignored. Each test file is run individually producing results +for its collection of test cases. A given project will almost certainly be +composed of multiple test files. Therefore, the suite of tests is comprised of +one or more test cases spread across one or more test files. This script +aggregates individual test file results to generate a summary of all executed +test cases. The output includes how many tests were run, how many were ignored, +and how many failed. In addition, the output includes a listing of which +specific tests were ignored and failed. A good example of the breadth and +details of these results can be found in the `examples` directory. Intentionally +ignored and failing tests in this project generate corresponding entries in the +summary report. + +If you're interested in other (prettier?) output formats, check into the +Ceedling build tool project (ceedling.sourceforge.net) that works with Unity and +CMock and supports xunit-style xml as well as other goodies. + +This script assumes the existence of files ending with the extensions +`.testpass` and `.testfail`.The contents of these files includes the test +results summary corresponding to each test file executed with the extension set +according to the presence or absence of failures for that test file. The script +searches a specified path for these files, opens each one it finds, parses the +results, and aggregates and prints a summary. Calling it from the command line +looks like this: + +```Shell +ruby unity_test_summary.rb build/test/ +``` + +You can optionally specify a root path as well. This is really helpful when you +are using relative paths in your tools' setup, but you want to pull the summary +into an IDE like Eclipse for clickable shortcuts. + +```Shell +ruby unity_test_summary.rb build/test/ ~/projects/myproject/ +``` + +Or, if you're more of a Windows sort of person: + +```Shell +ruby unity_test_summary.rb build\teat\ C:\projects\myproject\ +``` + +When configured correctly, you'll see a final summary, like so: + +```Shell +-------------------------- +UNITY IGNORED TEST SUMMARY +-------------------------- +blah.c:22:test_sandwiches_should_HaveBreadOnTwoSides:IGNORE + +------------------------- +UNITY FAILED TEST SUMMARY +------------------------- +blah.c:87:test_sandwiches_should_HaveCondiments:FAIL:Expected 1 was 0 +meh.c:38:test_soda_should_BeCalledPop:FAIL:Expected "pop" was "coke" + +-------------------------- +OVERALL UNITY TEST SUMMARY +-------------------------- +45 TOTAL TESTS 2 TOTAL FAILURES 1 IGNORED +``` + +How convenient is that? From 192d5176f1e7dec26f9a547c65cd1c524a9df336 Mon Sep 17 00:00:00 2001 From: toby Date: Tue, 21 Mar 2017 14:26:49 +0000 Subject: [PATCH 093/157] Remove PDFs --- docs/ThrowTheSwitchCodingStandard.pdf | Bin 95714 -> 0 bytes docs/UnityAssertionsReference.pdf | Bin 181413 -> 0 bytes docs/UnityConfigurationGuide.pdf | Bin 143711 -> 0 bytes docs/UnityGettingStartedGuide.pdf | Bin 166200 -> 0 bytes docs/UnityHelperScriptsGuide.pdf | Bin 181016 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/ThrowTheSwitchCodingStandard.pdf delete mode 100644 docs/UnityAssertionsReference.pdf delete mode 100644 docs/UnityConfigurationGuide.pdf delete mode 100644 docs/UnityGettingStartedGuide.pdf delete mode 100644 docs/UnityHelperScriptsGuide.pdf diff --git a/docs/ThrowTheSwitchCodingStandard.pdf b/docs/ThrowTheSwitchCodingStandard.pdf deleted file mode 100644 index 193bfc7dffe1b672ca1526f8d93068480008b821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95714 zcmY!laBS`kR;%oSdy5NpAHHUs5cDFkyNik}i?u0^EKkk4=!8lVZ`a&!OUpRym*uCgf#X{c20v;#vhD}D|7tLB&1idKUw#!_Gm#v zBO`;^LBT1QL2hV) z^~)0TQc{b`^7D&Q^zu?m^feXi>=g8!@{3YZixi?248Sl}LEjCO+=Eh+OBA9NOiax6 z%uN-H%=C;*6-ku&|qff)OY&1u5ve87deXf^7sP zg@B^`5m=Bc-_xBKpxiPg+s|Kd5r>JNT`5jqBCIrjMp3i1Bw%B~kDmnAW@1+sT&n>*S^3QX5tN)^tZ~p!B^Te=iR* z`?Fn9Nv|OC6_M^qqhwQ0I8}gi= z<+14J%$T&P`P#imZlm&-Q?C3z+-=b^WzWXt;&ob~QcaT0mwtUYI;Fj@*>tg)oQS!d z?RBXoA?BeqJ9FK`kbwxDal%1S@@vr}E_5WG_xKilgoU@Fi(a$~imMgl=pMA1n zPwnP#e`ezy8*Fk`?PGY%Gj(g!JF~B`ma40!wMHIbOclx~3|zRy+&fYt)nrC_DD$Mb zUFkJjjdqI}Y}-0vjo>1-FW;UXb+}UJdad;L%Knm>4_F@07Blq-?dRF)uYXV9{B4(x z!}G7vvf2d!epNr1_*S?JSsk^BYWCU|Ig!=#$;ZOBeO65jCZ=HxGAC75bG;6jX|js- zh@^q$#Wbyc6?#o@yY4;h}b zZk_g&H=FT#$OXCgOd2|IN~#`lO{F(`SsrUQY_iVdPSAdL-9u$Uqqk1ZVwH%=uD30< z1g&0OSRs+N_TIvSu?iZZXI^dUy7uxkkLQhxZ#adPFrV*y&p6`=KU0}kmX%@T_L`p6 zueNb6?f2q#leGGMc=HR((r-d7U0OVD{e`^sX=g0Cnxofre4W53y+=EGib%=<0k71YtC!tiX_@wdr(5XJ^fb?NE7rTJ$hG+WIal^O zS-tR*d+e5^<10>7@b9PyoP2q2m$~GY(#33V+<$oR*E{&+BKlMqxK2Jha#%}xNg?lK z)*Bo-(;l0Lu z0^Z(k-L@=><6^O(w(4f1kYlc#nUO_#e{U?=UYmY-AM>+2p*@j%4=BcQR4tUgXr_^n zykV!{lr0B(($hRbLjE!?Jo8C3bzl-vI8%^Go za4720l|JhO63$yz-s~2CmETjNv0H#G{mYJHMmcM3uRrx|&7EoxVR(G<)cyyq_KuRr z-UzKxV_YPWe%UNyh6vlwh-ePaTl^|BmU~9s;<|l4LPJ5+#bUP<>$j&o8Q!J#F`l!Z zoj7(Zpo)3_o}~-SQ)PBbhPVoUciPtZlbFL8-Yj}8a^95B8vGnz16UIu=PeZ5$h!Pa zz(R-J*FSai=IGpO)RCLib@1AQow7cbT-(eR>h_A|ZT@}2)I=Ov-11N&A0fnTTdm*uz1y9;r=`2!+QT^`wZ5vyHjd3OLVRAnu7D4 zSAQCx==>?ZCVu(3?Hdnz?&0LmJ7BWaL0HlD=nH|p7n9cQJ~B(9@ZyTRR^yzNS0yeN z-CGmld~DT*1?zHdTCvYk-MJ+;MR?g{j@Y=M*C)aytY0a%rXOAHZL)duuRBRbrt<=w zxA^t;W*?qp%3S#10*fL4^ln{vU~?mdOcelou}?$eK;w_r*QME>|KTtv$o7{zGiGA zEt9e9o3wpLK!!kM z_Lr_F7kpX#{B>p}RXVDx9?vpN_FrFn``jdzW5qkRD+vW{4Gxj6w2vsiBDrty_0?YFrP$0MJp?UNjw3Q7+?>&)xR zu2`7fD!=4fqx#hC6)v93ypHyY{%vkm+WW|(mRb6$nfz(i^9oFp7{2Fr*i0x~zButC zm&YD)#T&jqoTbH{=f?E;I2Ad^ctuZW34i`zS@I6Yj)YUpyL%X&V(iVjKj;XrJ^sLT z^`Zmj;*Z74 zZn`fle7r-Un8kBS-o`~6Y?zKZ9unG+$J=+C)7N9m1;<(3O-(swd~V(2aCo9h59?*cNWZRIOaP?WNqcq z4$f`XQg3oNj`bZpZFse{Cf!WeT1Y2>@ zWqtckXx-0!Ag*fqUR74hrAgr1_aL_Yn^#yy*ovIh{NuYg?qe5Y6yt`6K@5^V-ikT* z@`N~YKfPYKtf-@yLuZST%eM088Y|OfWUF?!H7Y7@TaX)RQM|&nb&~wGtv|F5cE50Y ze)Q^^#6snmX)hWDIFxyXb1uZ(%U?aenk9-M(_AO)y3h4qJI71q$_dl@!WL|}K50+! zlcd)<=S==@J;iZ>BdRk$x|GExDQQ#Olb`zBJGjN=;*vSf7k^=#pr^b4LD^@M#siXJ zv-!B%<1f5Q|21Xj$@1VdPxbSme_FYX>=@g)}lK?NisE2?6aK~ z&pps*s;%?CE%4SlD2G@1*js z-JiLle{(O|(%S31c=6lcPoMYu|C`;tal*Uo-71}Ofh_By$}jNR+|iq6^xm;;nN9sd zH~Vt65Ve9uuPT-weS7S?w?Q;tlM`37Z`Rai-wEAX2I0z9T_+=C=8y);?c=BKxZO3vT++Z1y5{PlM_n$LA?+r{u5vl$+69e;2B zf6CL(2UcI&5!NnV)^j)Dan)9a*!8n+yn5!pHEfUaaZANj2iJYR#@V}J(et!@Oiqf& zGF=_kHk5_zQ(NEb@Jd~=O}1&Bpwq0=-4W-v9i990TIZr_!Rz@Y6ZSRnn^_B7*w_9o z>6ceZ;F-y*E*0FkuwAaSJMmD}jQD*k%vFvj1a9wO(fVo2qE_&s^z+2mr3{ZMgDs5e zDz-&Fy`ZtmWKD=;s~hXp%LkvzDX;j}bB%v)w_q;oN@cTCf4SCl#>~yD`u|hZ$?49~ zW1Mr_Tl8!et=-(R#^LuBL#0Qz&+UxeywRZ5?BrtY1vc%Ma(TTAIxfG_*4KZ>9;R3S z{?}5?fT*DUY3z1x%HGrW2AMBs{n#cW(rU=}?q|kzi%vJieTOvJj@3_`v!TW7QC^>` zcGB0&9|XGkcEvtA@p#qGv@6pNKfb&8$L$B}A1>3o?VjbuxsbmhEaRhv*ZjSI=7=pk zEY+N05zt&$7{sa-8__IuzG|ZO&(N0LYYdm&F74gGXJaB_;n`Kv|2N9>QBcgOGwU0< z7e4y+De&m_mE!BV^A!8zc5YgE(fXjYl=I@R@0YGV_2h!Kc*=#>2cmOK-tGDGM~d&% zp2Z5s8U^${&S@yM-h8&MQmC_%4&XY1zh?ef-tA>-V0P z3OifXc4wFu|MXqVxAEechu!lwdu$RrVd2UtDBF-5K54=k_Z428JSGt;H*PLfle%*> zJtS4-b?LRGcRQ+CZ$4k@eqmiHtL5|0-n}yGT$hH&SBgj9wy1Bv!xgRBzbjAT^9#xM z@lxDLYfjI8w!853j)0n&HQh(r9~n+mIiUJJyzv|NwFREi6B6exl$vOwlkIvaHDl`j zWpBMj{!Q#JY3OR1cX`f@w_g~vr);>p!ud%1#LZppf)DCW=H0t0zJGq-^jeRO@(SnA zV*ewp1k`vBD!9CRD&KrwOJ`k|6_3@cLQ#|KGq0tB<|Q;_Z+U)b$`5f_%Qd2GmH&cL zr@el<*ServVaegka|BL0_CL+Nw{7;5<9n{W;gVCF{jPpT*#|!>fx}{LEN%~-&Hk^N zsSLH5e< z2k{0sj;%DG^&+Wxjn< zTq1hm#hO!X2Os9!B(3(DCX%>R^!QFAotdRebU&Y3So5Ru_WLI)-CTOBzp=@i+RHE;}?yMaq!TB)g^xr!8tP;)uF@(rwGZLiHQgA&HMmuZV=F zFY-;aju4u5J+DM4?4I(Amn-kOEK#fUIDGu@+v#)q-CY}HryY9j9hAYsn%&a7<@qzy z8!~GmpXMhzK3KV2z+q9Vpqpd6i;BFfbXY;OPSAVSRf-oE%EhFpJ)Up&v%-1)W8YID z_bNH_zLiuI{hM+xbK;VzX%pfUjgQ?{H`*R|?=#z`j3;{~Y+jdHZ#-A)^7f8ML2mFC zkIvoaxth57s*9pNe*aOjQ>+iS5Ilccii-LE~9Jf3;0q@vg2 z=HE{{mIfQM%)ZgQJUoO!F5psl&S4A1y<*&QA$Q+}@!x9QetGYfzgHq<^%o|3E|xZ8 zE8&~FC4JAyub)Dl&uATr`f}}z{QP$|X63Eh^2BHFPQRlP_vF_e`^hptTTJ*WV`Eg` zdA-doFtH4tyJs7#@x%NtPn8Xv3KYYyo?W}FS?)y`7Dxs4#%+t=INc)+&5+w95y{dO+KM;`D0SN>setrMv<;LWkV+FtaJkwrK*dlV@+d8*4$1kR^;MR^8;yN48 z^_d;MSzNOH!%>z;mjrswr?+iT{4CkNT|dpf*)aK>%|EXy;Z(ci^vQvV_ilz1b8K}E zQS05f@lmTH%W|jFZ?`O+6__+H1&HZ2a=jto@CP~vL zs_Eswvh96esV}!ITQfcL^d?Dx5^t`YyL~yiw55t=Fh7({(pbZZXF-+AY+olwr6|MWkj$=XH7Q}a@w*i?s+xrL=AXlM>d)aG3T)*4bq`kZI);4#ur&;;to4lS4 zEiDtA6udcIqh4?daP0NuT&TgX>cOvYLqH&NQBW%9QGoz~$`FSm?yTG#D;7iugdCZa z^4+$$T)6T6<$wRT*WUZ?Jng-0@cTKI#ph-kf6rqQV7TC9$uYsI=Fo+ci@%pga|(Rp zbU5+&@N)mDVgCOTtQ`789VS|3eR{!ZEVS)E*8~eThcA6~KQ0E|w#)d-om@1vNQJecE}qizEWPkZAvABhnT~QW$o&`@?K%F{;VHL z4*j{t=`25UO`ZRDk!z1D6ntf@5}!z?l;|DsuGp{f_lc&mdj0<0U%VSc)?B~B_oZs}IM!3a%0ju`s`o?0- zL)CUI5iQ9g3U3=;H03%?*ygIEmVa32)3$oe2`_{Jm9?Cs&XxGfHs}}u&8t>COtS30tH>h!mpK<-0)&G5d`;CV0 zd-Pr(=6KQk*xYs2xpgP4ws35eIle1WUtLf7%=yEmZ(EbE7Ih!|w^vZMF!q!ne{o&G z9}&Iceeagc*O$H>chs!eVuOtn+qt=~Ro)-|{djMTqwSqf;;p(j(pXP@!PTMuhY7;pxm99AcdFQ#Jf3GyBb6+=&RLc-{oK<~2 zCOB2vQH#N%d6(V(dDl)aYV2!VTXA0KsKFP_*$aecbIom0PmtKn`nJ_2Lu*-*`+ zRWH9^@Gj-KRH$2>Q1`aBgtz^ZjHJ5U;mUU|mGhdP2QFLsMy5CUd56ZkFZJ3?mYVOD z6hHa$f5G==8SX2ErwYsO{?GdPpYKIwq57{gbN{_RQe0<$?zv~4@TvEnT28B$N5pk% zxT~z3bW-YSMbOeW+-j`vayvZFFk3ESH@ayUGvDCL=M3(Md*OeW`na?cG_9ZipEAYS z(w4n@N}|D(b#C+9k}rNXnBRO~{^gV1UtY+~-5o#uRp#D(_xyLB=YJKV6U2J!ezju^ z?<2lP;a3)mdnEMuyqo{@FJrAqQlLZp-+Hqb&pj&yUv8@UyT{-E`2FSccm4kQsZQ&? z?u+}c--`To;%f zuamgGd;k6QFCNrKZoI$Wcf*hEnwJdzayot4-}AX{Nus~*m)}jlGn4+tNola>{nQC~sdWEwBY&Z_cN>zdSrHzoVM=Wpe(Kneer~VZYmr&d-%Bf32J} z+$G<#td8h2lF>iE*OvRojiYz!T4WzQvszTa_Sc|aeO@EiG@hSbA2%?a4(oWKUU(-p zVjII-bJ5&#&2Rm@zj6<3oStO)e)jQXNjc?$>cA=mmq5Maj0&F*JQk6O{~>0^&3{nn z%44%t=>dG)3pwA3vy`6i%MfdrGhg_~Cx$0R!3{#~2~9VPDy?c9$~mI0MDJ^tOZuFk z^O`-=$+#mWE#uI?#%;gYZPX7!5A=Vu@&EaX`wAz*4IEyyZ`;aox&BA_$Fffn zzyJQVj8M-|`o5dnX#Lk6{pq(@pMDcqr}^ph4s_f^}{;L^NB(#+RG_i1@$ePhLl0 zLH<96Da8|R|Fi1*eS7ho=m!V@U;Kkdu_2F4c9{Q}|LA=^`;L9Zf=4&i)VFL{z$ba4 zvcvfnf2Mt+l+B^WpK3GoS4~$xczJzK?uRKc_cqiu7F`jw336Kf`}F(s_xG>+uj&8& zV0ZcAIDV-w4?QCe9Q?Gw_R+sRuT*p%1pJYG{qLXs=QmIPH!x06Su?qkDf0Nc)7n)J z=5;Rkcw)8hyUlYJE7ptUN*=s@>hISLP0rh5S?=;DTS~n$zEH3HZc;Y4Ubsx~y7lq% zf0gd6ubp7eU(IjG@V)E1f@o&`lH6CB&2{X5kJ?(@H(v0bxAL9$y1Un(>CgUg+U(q? zz0c;~|NP(I;kIRKh4ja3|L-Oj>L0Fc>HOWW+R9(XkhAn7>KmhDeXL^2Rp_8`f)8?7!Fe&-6XR zpH8W-&*wS(pC#K-IO89uq4eeX%C*cdrE>nuev5ASQn6rP9>=rg%6$p{s?XT>XdL;X zwItC)TG>fJ?9KjJ&BvAhKbHAbZ~6E6^Zx(SlFk^({Ooype$Rw+yZ-ZhjKBQr>mU9v z|2Dh*{qbi0B?+gdNinL!skL}*yO`l(1er)CP9rO0>KKSd`YlCH1K3dE=zR9L; z+T-I2Q_trY$#g$vYPl9HXZ`ud)Z^!D>Rfk8z7%TJ_&J@+kNjYk9MH7Ey3f9h^w`4xIivY{k2O`fnL=P1uZvG&5 zd81s8fb^kxN#{2`zsa2=Z+*rt^?q0T5%Z((kKE>(tK=oP`b6NDpq_A_fGJwfG{iKo zX>8Nlru|LhUg(_QKZ)@f|DBDz5+}uWO}-NptQqPxy=Y0y%B@%8W~rQ=y3I@9d$-IY zD}GE-aX!ZuSLvF@|H}t^7U)yj=8e5 zcxKE(z17;cMBit<$$EFH)b@>5xo&}Op>DbD(_3$DJzZ52y1Q?O-wwas=XTkZ*1kPg zT74(?uIjso?*iX_yngicwbz#0U#v|t-QucwyAxNV*R2g_nc1FDmgSi5nJ#?PCPE5MKZ$QY{uH8 z)iW2E8T`xrWyWe+jZ<Uq=g zWUuqdy$zFY7xq7?vSzaiGxa#vGpW00GrMZIkh#;eIbZZu!Y?T73|;5DPL_9)b?conLB3*M=YlVQPckGSFZ7`%kG_|{e05r z`qr+WJ@!-PEn3g1`LFv+>=q8?tS6IG*d+azUCBH2Ct}^^eJSyi^eMj1P^Pi?|&Cb4l<=v{gJ@c1mJ-?>6qIOMLPOjB~@S_az zaXdCx_iqyTct)Igz0QtL$Hi~2J9FU9YK||f!?o6(`ImI-Y2kGFy+MCNA8Yr=-z%&9 zy7cPwZ81@71us?aeJ?t)^pf|BnfgoPKE-(L7pdQP_~@VRo#LDIx9ylwXZSVg(a{~< zf#S~kleq2Ue*8Q1mHWD0&B^N6ir0rOa<7j+5UBU(@1bt-Z!stKU-;%UoBN~qBRvbf z8@b1G>Tm5c*xNVp-s@A-r<~Wmu020^UGTclb%FCj-i76bIHNxqh(FX?~t)opV%R zA=6PS`FTyzAB5L5q$hI9w09Q>n;qc$!CKdLdjo6PLF*4kra5z2a2#Cr&?UwrTDg z1?!V~n`ZB6vODelZIag}{<`+!B~3cYzfUq2P1xhLs$-tS3B@4ao+B=2jxdEk;1+Un zI+JJgSX6^z`ySDQueT%yPv{YX`|3tiK_8rCj6Yrmtf8syMC(A>3rLx^6iSLFB zT7t9!++0^J@LIJfYn7t!ifOM_%#&I%an_2NQ5hV(s=k>Lyy}`NQ{4izdzY9=xh~G+ z*?Kub>*CWZj*mTzC%Mg4nR_f)y!0~5tq!$IDzkj1Us$@x)8z8(LpF)~HUvcI=!k}K zXtyqJNpIPD=<|-^eHuC9Wn8;kZ4bpgY$))k@U3wEvAZD1qIugd{)cluto*R^Lu-NW zkFXtzcSPzI*LT&?!S2drTiEFDCca}-UXs1J9Z1qxf1qGsk(FTnQa^2 z=CI#BS+?=+j@54xo#S-$^OQ>``o_N`y1ci8)t zLHH+L+hflT2u5(5UoeVqQTLQvqmp}~u0j_BirJuNmom#e`a*dCM5E}<` ztD}=)^nqm?C36&KpA*~YeluxXi*BlDj%4&XxkUfXqHhYf36(!le`5R7a+_T8EMAG5 zYZ9|>=4_jon>4#{d7a}4fhdms9DjONFs!H#^wEfWQJcrE&8ns~MQf|u>dVqSYMWJ6 zOmu7xNo96-^=&-v)n}2u=k(kQ8itxX3nwqrTzU4=rP=9QPMkS)E_3GXRi*Qm``#{l z``NnW&6S@E^xIsCm{?eDMpI#LD&0UsYIsyZj$_#mk4-YaKZcIQXCy3ZVw zoh4p3uVh|MxB2wq%>J{pY}508?m7NUKVnD5$4N^?PfuH4QS)?_`n;M~FVn;9cc;DG z_57Os{=~=2&PK=G`1QzJKmYc=&30BZf*JaWNY5k+eYfv+Qy43tD-hvnX=4RN?l#m%&TDcqq&8A zn%CrnWmCJixV5ymwndy#TkN?0a@G~CrA{eKsuwKo-(2YOX_xn&GjHEqS;=|cx;^RO zh230UdxXSFcWmzs*P1xn^ZT|h38w?UZ~ej&RV5WAG|hoj&o&Ud83RPreK-it5j7XSVkEdCl;xs=nsLPkUvT^{+gkpV`0t_Ufx!inmFx z%)BJ=Eo;k+D@muMAI{k`-DQhfQIp$~=WmuSxTG8$H+ysKKJ!aA=M_H?jrr;9Ucp@@ z_H289kww=mlW&vC4$nQj=RwYEQ?=8+3+CGNgkL($SyjcdYPswQ^eA)_+rv&W^q%s<&^qnb(RF+xwJLuq-DRhm&3-=NKi7>Y}1yHwA?7Qg!Pq!j15b0*FH95OwQcarKH<@EFrj`b!nPJUc-Etc!l zNzP;yJ-m5?=t`Iei?e@<(!;J6Bhhfz>sRaMMItS z==*{XtZ`va8xv=Ioc3LZ=ZUI>SSaVbDNmI2bsw4@f0cdc*QZ&Ze$8ror|Ng*$=^>a z_0Oy>GXG;d>yY!O<4-C)f9zi=C%NMNrQ0``K5uZ++`mXg+f z9Cz(Squ3woPu1&mFV;Bq+HvC6$GidmnOqOPvE^Od^it{1!&^6(6tb6;h>FV232N_} z)U`15-={>slTX%Ixb$CsEIRqK_bbumr{eeOoVuM@DR?T2=Va!kW1Mb^OnFLwI2e;Y z&T4wmDA5$rd7~rX#M_FKDo0|D1Rl}dc}&?Q#BS!hl}?*{)P5hcouiiC&bFz!>*eX`dgG?L0xK}9$ zIOo4Ho^jc1TV+QbXSIO4Ak$wV`}hm`33_{*#1f8V%Oxp4(s-ovNX^M{{e$O5b$S=Q zZ@en@aD1ZJreLPjrzCtaR)ME53HV8*S7Nfi}Vw> z+NaLEnc4otrO3-b@HLm3(xN6#?}{kVzY9L~AGx9R>#CimWm)j-kY9oof+Fm{Ir9Gr zdUPj%0=ng zcXN|(w_N`I;EPoL_^;<;7;-ggu?9`U1Ezyk7 zzhwUHXmrxw+%sP^y41ziYj)VU@E;L4;?>e5x3qAoa*}Sv5-)kCT!Ny661M*bQNBT4U(nv>$@VqwR` zpb1B9jgmDTmsNj|sTH;_{81Rtu6|4;*UPL_D9lZG@!T&Pe!n#lKJ-)bep1-Xk6X$< znE!ph|E1$yH(&YX+KO!ANud+gt@)#@wykT;$`bj$Tw%9)tk%wJm2W;!(_0c5p!VEY zA?j#mamO<2iOWLWz8}sz=2iaqMpn{;y?n?13D%l^yZu6|>*VW;?aB7jR!OYvv29ni z=08>^ve)EWiq}*w@4g+YIVNR!=2dA}X_tN1-1*XGO+>h)b^GMzjhh!+AM5L%rtQY2 z#Wp?hTyoFbr*Z9(*d3C)_-eQ5mp2 zc3D~2?u0zfbcm;P|(A#@^lHR@K!wXLvoUC5H zeREev0ki1b+|KKlSa*HNe0|pIUC`1m-#?|Pm4DRYW)pj-`sAaM&euz-p)BS5wH`fp zYTFUA?I%r&;8!3n?pYCOQ1e5|+(ayg%r^TRrP-mH*rAm2a!5Pp;MNZsULSyg?}a zpNC6l`OPneVfjA|Ja1X=(Wr1Jn9d_@*LHcK@?O_-6W{JVJooL=y}ImwC%%?k_KRuW@)aKO<(=tnsl6bN6?z)R|DaXFH#9HThOBn1)$J@2*~)9~o2RRt@7-SN z7h?K2{>|kik#&cK=gJ*iJ!?zmrMB>ez8|%i?ccDjUQ--pwP@AJZ3$C3yU(86Ho>Me z>ZZwtXZ^YIKf>GWBTP!A#48@miuty_ZiAlu`P{dsmob%mRQvkw(b>ZmrmPY$ZN2wRBv8P@g zz4)QI_CjdqRe{b8o%+ry#m%Az{_{SvTE1`Nzt?-_1^<#YTgSzeApJ%yIni9E_3;z2 z59-zJ3HBd4mfNmrkNjYwb1XK8VVX{B+z-Kxe=>z$-sjicAo+dc*#frP-`Xt$cpn~l z^(W(wUbcg&X7WZ0wS8JnF1Zu`qW;eRCH2~SINDpv z|CBCZmF78qUh;qcBlUmX7g(xon6n=mRR+~E*jRX3ZmW@7cED=k48i{y|L31*WKL7y z=h<~ovZzPx@m=>r=108JINyHI)BmyepYRPWsjftxHO*O*9Ib-dEl%7&ThDf=u*dzw zy6lBQe2E0!y{(dj(6H$=6?8l`1@@8v->%! z7TKL~emB37*J87CftcOV^Qk{3b+~x*{CMbJ`+L&%;(EYnzt>r{a`$!Z^=@LYFp3mmp^~;cht;aT`Zuc!YSLDl(@tov?3%z zx1zPY^?a*-tF@DE-5;OBNs%(en^Ue$`ITNjf4T~GcU5zZQ zyKd7i+)T0W6_*d(vP9Rjd`GMM@8vI}OO*FIM|0iv5WggS?Bo5Ar}kX|$Lc>@Pv6UF zenW81?dpo>?jlx3?e{`nESPj+zq#)}y(ODc9-7ps#i)60lhiZd?Nl&-aoUM7>tObp ztq~l2iMD%`rcAn7(C~~oBP--|VE^vPvM`@Q%i^ zJuLH7m2YHJ$Xq(9^MftUX|;!ly4EC-#3w4Ur?oOTZt_pbeZK#^&!bL-wnI!oI%|UO zESZ1E#NxC`f#;3ZJM)*W=eT=AccZvuvzURjnB&TNIU6mpP5dV^1U&2uHfq1Po5q=W zrm;k?YO3Rl%Y2JU!xzhED3=@-($4Y=ztX+$h2ph`>Ab%<+oVjya`)I*ZTz0Fe-Z!M zri+Uj7hGpdSYEp~q2a%3#A|t8;lKV)!e7|C|8D-!cl&|VnwH#@h41qXB>ns5FUlb@%kZy z9{=@^bn1@?T5%p%xO;u>yRYQ}YL9F5o&Eox{ui;R(ePjULUx%(@u^BYp=#{x6+i6$ z{8{g~Od*fefm`rB^M~#IPU{(NxRms>kmeU?T_PLTxXUL zToz^XEa8c)5@XAwpXOgY8w_mrwDUVD@C!;atnp-+xMTgzO$>|jn2%%#c)XQnn!v_j zQP8tPh#}p?p@yBIoV&p-oN>~xKioQ;3qCqC_&#GWxyv=-6Q{#wiw2WD?!Sr}o;_ud z{K)WUYmV5b8DE7QzPU44p77S2w$+O@ebF&R> z4jS$%{q?BXldlC!*2|Be{gDWT&p6p`s)Y%o8E6E{@*pwXNc4cdt8w9V!wIRnnl$%d7aHk0qBD&9^JX~yNVO%o={ee-?x^qKw~RetWQN$;&=e$RgY(m4Hx zIbYh(s!Kv2oednd`_&G597qXV<+Ds{(msAOsSpp_w5M)|69jykR5%Xleg1sb>oqx_$-({1T`8~r)JKf0h+gBT>I`uYr z`_-!}_peC$`tW+qM!T2$K9=@oC<}*X`>^O_ooh^6>|nv}c0+^5Oe%@@%7)XQ&L8J5 zY}#4bByIolq2R+rwJ7s`74_p=y=GXxKhcnvUTb?&^wZIa&a1WAY6614-|XKvzgA18 zmg`P}hrnXL+#l`xha=CV*fLSMLxTm_x#=o)7Z0T zTc_OKab)}KrMu4b@vwW{6nth7{773>yL`gbeV3%4oXnk*_u2PIVc8G8i9ZY2OfLLw zV4Iq~d{LK3#hp*5gm_P~@`@TTcj=`1@k=mGPSDG7I(uWu)78C?@9oPvR2aDPhv@XZ z@7N5ZH_cwU?D3^Gttp(kQ7LjZ!58dxcefTi^Lc4hzWu~P=E6H>OS<|N3kS@Xu2xdN ze3I#{+pdQb{1%uM8ku#ZOb-7rGgjBEmRIv`o{4vBkVsma@)}-Wl~8uR0@;o^j^s+($_<{nCufR-G^SyXeC8|GdWC#|vtc9~`J_70K*c z_v!wsC6m6D{ukwNj}UPCFM8f!S%lB@jOh~oQZ8GAvX}l;j6E#Zl_P#tJtg4Af)jCp zkEcG~de~WxPg*`w=&Q!ug)`R8&5T(Su{b8zD)Vp8yzn{K;|y-)l&Q7d`ueNGXzTHZ zIrCPjEihZTvMO}VPM%eNj@z*5Og+%NX6>f^dwtTZB~4fEFqvt5{-*lTr2#yVf7%tC ze5Q%L%zXGzEJUl-Snr^05|_V!cB0wNxrJV?_dm+#&5ENYiqgfvA}{67c@K@54!u3LOxU(6xp-rp*Gi>{F8v-y zJ#tM?s&XrCShe)z$xnBf=4t9H&7QIOC(lBQn-5L2MNaWtnNt$AdH>n=+IfGCQnh|Z zzmD9vzQo3~<@0pz15-}Sm)-YqONQpQ5E-$4Ek5o0VRL)J%C3pN{3UVhwVOm*R9c(P zR+)`4n`66orCyf3x=+e!vCqY25|i&PskmFuJ!QuMttDCib^Fh*Gh8Xs6?}2qg%=sK zwQi{itlH$tUA22Ls+Vfd?_b1FPyw|(y(dsnr`POk_(zDd0(`Ngz zykUP8Zpq!{`B5Z%#^Jf0LYWtp7F+7A&xzRaEhFj06%nsxYtAkaTql0*?wxJl^844S zw>#DSKi*z$wYR3`w8HOqcXNx{FnRLm%DTBJtS||%PlKt=leh7g;K5Si%ToSze)uP{g{4i z%OCO9nUgHOS{-72a&We++8=Gks!1E;mvbjy%i1NX^ismVW`=E4$~Tw2OLIC*JQoG+ z+;m3wcEjw3+fSCg3-w(Ssa}*nZG;z^qVj1 z7K-IYUR_j}JiYy0dCm7z%FB=SOMSedb^q(<{2wQ4Uf();?|51+-(3g!nYMp6vT`qB z&hK9*W0+DK{5!i}{`22orbTD|GtJ=q?$7(;;kMhV45?5Yr5@B$%iV2dx|U4zhB># zAM9GHHIsMqNgcD$&{cC6&0aQNawCt{iK1;DrvAGfwtMVXdKCLPT5+01$f;8qCy#Zi zEG@X?QdI1_Ro%;KL$srKYW}X3nweRJH$;<^cf026Tdz`krDb(1*-Ov3N+raD$GAsL z*)(jTI^VL$(|dM&PpnO?iHvA&=lk4paYN`?DI1e4rM%|yl}l82TRe3O*tAKHt?ojH zcOiH2ZsS?(y4&NvGI%>V{lDa=_(gwh=!C+_^8bFl*!cdKf5e_c<8IpxZ`9rK+4a;tW6rqmCg(Sn@_x5qZ~I=}CnU!=KSBEKoXpv|@p;i{ z@#6dLmL2&P`{Vj0Sa;E;plOCpl%Myib&95}crD#kW`a z=LUvYM^V|$^KUNxy78)t^p+PQXTxqjTFbIVO?&IQte%g-*Xk@DXc?P#Tzg{}{CU-r z?eERY^ukRF^lnXgB<(oU$*`Y2g*o5Xc$T_G0k;d6Ms#=NJ%PI}(-LOr+&a1Ya60c> z+uaLTGYcyY9gJF3ll`=J|Jgs8r`Mf-@lt%bUC_?jYj4gj*`E3A$huGN~Gc@g_-&dbT!$~bM`-?8&)h0SSYLqQQQ)6geIiqkbD zjwxzRV4w27eRk+UkCh_JCzc;pIqrUQQ(jAg#UbYh&JvS2T+`28+1Im>llMrz9IJJTy~`V{&^37`%Vp0grJ6pP zYty$VF0dBndHHJRI{r5kel!00FLhwYO}@en2PQXFiMXcUOmn@MxNTx!$)3CwjeG}q zXKgdsVt!$T$J9xUng?^(YLhfJGTUcc$QJh9iSW(Ii+~-AU9}Iq*J(qAkZ)M4_ce3{D6QP^;aEm|KVPigBKvjErqXN96Zg;kH{(FV&sN=>Ew6YarSm1P>n>0I)P1<&|H-92+6@A;<>PY#E zI~(KW51(;y-l08l$5l_mcSm@lyWf!^ZMiT zn(6kZ8L53o-+45zJiy?TFISw=!@2SnlkQcm!~B>1F7WNTaQOG_ryR2)*3_D|dz_p+ zIkU+0B^&3L4+p3CeRNYjSp2A_|6<4msYklAdp@pQc2X^CmD+8^uDl!br%x5>e|z=8 z5^0+(&E^yrv2XEmHi36mIDcFezB{(vtLdEX(__6!B?aMuwx7DzFIupNoGn0Fg$1@^Uv@Z4jSRoK>kRDT0!xS&hZE;D$UQDy{KZ`jh z?=54!sg0YK=9+!ixn=gPb^h`%_b141&!1{*sJ8h2lveB7-REnb&#rwZQ~4@NOeW4Zr3ySKZ)99_Aj#p6=x%UNaIe*ICKcAeF-nHO9yD-|jD?z@+P!0z;lF3qbZ zQKoLONl{8`jOL2m50WvyYm^z9B>2*u+b4NT+-3b;@n7~!T=6;n<%~jxY1TwTp5-B2 zOM}`or#dY^BD{aemDVIiQI^h^P8(Zq>2+!Cb_xi&cv8-EMaliDAM2~bg>`pTuRXqK za>A0J7oi8vZ944}(K;>8wZlDnf%URIYlOpIcJw{>b$c4AI(M~Bc+k_}W1r>OZ5&mY z{zn!T=1x>A*?DbGjI`dioLF5=bTMG?U2za$J&3T{AeHBE0w-2 z4hiqdl3q*}D=?iA=X>|I-}GLoy#=ZNKbcSaJx^)vvsBwFOAjYY*NC5JIry%Ox#*Y8 z<~!S?*XUW96n*f1$?1N|{k?9c+83kt{#Vy3gObjwE!E4eX^-nSdz?Nm@L&FsmoLJT z7n}+P@UE(_y^Px7D>I5B1U7SB>$Gka|JvU2_t*BX?+;&{5ubF1&AZ1^&CMgo z#7N!Md!y{vzfQl~zjn(g_x1mrojNmh?uKg{^s1z9dTpP1UeZZHBxhN`os~5z=c#E=``y3&)85LrZSNmH|2CoQxc;PLy8X-K z>$84`H>=g`ebK6~nOnB`8L!dD=IkZ!?`bceol{lR{r;J7d+q%&8Atg&jJX92uQ~*u zZa(mMT9T)AXu`v@YP$tPPG}sf+IB-CxZv*F`nA^gy`;qUMrQ4Hx7BUYSn9P8RborTw2^8 zJhYjzsB4Ez=E1|!Oj^g-J{>>DSlqR2TIu|sM`pI}+pF@sQ+)Q*^6GC7-|en_-*q+7 zFt+{Yxp@^gpWn7K$t~|r`+0xgm#_JrW$Rd@FNpmpzp>Teg77kdw^~z!IGG*`UtRGw zDnRq+EZ5mOXQ$S-w5#+kSuQnu-pc09*S5-J@Y*e!{B`e++izE&{H|TI`N{$3#SGgv z{J6#IRP@#|u`y!r?djW3FTa1*@@Cr{9T&eV7miL=Dc&SxKD#Py!o;r?mo5ioT{i1k zmudN8-^KMwHv}bi{P;I3p@!Nkr5dIv6cDjmubFgOz~{K&81sP_xUl~V$m(idqy`D4%<27 z_RCGLl4S()cnT99Ul8!@+-Y&~slvsmD-#2Z@{~)S4 zY|=xc`^l;g1y3y#Ioo2t=ZUq(tBH{>ywulx*}MOx@cmk}tk;x6#r!0+N4DRt9aWFS&Yo<>b@5zs6ihK6y-d-~H3=X+p;F zC)Z|J7jE+FeW-44@^iw5XFeNNo6a_QpS{9uNyuuavpd>d30&TgDJhMfB3DddE&x*xOrkuqKf5Q`{^zgA9sDV`1|?C zN2}I|*zZEJAJW-(tzRd7?~leNGya`I4_-3I%-5)2v_*gQ)ITYi@l~H0awkbG=oMnV z@{;Rs*pXN>AQ!9ekX{8-M}2e@@uZ2}mkKNRZ_+>sS${8)3lTAF=UQ^0!ENEi1`o-FUTe8Rq#Cn0H)zdzY`Cl|W%3Kr{?2e0 zHM=E`Qg4N*PBaMlsKv^YB3`*AO7q2uZ6^!4=W%=If7mQ)zBFcC+RmLa8GCKg9-hBE zA?oRKX|Ji8;ZwT}yF`9~?@F_!hgrBjm{0*;D*9+k!%*)@dAZ{4oF0o?jM! zTQpu@yL9|dK>2gAtQw`iJKjybW%}jy`x>1cRXUz^-zUAhDA*OI(bP5n=BgK`<(emP zIfk#=k^TGEE{g{TnY~_e91gT|IQl2m+$@H9fx)A{J}I-(^#T@aO>tX!qvWpAU27}H zwXfH_&Jhus>3#o3fCf*><*)q`Vy{D^v{r5Us>@@WA--_$rNyt7Zz-% zau1#MYHgL`Z3~(B=ups9zxDp2p)*2WR!LS1^0zI~`Zt|rYt`O^2~1OGO^Z0CdnL$s zd*eKl)gr2)qM6SwzPKWFa`Eids<*Ok@h7M2Ub~>hlXBIKX;R^)&KavR_J^x(bkPxK z-Po0PJN?-{)k*uyG|p{(bmeJ;=;du~XRapo!~`Jo6a`Br?%w6#N3QG6Xy5Ho;hQ-B=yuu zX5S4aKUj2jawNyb)LQZ=JQUP5>SV5!Efo4JCFIYxtj#@bf})Gfo7dZqhiimg|MSOX zdDHWjTlUr)E}Kfe@#;NNnrItUv}VuYy6x8&J&n_0p1ZbdKKm3c6BSXpc-E=20#}8t znxUX6lC*J&s?aZsrAV654a7s_RbhIUTmB^Ml041QoT*OrCMCrc9PwYaE@);o9=y&)a6j z89kgT$p(_gChvcryJ6;nuP0|G39d4DD9voRzCL=v)%@$f0&G6th!OFv^tE)WI&8@H zBjyhWj{s}2t*V(ar)g`Oo2!efVOr9{TO7F}x8({ie3<6g(XqiTQ1e*wJHboJhmy5L zxUc^8tv&1P#OA`Y@!RIF{ZV2Yr_EA&+mx^|`)XnyC$mI!B~Pc}uAOU?7Qg4q?yiif z{@yLYljZF5=f^2$o66(oOdPAEX3P%e$xgJ0bc&jzCR_IIyR1#sweY=fWraR}WEJ}Q zV!QvI=f7vnQxZP$`FO2<+@3eLOCHD?Jt)1Ozi;yr%g$TwTl{~nb5vNCTDs$3)dr_} z|6?AXe+1k*dPTKlL1u!+f++x>kg=u0JnUmaCsvR-%p8EfEtypyNlI`D) zs+yR8uJLgy4xS*@Eb`j^rubvNE6LTt6Fyb>ORB}RwJ(yNRF%!{>fbSMQQeUbD+(8; zb$*QeTb4ZaA3rd-`Omt5}*+iGQVNG!9zgTZ}{ zj`8ZN873><hmYRy=zx=Wy@DyJ$0Vr&TJOf6Y{fDm!Htj zXL_IKawlm=fb_S<1I0zXr;^W@%_=%GO=jKwB_U<0RT=(nq`wNej&wr+^dR9#5{3Wf|%Q#=o>@Sm1-v3(q$^W+6e#26& zA2zSsxerIqG?;1_?$kCx_O9QHHE*OQ%ip%!=j@cf(8E$=S^eUrifwLHk4UY@%}1$Omtc6$Ir3; zufnCn+i%8xWZN57@_3W8TtRI@(z7GxwT327>*rWi%Kib%Lu z+OAV8tKOk-Yxau8ceb@($@5U@+-A~#+v(0UyG>`!vN>M;EM8UZxA>2$;3Kno&z9_C z@<}XwUq3B=a%qB(wXZ+-yo-;7pRj-Z6uszyrKygI(j31z3->nKll7v zUz>6wo}J_4(G6VjQ&!yH`}=(S4zV1!^{37=EDU&caYt|Knt;-vqlbQ86YPt2FTNIZ zwb6FTth^e}J$WIo8fN|cd?KUO>WXjo(gLMc@s`VzKAe2`^r6#^IJ@|d`?B7w*5rF! z&9~08$k09`ae{Qgl122zOcPNe{z5M9oyf395?PN zd;fgjEpa*ZU-_+aTc^77^H}>iS-#KuVki6Ld+z=!tEC+(oKl>6zFm5u;ftbIMXick zYQ1dt(#u}Em}FBcrW~BSDJrOQVa2k8FX9#@X)IkdE8t_aXY<8V9-@+-p>wKp7r$W= z)eK)7lsHeIe_oYTD*wV1)w>>=PgT=Abp$fC+%#4juF`E0=DD`&k3CzQ{Ko}L1kJJ)*;Nnx z51X=we<6SQgf9*~6a6w~?<%)b*gX5#F;m6U_g5YM?0NS1)5-FcEvl!UPw`-QTJmoB z$s+&XE(NoNb@Q^#wiu*GM@3jWyBDW>yJstYF&B^e744fHlHC)MAn{0ZiiUP?*z(}l zyl#v2OpYWyte3qd754P}UG=8WMHOCigsx^ zd&SMSs)@yFPn)8R!lZfZs{b^!j5c-Y+?M`wbK8l$QVGFpH;K#XO*=Oj zyj;)9eQXY!&dueYJLc(B@-F|t%EPIX(822IVa3+<=c9(AbWMHr@1i}r-p)$6-8VA^vw;ajo6qqp{!wHf2xV($zv;zWgnMv zi(0mErq({oGaJruL>|$aB04KQV(P2V)6s91yh{Go`6~EujnC+eX@B4|X zE&l~Q9kY#EC3vfB4QGBy^Y-A7le`+TUbI9}N;hyuMn{yekW!=6-^Qo~ReP5RJC#~7 z^2Q2i@LqgfY89}wWun0qCC}#<17k%cKdo94xzuu*ph@VGR|h66@C~mt>G~@d-1u^h zr$M4}zgyFZ3mYEu7Q3#k1{>`<>fxbS@+JRz4bWMURrAM zb6S4tn#GYb@Nq4z_QV`_+MW)M#fkK|&B#e0_|#MFvt zEsa_jpv|&%$;GxTlc?4O0o+2WFMf79Ee{pAlhnDb%dP5)6mOP5-i|h{tgkCdU&YD! z?rdAsC-dRO)~LBGPV41Lmafre*W$cix|aQG+k(0~4}ZVo{pU4x^7^0qy4^3{-ubNI zaO546$X2=dC#wz$cmKRCEF8D1LivKB%jfTET63e0ull>)@x%RT@g?G{_cnZt2-3Bm z?XZ9;=9cuy!$}-^?@(C5gdB?9-l?E-jH*Lxaf3H*5wsV~BIpz6kPRJU4KdI&NvqL6DEsUSCL+_8} z?Xub%-V?2*WP5Dxyl{DP(@nmm_MXR8yE#YPjzmqCRyRGLcC*)dvtRG;m0gqER~}RI zzpi_2?v=j_|0~~|bMubF3{BO2l`gZCuUM%R1}XXW_!&Nt43jdG`omVZII;iXGDic6 zMXeoLyABKI)vB3TMRES*oV6vxakj-36Oov{A6ixylD$5BSTF7QF66u1_7{26bZ__E zy=i0mJHqVl6yHtCG1qoX`LVcbGndrr6Ttzln|1#2vizGSY5vjrsCnM=Yq7hJB~M@d zHQx5ntxE@-AN|Ug|EMqb@S*(&w<*Ub%>1OjxYFst*Wzp~_NfmO6Bj-d^xJ;mzBBv2 z#SOhJcLdvyy|uiwaZT{CALrdBfBBZd+VE{LAoI=R@J#<4N{cYsEfBKAEm)@A60BXXu%!5%oDs zRF+8uI|U!LS?vBMOGm)HbNc>d*2HTNfTt-L1>?SHby z9`Ny6?y&N3XQ4{lyNY$DjmCP82TuH5uYbj)vhx3wy@$U|sj9KxUzTE%d+&Sa%iVEv z%xb4c#D0H$N>1B<>d(Ai=j{E%}PJv;CI#U+Gz#+*M{D%9iz|*YH>gIf-r{DQyJe!pW8T8R z6Rvx{{m*zCd0_F1bGGSeWzRQS@7~=1M)~~7i@Ww#ocn^bkxeA+rKm-w(flu`awAQV$jaLQ^E{S{yjhQ z=2@j}d-V^U`BVJN=KuAd|BL_4)IH7I%6#qIpEo^=4%?i2JiD@O{G-* ztG`!b&tWk`Mm>4C|FKEGCAYPCvBoU;_Skbe`)3 z|CryMZ;R{C-+s8a?&@0mnkUOj%OB0YTh0GiM#r{yrgWLjjIDN`9!c-7eJFh(vY64^ z{cG*5`@iN-lJNU>a_gs@n*q<)oZdGlbMiFH=*_!l@Hu<%SY1z%KU01A!?ee?@7??Q z=gi+}|FzD=^2F5X;nO^CcL1)i39U^D~|kYchGp zl%C3P?%wzECkx;3q*>n1%MhPF+v!b}a|q8&7FNxOM6Wmb()$YLoqV$Vru5#+o6>KI zr=B|#mlgjucAD&l?uTO2u3*DyOv#22Qrcgh} z;}_s`@dz|n3DC@PxAE4$`r@@;W6Ip{>dzo{9G_^wVURnzplaAmjjlaPP(~h zMPDY42C_mxX@23NOoh8_nM4@$AXxm5bXycdv{~S#K5aZ~0&K zWA=y7)z@=Jf0!=st!&QzUZT1^GHc$(N85b;ABnzecQ2HC!DOr_TVMaD*!6DV0_pq3 zr`NnY-tqN8!^_Og4|$)s?f$#dPcVA#)O%X%@85p@cizw6pC)gbpgH}N^wgX{rzR?Vs|%l>{d61vKLOnyhD`t7Zm^N)NtyRjwKd3lm?*Pg%zO;^FUktfo& zq$L_GUv{s6S&#Wx*VP+bud_Vn2z?Mep(uEmN66lCQ|@f#&&Lj)4og3~BF^mhhs1A< z*1xV_KezYJKjzGLv$mGk+~l+=Ir$^#oA3igq4VXZ_8&_zvN-K)_dIo(rQhNikI!nF zi&~%NmiDW z?0n;;y8CmzX7E2_U%p23e#}3=lgEG7YyDYss$ZLY9 zUn?A@cm7sRF5}u4y4wCvgd17BXLCHs+>~+IU(D#-gm9j|*M$wow{C5&yO5N(>7?KD zb3(cd6Fipf*4r6BO)mWA&ch+L+J$e|%5lrx`T1_;z3cnGPR^F&-n;wn^7(iE-`F~P z-j9o>((`sG6|Y>sD>?Mz!T=(~cYg3-_ovn83`sN;%n_wv=8~fzjwOy>UZ$3-mm5AKTyXUgX%-Ti!)2iOK zbntgY#Q2DZ-`RROyL^}5&KY*s%dY!fZ|N>J^qaqLE7wf_iTU}f8g3?cICmRA)BX4& z@pH-7eQ&mWD|47^#x5j0dDHBp84qj47F%+kW-^dcYWvN*VomJrimOiZb6d^2M3dWc zProQ-XRqH=P?GR>QoiXylONA_-U{iUnhS;>Eysmk+m} zPb)Z@eqXULg1=Y)Xz!N(vXcGvg6SV5^`2z$Y?t84JDBjmvhN`eUrVYm^Et(I;~5o~ z^e0a|zb$fm)1Bu0471aAp0~0NRW3^l?(Q_LlszZ^^t`u`O0Ph~8iD!iUm#NdNCvUK;;3{nIhgW1&jfQ~zHsICerW zyqGya`As6q?0ge9#?4{BVHl?ntH`^N`I7aU zcDH|q%6cYZpY0YNv~bRu7X4)E9k0itf4n|M<=rUQ|6|fe^E>&y$9vU(?3c0^H+nNE zB_Xm;QF`wp2J=MO2#}G5@+{XZfxfx97*4y?Qry#=N_{DW<*N?>#oeQdB*%az4aAIHL`X8{(fX%Z!YuWlX}JT9}gnfCzqeKs7!w4me5>v>TdZPceWW* zUZrO!@@*}>wKZ#2neGKAg+F!|yuzI4CC+}hqA|PivL^HF^cTiCW?r?&8h8k~h@^9CLKee9^ijD6h7E@6jI) zV!Hd*epx#ETe{7@wUHLw3j4(kOQtWH@X-=4Do1<sS|61ui=I?h+|NpgpH+Ojao$vaK!%JeyoR!0C&OcgxJ+3g}_`Hom&)6rfmVRHE z@+K}V<#3xSe@*q9+*-Mxwh5aW_~DG^AKAM ztixG_GcV=km+OB1B2jgOZ|U)Sk6(S@dB}4yW5W8B+dR3Krat44HfmYY5m}U8yoWd9 zT%?QgQyJHNx3uJx;~s_@yw+!dSo_e8FJz4&gkx~kt7KTiJbzU_|D zrr*zWm3x?{-?6m#cko8`{5t06Nk6ZK$JPFQzJ3pnZ@wgd@y`Zv>xjzszx}hOa!=`= z(#myx&AX79HlqrOXR^L*{kbUhHRkP8<-Y$~ z)BH;M+;^Mzsrx2Y->J0uKErC^F0P$MOLZ3aWrsW~;+_(E%6*xC@iEcKXPM?P7hdbt zE4ViCXmp9op{^&>uX)T?_47(_=M7H&uJ~o^yDGUIuYbJ$Q~GMdZK+FlOWlJ`#7O%6 zy64u}>+5`Vn!D8dcl*Ac*wwgLI{a>EVs%cz;oyGtN4t+5ZhO9OXUR)h;qSIKb>F_7 zmO6fJQ~#c_7gM*#RsJk*SnqxO@EgMe)0;M3^#A*P<_x2>RnMK$6peGt%+gJ&#jCbI z%R6s+#VTv_tm1U*wDd;f`JyE(o3A~|J6C)8$F#rSj|o5Xw>c%U>_E)4iwCaEd~RHP zcJ&N{&)a^+o^M|#eD8jG?a2s3b!+2;@3%t)TK1$8->=YDy)E48}sbfn$adr!~z){E6X-ZlTby~(uyU)p{o zTeGpt$?+Q>YV9s$eYU;-{*N1Tut3cfc9TsigEy|$jWp0X*Z zU;FLyWR+8sc~&X@JR})ZxAmyg;(}YrDsFCz_domoVS#pD-HS&BpQnb$)|^xok9&IN zX_x$){aZeMoK$%>J1IGT(m!+mnlta3{)Io>{#SY@Q@Z2g9S(D1w=7Z!+2FY+c+big zhR1`S>TlTe;@p=VtHq}Mzm|I9f*L z86Pt`r@r|k<~uWPi&s?UD~)#=z9MQ}X5zK(zxMrncd7dH`;}ELRhRx0oK#-AySqN_ z%_&9hSKscmg*tVf*D0KtRmhgU>cmNvzQD41+i%`}wD;ET!__ykw^V)J6Zk$*fBN&i zr%zYRPo36$yuaiBk_i=>tn!T7oZ2%K6|e7}yDmzqYHs$%t4T2%t<)zSev*>@A*QTV zQ(rh;tnx3P|Jri-;-?((CZa{}&gNMdiTa;iqqel`;OzL|+6}WZ*WHUb8=@`oSZRq^ zBzNDkp4FM2?EC5kDvj<+8p4xFh^`zgJevUlGiaKJ?^KPmMNDm z9EyM0nWy8UyZa&AqorSjjrZGreV680=*jw{^z!TTw|m>|g?2f~?tLcsI#=2}cg5%0 z=SzP_r=6Se>+QAd`O&GjGyB@j*B0;8+MHMQ@1E$x>FaF&nC;W3uGKO5y~wG5ebqnS z?&rMIpG}S3wej@koUfaH9eN|v9ui_)eEC)AZN2(g1yL7|%%8ck?e|3K+!aYaj_g5G024~0nhqCmwKkwYSRee)X z!s_Mu;g|Lnxt-jzCNp=*pJlVl>_7J`USsn8VD71-3)^Qrke$)rQ~$be<9i*g^D4EJ`7_Z7f4M%|9F{N zo3wmM^7ltRTHlTwIbk#PnRn&#K@ecMh-6#I&2&6q+hSwI>K~&VMxdZo$!Cp-R=hNqKd;TCKu&YTt+-yyd26 zaqzD7zjQC{tchIet1G#*M7x)=g{a4NJ@eH5z?HVNp!G(l^~?FuX5JIkiLN&SGLJoD zI{5y3^Z9cfzYDGz*A;L}Fgw%*rvBM+;LFMU43DB^wH<`{6 z5B5A1r~Y_;21iIy{%yv%bN$Da?QP$k{ygPx;r|N#aGSE=@GZF$c22E$f9u`-xCI?^ zZ$1rQ<7YEPtYnp;*qvynY~=5~*?&HmdgQg15VSaZ$Dv%slP$aP_`py7<|#Z6b! zww;*d`zT^}j@jhx_8gIK!-TjsEYE8gsVV-Lof>wpUH-dwR(H$dOJ7s|Pl|je9-U*6 zwfml1Q~9*tzFmy#7yeV=ZmItxS#zv#*fUEA*MV@Nt2*!$yTEBB7C?zxQ<}uMA%vu6HN$HkaN` zgTfSX|9k&hTmD>Ywa$KF*KSalBfdUsWtr`g=`1&7ZzhL&-aWLhQ(3u2bY&sS*#y1} z-KARoQ;RPbZRq~9@%gqNQjEhtKlztiD*pDSq1~@HlY{Hneg5x#ylwi-dmDepRrbEL`OUZarIt!BCBiY@Wy);gK0apZI=H`?2fKx=#~R zwoCV}5erKc$xLXyx@y7>uGOJoL5`wbDO-%fJS#c(su*?Yi-vui)RP)tmC_oxaH42X zx9sibr?1cCR>?k~5%+w$!^AgVrKd}nU!E?S{!>@0S~mCs6Z72s+a(_VMcA(DE{K}a zKjpIedG19kG_tQtuJ{|}+P!E))be=uvyAWRKraNyAo79tpQ<(zCMRM@~?j$dk8d<*SobJkd>Se=Pg>+rDCl((XIk zf0sYLe{B2y?|zSea4r++ueV$OYSOIDkDqOff6S_V{C4NJQ}Xer{&BvT-nsqFwzOpJ zmq(Rv@-96mdQDd7_4L0D0b94M3R6_Sr*kWI)A6_@EyL+2E}y;p)avwKv*49`uN1D# zURt{}Io0ikTv>~8TW|BH4R58Mn@XCWzQ5&e;{L;hvp?It_uKVvCLd+Z@SEl$cXREklkdaNhCUNB z-hITzF*!r;W^88bL8G&aBVVZn$jyvP?b+kT6{33ZhuqUIh5A2loIdH(Uo^?-gmceq zmCn{LrPfZ#wpM8m{kT1ru&aEEOqusXVy2qivCK~|=2X=C*EWX)+)rrq{4ukKZMK~8 z?nyP_ZF|ZZZ_BFQ+U8)}yZX{{g-;u&9BO(!SA3dz?5k~}(ms!E_4kB_O$h(?@I^&R zTHw`XqFW!w`fDw9jeNb=EM1qU*XslsY6|sYJ8BQ^XK2v$SsAg?@yX1C`cDN-O#w#moJtlY=31D4aVR( znIfug6IA5W5}FbWD(h!(N}NjQ2y$>Mn(3PKE%CL6j}V)3XT64dP2--sO%spiM<(CQ zu}n3L5c1f?_gI!=`vQ$w3f`GvsuTTPN{Sv%wOD@q<-2MBX8mpVHvtvr0pN$7gl&zGh@C6}I2{-}K{`bOWz`L6BP zANs#fV|{$rIXOI6WIy}5^XzBd9@~HEMwI%mefI0`wn*oceq-IXv+P{T=4f4;M{mrI z9xnLXnT@u&_6_h?@Y^*-pA~s`#g<7g zt6Gt_Z|$*%3i_uuwyxowFY#ac^MN0dGQXa#uP@BFoNu=8^qq5WB<19y4}|sc8f>rs zY4!O_g!Jb09LAqPchWgNmi;Q#k((JX`F@^>!HmhXI<6ilT%%&z`0}~z!`TVHzQ0SI zeL?%#_Ww>+R&M`FO4rOO3D1^4cj|io`MAUH_qW~u{WbfG{DUo1|N5s*eaM?}xcA@L z{Z-OC_MA!olg{@{qyEZ4nP>dgGoJr^E_;TruD$u@vHW6#@{i?~GhY9AEpsOF;hM>v z9D?eby&|5boN2mw(n6N$y;-zx$JV;MMEi6dqvo@|Mp=^#f9`Nys(dQ`{QaYwZOYCR zm_?=(3(v5xD^FXS%JA8^MU8E-+O)mh2Yaqx{$F9#GoK~3S9baQ_(cL)YWi*s-)H|j z$^CY<_>sp>8~^>QyR-iP;kOoxC)Bwe$~F1)Gt;2#pU>Q?)XG}j?*FQsh3#?mU#2Zn z4Su$3{hk^jCZDs({s!H=`xniqy1su#(yJ*2r%om?TF*@WW5{0IV*ekhQx+f4V#2qk}|Fb<^BVE)xm{IbFD zgSFerix(eOp0$_oGi-|+HvmG>`;ro6{oH}xm*m|x9||2*^D zn)kKE1vNG2?|uAu(EO%;QvNZ9Luc;&kT!h#J?+`1Zo!FxpYrF-i~MEXEwnG9T{6XR z&-%kUyG|7ZwC~(v!}i4Rk7s-DiKH`E6Xj%$roGTN@r32ss0xmj_h@aR@=b2 zc5BFs4U(l%+g@$RkujZjDUmxW*V4J(aMqvQ_jdWTA3V6_Upt@if`YVH2Hje3uUeg1 z`qWTibL~DpX~lYn_R1~S?yWt{RAeC{D|S&Pd?KH>&w*dN_-0=)36E$$yW-f_2ENm8 zw0@tq%5fCcTlC-HxYPYJ>o$v+F|66)D`GaOq+G1Ea#oyEV&kE&B4VXdnH$`cd9P(G zIVja@GQ<1y;)@>5rYM3Dizl*Wn_Nohb(2~HmK2Qel3w50mnzqKHuI&J)wk1{YbI>m zv0LK}!;N=x3pN<**0Zg2Z;#D<85dQ?-MTp=I%=+EX62_#50qy8m*etZ`r)w1zJ^1) zIdqnMjrYhtJ!e{;U*A$*-o0>F_e~zLt63uA3j|u^Cvh zE7EuAH}Wh3Gt&3l3WTGMAnm4$aP&%4*oJRno{8dil!C z041jDsR7Hle@$4hbedyrp+!=Lz&Y71{Chv>v{VJzb~^6XdcyTWH}mJ=21QY?37?i6 ziwp6KR`h4uvUEXQI785uNw!MwhT=-^E5mwUM`{}TSNXZk(%Wby0U6ZBrYPW?jgd*sgh1$;4lNs&TJ$b*5*o%F8>l zeudMx&YQoO@^ax`#XT!8>aO!HQn}hMS7m;3Z|C|Kvwwsi6Tfmh!aG}H!Hjnn?dHxa zQ8g0emcO`b=%_UZkDBP;a#tmyq~p4I8w{sGdSk?CePX>wr>}T za4yKss9bw}$vuTytCN{guVqD|YeT%+f){&i^F76X@i}8x=Zt%76BT*8Iiu`uK2CXC zJEgs91)uM?wU2D}-m2ic+OhBTqCfsCZg+&ec&l2fdvU7qgEdY0`#LTuxIJ~8yjU}{ zRF`Srygk1SpMIX9_uY2Ox38K~|MN@txlPxL6>cl}YqoOvmZ<56YZfe0-Lj{vE3>-$ z!5yaD@}P6RNj)FZ<|OToUcZ(}x2-1Ep!!T}vRF^Y0o@5+r_Q&2PBp3JTe9WQ%o7J} z4m^_i5$zIu`#{{(7Z=@jn*B4iS-b4gR=MmcuPYjQt->^}SRqK0OPr+s;|tS#p) zdFKD=a@4O9iBJ4XZt*NDS<$weF{&)+duz!{1*xo{`0OgBHLsuTSZBQ}LwDhncd9#L zS8jLPa$>={&DWQu*{(f%#QuQKr0s1%Q3gxA%QRH24OcA}+I8>6m7o7!f0#O@tZ8FF zlh)s9xua8-{XGA?>vOcq-C5k~hzT z^)eq%+^M@Hy6IMi$!;T$mA8J2N*&qP^#0_mlRp-Pd@g@cRXX8Tg0sfmuHVnE_+MLo zGR0%N>AATRCx4ym@6H=Nd0OFwYnA(C)HTI^aILfc@4k2LkxxH$=VXV^xxIKop00XA zo6j|ew3#y}R52{}|e7vfa^@Lt@{Wwm|2_D9E6KmXmcaa?dS#Hu~0X5rbU#Ms-D z>~t4PMa^~=e_a+9vi(74O_p(Hj~!<)*Oo(-MfVh9Ty36S73=x=yF>KU0>1!W z$Ba-y#^l3Vj%7YIs39sQpl9o`zi0l?--G-v=HHw;Db%zVI>9 zH57T}+u}UIn&W^&&JL%g8l8M?NsJP4N@83pRSyI;1!Ni&k9j74%up|xT(+=SL5Oj} zH_=(|JDrpt-s@|uXyP-SC(+k($6mU|WVu9=x!sI!tC==_O*!(v<8z`;?12`=2j-`OCzMvM-lZ}j zp!@1J*DUY!bk?^K8bbWMrOw;Bj_T%qetvGg>E_(J(@9%X*Hzv86Im>_{aj%BxoETW zbBipyZ>M-pyS1xP#M4K3(}b?X0)tm9OPyBPD^y-w7qMV{^^9%KGv+_Ye7nI)Mpi+! zxy5;5IrCoGDZd-k8y0HBGyAtR&Q`2mpe@EF_-<`LxYNdW3>*APbOmiSW?C#aW{Gxg zVRd$RBe2jP*oMdfG7Oz{hNMp#akoW3HeXW(y`&YzjW` zM>AvzmoQ%_JM+ZG15po7ImqnL+FR1PYtQsgKMRUP4AkaYC(G zv1-lsNt+t``V1Bt7WnmOtt*-&vv|i+sfXHgyIQIbr8r#RIBPD_yS6{O$G38Znp=BA zI@>k3Lm%@l@m*QEa5wu5>0kUyUP*_Uwp}+Y$#WKw|7@+!?rswI-$BD~He;+L&(W%{ zf=9m8T|V>i-3x~$%oU{uGE$d9?o=LD|Jg7}@q(1>9VTED67TW>bj!rbC0oxZVe4xw4+8*CCqnrSTy(Z zU$d&V)>Xwi$2RMfsteWjPMzxP>?~^Qd5C?n?MoxUp!DNR&Me{zO&2s*WJZ?gdb~)w z5E&To;i-#9^1}p+1>4wG6KA*_$#|I{ zpHRN>{KoT#H_o>`U^h1`yg`cX9RuZot1Z73-TK7FuqbM zd-2S}{9dPgilFJo6G}ckv(lIFwfy527rFiy^G-EG1p@^l?o?ASHa11MLM?XE`MhQW zo@4KAT>I`WRN}lK%Bd*2%Twl?dvZ0ytQmZnEgBb?^Y^`+ zqp)q3FJ7|n2mX0xvg6>Ko6lC~?akA__U`~kTB41X_p*iG=f+w6zSVmm>BzR;Z?6w; z%CjwA|071%pfl=1=9MLh+vYM|pK0vE`rZFzSNi`cf)ao8ZIxeLS^fT8>#LAoS?7%7 z-yYug&5KJjPPPO;MU<>2)6(g=9 zbWX3$-*>h7Zi|oRWER~jwt4)2@BhEw?@zD3FEi6bNozsfqb(<{uXPXlZ}g*j(Mf&5 zoio;}>z#U)cC6#vAEt?Jb0@BQ7k~H1TK3LmawahHBvFkxu52pu<{+E20 ze!21w=biZr#ZInI$y=QDjiuzSoA?IymA7iyw{9p-5a0D=?pabt^6;= z(OSu+x!tbtoU%2Nlryv#Q zUa~0ulI`CO*YjVOzHQ4pa{fK*KdTSkFP)|@EsA{mtzjFx?6e6J<`NoLF5TPo}E zZ{F7VGft&F*qQ!gL)q(($2;%oZ&$1|eN(~E-nhSUxBQ0xPrfLgi4fXb|7Bs$oV~NP z9!{Bc{+`F&bMx#cmV__&y5qa@=et!`OunBH_AK+yGR*fp`|Nb^&v)#>o9}L4_Gznn zaQu_c!Mkr5pPU|he6s#$=asAGEM2K}pzwm_7K(xafPGOG%E= z-3fbUZ&S}-x-3Qg+CQ-`)e6_yYbMHG|KHZP(A@3t$D@lM?zLU)cuk+zy|1@zp|#uL z-_Lv779PF1VD8*GYp$xD-oktG=Plcl>py3z@A#JS$y-OgvZai_H2dqxnHxUOE34eZ zTbh}odssX2=ZBZK<~@0Ni{a5t+bIhkJ6ju7o%8hj?NN1&cmDZv8^0>>OWNjq{ood6 zy~p#n>nDZzm5U~IK5Tun`tbKme--W@#eIDD&D)2a-(2_*eQV*9+LxBW zw$?_?S^tcRKOg)YW_xi>?@Ys^-IBqZ=WSE0JpN+wmU)xcXg}~@dO_XUp8b#VqvJmn zo}2yDtg{iFs!%w4*^89V9#L#ko94$lo_Oo~HsnK0R)169mFot-Z(nFWTDJe>Jg&l)HWYN$`rB7W zG8S2%J#JMLY;{^@U%I{N?gmxI_WJVW|6V=$rcdp^Lik)k%Z zQYGo4sFy{YtkVMn{}qQkvFj*a&1m&4nQfC|ZQ9+|ujMOu38XJcS6HoIo-C%aCggd{ z*5C8pn%`t{ZrIFIHciy8{E6h-X%D29oL1Sfcmd<5EJN=NPj_8oE1!BvJH6xB&o@72 zeAGPsFJ;fQC$-I8pC_Lf6YD?T+Hr8-^7AcU?#;jV{O#X6bGViuI&NR5BxfJuRHvi@%K#MW$!<@XRcgyet~uIGp)F->z?qXJlW=ux3Bs6 zbD8BycRq{6xW|37{l)i0n(?~B{j58p4*xUx>UzKBa;{Y0xUS&FF1JgUUw7Frd=l>9 z_u!}2gUgA={NGOsv7bq+P%cOePdWXvx}#84f3g1KeQr#@4cDH!`jY4R`wZ@ToVSat z1&)7xay2TmndL?Jf$0~%zA^Z6Ht~miFuqcn!1X%W*%xFWi#yI`2N$dSj8#Yeg=c#|_ zP}*8qv2|^&@>XJIzMra1`fnTGG`?zlfAg8*#^v`mAKQHN@~h16B~{zHnIbG=MY<)O zG`O|Zwm95a%5k@?f16MMhsvBPz0is`^ZRS7KioO!+B~&cw3(azqjz$_xd(3!UOG6R zVRqG*`yF-0U(LDSZu#@n{~!Xz4Y)63a`@?#nJ@JRJ%7x zbZ=&Powzs0`u4$JH{v&}zHv22{kP5Q=g&W$|M0Yib$!zH4cRwK-*CUFDr5ewbo*#t z3iBJaGUMH?cTep*Qnp!tv+W!Go4Iew%Gh^LzI$}vp?#(lc$ z9e$(x&Fpvnx9V?v)zkkr@@`UoqfyR$2lFUHw~;02F=-VO!E1iqjzoEpMSEk z>%9J{Chmako(cZXmVZ>TYrT71F7NOD&cIDsJ6z?(i?q2SzX|;BPLVZwNUf=DbGu@t+-uqRScs6f) z%;vqkyxdPWhqF7LSK1QIwB*-Cn`s&0IY}nzrWV%63&L*Cxhm|*sobYs=Y~g| zzgBg$F8B7bum{_(RNZd*I_=PP?K`H?wjz%fuHg|{w9XmPU4;Uv>F!*yUx{cHNq^ zX_J}jVyUI4Pp#ZoG*vIrYyL~MjqCp$IB@oN_lm`}jmO`AeLa0!R80E?hV{}CKNgv$ zHkzJ~&OZD4cdnt6*_xvK+__s1aHnRQr}Jb?s}7qO&Lg8}@xJ!;hm5Xw0Yzz|vWlIj z1dKBeRY|G;VB;5zkDU4C>9W69uQal+t`A=QS7*iICxNTh#au|+ShllBVehAvxji}EJM=-Q-j&jQ#+K?d{=K=are1L^g@Z3*AoXf3aOyIZCO&Hi%uR|#*I(eAtjSMO&|-8TKl#rbm= zZC!F^Ri5*&TYJ{J&0aHU`-xfQ9M4WoaaC=-ajanZ%+x14H-B=`)_$0~DN3QEDrV2> z@T7$tPlNh5Em|Gk6}GnJQqG1)1s*w5fn_Z>!p&n)w~Lt9o1i(m9XHR_AB;V>|g$_{KvOm;}hST=-p)s zLD%)>=C~gEzFcnq$|I}x?>wuO#h(!xw14|W`viTF)~lue93YYf9ex<-QNSb+2LC<9V^K%FgP|J>#eUbj_MAlQJh3M6O)U zkP)$3=fbiJTQ1$3x9O5`*Yqi2dDpd;XHQMfnra)Bx>4<9+x|5n$_Brm&S%=ty0-31 zkLE4C#Ituy9^B0f&A+!#KmN_3cUw|_+bvtW?MKfhqqDPiO}n;j%{IU51^IEg8)t<@ zWv{)n=i00*C7!SCe0OhMoAS0Ux7>_z_n~!vrM5<_i~TK`7o5E<_R_9+>tMaO_)oQ$ zOg3HH7GLi@`)bLwr}4M%WPP1~HBEQgiFccCX^2H{NO1J2yCS>cfSS$*`y=ts-#^;^ zI&qKs+oj82*6rfj5F5D8H*x_>jD5*_8$*Z23$^BsdtH*f- z<_BL-|FEr`zqT>Xokwh`$Wymp*YAWEs{Zr-_pFoUXY73D5z`M-a9x4Lxtfp80pa)oWs(n=H}`ZVXuom9GY`^Yr9O1 zk?yJ5pnq3Sm~#66yR%(3X7S0&*|KvO^UDkTwpJ>#m#2Q*ky&+bG2gt&uICs3th6uv z;JHQj{fg%2*`kwY$?R#+J9Gc#1G!sM|F<-YSEY$xvHFpcW&ijS`;kYk-P5|iF4LFl zYqfs7NKK}l~Dp9A{4QwGcBndPnSJ zV741?yp7DM0*KT8(uE#>69~q{!|5@gLq$bc< zDE>wgi*Rfw*F}lxMzU3BK5*~YteW!cP~GB~9||jHFPxFlsm8NZdrk-Y*$IlgKU^K! zCnUDC-0zqftH|N4-8n;X!-8(z-cu#63Ud7+p<&;?eG4nGHk?(~A-b=i{As(6x$EJ7 zE&6iVZe70f1y@h0yK;+d@!7_L_56AHH*Q>txF4~3)zZSpY#TSmt;t@q^7e%o^|07I zJJ;pa-fa_`IRCzoLr+lk@^{85dyHf!W>_S-Jhpb(5$qGeAiAPc>GTGxvJTmYEmOX> zR`+Ny`6;|DOM2|K#aiv^3ndPFXCv;|z{4-hCNN!O+t_fgnWgMRkCTzzDcPIxd#kPp zv~i{eJ`5M-dnYjWV!`){^C^ahW80G6wjSx&bHC^4;xu<9KH&m$8KWismmHr?J#UaC zd^BpJUx3@h9Honk*@dgz1H??yj;M>>5#o~CIK!)_OW@D{WNN6Pq9!@V?^!!+= zYl-XEfS5Mr)YAR;r%YbD{P?PvNpH)71bYhgGRkHfc}N86C{FA+(e5W~cP7@%|4ZBA z@FS11qC(@fav$EC(4k`0q}ImSrkHtsS@eBH0f|>qHx)NqPdavSTIxJ0YxkzB&elh! zaw@B>J+aQAX|baEl8mbQ33oO+SO|VeUj4$b_uj;+o>T2loNw~FJlK9(>!*?9VO`S+ z`+odro51+0@B3Wg)zjC-=OkoINHk_?%$quURgGn3Q9yFhy-%NCFVxb_G2bfF=;HI< z$Y^RO3$M@I7lz4dyO<_^lagh!ICC_&RoK6(d_$0sw(MWgNt5R9KljGisaCd4zNa%l z+)Sir>Wv8<-ydqW^{_11arwxKR+r73(w%+<3FlqE*I#?lk(k!gpTE`fmn^4R(jj|w zZTXp6i_BTAqJJz-wEX|ivU5l0zKznSHe7d`YA5HKDdZ-={dCcBj~NGkJ#o?z>|t)s zUXk=>vgK;`(w*feel1=7-1t2YXO3Lp{65(Tmcuvv^Loo>D=Pf^vS;?L8w;mx@K>Dp zEl5dBZ+mxo#{?clscCgH6M5DfG#RZtVAnXkfNwUd)3@2R9^EgOsLJ`ja11`->-a7w z%_i?uP1>Fd58EYOnl8<233YyXP(e$X_1CXM^4Dkc+mOx!f2KUhdvLFLwfr1$ zXT8SIxw{VTl)R#6!~RjG)pezA&sEtCi4OY&W2`KEF6{oWN5CMeSz>YW>P=$BHo{wY z%)%9v{winWAGyo^?`)S;!?_7vMh#m{wfGrR3-z|9lw4_2TKuKaKP^>mYV$6^S?dG- zab&ekVf3wwIsPkemCnmkmwUaEHN4B0f3kR&5ELHsa+B@X)xS70KCE2hzG0WZB{rjp z0g@{N=6vj#%NNnL(uzafI=WzL)S*+>FL$2bxN`LxkCkE>{t2Z=)^F%iTw&4U!xEJ3 z5IJEQk7##5Rq`rzr@p5pI-F0t3sg#;`X+~65na{&XhWpy)F0ng<+B=@@9KNDLMv(N=ex39PJ&F`t}3r)AnX3ct|VKpbKb&iJhW+RJ9+Vf9c@KCcq zbG)li*5sbDv2m;Ij#IKO?dAv1v>Xe`kw3oZPIS|$^ATakd#+qq_uk|Bj8~R#Dg=Y8 zY8RAQ{l3%wy(>T@_TkG{OWwZP@Gx9-qd!~ioy^dA56|73>z4K5;7smSbB~+}xzv~9 z;_YGUYNTzXWzAn)=yo>vuafmkuB+n8>90@JSw5P5C)O$JobW2QWyMA}1#g>ee(o0L z_HAmcVRf9c-}0ru>vPQO0?xdw%L>^k86O$Rxbm-8Y2Fc|jZ40B?QUND>dnb@K~s+H zvtLqr{K`D7^A+|t^F@o)%^qBI`CRzvpU3OX%kLIsJ&-qDn_2r?sM=@=q)KSI?UotZdoT=d$ya6tl_YgdMS>_UUP*Pb+`z zRkp29PWPV|Rv#dFaqgO5Q>NUX`C-H7x=-<4_e1s_+jPzSTzT-xw&cEqzc!hZbHS>J!GF`j*FhV5hj>E4HLmiG8e{hQ_WHqY>Q ziFZtC_qvjYMfKrzWz;{W=KNwpZ~)5FJ1q)QhmO|{=yB+YBOvskD2D= z2)fO&UAc?#d9Ky2qT5GZma@uyGktjJvPj5nrWfUb*N<4wk&BV|xaNztb&9|79J}?+ zUk-~sHrMmu)Vf;wpkR`xzS_MrO$)foUe0}C_f|adpNxF9ONLkc|79BwK9uTpH8WY9 zrM;5xR{Bam#hvxP9D67KHHx{jb;s;gRXXn;+ZO+<{~l15Jk2JRQ`MvI0q6VbF2yvh z`SLD5^F1+x$pk5wLMjVV74-d+vVu!;;qx?x1}3Ho`fiyyC8)$>p#CMPb(I-^ENqZFFYZ8J2p1-Zr!W5*QTjty1PyMwnRmaX=THH4>zrt zB_Z>Q_Z#t*%?gpTk#s)g>ZztKx>PmU)4N2<-75UY_YbEYGySQuaj)R{H=SQzV|V7O zlYe7xUO4z-{;Csse&;jt9xKYqmfltW`gf74_s#sPDX#God4vA=tjf;4{%c)tto5=t z-x4DaWefs{gx8iy0^)#2~m@L`0Q{Oz!t}g$) zd+xbl%ky+R|pBhP!tyeX}Lz?$mD2jTt+ejj!JBvD16^%5&?CpfW>E z@!YF+Ja&p#{%+sKeQ4o?1G#^XFKSBktg_vGTxOTUd3L*<7P7W$ZWYyS{IOci?AP9z zQ+V60Z?sr1c~fk;HZ1qE1N&jmziVxt{5bt|&78wb7yJ6G{I`GodGuxI#y7@C&+K~o zaD~nBWl`Ho537`D=BYOx%sHg_dhVIc`Vrinr=vTMGFVPh6gbEr_`u~%yP=bp{D%pL zFR>{now&ZmM(Uf|-`$3n8JyOZIz{sSvhuqeICppM_DQF>CUCRNEmm?{n^g3CtJtZZ zFDCCk;^$f68uw)Tzv|s~%Uo}MS^VokqII*%xv~&@r+p%|{`qHmId-~x_MJR*;?St{%-zH;%m9 zdaAI}twX-%%@)l@^^A49Q*!hq8Ptm-W}NWsHD7A-q$-!QNOg<3!16asBI>kOzr3$o znIJS_>a8oK-pp&Kba)(Sd>v^RyD`e(!SUl?%a2G{Oy|y?$j;kyu64TH=1W2B8`)x| z^r!SRRPB+g2s;~~^=spVA7@Jq^(UX&m(d+rY98a0t{VP;!}Omzt4_oezuQ|*Ogi+Z zKVXjd_gusE-!w%;ey!z7jSE|m`=C5X)h`k>|B$Jo)xNQ?BUt!CPATDGwr57A;Q+IP}cwlb}%k;wNj$E|^uj>L)6))-(to zVk_)e(f{V>)Q-nLZiJ*3$NsA}u44Q6A?(Q1x|tuBf4txM@yFyI_c@YFM2yx=ymOR2 zf^+qvyMivSr(W1&tolP@$A#DHw;ntG?$Y9^CkoFnzh$1F8*^apVezsLXJ_x3rXi;O zSkKzaw)Oc-rT3xktoeSoWYQO=-~7qAN2o9cqwqnV(09zs%P%Qbh*q$%QP6h;lfer5 zp+TMs`jBGDF}Wl&KMx|Lkx^1oV5P60omiBUTAW>}mzP?iuc=^Xr=ahYUzCzsq!6uO z0EV#&`fds)3i?5*$t4QW3MOXedPb%S#+C}EM#g%k3Z{k%u?qUZrAZ~=qR%HYFB@(j z$Uz_@NpVm~Mp1rwNk(dMd1gs+hF*SAI#JFtw@@&)06EOi+z8|<0}z|44l7H{OGzy% z%g--LAwIB7%=OGo6^zV4u7QLX#FYeH7OSA|oS#>cnpaY+V5DH65Tu~*o0^iD=#*ap zjTtjTBL#CyBT(oEBo?LSl_(gQK@ZK-)Fpw%ZJ|A1&vvT(yzD?-;dm>3wD zfwUEu6s0ESa#hTE8+&`*Z8Ndj@8K_YI)vWSWNK!dwMG4WFv|<}l36@#lbLe=%S)V^ zlzj2hrtga~thdX3IpV%a%R}%%~w_bFZXlNmfz*r{?gg+h3u{sec^i~ zuUuW9`S$F`B(7I~R!H5qt38ol|MlC4!`-iZUO2zFx6k@T@y{)R>#Bc0oZ$5D@!S2o z>orop+V9@}-}c27>GeLpD(>!lx$8Ci<4IqiTgS=1m$>}=O520;{d?^0eW*2ZW8Yrk zw0O&%{uh0lj$3amKlS|3tKzoDUp!u%O>l}5Il8xL{mt3Niy!@*S+M8x=V(vg*)OVv zYc@=0wYHxZFIaQxKksUjoIM%3pNncLUTnP{b@bt!yNq`}1eflNbDg`$Ui|UZ5T4n$ zZC}KEJN@bCy;+XZ^)o+~dVLTrmcMo4EqBHC-!p5>>ssAKlP>V?;wtRTn4&%9Ze_sB z!T?^wRS!44&)XtgbF%+|n=ALeD3#PVWy{vwJ~P>?n@#6aN?y6yT5(IRQ@PU>b(gii zta_FF<>&8bf7tBp4S2LH_TLpusdUxUjo#|9GUKXa=IL$bD{d{)bja)Oin^BYvFX8~ zv)c}6T25Fh{(-HcxxSS>H|4-r#+d#|b=&qZ-e!FArBj!eTV3j!>ve_ATk<3H^KVqj zZu^_C_T%%yw+`L+mOtz|=)M1zYMIU>#TF|gsXh8ScQ_os-fKXfBzr)_myazZ&QWHNP_Czx~l$o1}-UR-L;z|OutT`~B~;tLV!uM@)ew8Tyl^*`ls z;fTk@n_aED6=xn~UZ1qB+mE40t3q9Dv6Dp1!Fda%Gp-#AO%0s9ICZ^-JQJU{0;{F) z7dD&9Lzew=&l1!gsykb)uej#Stu$*=L7Jdb>*>&^YqlTU>REMs-PBLTQG274XI|!7 zn7>{?Z%N$lI~UJqzEI)~p3JtN)4|)!*5-}LeZM{HOA~@c#D1I1x^~ljvF7XV+urxa zPLG{(a7S_JkBsxizfPXp-uCO;74OOB2itZ;Zgq_k`jR>2V#55r89h-`JilBM_y^A`oG|$M>G9%3Uqyq? z-vuU<)=lJ`>=D3l&qHYAuT2YQwuhJ9DstixJkw#st=Duce&)}Qe!n}~j=Vefx3woN zW#ROm6;bxoUK7?>nr{ zGNp2+(5?IX8iMR6+dtkee!A)scZu$TYhDu9dahI}N#9brAZn^xl7*vOR|4QGWOUKySd*4(wF?a=0FBI-t) zoVa#2=`P*w_Cq!x{Q&pB3x`62-wW-D*GtRba^=>)Bz!=;qbr=pzwDi2piGdHZoAJ( z*2~)-U0-nKmwMT?4T@jR-99xlT}gFI;B%P;2OV>k_@C6XwDk99t(dWB<$}EzS~S)M zF6`ebW<2{EZ{w#kCN5E?EuAIK2MU{xiLMnm#3mQ#U0VB3G3)FLn@w$}*h;JJE=a6z zo;NAhOk)Yd?USbpaxY6+%nJWBajop)+`Vsa-7G!4@Ml}5#qN1R+CF!bE=~Ot(&vA>&u3RuOG1$pR7OE-TyY$(yh~7 zzMNC+E=Y3Ye7j z&Dla?LSwF(8`}lz4mUd+(Voz?Z*3-Mec?9<_mFLv?R;di&cXhMWqbS6OAL+JIh}bf z^3Sm;=T*HZogt|n#h~)oBZXr*Bgg4`j_K0ew|E!xM0BLt-9ORPBeOMgFPDtNh8!K1 z17VRYEE7|wti5_DW5?+u{@YFNgw(k4h3EXf;CJP%4X^e#b&ksmU!QH#xzjY0Mb3KG zYsT0zYu@tCml?C3aP>zY{NUuOw#DdF2>v7!`@BW7j{n!W11;CabI!k%fyC@bF@6} zCw!6hjOSVL@R-9P{kOLbYDCq}t3^-cTKP?nS2(8ooigt}{~Rfab=Y)Fiy$f5re2x_NsGZG^ zkX&RJdj8Dv7qb-C^Q-d)a7g?s57qv>3?V0nXoBtj| zqw?zNEQ!!nO2HNHISwvcF+HNxdK1&P)i;-37k?;S7S(Dfn;_{iO{~w*Zo$4X~ z6o1@J)fa7Tskz7F>%ROE=ZUg|6)ytT?@(RP*fiykeSh3iMJ1DKn}5t@+nIAAtfiph zGIy5gL6G{3;~4M32y4p{XG5hUr5E&gm8~3) zGWJf+2>C8KA<}v=w@p~}*3;4QN*X^7Z1Rre>|{Dy!ZBl!`2}uU-7||{Fj^jyfkmMay0DNK6A&-Gh*U*cmG*?@cuI0pA6e7SQz`hGA3S170mzcX&mX{ zb8ODqji){vvfMN{Tf%dYD@yw9)r?d7jA|4cACc4&aDNnX!JNb6>~t$v5g;F1CJS)6G!V&vt3J zu*2iY8*Ve^Y9p@`Q=e(xV!gWj)&h>eSijF_4rdFVy%fLpg4?H!-*2sz6+K>U5;K1R zb4F`B)0#Em2^+jS?kg>9^O{>L_tVcd?0DBPQ?8n8dVDfztq;{@0**P>DN|T|6*Ply6tZx&^FWOQtPb*tI&cc5>UMSi{9#ZW*dE zN>0va6;vX^<)vOFOF6$UecHLPP&GVJF79S5*Fn)QMw-`d#|CV>;jpb|zqfZ(RF$$> z&&lgX|5$bTzuQl=;B)r4BDctxF_p*g?N`6u6Bp_@3N!LJF+Szo@`c^DfrBAPLAy9% zvg`lcWpWAP9b7+oW2_>6%e|4#s8Tr}z4-j0olYz6SwGq4a;)&-of}@B=T6zpd%>-l zIIUdr`-@Gc+0V5<*3Nsj>-M^NQ7qQ;6eDAf97|@nd#mPC>KxnOomv4CzCUNaa&Csv z2@uBAbj{+MC6wzbM-l*bzO#7!tMfdKbuW$c#wK{(CsJ`*1 zuBsQ>t``oUQtRrC7bx8L?+@?XHCjsNHU(ba@MHFI8zcJ(?(K`#9=K$)uyX_Bf=M?z z;*^+Hv^ekPvlW*V$ZXWwB52w@_61PCC*2&GCWb_%l9p@-|D^U+{5kz zL4ix}NyduX=0|V_xXfeeFPnWR$4b^_y<+g^-nUf(w@c;YRjT-Xh5df8MXW#7oXx($ zw`t?sZ>*9_a`nE6Y^*)%Yc70ulZ1rYk@qKGK0Xdg4>nbXnuKQulJMt9I|v+02;qLD?Yq#JOL8UnzCi97t|6Z8p8_ zvYnf;fy=i${`SSp8IDR*^geSvuYD7&TAnZ^wvhe8w9jvkg%>7UE?L0kT*SQei|YP| zx4-6J-yi#5XT9+0RF9R{3#(6Fz5CDhU|K3xCZEPd!l%A20R$5Zd~zkin9936l9 z{^hyS%e(`Bp7zfCH_7+cmxNiDckKzW**@{t{!i!UvrEUk-<{$7&(`YTw~t@0|M#o^ zImQ0`{ph-R`@haVy#9V^{gWlX7K^vNT2{Zm|76Mj+8Zk-%HLb@?(co}xf3S^o-4mK z!>?U4xb~h|$=OhT+YthNIwMWkTMazf((D~*k zE&kW7CN7;_`cjtm-j7FGjDqER&Mzob4w(1j>F0mRwaH>a{E{=D#lD^t%4SZfAiBX=~sUCUk>lKPg%U` z{Ad62f2Ms?KAozZGq)@4nrqkbmpO)#QKn_HCT7b1UT76(@HpMv?Dme+v)27Ks7-&? zQT*_DNZ(YE&tEKWd^EV;&35?mt2zB5zZsT={(BIt9afnGt=!|N7pU|G#G?R@yC}eSb={)5%Nv$a+LnO_MbWMi{yKZVJjkM77P`P z4GfLV5CiEZ7KR3>BLaIlD?(ha8Pu$LRd)Z~lF234&fVL7S*7KTilU-`2eT)O^6#W3 zmrI^jp5A7gHfVNhcWG!m-q+Cd``Q||fJ7Nl^E;&_2?CeRz47YwW2P z^1167Q}*yIn0@KOy&FQ;i{qpl&bEBr*n8GnTCF1Q_`br3?N7{h&iSf;<^GxnJ?9lf zOcI+lj|4RQ@N7}^)s6M`QT;WMfkpAh?`PYr)O~J0Vm#4%?AJ-L=ab6*ay2vl-pJ>* zdh^k*Cw?r{WSGj=(DLpZU-<94Wz*(2&l<@ zS5YUgU*31K?8lY+)zZBDlAjuy1YdS499V9%EuYKB;LY)WT!)<#m?hcv+%TTgX4~8^ zG=tkpCbum|qWv`Q;Zn(fy=J1ipPbeIYI9DpO0;W=_G@6?WmzB}>8tWf!^TnmYhD89 zhqYfUz9_sc$eG>$R4MAoUfGxVldL?=rg;n85?m#i=TgD*FrK4aVU6RjJiBSy*BMwf4ng6NW9Y?|9y=N=l1e{6uvR9`!kE8O=nH~>3=<2=H3(i5;&=?_?)Z8 zQB$jpIc_^xUjDFi`%qTIaBKo|9P_v7%5e>^{RO_v4d^efIh@*N^ziZWg2<#=(MR8v z<)u|Wd{g4%Sox(e!a@0glx!(W8{$rPKF8EY&(&2#VbpDpQ zd*_-$(+|i^b9dUfNBCf)!8ExRv6oC&?xz>*dsjT;pc3d_+e{sP0^!Gj`}y1?lVkZe8<1I|KLY?r5Xo50cNHLKSFo> z6VfYQS8lZYyY`%Pt4kJwIXCX9Ef8i34BH*J-hM%CeMfQZ>YESu{1bYXS@xR!Tr+>m z+)Ra({~9tbH~K$t9a5ZfvzJ3yaDLANM+d2-16vng>11-S*kpYIYf zTm5cf(2W@%Bo`h2C^qMLS&RFZ{=-W-`W0=OOyUdcADW&1`Q_}{+OFF@>qWlpWhlGk zo@sGkeYMDLsQTXuVGTo8NDks`j+%}RNj@7$|Vo!Jf4sq3HAol1SEfBkT))4kgX?2mYZ*sp9_y}+kR{8grWMTv6YbnZRc zKkmIS-*97te1*!~uCLbTH1eM-?DyBZ__qChi_QJ^>J2d(d;KRb`QGXGea3frD~0th znPZM$}xETG3Rn|e8B;Yxy)Qk{{|?zCdn{(9Q$^2m-2N973~O|MF~*#1Jl~)Co55Ntr8xc8r1f8JzMiSt|8tgaXVB-pPxl9l zE%X(tGyCvE=Nx;_MW&X$RndRH{p7lmWO*`ue)HQa)d>x?b={xc=4Vb%pY|x{;E#8o zgWpN-`}_IFiDa4ni8kjhDouK|*naaHdH+ur{ND)_{!ln`wdS`!hqS<}4f?DD!TtL`&tK`@dq3-W=DPPfPm2!y%ddUD zLXVwCY2IEw@ve%`Rw-S@B9)JyFaO8*;;MV&nqJ$3e*=CzaMF03zW55mb}#el|Bb(Q zOn>WAnY_D1F-GwhL)Xpk_nL#&e%G#3+r+EHcGY`(MgPX+jOv;Ki?{a?Q(qHC@E5GPR ztoqIK(%pg6y0K10G49=8ukPEaKK*a^C!BHp9ab!9I)9>imHm}`k=Ii>W$!@j8SF84l)sl-^)c zHgk`DLi9?J_I-H=m;G5yJX3H5AFtk-xTostRR3gNLuFP^JFZtxXWd^EK4EH#?9Q2Y+-;s1e7vMp z)v(X$|2dB2Gbi5Uutp!gw(0i`=}Dfmw9Za`<}JPC_LAx)XD^jyuKzOe3;*4`yYVIQ zul>~G=KfeMw8%xP(`(YCMJbw=Uh|B+G{cT*E%lncDd^@Rn~z`2w_>*sdzyI87nvk7O=PCX>=a+AX;bEz7@nN@WK;0&n|a=CDYJ6C%+%dg+|`e( z^Lw82IOnhDm**EZwI=k_)|1(j%~kGC|5Nd4+Y{T9=T-Jk_!ISM_DOlw`iVhv9(hR4 z51Je_{nCU@547)o|ML6c@)w#!IWgO2hMDDoH4CJJ0|8%>k!fLovt_Sn)i0Ea}QG5oL=L)PyN34at<$rw^ux-G(5i268toV>E8Jt z&sFYm6dBI+`}fG!C(Gbh%Yv971%aoF?e}uN&dYPIeOa4Xd-zw7VbaXK2k$ZHf0_Hv z`quYzFZa*4tNFF|^7`5^-VZMmzZ%b69Ikxl(@9tN^;W-LtMkjp_L%nUaKEm+#&Xx6 z$?y90e^$J_XgmLnebwXR{Pi`jCr0<*sb^Vydm{VK8~wWOVsbP4x6V=SQ?7JxlhLz} zDckX*;Nruk!p?Rea4-IitUs5Zt|%fduMLnUiW9tp9MAjHQQ^Z*DSATudxocPkzqEZ*%}F?H|30IoMD7R=kPShMPod|%yM=4$8Fdw(6DlHR*#e(uM| zv;R%VI{V)IaM}*8b<37N4Ew>fu2K47)ed&KM%{!qQ;m7riOe}euw^ku-L<+e^5ApyL5wG^7+*dnwURu?O|Mh@O6Q}z81C$>3c2PA9!Z8 zynmop!GEu@d?DvQ#`_0K3pjTqGH!7&-f~DSqq+40pX>$ByBAoy6AWuuy%QvLjtZAs z#<2MxuH7IMmf*8jW?x%=qWR9Lcic1*U6iaWSeKuC`-HDZeJ6L-!u}VXJ|Bvl-l=_` zP<_(v%g5gx6ImuWBq@ELeD;I!AE#{-*iSS+QT$|3*<#}*r`$hT{lsJmZkrVCn{L|< z?|)FcsV&C8Y{J|W@yc0WCMXE`lufo(X_?`v!P&g{11G1tV2XZao697PP19_==PCa_ zQTHkRlg-8n85LYMDs4w5?Vlj-A=9bOsWNeoM_g0r6O8##X7OG6;QO+#ju~UD4nEiuc4NHBqa{t8MEq0!scz|6r?!7WePZ5EX;1a#Co(U2|MFlvR=J=h=+p|A(h&dDtOagT z4n~;@XrGWXbMV;4k2y@*si|w` z%ssBQ$@5K3*g?I7$u~vJrursdzR6=Y`E1hWn=)mJt5ZUA^mccgO}_dj$!z{r1NGIZ zrEBKxj9|`A@jY`^FOfUKI6HCen%=FOTh}y~ZqmDUR&3+Z9M0%d(>8kFOwF-$`!Y30 zboZRtgX@mms59N&wl?khrq?IZpGeFryPmvdKjY)SRyVq~|1njOFFU07gZrnP{^=%1*a5DOIoF%NRhmx|k^jQe z|9t*5Z>zmI25c;|nwp%?EKGbTI5BYAiy1d|{Ah7mo#efV-_uWWmX(gKt+KJUb$Uf! z+`o>dLla#WyNUNpMn94;uXD(S5I za{{8n-)Cjy6vb~^uyg6wwY7=v>EYiO9rd23xBJVcr`lobcKzwnUcc+ttgF}Kwm37@jd3Q?g|DC#p7yT9yq;z&#zmr+3#0;)~)zGxBPzf|K|O5KQ7+q zll}L5V*mM6%jcWs6i1%hsk40l&zNb&dZ#U?KmGGx{dA#)jB4_6k$$;QlT8IKb#d=L z%z3lsOwX4si7TChC$-<0oYQ4$sA#8Wrglq6R8mk*EQ^nm&xn;xf_GD#x}lfC;xln^ ziz|Y%Y=XLKA06?D+itz_pyh&v#}+39|4fkT4^loc<=_;)B{>$&mlg(D{h4xPjfit$ zT3b+BxDC7aTQB~Z)_a9MN_)Kx?RviBfI4@Km*7-|H8*lBoHV=hv_fr`xM_Z#qMsEN z92VU5IhU7bM#B6DTqn*ntYvKMU{iXw@y6}#LZ>5?1hO=xw@z(RFHiqAV z&Na2GPPcq*dwE&-w5i8#=7i3alrvg*F77qs?+Sm9T?&nyNs|3_P3~f+HS+e!?uffN zYh(S{TXM!%t}U7U>h0Hal~d)Ot$CE)vh4A$rE;e?C13m-I>#o*>FKM+y@ffxkz1l4 zUNy}Q)1K#hS)2Xatsk3LaXmk<(PZbIG+#@-z0KCp?$Rnj1~Bk5Nwa zz3ZWJI9&8#;Jm7k=G)100yZDB>DvDJqg7fm0zs2*t`dD|~y>n6hjAP5v zLw-H@^}_M1u;9v zUtqtsW%|`0Cbu5nEv}ujye3yPZ&7E@DHaKFHtmwFq+vJ$X>9b*P4gjqlfk zZKaicayrktlYUQmxpQ?z<-sR0f#p6SryCTun)C&oo@3*;J+=C#P~81Zw&hcz{H51j zYgc)`P9}X>bii}`78gt+;`P+@9O3Q zH=Mn;Esaf(O;=f*(0^pQw!;o#$6M2`CD!t}YcJ~BZu9Gg+3S^OKnUZ_L^J zFYE2XBZ7H>^h8*RVMr=!~DF3q%Ud9%rC&GpF7 zMn^Bi*p*B#-LduXtW?p{sVh$N23LANJ*xLQAV$Y?O;Flg*%Tflv32%3>+2)p{x8^5 z*Se=}&Yrq0d-gfR**nF}S6+X9+V$n9Ur&Dem9wZt@l1jli?mN0L-WA}<{oTW49+h7 z-&ZKlz5h@7OIq9u)qhi1@|OKMX)owl7?`x6z^>v@BYHD@J8-pO_MY)}Y86wc@{0>^=07R%|HSl?N8W*Rd9%=A_9j0it+}xm7T#Q0 z63BIfb*`72Hh`Ng((8>dgr+j_gU_^qHx^_87AN1Kjh zxeCn=ov>ha1Z(Hi0LP$v{*zWtO!?`#>4;a)m&*~MvlNcH3m*yh`oBJI-N%<`Q8 zgl{%}f0bIXdB6O(N$Hu^XO32HVSRtQzES4Tp8SWgb(Wk=wk;3;{#7{BID5})4+|D2 z9-jl&Kl8pB{a*duI>;}|(C>(&=9z}rH`YHUc$D<$MO}Y+mPJ-|Y7{GRS$87Njrh9nn`Ti?y z_GG?ipT4ooQ{A*`@gD05&sk0!T~TJ|({?j}dHO-GDK~64OwCKn{vG$?H> z?;*TY^^*86hx}FB58Zwe`{?eAyU+i!q-M2->|l64hh4l`xO}UGUc2_gs4Lg*{@BNE z_NcZ{{0l>s#h&i%zx*G#|7c~I9Ah*~WHQ?&pJ@pUw>;;m_h#=I-*3McH)WY<>bxGIvn^f)4^M?3_O0-) zWsrM3-|s;+zf9BN5ByW+2;NTvJS z`R^+3D|c7iUa&j%`_6a8wlB{9GW?bKOYJYnICrDT%TM!u;;LL))4GSd-*)%I!W(V( zHj0*8J#c+~u=ayqC12kJ_DGi69-qbh6Qey1y4zUa=zZF@j%nTEqgR~OE^B=A-*ZsE z$>SS`C8v6#_|zBeDzQ}^IZf#oCSSY6TGA=vq&G!wVwLCgFMM%}`wupMvEJ8b=TyZJ z9^Jy8%`Mp-p}gh5UK6Ic!zJ&sA~?<;-dm*{+g}yWu34hgqcC|#-V4qjY7Ggt%XZl51Z#vDuu`SHJyI}1U)@u#SAUt(wT|;G|B}TyLfH!*mb{Og&t=DIeLQ9tw++uv9Dc(*iO=8D z+e7>21Krna+vb1a_wwJgb{CW8z28~)6F)Ijp5ER5kD>Km_{}%_+={k~G}l#1R^_vM zX$Z(2{#c%Tq(XqFLv^wJy^e2Eog2?~#KrYZe9g3D#-9$kVpXq|4NDG*%wpkwVG()J zo#BM@-`y{N{TG{HsdZuJf7=a{)0@{ZuU)-E{>k(I)&|QMSnjNGdhnNFS$POY9J9bD zWrr72>Nv8QI!+w_t-emw^l{FHC-a(%3;50*w6tJ<{y=69l=GvWQ{(@>fcE@72TvFL z3-kImN#{bd5BK&)zgLQp))FiyWNvyY99wYxV;xtI&yBo2FLu5t`F#H9-lM^1)VtNc zi#c;XdUpAT#Jptgt*vU0n;Te`i*EbBrTPDfUZuCkwO4&#&v1$Ju3U_vgqh_j-YVOx z(mb2aNhD1A(v~pU^P03%iQDFvX2J`(HqFqOt(0=p#dp$_6B#VYQ%)!fEk2WD<;rO) zm19-QfAclRv{cU|9-d|HPV4q4S=k<|5nANkb@orK&`&K*J3l8~*M+XGt2bW?*RM}3 z4J-Lo^qKqR!bDfsANgA?f3V)=)?Xv$e=}y!tv`o8$XK7`-fk?dY&Oj(M4vxdHU8g^ zJC%F=Yn{DLJa;v7&g;!Ppa1m9!F@YRcrxuvK6j}%9FTiIeHVY}dncKkJ9VoYTfSHH z=kar%6~DiVg}wdRY|-M3x)nkqv*gdtZewqI=6zA{qKWFFBQfWu%}^~aa0yB2vD8_j z@#C38(3W}imz7#m**4AaImt17lH98jmzEeQnW@v1C+EyO@$=(BVWCgzF3bH5>l5uF z_ZECA{QPn9@r6$+PJZ05=*_F-XZI#A+~F?N*8k9Q$*!oHKAx*b7P0SUTKMb(Q}nu& ziNQf{y4LXbcAPq`JK#b{o!EA}epygV z{Qb-zzoHXShxYw>d-p=`_c;}d-+%VsU)@=69KyeV-%YoDGFSWVZrw||ylJinLl5#= zm4DFMoVQ}-g%J5&8VP|9vZ`VQ{#)K+u(UXm!^g$TZ9e<(S;vQ+4oU?|!3haT4Kj^) zugHi@(FitSm68x}2oC)EDJHmLLZzNBuhGn)g90K~oa>5@%<7pE=hf5LsAjkNVv1Gj z6xmN&Gf&w*kveW*@QBInUu$B;kEO>1PCUDxI#v2$S(N`GxSIX^*jUzbOGo2=oU9}A_l<4IJU*QvugR*nXFiM&bhc}lS?EQ*Wu3{a|EbE>G$*vO zur5nYdAZn4MdYZnpr=QNQc8=hao0;@cZrirFF3ndH?=L(OtefiQCVZ#)Asekp0~=q znTMv-g5qg0>4RlmIFgucd!)4g3? zF27I8&vJe1xyjC`>9o-O8>^evuh7Ov3`B3%k5golD^%G%O0+qrK%sF z(!(Q}EpM!ypY+g`b#uGw8BKrL!sxS)!lUdT)jd4gvD?*Ue{Wxtg_lUc6DFR_GZ_k1 zZoywSt%=;%cgx_!$&Bk&djqHGvnp>Ca_VU~bSuyM)bpi>Mdr_#&ujVM;r>!?IqD~cGdU!cYSD=`}Nl1gZ>>x9_<44PL)Fsy|zy1G|*fov?}S&gT6>E@8or@ zualUPk{&-=v~|At;$ssYEKn$3a59CbyQ9ZMU1ioIAz|U(WgLqyrWm@rskuc4WKTO{ zvDnq{_{?4%LoK5dE}2PNjtW$+R9@Atb3ZLi$2R57w~X00Tb`a%h?enHv3)Z4ZGy2@ zwTJMGlh)Rcze$-#1hVl>Y5bXz|K9NP$9s>T-P8XNpVPC`+-%lwxq0kAoGw3%K34y? zok{FPaozLR-<|#md9vc7raBS>uZke#Nm|w+k=A=~CCp*L2r6VG)saWs)|McF9^0w2LW+c`MSrt_M6Yslm zL2|$825vw5Ef3GyTz^(%#x=Ln^LX=he>>ZW|KkqDyblj*G!bh%#PMTu@-Nq!DwYbC z7xKK$Nw}U<|CQrB@u5@nV&7BeJ-DZA3Jz|H;80P&6?{3eBETUpC#$N;%|W2;`hpdT zVcZ+faBM$zN|SMCm{`V2o=zo=&-*QeHjCDJId)9qn3`6-d+x2hoqZQJ)OeVvZ&TfL zB>jaDkDBHWk>~!Uzn;ur{qfJiJqbnnNp~W>`@V^aFN z-h5Wx>@}_IPD*vv6Z`W0HzFmCt?XXCoM5OaZg!{oXvOy8cg?2ZzUwQJO0Sk0AND!O z`J7*0a?md+mA~O z_U`K9c>BTNLNyP!u0R2+;JO)CSDocQf6%A#c&JU?435PU1rPFwnuhRAZ{<7W_JrH@ zrMKt1bJHxd^>;iyu*Fq-oz&xdQ)XUsT32xH{*8j4e{Siv9=@=`-%qyu$zJJw_blvp zuYD}KN%`e1>Gf(GyVw7`ocq0G@tWCz*VZps<9vXN|9u;a&3uDMuE*{dYNqU%__BFv zi^MatuPkr5rY&w#7HT{B?ZoFMeV%LX5guk6SyNojab|E_=vCUucyyv@O3i_v6Mwy! zAmF2-)T7q1S?cM82MrwBygXI5J1%|MWtmdv5q)Brfaa2Ro|~!0+Pg$lQ_Vfaj@1+y z&H8x$>g4{fa*vy|+#GJEB=bb*EeY}!E83~DI!yZ5+7OvDk3Ky7)*Zxo%;oDk_q^)V z$DOMBJEy&QQT=$~zBxVK=k{;;H*58)UF7e(%kI}N2~DeKdm^+B zpPM0`9Km&(BSvPoRTz^Wcj3kZhdeSon0O2)OWDYE%=B?~Q8He-<3`VguZgoi)bLFf zS?#$kVyT18s{FDet{QD3)lEW=Hfa15NaD-n|0$trTIO*oLT}#ui`PT#?Vp`D{i(ZP zd(}h3!U+p__f9%jyE|FYzQN$`k>qLe#}b`eL{FOSeRbr>GA{4)%PNC@`PuA#arD@4 zjys?3q#s;fKV{wO)%Px%x13YDuJ_`W`<=w_y4#benc` z_PV{9!l$xb?zdhF)mX1`LYZ^7qU+ZA4{ft%o>mPzWLsWwq(IA6Trz$6j-asK3#!YX z_bfP>cygj@K+aSH#SzN>C#B!j=`^yDs*-FQo*ElS#t}gQ5 z%EtO)EvMqei^pcn@H%6mdu)Zq;?$+B5xO_0g-$cqy;Q@^*t6Ewq_X|ux)~qm)LjI6@l%G-0PHsN;s`UwX&%*h$t1nOg8xgyAgLBHv zS=ReixeDj#KhD&+SJs#P?u@ajU_t4==GxK?KUte!ojR0uSy#+wA5D}_8Kc3w^4UF0??XNJouUhz#=+svJwx>e3h zlstBOZ`M&g+FBv&QJUKc-^(+Z<;>4`B(gUv~aq7Uqn}SgG@|}&ZP~n zUh%DnvrzbS>WthvOYXG)HV?{n&zno7dKE_ij}) z?=5;e;m^n3+x%a8T^`FeJEn4+lFa|3a$E3&Ky_#B$-1OT6VoS)r}UqhpB0l@bNa-Z zV>yrA9tR(*bz2|EZ{?}P8 zS`_tn+*xq`L61ML(eurTnNyZ6E%X#R8gu37du0_x!;5*LN+S0b2&@j}qE!9eMs|OBN@IY&Jb4bFMe)Yq{u$h&9KOiuCP5N))~^8OlFSIy^nC zI?ZQh>FUh}MxPBDBEBSSu~%F2dBKFZx#IKGyC)?4ynDbvV17YL`ljsU(z{nDUfzB^ zwsvdk-E*@K9~bwp-*M~Sp3h;Qcl;%Vzxe!_%5(AS zc{K~RPnVmMa<=@6U1@!MgV@UMfaziu4`-OU$SDR}%O+_oc-m(9#VMFMHY-BtSH=rF zo(t=x<2ZTK0>!i*p1qbNxT|PJ_pR1-TNHASwecBWOfr3~Slbui)oFJ%g_G-0@kI9M zWd6#k*()#gv@#zyd&z&Z`eo6X9*vuu&jxjFKVaMUfpJ&oJN`>Ck~W=>=l3QmCYepI zEG(?@G(0k+-?f`#jpv->389Z{gyY`+|8Z3RqvNJy5;ZBOFR)h6nV#PfyZ3Y33D4B) z^;52EEPa!=GXA!0RqFeqs`%V*9Ut}oZ`S9L-6i*Vr=-T-gn)#Tc^pS;Qq-O)7yhv_ zyyB5H>DJ^GapK~V6HlyCdggY{b53$@_nM8b)L(c^uM9l0bmM8Ea)a1Cp_2};X>3&F zvM}2GS@EdY;)a}Qw^P;1)t2tK^2Fy!+Kh#rcY5ak;r?jzurp%E&VajYqAw#9{SO`s zs^1s&|4Xj@+yBq}Yt{31zuC%aeSLfHs};K4Tkc)4s(yP&FojvO=I_Jz@%6jjA8psK z{I@Ln{i$_3zwFu7eJy`Z-S^oxY-LsZ7n{G9Ym3-%ZDLuShx3U=6Rs+5XTLA_Z^A|4 z{r3M>7nmp>Qcz<##ANK``=VFJ;K}cRE5FT(!*9r4Vt;6oSM9R&;uYt|+gM9k?VKMQ zI2~&gl(jGLaI=#*d#uzg?ajj1+m83%IcMLp&dpi<0!?r*ByI;q1%XLfhlAJpHuqeOP`$ zaAoQ@(JOnWy_oiWZN%-}n{B;3h3u8h;-lDJ#j}0->t-Nq&n0I6KkQkB!WFjb zSvxqTn&K~fQ25JN+0n*+c+Uir|MDggl107$-!r{Fb8?^k8}45lo=Tltps>dAu&P1p z-L(&`j;y~_V9U~OyXK+MmA1E+3Yc5kFw( zxcSDN4;j4tZ93jE|GT|~obNU1ZZ?f+ia4#(_}Zmsb#rkDqt zGWPo)uKcabWZv=3KHDPyzGlJVW$~inUspd`RTmm_b$!?BU!jGe`?c1+3O^e9ch!zn z*d?bwW@JtgHE;-Pydk&nt*yXq(cJfH|EAB=mCxM4@^M--6aTTY=BMhs(+l3%vz%LR zfAFFk@AJ>!xol##+%}cDy;zs2Uqaz?2cuEH$d_c3IhXmxE2d=Z4>(*|-FhJThs{N9 zQ<>+TWt=vC7vh&coD+Ao^iV^oFx#4J(a$;83hd73GRZ4FySe&d&AjC-^VDwLzg}?f zU)KTSqc-X$bIyO3JkHDfBws?I{%}LBB-@+QCJpyM$U$Fieq7qYpbU0#lLp~e8$uok zwnSb~`Ec?A+ggrTsi{qt;nF1v=jQw6lyh^jM$am&5ldRS=Ak}*U%RgS zbYC|t_y`yC&Z6$0yEp6)y&~SdbM}_2u~NCSXL!fnzJ5>V*}F?BLG7lYM(LMIAI{NJ z6g8jr>P~5t_x1@U*F*PD-NL!Igrn1}`{SJ8JXzga8uz(Mll~~>hHl>$d~dne=6Eh% zkCW-a(Z8R*y0+x@vbRTcU+i{W8^3z)p`_WY<@@u6?asga^8To5UDKTN*X`Ze*KKxq zd~M~){eCyLEV{YZKkaMMTepj=`r>94oR*)1G-J91Z5y}n|z^X7T? z?iF97^RG*OT=u!=@72ugD_xSiT9>?LzqyQCENQp@raRkS|FO;y*tV8KIzlPsw&t64 z-WiK8t}i{e`_=n9(~bVzyRtGevfd`BI=aPe&IX^J@SV>-U+cVA=N%lrUi?y)c-*Ed z`?>Gms`-<2@x92T7ZcPzBKx9MEh>cwoCy~lUECI0t2 zcvEHL_B6%Zf6{KRUhO+^TKTz0jn;&&&qcHN9?Gr?=an}3d|>9U+s5o${oUeUysr-W z;npsu9mV3#{ip0>eYM|;T{%}4E%)y3{JYV2ZmHQkMJ^xV$D$sBuYHd_4~g0B7_r;` z)SY?Ot!=Zm+}xDFb?NM(xl@&W4#*bPXl?uS@#&8}4qK)tp7yCJ+Hc9P8sGN*OneLL-KXW(@61`f;^n19ji=w|%PMUv&D^-m@$=OClc(!D6?E=oJ99}s@m$>c zxXt=`r?)C)t&X{#H7oOK+CN)fUeVoBI+|a%Slre+7k5*-B1CkrQ=)~^W!jrM!`3m*!;DRf9DyPp|ZU37GB@3_x)d$ zV&?Y-;dRLl)22OK{!Suc``^l=`=^UMU*~$}{pQu%96#%d{fbxEVrekzM^d?cs`RB* zh0CHn=A6I(khB;E-u=uReyE$Ez{pG>_ypbU)X;;aDT0jP_=z@@xDD1=C|wV zR)>@?ezvI8Y4zIl7YiQqRDM5y=KFOuzwRpCb$UXTx057h{QR5#_V=^k+Dl8HsyF)= z-mgi29XK_t-Yi!Ana%C~TB+iBim%)L3vT}#WLMpKaOa7HzL==CyRFYxN$MP z=YjeQj}z@qHm0IAe8;2I?gf4lENZxaI^DU|ZD#Y{!yDD(4|6N>H}-2a2v*F0cpyDr zsM5!J-Spn~M<2~q{nU6+E?!;fzWiKa8Ew&fJ8$HRztVhhZISNt%(jjTuOzKpPoKTD zWzGEG%c~}pb;xbMaKNYL+kELetA6D6qznHy-nW_6_J4KG%^z=s1e;!KMbEMQ+&Xo| zPnT))Kh>AF9#vuw$c+83z52(mP3Jeb|G%?&+P2+Nb4vA|3Z{ll_MUm?+O2D?zNcEY z^?lpMmp*;>+R)7Wb*F>8=Ek1;?=a=8dT`n{)AG;L{8EFo`=sMSrcCbazoU~HQ@q*e z@ZB3%uC6>&P`b-XZ09TWEnCZWM*UEc^`7dd&UdJ+ygBIos}l2VX&R5M?wm_o%C~Y( z-kY4v*9DrscXiK&m8VY+y8h%%!L`zd4d?XAW0zmL`XncGL;lK3*B0z3ocfI~eDCUW zS8v|Dc5$Ue^lMS|bN6GfFWIqm<(;)&;pMBnBj3EsI`mL4CwKMp#g_Np95F4}BRuot z)>7TFtz|o7J!0EE%8y^taqU==J8|{l&fBkF6^-uBFd%3rA zoqKin+%dCz`*)n|wazIr-M-l6))cqzO4AhtqRO<+YVa*R+PW#b^t$5C&3o^*CgrRx zeyFr+$K9BSu58Y{Wk;{>2|2j8bkU^QKV@{^r77OiJDX><_3Ntwm$lw6-<4cleW^tE z&9gIQ*9(7Y^XBeIog-*|_3G2S+$YiR3l`qnZDqV;mQ`TNp}q~b9_5ti6>ooZW!<`6 zJfRsDd+y!6dGAfksp$_EN5^(s-=6#Sgw&)f%H6T={Ok1AiQxH!0GTy63C^s+&_$G_*c zTV)C7-yc66=jUXo)u4y4RrRUDSyihGx!vEE8=4JK$C#G>+E{*+b^-Q`rE5`iKzb#Fv{~2_;-%m}imNlEjo^Xt24v71S{xQ+k(`Qzz{aSMYY3>Ia$1O_++ zhll@O@#f9ZZt?W3KSbiMUo*O(9^;kSUTip>b(exstMS>4)vo+=n=Y>5b*^VCzriq*8(^bdE;66W5&&%1xhf4O{b*I#wdUd_*Vd2YeYB@vlTPbM7m zR9<@L{><0qD$YfJtRoFFj+kU9`xSa-+BQE9E8JOl_&SsHjo`LoUE$2V!VLfTnG4T_ zW9%3O9YaOTnNdcTmM9xUV<(=>I&2`&_P(mia#{NWU%x7Ywg+YpoW);#W6a5%!;uwv z;?%+Xc+bbn0vc8J-TarRmU(M=m^S;#-E&>r`P`N+J({{NveDpyYv#143R4TDkB0l~ zP3-i4ckSrIE3XRELRlx&RJ?!mhHLlaIqWqFCudL1n7Z%4yVWmk%FUDa6*|3DNG;_R za*uzx)O`KlmI+6;)N1dI-&y*;_@9zpc=H7Jb1S3`y<>dzFMRvew8rc2%7s?HgN?6z zn*ZM+^03Cby}cJ(`~5E4tYv;`BXqul&&73#l5&-rm8(|RLMPAq;Fw)fA~UE9L~ z4mK_FUUl01tWh2Nq-P?Bprtb-^@9aAqXKla;aZ?4v>7T>nXgT_x;08L~jM!87=z8cK^3ih86XWQ3 zv>fE{Iq=bPkW=RD>=dYXv>eDk#1s=IMkW?0<;2_A+kMjJVm0&EUnp)c*t3~aN9;pI zu6=%jg8YQuy%B4eReshd+ziTgS+(0_`L3IjHW#u<_Rq?S<3E`+m;0>a^!e|7e@@+G z`{&Qom)nuf2Ns!{GSK?o)2%JN{^0-BA_v>hqtE zFWbNWN?;Rx{P6K|_2SG;TkT}+>MBodtoiX{{o(stwtalx-v7VS$nR&$=KgQ0syBkW z!t`2Gf~F=VoYLIBW{zwRum1VJw;va;@A=+rx_-aFrH_>XX$5|}A5OZwVNuxfGxutz zeCd@u7WL}V^yk;NTJK-iAFsc+?$_d1IqQ>7Jl&r-E&Efr?Ynz(s`r?jJ+^9I@NKr# zCPORU>!u&P)F*pC*2~{xuV#_zY+|?jHDA0(MY)g1X2D0N`%YW>78#$crGC??p zr7BVCMeD9b*A7}8ytX&CZr%OnMTP%aL)0T8uk2aYv*Pd5Ui0Ucfz$M@LxOI6>DXKH zws_62JE4}XD?1V|Tx`GDGAFg=b;`8(6;IvLO;+9H@S1RCtLCBKPpwQpYya9YC!kzd zh=2Q?wzN%GSlKUlW~^!mY%p#;b6mY_%El*qS!-|g6wjSrug3kn+kj2wfYGf~n}*Ps zE1@fb0{XHwFW=PfntAnFgXNVej4Tu8?aSa|t$n4wnroJ4T>eXqfa?t{``_(1xqnfd z#eLKAtEvmmomi9d%Y5!Fw&RTF^eiIt%y%^fuU|Mn!XT9IoKE7Z>z_|t=U64Wa!LEs zW8K?|EsiR5F#Js&9Sg!xLEIB3V{-QJIWT!Uw>cxfemRBjSp5o-OF3Qir`AtEkqE-DwzVAFm zR>CISS8Mmju;uOYHDJBUZKl#79KuR|@WuI(^+Kyy~c4f9T%!yDP$3DovRJ)eo2_yzE_JlDfw|zv9a=<1CIl zA6pYP#^tC)Tx^jH)`}BLZ9m(kn&ILYF0+=S#bicYQ=DpgzRyyHG?q6-CB0R-P7=So zvqF0L?(`eCA2*nh_&w7iBgJ>4#KK~Ii=*ov*k!~q$#rCVuKg^cYd2=39skp6zD#q^l%lY=G1~ge zrS>lhpR?-#PvlP4#MtFwCC*b;i@w&pKOt#CfuLq}3X6yi^IOZ3rC|p7Hu+Nm)(X5j z`qtsJa?;LOsRhx-F4DEZEID#Y%~cbHjZOp{-r#j6+T~XF=SD9}kGGsDdny@Mams2j zo(pktR(hhguzdDk?u}sqsa}u1xh>XvR8x`r-OtK$;=~(ZD zT{B|}w;jG8)?gYTb0#h-;d@~3p*$rCR>4QsitR5ZN3}}qou|lugdVxV%Bl=Ix@_%uTMkHw#&m2{?Ye{WW6}#q|{YVTtiRv)>=#B_63?`w6If;EZ#`PX0jeo#3UF|A>$nESmrXPJsW%NHKmcJeL* zTYJ~Dg+ix~9(XIC^)64tLD*|zBhO4r^Bk)d7Xg=rE!Pr`R~|TiWp;`2f9HD!OCKn* z30-D#XOO(~;X!Ld(IIV~IV=k{eOXvN`Qs`c?n?^K3q5-8nIv3X5ueGeeC^0~Wviv- z@9&*@pwK>8L%hzOUrEK?We(~2dLP#>{ zL7MxPO)_yFOxjdv?=_ zGi~L54VU-Iv!vE?Ehv_FW#>|Qv7_76GllVrtPNw{gq+{<8{(9IaI~1ts^m@mwPx{_ zM?IGwIg0lheptu*k(Vc~)`IxdEKJKRCN=IlDc6S<;*IYg?Hvb)C6zD|W7G zVMN7&$uB($FP+`q?Y?}CyY%ay_ly6&StkFIMLMHCUrfOELb9Jyf{v&vgjeYf37*^x6v|Grd{gKoKfjq`)f8EjA4->1!9q0v8+*Z7Wq<>m#V zanJVDehgnB8gsF=#DRI1<*vkOjFL(j1-y|i9I}~Wty|_k-7a31bm-_Do7MLo?r_yV zzh(BECn^Q;>84S(4OeFF{WHr&YlZK#M$#dtP%Dxyl<7Q;Cv!vZDfA{%HCzgL$(94&6WO9VIfGCR$$D$7> zRv!KE^}?g@12-!civ@|qCh#Bcm}WNd=C=IEE#J-69<0sIP=6$Pt2f{6)N9wpvlY2b z8eDg)i!|hN-Ot^$#dH4NOcj-RGlVW2IG<^Cie-|j$t9)R9)b(q+3&SX;1)`~8)F_m z>%Xvr*0U8caec4>K6e-ND)FTm&dMgI1ji|?D56Ej?IO_B<-oRPSw+4qywiSQ{Y zEi#eODTYs?*_%K0R% zv(79eNHcaGJQOGialyr@rQ(}iOpsZU=Ul>2UHF)nWB)QZlYRiXNR zHOu_;O&ZeP>2tg+`BtCnxEK@v{KD6w#`Q%rA5OiYz07J$Ny_wBrtG`xF6M14W9eP+ z;>E2?B`+KtZ+CpB2oDO^3PhnSwje^S;`5aSemA0o7Kutt+r%Q5{p{NBxM}M>=ij}Y@K3JAOzFqP8I!hr z>e{fMaJC0DW+`mA@*z2TX9 z+Dxsp(d&Ng(foWJBgZiI7e8~erIVI^v0M4n;KBOm6V_didiL~=V|YX5pFF`O6^p9^ zUp#8N_q=<7ctM=|CZ*MN>v(qX>=6HOY*k5z6=(K7-K2c|_nJBFmwO$TDVI-X51hBK z?fcTT1()vGIxyre-s^(hdo_)F4%R9tgu+j^HTt3*QPn(~~d9lviL+R&91alrPRs%*ag^5*A@7PdW~cegU*SB%f> z$)>ZncD!G-|W%+ul_;|wl#@o)4kE~-t4oJ`Z zZk)Z~<~>oFYWvr%>z<_xb@$cU{C4^1m*BuLajJEcPRi`ix49QK2p(3OZFp_ns^|s0 zTZ%4Ogo#v7DsMb+m;LMGO&iMB?A1SMeDC0^|AnfHdwv;Lu^jE>k$Z8Y_Qd?Qt8;8G z?Po4JTk=HNa^w5{UzlY+dOU^uZ?wCx*_pagz(wFwf`$V^Ke8=xW4R#j`p7W ztD_k<-A#SWx1DRFfW-S_TML71pK3*Sg;4@_hm4H`miF%Vn8h)B?!^s!UjMY^+>fL^-W>KV zY>P{=cK^ew!%A`IjBihQ`E-q!bIq5{T36P`FLpLwJkW&&d zjXt<_bHQP^S0=YSSPc${9w~gw&TjhszR*7*PSa_v7ayo_YApZ%Txg%||8IY8f3|;G zoV2^gQhV~5M=N*cTz&fdIDh+P`Tg~EQu^zQt#&tWt*ZHS`ttJ2#*e?gx%tDkSVQ5- z4~>@ve>ME$i*C+|KNB1m-hb=6SkeFVpFiK8bX|W)ac4wbeWh2}($CBP&$Dlh`8RK0 z_op#RVSDTl$ zw8V$~=^X174__pQ)UVqUH>apfW=V~$$1xfGCWEchp0@ISI@W4(*+u1P?^jKo6>WQ^ zW6l_#+5h2~WURaNnF{@rzYZ-AK4f$7sOIX#6Pj0c#fAJR@!FtueADUB@>(BuzU7nj zei)x!$0oD>M#f?71F!tHT(;4^6TYH+x$-HC{=Q9#hcu*5&6+aVmV0{$)3NBp9Lr*z zo68gOS6weYo5c{Ozg$xEO~Fi;r%!~NH%-4;^lygG&w_thpB*jMhD0{0kcSEtNJ>tv_4cpC7&Fb4CED%GwXx1AfF-`sfPKcljA#z~ApInd|{YPK{>jPG?6j{Hh2f; zvJ>fWMF#Sq9P}cFVKXQP@((Q0y5YI+!PvsU7-LZGj+s#H`}G%!87}XMZ#c@d?fSRR zY;2zxZ{Fy3l~FkNpV@oslFXnhFV{`FVY}@ykI_5D=shAQAFW({Md9;#?y2>yOWNb@ z=l`?mRgHUDd~o`Gzx{tq{!H|CEqMOk@Bh9FYCk@{&XTCFtF!l!-&bR`w?@C+zy4`h z&!@tUQ~X|5_S?P)ik>R&yc`(!ch<#w^SCF^->np8peqe%JHK|0@r2yRl&M*Iz4--CF6!B^(p*FzE5J z^hpL*T5t9Ij}-sB%|FFZV{*%8ySCGxFX@~={rUUnFU$Cku37Uz@9F=f%WEb+Pum)E zEBNHP@X6SLQy;aEXO;!_8)TAGHni~-C70mFF2Q9JQA-v`?Txo=A{=-ZCuW`g4?rc z+G456Y%CuyHN8CgXiwZWYZrSA3%>=cR?dxiva?FJ3Y;>n zS*R+nvA&G`)q(Q#tPaY+JO(Y)(g|*Y8^#?G{NHmXD4| zOc9GZCXnK2dV=A?A%$O$FaMdl!O%>{$erU*n&kPmE`j3?3p&c?yl?9Ax>4F3FT><| znbYLp8+KQ3VaGQ)3bKzBS3XrdeQ6!5^>?;49Jl@pd_DH`B(PKHxHMTaU`E_ z4_RQswvda{=pOsZDG?d#ZLV!d_ptjZ)u_^vzj|%tTFuG#4;db8O^8#yf6Z-MgO8}W z>A#{!Po+0xTYNu%Wba%qCAFRW$D>N0{EL{kOoL5!O1y@_Py|r76u{0j8ScKcrKp!l+k`l(5`8L^u59ahb>Rl z1EoJ1>NpW$-}b3bvhq&v zeRDzcRhzY9`>J<0FEq{L&2ihAZuz|X+@)W=FHhJ;hZ=lX8rx&%Rk6EQzkk-9+=A@M zyQ5d+uPt0S@yVVGUcWEQnak_FXK!BT@om4Q&3;v0IQ6vj>)UyE(-)Rk&c8aPVb%;U zE5(=oKip=^u97&yTloA$TiewCF{a=6x*Q~%PG9+1E|$j?7xi}=)3L=IFZZb3*&w39 zKhbQ;ZNX!YqF#Qeow`l_fE4pOYX%YS9bUD!maN`r6f5=MVUvg4-J~hSv8Sg`xL1&` zz|45V*yP~mNfRgdv1j)F;4@OOZ~e4n50h=P;KjZS*L?SgOJ2Vt^;YKVJ$)SKQo&xJ zsA|K%fql}c=?0m5_A16L%aGLIK7MS|hXlvH+V}3q?A1=uSfR*vYHs87{;(Bu!)%sc zzu|javT9xJnPR~VY}c> zw*O8I&wZ=@ny7u~bL3sPyIr@H!Jut<+cE~L2e;!E`Wtn z#HrWMX%=ti^eb)g^FLiZ{OZT0zeB=vt`Bsql zyzlPLr+x)xGn3ZL+!o|fdi3!BDCvEMCu~yg-Y;Tbk@Hy7qiWa1NSmap{uKeUq8C0? zYfXQZyWRM!i2j|B1C<(i@>0F0RNvXi>@N0kxnj9YREbkY^oc!R@2d3YZ_YN{RF!(y zcP>!gT2J|3Ui)t@*=AW6m+2Fmw~OrQxv{wEb3~#XQ~o!j`1prj1vjsnNu7KqxaYd} zJBID+*DtP9wPP#NYX2FNzq9#F$1TqE)F~}p+Ur!guK8?g5!UK^DL-p%$zkc#d8@kQ zZt9m+EM`f){)PMWkCXc)jxFXHCcn$Cmsf&wj;huw5?4=r0ia(DfMK^kj9jj6M_S>CVv^7`7&}Gso-t}FZYuK&YMJ-Z~@RS_+n}Qn)NP{k+F@-wpQN{PQBKvdzXtV`N5(ZQLgf{zpA$O9tbe6 zoolwx>vr@?^Ir$`)^IKAh(7K#b(OG_(xRE287?MnzZsq^Xkfo5Z&k{ z3gk{U;Lwg;b|p1kPfqsrJ>568YE`$dOlnR|K5%)%9FM5yqW-VfUI;TW|7x0)CGB!= z_3uyNuJ={uJ386g|8(EqBWwFUx-3|B^ZiNZELvX(m`>PZ{7&?K;c|s6uWdr>4sx2Y zM@O6cLAxA+Y)y_ z)o(CvGn#wg7i+~Kf&4l*p>3J`WoLOskNpz5V`+U^;B&y{$%mC1s%_V7?N(DRU_3YD zmW%gh|H*=nrBo)~V|H^kyYcOUZnIjO@{*A4$BVi)E%e?0eM?CVzdVbUwaug*T=LsY z*{ZG;J}7R>-cqI=A-p=Gg5wE7!`ue&S&K&~Coc zviY79_cCWNe%i-*cA>n^x)3GZ?*}$cU3wvV_WRD3a-D!Kr~UHF)_&Wkk?CZS9zSdE zyQ7|F8ZT!DZGGc$l=~yAb@7HJ>b>({uBj2QYbe;hcw=*B)z8O^3Vpij z{R^A8*Ltfu+;+4+G<>=2cFW9S2mTt1diC~i)=&RGoZay=>ff0|EnP-u zZpnU`aY-uT;R@${eP!-)X=ZM>6WiauF!`R_SzsVG>AzNf#KDyL->W*G+r~B3)=QVW z*ZpJQRTO^wEo6)(3BEhd-${1LcweNS=x ziesTp_6O8H*Vx{#*zI=w^I->L$Et+~UcboOnz%Gdd6Dca|9@}&KT7`lmB=5~{q?fr zTh7S|%Wu4pRBQYwk-2iloPVoN+^abg_CMjb3Ck4gI5#$z%k$n$SZ(*~mtK3_iFU~y zC&SDa=Kg62iLy3{3iy0z%U-(!lm6>w3M`CP4zIrAuX?8L_^Gv1lNFTbH{F<;a^LH+ zgEj~EkA0tN6h6+8`%}{_dBi|Nrl4K4pTGUVk%b@k&kyXI%f|amPkH4fuRksmcs)I> z75NXolK3%i>tV~}Y0Oz6B5H4^&cE|(La|)ln?F76p=^(}zcDc<)rb7i)jG9XM9$ZX zHS1;dyNB*S`#;G)y`N(Fc-I$APSKD%UHxH)e|-M@JMq_tr>AlcMB&ilbjIdbP9n+W)!r|7;}lTcw*m{`~$t_=1v7 z{oj3mo(BE1sbBxcrvCN*DB+9XxH;LUn=csf7zCDm8EL zy8XcHOT;yo$HB=*?^YyL&h5VLXSsLc|Nc8adtTq}vYZ`o#wo|`{Zf6_S2f4JMybrt z->J0ofDWgG;1WMcz4e8^X2=~l^@(*t!4Bi7yxE7gI9-{Wy8olh-0yAykM9XYwTgV% zv~#7kLpHzimkrKu--b=@V0h`Te(Gg~rAwsAhdhyg(=TuOGjsX3-pH}|#Q)aC=D{oFr z&j!_7_PJj^3eKO;@7eDgcYodLwHzncO>O%0=EmFqjEjV>f5RBpv7~gd)!-dI8MGr# zbRX9-1YM{)5Epq;b%_<&7sL$b7@8RypbqCm-|o9@CIGp`n1ow&SFMnYPx0V zasT!wPapoM{=WFylloVE^|C#odI3fA{7ldFnnv9`aIj@(+i^S3$gZ}EcY^Joo+qD` z>GAEF+n@Mu{o5=QQ}^K%KDExT{-SQryCk-j%jkbUae9ZW z^m(z+2ZjOsYD<1x-m=reifi4musdt4Ht3mfM)e(?!y$1boBc|6>waCce%-1Trx2s! z-{zk$SS{2IDtW+RwSiGo?@f05mN=c3hrD_@XW37Q?`Gx=ShuBlSEFE0rYpnj2*!Y2 z8i!s+D`dQib(r8Qnc)xwNv2W?bF{@Gg#U%IqhsM+9&EQ zBPnY0yVrGg%7(5*mr9LZsJSfB)%-lc+`&HI_U-Bj2hlxynH`t}kM-?H_n6qH_+rQI z-f2I?F08pwl7A$B`P+SMOPig}x6YPMaz1-A@IcVri-CO`?gVphdUha1{PYu(*pU3h z&qBf*7iOJ!EhhV_P&O%vIrEfUR&tOgSL-e=*o*t_2(& zX^CA8$Lc05+q^OHZsy;jccs#~RU1zTY*Z7GxE44|yq`yU!I6o=5!=Is+ zZ0~X~gKed-3{&SXzY9F_iekAA)i*m=ZPJc6W!jTI?e$Zq16KPk%XHV@75I>4@mccR zBq7P?J0yS3HL;x>9WUC$X5twZ>TxZ~cBZFF;i69-*0FkPbcF(^`>b8L{F>gcvs!OU z4L7JgVJ)1M`dP&8@vYrG(X&F8Ch5j5wp-u%#nL%AVJmm9Y4%yBz|}{k&TgG-RpX?= z`B2z(hGjrTXa3H%TcLidC9nQ`yRTlz%5$Tf|K($S*Cz2RFszx>+CSx*4T~JpGSLr; zjS^d{*)}_U=(@-+C*Lt4$*e!3`g7t1zuVFNzB9NQ+SN=dKR5R7;86O-$#Lk^Lb(Xb zjK0sA7e4zG8JaM^4Oq9#)Ffw4#_vsAC#hvvF*JPdo-|u_dtvT|-U2VaGh4sj+FV;1 zAaa|J*FcW#DTm<(J`GleyWjpi%Tv&Gob2^&mvlH^_Pt`Y$`Gs5O&)jN*Yedc-PfI1 zasG1Zu8dLsXZd?DX&4o&D9C(cef=ZR%>e%emM0u@ZoysVac z82C@4eoFo1r@Y6P`g_hycyw>#?%L3MNB^xYKPx-&o%gTsTgQ!-<<8tiUrdB-^YUH$*@<@=X~)ql>pJ#~KZYWwwn zzcmPI9ZShc@35M@pK-w!{<)j3m1*(4|26&mQR|PjReR%?Y>87jr5_+_bADdOLgQ(N z)uszfF@C}%{-ikRy3?99{?c~)E+?l{c~&MJev&U?bNNzk>(|JToyPoHq{fo0jm zgv+Nj!&AN$Pf3{SvPiS-?C;05m+oc8&+E?EHS=@6YhtwG>$F{WeqY>RuJNVXc_OFg zg)KX?%NzbQmf!lZTWtDLHPOlUYWEg=(O70-JyD?Kypa9eJ*ibZZgR_(b+>zM4{CC_ z`)76e)YOx2GA8G3x!TF@p#9*&tGer7ZceFFezmaS*ZFnv+wIh3PT%a$EvoX}@_s2# z7#Gumi$z7RMVk*;omFOi%D7=$y>;8knQ>bAmzjib%${{Gu}3;xa=G-nS*i!NxqoUG zow4Sx&AJBPooBuz=EX6}oo2mu{C^EsV`|>!7)j3>_w1Py#qFc?xn@P|mteeewpV)Z zOY4-?Ydg-qyMA-+(+&R_XH3ni#b{9(f>sw3QB4^tm>8Itn85FtGBPkUHA1Pj-s~+; z2nqdWQTMJk|Cf)^Ue%eE#*;l~n*=FLa8Pq_aIoSCRN_>0P?+Gr)WN$(W5t4wridG% zF|1QAn23mn=-k-Qz#Deq=%y?Y(b(%#e$K7Fzl7mcx&8k4&-d$pF3Qt?KCkTj-p`X5 z7#Wy#m>G{v;ghj>cv5$|ALEYi8Vv>8N**k27IJz!BmTQqgVOq}ywtx>w%hGua@a0< zz-&WS;NmTr!B6=aZpJgN$eR;rU;OT#@P0D}kMs?HRgJT!pV{&0%YmJx#S~~{t92_wX*KY&JbkSm}FOY?ar~)_nLE4XUykWAR8VX9?E(DZ;7abqi)03 zgFB~&U(HT?C7x8vxNZ8g&~t0A<)5$Reo%Ghw)~p-fY|!7_v~y9Drd6ivu!i`b#8lk zt=v3w(`_%(x3XP4aDMT@jZ<~*-K}4)R`g~2Rj%z;Es?z2)b}v9ol?Jjow+05ta0h)AO0j;i!3{T6Tw_^atrht+fSG3!7`aPJ6P| zu&wsw_%_M>A@>iN>}?0SKiJ7ArB(3nQxW^5wysbr-j!1_dX z-#)SDrybrMo#2|Hw6e>K7lCs-XB|E~Bmel#>4gz(%H>XK zmwFHCEV-5P=6FNzW-iM^2{u6!8IuksYOecGwB&l85c}%~xjWQ8SsEr=v1#mFCmg}y zueA2s;jCE)LKPd;HUzYt_=i)E&^)JqxW3k&9SRwUuZcA0eEC;UzlHs0( zwfz$!jzlw0JK;ZNg3pci(kWLaNL5IsHeXyZxoB?4B+b%T@iUG$=Q1--ICp+7b9BJG z(*cX#zg+a(h{d7GY05Gq+x71jrK+<8-jnpVfAD#B;G<&>wpps$?^)Kk|I})_El_Q{ z?Xsgx=;E3;%2^!lw*pRiDeZTNdZO{?gy~kPbem&axA3eySW?3Ksm$usS;Zp@xzarv zl-A7UyF4LV`=s3r7Z(X9z2>PKCLde0WXb^+2|q8v@7D$1d!9HP6yXtMP-=e2N$;fh z$D4|FKgkxo(RyRZo*vgOb&oskqJpGf+r&hZi8kHmtv2xmD`zOZ?G4)7 zC&sCr$Y05v`a3bH**#G?(x*+aJbfbDldF0b9bu2fuI#Un=zS^w(EJC>KQ8@)VHM0~ zO4IWX-eUfc|Kxr6jXK@w=bIz8w;#U!=cUX}Dc#)fJGOr?yx9@^c;e9$6JsMbP32Q6 zpTITABTjL>gSP8ZCG``3In+-q=2$=R@e^euS>4-_o2K|E)OO5T;bC;AeeM1Qhfi8R zQBP7hd8B2|+iUx;uW;ZLJrRF0IfZ+s_p!vA%_&kV9d2@eQnL#9G|lZub8VRN)0uf2 z`^DtH-Rzn6iRVs#0b8_f&#ngkq(g7E#MIgE?38gnGhbnS;%}BG&MUOv`TW%{-l*>{ve~)uKuJmMlhC5#>rvLH7iI5NsGHG~dLZ+FgXZOB z+IIgJ_g_+%5;p&|-TjVd^ptzwEBA17RqT~|_PK)n=E2j}0jnbasUMkITVPwGJ3CSE z{COAIy@LOk_!p@^KCNwiIaI*<$;Z!T#JjD zrn4(Jf1Jr8p$r*OxQp_RJeiov#1;dEe>$-pAh`6mRj$IiH~YbN+#! z*6#i*9@Vw;@UWX5m;a&|`Qq)ro`!7#Z#Rp+eGw}2?13@wZ)1t(NprilmGZqyVitTJ zS)_s!27cGcY+oIdFG!WJJ#Owi_$483gGPjOjMyH_is%o04`w}xZ;EcV zZmMqn-Q3=^p1q&No~v$R$P^JjsTm;?L#CQ2XPyi1TJIAdxv!`$w4!a^#W^SQmaYxT zet&JzHO957Yn!8wZ=1IDT<+d=rKzuPUGtc|On2GYJJT+k?Z_>Oj=a5P+s)jsx!kwI zw%)y4mVf(kuK$+YyxX^~T`61h_VBj)E$Q3Ex8J|^FWEiXUFDKkr-HW19d(JL=96+? z6#i=ysh8CJr#S1SU)TK}k^SBkAu35d7GZmWVs!7R+bR4Dt%=GJvlrPPWTN>^^Iq7T z&Y(NXd9<}BJo>ud`=jx^)Oo#=;x>8kc|H<3Kk-*t;Ge)HKb{q9*xf5{%`X){>g!QB z{l4(hiq?9oUNBK5qQ{}hAv#ETzYJvpu3)#7Mw{L?v#=|_w= zu4U1jcP*+xgnv6R=9U+B z+23&ec-Z4(|HMbGa~_>e>2m+q*|k9}$yMsTxRH{&#=A_}jVl<-7l#|nK9hgDK z4rkd+*_E=IGxkVrT_c!wnCDAx*R6jS%ND(TyY2dIzpZ<3m$huoiN3#$@33iZ{lRqK z+n2V@zMYq|I`ed{v-HpNMGfcuPDGzt8SS_B@0YG%^ZCEdFZZ7lRr4xRC$e|LqbsHJ z^=vGEKbaI<{a@0m^!iD4zkADq?^JJ_ zqhT9Zvgm#1J@q30l=&XE5A6lZ4^=hE{D1eu{P=#We?LE-k68a$U*5jp&->$r(;n-~ z-Y==S{qfRc=Kkq2{x_?E5)nLt9Vzjhg39$ z%7(oSv|akE`<0+i`bwu&B2&X|F8mXDbJ3sapNyYsK2<+8eX71@e8{`-cfs#M-v!z& zu8H`$ps2ZMMp45f@uPFO1gwulr6r%(Q*0h~Q2DUsPm#os@P7yI-|e@~&KI3k`RC#L zYx{Z{es8Q;y~8P{yl!npJ5T)=L2*NY^4(~{n0{DJvSr}eko4@`3!-WNW< z*Hitqzd)?^`q~}L`+58y<^{F>zF1=89lc^T3h#5#tzfVHvi;*4GvU82 zyB})o;eP+n@3a07Hvik37qXSl-?`)e8R!08e0vvG*?5~Q$iLJfcRuOM>h(^wQBCTt zuRpB$u2W^_{qyf3-VdfV-TQvmzW5rbBrs89f#|IZ;Sv3I$JsL4`4+jXkKh&jk|gJ( z|4eYp%z8zsMXFYd-1UD1{$TyryYGYACySrbRqXzg&c2AvQT3m={NgsVhc9c`Z*uNG zWVoqmjmqu|!BuQ~yVJg`Nxr~-(>tkC&^E_--cNf~u_V{`DfSx$t*hRhU--P3;qTPv zC%KO}&e^~_tApG2p!h}ZPUVj(jTILrS4#eC-uEy4ga0E{p^t+0zoOPpI{aeoUcY+| zxBrQ8E|@Q@;`xN5QhM*6@{`q1G~T%Gw`*N8$;5(p{^aBrzVll8A0%7!sZZvAApfMg zsO?Wf^~e4fj`LLaPpDt){#E{y^e>CGOL+aK%c{tJ&$QtS?t0ERQESDdRV!v?t(cY) zAbT~Kxp(2lD;~aAd~~mP8LjNSb#eBIWqhxe=)GE2Xd-w1huo{BLVKHkt(gBs$Jzv%Pxe>a&!J-R<&EnP0)M4c%DF>P@dp4?(N*=T&r754@D*J{UA`qHoHZ= zRrgTvA+yBY8=`M0+o;>u)F-_?F(`jP2J z!;gd?J^U#9(d$Rjk7hrLekAxY_oM8`*pId!S5)}a#Q$L^zuJGK|LEgKoFC;MsXy}k zIOWI6A2WaWf86q8=a1GOOMguLq5m=aqx8q0fR|5Ny<@vp`1Tjs|#KQ{m9 z{*nJN{Go;7(>uA3%s%3_#oxS}`)Kr$)fbNGisuXGyL)dB zis`AlA^T|Vqu57UU-++ey}sytL&2_N-p$$<^VbTm7nK*27c}pxUpW85Jf{-yXAZ$-xs96z1%AF4mpxs|P25*sbV_2xwBJ9cf>z=a_zO{3=C6A;cenW-B# z`|iV%osS<0+r*uG&ac8Yc~WrDWv7>tGb3;AEh_r_srtL-i`(lrtoYyXsNm!Q$7b(# zp1mnIJ_t_llQFG2bEELFy3d}ROHVePUOywK?&*~-uNh&cd#jF}i8S5({K~nx;o5`{=s<$N$px7BYO|{4e4|ZmiFDod0LfojGwgBWFs!T)5@RlqX9Pk`BC| zyk}m^4~y-mUv9X)Mr`v*3F+huueV5T^;#*w>ZP#P#9)b2me;Bbp~+0sVFH zRV7qCopRFGDOGazVUa_X?BR_-hpdrk3clayB4ZeL=;jOE)XB3?=vpj25_Tv|b^Us)fKy&tY2LoG z4jeeJMs&0G1k-n-z6N=n`R%u5?+IJ7z6;7c+H#UHKDaPu!J49iKV{l$B(|q4*Vfs2 zZtY2r`*|iOTkgsUOZ&dywH3Y^TWWK3_U0=cg|Smqc@`fq5b01`>E-03#$Mpdsb|8d0eftE?t_@v4Ty}U+_4i&HVWj_pO+DjpbFZkei2{MDv!lIlBF%Ia zB$>6padiTu5%dgMO{oA^pY^fr5NxdYom(w?@7X?`CNKVSzA-TBD=9c8-8Jl~K zS~2&RXB2gNZ)#}{=-&<7x8`pLiX91nj%=BH-eYX6vN47lnMLWV9MRG&*rmQO*6a z=b=>VqCM+l^NucVNwksEY*hEc_(m{kcxvNQEUzGlL!qvM>hvxlRc#TshZLpUL&2XB#tz zyMUjPL6f?&;iQQYCwCl3c{Be^v}Wb*_kv0sOk9CRef4?Ltnc5to_J-*rR{rglE|5* z3G+pAW;ZQWH&offzFNL{1J^@`E$7a+-aOxWxj*@*;B6hA?n*5&=k*WnJDP4h>k)rR zf7=rNOSL9UVVA5Y&MH^B`z}SuX{JzmqHp1rqgpMw99&UA{PUiVjPw>9pcA-&V?yUIf`%UUY|0(~x{fYm{>TeglYP2$3 zBe=_~^K8;4--=CIqU6KK{Ij>+|6>6o|6!Ywmb<|`%a=>U%}t81Kf0l;EAf-a;T4)~ zioraQ!8~VEqHYKp$?!{twew7G<=N}p_Gf~kd5Q#=KXcoeD`y;bw&xc< zu|$^b!W;GQ2LE0m|4HRP^FGwQ%N9Gy_uhA3nyH)lsh!$SR!k7JdwllW*)PjZt9lkq zc~R|mL@+_=CYP2F*YeeTtCy`hv})ffpU^ff*Qsl`R_xJQeQS-`s^lwGTf^3dXcP_8WIMg`UidbJW}v@FY_?RdILQvAMH^Oj{pbND*|qAo!SllAtg9>VzXE zD_>6k*qFBHsIHHogvYEi$_YnW8qY1WTPS#T)rlR;nl5yxot>ermaqO~ozWT7i??TS z`pmfFqqOG5G>d1t?--pfL`7_{-WBC-MLi(o2wFD_}iuM z^QgbimoG8>d`6pT=~WIc1S;)cZBY;PSv~9Mqf@WaKGiL#D!9Dh zKtks453BXp-;6zfUln|PAba@mVQ=QC&8N%w*7{Vxn)5R6{hYk& zsHg9F!cMYzCl~Y9zA9feKk2IT%^3fUJLe@8^YZdPEiPQ?zA@zR0izPu$~}``ZP7R& zTDWghV_EWF2EDVbcF(^SR=X!?8wdvC86>(1p`Bu97HY=nk`7um9!f zTUCFT)jbh8Ts$o4nP(IJWM*`z{X0Fst*z~tw)DE31jGNC88ICPZm{rPxWKWaNyzs8 z{XH4IGjroQ3)r_`baHl%R4$ljro&>WOvC~|#D zXR^z#v}o*^l01XYJyGut@Au?Ly-MzREe1!Deg+C~{C?Z26v5p6P{OC@Ps38X3Xy&7 zB`>%)E6M&jdzY_B*2e3J`7-VYw%_!Wb%mTBnP*5{_Sm+e^$v%m#VM8@{4xbB?mpca zhWjV0T~K;s$`~iUY}IAun-k?vI({rjk@_=LbKiA?BCGzxEBmF*6nxDOnpv>qAGWr5#_ti_xMRXs;gcdovO8Pv zxV}@JeIo3W$e7wt_7cNF&N)Ls5q=OSIH@JZ#IH2X(|h0AC6+3XPc`BSZ?_qDh3 z%Ox}RcsrZKDlFQ!cd@d$k;x{LPeD(ZIUJ0(z3q?7)$D2U?D#6QgY(K2RR&eiY zs8^oKvPd;;NvjJ}ij1Vc*r)1S?>()zD*xxo(7o%}&!za#w{X&rlHcq2qL26Wy|-4H zs5^1liSCK!7WLJSZJH-AKMm;TI%cs=`gtX%-{Jia(&spP?&)}~n!>WKT(+-%(w2o5 zD_?#s(e7RFes`3G&aNY+vWu;rm92SwL-J&IkIPM=3r~w2;_g5!tig-6n^`xn&Y zxXIYJ>OYiz^0VKAyD_6f+VES^K3=Ci?n=)lUr3zQcwWay`sMzf97XFBb#cJ9`xJ$5Gk=II67yMNT)@kJL3c}MUCa6NU+gQ`{KSh|Vr+s#9%N19-u|%aowy&z z{O*t~oqLabd=&Iiv~|IZbvyhwIu?3-T=gh>X<()66*nJ?=iS}rFFrqFSSV)p=%$0f zzGd$(DHX})s@5;&d{Q|_m(f2u`GrDM$GnSnQ$FoX2+a-nHN`HAb@8gEUdQW~c@ihh zPoGWd(1?{?sQBCgRWWW-SU zUG9uKUn<9Kmv4Id8dscVC+V5GOzV!-*T~tDFlCzJ_4{gRvpm@1>_m)KcsGhyrwsq1ru}!f%Shh_L`?#S(BKCdQk`yMdby9cV`UfsEf1sn^ z?C;^UQj>u-HUIRq#jJZoe7>X?>8@>++T`~`{HBX{f=LKBZwbfF^^emxx}0$Bdh42P zJ~ zQs~Ew8z-lxtdUr#e8l64(G92Vo$5+_i`4BZ)SINPZJaGK@kocuGxw4d9j_l#-+VuJ zWa=Z`M@}E3?#zz5n01fq`vK+;Oz+hCAMTslQ?f^7r6p^wKkqxin-iFS?%2g>Ah7n5 z!5V4i=?iVwI%r!mKRZ~nWe@+sup52WS2&g&pL!#o?aZ-HYnrYXhe&_ZJ?-Ieajr|XkABrma=ru2X^!8DZM8EojjYpb{zdPzxZoDr$@q59x zkPhe9^V_4kisXN)eX4uX`Aym4-s6tnwx=3D^cDq7*ShlmyF$V0TZF7K%NbwnXY24}?AR-LUkba_ zhv=OD&l~<4iU&MkW?GSOqHO7^nJ>x{S30F|GH&r=RhuWs^6J`(h?~YNF|RIOw{TwE zliuyNO}y9WUy#YA8*wa0UEjL$RHgp*u?rSpW>VVXdFbFagX*{OLj0TJPinu<5Z=}q z?gpF&qT;q# zM#?9bt$Y?+`P63WX_>|Rc7kg5W&&QvSWEmShy9Oo|C~JAY8L+J*P6SW{cly3tv~*4eON6e`0T~J z=CxCUM3bgZnSXuxc1!zywPdc1~npKdUjeAaq%vS*HQVY}%oS%Ke^KUP|6b=&4#czSe?bhi4p z{@4XQLR?*(Nu}R%x&=M+a}F-i;eQ_B>yYLmxKy}_b@A~p2NT|iEPD6j&NCxR)ujfx zKJyO+^4z-r;>5Svwq|=<_a>Q0I-C)D-&m8xw|jZj>nYw-n>@vZjb;m%{Hw^XQ+r8~?r>|NG6 zX_Ao9p0i8LVxBBh@f7#)DSGZ4bb)z6aq!$*^F^fn_x1N5x%@*&k<%olCvEYw+_Rcz zC3~GF&z~}dQ}P(ktcyNuEpHDdC<*kZ%~3u5XYbFRNQ2!~{OcbZg~XX`TDo_|ijJkX zx_h2}p6Kv7a9!8g+RX;>Ez8>eZV?F4e0=_?d-pD(HE+_z63s+jt$CsKek$+NBTpV% zrEQ;CGw00CooX}h?X;Ub^|JN->vz?noYXEw%Zha`UVG_rS@pB?=?gC$@VX_hF6q~O z^QB4j9FzTre`~LPb)z-1{ex-tg~CZw_uMp0(pvwsuQhn0_vs1VlP7xHt>6_`sQx5b zT~j!(rlG|m<@`qt^G}lI8I$z-1TDgxP2MqFI-6AX(_HsuV$*&Nccz7sc`rSi*G+X6 zXD#@<%sy(rPVEzkvnkqHs}ol2`=!Nw^0|%(`<9z0HTrKqeY;~*bt6xKt@7=DjXSc8 zR|F30T@`gvPfI;1_58Kvt{;)F7uT#PT7UX#-ICSztyd>bew2F1$fNOIN>s(0w5!SY z&dzk2r1e5qL|V7|Zug^Uk@&fT7ZOZKI zULyFA@$%lhD&J>aXLx7MPTrQX@5<|l_2;Ws2LCzx<>dzJ8Be*{{@T@dSsr}k@%C-= zy_GH}u4Z4VHlG~)@bt-C%>`$_a$5EBU+R7N^`%o)*21{?NwpVVcn56cV)mG%pR+;y z_%DxX>u;FfGQax0BY*b$hWAVS-xiBogr)wTvSy#(&yG(GpOyrL?E1CjZL!(plFIi= z3n#vf-{6~Q$7y(O;ZB{rOvjUXC$)};6kfb3c1P|EU*&Xz@1|c_ldJ33lq)fxmva)7 zyZA)PevxM3o2Qfc8?-)YKXEz`QbiF+DnEjs4m@u<{nwXON`a{0thoAdAQ|9OS|Z=Uqt zoSR$TPCEAD!m$uri)RyMzs7C9{X6L4*~9bZT4sH0+WC9cG@A|k-n~js>fJu|+>6zv zvwUwwl;3g=ed{i(5&dMn+T$083a6i&Wis_|T^-w}I-z$PKTdEG+Agir6K<6}?P|uB zh`((W)~BOmBF(0s&ij14I)v$>r{}LClfR+6C)Y@wbT<(76Ml5DGcdD+b6>;~o6udC znS>qmZ?1V5;aj+7>$$2+S`o1;!|z?4EZf7m{HNYoAD_aBrz>uCdOfjvYjf73;lkv9 z;zrK$scsdAa(GW(OI7Fd-KmpWb!zfI-_G-sYTGoDl!HUOcPS2hZ)Xlu()Bay4?Eih_V9NR?_T(JLl`|$5n{O|_dQ|N8 zEam+zmkmF5y>r* zpByh}J{py_^Ng9gh4N4F?M^StBy-<|B(Ji35tn!;VbA%U*Y=*=#(A4<(wSuu(@pyt z7W5S!wNBz~xGjDs?bFg#CDyK~f8u5LHRvr1h~0M4JFJ?&YUTC0d0$lx)$)CmHhSJ$ za@Esml6J`o_W6Og-L@5Mm9Ct&Q^V(K)P#e4#}W=D9m}5Pxa^$1zJ`N)V~dl@F8&)o z{N~KL;(J3+-}piMADa_r1>=&U844qO_*UI1d%sWo-hG?5Ukl9^pA7u_V)gp+Ekbu+ zpXY9?Sf*P4eV1&Z^Yq%<|BK!AC6h~MI59sLcsTWX=e(DPzIwdXeUodu3>A<7Wq13G*GUdlrIdyHLW2u&p9?jv~@1FgAdB&-&E7+`qYdrEp*iXLST;;HS z^Qs%&$NAQ~MIF1BtbAmy+!tMAp=9Ho$>|!oGksJZ>wjMS<>1=u5l2E8%WqA){G)i< z%Y*V7j+U331bx4)5PH)SIQ#0EBPFko%6W9x>~`Ly_TDvms>sixbceYwUTq3oa`_C) z4%?(pr)3`a1#bHykUH^{+Ov87;(IoyoV4aufA{$3FaGQIzCUdLzV>gxpG~EDn|14} zOHZym8a{W=uh35$bxunA&$)3zW#%EHCAnf=o48dftYa2$UBCUJjMap`#i3tPe{Fhd zdj0sb{#f-#|6cyN^LzH)2VMT%=NGfidssNVYWb1acWb*>e~ptbcfa%N$Jcr3q8qv2 zRzK$FY(LZfn7?|;tLZ*@o=*HXr#vWL;WFQI`TPfZcQ}^FnXZ^wBUkogsZ-F7i(aqR zu&;5yAkrB&T|YOQUr_eur9%=8^R$HhR17}XMV&J=vVIfx<@&idU7M?Hw^)A4oxW22 z$K%cOm1o3G;?&aHu4TCRE$8p&{&7FUI#rLoFiHDgbGThr-Sf@re8IOW*EgDG_w73A z+`rFA!TegPkz}#j#2tsvFM9gpW!qH${JoQZPL*G9yvWikO>U1IU)$GYk<%jPFY{k) z4cza%U;B&Giwuv~4(zV~S6zH@{Yk2m{-xD3yUsKGFkUIuKjGnq*$bYiE&HJuG4GW( zgMs(DGd#KoTv(s>GJ6sM?us43Sl zuM&H0<7ni##r5_jokMRks%5$3>)Tq-=j_e?_$g-gr8_KN?xR&I6U zmG$fub0%AvFVQ_!{O3Dg-GCH<-*>wL)Z8aOzJeTS%@mi#!$tg5(OO&$J3tuV4FykoW(9OQZEPqSN z>z3t5CX^;5FVIwwZ#?SQ)^j2TTGP9(2MHwH=Z1I#_yT#^QfLr zpSPW=6%e=Nes|)gZ04&u&rYnjw#mvk7PHH0w(H7YF<~t0w-}GQTs)s1*7EH6%;MszS$q%KD&KpTT=SPaY5PIGP2X>uzWuk5?AO7^r|qwM zK6m}zvgdQxUk;alAeMZ-rSWC>vIX(4RHpNJYiHheKJo4@is8sRgJyVR`X8(A(=eFS6Oa3<_Lt_K(z5LfBz4=*J=63&` zLjDr>`rhA^D}3t9y?jc_)o(V9gNI%KkaChJEfd?ZA(I0R#co<-Tfnv z68>L#wCCovn~ZmPxH%)LqBBldS$$pnz`gQ5+y1lJyxX3w{LT9N=~=%ybN3(JrMkf9 z3_pv5S@@{^0Q`Hsm_=+OXSOP zcH!pE&Y-$^ruO#w30r6A3bCwVVBGLTJxY}Ek$zAAcF|*+lesPza~m67y1a7Tg&d|* z#f4GY)>>Jwm{dME7!)S`i`yjF6p^&zeDpN;rF-7&>9SGm&y01F=YCh1k^0*7w8@nf z6HRW;Nca}EvheFYce$kh#~Xb5rLHL5{Frod+GbsejlZ32__v*q%5-^r%J1`;&{(~+ zHnxrTCvI}-d-p{|Gtrm;Qa)6)n=Xy`$2-MnQ%vFAg-;Dan8w zirrhjw(DHEJMSj9$nXB!i_GFL#E2&ABqiOt%+0evJR_9-yIb86;n(_`=AGA1U&p=e zKv?pkwRLwTOP+delAOVRhLd0L@=y0UF~XMLFDW^ksC?Ei;jb;9jsC<}0^zL8!QH3& z(mr{pdY8^gT-qx8eX^^pc9l$ho$^Z`%ZOc%clT}bo2tmWLicw-^qLjAej5DGeK(ul z$lLUgZPolUf8@TDs2S@Yf3sz+>C8WV4$s*-QjDbBrTHaT7oWZwe0}Du|DApR7uMac zU03%1#FpKc|Gv%K%yC2DI`fNgo`t6h0(0iyXqvHa)x-} zLhDOMQ!dTE(E0Il$mK`Up}ilw?yZ{hBPcZUkIPi0=)249ukW4w*JHmT^RKV3?GM~P zE_S-hX41?a!~MB-sdmX?2Xjo?&o)(h^xTw@e!QJ^Z_Q@r{TKcJI@{Fkzy6s2+qr4n z#l1UC%00sJ^2(;||31M$dySoC2ai;cO-8_u8}lbF{i2eZwnXKKcBj@_{~ZEt8kcLD zZZE&cvC3|5HG8w!T1B^_8;9@x$@y($y>+{)YQ>T#D%1Rn4f>{-xXLoC1knx zYH`tB39DwjQRQ0d{rbZs5!YGMExzV$b9}^?sgpEYC2#W6r#pg=xo%zI!hP#Rxq{LP zCHcqOei}|VQ9XB`;LP*AO0PG!G7$3ufxux$MS1_Xs)i#=l$Tjwc4L| z&i<40);GkTU8y_snRdpDa@Y3@oo9;VNlcw>xj2Qxzwh1DiTCOS^#Ap+7I7!uI?{GY z(boAOOL-OJZc|uyyTSSDkPGhEF=@r|+BlIw{VqyVA~!bN3nN`RTrW`gx}NX+8d#cOS6J#$IL$q%nW0+XPnvG%C9tGU!;an>wt7*!;Lg2M-(tfk5 zcguS={62inx@n%duB)uBzRas1eKYv?I_L=7-`(*sm@Vb@!9L?7B@MNv70-UQ+gtv; z(7fDl)9q-R-A25;k0#nH$K3IjzHKh4XrHVz)8jPnWzJ77md7u6tn-YXu(CR^GT`^b zSITFPpOpXl%jxINu(v{&TC+pSIbOG}ZMr0P{_3TvQy&x^RsZq!lip(E{Z;3t1wA_7 z^-k@`gju4|8QuCWj=d*8z1*_WZj)O`<934;KA(=R>bx~~HlN`nb+g2hLswdMu^1kl zdigWcjNP$wukY7&{Uh+ZI{k+IwH=@Nwp#~%xmi8&wd9Gf6YePp9{U(K2_FczX?)A0X7cTz0)Bk-%b9P8d(qqfy}0=GyS(VK zwfmF29#3T5ZLM^^Ok<|i#`Td$oZelya;Nsm+pFdKYg_KV-DEABXxQ>#`-ZQ#Bqpts zTst>6E@|K0n)#m;yS3u%%Btdfs~#3^+xsQ6B z)c>p*PN@oF8;(hA?L6qjp}F;_n@Qh`VB_mne$uP07BA8&XNy>R#+4K)u7)E4mU zxODsdE3*lo#G^lbk9u=WY^~}i*L^e6cNgE^SAS+2cV$Y~r;P1KrIO8$m*>q6H2Y9J z?}h66SN(ad8ntgOUJ^9lp>s>ZTjBiG^uvsoPSkGP`KEf~b@L4YGs?c)>%5xBEyuq*YbB>5rKswuG`9s?yyB~Y6_!*?pJnLZe(zUh!fy%%@$hjOWeSJm>81(gl&}fwx4NO_=wJ&Aw}8+Un5JI$TN zl_nk+TTuJ(E$epiyiM;mWWCqA^LAlx$G$gwa^)ME?3m96)m#uN;n`5R&|uyA>0c%q81Nriv-ieJ*7jnD z|8<*V^(d^YM50eJt)zq9uCRCo^8N z%ZMod_15*{-R-__{uu6`^E-q!qtx_;hgg)MMuORm%q@w0%?HoC;M=xnrfkkp=4=~j zcFn_5wx_pAX>(Ue#BTY1@x92RN7H2f)}2jE_y4l(qE`J^`MwIv>)ABwonMt*;w;h}se81}H)TLRo8#VXbe9EzAeRa;`8-=p#@07i~ zXzI_skVWL`Rk`hVL#M=CFrN}XMMyrokZs-Glymo2{kQkyMMeoxOmg1 zC3_-Ww|dXqbFcY#{=y3WC5ImtBxTDO9@+W$Me?n?x5T%+&-Bk0?M}+;jgtRrayZ9nE!}&f&Y)1bhhHVH*ahG`Se|9zlytcY)Vf4#Qpmc zg-Yg~+8iBUJ|}E>arT}Cy_c&U_kDdDzi8@YKT-3@^ZPCQPuYJLyOHOt-d`_#FK|P_ zza!IsNAS8Wcl`DJkEwtD13mrZHiO>G^552nmp%1jo3457f%MKK#j{DRf7UX%9oL@F zmwL#=qs=2?y=eLE%&xgRu5OgdOaB^~wKs0@x8tYc-@ka|=DPo$=eLbDY$}tEC|CYY%n4RM~9I@?B^cmid*_%9E+!#?0p{Jxyn+d=(T8+?c(8%IEce zyM9D_-dSaoI`RI!T@T)UJKv+V`=N2P%TlEbLEkt7?X^a|sjZt`MBiC%Sh(nBp|Xj) zU3Xpb!Tk+>?;JDEwc6didG7uE{JXzinLhmZNweoX${(0pf-GCL zrZRoa)|j|{ao5~WwO3ZGd#xd?>S8o|O@-eEHU^dMt63W(bkmq_y*L^?XJdf2NS5g- zhlN{bp5c3~v&GcBG^agw9*OS*zxnX)q zJpFWZPx?<&q07SGf@7vk-5N7dGOF(G!lyI+#O4xKuKsylq(EoKcO~`U zmM4?KTG1%=GU&I~Z?oU`->ScrE&J+r%cVcSQFm3Y-^EPt zg)5V~bZ-VKh~3Z=)ZgeUq#mh$TWz=6@-qs>MpodbW#0i z{~P<2;w|fzuKgA-tM*g2O(OZaH&57X{h6Xmud54rOc6TVc}Q~Ftr%%)H&Gt@pa+;>Cc<}8fZ@uSHS>+yQCq8^AGh4$WtX0FyY_+KQJP{GA<=js%9{tZa z|4B*0t%Lt$=PTTNbK{U7|AU#=9Hjzh`EATrDbkV=NMuqx#1c3==0&l%*EFZ*O#$yG zt28^VUsEjfyj$daV%;@Lb&A3pE|c9FPQhI zI~R#9e`wfuAoRsnfg5UQWBL z_xNSe_KkB>Z_SP0(ew6cUV3*-Fb|9{ro&WqAXGI`o4FUpS=^=>a8oaJ63$tf#pIiDGM(zar=59>Ezak zbK1grv$rmujFb{)B(ITnj(GUGB-xJJ)gT+xwT;tFm53 z*>J9N);+8E`{J9%%WuB4^VqrDoiy(?Ymr?$?f;KbsnZ;%3;ydEoi3UBRO^54wA+8G zea=UI`xXDK{z3mi$1|2`!F{gV_Q^FXu0H+d*iYNjHb*w!dw+0q{2Y6MS4a1mo;dUD z-zw!br%#@FGxah5(+HDKuZ6gdR{c!nSo`6ukGpj(GdtImKJe%Mp=)UwbReIX<&WCt$fW=CZ{{#gY8FisX58wYc+EgrRy_`h0)ZyK`$k{<)^Lb)!e@k+VDXvv%%2+B~87 ziL0c=`)zmKv#r;aRo-En{g=B=Ms@NDi+!o}?@FcD&U}0S-jTV>EArliYPhB~`yM`; zVRBcmd&0qWS+y%aFFEx;B+lLXrb->>-h{jFlAk5lt;*`F`Lss;{=5F~&npdNwWyP%ushG&f45m5n#Khg6N=$yi?fgbnvCP~0ep34M6=Cmo zy2lHjFn_wySS4tw|NDDCFP7_GTu9>0wUPT#hh56Gsn;#frtJ+2 z;CX*}QObXNr7fY~6VquW-v<6Lv^!H{dE4+HqQHv0=2sBrDC^U;Fm>l)HV?$lM(l z|0G2{X&tAgZYGc3^%;8>HWxjX>D#fVF}$~Y=a*Z4Ud#CvHgmOgHyukbvo2=$e;;vN zGk0T=SNR%eujn&Xy$c*Ro!605{VzLR@z4IK6aQPcDgU}JDZ&5dh=gx&N8gO(zm!dDmKkz zZM)>IbNkqy>Phu2OHSz8_j|sQ?p6Pnzv|yx{e77+tLfB&zGbW@F39&UJ1UnevcUX^ z+hwl~!y~SjwIuRAdY4^IFx(^Ho2_u{N1e%9)s4r_6_#AM{Uz9BZF@{{dVF)i&WE=$ ztk{gs2H&XvDZ+ZhH$U#+v`@~B5|6H|wcImsu z_40M8OgfEKE7~LjI7218Kd2mHnQ`>8@v0^60;r zGo;R(*8Z>We(KdBpQeuy!KeRU?!2>%@pN0F&iU)yzaCBImAn`tr>}cZZmUH9VLM~N zcDH-kGJV$@HZX`KTKr{N^Q&-;SW+!-zUo1Z9`WR#O7rqx95P~0*E|r=BqFnvtuV5| zl$XP}U`vSIWgnT9V%N7Z=>2ZK_xzmNc~iFQr~lo0Y*}h&zg%_km69{(pDsRk(8%om z|9UO&h*KZdINp)6WPF=auGi0a!<41M2Nt7mW z-n&*5JbaZZx$3a!rmNSJ>#yw+iaxn|%F-mo>71SaeO);l*KR8I+xE=WR%7#o?^9D3 z3(L;&sA-C>cyLBiGP*ut>gRnV#!XM^vCl9 zmIXf&EAC8Cy;>8yd69+RaT)FPhc-p++b21vs-Wp5~+nHXYS9=uL`M} z;p6i-N-Nn`_tebFixcbnoln+;J`eJmwwinCqeC;F7P-B4l`!HC?A(0KZROnq?%971 z@09$ip5&=Jf8#>-=esKvKfjFGn{Z`fdhUbAA&D<}_BH))dma=b_Pj85PW#Sxl{54F zpHG>#b<3pa4Xn005mn)@S#6($#l=7VKQV}B_s*I>emhrLr|&sB=YO$$-td2 z@*>-FQ?)lu2%ghxzdGC2D9(22?3>zZyheXh*RJY6<-UB%JbmZ-ZHw}LN*udhr}$i= z_2!Sy8~4oWzq@mmmfY!Wx%VnVdXLNs3i+)++%MQ)Y!j(I zbDdsS(cyZw=r`K>MAW26`ofRhRd-HqJoP!l_HlhnuK85`ISadjXJl4>WtBMj zI#KA#`s|j@jQ`#nOqg%TlfBm@11(N zRzbY+>nq-$JFXiiEH=(FRZ9DNA^(I^)kbyU>xKJ{g%_SK=bRqz7TornBTrRor))&S zJ#W+d%hSsu@1N4szHE6eNl&>q@b-<|ZtInHJZwrwXRMp|-dCru?^>qiOw|aPrOJ;3 zIQ3U|UMk~QmbyMY?Rt!DdcwRw)8o6fR#}I}WUZ=xb6!Y(tMGTJbK9frf_P&@V-s!T zeMP75eQA4b{yEd_liTJ_i}}VXR(x~n*Co~NxexxG+aecnrXeqXQSkd$i>u`~@8^Af zLrJZA)A=izjCK8wO6O>OwRyAbB$Hi{?03!-@0%wIUw%2b>ut38zTP=yn|H{*SaPN$ zC$x31)z$^Kh0^}`ZJdzr^iPew~8-HOVLIeR9um-o_+ zS8cCYyH_nQ=ewF8aQ6_a=~eC}fmgeK>#mBsaG>qXNu3iDgWRr#=&s0KG5g{St94b+ z4&6G%I{oX4zOut{$;bNV2%OEGrlzxEPMq!bqJuIk^N!75q@%lHUgYHq5qlR@?FupW zU$rXkLd3~OyIMa>6|QJI6S!ENN7^VS;ABhUVt3EQ?H<$lq(iK-YF36AmBeJeJaH*d zm?x^a?9iH7Y%4cTo}|+od`*AF>f;Zm8Hns!=FWBXY)n9;eRgMvCI51lAf22Q)0XK@ zoOVSw#dh^8vBDIwbF=%dBs^9qDwe*XFf}OGH}tDbPMl@2W9ipBuPS?I21%C94&AvT zYSrvx2FK_1K36!*v3*C8GH2(~~_KFYI%Rew!%kJ6@ss9fK}I%fQR zs*|hpo(ge(bPv0#pV;zx*@d0Lg;hMWFYeuOs?vMOPwv&yKTJaZ$LEF%-*yvhP2Xex z?bhyp*+Q3AIdyj~aLJw9u_aR}v}jd86PL!KyHc)B(~|SE+_wo^N}pjA;Z~gDA(OGx zqa)ZdB#XDBh=p@&lbk@zNm-Sm2V$WtQ;uw$`MqrNo18g^T0f>en{9r7Pvz$KXM5(_ zzKLmdjXpZl@#;qDliaO4j|R%-4t<>zi&5)N*9=05pk)Y`Ibd!GNe6H}Sg7dh+t`We$gjaEN? z=Jb)RC11>m&0?!oabW0i4YteiJHOn@tj(Xj!cdAO-SqUFBZrD~;&qL(^}}yoD`u{` zDf?x0T4!tZR9Au9`3bhKe@SHMKZ{s#M&y1X^EvUgF^=aS|5#qSMWAWUTP9QCnkMej zg;VCbi5l2&>@P-AbOtbf(w zD^%wyIGR<;`ad_CcS!WlyfgcR1AFIcY+mz^eV%*u+whMuZN@VDk8;lEis!!1$$#U% z`JwHH#Pwn$ZRUP^wSQsWWa-mSwk)*!m{}OGM`@oD>T~t3n?7_YHU=FmkNzTf(7d_QcTtGQyHiYptcN`ke_ng!9JydpME#6U&XymX z59kYd&Y3l977s^A8k4DlkR(emhmp=&6}7ytrV6U{b$4nSu18@=4x zJHbQrXR^;KACaHG=0^TL6jfDxa^Je2@4Qz2vl2T}uyo4C+4s(@(M|jq@Okot|56jx zJk1xb@o^2fP_Wdh>(}MznO~P)6%+fqV*aYe^u_YAQamU_@9Xt!$lE04LZHg$gNoc(d% z$Eh>8mppni-Dkr_tJ3opQ+$(VZ`?97PyUqIE)gltGK0>>knjmEO~>BMeckIf^X{!c z?bFljcg*Sds@LytFZ}sXM*GcoOHck|KkN4U<|P`dX11E=C1**q6qaaUmr?8TY}qwi|JNJ#s3dNK^V3zH)IWOW zZFjLwzu&F7`S7&v0h{~p-T(EksruBQFME=oWy1g6v)6N&#ouH-^I4Sj zheh3c#(29)@;plWudlUN`LWS<3-^rY?M^4;i(d10^6lrG@qD$`r})y(p@t1_vxE)K zUpIO3{BF(JhuOXdZ0u#+{_W2D9qPI9>wAW0KPPg0vizSFbm7{5<{8i37oT|kN4oIG zMA-v2_F~R<&+m7LSWS}eSDyblKVsX@hq(uA{@*Zsuy|5!^`cE(Z!hK^u-U(w`{$hc zIC@ZadZ*VTxk~<1hnE~zw(qs@>Z^XDuh=(H_;-=KpNjJX zRa2pfOT#8t+|p{8$uGKctFO&3JCzS5Uo9%{U4HIekScNRN% zH9Urv3U+o}#U(|liMd=Ab7Ci*&TBRhaQ*&|OaHcOOJTt!4-QSm&LfNXr+#DZuwCMD zG~!s~hwrAwl^$DJUfd{8TbJ%}Dl7h`-iIfL`FFJ)xP4BF|8c=bsUMu@=BBQEvh4Ch zuOHWHA4do^zs}^j5WY<|VqWpQnq!v@e{|aCo-JrfpSGu(dEe&re_vv+O?=&5y#GQo zZ_I{857=(ac)7JO-x^KE%RyD7}oRs zg`zxbewOcBxFUFUy;T3J)DUh(*TxbRt%;YIFBP?`#7{7Cbve~DWu{AzyGp3iT632v zslJh6O&R^~*4bS-d-bu9^%TxiBHoMVi)b!Q`sA>5^X!Q~H+yAH&eGa-r^`#*b#`=- z!g{_H&+e?MT=L!WMfdkY7K`#XfA4%fcj)i+g67$apFQVaD!e!WGa8JMq9LTRAXPy> zA}BQte*U1Tg@QiT*l|fs&QD1VNG!@NRsdbB<(!{WnwwXwU<$fEJvAjWxg@_x!4PzG zp@M$6LbQURg0X_3Lac&*aAsAif}x3mzNd>qv`t!4vPqJGg;`3Xkwr>sQi_pzT576s znxUnEg;8p1vY8!W6|pGEBRPqIQO&I_Ra|n0gv5;PO&*MD0-32SN;A6-sCdi?{J`kM zyWeQWUMZJNy6hAGH6=`a%fk>jfkTW7BWM&z16;)=iA5z9MX70AMuuiws;aL3Zd?Ey CAcq_P diff --git a/docs/UnityAssertionsReference.pdf b/docs/UnityAssertionsReference.pdf deleted file mode 100644 index e4f99cddef2bce7f4e4aa7ced1f80a82b360effd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181413 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� 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


    o8#x{A2&v{OtE;F_hd=Iw!JRbXB&5E@hxwA zCE=%gVMYDNNukRf>%R7F+B`w_cxKG{DKZ_KYy+$Or@Zgj)bg@Z<9ugV%gV$mgw1xHars^v`PC0yD0H+Q+-j|%-GtSnYB-L_1tE8dUU6O%`FMv z+_}@uDxz1-eX}ZRzkEd1)F{l*wnREQDx|U?RY5-@C^Zef9n!);K_Bax$S$eL`6;OZ ziAA}^3N|(h`p)?|rMY><3Z|f&hf-5AlS}f86by|NK!*f{D?}?8Di|vmD#R-22WM8L zDi|3k=zF>-MB5l7CR&=OrkR>1rlgq~nkE@0TN)T98K0*+4$JrUj85p9b^OSRn^ts GjSB$5Y4ipF diff --git a/docs/UnityGettingStartedGuide.pdf b/docs/UnityGettingStartedGuide.pdf deleted file mode 100644 index 9d03233c0644d4f10206d076e892023ceda7d72c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166200 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⪼}z3Q&!8ZdU90tss?}PruY|quNHdQ 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 U4OT2bvTjRRXaam$Ao~LCkpCM$``J4 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 P85x>!sj9mAyKw;kqS+^z diff --git a/docs/UnityHelperScriptsGuide.pdf b/docs/UnityHelperScriptsGuide.pdf deleted file mode 100644 index e1618d75807a6b0982c49a6e99fd04afb8abd671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181016 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 From e2cc67918d3dbc0104a15a6002a4de1c1214790c Mon Sep 17 00:00:00 2001 From: toby Date: Wed, 29 Mar 2017 12:01:54 +0100 Subject: [PATCH 094/157] Add newlines after headings for best practice, trim trailing spaces & convert sneaky incorrectly coded chars blank newline after headins is apparently best practice according to http://stackoverflow.com/q/42953462/1292918 --- docs/ThrowTheSwitchCodingStandard.md | 189 ++++++---- docs/UnityAssertionsReference.md | 538 +++++++++++++++++---------- docs/UnityConfigurationGuide.md | 393 ++++++++++--------- docs/UnityGettingStartedGuide.md | 227 +++++------ docs/UnityHelperScriptsGuide.md | 145 ++++---- 5 files changed, 885 insertions(+), 607 deletions(-) diff --git a/docs/ThrowTheSwitchCodingStandard.md b/docs/ThrowTheSwitchCodingStandard.md index a48a832..6c6704d 100644 --- a/docs/ThrowTheSwitchCodingStandard.md +++ b/docs/ThrowTheSwitchCodingStandard.md @@ -1,116 +1,135 @@ # ThrowTheSwitch.org Coding Standard -Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part, -we try to follow these standards to unify our contributors' code into a cohesive -unit (puns intended). You might find places where these standards aren't + +Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part, +we try to follow these standards to unify our contributors' code into a cohesive +unit (puns intended). You might find places where these standards aren't followed. We're not perfect. Please be polite where -you notice these discrepancies and we'll try to be polite when we notice yours. +you notice these discrepancies and we'll try to be polite when we notice yours. ;) + ## Why Have A Coding Standard? -Being consistent makes code easier to understand. We've made an attempt to keep -our standard simple because we also believe that we can only expect someone to + +Being consistent makes code easier to understand. We've made an attempt to keep +our standard simple because we also believe that we can only expect someone to follow something that is understandable. Please do your best. + ## Our Philosophy -Before we get into details on syntax, let's take a moment to talk about our -vision for these tools. We're C developers and embedded software developers. -These tools are great to test any C code, but catering to embedded software has -made us more tolerant of compiler quirks. There are a LOT of quirky compilers -out there. By quirky I mean "doesn't follow standards because they feel like + +Before we get into details on syntax, let's take a moment to talk about our +vision for these tools. We're C developers and embedded software developers. +These tools are great to test any C code, but catering to embedded software has +made us more tolerant of compiler quirks. There are a LOT of quirky compilers +out there. By quirky I mean "doesn't follow standards because they feel like they have a license to do as they wish." -Our philosophy is "support every compiler we can". Most often, this means that -we aim for writing C code that is standards compliant (often C89... that seems -to be a sweet spot that is almost always compatible). But it also means these -tools are tolerant of things that aren't common. Some that aren't even -compliant. There are configuration options to override the size of standard -types. There are configuration options to force Unity to not use certain -standard library functions. A lot of Unity is configurable and we have worked +Our philosophy is "support every compiler we can". Most often, this means that +we aim for writing C code that is standards compliant (often C89... that seems +to be a sweet spot that is almost always compatible). But it also means these +tools are tolerant of things that aren't common. Some that aren't even +compliant. There are configuration options to override the size of standard +types. There are configuration options to force Unity to not use certain +standard library functions. A lot of Unity is configurable and we have worked hard to make it not TOO ugly in the process. -Similarly, our tools that parse C do their best. They aren't full C parsers -(yet) and, even if they were, they would still have to accept non-standard -additions like gcc extensions or specifying `@0x1000` to force a variable to -compile to a particular location. It's just what we do, because we like +Similarly, our tools that parse C do their best. They aren't full C parsers +(yet) and, even if they were, they would still have to accept non-standard +additions like gcc extensions or specifying `@0x1000` to force a variable to +compile to a particular location. It's just what we do, because we like everything to Just Work™. -Speaking of having things Just Work™, that's our second philosophy. By that, we -mean that we do our best to have EVERY configuration option have a logical -default. We believe that if you're working with a simple compiler and target, -you shouldn't need to configure very much... we try to make the tools guess as +Speaking of having things Just Work™, that's our second philosophy. By that, we +mean that we do our best to have EVERY configuration option have a logical +default. We believe that if you're working with a simple compiler and target, +you shouldn't need to configure very much... we try to make the tools guess as much as they can, but give the user the power to override it when it's wrong. + ## Naming Things -Let's talk about naming things. Programming is all about naming things. We name -files, functions, variables, and so much more. While we're not always going to -find the best name for something, we actually put quite a bit of effort into + +Let's talk about naming things. Programming is all about naming things. We name +files, functions, variables, and so much more. While we're not always going to +find the best name for something, we actually put quite a bit of effort into finding *What Something WANTS to be Called*™. -When naming things, we more or less follow this hierarchy, the first being the +When naming things, we more or less follow this hierarchy, the first being the most important to us (but we do all four whenever possible): 1. Readable 2. Descriptive 3. Consistent 4. Memorable + #### Readable -We want to read our code. This means we like names and flow that are more -naturally read. We try to avoid double negatives. We try to avoid cryptic + +We want to read our code. This means we like names and flow that are more +naturally read. We try to avoid double negatives. We try to avoid cryptic abbreviations (sticking to ones we feel are common). + #### Descriptive -We like descriptive names for things, especially functions and variables. -Finding the right name for something is an important endeavor. You might notice -from poking around our code that this often results in names that are a little -longer than the average. Guilty. We're okay with a tiny bit more typing if it + +We like descriptive names for things, especially functions and variables. +Finding the right name for something is an important endeavor. You might notice +from poking around our code that this often results in names that are a little +longer than the average. Guilty. We're okay with a tiny bit more typing if it means our code is easier to understand. -There are two exceptions to this rule that we also stick to as religiously as +There are two exceptions to this rule that we also stick to as religiously as possible: -First, while we realize hungarian notation (and similar systems for encoding -type information into variable names) is providing a more descriptive name, we -feel that (for the average developer) it takes away from readability and +First, while we realize hungarian notation (and similar systems for encoding +type information into variable names) is providing a more descriptive name, we +feel that (for the average developer) it takes away from readability and therefore is to be avoided. -Second, loop counters and other local throw-away variables often have a purpose -which is obvious. There's no need, therefore, to get carried away with complex -naming. We find i, j, and k are better loop counters than loopCounterVar or -whatnot. We only break this rule when we see that more description could improve +Second, loop counters and other local throw-away variables often have a purpose +which is obvious. There's no need, therefore, to get carried away with complex +naming. We find i, j, and k are better loop counters than loopCounterVar or +whatnot. We only break this rule when we see that more description could improve understanding of an algorithm. + #### Consistent -We like consistency, but we're not really obsessed with it. We try to name our -configuration macros in a consistent fashion... you'll notice a repeated use of -UNITY_EXCLUDE_BLAH or UNITY_USES_BLAH macros. This helps users avoid having to -remember each macro's details. + +We like consistency, but we're not really obsessed with it. We try to name our +configuration macros in a consistent fashion... you'll notice a repeated use of +UNITY_EXCLUDE_BLAH or UNITY_USES_BLAH macros. This helps users avoid having to +remember each macro's details. + #### Memorable -Where ever it doesn't violate the above principles, we try to apply memorable -names. Sometimes this means using something that is simply descriptive, but -often we strive for descriptive AND unique... we like quirky names that stand -out in our memory and are easier to search for. Take a look through the file -names in Ceedling and you'll get a good idea of what we are talking about here. -Why use preprocess when you can use preprocessinator? Or what better describes a -module in charge of invoking tasks during releases than release_invoker? Don't -get carried away. The names are still descriptive and fulfill the above + +Where ever it doesn't violate the above principles, we try to apply memorable +names. Sometimes this means using something that is simply descriptive, but +often we strive for descriptive AND unique... we like quirky names that stand +out in our memory and are easier to search for. Take a look through the file +names in Ceedling and you'll get a good idea of what we are talking about here. +Why use preprocess when you can use preprocessinator? Or what better describes a +module in charge of invoking tasks during releases than release_invoker? Don't +get carried away. The names are still descriptive and fulfill the above requirements, but they don't feel stale. + ## C and C++ Details -We don't really want to add to the style battles out there. Tabs or spaces? -How many spaces? Where do the braces go? These are age-old questions that will -never be answered... or at least not answered in a way that will make everyone + +We don't really want to add to the style battles out there. Tabs or spaces? +How many spaces? Where do the braces go? These are age-old questions that will +never be answered... or at least not answered in a way that will make everyone happy. -We've decided on our own style preferences. If you'd like to contribute to these -projects (and we hope that you do), then we ask if you do your best to follow +We've decided on our own style preferences. If you'd like to contribute to these +projects (and we hope that you do), then we ask if you do your best to follow the same. It will only hurt a little. We promise. + #### Whitespace -Our C-style is to use spaces and to use 4 of them per indent level. It's a nice -power-of-2 number that looks decent on a wide screen. We have no more reason -than that. We break that rule when we have lines that wrap (macros or function -arguments or whatnot). When that happens, we like to indent further to line + +Our C-style is to use spaces and to use 4 of them per indent level. It's a nice +power-of-2 number that looks decent on a wide screen. We have no more reason +than that. We break that rule when we have lines that wrap (macros or function +arguments or whatnot). When that happens, we like to indent further to line things up in nice tidy columns. ```C @@ -120,7 +139,9 @@ things up in nice tidy columns. } ``` + #### Case + - Files - all lower case with underscores. - Variables - all lower case with underscores - Macros - all caps with underscores. @@ -128,9 +149,11 @@ things up in nice tidy columns. - Functions - camel cased. Usually named ModuleName_FuncName - Constants and Globals - camel cased. + #### Braces -The left brace is on the next line after the declaration. The right brace is -directly below that. Everything in between in indented one level. If you're + +The left brace is on the next line after the declaration. The right brace is +directly below that. Everything in between in indented one level. If you're catching an error and you have a one-line, go ahead and to it on the same line. ```C @@ -139,32 +162,42 @@ catching an error and you have a one-line, go ahead and to it on the same line. //Like so. Even if only one line, we use braces. } ``` - + + #### Comments -Do you know what we hate? Old-school C block comments. BUT, we're using them -anyway. As we mentioned, our goal is to support every compiler we can, -especially embedded compilers. There are STILL C compilers out there that only -support old-school block comments. So that is what we're using. We apologize. We + +Do you know what we hate? Old-school C block comments. BUT, we're using them +anyway. As we mentioned, our goal is to support every compiler we can, +especially embedded compilers. There are STILL C compilers out there that only +support old-school block comments. So that is what we're using. We apologize. We think they are ugly too. + ## Ruby Details -Is there really such thing as a Ruby coding standard? Ruby is such a free form -language, it seems almost sacrilegious to suggest that people should comply to + +Is there really such thing as a Ruby coding standard? Ruby is such a free form +language, it seems almost sacrilegious to suggest that people should comply to one method! We'll keep it really brief! + #### Whitespace -Our Ruby style is to use spaces and to use 2 of them per indent level. It's a -nice power-of-2 number that really grooves with Ruby's compact style. We have no -more reason than that. We break that rule when we have lines that wrap. When + +Our Ruby style is to use spaces and to use 2 of them per indent level. It's a +nice power-of-2 number that really grooves with Ruby's compact style. We have no +more reason than that. We break that rule when we have lines that wrap. When that happens, we like to indent further to line things up in nice tidy columns. + #### Case + - Files - all lower case with underscores. - Variables - all lower case with underscores - Classes, Modules, etc - Camel cased. - Functions - all lower case with underscores - Constants - all upper case with underscores + ## Documentation -Egad. Really? We use markdown and we like pdf files because they can be made to + +Egad. Really? We use markdown and we like pdf files because they can be made to look nice while still being portable. Good enough? diff --git a/docs/UnityAssertionsReference.md b/docs/UnityAssertionsReference.md index bc2ce7d..3a1502a 100644 --- a/docs/UnityAssertionsReference.md +++ b/docs/UnityAssertionsReference.md @@ -1,486 +1,642 @@ # Unity Assertions Reference + ## Background and Overview + ### Super Condensed Version -- An assertion establishes truth (i.e. boolean True) for a single condition. + +- An assertion establishes truth (i.e. boolean True) for a single condition. Upon boolean False, an assertion stops execution and reports the failure. -- Unity is mainly a rich collection of assertions and the support to gather up +- Unity is mainly a rich collection of assertions and the support to gather up and easily execute those assertions. -- The structure of Unity allows you to easily separate test assertions from +- The structure of Unity allows you to easily separate test assertions from source code in, well, test code. - Unity's assertions: -- Come in many, many flavors to handle different C types and assertion cases. +- Come in many, many flavors to handle different C types and assertion cases. - Use context to provide detailed and helpful failure messages. -- Document types, expected values, and basic behavior in your source code for +- Document types, expected values, and basic behavior in your source code for free. + ### Unity Is Several Things But Mainly It's Assertions -One way to think of Unity is simply as a rich collection of assertions you can -use to establish whether your source code behaves the way you think it does. -Unity provides a framework to easily organize and execute those assertions in + +One way to think of Unity is simply as a rich collection of assertions you can +use to establish whether your source code behaves the way you think it does. +Unity provides a framework to easily organize and execute those assertions in test code separate from your source code. + ### What's an Assertion? -At their core, assertions are an establishment of truth—boolean truth. Was this -thing equal to that thing? Does that code doohickey have such-and-such property -or not? You get the idea. Assertions are executable code (to appreciate the big -picture on this read up on the difference between -[link:Dynamic Verification and Static Analysis]). A failing assertion stops -execution and reports an error through some appropriate I/O channel (e.g. + +At their core, assertions are an establishment of truth - boolean truth. Was this +thing equal to that thing? Does that code doohickey have such-and-such property +or not? You get the idea. Assertions are executable code (to appreciate the big +picture on this read up on the difference between +[link:Dynamic Verification and Static Analysis]). A failing assertion stops +execution and reports an error through some appropriate I/O channel (e.g. stdout, GUI, file, blinky light). -Fundamentally, for dynamic verification all you need is a single assertion -mechanism. In fact, that's what the [assert() macro in C's standard library](http://en.wikipedia.org/en/wiki/Assert.h) -is for. So why not just use it? Well, we can do far better in the reporting -department. C's `assert()` is pretty dumb as-is and is particularly poor for -handling common data types like arrays, structs, etc. And, without some other -support, it's far too tempting to litter source code with C's `assert()`'s. It's -generally much cleaner, manageable, and more useful to separate test and source +Fundamentally, for dynamic verification all you need is a single assertion +mechanism. In fact, that's what the [assert() macro in C's standard library](http://en.wikipedia.org/en/wiki/Assert.h) +is for. So why not just use it? Well, we can do far better in the reporting +department. C's `assert()` is pretty dumb as-is and is particularly poor for +handling common data types like arrays, structs, etc. And, without some other +support, it's far too tempting to litter source code with C's `assert()`'s. It's +generally much cleaner, manageable, and more useful to separate test and source code in the way Unity facilitates. + ### Unity's Assertions: Helpful Messages _and_ Free Source Code Documentation -Asserting a simple truth condition is valuable, but using the context of the -assertion is even more valuable. For instance, if you know you're comparing bit -flags and not just integers, then why not use that context to give explicit, + +Asserting a simple truth condition is valuable, but using the context of the +assertion is even more valuable. For instance, if you know you're comparing bit +flags and not just integers, then why not use that context to give explicit, readable, bit-level feedback when an assertion fails? -That's what Unity's collection of assertions do - capture context to give you -helpful, meaningful assertion failure messages. In fact, the assertions -themselves also serve as executable documentation about types and values in your -source code. So long as your tests remain current with your source and all those -tests pass, you have a detailed, up-to-date view of the intent and mechanisms in -your source code. And due to a wondrous mystery, well-tested code usually tends +That's what Unity's collection of assertions do - capture context to give you +helpful, meaningful assertion failure messages. In fact, the assertions +themselves also serve as executable documentation about types and values in your +source code. So long as your tests remain current with your source and all those +tests pass, you have a detailed, up-to-date view of the intent and mechanisms in +your source code. And due to a wondrous mystery, well-tested code usually tends to be well designed code. + ## Assertion Conventions and Configurations + ### Naming and Parameter Conventions + The convention of assertion parameters generally follows this order: - + TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} ) -The very simplest assertion possible uses only a single "actual" parameter (e.g. +The very simplest assertion possible uses only a single "actual" parameter (e.g. a simple null check). -"Actual" is the value being tested and unlike the other parameters in an +"Actual" is the value being tested and unlike the other parameters in an assertion construction is the only parameter present in all assertion variants. "Modifiers" are masks, ranges, bit flag specifiers, floating point deltas. -"Expected" is your expected value (duh) to compare to an "actual" value; it's -marked as an optional parameter because some assertions only need a single +"Expected" is your expected value (duh) to compare to an "actual" value; it's +marked as an optional parameter because some assertions only need a single "actual" parameter (e.g. null check). "Size/count" refers to string lengths, number of array elements, etc. -Many of Unity's assertions are apparent duplications in that the same data type -is handled by several assertions. The differences among these are in how failure -messages are presented. For instance, a `_HEX` variant of an assertion prints +Many of Unity's assertions are apparent duplications in that the same data type +is handled by several assertions. The differences among these are in how failure +messages are presented. For instance, a `_HEX` variant of an assertion prints the expected and actual values of that assertion formatted as hexadecimal. + #### TEST_ASSERT_X_MESSAGE Variants -_All_ assertions are complemented with a variant that includes a simple string -message as a final parameter. The string you specify is appended to an assertion + +_All_ assertions are complemented with a variant that includes a simple string +message as a final parameter. The string you specify is appended to an assertion failure message in Unity output. -For brevity, the assertion variants with a message parameter are not listed -below. Just tack on `_MESSAGE` as the final component to any assertion name in +For brevity, the assertion variants with a message parameter are not listed +below. Just tack on `_MESSAGE` as the final component to any assertion name in the reference list below and add a string as the final parameter. _Example:_ TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} ) - + becomes messageified like thus... TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message ) + #### TEST_ASSERT_X_ARRAY Variants -Unity provides a collection of assertions for arrays containing a variety of -types. These are documented in the Array section below. These are almost on par -with the `_MESSAGE`variants of Unity's Asserts in that for pretty much any Unity -type assertion you can tack on `_ARRAY` and run assertions on an entire block of + +Unity provides a collection of assertions for arrays containing a variety of +types. These are documented in the Array section below. These are almost on par +with the `_MESSAGE`variants of Unity's Asserts in that for pretty much any Unity +type assertion you can tack on `_ARRAY` and run assertions on an entire block of memory. TEST_ASSERT_EQUAL_TYPEX_ARRAY( expected, actual, {size/count} ) "Expected" is an array itself. -"Size/count" is one or two parameters necessary to establish the number of array +"Size/count" is one or two parameters necessary to establish the number of array elements and perhaps the length of elements within the array. -Notes: -- The `_MESSAGE` variant convention still applies here to array assertions. The -`_MESSAGE` variants of the `_ARRAY` assertions have names ending with +Notes: +- The `_MESSAGE` variant convention still applies here to array assertions. The +`_MESSAGE` variants of the `_ARRAY` assertions have names ending with `_ARRAY_MESSAGE`. -- Assertions for handling arrays of floating point values are grouped with float +- Assertions for handling arrays of floating point values are grouped with float and double assertions (see immediately following section). + ### Configuration + #### Floating Point Support Is Optional -Support for floating point types is configurable. That is, by defining the -appropriate preprocessor symbols, floats and doubles can be individually enabled -or disabled in Unity code. This is useful for embedded targets with no floating -point math support (i.e. Unity compiles free of errors for fixed point only + +Support for floating point types is configurable. That is, by defining the +appropriate preprocessor symbols, floats and doubles can be individually enabled +or disabled in Unity code. This is useful for embedded targets with no floating +point math support (i.e. Unity compiles free of errors for fixed point only platforms). See Unity documentation for specifics. + #### Maximum Data Type Width Is Configurable -Not all targets support 64 bit wide types or even 32 bit wide types. Define the -appropriate preprocessor symbols and Unity will omit all operations from -compilation that exceed the maximum width of your target. See Unity + +Not all targets support 64 bit wide types or even 32 bit wide types. Define the +appropriate preprocessor symbols and Unity will omit all operations from +compilation that exceed the maximum width of your target. See Unity documentation for specifics. + ## The Assertions in All Their Blessed Glory + ### Basic Fail and Ignore ##### `TEST_FAIL()` -This fella is most often used in special conditions where your test code is -performing logic beyond a simple assertion. That is, in practice, `TEST_FAIL()` + +This fella is most often used in special conditions where your test code is +performing logic beyond a simple assertion. That is, in practice, `TEST_FAIL()` will always be found inside a conditional code block. _Examples:_ -- Executing a state machine multiple times that increments a counter your test +- Executing a state machine multiple times that increments a counter your test code then verifies as a final step. -- Triggering an exception and verifying it (as in Try / Catch / Throw - see the +- Triggering an exception and verifying it (as in Try / Catch / Throw - see the [CException](https://github.com/ThrowTheSwitch/CException) project). ##### `TEST_IGNORE()` -Marks a test case (i.e. function meant to contain test assertions) as ignored. -Usually this is employed as a breadcrumb to come back and implement a test case. -An ignored test case has effects if other assertions are in the enclosing test + +Marks a test case (i.e. function meant to contain test assertions) as ignored. +Usually this is employed as a breadcrumb to come back and implement a test case. +An ignored test case has effects if other assertions are in the enclosing test case (see Unity documentation for more). ### Boolean + ##### `TEST_ASSERT (condition)` + ##### `TEST_ASSERT_TRUE (condition)` + ##### `TEST_ASSERT_FALSE (condition)` + ##### `TEST_ASSERT_UNLESS (condition)` -A simple wording variation on `TEST_ASSERT_FALSE`.The semantics of -`TEST_ASSERT_UNLESS` aid readability in certain test constructions or + +A simple wording variation on `TEST_ASSERT_FALSE`.The semantics of +`TEST_ASSERT_UNLESS` aid readability in certain test constructions or conditional statements. ##### `TEST_ASSERT_NULL (pointer)` + ##### `TEST_ASSERT_NOT_NULL (pointer)` ### Signed and Unsigned Integers (of all sizes) -Large integer sizes can be disabled for build targets that do not support them. -For example, if your target only supports up to 16 bit types, by defining the -appropriate symbols Unity can be configured to omit 32 and 64 bit operations -that would break compilation (see Unity documentation for more). Refer to -Advanced Asserting later in this document for advice on dealing with other word + +Large integer sizes can be disabled for build targets that do not support them. +For example, if your target only supports up to 16 bit types, by defining the +appropriate symbols Unity can be configured to omit 32 and 64 bit operations +that would break compilation (see Unity documentation for more). Refer to +Advanced Asserting later in this document for advice on dealing with other word sizes. ##### `TEST_ASSERT_EQUAL_INT (expected, actual)` + ##### `TEST_ASSERT_EQUAL_INT8 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_INT16 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_INT32 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_INT64 (expected, actual)` + ##### `TEST_ASSERT_EQUAL (expected, actual)` + ##### `TEST_ASSERT_NOT_EQUAL (expected, actual)` + ##### `TEST_ASSERT_EQUAL_UINT (expected, actual)` + ##### `TEST_ASSERT_EQUAL_UINT8 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_UINT16 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_UINT32 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_UINT64 (expected, actual)` + ### Unsigned Integers (of all sizes) in Hexadecimal -All `_HEX` assertions are identical in function to unsigned integer assertions -but produce failure messages with the `expected` and `actual` values formatted + +All `_HEX` assertions are identical in function to unsigned integer assertions +but produce failure messages with the `expected` and `actual` values formatted in hexadecimal. Unity output is big endian. ##### `TEST_ASSERT_EQUAL_HEX (expected, actual)` + ##### `TEST_ASSERT_EQUAL_HEX8 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_HEX16 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_HEX32 (expected, actual)` + ##### `TEST_ASSERT_EQUAL_HEX64 (expected, actual)` + ### Masked and Bit-level Assertions -Masked and bit-level assertions produce output formatted in hexadecimal. Unity + +Masked and bit-level assertions produce output formatted in hexadecimal. Unity output is big endian. - + + ##### `TEST_ASSERT_BITS (mask, expected, actual)` -Only compares the masked (i.e. high) bits of `expected` and `actual` parameters. + +Only compares the masked (i.e. high) bits of `expected` and `actual` parameters. + ##### `TEST_ASSERT_BITS_HIGH (mask, actual)` + Asserts the masked bits of the `actual` parameter are high. + ##### `TEST_ASSERT_BITS_LOW (mask, actual)` + Asserts the masked bits of the `actual` parameter are low. - + + ##### `TEST_ASSERT_BIT_HIGH (bit, actual)` + Asserts the specified bit of the `actual` parameter is high. - + + ##### `TEST_ASSERT_BIT_LOW (bit, actual)` + Asserts the specified bit of the `actual` parameter is low. + ### Integer Ranges (of all sizes) -These assertions verify that the `expected` parameter is within +/- `delta` -(inclusive) of the `actual` parameter. For example, if the expected value is 10 -and the delta is 3 then the assertion will fail for any value outside the range + +These assertions verify that the `expected` parameter is within +/- `delta` +(inclusive) of the `actual` parameter. For example, if the expected value is 10 +and the delta is 3 then the assertion will fail for any value outside the range of 7 - 13. ##### `TEST_ASSERT_INT_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_INT8_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_INT16_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_INT32_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_INT64_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_UINT_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_UINT8_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_UINT16_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_UINT32_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_UINT64_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_HEX_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_HEX8_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_HEX16_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_HEX32_WITHIN (delta, expected, actual)` + ##### `TEST_ASSERT_HEX64_WITHIN (delta, expected, actual)` + ### Structs and Strings + ##### `TEST_ASSERT_EQUAL_PTR (expected, actual)` + Asserts that the pointers point to the same memory location. + ##### `TEST_ASSERT_EQUAL_STRING (expected, actual)` -Asserts that the null terminated (`‘\0'`)strings are identical. If strings are -of different lengths or any portion of the strings before their terminators -differ, the assertion fails. Two NULL strings (i.e. zero length) are considered + +Asserts that the null terminated (`'\0'`)strings are identical. If strings are +of different lengths or any portion of the strings before their terminators +differ, the assertion fails. Two NULL strings (i.e. zero length) are considered equivalent. + ##### `TEST_ASSERT_EQUAL_MEMORY (expected, actual, len)` -Asserts that the contents of the memory specified by the `expected` and `actual` -pointers is identical. The size of the memory blocks in bytes is specified by + +Asserts that the contents of the memory specified by the `expected` and `actual` +pointers is identical. The size of the memory blocks in bytes is specified by the `len` parameter. + ### Arrays -`expected` and `actual` parameters are both arrays. `num_elements` specifies the + +`expected` and `actual` parameters are both arrays. `num_elements` specifies the number of elements in the arrays to compare. -`_HEX` assertions produce failure messages with expected and actual array +`_HEX` assertions produce failure messages with expected and actual array contents formatted in hexadecimal. -For array of strings comparison behavior, see comments for +For array of strings comparison behavior, see comments for `TEST_ASSERT_EQUAL_STRING` in the preceding section. -Assertions fail upon the first element in the compared arrays found not to +Assertions fail upon the first element in the compared arrays found not to match. Failure messages specify the array index of the failed comparison. ##### `TEST_ASSERT_EQUAL_INT_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_INT8_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_INT16_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_INT32_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_INT64_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_UINT_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_UINT8_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_UINT16_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_UINT32_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_UINT64_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_HEX_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_HEX8_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_HEX16_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_HEX32_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_HEX64_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_PTR_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_STRING_ARRAY (expected, actual, num_elements)` + ##### `TEST_ASSERT_EQUAL_MEMORY_ARRAY (expected, actual, len, num_elements)` + `len` is the memory in bytes to be compared at each array element. + ### Floating Point (If enabled) + ##### `TEST_ASSERT_FLOAT_WITHIN (delta, expected, actual)` -Asserts that the `actual` value is within +/- `delta` of the `expected` value. -The nature of floating point representation is such that exact evaluations of + +Asserts that the `actual` value is within +/- `delta` of the `expected` value. +The nature of floating point representation is such that exact evaluations of equality are not guaranteed. + ##### `TEST_ASSERT_EQUAL_FLOAT (expected, actual)` -Asserts that the ?actual?value is "close enough to be considered equal" to the -`expected` value. If you are curious about the details, refer to the Advanced -Asserting section for more details on this. Omitting a user-specified delta in a -floating point assertion is both a shorthand convenience and a requirement of + +Asserts that the ?actual?value is "close enough to be considered equal" to the +`expected` value. If you are curious about the details, refer to the Advanced +Asserting section for more details on this. Omitting a user-specified delta in a +floating point assertion is both a shorthand convenience and a requirement of code generation conventions for CMock. + ##### `TEST_ASSERT_EQUAL_FLOAT_ARRAY (expected, actual, num_elements)` -See Array assertion section for details. Note that individual array element -float comparisons are executed using T?EST_ASSERT_EQUAL_FLOAT?.That is, user -specified delta comparison values requires a custom-implemented floating point + +See Array assertion section for details. Note that individual array element +float comparisons are executed using T?EST_ASSERT_EQUAL_FLOAT?.That is, user +specified delta comparison values requires a custom-implemented floating point array assertion. + ##### `TEST_ASSERT_FLOAT_IS_INF (actual)` -Asserts that `actual` parameter is equivalent to positive infinity floating + +Asserts that `actual` parameter is equivalent to positive infinity floating point representation. + ##### `TEST_ASSERT_FLOAT_IS_NEG_INF (actual)` -Asserts that `actual` parameter is equivalent to negative infinity floating + +Asserts that `actual` parameter is equivalent to negative infinity floating point representation. + ##### `TEST_ASSERT_FLOAT_IS_NAN (actual)` + Asserts that `actual` parameter is a Not A Number floating point representation. + ##### `TEST_ASSERT_FLOAT_IS_DETERMINATE (actual)` -Asserts that ?actual?parameter is a floating point representation usable for -mathematical operations. That is, the `actual` parameter is neither positive + +Asserts that ?actual?parameter is a floating point representation usable for +mathematical operations. That is, the `actual` parameter is neither positive infinity nor negative infinity nor Not A Number floating point representations. + ##### `TEST_ASSERT_FLOAT_IS_NOT_INF (actual)` -Asserts that `actual` parameter is a value other than positive infinity floating + +Asserts that `actual` parameter is a value other than positive infinity floating point representation. + ##### `TEST_ASSERT_FLOAT_IS_NOT_NEG_INF (actual)` -Asserts that `actual` parameter is a value other than negative infinity floating + +Asserts that `actual` parameter is a value other than negative infinity floating point representation. + ##### `TEST_ASSERT_FLOAT_IS_NOT_NAN (actual)` -Asserts that `actual` parameter is a value other than Not A Number floating + +Asserts that `actual` parameter is a value other than Not A Number floating point representation. + ##### `TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE (actual)` -Asserts that `actual` parameter is not usable for mathematical operations. That -is, the `actual` parameter is either positive infinity or negative infinity or + +Asserts that `actual` parameter is not usable for mathematical operations. That +is, the `actual` parameter is either positive infinity or negative infinity or Not A Number floating point representations. + ### Double (If enabled) + ##### `TEST_ASSERT_DOUBLE_WITHIN (delta, expected, actual)` -Asserts that the `actual` value is within +/- `delta` of the `expected` value. -The nature of floating point representation is such that exact evaluations of + +Asserts that the `actual` value is within +/- `delta` of the `expected` value. +The nature of floating point representation is such that exact evaluations of equality are not guaranteed. + ##### `TEST_ASSERT_EQUAL_DOUBLE (expected, actual)` -Asserts that the `actual` value is "close enough to be considered equal" to the -`expected` value. If you are curious about the details, refer to the Advanced -Asserting section for more details. Omitting a user-specified delta in a -floating point assertion is both a shorthand convenience and a requirement of -code generation conventions for CMock. + +Asserts that the `actual` value is "close enough to be considered equal" to the +`expected` value. If you are curious about the details, refer to the Advanced +Asserting section for more details. Omitting a user-specified delta in a +floating point assertion is both a shorthand convenience and a requirement of +code generation conventions for CMock. + ##### `TEST_ASSERT_EQUAL_DOUBLE_ARRAY (expected, actual, num_elements)` -See Array assertion section for details. Note that individual array element -double comparisons are executed using `TEST_ASSERT_EQUAL_DOUBLE`.That is, user -specified delta comparison values requires a custom­implemented double array + +See Array assertion section for details. Note that individual array element +double comparisons are executed using `TEST_ASSERT_EQUAL_DOUBLE`.That is, user +specified delta comparison values requires a custom implemented double array assertion. + ##### `TEST_ASSERT_DOUBLE_IS_INF (actual)` -Asserts that `actual` parameter is equivalent to positive infinity floating + +Asserts that `actual` parameter is equivalent to positive infinity floating point representation. + ##### `TEST_ASSERT_DOUBLE_IS_NEG_INF (actual)` -Asserts that `actual` parameter is equivalent to negative infinity floating point + +Asserts that `actual` parameter is equivalent to negative infinity floating point representation. + ##### `TEST_ASSERT_DOUBLE_IS_NAN (actual)` + Asserts that `actual` parameter is a Not A Number floating point representation. + ##### `TEST_ASSERT_DOUBLE_IS_DETERMINATE (actual)` -Asserts that `actual` parameter is a floating point representation usable for -mathematical operations. That is, the ?actual?parameter is neither positive + +Asserts that `actual` parameter is a floating point representation usable for +mathematical operations. That is, the ?actual?parameter is neither positive infinity nor negative infinity nor Not A Number floating point representations. + ##### `TEST_ASSERT_DOUBLE_IS_NOT_INF (actual)` -Asserts that `actual` parameter is a value other than positive infinity floating + +Asserts that `actual` parameter is a value other than positive infinity floating point representation. + ##### `TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF (actual)` -Asserts that `actual` parameter is a value other than negative infinity floating + +Asserts that `actual` parameter is a value other than negative infinity floating point representation. + ##### `TEST_ASSERT_DOUBLE_IS_NOT_NAN (actual)` -Asserts that `actual` parameter is a value other than Not A Number floating + +Asserts that `actual` parameter is a value other than Not A Number floating point representation. + ##### `TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE (actual)` -Asserts that `actual` parameter is not usable for mathematical operations. That -is, the `actual` parameter is either positive infinity or negative infinity or + +Asserts that `actual` parameter is not usable for mathematical operations. That +is, the `actual` parameter is either positive infinity or negative infinity or Not A Number floating point representations. + ## Advanced Asserting: Details On Tricky Assertions -This section helps you understand how to deal with some of the trickier -assertion situations you may run into. It will give you a glimpse into some of -the under-the-hood details of Unity's assertion mechanisms. If you're one of -those people who likes to know what is going on in the background, read on. If -not, feel free to ignore the rest of this document until you need it. + +This section helps you understand how to deal with some of the trickier +assertion situations you may run into. It will give you a glimpse into some of +the under-the-hood details of Unity's assertion mechanisms. If you're one of +those people who likes to know what is going on in the background, read on. If +not, feel free to ignore the rest of this document until you need it. + ### How do the EQUAL assertions work for FLOAT and DOUBLE? -As you may know, directly checking for equality between a pair of floats or a -pair of doubles is sloppy at best and an outright no-no at worst. Floating point -values can often be represented in multiple ways, particularly after a series of -operations on a value. Initializing a variable to the value of 2.0 is likely to -result in a floating point representation of 2 x 20,but a series of -mathematical operations might result in a representation of 8 x 2-2 -that also evaluates to a value of 2. At some point repeated operations cause -equality checks to fail. -So Unity doesn't do direct floating point comparisons for equality. Instead, it -checks if two floating point values are "really close." If you leave Unity -running with defaults, "really close" means "within a significant bit or two." -Under the hood, `TEST_ASSERT_EQUAL_FLOAT` is really `TEST_ASSERT_FLOAT_WITHIN` -with the `delta` parameter calculated on the fly. For single precision, delta is -the expected value multiplied by 0.00001, producing a very small proportional +As you may know, directly checking for equality between a pair of floats or a +pair of doubles is sloppy at best and an outright no-no at worst. Floating point +values can often be represented in multiple ways, particularly after a series of +operations on a value. Initializing a variable to the value of 2.0 is likely to +result in a floating point representation of 2 x 20,but a series of +mathematical operations might result in a representation of 8 x 2-2 +that also evaluates to a value of 2. At some point repeated operations cause +equality checks to fail. + +So Unity doesn't do direct floating point comparisons for equality. Instead, it +checks if two floating point values are "really close." If you leave Unity +running with defaults, "really close" means "within a significant bit or two." +Under the hood, `TEST_ASSERT_EQUAL_FLOAT` is really `TEST_ASSERT_FLOAT_WITHIN` +with the `delta` parameter calculated on the fly. For single precision, delta is +the expected value multiplied by 0.00001, producing a very small proportional range around the expected value. -If you are expecting a value of 20,000.0 the delta is calculated to be 0.2. So -any value between 19,999.8 and 20,000.2 will satisfy the equality check. This -works out to be roughly a single bit of range for a single-precision number, and -that's just about as tight a tolerance as you can reasonably get from a floating +If you are expecting a value of 20,000.0 the delta is calculated to be 0.2. So +any value between 19,999.8 and 20,000.2 will satisfy the equality check. This +works out to be roughly a single bit of range for a single-precision number, and +that's just about as tight a tolerance as you can reasonably get from a floating point value. -So what happens when it's zero? Zero - even more than other floating point -values - can be represented many different ways. It doesn't matter if you have -0 x 20or 0 x 263.It's still zero, right? Luckily, if you -subtract these values from each other, they will always produce a difference of -zero, which will still fall between 0 plus or minus a delta of 0. So it still +So what happens when it's zero? Zero - even more than other floating point +values - can be represented many different ways. It doesn't matter if you have +0 x 20or 0 x 263.It's still zero, right? Luckily, if you +subtract these values from each other, they will always produce a difference of +zero, which will still fall between 0 plus or minus a delta of 0. So it still works! -Double precision floating point numbers use a much smaller multiplier, again +Double precision floating point numbers use a much smaller multiplier, again approximating a single bit of error. -If you don't like these ranges and you want to make your floating point equality -assertions less strict, you can change these multipliers to whatever you like by -defining UNITY_FLOAT_PRECISION and UNITY_DOUBLE_PRECISION. See Unity +If you don't like these ranges and you want to make your floating point equality +assertions less strict, you can change these multipliers to whatever you like by +defining UNITY_FLOAT_PRECISION and UNITY_DOUBLE_PRECISION. See Unity documentation for more. + ### How do we deal with targets with non-standard int sizes? -It's "fun" that C is a standard where something as fundamental as an integer -varies by target. According to the C standard, an `int` is to be the target's -natural register size, and it should be at least 16-bits and a multiple of a -byte. It also guarantees an order of sizes: + +It's "fun" that C is a standard where something as fundamental as an integer +varies by target. According to the C standard, an `int` is to be the target's +natural register size, and it should be at least 16-bits and a multiple of a +byte. It also guarantees an order of sizes: ```C char <= short <= int <= long <= long long ``` -Most often, `int` is 32-bits. In many cases in the embedded world, `int` is -16-bits. There are rare microcontrollers out there that have 24-bit integers, +Most often, `int` is 32-bits. In many cases in the embedded world, `int` is +16-bits. There are rare microcontrollers out there that have 24-bit integers, and this remains perfectly standard C. -To make things even more interesting, there are compilers and targets out there -that have a hard choice to make. What if their natural register size is 10-bits -or 12-bits? Clearly they can't fulfill _both_ the requirement to be at least -16-bits AND the requirement to match the natural register size. In these -situations, they often choose the natural register size, leaving us with +To make things even more interesting, there are compilers and targets out there +that have a hard choice to make. What if their natural register size is 10-bits +or 12-bits? Clearly they can't fulfill _both_ the requirement to be at least +16-bits AND the requirement to match the natural register size. In these +situations, they often choose the natural register size, leaving us with something like this: ```C char (8 bit) <= short (12 bit) <= int (12 bit) <= long (16 bit) ``` -Um... yikes. It's obviously breaking a rule or two... but they had to break SOME +Um... yikes. It's obviously breaking a rule or two... but they had to break SOME rules, so they made a choice. -When the C99 standard rolled around, it introduced alternate standard-size types. -It also introduced macros for pulling in MIN/MAX values for your integer types. -It's glorious! Unfortunately, many embedded compilers can't be relied upon to -use the C99 types (Sometimes because they have weird register sizes as described +When the C99 standard rolled around, it introduced alternate standard-size types. +It also introduced macros for pulling in MIN/MAX values for your integer types. +It's glorious! Unfortunately, many embedded compilers can't be relied upon to +use the C99 types (Sometimes because they have weird register sizes as described above. Sometimes because they don't feel like it?). -A goal of Unity from the beginning was to support every combination of -microcontroller or microprocessor and C compiler. Over time, we've gotten really -close to this. There are a few tricks that you should be aware of, though, if +A goal of Unity from the beginning was to support every combination of +microcontroller or microprocessor and C compiler. Over time, we've gotten really +close to this. There are a few tricks that you should be aware of, though, if you're going to do this effectively on some of these more idiosyncratic targets. -First, when setting up Unity for a new target, you're going to want to pay -special attention to the macros for automatically detecting types -(where available) or manually configuring them yourself. You can get information +First, when setting up Unity for a new target, you're going to want to pay +special attention to the macros for automatically detecting types +(where available) or manually configuring them yourself. You can get information on both of these in Unity's documentation. -What about the times where you suddenly need to deal with something odd, like a -24-bit `int`? The simplest solution is to use the next size up. If you have a -24-bit `int`, configure Unity to use 32-bit integers. If you have a 12-bit -`int`, configure Unity to use 16 bits. There are two ways this is going to +What about the times where you suddenly need to deal with something odd, like a +24-bit `int`? The simplest solution is to use the next size up. If you have a +24-bit `int`, configure Unity to use 32-bit integers. If you have a 12-bit +`int`, configure Unity to use 16 bits. There are two ways this is going to affect you: -1. When Unity displays errors for you, it's going to pad the upper unused bits +1. When Unity displays errors for you, it's going to pad the upper unused bits with zeros. -2. You're going to have to be careful of assertions that perform signed -operations, particularly `TEST_ASSERT_INT_WITHIN`.Such assertions might wrap -your `int` in the wrong place, and you could experience false failures. You can +2. You're going to have to be careful of assertions that perform signed +operations, particularly `TEST_ASSERT_INT_WITHIN`.Such assertions might wrap +your `int` in the wrong place, and you could experience false failures. You can always back down to a simple `TEST_ASSERT` and do the operations yourself. \ No newline at end of file diff --git a/docs/UnityConfigurationGuide.md b/docs/UnityConfigurationGuide.md index 0a0c0ab..9338bce 100644 --- a/docs/UnityConfigurationGuide.md +++ b/docs/UnityConfigurationGuide.md @@ -1,140 +1,166 @@ # Unity Configuration Guide ## C Standards, Compilers and Microcontrollers + The embedded software world contains its challenges. Compilers support different -revisions of the C Standard. They ignore requirements in places, sometimes to -make the language more usable in some special regard. Sometimes it's to simplify -their support. Sometimes it's due to specific quirks of the microcontroller they +revisions of the C Standard. They ignore requirements in places, sometimes to +make the language more usable in some special regard. Sometimes it's to simplify +their support. Sometimes it's due to specific quirks of the microcontroller they are targeting. Simulators add another dimension to this menagerie. -Unity is designed to run on almost anything that is targeted by a C compiler. It -would be awesome if this could be done with zero configuration. While there are -some targets that come close to this dream, it is sadly not universal. It is -likely that you are going to need at least a couple of the configuration options +Unity is designed to run on almost anything that is targeted by a C compiler. It +would be awesome if this could be done with zero configuration. While there are +some targets that come close to this dream, it is sadly not universal. It is +likely that you are going to need at least a couple of the configuration options described in this document. -All of Unity's configuration options are `#defines`. Most of these are simple -definitions. A couple are macros with arguments. They live inside the -unity_internals.h header file. We don't necessarily recommend opening that file -unless you really need to. That file is proof that a cross-platform library is -challenging to build. From a more positive perspective, it is also proof that a -great deal of complexity can be centralized primarily to one place in order to +All of Unity's configuration options are `#defines`. Most of these are simple +definitions. A couple are macros with arguments. They live inside the +unity_internals.h header file. We don't necessarily recommend opening that file +unless you really need to. That file is proof that a cross-platform library is +challenging to build. From a more positive perspective, it is also proof that a +great deal of complexity can be centralized primarily to one place in order to provide a more consistent and simple experience elsewhere. -### Using These Options -It doesn't matter if you're using a target-specific compiler and a simulator or -a native compiler. In either case, you've got a couple choices for configuring + +### Using These Options + +It doesn't matter if you're using a target-specific compiler and a simulator or +a native compiler. In either case, you've got a couple choices for configuring these options: -1. Because these options are specified via C defines, you can pass most of these -options to your compiler through command line compiler flags. Even if you're -using an embedded target that forces you to use their overbearing IDE for all -configuration, there will be a place somewhere in your project to configure -defines for your compiler. -2. You can create a custom `unity_config.h` configuration file (present in your -toolchain's search paths). In this file, you will list definitions and macros -specific to your target. All you must do is define `UNITY_INCLUDE_CONFIG_H` and +1. Because these options are specified via C defines, you can pass most of these +options to your compiler through command line compiler flags. Even if you're +using an embedded target that forces you to use their overbearing IDE for all +configuration, there will be a place somewhere in your project to configure +defines for your compiler. +2. You can create a custom `unity_config.h` configuration file (present in your +toolchain's search paths). In this file, you will list definitions and macros +specific to your target. All you must do is define `UNITY_INCLUDE_CONFIG_H` and Unity will rely on `unity_config.h` for any further definitions it may need. + ## The Options ### Integer Types -If you've been a C developer for long, you probably already know that 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 microprocessor. It has -rules about the `int` and how its size relates to other integer types. An `int` -on one target might be 16 bits while on another target it might be 64. There are -more specific types in compilers compliant with C99 or later, but that's -certainly not every compiler you are likely to encounter. Therefore, Unity has a -number of features for helping to adjust itself to match your required integer + +If you've been a C developer for long, you probably already know that 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 microprocessor. It has +rules about the `int` and how its size relates to other integer types. An `int` +on one target might be 16 bits while on another target it might be 64. There are +more specific types in compilers compliant with C99 or later, but that's +certainly not every compiler you are likely to encounter. Therefore, Unity has a +number of features for helping to adjust itself to match your required integer sizes. It starts off by trying to do it automatically. + ##### `UNITY_EXCLUDE_STDINT_H` -The first thing that Unity does to guess your types is check `stdint.h`. -This file includes defines like `UINT_MAX` that Unity can make use of to -learn a lot about your system. It's possible you don't want it to do this -(um. why not?) or (more likely) it's possible that your system doesn't -support `stdint.h`. If that's the case, you're going to want to define this. -That way, Unity will know to skip the inclusion of this file and you won't + +The first thing that Unity does to guess your types is check `stdint.h`. +This file includes defines like `UINT_MAX` that Unity can make use of to +learn a lot about your system. It's possible you don't want it to do this +(um. why not?) or (more likely) it's possible that your system doesn't +support `stdint.h`. If that's the case, you're going to want to define this. +That way, Unity will know to skip the inclusion of this file and you won't be left with a compiler error. _Example:_ #define UNITY_EXCLUDE_STDINT_H + ##### `UNITY_EXCLUDE_LIMITS_H` -The second attempt to guess your types is to check `limits.h`. Some compilers -that don't support `stdint.h` could include `limits.h` instead. If you don't + +The second attempt to guess your types is to check `limits.h`. Some compilers +that don't support `stdint.h` could include `limits.h` instead. If you don't want Unity to check this file either, define this to make it skip the inclusion. _Example:_ #define UNITY_EXCLUDE_LIMITS_H + ##### `UNITY_EXCLUDE_SIZEOF` -The third and final attempt to guess your types is to use the `sizeof()` + +The third and final attempt to guess your types is to use the `sizeof()` operator. Even if the first two options don't work, this one covers most cases. -There _is_ a rare compiler or two out there that doesn't support sizeof() in the -preprocessing stage, though. For these, you have the ability to disable this +There _is_ a rare compiler or two out there that doesn't support sizeof() in the +preprocessing stage, though. For these, you have the ability to disable this feature as well. _Example:_ #define UNITY_EXCLUDE_SIZEOF -If you've disabled all of the automatic options above, you're going to have to -do the configuration yourself. Don't worry. Even this isn't too bad... there are -just a handful of defines that you are going to specify if you don't like the +If you've disabled all of the automatic options above, you're going to have to +do the configuration yourself. Don't worry. Even this isn't too bad... there are +just a handful of defines that you are going to specify if you don't like the defaults. + ##### `UNITY_INT_WIDTH` -Define this to be the number of bits an `int` takes up on your system. The + +Define this to be the number of bits an `int` takes up on your system. The default, if not autodetected, is 32 bits. _Example:_ #define UNITY_INT_WIDTH 16 + ##### `UNITY_LONG_WIDTH` -Define this to be the number of bits a `long` takes up on your system. The -default, if not autodetected, is 32 bits. This is used to figure out what kind -of 64-bit support your system can handle. Does it need to specify a `long` or a -`long long` to get a 64-bit value. On 16-bit systems, this option is going to be + +Define this to be the number of bits a `long` takes up on your system. The +default, if not autodetected, is 32 bits. This is used to figure out what kind +of 64-bit support your system can handle. Does it need to specify a `long` or a +`long long` to get a 64-bit value. On 16-bit systems, this option is going to be ignored. _Example:_ #define UNITY_LONG_WIDTH 16 + ##### `UNITY_POINTER_WIDTH` -Define this to be the number of bits a pointer takes up on your system. The -default, if not autodetected, is 32-bits. If you're getting ugly compiler + +Define this to be the number of bits a pointer takes up on your system. The +default, if not autodetected, is 32-bits. If you're getting ugly compiler warnings about casting from pointers, this is the one to look at. _Example:_ #define UNITY_POINTER_WIDTH 64 + ##### `UNITY_INCLUDE_64` -Unity will automatically include 64-bit support if it auto-detects it, or if -your `int`, `long`, or pointer widths are greater than 32-bits. Define this to -enable 64-bit support if none of the other options already did it for you. There -can be a significant size and speed impact to enabling 64-bit support on small + +Unity will automatically include 64-bit support if it auto-detects it, or if +your `int`, `long`, or pointer widths are greater than 32-bits. Define this to +enable 64-bit support if none of the other options already did it for you. There +can be a significant size and speed impact to enabling 64-bit support on small targets, so don't define it if you don't need it. _Example:_ #define UNITY_INCLUDE_64 -### Floating Point Types -In the embedded world, it's not uncommon for targets to have no support for -floating point operations at all or to have support that is limited to only -single precision. We are able to guess integer sizes on the fly because integers -are always available in at least one size. Floating point, on the other hand, is -sometimes not available at all. Trying to include `float.h` on these platforms + +### Floating Point Types + +In the embedded world, it's not uncommon for targets to have no support for +floating point operations at all or to have support that is limited to only +single precision. We are able to guess integer sizes on the fly because integers +are always available in at least one size. Floating point, on the other hand, is +sometimes not available at all. Trying to include `float.h` on these platforms would result in an error. This leaves manual configuration as the only option. + ##### `UNITY_INCLUDE_FLOAT` + ##### `UNITY_EXCLUDE_FLOAT` + ##### `UNITY_INCLUDE_DOUBLE` + ##### `UNITY_EXCLUDE_DOUBLE` -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. For features that are enabled, the following floating point + +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. For features that are enabled, the following floating point options also become available. _Example:_ @@ -143,82 +169,99 @@ _Example:_ #define UNITY_EXCLUDE_FLOAT #define UNITY_INCLUDE_DOUBLE + ##### `UNITY_FLOAT_VERBOSE` + ##### `UNITY_DOUBLE_VERBOSE` -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 + +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. _Example:_ #define UNITY_DOUBLE_VERBOSE + ##### `UNITY_FLOAT_TYPE` -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 + +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 always override this behavior by using this definition. _Example:_ #define UNITY_FLOAT_TYPE float16_t + ##### `UNITY_DOUBLE_TYPE` -If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard C -doubles. If you would like to change this, you can specify something else by -using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long double` -could enable gargantuan floating point types on your 64-bit processor instead of + +If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard C +doubles. If you would like to change this, you can specify something else by +using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long double` +could enable gargantuan floating point types on your 64-bit processor instead of the standard `double`. _Example:_ #define UNITY_DOUBLE_TYPE long double + ##### `UNITY_FLOAT_PRECISION` + ##### `UNITY_DOUBLE_PRECISION` -If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as -documented in the big daddy Unity Assertion Guide, you will learn that they are -not really asserting that two values are equal but rather that two values are -"close enough" to equal. "Close enough" is controlled by these precision -configuration options. If you are working with 32-bit floats and/or 64-bit -doubles (the normal on most processors), you should have no need to change these -options. They are both set to give you approximately 1 significant bit in either -direction. The float precision is 0.00001 while the double is 10-12. -For further details on how this works, see the appendix of the Unity Assertion + +If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as +documented in the big daddy Unity Assertion Guide, you will learn that they are +not really asserting that two values are equal but rather that two values are +"close enough" to equal. "Close enough" is controlled by these precision +configuration options. If you are working with 32-bit floats and/or 64-bit +doubles (the normal on most processors), you should have no need to change these +options. They are both set to give you approximately 1 significant bit in either +direction. The float precision is 0.00001 while the double is 10-12. +For further details on how this works, see the appendix of the Unity Assertion Guide. _Example:_ #define UNITY_FLOAT_PRECISION 0.001f + ### Toolset Customization -In addition to the options listed above, there are a number of other options -which will come in handy to customize Unity's behavior for your specific -toolchain. It is possible that you may not need to touch any of these... but -certain platforms, particularly those running in simulators, may need to jump -through extra hoops to operate properly. These macros will help in those + +In addition to the options listed above, there are a number of other options +which will come in handy to customize Unity's behavior for your specific +toolchain. It is possible that you may not need to touch any of these... but +certain platforms, particularly those running in simulators, may need to jump +through extra hoops to operate properly. These macros will help in those situations. + ##### `UNITY_OUTPUT_CHAR(a)` + ##### `UNITY_OUTPUT_FLUSH()` + ##### `UNITY_OUTPUT_START()` + ##### `UNITY_OUTPUT_COMPLETE()` -By default, Unity prints its results to `stdout` as it runs. This works -perfectly fine in most situations where you are using a native compiler for -testing. It works on some simulators as well so long as they have `stdout` -routed back to the command line. There are times, however, where the simulator -will lack support for dumping results or you will want to route results -elsewhere for other reasons. In these cases, you should define the -`UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time (as -an `int`, since this is the parameter type of the standard C `putchar` function + +By default, Unity prints its results to `stdout` as it runs. This works +perfectly fine in most situations where you are using a native compiler for +testing. It works on some simulators as well so long as they have `stdout` +routed back to the command line. There are times, however, where the simulator +will lack support for dumping results or you will want to route results +elsewhere for other reasons. In these cases, you should define the +`UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time (as +an `int`, since this is the parameter type of the standard C `putchar` function most commonly used). You may replace this with whatever function call you like. _Example:_ -Say you are forced to run your test suite on an embedded processor with no -`stdout` option. You decide to route your test result output to a custom serial +Say you are forced to run your test suite on an embedded processor with no +`stdout` option. You decide to route your test result output to a custom serial `RS232_putc()` function you wrote like thus: #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) @@ -227,86 +270,96 @@ Say you are forced to run your test suite on an embedded processor with no #define UNITY_OUTPUT_COMPLETE() RS232_close() _Note:_ -`UNITY_OUTPUT_FLUSH()` can be set to the standard out flush function simply by -specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required. If you -specify a custom flush function instead with `UNITY_OUTPUT_FLUSH` directly, it -will declare an instance of your function by default. If you want to disable +`UNITY_OUTPUT_FLUSH()` can be set to the standard out flush function simply by +specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required. If you +specify a custom flush function instead with `UNITY_OUTPUT_FLUSH` directly, it +will declare an instance of your function by default. If you want to disable this behavior, add `UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION`. + ##### `UNITY_SUPPORT_WEAK` -For some targets, Unity can make the otherwise required `setUp()` and -`tearDown()` functions optional. This is a nice convenience for test writers -since `setUp` and `tearDown` don't often actually _do_ anything. If you're using -gcc or clang, this option is automatically defined for you. Other compilers can -also support this behavior, if they support a C feature called weak functions. A -weak function is a function that is compiled into your executable _unless_ a -non-weak version of the same function is defined elsewhere. If a non-weak -version is found, the weak version is ignored as if it never existed. If your -compiler supports this feature, you can let Unity know by defining -`UNITY_SUPPORT_WEAK` as the function attributes that would need to be applied to -identify a function as weak. If your compiler lacks support for weak functions, -you will always need to define `setUp` and `tearDown` functions (though they can + +For some targets, Unity can make the otherwise required `setUp()` and +`tearDown()` functions optional. This is a nice convenience for test writers +since `setUp` and `tearDown` don't often actually _do_ anything. If you're using +gcc or clang, this option is automatically defined for you. Other compilers can +also support this behavior, if they support a C feature called weak functions. A +weak function is a function that is compiled into your executable _unless_ a +non-weak version of the same function is defined elsewhere. If a non-weak +version is found, the weak version is ignored as if it never existed. If your +compiler supports this feature, you can let Unity know by defining +`UNITY_SUPPORT_WEAK` as the function attributes that would need to be applied to +identify a function as weak. If your compiler lacks support for weak functions, +you will always need to define `setUp` and `tearDown` functions (though they can be and often will be just empty). The most common options for this feature are: _Example:_ #define UNITY_SUPPORT_WEAK weak #define UNITY_SUPPORT_WEAK __attribute__((weak)) + ##### `UNITY_PTR_ATTRIBUTE` -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 by + +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 by defining this option with the attribute you would like. _Example:_ #define UNITY_PTR_ATTRIBUTE __attribute__((far)) #define UNITY_PTR_ATTRIBUTE near + ## Getting Into The Guts -There will be cases where the options above aren't quite going to get everything -perfect. They are likely sufficient for any situation where you are compiling -and executing your tests with a native toolchain (e.g. clang on Mac). These -options may even get you through the majority of cases encountered in working -with a target simulator run from your local command line. But especially if you -must run your test suite on your target hardware, your Unity configuration will -require special help. This special help will usually reside in one of two -places: the `main()` function or the `RUN_TEST` macro. Let's look at how these + +There will be cases where the options above aren't quite going to get everything +perfect. They are likely sufficient for any situation where you are compiling +and executing your tests with a native toolchain (e.g. clang on Mac). These +options may even get you through the majority of cases encountered in working +with a target simulator run from your local command line. But especially if you +must run your test suite on your target hardware, your Unity configuration will +require special help. This special help will usually reside in one of two +places: the `main()` function or the `RUN_TEST` macro. Let's look at how these work. + ##### `main()` -Each test module is compiled and run on its own, separate from the other test -files in your project. Each test file, therefore, has a `main` function. This -`main` function will need to contain whatever code is necessary to initialize -your system to a workable state. This is particularly true for situations where -you must set up a memory map or initialize a communication channel for the + +Each test module is compiled and run on its own, separate from the other test +files in your project. Each test file, therefore, has a `main` function. This +`main` function will need to contain whatever code is necessary to initialize +your system to a workable state. This is particularly true for situations where +you must set up a memory map or initialize a communication channel for the output of your test results. A simple main function looks something like this: - int main(void) { - UNITY_BEGIN(); - RUN_TEST(test_TheFirst); - RUN_TEST(test_TheSecond); - RUN_TEST(test_TheThird); - return UNITY_END(); + int main(void) { + UNITY_BEGIN(); + RUN_TEST(test_TheFirst); + RUN_TEST(test_TheSecond); + RUN_TEST(test_TheThird); + return UNITY_END(); } -You can see that our main function doesn't bother taking any arguments. For our -most barebones case, we'll never have arguments because we just run all the -tests each time. Instead, we start by calling `UNITY_BEGIN`. We run each test -(in whatever order we wish). Finally, we call `UNITY_END`, returning its return +You can see that our main function doesn't bother taking any arguments. For our +most barebones case, we'll never have arguments because we just run all the +tests each time. Instead, we start by calling `UNITY_BEGIN`. We run each test +(in whatever order we wish). Finally, we call `UNITY_END`, returning its return value (which is the total number of failures). -It should be easy to see that you can add code before any test cases are run or -after all the test cases have completed. This allows you to do any needed -system-wide setup or teardown that might be required for your special +It should be easy to see that you can add code before any test cases are run or +after all the test cases have completed. This allows you to do any needed +system-wide setup or teardown that might be required for your special circumstances. + ##### `RUN_TEST` -The `RUN_TEST` macro is called with each test case function. Its job is to -perform whatever setup and teardown is necessary for executing a single test -case function. This includes catching failures, calling the test module's -`setUp()` and `tearDown()` functions, and calling `UnityConcludeTest()`. If -using CMock or test coverage, there will be additional stubs in use here. A + +The `RUN_TEST` macro is called with each test case function. Its job is to +perform whatever setup and teardown is necessary for executing a single test +case function. This includes catching failures, calling the test module's +`setUp()` and `tearDown()` functions, and calling `UnityConcludeTest()`. If +using CMock or test coverage, there will be additional stubs in use here. A simple minimalist RUN_TEST macro looks something like this: #define RUN_TEST(testfunc) \ @@ -319,22 +372,24 @@ simple minimalist RUN_TEST macro looks something like this: tearDown(); \ UnityConcludeTest(); -So that's quite a macro, huh? It gives you a glimpse of what kind of stuff Unity -has to deal with for every single test case. For each test case, we declare that -it is a new test. Then we run `setUp` and our test function. These are run -within a `TEST_PROTECT` block, the function of which is to handle failures that -occur during the test. Then, assuming our test is still running and hasn't been -ignored, we run `tearDown`. No matter what, our last step is to conclude this +So that's quite a macro, huh? It gives you a glimpse of what kind of stuff Unity +has to deal with for every single test case. For each test case, we declare that +it is a new test. Then we run `setUp` and our test function. These are run +within a `TEST_PROTECT` block, the function of which is to handle failures that +occur during the test. Then, assuming our test is still running and hasn't been +ignored, we run `tearDown`. No matter what, our last step is to conclude this test before moving on to the next. -Let's say you need to add a call to `fsync` to force all of your output data to -flush to a file after each test. You could easily insert this after your -`UnityConcludeTest` call. Maybe you want to write an xml tag before and after -each result set. Again, you could do this by adding lines to this macro. Updates -to this macro are for the occasions when you need an action before or after +Let's say you need to add a call to `fsync` to force all of your output data to +flush to a file after each test. You could easily insert this after your +`UnityConcludeTest` call. Maybe you want to write an xml tag before and after +each result set. Again, you could do this by adding lines to this macro. Updates +to this macro are for the occasions when you need an action before or after every single test case throughout your entire suite of tests. + ## Happy Porting -The defines and macros in this guide should help you port Unity to just about -any C target we can imagine. If you run into a snag or two, don't be afraid of + +The defines and macros in this guide should help you port Unity to just about +any C target we can imagine. If you run into a snag or two, don't be afraid of asking for help on the forums. We love a good challenge! \ No newline at end of file diff --git a/docs/UnityGettingStartedGuide.md b/docs/UnityGettingStartedGuide.md index a118331..58ef400 100644 --- a/docs/UnityGettingStartedGuide.md +++ b/docs/UnityGettingStartedGuide.md @@ -1,151 +1,168 @@ # Unity - Getting Started ## Welcome -Congratulations. You're now the proud owner of your very own pile of bits! What -are you going to do with all these ones and zeros? This document should be able + +Congratulations. You're now the proud owner of your very own pile of bits! What +are you going to do with all these ones and zeros? This document should be able to help you decide just that. -Unity is a unit test framework. The goal has been to keep it small and -functional. The core Unity test framework is three files: a single C file and a -couple header files. These team up to provide functions and macros to make +Unity is a unit test framework. The goal has been to keep it small and +functional. The core Unity test framework is three files: a single C file and a +couple header files. These team up to provide functions and macros to make testing easier. -Unity was designed to be cross platform. It works hard to stick with C standards -while still providing support for the many embedded C compilers that bend the -rules. Unity has been used with many compilers, including GCC, IAR, Clang, -Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to +Unity was designed to be cross platform. It works hard to stick with C standards +while still providing support for the many embedded C compilers that bend the +rules. Unity has been used with many compilers, including GCC, IAR, Clang, +Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to work with a new target. + ### Overview of the Documents #### Unity Assertions reference -This document will guide you through all the assertion options provided by -Unity. This is going to be your unit testing bread and butter. You'll spend more + +This document will guide you through all the assertion options provided by +Unity. This is going to be your unit testing bread and butter. You'll spend more time with assertions than any other part of Unity. + #### Unity Assertions Cheat Sheet -This document contains an abridged summary of the assertions described in the -previous document. It's perfect for printing and referencing while you + +This document contains an abridged summary of the assertions described in the +previous document. It's perfect for printing and referencing while you familiarize yourself with Unity's options. + #### Unity Configuration Guide -This document is the one to reference when you are going to use Unity with a new -target or compiler. It'll guide you through the configuration options and will + +This document is the one to reference when you are going to use Unity with a new +target or compiler. It'll guide you through the configuration options and will help you customize your testing experience to meet your needs. + #### Unity Helper Scripts -This document describes the helper scripts that are available for simplifying -your testing workflow. It describes the collection of optional Ruby scripts -included in the auto directory of your Unity installation. Neither Ruby nor -these scripts are necessary for using Unity. They are provided as a convenience + +This document describes the helper scripts that are available for simplifying +your testing workflow. It describes the collection of optional Ruby scripts +included in the auto directory of your Unity installation. Neither Ruby nor +these scripts are necessary for using Unity. They are provided as a convenience for those who wish to use them. + #### Unity License -What's an open source project without a license file? This brief document -describes the terms you're agreeing to when you use this software. Basically, we -want it to be useful to you in whatever context you want to use it, but please + +What's an open source project without a license file? This brief document +describes the terms you're agreeing to when you use this software. Basically, we +want it to be useful to you in whatever context you want to use it, but please don't blame us if you run into problems. + ### Overview of the Folders -If you have obtained Unity through Github or something similar, you might be + +If you have obtained Unity through Github or something similar, you might be surprised by just how much stuff you suddenly have staring you in the face. -Don't worry, Unity itself is very small. The rest of it is just there to make -your life easier. You can ignore it or use it at your convenience. Here's an +Don't worry, Unity itself is very small. The rest of it is just there to make +your life easier. You can ignore it or use it at your convenience. Here's an overview of everything in the project. -- `src` — This is the code you care about! This folder contains a C file and two +- `src` - This is the code you care about! This folder contains a C file and two header files. These three files _are_ Unity. -- `docs` — You're reading this document, so it's possible you have found your way -into this folder already. This is where all the handy documentation can be +- `docs` - You're reading this document, so it's possible you have found your way +into this folder already. This is where all the handy documentation can be found. -- `examples` — This contains a few examples of using Unity. -- `extras` — These are optional add ons to Unity that are not part of the core -project. If you've reached us through James Grenning's book, you're going to +- `examples` - This contains a few examples of using Unity. +- `extras` - These are optional add ons to Unity that are not part of the core +project. If you've reached us through James Grenning's book, you're going to want to look here. -- `test` — This is how Unity and its scripts are all tested. If you're just using -Unity, you'll likely never need to go in here. If you are the lucky team member -who gets to port Unity to a new toolchain, this is a good place to verify +- `test` - This is how Unity and its scripts are all tested. If you're just using +Unity, you'll likely never need to go in here. If you are the lucky team member +who gets to port Unity to a new toolchain, this is a good place to verify everything is configured properly. -- `auto` — Here you will find helpful Ruby scripts for simplifying your test +- `auto` - Here you will find helpful Ruby scripts for simplifying your test workflow. They are purely optional and are not required to make use of Unity. -## How to Create A Test File -Test files are C files. Most often you will create a single test file for each C -module that you want to test. The test file should include unity.h and the + +## How to Create A Test File + +Test files are C files. Most often you will create a single test file for each C +module that you want to test. The test file should include unity.h and the header for your C module to be tested. -Next, a test file will include a `setUp()` and `tearDown()` function. The setUp -function can contain anything you would like to run before each test. The -tearDown function can contain anything you would like to run after each test. -Both functions accept no arguments and return nothing. You may leave either or -both of these blank if you have no need for them. If you're using a compiler -that is configured to make these functions optional, you may leave them off -completely. Not sure? Give it a try. If you compiler complains that it can't -find setUp or tearDown when it links, you'll know you need to at least include +Next, a test file will include a `setUp()` and `tearDown()` function. The setUp +function can contain anything you would like to run before each test. The +tearDown function can contain anything you would like to run after each test. +Both functions accept no arguments and return nothing. You may leave either or +both of these blank if you have no need for them. If you're using a compiler +that is configured to make these functions optional, you may leave them off +completely. Not sure? Give it a try. If you compiler complains that it can't +find setUp or tearDown when it links, you'll know you need to at least include an empty function for these. -The majority of the file will be a series of test functions. Test functions -follow the convention of starting with the word "test" or "spec". You don't HAVE -to name them this way, but it makes it clear what functions are tests for other -developers. Test functions take no arguments and return nothing. All test +The majority of the file will be a series of test functions. Test functions +follow the convention of starting with the word "test" or "spec". You don't HAVE +to name them this way, but it makes it clear what functions are tests for other +developers. Test functions take no arguments and return nothing. All test accounting is handled internally in Unity. -Finally, at the bottom of your test file, you will write a `main()` function. -This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and -finally `UNITY_END()`.This is what will actually trigger each of those test -functions to run, so it is important that each function gets its own `RUN_TEST` +Finally, at the bottom of your test file, you will write a `main()` function. +This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and +finally `UNITY_END()`.This is what will actually trigger each of those test +functions to run, so it is important that each function gets its own `RUN_TEST` call. -Remembering to add each test to the main function can get to be tedious. If you -enjoy using helper scripts in your build process, you might consider making use -of our handy generate_test_runner.rb script. This will create the main function -and all the calls for you, assuming that you have followed the suggested naming -conventions. In this case, there is no need for you to include the main function +Remembering to add each test to the main function can get to be tedious. If you +enjoy using helper scripts in your build process, you might consider making use +of our handy generate_test_runner.rb script. This will create the main function +and all the calls for you, assuming that you have followed the suggested naming +conventions. In this case, there is no need for you to include the main function in your test file at all. -When you're done, your test file will look something like this: +When you're done, your test file will look something like this: ```C -#include "unity.h" -#include "file_to_test.h" - -void setUp(void) { - // set stuff up here -} - -void tearDown(void) { - // clean stuff up here -} - -void test_function_should_doBlahAndBlah(void) { - //test stuff -} - -void test_function_should_doAlsoDoBlah(void) { - //more test stuff -} - -int main(void) { - UNITY_BEGIN(); - RUN_TEST(test_function_should_doBlahAndBlah); - RUN_TEST(test_function_should_doAlsoDoBlah); - return UNITY_END(); -} +#include "unity.h" +#include "file_to_test.h" + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void test_function_should_doBlahAndBlah(void) { + //test stuff +} + +void test_function_should_doAlsoDoBlah(void) { + //more test stuff +} + +int main(void) { + UNITY_BEGIN(); + RUN_TEST(test_function_should_doBlahAndBlah); + RUN_TEST(test_function_should_doAlsoDoBlah); + return UNITY_END(); +} ``` -It's possible that you will require more customization than this, eventually. -For that sort of thing, you're going to want to look at the configuration guide. -This should be enough to get you going, though. +It's possible that you will require more customization than this, eventually. +For that sort of thing, you're going to want to look at the configuration guide. +This should be enough to get you going, though. + ## How to Build and Run A Test File -This is the single biggest challenge to picking up a new unit testing framework, -at least in a language like C or C++. These languages are REALLY good at getting -you "close to the metal" (why is the phrase metal? Wouldn't it be more accurate -to say "close to the silicon"?). While this feature is usually a good thing, it + +This is the single biggest challenge to picking up a new unit testing framework, +at least in a language like C or C++. These languages are REALLY good at getting +you "close to the metal" (why is the phrase metal? Wouldn't it be more accurate +to say "close to the silicon"?). While this feature is usually a good thing, it can make testing more challenging. -You have two really good options for toolchains. Depending on where you're -coming from, it might surprise you that neither of these options is running the +You have two really good options for toolchains. Depending on where you're +coming from, it might surprise you that neither of these options is running the unit tests on your hardware. There are many reasons for this, but here's a short version: - On hardware, you have too many constraints (processing power, memory, etc), @@ -153,19 +170,19 @@ There are many reasons for this, but here's a short version: - On hardware, unit testing is more challenging, - Unit testing isn't System testing. Keep them separate. -Instead of running your tests on your actual hardware, most developers choose to -develop them as native applications (using gcc or MSVC for example) or as -applications running on a simulator. Either is a good option. Native apps have -the advantages of being faster and easier to set up. Simulator apps have the -advantage of working with the same compiler as your target application. The +Instead of running your tests on your actual hardware, most developers choose to +develop them as native applications (using gcc or MSVC for example) or as +applications running on a simulator. Either is a good option. Native apps have +the advantages of being faster and easier to set up. Simulator apps have the +advantage of working with the same compiler as your target application. The options for configuring these are discussed in the configuration guide. -To get either to work, you might need to make a few changes to the file +To get either to work, you might need to make a few changes to the file containing your register set (discussed later). -In either case, a test is built by linking unity, the test file, and the C -file(s) being tested. These files create an executable which can be run as the -test set for that module. Then, this process is repeated for the next test file. -This flexibility of separating tests into individual executables allows us to -much more thoroughly unit test our system and it keeps all the test code out of +In either case, a test is built by linking unity, the test file, and the C +file(s) being tested. These files create an executable which can be run as the +test set for that module. Then, this process is repeated for the next test file. +This flexibility of separating tests into individual executables allows us to +much more thoroughly unit test our system and it keeps all the test code out of our final release! diff --git a/docs/UnityHelperScriptsGuide.md b/docs/UnityHelperScriptsGuide.md index 0ea498c..7ee1ac0 100644 --- a/docs/UnityHelperScriptsGuide.md +++ b/docs/UnityHelperScriptsGuide.md @@ -1,27 +1,31 @@ # Unity Helper Scripts + ## With a Little Help From Our Friends -Sometimes what it takes to be a really efficient C programmer is a little non-C. -The Unity project includes a couple Ruby scripts for making your life just a tad -easier. They are completely optional. If you choose to use them, you'll need a -copy of Ruby, of course. Just install whatever the latest version is, and it is + +Sometimes what it takes to be a really efficient C programmer is a little non-C. +The Unity project includes a couple Ruby scripts for making your life just a tad +easier. They are completely optional. If you choose to use them, you'll need a +copy of Ruby, of course. Just install whatever the latest version is, and it is likely to work. You can find Ruby at [ruby-lang.org](https://ruby-labg.org/). + ### `generate_test_runner.rb` -Are you tired of creating your own `main` function in your test file? Do you -keep forgetting to add a `RUN_TEST` call when you add a new test case to your -suite? Do you want to use CMock or other fancy add-ons but don't want to figure + +Are you tired of creating your own `main` function in your test file? Do you +keep forgetting to add a `RUN_TEST` call when you add a new test case to your +suite? Do you want to use CMock or other fancy add-ons but don't want to figure out how to create your own `RUN_TEST` macro? Well then we have the perfect script for you! -The `generate_test_runner` script processes a given test file and automatically -creates a separate test runner file that includes ?main?to execute the test -cases within the scanned test file. All you do then is add the generated runner +The `generate_test_runner` script processes a given test file and automatically +creates a separate test runner file that includes ?main?to execute the test +cases within the scanned test file. All you do then is add the generated runner to your list of files to be compiled and linked, and presto you're done! This script searches your test file for void function signatures having a -function name beginning with "test" or "spec". It treats each of these -functions as a test case and builds up a test suite of them. For example, the +function name beginning with "test" or "spec". It treats each of these +functions as a test case and builds up a test suite of them. For example, the following includes three test cases: ```C @@ -43,25 +47,25 @@ You can run this script a couple of ways. The first is from the command line: ruby generate_test_runner.rb TestFile.c NameOfRunner.c ``` -Alternatively, if you include only the test file parameter, the script will copy -the name of the test file and automatically append "_Runner" to the name of the +Alternatively, if you include only the test file parameter, the script will copy +the name of the test file and automatically append "_Runner" to the name of the generated file. The example immediately below will create TestFile_Runner.c. ```Shell ruby generate_test_runner.rb TestFile.c ``` -You can also add a [YAML](http://www.yaml.org/) file to configure extra options. -Conveniently, this YAML file is of the same format as that used by Unity and -CMock. So if you are using YAML files already, you can simply pass the very same -file into the generator script. +You can also add a [YAML](http://www.yaml.org/) file to configure extra options. +Conveniently, this YAML file is of the same format as that used by Unity and +CMock. So if you are using YAML files already, you can simply pass the very same +file into the generator script. ```Shell ruby generate_test_runner.rb TestFile.c my_config.yml ``` -The contents of the YAML file `my_config.yml` could look something like the -example below. If you're wondering what some of these options do, you're going +The contents of the YAML file `my_config.yml` could look something like the +example below. If you're wondering what some of these options do, you're going to love the next section of this document. ```YAML @@ -74,18 +78,18 @@ to love the next section of this document. :suite_teardown: "free(blah);" ``` -If you would like to force your generated test runner to include one or more -header files, you can just include those at the command line too. Just make sure +If you would like to force your generated test runner to include one or more +header files, you can just include those at the command line too. Just make sure these are _after_ the YAML file, if you are using one: ```Shell ruby generate_test_runner.rb TestFile.c my_config.yml extras.h ``` -Another option, particularly if you are already using Ruby to orchestrate your -builds - or more likely the Ruby-based build tool Rake - is requiring this -script directly. Anything that you would have specified in a YAML file can be -passed to the script as part of a hash. Let's push the exact same requirement +Another option, particularly if you are already using Ruby to orchestrate your +builds - or more likely the Ruby-based build tool Rake - is requiring this +script directly. Anything that you would have specified in a YAML file can be +passed to the script as part of a hash. Let's push the exact same requirement set as we did above but this time through Ruby code directly: ```Ruby @@ -99,8 +103,8 @@ options = { UnityTestRunnerGenerator.new.run(testfile, runner_name, options) ``` -If you have multiple files to generate in a build script (such as a Rakefile), -you might want to instantiate a generator object with your options and call it +If you have multiple files to generate in a build script (such as a Rakefile), +you might want to instantiate a generator object with your options and call it to generate each runner thereafter. Like thus: ```Ruby @@ -111,33 +115,44 @@ end ``` #### Options accepted by generate_test_runner.rb: -The following options are available when executing `generate_test_runner`. You -may pass these as a Ruby hash directly or specify them in a YAML file, both of -which are described above. In the `examples` directory, Example 3's Rakefile + +The following options are available when executing `generate_test_runner`. You +may pass these as a Ruby hash directly or specify them in a YAML file, both of +which are described above. In the `examples` directory, Example 3's Rakefile demonstrates using a Ruby hash. + ##### `:includes` -This option specifies an array of file names to be ?#include?'d at the top of -your runner C file. You might use it to reference custom types or anything else + +This option specifies an array of file names to be ?#include?'d at the top of +your runner C file. You might use it to reference custom types or anything else universally needed in your generated runners. + ##### `:suite_setup` + Define this option with C code to be executed _before any_ test cases are run. + ##### `:suite_teardown` -Define this option with C code to be executed ?after all?test cases have + +Define this option with C code to be executed ?after all?test cases have finished. + ##### `:enforce_strict_ordering` -This option should be defined if you have the strict order feature enabled in -CMock (see CMock documentation). This generates extra variables required for -everything to run smoothly. If you provide the same YAML to the generator as + +This option should be defined if you have the strict order feature enabled in +CMock (see CMock documentation). This generates extra variables required for +everything to run smoothly. If you provide the same YAML to the generator as used in CMock's configuration, you've already configured the generator properly. + ##### `:plugins` -This option specifies an array of plugins to be used (of course, the array can -contain only a single plugin). This is your opportunity to enable support for -CException support, which will add a check for unhandled exceptions in each + +This option specifies an array of plugins to be used (of course, the array can +contain only a single plugin). This is your opportunity to enable support for +CException support, which will add a check for unhandled exceptions in each test, reporting a failure if one is detected. To enable this feature using Ruby: ```Ruby @@ -151,42 +166,44 @@ Or as a yaml file: -:cexception ``` -If you are using CMock, it is very likely that you are already passing an array -of plugins to CMock. You can just use the same array here. This script will just +If you are using CMock, it is very likely that you are already passing an array +of plugins to CMock. You can just use the same array here. This script will just ignore the plugins that don't require additional support. + ### `unity_test_summary.rb` -A Unity test file contains one or more test case functions. Each test case can -pass, fail, or be ignored. Each test file is run individually producing results -for its collection of test cases. A given project will almost certainly be -composed of multiple test files. Therefore, the suite of tests is comprised of -one or more test cases spread across one or more test files. This script -aggregates individual test file results to generate a summary of all executed -test cases. The output includes how many tests were run, how many were ignored, -and how many failed. In addition, the output includes a listing of which -specific tests were ignored and failed. A good example of the breadth and -details of these results can be found in the `examples` directory. Intentionally -ignored and failing tests in this project generate corresponding entries in the + +A Unity test file contains one or more test case functions. Each test case can +pass, fail, or be ignored. Each test file is run individually producing results +for its collection of test cases. A given project will almost certainly be +composed of multiple test files. Therefore, the suite of tests is comprised of +one or more test cases spread across one or more test files. This script +aggregates individual test file results to generate a summary of all executed +test cases. The output includes how many tests were run, how many were ignored, +and how many failed. In addition, the output includes a listing of which +specific tests were ignored and failed. A good example of the breadth and +details of these results can be found in the `examples` directory. Intentionally +ignored and failing tests in this project generate corresponding entries in the summary report. -If you're interested in other (prettier?) output formats, check into the -Ceedling build tool project (ceedling.sourceforge.net) that works with Unity and +If you're interested in other (prettier?) output formats, check into the +Ceedling build tool project (ceedling.sourceforge.net) that works with Unity and CMock and supports xunit-style xml as well as other goodies. -This script assumes the existence of files ending with the extensions -`.testpass` and `.testfail`.The contents of these files includes the test -results summary corresponding to each test file executed with the extension set -according to the presence or absence of failures for that test file. The script -searches a specified path for these files, opens each one it finds, parses the -results, and aggregates and prints a summary. Calling it from the command line -looks like this: +This script assumes the existence of files ending with the extensions +`.testpass` and `.testfail`.The contents of these files includes the test +results summary corresponding to each test file executed with the extension set +according to the presence or absence of failures for that test file. The script +searches a specified path for these files, opens each one it finds, parses the +results, and aggregates and prints a summary. Calling it from the command line +looks like this: ```Shell ruby unity_test_summary.rb build/test/ ``` -You can optionally specify a root path as well. This is really helpful when you -are using relative paths in your tools' setup, but you want to pull the summary +You can optionally specify a root path as well. This is really helpful when you +are using relative paths in your tools' setup, but you want to pull the summary into an IDE like Eclipse for clickable shortcuts. ```Shell From 1e4396745ca4e5c04160343d190d611c23d7d13a Mon Sep 17 00:00:00 2001 From: toby Date: Wed, 29 Mar 2017 15:09:01 +0100 Subject: [PATCH 095/157] Add EACH_EQUAL changes --- docs/UnityAssertionsReference.md | 71 ++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/docs/UnityAssertionsReference.md b/docs/UnityAssertionsReference.md index 3a1502a..946a01b 100644 --- a/docs/UnityAssertionsReference.md +++ b/docs/UnityAssertionsReference.md @@ -127,6 +127,27 @@ Notes: and double assertions (see immediately following section). +### TEST_ASSERT_EACH_EQUAL_X Variants + +Unity provides a collection of assertions for arrays containing a variety of +types which can be compared to a single value as well. These are documented in +the Each Equal section below. these are almost on par with the `_MESSAGE` +variants of Unity's Asserts in that for pretty much any Unity type assertion you +can inject _EACH_EQUAL and run assertions on an entire block of memory. + + TEST_ASSERT_EACH_EQUAL_TYPEX( expected, actual, {size/count} ) + +"Expected" is a single value to compare to. +"Actual" is an array where each element will be compared to the expected value. +"Size/count" is one of two parameters necessary to establish the number of array +elements and perhaps the length of elements within the array. + +Notes: +- The `_MESSAGE` variant convention still applies here to Each Equal assertions. +- Assertions for handling Each Equal of floating point values are grouped with +float and double assertions (see immediately following section). + + ### Configuration #### Floating Point Support Is Optional @@ -383,6 +404,56 @@ match. Failure messages specify the array index of the failed comparison. `len` is the memory in bytes to be compared at each array element. +### Each Equal (Arrays to Single Value) + +`expected` are single values and `actual` are arrays. `num_elements` specifies +the number of elements in the arrays to compare. + +`_HEX` assertions produce failure messages with expected and actual array +contents formatted in hexadecimal. + +Assertions fail upon the first element in the compared arrays found not to +match. Failure messages specify the array index of the failed comparison. + +#### `TEST_ASSERT_EACH_EQUAL_INT (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_INT8 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_INT16 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_INT32 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_INT64 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT8 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT16 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT32 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_UINT64 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX8 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX16 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX32 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_HEX64 (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_PTR (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_STRING (expected, actual, num_elements)` + +#### `TEST_ASSERT_EACH_EQUAL_MEMORY (expected, actual, len, num_elements)` + +`len` is the memory in bytes to be compared at each array element. + + ### Floating Point (If enabled) ##### `TEST_ASSERT_FLOAT_WITHIN (delta, expected, actual)` From b8bfb01edf2892d1661455b77eab5a37572ed6a9 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Wed, 29 Mar 2017 19:23:12 -0400 Subject: [PATCH 096/157] =?UTF-8?q?Add=20support=20for=20AStyle=20in=20tes?= =?UTF-8?q?t=20makefile.=20It=E2=80=99s=20going=20to=20assume=20you=20have?= =?UTF-8?q?=20it=20installed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/rakefile | 21 +++++++++++++++++++-- test/rakefile_helper.rb | 12 ++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/test/rakefile b/test/rakefile index 9bcf230..4a2f3d2 100644 --- a/test/rakefile +++ b/test/rakefile @@ -76,18 +76,35 @@ namespace :style do task :check do report "\nVERIFYING RUBY STYLE" report execute("rubocop ../auto ../examples ../extras --config .rubocop.yml", true) - report "Style PASSED." + report "Styling Ruby:PASS" end namespace :check do Dir['../**/*.rb'].each do |f| - task File.basename(f, '.rb').to_sym => ['style:clean'] do + filename = File.basename(f, '.rb') + desc "Check Style of #{filename}" + task filename.to_sym => ['style:clean'] do report execute("rubocop #{f} --color --config .rubocop.yml", true) report "Style Checked for #{f}" end end end + desc "Fix Style of all C Code" + task :c do + run_astyle("../src/*.* ../extras/fixture/src/*.*") + end + + namespace :c do + Dir['../{src,extras/**}/*.{c,h}'].each do |f| + filename = File.basename(f)[0..-3] + desc "Check Style of #{filename}" + task filename.to_sym do + run_astyle f + end + end + end + desc "Attempt to Autocorrect style" task :auto => ['style:clean'] do execute("rubocop ../auto ../examples ../extras --auto-correct --config .rubocop.yml") diff --git a/test/rakefile_helper.rb b/test/rakefile_helper.rb index 410da7f..be5bf3e 100644 --- a/test/rakefile_helper.rb +++ b/test/rakefile_helper.rb @@ -157,6 +157,18 @@ module RakefileHelpers { :command => command, :pre_support => pre_support, :post_support => post_support } end + def run_astyle(style_what) + report "Styling C Code..." + command = "AStyle " \ + "--style=allman --indent=spaces=4 --indent-switches --indent-preproc-define --indent-preproc-block " \ + "--pad-oper --pad-comma --unpad-paren --pad-header " \ + "--align-pointer=type --align-reference=name " \ + "--add-brackets --mode=c --suffix=none " \ + "#{style_what}" + execute(command, false) + report "Styling C:PASS" + end + def execute(command_string, ok_to_fail = false) report command_string if $verbose output = `#{command_string}`.chomp From 2c7629a0ae90ffe991b5fd08e4db8672f72ed64c Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Fri, 7 Apr 2017 13:14:32 -0400 Subject: [PATCH 097/157] Documentation Updates --- docs/ThrowTheSwitchCodingStandard.md | 8 ++++++-- docs/UnityAssertionsReference.md | 19 +++++++++++-------- docs/UnityConfigurationGuide.md | 5 ++++- docs/UnityGettingStartedGuide.md | 3 +++ docs/UnityHelperScriptsGuide.md | 3 +++ 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/docs/ThrowTheSwitchCodingStandard.md b/docs/ThrowTheSwitchCodingStandard.md index 6c6704d..a85adef 100644 --- a/docs/ThrowTheSwitchCodingStandard.md +++ b/docs/ThrowTheSwitchCodingStandard.md @@ -3,8 +3,9 @@ Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part, we try to follow these standards to unify our contributors' code into a cohesive unit (puns intended). You might find places where these standards aren't -followed. We're not perfect. Please be polite where -you notice these discrepancies and we'll try to be polite when we notice yours. +followed. We're not perfect. Please be polite where you notice these discrepancies +and we'll try to be polite when we notice yours. + ;) @@ -201,3 +202,6 @@ that happens, we like to indent further to line things up in nice tidy columns. Egad. Really? We use markdown and we like pdf files because they can be made to look nice while still being portable. Good enough? + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityAssertionsReference.md b/docs/UnityAssertionsReference.md index 946a01b..558f6db 100644 --- a/docs/UnityAssertionsReference.md +++ b/docs/UnityAssertionsReference.md @@ -129,9 +129,9 @@ and double assertions (see immediately following section). ### TEST_ASSERT_EACH_EQUAL_X Variants -Unity provides a collection of assertions for arrays containing a variety of -types which can be compared to a single value as well. These are documented in -the Each Equal section below. these are almost on par with the `_MESSAGE` +Unity provides a collection of assertions for arrays containing a variety of +types which can be compared to a single value as well. These are documented in +the Each Equal section below. these are almost on par with the `_MESSAGE` variants of Unity's Asserts in that for pretty much any Unity type assertion you can inject _EACH_EQUAL and run assertions on an entire block of memory. @@ -139,12 +139,12 @@ can inject _EACH_EQUAL and run assertions on an entire block of memory. "Expected" is a single value to compare to. "Actual" is an array where each element will be compared to the expected value. -"Size/count" is one of two parameters necessary to establish the number of array +"Size/count" is one of two parameters necessary to establish the number of array elements and perhaps the length of elements within the array. Notes: - The `_MESSAGE` variant convention still applies here to Each Equal assertions. -- Assertions for handling Each Equal of floating point values are grouped with +- Assertions for handling Each Equal of floating point values are grouped with float and double assertions (see immediately following section). @@ -409,10 +409,10 @@ match. Failure messages specify the array index of the failed comparison. `expected` are single values and `actual` are arrays. `num_elements` specifies the number of elements in the arrays to compare. -`_HEX` assertions produce failure messages with expected and actual array +`_HEX` assertions produce failure messages with expected and actual array contents formatted in hexadecimal. -Assertions fail upon the first element in the compared arrays found not to +Assertions fail upon the first element in the compared arrays found not to match. Failure messages specify the array index of the failed comparison. #### `TEST_ASSERT_EACH_EQUAL_INT (expected, actual, num_elements)` @@ -710,4 +710,7 @@ with zeros. 2. You're going to have to be careful of assertions that perform signed operations, particularly `TEST_ASSERT_INT_WITHIN`.Such assertions might wrap your `int` in the wrong place, and you could experience false failures. You can -always back down to a simple `TEST_ASSERT` and do the operations yourself. \ No newline at end of file +always back down to a simple `TEST_ASSERT` and do the operations yourself. + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityConfigurationGuide.md b/docs/UnityConfigurationGuide.md index 9338bce..283d779 100644 --- a/docs/UnityConfigurationGuide.md +++ b/docs/UnityConfigurationGuide.md @@ -392,4 +392,7 @@ every single test case throughout your entire suite of tests. The defines and macros in this guide should help you port Unity to just about any C target we can imagine. If you run into a snag or two, don't be afraid of -asking for help on the forums. We love a good challenge! \ No newline at end of file +asking for help on the forums. We love a good challenge! + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityGettingStartedGuide.md b/docs/UnityGettingStartedGuide.md index 58ef400..50fc91c 100644 --- a/docs/UnityGettingStartedGuide.md +++ b/docs/UnityGettingStartedGuide.md @@ -186,3 +186,6 @@ test set for that module. Then, this process is repeated for the next test file. This flexibility of separating tests into individual executables allows us to much more thoroughly unit test our system and it keeps all the test code out of our final release! + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* diff --git a/docs/UnityHelperScriptsGuide.md b/docs/UnityHelperScriptsGuide.md index 7ee1ac0..3a93009 100644 --- a/docs/UnityHelperScriptsGuide.md +++ b/docs/UnityHelperScriptsGuide.md @@ -237,3 +237,6 @@ OVERALL UNITY TEST SUMMARY ``` How convenient is that? + + +*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)* From f96c05532b3e00c9ca77e58fc07f9401cd46510d Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 25 Apr 2017 08:17:37 -0400 Subject: [PATCH 098/157] this is a minor release --- release/version.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/version.info b/release/version.info index 0f19985..3b904b6 100644 --- a/release/version.info +++ b/release/version.info @@ -1,2 +1,2 @@ -2.4.0 +2.4.1 From aef36799d84366e4a26e6586f43785e0adab46c8 Mon Sep 17 00:00:00 2001 From: Rasmus Melchior Jacobsen Date: Wed, 10 May 2017 14:28:08 +0200 Subject: [PATCH 099/157] Fixed UNITY_TEST_ASSERT_EACH_EQUAL_* Fixed copy-paste error for: - UNITY_TEST_ASSERT_EACH_EQUAL_INT64 - UNITY_TEST_ASSERT_EACH_EQUAL_UINT64 - UNITY_TEST_ASSERT_EACH_EQUAL_HEX64 So that the comparison is done on the expected _value_ instead of the _array_. --- src/unity_internals.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/unity_internals.h b/src/unity_internals.h index cc20ea4..c08db95 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -706,9 +706,9 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)expected, 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_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) From f2fdf1a133e3b8a0ab42129d9b0485968022f82e Mon Sep 17 00:00:00 2001 From: Dom Postorivo Date: Sat, 13 May 2017 15:59:51 -0400 Subject: [PATCH 100/157] Added Greater than and Less than asserts from other PR --- README.md | 11 + docs/UnityAssertionsReference.md | 54 ++++ src/unity.c | 46 ++++ src/unity.h | 60 +++++ src/unity_internals.h | 40 +++ test/tests/testunity.c | 412 ++++++++++++++++++++++++++++++- 6 files changed, 622 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 17ab574..ec73b4a 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,17 @@ Another way of calling TEST_ASSERT_EQUAL_INT Asserts that the actual value is within plus or minus delta of the expected value. This also comes in size specific variants. + + TEST_ASSERT_GREATER_THAN(threshold, actual) + +Asserts that the actual value is greater than the threshold. This also comes in size specific variants. + + + TEST_ASSERT_LESS_THAN(threshold, actual) + +Asserts that the actual value is less than the threshold. This also comes in size specific variants. + + Arrays ------ diff --git a/docs/UnityAssertionsReference.md b/docs/UnityAssertionsReference.md index 558f6db..2dcf5e3 100644 --- a/docs/UnityAssertionsReference.md +++ b/docs/UnityAssertionsReference.md @@ -290,6 +290,60 @@ Asserts the specified bit of the `actual` parameter is high. Asserts the specified bit of the `actual` parameter is low. +### Integer Less Than / Greater Than + +These assertions verify that the `actual` parameter is less than or greater +than `threshold` (exclusive). For example, if the threshold value is 0 for the +greater than assertion will fail if it is 0 or less. + +##### `TEST_ASSERT_GREATER_THAN (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_INT (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_INT8 (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_INT16 (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_INT32 (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_UINT (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_UINT8 (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_UINT16 (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_UINT32 (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_HEX8 (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_HEX16 (threshold, actual)` + +##### `TEST_ASSERT_GREATER_THAN_HEX32 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_INT (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_INT8 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_INT16 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_INT32 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_UINT (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_UINT8 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_UINT16 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_UINT32 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_HEX8 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_HEX16 (threshold, actual)` + +##### `TEST_ASSERT_LESS_THAN_HEX32 (threshold, actual)` + ### Integer Ranges (of all sizes) diff --git a/src/unity.c b/src/unity.c index 177af0f..e4ad519 100644 --- a/src/unity.c +++ b/src/unity.c @@ -27,6 +27,8 @@ static const char UnityStrNull[] = "NULL"; static const char UnityStrSpacer[] = ". "; static const char UnityStrExpected[] = " Expected "; static const char UnityStrWas[] = " Was "; +static const char UnityStrGt[] = " to be greater than "; +static const char UnityStrLt[] = " to be less than "; static const char UnityStrElement[] = " Element "; static const char UnityStrByte[] = " Byte "; static const char UnityStrMemory[] = " Memory Mismatch."; @@ -526,6 +528,50 @@ void UnityAssertEqualNumber(const UNITY_INT expected, } } +/*-----------------------------------------------*/ +void UnityAssertGreaterNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (!(actual > threshold)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(actual, style); + UnityPrint(UnityStrGt); + UnityPrintNumberByStyle(threshold, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertSmallerNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (!(actual < threshold)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(actual, style); + UnityPrint(UnityStrLt); + UnityPrintNumberByStyle(threshold, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + + + #define UnityPrintPointlessAndBail() \ { \ UnityTestResultsFailBegin(lineNumber); \ diff --git a/src/unity.h b/src/unity.h index 6434238..258e21c 100644 --- a/src/unity.h +++ b/src/unity.h @@ -114,6 +114,35 @@ void tearDown(void); #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 Greater Than/ Less Than (of all sizes) */ +#define TEST_ASSERT_GREATER_THAN(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, NULL) + + +#define TEST_ASSERT_LESS_THAN(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (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) #define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) @@ -157,6 +186,8 @@ void tearDown(void); #define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) + + /* Arrays Compared To Single Value */ #define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) @@ -241,6 +272,35 @@ void tearDown(void); #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 Greater Than/ Less Than (of all sizes) */ +#define TEST_ASSERT_GREATER_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, (message)) + + +#define TEST_ASSERT_LESS_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (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)) #define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) diff --git a/src/unity_internals.h b/src/unity_internals.h index cc20ea4..5420aba 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -455,6 +455,18 @@ void UnityAssertEqualNumber(const UNITY_INT expected, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style); +void UnityAssertGreaterNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertSmallerNumber(const UNITY_INT threshold, + 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 UNITY_UINT32 num_elements, @@ -652,6 +664,34 @@ int UnityTestMatches(void); #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_GREATER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) + + +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT8(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT16(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT32(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT8(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT16(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT32(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX8(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(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) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 3555fb2..320f22c 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -764,8 +764,9 @@ void testNotEqualBitsLow(void) EXPECT_ABORT_BEGIN TEST_ASSERT_BITS_LOW(v0, v1); VERIFY_FAILS_END - } + + void testEqualShorts(void) { short v0, v1; @@ -1305,6 +1306,415 @@ void testINT8sNotWithinDeltaAndCustomMessage(void) VERIFY_FAILS_END } + +//----------------- +void testGreaterThan(void) +{ + UNITY_INT v0, v1; + UNITY_INT *p0, *p1; + + v0 = 0; + v1 = 1; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN(v0, v1); + TEST_ASSERT_GREATER_THAN(*p0, v1); + TEST_ASSERT_GREATER_THAN(v0, *p1); + TEST_ASSERT_GREATER_THAN(*p0, *p1); +} + +void testGreaterThanINT(void) +{ + UNITY_INT v0, v1; + UNITY_INT *p0, *p1; + + v0 = 302; + v1 = 3334; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_INT(v0, v1); + TEST_ASSERT_GREATER_THAN_INT(*p0, v1); + TEST_ASSERT_GREATER_THAN_INT(v0, *p1); + TEST_ASSERT_GREATER_THAN_INT(*p0, *p1); +} + + +void testGreaterThanINT8(void) +{ + UNITY_INT8 v0, v1; + UNITY_INT8 *p0, *p1; + + v0 = -128; + v1 = 127; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_INT8(v0, v1); + TEST_ASSERT_GREATER_THAN_INT8(*p0, v1); + TEST_ASSERT_GREATER_THAN_INT8(v0, *p1); + TEST_ASSERT_GREATER_THAN_INT8(*p0, *p1); +} + +void testGreaterThanINT16(void) +{ + UNITY_INT16 v0, v1; + UNITY_INT16 *p0, *p1; + + v0 = -32768; + v1 = 32767; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_INT16(v0, v1); + TEST_ASSERT_GREATER_THAN_INT16(*p0, v1); + TEST_ASSERT_GREATER_THAN_INT16(v0, *p1); + TEST_ASSERT_GREATER_THAN_INT16(*p0, *p1); +} + +void testGreaterThanINT32(void) +{ + UNITY_INT32 v0, v1; + UNITY_INT32 *p0, *p1; + + v0 = -214783648; + v1 = 214783647; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_INT32(v0, v1); + TEST_ASSERT_GREATER_THAN_INT32(*p0, v1); + TEST_ASSERT_GREATER_THAN_INT32(v0, *p1); + TEST_ASSERT_GREATER_THAN_INT32(*p0, *p1); +} + +void testGreaterThanUINT(void) +{ + UNITY_UINT v0, v1; + UNITY_UINT *p0, *p1; + + v0 = 0; + v1 = 1; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_UINT(v0, v1); + TEST_ASSERT_GREATER_THAN_UINT(*p0, v1); + TEST_ASSERT_GREATER_THAN_UINT(v0, *p1); + TEST_ASSERT_GREATER_THAN_UINT(*p0, *p1); +} + + +void testGreaterThanUINT8(void) +{ + UNITY_UINT8 v0, v1; + UNITY_UINT8 *p0, *p1; + + v0 = 0; + v1 = 255; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_UINT8(v0, v1); + TEST_ASSERT_GREATER_THAN_UINT8(*p0, v1); + TEST_ASSERT_GREATER_THAN_UINT8(v0, *p1); + TEST_ASSERT_GREATER_THAN_UINT8(*p0, *p1); +} + +void testGreaterThanUINT16(void) +{ + UNITY_UINT16 v0, v1; + UNITY_UINT16 *p0, *p1; + + v0 = 0; + v1 = 65535; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_UINT16(v0, v1); + TEST_ASSERT_GREATER_THAN_UINT16(*p0, v1); + TEST_ASSERT_GREATER_THAN_UINT16(v0, *p1); + TEST_ASSERT_GREATER_THAN_UINT16(*p0, *p1); +} + +void testGreaterThanUINT32(void) +{ + UNITY_UINT32 v0, v1; + UNITY_UINT32 *p0, *p1; + + v0 = 0; + v1 = 4294967295; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_UINT32(v0, v1); + TEST_ASSERT_GREATER_THAN_UINT32(*p0, v1); + TEST_ASSERT_GREATER_THAN_UINT32(v0, *p1); + TEST_ASSERT_GREATER_THAN_UINT32(*p0, *p1); +} + +void testGreaterThanHEX8(void) +{ + UNITY_UINT8 v0, v1; + UNITY_UINT8 *p0, *p1; + + v0 = 0x00; + v1 = 0xFF; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_HEX8(v0, v1); + TEST_ASSERT_GREATER_THAN_HEX8(*p0, v1); + TEST_ASSERT_GREATER_THAN_HEX8(v0, *p1); + TEST_ASSERT_GREATER_THAN_HEX8(*p0, *p1); +} + +void testGreaterThanHEX16(void) +{ + UNITY_UINT16 v0, v1; + UNITY_UINT16 *p0, *p1; + + v0 = 0x0000; + v1 = 0xFFFF; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_HEX16(v0, v1); + TEST_ASSERT_GREATER_THAN_HEX16(*p0, v1); + TEST_ASSERT_GREATER_THAN_HEX16(v0, *p1); + TEST_ASSERT_GREATER_THAN_HEX16(*p0, *p1); +} + +void testGreaterThanHEX32(void) +{ + UNITY_UINT32 v0, v1; + UNITY_UINT32 *p0, *p1; + + v0 = 0x00000000; + v1 = 0xFFFFFFFF; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_GREATER_THAN_HEX32(v0, v1); + TEST_ASSERT_GREATER_THAN_HEX32(*p0, v1); + TEST_ASSERT_GREATER_THAN_HEX32(v0, *p1); + TEST_ASSERT_GREATER_THAN_HEX32(*p0, *p1); +} + + +void testNotGreaterThan(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_GREATER_THAN(0, -1); + VERIFY_FAILS_END +} + +void testLessThan(void) +{ + UNITY_INT v0, v1; + UNITY_INT *p0, *p1; + + v0 = 0; + v1 = -1; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN(v0, v1); + TEST_ASSERT_LESS_THAN(*p0, v1); + TEST_ASSERT_LESS_THAN(v0, *p1); + TEST_ASSERT_LESS_THAN(*p0, *p1); +} + +void testLessThanINT(void) +{ + UNITY_INT v0, v1; + UNITY_INT *p0, *p1; + + v0 = 3334; + v1 = 302; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_INT(v0, v1); + TEST_ASSERT_LESS_THAN_INT(*p0, v1); + TEST_ASSERT_LESS_THAN_INT(v0, *p1); + TEST_ASSERT_LESS_THAN_INT(*p0, *p1); +} + + +void testLessThanINT8(void) +{ + UNITY_INT8 v0, v1; + UNITY_INT8 *p0, *p1; + + v0 = 127; + v1 = -128; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_INT8(v0, v1); + TEST_ASSERT_LESS_THAN_INT8(*p0, v1); + TEST_ASSERT_LESS_THAN_INT8(v0, *p1); + TEST_ASSERT_LESS_THAN_INT8(*p0, *p1); +} + +void testLessThanINT16(void) +{ + UNITY_INT16 v0, v1; + UNITY_INT16 *p0, *p1; + + v0 = 32767; + v1 = -32768; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_INT16(v0, v1); + TEST_ASSERT_LESS_THAN_INT16(*p0, v1); + TEST_ASSERT_LESS_THAN_INT16(v0, *p1); + TEST_ASSERT_LESS_THAN_INT16(*p0, *p1); +} + +void testLessThanINT32(void) +{ + UNITY_INT32 v0, v1; + UNITY_INT32 *p0, *p1; + + v0 = 214783647; + v1 = -214783648; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_INT32(v0, v1); + TEST_ASSERT_LESS_THAN_INT32(*p0, v1); + TEST_ASSERT_LESS_THAN_INT32(v0, *p1); + TEST_ASSERT_LESS_THAN_INT32(*p0, *p1); +} + +void testLessThanUINT(void) +{ + UNITY_UINT v0, v1; + UNITY_UINT *p0, *p1; + + v0 = 1; + v1 = 0; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_UINT(v0, v1); + TEST_ASSERT_LESS_THAN_UINT(*p0, v1); + TEST_ASSERT_LESS_THAN_UINT(v0, *p1); + TEST_ASSERT_LESS_THAN_UINT(*p0, *p1); +} + + +void testLessThanUINT8(void) +{ + UNITY_UINT8 v0, v1; + UNITY_UINT8 *p0, *p1; + + v0 = 255; + v1 = 0; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_UINT8(v0, v1); + TEST_ASSERT_LESS_THAN_UINT8(*p0, v1); + TEST_ASSERT_LESS_THAN_UINT8(v0, *p1); + TEST_ASSERT_LESS_THAN_UINT8(*p0, *p1); +} + +void testLessThanUINT16(void) +{ + UNITY_UINT16 v0, v1; + UNITY_UINT16 *p0, *p1; + + v0 = 65535; + v1 = 0; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_UINT16(v0, v1); + TEST_ASSERT_LESS_THAN_UINT16(*p0, v1); + TEST_ASSERT_LESS_THAN_UINT16(v0, *p1); + TEST_ASSERT_LESS_THAN_UINT16(*p0, *p1); +} + +void testLessThanUINT32(void) +{ + UNITY_UINT32 v0, v1; + UNITY_UINT32 *p0, *p1; + + v0 = 4294967295; + v1 = 0; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_UINT32(v0, v1); + TEST_ASSERT_LESS_THAN_UINT32(*p0, v1); + TEST_ASSERT_LESS_THAN_UINT32(v0, *p1); + TEST_ASSERT_LESS_THAN_UINT32(*p0, *p1); +} + +void testLessThanHEX8(void) +{ + UNITY_UINT8 v0, v1; + UNITY_UINT8 *p0, *p1; + + v0 = 0xFF; + v1 = 0x00; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_HEX8(v0, v1); + TEST_ASSERT_LESS_THAN_HEX8(*p0, v1); + TEST_ASSERT_LESS_THAN_HEX8(v0, *p1); + TEST_ASSERT_LESS_THAN_HEX8(*p0, *p1); +} + +void testLessThanHEX16(void) +{ + UNITY_UINT16 v0, v1; + UNITY_UINT16 *p0, *p1; + + v0 = 0xFFFF; + v1 = 0x0000; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_HEX16(v0, v1); + TEST_ASSERT_LESS_THAN_HEX16(*p0, v1); + TEST_ASSERT_LESS_THAN_HEX16(v0, *p1); + TEST_ASSERT_LESS_THAN_HEX16(*p0, *p1); +} + +void testLessThanHEX32(void) +{ + UNITY_UINT32 v0, v1; + UNITY_UINT32 *p0, *p1; + + v0 = 0xFFFFFFFF; + v1 = 0x00000000; + p0 = &v0; + p1 = &v1; + + TEST_ASSERT_LESS_THAN_HEX32(v0, v1); + TEST_ASSERT_LESS_THAN_HEX32(*p0, v1); + TEST_ASSERT_LESS_THAN_HEX32(v0, *p1); + TEST_ASSERT_LESS_THAN_HEX32(*p0, *p1); +} + + +void testNotLessThan(void) +{ + EXPECT_ABORT_BEGIN + TEST_ASSERT_LESS_THAN(0, 1); + VERIFY_FAILS_END +} + + + +//----------------- void testEqualStrings(void) { const char *testString = "foo"; From c1bc32dc58d13df092d5d2037ce8b169d275199f Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Sun, 25 Jun 2017 13:58:31 -0400 Subject: [PATCH 101/157] - Generator will not change names by default - Fixed some style issues. --- auto/colour_prompt.rb | 2 +- auto/generate_module.rb | 6 +++--- auto/stylize_as_junit.rb | 0 examples/example_3/rakefile.rb | 4 ++-- extras/fixture/rakefile.rb | 8 ++++---- 5 files changed, 10 insertions(+), 10 deletions(-) mode change 100644 => 100755 auto/stylize_as_junit.rb diff --git a/auto/colour_prompt.rb b/auto/colour_prompt.rb index 0f1dc4e..c861807 100644 --- a/auto/colour_prompt.rb +++ b/auto/colour_prompt.rb @@ -24,7 +24,7 @@ class ColourCommandLine return unless RUBY_PLATFORM =~ /(win|w)32$/ get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') @set_console_txt_attrb = - Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') + Win32API.new('kernel32', 'SetConsoleTextAttribute', %w[L N], 'I') @hout = get_std_handle.call(-11) end diff --git a/auto/generate_module.rb b/auto/generate_module.rb index ade4f1a..13b4cc7 100644 --- a/auto/generate_module.rb +++ b/auto/generate_module.rb @@ -172,7 +172,7 @@ class UnityModuleGenerator when 'camel' then part1 when 'snake' then part1.downcase when 'caps' then part1.upcase - else part1.downcase + else part1 end else case (@options[:naming]) @@ -180,7 +180,7 @@ class UnityModuleGenerator when 'camel' then part1 + part2 when 'snake' then part1.downcase + '_' + part2.downcase when 'caps' then part1.upcase + '_' + part2.upcase - else part1.downcase + '_' + part2.downcase + else part1 + '_' + part2 end end end @@ -290,7 +290,7 @@ if $0 == __FILE__ ' -n"camel" sets the file naming convention.', ' bumpy - BumpyCaseFilenames.', ' camel - camelCaseFilenames.', - ' snake - snake_case_filenames. (DEFAULT)', + ' snake - snake_case_filenames.', ' caps - CAPS_CASE_FILENAMES.', ' -u update subversion too (requires subversion command line)', ' -y"my.yml" selects a different yaml config file for module generation', diff --git a/auto/stylize_as_junit.rb b/auto/stylize_as_junit.rb old mode 100644 new mode 100755 diff --git a/examples/example_3/rakefile.rb b/examples/example_3/rakefile.rb index bf9f42b..8bedd4f 100644 --- a/examples/example_3/rakefile.rb +++ b/examples/example_3/rakefile.rb @@ -32,8 +32,8 @@ task :summary do end desc 'Build and test Unity' -task all: %i(clean unit summary) -task default: %i(clobber all) +task all: %i[clean unit summary] +task default: %i[clobber all] task ci: [:default] task cruise: [:default] diff --git a/extras/fixture/rakefile.rb b/extras/fixture/rakefile.rb index 7603e57..8528afc 100644 --- a/extras/fixture/rakefile.rb +++ b/extras/fixture/rakefile.rb @@ -33,10 +33,10 @@ task unit: [:prepare_for_tests] do end desc 'Build and test Unity Framework' -task all: %i(clean unit) -task default: %i(clobber all) -task ci: %i(no_color default) -task cruise: %i(no_color default) +task all: %i[clean unit] +task default: %i[clobber all] +task ci: %i[no_color default] +task cruise: %i[no_color default] desc 'Load configuration' task :config, :config_file do |_t, args| From a07d07cd1a2726b6d798f5b0bb3d9123dd63ab59 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Tue, 1 Aug 2017 21:49:38 +0300 Subject: [PATCH 102/157] Allow specifying custom header declaration The user can specify UNITY_OUTPUT_CHAR_HEADER_DECLARATION and UNITY_OUTPUT_FLUSH_HEADER_DECLARATION when he would like to declare UNITY_OUTPUT_CHAT or UNITY_OUTPUT_FLUSH respectivly --- examples/unity_config.h | 10 ++++++---- src/unity_internals.h | 14 +++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/examples/unity_config.h b/examples/unity_config.h index 355d9bf..da3c2af 100644 --- a/examples/unity_config.h +++ b/examples/unity_config.h @@ -201,10 +201,12 @@ * `stdout` option. You decide to route your test result output to a custom * serial `RS232_putc()` function you wrote like thus: */ -/* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ -/* #define UNITY_OUTPUT_FLUSH() RS232_flush() */ -/* #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) */ -/* #define UNITY_OUTPUT_COMPLETE() RS232_close() */ +/* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ +/* #define UNITY_OUTPUT_CHAR_HEADER_DECLARATION RS232_putc(int) */ +/* #define UNITY_OUTPUT_FLUSH() RS232_flush() */ +/* #define UNITY_OUTPUT_FLUSH_HEADER_DECLARATION RS232_flush(void) */ +/* #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 * `tearDown()` functions optional. This is a nice convenience for test writers diff --git a/src/unity_internals.h b/src/unity_internals.h index c08db95..9504451 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -246,8 +246,8 @@ typedef UNITY_FLOAT_TYPE UNITY_FLOAT; #define UNITY_OUTPUT_CHAR(a) (void)putchar(a) #else /* If defined as something else, make sure we declare it here so it's ready for use */ - #ifndef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION -extern void UNITY_OUTPUT_CHAR(int); + #ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION +extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; #endif #endif @@ -255,22 +255,22 @@ extern void UNITY_OUTPUT_CHAR(int); #ifdef UNITY_USE_FLUSH_STDOUT /* We want to use the stdout flush utility */ #include -#define UNITY_OUTPUT_FLUSH (void)fflush(stdout) +#define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) #else /* We've specified nothing, therefore flush should just be ignored */ -#define UNITY_OUTPUT_FLUSH +#define UNITY_OUTPUT_FLUSH() #endif #else /* We've defined flush as something else, so make sure we declare it here so it's ready for use */ -#ifndef UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION -extern void UNITY_OUTPUT_FLUSH(void); +#ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION +extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION; #endif #endif #ifndef UNITY_OUTPUT_FLUSH #define UNITY_FLUSH_CALL() #else -#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH +#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH() #endif #ifndef UNITY_PRINT_EOL From 59182c4ea963103915a4e0290edfee18e2ef3e7c Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Tue, 1 Aug 2017 22:56:52 +0300 Subject: [PATCH 103/157] Add UNITY_OUTPUT_CHAR_HEADER_DECLARATION to tests Makefile defines --- test/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Makefile b/test/Makefile index 03b59bc..9de7a49 100644 --- a/test/Makefile +++ b/test/Makefile @@ -14,6 +14,7 @@ CFLAGS += -Wbad-function-cast -Wcast-qual -Wold-style-definition -Wshadow -Wstri #DEBUG = -O0 -g CFLAGS += $(DEBUG) DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy +DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\) DEFINES += -D UNITY_SUPPORT_64 -D UNITY_INCLUDE_DOUBLE SRC = ../src/unity.c tests/testunity.c build/testunityRunner.c INC_DIR = -I ../src From b3de931d697e40987d180730a441f9c7ce062784 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Tue, 1 Aug 2017 23:36:13 +0300 Subject: [PATCH 104/157] Add UNITY_OUTPUT_CHAR_HEADER_DECLARATION to fixture tests Makefile defines --- extras/fixture/test/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/fixture/test/Makefile b/extras/fixture/test/Makefile index 80e124f..e6c6255 100644 --- a/extras/fixture/test/Makefile +++ b/extras/fixture/test/Makefile @@ -6,6 +6,7 @@ endif CFLAGS += -std=c99 -pedantic -Wall -Wextra -Werror CFLAGS += $(DEBUG) DEFINES = -D UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar +DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=UnityOutputCharSpy_OutputChar\(int\) SRC = ../src/unity_fixture.c \ ../../../src/unity.c \ unity_fixture_Test.c \ From ad373024f28b1efbfca6f5178f9ee4c612d5b4d6 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Fri, 4 Aug 2017 14:40:34 +0300 Subject: [PATCH 105/157] Add UNITY_OUTPUT_CHAR_HEADER_DECLARATION to tests rakefile_helper.rb --- test/rakefile_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/rakefile_helper.rb b/test/rakefile_helper.rb index be5bf3e..1fd60c5 100644 --- a/test/rakefile_helper.rb +++ b/test/rakefile_helper.rb @@ -91,7 +91,7 @@ module RakefileHelpers defines = if $cfg['compiler']['defines']['items'].nil? '' else - squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'] + inject_defines) + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy'] + ['UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\)'] + inject_defines) end options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) From e56378e4376fe1764cc42ad05f1a42f24cb11404 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Fri, 4 Aug 2017 14:43:14 +0300 Subject: [PATCH 106/157] Add UNITY_OUTPUT_CHAR_HEADER_DECLARATION to fixture tests rakefile_helper.rb --- extras/fixture/rakefile_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/fixture/rakefile_helper.rb b/extras/fixture/rakefile_helper.rb index 5aa8e56..c45b239 100644 --- a/extras/fixture/rakefile_helper.rb +++ b/extras/fixture/rakefile_helper.rb @@ -53,7 +53,7 @@ module RakefileHelpers defines = if $cfg['compiler']['defines']['items'].nil? '' else - squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar']) + squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar'] + ['UNITY_OUTPUT_CHAR_HEADER_DECLARATION=UnityOutputCharSpy_OutputChar\(int\)']) end options = squash('', $cfg['compiler']['options']) includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) From 0e7eb545b9dd3f2337ff2460188604ce67c44259 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Fri, 25 Aug 2017 14:22:35 -0400 Subject: [PATCH 107/157] Rewrite UnityPrintFloat to match printf("%.6g"). The existing implementation was not very good: - It printed all very small values as "0.000000..." - It did not distinguish positive and negative zero - In some cases it printed extra garbage digits for single-precision values (e.g. 3.9e+30 was printed as 3.90000013+30) Tests have been updated to check that we now match printf("%.6g") for 1,000,000 randomly chosen values, except for rounding of the 6th digit. --- src/unity.c | 153 ++++++++++++------------ test/tests/testunity.c | 262 +++++++++++++++-------------------------- 2 files changed, 173 insertions(+), 242 deletions(-) diff --git a/src/unity.c b/src/unity.c index 177af0f..d5f26cf 100644 --- a/src/unity.c +++ b/src/unity.c @@ -235,95 +235,96 @@ void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) /*-----------------------------------------------*/ #ifndef UNITY_EXCLUDE_FLOAT_PRINT -static void UnityPrintDecimalAndNumberWithLeadingZeros(UNITY_INT32 fraction_part, UNITY_INT32 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 */ - } -} -#ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO -/* 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(orig, num_int, num) /* Remove macro */ -#endif - -/* 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: UNITY_DOUBLE param 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); - */ +/* This function prints a floating-point value in a format similar to + * printf("%.6g"). It can work with either single- or double-precision, + * but for simplicity, it prints only 6 significant digits in either case. + * Printing more than 6 digits accurately is hard (at least in the single- + * precision case) and isn't attempted here. */ void UnityPrintFloat(const UNITY_DOUBLE input_number) { - UNITY_DOUBLE number; + UNITY_DOUBLE number = input_number; - if (input_number < 0) + /* print minus sign (including for negative zero) */ + if (number < 0.0f || (number == 0.0f && 1.0f / number < 0.0f)) { UNITY_OUTPUT_CHAR('-'); - number = -input_number; - } else - { - number = input_number; + number = -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 */ - else if (number < 4294967295.9999995) /* Rounded result fits in 32 bits, "%.6f" format */ + /* handle zero, NaN, and +/- infinity */ + if (number == 0.0f) UnityPrint("0"); + else if (isnan(number)) UnityPrint("nan"); + else if (isinf(number)) UnityPrint("inf"); + else { - const UNITY_INT32 divisor = 1000000/10; - UNITY_UINT32 integer_part = (UNITY_UINT32)number; - UNITY_INT32 fraction_part = (UNITY_INT32)((number - (UNITY_DOUBLE)integer_part)*1000000.0 + 0.5); - /* Double precision calculation gives best performance for six rounded decimal places */ - ROUND_TIES_TO_EVEN(number, fraction_part, (number - (UNITY_DOUBLE)integer_part)*1000000.0); + int exponent = 0; - if (fraction_part == 1000000) /* Carry across the decimal point */ + /* scale up or down by powers of 10 */ + while (number < 100000.0f / 1e6f) { number *= 1e6f; exponent -= 6; } + while (number < 100000.0f) { number *= 10.0f; exponent--; } + while (number > 1000000.0f * 1e6f) { number /= 1e6f; exponent += 6; } + while (number > 1000000.0f) { number /= 10.0f; exponent++; } + + /* round to nearest integer */ + UNITY_INT32 n = ((UNITY_INT32)(number + number) + 1) / 2; + if (n > 999999) { - fraction_part = 0; - integer_part += 1; - } - - UnityPrintNumberUnsigned(integer_part); - UnityPrintDecimalAndNumberWithLeadingZeros(fraction_part, divisor); - } - else /* Number is larger, use exponential format of 9 digits, "%.8e" */ - { - const UNITY_INT32 divisor = 1000000000/10; - UNITY_INT32 integer_part; - UNITY_DOUBLE_TYPE divide = 10.0; - int exponent = 9; - - while (number / divide >= 1000000000.0 - 0.5) - { - divide *= 10; + n = 100000; exponent++; } - integer_part = (UNITY_INT32)(number / divide + 0.5); - /* Double precision calculation required for float, to produce 9 rounded digits */ - ROUND_TIES_TO_EVEN(number, integer_part, number / divide); - UNITY_OUTPUT_CHAR('0' + integer_part / divisor); - UnityPrintDecimalAndNumberWithLeadingZeros(integer_part % divisor, divisor / 10); - UNITY_OUTPUT_CHAR('e'); - UNITY_OUTPUT_CHAR('+'); - if (exponent < 10) UNITY_OUTPUT_CHAR('0'); - UnityPrintNumber(exponent); + /* determine where to place decimal point */ + int decimals = (exponent <= 0 && exponent >= -9) ? -exponent : 5; + + exponent += decimals; + + /* truncate trailing zeroes after decimal point */ + while (decimals > 0 && n % 10 == 0) + { + n /= 10; + decimals--; + } + + /* build up buffer in reverse order */ + char buf[16]; + int digits = 0; + while (n != 0 || digits < decimals + 1) + { + buf[digits++] = (char)('0' + n % 10); + n /= 10; + } + while (digits > 0) + { + if(digits == decimals) UNITY_OUTPUT_CHAR('.'); + UNITY_OUTPUT_CHAR(buf[--digits]); + } + + /* print exponent if needed */ + if (exponent != 0) + { + UNITY_OUTPUT_CHAR('e'); + + if(exponent < 0) + { + UNITY_OUTPUT_CHAR('-'); + exponent = -exponent; + } + else + { + UNITY_OUTPUT_CHAR('+'); + } + + digits = 0; + while (exponent != 0 || digits < 2) + { + buf[digits++] = (char)('0' + exponent % 10); + exponent /= 10; + } + while (digits > 0) + { + UNITY_OUTPUT_CHAR(buf[--digits]); + } + } } } #endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 3555fb2..bec2a81 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -4056,61 +4056,46 @@ void testFloatPrinting(void) #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); - 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("0", 0.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.99e-07", 0.000000499f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("5e-07", 0.00000050000005f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("0.100469", 0.100469499f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1", 0.9999995f); /*Rounding to int place*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("1", 1.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.25", 1.25f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("7.99999", 7.99999f); /*Not rounding*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("16.0002", 16.0002f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("16.0004", 16.0004f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("16.0006", 16.0006f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("999999", 999999.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("-0", -0.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-4.99e-07", -0.000000499f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-5e-07", -0.00000050000005f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.100469", -0.100469499f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-1", -0.9999995f); /*Rounding to int place*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("-1", -1.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-1.25", -1.25f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-7.99999", -7.99999f); /*Not rounding*/ + TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.0002", -16.0002f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.0004", -16.0004f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.0006", -16.0006f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-999999", -999999.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("4.29497e+09", 4294967296.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("5e+09", 5000000000.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("8e+09", 8.0e+09f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("8.31e+09", 8309999104.0f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1e+10", 1.0e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1e+10", 10000000000.0f); /* 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); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.00005e+10", (float)1.000054e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.1e+38", (float)1.10000005e+38f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1.6353e+10", 1.63529943e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("3.40282e+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_PRINT) || !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 + TEST_ASSERT_EQUAL_PRINT_FLOATING("-1e+10", -1.0e+10f); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-3.40282e+38", -3.40282346638e38f); #endif } @@ -4119,108 +4104,68 @@ void testFloatPrintingInfinityAndNaN(void) #if defined(UNITY_EXCLUDE_FLOAT_PRINT) || !defined(USING_OUTPUT_SPY) TEST_IGNORE(); #else - TEST_ASSERT_EQUAL_PRINT_FLOATING("Inf", 1.0f / f_zero); - TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.0f / f_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("inf", 1.0f / f_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-inf", -1.0f / f_zero); - TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", 0.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) +static void printFloatValue(float f) { 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) + char expected_lower[18]; + char expected_higher[18]; + + startPutcharSpy(); + + UnityPrintFloat(f); + + sprintf(expected, "%.6g", f); + + /* We print all NaN's as "nan", not "-nan" */ + if(strcmp(expected, "-nan") == 0) strcpy(expected, "nan"); + + /* Allow for rounding differences in last digit */ + double lower = (double)f * 0.9999995; + double higher = (double)f * 1.0000005; + + if (isfinite(lower)) sprintf(expected_lower, "%.6g", lower); else strcpy(expected_lower, expected); + if (isfinite(higher)) sprintf(expected_higher, "%.6g", higher); else strcpy(expected_higher, expected); + + if (strcmp(expected, getBufferPutcharSpy()) != 0 && + strcmp(expected_lower, getBufferPutcharSpy()) != 0 && + strcmp(expected_higher, getBufferPutcharSpy()) != 0) { - 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); - } - } + /* Fail with diagnostic printing */ + TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, f); } } -/* 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) +void testFloatPrintingRandomSamples(void) { - 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) + union { float f_value; uint32_t int_value; } u; + + /* These values are not covered by the MINSTD generator */ + u.int_value = 0x00000000; printFloatValue(u.f_value); + u.int_value = 0x80000000; printFloatValue(u.f_value); + u.int_value = 0x7fffffff; printFloatValue(u.f_value); + u.int_value = 0xffffffff; printFloatValue(u.f_value); + + uint32_t a = 1; + for(int num_tested = 0; num_tested < 1000000; num_tested++) { - startPutcharSpy(); + /* MINSTD pseudo-random number generator */ + a = (uint32_t)(((uint64_t)a * 48271u) % 2147483647u); - 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 */ - } + /* MINSTD does not set the highest bit; test both possibilities */ + u.int_value = a; printFloatValue(u.f_value); + u.int_value = a | 0x80000000; printFloatValue(u.f_value); } } #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 -} - // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES DOUBLE SUPPORT ================== void testDoublesWithinDelta(void) @@ -4893,35 +4838,20 @@ void testDoublePrinting(void) #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); - 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("4.29497e+09", 4294967295.999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.29497e+09", 4294967295.9999995); + TEST_ASSERT_EQUAL_PRINT_FLOATING("4.29497e+09", 4294967296.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("1e+10", 9999999995.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.0072e+15", 9007199254740990.0); + TEST_ASSERT_EQUAL_PRINT_FLOATING("7e+100", 7.0e+100); + TEST_ASSERT_EQUAL_PRINT_FLOATING("3e+200", 3.0e+200); + TEST_ASSERT_EQUAL_PRINT_FLOATING("9.23457e+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_FLOAT_PRINT) || 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 + TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.100469", -0.10046949999999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-4.29497e+09", -4294967295.999999); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-4.29497e+09", -4294967295.9999995); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-7e+100", -7.0e+100); #endif } @@ -4930,10 +4860,10 @@ void testDoublePrintingInfinityAndNaN(void) #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); - TEST_ASSERT_EQUAL_PRINT_FLOATING("-Inf", -1.0 / d_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("inf", 1.0 / d_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("-inf", -1.0 / d_zero); - TEST_ASSERT_EQUAL_PRINT_FLOATING("NaN", 0.0 / d_zero); + TEST_ASSERT_EQUAL_PRINT_FLOATING("nan", 0.0 / d_zero); #endif } From dbdd168e46cb4bde13ac63191676265068a36f1e Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Fri, 25 Aug 2017 15:47:40 -0400 Subject: [PATCH 108/157] Fix test link error. --- test/tests/testunity.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index bec2a81..55a9b5d 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -4142,9 +4142,13 @@ static void printFloatValue(float f) TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, f); } } +#endif void testFloatPrintingRandomSamples(void) { +#if !defined(UNITY_TEST_ALL_FLOATS_PRINT_OK) || !defined(USING_OUTPUT_SPY) + TEST_IGNORE(); +#else union { float f_value; uint32_t int_value; } u; /* These values are not covered by the MINSTD generator */ @@ -4163,8 +4167,8 @@ void testFloatPrintingRandomSamples(void) u.int_value = a; printFloatValue(u.f_value); u.int_value = a | 0x80000000; printFloatValue(u.f_value); } -} #endif +} // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES DOUBLE SUPPORT ================== From 2ae2bdb3768d15e3e9e3bfc600d81227c78213c0 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Fri, 25 Aug 2017 15:52:06 -0400 Subject: [PATCH 109/157] Make code C89-compliant. --- src/unity.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/unity.c b/src/unity.c index d5f26cf..e12af26 100644 --- a/src/unity.c +++ b/src/unity.c @@ -258,6 +258,9 @@ void UnityPrintFloat(const UNITY_DOUBLE input_number) else { int exponent = 0; + int decimals, digits; + UNITY_INT32 n; + char buf[16]; /* scale up or down by powers of 10 */ while (number < 100000.0f / 1e6f) { number *= 1e6f; exponent -= 6; } @@ -266,7 +269,7 @@ void UnityPrintFloat(const UNITY_DOUBLE input_number) while (number > 1000000.0f) { number /= 10.0f; exponent++; } /* round to nearest integer */ - UNITY_INT32 n = ((UNITY_INT32)(number + number) + 1) / 2; + n = ((UNITY_INT32)(number + number) + 1) / 2; if (n > 999999) { n = 100000; @@ -274,8 +277,7 @@ void UnityPrintFloat(const UNITY_DOUBLE input_number) } /* determine where to place decimal point */ - int decimals = (exponent <= 0 && exponent >= -9) ? -exponent : 5; - + decimals = (exponent <= 0 && exponent >= -9) ? -exponent : 5; exponent += decimals; /* truncate trailing zeroes after decimal point */ @@ -286,8 +288,7 @@ void UnityPrintFloat(const UNITY_DOUBLE input_number) } /* build up buffer in reverse order */ - char buf[16]; - int digits = 0; + digits = 0; while (n != 0 || digits < decimals + 1) { buf[digits++] = (char)('0' + n % 10); From 05daf95d4eeef8adf6bb6030d0221cb0abc01ed6 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Fri, 8 Sep 2017 15:37:31 -0400 Subject: [PATCH 110/157] Update to match Ruby style guide --- auto/colour_prompt.rb | 2 +- examples/example_3/rakefile.rb | 4 ++-- extras/fixture/rakefile.rb | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/auto/colour_prompt.rb b/auto/colour_prompt.rb index c861807..0f1dc4e 100644 --- a/auto/colour_prompt.rb +++ b/auto/colour_prompt.rb @@ -24,7 +24,7 @@ class ColourCommandLine return unless RUBY_PLATFORM =~ /(win|w)32$/ get_std_handle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') @set_console_txt_attrb = - Win32API.new('kernel32', 'SetConsoleTextAttribute', %w[L N], 'I') + Win32API.new('kernel32', 'SetConsoleTextAttribute', %w(L N), 'I') @hout = get_std_handle.call(-11) end diff --git a/examples/example_3/rakefile.rb b/examples/example_3/rakefile.rb index 8bedd4f..bf9f42b 100644 --- a/examples/example_3/rakefile.rb +++ b/examples/example_3/rakefile.rb @@ -32,8 +32,8 @@ task :summary do end desc 'Build and test Unity' -task all: %i[clean unit summary] -task default: %i[clobber all] +task all: %i(clean unit summary) +task default: %i(clobber all) task ci: [:default] task cruise: [:default] diff --git a/extras/fixture/rakefile.rb b/extras/fixture/rakefile.rb index 8528afc..7603e57 100644 --- a/extras/fixture/rakefile.rb +++ b/extras/fixture/rakefile.rb @@ -33,10 +33,10 @@ task unit: [:prepare_for_tests] do end desc 'Build and test Unity Framework' -task all: %i[clean unit] -task default: %i[clobber all] -task ci: %i[no_color default] -task cruise: %i[no_color default] +task all: %i(clean unit) +task default: %i(clobber all) +task ci: %i(no_color default) +task cruise: %i(no_color default) desc 'Load configuration' task :config, :config_file do |_t, args| From cc909efed33165be83732e2f6a502459663914c1 Mon Sep 17 00:00:00 2001 From: balaksh Date: Mon, 10 Apr 2017 15:08:01 +1200 Subject: [PATCH 111/157] Implement optional printing of execution time for each test --- examples/unity_config.h | 8 +++++ extras/fixture/src/unity_fixture.c | 4 +++ src/unity.c | 4 ++- src/unity_internals.h | 52 ++++++++++++++++++++++++++++++ test/tests/testunity.c | 8 +++++ 5 files changed, 75 insertions(+), 1 deletion(-) diff --git a/examples/unity_config.h b/examples/unity_config.h index da3c2af..d586448 100644 --- a/examples/unity_config.h +++ b/examples/unity_config.h @@ -236,4 +236,12 @@ /* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ /* #define UNITY_PTR_ATTRIBUTE near */ +/* Print execution time of each test when executed in verbose mode + * + * Example: + * + * TEST - PASS (10 ms) + */ +/* #define UNITY_INCLUDE_EXEC_TIME */ + #endif /* UNITY_CONFIG_H */ diff --git a/extras/fixture/src/unity_fixture.c b/extras/fixture/src/unity_fixture.c index 3872bd8..36c1fb1 100644 --- a/extras/fixture/src/unity_fixture.c +++ b/extras/fixture/src/unity_fixture.c @@ -93,6 +93,8 @@ void UnityTestRunner(unityfunction* setup, UnityMalloc_StartTest(); UnityPointer_Init(); + UNITY_EXEC_TIME_START(); + if (TEST_PROTECT()) { setup(); @@ -418,6 +420,8 @@ void UnityConcludeFixtureTest(void) if (UnityFixture.Verbose) { UnityPrint(" PASS"); + UNITY_EXEC_TIME_STOP(); + UNITY_PRINT_EXEC_TIME(); UNITY_PRINT_EOL(); } } diff --git a/src/unity.c b/src/unity.c index a493b76..cae7bbd 100644 --- a/src/unity.c +++ b/src/unity.c @@ -370,6 +370,7 @@ void UnityConcludeTest(void) Unity.CurrentTestFailed = 0; Unity.CurrentTestIgnored = 0; + UNITY_EXEC_TIME_RESET(); UNITY_PRINT_EOL(); UNITY_FLUSH_CALL(); } @@ -958,7 +959,7 @@ void UnityAssertNumbersWithin(const UNITY_UINT delta, if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) { if (actual > expected) - Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); + Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); else Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); } @@ -1351,6 +1352,7 @@ void UnityBegin(const char* filename) Unity.TestIgnores = 0; Unity.CurrentTestFailed = 0; Unity.CurrentTestIgnored = 0; + UNITY_EXEC_TIME_RESET(); UNITY_CLR_DETAILS(); UNITY_OUTPUT_START(); diff --git a/src/unity_internals.h b/src/unity_internals.h index 1b57cd0..e161627 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -32,6 +32,10 @@ #include #endif +#ifndef UNITY_EXCLUDE_TIME_H +#include +#endif + /*------------------------------------------------------- * Guess Widths If Not Specified *-------------------------------------------------------*/ @@ -285,6 +289,44 @@ extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION; #define UNITY_OUTPUT_COMPLETE() #endif +#ifndef UNITY_EXEC_TIME_RESET +#ifdef UNITY_INCLUDE_EXEC_TIME +#define UNITY_EXEC_TIME_RESET()\ + Unity.CurrentTestStartTime = 0;\ + Unity.CurrentTestStopTime = 0; +#else +#define UNITY_EXEC_TIME_RESET() +#endif +#endif + +#ifndef UNITY_EXEC_TIME_START +#ifdef UNITY_INCLUDE_EXEC_TIME +#define UNITY_EXEC_TIME_START() Unity.CurrentTestStartTime = UNITY_CLOCK_MS(); +#else +#define UNITY_EXEC_TIME_START() +#endif +#endif + +#ifndef UNITY_EXEC_TIME_START +#ifdef UNITY_INCLUDE_EXEC_TIME +#define UNITY_EXEC_TIME_STOP() Unity.CurrentTestStopTime = UNITY_CLOCK_MS(); +#else +#define UNITY_EXEC_TIME_STOP() +#endif +#endif + +#ifndef UNITY_PRINT_EXEC_TIME +#ifdef UNITY_INCLUDE_EXEC_TIME +#define UNITY_PRINT_EXEC_TIME() \ + UnityPrint(" (");\ + UNITY_COUNTER_TYPE execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); + UnityPrintNumberUnsigned(execTimeMs);\ + UnityPrint(" ms)"); +#else +#define UNITY_PRINT_EXEC_TIME() +#endif +#endif + /*------------------------------------------------------- * Footprint *-------------------------------------------------------*/ @@ -387,6 +429,10 @@ struct UNITY_STORAGE_T UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifdef UNITY_INCLUDE_EXEC_TIME + UNITY_COUNTER_TYPE CurrentTestStartTime; + UNITY_COUNTER_TYPE CurrentTestStopTime; +#endif #ifndef UNITY_EXCLUDE_SETJMP_H jmp_buf AbortFrame; #endif @@ -590,6 +636,12 @@ extern const char UnityStrErr64[]; #define TEST_ABORT() return #endif +#ifndef UNITY_EXCLUDE_TIME_H +#define UNITY_CLOCK_MS() (UNITY_COUNTER_TYPE)((clock() * 1000) / CLOCKS_PER_SEC) +#else +#define UNITY_CLOCK_MS() +#endif + /* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ #ifndef RUN_TEST #ifdef __STDC_VERSION__ diff --git a/test/tests/testunity.c b/test/tests/testunity.c index af06647..88fb284 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -99,6 +99,10 @@ void testUnitySizeInitializationReminder(void) UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifdef UNITY_INCLUDE_EXEC_TIME + UNITY_COUNTER_TYPE CurrentTestStartTime; + UNITY_COUNTER_TYPE CurrentTestStopTime; +#endif #ifndef UNITY_EXCLUDE_SETJMP_H jmp_buf AbortFrame; #endif @@ -115,6 +119,10 @@ void testUnitySizeInitializationReminder(void) UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifdef UNITY_INCLUDE_EXEC_TIME + UNITY_COUNTER_TYPE CurrentTestStartTime; + UNITY_COUNTER_TYPE CurrentTestStopTime; +#endif #ifndef UNITY_EXCLUDE_SETJMP_H jmp_buf AbortFrame; #endif From fcd4883c5eecf2eb7062e36ed945122b76dfb15b Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Mon, 11 Sep 2017 10:00:39 -0400 Subject: [PATCH 112/157] Fix compiler warning due to reusing symbol 'exp'. --- src/unity.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/unity.c b/src/unity.c index a493b76..9783efa 100644 --- a/src/unity.c +++ b/src/unity.c @@ -1073,7 +1073,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, { UNITY_UINT32 i = 0; UNITY_UINT32 j = 0; - const char* exp = NULL; + const char* expd = NULL; const char* act = NULL; RETURN_IF_FAIL_OR_IGNORE; @@ -1096,7 +1096,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, if (flags != UNITY_ARRAY_TO_ARRAY) { - exp = (const char*)expected; + expd = (const char*)expected; } do @@ -1104,15 +1104,15 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, act = actual[j]; if (flags == UNITY_ARRAY_TO_ARRAY) { - exp = ((const char* const*)expected)[j]; + expd = ((const char* const*)expected)[j]; } /* if both pointers not null compare the strings */ - if (exp && act) + if (expd && act) { - for (i = 0; exp[i] || act[i]; i++) + for (i = 0; expd[i] || act[i]; i++) { - if (exp[i] != act[i]) + if (expd[i] != act[i]) { Unity.CurrentTestFailed = 1; break; @@ -1121,7 +1121,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, } else { /* handle case of one pointers being null (if both null, test should pass) */ - if (exp != act) + if (expd != act) { Unity.CurrentTestFailed = 1; } @@ -1135,7 +1135,7 @@ void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, UnityPrint(UnityStrElement); UnityPrintNumberUnsigned(j); } - UnityPrintExpectedAndActualStrings(exp, act); + UnityPrintExpectedAndActualStrings(expd, act); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } From f278c18fd910146bc40281dad77f611b682f9bfd Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 11 Sep 2017 15:39:17 -0400 Subject: [PATCH 113/157] Fix bug #288 - invalid line numbers on partial name matches --- auto/generate_test_runner.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 2c5e56a..07bde81 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -119,7 +119,7 @@ class UnityTestRunnerGenerator source_index = 0 tests_and_line_numbers.size.times do |i| source_lines[source_index..-1].each_with_index do |line, index| - next unless line =~ /#{tests_and_line_numbers[i][:test]}/ + next unless line =~ /\s+#{tests_and_line_numbers[i][:test]}(?:\s|\()/ source_index += index tests_and_line_numbers[i][:line_number] = source_index + 1 break From 60b13f0685246b009810aecbffafe17fb665d970 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 11 Sep 2017 15:43:17 -0400 Subject: [PATCH 114/157] Bump version in preparation of release. --- release/build.info | 2 +- release/version.info | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/release/build.info b/release/build.info index 207634b..50fb6ea 100644 --- a/release/build.info +++ b/release/build.info @@ -1,2 +1,2 @@ -120 +121 diff --git a/release/version.info b/release/version.info index 3b904b6..b674b92 100644 --- a/release/version.info +++ b/release/version.info @@ -1,2 +1,2 @@ -2.4.1 +2.4.2 From 60def109a7cfa90aafee6758e7a61c199b83ac4f Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Wed, 13 Sep 2017 09:39:52 -0400 Subject: [PATCH 115/157] Update configuration docs --- docs/UnityConfigurationGuide.md | 116 ++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 43 deletions(-) diff --git a/docs/UnityConfigurationGuide.md b/docs/UnityConfigurationGuide.md index 283d779..49202eb 100644 --- a/docs/UnityConfigurationGuide.md +++ b/docs/UnityConfigurationGuide.md @@ -79,18 +79,7 @@ _Example:_ #define UNITY_EXCLUDE_LIMITS_H -##### `UNITY_EXCLUDE_SIZEOF` - -The third and final attempt to guess your types is to use the `sizeof()` -operator. Even if the first two options don't work, this one covers most cases. -There _is_ a rare compiler or two out there that doesn't support sizeof() in the -preprocessing stage, though. For these, you have the ability to disable this -feature as well. - -_Example:_ - #define UNITY_EXCLUDE_SIZEOF - -If you've disabled all of the automatic options above, you're going to have to +If you've disabled both of the automatic options above, you're going to have to do the configuration yourself. Don't worry. Even this isn't too bad... there are just a handful of defines that you are going to specify if you don't like the defaults. @@ -127,7 +116,7 @@ _Example:_ #define UNITY_POINTER_WIDTH 64 -##### `UNITY_INCLUDE_64` +##### `UNITY_SUPPORT_64` Unity will automatically include 64-bit support if it auto-detects it, or if your `int`, `long`, or pointer widths are greater than 32-bits. Define this to @@ -136,7 +125,7 @@ can be a significant size and speed impact to enabling 64-bit support on small targets, so don't define it if you don't need it. _Example:_ - #define UNITY_INCLUDE_64 + #define UNITY_SUPPORT_64 ### Floating Point Types @@ -170,24 +159,20 @@ _Example:_ #define UNITY_INCLUDE_DOUBLE -##### `UNITY_FLOAT_VERBOSE` - -##### `UNITY_DOUBLE_VERBOSE` +##### `UNITY_EXCLUDE_FLOAT_PRINT` 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 +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. +Therefore, the display of floating point values during a failure are optional. +By default, Unity will print the actual results of floating point assertion +failure (e.g. ”Expected 4.56 Was 4.68”). To not include this extra support, you +can use this define to instead respond to a failed assertion with 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. _Example:_ - #define UNITY_DOUBLE_VERBOSE + #define UNITY_EXCLUDE_FLOAT_PRINT ##### `UNITY_FLOAT_TYPE` @@ -277,25 +262,32 @@ will declare an instance of your function by default. If you want to disable this behavior, add `UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION`. -##### `UNITY_SUPPORT_WEAK` +##### `UNITY_WEAK_ATTRIBUTE` -For some targets, Unity can make the otherwise required `setUp()` and -`tearDown()` functions optional. This is a nice convenience for test writers -since `setUp` and `tearDown` don't often actually _do_ anything. If you're using -gcc or clang, this option is automatically defined for you. Other compilers can -also support this behavior, if they support a C feature called weak functions. A -weak function is a function that is compiled into your executable _unless_ a -non-weak version of the same function is defined elsewhere. If a non-weak -version is found, the weak version is ignored as if it never existed. If your -compiler supports this feature, you can let Unity know by defining -`UNITY_SUPPORT_WEAK` as the function attributes that would need to be applied to -identify a function as weak. If your compiler lacks support for weak functions, -you will always need to define `setUp` and `tearDown` functions (though they can -be and often will be just empty). The most common options for this feature are: +##### `UNITY_WEAK_PRAGMA` + +##### `UNITY_NO_WEAK` + +For some targets, Unity can make the otherwise required setUp() and tearDown() +functions optional. This is a nice convenience for test writers since setUp and +tearDown don’t often actually do anything. If you’re using gcc or clang, this +option is automatically defined for you. Other compilers can also support this +behavior, if they support a C feature called weak functions. A weak function is +a function that is compiled into your executable unless a non-weak version of +the same function is defined elsewhere. If a non-weak version is found, the weak +version is ignored as if it never existed. If your compiler supports this feature, +you can let Unity know by defining UNITY_WEAK_ATTRIBUTE or UNITY_WEAK_PRAGMA as +the function attributes that would need to be applied to identify a function as +weak. If your compiler lacks support for weak functions, you will always need to +define setUp and tearDown functions (though they can be and often will be just +empty). You can also force Unity to NOT use weak functions by defining +UNITY_NO_WEAK. The most common options for this feature are: _Example:_ - #define UNITY_SUPPORT_WEAK weak - #define UNITY_SUPPORT_WEAK __attribute__((weak)) + #define UNITY_WEAK_ATTRIBUTE weak + #define UNITY_WEAK_ATTRIBUTE __attribute__((weak)) + #define UNITY_WEAK_PRAGMA + #define UNITY_NO_WEAK ##### `UNITY_PTR_ATTRIBUTE` @@ -309,6 +301,44 @@ _Example:_ #define UNITY_PTR_ATTRIBUTE near +##### `UNITY_PRINT_EOL` + +By default, Unity outputs \n at the end of each line of output. This is easy +to parse by the scripts, by Ceedling, etc, but it might not be ideal for YOUR +system. Feel free to override this and to make it whatever you wish. + +_Example:_ + #define UNITY_PRINT_EOL { UNITY_OUTPUT_CHAR('\r'); UNITY_OUTPUT_CHAR('\n') } + + + +##### `UNITY_EXCLUDE_DETAILS` + +This is an option for if you absolutely must squeeze every byte of memory out of +your system. Unity stores a set of internal scratchpads which are used to pass +extra detail information around. It's used by systems like CMock in order to +report which function or argument flagged an error. If you're not using CMock and +you're not using these details for other things, then you can exclude them. + +_Example:_ + #define UNITY_EXCLUDE_DETAILS + + + +##### `UNITY_EXCLUDE_SETJMP` + +If your embedded system doesn't support the standard library setjmp, you can +exclude Unity's reliance on this by using this define. This dropped dependence +comes at a price, though. You will be unable to use custom helper functions for +your tests, and you will be unable to use tools like CMock. Very likely, if your +compiler doesn't support setjmp, you wouldn't have had the memory space for those +things anyway, though... so this option exists for those situations. + +_Example:_ + #define UNITY_EXCLUDE_SETJMP + + + ## Getting Into The Guts There will be cases where the options above aren't quite going to get everything From 2593c31bb7e69219deaffd360d90def3711bce8f Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Wed, 13 Sep 2017 17:59:52 -0400 Subject: [PATCH 116/157] Allow suiteSetUp() and suiteTearDown() to be provided as normal C functions. This is simpler and more flexible than embedding C code in the Ruby options (:suite_setup and :suite_teardown). However, support for :suite_setup and :suite_teardown is kept for backwards compatibility. Several configurations are possible: 1. :suite_setup and :suite_teardown options provided and used. 2. :suite_setup and :suite_teardown options not provided (nil): 2a. Weak symbols not supported; suiteSetUp() and suiteTearDown() are not called. It would be simpler to make user-provided functions mandatory in this case, but it could break some pre-existing test suites. 2b. Weak symbols are supported and the stub implementations of suiteSetUp() and suiteTearDown() are called if there are no user-provided functions. 2c. Weak symbols are supported but overridden by user-provided suiteSetUp() and suiteTearDown() functions. --- auto/generate_test_runner.rb | 30 ++++++++++++++++++++++-------- src/unity.c | 6 ++++++ src/unity.h | 11 +++++++++++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 07bde81..edb7989 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -235,22 +235,36 @@ class UnityTestRunnerGenerator end def create_suite_setup(output) - return if @options[:suite_setup].nil? - output.puts("\n/*=======Suite Setup=====*/") output.puts('static void suite_setup(void)') output.puts('{') - output.puts(@options[:suite_setup]) + if @options[:suite_setup].nil? + # New style, call suiteSetUp() if we can use weak symbols + output.puts('#if defined(UNITY_WEAK_ATTRIBUTE) || defined(UNITY_WEAK_PRAGMA)') + output.puts(' suiteSetUp();') + output.puts('#endif') + else + # Old style, C code embedded in the :suite_setup option + output.puts(@options[:suite_setup]) + end output.puts('}') end def create_suite_teardown(output) - return if @options[:suite_teardown].nil? - output.puts("\n/*=======Suite Teardown=====*/") output.puts('static int suite_teardown(int num_failures)') output.puts('{') - output.puts(@options[:suite_teardown]) + if @options[:suite_teardown].nil? + # New style, call suiteTearDown() if we can use weak symbols + output.puts('#if defined(UNITY_WEAK_ATTRIBUTE) || defined(UNITY_WEAK_PRAGMA)') + output.puts(' return suiteTearDown(num_failures);') + output.puts('#else') + output.puts(' return num_failures;') + output.puts('#endif') + else + # Old style, C code embedded in the :suite_teardown option + output.puts(@options[:suite_teardown]) + end output.puts('}') end @@ -342,7 +356,7 @@ class UnityTestRunnerGenerator output.puts("int #{main_name}(void)") output.puts('{') end - output.puts(' suite_setup();') unless @options[:suite_setup].nil? + output.puts(' suite_setup();') output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");") if @options[:use_param_tests] tests.each do |test| @@ -357,7 +371,7 @@ class UnityTestRunnerGenerator end output.puts output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty? - output.puts(" return #{@options[:suite_teardown].nil? ? '' : 'suite_teardown'}(UnityEnd());") + output.puts(" return suite_teardown(UnityEnd());") output.puts('}') end diff --git a/src/unity.c b/src/unity.c index 9783efa..08ecf63 100644 --- a/src/unity.c +++ b/src/unity.c @@ -1314,11 +1314,17 @@ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) #if defined(UNITY_WEAK_ATTRIBUTE) UNITY_WEAK_ATTRIBUTE void setUp(void) { } UNITY_WEAK_ATTRIBUTE void tearDown(void) { } + UNITY_WEAK_ATTRIBUTE void suiteSetUp(void) { } + UNITY_WEAK_ATTRIBUTE int suiteTearDown(int num_failures) { return num_failures; } #elif defined(UNITY_WEAK_PRAGMA) #pragma weak setUp void setUp(void) { } #pragma weak tearDown void tearDown(void) { } + #pragma weak suiteSetUp + void suiteSetUp(void) { } + #pragma weak suiteTearDown + int suiteTearDown(int num_failures) { return num_failures; } #endif /*-----------------------------------------------*/ diff --git a/src/unity.h b/src/unity.h index 258e21c..1fa8b94 100644 --- a/src/unity.h +++ b/src/unity.h @@ -15,9 +15,20 @@ extern "C" #include "unity_internals.h" +/* These functions are intended to be called before and after each test. Unity + * provides stub implementations annotated as weak symbols (if supported by the + * compiler). */ void setUp(void); void tearDown(void); +/* These functions are intended to be called at the beginning and end of an + * entire test suite. suiteTearDown() is passed the number of tests that + * failed, and its return value becomes the exit code of main(). Unity + * provides stub implementations annotated as weak symbols (if supported by the + * compiler). */ +void suiteSetUp(void); +int suiteTearDown(int num_failures); + /*------------------------------------------------------- * Configuration Options *------------------------------------------------------- From 1381a1a4cbf1f48ed582466d00fab3b14e8e8abd Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Wed, 13 Sep 2017 18:24:07 -0400 Subject: [PATCH 117/157] Update documentation. --- docs/UnityHelperScriptsGuide.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/UnityHelperScriptsGuide.md b/docs/UnityHelperScriptsGuide.md index 3a93009..4242990 100644 --- a/docs/UnityHelperScriptsGuide.md +++ b/docs/UnityHelperScriptsGuide.md @@ -124,7 +124,7 @@ demonstrates using a Ruby hash. ##### `:includes` -This option specifies an array of file names to be ?#include?'d at the top of +This option specifies an array of file names to be `#include`'d at the top of your runner C file. You might use it to reference custom types or anything else universally needed in your generated runners. @@ -133,11 +133,23 @@ universally needed in your generated runners. Define this option with C code to be executed _before any_ test cases are run. +Alternatively, if your C compiler supports weak symbols, you can leave this +option unset and instead provide a `void suiteSetUp(void)` function in your test +suite. The linker will look for this symbol and fall back to a Unity-provided +stub if it is not found. + ##### `:suite_teardown` -Define this option with C code to be executed ?after all?test cases have -finished. +Define this option with C code to be executed _after all_ test cases have +finished. An integer variable `num_failures` is available for diagnostics. +The code should end with a `return` statement; the value returned will become +the exit code of `main`. You can normally just return `num_failures`. + +Alternatively, if your C compiler supports weak symbols, you can leave this +option unset and instead provide a `int suiteTearDown(int num_failures)` +function in your test suite. The linker will look for this symbol and fall +back to a Unity-provided stub if it is not found. ##### `:enforce_strict_ordering` From 8caade7e6857504edf41abc9317c934e5c9b5d0f Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 20 Sep 2017 18:13:12 -0500 Subject: [PATCH 118/157] Fix bug in greater/less than asserts on unsigned int Check for unsigned types, add 'or equal to' support Consolidate to one function to remove repeated code --- src/unity.c | 56 +++++++++++++++----------------- src/unity_internals.h | 74 +++++++++++++++++++++---------------------- 2 files changed, 63 insertions(+), 67 deletions(-) diff --git a/src/unity.c b/src/unity.c index 9783efa..216e005 100644 --- a/src/unity.c +++ b/src/unity.c @@ -29,6 +29,7 @@ static const char UnityStrExpected[] = " Expected "; static const char UnityStrWas[] = " Was "; static const char UnityStrGt[] = " to be greater than "; static const char UnityStrLt[] = " to be less than "; +static const char UnityStrOrEqual[] = "or equal to "; static const char UnityStrElement[] = " Element "; static const char UnityStrByte[] = " Byte "; static const char UnityStrMemory[] = " Memory Mismatch."; @@ -531,49 +532,44 @@ void UnityAssertEqualNumber(const UNITY_INT expected, } /*-----------------------------------------------*/ -void UnityAssertGreaterNumber(const UNITY_INT threshold, - const UNITY_INT actual, - const char *msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) +void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) { + int failed = 0; RETURN_IF_FAIL_OR_IGNORE; - if (!(actual > threshold)) + if (threshold == actual && compare & UNITY_EQUAL_TO) return; + if (threshold == actual) failed = 1; + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual > threshold && compare & UNITY_SMALLER_THAN) failed = 1; + if (actual < threshold && compare & UNITY_GREATER_THAN) failed = 1; + } + else /* UINT or HEX */ + { + if ((UNITY_UINT)actual > (UNITY_UINT)threshold && compare & UNITY_SMALLER_THAN) failed = 1; + if ((UNITY_UINT)actual < (UNITY_UINT)threshold && compare & UNITY_GREATER_THAN) failed = 1; + } + + if (failed) { UnityTestResultsFailBegin(lineNumber); UnityPrint(UnityStrExpected); UnityPrintNumberByStyle(actual, style); - UnityPrint(UnityStrGt); + if (compare & UNITY_GREATER_THAN) UnityPrint(UnityStrGt); + if (compare & UNITY_SMALLER_THAN) UnityPrint(UnityStrLt); + if (compare & UNITY_EQUAL_TO) UnityPrint(UnityStrOrEqual); UnityPrintNumberByStyle(threshold, style); UnityAddMsgIfSpecified(msg); UNITY_FAIL_AND_BAIL; } } -/*-----------------------------------------------*/ -void UnityAssertSmallerNumber(const UNITY_INT threshold, - const UNITY_INT actual, - const char *msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) -{ - RETURN_IF_FAIL_OR_IGNORE; - - if (!(actual < threshold)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(actual, style); - UnityPrint(UnityStrLt); - UnityPrintNumberByStyle(threshold, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - - - #define UnityPrintPointlessAndBail() \ { \ UnityTestResultsFailBegin(lineNumber); \ diff --git a/src/unity_internals.h b/src/unity_internals.h index 1b57cd0..124b8c7 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -352,6 +352,15 @@ UNITY_DISPLAY_STYLE_UINT = sizeof(unsigned) + UNITY_DISPLAY_RANGE_UINT, UNITY_DISPLAY_STYLE_UNKNOWN } UNITY_DISPLAY_STYLE_T; +typedef enum +{ + UNITY_EQUAL_TO = 1, + UNITY_GREATER_THAN = 2, + UNITY_GREATER_OR_EQUAL = 2 + UNITY_EQUAL_TO, + UNITY_SMALLER_THAN = 4, + UNITY_SMALLER_OR_EQUAL = 4 + UNITY_EQUAL_TO +} UNITY_COMPARISON_T; + #ifndef UNITY_EXCLUDE_FLOAT typedef enum UNITY_FLOAT_TRAIT { @@ -455,17 +464,12 @@ void UnityAssertEqualNumber(const UNITY_INT expected, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style); -void UnityAssertGreaterNumber(const UNITY_INT threshold, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style); - -void UnityAssertSmallerNumber(const UNITY_INT threshold, - const UNITY_INT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style); +void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, @@ -664,33 +668,29 @@ int UnityTestMatches(void); #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_GREATER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_GREATER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) - - -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT8(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT16(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) -#define UNITY_TEST_ASSERT_SMALLER_THAN_INT32(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT8(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT16(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) -#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT32(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) -#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX8(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) -#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) -#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertSmallerNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) - - +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (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) From 91bcbe186d90b65147bcae0c19a26e365b4913e9 Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 20 Sep 2017 18:24:23 -0500 Subject: [PATCH 119/157] Add 'greater/less or equal to' asserts on integers Make all comparison operators on integers available --- src/unity.h | 51 +++++++++++++++++++++++++++++++++++++++++++ src/unity_internals.h | 24 ++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/src/unity.h b/src/unity.h index 258e21c..2d2e2d5 100644 --- a/src/unity.h +++ b/src/unity.h @@ -143,6 +143,32 @@ void tearDown(void); #define TEST_ASSERT_LESS_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_LESS_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (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) #define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) @@ -300,6 +326,31 @@ void tearDown(void); #define TEST_ASSERT_LESS_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (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 124b8c7..d3d4334 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -692,6 +692,30 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) #define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) + +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (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) From b119919c4f82307c1ac9e9d49f95c08b2561628f Mon Sep 17 00:00:00 2001 From: jsalling Date: Wed, 20 Sep 2017 18:26:17 -0500 Subject: [PATCH 120/157] Add 64-bit comparison asserts --- src/unity.h | 29 ++++++++++++++++++++++++----- src/unity_internals.h | 24 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/unity.h b/src/unity.h index 2d2e2d5..0add3f5 100644 --- a/src/unity.h +++ b/src/unity.h @@ -120,54 +120,64 @@ void tearDown(void); #define TEST_ASSERT_GREATER_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, NULL) - +#define TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, NULL) - +#define TEST_ASSERT_LESS_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (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,8 +222,6 @@ void tearDown(void); #define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) - - /* Arrays Compared To Single Value */ #define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) #define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) @@ -304,53 +312,64 @@ void tearDown(void); #define TEST_ASSERT_GREATER_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, (message)) - +#define TEST_ASSERT_GREATER_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_GREATER_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (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 d3d4334..283d8ea 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -776,6 +776,18 @@ int UnityTestMatches(void); #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) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (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) @@ -786,6 +798,18 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) #define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) #define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) #endif #ifdef UNITY_EXCLUDE_FLOAT From 94a3008a9dd04913d4d67e6f8ac806607f31e9d0 Mon Sep 17 00:00:00 2001 From: jsalling Date: Thu, 21 Sep 2017 21:24:41 -0500 Subject: [PATCH 121/157] Update continuous integration to build 32-bit Unity --- .travis.yml | 4 +++- test/Makefile | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8ae9fa0..bd165b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,9 @@ install: script: - cd test && rake ci - make -s - - make -s DEBUG=-m32 + - make -s DEBUG=-m32 #32-bit architecture with 64-bit support + - make -s DEBUG=-m32 UNITY_SUPPORT_64= #32-bit build without 64-bit types + - make -s UNITY_INCLUDE_DOUBLE= # without double - cd ../extras/fixture/test && rake ci - make -s default noStdlibMalloc - make -s C89 diff --git a/test/Makefile b/test/Makefile index 9de7a49..c2710f1 100644 --- a/test/Makefile +++ b/test/Makefile @@ -15,7 +15,9 @@ CFLAGS += -Wbad-function-cast -Wcast-qual -Wold-style-definition -Wshadow -Wstri CFLAGS += $(DEBUG) DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\) -DEFINES += -D UNITY_SUPPORT_64 -D UNITY_INCLUDE_DOUBLE +DEFINES += $(UNITY_SUPPORT_64) $(UNITY_INCLUDE_DOUBLE) +UNITY_SUPPORT_64 = -D UNITY_SUPPORT_64 +UNITY_INCLUDE_DOUBLE = -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 From a7e8797e0cabd738cb4cfcc54ce4348b3522f2d1 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Mon, 9 Oct 2017 10:49:58 -0400 Subject: [PATCH 122/157] Fix link errors with MinGW. MinGW supports a limited form of weak symbols, with the restriction that weak/default implementations need to be defined in the same translation unit they are called from. Strong/overriding symbols may of course be specified in a different translation unit. --- auto/generate_test_runner.rb | 1 + src/unity.c | 18 +----------------- src/unity_setup.h | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 src/unity_setup.h diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index edb7989..f436634 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -158,6 +158,7 @@ class UnityTestRunnerGenerator create_runtest(output, mocks) output.puts("\n/*=======Automagically Detected Files To Include=====*/") output.puts("#include \"#{@options[:framework]}.h\"") + output.puts("#include \"#{@options[:framework]}_setup.h\"") output.puts('#include "cmock.h"') unless mocks.empty? output.puts('#include ') output.puts('#include ') diff --git a/src/unity.c b/src/unity.c index 08ecf63..739358f 100644 --- a/src/unity.c +++ b/src/unity.c @@ -5,6 +5,7 @@ ============================================================================ */ #include "unity.h" +#include "unity_setup.h" #include /* If omitted from header, declare overrideable prototypes here so they're ready for use */ @@ -1310,23 +1311,6 @@ void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) 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 suiteSetUp(void) { } - UNITY_WEAK_ATTRIBUTE int suiteTearDown(int num_failures) { return num_failures; } -#elif defined(UNITY_WEAK_PRAGMA) - #pragma weak setUp - void setUp(void) { } - #pragma weak tearDown - void tearDown(void) { } - #pragma weak suiteSetUp - void suiteSetUp(void) { } - #pragma weak suiteTearDown - int suiteTearDown(int num_failures) { return num_failures; } -#endif - /*-----------------------------------------------*/ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) { diff --git a/src/unity_setup.h b/src/unity_setup.h new file mode 100644 index 0000000..4672b76 --- /dev/null +++ b/src/unity_setup.h @@ -0,0 +1,33 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_SETUP_H +#define UNITY_SETUP_H + +#include "unity_internals.h" + +/* On some platforms (MinGW for example), weak function implementations + * need to be in the same translation unit they are called from. This + * header can be included to provide implementations of setUp(), tearDown(), + * suiteSetUp(), and suiteTearDown(). */ + +#if defined(UNITY_WEAK_ATTRIBUTE) + UNITY_WEAK_ATTRIBUTE void setUp(void) { } + UNITY_WEAK_ATTRIBUTE void tearDown(void) { } + UNITY_WEAK_ATTRIBUTE void suiteSetUp(void) { } + UNITY_WEAK_ATTRIBUTE int suiteTearDown(int num_failures) { return num_failures; } +#elif defined(UNITY_WEAK_PRAGMA) + #pragma weak setUp + void setUp(void) { } + #pragma weak tearDown + void tearDown(void) { } + #pragma weak suiteSetUp + void suiteSetUp(void) { } + #pragma weak suiteTearDown + int suiteTearDown(int num_failures) { return num_failures; } +#endif + +#endif From df78aade4bdf78e34f35d6aedeb79e55411a9b62 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Mon, 9 Oct 2017 11:38:08 -0400 Subject: [PATCH 123/157] Make weak symbol usage more portable: - Enable support for Green Hills Software compiler - Define weak implementations only once except on Windows --- auto/generate_test_runner.rb | 2 ++ src/unity_internals.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index f436634..b049bca 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -158,7 +158,9 @@ class UnityTestRunnerGenerator create_runtest(output, mocks) output.puts("\n/*=======Automagically Detected Files To Include=====*/") output.puts("#include \"#{@options[:framework]}.h\"") + output.puts('#ifdef __WIN32__') output.puts("#include \"#{@options[:framework]}_setup.h\"") + output.puts('#endif') output.puts('#include "cmock.h"') unless mocks.empty? output.puts('#include ') output.puts('#include ') diff --git a/src/unity_internals.h b/src/unity_internals.h index 1b57cd0..4761253 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -301,7 +301,7 @@ extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION; * Language Features Available *-------------------------------------------------------*/ #if !defined(UNITY_WEAK_ATTRIBUTE) && !defined(UNITY_WEAK_PRAGMA) -# ifdef __GNUC__ /* includes clang */ +# if defined(__GNUC__) || defined(__ghs__) /* __GNUC__ includes clang */ # if !(defined(__WIN32__) && defined(__clang__)) && !defined(__TMS470__) # define UNITY_WEAK_ATTRIBUTE __attribute__((weak)) # endif From 17d4ea92e158eeb67f6fd7453814c54e342b794d Mon Sep 17 00:00:00 2001 From: Victor Lambret Date: Tue, 24 Oct 2017 07:25:29 +0200 Subject: [PATCH 124/157] Color test results using ANSI escape codes Help error detection by adding specific colors for test results. This behavior is activated only when unity if compiled with UNITY_COLOR flag. --- docs/UnityConfigurationGuide.md | 7 +++++++ src/unity.c | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/docs/UnityConfigurationGuide.md b/docs/UnityConfigurationGuide.md index 49202eb..96e5358 100644 --- a/docs/UnityConfigurationGuide.md +++ b/docs/UnityConfigurationGuide.md @@ -337,6 +337,13 @@ things anyway, though... so this option exists for those situations. _Example:_ #define UNITY_EXCLUDE_SETJMP +##### `UNITY_OUTPUT_COLOR` + +If you want to add color using ANSI escape codes you can use this define. +t +_Example:_ + #define UNITY_OUTPUT_COLOR + ## Getting Into The Guts diff --git a/src/unity.c b/src/unity.c index 9783efa..da04be6 100644 --- a/src/unity.c +++ b/src/unity.c @@ -19,10 +19,17 @@ void UNITY_OUTPUT_CHAR(int); struct UNITY_STORAGE_T Unity; +#ifdef UNITY_OUTPUT_COLOR +static const char UnityStrOk[] = "\033[42mOK\033[00m"; +static const char UnityStrPass[] = "\033[42mPASS\033[00m"; +static const char UnityStrFail[] = "\033[41mFAIL\033[00m"; +static const char UnityStrIgnore[] = "\033[43mIGNORE\033[00m"; +#else static const char UnityStrOk[] = "OK"; static const char UnityStrPass[] = "PASS"; static const char UnityStrFail[] = "FAIL"; static const char UnityStrIgnore[] = "IGNORE"; +#endif static const char UnityStrNull[] = "NULL"; static const char UnityStrSpacer[] = ". "; static const char UnityStrExpected[] = " Expected "; @@ -83,6 +90,18 @@ void UnityPrint(const char* string) UNITY_OUTPUT_CHAR('\\'); UNITY_OUTPUT_CHAR('n'); } +#ifdef UNITY_OUTPUT_COLOR + /* print ANSI escape code */ + else if (*pch == 27 && *(pch + 1) == '[') + { + while (*pch && *pch != 'm') + { + UNITY_OUTPUT_CHAR(*pch); + pch++; + } + UNITY_OUTPUT_CHAR('m'); + } +#endif /* unprintable characters are shown as codes */ else { From 5ee55fefda8a7f89e32fdca9edc38beb9bf1933d Mon Sep 17 00:00:00 2001 From: Kate Hart Date: Mon, 30 Oct 2017 17:44:32 -0700 Subject: [PATCH 125/157] Fix missing TEST_ASSERT_EACH_EQUAL_HEX_MESSAGE --- src/unity.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unity.h b/src/unity.h index 0add3f5..f650e16 100644 --- a/src/unity.h +++ b/src/unity.h @@ -425,7 +425,7 @@ void tearDown(void); #define TEST_ASSERT_EACH_EQUAL_UINT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_UINT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_UINT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, (message)) -#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_HEX8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_HEX16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, (message)) #define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) From 629b86d5412e3a6768987610c67172de0eff538d Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Wed, 1 Nov 2017 11:36:26 -0400 Subject: [PATCH 126/157] Merge unity_setup.h into unity.h. --- auto/generate_test_runner.rb | 4 ++-- src/unity.c | 2 +- src/unity.h | 35 +++++++++++++++++++++++++++++------ src/unity_setup.h | 33 --------------------------------- 4 files changed, 32 insertions(+), 42 deletions(-) delete mode 100644 src/unity_setup.h diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index b049bca..344a2d0 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -157,10 +157,10 @@ class UnityTestRunnerGenerator output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */') create_runtest(output, mocks) output.puts("\n/*=======Automagically Detected Files To Include=====*/") - output.puts("#include \"#{@options[:framework]}.h\"") output.puts('#ifdef __WIN32__') - output.puts("#include \"#{@options[:framework]}_setup.h\"") + output.puts('#define UNITY_INCLUDE_SETUP_STUBS') output.puts('#endif') + output.puts("#include \"#{@options[:framework]}.h\"") output.puts('#include "cmock.h"') unless mocks.empty? output.puts('#include ') output.puts('#include ') diff --git a/src/unity.c b/src/unity.c index 739358f..ab1e2fd 100644 --- a/src/unity.c +++ b/src/unity.c @@ -4,8 +4,8 @@ [Released under MIT License. Please refer to license.txt for details] ============================================================================ */ +#define UNITY_INCLUDE_SETUP_STUBS #include "unity.h" -#include "unity_setup.h" #include /* If omitted from header, declare overrideable prototypes here so they're ready for use */ diff --git a/src/unity.h b/src/unity.h index 1fa8b94..d95f1c1 100644 --- a/src/unity.h +++ b/src/unity.h @@ -15,20 +15,43 @@ extern "C" #include "unity_internals.h" -/* These functions are intended to be called before and after each test. Unity - * provides stub implementations annotated as weak symbols (if supported by the - * compiler). */ +/*------------------------------------------------------- + * Test Setup / Teardown + *-------------------------------------------------------*/ + +/* These functions are intended to be called before and after each test. */ void setUp(void); void tearDown(void); /* These functions are intended to be called at the beginning and end of an * entire test suite. suiteTearDown() is passed the number of tests that - * failed, and its return value becomes the exit code of main(). Unity - * provides stub implementations annotated as weak symbols (if supported by the - * compiler). */ + * failed, and its return value becomes the exit code of main(). */ void suiteSetUp(void); int suiteTearDown(int num_failures); +/* If the compiler supports it, the following block provides stub + * implementations of the above functions as weak symbols. Note that on + * some platforms (MinGW for example), weak function implementations need + * to be in the same translation unit they are called from. This can be + * achieved by defining UNITY_INCLUDE_SETUP_STUBS before including unity.h. */ +#ifdef UNITY_INCLUDE_SETUP_STUBS + #ifdef UNITY_WEAK_ATTRIBUTE + UNITY_WEAK_ATTRIBUTE void setUp(void) { } + UNITY_WEAK_ATTRIBUTE void tearDown(void) { } + UNITY_WEAK_ATTRIBUTE void suiteSetUp(void) { } + UNITY_WEAK_ATTRIBUTE int suiteTearDown(int num_failures) { return num_failures; } + #elif defined(UNITY_WEAK_PRAGMA) + #pragma weak setUp + void setUp(void) { } + #pragma weak tearDown + void tearDown(void) { } + #pragma weak suiteSetUp + void suiteSetUp(void) { } + #pragma weak suiteTearDown + int suiteTearDown(int num_failures) { return num_failures; } + #endif +#endif + /*------------------------------------------------------- * Configuration Options *------------------------------------------------------- diff --git a/src/unity_setup.h b/src/unity_setup.h deleted file mode 100644 index 4672b76..0000000 --- a/src/unity_setup.h +++ /dev/null @@ -1,33 +0,0 @@ -/* ========================================== - Unity Project - A Test Framework for C - Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams - [Released under MIT License. Please refer to license.txt for details] -========================================== */ - -#ifndef UNITY_SETUP_H -#define UNITY_SETUP_H - -#include "unity_internals.h" - -/* On some platforms (MinGW for example), weak function implementations - * need to be in the same translation unit they are called from. This - * header can be included to provide implementations of setUp(), tearDown(), - * suiteSetUp(), and suiteTearDown(). */ - -#if defined(UNITY_WEAK_ATTRIBUTE) - UNITY_WEAK_ATTRIBUTE void setUp(void) { } - UNITY_WEAK_ATTRIBUTE void tearDown(void) { } - UNITY_WEAK_ATTRIBUTE void suiteSetUp(void) { } - UNITY_WEAK_ATTRIBUTE int suiteTearDown(int num_failures) { return num_failures; } -#elif defined(UNITY_WEAK_PRAGMA) - #pragma weak setUp - void setUp(void) { } - #pragma weak tearDown - void tearDown(void) { } - #pragma weak suiteSetUp - void suiteSetUp(void) { } - #pragma weak suiteTearDown - int suiteTearDown(int num_failures) { return num_failures; } -#endif - -#endif From 287e076962ec711cd2bdf08364a8df9ce51e106b Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Tue, 14 Nov 2017 16:26:16 -0500 Subject: [PATCH 127/157] Post release --- release/build.info | 2 +- release/version.info | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/release/build.info b/release/build.info index 50fb6ea..56d5912 100644 --- a/release/build.info +++ b/release/build.info @@ -1,2 +1,2 @@ -121 +122 diff --git a/release/version.info b/release/version.info index b674b92..cf12b30 100644 --- a/release/version.info +++ b/release/version.info @@ -1,2 +1,2 @@ -2.4.2 +2.4.3 From 53f0f95ef8af7f903ef0080d0492df33e517ed9c Mon Sep 17 00:00:00 2001 From: Krzysztof Kwiatkowski Date: Mon, 20 Nov 2017 09:46:30 +0000 Subject: [PATCH 128/157] Test runner generation: Wrap setjmp.h inclusion in ifdefs Auto generated test runner should generate a code which includes setjmp.h only if UNITY_EXCLUDE_SETJMP_H is not defined --- auto/generate_test_runner.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 344a2d0..427c513 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -162,7 +162,9 @@ class UnityTestRunnerGenerator output.puts('#endif') output.puts("#include \"#{@options[:framework]}.h\"") output.puts('#include "cmock.h"') unless mocks.empty? + output.puts('#ifndef UNITY_EXCLUDE_SETJMP_H') output.puts('#include ') + output.puts("#endif") output.puts('#include ') if @options[:defines] && !@options[:defines].empty? @options[:defines].each { |d| output.puts("#define #{d}") } From 4325773e7627eb6b6ba4779de264e42512fce538 Mon Sep 17 00:00:00 2001 From: Shreyas Balakrishna Date: Thu, 23 Nov 2017 14:58:45 +1300 Subject: [PATCH 129/157] Fix unsigned integer underflow in UnityAssertEqualIntArray --- src/unity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unity.c b/src/unity.c index 177af0f..209efe7 100644 --- a/src/unity.c +++ b/src/unity.c @@ -556,7 +556,7 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) UNITY_FAIL_AND_BAIL; - while (elements--) + while ((elements > 0) && elements--) { UNITY_INT expect_val; UNITY_INT actual_val; From b4aca70fd9e0ddf0afbdafb1b826f5edcfc1049b Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Wed, 6 Dec 2017 10:08:56 -0500 Subject: [PATCH 130/157] Update UnityGettingStartedGuide.md Added more detail on test naming. --- docs/UnityGettingStartedGuide.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/UnityGettingStartedGuide.md b/docs/UnityGettingStartedGuide.md index 50fc91c..81d0398 100644 --- a/docs/UnityGettingStartedGuide.md +++ b/docs/UnityGettingStartedGuide.md @@ -100,10 +100,11 @@ find setUp or tearDown when it links, you'll know you need to at least include an empty function for these. The majority of the file will be a series of test functions. Test functions -follow the convention of starting with the word "test" or "spec". You don't HAVE +follow the convention of starting with the word "test_" or "spec_". You don't HAVE to name them this way, but it makes it clear what functions are tests for other -developers. Test functions take no arguments and return nothing. All test -accounting is handled internally in Unity. +developers. Also, the automated scripts that come with Unity or Ceedling will default +to looking for test functions to be prefixed this way. Test functions take no arguments +and return nothing. All test accounting is handled internally in Unity. Finally, at the bottom of your test file, you will write a `main()` function. This function will call `UNITY_BEGIN()`, then `RUN_TEST` for each test, and From 07602308294c5f30b4d732cd87bd98d0c5e6a693 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Mon, 29 Jan 2018 21:00:46 +0100 Subject: [PATCH 131/157] Some minor changes - String split now works correctly for windows and unix (cross platform) - Removed unnecessary whitespaces in the xml output (beautifies the output) - Added support for TEST_IGNORE() (without message) --- auto/parse_output.rb | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/auto/parse_output.rb b/auto/parse_output.rb index f16cdb0..f3e076f 100644 --- a/auto/parse_output.rb +++ b/auto/parse_output.rb @@ -47,7 +47,12 @@ class ParseOutput @test_flag = true # Split the path name - test_name = test_suite_name.split('/') + test_name = if @class_name == 1 + test_suite_name.split('\\') # Windows + else + test_suite_name.split('/') # Unix based + end + # Remove the extension base_name = test_name[test_name.size - 1].split('.') @test_suite = 'test.' + base_name[0] @@ -78,11 +83,11 @@ class ParseOutput @array_list.push ' ' end - # Test was flagged as being ingored so format the output + # Test was flagged as being ignored so format the output def test_ignored(array) last_item = array.length - 1 test_name = array[last_item - 2] - reason = array[last_item].chomp + reason = array[last_item].chomp.lstrip test_suite_verify(array[@class_name]) printf "%-40s IGNORED\n", test_name @@ -96,7 +101,7 @@ class ParseOutput return unless @xml_out @array_list.push ' ' - @array_list.push ' ' + reason + ' ' + @array_list.push ' ' + reason + '' @array_list.push ' ' end @@ -104,7 +109,7 @@ class ParseOutput def test_failed(array) last_item = array.length - 1 test_name = array[last_item - 2] - reason = array[last_item].chomp + ' at line: ' + array[last_item - 3] + reason = array[last_item].chomp.lstrip + ' at line: ' + array[last_item - 3] test_suite_verify(array[@class_name]) printf "%-40s FAILED\n", test_name @@ -118,11 +123,11 @@ class ParseOutput return unless @xml_out @array_list.push ' ' - @array_list.push ' ' + reason + ' ' + @array_list.push ' ' + reason + '' @array_list.push ' ' end - # Figure out what OS we are running on. For now we are assuming if it's not Windows it must + # Figure out what OS we are running on. For now we are assuming if it's not Windows it must # be Unix based. def detect_os os = RUBY_PLATFORM.split('-') @@ -168,12 +173,16 @@ class ParseOutput if line.include? ':PASS' test_passed(line_array) test_pass += 1 - elsif line.include? ':FAIL:' + elsif line.include? ':FAIL' test_failed(line_array) test_fail += 1 elsif line.include? ':IGNORE:' test_ignored(line_array) test_ignore += 1 + elsif line.include? ':IGNORE' + line_array.push('No reason given') + test_ignored(line_array) + test_ignore += 1 elsif line.start_with? 'TEST(' if line.include? ' PASS' line_array = line.split(' ') @@ -199,7 +208,7 @@ class ParseOutput return unless @xml_out - heading = '' + heading = '' @array_list.insert(0, heading) write_xml_output end From 91a23535266b4c8a0cdc38e116bc9572d6912093 Mon Sep 17 00:00:00 2001 From: Jeremy Hannon Date: Sat, 10 Feb 2018 13:15:34 -0600 Subject: [PATCH 132/157] MISRA 16.4: param names match func decl & defn parameter names should match between declaration and definition. (MISRA 2004 rule 16.4) --- extras/fixture/src/unity_fixture.h | 2 +- extras/fixture/src/unity_fixture_internals.h | 4 ++-- src/unity_internals.h | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extras/fixture/src/unity_fixture.h b/extras/fixture/src/unity_fixture.h index 6f8d623..2dcf473 100644 --- a/extras/fixture/src/unity_fixture.h +++ b/extras/fixture/src/unity_fixture.h @@ -78,6 +78,6 @@ int UnityMain(int argc, const char* argv[], void (*runAllTests)(void)); #endif /* You must compile with malloc replacement, as defined in unity_fixture_malloc_overrides.h */ -void UnityMalloc_MakeMallocFailAfterCount(int count); +void UnityMalloc_MakeMallocFailAfterCount(int countdown); #endif /* UNITY_FIXTURE_H_ */ diff --git a/extras/fixture/src/unity_fixture_internals.h b/extras/fixture/src/unity_fixture_internals.h index aa0d9e7..00cee88 100644 --- a/extras/fixture/src/unity_fixture_internals.h +++ b/extras/fixture/src/unity_fixture_internals.h @@ -24,7 +24,7 @@ extern struct UNITY_FIXTURE_T UnityFixture; typedef void unityfunction(void); void UnityTestRunner(unityfunction* setup, - unityfunction* body, + unityfunction* testBody, unityfunction* teardown, const char* printableName, const char* group, @@ -37,7 +37,7 @@ void UnityMalloc_EndTest(void); int UnityGetCommandLineOptions(int argc, const char* argv[]); void UnityConcludeFixtureTest(void); -void UnityPointer_Set(void** ptr, void* newValue, UNITY_LINE_TYPE line); +void UnityPointer_Set(void** pointer, void* newValue, UNITY_LINE_TYPE line); void UnityPointer_UndoAllSets(void); void UnityPointer_Init(void); #ifndef UNITY_MAX_POINTERS diff --git a/src/unity_internals.h b/src/unity_internals.h index 67e219b..97f86ef 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -442,9 +442,9 @@ 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); +void UnityPrintNumber(const UNITY_INT number_to_print); void UnityPrintNumberUnsigned(const UNITY_UINT number); -void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles); +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print); #ifndef UNITY_EXCLUDE_FLOAT_PRINT void UnityPrintFloat(const UNITY_DOUBLE input_number); @@ -518,9 +518,9 @@ void UnityAssertNumbersWithin(const UNITY_UINT delta, const UNITY_LINE_TYPE lineNumber, const UNITY_DISPLAY_STYLE_T style); -void UnityFail(const char* message, const UNITY_LINE_TYPE line); +void UnityFail(const char* msg, const UNITY_LINE_TYPE line); -void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); +void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line); #ifndef UNITY_EXCLUDE_FLOAT void UnityAssertFloatsWithin(const UNITY_FLOAT delta, From 9bada282f471a5565f351bad346677f34ec36ec6 Mon Sep 17 00:00:00 2001 From: Jeremy Hannon Date: Sat, 10 Feb 2018 14:27:03 -0600 Subject: [PATCH 133/157] MISRA 19.10: parentheses around macro params MISRA 2004 rule 19.10: inside macros, surround each parameter usage with parentheses. --- src/unity.c | 14 +++++++------- src/unity_internals.h | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/unity.c b/src/unity.c index 03dcc02..136e9d7 100644 --- a/src/unity.c +++ b/src/unity.c @@ -677,13 +677,13 @@ 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) && ((expected < 0) == (actual < 0))) return 1; \ - if (UNITY_NAN_CHECK) return 1; \ - diff = actual - expected; \ - if (diff < 0) diff = -diff; \ - if (delta < 0) delta = -delta; \ - return !(isnan(diff) || isinf(diff) || (diff > delta)) +#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ + if (isinf(expected) && isinf(actual) && (((expected) < 0) == ((actual) < 0))) return 1; \ + if (UNITY_NAN_CHECK) return 1; \ + (diff) = (actual) - (expected); \ + 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 #define UNITY_NAN_CHECK isnan(expected) && isnan(actual) diff --git a/src/unity_internals.h b/src/unity_internals.h index 97f86ef..3ba6fae 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -422,8 +422,8 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int #define UNITY_SET_DETAILS(d1,d2) #else #define UNITY_CLR_DETAILS() { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } -#define UNITY_SET_DETAIL(d1) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = 0; } -#define UNITY_SET_DETAILS(d1,d2) { Unity.CurrentDetail1 = d1; Unity.CurrentDetail2 = d2; } +#define UNITY_SET_DETAIL(d1) { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = 0; } +#define UNITY_SET_DETAILS(d1,d2) { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = (d2); } #ifndef UNITY_DETAIL1_NAME #define UNITY_DETAIL1_NAME "Function" @@ -748,18 +748,18 @@ int UnityTestMatches(void); #define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) #define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) expected, sizeof(unsigned int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )expected, 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )expected, 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )expected, 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) -#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) expected, sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), sizeof(int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), sizeof(unsigned int)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) (expected), sizeof(int*)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) #define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) From dc9c7a7b4b316cb4e0605283f1ce981d7d6dfac9 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 11 Feb 2018 13:02:26 +0100 Subject: [PATCH 134/157] Removed leading whitespace --- auto/parse_output.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto/parse_output.rb b/auto/parse_output.rb index f3e076f..0f9de4d 100644 --- a/auto/parse_output.rb +++ b/auto/parse_output.rb @@ -123,7 +123,7 @@ class ParseOutput return unless @xml_out @array_list.push ' ' - @array_list.push ' ' + reason + '' + @array_list.push ' ' + reason + '' @array_list.push ' ' end From 4dfb512a275370a1ad2f9328d25946d9a650d4c6 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Mon, 12 Feb 2018 06:44:26 +0100 Subject: [PATCH 135/157] Added ".to_s" to the test suite name (explicit type conversion) --- auto/parse_output.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto/parse_output.rb b/auto/parse_output.rb index 0f9de4d..b5132a0 100644 --- a/auto/parse_output.rb +++ b/auto/parse_output.rb @@ -208,7 +208,7 @@ class ParseOutput return unless @xml_out - heading = '' + heading = '' @array_list.insert(0, heading) write_xml_output end From 8efa8ffc621e0986d82a77a63362a96af7d5ca59 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 13:57:34 +0100 Subject: [PATCH 136/157] Removed UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION to simplify the behaviour --- docs/UnityConfigurationGuide.md | 8 +++----- src/unity_internals.h | 32 ++++++++++++++++---------------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/docs/UnityConfigurationGuide.md b/docs/UnityConfigurationGuide.md index 96e5358..1b69828 100644 --- a/docs/UnityConfigurationGuide.md +++ b/docs/UnityConfigurationGuide.md @@ -248,7 +248,8 @@ _Example:_ Say you are forced to run your test suite on an embedded processor with no `stdout` option. You decide to route your test result output to a custom serial `RS232_putc()` function you wrote like thus: - + #include "RS232_header.h" + ... #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) #define UNITY_OUTPUT_FLUSH() RS232_flush() @@ -256,10 +257,7 @@ Say you are forced to run your test suite on an embedded processor with no _Note:_ `UNITY_OUTPUT_FLUSH()` can be set to the standard out flush function simply by -specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required. If you -specify a custom flush function instead with `UNITY_OUTPUT_FLUSH` directly, it -will declare an instance of your function by default. If you want to disable -this behavior, add `UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION`. +specifying `UNITY_USE_FLUSH_STDOUT`. No other defines are required. ##### `UNITY_WEAK_ATTRIBUTE` diff --git a/src/unity_internals.h b/src/unity_internals.h index 3ba6fae..415a29b 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -241,30 +241,30 @@ typedef UNITY_FLOAT_TYPE UNITY_FLOAT; * Output Method: stdout (DEFAULT) *-------------------------------------------------------*/ #ifndef UNITY_OUTPUT_CHAR -/* Default to using putchar, which is defined in stdio.h */ -#include -#define UNITY_OUTPUT_CHAR(a) (void)putchar(a) + /* Default to using putchar, which is defined in stdio.h */ + #include + #define UNITY_OUTPUT_CHAR(a) (void)putchar(a) #else /* If defined as something else, make sure we declare it here so it's ready for use */ #ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION -extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; + extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; #endif #endif #ifndef UNITY_OUTPUT_FLUSH -#ifdef UNITY_USE_FLUSH_STDOUT -/* We want to use the stdout flush utility */ -#include -#define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) + #ifdef UNITY_USE_FLUSH_STDOUT + /* We want to use the stdout flush utility */ + #include + #define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) + #else + /* We've specified nothing, therefore flush should just be ignored */ + #define UNITY_OUTPUT_FLUSH() + #endif #else -/* We've specified nothing, therefore flush should just be ignored */ -#define UNITY_OUTPUT_FLUSH() -#endif -#else -/* We've defined flush as something else, so make sure we declare it here so it's ready for use */ -#ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION -extern void UNITY_OMIT_OUTPUT_FLUSH_HEADER_DECLARATION; -#endif + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION + extern void UNITY_OUTPUT_FLUSH_HEADER_DECLARATION; + #endif #endif #ifndef UNITY_OUTPUT_FLUSH From fe950b9fa3466077b96fa93031f8f8fe1e2875bd Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 14:11:19 +0100 Subject: [PATCH 137/157] Makefile preparations --- test/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Makefile b/test/Makefile index c2710f1..f37b9ea 100644 --- a/test/Makefile +++ b/test/Makefile @@ -15,6 +15,8 @@ CFLAGS += -Wbad-function-cast -Wcast-qual -Wold-style-definition -Wshadow -Wstri CFLAGS += $(DEBUG) DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\) +#DEFINES += -D UNITY_OUTPUT_FLUSH=flushSpy +#DEFINES += -D UNITY_OUTPUT_FLUSH_HEADER_DECLARATION=flushSpy\(void\) DEFINES += $(UNITY_SUPPORT_64) $(UNITY_INCLUDE_DOUBLE) UNITY_SUPPORT_64 = -D UNITY_SUPPORT_64 UNITY_INCLUDE_DOUBLE = -D UNITY_INCLUDE_DOUBLE From 456759296b407189c0b48b02dd3c479b4ddff4f3 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 14:23:26 +0100 Subject: [PATCH 138/157] Added flushSpy --- test/Makefile | 4 ++-- test/testdata/testRunnerGenerator.c | 5 ++++- test/testdata/testRunnerGeneratorSmall.c | 5 ++++- test/testdata/testRunnerGeneratorWithMocks.c | 5 ++++- test/tests/testparameterized.c | 7 +++++-- test/tests/testunity.c | 8 ++++++++ 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/test/Makefile b/test/Makefile index f37b9ea..89ece81 100644 --- a/test/Makefile +++ b/test/Makefile @@ -15,8 +15,8 @@ CFLAGS += -Wbad-function-cast -Wcast-qual -Wold-style-definition -Wshadow -Wstri CFLAGS += $(DEBUG) DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\) -#DEFINES += -D UNITY_OUTPUT_FLUSH=flushSpy -#DEFINES += -D UNITY_OUTPUT_FLUSH_HEADER_DECLARATION=flushSpy\(void\) +DEFINES += -D UNITY_OUTPUT_FLUSH=flushSpy +DEFINES += -D UNITY_OUTPUT_FLUSH_HEADER_DECLARATION=flushSpy\(void\) DEFINES += $(UNITY_SUPPORT_64) $(UNITY_INCLUDE_DOUBLE) UNITY_SUPPORT_64 = -D UNITY_SUPPORT_64 UNITY_INCLUDE_DOUBLE = -D UNITY_INCLUDE_DOUBLE diff --git a/test/testdata/testRunnerGenerator.c b/test/testdata/testRunnerGenerator.c index e036dd9..7a4d63b 100644 --- a/test/testdata/testRunnerGenerator.c +++ b/test/testdata/testRunnerGenerator.c @@ -21,7 +21,10 @@ /* Support for Meta Test Rig */ #define TEST_CASE(a) -void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests + +/* Include Passthroughs for Linking Tests */ +void putcharSpy(int c) { (void)putchar(c);} +void flushSpy(int c) {} /* Global Variables Used During These Tests */ int CounterSetup = 0; diff --git a/test/testdata/testRunnerGeneratorSmall.c b/test/testdata/testRunnerGeneratorSmall.c index c683749..a8707fb 100644 --- a/test/testdata/testRunnerGeneratorSmall.c +++ b/test/testdata/testRunnerGeneratorSmall.c @@ -13,7 +13,10 @@ TEST_FILE("some_file.c") /* Support for Meta Test Rig */ #define TEST_CASE(a) -void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests + +/* Include Passthroughs for Linking Tests */ +void putcharSpy(int c) { (void)putchar(c);} +void flushSpy(int c) {} /* Global Variables Used During These Tests */ int CounterSetup = 0; diff --git a/test/testdata/testRunnerGeneratorWithMocks.c b/test/testdata/testRunnerGeneratorWithMocks.c index 7eb0b67..a7d622d 100644 --- a/test/testdata/testRunnerGeneratorWithMocks.c +++ b/test/testdata/testRunnerGeneratorWithMocks.c @@ -22,7 +22,10 @@ /* Support for Meta Test Rig */ #define TEST_CASE(a) -void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests + +/* Include Passthroughs for Linking Tests */ +void putcharSpy(int c) { (void)putchar(c);} +void flushSpy(int c) {} /* Global Variables Used During These Tests */ int CounterSetup = 0; diff --git a/test/tests/testparameterized.c b/test/tests/testparameterized.c index aa6d173..7be7f2b 100644 --- a/test/tests/testparameterized.c +++ b/test/tests/testparameterized.c @@ -8,10 +8,13 @@ #include #include "unity.h" -void putcharSpy(int c) { (void)putchar(c);} // include passthrough for linking tests - +/* Support for Meta Test Rig */ #define TEST_CASE(...) +/* Include Passthroughs for Linking Tests */ +void putcharSpy(int c) { (void)putchar(c);} +void flushSpy(int c) {} + #define EXPECT_ABORT_BEGIN \ if (TEST_PROTECT()) \ { diff --git a/test/tests/testunity.c b/test/tests/testunity.c index af06647..1884cbb 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3335,6 +3335,14 @@ void putcharSpy(int c) #endif } +#if 0 +void flushSpy(void) +{ + static unsigned int calls = 0; + calls++; // count every call +} +#endif + void testFailureCountIncrementsAndIsReturnedAtEnd(void) { UNITY_UINT savedFailures = Unity.TestFailures; From 25804f3ab4bec897019333022bbb44472f5b6534 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 14:46:42 +0100 Subject: [PATCH 139/157] Added flushSpy and the respective helper functions --- test/tests/testunity.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 1884cbb..3496990 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -54,6 +54,10 @@ void startPutcharSpy(void); void endPutcharSpy(void); char* getBufferPutcharSpy(void); +void startFlushSpy(void); +void endFlushSpy(void); +unsigned int getFlushSpyCalls(void); + static int SetToOneToFailInTearDown; static int SetToOneMeanWeAlreadyCheckedThisGuy; @@ -3335,13 +3339,18 @@ void putcharSpy(int c) #endif } -#if 0 +/* This is for counting the calls to the flushSpy */ +static int flushSpyEnabled; +static unsigned int flushSpyCalls = 0; + +void startFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 1; } +void endFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 0; } +unsigned int getFlushSpyCalls(void) { return flushSpyCalls; } + void flushSpy(void) { - static unsigned int calls = 0; - calls++; // count every call + if (flushSpyEnabled){ flushSpyCalls++; } } -#endif void testFailureCountIncrementsAndIsReturnedAtEnd(void) { @@ -3420,6 +3429,20 @@ void testPrintNumbersUnsigned32(void) #endif } + +/* This is for counting the calls to the flushSpy */ +static int flushSpyEnabled; +static unsigned int flushSpyCalls = 0; + +void startFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 1; } +void endFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 0; } +unsigned int getFlushSpyCalls(void) { return flushSpyCalls; } + +void flushSpy(void) +{ + if (flushSpyEnabled){ flushSpyCalls++; } +} + // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES 64 BIT SUPPORT ================== void testPrintNumbersInt64(void) From 37271e8a131d12bb73bfdf2a1fc5612d3f142b03 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 14:53:39 +0100 Subject: [PATCH 140/157] Fixed copy and paste error --- test/tests/testunity.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 3496990..0f74bc5 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3430,19 +3430,6 @@ void testPrintNumbersUnsigned32(void) } -/* This is for counting the calls to the flushSpy */ -static int flushSpyEnabled; -static unsigned int flushSpyCalls = 0; - -void startFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 1; } -void endFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 0; } -unsigned int getFlushSpyCalls(void) { return flushSpyCalls; } - -void flushSpy(void) -{ - if (flushSpyEnabled){ flushSpyCalls++; } -} - // ===================== THESE TEST WILL RUN IF YOUR CONFIG INCLUDES 64 BIT SUPPORT ================== void testPrintNumbersInt64(void) From 5f67ac6ab2b3adf37f9cf62bda1eb3efe1383f88 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 16:32:04 +0100 Subject: [PATCH 141/157] Fixed copy and paste error, changed the signature from: void flushSpy(int c) {} to: void flushSpy(void) {} --- test/testdata/testRunnerGenerator.c | 2 +- test/testdata/testRunnerGeneratorSmall.c | 2 +- test/testdata/testRunnerGeneratorWithMocks.c | 2 +- test/tests/testparameterized.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/testdata/testRunnerGenerator.c b/test/testdata/testRunnerGenerator.c index 7a4d63b..62989a0 100644 --- a/test/testdata/testRunnerGenerator.c +++ b/test/testdata/testRunnerGenerator.c @@ -24,7 +24,7 @@ /* Include Passthroughs for Linking Tests */ void putcharSpy(int c) { (void)putchar(c);} -void flushSpy(int c) {} +void flushSpy(void) {} /* Global Variables Used During These Tests */ int CounterSetup = 0; diff --git a/test/testdata/testRunnerGeneratorSmall.c b/test/testdata/testRunnerGeneratorSmall.c index a8707fb..c8aaf74 100644 --- a/test/testdata/testRunnerGeneratorSmall.c +++ b/test/testdata/testRunnerGeneratorSmall.c @@ -16,7 +16,7 @@ TEST_FILE("some_file.c") /* Include Passthroughs for Linking Tests */ void putcharSpy(int c) { (void)putchar(c);} -void flushSpy(int c) {} +void flushSpy(void) {} /* Global Variables Used During These Tests */ int CounterSetup = 0; diff --git a/test/testdata/testRunnerGeneratorWithMocks.c b/test/testdata/testRunnerGeneratorWithMocks.c index a7d622d..4aacbf9 100644 --- a/test/testdata/testRunnerGeneratorWithMocks.c +++ b/test/testdata/testRunnerGeneratorWithMocks.c @@ -25,7 +25,7 @@ /* Include Passthroughs for Linking Tests */ void putcharSpy(int c) { (void)putchar(c);} -void flushSpy(int c) {} +void flushSpy(void) {} /* Global Variables Used During These Tests */ int CounterSetup = 0; diff --git a/test/tests/testparameterized.c b/test/tests/testparameterized.c index 7be7f2b..136cd2f 100644 --- a/test/tests/testparameterized.c +++ b/test/tests/testparameterized.c @@ -13,7 +13,7 @@ /* Include Passthroughs for Linking Tests */ void putcharSpy(int c) { (void)putchar(c);} -void flushSpy(int c) {} +void flushSpy(void) {} #define EXPECT_ABORT_BEGIN \ if (TEST_PROTECT()) \ From 2480a6124e6ace123041bbdaa14b0f42bcefafe1 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 17:08:49 +0100 Subject: [PATCH 142/157] Added unit test for the call to flush --- test/tests/testunity.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 0f74bc5..5258b6e 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -56,7 +56,7 @@ char* getBufferPutcharSpy(void); void startFlushSpy(void); void endFlushSpy(void); -unsigned int getFlushSpyCalls(void); +int getFlushSpyCalls(void); static int SetToOneToFailInTearDown; static int SetToOneMeanWeAlreadyCheckedThisGuy; @@ -3341,11 +3341,11 @@ void putcharSpy(int c) /* This is for counting the calls to the flushSpy */ static int flushSpyEnabled; -static unsigned int flushSpyCalls = 0; +static int flushSpyCalls = 0; void startFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 1; } void endFlushSpy(void) { flushSpyCalls = 0; flushSpyEnabled = 0; } -unsigned int getFlushSpyCalls(void) { return flushSpyCalls; } +int getFlushSpyCalls(void) { return flushSpyCalls; } void flushSpy(void) { @@ -3357,9 +3357,13 @@ void testFailureCountIncrementsAndIsReturnedAtEnd(void) UNITY_UINT savedFailures = Unity.TestFailures; Unity.CurrentTestFailed = 1; startPutcharSpy(); // Suppress output + startFlushSpy(); + TEST_ASSERT_EQUAL(0, getFlushSpyCalls()); UnityConcludeTest(); endPutcharSpy(); TEST_ASSERT_EQUAL(savedFailures + 1, Unity.TestFailures); + TEST_ASSERT_EQUAL(1, getFlushSpyCalls()); + endFlushSpy(); startPutcharSpy(); // Suppress output int failures = UnityEnd(); From 436a46d8efea78c23b6fe163214a30ff2bb10f51 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 17:43:08 +0100 Subject: [PATCH 143/157] Got the tests running --- test/Makefile | 1 + test/tests/testunity.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/test/Makefile b/test/Makefile index 89ece81..f3981bd 100644 --- a/test/Makefile +++ b/test/Makefile @@ -17,6 +17,7 @@ DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\) DEFINES += -D UNITY_OUTPUT_FLUSH=flushSpy DEFINES += -D UNITY_OUTPUT_FLUSH_HEADER_DECLARATION=flushSpy\(void\) +DEFINES += -D USING_FLUSH_SPY DEFINES += $(UNITY_SUPPORT_64) $(UNITY_INCLUDE_DOUBLE) UNITY_SUPPORT_64 = -D UNITY_SUPPORT_64 UNITY_INCLUDE_DOUBLE = -D UNITY_INCLUDE_DOUBLE diff --git a/test/tests/testunity.c b/test/tests/testunity.c index 5258b6e..e05b2ba 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3357,13 +3357,17 @@ void testFailureCountIncrementsAndIsReturnedAtEnd(void) UNITY_UINT savedFailures = Unity.TestFailures; Unity.CurrentTestFailed = 1; startPutcharSpy(); // Suppress output +#ifdef USING_FLUSH_SPY startFlushSpy(); TEST_ASSERT_EQUAL(0, getFlushSpyCalls()); +#endif UnityConcludeTest(); endPutcharSpy(); TEST_ASSERT_EQUAL(savedFailures + 1, Unity.TestFailures); +#ifdef USING_FLUSH_SPY TEST_ASSERT_EQUAL(1, getFlushSpyCalls()); endFlushSpy(); +#endif startPutcharSpy(); // Suppress output int failures = UnityEnd(); From e038ae2ade1e9436322a92a043d3a5abf3866a6e Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Sun, 18 Feb 2018 18:44:58 +0100 Subject: [PATCH 144/157] Refactored the test evaluation of the flushSpy --- test/Makefile | 1 - test/tests/testunity.c | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/test/Makefile b/test/Makefile index f3981bd..89ece81 100644 --- a/test/Makefile +++ b/test/Makefile @@ -17,7 +17,6 @@ DEFINES = -D UNITY_OUTPUT_CHAR=putcharSpy DEFINES += -D UNITY_OUTPUT_CHAR_HEADER_DECLARATION=putcharSpy\(int\) DEFINES += -D UNITY_OUTPUT_FLUSH=flushSpy DEFINES += -D UNITY_OUTPUT_FLUSH_HEADER_DECLARATION=flushSpy\(void\) -DEFINES += -D USING_FLUSH_SPY DEFINES += $(UNITY_SUPPORT_64) $(UNITY_INCLUDE_DOUBLE) UNITY_SUPPORT_64 = -D UNITY_SUPPORT_64 UNITY_INCLUDE_DOUBLE = -D UNITY_INCLUDE_DOUBLE diff --git a/test/tests/testunity.c b/test/tests/testunity.c index e05b2ba..95c8280 100644 --- a/test/tests/testunity.c +++ b/test/tests/testunity.c @@ -3357,17 +3357,17 @@ void testFailureCountIncrementsAndIsReturnedAtEnd(void) UNITY_UINT savedFailures = Unity.TestFailures; Unity.CurrentTestFailed = 1; startPutcharSpy(); // Suppress output -#ifdef USING_FLUSH_SPY startFlushSpy(); TEST_ASSERT_EQUAL(0, getFlushSpyCalls()); -#endif UnityConcludeTest(); endPutcharSpy(); TEST_ASSERT_EQUAL(savedFailures + 1, Unity.TestFailures); -#ifdef USING_FLUSH_SPY +#if defined(UNITY_OUTPUT_FLUSH) && defined(UNITY_OUTPUT_FLUSH_HEADER_DECLARATION) TEST_ASSERT_EQUAL(1, getFlushSpyCalls()); - endFlushSpy(); +#else + TEST_ASSERT_EQUAL(0, getFlushSpyCalls()); #endif + endFlushSpy(); startPutcharSpy(); // Suppress output int failures = UnityEnd(); From 0937bf728caed9503e2b5aae306036f9bb68e088 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Thu, 22 Feb 2018 19:55:40 +0100 Subject: [PATCH 145/157] - Removed member variable @test_flag - Fixed stdout output if fixture is active - Refactored the state manipulation of @test_suite and moved it completely into test_suite_verify() --- auto/parse_output.rb | 61 ++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/auto/parse_output.rb b/auto/parse_output.rb index b5132a0..33d1f71 100644 --- a/auto/parse_output.rb +++ b/auto/parse_output.rb @@ -18,11 +18,11 @@ class ParseOutput def initialize - @test_flag = false @xml_out = false @array_list = false + @class_name = 0 + @test_suite = nil @total_tests = false - @class_index = false end # Set the flag to indicate if there will be an XML output file or not @@ -30,7 +30,7 @@ class ParseOutput @xml_out = true end - # if write our output to XML + # If write our output to XML def write_xml_output output = File.open('report.xml', 'w') output << "\n" @@ -40,12 +40,10 @@ class ParseOutput output << "\n" end - # This function will try and determine when the suite is changed. This is + # This function will try and determine when the suite is changed. This is # is the name that gets added to the classname parameter. def test_suite_verify(test_suite_name) - return if @test_flag - @test_flag = true # Split the path name test_name = if @class_name == 1 test_suite_name.split('\\') # Windows @@ -53,10 +51,15 @@ class ParseOutput test_suite_name.split('/') # Unix based end - # Remove the extension - base_name = test_name[test_name.size - 1].split('.') - @test_suite = 'test.' + base_name[0] - printf "New Test: %s\n", @test_suite + # Remove the extension and extract the base_name + base_name = test_name[test_name.size - 1].split('.')[0] + + # Is this a new test suite? + if base_name.to_s != @test_suite.to_s + @test_suite = base_name + printf "New Test: %s\n", @test_suite + end + end # Test was flagged as having passed so format the output @@ -77,7 +80,8 @@ class ParseOutput test_suite = array[0].sub('TEST(', '') test_suite = test_suite.sub(',', '') test_name = array[1].sub(')', '') - + test_suite_verify(array[@class_name]) + printf "%-40s PASS\n", test_name return unless @xml_out @array_list.push ' ' @@ -88,16 +92,21 @@ class ParseOutput last_item = array.length - 1 test_name = array[last_item - 2] reason = array[last_item].chomp.lstrip - test_suite_verify(array[@class_name]) - printf "%-40s IGNORED\n", test_name + class_name = array[@class_name] if test_name.start_with? 'TEST(' array2 = test_name.split(' ') - @test_suite = array2[0].sub('TEST(', '') - @test_suite = @test_suite.sub(',', '') + + test_suite = array2[0].sub('TEST(', '') + test_suite = test_suite.sub(',', '') + class_name = test_suite + test_name = array2[1].sub(')', '') end + test_suite_verify(class_name) + printf "%-40s IGNORED\n", test_name + return unless @xml_out @array_list.push ' ' @@ -110,16 +119,21 @@ class ParseOutput last_item = array.length - 1 test_name = array[last_item - 2] reason = array[last_item].chomp.lstrip + ' at line: ' + array[last_item - 3] - test_suite_verify(array[@class_name]) - printf "%-40s FAILED\n", test_name + class_name = array[@class_name] if test_name.start_with? 'TEST(' array2 = test_name.split(' ') - @test_suite = array2[0].sub('TEST(', '') - @test_suite = @test_suite.sub(',', '') + + test_suite = array2[0].sub('TEST(', '') + test_suite = test_suite.sub(',', '') + class_name = test_suite + test_name = array2[1].sub(')', '') end + test_suite_verify(class_name) + printf "%-40s FAILED\n", test_name + return unless @xml_out @array_list.push ' ' @@ -144,7 +158,6 @@ class ParseOutput # Main function used to parse the file that was captured. def process(name) - @test_flag = false @array_list = [] detect_os @@ -189,13 +202,7 @@ class ParseOutput test_passed_unity_fixture(line_array) test_pass += 1 end - # If none of the keywords are found there are no more tests for this suite so clear - # the test flag - else - @test_flag = false end - else - @test_flag = false end end puts '' @@ -208,7 +215,7 @@ class ParseOutput return unless @xml_out - heading = '' + heading = '' @array_list.insert(0, heading) write_xml_output end From ea51e2b35cb10fad3cbdc101142543daf96ea80f Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Thu, 22 Feb 2018 21:21:32 +0100 Subject: [PATCH 146/157] Refactored the os specific settings, it is now possible to convert both styles on every system (and even mixed) --- auto/parse_output.rb | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/auto/parse_output.rb b/auto/parse_output.rb index 33d1f71..02adbdc 100644 --- a/auto/parse_output.rb +++ b/auto/parse_output.rb @@ -23,6 +23,7 @@ class ParseOutput @class_name = 0 @test_suite = nil @total_tests = false + @path_delim = nil end # Set the flag to indicate if there will be an XML output file or not @@ -45,11 +46,7 @@ class ParseOutput def test_suite_verify(test_suite_name) # Split the path name - test_name = if @class_name == 1 - test_suite_name.split('\\') # Windows - else - test_suite_name.split('/') # Unix based - end + test_name = test_suite_name.split(@path_delim) # Remove the extension and extract the base_name base_name = test_name[test_name.size - 1].split('.')[0] @@ -59,7 +56,6 @@ class ParseOutput @test_suite = base_name printf "New Test: %s\n", @test_suite end - end # Test was flagged as having passed so format the output @@ -141,27 +137,24 @@ class ParseOutput @array_list.push ' ' end - # Figure out what OS we are running on. For now we are assuming if it's not Windows it must - # be Unix based. - def detect_os - os = RUBY_PLATFORM.split('-') - @class_name = if os.size == 2 - if os[1] == 'mingw32' - 1 - else - 0 - end - else - 0 - end + # Adjusts the os specific members according to the current path style + # (Windows or Unix based) + def set_os_specifics(line) + if line.include? '\\' + # Windows X:\Y\Z + @class_name = 1 + @path_delim = '\\' + else + # Unix Based /X/Y/Z + @class_name = 0 + @path_delim = '/' + end end # Main function used to parse the file that was captured. def process(name) @array_list = [] - detect_os - puts 'Parsing file: ' + name test_pass = 0 @@ -177,6 +170,7 @@ class ParseOutput # /.c:115:test_tc5100_initCanVoidPtrs:PASS # # where path is different on Unix vs Windows devices (Windows leads with a drive letter) + set_os_specifics(line) line_array = line.split(':') # If we were able to split the line then we can look to see if any of our target words From 7a437665864a99320e88606bb6e901a64bc763da Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Thu, 22 Feb 2018 21:33:11 +0100 Subject: [PATCH 147/157] - Fixed whitespaces and formatting - Added more expressiveness to the code - Fixed some of the rubocop hints --- auto/parse_output.rb | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/auto/parse_output.rb b/auto/parse_output.rb index 02adbdc..edb69fb 100644 --- a/auto/parse_output.rb +++ b/auto/parse_output.rb @@ -1,21 +1,22 @@ #============================================================ # Author: John Theofanopoulos -# A simple parser. Takes the output files generated during the build process and -# extracts information relating to the tests. +# A simple parser. Takes the output files generated during the +# build process and extracts information relating to the tests. # # Notes: # To capture an output file under VS builds use the following: # devenv [build instructions] > Output.txt & type Output.txt # -# To capture an output file under GCC/Linux builds use the following: +# To capture an output file under Linux builds use the following: # make | tee Output.txt # # To use this parser use the following command # ruby parseOutput.rb [options] [file] # options: -xml : produce a JUnit compatible XML file -# file : file to scan for results +# file: file to scan for results #============================================================ +# Parser class for handling the input file class ParseOutput def initialize @xml_out = false @@ -26,12 +27,12 @@ class ParseOutput @path_delim = nil end - # Set the flag to indicate if there will be an XML output file or not + # Set the flag to indicate if there will be an XML output file or not def set_xml_output @xml_out = true end - # If write our output to XML + # If write our output to XML def write_xml_output output = File.open('report.xml', 'w') output << "\n" @@ -44,18 +45,17 @@ class ParseOutput # This function will try and determine when the suite is changed. This is # is the name that gets added to the classname parameter. def test_suite_verify(test_suite_name) - # Split the path name test_name = test_suite_name.split(@path_delim) # Remove the extension and extract the base_name base_name = test_name[test_name.size - 1].split('.')[0] - # Is this a new test suite? - if base_name.to_s != @test_suite.to_s - @test_suite = base_name - printf "New Test: %s\n", @test_suite - end + # Return if the test suite hasn't changed + return unless base_name.to_s != @test_suite.to_s + + @test_suite = base_name + printf "New Test: %s\n", @test_suite end # Test was flagged as having passed so format the output @@ -78,6 +78,7 @@ class ParseOutput test_name = array[1].sub(')', '') test_suite_verify(array[@class_name]) printf "%-40s PASS\n", test_name + return unless @xml_out @array_list.push ' ' @@ -152,10 +153,10 @@ class ParseOutput end # Main function used to parse the file that was captured. - def process(name) + def process(file_name) @array_list = [] - puts 'Parsing file: ' + name + puts 'Parsing file: ' + file_name test_pass = 0 test_fail = 0 @@ -163,7 +164,7 @@ class ParseOutput puts '' puts '=================== RESULTS =====================' puts '' - File.open(name).each do |line| + File.open(file_name).each do |line| # Typical test lines look like this: # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented @@ -219,11 +220,11 @@ end parse_my_file = ParseOutput.new if ARGV.size >= 1 - ARGV.each do |a| - if a == '-xml' + ARGV.each do |arg| + if arg == '-xml' parse_my_file.set_xml_output else - parse_my_file.process(a) + parse_my_file.process(arg) break end end From 1994bf9d68d792ece33f2750d62bb7c361f12ed8 Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Mon, 26 Feb 2018 22:13:29 +0100 Subject: [PATCH 148/157] Fixed unity fixture output and added methods for each of the different outputs. Added documentation. Fixed some whitespaces. Refactored class_name to class_name_idx (expressiveness). Refactored the xml output to methods (extensibility). --- auto/parse_output.rb | 238 ++++++++++++++++++++++++++++--------------- 1 file changed, 156 insertions(+), 82 deletions(-) diff --git a/auto/parse_output.rb b/auto/parse_output.rb index edb69fb..cbafd7c 100644 --- a/auto/parse_output.rb +++ b/auto/parse_output.rb @@ -1,30 +1,38 @@ #============================================================ -# Author: John Theofanopoulos -# A simple parser. Takes the output files generated during the +# Author: John Theofanopoulos +# A simple parser. Takes the output files generated during the # build process and extracts information relating to the tests. # # Notes: # To capture an output file under VS builds use the following: -# devenv [build instructions] > Output.txt & type Output.txt +# devenv [build instructions] > Output.txt & type Output.txt # # To capture an output file under Linux builds use the following: # make | tee Output.txt # # To use this parser use the following command # ruby parseOutput.rb [options] [file] -# options: -xml : produce a JUnit compatible XML file -# file: file to scan for results +# options: -xml : produce a JUnit compatible XML file +# file: file to scan for results #============================================================ # Parser class for handling the input file class ParseOutput def initialize + # internal data + @class_name_idx = 0 + @path_delim = nil + + # xml output related @xml_out = false @array_list = false - @class_name = 0 + + # current suite name and statistics @test_suite = nil - @total_tests = false - @path_delim = nil + @total_tests = 0 + @test_passed = 0 + @test_failed = 0 + @test_ignored = 0 end # Set the flag to indicate if there will be an XML output file or not @@ -39,7 +47,34 @@ class ParseOutput @array_list.each do |item| output << item << "\n" end - output << "\n" + end + + # Pushes the suite info as xml to the array list, which will be written later + def push_xml_output_suite_info + # Insert opening tag at front + heading = '' + @array_list.insert(0, heading) + # Push back the closing tag + @array_list.push '' + end + + # Pushes xml output data to the array list, which will be written later + def push_xml_output_passed(test_name) + @array_list.push ' ' + end + + # Pushes xml output data to the array list, which will be written later + def push_xml_output_failed(test_name, reason) + @array_list.push ' ' + @array_list.push ' ' + reason + '' + @array_list.push ' ' + end + + # Pushes xml output data to the array list, which will be written later + def push_xml_output_ignored(test_name, reason) + @array_list.push ' ' + @array_list.push ' ' + reason + '' + @array_list.push ' ' end # This function will try and determine when the suite is changed. This is @@ -58,65 +93,76 @@ class ParseOutput printf "New Test: %s\n", @test_suite end - # Test was flagged as having passed so format the output - def test_passed(array) - last_item = array.length - 1 - test_name = array[last_item - 1] - test_suite_verify(array[@class_name]) - printf "%-40s PASS\n", test_name - - return unless @xml_out - - @array_list.push ' ' + # Prepares the line for verbose fixture output ("-v") + def prepare_fixture_line(line) + line = line.sub('IGNORE_TEST(', '') + line = line.sub('TEST(', '') + line = line.sub(')', ',') + line = line.chomp + array = line.split(',') + array.map { |x| x.to_s.lstrip.chomp } end # Test was flagged as having passed so format the output. # This is using the Unity fixture output and not the original Unity output. def test_passed_unity_fixture(array) - test_suite = array[0].sub('TEST(', '') - test_suite = test_suite.sub(',', '') - test_name = array[1].sub(')', '') - test_suite_verify(array[@class_name]) + class_name = array[0] + test_name = array[1] + test_suite_verify(class_name) + printf "%-40s PASS\n", test_name + + push_xml_output_passed(test_name) if @xml_out + end + + # Test was flagged as having failed so format the output. + # This is using the Unity fixture output and not the original Unity output. + def test_failed_unity_fixture(array) + class_name = array[0] + test_name = array[1] + test_suite_verify(class_name) + reason_array = array[2].split(':') + reason = reason_array[-1].lstrip.chomp + ' at line: ' + reason_array[-4] + + printf "%-40s FAILED\n", test_name + + push_xml_output_failed(test_name, reason) if @xml_out + end + + # Test was flagged as being ignored so format the output. + # This is using the Unity fixture output and not the original Unity output. + def test_ignored_unity_fixture(array) + class_name = array[0] + test_name = array[1] + reason = 'No reason given' + if array.size > 2 + reason_array = array[2].split(':') + tmp_reason = reason_array[-1].lstrip.chomp + reason = tmp_reason == 'IGNORE' ? 'No reason given' : tmp_reason + end + test_suite_verify(class_name) + printf "%-40s IGNORED\n", test_name + + push_xml_output_ignored(test_name, reason) if @xml_out + end + + # Test was flagged as having passed so format the output + def test_passed(array) + last_item = array.length - 1 + test_name = array[last_item - 1] + test_suite_verify(array[@class_name_idx]) printf "%-40s PASS\n", test_name return unless @xml_out - @array_list.push ' ' + push_xml_output_passed(test_name) if @xml_out end - # Test was flagged as being ignored so format the output - def test_ignored(array) - last_item = array.length - 1 - test_name = array[last_item - 2] - reason = array[last_item].chomp.lstrip - class_name = array[@class_name] - - if test_name.start_with? 'TEST(' - array2 = test_name.split(' ') - - test_suite = array2[0].sub('TEST(', '') - test_suite = test_suite.sub(',', '') - class_name = test_suite - - test_name = array2[1].sub(')', '') - end - - test_suite_verify(class_name) - printf "%-40s IGNORED\n", test_name - - return unless @xml_out - - @array_list.push ' ' - @array_list.push ' ' + reason + '' - @array_list.push ' ' - end - - # Test was flagged as having failed so format the line + # Test was flagged as having failed so format the line def test_failed(array) last_item = array.length - 1 test_name = array[last_item - 2] reason = array[last_item].chomp.lstrip + ' at line: ' + array[last_item - 3] - class_name = array[@class_name] + class_name = array[@class_name_idx] if test_name.start_with? 'TEST(' array2 = test_name.split(' ') @@ -131,11 +177,30 @@ class ParseOutput test_suite_verify(class_name) printf "%-40s FAILED\n", test_name - return unless @xml_out + push_xml_output_failed(test_name, reason) if @xml_out + end - @array_list.push ' ' - @array_list.push ' ' + reason + '' - @array_list.push ' ' + # Test was flagged as being ignored so format the output + def test_ignored(array) + last_item = array.length - 1 + test_name = array[last_item - 2] + reason = array[last_item].chomp.lstrip + class_name = array[@class_name_idx] + + if test_name.start_with? 'TEST(' + array2 = test_name.split(' ') + + test_suite = array2[0].sub('TEST(', '') + test_suite = test_suite.sub(',', '') + class_name = test_suite + + test_name = array2[1].sub(')', '') + end + + test_suite_verify(class_name) + printf "%-40s IGNORED\n", test_name + + push_xml_output_ignored(test_name, reason) if @xml_out end # Adjusts the os specific members according to the current path style @@ -143,11 +208,11 @@ class ParseOutput def set_os_specifics(line) if line.include? '\\' # Windows X:\Y\Z - @class_name = 1 + @class_name_idx = 1 @path_delim = '\\' else # Unix Based /X/Y/Z - @class_name = 0 + @class_name_idx = 0 @path_delim = '/' end end @@ -158,9 +223,9 @@ class ParseOutput puts 'Parsing file: ' + file_name - test_pass = 0 - test_fail = 0 - test_ignore = 0 + @test_passed = 0 + @test_failed = 0 + @test_ignored = 0 puts '' puts '=================== RESULTS =====================' puts '' @@ -175,43 +240,52 @@ class ParseOutput line_array = line.split(':') # If we were able to split the line then we can look to see if any of our target words - # were found. Case is important. - if (line_array.size >= 4) || (line.start_with? 'TEST(') - # Determine if this test passed - if line.include? ':PASS' + # were found. Case is important. + if (line_array.size >= 4) || (line.start_with? 'TEST(') || (line.start_with? 'IGNORE_TEST(') + + # check if the output is fixture output (with verbose flag "-v") + if (line.start_with? 'TEST(') || (line.start_with? 'IGNORE_TEST(') + line_array = prepare_fixture_line(line) + if line.include? ' PASS' + test_passed_unity_fixture(line_array) + @test_passed += 1 + elsif line.include? 'FAIL' + test_failed_unity_fixture(line_array) + @test_failed += 1 + elsif line.include? 'IGNORE' + test_ignored_unity_fixture(line_array) + @test_ignored += 1 + end + # normal output / fixture output (without verbose "-v") + elsif line.include? ':PASS' test_passed(line_array) - test_pass += 1 + @test_passed += 1 elsif line.include? ':FAIL' test_failed(line_array) - test_fail += 1 + @test_failed += 1 elsif line.include? ':IGNORE:' test_ignored(line_array) - test_ignore += 1 + @test_ignored += 1 elsif line.include? ':IGNORE' line_array.push('No reason given') test_ignored(line_array) - test_ignore += 1 - elsif line.start_with? 'TEST(' - if line.include? ' PASS' - line_array = line.split(' ') - test_passed_unity_fixture(line_array) - test_pass += 1 - end + @test_ignored += 1 end + @total_tests = @test_passed + @test_failed + @test_ignored end end puts '' puts '=================== SUMMARY =====================' puts '' - puts 'Tests Passed : ' + test_pass.to_s - puts 'Tests Failed : ' + test_fail.to_s - puts 'Tests Ignored : ' + test_ignore.to_s - @total_tests = test_pass + test_fail + test_ignore + puts 'Tests Passed : ' + @test_passed.to_s + puts 'Tests Failed : ' + @test_failed.to_s + puts 'Tests Ignored : ' + @test_ignored.to_s return unless @xml_out - heading = '' - @array_list.insert(0, heading) + # push information about the suite + push_xml_output_suite_info + # write xml output file write_xml_output end end From 38e1ee872ccf2989ff873415ce98fd20ba9c2f1a Mon Sep 17 00:00:00 2001 From: Fabian Zahn Date: Tue, 27 Feb 2018 07:23:18 +0100 Subject: [PATCH 149/157] Added some useful documentation which states the output formats that are parseable by this script. --- auto/parse_output.rb | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/auto/parse_output.rb b/auto/parse_output.rb index cbafd7c..f04508f 100644 --- a/auto/parse_output.rb +++ b/auto/parse_output.rb @@ -10,6 +10,11 @@ # To capture an output file under Linux builds use the following: # make | tee Output.txt # +# This script can handle the following output formats: +# - normal output (raw unity) +# - fixture output (unity_fixture.h/.c) +# - fixture output with verbose flag set ("-v") +# # To use this parser use the following command # ruby parseOutput.rb [options] [file] # options: -xml : produce a JUnit compatible XML file @@ -230,12 +235,25 @@ class ParseOutput puts '=================== RESULTS =====================' puts '' File.open(file_name).each do |line| - # Typical test lines look like this: + # Typical test lines look like these: + # ---------------------------------------------------- + # 1. normal output: # /.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0 # /.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented # /.c:115:test_tc5100_initCanVoidPtrs:PASS # - # where path is different on Unix vs Windows devices (Windows leads with a drive letter) + # 2. fixture output + # /.c:63:TEST(, ):FAIL: Expected 0x00001234 Was 0x00005A5A + # /.c:36:TEST(, ):IGNORE + # Note: "PASS" information won't be generated in this mode + # + # 3. fixture output with verbose information ("-v") + # TEST()/:168::FAIL: Expected 0x8D Was 0x8C + # TEST(, )/:22::IGNORE: This Test Was Ignored On Purpose + # IGNORE_TEST() + # TEST() PASS + # + # Note: Where path is different on Unix vs Windows devices (Windows leads with a drive letter)! set_os_specifics(line) line_array = line.split(':') From ceecf1fae8129662381559686fd9adfe7b12a1cf Mon Sep 17 00:00:00 2001 From: Trond Einar Snekvik Date: Thu, 7 Jun 2018 10:06:39 +0200 Subject: [PATCH 150/157] Add support for :mock_suffix Adds support for :mock_suffix when generating mock setup and teardown functions. Also documents both prefix and suffix in the helper script guide. --- auto/generate_test_runner.rb | 3 ++- docs/UnityHelperScriptsGuide.md | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 427c513..84daa42 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -26,6 +26,7 @@ class UnityTestRunnerGenerator framework: :unity, test_prefix: 'test|spec|should', mock_prefix: 'Mock', + mock_suffix: '', setup_name: 'setUp', teardown_name: 'tearDown', main_name: 'main', # set to :auto to automatically generate each time @@ -148,7 +149,7 @@ class UnityTestRunnerGenerator mock_headers = [] includes.each do |include_path| include_file = File.basename(include_path) - mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}/i + mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}.*#{@options[:mock_suffix]}$/i end mock_headers end diff --git a/docs/UnityHelperScriptsGuide.md b/docs/UnityHelperScriptsGuide.md index 4242990..8b0df1b 100644 --- a/docs/UnityHelperScriptsGuide.md +++ b/docs/UnityHelperScriptsGuide.md @@ -159,6 +159,12 @@ CMock (see CMock documentation). This generates extra variables required for everything to run smoothly. If you provide the same YAML to the generator as used in CMock's configuration, you've already configured the generator properly. +##### `:mock_prefix` and `:mock_suffix` + +Unity automatically generates calls to Init, Verify and Destroy for every file +included in the main test file that starts with the given mock prefix and ends +with the given mock suffix, file extension not included. By default, Unity +assumes a `Mock` prefix and no suffix. ##### `:plugins` From 40af5e23eb8ff9402ce1d0419ff44513554e1c02 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Wed, 18 Jul 2018 11:20:29 -0400 Subject: [PATCH 151/157] Update travis to specify valid version of rubocop --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bd165b1..5a15f03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ before_install: - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --assume-yes --quiet gcc-multilib; fi install: - gem install rspec - - gem install rubocop + - gem install rubocop -v 0.57.2 script: - cd test && rake ci - make -s From 2c5d09bf203a88bcbda5da19843437fcfe7b4525 Mon Sep 17 00:00:00 2001 From: Xenoamor Date: Wed, 18 Jul 2018 16:05:10 +0100 Subject: [PATCH 152/157] Flush unity output before a potential longjmp Flush the unity stdout buffer before calling TEST_ABORT(). This is because if TEST_PROTECT() has not previously been called this will cause a segmentation fault and the stdout buffer will fail to print Although the segmentation fault will still occur, the error that caused it will at least be displayed --- src/unity.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/unity.c b/src/unity.c index 136e9d7..44a8003 100644 --- a/src/unity.c +++ b/src/unity.c @@ -14,8 +14,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; TEST_ABORT(); } -#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; TEST_ABORT(); } +#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } +#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } #define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return struct UNITY_STORAGE_T Unity; From ac3cde30f5257c13bffae48676a69d410dcb639f Mon Sep 17 00:00:00 2001 From: Roland Stahn Date: Sat, 21 Jul 2018 16:57:53 +0200 Subject: [PATCH 153/157] Added notes on _MESSAGE assertions (#331) Added notes, why _MESSAGE assertions do not support printf style formatting and how users can work around this limitation (see #331) --- docs/UnityAssertionsReference.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/UnityAssertionsReference.md b/docs/UnityAssertionsReference.md index 2dcf5e3..d569e76 100644 --- a/docs/UnityAssertionsReference.md +++ b/docs/UnityAssertionsReference.md @@ -104,6 +104,15 @@ becomes messageified like thus... TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message ) +Notes: +- The `_MESSAGE` variants intentionally do not support `printf` style formatting + since many embedded projects don't support or avoid `printf` for various reasons. + It is possible to use `sprintf` before the assertion to assemble a complex fail + message, if necessary. +- If you want to output a counter value within an assertion fail message (e.g. from + a loop) , building up an array of results and then using one of the `_ARRAY` + assertions (see below) might be a handy alternative to `sprintf`. + #### TEST_ASSERT_X_ARRAY Variants From 6a1d2e8d44fb256ee47368bdee49ed8eb020ee4d Mon Sep 17 00:00:00 2001 From: Roland Stahn Date: Wed, 25 Jul 2018 22:57:44 +0200 Subject: [PATCH 154/157] Fix LESS_OR_EQUAL_MESSAGE asserts for HEX32/HEX64 Macros TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE() and TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE() need to be mapped to UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEXnn() instead of UNITY_TEST_ASSERT_SMALLER_THAN_HEXnn() --- src/unity.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/unity.h b/src/unity.h index 32ff0e6..a0c301d 100644 --- a/src/unity.h +++ b/src/unity.h @@ -402,8 +402,8 @@ int suiteTearDown(int num_failures); #define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) #define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) -#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (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)) From fb4b13904339b90b51a57b5cca9e6efb4681402d Mon Sep 17 00:00:00 2001 From: elliot Date: Sat, 28 Jul 2018 20:14:00 +0100 Subject: [PATCH 155/157] Fixed UNITY_EXEC_TIME_STOP macro ifdef --- src/unity_internals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unity_internals.h b/src/unity_internals.h index 9c0d4ee..351d9fe 100644 --- a/src/unity_internals.h +++ b/src/unity_internals.h @@ -307,7 +307,7 @@ typedef UNITY_FLOAT_TYPE UNITY_FLOAT; #endif #endif -#ifndef UNITY_EXEC_TIME_START +#ifndef UNITY_EXEC_TIME_STOP #ifdef UNITY_INCLUDE_EXEC_TIME #define UNITY_EXEC_TIME_STOP() Unity.CurrentTestStopTime = UNITY_CLOCK_MS(); #else From e72dfafd440054ccdf6c8034112e36cd0156c1fb Mon Sep 17 00:00:00 2001 From: Deryew <40446717+Deryew@users.noreply.github.com> Date: Mon, 30 Jul 2018 10:53:02 +0800 Subject: [PATCH 156/157] Fixed some grammar errors on docs Fixed grammar errors and some sentences to make it easier to understand --- docs/ThrowTheSwitchCodingStandard.md | 19 +++++++++---------- docs/UnityAssertionsReference.md | 4 ++-- docs/UnityConfigurationGuide.md | 8 ++++---- docs/UnityGettingStartedGuide.md | 4 ++-- docs/UnityHelperScriptsGuide.md | 4 ++-- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/docs/ThrowTheSwitchCodingStandard.md b/docs/ThrowTheSwitchCodingStandard.md index a85adef..bf4c099 100644 --- a/docs/ThrowTheSwitchCodingStandard.md +++ b/docs/ThrowTheSwitchCodingStandard.md @@ -1,4 +1,4 @@ -# ThrowTheSwitch.org Coding Standard +# ThrowTheSwitch.org Coding Standard Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part, we try to follow these standards to unify our contributors' code into a cohesive @@ -11,7 +11,7 @@ and we'll try to be polite when we notice yours. ## Why Have A Coding Standard? -Being consistent makes code easier to understand. We've made an attempt to keep +Being consistent makes code easier to understand. We've tried to keep our standard simple because we also believe that we can only expect someone to follow something that is understandable. Please do your best. @@ -51,11 +51,11 @@ much as they can, but give the user the power to override it when it's wrong. Let's talk about naming things. Programming is all about naming things. We name files, functions, variables, and so much more. While we're not always going to -find the best name for something, we actually put quite a bit of effort into +find the best name for something, we actually put a bit of effort into finding *What Something WANTS to be Called*™. -When naming things, we more or less follow this hierarchy, the first being the -most important to us (but we do all four whenever possible): +When naming things, we follow this hierarchy, the first being the +most important to us (but we do all four when possible): 1. Readable 2. Descriptive 3. Consistent @@ -74,7 +74,7 @@ abbreviations (sticking to ones we feel are common). We like descriptive names for things, especially functions and variables. Finding the right name for something is an important endeavor. You might notice from poking around our code that this often results in names that are a little -longer than the average. Guilty. We're okay with a tiny bit more typing if it +longer than the average. Guilty. We're okay with a bit more typing if it means our code is easier to understand. There are two exceptions to this rule that we also stick to as religiously as @@ -82,8 +82,7 @@ possible: First, while we realize hungarian notation (and similar systems for encoding type information into variable names) is providing a more descriptive name, we -feel that (for the average developer) it takes away from readability and -therefore is to be avoided. +feel that (for the average developer) it takes away from readability and is to be avoided. Second, loop counters and other local throw-away variables often have a purpose which is obvious. There's no need, therefore, to get carried away with complex @@ -128,7 +127,7 @@ the same. It will only hurt a little. We promise. #### Whitespace Our C-style is to use spaces and to use 4 of them per indent level. It's a nice -power-of-2 number that looks decent on a wide screen. We have no more reason +power-of-2 number that looks decent on a wide-screen. We have no more reason than that. We break that rule when we have lines that wrap (macros or function arguments or whatnot). When that happens, we like to indent further to line things up in nice tidy columns. @@ -200,7 +199,7 @@ that happens, we like to indent further to line things up in nice tidy columns. ## Documentation -Egad. Really? We use markdown and we like pdf files because they can be made to +Egad. Really? We use mark down and we like pdf files because they can be made to look nice while still being portable. Good enough? diff --git a/docs/UnityAssertionsReference.md b/docs/UnityAssertionsReference.md index d569e76..eb855f3 100644 --- a/docs/UnityAssertionsReference.md +++ b/docs/UnityAssertionsReference.md @@ -80,7 +80,7 @@ marked as an optional parameter because some assertions only need a single "actual" parameter (e.g. null check). "Size/count" refers to string lengths, number of array elements, etc. -Many of Unity's assertions are apparent duplications in that the same data type +Many of Unity's assertions are clear duplications in that the same data type is handled by several assertions. The differences among these are in how failure messages are presented. For instance, a `_HEX` variant of an assertion prints the expected and actual values of that assertion formatted as hexadecimal. @@ -703,7 +703,7 @@ point value. So what happens when it's zero? Zero - even more than other floating point values - can be represented many different ways. It doesn't matter if you have -0 x 20or 0 x 263.It's still zero, right? Luckily, if you +0 x 20 or 0 x 263.It's still zero, right? Luckily, if you subtract these values from each other, they will always produce a difference of zero, which will still fall between 0 plus or minus a delta of 0. So it still works! diff --git a/docs/UnityConfigurationGuide.md b/docs/UnityConfigurationGuide.md index 1b69828..dace20c 100644 --- a/docs/UnityConfigurationGuide.md +++ b/docs/UnityConfigurationGuide.md @@ -1,4 +1,4 @@ -# Unity Configuration Guide +# Unity Configuration Guide ## C Standards, Compilers and Microcontrollers @@ -19,7 +19,7 @@ definitions. A couple are macros with arguments. They live inside the unity_internals.h header file. We don't necessarily recommend opening that file unless you really need to. That file is proof that a cross-platform library is challenging to build. From a more positive perspective, it is also proof that a -great deal of complexity can be centralized primarily to one place in order to +great deal of complexity can be centralized primarily to one place to provide a more consistent and simple experience elsewhere. @@ -58,7 +58,7 @@ sizes. It starts off by trying to do it automatically. ##### `UNITY_EXCLUDE_STDINT_H` The first thing that Unity does to guess your types is check `stdint.h`. -This file includes defines like `UINT_MAX` that Unity can make use of to +This file includes defines like `UINT_MAX` that Unity can use to learn a lot about your system. It's possible you don't want it to do this (um. why not?) or (more likely) it's possible that your system doesn't support `stdint.h`. If that's the case, you're going to want to define this. @@ -222,7 +222,7 @@ In addition to the options listed above, there are a number of other options which will come in handy to customize Unity's behavior for your specific toolchain. It is possible that you may not need to touch any of these... but certain platforms, particularly those running in simulators, may need to jump -through extra hoops to operate properly. These macros will help in those +through extra hoops to run properly. These macros will help in those situations. diff --git a/docs/UnityGettingStartedGuide.md b/docs/UnityGettingStartedGuide.md index 81d0398..5e4427c 100644 --- a/docs/UnityGettingStartedGuide.md +++ b/docs/UnityGettingStartedGuide.md @@ -11,7 +11,7 @@ functional. The core Unity test framework is three files: a single C file and a couple header files. These team up to provide functions and macros to make testing easier. -Unity was designed to be cross platform. It works hard to stick with C standards +Unity was designed to be cross-platform. It works hard to stick with C standards while still providing support for the many embedded C compilers that bend the rules. Unity has been used with many compilers, including GCC, IAR, Clang, Green Hills, Microchip, and MS Visual Studio. It's not much work to get it to @@ -149,7 +149,7 @@ int main(void) { } ``` -It's possible that you will require more customization than this, eventually. +It's possible that you will need more customization than this, eventually. For that sort of thing, you're going to want to look at the configuration guide. This should be enough to get you going, though. diff --git a/docs/UnityHelperScriptsGuide.md b/docs/UnityHelperScriptsGuide.md index 8b0df1b..12d68d3 100644 --- a/docs/UnityHelperScriptsGuide.md +++ b/docs/UnityHelperScriptsGuide.md @@ -3,7 +3,7 @@ ## With a Little Help From Our Friends Sometimes what it takes to be a really efficient C programmer is a little non-C. -The Unity project includes a couple Ruby scripts for making your life just a tad +The Unity project includes a couple of Ruby scripts for making your life just a tad easier. They are completely optional. If you choose to use them, you'll need a copy of Ruby, of course. Just install whatever the latest version is, and it is likely to work. You can find Ruby at [ruby-lang.org](https://ruby-labg.org/). @@ -105,7 +105,7 @@ UnityTestRunnerGenerator.new.run(testfile, runner_name, options) If you have multiple files to generate in a build script (such as a Rakefile), you might want to instantiate a generator object with your options and call it -to generate each runner thereafter. Like thus: +to generate each runner afterwards. Like thus: ```Ruby gen = UnityTestRunnerGenerator.new(options) From 9987824da794ce53ff77137f237dcebec91f3dd6 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Thu, 9 Aug 2018 08:48:08 -0400 Subject: [PATCH 157/157] Added support to inject "extern C" into runners when generated. --- auto/generate_test_runner.rb | 3 +++ docs/UnityHelperScriptsGuide.md | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/auto/generate_test_runner.rb b/auto/generate_test_runner.rb index 84daa42..2f14966 100644 --- a/auto/generate_test_runner.rb +++ b/auto/generate_test_runner.rb @@ -197,9 +197,11 @@ class UnityTestRunnerGenerator output.puts("\n/*=======External Functions This Runner Calls=====*/") output.puts("extern void #{@options[:setup_name]}(void);") output.puts("extern void #{@options[:teardown_name]}(void);") + output.puts("\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif") if @options[:externc] tests.each do |test| output.puts("extern void #{test[:test]}(#{test[:call] || 'void'});") end + output.puts("#ifdef __cplusplus\n}\n#endif") if @options[:externc] output.puts('') end @@ -439,6 +441,7 @@ if $0 == __FILE__ ' *.h - header files are added as #includes in runner', ' options:', ' -cexception - include cexception support', + ' -externc - add extern "C" for cpp support', ' --setup_name="" - redefine setUp func name to something else', ' --teardown_name="" - redefine tearDown func name to something else', ' --main_name="" - redefine main func name to something else', diff --git a/docs/UnityHelperScriptsGuide.md b/docs/UnityHelperScriptsGuide.md index 12d68d3..da56db2 100644 --- a/docs/UnityHelperScriptsGuide.md +++ b/docs/UnityHelperScriptsGuide.md @@ -159,6 +159,12 @@ CMock (see CMock documentation). This generates extra variables required for everything to run smoothly. If you provide the same YAML to the generator as used in CMock's configuration, you've already configured the generator properly. + +##### `:externc` + +This option should be defined if you are mixing C and CPP and want your test +runners to automatically include extern "C" support when they are generated. + ##### `:mock_prefix` and `:mock_suffix` Unity automatically generates calls to Init, Verify and Destroy for every file