ceedling 1.1.10 → 1.2.0

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 (1131) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -0
  3. data/.simplecov +73 -0
  4. data/GIT_COMMIT_SHA +1 -1
  5. data/Gemfile +84 -8
  6. data/Gemfile.lock +38 -8
  7. data/README.md +51 -29
  8. data/Rakefile +768 -16
  9. data/assets/{project.yml → features/project.yml} +4 -1
  10. data/assets/fixtures/bullseye_branch_coverage/src/branchy.c +24 -0
  11. data/assets/fixtures/bullseye_branch_coverage/src/branchy.h +14 -0
  12. data/assets/fixtures/bullseye_branch_coverage/test/test_branchy.c +18 -0
  13. data/assets/fixtures/cppcheck_findings/findings.c +23 -0
  14. data/assets/fixtures/cppcheck_findings/findings.h +13 -0
  15. data/assets/fixtures/header_include_path_validation/alt_drivers/foo.h +6 -0
  16. data/assets/fixtures/header_include_path_validation/bar.h +6 -0
  17. data/assets/fixtures/header_include_path_validation/drivers/foo.h +6 -0
  18. data/assets/fixtures/header_include_path_validation/dup.h +6 -0
  19. data/assets/fixtures/header_include_path_validation/other_inc/dup.h +6 -0
  20. data/assets/fixtures/header_include_path_validation/test_ambiguous_mock.c +15 -0
  21. data/assets/fixtures/header_include_path_validation/test_bare_mock.c +11 -0
  22. data/assets/fixtures/header_include_path_validation/test_bogus_mock_path.c +11 -0
  23. data/assets/fixtures/header_include_path_validation/test_bogus_vanilla_path.c +10 -0
  24. data/assets/fixtures/header_include_path_validation/test_include_outranks_test_include_path.c +16 -0
  25. data/assets/fixtures/header_include_path_validation/test_pathed_mock.c +11 -0
  26. data/assets/fixtures/header_include_path_validation/test_pathed_mock_ambiguous.c +14 -0
  27. data/assets/fixtures/header_include_path_validation/test_test_include_path_outranks_include.c +17 -0
  28. data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.c +6 -0
  29. data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.h +6 -0
  30. data/assets/fixtures/implicit_source_header_correspondence/beta/dup.c +6 -0
  31. data/assets/fixtures/implicit_source_header_correspondence/beta/dup.h +6 -0
  32. data/assets/fixtures/implicit_source_header_correspondence/gamma/dup_gamma.c +6 -0
  33. data/assets/fixtures/implicit_source_header_correspondence/test_dup_alpha.c +10 -0
  34. data/assets/fixtures/implicit_source_header_correspondence/test_dup_bare.c +10 -0
  35. data/assets/fixtures/implicit_source_header_correspondence/test_dup_beta.c +10 -0
  36. data/assets/fixtures/implicit_source_header_correspondence/test_dup_override.c +19 -0
  37. data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive.c +19 -0
  38. data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive_noop.c +16 -0
  39. data/assets/fixtures/parent_directory_references/alpha/extra.c +4 -0
  40. data/assets/fixtures/parent_directory_references/common/helper.c +6 -0
  41. data/assets/fixtures/parent_directory_references/common/helper.h +6 -0
  42. data/assets/fixtures/parent_directory_references/unit/test_dotdot_include.c +10 -0
  43. data/assets/fixtures/parent_directory_references/unit/test_dotdot_source.c +16 -0
  44. data/assets/fixtures/plain_inline_module.h +9 -0
  45. data/assets/fixtures/same_named_modules/include/drivers/spi/config.h +6 -0
  46. data/assets/fixtures/same_named_modules/include/drivers/uart/config.h +6 -0
  47. data/assets/fixtures/same_named_modules/src/drivers/spi/config.c +8 -0
  48. data/assets/fixtures/same_named_modules/src/drivers/uart/config.c +10 -0
  49. data/assets/fixtures/same_named_modules/test/test_both_configs.c +26 -0
  50. data/assets/fixtures/same_named_modules/test/test_both_configs_mocked.c +20 -0
  51. data/assets/fixtures/same_named_modules/test/test_both_configs_mocked_traditional.c +19 -0
  52. data/assets/fixtures/same_named_modules/test/test_both_modules.c +19 -0
  53. data/assets/fixtures/same_named_modules/test/test_uart_config_bare.c +19 -0
  54. data/assets/fixtures/same_named_modules/test/test_uart_config_partial_only.c +20 -0
  55. data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.c +6 -0
  56. data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.h +6 -0
  57. data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.c +6 -0
  58. data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.h +6 -0
  59. data/assets/fixtures/sources_with_duplicate_basenames/main.c +11 -0
  60. data/assets/fixtures/sources_with_duplicate_basenames/test_baz_bar.c +10 -0
  61. data/assets/fixtures/sources_with_duplicate_basenames/test_both_bars.c +12 -0
  62. data/assets/fixtures/sources_with_duplicate_basenames/test_foo_bar.c +10 -0
  63. data/assets/{test_example_file_boom.c → fixtures/test_nosanitize_boom.c} +9 -0
  64. data/assets/{test_example_file_crash_assert.c → fixtures/test_nosanitize_crash_assert.c} +8 -0
  65. data/assets/{test_example_file_crash_sigsegv.c → fixtures/test_nosanitize_crash_sigsegv.c} +8 -0
  66. data/assets/{test_example_file_crash_sigsegv_with_param.c → fixtures/test_nosanitize_crash_sigsegv_with_param.c} +8 -0
  67. data/assets/fixtures/test_nosanitize_heap_buffer_overflow.c +31 -0
  68. data/assets/fixtures/test_nosanitize_leak.c +34 -0
  69. data/assets/fixtures/test_nosanitize_two_findings.c +36 -0
  70. data/assets/{test_example_file_ub_shift_overflow.c → fixtures/test_nosanitize_ub_shift_overflow.c} +9 -0
  71. data/assets/fixtures/test_plain_inline_module.c +15 -0
  72. data/assets/fixtures/test_source_file_duplicate_basenames/alpha/calc.c +4 -0
  73. data/assets/fixtures/test_source_file_duplicate_basenames/beta/calc.c +4 -0
  74. data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_alpha.c +15 -0
  75. data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_ambiguous.c +15 -0
  76. data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_beta.c +15 -0
  77. data/assets/fixtures/tests_with_conditional_includes/src/feature_extra2.h +13 -0
  78. data/assets/fixtures/tests_with_conditional_includes/src/macro_target_extra.h +13 -0
  79. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.c +19 -3
  80. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.h +1 -0
  81. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.c +17 -1
  82. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget.c +12 -4
  83. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget_feature.c +8 -5
  84. data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.c +7 -0
  85. data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.h +6 -0
  86. data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.c +16 -0
  87. data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.h +6 -0
  88. data/assets/fixtures/tests_with_conditional_mocks/src/FeatureConfig.h +6 -0
  89. data/assets/fixtures/tests_with_conditional_mocks/src/Gpt.h +6 -0
  90. data/assets/fixtures/tests_with_conditional_mocks/src/MyModuleConfig.h +17 -0
  91. data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart1.h +6 -0
  92. data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart2.h +6 -0
  93. data/assets/fixtures/tests_with_conditional_mocks/src/drivers/widget.h +6 -0
  94. data/assets/fixtures/tests_with_conditional_mocks/src/reader.c +7 -0
  95. data/assets/fixtures/tests_with_conditional_mocks/src/reader.h +6 -0
  96. data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01.c +21 -0
  97. data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01_legacy.c +16 -0
  98. data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_02.c +31 -0
  99. data/assets/fixtures/tests_with_conditional_mocks/test/test_FeatureConfig.c +15 -0
  100. data/assets/fixtures/tests_with_conditional_mocks/test/test_reader.c +13 -0
  101. data/assets/fixtures/tests_with_duplicate_test_names/integration/test_foo.c +21 -0
  102. data/assets/fixtures/tests_with_duplicate_test_names/unit/test_foo.c +21 -0
  103. data/assets/fixtures/tests_with_fallback_conditionals/src/conditional_module.c +28 -0
  104. data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/test/test_conditionals.c +8 -1
  105. data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_lower.s +2 -0
  106. data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_upper.S +13 -0
  107. data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.c +13 -0
  108. data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.h +13 -0
  109. data/assets/fixtures/tests_with_multiple_assembly_extensions/test/test_counter_module.c +27 -0
  110. data/assets/fixtures/tests_with_subdir_includes/src/module/app/config.h +13 -0
  111. data/assets/fixtures/tests_with_subdir_includes/src/module/drivers/config.h +13 -0
  112. data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.c +30 -0
  113. data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.h +13 -0
  114. data/assets/fixtures/tests_with_subdir_includes/src/shared/config.h +13 -0
  115. data/assets/fixtures/tests_with_subdir_includes/test/test_sensor.c +32 -0
  116. data/bin/actionator.rb +234 -0
  117. data/bin/app_cfg.rb +7 -0
  118. data/bin/cli.rb +78 -47
  119. data/bin/cli_handler.rb +89 -57
  120. data/bin/cli_helper.rb +90 -49
  121. data/bin/cli_options_transform.rb +22 -0
  122. data/bin/{configinator.rb → composinator.rb} +39 -32
  123. data/bin/mixin_resolvinator.rb +124 -0
  124. data/bin/mixin_standardizer.rb +31 -61
  125. data/bin/mixinator.rb +27 -29
  126. data/bin/mixins.rb +0 -5
  127. data/bin/objects.yml +20 -7
  128. data/bin/path_validator.rb +6 -5
  129. data/bin/projectinator.rb +51 -142
  130. data/bin/rake_patches.rb +36 -2
  131. data/bin/recursive_merger.rb +7 -1
  132. data/bin/versionator.rb +2 -3
  133. data/ceedling.gemspec +83 -12
  134. data/docs/BreakingChanges.md +46 -2
  135. data/docs/CONTRIBUTING.md +45 -29
  136. data/docs/CeedlingPullRequestChecklist.md +10 -9
  137. data/docs/Changelog.md +327 -37
  138. data/docs/KnownIssues.md +30 -4
  139. data/docs/ReleaseNotes.md +288 -12
  140. data/docs/SECURITY.md +46 -2
  141. data/docs/ThrowTheSwitchCodingStandard.md +21 -3
  142. data/docs/overrides/main.html +32 -0
  143. data/examples/temp_sensor/mixin/add_bullseye.yml +19 -0
  144. data/examples/wondrous_forest/README.md +3 -0
  145. data/examples/wondrous_forest/src/sensors/light/Calibration.c +21 -0
  146. data/examples/wondrous_forest/src/sensors/light/Calibration.h +14 -0
  147. data/examples/wondrous_forest/src/sensors/soil/Calibration.c +23 -0
  148. data/examples/wondrous_forest/src/sensors/soil/Calibration.h +14 -0
  149. data/examples/wondrous_forest/test/TestCalibration.c +39 -0
  150. data/lib/ceedling/batchinator.rb +81 -22
  151. data/lib/ceedling/c_extractor/README.md +61 -0
  152. data/lib/ceedling/c_extractor/c_extractor.rb +33 -2
  153. data/lib/ceedling/c_extractor/c_extractor_code_text.rb +18 -10
  154. data/lib/ceedling/c_extractor/c_extractor_constants.rb +10 -10
  155. data/lib/ceedling/c_extractor/c_extractor_declarations.rb +14 -14
  156. data/lib/ceedling/c_extractor/c_extractor_functions.rb +10 -13
  157. data/lib/ceedling/c_extractor/c_extractor_preprocessing.rb +77 -0
  158. data/lib/ceedling/c_extractor/c_extractor_types.rb +8 -5
  159. data/lib/ceedling/ceedling.h +33 -0
  160. data/lib/ceedling/config/config_matchinator.rb +36 -13
  161. data/lib/ceedling/config/configurator.rb +366 -530
  162. data/lib/ceedling/config/configurator_builder.rb +253 -365
  163. data/lib/ceedling/config/configurator_plugins.rb +68 -102
  164. data/lib/ceedling/config/configurator_setup.rb +343 -610
  165. data/lib/ceedling/config/configurator_validator.rb +114 -142
  166. data/lib/ceedling/config/line_marker_suppressors.rb +67 -0
  167. data/lib/ceedling/constants.rb +60 -6
  168. data/lib/ceedling/defaults.rb +28 -14
  169. data/lib/ceedling/defineinator.rb +9 -4
  170. data/lib/ceedling/dependencies/README.md +69 -0
  171. data/lib/ceedling/dependencies/dependency_cache_store.rb +160 -0
  172. data/lib/ceedling/dependencies/dependency_debug_tree.rb +129 -0
  173. data/lib/ceedling/dependencies/dependency_differ.rb +127 -0
  174. data/lib/ceedling/dependencies/dependency_hasher.rb +94 -0
  175. data/lib/ceedling/dependencies/dependency_path_normalizer.rb +80 -0
  176. data/lib/ceedling/dependencies/dependency_tracker.rb +405 -0
  177. data/lib/ceedling/dependencies/dependinator.rb +65 -0
  178. data/lib/ceedling/dependencies/gcc_dependency_parser.rb +86 -0
  179. data/lib/ceedling/encodinator.rb +23 -11
  180. data/lib/ceedling/file_finder.rb +373 -89
  181. data/lib/ceedling/file_finder_helper.rb +44 -33
  182. data/lib/ceedling/file_path_collection_utils.rb +17 -4
  183. data/lib/ceedling/file_path_utils.rb +310 -52
  184. data/lib/ceedling/file_wrapper.rb +245 -8
  185. data/lib/ceedling/filename_extension.rb +91 -0
  186. data/lib/ceedling/flaginator.rb +6 -2
  187. data/lib/ceedling/generators/generator.rb +192 -70
  188. data/lib/ceedling/generators/generator_helper.rb +116 -69
  189. data/lib/ceedling/generators/generator_mocks.rb +13 -8
  190. data/lib/ceedling/generators/generator_partials.rb +47 -15
  191. data/lib/ceedling/generators/generator_test_results.rb +29 -17
  192. data/lib/ceedling/generators/generator_test_results_backtrace.rb +199 -107
  193. data/lib/ceedling/generators/generator_test_results_sanity_checker.rb +1 -1
  194. data/lib/ceedling/includes/include_factory.rb +21 -6
  195. data/lib/ceedling/includes/include_pathinator.rb +40 -4
  196. data/lib/ceedling/includes/includes.rb +215 -61
  197. data/lib/ceedling/loginator.rb +13 -4
  198. data/lib/ceedling/objects.yml +216 -33
  199. data/lib/ceedling/parsing_parcels.rb +39 -13
  200. data/lib/ceedling/partials/README.md +53 -0
  201. data/lib/ceedling/partials/partializer.rb +118 -26
  202. data/lib/ceedling/partials/partializer_config.rb +141 -8
  203. data/lib/ceedling/partials/partializer_helper.rb +88 -2
  204. data/lib/ceedling/partials/partializer_utils.rb +1 -1
  205. data/lib/ceedling/partials/partials.rb +4 -4
  206. data/lib/ceedling/path_matcher.rb +163 -0
  207. data/lib/ceedling/path_mirror.rb +73 -0
  208. data/lib/ceedling/plugins/plugin.rb +1 -1
  209. data/lib/ceedling/plugins/plugin_manager.rb +31 -15
  210. data/lib/ceedling/plugins/plugin_manager_helper.rb +5 -1
  211. data/lib/ceedling/plugins/plugin_reportinator.rb +36 -7
  212. data/lib/ceedling/plugins/plugin_reportinator_helper.rb +3 -3
  213. data/lib/ceedling/plugins/report_log_writer_plugin.rb +66 -0
  214. data/lib/ceedling/plugins/report_tests_stdout_plugin.rb +18 -5
  215. data/lib/ceedling/preprocess/README.md +135 -120
  216. data/lib/ceedling/preprocess/c_comment_scanner.rb +9 -7
  217. data/lib/ceedling/preprocess/c_preprocessor_conditionals.rb +27 -10
  218. data/lib/ceedling/preprocess/preprocessinator.rb +253 -217
  219. data/lib/ceedling/preprocess/preprocessinator_bare_includes_extractor.rb +7 -10
  220. data/lib/ceedling/preprocess/preprocessinator_code_finder.rb +8 -6
  221. data/lib/ceedling/preprocess/preprocessinator_comment_stripper.rb +5 -3
  222. data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +86 -82
  223. data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +182 -163
  224. data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +174 -8
  225. data/lib/ceedling/preprocess/preprocessinator_reconstructor.rb +41 -20
  226. data/lib/ceedling/quote_include_isolator.rb +129 -0
  227. data/lib/ceedling/rake_app/rake_task_registry.rb +9 -9
  228. data/lib/ceedling/rake_app/rake_wrapper.rb +0 -13
  229. data/lib/ceedling/rake_app/rakefile_component_resolver.rb +24 -12
  230. data/lib/ceedling/rakefile.rb +2 -1
  231. data/lib/ceedling/{tasks_base.rake → rakefiles/base/tasks_base.rake} +1 -1
  232. data/lib/ceedling/{tasks_filesystem.rake → rakefiles/base/tasks_filesystem.rake} +3 -0
  233. data/lib/ceedling/rakefiles/release/rules_release.rake +52 -0
  234. data/lib/ceedling/{erb_wrapper.rb → rakefiles/release/tasks_release.rake} +5 -8
  235. data/lib/ceedling/rakefiles/tests/rules_tests.rake +43 -0
  236. data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +80 -0
  237. data/lib/ceedling/{tasks_tests.rake → rakefiles/tests/tasks_tests.rake} +11 -20
  238. data/lib/ceedling/rakefiles/tests/tasks_tests_generate.rake +55 -0
  239. data/lib/ceedling/release_invoker/README.md +35 -0
  240. data/lib/ceedling/release_invoker/release_build_executor.rb +263 -0
  241. data/lib/ceedling/release_invoker/release_build_planner.rb +80 -0
  242. data/lib/ceedling/release_invoker/release_invoker.rb +78 -0
  243. data/lib/ceedling/release_invoker/release_invoker_types.rb +40 -0
  244. data/lib/ceedling/reportinator.rb +18 -2
  245. data/lib/ceedling/ruby_expandinator.rb +40 -1
  246. data/lib/ceedling/setupinator.rb +9 -3
  247. data/lib/ceedling/system_wrapper.rb +17 -0
  248. data/lib/ceedling/templateinator.rb +146 -0
  249. data/lib/ceedling/test_context_extractor.rb +59 -28
  250. data/lib/ceedling/test_invoker/HEADER_COLLISIONS.md +41 -0
  251. data/lib/ceedling/test_invoker/PIPELINE.md +142 -0
  252. data/lib/ceedling/test_invoker/README.md +6 -0
  253. data/lib/ceedling/test_invoker/mock_locator.rb +49 -0
  254. data/lib/ceedling/test_invoker/partials_manager.rb +426 -0
  255. data/lib/ceedling/test_invoker/standin_headerinator.rb +136 -0
  256. data/lib/ceedling/test_invoker/test_bare_includes_extractinator.rb +117 -0
  257. data/lib/ceedling/test_invoker/test_build_executor.rb +783 -429
  258. data/lib/ceedling/test_invoker/test_build_planner.rb +175 -70
  259. data/lib/ceedling/test_invoker/test_build_setup.rb +132 -241
  260. data/lib/ceedling/test_invoker/test_build_validations.rb +102 -0
  261. data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +148 -0
  262. data/lib/ceedling/test_invoker/test_includes_extractinator.rb +34 -0
  263. data/lib/ceedling/test_invoker/test_includes_preprocessinator.rb +118 -0
  264. data/lib/ceedling/test_invoker/test_includes_reconcilinator.rb +149 -0
  265. data/lib/ceedling/test_invoker/test_invoker.rb +16 -183
  266. data/lib/ceedling/test_invoker/test_invoker_types.rb +85 -16
  267. data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +121 -0
  268. data/lib/ceedling/test_invoker/test_pipeline_manager.rb +303 -0
  269. data/lib/ceedling/test_invoker/test_runner_generatinator.rb +105 -0
  270. data/lib/ceedling/test_invoker/test_search_paths.rb +73 -0
  271. data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +78 -0
  272. data/lib/ceedling/tool_executor.rb +42 -13
  273. data/lib/ceedling/tool_executor_helper.rb +1 -1
  274. data/lib/ceedling/tool_validator.rb +124 -123
  275. data/lib/ceedling/yaml_wrapper.rb +5 -3
  276. data/lib/version.rb +19 -2
  277. data/mkdocs.prerelease.yml +42 -0
  278. data/mkdocs.yml +10 -2
  279. data/plugins/bullseye/bullseye.rake +70 -107
  280. data/plugins/bullseye/config/defaults.yml +12 -54
  281. data/plugins/bullseye/config/defaults_bullseye.rb +182 -0
  282. data/plugins/bullseye/lib/bullseye.rb +511 -120
  283. data/plugins/bullseye/lib/bullseye_constants.rb +100 -0
  284. data/plugins/command_hooks/lib/command_hooks.rb +117 -199
  285. data/plugins/compile_commands_json_db/lib/compile_commands_json_db.rb +72 -27
  286. data/plugins/cppcheck/config/defaults.yml +6 -1
  287. data/plugins/cppcheck/config/defaults_cppcheck.rb +5 -1
  288. data/plugins/cppcheck/cppcheck.rake +7 -1
  289. data/plugins/cppcheck/lib/cppcheck.rb +175 -26
  290. data/plugins/cppcheck/lib/cppcheck_constants.rb +12 -0
  291. data/plugins/cppcheck/lib/cppcheck_reports.rb +5 -1
  292. data/plugins/dependencies/Rakefile +14 -2
  293. data/plugins/dependencies/config/defaults.yml +9 -6
  294. data/plugins/dependencies/dependencies.rake +46 -76
  295. data/plugins/dependencies/example/boss/project.yml +1 -1
  296. data/plugins/dependencies/example/supervisor/project.yml +1 -1
  297. data/plugins/dependencies/example/version.tar.gzip +0 -0
  298. data/plugins/dependencies/lib/dependencies.rb +232 -427
  299. data/plugins/dependencies/lib/dependency_commands.rb +72 -0
  300. data/plugins/dependencies/lib/dependency_environment.rb +57 -0
  301. data/plugins/dependencies/lib/dependency_spec.rb +145 -0
  302. data/plugins/fff/.rspec +1 -0
  303. data/plugins/fff/Rakefile +14 -2
  304. data/plugins/fff/examples/fff_example/project.yml +1 -1
  305. data/plugins/fff/lib/fff.rb +30 -9
  306. data/plugins/fff/lib/fff_mock_generator.rb +142 -128
  307. data/plugins/fff/spec/fff_mock_header_generator_spec.rb +15 -0
  308. data/plugins/fff/spec/fff_mock_source_generator_spec.rb +14 -0
  309. data/plugins/fff/spec/spec_helper.rb +45 -0
  310. data/plugins/fff/src/fff_unity_helper.h +5 -0
  311. data/plugins/fff/vendor/fff/fakegen.rb +5 -4
  312. data/plugins/fff/vendor/fff/fff.h +4 -4
  313. data/plugins/gcov/config/defaults.yml +5 -0
  314. data/plugins/gcov/gcov.rake +12 -8
  315. data/plugins/gcov/lib/console_reportinator.rb +140 -20
  316. data/plugins/gcov/lib/gcov.rb +155 -60
  317. data/plugins/gcov/lib/gcov_constants.rb +4 -7
  318. data/plugins/gcov/lib/gcov_reportinator.rb +90 -0
  319. data/plugins/gcov/lib/gcov_types.rb +62 -1
  320. data/plugins/gcov/lib/gcovr_reportinator.rb +255 -213
  321. data/plugins/gcov/lib/reportgenerator_reportinator.rb +122 -44
  322. data/plugins/module_generator/Rakefile +4 -4
  323. data/plugins/module_generator/config/module_generator.yml +0 -1
  324. data/plugins/module_generator/example/project.yml +1 -1
  325. data/plugins/module_generator/lib/module_generator.rb +117 -87
  326. data/plugins/module_generator/lib/module_generator_options.rb +150 -0
  327. data/plugins/module_generator/lib/module_generator_project.rb +45 -0
  328. data/plugins/module_generator/lib/module_generator_request.rb +83 -0
  329. data/plugins/module_generator/lib/module_generator_test_file.rb +68 -0
  330. data/plugins/module_generator/lib/module_generator_unity.rb +24 -0
  331. data/plugins/module_generator/module_generator.rake +24 -46
  332. data/plugins/report_build_warnings_log/config/defaults.yml +4 -1
  333. data/plugins/report_build_warnings_log/lib/report_build_warnings_log.rb +47 -55
  334. data/plugins/report_build_warnings_log/lib/warning_collector.rb +140 -0
  335. data/plugins/report_build_warnings_log/lib/warning_reports.rb +135 -0
  336. data/plugins/report_tests_gtestlike_stdout/assets/test_results.template +3 -0
  337. data/{spec/units/configurator_builder_spec.rb → plugins/report_tests_gtestlike_stdout/config/defaults.yml} +6 -10
  338. data/plugins/report_tests_gtestlike_stdout/lib/gtestlike_report.rb +168 -0
  339. data/plugins/report_tests_gtestlike_stdout/lib/report_tests_gtestlike_stdout.rb +25 -1
  340. data/plugins/report_tests_ide_stdout/assets/test_results.template +50 -0
  341. data/plugins/report_tests_ide_stdout/config/defaults.yml +13 -0
  342. data/plugins/report_tests_ide_stdout/lib/ide_report_lines.rb +103 -0
  343. data/plugins/report_tests_ide_stdout/lib/report_tests_ide_stdout.rb +12 -4
  344. data/plugins/report_tests_log_factory/lib/cppunit_tests_reporter.rb +33 -51
  345. data/plugins/report_tests_log_factory/lib/html_tests_reporter.rb +286 -295
  346. data/plugins/report_tests_log_factory/lib/json_tests_reporter.rb +22 -35
  347. data/plugins/report_tests_log_factory/lib/junit_tests_reporter.rb +91 -133
  348. data/plugins/report_tests_log_factory/lib/report_tests_log_factory.rb +72 -86
  349. data/plugins/report_tests_log_factory/lib/tests_reporter.rb +31 -12
  350. data/plugins/report_tests_pretty_stdout/assets/{template.erb → test_results.template} +8 -8
  351. data/plugins/report_tests_raw_output_log/lib/report_tests_raw_output_log.rb +18 -48
  352. data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +13 -2
  353. data/plugins/sanitize/config/defaults.yml +44 -0
  354. data/plugins/sanitize/config/defaults_sanitize.rb +20 -0
  355. data/plugins/sanitize/lib/sanitize.rb +174 -0
  356. data/plugins/sanitize/lib/sanitize_config.rb +110 -0
  357. data/plugins/sanitize/lib/sanitize_constants.rb +13 -0
  358. data/plugins/sanitize/lib/sanitize_findings.rb +85 -0
  359. data/plugins/sanitize/lib/sanitize_records.rb +115 -0
  360. data/plugins/sanitize/lib/sanitize_reports.rb +135 -0
  361. data/plugins/sanitize/sanitize.rake +108 -0
  362. data/plugins/valgrind/config/defaults.yml +7 -1
  363. data/plugins/valgrind/config/defaults_valgrind.rb +6 -1
  364. data/plugins/valgrind/lib/valgrind.rb +202 -39
  365. data/plugins/valgrind/lib/valgrind_constants.rb +4 -0
  366. data/plugins/valgrind/lib/valgrind_report.rb +52 -0
  367. data/plugins/valgrind/valgrind.rake +33 -11
  368. data/site-local/404.html +248 -14
  369. data/site-local/configuration/environment-vars.html +248 -14
  370. data/site-local/configuration/global-collections.html +248 -19
  371. data/site-local/configuration/index.html +249 -15
  372. data/site-local/configuration/loading.html +260 -22
  373. data/site-local/configuration/mixins.html +252 -17
  374. data/site-local/configuration/parallel-builds.html +248 -14
  375. data/site-local/configuration/project-file.html +275 -30
  376. data/site-local/configuration/reference/cexception.html +255 -20
  377. data/site-local/configuration/reference/cmock.html +281 -14
  378. data/site-local/configuration/reference/defines.html +262 -19
  379. data/site-local/configuration/reference/environment.html +251 -17
  380. data/site-local/configuration/reference/extension.html +361 -16
  381. data/site-local/configuration/reference/files.html +262 -14
  382. data/site-local/configuration/reference/flags.html +270 -19
  383. data/site-local/configuration/reference/index.html +248 -14
  384. data/site-local/configuration/reference/libraries.html +248 -14
  385. data/site-local/configuration/reference/mixins.html +248 -14
  386. data/site-local/configuration/reference/partials.html +249 -19
  387. data/site-local/configuration/reference/paths.html +275 -15
  388. data/site-local/configuration/reference/plugins.html +248 -14
  389. data/site-local/configuration/reference/project.html +291 -14
  390. data/site-local/configuration/reference/release-build.html +256 -14
  391. data/site-local/configuration/reference/test-build.html +290 -24
  392. data/site-local/configuration/reference/test-runner.html +288 -17
  393. data/site-local/configuration/reference/tools.html +254 -14
  394. data/site-local/configuration/reference/unity.html +280 -15
  395. data/site-local/configuration/which-ceedling.html +248 -14
  396. data/site-local/development/index.html +254 -14
  397. data/site-local/development/plugins/configuration.html +269 -17
  398. data/site-local/development/plugins/index.html +267 -15
  399. data/site-local/development/plugins/plugin-subclass.html +906 -154
  400. data/site-local/development/plugins/rake-tasks.html +276 -14
  401. data/site-local/development/releases.html +4708 -0
  402. data/site-local/development/workflow.html +1030 -51
  403. data/site-local/getting-started/builds.html +4607 -0
  404. data/site-local/getting-started/command-line.html +418 -34
  405. data/site-local/getting-started/example-projects/cipher-quest.html +248 -14
  406. data/site-local/getting-started/example-projects/index.html +249 -15
  407. data/site-local/getting-started/example-projects/temp-sensor.html +248 -14
  408. data/site-local/getting-started/example-projects/wondrous-forest.html +248 -14
  409. data/site-local/getting-started/index.html +255 -14
  410. data/site-local/getting-started/installation.html +258 -22
  411. data/site-local/getting-started/quick-start.html +251 -15
  412. data/site-local/help.html +255 -14
  413. data/site-local/index.html +292 -22
  414. data/site-local/overview/build-system.html +249 -15
  415. data/site-local/overview/index.html +248 -14
  416. data/site-local/overview/test-environments.html +257 -14
  417. data/site-local/overview/tools-and-frameworks.html +248 -14
  418. data/site-local/plugins/beep.html +251 -14
  419. data/site-local/plugins/bullseye/index.html +5079 -0
  420. data/site-local/plugins/bullseye/licensing.html +4840 -0
  421. data/site-local/plugins/command-hooks.html +265 -27
  422. data/site-local/plugins/compile-commands-json-db.html +256 -17
  423. data/site-local/plugins/cppcheck.html +1081 -262
  424. data/site-local/plugins/dependencies.html +934 -242
  425. data/site-local/plugins/fff.html +296 -15
  426. data/site-local/plugins/gcov/examples.html +251 -14
  427. data/site-local/plugins/gcov/gcovr.html +567 -65
  428. data/site-local/plugins/gcov/index.html +251 -14
  429. data/site-local/plugins/gcov/overview.html +259 -18
  430. data/site-local/plugins/gcov/reportgenerator.html +386 -38
  431. data/site-local/plugins/gcov/reporting.html +348 -100
  432. data/site-local/plugins/gcov/setup.html +253 -15
  433. data/site-local/plugins/gcov/tool-versions.html +301 -19
  434. data/site-local/plugins/gcov/troubleshooting.html +273 -36
  435. data/site-local/plugins/index.html +294 -36
  436. data/site-local/plugins/module-generator.html +779 -195
  437. data/site-local/plugins/report-build-warnings-log.html +578 -33
  438. data/site-local/plugins/report-tests-gtestlike-stdout.html +467 -84
  439. data/site-local/plugins/report-tests-ide-stdout.html +654 -51
  440. data/site-local/plugins/report-tests-log-factory.html +337 -70
  441. data/site-local/plugins/report-tests-pretty-stdout.html +251 -14
  442. data/site-local/plugins/report-tests-raw-output-log.html +251 -14
  443. data/site-local/plugins/report-tests-teamcity-stdout.html +251 -14
  444. data/site-local/plugins/sanitize.html +5332 -0
  445. data/site-local/plugins/valgrind.html +416 -26
  446. data/site-local/{plugins/bullseye.html → project/index.html} +297 -217
  447. data/site-local/project/release-history.html +251 -17
  448. data/site-local/project/sbom.html +4726 -0
  449. data/site-local/project/upgrade.html +250 -16
  450. data/site-local/reference/build-directives.html +257 -14
  451. data/site-local/reference/command-line.html +373 -16
  452. data/site-local/reference/environment-vars.html +248 -14
  453. data/site-local/reference/gcov-plugin.html +492 -18
  454. data/site-local/reference/global-collections.html +249 -15
  455. data/site-local/reference/index.html +248 -14
  456. data/site-local/reference/partials-macros.html +258 -14
  457. data/site-local/reference/project-configuration.html +248 -14
  458. data/site-local/sitemap.xml.gz +0 -0
  459. data/{docs/mkdocs/snapshot/assets → site-local/snapshot/assets/features}/project.yml +4 -1
  460. data/site-local/snapshot/examples/cipher_quest/index.html +248 -14
  461. data/site-local/snapshot/examples/temp_sensor/index.html +248 -14
  462. data/site-local/snapshot/examples/wondrous_forest/index.html +265 -25
  463. data/site-local/snapshot/plugins/bullseye/config/defaults.yml +24 -0
  464. data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +182 -0
  465. data/site-local/snapshot/plugins/gcov/config/defaults.yml +5 -0
  466. data/site-local/testing-guide/build-directives.html +332 -22
  467. data/site-local/testing-guide/conventions.html +678 -153
  468. data/site-local/testing-guide/frameworks.html +248 -14
  469. data/site-local/testing-guide/index.html +248 -21
  470. data/site-local/testing-guide/partials/configuration.html +248 -14
  471. data/site-local/testing-guide/partials/conventions.html +316 -17
  472. data/site-local/testing-guide/partials/directives.html +456 -48
  473. data/site-local/testing-guide/partials/example.html +248 -14
  474. data/site-local/testing-guide/partials/index.html +255 -14
  475. data/site-local/testing-guide/partials/overview.html +248 -14
  476. data/site-local/testing-guide/partials/variables.html +248 -14
  477. data/site-local/testing-guide/test-cases.html +248 -14
  478. data/site-local/testing-guide/test-sample.html +248 -14
  479. data/site-local/testing-guide/test-suite-anatomy.html +248 -14
  480. data/spec/integration/actionator_file_operations_spec.rb +287 -0
  481. data/spec/integration/analysis_tool_output_spec.rb +204 -0
  482. data/spec/{units/c_extractor/c_extractor_integration_spec.rb → integration/c_extractor_composition_spec.rb} +196 -17
  483. data/spec/integration/command_hooks_plugin_spec.rb +152 -0
  484. data/spec/integration/compile_commands_json_db_spec.rb +76 -0
  485. data/spec/integration/configurator_pipeline_spec.rb +180 -0
  486. data/spec/integration/configurator_plugins_spec.rb +122 -0
  487. data/spec/integration/configurator_validation_spec.rb +98 -0
  488. data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +396 -0
  489. data/spec/integration/dependencies/dependency_tracker_core_spec.rb +244 -0
  490. data/spec/integration/dependencies/dependency_tracker_diagnose_spec.rb +224 -0
  491. data/spec/integration/dependencies/dependency_tracker_filename_handling_spec.rb +118 -0
  492. data/spec/integration/dependencies/dependency_tracker_gcc_deps_spec.rb +199 -0
  493. data/spec/integration/dependencies/dependency_tracker_pruning_spec.rb +167 -0
  494. data/spec/integration/dependencies_plugin_spec.rb +473 -0
  495. data/spec/integration/erb_dependency_removed_spec.rb +167 -0
  496. data/spec/integration/includes_extraction_spec.rb +612 -0
  497. data/spec/integration/mixin_loading_spec.rb +414 -0
  498. data/spec/integration/module_generator_spec.rb +436 -0
  499. data/spec/integration/partials_fallback_preprocessing_spec.rb +316 -0
  500. data/spec/integration/partials_header_composition_spec.rb +889 -0
  501. data/spec/integration/partials_module_resolution_spec.rb +372 -0
  502. data/spec/integration/partials_symbol_linkage_spec.rb +371 -0
  503. data/spec/integration/preprocessing_transient_io_retry_spec.rb +135 -0
  504. data/spec/integration/quote_include_isolator_spec.rb +167 -0
  505. data/spec/integration/report_build_warnings_log_spec.rb +170 -0
  506. data/spec/integration/report_tests_log_factory_spec.rb +100 -0
  507. data/spec/integration/sanitizer_exclusions_spec.rb +126 -0
  508. data/spec/integration/system_harness_sanitizers_spec.rb +104 -0
  509. data/spec/integration/test_build_parallel_barrier_spec.rb +89 -0
  510. data/spec/integration/test_executable_manifest_spec.rb +118 -0
  511. data/spec/integration/test_includes_extractinator_spec.rb +293 -0
  512. data/spec/integration/tool_executor_spec.rb +224 -0
  513. data/spec/integration/tool_validator_spec.rb +133 -0
  514. data/spec/integration/vendor_copy_transient_io_retry_spec.rb +130 -0
  515. data/spec/manual/stress_test.rb +1 -1
  516. data/spec/support/config_yaml_helper.rb +17 -0
  517. data/spec/support/fixtures/sanitizer_reports/clang_asan_heap.txt +45 -0
  518. data/spec/support/fixtures/sanitizer_reports/clang_ubsan_shift.txt +5 -0
  519. data/spec/support/fixtures/sanitizer_reports/gcc_heap.txt +47 -0
  520. data/spec/support/fixtures/sanitizer_reports/gcc_leak.txt +10 -0
  521. data/spec/support/fixtures/sanitizer_reports/gcc_segv.txt +6 -0
  522. data/spec/support/fixtures/sanitizer_reports/gcc_ubsan_shift.txt +6 -0
  523. data/spec/support/fixtures/templates/bullseye__all_pass.txt +6 -0
  524. data/spec/support/fixtures/templates/bullseye__coverage_branches_only.txt +6 -0
  525. data/spec/support/fixtures/templates/bullseye__coverage_functions_only.txt +6 -0
  526. data/spec/support/fixtures/templates/bullseye__coverage_none.txt +6 -0
  527. data/spec/support/fixtures/templates/bullseye__empty.txt +6 -0
  528. data/spec/support/fixtures/templates/bullseye__gcov_context.txt +6 -0
  529. data/spec/support/fixtures/templates/bullseye__mixed_all.txt +6 -0
  530. data/spec/support/fixtures/templates/bullseye__one_failure_matching.txt +6 -0
  531. data/spec/support/fixtures/templates/bullseye__one_failure_multiline.txt +6 -0
  532. data/spec/support/fixtures/templates/bullseye__one_failure_no_message.txt +6 -0
  533. data/spec/support/fixtures/templates/bullseye__one_failure_nonmatching.txt +6 -0
  534. data/spec/support/fixtures/templates/bullseye__one_ignore_no_message.txt +6 -0
  535. data/spec/support/fixtures/templates/bullseye__one_ignore_with_message.txt +6 -0
  536. data/spec/support/fixtures/templates/bullseye__stdout_only.txt +6 -0
  537. data/spec/support/fixtures/templates/ide__all_pass.txt +10 -0
  538. data/spec/support/fixtures/templates/ide__coverage_branches_only.txt +10 -0
  539. data/spec/support/fixtures/templates/ide__coverage_functions_only.txt +10 -0
  540. data/spec/support/fixtures/templates/ide__coverage_none.txt +10 -0
  541. data/spec/support/fixtures/templates/ide__empty.txt +8 -0
  542. data/spec/support/fixtures/templates/ide__gcov_context.txt +28 -0
  543. data/spec/support/fixtures/templates/ide__mixed_all.txt +29 -0
  544. data/spec/support/fixtures/templates/ide__one_failure_matching.txt +15 -0
  545. data/spec/support/fixtures/templates/ide__one_failure_multiline.txt +17 -0
  546. data/spec/support/fixtures/templates/ide__one_failure_no_message.txt +15 -0
  547. data/spec/support/fixtures/templates/ide__one_failure_nonmatching.txt +15 -0
  548. data/spec/support/fixtures/templates/ide__one_ignore_no_message.txt +15 -0
  549. data/spec/support/fixtures/templates/ide__one_ignore_with_message.txt +15 -0
  550. data/spec/support/fixtures/templates/ide__stdout_only.txt +16 -0
  551. data/spec/support/fixtures/templates/pretty__all_pass.txt +8 -0
  552. data/spec/support/fixtures/templates/pretty__coverage_branches_only.txt +8 -0
  553. data/spec/support/fixtures/templates/pretty__coverage_functions_only.txt +8 -0
  554. data/spec/support/fixtures/templates/pretty__coverage_none.txt +8 -0
  555. data/spec/support/fixtures/templates/pretty__empty.txt +6 -0
  556. data/spec/support/fixtures/templates/pretty__gcov_context.txt +31 -0
  557. data/spec/support/fixtures/templates/pretty__mixed_all.txt +35 -0
  558. data/spec/support/fixtures/templates/pretty__one_failure_matching.txt +15 -0
  559. data/spec/support/fixtures/templates/pretty__one_failure_multiline.txt +17 -0
  560. data/spec/support/fixtures/templates/pretty__one_failure_no_message.txt +15 -0
  561. data/spec/support/fixtures/templates/pretty__one_failure_nonmatching.txt +15 -0
  562. data/spec/support/fixtures/templates/pretty__one_ignore_no_message.txt +15 -0
  563. data/spec/support/fixtures/templates/pretty__one_ignore_with_message.txt +15 -0
  564. data/spec/support/fixtures/templates/pretty__stdout_only.txt +15 -0
  565. data/spec/support/fixtures/valgrind_reports/sigsegv.log +51 -0
  566. data/spec/support/fixtures/valgrind_reports/sigsegv.xml +182 -0
  567. data/spec/support/include_guard_helper.rb +20 -0
  568. data/spec/support/integration/configurator_integration_helper.rb +159 -0
  569. data/spec/support/integration/dependency_tracker_integration_helper.rb +136 -0
  570. data/spec/support/integration/partials_generation_integration_helper.rb +726 -0
  571. data/spec/support/integration/spec_integration_helper.rb +285 -0
  572. data/spec/support/integration/test_includes_harness.rb +259 -0
  573. data/spec/support/integration/tool_executor_integration_helper.rb +55 -0
  574. data/spec/support/spec_helper.rb +41 -0
  575. data/spec/support/system/sanitizers/asan_ubsan.yml +82 -0
  576. data/spec/support/system/sanitizers/asan_ubsan_leaks.yml +57 -0
  577. data/spec/support/system/simplecov_boot.rb +66 -0
  578. data/spec/support/system/spec_system_helper.rb +376 -16
  579. data/spec/support/system/system_context.rb +181 -59
  580. data/spec/support/template_render_cases.rb +166 -0
  581. data/spec/system/bracket_path_handling_spec.rb +175 -0
  582. data/spec/system/build_output_mirroring_spec.rb +89 -0
  583. data/spec/system/build_recovery_spec.rb +382 -0
  584. data/spec/system/bullseye_deployment_spec.rb +102 -0
  585. data/spec/system/cli_surface_spec.rb +245 -0
  586. data/spec/system/command_hooks_spec.rb +117 -0
  587. data/spec/system/conditional_include_macro_visibility_spec.rb +32 -124
  588. data/spec/system/conditional_mock_includes_spec.rb +181 -0
  589. data/spec/system/cppcheck_deployment_spec.rb +26 -8
  590. data/spec/system/delta_builds_spec.rb +751 -0
  591. data/spec/system/deployment_as_gem_spec.rb +7 -0
  592. data/spec/system/deployment_as_vendor_spec.rb +29 -145
  593. data/spec/system/dumpconfig_spec.rb +137 -0
  594. data/spec/system/encoding_stress_spec.rb +7 -4
  595. data/spec/system/example_cipher_quest_spec.rb +25 -100
  596. data/spec/system/example_temp_sensor_spec.rb +30 -172
  597. data/spec/system/example_wondrous_forest_spec.rb +25 -62
  598. data/spec/system/extension_multiple_values_spec.rb +75 -0
  599. data/spec/system/files_paths_reporting_spec.rb +154 -0
  600. data/spec/system/gcov_deployment_spec.rb +72 -3
  601. data/spec/system/header_include_path_validation_spec.rb +222 -0
  602. data/spec/system/implicit_source_header_correspondence_disambiguation_spec.rb +100 -0
  603. data/spec/system/include_path_reconciliation_spec.rb +64 -0
  604. data/spec/system/mixin_ordering_spec.rb +30 -415
  605. data/spec/system/mocks_partials_configuration_validation_spec.rb +126 -0
  606. data/spec/system/parent_directory_reference_spec.rb +114 -0
  607. data/spec/system/partials_module_disambiguation_spec.rb +143 -0
  608. data/spec/system/pinned_thread_count_spec.rb +102 -0
  609. data/spec/system/plugin_delta_builds_spec.rb +179 -0
  610. data/spec/system/preprocessing_encoding_spec.rb +87 -4
  611. data/spec/system/preprocessing_fallback_conditionals_spec.rb +19 -25
  612. data/spec/system/preprocessing_parameterized_tests_spec.rb +2 -2
  613. data/spec/system/rake_release_task_path_disambiguation_spec.rb +97 -0
  614. data/spec/system/rake_test_task_path_disambiguation_spec.rb +118 -0
  615. data/spec/system/report_and_tooling_plugins_spec.rb +327 -0
  616. data/spec/system/ruby_replacement_spec.rb +1 -1
  617. data/spec/system/same_named_modules_spec.rb +115 -0
  618. data/spec/system/sanitize_deployment_spec.rb +64 -0
  619. data/spec/system/shuffle_tests_spec.rb +139 -0
  620. data/spec/system/sibling_header_collision_spec.rb +620 -0
  621. data/spec/system/subdir_include_preservation_spec.rb +63 -0
  622. data/spec/system/support/bullseye_common_test_cases.rb +369 -0
  623. data/spec/system/support/bullseye_helpers.rb +70 -0
  624. data/spec/system/support/common_test_cases.rb +167 -43
  625. data/spec/system/support/cppcheck_common_test_cases.rb +80 -0
  626. data/spec/system/support/cppcheck_helpers.rb +10 -8
  627. data/spec/system/support/gcov_common_test_cases.rb +173 -37
  628. data/spec/system/support/gcov_helpers.rb +3 -3
  629. data/spec/system/support/gcov_partials_test_cases.rb +48 -2
  630. data/spec/system/support/sanitize_common_test_cases.rb +222 -0
  631. data/spec/system/support/sanitize_helpers.rb +27 -0
  632. data/spec/system/support/valgrind_common_test_cases.rb +116 -16
  633. data/spec/system/support/valgrind_helpers.rb +3 -4
  634. data/spec/system/test_pipeline_stop_points_spec.rb +160 -0
  635. data/spec/system/test_runner_system_include_spec.rb +19 -41
  636. data/spec/system/test_source_file_directive_spec.rb +235 -0
  637. data/spec/system/upgrade_as_vendor_spec.rb +25 -46
  638. data/spec/system/valgrind_deployment_spec.rb +41 -0
  639. data/spec/units/batchinator_spec.rb +314 -0
  640. data/spec/units/bin/actionator_spec.rb +412 -0
  641. data/spec/units/bin/app_cfg_spec.rb +90 -0
  642. data/spec/units/bin/cli_handler_spec.rb +204 -0
  643. data/spec/units/bin/cli_helper_spec.rb +238 -10
  644. data/spec/units/bin/cli_options_transform_spec.rb +49 -0
  645. data/spec/units/bin/composinator_spec.rb +236 -0
  646. data/spec/units/bin/{projectinator_mixin_spec.rb → mixin_resolvinator_spec.rb} +122 -83
  647. data/spec/units/bin/mixin_standardizer_spec.rb +4 -3
  648. data/spec/units/bin/mixinator_spec.rb +58 -22
  649. data/spec/units/bin/path_validator_spec.rb +112 -0
  650. data/spec/units/bin/projectinator_spec.rb +223 -0
  651. data/spec/units/bin/rake_patches_spec.rb +52 -0
  652. data/spec/units/bin/recursive_merger_spec.rb +22 -0
  653. data/spec/units/bin/versionator_spec.rb +104 -0
  654. data/spec/units/c_extractor/c_extractor_code_text_spec.rb +4 -4
  655. data/spec/units/c_extractor/c_extractor_declarations_spec.rb +70 -0
  656. data/spec/units/c_extractor/c_extractor_functions_spec.rb +75 -1
  657. data/spec/units/c_extractor/c_extractor_preprocessing_spec.rb +158 -0
  658. data/spec/units/c_extractor/c_extractor_spec.rb +236 -6
  659. data/spec/units/ceedling/templateinator_golden_spec.rb +84 -0
  660. data/spec/units/ceedling/templateinator_spec.rb +188 -0
  661. data/spec/units/config/configurator_builder_spec.rb +444 -0
  662. data/spec/units/config/configurator_plugins_spec.rb +160 -0
  663. data/spec/units/config/configurator_setup_spec.rb +706 -6
  664. data/spec/units/config/configurator_spec.rb +952 -0
  665. data/spec/units/config/configurator_validator_spec.rb +259 -0
  666. data/spec/units/config/line_marker_suppressors_spec.rb +89 -0
  667. data/spec/units/config_matchinator_spec.rb +103 -0
  668. data/spec/units/defineinator_spec.rb +158 -0
  669. data/spec/units/dependencies/dependency_cache_store_spec.rb +364 -0
  670. data/spec/units/dependencies/dependency_debug_tree_spec.rb +189 -0
  671. data/spec/units/dependencies/dependency_differ_spec.rb +139 -0
  672. data/spec/units/dependencies/dependency_hasher_spec.rb +141 -0
  673. data/spec/units/dependencies/dependency_path_normalizer_spec.rb +111 -0
  674. data/spec/units/dependencies/dependency_tracker_spec.rb +905 -0
  675. data/spec/units/dependencies/dependinator_spec.rb +99 -0
  676. data/spec/units/dependencies/gcc_dependency_parser_spec.rb +152 -0
  677. data/spec/units/encodinator_spec.rb +92 -0
  678. data/spec/units/file_finder_helper_spec.rb +99 -15
  679. data/spec/units/file_finder_spec.rb +495 -0
  680. data/spec/units/file_path_collection_utils_spec.rb +9 -0
  681. data/spec/units/file_path_utils_spec.rb +736 -0
  682. data/spec/units/file_wrapper_spec.rb +447 -0
  683. data/spec/units/filename_extension_spec.rb +120 -0
  684. data/spec/units/flaginator_spec.rb +114 -0
  685. data/spec/units/generators/generator_helper_spec.rb +113 -0
  686. data/spec/units/generators/generator_mocks_spec.rb +131 -0
  687. data/spec/units/generators/generator_partials_spec.rb +336 -160
  688. data/spec/units/generators/generator_spec.rb +317 -0
  689. data/spec/units/generators/generator_test_results_backtrace_spec.rb +169 -9
  690. data/spec/units/generators/generator_test_results_sanity_checker_spec.rb +14 -6
  691. data/spec/units/generators/generator_test_results_spec.rb +65 -8
  692. data/spec/units/generators/generator_test_runner_spec.rb +1 -1
  693. data/spec/units/includes/include_factory_spec.rb +53 -0
  694. data/spec/units/includes/include_pathinator_spec.rb +269 -0
  695. data/spec/units/includes/include_spec.rb +8 -4
  696. data/spec/units/includes/includes_spec.rb +326 -18
  697. data/spec/units/mock_locator_spec.rb +74 -0
  698. data/spec/units/parsing_parcels_spec.rb +65 -0
  699. data/spec/units/partials/partializer_config_spec.rb +284 -18
  700. data/spec/units/partials/partializer_helper_spec.rb +122 -0
  701. data/spec/units/partials/partializer_spec.rb +346 -71
  702. data/spec/units/partials/partializer_utils_spec.rb +4 -4
  703. data/spec/units/partials_manager_spec.rb +539 -0
  704. data/spec/units/path_matcher_spec.rb +193 -0
  705. data/spec/units/path_mirror_spec.rb +103 -0
  706. data/spec/units/plugin_manager_spec.rb +77 -0
  707. data/spec/units/plugin_reportinator_spec.rb +78 -3
  708. data/spec/units/plugins/bullseye_spec.rb +1068 -0
  709. data/spec/units/plugins/command_hooks_spec.rb +157 -0
  710. data/spec/units/plugins/compile_commands_json_db_spec.rb +145 -0
  711. data/spec/units/plugins/console_reportinator_spec.rb +370 -0
  712. data/spec/units/plugins/cppcheck_spec.rb +330 -4
  713. data/spec/units/plugins/cppunit_tests_reporter_spec.rb +118 -0
  714. data/spec/units/plugins/dependencies_spec.rb +295 -0
  715. data/spec/units/plugins/dependency_commands_spec.rb +83 -0
  716. data/spec/units/plugins/dependency_environment_spec.rb +64 -0
  717. data/spec/units/plugins/dependency_spec_spec.rb +170 -0
  718. data/spec/units/plugins/gcov_reportinator_spec.rb +272 -0
  719. data/spec/units/plugins/gcov_spec.rb +521 -0
  720. data/spec/units/plugins/gcovr_reportinator_spec.rb +795 -0
  721. data/spec/units/plugins/gtestlike_report_spec.rb +363 -0
  722. data/spec/units/plugins/html_tests_reporter_spec.rb +158 -0
  723. data/spec/units/plugins/ide_report_lines_spec.rb +229 -0
  724. data/spec/units/plugins/json_tests_reporter_spec.rb +87 -0
  725. data/spec/units/plugins/junit_tests_reporter_spec.rb +237 -0
  726. data/spec/units/plugins/module_generator_options_spec.rb +185 -0
  727. data/spec/units/plugins/module_generator_project_spec.rb +55 -0
  728. data/spec/units/plugins/module_generator_request_spec.rb +107 -0
  729. data/spec/units/plugins/module_generator_spec.rb +214 -0
  730. data/spec/units/plugins/module_generator_test_file_spec.rb +102 -0
  731. data/spec/units/plugins/module_generator_unity_spec.rb +37 -0
  732. data/spec/units/plugins/report_build_warnings_log_spec.rb +199 -0
  733. data/spec/units/plugins/report_log_writer_plugin_spec.rb +94 -0
  734. data/spec/units/plugins/report_tests_gtestlike_stdout_spec.rb +274 -0
  735. data/spec/units/plugins/report_tests_ide_stdout_spec.rb +140 -0
  736. data/spec/units/plugins/report_tests_log_factory_spec.rb +210 -0
  737. data/spec/units/plugins/report_tests_pretty_stdout_spec.rb +83 -0
  738. data/spec/units/plugins/report_tests_raw_output_log_spec.rb +98 -0
  739. data/spec/units/plugins/report_tests_stdout_plugin_spec.rb +145 -0
  740. data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +121 -0
  741. data/spec/units/plugins/reportgenerator_reportinator_spec.rb +410 -0
  742. data/spec/units/plugins/sanitize_config_spec.rb +119 -0
  743. data/spec/units/plugins/sanitize_findings_spec.rb +69 -0
  744. data/spec/units/plugins/sanitize_records_spec.rb +114 -0
  745. data/spec/units/plugins/sanitize_reports_spec.rb +84 -0
  746. data/spec/units/plugins/sanitize_spec.rb +300 -0
  747. data/spec/units/plugins/tests_reporter_spec.rb +89 -0
  748. data/spec/units/plugins/valgrind_spec.rb +560 -0
  749. data/spec/units/plugins/warning_collector_spec.rb +185 -0
  750. data/spec/units/plugins/warning_reports_spec.rb +150 -0
  751. data/spec/units/preprocess/c_comment_scanner_spec.rb +17 -17
  752. data/spec/units/preprocess/c_preprocessor_conditionals_spec.rb +94 -0
  753. data/spec/units/preprocess/preprocessinator_bare_includes_extractor_spec.rb +73 -0
  754. data/spec/units/preprocess/preprocessinator_code_finder_spec.rb +35 -16
  755. data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +129 -48
  756. data/spec/units/preprocess/preprocessinator_file_assembler_spec.rb +292 -9
  757. data/spec/units/preprocess/preprocessinator_includes_handler_spec.rb +294 -16
  758. data/spec/units/preprocess/preprocessinator_line_marker_includes_extractor_spec.rb +356 -6
  759. data/spec/units/preprocess/preprocessinator_reconstructor_spec.rb +58 -4
  760. data/spec/units/preprocess/preprocessinator_spec.rb +693 -5
  761. data/spec/units/quote_include_isolator_spec.rb +176 -0
  762. data/spec/units/rake_app/rake_invocation_tracker_spec.rb +94 -0
  763. data/spec/units/rake_app/rake_task_registry_spec.rb +263 -0
  764. data/spec/units/rake_app/rake_utils_spec.rb +54 -0
  765. data/spec/units/rake_app/rake_wrapper_spec.rb +64 -0
  766. data/spec/units/rake_app/rakefile_component_resolver_spec.rb +182 -0
  767. data/spec/units/release_build_executor_spec.rb +404 -0
  768. data/spec/units/release_build_planner_spec.rb +144 -0
  769. data/spec/units/release_invoker_spec.rb +127 -0
  770. data/spec/units/reportinator_spec.rb +35 -0
  771. data/spec/units/ruby_expandinator_spec.rb +36 -0
  772. data/spec/units/standin_headerinator_spec.rb +168 -0
  773. data/spec/units/system_wrapper_spec.rb +16 -0
  774. data/spec/units/test_build_executor_spec.rb +1653 -8
  775. data/spec/units/test_build_planner_spec.rb +878 -0
  776. data/spec/units/test_build_setup_spec.rb +583 -0
  777. data/spec/units/test_context_extractor_spec.rb +51 -3
  778. data/spec/units/test_file_preprocessinator_spec.rb +206 -0
  779. data/spec/units/test_includes_extractinator_spec.rb +764 -0
  780. data/spec/units/test_invoker/objects_wiring_spec.rb +31 -0
  781. data/spec/units/test_invoker_spec.rb +147 -0
  782. data/spec/units/test_invoker_types_spec.rb +182 -0
  783. data/spec/units/test_pipeline_helpers_spec.rb +100 -0
  784. data/spec/units/test_pipeline_manager_spec.rb +415 -0
  785. data/spec/units/test_runner_generatinator_spec.rb +215 -0
  786. data/spec/units/test_runner_manager_spec.rb +70 -0
  787. data/spec/units/test_search_paths_spec.rb +84 -0
  788. data/spec/units/test_source_file_directive_resolver_spec.rb +239 -0
  789. data/spec/units/tool_executor_helper_spec.rb +1 -1
  790. data/spec/units/tool_executor_spec.rb +571 -2
  791. data/spec/units/tool_validator_spec.rb +303 -24
  792. data/spec/units/version_spec.rb +74 -0
  793. data/spec/units/yaml_wrapper_spec.rb +4 -1
  794. data/vendor/cmock/docs/CMock_Summary.md +11 -0
  795. data/vendor/cmock/lib/cmock_config.rb +1 -0
  796. data/vendor/cmock/lib/cmock_generator.rb +5 -1
  797. data/vendor/cmock/test/unit/cmock_generator_main_test.rb +31 -0
  798. data/vendor/cmock/vendor/unity/auto/generate_module.rb +4 -4
  799. data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +8 -2
  800. data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +2 -2
  801. data/vendor/cmock/vendor/unity/docs/UnityChangeLog.md +7 -0
  802. data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +4 -0
  803. data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
  804. data/vendor/cmock/vendor/unity/src/unity_internals.h +21 -7
  805. data/vendor/cmock/vendor/unity/test/Makefile +9 -2
  806. data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +1 -0
  807. data/vendor/cmock/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
  808. data/vendor/cmock/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
  809. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
  810. data/vendor/cmock/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
  811. data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +78 -0
  812. data/vendor/cmock/vendor/unity/test/tests/test_unity_test_summary.rb +58 -0
  813. data/vendor/diy/lib/diy/factory.rb +5 -4
  814. data/vendor/diy/lib/diy.rb +5 -4
  815. data/vendor/diy/sample_code/car.rb +5 -4
  816. data/vendor/diy/sample_code/chassis.rb +5 -4
  817. data/vendor/diy/sample_code/diy_example.rb +5 -4
  818. data/vendor/diy/sample_code/engine.rb +5 -4
  819. data/vendor/diy/sample_code/objects.yml +5 -4
  820. data/vendor/diy/test/constructor.rb +5 -4
  821. data/vendor/diy/test/diy_test.rb +5 -4
  822. data/vendor/diy/test/factory_test.rb +5 -4
  823. data/vendor/diy/test/files/broken_construction.yml +5 -4
  824. data/vendor/diy/test/files/cat/cat.rb +5 -4
  825. data/vendor/diy/test/files/cat/extra_conflict.yml +5 -4
  826. data/vendor/diy/test/files/cat/heritage.rb +5 -4
  827. data/vendor/diy/test/files/cat/needs_input.yml +5 -4
  828. data/vendor/diy/test/files/cat/the_cat_lineage.rb +5 -4
  829. data/vendor/diy/test/files/dog/dog_model.rb +5 -4
  830. data/vendor/diy/test/files/dog/dog_presenter.rb +5 -4
  831. data/vendor/diy/test/files/dog/dog_view.rb +5 -4
  832. data/vendor/diy/test/files/dog/file_resolver.rb +5 -4
  833. data/vendor/diy/test/files/dog/other_thing.rb +5 -4
  834. data/vendor/diy/test/files/dog/simple.yml +5 -4
  835. data/vendor/diy/test/files/donkey/foo/bar/qux.rb +5 -4
  836. data/vendor/diy/test/files/donkey/foo.rb +5 -4
  837. data/vendor/diy/test/files/factory/beef.rb +5 -4
  838. data/vendor/diy/test/files/factory/dog.rb +5 -4
  839. data/vendor/diy/test/files/factory/factory.yml +5 -4
  840. data/vendor/diy/test/files/factory/farm/llama.rb +5 -4
  841. data/vendor/diy/test/files/factory/farm/pork.rb +5 -4
  842. data/vendor/diy/test/files/factory/kitten.rb +5 -4
  843. data/vendor/diy/test/files/fud/objects.yml +5 -4
  844. data/vendor/diy/test/files/fud/toy.rb +5 -4
  845. data/vendor/diy/test/files/functions/attached_things_builder.rb +5 -4
  846. data/vendor/diy/test/files/functions/invalid_method.yml +5 -4
  847. data/vendor/diy/test/files/functions/method_extractor.rb +5 -4
  848. data/vendor/diy/test/files/functions/nonsingleton_objects.yml +5 -4
  849. data/vendor/diy/test/files/functions/objects.yml +5 -4
  850. data/vendor/diy/test/files/functions/thing.rb +5 -4
  851. data/vendor/diy/test/files/functions/thing_builder.rb +5 -4
  852. data/vendor/diy/test/files/functions/things_builder.rb +5 -4
  853. data/vendor/diy/test/files/gnu/objects.yml +5 -4
  854. data/vendor/diy/test/files/gnu/thinger.rb +5 -4
  855. data/vendor/diy/test/files/goat/base.rb +5 -4
  856. data/vendor/diy/test/files/goat/can.rb +5 -4
  857. data/vendor/diy/test/files/goat/goat.rb +5 -4
  858. data/vendor/diy/test/files/goat/objects.yml +5 -4
  859. data/vendor/diy/test/files/goat/paper.rb +5 -4
  860. data/vendor/diy/test/files/goat/plane.rb +5 -4
  861. data/vendor/diy/test/files/goat/shirt.rb +5 -4
  862. data/vendor/diy/test/files/goat/wings.rb +5 -4
  863. data/vendor/diy/test/files/horse/holder_thing.rb +5 -4
  864. data/vendor/diy/test/files/horse/objects.yml +5 -4
  865. data/vendor/diy/test/files/namespace/animal/bird.rb +5 -4
  866. data/vendor/diy/test/files/namespace/animal/cat.rb +5 -4
  867. data/vendor/diy/test/files/namespace/animal/reptile/hardshell/turtle.rb +5 -4
  868. data/vendor/diy/test/files/namespace/animal/reptile/lizard.rb +5 -4
  869. data/vendor/diy/test/files/namespace/bad_module_specified.yml +5 -4
  870. data/vendor/diy/test/files/namespace/class_name_combine.yml +5 -4
  871. data/vendor/diy/test/files/namespace/no_module_specified.yml +5 -4
  872. data/vendor/diy/test/files/namespace/objects.yml +5 -4
  873. data/vendor/diy/test/files/namespace/road.rb +5 -4
  874. data/vendor/diy/test/files/namespace/sky.rb +5 -4
  875. data/vendor/diy/test/files/namespace/subcontext.yml +5 -4
  876. data/vendor/diy/test/files/non_singleton/air.rb +5 -4
  877. data/vendor/diy/test/files/non_singleton/fat_cat.rb +5 -4
  878. data/vendor/diy/test/files/non_singleton/objects.yml +5 -4
  879. data/vendor/diy/test/files/non_singleton/pig.rb +5 -4
  880. data/vendor/diy/test/files/non_singleton/thread_spinner.rb +5 -4
  881. data/vendor/diy/test/files/non_singleton/tick.rb +5 -4
  882. data/vendor/diy/test/files/non_singleton/yard.rb +5 -4
  883. data/vendor/diy/test/files/yak/core_model.rb +5 -4
  884. data/vendor/diy/test/files/yak/core_presenter.rb +5 -4
  885. data/vendor/diy/test/files/yak/core_view.rb +5 -4
  886. data/vendor/diy/test/files/yak/data_source.rb +5 -4
  887. data/vendor/diy/test/files/yak/fringe_model.rb +5 -4
  888. data/vendor/diy/test/files/yak/fringe_presenter.rb +5 -4
  889. data/vendor/diy/test/files/yak/fringe_view.rb +5 -4
  890. data/vendor/diy/test/files/yak/giant_squid.rb +5 -4
  891. data/vendor/diy/test/files/yak/krill.rb +5 -4
  892. data/vendor/diy/test/files/yak/my_objects.yml +5 -4
  893. data/vendor/diy/test/files/yak/sub_sub_context_test.yml +5 -4
  894. data/vendor/diy/test/test_helper.rb +5 -4
  895. data/vendor/unity/auto/generate_module.rb +4 -4
  896. data/vendor/unity/auto/generate_test_runner.rb +5 -1
  897. data/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
  898. data/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
  899. data/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
  900. data/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
  901. data/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
  902. data/vendor/unity/test/tests/test_generate_test_runner.rb +29 -0
  903. metadata +770 -287
  904. data/assets/tests_with_fallback_conditionals/src/conditional_module.c +0 -18
  905. data/bin/actions_wrapper.rb +0 -51
  906. data/docs/mkdocs/assets/images/ceedling-logo-circle.png +0 -0
  907. data/docs/mkdocs/assets/images/ceedling.svg +0 -90
  908. data/docs/mkdocs/assets/images/favicon.png +0 -0
  909. data/docs/mkdocs/assets/stylesheets/admonitions.css +0 -152
  910. data/docs/mkdocs/assets/stylesheets/fixes-local.css +0 -15
  911. data/docs/mkdocs/assets/stylesheets/styling.css +0 -102
  912. data/docs/mkdocs/configuration/environment-vars.md +0 -14
  913. data/docs/mkdocs/configuration/global-collections.md +0 -156
  914. data/docs/mkdocs/configuration/index.md +0 -75
  915. data/docs/mkdocs/configuration/loading.md +0 -89
  916. data/docs/mkdocs/configuration/mixins.md +0 -607
  917. data/docs/mkdocs/configuration/parallel-builds.md +0 -97
  918. data/docs/mkdocs/configuration/project-file.md +0 -216
  919. data/docs/mkdocs/configuration/reference/cexception.md +0 -35
  920. data/docs/mkdocs/configuration/reference/cmock.md +0 -106
  921. data/docs/mkdocs/configuration/reference/defines.md +0 -352
  922. data/docs/mkdocs/configuration/reference/environment.md +0 -55
  923. data/docs/mkdocs/configuration/reference/extension.md +0 -63
  924. data/docs/mkdocs/configuration/reference/files.md +0 -154
  925. data/docs/mkdocs/configuration/reference/flags.md +0 -296
  926. data/docs/mkdocs/configuration/reference/index.md +0 -176
  927. data/docs/mkdocs/configuration/reference/libraries.md +0 -82
  928. data/docs/mkdocs/configuration/reference/mixins.md +0 -24
  929. data/docs/mkdocs/configuration/reference/partials.md +0 -38
  930. data/docs/mkdocs/configuration/reference/paths.md +0 -276
  931. data/docs/mkdocs/configuration/reference/plugins.md +0 -60
  932. data/docs/mkdocs/configuration/reference/project.md +0 -333
  933. data/docs/mkdocs/configuration/reference/release-build.md +0 -62
  934. data/docs/mkdocs/configuration/reference/test-build.md +0 -55
  935. data/docs/mkdocs/configuration/reference/test-runner.md +0 -61
  936. data/docs/mkdocs/configuration/reference/tools.md +0 -457
  937. data/docs/mkdocs/configuration/reference/unity.md +0 -49
  938. data/docs/mkdocs/configuration/which-ceedling.md +0 -77
  939. data/docs/mkdocs/development/index.md +0 -61
  940. data/docs/mkdocs/development/plugins/configuration.md +0 -164
  941. data/docs/mkdocs/development/plugins/index.md +0 -84
  942. data/docs/mkdocs/development/plugins/plugin-subclass.md +0 -513
  943. data/docs/mkdocs/development/plugins/rake-tasks.md +0 -54
  944. data/docs/mkdocs/development/workflow.md +0 -284
  945. data/docs/mkdocs/getting-started/command-line.md +0 -477
  946. data/docs/mkdocs/getting-started/example-projects/cipher-quest.md +0 -65
  947. data/docs/mkdocs/getting-started/example-projects/index.md +0 -49
  948. data/docs/mkdocs/getting-started/example-projects/temp-sensor.md +0 -60
  949. data/docs/mkdocs/getting-started/example-projects/wondrous-forest.md +0 -45
  950. data/docs/mkdocs/getting-started/index.md +0 -41
  951. data/docs/mkdocs/getting-started/installation.md +0 -179
  952. data/docs/mkdocs/getting-started/quick-start.md +0 -86
  953. data/docs/mkdocs/help.md +0 -49
  954. data/docs/mkdocs/index.md +0 -222
  955. data/docs/mkdocs/overview/build-system.md +0 -115
  956. data/docs/mkdocs/overview/index.md +0 -29
  957. data/docs/mkdocs/overview/test-environments.md +0 -33
  958. data/docs/mkdocs/overview/tools-and-frameworks.md +0 -115
  959. data/docs/mkdocs/plugins/beep.md +0 -134
  960. data/docs/mkdocs/plugins/bullseye.md +0 -83
  961. data/docs/mkdocs/plugins/command-hooks.md +0 -268
  962. data/docs/mkdocs/plugins/compile-commands-json-db.md +0 -42
  963. data/docs/mkdocs/plugins/cppcheck.md +0 -377
  964. data/docs/mkdocs/plugins/dependencies.md +0 -310
  965. data/docs/mkdocs/plugins/fff.md +0 -247
  966. data/docs/mkdocs/plugins/gcov/examples.md +0 -92
  967. data/docs/mkdocs/plugins/gcov/gcovr.md +0 -526
  968. data/docs/mkdocs/plugins/gcov/index.md +0 -74
  969. data/docs/mkdocs/plugins/gcov/overview.md +0 -145
  970. data/docs/mkdocs/plugins/gcov/reportgenerator.md +0 -246
  971. data/docs/mkdocs/plugins/gcov/reporting.md +0 -147
  972. data/docs/mkdocs/plugins/gcov/setup.md +0 -232
  973. data/docs/mkdocs/plugins/gcov/tool-versions.md +0 -60
  974. data/docs/mkdocs/plugins/gcov/troubleshooting.md +0 -78
  975. data/docs/mkdocs/plugins/index.md +0 -261
  976. data/docs/mkdocs/plugins/module-generator.md +0 -267
  977. data/docs/mkdocs/plugins/report-build-warnings-log.md +0 -42
  978. data/docs/mkdocs/plugins/report-tests-gtestlike-stdout.md +0 -98
  979. data/docs/mkdocs/plugins/report-tests-ide-stdout.md +0 -63
  980. data/docs/mkdocs/plugins/report-tests-log-factory.md +0 -454
  981. data/docs/mkdocs/plugins/report-tests-pretty-stdout.md +0 -56
  982. data/docs/mkdocs/plugins/report-tests-raw-output-log.md +0 -52
  983. data/docs/mkdocs/plugins/report-tests-teamcity-stdout.md +0 -96
  984. data/docs/mkdocs/plugins/sample_html_report.png +0 -0
  985. data/docs/mkdocs/plugins/valgrind.md +0 -198
  986. data/docs/mkdocs/project/release-history.md +0 -61
  987. data/docs/mkdocs/project/upgrade.md +0 -85
  988. data/docs/mkdocs/reference/build-directives.md +0 -37
  989. data/docs/mkdocs/reference/command-line.md +0 -323
  990. data/docs/mkdocs/reference/environment-vars.md +0 -60
  991. data/docs/mkdocs/reference/gcov-plugin.md +0 -600
  992. data/docs/mkdocs/reference/global-collections.md +0 -160
  993. data/docs/mkdocs/reference/index.md +0 -65
  994. data/docs/mkdocs/reference/partials-macros.md +0 -79
  995. data/docs/mkdocs/reference/project-configuration.md +0 -46
  996. data/docs/mkdocs/snapshot/examples/cipher_quest/README.md +0 -210
  997. data/docs/mkdocs/snapshot/examples/temp_sensor/README.md +0 -283
  998. data/docs/mkdocs/snapshot/examples/wondrous_forest/README.md +0 -92
  999. data/docs/mkdocs/snapshot/plugins/gcov/config/defaults.yml +0 -32
  1000. data/docs/mkdocs/snapshot/plugins/gcov/config/defaults_gcov.rb +0 -136
  1001. data/docs/mkdocs/snapshot.yml +0 -20
  1002. data/docs/mkdocs/testing-guide/build-directives.md +0 -153
  1003. data/docs/mkdocs/testing-guide/conventions.md +0 -616
  1004. data/docs/mkdocs/testing-guide/frameworks.md +0 -192
  1005. data/docs/mkdocs/testing-guide/index.md +0 -80
  1006. data/docs/mkdocs/testing-guide/partials/configuration.md +0 -67
  1007. data/docs/mkdocs/testing-guide/partials/conventions.md +0 -68
  1008. data/docs/mkdocs/testing-guide/partials/directives.md +0 -212
  1009. data/docs/mkdocs/testing-guide/partials/example.md +0 -149
  1010. data/docs/mkdocs/testing-guide/partials/index.md +0 -88
  1011. data/docs/mkdocs/testing-guide/partials/overview.md +0 -81
  1012. data/docs/mkdocs/testing-guide/partials/variables.md +0 -244
  1013. data/docs/mkdocs/testing-guide/test-cases.md +0 -194
  1014. data/docs/mkdocs/testing-guide/test-sample.md +0 -94
  1015. data/docs/mkdocs/testing-guide/test-suite-anatomy.md +0 -58
  1016. data/lib/ceedling/cacheinator.rb +0 -53
  1017. data/lib/ceedling/cacheinator_helper.rb +0 -60
  1018. data/lib/ceedling/dependinator.rb +0 -31
  1019. data/lib/ceedling/makefile.rb +0 -52
  1020. data/lib/ceedling/release_invoker.rb +0 -112
  1021. data/lib/ceedling/rules_release.rake +0 -109
  1022. data/lib/ceedling/rules_tests.rake +0 -40
  1023. data/lib/ceedling/tasks_release.rake +0 -36
  1024. data/plugins/fff/vendor/fff/Makefile +0 -10
  1025. data/plugins/fff/vendor/fff/buildandtest +0 -15
  1026. data/plugins/fff/vendor/fff/examples/Makefile +0 -7
  1027. data/plugins/fff/vendor/fff/examples/driver_testing/Makefile +0 -64
  1028. data/plugins/fff/vendor/fff/examples/driver_testing/driver.c +0 -32
  1029. data/plugins/fff/vendor/fff/examples/driver_testing/driver.h +0 -21
  1030. data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.cpp +0 -58
  1031. data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.fff.cpp +0 -70
  1032. data/plugins/fff/vendor/fff/examples/driver_testing/hardware_abstraction.h +0 -25
  1033. data/plugins/fff/vendor/fff/examples/driver_testing/registers.h +0 -23
  1034. data/plugins/fff/vendor/fff/examples/embedded_ui/DISPLAY.h +0 -27
  1035. data/plugins/fff/vendor/fff/examples/embedded_ui/Kata.txt +0 -25
  1036. data/plugins/fff/vendor/fff/examples/embedded_ui/Makefile +0 -67
  1037. data/plugins/fff/vendor/fff/examples/embedded_ui/SYSTEM.h +0 -31
  1038. data/plugins/fff/vendor/fff/examples/embedded_ui/UI.c +0 -56
  1039. data/plugins/fff/vendor/fff/examples/embedded_ui/UI.h +0 -22
  1040. data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_ansic.c +0 -191
  1041. data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_cpp.cpp +0 -144
  1042. data/plugins/fff/vendor/fff/examples/embedded_ui/test_suite_template.c +0 -42
  1043. data/plugins/fff/vendor/fff/gtest/Makefile +0 -22
  1044. data/plugins/fff/vendor/fff/gtest/gtest-all.cc +0 -9118
  1045. data/plugins/fff/vendor/fff/gtest/gtest-main.cc +0 -6
  1046. data/plugins/fff/vendor/fff/gtest/gtest.h +0 -19547
  1047. data/plugins/fff/vendor/fff/test/Makefile +0 -81
  1048. data/plugins/fff/vendor/fff/test/c_test_framework.h +0 -25
  1049. data/plugins/fff/vendor/fff/test/fff_test_c.c +0 -116
  1050. data/plugins/fff/vendor/fff/test/fff_test_cpp.cpp +0 -53
  1051. data/plugins/fff/vendor/fff/test/fff_test_global_c.c +0 -84
  1052. data/plugins/fff/vendor/fff/test/fff_test_global_cpp.cpp +0 -31
  1053. data/plugins/fff/vendor/fff/test/global_fakes.c +0 -21
  1054. data/plugins/fff/vendor/fff/test/global_fakes.h +0 -47
  1055. data/plugins/fff/vendor/fff/test/test_cases.include +0 -276
  1056. data/plugins/report_tests_gtestlike_stdout/assets/template.erb +0 -83
  1057. data/site-local/snapshot/assets/project.yml +0 -404
  1058. data/spec/system/partials_types_header_spec.rb +0 -166
  1059. data/spec/units/configurator_spec.rb +0 -232
  1060. /data/assets/{ceedling → features/ceedling} +0 -0
  1061. /data/assets/{ceedling.cmd → features/ceedling.cmd} +0 -0
  1062. /data/assets/{default_gitignore → features/default_gitignore} +0 -0
  1063. /data/assets/{broken_uncovered_file.c → fixtures/broken_uncovered_file.c} +0 -0
  1064. /data/assets/{example_file.c → fixtures/example_file.c} +0 -0
  1065. /data/assets/{example_file.h → fixtures/example_file.h} +0 -0
  1066. /data/assets/{example_file_call.c → fixtures/example_file_call.c} +0 -0
  1067. /data/assets/{example_file_call.h → fixtures/example_file_call.h} +0 -0
  1068. /data/assets/{example_file_with_statics.c → fixtures/example_file_with_statics.c} +0 -0
  1069. /data/assets/{example_file_with_stdio.c → fixtures/example_file_with_stdio.c} +0 -0
  1070. /data/assets/{example_file_with_stdio.h → fixtures/example_file_with_stdio.h} +0 -0
  1071. /data/assets/{fake_crash_test_fixture.rb → fixtures/fake_crash_test_fixture.rb} +0 -0
  1072. /data/assets/{partial_all_module.h → fixtures/partial_all_module.h} +0 -0
  1073. /data/assets/{run_with_ubsan.rb → fixtures/run_with_ubsan.rb} +0 -0
  1074. /data/assets/{same_dir_pairing_module.c → fixtures/same_dir_pairing_module.c} +0 -0
  1075. /data/assets/{same_dir_pairing_module.h → fixtures/same_dir_pairing_module.h} +0 -0
  1076. /data/assets/{same_dir_pairing_module_func.h → fixtures/same_dir_pairing_module_func.h} +0 -0
  1077. /data/assets/{same_dir_pairing_other.c → fixtures/same_dir_pairing_other.c} +0 -0
  1078. /data/assets/{same_dir_pairing_other.h → fixtures/same_dir_pairing_other.h} +0 -0
  1079. /data/assets/{test_example_file.c → fixtures/test_example_file.c} +0 -0
  1080. /data/assets/{test_example_file_2.c → fixtures/test_example_file_2.c} +0 -0
  1081. /data/assets/{test_example_file_source_include.c → fixtures/test_example_file_source_include.c} +0 -0
  1082. /data/assets/{test_example_file_success.c → fixtures/test_example_file_success.c} +0 -0
  1083. /data/assets/{test_example_file_unity_printf.c → fixtures/test_example_file_unity_printf.c} +0 -0
  1084. /data/assets/{test_example_file_verbose.c → fixtures/test_example_file_verbose.c} +0 -0
  1085. /data/assets/{test_example_file_with_mock.c → fixtures/test_example_file_with_mock.c} +0 -0
  1086. /data/assets/{test_example_file_with_stdio.c → fixtures/test_example_file_with_stdio.c} +0 -0
  1087. /data/assets/{test_example_with_parameterized_tests.c → fixtures/test_example_with_parameterized_tests.c} +0 -0
  1088. /data/assets/{test_partial_all_module.c → fixtures/test_partial_all_module.c} +0 -0
  1089. /data/assets/{test_same_dir_pairing.c → fixtures/test_same_dir_pairing.c} +0 -0
  1090. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_config.h +0 -0
  1091. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_extra.h +0 -0
  1092. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/local_flag_extra.h +0 -0
  1093. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_extra.h +0 -0
  1094. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_wrapper.h +0 -0
  1095. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/project_flag_extra.h +0 -0
  1096. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.h +0 -0
  1097. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.c +0 -0
  1098. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.h +0 -0
  1099. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.c +0 -0
  1100. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.h +0 -0
  1101. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware.c +0 -0
  1102. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware_special.c +0 -0
  1103. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.c +0 -0
  1104. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.h +0 -0
  1105. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder.c +0 -0
  1106. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder_partial.c +0 -0
  1107. /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/conditional_module.h +0 -0
  1108. /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/optional_dep.h +0 -0
  1109. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.c +0 -0
  1110. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.h +0 -0
  1111. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.c +0 -0
  1112. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.h +0 -0
  1113. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.c +0 -0
  1114. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.h +0 -0
  1115. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_blanks.c +0 -0
  1116. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_counter.c +0 -0
  1117. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_decorators.c +0 -0
  1118. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.c +0 -0
  1119. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.h +0 -0
  1120. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.c +0 -0
  1121. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.h +0 -0
  1122. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.c +0 -0
  1123. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.h +0 -0
  1124. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorA.h +0 -0
  1125. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorB.h +0 -0
  1126. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorC.h +0 -0
  1127. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareA.c +0 -0
  1128. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareB.c +0 -0
  1129. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareC.c +0 -0
  1130. /data/assets/{uncovered_example_file.c → fixtures/uncovered_example_file.c} +0 -0
  1131. /data/plugins/bullseye/assets/{template.erb → coverage.template} +0 -0
