ceedling 1.1.9 → 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 (1130) 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 +53 -30
  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 +337 -37
  138. data/docs/KnownIssues.md +39 -4
  139. data/docs/ReleaseNotes.md +288 -12
  140. data/docs/SECURITY.md +86 -4
  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 +202 -75
  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 +93 -25
  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 +218 -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 +272 -117
  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 -415
  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 +261 -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 +297 -16
  426. data/site-local/plugins/gcov/examples.html +251 -14
  427. data/site-local/plugins/gcov/gcovr.html +686 -31
  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 +563 -28
  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/site-local/snapshot/assets/{project.yml → 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 +366 -77
  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 +474 -36
  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 -285
  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 -50
  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 -412
  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 -140
  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/assets/project.yml +0 -404
  997. data/docs/mkdocs/snapshot/examples/cipher_quest/README.md +0 -210
  998. data/docs/mkdocs/snapshot/examples/temp_sensor/README.md +0 -283
  999. data/docs/mkdocs/snapshot/examples/wondrous_forest/README.md +0 -92
  1000. data/docs/mkdocs/snapshot/plugins/gcov/config/defaults.yml +0 -32
  1001. data/docs/mkdocs/snapshot/plugins/gcov/config/defaults_gcov.rb +0 -136
  1002. data/docs/mkdocs/snapshot.yml +0 -20
  1003. data/docs/mkdocs/testing-guide/build-directives.md +0 -153
  1004. data/docs/mkdocs/testing-guide/conventions.md +0 -616
  1005. data/docs/mkdocs/testing-guide/frameworks.md +0 -192
  1006. data/docs/mkdocs/testing-guide/index.md +0 -80
  1007. data/docs/mkdocs/testing-guide/partials/configuration.md +0 -67
  1008. data/docs/mkdocs/testing-guide/partials/conventions.md +0 -68
  1009. data/docs/mkdocs/testing-guide/partials/directives.md +0 -212
  1010. data/docs/mkdocs/testing-guide/partials/example.md +0 -149
  1011. data/docs/mkdocs/testing-guide/partials/index.md +0 -88
  1012. data/docs/mkdocs/testing-guide/partials/overview.md +0 -81
  1013. data/docs/mkdocs/testing-guide/partials/variables.md +0 -244
  1014. data/docs/mkdocs/testing-guide/test-cases.md +0 -194
  1015. data/docs/mkdocs/testing-guide/test-sample.md +0 -94
  1016. data/docs/mkdocs/testing-guide/test-suite-anatomy.md +0 -58
  1017. data/lib/ceedling/cacheinator.rb +0 -53
  1018. data/lib/ceedling/cacheinator_helper.rb +0 -60
  1019. data/lib/ceedling/dependinator.rb +0 -31
  1020. data/lib/ceedling/makefile.rb +0 -52
  1021. data/lib/ceedling/release_invoker.rb +0 -112
  1022. data/lib/ceedling/rules_release.rake +0 -109
  1023. data/lib/ceedling/rules_tests.rake +0 -40
  1024. data/lib/ceedling/tasks_release.rake +0 -36
  1025. data/plugins/fff/vendor/fff/Makefile +0 -10
  1026. data/plugins/fff/vendor/fff/buildandtest +0 -15
  1027. data/plugins/fff/vendor/fff/examples/Makefile +0 -7
  1028. data/plugins/fff/vendor/fff/examples/driver_testing/Makefile +0 -64
  1029. data/plugins/fff/vendor/fff/examples/driver_testing/driver.c +0 -32
  1030. data/plugins/fff/vendor/fff/examples/driver_testing/driver.h +0 -21
  1031. data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.cpp +0 -58
  1032. data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.fff.cpp +0 -70
  1033. data/plugins/fff/vendor/fff/examples/driver_testing/hardware_abstraction.h +0 -25
  1034. data/plugins/fff/vendor/fff/examples/driver_testing/registers.h +0 -23
  1035. data/plugins/fff/vendor/fff/examples/embedded_ui/DISPLAY.h +0 -27
  1036. data/plugins/fff/vendor/fff/examples/embedded_ui/Kata.txt +0 -25
  1037. data/plugins/fff/vendor/fff/examples/embedded_ui/Makefile +0 -67
  1038. data/plugins/fff/vendor/fff/examples/embedded_ui/SYSTEM.h +0 -31
  1039. data/plugins/fff/vendor/fff/examples/embedded_ui/UI.c +0 -56
  1040. data/plugins/fff/vendor/fff/examples/embedded_ui/UI.h +0 -22
  1041. data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_ansic.c +0 -191
  1042. data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_cpp.cpp +0 -144
  1043. data/plugins/fff/vendor/fff/examples/embedded_ui/test_suite_template.c +0 -42
  1044. data/plugins/fff/vendor/fff/gtest/Makefile +0 -22
  1045. data/plugins/fff/vendor/fff/gtest/gtest-all.cc +0 -9118
  1046. data/plugins/fff/vendor/fff/gtest/gtest-main.cc +0 -6
  1047. data/plugins/fff/vendor/fff/gtest/gtest.h +0 -19547
  1048. data/plugins/fff/vendor/fff/test/Makefile +0 -81
  1049. data/plugins/fff/vendor/fff/test/c_test_framework.h +0 -25
  1050. data/plugins/fff/vendor/fff/test/fff_test_c.c +0 -116
  1051. data/plugins/fff/vendor/fff/test/fff_test_cpp.cpp +0 -53
  1052. data/plugins/fff/vendor/fff/test/fff_test_global_c.c +0 -84
  1053. data/plugins/fff/vendor/fff/test/fff_test_global_cpp.cpp +0 -31
  1054. data/plugins/fff/vendor/fff/test/global_fakes.c +0 -21
  1055. data/plugins/fff/vendor/fff/test/global_fakes.h +0 -47
  1056. data/plugins/fff/vendor/fff/test/test_cases.include +0 -276
  1057. data/plugins/report_tests_gtestlike_stdout/assets/template.erb +0 -83
  1058. data/spec/units/configurator_spec.rb +0 -232
  1059. /data/assets/{ceedling → features/ceedling} +0 -0
  1060. /data/assets/{ceedling.cmd → features/ceedling.cmd} +0 -0
  1061. /data/assets/{default_gitignore → features/default_gitignore} +0 -0
  1062. /data/assets/{broken_uncovered_file.c → fixtures/broken_uncovered_file.c} +0 -0
  1063. /data/assets/{example_file.c → fixtures/example_file.c} +0 -0
  1064. /data/assets/{example_file.h → fixtures/example_file.h} +0 -0
  1065. /data/assets/{example_file_call.c → fixtures/example_file_call.c} +0 -0
  1066. /data/assets/{example_file_call.h → fixtures/example_file_call.h} +0 -0
  1067. /data/assets/{example_file_with_statics.c → fixtures/example_file_with_statics.c} +0 -0
  1068. /data/assets/{example_file_with_stdio.c → fixtures/example_file_with_stdio.c} +0 -0
  1069. /data/assets/{example_file_with_stdio.h → fixtures/example_file_with_stdio.h} +0 -0
  1070. /data/assets/{fake_crash_test_fixture.rb → fixtures/fake_crash_test_fixture.rb} +0 -0
  1071. /data/assets/{partial_all_module.h → fixtures/partial_all_module.h} +0 -0
  1072. /data/assets/{run_with_ubsan.rb → fixtures/run_with_ubsan.rb} +0 -0
  1073. /data/assets/{same_dir_pairing_module.c → fixtures/same_dir_pairing_module.c} +0 -0
  1074. /data/assets/{same_dir_pairing_module.h → fixtures/same_dir_pairing_module.h} +0 -0
  1075. /data/assets/{same_dir_pairing_module_func.h → fixtures/same_dir_pairing_module_func.h} +0 -0
  1076. /data/assets/{same_dir_pairing_other.c → fixtures/same_dir_pairing_other.c} +0 -0
  1077. /data/assets/{same_dir_pairing_other.h → fixtures/same_dir_pairing_other.h} +0 -0
  1078. /data/assets/{test_example_file.c → fixtures/test_example_file.c} +0 -0
  1079. /data/assets/{test_example_file_2.c → fixtures/test_example_file_2.c} +0 -0
  1080. /data/assets/{test_example_file_source_include.c → fixtures/test_example_file_source_include.c} +0 -0
  1081. /data/assets/{test_example_file_success.c → fixtures/test_example_file_success.c} +0 -0
  1082. /data/assets/{test_example_file_unity_printf.c → fixtures/test_example_file_unity_printf.c} +0 -0
  1083. /data/assets/{test_example_file_verbose.c → fixtures/test_example_file_verbose.c} +0 -0
  1084. /data/assets/{test_example_file_with_mock.c → fixtures/test_example_file_with_mock.c} +0 -0
  1085. /data/assets/{test_example_file_with_stdio.c → fixtures/test_example_file_with_stdio.c} +0 -0
  1086. /data/assets/{test_example_with_parameterized_tests.c → fixtures/test_example_with_parameterized_tests.c} +0 -0
  1087. /data/assets/{test_partial_all_module.c → fixtures/test_partial_all_module.c} +0 -0
  1088. /data/assets/{test_same_dir_pairing.c → fixtures/test_same_dir_pairing.c} +0 -0
  1089. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_config.h +0 -0
  1090. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_extra.h +0 -0
  1091. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/local_flag_extra.h +0 -0
  1092. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_extra.h +0 -0
  1093. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_wrapper.h +0 -0
  1094. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/project_flag_extra.h +0 -0
  1095. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.h +0 -0
  1096. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.c +0 -0
  1097. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.h +0 -0
  1098. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.c +0 -0
  1099. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.h +0 -0
  1100. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware.c +0 -0
  1101. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware_special.c +0 -0
  1102. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.c +0 -0
  1103. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.h +0 -0
  1104. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder.c +0 -0
  1105. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder_partial.c +0 -0
  1106. /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/conditional_module.h +0 -0
  1107. /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/optional_dep.h +0 -0
  1108. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.c +0 -0
  1109. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.h +0 -0
  1110. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.c +0 -0
  1111. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.h +0 -0
  1112. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.c +0 -0
  1113. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.h +0 -0
  1114. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_blanks.c +0 -0
  1115. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_counter.c +0 -0
  1116. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_decorators.c +0 -0
  1117. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.c +0 -0
  1118. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.h +0 -0
  1119. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.c +0 -0
  1120. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.h +0 -0
  1121. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.c +0 -0
  1122. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.h +0 -0
  1123. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorA.h +0 -0
  1124. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorB.h +0 -0
  1125. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorC.h +0 -0
  1126. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareA.c +0 -0
  1127. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareB.c +0 -0
  1128. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareC.c +0 -0
  1129. /data/assets/{uncovered_example_file.c → fixtures/uncovered_example_file.c} +0 -0
  1130. /data/plugins/bullseye/assets/{template.erb → coverage.template} +0 -0
@@ -0,0 +1,889 @@
1
+ # =========================================================================
2
+ # Ceedling - Test-Centered Build System for C
3
+ # ThrowTheSwitch.org
4
+ # Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
5
+ # SPDX-License-Identifier: MIT
6
+ # =========================================================================
7
+
8
+ # How a Partial's generated headers compose, and whether a compiler accepts them.
9
+ #
10
+ # Every example here states the behavior Ceedling should have. Several fail against the
11
+ # current implementation, which is the point: issue #1319 reports that the generated types
12
+ # header is not self-contained, and issue #1293 reports that it must nonetheless appear
13
+ # early. The two requirements conflict, and the failures below mark exactly where.
14
+ #
15
+ # Generation runs through the helpers in
16
+ # spec/support/integration/partials_generation_integration_helper.rb rather than a
17
+ # `ceedling test:` build. See that file for why, and for what is real versus doubled.
18
+ #
19
+ # A case states its own include lists because includes reach the partializer from the
20
+ # preprocessor stage rather than from the extractor. Varying that order is how the
21
+ # ordering question becomes testable.
22
+ #
23
+ # Every case's C is preprocessed before extraction, the way the real pipeline does it. That
24
+ # rules whole classes of suspicion out: conditional compilation is already resolved by real
25
+ # GCC, comments are gone, and a module's file holds only its own lines. What remains is what
26
+ # survives that treatment -- which is the only thing worth asserting about.
27
+
28
+ require 'spec_helper'
29
+ require 'spec_integration_helper'
30
+ require 'partials_generation_integration_helper'
31
+
32
+ describe 'Partial header composition' do
33
+
34
+ # Compiling is the whole point, so a missing compiler must not read as a pass. These cases
35
+ # also assume accurate preprocessing: fallback resolves strictly less, and what it cannot
36
+ # resolve is the fallback spec's subject rather than a failure here.
37
+ include_context 'requires gcc'
38
+ before { skip 'directives-only preprocessing is unavailable' unless directives_only_supported? }
39
+
40
+ after(:each) { cleanup_partial( @result ) }
41
+
42
+ # A header declaring a type Ceedling knows nothing about. Standing in for the
43
+ # reporters' common.h and Types.h.
44
+ FOUNDATION_H = <<~C
45
+ #ifndef FOUNDATION_H
46
+ #define FOUNDATION_H
47
+ typedef signed short S16;
48
+ typedef unsigned char U8;
49
+ typedef struct { int id; } Event_t;
50
+ #endif
51
+ C
52
+
53
+ # ---------------------------------------------------------------------------
54
+ context 'a types header that references types from elsewhere' do
55
+ # ---------------------------------------------------------------------------
56
+
57
+ # Issue #1319, first reporter. Types live in the module header and reference types
58
+ # from a header the source includes after the module's own header.
59
+ it 'compiles when the module header is included before its dependency' do
60
+ @result = generate_partial(
61
+ module_name: 'lm75b',
62
+ header: <<~C,
63
+ #ifndef LM75B_H
64
+ #define LM75B_H
65
+ typedef struct {
66
+ S16 os_over_temperature_deci_c;
67
+ U8 pin_state;
68
+ } lm75b_config_t;
69
+ void lm75b_init(void);
70
+ #endif
71
+ C
72
+ source: "#include <string.h>\n#include \"lm75b.h\"\n#include \"foundation.h\"\n",
73
+ source_includes: ['<string.h>', 'lm75b.h', 'foundation.h'],
74
+ extra: { 'foundation.h' => FOUNDATION_H }
75
+ )
76
+
77
+ compile = compile_partial( @result )
78
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
79
+ end
80
+
81
+ # Issue #1319, second reporter. The type lives in the source file instead, and
82
+ # references a type from a header that source includes.
83
+ it 'compiles when the type is declared in the source file' do
84
+ @result = generate_partial(
85
+ module_name: 'eventqueue',
86
+ header: "#ifndef EVENTQUEUE_H\n#define EVENTQUEUE_H\nvoid eventqueue_push(void);\n#endif\n",
87
+ source: <<~C,
88
+ #include "eventqueue.h"
89
+ #include "foundation.h"
90
+ typedef struct {
91
+ Event_t test_event;
92
+ } MyStruct_t;
93
+ C
94
+ source_includes: ['eventqueue.h', 'foundation.h'],
95
+ extra: { 'foundation.h' => FOUNDATION_H }
96
+ )
97
+
98
+ compile = compile_partial( @result )
99
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
100
+ end
101
+
102
+ # The order that happens to work today, kept so a fix is not mistaken for having
103
+ # changed this case.
104
+ it 'compiles when the dependency is included before the module header' do
105
+ @result = generate_partial(
106
+ module_name: 'lm75b',
107
+ header: "#ifndef LM75B_H\n#define LM75B_H\ntypedef struct { S16 temp; } lm75b_t;\n#endif\n",
108
+ source: "#include \"foundation.h\"\n#include \"lm75b.h\"\n",
109
+ source_includes: ['foundation.h', 'lm75b.h'],
110
+ extra: { 'foundation.h' => FOUNDATION_H }
111
+ )
112
+
113
+ compile = compile_partial( @result )
114
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
115
+ end
116
+
117
+ # The property underneath both reports. A header that cannot be compiled on its own
118
+ # is a liability wherever it is placed.
119
+ it 'is self-contained, compiling with nothing included before it' do
120
+ @result = generate_partial(
121
+ module_name: 'lm75b',
122
+ header: "#ifndef LM75B_H\n#define LM75B_H\ntypedef struct { S16 temp; } lm75b_t;\n#endif\n",
123
+ source: "#include \"foundation.h\"\n#include \"lm75b.h\"\n",
124
+ source_includes: ['foundation.h', 'lm75b.h'],
125
+ extra: { 'foundation.h' => FOUNDATION_H }
126
+ )
127
+
128
+ compile = compile_types_header_alone( @result )
129
+ expect( compile.ok ).to be(true), "expected the types header to stand alone, got: #{compile.first_error}"
130
+ end
131
+
132
+ it 'carries the includes its own types depend on' do
133
+ @result = generate_partial(
134
+ module_name: 'lm75b',
135
+ header: "#ifndef LM75B_H\n#define LM75B_H\ntypedef struct { S16 temp; } lm75b_t;\n#endif\n",
136
+ source: "#include \"foundation.h\"\n#include \"lm75b.h\"\n",
137
+ source_includes: ['foundation.h', 'lm75b.h'],
138
+ extra: { 'foundation.h' => FOUNDATION_H }
139
+ )
140
+
141
+ expect( @result.types_h_includes.join( "\n" ) ).to include('foundation.h')
142
+ end
143
+ end
144
+
145
+ # ---------------------------------------------------------------------------
146
+ context 'a types header alongside transitive re-inclusion' do
147
+ # ---------------------------------------------------------------------------
148
+
149
+ # Issue #1293. A later header reaches the real module header, which would declare the
150
+ # same type a second time. The generated header's guard-spoofing #define has to land
151
+ # first for that to be suppressed.
152
+ it 'compiles when a later header transitively re-includes the real module header' do
153
+ @result = generate_partial(
154
+ module_name: 'alertmanager',
155
+ header: <<~C,
156
+ #ifndef ALERTMANAGER_H
157
+ #define ALERTMANAGER_H
158
+ typedef struct { int severity; } AlertEntry_t;
159
+ #endif
160
+ C
161
+ source: "#include \"alertmanager.h\"\n#include \"facade.h\"\n",
162
+ source_includes: ['alertmanager.h', 'facade.h'],
163
+ extra: {
164
+ 'facade.h' => "#ifndef FACADE_H\n#define FACADE_H\n#include \"alertmanager.h\"\n#endif\n"
165
+ }
166
+ )
167
+
168
+ compile = compile_partial( @result )
169
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
170
+ end
171
+
172
+ it 'emits the guard-spoofing define before anything it must suppress' do
173
+ @result = generate_partial(
174
+ module_name: 'alertmanager',
175
+ header: "#ifndef ALERTMANAGER_H\n#define ALERTMANAGER_H\ntypedef struct { int severity; } AlertEntry_t;\n#endif\n",
176
+ source: "#include \"alertmanager.h\"\n#include \"facade.h\"\n",
177
+ source_includes: ['alertmanager.h', 'facade.h'],
178
+ extra: { 'facade.h' => "#ifndef FACADE_H\n#define FACADE_H\n#include \"alertmanager.h\"\n#endif\n" }
179
+ )
180
+
181
+ body = @result.types_h.to_s
182
+ spoof = body.index( '#define ALERTMANAGER_H' )
183
+ first_include = body.index( '#include' )
184
+
185
+ expect( spoof ).not_to be_nil, 'no guard-spoofing define was emitted at all'
186
+ expect( spoof ).to be < (first_include || body.length)
187
+ end
188
+
189
+ # Both requirements at once, which is the case neither issue covers alone. The
190
+ # module's types need a foreign header, and a later header re-includes the real
191
+ # module header.
192
+ it 'compiles when it must be both self-contained and early' do
193
+ @result = generate_partial(
194
+ module_name: 'alertmanager',
195
+ header: <<~C,
196
+ #ifndef ALERTMANAGER_H
197
+ #define ALERTMANAGER_H
198
+ typedef struct { S16 level; } AlertEntry_t;
199
+ #endif
200
+ C
201
+ source: "#include \"alertmanager.h\"\n#include \"facade.h\"\n#include \"foundation.h\"\n",
202
+ source_includes: ['alertmanager.h', 'facade.h', 'foundation.h'],
203
+ extra: {
204
+ 'foundation.h' => FOUNDATION_H,
205
+ 'facade.h' => "#ifndef FACADE_H\n#define FACADE_H\n#include \"alertmanager.h\"\n#endif\n"
206
+ }
207
+ )
208
+
209
+ compile = compile_partial( @result )
210
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
211
+ end
212
+ end
213
+
214
+ # ---------------------------------------------------------------------------
215
+ context 'macros the types depend on' do
216
+ # ---------------------------------------------------------------------------
217
+
218
+ it 'resolves an array size macro defined in the module header' do
219
+ @result = generate_partial(
220
+ module_name: 'queue',
221
+ header: <<~C,
222
+ #ifndef QUEUE_H
223
+ #define QUEUE_H
224
+ #define QUEUE_CAPACITY (16u)
225
+ typedef struct { int slots[QUEUE_CAPACITY]; } queue_t;
226
+ #endif
227
+ C
228
+ source: "#include \"queue.h\"\n",
229
+ source_includes: ['queue.h']
230
+ )
231
+
232
+ compile = compile_partial( @result )
233
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
234
+ end
235
+
236
+ # Preprocessing preserves macro directives rather than expanding invocations, and keeps
237
+ # only the lines belonging to the module. A macro defined in another header therefore
238
+ # survives as an unexpanded name with its #define left behind, which is the same shape
239
+ # as #1319 with a macro in the place of a type.
240
+ it 'resolves an array size macro defined in another header' do
241
+ @result = generate_partial(
242
+ module_name: 'ring',
243
+ header: <<~C,
244
+ #ifndef RING_H
245
+ #define RING_H
246
+ #include "limits_cfg.h"
247
+ typedef struct { int slot[RING_DEPTH]; } ring_t;
248
+ #endif
249
+ C
250
+ source: "#include \"ring.h\"\n",
251
+ header_includes: ['limits_cfg.h'],
252
+ source_includes: ['ring.h'],
253
+ extra: { 'limits_cfg.h' => "#ifndef LIMITS_CFG_H\n#define LIMITS_CFG_H\n#define RING_DEPTH 8\n#endif\n" }
254
+ )
255
+
256
+ compile = compile_partial( @result )
257
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
258
+ end
259
+
260
+ # The same gap reached through the module's own header rather than the source, which is
261
+ # where a self-contained module header puts its dependency.
262
+ it 'resolves a type named by a header the module header includes' do
263
+ @result = generate_partial(
264
+ module_name: 'stage',
265
+ header: <<~C,
266
+ #ifndef STAGE_H
267
+ #define STAGE_H
268
+ #include "modes.h"
269
+ typedef struct { stage_mode_t mode; } stage_t;
270
+ #endif
271
+ C
272
+ source: "#include \"stage.h\"\n",
273
+ header_includes: ['modes.h'],
274
+ source_includes: ['stage.h'],
275
+ extra: { 'modes.h' => "#ifndef MODES_H\n#define MODES_H\ntypedef enum { IDLE, RUN } stage_mode_t;\n#endif\n" }
276
+ )
277
+
278
+ compile = compile_partial( @result )
279
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
280
+ end
281
+ end
282
+
283
+ # ---------------------------------------------------------------------------
284
+ context 'shapes that already work' do
285
+ # ---------------------------------------------------------------------------
286
+
287
+ it 'writes no types header for a module defining no types' do
288
+ @result = generate_partial(
289
+ module_name: 'plain',
290
+ header: "#ifndef PLAIN_H\n#define PLAIN_H\nvoid plain_go(void);\n#endif\n",
291
+ source: "#include \"plain.h\"\nstatic int helper(void) { return 1; }\n",
292
+ source_includes: ['plain.h']
293
+ )
294
+
295
+ expect( @result.types_h ).to be_nil
296
+ end
297
+
298
+ it 'compiles a type that depends on nothing outside the module' do
299
+ @result = generate_partial(
300
+ module_name: 'standalone',
301
+ header: "#ifndef STANDALONE_H\n#define STANDALONE_H\ntypedef struct { int a; } standalone_t;\n#endif\n",
302
+ source: "#include \"standalone.h\"\n",
303
+ source_includes: ['standalone.h']
304
+ )
305
+
306
+ compile = compile_partial( @result )
307
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
308
+ end
309
+
310
+ it 'compiles a non-typedef aggregate definition' do
311
+ @result = generate_partial(
312
+ module_name: 'tagged',
313
+ header: "#ifndef TAGGED_H\n#define TAGGED_H\nstruct tagged { int a; };\n#endif\n",
314
+ source: "#include \"tagged.h\"\n",
315
+ source_includes: ['tagged.h']
316
+ )
317
+
318
+ compile = compile_partial( @result )
319
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
320
+ end
321
+
322
+ it 'replaces the module header rather than leaving both' do
323
+ @result = generate_partial(
324
+ module_name: 'widget',
325
+ header: "#ifndef WIDGET_H\n#define WIDGET_H\ntypedef struct { int a; } widget_t;\n#endif\n",
326
+ source: "#include \"base.h\"\n#include \"widget.h\"\n",
327
+ source_includes: ['base.h', 'widget.h'],
328
+ extra: { 'base.h' => "#ifndef BASE_H\n#define BASE_H\n#endif\n" }
329
+ )
330
+
331
+ expect( @result.impl_h_includes.join( "\n" ) ).not_to include('"widget.h"')
332
+ expect( @result.impl_h_index( 'ceedling_partial_widget_types.h' ) ).not_to be_nil
333
+ end
334
+
335
+ # Preprocessing settles a conditional before extraction sees anything, so only the
336
+ # selected arm reaches the types header. Kept so that stays true.
337
+ it 'carries only the selected arm of a conditionally defined type' do
338
+ @result = generate_partial(
339
+ module_name: 'cond',
340
+ header: "#ifndef COND_H\n#define COND_H\n#if USE_WIDE\ntypedef unsigned long counter_t;\n#else\ntypedef unsigned char counter_t;\n#endif\n#endif\n",
341
+ source: "#include \"cond.h\"\nstatic counter_t count;\n",
342
+ source_includes: ['cond.h']
343
+ )
344
+
345
+ expect( @result.types_h.to_s ).to include('typedef unsigned char counter_t;')
346
+ expect( @result.types_h.to_s ).not_to include('unsigned long')
347
+ end
348
+ end
349
+
350
+ # ---------------------------------------------------------------------------
351
+ context 'the mockable interface header' do
352
+ # ---------------------------------------------------------------------------
353
+
354
+ # CMock mocks the generated interface header in place of the real module header, so that
355
+ # file carries the same extracted types the implementation header does. A module tested
356
+ # and mocked in one test file puts both in a single translation unit, which is the whole
357
+ # reason the types live in a third file.
358
+
359
+ it 'carries the types header at the module header-s own list position' do
360
+ @result = generate_partial(
361
+ module_name: 'valve',
362
+ header: "#ifndef VALVE_H\n#define VALVE_H\ntypedef struct { int port; } valve_t;\n#endif\n",
363
+ source: "#include \"base.h\"\n#include \"valve.h\"\n#include \"trailer.h\"\n",
364
+ source_includes: ['base.h', 'valve.h', 'trailer.h'],
365
+ extra: {
366
+ 'base.h' => "#ifndef BASE_H\n#define BASE_H\n#endif\n",
367
+ 'trailer.h' => "#ifndef TRAILER_H\n#define TRAILER_H\n#endif\n"
368
+ }
369
+ )
370
+
371
+ expect( @result.interface_h_index( 'base.h' ) ).to eq(0)
372
+ expect( @result.interface_h_index( 'ceedling_partial_valve_types.h' ) ).to eq(1)
373
+ expect( @result.interface_h_index( 'trailer.h' ) ).to eq(2)
374
+ end
375
+
376
+ it 'omits the module-s own header' do
377
+ @result = generate_partial(
378
+ module_name: 'valve',
379
+ header: "#ifndef VALVE_H\n#define VALVE_H\ntypedef struct { int port; } valve_t;\n#endif\n",
380
+ source: "#include \"valve.h\"\n",
381
+ source_includes: ['valve.h']
382
+ )
383
+
384
+ expect( @result.interface_h_includes.join( "\n" ) ).not_to include('"valve.h"')
385
+ end
386
+
387
+ # The interface header declares; it must not define. A type definition reaching it would
388
+ # be the second copy in the translation unit the implementation header already serves.
389
+ it 'declares functions without restating the extracted types' do
390
+ @result = generate_partial(
391
+ module_name: 'valve',
392
+ header: <<~C,
393
+ #ifndef VALVE_H
394
+ #define VALVE_H
395
+ typedef struct { int port; } valve_t;
396
+ void valve_open(valve_t* v);
397
+ #endif
398
+ C
399
+ source: "#include \"valve.h\"\nvoid valve_open(valve_t* v) { (void)v; }\n",
400
+ source_includes: ['valve.h']
401
+ )
402
+
403
+ expect( @result.interface_h ).to include('void valve_open(valve_t* v);')
404
+ expect( @result.type_names( :interface_h ) ).not_to include('valve_t')
405
+ expect( @result.type_names( :types_h ) ).to include('valve_t')
406
+ end
407
+
408
+ end
409
+
410
+ # ---------------------------------------------------------------------------
411
+ context 'names that resemble other names' do
412
+ # ---------------------------------------------------------------------------
413
+
414
+ # Matching a module to an include, or a guard to a macro, means comparing names. GH #1266
415
+ # was exactly this going wrong: a macro whose name merely contained the include guard as a
416
+ # substring was wrongly rejected. These cases hold the line on each comparison that
417
+ # Partial generation performs.
418
+
419
+ it 'replaces only the module-s own header, not a header whose name extends it' do
420
+ @result = generate_partial(
421
+ module_name: 'foo',
422
+ header: "#ifndef FOO_H\n#define FOO_H\ntypedef int foo_t;\n#endif\n",
423
+ source: "#include \"foobar.h\"\n#include \"foo.h\"\n#include \"myfoo.h\"\n",
424
+ source_includes: ['foobar.h', 'foo.h', 'myfoo.h'],
425
+ extra: {
426
+ 'foobar.h' => "#ifndef FOOBAR_H\n#define FOOBAR_H\n#endif\n",
427
+ 'myfoo.h' => "#ifndef MYFOO_H\n#define MYFOO_H\n#endif\n"
428
+ }
429
+ )
430
+
431
+ includes = @result.impl_h_includes.join( "\n" )
432
+ expect( includes ).to include('"foobar.h"')
433
+ expect( includes ).to include('"myfoo.h"')
434
+ expect( includes ).not_to include('"foo.h"')
435
+ expect( @result.impl_h_index( 'ceedling_partial_foo_types.h' ) ).to eq(1)
436
+ end
437
+
438
+ it 'drops another partialized module without touching a near-named header' do
439
+ @result = generate_partial(
440
+ module_name: 'foo',
441
+ header: "#ifndef FOO_H\n#define FOO_H\ntypedef int foo_t;\n#endif\n",
442
+ source: "#include \"foo.h\"\n#include \"bar.h\"\n#include \"barn.h\"\n",
443
+ source_includes: ['foo.h', 'bar.h', 'barn.h'],
444
+ partials: other_partial( 'bar' ),
445
+ extra: {
446
+ 'bar.h' => "#ifndef BAR_H\n#define BAR_H\n#endif\n",
447
+ 'barn.h' => "#ifndef BARN_H\n#define BARN_H\n#endif\n"
448
+ }
449
+ )
450
+
451
+ includes = @result.impl_h_includes.join( "\n" )
452
+ expect( includes ).not_to include('"bar.h"')
453
+ expect( includes ).to include('"barn.h"')
454
+ end
455
+
456
+ it 'carries a macro whose name extends the include guard' do
457
+ @result = generate_partial(
458
+ module_name: 'gated',
459
+ header: <<~C,
460
+ #ifndef GATED_H
461
+ #define GATED_H
462
+ #define GATED_H_LIMIT 8
463
+ typedef struct { int slots[GATED_H_LIMIT]; } gated_t;
464
+ #endif
465
+ C
466
+ source: "#include \"gated.h\"\n",
467
+ source_includes: ['gated.h']
468
+ )
469
+
470
+ expect( @result.defines( :types_h ) ).to include('GATED_H_LIMIT')
471
+
472
+ compile = compile_partial( @result )
473
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
474
+ end
475
+
476
+ it 'keeps two types whose names share a prefix' do
477
+ @result = generate_partial(
478
+ module_name: 'kin',
479
+ header: <<~C,
480
+ #ifndef KIN_H
481
+ #define KIN_H
482
+ typedef int kin_t;
483
+ typedef struct { kin_t id; } kin_type_t;
484
+ typedef struct { kin_type_t inner; } kin_type_wrapper_t;
485
+ #endif
486
+ C
487
+ source: "#include \"kin.h\"\n",
488
+ source_includes: ['kin.h']
489
+ )
490
+
491
+ expect( @result.type_names( :types_h ) ).to include('kin_t', 'kin_type_t', 'kin_type_wrapper_t')
492
+
493
+ compile = compile_partial( @result )
494
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
495
+ end
496
+ end
497
+
498
+ # ---------------------------------------------------------------------------
499
+ context 'a system header among the includes' do
500
+ # ---------------------------------------------------------------------------
501
+
502
+ # The first reporter's list opens with <string.h>, and the types header landed
503
+ # immediately after it. Kept as its own case because a system header is the one
504
+ # include that can never supply a project type.
505
+ it 'compiles with a system header ahead of the module header' do
506
+ @result = generate_partial(
507
+ module_name: 'lm75b',
508
+ header: "#ifndef LM75B_H\n#define LM75B_H\ntypedef struct { U8 pin; } lm75b_t;\n#endif\n",
509
+ source: "#include <string.h>\n#include \"lm75b.h\"\n#include \"foundation.h\"\n",
510
+ source_includes: ['<string.h>', 'lm75b.h', 'foundation.h'],
511
+ extra: { 'foundation.h' => FOUNDATION_H }
512
+ )
513
+
514
+ compile = compile_partial( @result )
515
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
516
+ end
517
+
518
+ # Issue #1352. The module header's <stdint.h> returns at the header's line 3, the same
519
+ # number as the source's second #define.
520
+ it 'keeps adjacent source macros apart when a header line number matches' do
521
+ @result = generate_partial(
522
+ module_name: 'repro',
523
+ header: "#ifndef REPRO_H\n#define REPRO_H\n#include <stdint.h>\nuint32_t repro_sum(void);\n#endif\n",
524
+ source: "#include \"repro.h\"\n#define REPRO_FIRST (1U)\n#define REPRO_SECOND (2U)\n",
525
+ header_includes: ['<stdint.h>'],
526
+ source_includes: ['repro.h']
527
+ )
528
+
529
+ expect( @result.defines( :impl_h ) ).to include('REPRO_FIRST', 'REPRO_SECOND')
530
+ expect( @result.impl_h.lines.grep(/#\s*define.*#\s*define/) ).to be_empty
531
+ end
532
+ end
533
+
534
+ # ---------------------------------------------------------------------------
535
+ context 'what reconstitution leaves for extraction to read' do
536
+ # ---------------------------------------------------------------------------
537
+
538
+ # The reason an extracted type can name something no generated file declares. Preprocessing
539
+ # follows every include, then keeps only the lines belonging to the module's own file, so a
540
+ # type arriving from a dependency is discarded while a type *referring* to one survives. Every
541
+ # other case in this file is a consequence of that, and nothing else asserts it directly.
542
+ it 'keeps the module-s own lines and discards what its headers declared' do
543
+ @result = generate_partial(
544
+ module_name: 'lm75b',
545
+ header: "#ifndef LM75B_H\n#define LM75B_H\n#include \"foundation.h\"\ntypedef struct { S16 temp; } lm75b_t;\n#endif\n",
546
+ source: "#include \"lm75b.h\"\n",
547
+ header_includes: ['foundation.h'],
548
+ source_includes: ['lm75b.h'],
549
+ extra: { 'foundation.h' => FOUNDATION_H }
550
+ )
551
+
552
+ # The module's own type survives, naming a type it no longer carries the definition of.
553
+ expect( @result.pp_header ).to include('typedef struct { S16 temp; } lm75b_t;')
554
+ expect( @result.pp_header ).not_to include('typedef signed short S16;')
555
+
556
+ # The source file holds nothing of the header it included.
557
+ expect( @result.pp_source ).not_to include('lm75b_t')
558
+ end
559
+ end
560
+
561
+ # ---------------------------------------------------------------------------
562
+ context 'the deliberate guard-spoof' do
563
+ # ---------------------------------------------------------------------------
564
+
565
+ # Today the spoof is an accident: the real header's own #define happens to precede the
566
+ # first type definition and is carried along with the other macros. Nothing guarantees it
567
+ # appears, and nothing guarantees it lands before a carried include. Both have to be
568
+ # deliberate once the types header carries includes of its own, because a carried header
569
+ # can transitively reach the real module header -- #1293, one level down.
570
+
571
+ it 'emits the real header-s guard on purpose' do
572
+ @result = generate_partial( **spoofed_module )
573
+
574
+ expect( @result.defines( :types_h ) ).to include('SPOOFED_H')
575
+ end
576
+
577
+ it 'emits the spoof ahead of every carried include' do
578
+ @result = generate_partial( **spoofed_module )
579
+
580
+ spoof = @result.define_index( :types_h, 'SPOOFED_H' )
581
+ first_include = @result.line_index( :types_h, /^\s*#include/ )
582
+
583
+ expect( spoof ).not_to be_nil
584
+ expect( first_include ).not_to be_nil
585
+ expect( spoof ).to be < first_include
586
+ end
587
+
588
+ # A module defining no types gets no types header, so the spoof has nowhere to ride. The
589
+ # implementation and interface headers have to carry it themselves, or suppression depends
590
+ # on a module happening to declare a type.
591
+ it 'emits the spoof even when the module defines no types' do
592
+ @result = generate_partial(
593
+ module_name: 'plainly',
594
+ header: "#ifndef PLAINLY_H\n#define PLAINLY_H\nvoid plainly_go(void);\n#endif\n",
595
+ source: "#include \"plainly.h\"\nvoid plainly_go(void) {}\n",
596
+ source_includes: ['plainly.h']
597
+ )
598
+
599
+ expect( @result.types_h ).to be_nil
600
+ expect( @result.defines( :impl_h ) ).to include('PLAINLY_H')
601
+ expect( @result.defines( :interface_h ) ).to include('PLAINLY_H')
602
+ end
603
+
604
+ # Fallback preprocessing deliberately excludes the include guard from the macros it
605
+ # recovers, so the carried spoof is absent there entirely. Reading the guard from the
606
+ # original header rather than from a carried macro is what closes that gap.
607
+ it 'emits the spoof under fallback preprocessing too' do
608
+ @result = generate_partial( mode: :fallback, **spoofed_module )
609
+
610
+ expect( @result.defines( :types_h ) ).to include('SPOOFED_H')
611
+ end
612
+ end
613
+
614
+ # ---------------------------------------------------------------------------
615
+ context 'a types header carrying its own dependencies' do
616
+ # ---------------------------------------------------------------------------
617
+
618
+ it 'carries a dependency the module header reaches' do
619
+ @result = generate_partial(
620
+ module_name: 'ring',
621
+ header: "#ifndef RING_H\n#define RING_H\n#include \"limits_cfg.h\"\ntypedef struct { int slot[RING_DEPTH]; } ring_t;\n#endif\n",
622
+ source: "#include \"ring.h\"\n",
623
+ header_includes: ['limits_cfg.h'],
624
+ source_includes: ['ring.h'],
625
+ extra: { 'limits_cfg.h' => "#ifndef LIMITS_CFG_H\n#define LIMITS_CFG_H\n#define RING_DEPTH 8\n#endif\n" }
626
+ )
627
+
628
+ expect( @result.types_h_includes.join( "\n" ) ).to include('limits_cfg.h')
629
+ end
630
+
631
+ # The types header replaces the module's own header, so carrying that header back in would
632
+ # defeat the spoof the same file emits.
633
+ it 'never carries the module-s own header' do
634
+ @result = generate_partial( **spoofed_module )
635
+
636
+ expect( @result.types_h_includes.join( "\n" ) ).not_to include('"spoofed.h"')
637
+ end
638
+
639
+ # A dependency that is itself partialized and mocked must arrive as that module's generated
640
+ # interface header, which carries its types. Pulling in the real header instead would put
641
+ # the very content the other Partial replaced back into the translation unit.
642
+ it 'redirects a mocked partialized dependency to its interface header' do
643
+ @result = generate_partial(
644
+ module_name: 'host',
645
+ header: "#ifndef HOST_H\n#define HOST_H\n#include \"guest.h\"\ntypedef struct { guest_handle_t h; } host_t;\n#endif\n",
646
+ source: "#include \"host.h\"\n",
647
+ header_includes: ['guest.h'],
648
+ source_includes: ['host.h'],
649
+ partials: other_partial( 'guest', mocked: true ),
650
+ extra: { 'guest.h' => "#ifndef GUEST_H\n#define GUEST_H\ntypedef int guest_handle_t;\n#endif\n" }
651
+ )
652
+
653
+ carried = @result.types_h_includes.join( "\n" )
654
+ expect( carried ).to include('ceedling_partial_guest_interface.h')
655
+ expect( carried ).not_to include('"guest.h"')
656
+ end
657
+
658
+ it 'drops a partialized dependency that is not mocked' do
659
+ @result = generate_partial(
660
+ module_name: 'host',
661
+ header: "#ifndef HOST_H\n#define HOST_H\n#include \"guest.h\"\ntypedef struct { int n; } host_t;\n#endif\n",
662
+ source: "#include \"host.h\"\n",
663
+ header_includes: ['guest.h'],
664
+ source_includes: ['host.h'],
665
+ partials: other_partial( 'guest' ),
666
+ extra: { 'guest.h' => "#ifndef GUEST_H\n#define GUEST_H\n#endif\n" }
667
+ )
668
+
669
+ carried = @result.types_h_includes.join( "\n" )
670
+ expect( carried ).not_to include('"guest.h"')
671
+ expect( carried ).not_to include('ceedling_partial_guest_interface.h')
672
+ end
673
+ end
674
+
675
+ # ---------------------------------------------------------------------------
676
+ context 'compositions of several mechanisms at once' do
677
+ # ---------------------------------------------------------------------------
678
+
679
+ # The minimal cases isolate one mechanism each. These prove the mechanisms compose, which
680
+ # is the shape a real embedded project actually presents.
681
+
682
+ it 'resolves several interdependent types spread across header and source' do
683
+ @result = generate_partial(
684
+ module_name: 'telemetry',
685
+ header: <<~C,
686
+ #ifndef TELEMETRY_H
687
+ #define TELEMETRY_H
688
+ #include "units.h"
689
+ #include "clock.h"
690
+ #define FRAME_SLOTS 6
691
+ typedef struct { celsius_t reading; tick_t at; } sample_t;
692
+ typedef struct { sample_t slots[FRAME_SLOTS]; } frame_t;
693
+ #endif
694
+ C
695
+ source: <<~C,
696
+ #include "telemetry.h"
697
+ #include "status.h"
698
+ typedef struct { frame_t frame; status_t status; } report_t;
699
+ static report_t latest;
700
+ C
701
+ header_includes: ['units.h', 'clock.h'],
702
+ source_includes: ['telemetry.h', 'status.h'],
703
+ extra: {
704
+ 'units.h' => "#ifndef UNITS_H\n#define UNITS_H\ntypedef short celsius_t;\n#endif\n",
705
+ 'clock.h' => "#ifndef CLOCK_H\n#define CLOCK_H\ntypedef unsigned long tick_t;\n#endif\n",
706
+ 'status.h' => "#ifndef STATUS_H\n#define STATUS_H\ntypedef enum { OK, BAD } status_t;\n#endif\n"
707
+ }
708
+ )
709
+
710
+ expect( @result.type_names( :types_h ) ).to include('sample_t', 'frame_t', 'report_t')
711
+
712
+ compile = compile_partial( @result )
713
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
714
+
715
+ standalone = compile_types_header_alone( @result )
716
+ expect( standalone.ok ).to be(true), "expected the types header to stand alone, got: #{standalone.first_error}"
717
+ end
718
+
719
+ # A dependency three levels down still has to be reachable, because the carried include is
720
+ # the one the module names rather than the one that ultimately declares the type.
721
+ it 'resolves a type declared three headers deep' do
722
+ @result = generate_partial(
723
+ module_name: 'deep',
724
+ header: "#ifndef DEEP_H\n#define DEEP_H\n#include \"level1.h\"\ntypedef struct { leaf_t leaf; } deep_t;\n#endif\n",
725
+ source: "#include \"deep.h\"\n",
726
+ header_includes: ['level1.h'],
727
+ source_includes: ['deep.h'],
728
+ extra: {
729
+ 'level1.h' => "#ifndef LEVEL1_H\n#define LEVEL1_H\n#include \"level2.h\"\n#endif\n",
730
+ 'level2.h' => "#ifndef LEVEL2_H\n#define LEVEL2_H\n#include \"level3.h\"\n#endif\n",
731
+ 'level3.h' => "#ifndef LEVEL3_H\n#define LEVEL3_H\ntypedef int leaf_t;\n#endif\n"
732
+ }
733
+ )
734
+
735
+ standalone = compile_types_header_alone( @result )
736
+ expect( standalone.ok ).to be(true), "expected the types header to stand alone, got: #{standalone.first_error}"
737
+ end
738
+
739
+ # Self-containment and the #1293 defence at once: the types header must carry a dependency
740
+ # and still suppress the real module header a facade reaches transitively.
741
+ it 'is self-contained while still suppressing a transitive re-inclusion' do
742
+ @result = generate_partial(
743
+ module_name: 'alertmanager',
744
+ header: <<~C,
745
+ #ifndef ALERTMANAGER_H
746
+ #define ALERTMANAGER_H
747
+ #include "foundation.h"
748
+ typedef struct { S16 severity; } AlertEntry_t;
749
+ #endif
750
+ C
751
+ source: "#include \"alertmanager.h\"\n#include \"facade.h\"\n",
752
+ header_includes: ['foundation.h'],
753
+ source_includes: ['alertmanager.h', 'facade.h'],
754
+ extra: {
755
+ 'foundation.h' => FOUNDATION_H,
756
+ 'facade.h' => "#ifndef FACADE_H\n#define FACADE_H\n#include \"alertmanager.h\"\n#endif\n"
757
+ }
758
+ )
759
+
760
+ compile = compile_partial( @result )
761
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
762
+
763
+ standalone = compile_types_header_alone( @result )
764
+ expect( standalone.ok ).to be(true), "expected the types header to stand alone, got: #{standalone.first_error}"
765
+ end
766
+ end
767
+
768
+ # A guarded module with one dependency, used by the spoof cases that vary only by mode.
769
+ def spoofed_module
770
+ {
771
+ module_name: 'spoofed',
772
+ header: <<~C,
773
+ #ifndef SPOOFED_H
774
+ #define SPOOFED_H
775
+ #include "foundation.h"
776
+ typedef struct { S16 level; } spoofed_t;
777
+ #endif
778
+ C
779
+ source: "#include \"spoofed.h\"\n",
780
+ header_includes: ['foundation.h'],
781
+ source_includes: ['spoofed.h'],
782
+ extra: { 'foundation.h' => FOUNDATION_H }
783
+ }
784
+ end
785
+
786
+ # ---------------------------------------------------------------------------
787
+ context 'C shapes the extraction model does not yet carry' do
788
+ # ---------------------------------------------------------------------------
789
+
790
+ # Neither reported issue covers these, and none involves include ordering. Each survives
791
+ # preprocessing, so each is extraction's own to answer. They share an origin with #1319
792
+ # all the same: content is moved out of a module into generated files, and what travels
793
+ # with it is decided by category rather than by what the relocated code actually needs.
794
+ #
795
+ # Each is marked pending against its own follow-on work. RSpec fails an example that
796
+ # passes while pending, so every one of these is a live tripwire: the day extraction
797
+ # learns the shape, the suite says so rather than staying quiet.
798
+
799
+ # Preprocessing for Partials preserves macro directives rather than expanding them, so an
800
+ # invocation reaches extraction intact. A bare invocation is then routed to the generated
801
+ # source alone, since it may expand to a function definition that must exist in exactly
802
+ # one object. A macro that expands to a typedef needs the opposite treatment, and the
803
+ # container-generating macros in sys/queue.h and in hand-rolled X-macro tables are
804
+ # exactly that shape.
805
+ it 'declares a type created by a macro invocation' do
806
+ pending 'a macro expanding to a typedef needs expansion to recognize -- follow-on work'
807
+
808
+ @result = generate_partial(
809
+ module_name: 'roster',
810
+ header: "#ifndef ROSTER_H\n#define ROSTER_H\n#define DECLARE_LIST(T) typedef struct { T* head; } T##_list_t;\nDECLARE_LIST(int)\n#endif\n",
811
+ source: "#include \"roster.h\"\nstatic int_list_t active;\n",
812
+ source_includes: ['roster.h']
813
+ )
814
+
815
+ compile = compile_partial( @result )
816
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
817
+ end
818
+
819
+ # An aggregate carrying a declarator is not a standalone type definition, so it reaches
820
+ # the variable extractor whole. Re-emitting it as both an extern and a definition states
821
+ # an anonymous struct twice, and C treats two anonymous structs as unrelated types.
822
+ it 'keeps one type for an aggregate defined inline on a variable' do
823
+ pending 'an aggregate carrying a declarator is classified as a variable -- follow-on work'
824
+
825
+ @result = generate_partial(
826
+ module_name: 'slotted',
827
+ header: "#ifndef SLOTTED_H\n#define SLOTTED_H\n#endif\n",
828
+ source: "#include \"slotted.h\"\nstatic struct { int depth; } slot;\n",
829
+ source_includes: ['slotted.h']
830
+ )
831
+
832
+ compile = compile_partial( @result, prelude: "#include \"ceedling_partial_slotted_impl.c\"\n" )
833
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
834
+ end
835
+
836
+ # A tag-only forward declaration has no declarator, and reaching the variable extractor
837
+ # turns it into `extern struct node;`. That is an empty declaration with a storage class,
838
+ # which is a diagnostic in its own right and an error under -Werror.
839
+ it 'preserves a forward declaration as a forward declaration' do
840
+ pending 'a tag-only forward declaration is classified as a variable -- follow-on work'
841
+
842
+ @result = generate_partial(
843
+ module_name: 'fwd',
844
+ header: "#ifndef FWD_H\n#define FWD_H\nstruct node;\ntypedef struct node* node_ref_t;\n#endif\n",
845
+ source: "#include \"fwd.h\"\nstruct node { int value; };\nstatic node_ref_t head;\n",
846
+ source_includes: ['fwd.h']
847
+ )
848
+
849
+ expect( @result.impl_h.to_s ).not_to include('extern struct node;')
850
+ end
851
+
852
+ # Directives-only preprocessing passes both #define and #undef through, and extraction
853
+ # keeps only #define. A macro the module deliberately scoped to a few lines therefore
854
+ # becomes visible everywhere the generated headers reach, the test file included.
855
+ it 'does not leak a macro the module undefines' do
856
+ pending 'extraction keeps #define and discards #undef -- follow-on work'
857
+
858
+ @result = generate_partial(
859
+ module_name: 'scoped',
860
+ header: "#ifndef SCOPED_H\n#define SCOPED_H\n#define DEPTH 4\ntypedef int window_t[DEPTH];\n#undef DEPTH\n#endif\n",
861
+ source: "#include \"scoped.h\"\nstatic window_t recent;\n",
862
+ source_includes: ['scoped.h']
863
+ )
864
+
865
+ expect( @result.types_h.to_s ).not_to include('#define DEPTH')
866
+ expect( @result.impl_h.to_s ).not_to include('#define DEPTH')
867
+ end
868
+
869
+ # The guard-spoof is the real header's own #define, which survives preprocessing and is
870
+ # carried only because it precedes the first type definition. A header guarded by
871
+ # #pragma once contributes no #define at all -- the pragma does not survive reconstitution
872
+ # either -- so the only macro available to carry is the synthetic guard on the
873
+ # reconstituted file, which suppresses nothing real. #1293's duplicates return.
874
+ it 'suppresses a real header guarded by #pragma once' do
875
+ pending '#pragma once offers no macro to spoof -- its own follow-on PR'
876
+
877
+ @result = generate_partial(
878
+ module_name: 'onced',
879
+ header: "#pragma once\ntypedef struct { int x; } onced_t;\n",
880
+ source: "#include \"onced.h\"\nstatic onced_t state;\n",
881
+ source_includes: ['onced.h']
882
+ )
883
+
884
+ compile = compile_partial( @result, prelude: "#include \"onced.h\"\n" )
885
+ expect( compile.ok ).to be(true), "expected a clean compile, got: #{compile.first_error}"
886
+ end
887
+ end
888
+
889
+ end