ceedling 0.28.2 → 0.28.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (253) hide show
  1. checksums.yaml +4 -4
  2. data/assets/ceedling +3 -0
  3. data/assets/ceedling.cmd +1 -0
  4. data/assets/default_gitignore +5 -0
  5. data/assets/project_with_guts.yml +1 -0
  6. data/assets/project_with_guts_gcov.yml +3 -0
  7. data/assets/test_example_file_verbose.c +12 -0
  8. data/bin/ceedling +30 -6
  9. data/docs/CeedlingPacket.md +135 -23
  10. data/docs/CeedlingPacket.odt +0 -0
  11. data/examples/blinky/rakefile.rb +2 -1
  12. data/lib/ceedling/configurator.rb +7 -5
  13. data/lib/ceedling/configurator_builder.rb +10 -7
  14. data/lib/ceedling/configurator_plugins.rb +29 -24
  15. data/lib/ceedling/configurator_setup.rb +0 -1
  16. data/lib/ceedling/defaults.rb +7 -2
  17. data/lib/ceedling/dependinator.rb +10 -2
  18. data/lib/ceedling/file_finder.rb +57 -49
  19. data/lib/ceedling/file_path_utils.rb +12 -4
  20. data/lib/ceedling/file_wrapper.rb +4 -0
  21. data/lib/ceedling/generator.rb +4 -3
  22. data/lib/ceedling/generator_test_results.rb +15 -13
  23. data/lib/ceedling/plugin_manager.rb +18 -18
  24. data/lib/ceedling/plugin_reportinator.rb +3 -2
  25. data/lib/ceedling/plugin_reportinator_helper.rb +2 -3
  26. data/lib/ceedling/preprocessinator_extractor.rb +2 -2
  27. data/lib/ceedling/preprocessinator_includes_handler.rb +5 -0
  28. data/lib/ceedling/rakefile.rb +1 -0
  29. data/lib/ceedling/release_invoker_helper.rb +5 -2
  30. data/lib/ceedling/rules_release.rake +2 -1
  31. data/lib/ceedling/rules_tests.rake +18 -9
  32. data/lib/ceedling/rules_tests_deep_dependencies.rake +2 -2
  33. data/lib/ceedling/task_invoker.rb +15 -3
  34. data/lib/ceedling/tasks_vendor.rake +3 -3
  35. data/lib/ceedling/test_invoker.rb +39 -12
  36. data/lib/ceedling/test_invoker_helper.rb +5 -1
  37. data/lib/ceedling/tool_executor.rb +8 -4
  38. data/lib/ceedling/version.rb +1 -1
  39. data/out.fail +21 -0
  40. data/plugins/beep/README.md +22 -0
  41. data/plugins/beep/lib/beep.rb +40 -0
  42. data/plugins/bullseye/bullseye.rake +43 -36
  43. data/plugins/bullseye/config/defaults.yml +4 -0
  44. data/plugins/bullseye/lib/bullseye.rb +27 -5
  45. data/plugins/command_hooks/lib/command_hooks.rb +3 -0
  46. data/plugins/gcov/README.md +34 -1
  47. data/plugins/gcov/config/defaults.yml +3 -3
  48. data/plugins/gcov/gcov.rake +7 -5
  49. data/plugins/gcov/lib/gcov.rb +3 -1
  50. data/plugins/gcov/lib/gcov_constants.rb +2 -0
  51. data/plugins/junit_tests_report/lib/junit_tests_report.rb +12 -9
  52. data/plugins/module_generator/lib/module_generator.rb +14 -1
  53. data/plugins/module_generator/module_generator.rake +21 -4
  54. data/plugins/raw_output_report/lib/raw_output_report.rb +41 -0
  55. data/spec/gcov/gcov_deployment_spec.rb +1 -1
  56. data/spec/gcov/gcov_test_cases_spec.rb +2 -2
  57. data/spec/generator_test_results_spec.rb +5 -0
  58. data/spec/preprocessinator_includes_handler_spec.rb +1 -0
  59. data/spec/spec_system_helper.rb +178 -4
  60. data/spec/support/test_example.fail +1 -0
  61. data/spec/support/test_example.pass +1 -0
  62. data/spec/support/test_example_empty.pass +1 -0
  63. data/spec/support/test_example_ignore.pass +1 -0
  64. data/spec/support/test_example_mangled.pass +1 -0
  65. data/spec/support/test_example_with_time.pass +22 -0
  66. data/spec/system/deployment_spec.rb +33 -0
  67. data/vendor/cmock/README.md +4 -3
  68. data/vendor/cmock/docs/CMock_Summary.md +1 -1
  69. data/vendor/cmock/lib/cmock_config.rb +4 -0
  70. data/vendor/cmock/lib/cmock_generator.rb +5 -2
  71. data/vendor/cmock/lib/cmock_generator_plugin_array.rb +4 -4
  72. data/vendor/cmock/lib/cmock_generator_plugin_callback.rb +9 -11
  73. data/vendor/cmock/lib/cmock_generator_plugin_cexception.rb +0 -1
  74. data/vendor/cmock/lib/cmock_generator_plugin_ignore.rb +2 -3
  75. data/vendor/cmock/lib/cmock_generator_plugin_ignore_arg.rb +2 -4
  76. data/vendor/cmock/lib/cmock_generator_plugin_return_thru_ptr.rb +0 -2
  77. data/vendor/cmock/lib/cmock_generator_utils.rb +16 -3
  78. data/vendor/cmock/lib/cmock_header_parser.rb +59 -34
  79. data/vendor/cmock/release/build.info +1 -1
  80. data/vendor/cmock/release/version.info +1 -1
  81. data/vendor/cmock/scripts/create_makefile.rb +17 -2
  82. data/vendor/cmock/src/cmock.c +13 -7
  83. data/vendor/cmock/test/test_helper.rb +11 -10
  84. data/vendor/cmock/test/unit/cmock_config_test.rb +4 -2
  85. data/vendor/cmock/test/unit/cmock_generator_main_test.rb +10 -4
  86. data/vendor/cmock/test/unit/cmock_generator_plugin_array_test.rb +20 -12
  87. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_a_test.rb +2 -2
  88. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_b_test.rb +2 -2
  89. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_arg_test.rb +3 -3
  90. data/vendor/cmock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb +8 -6
  91. data/vendor/cmock/test/unit/cmock_generator_utils_test.rb +27 -10
  92. data/vendor/cmock/test/unit/cmock_header_parser_test.rb +108 -20
  93. data/vendor/cmock/vendor/c_exception/Gemfile +4 -0
  94. data/vendor/cmock/vendor/c_exception/Gemfile.lock +12 -0
  95. data/vendor/cmock/vendor/c_exception/LICENSE.txt +30 -0
  96. data/vendor/cmock/vendor/c_exception/README.md +162 -0
  97. data/vendor/cmock/vendor/c_exception/Rakefile +42 -0
  98. data/vendor/cmock/vendor/c_exception/docs/CException.md +292 -0
  99. data/vendor/cmock/vendor/c_exception/docs/ThrowTheSwitchCodingStandard.md +207 -0
  100. data/vendor/cmock/vendor/c_exception/lib/CException.c +46 -0
  101. data/vendor/cmock/vendor/c_exception/lib/CException.h +110 -0
  102. data/vendor/cmock/vendor/c_exception/makefile +24 -0
  103. data/vendor/cmock/vendor/c_exception/release/build.info +2 -0
  104. data/vendor/cmock/vendor/c_exception/release/version.info +2 -0
  105. data/vendor/cmock/vendor/c_exception/test/CExceptionConfig.h +46 -0
  106. data/vendor/cmock/vendor/c_exception/test/TestException.c +391 -0
  107. data/vendor/cmock/vendor/c_exception/test/TestException_Runner.c +67 -0
  108. data/vendor/cmock/vendor/unity/README.md +231 -0
  109. data/vendor/cmock/vendor/unity/auto/colour_prompt.rb +118 -0
  110. data/vendor/cmock/vendor/unity/auto/colour_reporter.rb +39 -0
  111. data/vendor/cmock/vendor/unity/auto/generate_config.yml +36 -0
  112. data/vendor/cmock/vendor/unity/auto/generate_module.rb +308 -0
  113. data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +457 -0
  114. data/vendor/cmock/vendor/unity/auto/parse_output.rb +323 -0
  115. data/vendor/cmock/vendor/unity/auto/stylize_as_junit.rb +252 -0
  116. data/vendor/cmock/vendor/unity/auto/test_file_filter.rb +25 -0
  117. data/vendor/cmock/vendor/unity/auto/type_sanitizer.rb +6 -0
  118. data/vendor/cmock/vendor/unity/auto/unity_test_summary.py +139 -0
  119. data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +136 -0
  120. data/vendor/cmock/vendor/unity/auto/unity_to_junit.py +146 -0
  121. data/vendor/cmock/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +206 -0
  122. data/vendor/cmock/vendor/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf +0 -0
  123. data/vendor/cmock/vendor/unity/docs/UnityAssertionsReference.md +779 -0
  124. data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +433 -0
  125. data/vendor/cmock/vendor/unity/docs/UnityGettingStartedGuide.md +192 -0
  126. data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +260 -0
  127. data/vendor/cmock/vendor/unity/docs/license.txt +21 -0
  128. data/vendor/cmock/vendor/unity/examples/example_1/makefile +71 -0
  129. data/vendor/cmock/vendor/unity/examples/example_1/readme.txt +5 -0
  130. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.c +24 -0
  131. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.h +3 -0
  132. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.c +11 -0
  133. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.h +2 -0
  134. data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode.c +62 -0
  135. data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode2.c +31 -0
  136. data/vendor/cmock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c +53 -0
  137. data/vendor/cmock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c +57 -0
  138. data/vendor/cmock/vendor/unity/examples/example_2/makefile +70 -0
  139. data/vendor/cmock/vendor/unity/examples/example_2/readme.txt +5 -0
  140. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.c +24 -0
  141. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.h +3 -0
  142. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.c +11 -0
  143. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.h +2 -0
  144. data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode.c +64 -0
  145. data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode2.c +33 -0
  146. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +9 -0
  147. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +11 -0
  148. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/all_tests.c +12 -0
  149. data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.c +10 -0
  150. data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.h +12 -0
  151. data/vendor/cmock/vendor/unity/examples/example_3/rakefile.rb +43 -0
  152. data/vendor/cmock/vendor/unity/examples/example_3/rakefile_helper.rb +249 -0
  153. data/vendor/cmock/vendor/unity/examples/example_3/readme.txt +13 -0
  154. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.c +24 -0
  155. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.h +3 -0
  156. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.c +11 -0
  157. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.h +2 -0
  158. data/vendor/cmock/vendor/unity/examples/example_3/target_gcc_32.yml +46 -0
  159. data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode.c +62 -0
  160. data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode2.c +31 -0
  161. data/vendor/cmock/vendor/unity/examples/unity_config.h +247 -0
  162. data/vendor/cmock/vendor/unity/extras/eclipse/error_parsers.txt +26 -0
  163. data/vendor/cmock/vendor/unity/extras/fixture/rakefile.rb +48 -0
  164. data/vendor/cmock/vendor/unity/extras/fixture/rakefile_helper.rb +178 -0
  165. data/vendor/cmock/vendor/unity/extras/fixture/readme.txt +9 -0
  166. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.c +436 -0
  167. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.h +83 -0
  168. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_internals.h +51 -0
  169. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_malloc_overrides.h +47 -0
  170. data/vendor/cmock/vendor/unity/extras/fixture/test/Makefile +75 -0
  171. data/vendor/cmock/vendor/unity/extras/fixture/test/main/AllTests.c +22 -0
  172. data/vendor/cmock/vendor/unity/extras/fixture/test/template_fixture_tests.c +39 -0
  173. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_Test.c +543 -0
  174. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +57 -0
  175. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_output_Spy.c +57 -0
  176. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_output_Spy.h +17 -0
  177. data/vendor/cmock/vendor/unity/release/build.info +2 -0
  178. data/vendor/cmock/vendor/unity/release/version.info +2 -0
  179. data/vendor/cmock/vendor/unity/src/unity.c +1572 -0
  180. data/vendor/cmock/vendor/unity/src/unity.h +503 -0
  181. data/vendor/cmock/vendor/unity/src/unity_internals.h +924 -0
  182. data/vendor/cmock/vendor/unity/test/Makefile +68 -0
  183. data/vendor/cmock/vendor/unity/test/expectdata/testsample_cmd.c +61 -0
  184. data/vendor/cmock/vendor/unity/test/expectdata/testsample_def.c +57 -0
  185. data/vendor/cmock/vendor/unity/test/expectdata/testsample_head1.c +55 -0
  186. data/vendor/cmock/vendor/unity/test/expectdata/testsample_head1.h +15 -0
  187. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_cmd.c +80 -0
  188. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_def.c +76 -0
  189. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_head1.c +75 -0
  190. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_head1.h +13 -0
  191. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_new1.c +89 -0
  192. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_new2.c +89 -0
  193. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_param.c +77 -0
  194. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_run1.c +89 -0
  195. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_run2.c +89 -0
  196. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_yaml.c +90 -0
  197. data/vendor/cmock/vendor/unity/test/expectdata/testsample_new1.c +67 -0
  198. data/vendor/cmock/vendor/unity/test/expectdata/testsample_new2.c +70 -0
  199. data/vendor/cmock/vendor/unity/test/expectdata/testsample_param.c +58 -0
  200. data/vendor/cmock/vendor/unity/test/expectdata/testsample_run1.c +67 -0
  201. data/vendor/cmock/vendor/unity/test/expectdata/testsample_run2.c +70 -0
  202. data/vendor/cmock/vendor/unity/test/expectdata/testsample_yaml.c +71 -0
  203. data/vendor/cmock/vendor/unity/test/rakefile +125 -0
  204. data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +260 -0
  205. data/vendor/cmock/vendor/unity/test/spec/generate_module_existing_file_spec.rb +158 -0
  206. data/vendor/cmock/vendor/unity/test/targets/clang_file.yml +78 -0
  207. data/vendor/cmock/vendor/unity/test/targets/clang_strict.yml +78 -0
  208. data/vendor/cmock/vendor/unity/test/targets/gcc_32.yml +49 -0
  209. data/vendor/cmock/vendor/unity/test/targets/gcc_64.yml +50 -0
  210. data/vendor/cmock/vendor/unity/test/targets/gcc_auto_limits.yml +47 -0
  211. data/vendor/cmock/vendor/unity/test/targets/gcc_auto_stdint.yml +59 -0
  212. data/vendor/cmock/vendor/unity/test/targets/gcc_manual_math.yml +47 -0
  213. data/vendor/cmock/vendor/unity/test/targets/hitech_picc18.yml +101 -0
  214. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v4.yml +90 -0
  215. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5.yml +80 -0
  216. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5_3.yml +80 -0
  217. data/vendor/cmock/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml +94 -0
  218. data/vendor/cmock/vendor/unity/test/targets/iar_cortexm3_v5.yml +84 -0
  219. data/vendor/cmock/vendor/unity/test/targets/iar_msp430.yml +95 -0
  220. data/vendor/cmock/vendor/unity/test/targets/iar_sh2a_v6.yml +86 -0
  221. data/vendor/cmock/vendor/unity/test/testdata/CException.h +11 -0
  222. data/vendor/cmock/vendor/unity/test/testdata/Defs.h +8 -0
  223. data/vendor/cmock/vendor/unity/test/testdata/cmock.h +14 -0
  224. data/vendor/cmock/vendor/unity/test/testdata/mockMock.h +13 -0
  225. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGenerator.c +186 -0
  226. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +70 -0
  227. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +195 -0
  228. data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +1252 -0
  229. data/vendor/cmock/vendor/unity/test/tests/testparameterized.c +113 -0
  230. data/vendor/cmock/vendor/unity/test/tests/testunity.c +5371 -0
  231. data/vendor/unity/auto/generate_test_runner.rb +30 -10
  232. data/vendor/unity/auto/parse_output.rb +212 -109
  233. data/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +9 -10
  234. data/vendor/unity/docs/UnityAssertionsReference.md +11 -2
  235. data/vendor/unity/docs/UnityConfigurationGuide.md +90 -55
  236. data/vendor/unity/docs/UnityGettingStartedGuide.md +6 -5
  237. data/vendor/unity/docs/UnityHelperScriptsGuide.md +23 -5
  238. data/vendor/unity/examples/unity_config.h +8 -0
  239. data/vendor/unity/extras/fixture/src/unity_fixture.c +4 -0
  240. data/vendor/unity/extras/fixture/src/unity_fixture.h +1 -1
  241. data/vendor/unity/extras/fixture/src/unity_fixture_internals.h +2 -2
  242. data/vendor/unity/release/build.info +1 -1
  243. data/vendor/unity/release/version.info +1 -1
  244. data/vendor/unity/src/unity.c +64 -57
  245. data/vendor/unity/src/unity.h +111 -7
  246. data/vendor/unity/src/unity_internals.h +173 -73
  247. data/vendor/unity/test/Makefile +5 -1
  248. data/vendor/unity/test/testdata/testRunnerGenerator.c +4 -1
  249. data/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +4 -1
  250. data/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +4 -1
  251. data/vendor/unity/test/tests/testparameterized.c +5 -2
  252. data/vendor/unity/test/tests/testunity.c +34 -0
  253. metadata +150 -2
