diff --git a/lib/cmock_generator.rb b/lib/cmock_generator.rb index 9e93f10..c74c58d 100644 --- a/lib/cmock_generator.rb +++ b/lib/cmock_generator.rb @@ -199,20 +199,22 @@ class CMockGenerator file << "#{function_mod_and_rettype} #{function[:name]}(#{args_string})\n" file << "{\n" file << " UNITY_LINE_TYPE cmock_line = TEST_LINE_NUM;\n" + file << " UNITY_SET_DETAIL(\"#{function[:name]}\");\n" file << " CMOCK_#{function[:name]}_CALL_INSTANCE* cmock_call_instance = (CMOCK_#{function[:name]}_CALL_INSTANCE*)CMock_Guts_GetAddressFor(Mock.#{function[:name]}_CallInstance);\n" file << " Mock.#{function[:name]}_CallInstance = CMock_Guts_MemNext(Mock.#{function[:name]}_CallInstance);\n" file << @plugins.run(:mock_implementation_precheck, function) - file << " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"Function '#{function[:name]}' called more times than expected.\");\n" + file << " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringCalledMore);\n" file << " cmock_line = cmock_call_instance->LineNumber;\n" if (@ordered) file << " if (cmock_call_instance->CallOrder > ++GlobalVerifyOrder)\n" - file << " UNITY_TEST_FAIL(cmock_line, \"Function '#{function[:name]}' called earlier than expected.\");\n" + file << " UNITY_TEST_FAIL(cmock_line, CMockStringCalledEarly);\n" file << " if (cmock_call_instance->CallOrder < GlobalVerifyOrder)\n" - file << " UNITY_TEST_FAIL(cmock_line, \"Function '#{function[:name]}' called later than expected.\");\n" - # file << " UNITY_TEST_ASSERT((cmock_call_instance->CallOrder == ++GlobalVerifyOrder), cmock_line, \"Out of order function calls. Function '#{function[:name]}'\");\n" + file << " UNITY_TEST_FAIL(cmock_line, CMockStringCalledLate);\n" + # file << " UNITY_TEST_ASSERT((cmock_call_instance->CallOrder == ++GlobalVerifyOrder), cmock_line, CMockStringCallOrder);\n" end return_type = function[:return][:const?] ? "(const #{function[:return][:type]})" : ((function[:return][:type] =~ /cmock/) ? "(#{function[:return][:type]})" : '') file << @plugins.run(:mock_implementation, function) + file << " UNITY_CLR_DETAILS();\n" file << " return #{return_type}cmock_call_instance->ReturnVal;\n" unless (function[:return][:void?]) file << "}\n\n" end diff --git a/lib/cmock_generator_plugin_cexception.rb b/lib/cmock_generator_plugin_cexception.rb index c9e7e2f..abd9059 100644 --- a/lib/cmock_generator_plugin_cexception.rb +++ b/lib/cmock_generator_plugin_cexception.rb @@ -2,13 +2,13 @@ # CMock Project - Automatic Mock Generation for C # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams # [Released under MIT License. Please refer to license.txt for details] -# ========================================== +# ========================================== class CMockGeneratorPluginCexception attr_reader :priority attr_reader :config, :utils - + def initialize(config, utils) @config = config @utils = utils @@ -22,7 +22,7 @@ class CMockGeneratorPluginCexception def instance_typedefs(function) " CEXCEPTION_T ExceptionToThrow;\n" end - + def mock_function_declarations(function) if (function[:args_string] == "void") return "#define #{function[:name]}_ExpectAndThrow(cmock_to_throw) #{function[:name]}_CMockExpectAndThrow(__LINE__, cmock_to_throw)\n" + @@ -34,7 +34,8 @@ class CMockGeneratorPluginCexception end def mock_implementation(function) - " if (cmock_call_instance->ExceptionToThrow != CEXCEPTION_NONE)\n {\n" + + " if (cmock_call_instance->ExceptionToThrow != CEXCEPTION_NONE)\n {\n" + + " UNITY_CLR_DETAILS();\n" + " Throw(cmock_call_instance->ExceptionToThrow);\n }\n" end diff --git a/lib/cmock_generator_plugin_expect.rb b/lib/cmock_generator_plugin_expect.rb index 5359b10..ba59e78 100644 --- a/lib/cmock_generator_plugin_expect.rb +++ b/lib/cmock_generator_plugin_expect.rb @@ -2,7 +2,7 @@ # CMock Project - Automatic Mock Generation for C # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams # [Released under MIT License. Please refer to license.txt for details] -# ========================================== +# ========================================== class CMockGeneratorPluginExpect @@ -17,7 +17,7 @@ class CMockGeneratorPluginExpect @unity_helper = @utils.helpers[:unity_helper] @priority = 5 end - + def instance_typedefs(function) lines = "" lines << " #{function[:return][:type]} ReturnVal;\n" unless (function[:return][:void?]) @@ -27,7 +27,7 @@ class CMockGeneratorPluginExpect end lines end - + def mock_function_declarations(function) if (function[:args].empty?) if (function[:return][:void?]) @@ -37,7 +37,7 @@ class CMockGeneratorPluginExpect return "#define #{function[:name]}_ExpectAndReturn(cmock_retval) #{function[:name]}_CMockExpectAndReturn(__LINE__, cmock_retval)\n" + "void #{function[:name]}_CMockExpectAndReturn(UNITY_LINE_TYPE cmock_line, #{function[:return][:str]});\n" end - else + else if (function[:return][:void?]) return "#define #{function[:name]}_Expect(#{function[:args_call]}) #{function[:name]}_CMockExpect(__LINE__, #{function[:args_call]})\n" + "void #{function[:name]}_CMockExpect(UNITY_LINE_TYPE cmock_line, #{function[:args_string]});\n" @@ -47,7 +47,7 @@ class CMockGeneratorPluginExpect end end end - + def mock_implementation(function) lines = "" function[:args].each do |arg| @@ -55,7 +55,7 @@ class CMockGeneratorPluginExpect end lines end - + def mock_interfaces(function) lines = "" func_name = function[:name] @@ -75,12 +75,14 @@ class CMockGeneratorPluginExpect lines << @utils.code_add_base_expectation(func_name) lines << @utils.code_call_argument_loader(function) lines << @utils.code_assign_argument_quickly("cmock_call_instance->ReturnVal", function[:return]) unless (function[:return][:void?]) + lines << " UNITY_CLR_DETAILS();\n" lines << "}\n\n" end - + def mock_verify(function) func_name = function[:name] - " UNITY_TEST_ASSERT(CMOCK_GUTS_NONE == Mock.#{func_name}_CallInstance, cmock_line, \"Function '#{func_name}' called less times than expected.\");\n" + " UNITY_SET_DETAIL(\"#{function[:name]}\");\n" + + " UNITY_TEST_ASSERT(CMOCK_GUTS_NONE == Mock.#{func_name}_CallInstance, cmock_line, CMockStringCalledLess);\n" end end diff --git a/lib/cmock_generator_plugin_ignore.rb b/lib/cmock_generator_plugin_ignore.rb index f031d72..26ad90f 100644 --- a/lib/cmock_generator_plugin_ignore.rb +++ b/lib/cmock_generator_plugin_ignore.rb @@ -35,6 +35,7 @@ class CMockGeneratorPluginIgnore def mock_implementation_precheck(function) lines = " if (Mock.#{function[:name]}_IgnoreBool)\n {\n" + lines << " UNITY_CLR_DETAILS();\n" if (function[:return][:void?]) lines << " return;\n }\n" else diff --git a/lib/cmock_generator_plugin_ignore_arg.rb b/lib/cmock_generator_plugin_ignore_arg.rb index 87ccbb2..4ea6350 100644 --- a/lib/cmock_generator_plugin_ignore_arg.rb +++ b/lib/cmock_generator_plugin_ignore_arg.rb @@ -35,7 +35,7 @@ class CMockGeneratorPluginIgnoreArg lines << "{\n" lines << " CMOCK_#{func_name}_CALL_INSTANCE* cmock_call_instance = " + "(CMOCK_#{func_name}_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.#{func_name}_CallInstance));\n" - lines << " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"#{arg_name} IgnoreArg called before Expect on '#{func_name}'.\");\n" + lines << " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp);\n" lines << " cmock_call_instance->IgnoreArg_#{arg_name} = 1;\n" lines << "}\n\n" end diff --git a/lib/cmock_generator_plugin_return_thru_ptr.rb b/lib/cmock_generator_plugin_return_thru_ptr.rb index 716ec86..bf39922 100644 --- a/lib/cmock_generator_plugin_return_thru_ptr.rb +++ b/lib/cmock_generator_plugin_return_thru_ptr.rb @@ -46,7 +46,7 @@ class CMockGeneratorPluginReturnThruPtr lines << "{\n" lines << " CMOCK_#{func_name}_CALL_INSTANCE* cmock_call_instance = " + "(CMOCK_#{func_name}_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.#{func_name}_CallInstance));\n" - lines << " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"#{arg_name} ReturnThruPtr called before Expect on '#{func_name}'.\");\n" + lines << " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringPtrPreExp);\n" lines << " cmock_call_instance->ReturnThruPtr_#{arg_name}_Used = 1;\n" lines << " cmock_call_instance->ReturnThruPtr_#{arg_name}_Val = #{arg_name};\n" lines << " cmock_call_instance->ReturnThruPtr_#{arg_name}_Size = cmock_size;\n" diff --git a/lib/cmock_generator_utils.rb b/lib/cmock_generator_utils.rb index d24a243..584cb81 100644 --- a/lib/cmock_generator_utils.rb +++ b/lib/cmock_generator_utils.rb @@ -121,30 +121,31 @@ class CMockGeneratorUtils lines = "" lines << " if (!#{ignore})\n" if @ignore_arg lines << " {\n" + lines << " UNITY_SET_DETAILS(\"#{function[:name]}\",\"#{arg_name}\");\n" case(unity_func) when "UNITY_TEST_ASSERT_EQUAL_MEMORY" c_type_local = c_type.gsub(/\*$/,'') - lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type_local}), cmock_line, \"#{unity_msg}\");\n" + lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type_local}), cmock_line, CMockStringMismatch);\n" when "UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY" if (pre == '&') - lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), cmock_line, \"#{unity_msg}\");\n" + lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), cmock_line, CMockStringMismatch);\n" else lines << " if (#{pre}#{expected} == NULL)\n" - lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, \"Expected NULL. #{unity_msg}\"); }\n" + lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, CMockStringExpNULL); }\n" lines << " else\n" - lines << " { UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), cmock_line, \"#{unity_msg}\"); }\n" + lines << " { UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), cmock_line, CMockStringMismatch); }\n" end when /_ARRAY/ if (pre == '&') - lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, 1, cmock_line, \"#{unity_msg}\");\n" + lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, 1, cmock_line, CMockStringMismatch);\n" else lines << " if (#{pre}#{expected} == NULL)\n" - lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, \"Expected NULL. #{unity_msg}\"); }\n" + lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, CMockStringExpNULL); }\n" lines << " else\n" - lines << " { #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, 1, cmock_line, \"#{unity_msg}\"); }\n" + lines << " { #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, 1, cmock_line, CMockStringMismatch); }\n" end else - lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, \"#{unity_msg}\");\n" + lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, CMockStringMismatch);\n" end lines << " }\n" lines @@ -156,30 +157,31 @@ class CMockGeneratorUtils lines = "" lines << " if (!#{ignore})\n" if @ignore_arg lines << " {\n" + lines << " UNITY_SET_DETAILS(\"#{function[:name]}\",\"#{arg_name}\");\n" case(unity_func) when "UNITY_TEST_ASSERT_EQUAL_MEMORY" c_type_local = c_type.gsub(/\*$/,'') - lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type_local}), cmock_line, \"#{unity_msg}\");\n" + lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type_local}), cmock_line, CMockStringMismatch);\n" when "UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY" if (pre == '&') - lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), cmock_line, \"#{unity_msg}\");\n" + lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), cmock_line, CMockStringMismatch);\n" else lines << " if (#{pre}#{expected} == NULL)\n" - lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, \"Expected NULL. #{unity_msg}\"); }\n" + lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, CMockStringExpNULL); }\n" lines << " else\n" - lines << " { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), #{depth_name}, cmock_line, \"#{unity_msg}\"); }\n" + lines << " { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), #{depth_name}, cmock_line, CMockStringMismatch); }\n" end when /_ARRAY/ if (pre == '&') - lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, #{depth_name}, cmock_line, \"#{unity_msg}\");\n" + lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, #{depth_name}, cmock_line, CMockStringMismatch);\n" else lines << " if (#{pre}#{expected} == NULL)\n" - lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, \"Expected NULL. #{unity_msg}\"); }\n" + lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, CMockStringExpNULL); }\n" lines << " else\n" - lines << " { #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, #{depth_name}, cmock_line, \"#{unity_msg}\"); }\n" + lines << " { #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, #{depth_name}, cmock_line, CMockStringMismatch); }\n" end else - lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, \"#{unity_msg}\");\n" + lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, CMockStringMismatch);\n" end lines << " }\n" lines @@ -191,32 +193,33 @@ class CMockGeneratorUtils lines = "" lines << " if (!#{ignore})\n" if @ignore_arg lines << " {\n" + lines << " UNITY_SET_DETAILS(\"#{function[:name]}\",\"#{arg_name}\");\n" case(unity_func) when "UNITY_TEST_ASSERT_EQUAL_MEMORY" c_type_local = c_type.gsub(/\*$/,'') - lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type_local}), cmock_line, \"#{unity_msg}\");\n" + lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type_local}), cmock_line, CMockStringMismatch);\n" when "UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY" if (pre == '&') - lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), #{depth_name}, cmock_line, \"#{unity_msg}\");\n" + lines << " UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), #{depth_name}, cmock_line, CMockStringMismatch);\n" else lines << " if (#{pre}#{expected} == NULL)\n" - lines << " { UNITY_TEST_ASSERT_NULL(#{arg_name}, cmock_line, \"Expected NULL. #{unity_msg}\"); }\n" - lines << ((depth_name != 1) ? " else if (#{depth_name} == 0)\n { UNITY_TEST_ASSERT_EQUAL_PTR(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, \"#{unity_msg}\"); }\n" : "") + lines << " { UNITY_TEST_ASSERT_NULL(#{arg_name}, cmock_line, CMockStringExpNULL); }\n" + lines << ((depth_name != 1) ? " else if (#{depth_name} == 0)\n { UNITY_TEST_ASSERT_EQUAL_PTR(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, CMockStringMismatch); }\n" : "") lines << " else\n" - lines << " { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), #{depth_name}, cmock_line, \"#{unity_msg}\"); }\n" + lines << " { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(#{pre}#{expected}), (void*)(#{pre}#{arg_name}), sizeof(#{c_type.sub('*','')}), #{depth_name}, cmock_line, CMockStringMismatch); }\n" end when /_ARRAY/ if (pre == '&') - lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, #{depth_name}, cmock_line, \"#{unity_msg}\");\n" + lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, #{depth_name}, cmock_line, CMockStringMismatch);\n" else lines << " if (#{pre}#{expected} == NULL)\n" - lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, \"Expected NULL. #{unity_msg}\"); }\n" - lines << ((depth_name != 1) ? " else if (#{depth_name} == 0)\n { UNITY_TEST_ASSERT_EQUAL_PTR(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, \"#{unity_msg}\"); }\n" : "") + lines << " { UNITY_TEST_ASSERT_NULL(#{pre}#{arg_name}, cmock_line, CMockStringExpNULL); }\n" + lines << ((depth_name != 1) ? " else if (#{depth_name} == 0)\n { UNITY_TEST_ASSERT_EQUAL_PTR(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, CMockStringMismatch); }\n" : "") lines << " else\n" - lines << " { #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, #{depth_name}, cmock_line, \"#{unity_msg}\"); }\n" + lines << " { #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, #{depth_name}, cmock_line, CMockStringMismatch); }\n" end else - lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, \"#{unity_msg}\");\n" + lines << " #{unity_func}(#{pre}#{expected}, #{pre}#{arg_name}, cmock_line, CMockStringMismatch);\n" end lines << " }\n" lines diff --git a/src/cmock.c b/src/cmock.c index 0aa720d..ba8a8bd 100644 --- a/src/cmock.c +++ b/src/cmock.c @@ -9,6 +9,15 @@ //public constants to be used by mocks const char* CMockStringOutOfMemory = "CMock has run out of memory. Please allocate more."; +const char* CMockStringCalledMore = "Called more times than expected."; +const char* CMockStringCalledLess = "Called less times than expected."; +const char* CMockStringCalledEarly = "Called earlier than expected."; +const char* CMockStringCalledLate = "Called later than expected."; +const char* CMockStringCallOrder = "Called out of order."; +const char* CMockStringIgnPreExp = "IgnoreArg called before Expect."; +const char* CMockStringPtrPreExp = "ReturnThruPtr called before Expect."; +const char* CMockStringExpNULL = "Expected NULL."; +const char* CMockStringMismatch = "Function called with unexpected argument value."; //private variables #ifdef CMOCK_MEM_DYNAMIC diff --git a/src/cmock_internals.h b/src/cmock_internals.h index 149e125..1100171 100644 --- a/src/cmock_internals.h +++ b/src/cmock_internals.h @@ -8,7 +8,16 @@ #define CMOCK_FRAMEWORK_INTERNALS_H //These are constants that the generated mocks have access to -const char* CMockStringOutOfMemory; +extern const char* CMockStringOutOfMemory; +extern const char* CMockStringCalledMore; +extern const char* CMockStringCalledLess; +extern const char* CMockStringCalledEarly; +extern const char* CMockStringCalledLate; +extern const char* CMockStringCallOrder; +extern const char* CMockStringIgnPreExp; +extern const char* CMockStringPtrPreExp; +extern const char* CMockStringExpNULL; +extern const char* CMockStringMismatch; //define CMOCK_MEM_DYNAMIC to grab memory as needed with malloc //when you do that, CMOCK_MEM_SIZE is used for incremental size instead of total diff --git a/targets/clang_strict.yml b/targets/clang_strict.yml index 3380e74..b552694 100644 --- a/targets/clang_strict.yml +++ b/targets/clang_strict.yml @@ -61,6 +61,7 @@ compiler: defines: prefix: '-D' items: + - CMOCK - 'UNITY_SUPPORT_64' - 'UNITY_POINTER_WIDTH=64' object_files: diff --git a/targets/gcc.yml b/targets/gcc.yml index 2375a73..13fff4c 100644 --- a/targets/gcc.yml +++ b/targets/gcc.yml @@ -29,6 +29,7 @@ compiler: defines: prefix: '-D' items: + - CMOCK - 'UNITY_SUPPORT_64' object_files: prefix: '-o' diff --git a/targets/gcc_64.yml b/targets/gcc_64.yml index 0ac60b2..354b9e9 100644 --- a/targets/gcc_64.yml +++ b/targets/gcc_64.yml @@ -28,6 +28,7 @@ compiler: defines: prefix: '-D' items: + - CMOCK - 'UNITY_SUPPORT_64' - 'UNITY_POINTER_WIDTH=64' object_files: diff --git a/targets/gcc_tiny.yml b/targets/gcc_tiny.yml index ccd492e..7965349 100644 --- a/targets/gcc_tiny.yml +++ b/targets/gcc_tiny.yml @@ -29,6 +29,7 @@ compiler: defines: prefix: '-D' items: + - CMOCK - 'CMOCK_MEM_STATIC' - 'CMOCK_MEM_SIZE=1024' object_files: diff --git a/targets/iar_arm_v4.yml b/targets/iar_arm_v4.yml index 6e88a74..dae46b9 100644 --- a/targets/iar_arm_v4.yml +++ b/targets/iar_arm_v4.yml @@ -46,6 +46,7 @@ compiler: defines: prefix: '-D' items: + - CMOCK object_files: prefix: '-o' extension: '.r79' diff --git a/targets/iar_arm_v5.yml b/targets/iar_arm_v5.yml index f5a8541..886faff 100644 --- a/targets/iar_arm_v5.yml +++ b/targets/iar_arm_v5.yml @@ -45,6 +45,7 @@ compiler: defines: prefix: '-D' items: + - CMOCK object_files: prefix: '-o' extension: '.r79' diff --git a/test/system/test_interactions/doesnt_leave_details_behind.yml b/test/system/test_interactions/doesnt_leave_details_behind.yml new file mode 100644 index 0000000..5f12292 --- /dev/null +++ b/test/system/test_interactions/doesnt_leave_details_behind.yml @@ -0,0 +1,272 @@ +--- +:cmock: + :enforce_strict_ordering: 1 + :plugins: + - :array + - :cexception + - :ignore + - :callback + - :return_thru_ptr + - :ignore_arg + - :expect_any_args + :callback_after_arg_check: false + :callback_include_count: false + :treat_externs: :include + +:systest: + :types: | + typedef struct _POINT_T { + int x; + int y; + } POINT_T; + + :mockable: | + #include "CException.h" + extern void foo(POINT_T* a); + POINT_T* bar(void); + void no_args(void); + + :source: + :header: | + #include "CException.h" + void function_a(void); + void function_b(void); + void function_c(void); + int function_d(void); + void function_e(void); + + :code: | + void function_a(void) + { + foo(bar()); + no_args(); + } + + :tests: + :common: | + #include "CException.h" + void setUp(void) {} + void tearDown(void) {} + void my_foo_callback(POINT_T* a) { TEST_ASSERT_EQUAL_INT(2, a->x); } + + :units: + - :pass: TRUE + :should: 'just pass if we do not insert anything ugly into it' + :code: | + test() + { + bar_ExpectAndReturn(NULL); + foo_Expect(NULL); + no_args_Expect(); + + function_a(); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after an expect and return' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + bar_ExpectAndReturn(NULL); + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + foo_Expect(NULL); + no_args_Expect(); + + function_a(); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after an expect' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + bar_ExpectAndReturn(NULL); + foo_Expect(NULL); + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + no_args_Expect(); + + function_a(); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after throw expectation' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + CEXCEPTION_T e; + + bar_ExpectAndReturn(NULL); + foo_Expect(NULL); + no_args_ExpectAndThrow(5); + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + + Try { function_a(); } Catch(e) {} + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after a mock call' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + bar_ExpectAndReturn(NULL); + foo_Expect(NULL); + no_args_Expect(); + + function_a(); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after throw' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + CEXCEPTION_T e; + + bar_ExpectAndReturn(NULL); + foo_Expect(NULL); + no_args_ExpectAndThrow(5); + + Try { function_a(); } Catch(e) {} + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after ignore' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + bar_ExpectAndReturn(NULL); + foo_Expect(NULL); + no_args_Ignore(); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + + function_a(); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after ignored mock' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + bar_ExpectAndReturn(NULL); + foo_Expect(NULL); + no_args_Ignore(); + + function_a(); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after callback setup' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + POINT_T pt = { 2, 2 }; + bar_ExpectAndReturn(&pt); + foo_StubWithCallback(my_foo_callback); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + + no_args_Expect(); + + function_a(); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after mock with callback' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + POINT_T pt = { 2, 2 }; + bar_ExpectAndReturn(&pt); + foo_StubWithCallback(my_foo_callback); + no_args_Expect(); + + function_a(); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after expect any args' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + POINT_T pt = { 2, 2 }; + bar_ExpectAndReturn(&pt); + foo_ExpectAnyArgs(); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + + no_args_Expect(); + + function_a(); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after mock which expected any args' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + POINT_T pt = { 2, 2 }; + bar_ExpectAndReturn(&pt); + foo_ExpectAnyArgs(); + no_args_Expect(); + + function_a(); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after ignored arg' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + POINT_T pt = { 2, 2 }; + bar_ExpectAndReturn(&pt); + foo_Expect(NULL); + foo_IgnoreArg_a(); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + + no_args_Expect(); + + function_a(); + } + + - :pass: FALSE + :should: 'not contain mock details in failed assertion after mock which ignored an arg' + :verify_error: 'FAIL: Expected 1 Was 2. CustomFail' + :code: | + test() + { + POINT_T pt = { 2, 2 }; + bar_ExpectAndReturn(&pt); + foo_Expect(NULL); + foo_IgnoreArg_a(); + no_args_Expect(); + + function_a(); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1,2,"CustomFail"); + } + +... diff --git a/test/system/test_interactions/enforce_strict_ordering.yml b/test/system/test_interactions/enforce_strict_ordering.yml index 61e2999..53d1a68 100644 --- a/test/system/test_interactions/enforce_strict_ordering.yml +++ b/test/system/test_interactions/enforce_strict_ordering.yml @@ -8,7 +8,7 @@ :systest: :types: | #define UINT32 unsigned int - + typedef signed int custom_type; :mockable: | @@ -17,7 +17,7 @@ UINT32 bar(custom_type b); void baz(custom_type c); - :source: + :source: :header: | #include "CException.h" UINT32 function_a(int a, int b); @@ -26,13 +26,13 @@ void function_d(void); :code: | - UINT32 function_a(int a, int b) + UINT32 function_a(int a, int b) { return foo((custom_type)a) + bar((custom_type)b); - } + } - void function_b(void) - { + void function_b(void) + { baz((custom_type)1); foo((custom_type)2); bar((custom_type)3); @@ -42,7 +42,7 @@ baz((custom_type)7); } - void function_c(void) + void function_c(void) { foo((custom_type)1); foo((custom_type)2); @@ -50,7 +50,7 @@ bar((custom_type)4); foo((custom_type)5); } - + void function_d(void) { CEXCEPTION_T e; @@ -70,13 +70,13 @@ } Catch(e) {} } - + :tests: :common: | #include "CException.h" void setUp(void) {} void tearDown(void) {} - + :units: - :pass: TRUE :should: 'successfully exercise two simple ExpectAndReturn mock calls' @@ -87,20 +87,20 @@ bar_ExpectAndReturn((custom_type)2, 20); TEST_ASSERT_EQUAL(30, function_a(1, 2)); } - + - :pass: FALSE :should: 'fail because bar() is called but is not expected' - :verify_error: 'called more times than expected' + :verify_error: 'Called more times than expected' :code: | test() { foo_ExpectAndReturn((custom_type)1, 10); TEST_ASSERT_EQUAL(30, function_a(1, 2)); } - + - :pass: FALSE :should: 'fail because bar() is called twice but is expected once' - :verify_error: 'called less times than expected' + :verify_error: 'Called less times than expected' :code: | test() { @@ -112,7 +112,7 @@ - :pass: FALSE :should: 'fail because bar and foo called in reverse order' - :verify_error: 'called earlier than expected' + :verify_error: 'Called earlier than expected' :code: | test() { @@ -185,7 +185,7 @@ bar_ExpectAndReturn((custom_type)6, 10); function_b(); } - + - :pass: TRUE :should: 'pass when using cexception, as long as the order is right' :code: | @@ -207,7 +207,7 @@ foo_ExpectAndReturn((custom_type)3, 10); function_d(); } - + - :pass: TRUE :should: 'successfully handle back to back ExpectAndReturn setup and mock calls' :code: | @@ -216,30 +216,30 @@ foo_ExpectAndReturn((custom_type)1, 10); bar_ExpectAndReturn((custom_type)2, 20); TEST_ASSERT_EQUAL(30, function_a(1, 2)); - + foo_ExpectAndReturn((custom_type)3, 30); bar_ExpectAndReturn((custom_type)4, 40); TEST_ASSERT_EQUAL(70, function_a(3, 4)); - + foo_ExpectAndReturn((custom_type)1, 50); bar_ExpectAndReturn((custom_type)9, 60); TEST_ASSERT_EQUAL(110, function_a(1, 9)); } - + - :pass: FALSE :should: 'successfully catch errors during back to back ExpectAndReturn setup and mock calls' - :verify_error: 'called earlier than expected' + :verify_error: 'Called earlier than expected' :code: | test() { foo_ExpectAndReturn((custom_type)1, 10); bar_ExpectAndReturn((custom_type)2, 20); TEST_ASSERT_EQUAL(30, function_a(1, 2)); - + foo_ExpectAndReturn((custom_type)3, 30); bar_ExpectAndReturn((custom_type)4, 40); TEST_ASSERT_EQUAL(70, function_a(3, 4)); - + bar_ExpectAndReturn((custom_type)9, 60); foo_ExpectAndReturn((custom_type)1, 50); TEST_ASSERT_EQUAL(110, function_a(1, 9)); diff --git a/test/unit/cmock_generator_main_test.rb b/test/unit/cmock_generator_main_test.rb index a38059e..8b2041d 100644 --- a/test/unit/cmock_generator_main_test.rb +++ b/test/unit/cmock_generator_main_test.rb @@ -440,13 +440,15 @@ describe CMockGenerator, "Verify CMockGenerator Module" do expected = [ "static int SupaFunction(uint32 sandwiches, const char* named)\n", "{\n", " UNITY_LINE_TYPE cmock_line = TEST_LINE_NUM;\n", + " UNITY_SET_DETAIL(\"SupaFunction\");\n", " CMOCK_SupaFunction_CALL_INSTANCE* cmock_call_instance = (CMOCK_SupaFunction_CALL_INSTANCE*)CMock_Guts_GetAddressFor(Mock.SupaFunction_CallInstance);\n", " Mock.SupaFunction_CallInstance = CMock_Guts_MemNext(Mock.SupaFunction_CallInstance);\n", " uno", - " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"Function 'SupaFunction' called more times than expected.\");\n", + " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringCalledMore);\n", " cmock_line = cmock_call_instance->LineNumber;\n", " dos", " tres", + " UNITY_CLR_DETAILS();\n", " return cmock_call_instance->ReturnVal;\n", "}\n\n" ] @@ -472,13 +474,15 @@ describe CMockGenerator, "Verify CMockGenerator Module" do expected = [ "int __stdcall SupaFunction(uint32 sandwiches, corn ...)\n", "{\n", " UNITY_LINE_TYPE cmock_line = TEST_LINE_NUM;\n", + " UNITY_SET_DETAIL(\"SupaFunction\");\n", " CMOCK_SupaFunction_CALL_INSTANCE* cmock_call_instance = (CMOCK_SupaFunction_CALL_INSTANCE*)CMock_Guts_GetAddressFor(Mock.SupaFunction_CallInstance);\n", " Mock.SupaFunction_CallInstance = CMock_Guts_MemNext(Mock.SupaFunction_CallInstance);\n", " uno", - " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"Function 'SupaFunction' called more times than expected.\");\n", + " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringCalledMore);\n", " cmock_line = cmock_call_instance->LineNumber;\n", " dos", " tres", + " UNITY_CLR_DETAILS();\n", " return cmock_call_instance->ReturnVal;\n", "}\n\n" ] diff --git a/test/unit/cmock_generator_plugin_cexception_test.rb b/test/unit/cmock_generator_plugin_cexception_test.rb index 4a366e8..931d9c0 100644 --- a/test/unit/cmock_generator_plugin_cexception_test.rb +++ b/test/unit/cmock_generator_plugin_cexception_test.rb @@ -52,8 +52,11 @@ describe CMockGeneratorPluginCexception, "Verify CMockGeneratorPluginCexception it "add a mock implementation" do function = {:name => "Cherry", :args => [], :return => test_return[:void]} - expected = " if (cmock_call_instance->ExceptionToThrow != CEXCEPTION_NONE)\n {\n" + - " Throw(cmock_call_instance->ExceptionToThrow);\n }\n" + expected = " if (cmock_call_instance->ExceptionToThrow != CEXCEPTION_NONE)\n" + + " {\n" + + " UNITY_CLR_DETAILS();\n" + + " Throw(cmock_call_instance->ExceptionToThrow);\n" + + " }\n" returned = @cmock_generator_plugin_cexception.mock_implementation(function) assert_equal(expected, returned) end diff --git a/test/unit/cmock_generator_plugin_expect_test.rb b/test/unit/cmock_generator_plugin_expect_test.rb index 7ed4f1a..e1a6529 100644 --- a/test/unit/cmock_generator_plugin_expect_test.rb +++ b/test/unit/cmock_generator_plugin_expect_test.rb @@ -142,6 +142,7 @@ describe CMockGeneratorPluginExpect, "Verify CMockGeneratorPluginExpect Module" "{\n", "mock_retval_0 ", "mock_retval_1 ", + " UNITY_CLR_DETAILS();\n", "}\n\n" ].join returned = @cmock_generator_plugin_expect.mock_interfaces(function) @@ -158,6 +159,7 @@ describe CMockGeneratorPluginExpect, "Verify CMockGeneratorPluginExpect Module" "mock_retval_0 ", "mock_retval_1 ", "mock_retval_2", + " UNITY_CLR_DETAILS();\n", "}\n\n" ].join returned = @cmock_generator_plugin_expect.mock_interfaces(function) @@ -174,6 +176,7 @@ describe CMockGeneratorPluginExpect, "Verify CMockGeneratorPluginExpect Module" "mock_retval_0 ", "mock_retval_1 ", "mock_retval_2", + " UNITY_CLR_DETAILS();\n", "}\n\n" ].join returned = @cmock_generator_plugin_expect.mock_interfaces(function) @@ -188,6 +191,7 @@ describe CMockGeneratorPluginExpect, "Verify CMockGeneratorPluginExpect Module" "{\n", "mock_retval_0 ", "mock_retval_1 ", + " UNITY_CLR_DETAILS();\n", "}\n\n" ].join @cmock_generator_plugin_expect.ordered = true @@ -197,7 +201,8 @@ describe CMockGeneratorPluginExpect, "Verify CMockGeneratorPluginExpect Module" it "add mock verify lines" do function = {:name => "Banana" } - expected = " UNITY_TEST_ASSERT(CMOCK_GUTS_NONE == Mock.Banana_CallInstance, cmock_line, \"Function 'Banana' called less times than expected.\");\n" + expected = " UNITY_SET_DETAIL(\"Banana\");\n" + + " UNITY_TEST_ASSERT(CMOCK_GUTS_NONE == Mock.Banana_CallInstance, cmock_line, CMockStringCalledLess);\n" returned = @cmock_generator_plugin_expect.mock_verify(function) assert_equal(expected, returned) end diff --git a/test/unit/cmock_generator_plugin_ignore_arg_test.rb b/test/unit/cmock_generator_plugin_ignore_arg_test.rb index a6025d5..f5329d3 100644 --- a/test/unit/cmock_generator_plugin_ignore_arg_test.rb +++ b/test/unit/cmock_generator_plugin_ignore_arg_test.rb @@ -85,7 +85,7 @@ describe CMockGeneratorPluginIgnoreArg, "Verify CMockGeneratorPluginIgnoreArg Mo "{\n" + " CMOCK_Pine_CALL_INSTANCE* cmock_call_instance = " + "(CMOCK_Pine_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.Pine_CallInstance));\n" + - " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"chicken IgnoreArg called before Expect on 'Pine'.\");\n" + + " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp);\n" + " cmock_call_instance->IgnoreArg_chicken = 1;\n" + "}\n\n" + @@ -93,7 +93,7 @@ describe CMockGeneratorPluginIgnoreArg, "Verify CMockGeneratorPluginIgnoreArg Mo "{\n" + " CMOCK_Pine_CALL_INSTANCE* cmock_call_instance = " + "(CMOCK_Pine_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.Pine_CallInstance));\n" + - " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"beef IgnoreArg called before Expect on 'Pine'.\");\n" + + " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp);\n" + " cmock_call_instance->IgnoreArg_beef = 1;\n" + "}\n\n" + @@ -101,7 +101,7 @@ describe CMockGeneratorPluginIgnoreArg, "Verify CMockGeneratorPluginIgnoreArg Mo "{\n" + " CMOCK_Pine_CALL_INSTANCE* cmock_call_instance = " + "(CMOCK_Pine_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.Pine_CallInstance));\n" + - " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"tofu IgnoreArg called before Expect on 'Pine'.\");\n" + + " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp);\n" + " cmock_call_instance->IgnoreArg_tofu = 1;\n" + "}\n\n" diff --git a/test/unit/cmock_generator_plugin_ignore_test.rb b/test/unit/cmock_generator_plugin_ignore_test.rb index 2692e35..2933b02 100644 --- a/test/unit/cmock_generator_plugin_ignore_test.rb +++ b/test/unit/cmock_generator_plugin_ignore_test.rb @@ -52,6 +52,7 @@ describe CMockGeneratorPluginIgnore, "Verify CMockGeneratorPluginIgnore Module" function = {:name => "Mold", :args_string => "void", :return => test_return[:void]} expected = [" if (Mock.Mold_IgnoreBool)\n", " {\n", + " UNITY_CLR_DETAILS();\n", " return;\n", " }\n" ].join @@ -65,6 +66,7 @@ describe CMockGeneratorPluginIgnore, "Verify CMockGeneratorPluginIgnore Module" @utils.expect :code_assign_argument_quickly, ' mock_retval_0', ["Mock.Fungus_FinalReturn", retval] expected = [" if (Mock.Fungus_IgnoreBool)\n", " {\n", + " UNITY_CLR_DETAILS();\n", " if (cmock_call_instance == NULL)\n", " return Mock.Fungus_FinalReturn;\n", " mock_retval_0", diff --git a/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb b/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb index 839a087..7b93f00 100644 --- a/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb +++ b/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb @@ -108,7 +108,7 @@ describe CMockGeneratorPluginReturnThruPtr, "Verify CMockGeneratorPluginReturnTh "{\n" + " CMOCK_Pine_CALL_INSTANCE* cmock_call_instance = " + "(CMOCK_Pine_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.Pine_CallInstance));\n" + - " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, \"tofu ReturnThruPtr called before Expect on 'Pine'.\");\n" + + " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringPtrPreExp);\n" + " cmock_call_instance->ReturnThruPtr_tofu_Used = 1;\n" + " cmock_call_instance->ReturnThruPtr_tofu_Val = tofu;\n" + " cmock_call_instance->ReturnThruPtr_tofu_Size = cmock_size;\n" + diff --git a/test/unit/cmock_generator_utils_test.rb b/test/unit/cmock_generator_utils_test.rb index b832077..f62083b 100644 --- a/test/unit/cmock_generator_utils_test.rb +++ b/test/unit/cmock_generator_utils_test.rb @@ -204,7 +204,10 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle a simple assert when requested' do function = { :name => 'Pear' } arg = test_arg[:int] - expected = " {\n UNITY_TEST_ASSERT_EQUAL_INT(cmock_call_instance->Expected_MyInt, MyInt, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyInt'.\");\n }\n" + expected = " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyInt\");\n" + + " UNITY_TEST_ASSERT_EQUAL_INT(cmock_call_instance->Expected_MyInt, MyInt, cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_INT', ''], ['int'] assert_equal(expected, @cmock_generator_utils_simple.code_verify_an_arg_expectation(function, arg)) @@ -213,14 +216,20 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle a pointer comparison when configured to do so' do function = { :name => 'Pear' } arg = test_arg[:int_ptr] - expected = " {\n UNITY_TEST_ASSERT_EQUAL_PTR(cmock_call_instance->Expected_MyIntPtr, MyIntPtr, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyIntPtr'.\");\n }\n" + expected = " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyIntPtr\");\n" + + " UNITY_TEST_ASSERT_EQUAL_PTR(cmock_call_instance->Expected_MyIntPtr, MyIntPtr, cmock_line, CMockStringMismatch);\n" + + " }\n" assert_equal(expected, @cmock_generator_utils_simple.code_verify_an_arg_expectation(function, arg)) end it 'handle const char as string compares ' do function = { :name => 'Pear' } arg = test_arg[:string] - expected = " {\n UNITY_TEST_ASSERT_EQUAL_STRING(cmock_call_instance->Expected_MyStr, MyStr, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyStr'.\");\n }\n" + expected = " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyStr\");\n" + + " UNITY_TEST_ASSERT_EQUAL_STRING(cmock_call_instance->Expected_MyStr, MyStr, cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_STRING',''], ['char*'] assert_equal(expected, @cmock_generator_utils_simple.code_verify_an_arg_expectation(function, arg)) @@ -229,7 +238,10 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle custom types as memory compares when we have no better way to do it' do function = { :name => 'Pear' } arg = test_arg[:mytype] - expected = " {\n UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_MyMyType), (void*)(&MyMyType), sizeof(MY_TYPE), cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyMyType'.\");\n }\n" + expected = " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyMyType\");\n" + + " UNITY_TEST_ASSERT_EQUAL_MEMORY((void*)(&cmock_call_instance->Expected_MyMyType), (void*)(&MyMyType), sizeof(MY_TYPE), cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_MEMORY','&'], ['MY_TYPE'] assert_equal(expected, @cmock_generator_utils_simple.code_verify_an_arg_expectation(function, arg)) @@ -238,7 +250,10 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle custom types with custom handlers when available, even if they do not support the extra message' do function = { :name => 'Pear' } arg = test_arg[:mytype] - expected = " {\n UNITY_TEST_ASSERT_EQUAL_MY_TYPE(cmock_call_instance->Expected_MyMyType, MyMyType, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyMyType'.\");\n }\n" + expected = " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyMyType\");\n" + + " UNITY_TEST_ASSERT_EQUAL_MY_TYPE(cmock_call_instance->Expected_MyMyType, MyMyType, cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_MY_TYPE',''], ['MY_TYPE'] assert_equal(expected, @cmock_generator_utils_simple.code_verify_an_arg_expectation(function, arg)) @@ -247,7 +262,10 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle pointers to custom types with array handlers, even if the array extension is turned off' do function = { :name => 'Pear' } arg = test_arg[:mytype] - expected = " {\n UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY(&cmock_call_instance->Expected_MyMyType, &MyMyType, 1, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyMyType'.\");\n }\n" + expected = " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyMyType\");\n" + + " UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY(&cmock_call_instance->Expected_MyMyType, &MyMyType, 1, cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY','&'], ['MY_TYPE'] assert_equal(expected, @cmock_generator_utils_simple.code_verify_an_arg_expectation(function, arg)) @@ -256,7 +274,11 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle a simple assert when requested with array plugin enabled' do function = { :name => 'Pear' } arg = test_arg[:int] - expected = " if (!cmock_call_instance->IgnoreArg_MyInt)\n {\n UNITY_TEST_ASSERT_EQUAL_INT(cmock_call_instance->Expected_MyInt, MyInt, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyInt'.\");\n }\n" + expected = " if (!cmock_call_instance->IgnoreArg_MyInt)\n" + + " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyInt\");\n" + + " UNITY_TEST_ASSERT_EQUAL_INT(cmock_call_instance->Expected_MyInt, MyInt, cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_INT',''], ['int'] assert_equal(expected, @cmock_generator_utils_complex.code_verify_an_arg_expectation(function, arg)) @@ -267,12 +289,13 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do arg = test_arg[:int_ptr] expected = " if (!cmock_call_instance->IgnoreArg_MyIntPtr)\n" + " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyIntPtr\");\n" + " if (cmock_call_instance->Expected_MyIntPtr == NULL)\n" + - " { UNITY_TEST_ASSERT_NULL(MyIntPtr, cmock_line, \"Expected NULL. Function 'Pear' called with unexpected value for argument 'MyIntPtr'.\"); }\n" + + " { UNITY_TEST_ASSERT_NULL(MyIntPtr, cmock_line, CMockStringExpNULL); }\n" + " else if (cmock_call_instance->Expected_MyIntPtr_Depth == 0)\n" + - " { UNITY_TEST_ASSERT_EQUAL_PTR(cmock_call_instance->Expected_MyIntPtr, MyIntPtr, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyIntPtr'.\"); }\n" + + " { UNITY_TEST_ASSERT_EQUAL_PTR(cmock_call_instance->Expected_MyIntPtr, MyIntPtr, cmock_line, CMockStringMismatch); }\n" + " else\n" + - " { UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(cmock_call_instance->Expected_MyIntPtr, MyIntPtr, cmock_call_instance->Expected_MyIntPtr_Depth, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyIntPtr'.\"); }\n" + + " { UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(cmock_call_instance->Expected_MyIntPtr, MyIntPtr, cmock_call_instance->Expected_MyIntPtr_Depth, cmock_line, CMockStringMismatch); }\n" + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_INT_ARRAY',''], ['int*'] @@ -282,7 +305,11 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle const char as string compares with array plugin enabled' do function = { :name => 'Pear' } arg = test_arg[:string] - expected = " if (!cmock_call_instance->IgnoreArg_MyStr)\n {\n UNITY_TEST_ASSERT_EQUAL_STRING(cmock_call_instance->Expected_MyStr, MyStr, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyStr'.\");\n }\n" + expected = " if (!cmock_call_instance->IgnoreArg_MyStr)\n" + + " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyStr\");\n" + + " UNITY_TEST_ASSERT_EQUAL_STRING(cmock_call_instance->Expected_MyStr, MyStr, cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_STRING',''], ['char*'] assert_equal(expected, @cmock_generator_utils_complex.code_verify_an_arg_expectation(function, arg)) @@ -291,7 +318,14 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle custom types as memory compares when we have no better way to do it with array plugin enabled' do function = { :name => 'Pear' } arg = test_arg[:mytype] - expected = " if (!cmock_call_instance->IgnoreArg_MyMyType)\n {\n if (cmock_call_instance->Expected_MyMyType == NULL)\n { UNITY_TEST_ASSERT_NULL(MyMyType, cmock_line, \"Expected NULL. Function 'Pear' called with unexpected value for argument 'MyMyType'.\"); }\n else\n { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(cmock_call_instance->Expected_MyMyType), (void*)(MyMyType), sizeof(MY_TYPE), 1, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyMyType'.\"); }\n }\n" + expected = " if (!cmock_call_instance->IgnoreArg_MyMyType)\n" + + " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyMyType\");\n" + + " if (cmock_call_instance->Expected_MyMyType == NULL)\n" + + " { UNITY_TEST_ASSERT_NULL(MyMyType, cmock_line, CMockStringExpNULL); }\n" + + " else\n" + + " { UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((void*)(cmock_call_instance->Expected_MyMyType), (void*)(MyMyType), sizeof(MY_TYPE), 1, cmock_line, CMockStringMismatch); }\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY', ''], ['MY_TYPE'] assert_equal(expected, @cmock_generator_utils_complex.code_verify_an_arg_expectation(function, arg)) @@ -300,7 +334,11 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle custom types with custom handlers when available, even if they do not support the extra message with array plugin enabled' do function = { :name => 'Pear' } arg = test_arg[:mytype] - expected = " if (!cmock_call_instance->IgnoreArg_MyMyType)\n {\n UNITY_TEST_ASSERT_EQUAL_MY_TYPE(cmock_call_instance->Expected_MyMyType, MyMyType, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyMyType'.\");\n }\n" + expected = " if (!cmock_call_instance->IgnoreArg_MyMyType)\n" + + " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyMyType\");\n" + + " UNITY_TEST_ASSERT_EQUAL_MY_TYPE(cmock_call_instance->Expected_MyMyType, MyMyType, cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_MY_TYPE', ''], ['MY_TYPE'] assert_equal(expected, @cmock_generator_utils_complex.code_verify_an_arg_expectation(function, arg)) @@ -311,12 +349,13 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do arg = test_arg[:mytype_ptr] expected = " if (!cmock_call_instance->IgnoreArg_MyMyTypePtr)\n" + " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyMyTypePtr\");\n" + " if (cmock_call_instance->Expected_MyMyTypePtr == NULL)\n" + - " { UNITY_TEST_ASSERT_NULL(MyMyTypePtr, cmock_line, \"Expected NULL. Function 'Pear' called with unexpected value for argument 'MyMyTypePtr'.\"); }\n" + + " { UNITY_TEST_ASSERT_NULL(MyMyTypePtr, cmock_line, CMockStringExpNULL); }\n" + " else if (cmock_call_instance->Expected_MyMyTypePtr_Depth == 0)\n" + - " { UNITY_TEST_ASSERT_EQUAL_PTR(cmock_call_instance->Expected_MyMyTypePtr, MyMyTypePtr, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyMyTypePtr'.\"); }\n" + + " { UNITY_TEST_ASSERT_EQUAL_PTR(cmock_call_instance->Expected_MyMyTypePtr, MyMyTypePtr, cmock_line, CMockStringMismatch); }\n" + " else\n" + - " { UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY(cmock_call_instance->Expected_MyMyTypePtr, MyMyTypePtr, cmock_call_instance->Expected_MyMyTypePtr_Depth, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyMyTypePtr'.\"); }\n" + + " { UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY(cmock_call_instance->Expected_MyMyTypePtr, MyMyTypePtr, cmock_call_instance->Expected_MyMyTypePtr_Depth, cmock_line, CMockStringMismatch); }\n" + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY', ''], ['MY_TYPE*'] @@ -326,7 +365,11 @@ describe CMockGeneratorUtils, "Verify CMockGeneratorUtils Module" do it 'handle custom types with array handlers when array plugin is enabled for non-array types' do function = { :name => 'Pear' } arg = test_arg[:mytype] - expected = " if (!cmock_call_instance->IgnoreArg_MyMyType)\n {\n UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY(&cmock_call_instance->Expected_MyMyType, &MyMyType, 1, cmock_line, \"Function 'Pear' called with unexpected value for argument 'MyMyType'.\");\n }\n" + expected = " if (!cmock_call_instance->IgnoreArg_MyMyType)\n" + + " {\n" + + " UNITY_SET_DETAILS(\"Pear\",\"MyMyType\");\n" + + " UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY(&cmock_call_instance->Expected_MyMyType, &MyMyType, 1, cmock_line, CMockStringMismatch);\n" + + " }\n" @unity_helper.expect :nil?, false @unity_helper.expect :get_helper, ['UNITY_TEST_ASSERT_EQUAL_MY_TYPE_ARRAY', '&'], ['MY_TYPE'] assert_equal(expected, @cmock_generator_utils_complex.code_verify_an_arg_expectation(function, arg))