ceedling 0.28.2 → 0.28.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -26,6 +26,7 @@ class UnityTestRunnerGenerator
26
26
  framework: :unity,
27
27
  test_prefix: 'test|spec|should',
28
28
  mock_prefix: 'Mock',
29
+ mock_suffix: '',
29
30
  setup_name: 'setUp',
30
31
  teardown_name: 'tearDown',
31
32
  main_name: 'main', # set to :auto to automatically generate each time
@@ -119,7 +120,7 @@ class UnityTestRunnerGenerator
119
120
  source_index = 0
120
121
  tests_and_line_numbers.size.times do |i|
121
122
  source_lines[source_index..-1].each_with_index do |line, index|
122
- next unless line =~ /#{tests_and_line_numbers[i][:test]}/
123
+ next unless line =~ /\s+#{tests_and_line_numbers[i][:test]}(?:\s|\()/
123
124
  source_index += index
124
125
  tests_and_line_numbers[i][:line_number] = source_index + 1
125
126
  break
@@ -148,7 +149,7 @@ class UnityTestRunnerGenerator
148
149
  mock_headers = []
149
150
  includes.each do |include_path|
150
151
  include_file = File.basename(include_path)
151
- mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}/i
152
+ mock_headers << include_path if include_file =~ /^#{@options[:mock_prefix]}.*#{@options[:mock_suffix]}$/i
152
153
  end
153
154
  mock_headers
154
155
  end
@@ -157,9 +158,14 @@ class UnityTestRunnerGenerator
157
158
  output.puts('/* AUTOGENERATED FILE. DO NOT EDIT. */')
158
159
  create_runtest(output, mocks)
159
160
  output.puts("\n/*=======Automagically Detected Files To Include=====*/")
161
+ output.puts('#ifdef __WIN32__')
162
+ output.puts('#define UNITY_INCLUDE_SETUP_STUBS')
163
+ output.puts('#endif')
160
164
  output.puts("#include \"#{@options[:framework]}.h\"")
161
165
  output.puts('#include "cmock.h"') unless mocks.empty?
166
+ output.puts('#ifndef UNITY_EXCLUDE_SETJMP_H')
162
167
  output.puts('#include <setjmp.h>')
168
+ output.puts("#endif")
163
169
  output.puts('#include <stdio.h>')
164
170
  if @options[:defines] && !@options[:defines].empty?
165
171
  @options[:defines].each { |d| output.puts("#define #{d}") }
@@ -235,22 +241,36 @@ class UnityTestRunnerGenerator
235
241
  end
236
242
 
237
243
  def create_suite_setup(output)
238
- return if @options[:suite_setup].nil?
239
-
240
244
  output.puts("\n/*=======Suite Setup=====*/")
241
245
  output.puts('static void suite_setup(void)')
242
246
  output.puts('{')
243
- output.puts(@options[:suite_setup])
247
+ if @options[:suite_setup].nil?
248
+ # New style, call suiteSetUp() if we can use weak symbols
249
+ output.puts('#if defined(UNITY_WEAK_ATTRIBUTE) || defined(UNITY_WEAK_PRAGMA)')
250
+ output.puts(' suiteSetUp();')
251
+ output.puts('#endif')
252
+ else
253
+ # Old style, C code embedded in the :suite_setup option
254
+ output.puts(@options[:suite_setup])
255
+ end
244
256
  output.puts('}')
245
257
  end
246
258
 
247
259
  def create_suite_teardown(output)
248
- return if @options[:suite_teardown].nil?
249
-
250
260
  output.puts("\n/*=======Suite Teardown=====*/")
251
261
  output.puts('static int suite_teardown(int num_failures)')
252
262
  output.puts('{')