@@ -19,3 +19,4 @@
19
19
  :stdout:
20
20
  - Verbose output one
21
21
  - Verbous output two
22
+ :time: 0.0
@@ -19,3 +19,4 @@
19
19
  :stdout:
20
20
  - Verbose output one
21
21
  - Verbous output two
22
+ :time: 0.0
@@ -11,3 +11,4 @@
11
11
  :failed: 0
12
12
  :ignored: 0
13
13
  :stdout: []
14
+ :time: 0.0
@@ -19,3 +19,4 @@
19
19
  :stdout:
20
20
  - Verbose output one
21
21
  - Verbous output two
22
+ :time: 0.0
@@ -17,3 +17,4 @@
17
17
  :stdout:
18
18
  - Verbose output one
19
19
  - test_example.c:269:test_tVerbous output two
20
+ :time: 0.0
@@ -0,0 +1,22 @@
1
+ ---
2
+ :source:
3
+ :path: some/place
4
+ :file: test_example.c
5
+ :successes:
6
+ - :test: test_one
7
+ :line: 257
8
+ :message: ''
9
+ - :test: test_two
10
+ :line: 269
11
+ :message: ''
12
+ :failures: []
13
+ :ignores: []
14
+ :counts:
15
+ :total: 2
16
+ :passed: 2
17
+ :failed: 0
18
+ :ignored: 0
19
+ :stdout:
20
+ - Verbose output one
21
+ - Verbous output two
22
+ :time: 0.01234
@@ -30,11 +30,32 @@ describe "Ceedling" do
30
30
  it { can_test_projects_with_success }
