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
@@ -0,0 +1,25 @@
1
+ # ==========================================
2
+ # Unity Project - A Test Framework for C
3
+ # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
4
+ # [Released under MIT License. Please refer to license.txt for details]
5
+ # ==========================================
6
+
7
+ require'yaml'
8
+
9
+ module RakefileHelpers
10
+ class TestFileFilter
11
+ def initialize(all_files = false)
12
+ @all_files = all_files
13
+
14
+ return false unless @all_files
15
+ return false unless File.exist?('test_file_filter.yml')
16
+
17
+ filters = YAML.load_file('test_file_filter.yml')
18
+ @all_files = filters[:all_files]
19
+ @only_files = filters[:only_files]
20
+ @exclude_files = filters[:exclude_files]
21
+ end
22
+
23
+ attr_accessor :all_files, :only_files, :exclude_files
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ module TypeSanitizer
2
+ def self.sanitize_c_identifier(unsanitized)
3
+ # convert filename to valid C identifier by replacing invalid chars with '_'
4
+ unsanitized.gsub(/[-\/\\\.\,\s]/, '_')
5
+ end
6
+ end
@@ -0,0 +1,139 @@
1
+ #! python3
2
+ # ==========================================
3
+ # Unity Project - A Test Framework for C
4
+ # Copyright (c) 2015 Alexander Mueller / XelaRellum@web.de
5
+ # [Released under MIT License. Please refer to license.txt for details]
6
+ # Based on the ruby script by Mike Karlesky, Mark VanderVoord, Greg Williams
7
+ # ==========================================
8
+ import sys
9
+ import os
10
+ import re
11
+ from glob import glob
12
+
13
+ class UnityTestSummary:
14
+ def __init__(self):
15
+ self.report = ''
16
+ self.total_tests = 0
17
+ self.failures = 0
18
+ self.ignored = 0
19
+
20
+ def run(self):
21
+ # Clean up result file names
22
+ results = []
23
+ for target in self.targets:
24
+ results.append(target.replace('\\', '/'))
25
+
26
+ # Dig through each result file, looking for details on pass/fail:
27
+ failure_output = []
28
+ ignore_output = []
29
+
30
+ for result_file in results:
31
+ lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n')))
32
+ if len(lines) == 0:
33
+ raise Exception("Empty test result file: %s" % result_file)
34
+
35
+ details = self.get_details(result_file, lines)
36
+ failures = details['failures']
37
+ ignores = details['ignores']
38
+ if len(failures) > 0: failure_output.append('\n'.join(failures))
39
+ if len(ignores) > 0: ignore_output.append('n'.join(ignores))
40
+ tests,failures,ignored = self.parse_test_summary('\n'.join(lines))
41
+ self.total_tests += tests
42
+ self.failures += failures
43
+ self.ignored += ignored
44
+
45
+ if self.ignored > 0:
46
+ self.report += "\n"
47
+ self.report += "--------------------------\n"
48
+ self.report += "UNITY IGNORED TEST SUMMARY\n"
49
+ self.report += "--------------------------\n"
50
+ self.report += "\n".join(ignore_output)
51
+
52
+ if self.failures > 0:
53
+ self.report += "\n"
54
+ self.report += "--------------------------\n"
55
+ self.report += "UNITY FAILED TEST SUMMARY\n"
56
+ self.report += "--------------------------\n"
57
+ self.report += '\n'.join(failure_output)
58
+
59
+ self.report += "\n"
60
+ self.report += "--------------------------\n"
61
+ self.report += "OVERALL UNITY TEST SUMMARY\n"
62
+ self.report += "--------------------------\n"
63
+ self.report += "{total_tests} TOTAL TESTS {failures} TOTAL FAILURES {ignored} IGNORED\n".format(total_tests = self.total_tests, failures=self.failures, ignored=self.ignored)
64
+ self.report += "\n"
65
+
66
+ return self.report
67
+
68
+ def set_targets(self, target_array):
69
+ self.targets = target_array
70
+
71
+ def set_root_path(self, path):
72
+ self.root = path
73
+
74
+ def usage(self, err_msg=None):
75
+ print("\nERROR: ")
76
+ if err_msg:
77
+ print(err_msg)
78
+ print("\nUsage: unity_test_summary.py result_file_directory/ root_path/")
79
+ print(" result_file_directory - The location of your results files.")
80
+ print(" Defaults to current directory if not specified.")
81
+ print(" Should end in / if specified.")
82
+ print(" root_path - Helpful for producing more verbose output if using relative paths.")
83
+ sys.exit(1)
84
+
85
+ def get_details(self, result_file, lines):
86
+ results = { 'failures': [], 'ignores': [], 'successes': [] }
87
+ for line in lines:
88
+ parts = line.split(':')
89
+ if len(parts) == 5:
90
+ src_file,src_line,test_name,status,msg = parts
91
+ elif len(parts) == 4:
92
+ src_file,src_line,test_name,status = parts
93
+ msg = ''
94
+ else:
95
+ continue
96
+ if len(self.root) > 0:
97
+ line_out = "%s%s" % (self.root, line)
98
+ else:
99
+ line_out = line
100
+ if status == 'IGNORE':
101
+ results['ignores'].append(line_out)
102
+ elif status == 'FAIL':
103
+ results['failures'].append(line_out)
104
+ elif status == 'PASS':
105
+ results['successes'].append(line_out)
106
+ return results
107
+
108
+ def parse_test_summary(self, summary):
109
+ m = re.search(r"([0-9]+) Tests ([0-9]+) Failures ([0-9]+) Ignored", summary)
110
+ if not m:
111
+ raise Exception("Couldn't parse test results: %s" % summary)
112
+
113
+ return int(m.group(1)), int(m.group(2)), int(m.group(3))
114
+
115
+
116
+ if __name__ == '__main__':
117
+ uts = UnityTestSummary()
118
+ try:
119
+ #look in the specified or current directory for result files
120
+ if len(sys.argv) > 1:
121
+ targets_dir = sys.argv[1]
122
+ else:
123
+ targets_dir = './'
124
+ targets = list(map(lambda x: x.replace('\\', '/'), glob(targets_dir + '*.test*')))
125
+ if len(targets) == 0:
126
+ raise Exception("No *.testpass or *.testfail files found in '%s'" % targets_dir)
127
+ uts.set_targets(targets)
128
+
129
+ #set the root path
130
+ if len(sys.argv) > 2:
131
+ root_path = sys.argv[2]
132
+ else:
133
+ root_path = os.path.split(__file__)[0]
134
+ uts.set_root_path(root_path)
135
+
136
+ #run the summarizer
137
+ print(uts.run())
138
+ except Exception as e:
139
+ uts.usage(e)
@@ -0,0 +1,136 @@
1
+ # ==========================================
2
+ # Unity Project - A Test Framework for C
3
+ # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
4
+ # [Released under MIT License. Please refer to license.txt for details]
5
+ # ==========================================
6
+
7
+ # !/usr/bin/ruby
8
+ #
9
+ # unity_test_summary.rb
10
+ #
11
+ require 'fileutils'
12
+ require 'set'
13
+
14
+ class UnityTestSummary
15
+ include FileUtils::Verbose
16
+
17
+ attr_reader :report, :total_tests, :failures, :ignored
18
+ attr_writer :targets, :root
19
+
20
+ def initialize(_opts = {})
21
+ @report = ''
22
+ @total_tests = 0
23
+ @failures = 0
24
+ @ignored = 0
25
+ end
26
+
27
+ def run
28
+ # Clean up result file names
29
+ results = @targets.map { |target| target.tr('\\', '/') }
30
+
31
+ # Dig through each result file, looking for details on pass/fail:
32
+ failure_output = []
33
+ ignore_output = []
34
+
35
+ results.each do |result_file|
36
+ lines = File.readlines(result_file).map(&:chomp)
37
+
38
+ raise "Empty test result file: #{result_file}" if lines.empty?
39
+
40
+ output = get_details(result_file, lines)
41
+ failure_output << output[:failures] unless output[:failures].empty?
42
+ ignore_output << output[:ignores] unless output[:ignores].empty?
43
+ tests, failures, ignored = parse_test_summary(lines)
44
+ @total_tests += tests
45
+ @failures += failures
46
+ @ignored += ignored
47
+ end
48
+
49
+ if @ignored > 0
50
+ @report += "\n"
51
+ @report += "--------------------------\n"
52
+ @report += "UNITY IGNORED TEST SUMMARY\n"
53
+ @report += "--------------------------\n"
54
+ @report += ignore_output.flatten.join("\n")
55
+ end
56
+
57
+ if @failures > 0
58
+ @report += "\n"
59
+ @report += "--------------------------\n"
60
+ @report += "UNITY FAILED TEST SUMMARY\n"
61
+ @report += "--------------------------\n"
62
+ @report += failure_output.flatten.join("\n")
63
+ end
64
+
65
+ @report += "\n"
66
+ @report += "--------------------------\n"
67
+ @report += "OVERALL UNITY TEST SUMMARY\n"
68
+ @report += "--------------------------\n"
69
+ @report += "#{@total_tests} TOTAL TESTS #{@failures} TOTAL FAILURES #{@ignored} IGNORED\n"
70
+ @report += "\n"
71
+ end
72
+
73
+ def usage(err_msg = nil)
74
+ puts "\nERROR: "
75
+ puts err_msg if err_msg
76
+ puts "\nUsage: unity_test_summary.rb result_file_directory/ root_path/"
77
+ puts ' result_file_directory - The location of your results files.'
78
+ puts ' Defaults to current directory if not specified.'
79
+ puts ' Should end in / if specified.'
80
+ puts ' root_path - Helpful for producing more verbose output if using relative paths.'
81
+ exit 1
82
+ end
83
+
84
+ protected
85
+
86
+ def get_details(_result_file, lines)
87
+ results = { failures: [], ignores: [], successes: [] }
88
+ lines.each do |line|
89
+ _src_file, _src_line, _test_name, status, _msg = line.split(/:/)
90
+ line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\')
91
+ case status
92
+ when 'IGNORE' then results[:ignores] << line_out
93
+ when 'FAIL' then results[:failures] << line_out
94
+ when 'PASS' then results[:successes] << line_out
95
+ end
96
+ end
97
+ results
98
+ end
99
+
100
+ def parse_test_summary(summary)
101
+ raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ }
102
+ [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i]
103
+ end
104
+
105
+ def here
106
+ File.expand_path(File.dirname(__FILE__))
107
+ end
108
+ end
109
+
110
+ if $0 == __FILE__
111
+
112
+ # parse out the command options
113
+ opts, args = ARGV.partition { |v| v =~ /^--\w+/ }
114
+ opts.map! { |v| v[2..-1].to_sym }
115
+
116
+ # create an instance to work with
117
+ uts = UnityTestSummary.new(opts)
118
+
119
+ begin
120
+ # look in the specified or current directory for result files
121
+ args[0] ||= './'
122
+ targets = "#{ARGV[0].tr('\\', '/')}**/*.test*"
123
+ results = Dir[targets]
124
+ raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty?
125
+ uts.targets = results
126
+
127
+ # set the root path
128
+ args[1] ||= Dir.pwd + '/'
129
+ uts.root = ARGV[1]
130
+
131
+ # run the summarizer
132
+ puts uts.run
133
+ rescue StandardError => e
134
+ uts.usage e.message
135
+ end
136
+ end
@@ -0,0 +1,146 @@
1
+ import sys
2
+ import os
3
+ from glob import glob
4
+
5
+ from pyparsing import *
6
+ from junit_xml import TestSuite, TestCase
7
+
8
+
9
+ class UnityTestSummary:
10
+ def __init__(self):
11
+ self.report = ''
12
+ self.total_tests = 0
13
+ self.failures = 0
14
+ self.ignored = 0
15
+ self.targets = 0
16
+ self.root = None
17
+ self.test_suites = dict()
18
+
19
+ def run(self):
20
+ # Clean up result file names
21
+ results = []
22
+ for target in self.targets:
23
+ results.append(target.replace('\\', '/'))
24
+
25
+ # Dig through each result file, looking for details on pass/fail:
26
+ for result_file in results:
27
+ lines = list(map(lambda line: line.rstrip(), open(result_file, "r").read().split('\n')))
28
+ if len(lines) == 0:
29
+ raise Exception("Empty test result file: %s" % result_file)
30
+
31
+ # define an expression for your file reference
32
+ entry_one = Combine(
33
+ oneOf(list(alphas)) + ':/' +
34
+ Word(alphanums + '_-./'))
35
+
36
+ entry_two = Word(printables + ' ', excludeChars=':')
37
+ entry = entry_one | entry_two
38
+
39
+ delimiter = Literal(':').suppress()
40
+ tc_result_line = Group(entry.setResultsName('tc_file_name') + delimiter + entry.setResultsName(
41
+ 'tc_line_nr') + delimiter + entry.setResultsName('tc_name') + delimiter + entry.setResultsName(
42
+ 'tc_status') + Optional(
43
+ delimiter + entry.setResultsName('tc_msg'))).setResultsName("tc_line")
44
+
45
+ eol = LineEnd().suppress()
46
+ sol = LineStart().suppress()
47
+ blank_line = sol + eol
48
+
49
+ tc_summary_line = Group(Word(nums).setResultsName("num_of_tests") + "Tests" + Word(nums).setResultsName(
50
+ "num_of_fail") + "Failures" + Word(nums).setResultsName("num_of_ignore") + "Ignored").setResultsName(
51
+ "tc_summary")
52
+ tc_end_line = Or(Literal("FAIL"), Literal('Ok')).setResultsName("tc_result")
53
+
54
+ # run it and see...
55
+ pp1 = tc_result_line | Optional(tc_summary_line | tc_end_line)
56
+ pp1.ignore(blank_line | OneOrMore("-"))
57
+
58
+ result = list()
59
+ for l in lines:
60
+ result.append((pp1.parseString(l)).asDict())
61
+ # delete empty results
62
+ result = filter(None, result)
63
+
64
+ tc_list = list()
65
+ for r in result:
66
+ if 'tc_line' in r:
67
+ tmp_tc_line = r['tc_line']
68
+
69
+ # get only the file name which will be used as the classname
70
+ file_name = tmp_tc_line['tc_file_name'].split('\\').pop().split('/').pop().rsplit('.', 1)[0]
71
+ tmp_tc = TestCase(name=tmp_tc_line['tc_name'], classname=file_name)
72
+ if 'tc_status' in tmp_tc_line:
73
+ if str(tmp_tc_line['tc_status']) == 'IGNORE':
74
+ if 'tc_msg' in tmp_tc_line:
75
+ tmp_tc.add_skipped_info(message=tmp_tc_line['tc_msg'],
76
+ output=r'[File]={0}, [Line]={1}'.format(
77
+ tmp_tc_line['tc_file_name'], tmp_tc_line['tc_line_nr']))
78
+ else:
79
+ tmp_tc.add_skipped_info(message=" ")
80
+ elif str(tmp_tc_line['tc_status']) == 'FAIL':
81
+ if 'tc_msg' in tmp_tc_line:
82
+ tmp_tc.add_failure_info(message=tmp_tc_line['tc_msg'],
83
+ output=r'[File]={0}, [Line]={1}'.format(
84
+ tmp_tc_line['tc_file_name'], tmp_tc_line['tc_line_nr']))
85
+ else:
86
+ tmp_tc.add_failure_info(message=" ")
87
+
88
+ tc_list.append((str(result_file), tmp_tc))
89
+
90
+ for k, v in tc_list:
91
+ try:
92
+ self.test_suites[k].append(v)
93
+ except KeyError:
94
+ self.test_suites[k] = [v]
95
+ ts = []
96
+ for suite_name in self.test_suites:
97
+ ts.append(TestSuite(suite_name, self.test_suites[suite_name]))
98
+
99
+ with open('result.xml', 'w') as f:
100
+ TestSuite.to_file(f, ts, prettyprint='True', encoding='utf-8')
101
+
102
+ return self.report
103
+
104
+ def set_targets(self, target_array):
105
+ self.targets = target_array
106
+
107
+ def set_root_path(self, path):
108
+ self.root = path
109
+
110
+ @staticmethod
111
+ def usage(err_msg=None):
112
+ print("\nERROR: ")
113
+ if err_msg:
114
+ print(err_msg)
115
+ print("\nUsage: unity_test_summary.py result_file_directory/ root_path/")
116
+ print(" result_file_directory - The location of your results files.")
117
+ print(" Defaults to current directory if not specified.")
118
+ print(" Should end in / if specified.")
119
+ print(" root_path - Helpful for producing more verbose output if using relative paths.")
120
+ sys.exit(1)
121
+
122
+
123
+ if __name__ == '__main__':
124
+ uts = UnityTestSummary()
125
+ try:
126
+ # look in the specified or current directory for result files
127
+ if len(sys.argv) > 1:
128
+ targets_dir = sys.argv[1]
129
+ else:
130
+ targets_dir = './'
131
+ targets = list(map(lambda x: x.replace('\\', '/'), glob(targets_dir + '*.test*')))
132
+ if len(targets) == 0:
133
+ raise Exception("No *.testpass or *.testfail files found in '%s'" % targets_dir)
134
+ uts.set_targets(targets)
135
+
136
+ # set the root path
137
+ if len(sys.argv) > 2:
138
+ root_path = sys.argv[2]
139
+ else:
140
+ root_path = os.path.split(__file__)[0]
141
+ uts.set_root_path(root_path)
142
+
143
+ # run the summarizer
144
+ print(uts.run())
145
+ except Exception as e:
146
+ UnityTestSummary.usage(e)