253
- output.puts(@options[:suite_teardown])
263
+ if @options[:suite_teardown].nil?
264
+ # New style, call suiteTearDown() if we can use weak symbols
265
+ output.puts('#if defined(UNITY_WEAK_ATTRIBUTE) || defined(UNITY_WEAK_PRAGMA)')
266
+ output.puts(' return suiteTearDown(num_failures);')
267
+ output.puts('#else')
268
+ output.puts(' return num_failures;')
269
+ output.puts('#endif')
270
+ else
271
+ # Old style, C code embedded in the :suite_teardown option
272
+ output.puts(@options[:suite_teardown])
273
+ end
254
274
  output.puts('}')
255
275
  end
256
276
 
@@ -342,7 +362,7 @@ class UnityTestRunnerGenerator
342
362
  output.puts("int #{main_name}(void)")
343
363
  output.puts('{')
344
364
  end
345
- output.puts(' suite_setup();') unless @options[:suite_setup].nil?
365
+ output.puts(' suite_setup();')
346
366
  output.puts(" UnityBegin(\"#{filename.gsub(/\\/, '\\\\\\')}\");")
347
367
  if @options[:use_param_tests]
348
368
  tests.each do |test|
@@ -357,7 +377,7 @@ class UnityTestRunnerGenerator
357
377
  end
358
378
  output.puts
359
379
  output.puts(' CMock_Guts_MemFreeFinal();') unless used_mocks.empty?
360
- output.puts(" return #{@options[:suite_teardown].nil? ? '' : 'suite_teardown'}(UnityEnd());")
380
+ output.puts(" return suite_teardown(UnityEnd());")
361
381
  output.puts('}')
362
382
  end
363
383
 
@@ -1,206 +1,309 @@
1
1
  #============================================================
2
- # Author: John Theofanopoulos
3
- # A simple parser. Takes the output files generated during the build process and
4
- # extracts information relating to the tests.
2
+ # Author: John Theofanopoulos
3
+ # A simple parser. Takes the output files generated during the
4
+ # build process and extracts information relating to the tests.
5
5
  #
6
6
  # Notes:
7
7
  # To capture an output file under VS builds use the following:
8
- # devenv [build instructions] > Output.txt & type Output.txt
8
+ # devenv [build instructions] > Output.txt & type Output.txt
9
9
  #
10
- # To capture an output file under GCC/Linux builds use the following:
10
+ # To capture an output file under Linux builds use the following:
11
11
  # make | tee Output.txt
12
12
  #
13
+ # This script can handle the following output formats:
14
+ # - normal output (raw unity)
15
+ # - fixture output (unity_fixture.h/.c)
16
+ # - fixture output with verbose flag set ("-v")
17
+ #
13
18
  # To use this parser use the following command
14
19
  # ruby parseOutput.rb [options] [file]
15
- # options: -xml : produce a JUnit compatible XML file
16
- # file : file to scan for results
20
+ # options: -xml : produce a JUnit compatible XML file
21
+ # file: file to scan for results
17
22
  #============================================================
18
23
 
24
+ # Parser class for handling the input file
19
25
  class ParseOutput
20
26
  def initialize
21
- @test_flag = false
27
+ # internal data
28
+ @class_name_idx = 0
29
+ @path_delim = nil
30
+
31
+ # xml output related
22
32
  @xml_out = false
23
33
  @array_list = false
24
- @total_tests = false
25
- @class_index = false
34
+
35
+ # current suite name and statistics
36
+ @test_suite = nil
37
+ @total_tests = 0
38
+ @test_passed = 0
39
+ @test_failed = 0
40
+ @test_ignored = 0
26
41
  end
27
42
 
28
- # Set the flag to indicate if there will be an XML output file or not
43
+ # Set the flag to indicate if there will be an XML output file or not
29
44
  def set_xml_output
30
45
  @xml_out = true
31
46
  end
32
47
 
33
- # if write our output to XML
48
+ # If write our output to XML
34
49
  def write_xml_output
35
50
  output = File.open('report.xml', 'w')
36
51
  output << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