31
31
  it { can_test_projects_with_fail }
32
32
  it { can_test_projects_with_compile_error }
33
+ it { uses_raw_output_report_plugin }
33
34
  it { can_use_the_module_plugin }
35
+ it { can_use_the_module_plugin_path_extension }
36
+ it { can_use_the_module_plugin_with_include_path }
34
37
  it { handles_creating_the_same_module_twice_using_the_module_plugin }
35
38
  it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin }
39
+ it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin_path_extension }
36
40
  end
37
41
 
42
+ describe "deployed in a project's `vendor` directory." do
43
+ before do
44
+ @c.with_context do
45
+ `bundle exec ruby -S ceedling new --with-ignore #{@proj_name} 2>&1`
46
+ end
47
+ end
48
+
49
+ it { can_create_projects }
50
+ it { has_an_ignore }
51
+ it { contains_a_vendor_directory }
52
+ it { contains_documentation }
53
+ it { can_test_projects_with_success }
54
+ it { can_use_the_module_plugin }
55
+ end
56
+
57
+
58
+
38
59
  describe "deployed in a project's `vendor` directory without docs." do
39
60
  before do
40
61
  @c.with_context do
@@ -51,8 +72,11 @@ describe "Ceedling" do
51
72
  it { can_test_projects_with_fail }