@@ -10,17 +10,35 @@ require 'ceedling/constants'
10
10
  require 'ceedling/file_path_utils'
11
11
  require 'ceedling/exceptions'
12
12
  require 'ceedling/rake_app/rakefile_component_resolver'
13
- require 'ceedling/config/config_matchinator'
14
13
  require 'ceedling/tool_executor'
15
14
  require 'deep_merge'
16
15
 
17
16
  class Configurator
18
17
 
19
18
  attr_reader :project_config_hash, :programmatic_plugins, :rake_plugins
20
- attr_accessor :project_logging, :sanity_checks, :include_test_case, :exclude_test_case
19
+ attr_accessor :project_logging, :sanity_checks, :include_test_case, :exclude_test_case, :force_test_rerun
21
20
 
22
21
  constructor :configurator_setup, :configurator_builder, :configurator_plugins, :config_walkinator, :yaml_wrapper, :system_wrapper, :loginator, :reportinator, :ruby_expandinator
23
22
 
23
+ # Validations of the sections everything else depends on. Configuration can reference
24
+ # environment variables that are evaluated early, so :environment is among them.
25
+ ESSENTIAL_VALIDATIONS = [:validate_required_sections, :validate_required_section_values, :validate_environment_vars].freeze
26
+
27
+ # Validations of the completed configuration
28
+ FINAL_VALIDATIONS = [
29
+ :validate_paths, :validate_tools, :validate_defines, :validate_flags, :validate_line_markers,
30
+ :validate_test_preprocessor, :validate_backtrace, :validate_threads, :validate_partials, :validate_plugins
31
+ ].freeze
32
+
33
+ # CMock and Unity options that test runner generation also reads
34
+ RUNNER_CMOCK_OPTIONS = [:mock_prefix, :mock_suffix, :mock_name_include_folder, :enforce_strict_ordering].freeze
35
+ RUNNER_UNITY_OPTIONS = [:use_param_tests, :shuffle_tests].freeze
36
+
37
+ # A minimal subset of the directives-only preprocessor tool: no defines, no include paths,
38
+ # and output to stdout, so no platform-specific null device. It is enough to detect
39
+ # -fdirectives-only support by a warning or exit code.
40
+ DIRECTIVES_ONLY_PROBE_ARGUMENTS = ['-E', '-fdirectives-only', '-x c', "\"${1}\""].freeze
41
+
24
42
  def setup()