37
52
  @array_list.each do |item|
38
53
  output << item << "\n"
39
54
  end
40
- output << "</testsuite>\n"
41
55
  end
42
56
 
43
- # This function will try and determine when the suite is changed. This is
57
+ # Pushes the suite info as xml to the array list, which will be written later
58
+ def push_xml_output_suite_info
59
+ # Insert opening tag at front
60
+ heading = '<testsuite name="Unity" tests="' + @total_tests.to_s + '" failures="' + @test_failed.to_s + '"' + ' skips="' + @test_ignored.to_s + '">'
61
+ @array_list.insert(0, heading)
62
+ # Push back the closing tag
63
+ @array_list.push '</testsuite>'
64
+ end
65
+
66
+ # Pushes xml output data to the array list, which will be written later
67
+ def push_xml_output_passed(test_name)
68
+ @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '"/>'
69
+ end
70
+
71
+ # Pushes xml output data to the array list, which will be written later
72
+ def push_xml_output_failed(test_name, reason)
73
+ @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
74
+ @array_list.push ' <failure type="ASSERT FAILED">' + reason + '</failure>'
75
+ @array_list.push ' </testcase>'
76
+ end
77
+
78
+ # Pushes xml output data to the array list, which will be written later
79
+ def push_xml_output_ignored(test_name, reason)
80
+ @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
81
+ @array_list.push ' <skipped type="TEST IGNORED">' + reason + '</skipped>'
82
+ @array_list.push ' </testcase>'
83
+ end
84
+
85
+ # This function will try and determine when the suite is changed. This is
44
86
  # is the name that gets added to the classname parameter.
45
87
  def test_suite_verify(test_suite_name)
46
- return if @test_flag
47
-
48
- @test_flag = true
49
88
  # Split the path name
50
- test_name = test_suite_name.split('/')
51
- # Remove the extension
52
- base_name = test_name[test_name.size - 1].split('.')
53
- @test_suite = 'test.' + base_name[0]
89
+ test_name = test_suite_name.split(@path_delim)
90
+
91
+ # Remove the extension and extract the base_name
92
+ base_name = test_name[test_name.size - 1].split('.')[0]
93
+
94
+ # Return if the test suite hasn't changed
95
+ return unless base_name.to_s != @test_suite.to_s
96
+
97
+ @test_suite = base_name
54
98
  printf "New Test: %s\n", @test_suite
55
99
  end
56
100
 
57
- # Test was flagged as having passed so format the output
58
- def test_passed(array)
59
- last_item = array.length - 1
60
- test_name = array[last_item - 1]
61
- test_suite_verify(array[@class_name])
101
+ # Prepares the line for verbose fixture output ("-v")
102
+ def prepare_fixture_line(line)
103
+ line = line.sub('IGNORE_TEST(', '')
104
+ line = line.sub('TEST(', '')
105
+ line = line.sub(')', ',')
106
+ line = line.chomp
107
+ array = line.split(',')
108
+ array.map { |x| x.to_s.lstrip.chomp }
109
+ end
110
+
111
+ # Test was flagged as having passed so format the output.
112
+ # This is using the Unity fixture output and not the original Unity output.
113
+ def test_passed_unity_fixture(array)
114
+ class_name = array[0]
115
+ test_name = array[1]
116
+ test_suite_verify(class_name)
62
117
  printf "%-40s PASS\n", test_name
63
118
 
64
- return unless @xml_out
119
+ push_xml_output_passed(test_name) if @xml_out
120
+ end
65
121
 
66
- @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '"/>'
122
+ # Test was flagged as having failed so format the output.
123
+ # This is using the Unity fixture output and not the original Unity output.
124
+ def test_failed_unity_fixture(array)
125
+ class_name = array[0]
126
+ test_name = array[1]
127
+ test_suite_verify(class_name)
128
+ reason_array = array[2].split(':')
129
+ reason = reason_array[-1].lstrip.chomp + ' at line: ' + reason_array[-4]
130
+
131
+ printf "%-40s FAILED\n", test_name
132
+
133
+ push_xml_output_failed(test_name, reason) if @xml_out
67
134
  end