52
73
  it { can_test_projects_with_compile_error }
53
74
  it { can_use_the_module_plugin }
75
+ it { can_use_the_module_plugin_path_extension }
76
+ it { can_use_the_module_plugin_with_include_path }
54
77
  it { handles_creating_the_same_module_twice_using_the_module_plugin }
55
78
  it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin }
79
+ it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin_path_extension }
56
80
  end
57
81
 
58
82
  describe "ugrade a project's `vendor` directory" do
@@ -71,8 +95,11 @@ describe "Ceedling" do
71
95
  it { can_test_projects_with_fail }
72
96
  it { can_test_projects_with_compile_error }
73
97
  it { can_use_the_module_plugin }
98
+ it { can_use_the_module_plugin_path_extension }
99
+ it { can_use_the_module_plugin_with_include_path }
74
100
  it { handles_creating_the_same_module_twice_using_the_module_plugin }
75
101
  it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin }
102
+ it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin_path_extension }
76
103
 
77
104
  it { can_upgrade_projects }
78
105
  it { contains_a_vendor_directory }
@@ -82,8 +109,11 @@ describe "Ceedling" do
82
109
  it { can_test_projects_with_fail }
83
110
  it { can_test_projects_with_compile_error }
84
111
  it { can_use_the_module_plugin }
112
+ it { can_use_the_module_plugin_path_extension }
113
+ it { can_use_the_module_plugin_with_include_path }
85
114
  it { handles_creating_the_same_module_twice_using_the_module_plugin }
86
115
  it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin }
116
+ it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin_path_extension }
87
117
  end
88
118
 
89
119
  describe "deployed as a gem" do
@@ -101,8 +131,11 @@ describe "Ceedling" do
101
131
  it { can_test_projects_with_fail }
102
132
  it { can_test_projects_with_compile_error }
103
133
  it { can_use_the_module_plugin }
134
+ it { can_use_the_module_plugin_path_extension }
135
+ it { can_use_the_module_plugin_with_include_path }
104
136
  it { handles_creating_the_same_module_twice_using_the_module_plugin }
105
137
  it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin }
138
+ it { handles_destroying_a_module_that_does_not_exist_using_the_module_plugin_path_extension }
106
139
  end
107
140
 
108
141
  describe "command: `ceedling examples`" do
@@ -7,17 +7,18 @@ Getting Started
7
7
  ================
8
8
 
9
9
  If you're using Ceedling, there is no need to install CMock. It will handle it for you.
10
- For everyone else, the simplest way is to grab it off github. You can also download it
10
+ For everyone else, the simplest way is to grab it off github. You can also download it
11
11
  as a zip if you prefer. The Github method looks something like this:
12
12
 
13
13
  > git clone --recursive https://github.com/throwtheswitch/cmock.git
14
14
  > cd cmock
15
15
  > bundle install # Ensures you have all RubyGems needed
16
-
16
+
17
17
  If you plan to help with the development of CMock (or just want to verify that it can
18
18
  perform its self tests on your system) then you can enter the test directory and then
19
19
  ask it to test:
20
-
20
+
21
+ > cd test
21
22
  > rake # Run all CMock self tests
22
23
 
23
24
  API Documentation
@@ -597,7 +597,7 @@ Examples
597
597
 
598
598
  You can look in the [examples directory](/examples/) for a couple of examples on how
599
599
  you might tool CMock into your build process. You may also want to consider
600
- using [Ceedling](https://throwtheswitch.org/Ceedling). Please note that
600
+ using [Ceedling](https://throwtheswitch.org/ceedling). Please note that
601
601
  these examples are meant to show how the build process works. They have
602
602
  failing tests ON PURPOSE to show what that would look like. Don't be alarmed. ;)
603
603
 
@@ -120,6 +120,8 @@ class CMockConfig
120
120
  'UINT32' => 'HEX32',
121
121
  'UINT32_T' => 'HEX32',
122
122
  'void*' => 'HEX8_ARRAY',
123
+ 'void const*' => 'HEX8_ARRAY',
124
+ 'const void*' => 'HEX8_ARRAY',
123
125
  'unsigned short' => 'HEX16',
124
126
  'uint16' => 'HEX16',
125
127
  'uint16_t' => 'HEX16',
@@ -131,6 +133,8 @@ class CMockConfig
131
133
  'UINT8' => 'HEX8',
132
134
  'UINT8_T' => 'HEX8',
133
135
  'char*' => 'STRING',
136
+ 'char const*' => 'STRING',
137
+ 'const char*' => 'STRING',
134
138
  'pCHAR' => 'STRING',
135
139
  'cstring' => 'STRING',
136
140
  'CSTRING' => 'STRING',
@@ -103,7 +103,9 @@ class CMockGenerator
103
103
  file << "\n"
104
104
  file << "/* Ignore the following warnings, since we are copying code */\n"
105
105
  file << "#if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__)\n"
106
+ file << "#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))\n"
106
107
  file << "#pragma GCC diagnostic push\n"
108
+ file << "#endif\n"
107
109
  file << "#if !defined(__clang__)\n"
108
110
  file << "#pragma GCC diagnostic ignored \"-Wpragmas\"\n"
109
111
  file << "#endif\n"
@@ -128,8 +130,10 @@ class CMockGenerator
128
130
  def create_mock_header_footer(header)
129
131
  header << "\n"
130
132
  header << "#if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__)\n"
133
+ header << "#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))\n"
131
134
  header << "#pragma GCC diagnostic pop\n"
132
135
  header << "#endif\n"
136
+ header << "#endif\n"
133
137
  header << "\n"
134
138
  header << "#endif\n"
135
139
  end
@@ -247,10 +251,9 @@ class CMockGenerator
247
251
  file << " if (cmock_call_instance->CallOrder < GlobalVerifyOrder)\n"
248
252
  file << " UNITY_TEST_FAIL(cmock_line, CMockStringCalledLate);\n"
249
253
  end
250
- return_type = function[:return][:const?] ? "(const #{function[:return][:type]})" : ((function[:return][:type] =~ /cmock/) ? "(#{function[:return][:type]})" : '')
251
254
  file << @plugins.run(:mock_implementation, function)
252
255
  file << " UNITY_CLR_DETAILS();\n"
253
- file << " return #{return_type}cmock_call_instance->ReturnVal;\n" unless (function[:return][:void?])
256
+ file << " return cmock_call_instance->ReturnVal;\n" unless (function[:return][:void?])
254
257
  file << "}\n\n"
255
258
  end
256
259
 
@@ -27,8 +27,8 @@ class CMockGeneratorPluginArray
27
27
  return nil unless function[:contains_ptr?]
28
28
  args_call = function[:args].map{|m| m[:ptr?] ? "#{m[:name]}, #{m[:name]}_Depth" : "#{m[:name]}"}.join(', ')
29
29
  args_string = function[:args].map do |m|
30
- const_str = m[:const?] ? 'const ' : ''
31
- m[:ptr?] ? "#{const_str}#{m[:type]} #{m[:name]}, int #{m[:name]}_Depth" : "#{const_str}#{m[:type]} #{m[:name]}"
30
+ type = @utils.arg_type_with_const(m)
31
+ m[:ptr?] ? "#{type} #{m[:name]}, int #{m[:name]}_Depth" : "#{type} #{m[:name]}"
32
32
  end.join(', ')
33
33
  if (function[:return][:void?])
34
34
  return "#define #{function[:name]}_ExpectWithArray(#{args_call}) #{function[:name]}_CMockExpectWithArray(__LINE__, #{args_call})\n" +
@@ -44,8 +44,8 @@ class CMockGeneratorPluginArray
44
44
  lines = []
45
45
  func_name = function[:name]
46
46
  args_string = function[:args].map do |m|
47
- const_str = m[:const?] ? 'const ' : ''
48
- m[:ptr?] ? "#{const_str}#{m[:type]} #{m[:name]}, int #{m[:name]}_Depth" : "#{const_str}#{m[:type]} #{m[:name]}"
47
+ type = @utils.arg_type_with_const(m)
48
+ m[:ptr?] ? "#{type} #{m[:name]}, int #{m[:name]}_Depth" : "#{type} #{m[:name]}"
49
49
  end.join(', ')
50
50
  call_string = function[:args].map{|m| m[:ptr?] ? "#{m[:name]}, #{m[:name]}_Depth" : m[:name]}.join(', ')
51
51
  if (function[:return][:void?])
@@ -33,7 +33,7 @@ class CMockGeneratorPluginCallback
33
33
 
34
34
  def mock_function_declarations(function)
35
35
  func_name = function[:name]
36
- return_type = function[:return][:const?] ? "const #{function[:return][:type]}" : function[:return][:type]
36
+ return_type = function[:return][:type]
37
37
  style = (@include_count ? 1 : 0) | (function[:args].empty? ? 0 : 2)
38
38
  styles = [ "void", "int cmock_num_calls", function[:args_string], "#{function[:args_string]}, int cmock_num_calls" ]
39
39
  "typedef #{return_type} (* CMOCK_#{func_name}_CALLBACK)(#{styles[style]});\nvoid #{func_name}_StubWithCallback(CMOCK_#{func_name}_CALLBACK Callback);\n"
@@ -41,7 +41,6 @@ class CMockGeneratorPluginCallback
41
41
 
42
42
  def mock_implementation_for_callbacks_after_arg_check(function)
43
43
  func_name = function[:name]
44
- return_cast = function[:return][:const?] ? "(#{function[:return][:type]})" : ""
45
44
  style = (@include_count ? 1 : 0) | (function[:args].empty? ? 0 : 2) | (function[:return][:void?] ? 0 : 4)
46
45
  " if (Mock.#{func_name}_CallbackFunctionPointer != NULL)\n {\n" +
47
46
  case(style)
@@ -49,16 +48,15 @@ class CMockGeneratorPluginCallback
49
48
  when 1 then " Mock.#{func_name}_CallbackFunctionPointer(Mock.#{func_name}_CallbackCalls++);\n }\n"
50
49
  when 2 then " Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')});\n }\n"
51
50
  when 3 then " Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')}, Mock.#{func_name}_CallbackCalls++);\n }\n"
52
- when 4 then " cmock_call_instance->ReturnVal = #{return_cast}Mock.#{func_name}_CallbackFunctionPointer();\n }\n"
53
- when 5 then " cmock_call_instance->ReturnVal = #{return_cast}Mock.#{func_name}_CallbackFunctionPointer(Mock.#{func_name}_CallbackCalls++);\n }\n"
54
- when 6 then " cmock_call_instance->ReturnVal = #{return_cast}Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')});\n }\n"
55
- when 7 then " cmock_call_instance->ReturnVal = #{return_cast}Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')}, Mock.#{func_name}_CallbackCalls++);\n }\n"
51
+ when 4 then " cmock_call_instance->ReturnVal = Mock.#{func_name}_CallbackFunctionPointer();\n }\n"
52
+ when 5 then " cmock_call_instance->ReturnVal = Mock.#{func_name}_CallbackFunctionPointer(Mock.#{func_name}_CallbackCalls++);\n }\n"
53
+ when 6 then " cmock_call_instance->ReturnVal = Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')});\n }\n"
54
+ when 7 then " cmock_call_instance->ReturnVal = Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')}, Mock.#{func_name}_CallbackCalls++);\n }\n"
56
55
  end
57
56
  end
58
57
 
59
58
  def mock_implementation_for_callbacks_without_arg_check(function)
60
59
  func_name = function[:name]
61
- return_cast = function[:return][:const?] ? "(#{function[:return][:type]})" : ""
62
60
  style = (@include_count ? 1 : 0) | (function[:args].empty? ? 0 : 2) | (function[:return][:void?] ? 0 : 4)
63
61
  " if (Mock.#{func_name}_CallbackFunctionPointer != NULL)\n {\n" +
64
62
  case(style)
@@ -66,10 +64,10 @@ class CMockGeneratorPluginCallback
66
64
  when 1 then " Mock.#{func_name}_CallbackFunctionPointer(Mock.#{func_name}_CallbackCalls++);\n return;\n }\n"
67
65
  when 2 then " Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')});\n return;\n }\n"
68
66
  when 3 then " Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')}, Mock.#{func_name}_CallbackCalls++);\n return;\n }\n"
69
- when 4 then " return #{return_cast}Mock.#{func_name}_CallbackFunctionPointer();\n }\n"
70
- when 5 then " return #{return_cast}Mock.#{func_name}_CallbackFunctionPointer(Mock.#{func_name}_CallbackCalls++);\n }\n"
71
- when 6 then " return #{return_cast}Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')});\n }\n"
72
- when 7 then " return #{return_cast}Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')}, Mock.#{func_name}_CallbackCalls++);\n }\n"
67
+ when 4 then " return Mock.#{func_name}_CallbackFunctionPointer();\n }\n"
68
+ when 5 then " return Mock.#{func_name}_CallbackFunctionPointer(Mock.#{func_name}_CallbackCalls++);\n }\n"
69
+ when 6 then " return Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')});\n }\n"
70
+ when 7 then " return Mock.#{func_name}_CallbackFunctionPointer(#{function[:args].map{|m| m[:name]}.join(', ')}, Mock.#{func_name}_CallbackCalls++);\n }\n"
73
71
  end
74
72
  end
75
73
 
@@ -41,7 +41,6 @@ class CMockGeneratorPluginCexception
41
41
 
42
42
  def mock_interfaces(function)
43
43
  arg_insert = (function[:args_string] == "void") ? "" : "#{function[:args_string]}, "
44
- call_string = function[:args].map{|m| m[:name]}.join(', ')
45
44
  [ "void #{function[:name]}_CMockExpectAndThrow(UNITY_LINE_TYPE cmock_line, #{arg_insert}CEXCEPTION_T cmock_to_throw)\n{\n",
46
45
  @utils.code_add_base_expectation(function[:name]),
47
46
  @utils.code_call_argument_loader(function),
@@ -40,10 +40,9 @@ class CMockGeneratorPluginIgnore
40
40
  lines << " return;\n }\n"
41
41
  else
42
42
  retval = function[:return].merge( { :name => "cmock_call_instance->ReturnVal"} )
43
- return_type = function[:return][:const?] ? "(const #{function[:return][:type]})" : ((function[:return][:type] =~ /cmock/) ? "(#{function[:return][:type]})" : '')
44
- lines << " if (cmock_call_instance == NULL)\n return #{return_type}Mock.#{function[:name]}_FinalReturn;\n"
43
+ lines << " if (cmock_call_instance == NULL)\n return Mock.#{function[:name]}_FinalReturn;\n"
45
44
  lines << " " + @utils.code_assign_argument_quickly("Mock.#{function[:name]}_FinalReturn", retval) unless (retval[:void?])
46
- lines << " return #{return_type}cmock_call_instance->ReturnVal;\n }\n"
45
+ lines << " return cmock_call_instance->ReturnVal;\n }\n"
47
46
  end
48
47
  lines
49
48
  end
@@ -29,14 +29,12 @@ class CMockGeneratorPluginIgnoreArg
29
29
  lines = []
30
30
  func_name = function[:name]
31
31
  function[:args].each do |arg|
32
- arg_name = arg[:name]
33
- arg_type = arg[:type]
34
- lines << "void #{function[:name]}_CMockIgnoreArg_#{arg[:name]}(UNITY_LINE_TYPE cmock_line)\n"
32
+ lines << "void #{func_name}_CMockIgnoreArg_#{arg[:name]}(UNITY_LINE_TYPE cmock_line)\n"
35
33
  lines << "{\n"
36
34
  lines << " CMOCK_#{func_name}_CALL_INSTANCE* cmock_call_instance = " +
37
35
  "(CMOCK_#{func_name}_CALL_INSTANCE*)CMock_Guts_GetAddressFor(CMock_Guts_MemEndOfChain(Mock.#{func_name}_CallInstance));\n"
38
36
  lines << " UNITY_TEST_ASSERT_NOT_NULL(cmock_call_instance, cmock_line, CMockStringIgnPreExp);\n"
39
- lines << " cmock_call_instance->IgnoreArg_#{arg_name} = 1;\n"
37
+ lines << " cmock_call_instance->IgnoreArg_#{arg[:name]} = 1;\n"
40
38
  lines << "}\n\n"
41
39
  end
42
40
  lines
@@ -40,7 +40,6 @@ class CMockGeneratorPluginReturnThruPtr
40
40
  func_name = function[:name]
41
41
  function[:args].each do |arg|
42
42
  arg_name = arg[:name]
43
- arg_type = arg[:type]
44
43
  if (@utils.ptr_or_str?(arg[:type]) and not arg[:const?])
45
44
  lines << "void #{func_name}_CMockReturnMemThruPtr_#{arg_name}(UNITY_LINE_TYPE cmock_line, #{arg[:type]} #{arg_name}, int cmock_size)\n"
46
45
  lines << "{\n"
@@ -60,7 +59,6 @@ class CMockGeneratorPluginReturnThruPtr
60
59
  lines = []
61
60
  function[:args].each do |arg|
62
61
  arg_name = arg[:name]
63
- arg_type = arg[:type]
64
62
  if (@utils.ptr_or_str?(arg[:type]) and not arg[:const?])
65
63
  lines << " if (cmock_call_instance->ReturnThruPtr_#{arg_name}_Used)\n"
66
64
  lines << " {\n"
@@ -22,6 +22,19 @@ class CMockGeneratorUtils
22
22
  @helpers = helpers
23
23
  end
24
24
 
25
+ def self.arg_type_with_const(arg)
26
+ # Restore any "const" that was removed in header parsing
27
+ if arg[:type].include?('*')
28
+ arg[:const_ptr?] ? "#{arg[:type]} const" : arg[:type]
29
+ else
30
+ arg[:const?] ? "const #{arg[:type]}" : arg[:type]
31
+ end
32
+ end
33
+
34
+ def arg_type_with_const(arg)
35
+ self.class.arg_type_with_const(arg)
36
+ end
37
+
25
38
  def code_verify_an_arg_expectation(function, arg)
26
39
  if (@arrays)
27
40
  case(@ptr_handling)
@@ -58,7 +71,7 @@ class CMockGeneratorUtils
58
71
 
59
72
  def code_assign_argument_quickly(dest, arg)
60
73
  if (arg[:ptr?] or @treat_as.include?(arg[:type]))
61
- " #{dest} = #{arg[:const?] ? "(#{arg[:type]})" : ''}#{arg[:name]};\n"
74
+ " #{dest} = #{arg[:name]};\n"
62
75
  else
63
76
  " memcpy(&#{dest}, &#{arg[:name]}, sizeof(#{arg[:type]}));\n"
64
77
  end
@@ -68,8 +81,8 @@ class CMockGeneratorUtils
68
81
  if (function[:args_string] != "void")
69
82
  if (@arrays)
70
83
  args_string = function[:args].map do |m|
71
- const_str = m[ :const? ] ? 'const ' : ''
72
- m[:ptr?] ? "#{const_str}#{m[:type]} #{m[:name]}, int #{m[:name]}_Depth" : "#{const_str}#{m[:type]} #{m[:name]}"
84
+ type = arg_type_with_const(m)
85
+ m[:ptr?] ? "#{type} #{m[:name]}, int #{m[:name]}_Depth" : "#{type} #{m[:name]}"
73
86
  end.join(', ')
74
87
  "void CMockExpectParameters_#{function[:name]}(CMOCK_#{function[:name]}_CALL_INSTANCE* cmock_call_instance, #{args_string})\n{\n" +
75
88
  function[:args].inject("") { |all, arg| all + code_add_an_arg_expectation(arg, (arg[:ptr?] ? "#{arg[:name]}_Depth" : 1) ) } +
@@ -6,12 +6,13 @@
6
6
 
7
7
  class CMockHeaderParser
8
8
 
9
- attr_accessor :funcs, :c_attributes, :treat_as_void, :treat_externs
9
+ attr_accessor :funcs, :c_attr_noconst, :c_attributes, :treat_as_void, :treat_externs
10
10
 
11
11
  def initialize(cfg)
12
12
  @funcs = []
13
13
  @c_strippables = cfg.strippables
14
- @c_attributes = (['const'] + cfg.attributes).uniq
14
+ @c_attr_noconst = cfg.attributes.uniq - ['const']
15
+ @c_attributes = ['const'] + c_attr_noconst
15
16
  @c_calling_conventions = cfg.c_calling_conventions.uniq
16
17
  @treat_as_void = (['void'] + cfg.treat_as_void).uniq
17
18
  @declaration_parse_matcher = /([\d\w\s\*\(\),\[\]]+??)\(([\d\w\s\*\(\),\.\[\]+-]*)\)$/m
@@ -139,16 +140,51 @@ class CMockHeaderParser
139
140
  return funcs
140
141
  end
141
142
 
143
+ def parse_type_and_name(arg)
144
+ # Split up words and remove known attributes. For pointer types, make sure
145
+ # to remove 'const' only when it applies to the pointer itself, not when it
146
+ # applies to the type pointed to. For non-pointer types, remove any
147
+ # occurrence of 'const'.
148
+ arg.gsub!(/(\w)\*/,'\1 *') # pull asterisks away from preceding word
149
+ arg.gsub!(/\*(\w)/,'* \1') # pull asterisks away from following word
150
+ arg_array = arg.split
151
+ arg_info = divine_ptr_and_const(arg)
152
+ arg_info[:name] = arg_array[-1]
153
+
154
+ attributes = arg.include?('*') ? @c_attr_noconst : @c_attributes
155
+ attr_array = []
156
+ type_array = []
157
+
158
+ arg_array[0..-2].each do |word|
159
+ if attributes.include?(word)
160
+ attr_array << word
161
+ elsif @c_calling_conventions.include?(word)
162
+ arg_info[:c_calling_convention] = word
163
+ else
164
+ type_array << word
165
+ end
166
+ end
167
+
168
+ if arg_info[:const_ptr?]
169
+ attr_array << 'const'
170
+ type_array.delete_at(type_array.rindex('const'))
171
+ end
172
+
173
+ arg_info[:modifier] = attr_array.join(' ')
174
+ arg_info[:type] = type_array.join(' ').gsub(/\s+\*/,'*') # remove space before asterisks
175
+ return arg_info
176
+ end
177
+
142
178
  def parse_args(arg_list)
143
179
  args = []
144
180
  arg_list.split(',').each do |arg|
145
181
  arg.strip!
146
182
  return args if (arg =~ /^\s*((\.\.\.)|(void))\s*$/) # we're done if we reach void by itself or ...
147
- arg_array = arg.split
148
- arg_elements = arg_array - @c_attributes # split up words and remove known attributes
149
- args << { :type => arg_elements[0..-2].join(' '),
150
- :name => arg_elements[-1]
151
- }.merge(divine_ptr_and_const(arg))
183
+
184
+ arg_info = parse_type_and_name(arg)
185
+ arg_info.delete(:modifier) # don't care about this
186
+ arg_info.delete(:c_calling_convention) # don't care about this
187
+ args << arg_info
152
188
  end
153
189
  return args
154
190
  end
@@ -227,35 +263,24 @@ class CMockHeaderParser
227
263
  args = regex_match[2].strip
228
264
 
229
265
  #process function attributes, return type, and name
230
- descriptors = regex_match[1]
231
- descriptors.gsub!(/(\w)\*/,'\1 *') #pull asterisks away from preceding word
232
- descriptors.gsub!(/\*(\w)/,'* \1') #pull asterisks away from following word
233
- descriptors = descriptors.split #array of all descriptor strings
234
-
235
- #grab name
236
- decl[:name] = descriptors[-1] #snag name as last array item
237
-
238
- #build attribute and return type strings
239
- decl[:modifier] = []
240
- rettype = []
241
- full_retval = descriptors[0..-2].join(' ')
242
- descriptors[0..-2].each do |word|
243
- if @c_attributes.include?(word)
244
- decl[:modifier] << word
245
- elsif @c_calling_conventions.include?(word)
246
- decl[:c_calling_convention] = word
247
- else
248
- rettype << word
249
- end
266
+ parsed = parse_type_and_name(regex_match[1])
267
+
268
+ decl[:name] = parsed[:name]
269
+ decl[:modifier] = parsed[:modifier]
270
+ unless parsed[:c_calling_convention].nil?
271
+ decl[:c_calling_convention] = parsed[:c_calling_convention]
250
272
  end
251
- decl[:modifier] = decl[:modifier].join(' ')
252
- rettype = rettype.join(' ').gsub(/\s+\*/,'*') #remove space before asterisks
273
+
274
+ rettype = parsed[:type]
253
275
  rettype = 'void' if (@local_as_void.include?(rettype.strip))
254
- decl[:return] = { :type => rettype,
255
- :name => 'cmock_to_return',
256
- :str => "#{rettype} cmock_to_return",
257
- :void? => (rettype == 'void')
258
- }.merge(divine_ptr_and_const(full_retval))
276
+ decl[:return] = { :type => rettype,
277
+ :name => 'cmock_to_return',
278
+ :str => "#{rettype} cmock_to_return",
279
+ :void? => (rettype == 'void'),
280
+ :ptr? => parsed[:ptr?],
281
+ :const? => parsed[:const?],
282
+ :const_ptr? => parsed[:const_ptr?]
283
+ }
259
284
 
260
285
  #remove default argument statements from mock definitions
261
286
  args.gsub!(/=\s*[a-zA-Z0-9_\.]+\s*/, ' ')