25
43
  # Cmock config reference to provide to CMock for mock generation
26
44
  @cmock_config = {} # Default empty hash, replaced by reference below
@@ -28,8 +46,13 @@ class Configurator
28
46
  # Runner config reference to provide to runner generation
29
47
  @runner_config = {} # Default empty hash, replaced by reference below
30
48
 
31
- # Note: project_config_hash is an instance variable so constants and accessors created
32
- # in eval() statements in build() have something of proper scope and persistence to reference
49
+ # Unity config reference. The flattened project_config_hash holds no :unity section to read back.
50
+ @unity_config = {} # Default empty hash, replaced by reference below
51
+
52
+ # Partials config reference, for the same reason. Dependency-tracker meta hashes it whole.
53
+ @partials_config = {} # Default empty hash, replaced by reference below
54
+
55
+ # Accessors built from configuration read this
33
56
  @project_config_hash = {}
34
57
 
35
58
  @programmatic_plugins = []
@@ -39,34 +62,35 @@ class Configurator
39
62
  @sanity_checks = TestResultsSanityChecks::NORMAL
40
63
  end
41
64
 
65
+ # What startup learned of gdb backtraces (see ConfiguratorSetup#gdb_backtrace_state)
66
+ def gdb_backtrace_state
67
+ return @configurator_setup.gdb_backtrace_state
68
+ end
69
+
42
70
  # Override to prevent exception handling from walking & stringifying the object variables.