68
135
 
69
- # Test was flagged as having passed so format the output.
136
+ # Test was flagged as being ignored so format the output.
70
137
  # This is using the Unity fixture output and not the original Unity output.
71
- def test_passed_unity_fixture(array)
72
- test_suite = array[0].sub('TEST(', '')
73
- test_suite = test_suite.sub(',', '')
74
- test_name = array[1].sub(')', '')
138
+ def test_ignored_unity_fixture(array)
139
+ class_name = array[0]
140
+ test_name = array[1]
141
+ reason = 'No reason given'
142
+ if array.size > 2
143
+ reason_array = array[2].split(':')
144
+ tmp_reason = reason_array[-1].lstrip.chomp
145
+ reason = tmp_reason == 'IGNORE' ? 'No reason given' : tmp_reason
146
+ end
147
+ test_suite_verify(class_name)
148
+ printf "%-40s IGNORED\n", test_name
149
+
150
+ push_xml_output_ignored(test_name, reason) if @xml_out
151
+ end
152
+
153
+ # Test was flagged as having passed so format the output
154
+ def test_passed(array)
155
+ last_item = array.length - 1
156
+ test_name = array[last_item - 1]
157
+ test_suite_verify(array[@class_name_idx])
158
+ printf "%-40s PASS\n", test_name
75
159
 
76
160
  return unless @xml_out
77
161
 
78
- @array_list.push ' <testcase classname="' + test_suite + '" name="' + test_name + '"/>'
162
+ push_xml_output_passed(test_name) if @xml_out
79
163
  end
80
164
 
81
- # Test was flagged as being ingored so format the output
82
- def test_ignored(array)
165
+ # Test was flagged as having failed so format the line
166
+ def test_failed(array)
83
167
  last_item = array.length - 1
84
168
  test_name = array[last_item - 2]
85
- reason = array[last_item].chomp
86
- test_suite_verify(array[@class_name])
87
- printf "%-40s IGNORED\n", test_name
169
+ reason = array[last_item].chomp.lstrip + ' at line: ' + array[last_item - 3]
170
+ class_name = array[@class_name_idx]
88
171
 
89
172
  if test_name.start_with? 'TEST('
90
173
  array2 = test_name.split(' ')
91
- @test_suite = array2[0].sub('TEST(', '')
92
- @test_suite = @test_suite.sub(',', '')
174
+
175
+ test_suite = array2[0].sub('TEST(', '')
176
+ test_suite = test_suite.sub(',', '')
177
+ class_name = test_suite
178
+
93
179
  test_name = array2[1].sub(')', '')
94
180
  end
95
181
 
96
- return unless @xml_out
182
+ test_suite_verify(class_name)
183
+ printf "%-40s FAILED\n", test_name
97
184
 
98
- @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
99
- @array_list.push ' <skipped type="TEST IGNORED"> ' + reason + ' </skipped>'
100
- @array_list.push ' </testcase>'
185
+ push_xml_output_failed(test_name, reason) if @xml_out
101
186
  end
102
187
 
103
- # Test was flagged as having failed so format the line
104
- def test_failed(array)
188
+ # Test was flagged as being ignored so format the output
189
+ def test_ignored(array)
105
190
  last_item = array.length - 1
106
191
  test_name = array[last_item - 2]
107
- reason = array[last_item].chomp + ' at line: ' + array[last_item - 3]
108
- test_suite_verify(array[@class_name])
109
- printf "%-40s FAILED\n", test_name
192
+ reason = array[last_item].chomp.lstrip
193
+ class_name = array[@class_name_idx]
110
194
 
111
195
  if test_name.start_with? 'TEST('
