From 8cb956367d253180c50e2d06b8215fbd6dee6db3 Mon Sep 17 00:00:00 2001 From: mvandervoord Date: Tue, 8 Jun 2010 00:46:50 +0000 Subject: [PATCH] - added ability to use callbacks with or without argument checking - added ability to use callbacks with or without the extra count argument - updated docs git-svn-id: http://cmock.svn.sourceforge.net/svnroot/cmock/trunk@164 bf332499-1b4d-0410-844d-d2d48d5cc64c --- docs/CMock Summary.odt | Bin 38190 -> 38476 bytes docs/CMock Summary.pdf | Bin 72059 -> 72645 bytes lib/cmock_config.rb | 36 +++++------ lib/cmock_generator_plugin_callback.rb | 30 ++++++--- .../cmock_generator_plugin_callback_test.rb | 57 +++++++++++++++++- 5 files changed, 95 insertions(+), 28 deletions(-) diff --git a/docs/CMock Summary.odt b/docs/CMock Summary.odt index a567741b96186a3a34f5bde02eec0ba6ca6ff112..4f054c1b69e7775280ffb97994472edb06d4727e 100644 GIT binary patch delta 8912 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 :unity, - :mock_path => 'mocks', - :mock_prefix => 'Mock', - :plugins => [], - :includes => [], - :attributes => ['__ramfunc', '__irq', '__fiq', 'register', 'extern'], - :enforce_strict_ordering => false, - :cexception_include => nil, - :unity_helper => false, - :treat_as => {}, - :treat_as_void => [], - :memcmp_if_unknown => true, - :when_no_prototypes => :warn, #the options being :ignore, :warn, or :error - :when_ptr => :compare_data, #the options being :compare_ptr, :compare_data, or :smart - :verbosity => 2, #the options being 0 errors only, 1 warnings and errors, 2 normal info, 3 verbose - :treat_externs => :exclude, #the options being :include or :exclude - :ignore => :args_and_calls, #the options being :args_and_calls or :args_only + :framework => :unity, + :mock_path => 'mocks', + :mock_prefix => 'Mock', + :plugins => [], + :includes => [], + :attributes => ['__ramfunc', '__irq', '__fiq', 'register', 'extern'], + :enforce_strict_ordering => false, + :cexception_include => nil, + :unity_helper => false, + :treat_as => {}, + :treat_as_void => [], + :memcmp_if_unknown => true, + :when_no_prototypes => :warn, #the options being :ignore, :warn, or :error + :when_ptr => :compare_data, #the options being :compare_ptr, :compare_data, or :smart + :verbosity => 2, #the options being 0 errors only, 1 warnings and errors, 2 normal info, 3 verbose + :treat_externs => :exclude, #the options being :include or :exclude + :ignore => :args_and_calls, #the options being :args_and_calls or :args_only + :callback_include_count => true, + :callback_after_arg_check => false, } def initialize(options=nil) diff --git a/lib/cmock_generator_plugin_callback.rb b/lib/cmock_generator_plugin_callback.rb index ea0dbe7..6533eb5 100644 --- a/lib/cmock_generator_plugin_callback.rb +++ b/lib/cmock_generator_plugin_callback.rb @@ -6,6 +6,7 @@ class CMockGeneratorPluginCallback + attr_accessor :include_count attr_reader :priority attr_reader :config, :utils @@ -13,6 +14,13 @@ class CMockGeneratorPluginCallback @config = config @utils = utils @priority = 3 + + @include_count = @config.callback_include_count + if (@config.callback_after_arg_check) + alias :mock_implementation :mock_implementation_for_callbacks + else + alias :mock_implementation_precheck :mock_implementation_for_callbacks + end end def instance_structure(function) @@ -24,18 +32,24 @@ class CMockGeneratorPluginCallback def mock_function_declarations(function) func_name = function[:name] return_type = function[:return][:const?] ? "const #{function[:return][:type]}" : function[:return][:type] - "typedef #{return_type} (* CMOCK_#{func_name}_CALLBACK)(#{(function[:args_string] == "void") ? '' : function[:args_string] + ', '}int cmock_num_calls);\n" + - "void #{func_name}_StubWithCallback(CMOCK_#{func_name}_CALLBACK Callback);\n" + style = (@include_count ? 1 : 0) | (function[:args].empty? ? 0 : 2) + styles = [ "void", "int cmock_num_calls", function[:args_string], "#{function[:args_string]}, int cmock_num_calls" ] + "typedef #{return_type} (* CMOCK_#{func_name}_CALLBACK)(#{styles[style]});\nvoid #{func_name}_StubWithCallback(CMOCK_#{func_name}_CALLBACK Callback);\n" end - def mock_implementation_precheck(function) + def mock_implementation_for_callbacks(function) func_name = function[:name] - call_string = function[:args].empty? ? '' : function[:args].map{|m| m[:name]}.join(', ') + ', ' + style = (@include_count ? 1 : 0) | (function[:args].empty? ? 0 : 2) | (function[:return][:void?] ? 0 : 4) " if (Mock.#{func_name}_CallbackFunctionPointer != NULL)\n {\n" + - if (function[:return][:void?]) - " Mock.#{func_name}_CallbackFunctionPointer(#{call_string}Mock.#{func_name}_CallbackCalls++);\n return;\n }\n" - else - " return Mock.#{func_name}_CallbackFunctionPointer(#{call_string}Mock.#{func_name}_CallbackCalls++);\n }\n" + case(style) + when 0 then " Mock.#{func_name}_CallbackFunctionPointer();\n return;\n }\n" + when 1 then " Mock.#{func_name}_CallbackFunctionPointer(Mock.#{func_name}_CallbackCalls++);\n return;\n }\n" + when 2 then " Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')});\n return;\n }\n" + when 3 then " Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')}, Mock.#{func_name}_CallbackCalls++);\n return;\n }\n" + when 4 then " return Mock.#{func_name}_CallbackFunctionPointer(void);\n }\n" + when 5 then " return Mock.#{func_name}_CallbackFunctionPointer(Mock.#{func_name}_CallbackCalls++);\n }\n" + when 6 then " return Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')});\n }\n" + when 7 then " return Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')}, Mock.#{func_name}_CallbackCalls++);\n }\n" end end diff --git a/test/unit/cmock_generator_plugin_callback_test.rb b/test/unit/cmock_generator_plugin_callback_test.rb index 553664d..599c4fc 100644 --- a/test/unit/cmock_generator_plugin_callback_test.rb +++ b/test/unit/cmock_generator_plugin_callback_test.rb @@ -11,6 +11,9 @@ class CMockGeneratorPluginCallbackTest < Test::Unit::TestCase def setup create_mocks :config, :utils + @config.expect.callback_include_count.returns(true) + @config.expect.callback_after_arg_check.returns(false) + @cmock_generator_plugin_callback = CMockGeneratorPluginCallback.new(@config, @utils) end @@ -36,15 +39,24 @@ class CMockGeneratorPluginCallbackTest < Test::Unit::TestCase end should "add mock function declaration for function without arguments" do - function = {:name => "Maple", :args_string => "void", :return => test_return[:void]} + function = {:name => "Maple", :args_string => "void", :args => [], :return => test_return[:void]} expected = [ "typedef void (* CMOCK_Maple_CALLBACK)(int cmock_num_calls);\n", "void Maple_StubWithCallback(CMOCK_Maple_CALLBACK Callback);\n" ].join returned = @cmock_generator_plugin_callback.mock_function_declarations(function) assert_equal(expected, returned) end + should "add mock function declaration for function without arguments when count is also turned off" do + function = {:name => "Maple", :args_string => "void", :args => [], :return => test_return[:void]} + expected = [ "typedef void (* CMOCK_Maple_CALLBACK)(void);\n", + "void Maple_StubWithCallback(CMOCK_Maple_CALLBACK Callback);\n" ].join + @cmock_generator_plugin_callback.include_count = false + returned = @cmock_generator_plugin_callback.mock_function_declarations(function) + assert_equal(expected, returned) + end + should "add mock function declaration for function with arguments" do - function = {:name => "Maple", :args_string => "int* tofu", :return => test_return[:void]} + function = {:name => "Maple", :args_string => "int* tofu", :args => [1], :return => test_return[:void]} expected = [ "typedef void (* CMOCK_Maple_CALLBACK)(int* tofu, int cmock_num_calls);\n", "void Maple_StubWithCallback(CMOCK_Maple_CALLBACK Callback);\n" ].join returned = @cmock_generator_plugin_callback.mock_function_declarations(function) @@ -52,12 +64,21 @@ class CMockGeneratorPluginCallbackTest < Test::Unit::TestCase end should "add mock function declaration for function with return values" do - function = {:name => "Maple", :args_string => "int* tofu", :return => test_return[:string]} + function = {:name => "Maple", :args_string => "int* tofu", :args => [1], :return => test_return[:string]} expected = [ "typedef const char* (* CMOCK_Maple_CALLBACK)(int* tofu, int cmock_num_calls);\n", "void Maple_StubWithCallback(CMOCK_Maple_CALLBACK Callback);\n" ].join returned = @cmock_generator_plugin_callback.mock_function_declarations(function) assert_equal(expected, returned) end + + should "add mock function declaration for function with return values and count is turned off" do + function = {:name => "Maple", :args_string => "int* tofu", :args => [1], :return => test_return[:string]} + expected = [ "typedef const char* (* CMOCK_Maple_CALLBACK)(int* tofu);\n", + "void Maple_StubWithCallback(CMOCK_Maple_CALLBACK Callback);\n" ].join + @cmock_generator_plugin_callback.include_count = false + returned = @cmock_generator_plugin_callback.mock_function_declarations(function) + assert_equal(expected, returned) + end should "add mock function implementation for functions of style 'void func(void)'" do function = {:name => "Apple", :args => [], :args_string => "void", :return => test_return[:void]} @@ -71,6 +92,19 @@ class CMockGeneratorPluginCallbackTest < Test::Unit::TestCase assert_equal(expected, returned) end + should "add mock function implementation for functions of style 'void func(void)' when count turned off" do + function = {:name => "Apple", :args => [], :args_string => "void", :return => test_return[:void]} + expected = [" if (Mock.Apple_CallbackFunctionPointer != NULL)\n", + " {\n", + " Mock.Apple_CallbackFunctionPointer();\n", + " return;\n", + " }\n" + ].join + @cmock_generator_plugin_callback.include_count = false + returned = @cmock_generator_plugin_callback.mock_implementation_precheck(function) + assert_equal(expected, returned) + end + should "add mock function implementation for functions of style 'int func(void)'" do function = {:name => "Apple", :args => [], :args_string => "void", :return => test_return[:int]} expected = [" if (Mock.Apple_CallbackFunctionPointer != NULL)\n", @@ -98,6 +132,23 @@ class CMockGeneratorPluginCallbackTest < Test::Unit::TestCase assert_equal(expected, returned) end + should "add mock function implementation for functions of style 'void func(int* steak, uint8_t flag)' when count turned off" do + function = {:name => "Apple", + :args => [ { :type => 'int*', :name => 'steak', :ptr? => true}, + { :type => 'uint8_t', :name => 'flag', :ptr? => false} ], + :args_string => "int* steak, uint8_t flag", + :return=> test_return[:void]} + expected = [" if (Mock.Apple_CallbackFunctionPointer != NULL)\n", + " {\n", + " Mock.Apple_CallbackFunctionPointer(steak, flag);\n", + " return;\n", + " }\n" + ].join + @cmock_generator_plugin_callback.include_count = false + returned = @cmock_generator_plugin_callback.mock_implementation_precheck(function) + assert_equal(expected, returned) + end + should "add mock function implementation for functions of style 'int16_t func(int* steak, uint8_t flag)'" do function = {:name => "Apple", :args => [ { :type => 'int*', :name => 'steak', :ptr? => true},