43
71
  # Object variables are gigantic and produce a flood of output.
44
72
  def inspect
45
- # TODO: When identifying information is added to constructor, insert it into `inspect()` string
46
- return this.class.name
73
+ return self.class.name
47
74
  end
48
75
 
49
76
  def replace_flattened_config(config)
50
77
  @project_config_hash.merge!(config)
51
- @configurator_setup.build_constants_and_accessors(@project_config_hash, binding())
78
+ @configurator_setup.build_constants_and_accessors(@project_config_hash, self)
52
79
  end
53
80
 
54
81
 
55
82
  # Set up essential flattened config related to verbosity.
56
83
  # We do this because early config validation failures may need access to verbosity,
57
84
  # but the accessors won't be available until after configuration is validated.
58
- def set_verbosity(config)
59
- # PROJECT_VERBOSITY and PROJECT_DEBUG set at command line processing before Ceedling is loaded
85
+ # PROJECT_VERBOSITY and PROJECT_DEBUG are set by command line processing.
86
+ def set_verbosity()
87
+ debug = !!defined?(PROJECT_DEBUG) && PROJECT_DEBUG
88
+ define_singleton_method( :project_debug ) { debug }
60
89
 
61
- if (!!defined?(PROJECT_DEBUG) and PROJECT_DEBUG)
62
- eval("def project_debug() return true end", binding())
63
- else
64
- eval("def project_debug() return false end", binding())
65
- end
90
+ return if !defined?(PROJECT_VERBOSITY)
66
91
 