112
196
  array2 = test_name.split(' ')
113
- @test_suite = array2[0].sub('TEST(', '')
114
- @test_suite = @test_suite.sub(',', '')
197
+
198
+ test_suite = array2[0].sub('TEST(', '')
199
+ test_suite = test_suite.sub(',', '')
200
+ class_name = test_suite
201
+
115
202
  test_name = array2[1].sub(')', '')
116
203
  end
117
204
 
118
- return unless @xml_out
205
+ test_suite_verify(class_name)
206
+ printf "%-40s IGNORED\n", test_name
119
207
 
120
- @array_list.push ' <testcase classname="' + @test_suite + '" name="' + test_name + '">'
121
- @array_list.push ' <failure type="ASSERT FAILED"> ' + reason + ' </failure>'
122
- @array_list.push ' </testcase>'
208
+ push_xml_output_ignored(test_name, reason) if @xml_out
123
209
  end
124
210
 
125
- # Figure out what OS we are running on. For now we are assuming if it's not Windows it must
126
- # be Unix based.
127
- def detect_os
128
- os = RUBY_PLATFORM.split('-')
129
- @class_name = if os.size == 2
130
- if os[1] == 'mingw32'
131
- 1
132
- else
133
- 0
134
- end
135
- else
136
- 0
137
- end
211
+ # Adjusts the os specific members according to the current path style
212
+ # (Windows or Unix based)
213
+ def set_os_specifics(line)
214
+ if line.include? '\\'
215
+ # Windows X:\Y\Z
216
+ @class_name_idx = 1
217
+ @path_delim = '\\'
218
+ else
219
+ # Unix Based /X/Y/Z
220
+ @class_name_idx = 0
221
+ @path_delim = '/'
222
+ end
138
223
  end
139
224
 
140
225
  # Main function used to parse the file that was captured.
141
- def process(name)
142
- @test_flag = false
226
+ def process(file_name)
143
227
  @array_list = []
144
228
 
145
- detect_os
229
+ puts 'Parsing file: ' + file_name
146
230
 
147
- puts 'Parsing file: ' + name
148
-
149
- test_pass = 0
150
- test_fail = 0
151
- test_ignore = 0
231
+ @test_passed = 0
232
+ @test_failed = 0
233
+ @test_ignored = 0
152
234
  puts ''
153
235
  puts '=================== RESULTS ====================='
154
236
  puts ''
155
- File.open(name).each do |line|
156
- # Typical test lines look like this:
237
+ File.open(file_name).each do |line|
238
+ # Typical test lines look like these:
239
+ # ----------------------------------------------------
240
+ # 1. normal output:
157
241
  # <path>/<test_file>.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0
158
242
  # <path>/<test_file>.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented
159
243
  # <path>/<test_file>.c:115:test_tc5100_initCanVoidPtrs:PASS
160
244
  #
161
- # where path is different on Unix vs Windows devices (Windows leads with a drive letter)
245
+ # 2. fixture output
246
+ # <path>/<test_file>.c:63:TEST(<test_group>, <test_function>):FAIL: Expected 0x00001234 Was 0x00005A5A
247
+ # <path>/<test_file>.c:36:TEST(<test_group>, <test_function>):IGNORE
248
+ # Note: "PASS" information won't be generated in this mode
249
+ #
250
+ # 3. fixture output with verbose information ("-v")
251
+ # TEST(<test_group, <test_file>)<path>/<test_file>:168::FAIL: Expected 0x8D Was 0x8C
252
+ # TEST(<test_group>, <test_file>)<path>/<test_file>:22::IGNORE: This Test Was Ignored On Purpose
253
+ # IGNORE_TEST(<test_group, <test_file>)
254
+ # TEST(<test_group, <test_file>) PASS
255
+ #
256
+ # Note: Where path is different on Unix vs Windows devices (Windows leads with a drive letter)!
257
+ set_os_specifics(line)
162
258
  line_array = line.split(':')
