From 9c9f08c48bb4da5bf4a38c0bf189815edc88c835 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 6 Sep 2017 00:28:37 +0200 Subject: [PATCH] Add 'strict_mock_calling' option - By default set to true to maintain the default behaviour of CMock - When mocked function is called and no Except/Ignor called, test will fail - When set to false: - if test calls mocked function, and user did not specify Except/Ignore/... test will not fail because of this, all calls to mocked functions are ignored --- lib/cmock_config.rb | 1 + lib/cmock_generator.rb | 6 +++ lib/cmock_generator_plugin_ignore.rb | 4 ++ .../test_interactions/ignore_and_return.yml | 8 ++++ .../ignore_strict_mock_calling.yml | 37 +++++++++++++++++++ test/unit/cmock_generator_main_test.rb | 3 ++ 6 files changed, 59 insertions(+) create mode 100644 test/system/test_interactions/ignore_strict_mock_calling.yml diff --git a/lib/cmock_config.rb b/lib/cmock_config.rb index 99e1f91..7e20207 100644 --- a/lib/cmock_config.rb +++ b/lib/cmock_config.rb @@ -19,6 +19,7 @@ class CMockConfig :attributes => ['__ramfunc', '__irq', '__fiq', 'register', 'extern'], :c_calling_conventions => ['__stdcall', '__cdecl', '__fastcall'], :enforce_strict_ordering => false, + :strict_mock_calling => true, :unity_helper_path => false, :treat_as => {}, :treat_as_void => [], diff --git a/lib/cmock_generator.rb b/lib/cmock_generator.rb index 1414c4a..44e1153 100644 --- a/lib/cmock_generator.rb +++ b/lib/cmock_generator.rb @@ -18,6 +18,7 @@ class CMockGenerator @weak = @config.weak @ordered = @config.enforce_strict_ordering @framework = @config.framework.to_s + @strict_mock_calling = @config.strict_mock_calling @subdir = @config.subdir @@ -202,6 +203,11 @@ class CMockGenerator file << " CMock_Guts_MemFreeAll();\n" file << " memset(&Mock, 0, sizeof(Mock));\n" file << functions.collect {|function| @plugins.run(:mock_destroy, function)}.join + + unless (@strict_mock_calling) + file << functions.collect {|function| @plugins.run(:mock_ignore, function)}.join + end + if (@ordered) file << " GlobalExpectCount = 0;\n" file << " GlobalVerifyOrder = 0;\n" diff --git a/lib/cmock_generator_plugin_ignore.rb b/lib/cmock_generator_plugin_ignore.rb index bf1bac2..c971830 100644 --- a/lib/cmock_generator_plugin_ignore.rb +++ b/lib/cmock_generator_plugin_ignore.rb @@ -65,6 +65,10 @@ class CMockGeneratorPluginIgnore lines << "}\n\n" end + def mock_ignore(function) + " Mock.#{function[:name]}_IgnoreBool = (int) 1;\n" + end + def mock_verify(function) func_name = function[:name] " if (Mock.#{func_name}_IgnoreBool)\n Mock.#{func_name}_CallInstance = CMOCK_GUTS_NONE;\n" diff --git a/test/system/test_interactions/ignore_and_return.yml b/test/system/test_interactions/ignore_and_return.yml index 64e181e..ca54b7e 100644 --- a/test/system/test_interactions/ignore_and_return.yml +++ b/test/system/test_interactions/ignore_and_return.yml @@ -159,4 +159,12 @@ TEST_ASSERT_EQUAL(110, function(0, 8, 9)); } + - :pass: FALSE + :should: 'Without "TODO" specified, Expect/Ignore/... of bar is required. Test should fail.' + :code: | + test() + { + function(1, 2, 3); + } + ... diff --git a/test/system/test_interactions/ignore_strict_mock_calling.yml b/test/system/test_interactions/ignore_strict_mock_calling.yml new file mode 100644 index 0000000..bd8511c --- /dev/null +++ b/test/system/test_interactions/ignore_strict_mock_calling.yml @@ -0,0 +1,37 @@ +--- +:cmock: + :plugins: + - 'ignore' + :strict_mock_calling: FALSE + +:systest: + :types: | + + :mockable: | + int foo(int a); + void bar(int b); + + :source: + :header: | + int function(int a, int b, int c); + :code: | + int function(int a, int b, int c) + { + bar(b); + return foo(a) + foo(b) + foo(c); + } + + :tests: + :common: | + void setUp(void) {} + void tearDown(void) {} + :units: + - :pass: TRUE + :should: 'With "strict_mock_calling" disabled, Expect/Ignore/... of bar is NOT required.' + :code: | + test() + { + function(1, 2, 3); + } + +... diff --git a/test/unit/cmock_generator_main_test.rb b/test/unit/cmock_generator_main_test.rb index 210825a..5e07f47 100644 --- a/test/unit/cmock_generator_main_test.rb +++ b/test/unit/cmock_generator_main_test.rb @@ -53,6 +53,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do @config.expect :includes_c_pre_header, nil @config.expect :includes_c_post_header, nil @config.expect :subdir, nil + @config.expect :strict_mock_calling, true @cmock_generator = CMockGenerator.new(@config, @file_writer, @utils, @plugins) @cmock_generator.module_name = @module_name @cmock_generator.mock_name = "Mock#{@module_name}" @@ -70,6 +71,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do @config.expect :includes_c_pre_header, nil @config.expect :includes_c_post_header, nil @config.expect :subdir, nil + @config.expect :strict_mock_calling, true @cmock_generator_strict = CMockGenerator.new(@config, @file_writer, @utils, @plugins) @cmock_generator_strict.module_name = @module_name @cmock_generator_strict.mock_name = "Mock#{@module_name}" @@ -128,6 +130,7 @@ describe CMockGenerator, "Verify CMockGenerator Module" do @config.expect :includes_c_pre_header, nil @config.expect :includes_c_post_header, nil @config.expect :subdir, nil + @config.expect :strict_mock_calling, true @cmock_generator2 = CMockGenerator.new(@config, @file_writer, @utils, @plugins) @cmock_generator2.module_name = "Pout-Pout Fish" @cmock_generator2.mock_name = "MockPout-Pout Fish"