67
- if !!defined?(PROJECT_VERBOSITY)
68
- eval("def project_verbosity() return #{PROJECT_VERBOSITY} end", binding())
69
- end
92
+ verbosity = PROJECT_VERBOSITY
93
+ define_singleton_method( :project_verbosity ) { verbosity }
70
94
  end
71
95
 
72
96
 
@@ -80,125 +104,33 @@ class Configurator
80
104
  # If partials enabled, enable full test preprocessing
81
105
  config[:project][:use_test_preprocessor] = :all
82
106
  @loginator.log( " > Enabled preprocessing." )
83
-
84
- # If partials enabled and CMock's `:treat_inlines` is enabled, quietly disable.
85
- # Enabling Partials and this feature causes extra processing for Ceedling and CMock that is never used.
86
- if config[:cmock][:treat_inlines] == :include
87
- config[:cmock][:treat_inlines] = :exclude
88
- @loginator.log( "Reverted :cmock ↳ :treat_inlines to :exclude because this CMock feature is superseded by Partials.", Verbosity::COMPLAIN, LogLabels::NOTICE )
89
- end
90
-
91
- # If partials enabled, inject partials name prefix symbol to all test compilation
92
- # and, if a project defines its own preprocess-scoped defines matcher, to
93
- # preprocessing as well -- `:preprocess:` defines are looked up independently
94
- # of `:test:` defines and only fall back to the latter when `:preprocess:`
95
- # is absent entirely, so a project-defined `:preprocess:` matcher needs this
96
- # symbol appended directly or Partials' own macro-based #includes break.
97
- # Handle both the simple list and matcher hash config formats.
98
- _partials_prefix_symbol = "CEEDLING_PARTIALS_PREFIX=#{PARTIAL_FILENAME_PREFIX}"
99
- ConfigMatchinator.append_matcher_entries( config[:defines][:test], _partials_prefix_symbol )
100
- ConfigMatchinator.append_matcher_entries( config[:defines][:preprocess], _partials_prefix_symbol )
101
107
  end