163
259
 
164
260
  # If we were able to split the line then we can look to see if any of our target words
165
- # were found. Case is important.
166
- if (line_array.size >= 4) || (line.start_with? 'TEST(')
167
- # Determine if this test passed
168
- if line.include? ':PASS'
261
+ # were found. Case is important.
262
+ if (line_array.size >= 4) || (line.start_with? 'TEST(') || (line.start_with? 'IGNORE_TEST(')
263
+
264
+ # check if the output is fixture output (with verbose flag "-v")
265
+ if (line.start_with? 'TEST(') || (line.start_with? 'IGNORE_TEST(')
266
+ line_array = prepare_fixture_line(line)
267
+ if line.include? ' PASS'
268
+ test_passed_unity_fixture(line_array)
269
+ @test_passed += 1
270
+ elsif line.include? 'FAIL'
271
+ test_failed_unity_fixture(line_array)
272
+ @test_failed += 1
273
+ elsif line.include? 'IGNORE'
274
+ test_ignored_unity_fixture(line_array)
275
+ @test_ignored += 1
276
+ end
277
+ # normal output / fixture output (without verbose "-v")
278
+ elsif line.include? ':PASS'
169
279
  test_passed(line_array)
170
- test_pass += 1
171
- elsif line.include? ':FAIL:'
280
+ @test_passed += 1
281
+ elsif line.include? ':FAIL'
172
282
  test_failed(line_array)
173
- test_fail += 1
283
+ @test_failed += 1
174
284
  elsif line.include? ':IGNORE:'
175
285
  test_ignored(line_array)
176
- test_ignore += 1
177
- elsif line.start_with? 'TEST('
178
- if line.include? ' PASS'
179
- line_array = line.split(' ')
180
- test_passed_unity_fixture(line_array)
181
- test_pass += 1
182
- end
183
- # If none of the keywords are found there are no more tests for this suite so clear
184
- # the test flag
185
- else
186
- @test_flag = false
286
+ @test_ignored += 1
287
+ elsif line.include? ':IGNORE'
288
+ line_array.push('No reason given')
289
+ test_ignored(line_array)
290
+ @test_ignored += 1
187
291
  end
188
- else
189
- @test_flag = false
292
+ @total_tests = @test_passed + @test_failed + @test_ignored
190
293
  end
191
294
  end
192
295
  puts ''
193
296
  puts '=================== SUMMARY ====================='
194
297
  puts ''
195
- puts 'Tests Passed : ' + test_pass.to_s
196
- puts 'Tests Failed : ' + test_fail.to_s
197
- puts 'Tests Ignored : ' + test_ignore.to_s
198
- @total_tests = test_pass + test_fail + test_ignore
298
+ puts 'Tests Passed : ' + @test_passed.to_s
299
+ puts 'Tests Failed : ' + @test_failed.to_s
300
+ puts 'Tests Ignored : ' + @test_ignored.to_s
199
301
 
200
302
  return unless @xml_out
201
303
 
202
- heading = '<testsuite tests="' + @total_tests.to_s + '" failures="' + test_fail.to_s + '"' + ' skips="' + test_ignore.to_s + '">'
203
- @array_list.insert(0, heading)
304
+ # push information about the suite
305
+ push_xml_output_suite_info
306
+ # write xml output file
204
307
  write_xml_output
205
308
  end
206
309
  end
@@ -209,11 +312,11 @@ end
209
312
  parse_my_file = ParseOutput.new
210
313
 
211
314
  if ARGV.size >= 1
212
- ARGV.each do |a|
213
- if a == '-xml'
315
+ ARGV.each do |arg|
316
+ if arg == '-xml'
214
317
  parse_my_file.set_xml_output
215
318
  else
216
- parse_my_file.process(a)
319
+ parse_my_file.process(arg)
217
320
  break
218
321
  end
219
322
  end