102
108
 
103
109
 
110
+ # Directives-only preprocessing is available only when preprocessing is on, fallback
111
+ # is not forced, and the configured C preprocessor supports -fdirectives-only
104
112
  def resolve_directives_only_preprocessing(config, tool_executor)
105
- # Nothing to probe if preprocessing is disabled
106
- preprocessing = config[:project][:use_test_preprocessor]
107
113
  config[:test_build][:preprocess_directives_only_available] = false
108
- return if preprocessing == :none
109
114
 
110
- # When forced fallback is enabled, skip the probe and mark directives-only unavailable
115
+ return if config[:project][:use_test_preprocessor] == :none
116
+
111
117
  if config[:test_build][:preprocess_force_fallback]
112
- @loginator.log(
113
- "Forcing fallback text-based preprocessing in place of directives-only (:test_build ↳ :preprocess_force_fallback is enabled).",
114
- Verbosity::COMPLAIN,
115
- LogLabels::NOTICE
116
- )
117
- return
118
+ return log_notice( "Forcing best-effort fallback preprocessing in place of directives-only (:test_build ↳ :preprocess_force_fallback is enabled)." )
118
119
  end
119
120
 
120
- # Probe whether the configured C preprocessor supports -fdirectives-only.
121
- # Use the Unity header as it is always-available, self-contained, no include paths needed.
122
- # Output goes to stdout (no -o flag) to avoid platform-specific null device paths.
123
- probe_filepath = File.join( CEEDLING_VENDOR, UNITY_LIB_PATH, UNITY_H_FILE )
124
-
125
- # Minimal subset of the directives-only preprocessor tool: no defines, no include paths,
126
- # no output file. Sufficient to detect `-fdirectives-only` support via warning or exit code.
127
- probe_tool = {
128
- executable: config[:tools][:test_file_directives_only_preprocessor][:executable],
129
- name: 'directives_only_probe',
130
- arguments: [
131
- '-E',
132
- '-fdirectives-only',
133
- '-x c',
134
- "\"${1}\""
135
- ]
136
- }
137
-
138
- command = tool_executor.build_command_line( probe_tool, [], probe_filepath )
139
- # Exception if something goes wrong; we want to detect errors here
140
- command[:options][:boom] = false
141
- results = tool_executor.exec( command )
142
-
143
- # Clang and some older GCC emit a warning (not an error) when -fdirectives-only is unsupported
144
- warning_detected = results[:output].match?( /warning[^\n]+-fdirectives-only/ )
145
-
146
- if warning_detected || results[:exit_code] != 0
147
- @loginator.log(
148
- "Preprocessor lacks -fdirectives-only support ➡️ Ceedling will use text-based fallback for preprocessing.",
149
- Verbosity::COMPLAIN,
150
- LogLabels::NOTICE
151
- )
152
- # :preprocess_directives_only_available already set to false above
153
- else
154
- config[:test_build][:preprocess_directives_only_available] = true
121
+ if !directives_only_supported?( config, tool_executor )
122
+ return log_notice( "Preprocessor lacks -fdirectives-only support ➡️ Ceedling will use best-effort fallback preprocessing." )
155
123
  end
124
+
125
+ config[:test_build][:preprocess_directives_only_available] = true
156
126
  end
157
127
 
158
128
 
159
- # The default tools (eg. DEFAULT_TOOLS_TEST) are merged into default config hash
129
+ # The default tools a build needs are merged into the default config hash
160
130
  def merge_tools_defaults(config, default_config)
161
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
162
- @reportinator.generate_progress( 'Collecting default tool configurations' )
163
- end
164
-
165
- # config[:project] is guaranteed to exist / validated to exist but may not include elements referenced below
166
- # config[:test_build] and config[:release_build] are optional in a user project configuration
167
-
168
-
169
- release_build, _ = @config_walkinator.fetch_value( :project, :release_build,
170
- hash:config,
171
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:project][:release_build]
172
- )
173
-
174
- test_preprocessing, _ = @config_walkinator.fetch_value( :project, :use_test_preprocessor,
175
- hash:config,
176
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:project][:use_test_preprocessor]
177
- )
131
+ progress( 'Collecting default tool configurations' )
178
132
 
179
- backtrace, _ = @config_walkinator.fetch_value( :project, :use_backtrace,
180
- hash:config,
181
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:project][:use_backtrace]
182
- )
183
-
184
- release_assembly, _ = @config_walkinator.fetch_value( :release_build, :use_assembly,
185
- hash:config,
186
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:release_build][:use_assembly]
187
- )
188
-
189
- test_assembly, _ = @config_walkinator.fetch_value( :test_build, :use_assembly,
190
- hash:config,
191
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:test_build][:use_assembly]
192
- )
193
-
194
- default_config.deep_merge( DEFAULT_TOOLS_TEST.deep_clone() )
195
-
196
- default_config.deep_merge( DEFAULT_TOOLS_TEST_PREPROCESSORS.deep_clone() ) if (test_preprocessing != :none)
197
- default_config.deep_merge( DEFAULT_TOOLS_TEST_ASSEMBLER.deep_clone() ) if test_assembly
198
- default_config.deep_merge( DEFAULT_TOOLS_TEST_GDB_BACKTRACE.deep_clone() ) if (backtrace == :gdb)
199
-
200
- default_config.deep_merge( DEFAULT_TOOLS_RELEASE.deep_clone() ) if release_build
201
- default_config.deep_merge( DEFAULT_TOOLS_RELEASE_ASSEMBLER.deep_clone() ) if (release_build and release_assembly)
133
+ needed_tools_defaults( config ).each { |defaults| default_config.deep_merge( defaults.deep_clone() ) }
202
134
  end
203
135
 
204
136
 
@@ -206,9 +138,7 @@ class Configurator
206
138
  # Cmock has its own internal defaults handling, but we need to set these specific values
207
139
  # so they're guaranteed values and present for the Ceedling environment to access
208
140
 
209
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
210
- @reportinator.generate_progress( 'Collecting CMock defaults' )
211
- end
141
+ progress( 'Collecting CMock defaults' )
212
142
 
213
143
  # Begin populating defaults with CMock defaults as set by Ceedling
214
144
  default_cmock = default_config[:cmock]
@@ -237,52 +167,14 @@ class Configurator
237
167
  end
238
168
 
239
169
 
170
+ # Plugin YAML defaults merge before plugin Ruby defaults. Neither replaces a value already present.
240
171
  def merge_plugins_defaults(paths_hash, config, default_config)
241
- # Config YAML defaults plugins
242
- plugin_yml_defaults = @configurator_plugins.find_plugin_yml_defaults( config, paths_hash )
243
-
244
- # Config Ruby-based hash defaults plugins
245
- plugin_hash_defaults = @configurator_plugins.find_plugin_hash_defaults( config, paths_hash )
246
-
247
-
248
- if !plugin_hash_defaults.empty?
249
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
250
- @reportinator.generate_progress( 'Collecting Plugin YAML defaults' )
251
- end
252
- end
253
-
254
- # Load base configuration values (defaults) from YAML
255
- plugin_yml_defaults.each do |plugin, defaults|
256
- _defaults = begin
257
- @yaml_wrapper.load( defaults )
258
- rescue YamlLoadException => e
259
- raise YamlLoadException.new(
260
- reason: e.reason, source: e.source, original_error: e.original_error,
261
- message: "Could not load default configuration for plugin '#{plugin}' ⏩️ #{e.message}"
262
- )
263
- end
264
-
265
- @loginator.lazy( Verbosity::DEBUG ) do
266
- " - #{plugin} >> " + _defaults.to_s()
267
- end
268
-
269
- default_config.deep_merge( _defaults )
172
+ yaml_defaults = @configurator_plugins.find_plugin_yml_defaults( config, paths_hash ).to_h do |plugin, path|
173
+ [plugin, load_plugin_yaml( path, "Could not load default configuration for plugin '#{plugin}'" )]
270
174
  end
271
175
 
272
- if !plugin_hash_defaults.empty?
273
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
274
- @reportinator.generate_progress( 'Collecting Plugin Ruby hash defaults' )
275
- end
276
- end
277
-
278
- # Load base configuration values (defaults) as hash from Ruby
279
- plugin_hash_defaults.each do |plugin, defaults|
280
- @loginator.lazy( Verbosity::DEBUG ) do
281
- " - #{plugin} >> " + defaults.to_s()
282
- end
283
-
284
- default_config.deep_merge( defaults )
285
- end
176
+ merge_plugin_defaults( 'YAML', yaml_defaults, default_config )
177
+ merge_plugin_defaults( 'Ruby hash', @configurator_plugins.find_plugin_hash_defaults( config, paths_hash ), default_config )
286
178
  end
287
179
 
288
180
 
@@ -291,118 +183,82 @@ class Configurator
291
183
  config.deep_merge( runtime_config )
292
184
  end
293
185
 
294
-
186
+
295
187
  def populate_with_defaults( config_hash, defaults_hash )
296
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
297
- @reportinator.generate_progress( 'Populating project configuration with collected default values' )
298
- end
188
+ progress( 'Populating project configuration with collected default values' )
299
189
 
300
190
  @configurator_builder.populate_with_defaults( config_hash, defaults_hash )
191
+
192
+ # Every :extension value is settled the moment defaults are merged in, well before
193
+ # validation or flattening ever look at it, so nothing downstream ever has to wonder
194
+ # whether a given :extension entry is a bare String or already a FilenameExtension.
195
+ @configurator_builder.normalize_filename_extensions( config_hash )
301
196
  end
302
197
 
303
198
 
199
+ # Parameterized tests need Unity's test case and variadic macro support
304
200
  def populate_unity_config(config)
305
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
306
- @reportinator.generate_progress( 'Processing Unity configuration' )
307
- end
201
+ progress( 'Processing Unity configuration' )
308
202
 
309
- if config[:unity][:use_param_tests]
310
- config[:unity][:defines] << 'UNITY_SUPPORT_TEST_CASES'
311
- config[:unity][:defines] << 'UNITY_SUPPORT_VARIADIC_MACROS'
312
- end
313
-
314
- @loginator.lazy( Verbosity::DEBUG ) do
315
- "Unity configuration >> #{config[:unity]}"
316
- end
317
- end
203
+ # Save Unity config reference
204
+ @unity_config = config[:unity]
318
205
 
206
+ config[:unity][:defines].concat( ['UNITY_SUPPORT_TEST_CASES', 'UNITY_SUPPORT_VARIADIC_MACROS'] ) if config[:unity][:use_param_tests]
319
207
 
320
- def populate_cmock_config(config)
321
- # Save CMock config reference
322
- @cmock_config = config[:cmock]
208
+ debug { "Unity configuration >> #{config[:unity]}" }
209
+ end
323
210
 
324
- cmock = config[:cmock]
325
211
 
326
- # Do no more prep if we're not using mocks
327
- if !config[:project][:use_mocks]
328
- @loginator.lazy( Verbosity::DEBUG ) do
329
- "CMock configuration >> #{cmock}"
330
- end
331
- return
332
- end
212
+ def populate_partials_config(config)
213
+ # Save Partials config reference. Unlike Unity, CMock, and the test runner, nothing
214
+ # derives values from or into this section.
215
+ @partials_config = config[:partials]
333
216
 
334
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
335
- @reportinator.generate_progress( 'Processing CMock configuration' )
336
- end
217
+ debug { "Partials configuration >> #{config[:partials]}" }
218
+ end
337
219
 
338
- # Plugins housekeeping
339
- cmock[:plugins].map! { |plugin| plugin.to_sym() }
340
- cmock[:plugins].uniq!
341
220
 
342
- # Reformulate CMock helper path value as array of one element if it's a string in config
343
- cmock[:unity_helper_path] = [cmock[:unity_helper_path]] if cmock[:unity_helper_path].is_a?( String )
221
+ # CMock needs no preparation when mocks are off
222
+ def populate_cmock_config(config)
223
+ # Save CMock config reference
224
+ @cmock_config = config[:cmock]
344
225
 
345
- # CMock Unity helper handling
346
- cmock[:unity_helper_path].each do |path|
347
- cmock[:includes] << File.basename( path )
226
+ if config[:project][:use_mocks]
227
+ progress( 'Processing CMock configuration' )
228
+ prepare_cmock_config( config[:cmock] )
348
229
  end
349
230
 
350
- cmock[:includes].uniq!
351
-
352
- # Add mocking prefix symbol for all test compilation
353
- cmock[:defines] << "CMOCK_MOCK_PREFIX=#{cmock[:mock_prefix]}"
354
-
355
- @loginator.lazy( Verbosity::DEBUG ) do
356
- "CMock configuration >> #{cmock}"
357
- end
231
+ debug { "CMock configuration >> #{config[:cmock]}" }
358
232
  end
359
233
 
360
234
 
361
235
  def populate_test_runner_generation_config(config)
362
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
363
- @reportinator.generate_progress( 'Populating test runner generation settings' )
364
- end
365
-
366
- use_backtrace = config[:project][:use_backtrace]
236
+ progress( 'Populating test runner generation settings' )
367
237
 
368
- # Force command line argument option for any backtrace option
369
- if use_backtrace != :none
370
- if config[:test_runner][:cmdline_args] == false
371
- config[:test_runner][:cmdline_args] = true
372
- @loginator.log( "Enabled :test_runner ↳ :cmdline_args because :project ↳ :use_backtrace is enabled.", Verbosity::COMPLAIN, LogLabels::NOTICE )
373
- end
374
- end
238
+ runner = config[:test_runner]
375
239
 
376
- # Copy CMock options used by test runner generation
377
- config[:test_runner][:mock_prefix] = config[:cmock][:mock_prefix]
378
- config[:test_runner][:mock_suffix] = config[:cmock][:mock_suffix]
379
- config[:test_runner][:enforce_strict_ordering] = config[:cmock][:enforce_strict_ordering]
240
+ # Backtraces rerun test cases by name, and command line filters select them, both
241
+ # through runner command line arguments
242
+ force_cmdline_args( runner, ':project ↳ :use_backtrace is enabled' ) if config[:project][:use_backtrace] != :none
243
+ force_cmdline_args( runner, 'command line test case filters are in use' ) if test_case_filters?
380
244
 
381
- # Merge Unity options used by test runner generation
382
- config[:test_runner][:defines] += config[:unity][:defines]
383
- config[:test_runner][:use_param_tests] = config[:unity][:use_param_tests]
245
+ copy_runner_options( config, runner )
384
246
 
385
- @runner_config = config[:test_runner]
247
+ @runner_config = runner
386
248
 
387
- @loginator.lazy( Verbosity::DEBUG ) do
388
- "Test Runner configuration >> #{config[:test_runner]}"
389
- end
249
+ debug { "Test Runner configuration >> #{runner}" }
390
250
  end
391
251
 
392
252
 
393
253
  def populate_exceptions_config(config)
394
254
  # Automagically set exception handling if CMock is configured for it
395
255
  if config[:cmock][:plugins] && config[:cmock][:plugins].include?(:cexception)
396
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
397
- @reportinator.generate_progress( 'Enabling CException use based on CMock plugins settings' )
398
- end
256
+ progress( 'Enabling CException use based on CMock plugins settings' )
399
257
 
400
258
  config[:project][:use_exceptions] = true
401
259
  end
402
260
 
403
- @loginator.lazy( Verbosity::DEBUG ) do
404
- "CException configuration >> #{config[:cexception]}"
405
- end
261
+ debug { "CException configuration >> #{config[:cexception]}" }
406
262
  end
407
263
 
408
264
 
@@ -420,120 +276,56 @@ class Configurator
420
276
  end
421
277
 
422
278
 
423
- # Process our tools
424
- # - :tools entries
425
- # - Insert missing names for
426
- # - Handle needed defaults
427
- # - Configure test runner from backtrace configuration
428
- def populate_tools_config(config)
429
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
430
- @reportinator.generate_progress( 'Populating tool definition settings and expanding any string replacements' )
431
- end
279
+ def get_unity_config
280
+ # Clone for the same reason as get_runner_config/get_cmock_config above.
281
+ return @unity_config.clone
282
+ end
432
283
 
433
- config[:tools].each_key do |name|
434
- tool = config[:tools][name]
435
284
 
436
- if not tool.is_a?(Hash)
437
- raise CeedlingException.new( "Expected configuration for tool :#{name} is a Hash but found #{tool.class}" )
438
- end
285
+ def get_partials_config
286
+ # Clone for the same reason as get_runner_config/get_cmock_config above.
287
+ return @partials_config.clone
288
+ end
439
289
 
440
- # Populate name if not given
441
- ToolExecutor.default_name!( tool, name.to_s )
442
290
 
443
- # Populate $stderr redirect option
444
- tool[:stderr_redirect] = StdErrRedirect::NONE if (tool[:stderr_redirect].nil?)
291
+ # Fills in each tool's missing name, $stderr redirect, and optional flag
292
+ def populate_tools_config(config)
293
+ progress( 'Populating tool definition settings and expanding any string replacements' )
445
294
 
446
- # Populate optional option to control verification of executable in search paths
447
- tool[:optional] = false if (tool[:optional].nil?)
448
- end
295
+ config[:tools].each { |name, tool| populate_tool( name, tool ) }
449
296
  end
450
297
 
451
298
 
452
- # Process any tool definition shortcuts
453
- # - Append extra arguments
454
- # - Redefine executable
299
+ # A tool definition shortcut, :tools_<name>, may redefine the tool's executable and add
300
+ # arguments to it
455
301
  #
456
302
  # :tools_<name>
457
303
  # :arguments: [...]
458
304
  # :executable: '...'
459
305
  def populate_tools_shortcuts(config)
460
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
461
- @reportinator.generate_progress( 'Processing tool definition shortcuts' )
462
- end
306
+ progress( 'Processing tool definition shortcuts' )
463
307
 
464
- prefix = 'tools_'
465
308
  config[:tools].each do |name, tool|
466
- # Lookup shortcut tool definition (:tools_<name>)
467
- shortcut = (prefix + name.to_s).to_sym
468
-
469
- # Try to lookup the executable from user config
470
- executable, _ = @config_walkinator.fetch_value(shortcut, :executable,
471
- hash:config
472
- )
473
-
474
- # Try to lookup arguments from user config
475
- args_to_add, _ = @config_walkinator.fetch_value(shortcut, :arguments,
476
- hash:config,
477
- default: []
478
- )
479
-
480
- # Redefine the tool config
481
- if !executable.nil?
482
- tool[:executable] = executable
483
- end
484
-
485
- # Add to the tool config
486
- if !args_to_add.empty?
487
- tool[:arguments].concat( args_to_add )
488
- end
309
+ executable, arguments = tool_shortcut( config, name )
310
+ next if executable.nil? and arguments.empty?
489
311
 
490
- # Log
491
- if !args_to_add.empty? or !executable.nil?
492
- @loginator.lazy( Verbosity::DEBUG ) do
493
- msg = " > #{name}\n"
312
+ tool[:executable] = executable unless executable.nil?
313
+ tool[:arguments].concat( arguments )
494
314
 
495
- if !executable.nil?
496
- msg += " executable: \"#{executable}\"\n"
497
- end
498
-
499
- if !args_to_add.empty?
500
- msg += " arguments: " + args_to_add.map{|arg| "\"#{arg}\""}.join( ', ' ) + "\n"
501
- end
502
-
503
- msg
504
- end
505
- end
315
+ debug { shortcut_message( name, executable, arguments ) }
506
316
  end
507
317
  end
508
318
 
509
319
 
510
320
  def discover_plugins(paths_hash, config)
511
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
512
- @reportinator.generate_progress( 'Discovering all plugins' )
513
- end
514
-
515
- # Rake-based plugins
516
- @rake_plugins = @configurator_plugins.find_rake_plugins( config, paths_hash )
517
- if !@configurator_plugins.rake_plugins.empty?
518
- @loginator.lazy( Verbosity::DEBUG ) do
519
- " > Rake plugins: " + @configurator_plugins.rake_plugins.map{|p| p[:plugin]}.join( ', ' )
520
- end
521
- end
321
+ progress( 'Discovering all plugins' )
522
322
 
523
- # Ruby `Plugin` subclass programmatic plugins
323
+ @rake_plugins = @configurator_plugins.find_rake_plugins( config, paths_hash )
524
324
  @programmatic_plugins = @configurator_plugins.find_programmatic_plugins( config, paths_hash )
525
- if !@configurator_plugins.programmatic_plugins.empty?
526
- @loginator.lazy( Verbosity::DEBUG ) do
527
- " > Programmatic plugins: " + @configurator_plugins.programmatic_plugins.map{|p| p[:plugin]}.join( ', ' )
528
- end
529
- end
530
-
531
- # Config plugins
532
- @configurator_plugins.find_config_plugins( config, paths_hash )
533
- if !@configurator_plugins.config_plugins.empty?
534
- @loginator.lazy( Verbosity::DEBUG ) do
535
- " > Config plugins: " + @configurator_plugins.config_plugins.map{|p| p[:plugin]}.join( ', ' )
536
- end
325
+ config_plugins = @configurator_plugins.find_config_plugins( config, paths_hash )
326
+
327
+ { 'Rake' => @rake_plugins, 'Programmatic' => @programmatic_plugins, 'Config' => config_plugins }.each do |kind, plugins|
328
+ debug { " > #{kind} plugins: " + plugins.map { |plugin| plugin[:plugin] }.join( ', ' ) } unless plugins.empty?
537
329
  end
538
330
  end
539
331
 
@@ -547,82 +339,27 @@ class Configurator
547
339
  end
548
340
 
549
341
 
342
+ # A plugin's configuration merges into the project's like a project file
550
343
  def merge_config_plugins(config)
551
- return if @configurator_plugins.config_plugins.empty?
552
-
553
- # Merge plugin configuration values (like Ceedling project file)
554
- @configurator_plugins.config_plugins.each do |hash|
555
- _config = begin
556
- @yaml_wrapper.load( hash[:path] )
557
- rescue YamlLoadException => e
558
- raise YamlLoadException.new(
559
- reason: e.reason, source: e.source, original_error: e.original_error,
560
- message: "Could not load configuration from plugin '#{hash[:plugin]}' ⏩️ #{e.message}"
561
- )
562
- end
344
+ @configurator_plugins.config_plugins.each do |plugin|
345
+ plugin_config = load_plugin_yaml( plugin[:path], "Could not load configuration from plugin '#{plugin[:plugin]}'" )
563
346
 
564
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
565
- @reportinator.generate_progress( "Merging configuration from plugin #{hash[:plugin]}" )
566
- end
567
- @loginator.lazy( Verbosity::DEBUG ) do
568
- _config.to_s
569
- end
570
-
571
- # Special handling for plugin paths
572
- if (_config.include?( :paths ))
573
- _config[:paths].update( _config[:paths] ) do |k,v|
574
- plugin_path = hash[:path].match( /(.*)[\/]config[\/]\w+\.yml/ )[1]
575
- v.map {|vv| File.expand_path( vv.gsub!( /\$PLUGIN_PATH/, plugin_path) ) }
576
- end
577
- end
347
+ progress( "Merging configuration from plugin #{plugin[:plugin]}" )
348
+ debug { plugin_config.to_s }
578
349
 
579
- config.deep_merge( _config )
350
+ resolve_plugin_paths( plugin_config, plugin[:path] )
351
+ config.deep_merge( plugin_config )
580
352
  end
581
353
  end
582
354
 
583
355
 
584
- # Process environment variables set in configuration file
585
- # (Each entry within the :environment array is a hash)
356
+ # Each :environment entry is a single-pair hash: a variable name and its value
586
357
  def eval_environment_variables(config)
587
358
  return if config[:environment].nil?
588
359
 
589
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
590
- @reportinator.generate_progress( 'Processing environment variables' )
591
- end
592
-
593
- config[:environment].each do |hash|
594
- key = hash.keys[0] # Get first (should be only) environment variable entry
595
- value = hash[key] # Get associated value
596
- items = []
597
-
598
- # Special case handling for :path environment variable entry
599
- # File::PATH_SEPARATOR => ':' (Unix-ish) or ';' (Windows)
600
- interstitial = ((key == :path) ? File::PATH_SEPARATOR : ' ')
601
-
602
- # Create an array container for the value of this entry
603
- # - If the value is an array, get it
604
- # - Otherwise, place value in a single item array
605
- items = ((value.class == Array) ? hash[key] : [value])
606
-
607
- # Process value array
608
- items.each do |item|
609
- # Process each item for Ruby string replacement
610
- if item.is_a? String
611
- item.replace( @ruby_expandinator.expand( item, source: ":environment ↳ #{key}" ) )
612
- end
613
- end
360
+ progress( 'Processing environment variables' )
614
361
 
615
- # Join any value items (become a flattened string)
616
- # - With path separator if the key was :path
617
- # - With space otherwise
618
- hash[key] = items.join( interstitial )
619
-
620
- # Set the environment variable for our session
621
- @system_wrapper.env_set( key.to_s.upcase, hash[key] )
622
- @loginator.lazy( Verbosity::DEBUG ) do
623
- " - #{key.to_s.upcase}: \"#{hash[key]}\""
624
- end
625
- end
362
+ config[:environment].each { |entry| eval_environment_variable( entry ) }
626
363
  end
627
364
 
628
365
 
@@ -630,24 +367,12 @@ class Configurator
630
367
  def eval_paths(config)
631
368
  # :plugins ↳ :load_paths already handled
632
369
 
633
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
634
- @reportinator.generate_progress( 'Processing path entries and expanding any string replacements' )
635
- end
370
+ progress( 'Processing path entries and expanding any string replacements' )
636
371
 
637
372
  eval_path_entries( config[:project][:build_root], source: ":project ↳ :build_root" )
638
373
  eval_path_entries( config[:release_build][:artifacts], source: ":release_build ↳ :artifacts" )
639
374
 
640
- config[:paths].each_pair do |entry, paths|
641
- # :paths sub-entries (e.g. :test) could be a single string -> make array
642
- reform_path_entries_as_lists( config[:paths], entry, paths )
643
- eval_path_entries( paths, source: ":paths ↳ #{entry}" )
644
- end
645
-
646
- config[:files].each_pair do |entry, files|
647
- # :files sub-entries (e.g. :test) could be a single string -> make array
648
- reform_path_entries_as_lists( config[:files], entry, files )
649
- eval_path_entries( files, source: ":files ↳ #{entry}" )
650
- end
375
+ [:paths, :files].each { |section| eval_path_section( config, section ) }
651
376
 
652
377
  # All other paths at secondary hash key level processed by convention (`_path`):
653
378
  # ex. :toplevel ↳ :foo_path & :toplevel ↳ :bar_paths are evaluated
@@ -657,9 +382,7 @@ class Configurator
657
382
 
658
383
  # Handle any Ruby string replacement for :flags string arrays
659
384
  def eval_flags(config)
660
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
661
- @reportinator.generate_progress( 'Expanding any string replacements in :flags entries' )
662
- end
385
+ progress( 'Expanding any string replacements in :flags entries' )
663
386
 
664
387
  # Descend down to array of command line flags strings regardless of depth in config block
665
388
  traverse_hash_eval_string_arrays( config[:flags], source: ":flags" )
@@ -668,9 +391,7 @@ class Configurator
668
391
 
669
392
  # Handle any Ruby string replacement for :defines string arrays
670
393
  def eval_defines(config)
671
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
672
- @reportinator.generate_progress( 'Expanding any string replacements in :defines entries' )
673
- end
394
+ progress( 'Expanding any string replacements in :defines entries' )
674
395
 
675
396
  # Descend down to array of #define strings regardless of depth in config block
676
397
  traverse_hash_eval_string_arrays( config[:defines], source: ":defines" )
@@ -678,93 +399,27 @@ class Configurator
678
399
 
679
400
 
680
401
  def standardize_paths(config)
681
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
682
- @reportinator.generate_progress( 'Standardizing all paths' )
683
- end
402
+ progress( 'Standardizing all paths' )
684
403
 
685
- # :project ↳ :build_root and :release_build ↳ :artifacts are individual paths
686
- # that don't follow the _path/_paths key convention — handle them explicitly.
687
- # :release_build may be absent in minimal configs; guard prevents NoMethodError.
688
- paths = [config[:project][:build_root]]
689
- if config[:release_build]
690
- paths << config[:release_build][:artifacts]
691
- else
692
- @loginator.log(
693
- ":release_build section absent from config ➡️ skipping :artifacts path standardization.",
694
- Verbosity::COMPLAIN,
695
- LogLabels::NOTICE
696
- )
697
- end
404
+ standalone_paths( config ).flatten.each { |path| FilePathUtils::standardize_in_place( path ) }
698
405
 
699
- paths.flatten.each { |path| FilePathUtils::standardize_in_place( path ) }
700
-
701
- config[:paths].each_pair do |collection, paths|
702
- # Flatten to handle single strings or nested arrays; reject nils (non-String passthrough
703
- # from standardize) and empty strings left after stripping whitespace-only entries.
704
- config[:paths][collection] = [paths].flatten
705
- .map { |path| FilePathUtils::standardize_in_place( path ) }
706
- .reject { |path| path.nil? || (path.is_a?( String ) && path.empty?) }
707
- end
708
-
709
- config[:files].each_pair do |collection, files|
710
- # Same sanitization as :paths — replace array to remove any nil or empty entries
711
- # produced by standardize on non-String or whitespace-only values.
712
- config[:files][collection] = [files].flatten
713
- .map { |path| FilePathUtils::standardize_in_place( path ) }
714
- .reject { |path| path.nil? || (path.is_a?( String ) && path.empty?) }
715
- end
406
+ [:paths, :files].each { |section| standardize_path_section( config[section] ) }
716
407
 
717
- config[:tools].each_pair { |_, config| FilePathUtils::standardize_in_place( config[:executable] ) if (config.include? :executable) }
408
+ config[:tools].each_value { |tool| FilePathUtils::standardize_in_place( tool[:executable] ) if tool.include?( :executable ) }
718
409
 
719
- # All other paths at secondary hash key level processed by convention (`_path`):
720
- # ex. :toplevel ↳ :foo_path & :toplevel ↳ :bar_paths are standardized
721
- config.each_pair do |_, child|
722
- collect_path_list( child ).each { |path| FilePathUtils::standardize_in_place( path ) }
723
- end
410
+ standardize_convention_paths( config )
724
411
  end
725
412
 
726
413
 
414
+ # Every validation runs, so every problem is reported, before configuration fails
727
415
  def validate_essential(config)
728
- # Collect all infractions, everybody on probation until final adjudication
729
- blotter = true
730
-
731
- blotter &= @configurator_setup.validate_required_sections( config )
732
- blotter &= @configurator_setup.validate_required_section_values( config )
733
-
734
- # Configuration sections can reference environment variables that are evaluated early on.
735
- # So, we validate :environment early as an essential section.
736
- blotter &= @configurator_setup.validate_environment_vars( config )
737
-
738
- if !blotter
739
- raise CeedlingException.new("Ceedling configuration failed validation")
740
- end
416
+ fail_unless_valid( ESSENTIAL_VALIDATIONS.map { |validation| @configurator_setup.public_send( validation, config ) } )
741
417
  end
742
418
 
743
419
 
744
- def validate_final(config, app_cfg)
745
- # Collect all infractions, everybody on probation until final adjudication
746
- blotter = true
747
- blotter &= @configurator_setup.validate_paths( config )
748
- blotter &= @configurator_setup.validate_tools( config )
749
- blotter &= @configurator_setup.validate_test_runner_generation(
750
- config,
751
- app_cfg[:include_test_case],
752
- app_cfg[:exclude_test_case]
753
- )
754
- blotter &= @configurator_setup.validate_defines( config )
755
- blotter &= @configurator_setup.validate_flags( config )
756
- blotter &= @configurator_setup.validate_test_preprocessor( config )
757
- blotter &= @configurator_setup.validate_backtrace( config )
758
- blotter &= @configurator_setup.validate_threads( config )
759
- blotter &= @configurator_setup.validate_partials( config )
760
- blotter &= @configurator_setup.validate_plugins( config )
761
-
762
- # Informational notices
763
- @configurator_setup.warnings_for_problematic_configs( config )
764
-
765
- if !blotter
766
- raise CeedlingException.new( "Ceedling configuration failed validation" )
767
- end
420
+ # Every validation runs, so every problem is reported, before configuration fails
421
+ def validate_final(config)
422
+ fail_unless_valid( FINAL_VALIDATIONS.map { |validation| @configurator_setup.public_send( validation, config ) } )
768
423
  end
769
424
 
770
425
 
@@ -773,29 +428,22 @@ class Configurator
773
428
  flattened_config = @configurator_builder.flattenify( config )
774
429
 
775
430
  @configurator_setup.build_project_config( ceedling_lib_path, logging_path, flattened_config )
776
-
777
431
  @configurator_setup.build_directory_structure( flattened_config )
778
432
 
779
433
  # Copy Unity, CMock, CException into vendor directory within build directory
780
434
  @configurator_setup.vendor_frameworks_and_support_files( ceedling_lib_path, flattened_config )
781
-
782
435
  @configurator_setup.build_project_collections( flattened_config )
783
436
 
784
437
  @project_config_hash = flattened_config.clone
785
-
786
- @configurator_setup.build_constants_and_accessors( flattened_config, binding() )
438
+ @configurator_setup.build_constants_and_accessors( flattened_config, self )
787
439
 
788
440
  # Top-level keys disappear when we flatten, so create global constants & accessors to any specified keys
789
- keys.each do |key|
790
- hash = { key => config[key] }
791
- @configurator_setup.build_constants_and_accessors( hash, binding() )
792
- end
441
+ build_section_constants( config, keys )
793
442
  end
794
443
 
795
444
 
796
445
  def redefine_element(elem, value)
797
- # Ensure elem is a symbol
798
- elem = elem.to_sym if elem.class != Symbol
446
+ elem = elem.to_sym
799
447
 
800
448
  # Ensure element already exists
801
449
  if not @project_config_hash.include?(elem)
@@ -823,21 +471,16 @@ class Configurator
823
471
  @project_config_hash.deep_merge!( config_more_flattened )
824
472
 
825
473
  # create more constants and accessors
826
- @configurator_setup.build_constants_and_accessors(config_more_flattened, binding())
474
+ @configurator_setup.build_constants_and_accessors(config_more_flattened, self)
827
475
 
828
476
  # recreate constants & update accessors with new merged, base values
829
- config_more.keys.each do |key|
830
- hash = { key => config_base[key] }
831
- @configurator_setup.build_constants_and_accessors(hash, binding())
832
- end
477
+ build_section_constants( config_base, config_more.keys )
833
478
  end
834
479
 
835
480
 
836
481
  def insert_rake_plugins(plugins)
837
482
  plugins.each do |hash|
838
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
839
- @reportinator.generate_progress( "Adding plugin #{hash[:plugin]} to Rake load list" )
840
- end
483
+ progress( "Adding plugin #{hash[:plugin]} to Rake load list" )
841
484
 
842
485
  @project_config_hash[:project_rakefile_component_files] << hash[:path]
843
486
  end
@@ -847,36 +490,230 @@ class Configurator
847
490
 
848
491
  private
849
492
 
850
- def reform_path_entries_as_lists( container, entry, value )
851
- container[entry] = [value] if value.kind_of?( String )
493
+ def progress(message)
494
+ @loginator.lazy( Verbosity::OBNOXIOUS ) { @reportinator.generate_progress( message ) }
852
495
  end
853
496
 
497
+ def debug(&message)
498
+ @loginator.lazy( Verbosity::DEBUG, &message )
499
+ end
854
500
 
855
- def collect_path_list( container )
856
- paths = []
501
+ def fail_unless_valid(results)
502
+ raise CeedlingException.new( "Ceedling configuration failed validation" ) unless results.all?
503
+ end
857
504
 
858
- if (container.class == Hash)
859
- container.each_key do |key|
860
- paths << container[key] if (key.to_s =~ /_path(s)?$/)
861
- end
505
+ def log_notice(message)
506
+ @loginator.log( message, Verbosity::COMPLAIN, LogLabels::NOTICE )
507
+ end
508
+
509
+ # Probes the configured C preprocessor with the Unity header, which is always available,
510
+ # self-contained, and needs no include paths
511
+ def directives_only_supported?(config, tool_executor)
512
+ probe_tool = {
513
+ executable: config[:tools][:test_file_directives_only_preprocessor][:executable],
514
+ name: 'directives_only_probe',
515
+ arguments: DIRECTIVES_ONLY_PROBE_ARGUMENTS
516
+ }
517
+ command = tool_executor.build_command_line( probe_tool, [], File.join( CEEDLING_VENDOR, UNITY_LIB_PATH, UNITY_H_FILE ) )
518
+
519
+ # A failed probe means no support, so it must not raise
520
+ command[:options][:boom] = false
521
+ results = tool_executor.exec( command )
522
+
523
+ # Clang and some older GCC emit a warning (not an error) when -fdirectives-only is unsupported
524
+ return !(results[:output].match?( /warning[^\n]+-fdirectives-only/ ) || tool_executor.failed?( results ))
525
+ end
526
+
527
+ # config[:project] is guaranteed to exist / validated to exist but may not include the
528
+ # settings read here. config[:test_build] and config[:release_build] are optional.
529
+ def needed_tools_defaults(config)
530
+ release = setting( config, :project, :release_build )
531
+
532
+ return [
533
+ [DEFAULT_TOOLS_TEST, true],
534
+ [DEFAULT_TOOLS_TEST_PREPROCESSORS, setting( config, :project, :use_test_preprocessor ) != :none],
535
+ [DEFAULT_TOOLS_TEST_ASSEMBLER, setting( config, :test_build, :use_assembly )],
536
+ [DEFAULT_TOOLS_TEST_GDB_BACKTRACE, setting( config, :project, :use_backtrace ) == :gdb],
537
+ [DEFAULT_TOOLS_RELEASE, release],
538
+ [DEFAULT_TOOLS_RELEASE_ASSEMBLER, release && setting( config, :release_build, :use_assembly )]
539
+ ].select { |_, needed| needed }.map( &:first )
540
+ end
541
+
542
+ # A setting from the configuration, or Ceedling's default when the configuration lacks it
543
+ def setting(config, *keys)
544
+ value, _ = @config_walkinator.fetch_value( *keys, hash:config, default: DEFAULT_CEEDLING_PROJECT_CONFIG.dig( *keys ) )
545
+ return value
546
+ end
547
+
548
+ # Loads a plugin's YAML, naming the plugin in any failure
549
+ def load_plugin_yaml(path, failure)
550
+ return @yaml_wrapper.load( path )
551
+ rescue YamlLoadException => e
552
+ raise YamlLoadException.new(
553
+ reason: e.reason, source: e.source, original_error: e.original_error,
554
+ message: "#{failure} ⏩️ #{e.message}"
555
+ )
556
+ end
557
+
558
+ def merge_plugin_defaults(kind, defaults_by_plugin, default_config)
559
+ return if defaults_by_plugin.empty?
560
+
561
+ progress( "Collecting Plugin #{kind} defaults" )
562
+
563
+ defaults_by_plugin.each do |plugin, defaults|
564
+ debug { " - #{plugin} >> #{defaults}" }
565
+ default_config.deep_merge( defaults )
862
566
  end
863
-
864
- return paths.flatten()
865
567
  end
866
568
 
569
+ def prepare_cmock_config(cmock)
570
+ # Plugins housekeeping
571
+ cmock[:plugins].map! { |plugin| plugin.to_sym() }.uniq!
867
572
 
868
- def eval_path_entries( container, source: )
869
- paths = []
573
+ include_unity_helpers( cmock )
870
574
 
871
- case(container)
872
- when Array then paths = Array.new( container ).flatten()
873
- when String then paths << container
874
- else
875
- return
575
+ # Add mocking prefix symbol for all test compilation
576
+ cmock[:defines] << "CMOCK_MOCK_PREFIX=#{cmock[:mock_prefix]}"
577
+ end
578
+
579
+ # A Unity helper path may be a single string. Each helper's header is included in every mock.
580
+ def include_unity_helpers(cmock)
581
+ cmock[:unity_helper_path] = [cmock[:unity_helper_path]] if cmock[:unity_helper_path].is_a?( String )
582
+ cmock[:includes].concat( cmock[:unity_helper_path].map { |path| File.basename( path ) } ).uniq!
583
+ end
584
+
585
+ def copy_runner_options(config, runner)
586
+ RUNNER_CMOCK_OPTIONS.each { |option| runner[option] = config[:cmock][option] }
587
+ RUNNER_UNITY_OPTIONS.each { |option| runner[option] = config[:unity][option] }
588
+ runner[:defines] += config[:unity][:defines]
589
+ end
590
+
591
+ def force_cmdline_args(runner, reason)
592
+ return unless runner[:cmdline_args] == false
593
+
594
+ runner[:cmdline_args] = true
595
+ log_notice( "Enabled :test_runner ↳ :cmdline_args because #{reason}." )
596
+ end
597
+
598
+ def test_case_filters?
599
+ return !(@include_test_case.to_s.empty? && @exclude_test_case.to_s.empty?)
600
+ end
601
+
602
+ def populate_tool(name, tool)
603
+ raise CeedlingException.new( "Expected configuration for tool :#{name} is a Hash but found #{tool.class}" ) unless tool.is_a?( Hash )
604
+
605
+ # Populate name if not given
606
+ ToolExecutor.default_name!( tool, name.to_s )
607
+
608
+ # Populate $stderr redirect option
609
+ tool[:stderr_redirect] = StdErrRedirect::NONE if (tool[:stderr_redirect].nil?)
610
+
611
+ # Populate optional option to control verification of executable in search paths
612
+ tool[:optional] = false if (tool[:optional].nil?)
613
+ end
614
+
615
+ # The executable and arguments a tool's :tools_<name> shortcut gives, if any
616
+ def tool_shortcut(config, name)
617
+ shortcut = :"tools_#{name}"
618
+
619
+ executable, _ = @config_walkinator.fetch_value( shortcut, :executable, hash:config )
620
+ arguments, _ = @config_walkinator.fetch_value( shortcut, :arguments, hash:config, default: [] )
621
+
622
+ return executable, arguments
623
+ end
624
+
625
+ def shortcut_message(name, executable, arguments)
626
+ message = " > #{name}\n"
627
+ message += " executable: \"#{executable}\"\n" unless executable.nil?
628
+ message += " arguments: " + arguments.map { |arg| "\"#{arg}\"" }.join( ', ' ) + "\n" unless arguments.empty?
629
+ return message
630
+ end
631
+
632
+ # A plugin's :paths entries are expanded. $PLUGIN_PATH in one names the plugin's own directory.
633
+ def resolve_plugin_paths(plugin_config, plugin_config_path)
634
+ return unless plugin_config.include?( :paths )
635
+
636
+ plugin_path = plugin_config_path.match( /(.*)[\/]config[\/]\w+\.yml/ )[1]
637
+ plugin_config[:paths].transform_values! do |paths|
638
+ paths.map { |path| File.expand_path( path.gsub( /\$PLUGIN_PATH/, plugin_path ) ) }
876
639
  end
640
+ end
641
+
642
+ # The value, a string or list of strings, is expanded and joined into one string. A PATH
643
+ # list, however its name is written, joins with the platform path separator, ':' or ';',
644
+ # and any other list with spaces. The variable is set in the environment by its name upcased.
645
+ def eval_environment_variable(entry)
646
+ name, value = entry.first
647
+ items = expand_environment_items( name, value.is_a?( Array ) ? value : [value] )
648
+ entry[name] = items.join( name.to_s.casecmp?( 'path' ) ? File::PATH_SEPARATOR : ' ' )
649
+
650
+ @system_wrapper.env_set( name.to_s.upcase, entry[name] )
651
+ debug { " - #{name.to_s.upcase}: \"#{entry[name]}\"" }
652
+ end
877
653
 
654
+ def expand_environment_items(name, items)
655
+ items.each { |item| item.replace( @ruby_expandinator.expand( item, source: ":environment ↳ #{name}" ) ) if item.is_a?( String ) }
656
+ end
657
+
658
+ def eval_path_section(config, section)
659
+ config[section].each_pair do |entry, paths|
660
+ # Sub-entries (e.g. :test) could be a single string -> make array
661
+ reform_path_entries_as_lists( config[section], entry, paths )
662
+ eval_path_entries( paths, source: ":#{section} ↳ #{entry}" )
663
+ end
664
+ end
665
+
666
+ # :project ↳ :build_root and :release_build ↳ :artifacts are individual paths that don't
667
+ # follow the _path/_paths key convention. :release_build may be absent in minimal configs.
668
+ def standalone_paths(config)
669
+ return [ config[:project][:build_root], config[:release_build][:artifacts] ] if config[:release_build]
670
+
671
+ log_notice( ":release_build section absent from config ➡️ skipping :artifacts path standardization." )
672
+ return [ config[:project][:build_root] ]
673
+ end
674
+
675
+ # Each entry becomes a list, without the nil or empty entries standardizing leaves of a
676
+ # non-String or whitespace-only value
677
+ def standardize_path_section(section)
678
+ section.transform_values! do |paths|
679
+ [paths].flatten
680
+ .map { |path| FilePathUtils::standardize_in_place( path ) }
681
+ .reject { |path| path.nil? || (path.is_a?( String ) && path.empty?) }
682
+ end
683
+ end
684
+
685
+ # All other paths at secondary hash key level processed by convention (`_path`):
686
+ # ex. :toplevel ↳ :foo_path & :toplevel ↳ :bar_paths are standardized
687
+ def standardize_convention_paths(config)
688
+ config.each_value { |child| collect_path_list( child ).each { |path| FilePathUtils::standardize_in_place( path ) } }
689
+ end
690
+
691
+ def build_section_constants(config, keys)
692
+ keys.each { |key| @configurator_setup.build_constants_and_accessors( { key => config[key] }, self ) }
693
+ end
694
+
695
+ def reform_path_entries_as_lists( container, entry, value )
696
+ container[entry] = [value] if value.is_a?( String )
697
+ end
698
+
699
+
700
+ def collect_path_list( container )
701
+ return [] unless container.is_a?( Hash )
702
+
703
+ return container.select { |key, _| key.to_s =~ /_path(s)?$/ }.values.flatten
704
+ end
705
+
706
+
707
+ def eval_path_entries( container, source: )
708
+ paths = case container
709
+ when Array then container.flatten
710
+ when String then [container]
711
+ else []
712
+ end
713
+
714
+ # An unset path setting has nothing to expand
878
715
  paths.each do |path|
879
- path.replace( @ruby_expandinator.expand( path, source: source ) )
716
+ path.replace( @ruby_expandinator.expand( path, source: source ) ) if path.is_a?( String )
880
717
  end
881
718
  end
882
719
 
@@ -902,4 +739,3 @@ class Configurator
902
739
  end
903
740
 
904
741
  end
905
-