ceedling 1.1.10 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +3 -0
- data/.simplecov +73 -0
- data/GIT_COMMIT_SHA +1 -1
- data/Gemfile +84 -8
- data/Gemfile.lock +38 -8
- data/README.md +51 -29
- data/Rakefile +768 -16
- data/assets/{project.yml → features/project.yml} +4 -1
- data/assets/fixtures/bullseye_branch_coverage/src/branchy.c +24 -0
- data/assets/fixtures/bullseye_branch_coverage/src/branchy.h +14 -0
- data/assets/fixtures/bullseye_branch_coverage/test/test_branchy.c +18 -0
- data/assets/fixtures/cppcheck_findings/findings.c +23 -0
- data/assets/fixtures/cppcheck_findings/findings.h +13 -0
- data/assets/fixtures/header_include_path_validation/alt_drivers/foo.h +6 -0
- data/assets/fixtures/header_include_path_validation/bar.h +6 -0
- data/assets/fixtures/header_include_path_validation/drivers/foo.h +6 -0
- data/assets/fixtures/header_include_path_validation/dup.h +6 -0
- data/assets/fixtures/header_include_path_validation/other_inc/dup.h +6 -0
- data/assets/fixtures/header_include_path_validation/test_ambiguous_mock.c +15 -0
- data/assets/fixtures/header_include_path_validation/test_bare_mock.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_bogus_mock_path.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_bogus_vanilla_path.c +10 -0
- data/assets/fixtures/header_include_path_validation/test_include_outranks_test_include_path.c +16 -0
- data/assets/fixtures/header_include_path_validation/test_pathed_mock.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_pathed_mock_ambiguous.c +14 -0
- data/assets/fixtures/header_include_path_validation/test_test_include_path_outranks_include.c +17 -0
- data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.h +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/beta/dup.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/beta/dup.h +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/gamma/dup_gamma.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_alpha.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_bare.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_beta.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_override.c +19 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive.c +19 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive_noop.c +16 -0
- data/assets/fixtures/parent_directory_references/alpha/extra.c +4 -0
- data/assets/fixtures/parent_directory_references/common/helper.c +6 -0
- data/assets/fixtures/parent_directory_references/common/helper.h +6 -0
- data/assets/fixtures/parent_directory_references/unit/test_dotdot_include.c +10 -0
- data/assets/fixtures/parent_directory_references/unit/test_dotdot_source.c +16 -0
- data/assets/fixtures/plain_inline_module.h +9 -0
- data/assets/fixtures/same_named_modules/include/drivers/spi/config.h +6 -0
- data/assets/fixtures/same_named_modules/include/drivers/uart/config.h +6 -0
- data/assets/fixtures/same_named_modules/src/drivers/spi/config.c +8 -0
- data/assets/fixtures/same_named_modules/src/drivers/uart/config.c +10 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs.c +26 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs_mocked.c +20 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs_mocked_traditional.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_both_modules.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_uart_config_bare.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_uart_config_partial_only.c +20 -0
- data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.c +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.h +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.c +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.h +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/main.c +11 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_baz_bar.c +10 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_both_bars.c +12 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_foo_bar.c +10 -0
- data/assets/{test_example_file_boom.c → fixtures/test_nosanitize_boom.c} +9 -0
- data/assets/{test_example_file_crash_assert.c → fixtures/test_nosanitize_crash_assert.c} +8 -0
- data/assets/{test_example_file_crash_sigsegv.c → fixtures/test_nosanitize_crash_sigsegv.c} +8 -0
- data/assets/{test_example_file_crash_sigsegv_with_param.c → fixtures/test_nosanitize_crash_sigsegv_with_param.c} +8 -0
- data/assets/fixtures/test_nosanitize_heap_buffer_overflow.c +31 -0
- data/assets/fixtures/test_nosanitize_leak.c +34 -0
- data/assets/fixtures/test_nosanitize_two_findings.c +36 -0
- data/assets/{test_example_file_ub_shift_overflow.c → fixtures/test_nosanitize_ub_shift_overflow.c} +9 -0
- data/assets/fixtures/test_plain_inline_module.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/alpha/calc.c +4 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/beta/calc.c +4 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_alpha.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_ambiguous.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_beta.c +15 -0
- data/assets/fixtures/tests_with_conditional_includes/src/feature_extra2.h +13 -0
- data/assets/fixtures/tests_with_conditional_includes/src/macro_target_extra.h +13 -0
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.c +19 -3
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.h +1 -0
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.c +17 -1
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget.c +12 -4
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget_feature.c +8 -5
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.c +7 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.c +16 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/FeatureConfig.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Gpt.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModuleConfig.h +17 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart1.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart2.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/drivers/widget.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/reader.c +7 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/reader.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01.c +21 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01_legacy.c +16 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_02.c +31 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_FeatureConfig.c +15 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_reader.c +13 -0
- data/assets/fixtures/tests_with_duplicate_test_names/integration/test_foo.c +21 -0
- data/assets/fixtures/tests_with_duplicate_test_names/unit/test_foo.c +21 -0
- data/assets/fixtures/tests_with_fallback_conditionals/src/conditional_module.c +28 -0
- data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/test/test_conditionals.c +8 -1
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_lower.s +2 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_upper.S +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.c +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.h +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/test/test_counter_module.c +27 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/app/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/drivers/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.c +30 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/shared/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/test/test_sensor.c +32 -0
- data/bin/actionator.rb +234 -0
- data/bin/app_cfg.rb +7 -0
- data/bin/cli.rb +78 -47
- data/bin/cli_handler.rb +89 -57
- data/bin/cli_helper.rb +90 -49
- data/bin/cli_options_transform.rb +22 -0
- data/bin/{configinator.rb → composinator.rb} +39 -32
- data/bin/mixin_resolvinator.rb +124 -0
- data/bin/mixin_standardizer.rb +31 -61
- data/bin/mixinator.rb +27 -29
- data/bin/mixins.rb +0 -5
- data/bin/objects.yml +20 -7
- data/bin/path_validator.rb +6 -5
- data/bin/projectinator.rb +51 -142
- data/bin/rake_patches.rb +36 -2
- data/bin/recursive_merger.rb +7 -1
- data/bin/versionator.rb +2 -3
- data/ceedling.gemspec +83 -12
- data/docs/BreakingChanges.md +46 -2
- data/docs/CONTRIBUTING.md +45 -29
- data/docs/CeedlingPullRequestChecklist.md +10 -9
- data/docs/Changelog.md +327 -37
- data/docs/KnownIssues.md +30 -4
- data/docs/ReleaseNotes.md +288 -12
- data/docs/SECURITY.md +46 -2
- data/docs/ThrowTheSwitchCodingStandard.md +21 -3
- data/docs/overrides/main.html +32 -0
- data/examples/temp_sensor/mixin/add_bullseye.yml +19 -0
- data/examples/wondrous_forest/README.md +3 -0
- data/examples/wondrous_forest/src/sensors/light/Calibration.c +21 -0
- data/examples/wondrous_forest/src/sensors/light/Calibration.h +14 -0
- data/examples/wondrous_forest/src/sensors/soil/Calibration.c +23 -0
- data/examples/wondrous_forest/src/sensors/soil/Calibration.h +14 -0
- data/examples/wondrous_forest/test/TestCalibration.c +39 -0
- data/lib/ceedling/batchinator.rb +81 -22
- data/lib/ceedling/c_extractor/README.md +61 -0
- data/lib/ceedling/c_extractor/c_extractor.rb +33 -2
- data/lib/ceedling/c_extractor/c_extractor_code_text.rb +18 -10
- data/lib/ceedling/c_extractor/c_extractor_constants.rb +10 -10
- data/lib/ceedling/c_extractor/c_extractor_declarations.rb +14 -14
- data/lib/ceedling/c_extractor/c_extractor_functions.rb +10 -13
- data/lib/ceedling/c_extractor/c_extractor_preprocessing.rb +77 -0
- data/lib/ceedling/c_extractor/c_extractor_types.rb +8 -5
- data/lib/ceedling/ceedling.h +33 -0
- data/lib/ceedling/config/config_matchinator.rb +36 -13
- data/lib/ceedling/config/configurator.rb +366 -530
- data/lib/ceedling/config/configurator_builder.rb +253 -365
- data/lib/ceedling/config/configurator_plugins.rb +68 -102
- data/lib/ceedling/config/configurator_setup.rb +343 -610
- data/lib/ceedling/config/configurator_validator.rb +114 -142
- data/lib/ceedling/config/line_marker_suppressors.rb +67 -0
- data/lib/ceedling/constants.rb +60 -6
- data/lib/ceedling/defaults.rb +28 -14
- data/lib/ceedling/defineinator.rb +9 -4
- data/lib/ceedling/dependencies/README.md +69 -0
- data/lib/ceedling/dependencies/dependency_cache_store.rb +160 -0
- data/lib/ceedling/dependencies/dependency_debug_tree.rb +129 -0
- data/lib/ceedling/dependencies/dependency_differ.rb +127 -0
- data/lib/ceedling/dependencies/dependency_hasher.rb +94 -0
- data/lib/ceedling/dependencies/dependency_path_normalizer.rb +80 -0
- data/lib/ceedling/dependencies/dependency_tracker.rb +405 -0
- data/lib/ceedling/dependencies/dependinator.rb +65 -0
- data/lib/ceedling/dependencies/gcc_dependency_parser.rb +86 -0
- data/lib/ceedling/encodinator.rb +23 -11
- data/lib/ceedling/file_finder.rb +373 -89
- data/lib/ceedling/file_finder_helper.rb +44 -33
- data/lib/ceedling/file_path_collection_utils.rb +17 -4
- data/lib/ceedling/file_path_utils.rb +310 -52
- data/lib/ceedling/file_wrapper.rb +245 -8
- data/lib/ceedling/filename_extension.rb +91 -0
- data/lib/ceedling/flaginator.rb +6 -2
- data/lib/ceedling/generators/generator.rb +192 -70
- data/lib/ceedling/generators/generator_helper.rb +116 -69
- data/lib/ceedling/generators/generator_mocks.rb +13 -8
- data/lib/ceedling/generators/generator_partials.rb +47 -15
- data/lib/ceedling/generators/generator_test_results.rb +29 -17
- data/lib/ceedling/generators/generator_test_results_backtrace.rb +199 -107
- data/lib/ceedling/generators/generator_test_results_sanity_checker.rb +1 -1
- data/lib/ceedling/includes/include_factory.rb +21 -6
- data/lib/ceedling/includes/include_pathinator.rb +40 -4
- data/lib/ceedling/includes/includes.rb +215 -61
- data/lib/ceedling/loginator.rb +13 -4
- data/lib/ceedling/objects.yml +216 -33
- data/lib/ceedling/parsing_parcels.rb +39 -13
- data/lib/ceedling/partials/README.md +53 -0
- data/lib/ceedling/partials/partializer.rb +118 -26
- data/lib/ceedling/partials/partializer_config.rb +141 -8
- data/lib/ceedling/partials/partializer_helper.rb +88 -2
- data/lib/ceedling/partials/partializer_utils.rb +1 -1
- data/lib/ceedling/partials/partials.rb +4 -4
- data/lib/ceedling/path_matcher.rb +163 -0
- data/lib/ceedling/path_mirror.rb +73 -0
- data/lib/ceedling/plugins/plugin.rb +1 -1
- data/lib/ceedling/plugins/plugin_manager.rb +31 -15
- data/lib/ceedling/plugins/plugin_manager_helper.rb +5 -1
- data/lib/ceedling/plugins/plugin_reportinator.rb +36 -7
- data/lib/ceedling/plugins/plugin_reportinator_helper.rb +3 -3
- data/lib/ceedling/plugins/report_log_writer_plugin.rb +66 -0
- data/lib/ceedling/plugins/report_tests_stdout_plugin.rb +18 -5
- data/lib/ceedling/preprocess/README.md +135 -120
- data/lib/ceedling/preprocess/c_comment_scanner.rb +9 -7
- data/lib/ceedling/preprocess/c_preprocessor_conditionals.rb +27 -10
- data/lib/ceedling/preprocess/preprocessinator.rb +253 -217
- data/lib/ceedling/preprocess/preprocessinator_bare_includes_extractor.rb +7 -10
- data/lib/ceedling/preprocess/preprocessinator_code_finder.rb +8 -6
- data/lib/ceedling/preprocess/preprocessinator_comment_stripper.rb +5 -3
- data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +86 -82
- data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +182 -163
- data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +174 -8
- data/lib/ceedling/preprocess/preprocessinator_reconstructor.rb +41 -20
- data/lib/ceedling/quote_include_isolator.rb +129 -0
- data/lib/ceedling/rake_app/rake_task_registry.rb +9 -9
- data/lib/ceedling/rake_app/rake_wrapper.rb +0 -13
- data/lib/ceedling/rake_app/rakefile_component_resolver.rb +24 -12
- data/lib/ceedling/rakefile.rb +2 -1
- data/lib/ceedling/{tasks_base.rake → rakefiles/base/tasks_base.rake} +1 -1
- data/lib/ceedling/{tasks_filesystem.rake → rakefiles/base/tasks_filesystem.rake} +3 -0
- data/lib/ceedling/rakefiles/release/rules_release.rake +52 -0
- data/lib/ceedling/{erb_wrapper.rb → rakefiles/release/tasks_release.rake} +5 -8
- data/lib/ceedling/rakefiles/tests/rules_tests.rake +43 -0
- data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +80 -0
- data/lib/ceedling/{tasks_tests.rake → rakefiles/tests/tasks_tests.rake} +11 -20
- data/lib/ceedling/rakefiles/tests/tasks_tests_generate.rake +55 -0
- data/lib/ceedling/release_invoker/README.md +35 -0
- data/lib/ceedling/release_invoker/release_build_executor.rb +263 -0
- data/lib/ceedling/release_invoker/release_build_planner.rb +80 -0
- data/lib/ceedling/release_invoker/release_invoker.rb +78 -0
- data/lib/ceedling/release_invoker/release_invoker_types.rb +40 -0
- data/lib/ceedling/reportinator.rb +18 -2
- data/lib/ceedling/ruby_expandinator.rb +40 -1
- data/lib/ceedling/setupinator.rb +9 -3
- data/lib/ceedling/system_wrapper.rb +17 -0
- data/lib/ceedling/templateinator.rb +146 -0
- data/lib/ceedling/test_context_extractor.rb +59 -28
- data/lib/ceedling/test_invoker/HEADER_COLLISIONS.md +41 -0
- data/lib/ceedling/test_invoker/PIPELINE.md +142 -0
- data/lib/ceedling/test_invoker/README.md +6 -0
- data/lib/ceedling/test_invoker/mock_locator.rb +49 -0
- data/lib/ceedling/test_invoker/partials_manager.rb +426 -0
- data/lib/ceedling/test_invoker/standin_headerinator.rb +136 -0
- data/lib/ceedling/test_invoker/test_bare_includes_extractinator.rb +117 -0
- data/lib/ceedling/test_invoker/test_build_executor.rb +783 -429
- data/lib/ceedling/test_invoker/test_build_planner.rb +175 -70
- data/lib/ceedling/test_invoker/test_build_setup.rb +132 -241
- data/lib/ceedling/test_invoker/test_build_validations.rb +102 -0
- data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +148 -0
- data/lib/ceedling/test_invoker/test_includes_extractinator.rb +34 -0
- data/lib/ceedling/test_invoker/test_includes_preprocessinator.rb +118 -0
- data/lib/ceedling/test_invoker/test_includes_reconcilinator.rb +149 -0
- data/lib/ceedling/test_invoker/test_invoker.rb +16 -183
- data/lib/ceedling/test_invoker/test_invoker_types.rb +85 -16
- data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +121 -0
- data/lib/ceedling/test_invoker/test_pipeline_manager.rb +303 -0
- data/lib/ceedling/test_invoker/test_runner_generatinator.rb +105 -0
- data/lib/ceedling/test_invoker/test_search_paths.rb +73 -0
- data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +78 -0
- data/lib/ceedling/tool_executor.rb +42 -13
- data/lib/ceedling/tool_executor_helper.rb +1 -1
- data/lib/ceedling/tool_validator.rb +124 -123
- data/lib/ceedling/yaml_wrapper.rb +5 -3
- data/lib/version.rb +19 -2
- data/mkdocs.prerelease.yml +42 -0
- data/mkdocs.yml +10 -2
- data/plugins/bullseye/bullseye.rake +70 -107
- data/plugins/bullseye/config/defaults.yml +12 -54
- data/plugins/bullseye/config/defaults_bullseye.rb +182 -0
- data/plugins/bullseye/lib/bullseye.rb +511 -120
- data/plugins/bullseye/lib/bullseye_constants.rb +100 -0
- data/plugins/command_hooks/lib/command_hooks.rb +117 -199
- data/plugins/compile_commands_json_db/lib/compile_commands_json_db.rb +72 -27
- data/plugins/cppcheck/config/defaults.yml +6 -1
- data/plugins/cppcheck/config/defaults_cppcheck.rb +5 -1
- data/plugins/cppcheck/cppcheck.rake +7 -1
- data/plugins/cppcheck/lib/cppcheck.rb +175 -26
- data/plugins/cppcheck/lib/cppcheck_constants.rb +12 -0
- data/plugins/cppcheck/lib/cppcheck_reports.rb +5 -1
- data/plugins/dependencies/Rakefile +14 -2
- data/plugins/dependencies/config/defaults.yml +9 -6
- data/plugins/dependencies/dependencies.rake +46 -76
- data/plugins/dependencies/example/boss/project.yml +1 -1
- data/plugins/dependencies/example/supervisor/project.yml +1 -1
- data/plugins/dependencies/example/version.tar.gzip +0 -0
- data/plugins/dependencies/lib/dependencies.rb +232 -427
- data/plugins/dependencies/lib/dependency_commands.rb +72 -0
- data/plugins/dependencies/lib/dependency_environment.rb +57 -0
- data/plugins/dependencies/lib/dependency_spec.rb +145 -0
- data/plugins/fff/.rspec +1 -0
- data/plugins/fff/Rakefile +14 -2
- data/plugins/fff/examples/fff_example/project.yml +1 -1
- data/plugins/fff/lib/fff.rb +30 -9
- data/plugins/fff/lib/fff_mock_generator.rb +142 -128
- data/plugins/fff/spec/fff_mock_header_generator_spec.rb +15 -0
- data/plugins/fff/spec/fff_mock_source_generator_spec.rb +14 -0
- data/plugins/fff/spec/spec_helper.rb +45 -0
- data/plugins/fff/src/fff_unity_helper.h +5 -0
- data/plugins/fff/vendor/fff/fakegen.rb +5 -4
- data/plugins/fff/vendor/fff/fff.h +4 -4
- data/plugins/gcov/config/defaults.yml +5 -0
- data/plugins/gcov/gcov.rake +12 -8
- data/plugins/gcov/lib/console_reportinator.rb +140 -20
- data/plugins/gcov/lib/gcov.rb +155 -60
- data/plugins/gcov/lib/gcov_constants.rb +4 -7
- data/plugins/gcov/lib/gcov_reportinator.rb +90 -0
- data/plugins/gcov/lib/gcov_types.rb +62 -1
- data/plugins/gcov/lib/gcovr_reportinator.rb +255 -213
- data/plugins/gcov/lib/reportgenerator_reportinator.rb +122 -44
- data/plugins/module_generator/Rakefile +4 -4
- data/plugins/module_generator/config/module_generator.yml +0 -1
- data/plugins/module_generator/example/project.yml +1 -1
- data/plugins/module_generator/lib/module_generator.rb +117 -87
- data/plugins/module_generator/lib/module_generator_options.rb +150 -0
- data/plugins/module_generator/lib/module_generator_project.rb +45 -0
- data/plugins/module_generator/lib/module_generator_request.rb +83 -0
- data/plugins/module_generator/lib/module_generator_test_file.rb +68 -0
- data/plugins/module_generator/lib/module_generator_unity.rb +24 -0
- data/plugins/module_generator/module_generator.rake +24 -46
- data/plugins/report_build_warnings_log/config/defaults.yml +4 -1
- data/plugins/report_build_warnings_log/lib/report_build_warnings_log.rb +47 -55
- data/plugins/report_build_warnings_log/lib/warning_collector.rb +140 -0
- data/plugins/report_build_warnings_log/lib/warning_reports.rb +135 -0
- data/plugins/report_tests_gtestlike_stdout/assets/test_results.template +3 -0
- data/{spec/units/configurator_builder_spec.rb → plugins/report_tests_gtestlike_stdout/config/defaults.yml} +6 -10
- data/plugins/report_tests_gtestlike_stdout/lib/gtestlike_report.rb +168 -0
- data/plugins/report_tests_gtestlike_stdout/lib/report_tests_gtestlike_stdout.rb +25 -1
- data/plugins/report_tests_ide_stdout/assets/test_results.template +50 -0
- data/plugins/report_tests_ide_stdout/config/defaults.yml +13 -0
- data/plugins/report_tests_ide_stdout/lib/ide_report_lines.rb +103 -0
- data/plugins/report_tests_ide_stdout/lib/report_tests_ide_stdout.rb +12 -4
- data/plugins/report_tests_log_factory/lib/cppunit_tests_reporter.rb +33 -51
- data/plugins/report_tests_log_factory/lib/html_tests_reporter.rb +286 -295
- data/plugins/report_tests_log_factory/lib/json_tests_reporter.rb +22 -35
- data/plugins/report_tests_log_factory/lib/junit_tests_reporter.rb +91 -133
- data/plugins/report_tests_log_factory/lib/report_tests_log_factory.rb +72 -86
- data/plugins/report_tests_log_factory/lib/tests_reporter.rb +31 -12
- data/plugins/report_tests_pretty_stdout/assets/{template.erb → test_results.template} +8 -8
- data/plugins/report_tests_raw_output_log/lib/report_tests_raw_output_log.rb +18 -48
- data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +13 -2
- data/plugins/sanitize/config/defaults.yml +44 -0
- data/plugins/sanitize/config/defaults_sanitize.rb +20 -0
- data/plugins/sanitize/lib/sanitize.rb +174 -0
- data/plugins/sanitize/lib/sanitize_config.rb +110 -0
- data/plugins/sanitize/lib/sanitize_constants.rb +13 -0
- data/plugins/sanitize/lib/sanitize_findings.rb +85 -0
- data/plugins/sanitize/lib/sanitize_records.rb +115 -0
- data/plugins/sanitize/lib/sanitize_reports.rb +135 -0
- data/plugins/sanitize/sanitize.rake +108 -0
- data/plugins/valgrind/config/defaults.yml +7 -1
- data/plugins/valgrind/config/defaults_valgrind.rb +6 -1
- data/plugins/valgrind/lib/valgrind.rb +202 -39
- data/plugins/valgrind/lib/valgrind_constants.rb +4 -0
- data/plugins/valgrind/lib/valgrind_report.rb +52 -0
- data/plugins/valgrind/valgrind.rake +33 -11
- data/site-local/404.html +248 -14
- data/site-local/configuration/environment-vars.html +248 -14
- data/site-local/configuration/global-collections.html +248 -19
- data/site-local/configuration/index.html +249 -15
- data/site-local/configuration/loading.html +260 -22
- data/site-local/configuration/mixins.html +252 -17
- data/site-local/configuration/parallel-builds.html +248 -14
- data/site-local/configuration/project-file.html +275 -30
- data/site-local/configuration/reference/cexception.html +255 -20
- data/site-local/configuration/reference/cmock.html +281 -14
- data/site-local/configuration/reference/defines.html +262 -19
- data/site-local/configuration/reference/environment.html +251 -17
- data/site-local/configuration/reference/extension.html +361 -16
- data/site-local/configuration/reference/files.html +262 -14
- data/site-local/configuration/reference/flags.html +270 -19
- data/site-local/configuration/reference/index.html +248 -14
- data/site-local/configuration/reference/libraries.html +248 -14
- data/site-local/configuration/reference/mixins.html +248 -14
- data/site-local/configuration/reference/partials.html +249 -19
- data/site-local/configuration/reference/paths.html +275 -15
- data/site-local/configuration/reference/plugins.html +248 -14
- data/site-local/configuration/reference/project.html +291 -14
- data/site-local/configuration/reference/release-build.html +256 -14
- data/site-local/configuration/reference/test-build.html +290 -24
- data/site-local/configuration/reference/test-runner.html +288 -17
- data/site-local/configuration/reference/tools.html +254 -14
- data/site-local/configuration/reference/unity.html +280 -15
- data/site-local/configuration/which-ceedling.html +248 -14
- data/site-local/development/index.html +254 -14
- data/site-local/development/plugins/configuration.html +269 -17
- data/site-local/development/plugins/index.html +267 -15
- data/site-local/development/plugins/plugin-subclass.html +906 -154
- data/site-local/development/plugins/rake-tasks.html +276 -14
- data/site-local/development/releases.html +4708 -0
- data/site-local/development/workflow.html +1030 -51
- data/site-local/getting-started/builds.html +4607 -0
- data/site-local/getting-started/command-line.html +418 -34
- data/site-local/getting-started/example-projects/cipher-quest.html +248 -14
- data/site-local/getting-started/example-projects/index.html +249 -15
- data/site-local/getting-started/example-projects/temp-sensor.html +248 -14
- data/site-local/getting-started/example-projects/wondrous-forest.html +248 -14
- data/site-local/getting-started/index.html +255 -14
- data/site-local/getting-started/installation.html +258 -22
- data/site-local/getting-started/quick-start.html +251 -15
- data/site-local/help.html +255 -14
- data/site-local/index.html +292 -22
- data/site-local/overview/build-system.html +249 -15
- data/site-local/overview/index.html +248 -14
- data/site-local/overview/test-environments.html +257 -14
- data/site-local/overview/tools-and-frameworks.html +248 -14
- data/site-local/plugins/beep.html +251 -14
- data/site-local/plugins/bullseye/index.html +5079 -0
- data/site-local/plugins/bullseye/licensing.html +4840 -0
- data/site-local/plugins/command-hooks.html +265 -27
- data/site-local/plugins/compile-commands-json-db.html +256 -17
- data/site-local/plugins/cppcheck.html +1081 -262
- data/site-local/plugins/dependencies.html +934 -242
- data/site-local/plugins/fff.html +296 -15
- data/site-local/plugins/gcov/examples.html +251 -14
- data/site-local/plugins/gcov/gcovr.html +567 -65
- data/site-local/plugins/gcov/index.html +251 -14
- data/site-local/plugins/gcov/overview.html +259 -18
- data/site-local/plugins/gcov/reportgenerator.html +386 -38
- data/site-local/plugins/gcov/reporting.html +348 -100
- data/site-local/plugins/gcov/setup.html +253 -15
- data/site-local/plugins/gcov/tool-versions.html +301 -19
- data/site-local/plugins/gcov/troubleshooting.html +273 -36
- data/site-local/plugins/index.html +294 -36
- data/site-local/plugins/module-generator.html +779 -195
- data/site-local/plugins/report-build-warnings-log.html +578 -33
- data/site-local/plugins/report-tests-gtestlike-stdout.html +467 -84
- data/site-local/plugins/report-tests-ide-stdout.html +654 -51
- data/site-local/plugins/report-tests-log-factory.html +337 -70
- data/site-local/plugins/report-tests-pretty-stdout.html +251 -14
- data/site-local/plugins/report-tests-raw-output-log.html +251 -14
- data/site-local/plugins/report-tests-teamcity-stdout.html +251 -14
- data/site-local/plugins/sanitize.html +5332 -0
- data/site-local/plugins/valgrind.html +416 -26
- data/site-local/{plugins/bullseye.html → project/index.html} +297 -217
- data/site-local/project/release-history.html +251 -17
- data/site-local/project/sbom.html +4726 -0
- data/site-local/project/upgrade.html +250 -16
- data/site-local/reference/build-directives.html +257 -14
- data/site-local/reference/command-line.html +373 -16
- data/site-local/reference/environment-vars.html +248 -14
- data/site-local/reference/gcov-plugin.html +492 -18
- data/site-local/reference/global-collections.html +249 -15
- data/site-local/reference/index.html +248 -14
- data/site-local/reference/partials-macros.html +258 -14
- data/site-local/reference/project-configuration.html +248 -14
- data/site-local/sitemap.xml.gz +0 -0
- data/{docs/mkdocs/snapshot/assets → site-local/snapshot/assets/features}/project.yml +4 -1
- data/site-local/snapshot/examples/cipher_quest/index.html +248 -14
- data/site-local/snapshot/examples/temp_sensor/index.html +248 -14
- data/site-local/snapshot/examples/wondrous_forest/index.html +265 -25
- data/site-local/snapshot/plugins/bullseye/config/defaults.yml +24 -0
- data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +182 -0
- data/site-local/snapshot/plugins/gcov/config/defaults.yml +5 -0
- data/site-local/testing-guide/build-directives.html +332 -22
- data/site-local/testing-guide/conventions.html +678 -153
- data/site-local/testing-guide/frameworks.html +248 -14
- data/site-local/testing-guide/index.html +248 -21
- data/site-local/testing-guide/partials/configuration.html +248 -14
- data/site-local/testing-guide/partials/conventions.html +316 -17
- data/site-local/testing-guide/partials/directives.html +456 -48
- data/site-local/testing-guide/partials/example.html +248 -14
- data/site-local/testing-guide/partials/index.html +255 -14
- data/site-local/testing-guide/partials/overview.html +248 -14
- data/site-local/testing-guide/partials/variables.html +248 -14
- data/site-local/testing-guide/test-cases.html +248 -14
- data/site-local/testing-guide/test-sample.html +248 -14
- data/site-local/testing-guide/test-suite-anatomy.html +248 -14
- data/spec/integration/actionator_file_operations_spec.rb +287 -0
- data/spec/integration/analysis_tool_output_spec.rb +204 -0
- data/spec/{units/c_extractor/c_extractor_integration_spec.rb → integration/c_extractor_composition_spec.rb} +196 -17
- data/spec/integration/command_hooks_plugin_spec.rb +152 -0
- data/spec/integration/compile_commands_json_db_spec.rb +76 -0
- data/spec/integration/configurator_pipeline_spec.rb +180 -0
- data/spec/integration/configurator_plugins_spec.rb +122 -0
- data/spec/integration/configurator_validation_spec.rb +98 -0
- data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +396 -0
- data/spec/integration/dependencies/dependency_tracker_core_spec.rb +244 -0
- data/spec/integration/dependencies/dependency_tracker_diagnose_spec.rb +224 -0
- data/spec/integration/dependencies/dependency_tracker_filename_handling_spec.rb +118 -0
- data/spec/integration/dependencies/dependency_tracker_gcc_deps_spec.rb +199 -0
- data/spec/integration/dependencies/dependency_tracker_pruning_spec.rb +167 -0
- data/spec/integration/dependencies_plugin_spec.rb +473 -0
- data/spec/integration/erb_dependency_removed_spec.rb +167 -0
- data/spec/integration/includes_extraction_spec.rb +612 -0
- data/spec/integration/mixin_loading_spec.rb +414 -0
- data/spec/integration/module_generator_spec.rb +436 -0
- data/spec/integration/partials_fallback_preprocessing_spec.rb +316 -0
- data/spec/integration/partials_header_composition_spec.rb +889 -0
- data/spec/integration/partials_module_resolution_spec.rb +372 -0
- data/spec/integration/partials_symbol_linkage_spec.rb +371 -0
- data/spec/integration/preprocessing_transient_io_retry_spec.rb +135 -0
- data/spec/integration/quote_include_isolator_spec.rb +167 -0
- data/spec/integration/report_build_warnings_log_spec.rb +170 -0
- data/spec/integration/report_tests_log_factory_spec.rb +100 -0
- data/spec/integration/sanitizer_exclusions_spec.rb +126 -0
- data/spec/integration/system_harness_sanitizers_spec.rb +104 -0
- data/spec/integration/test_build_parallel_barrier_spec.rb +89 -0
- data/spec/integration/test_executable_manifest_spec.rb +118 -0
- data/spec/integration/test_includes_extractinator_spec.rb +293 -0
- data/spec/integration/tool_executor_spec.rb +224 -0
- data/spec/integration/tool_validator_spec.rb +133 -0
- data/spec/integration/vendor_copy_transient_io_retry_spec.rb +130 -0
- data/spec/manual/stress_test.rb +1 -1
- data/spec/support/config_yaml_helper.rb +17 -0
- data/spec/support/fixtures/sanitizer_reports/clang_asan_heap.txt +45 -0
- data/spec/support/fixtures/sanitizer_reports/clang_ubsan_shift.txt +5 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_heap.txt +47 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_leak.txt +10 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_segv.txt +6 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_ubsan_shift.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__all_pass.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_branches_only.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_functions_only.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_none.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__empty.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__gcov_context.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__mixed_all.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_matching.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_multiline.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_no_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_nonmatching.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_ignore_no_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_ignore_with_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__stdout_only.txt +6 -0
- data/spec/support/fixtures/templates/ide__all_pass.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_branches_only.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_functions_only.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_none.txt +10 -0
- data/spec/support/fixtures/templates/ide__empty.txt +8 -0
- data/spec/support/fixtures/templates/ide__gcov_context.txt +28 -0
- data/spec/support/fixtures/templates/ide__mixed_all.txt +29 -0
- data/spec/support/fixtures/templates/ide__one_failure_matching.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_failure_multiline.txt +17 -0
- data/spec/support/fixtures/templates/ide__one_failure_no_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_failure_nonmatching.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_ignore_no_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_ignore_with_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__stdout_only.txt +16 -0
- data/spec/support/fixtures/templates/pretty__all_pass.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_branches_only.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_functions_only.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_none.txt +8 -0
- data/spec/support/fixtures/templates/pretty__empty.txt +6 -0
- data/spec/support/fixtures/templates/pretty__gcov_context.txt +31 -0
- data/spec/support/fixtures/templates/pretty__mixed_all.txt +35 -0
- data/spec/support/fixtures/templates/pretty__one_failure_matching.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_failure_multiline.txt +17 -0
- data/spec/support/fixtures/templates/pretty__one_failure_no_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_failure_nonmatching.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_ignore_no_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_ignore_with_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__stdout_only.txt +15 -0
- data/spec/support/fixtures/valgrind_reports/sigsegv.log +51 -0
- data/spec/support/fixtures/valgrind_reports/sigsegv.xml +182 -0
- data/spec/support/include_guard_helper.rb +20 -0
- data/spec/support/integration/configurator_integration_helper.rb +159 -0
- data/spec/support/integration/dependency_tracker_integration_helper.rb +136 -0
- data/spec/support/integration/partials_generation_integration_helper.rb +726 -0
- data/spec/support/integration/spec_integration_helper.rb +285 -0
- data/spec/support/integration/test_includes_harness.rb +259 -0
- data/spec/support/integration/tool_executor_integration_helper.rb +55 -0
- data/spec/support/spec_helper.rb +41 -0
- data/spec/support/system/sanitizers/asan_ubsan.yml +82 -0
- data/spec/support/system/sanitizers/asan_ubsan_leaks.yml +57 -0
- data/spec/support/system/simplecov_boot.rb +66 -0
- data/spec/support/system/spec_system_helper.rb +376 -16
- data/spec/support/system/system_context.rb +181 -59
- data/spec/support/template_render_cases.rb +166 -0
- data/spec/system/bracket_path_handling_spec.rb +175 -0
- data/spec/system/build_output_mirroring_spec.rb +89 -0
- data/spec/system/build_recovery_spec.rb +382 -0
- data/spec/system/bullseye_deployment_spec.rb +102 -0
- data/spec/system/cli_surface_spec.rb +245 -0
- data/spec/system/command_hooks_spec.rb +117 -0
- data/spec/system/conditional_include_macro_visibility_spec.rb +32 -124
- data/spec/system/conditional_mock_includes_spec.rb +181 -0
- data/spec/system/cppcheck_deployment_spec.rb +26 -8
- data/spec/system/delta_builds_spec.rb +751 -0
- data/spec/system/deployment_as_gem_spec.rb +7 -0
- data/spec/system/deployment_as_vendor_spec.rb +29 -145
- data/spec/system/dumpconfig_spec.rb +137 -0
- data/spec/system/encoding_stress_spec.rb +7 -4
- data/spec/system/example_cipher_quest_spec.rb +25 -100
- data/spec/system/example_temp_sensor_spec.rb +30 -172
- data/spec/system/example_wondrous_forest_spec.rb +25 -62
- data/spec/system/extension_multiple_values_spec.rb +75 -0
- data/spec/system/files_paths_reporting_spec.rb +154 -0
- data/spec/system/gcov_deployment_spec.rb +72 -3
- data/spec/system/header_include_path_validation_spec.rb +222 -0
- data/spec/system/implicit_source_header_correspondence_disambiguation_spec.rb +100 -0
- data/spec/system/include_path_reconciliation_spec.rb +64 -0
- data/spec/system/mixin_ordering_spec.rb +30 -415
- data/spec/system/mocks_partials_configuration_validation_spec.rb +126 -0
- data/spec/system/parent_directory_reference_spec.rb +114 -0
- data/spec/system/partials_module_disambiguation_spec.rb +143 -0
- data/spec/system/pinned_thread_count_spec.rb +102 -0
- data/spec/system/plugin_delta_builds_spec.rb +179 -0
- data/spec/system/preprocessing_encoding_spec.rb +87 -4
- data/spec/system/preprocessing_fallback_conditionals_spec.rb +19 -25
- data/spec/system/preprocessing_parameterized_tests_spec.rb +2 -2
- data/spec/system/rake_release_task_path_disambiguation_spec.rb +97 -0
- data/spec/system/rake_test_task_path_disambiguation_spec.rb +118 -0
- data/spec/system/report_and_tooling_plugins_spec.rb +327 -0
- data/spec/system/ruby_replacement_spec.rb +1 -1
- data/spec/system/same_named_modules_spec.rb +115 -0
- data/spec/system/sanitize_deployment_spec.rb +64 -0
- data/spec/system/shuffle_tests_spec.rb +139 -0
- data/spec/system/sibling_header_collision_spec.rb +620 -0
- data/spec/system/subdir_include_preservation_spec.rb +63 -0
- data/spec/system/support/bullseye_common_test_cases.rb +369 -0
- data/spec/system/support/bullseye_helpers.rb +70 -0
- data/spec/system/support/common_test_cases.rb +167 -43
- data/spec/system/support/cppcheck_common_test_cases.rb +80 -0
- data/spec/system/support/cppcheck_helpers.rb +10 -8
- data/spec/system/support/gcov_common_test_cases.rb +173 -37
- data/spec/system/support/gcov_helpers.rb +3 -3
- data/spec/system/support/gcov_partials_test_cases.rb +48 -2
- data/spec/system/support/sanitize_common_test_cases.rb +222 -0
- data/spec/system/support/sanitize_helpers.rb +27 -0
- data/spec/system/support/valgrind_common_test_cases.rb +116 -16
- data/spec/system/support/valgrind_helpers.rb +3 -4
- data/spec/system/test_pipeline_stop_points_spec.rb +160 -0
- data/spec/system/test_runner_system_include_spec.rb +19 -41
- data/spec/system/test_source_file_directive_spec.rb +235 -0
- data/spec/system/upgrade_as_vendor_spec.rb +25 -46
- data/spec/system/valgrind_deployment_spec.rb +41 -0
- data/spec/units/batchinator_spec.rb +314 -0
- data/spec/units/bin/actionator_spec.rb +412 -0
- data/spec/units/bin/app_cfg_spec.rb +90 -0
- data/spec/units/bin/cli_handler_spec.rb +204 -0
- data/spec/units/bin/cli_helper_spec.rb +238 -10
- data/spec/units/bin/cli_options_transform_spec.rb +49 -0
- data/spec/units/bin/composinator_spec.rb +236 -0
- data/spec/units/bin/{projectinator_mixin_spec.rb → mixin_resolvinator_spec.rb} +122 -83
- data/spec/units/bin/mixin_standardizer_spec.rb +4 -3
- data/spec/units/bin/mixinator_spec.rb +58 -22
- data/spec/units/bin/path_validator_spec.rb +112 -0
- data/spec/units/bin/projectinator_spec.rb +223 -0
- data/spec/units/bin/rake_patches_spec.rb +52 -0
- data/spec/units/bin/recursive_merger_spec.rb +22 -0
- data/spec/units/bin/versionator_spec.rb +104 -0
- data/spec/units/c_extractor/c_extractor_code_text_spec.rb +4 -4
- data/spec/units/c_extractor/c_extractor_declarations_spec.rb +70 -0
- data/spec/units/c_extractor/c_extractor_functions_spec.rb +75 -1
- data/spec/units/c_extractor/c_extractor_preprocessing_spec.rb +158 -0
- data/spec/units/c_extractor/c_extractor_spec.rb +236 -6
- data/spec/units/ceedling/templateinator_golden_spec.rb +84 -0
- data/spec/units/ceedling/templateinator_spec.rb +188 -0
- data/spec/units/config/configurator_builder_spec.rb +444 -0
- data/spec/units/config/configurator_plugins_spec.rb +160 -0
- data/spec/units/config/configurator_setup_spec.rb +706 -6
- data/spec/units/config/configurator_spec.rb +952 -0
- data/spec/units/config/configurator_validator_spec.rb +259 -0
- data/spec/units/config/line_marker_suppressors_spec.rb +89 -0
- data/spec/units/config_matchinator_spec.rb +103 -0
- data/spec/units/defineinator_spec.rb +158 -0
- data/spec/units/dependencies/dependency_cache_store_spec.rb +364 -0
- data/spec/units/dependencies/dependency_debug_tree_spec.rb +189 -0
- data/spec/units/dependencies/dependency_differ_spec.rb +139 -0
- data/spec/units/dependencies/dependency_hasher_spec.rb +141 -0
- data/spec/units/dependencies/dependency_path_normalizer_spec.rb +111 -0
- data/spec/units/dependencies/dependency_tracker_spec.rb +905 -0
- data/spec/units/dependencies/dependinator_spec.rb +99 -0
- data/spec/units/dependencies/gcc_dependency_parser_spec.rb +152 -0
- data/spec/units/encodinator_spec.rb +92 -0
- data/spec/units/file_finder_helper_spec.rb +99 -15
- data/spec/units/file_finder_spec.rb +495 -0
- data/spec/units/file_path_collection_utils_spec.rb +9 -0
- data/spec/units/file_path_utils_spec.rb +736 -0
- data/spec/units/file_wrapper_spec.rb +447 -0
- data/spec/units/filename_extension_spec.rb +120 -0
- data/spec/units/flaginator_spec.rb +114 -0
- data/spec/units/generators/generator_helper_spec.rb +113 -0
- data/spec/units/generators/generator_mocks_spec.rb +131 -0
- data/spec/units/generators/generator_partials_spec.rb +336 -160
- data/spec/units/generators/generator_spec.rb +317 -0
- data/spec/units/generators/generator_test_results_backtrace_spec.rb +169 -9
- data/spec/units/generators/generator_test_results_sanity_checker_spec.rb +14 -6
- data/spec/units/generators/generator_test_results_spec.rb +65 -8
- data/spec/units/generators/generator_test_runner_spec.rb +1 -1
- data/spec/units/includes/include_factory_spec.rb +53 -0
- data/spec/units/includes/include_pathinator_spec.rb +269 -0
- data/spec/units/includes/include_spec.rb +8 -4
- data/spec/units/includes/includes_spec.rb +326 -18
- data/spec/units/mock_locator_spec.rb +74 -0
- data/spec/units/parsing_parcels_spec.rb +65 -0
- data/spec/units/partials/partializer_config_spec.rb +284 -18
- data/spec/units/partials/partializer_helper_spec.rb +122 -0
- data/spec/units/partials/partializer_spec.rb +346 -71
- data/spec/units/partials/partializer_utils_spec.rb +4 -4
- data/spec/units/partials_manager_spec.rb +539 -0
- data/spec/units/path_matcher_spec.rb +193 -0
- data/spec/units/path_mirror_spec.rb +103 -0
- data/spec/units/plugin_manager_spec.rb +77 -0
- data/spec/units/plugin_reportinator_spec.rb +78 -3
- data/spec/units/plugins/bullseye_spec.rb +1068 -0
- data/spec/units/plugins/command_hooks_spec.rb +157 -0
- data/spec/units/plugins/compile_commands_json_db_spec.rb +145 -0
- data/spec/units/plugins/console_reportinator_spec.rb +370 -0
- data/spec/units/plugins/cppcheck_spec.rb +330 -4
- data/spec/units/plugins/cppunit_tests_reporter_spec.rb +118 -0
- data/spec/units/plugins/dependencies_spec.rb +295 -0
- data/spec/units/plugins/dependency_commands_spec.rb +83 -0
- data/spec/units/plugins/dependency_environment_spec.rb +64 -0
- data/spec/units/plugins/dependency_spec_spec.rb +170 -0
- data/spec/units/plugins/gcov_reportinator_spec.rb +272 -0
- data/spec/units/plugins/gcov_spec.rb +521 -0
- data/spec/units/plugins/gcovr_reportinator_spec.rb +795 -0
- data/spec/units/plugins/gtestlike_report_spec.rb +363 -0
- data/spec/units/plugins/html_tests_reporter_spec.rb +158 -0
- data/spec/units/plugins/ide_report_lines_spec.rb +229 -0
- data/spec/units/plugins/json_tests_reporter_spec.rb +87 -0
- data/spec/units/plugins/junit_tests_reporter_spec.rb +237 -0
- data/spec/units/plugins/module_generator_options_spec.rb +185 -0
- data/spec/units/plugins/module_generator_project_spec.rb +55 -0
- data/spec/units/plugins/module_generator_request_spec.rb +107 -0
- data/spec/units/plugins/module_generator_spec.rb +214 -0
- data/spec/units/plugins/module_generator_test_file_spec.rb +102 -0
- data/spec/units/plugins/module_generator_unity_spec.rb +37 -0
- data/spec/units/plugins/report_build_warnings_log_spec.rb +199 -0
- data/spec/units/plugins/report_log_writer_plugin_spec.rb +94 -0
- data/spec/units/plugins/report_tests_gtestlike_stdout_spec.rb +274 -0
- data/spec/units/plugins/report_tests_ide_stdout_spec.rb +140 -0
- data/spec/units/plugins/report_tests_log_factory_spec.rb +210 -0
- data/spec/units/plugins/report_tests_pretty_stdout_spec.rb +83 -0
- data/spec/units/plugins/report_tests_raw_output_log_spec.rb +98 -0
- data/spec/units/plugins/report_tests_stdout_plugin_spec.rb +145 -0
- data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +121 -0
- data/spec/units/plugins/reportgenerator_reportinator_spec.rb +410 -0
- data/spec/units/plugins/sanitize_config_spec.rb +119 -0
- data/spec/units/plugins/sanitize_findings_spec.rb +69 -0
- data/spec/units/plugins/sanitize_records_spec.rb +114 -0
- data/spec/units/plugins/sanitize_reports_spec.rb +84 -0
- data/spec/units/plugins/sanitize_spec.rb +300 -0
- data/spec/units/plugins/tests_reporter_spec.rb +89 -0
- data/spec/units/plugins/valgrind_spec.rb +560 -0
- data/spec/units/plugins/warning_collector_spec.rb +185 -0
- data/spec/units/plugins/warning_reports_spec.rb +150 -0
- data/spec/units/preprocess/c_comment_scanner_spec.rb +17 -17
- data/spec/units/preprocess/c_preprocessor_conditionals_spec.rb +94 -0
- data/spec/units/preprocess/preprocessinator_bare_includes_extractor_spec.rb +73 -0
- data/spec/units/preprocess/preprocessinator_code_finder_spec.rb +35 -16
- data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +129 -48
- data/spec/units/preprocess/preprocessinator_file_assembler_spec.rb +292 -9
- data/spec/units/preprocess/preprocessinator_includes_handler_spec.rb +294 -16
- data/spec/units/preprocess/preprocessinator_line_marker_includes_extractor_spec.rb +356 -6
- data/spec/units/preprocess/preprocessinator_reconstructor_spec.rb +58 -4
- data/spec/units/preprocess/preprocessinator_spec.rb +693 -5
- data/spec/units/quote_include_isolator_spec.rb +176 -0
- data/spec/units/rake_app/rake_invocation_tracker_spec.rb +94 -0
- data/spec/units/rake_app/rake_task_registry_spec.rb +263 -0
- data/spec/units/rake_app/rake_utils_spec.rb +54 -0
- data/spec/units/rake_app/rake_wrapper_spec.rb +64 -0
- data/spec/units/rake_app/rakefile_component_resolver_spec.rb +182 -0
- data/spec/units/release_build_executor_spec.rb +404 -0
- data/spec/units/release_build_planner_spec.rb +144 -0
- data/spec/units/release_invoker_spec.rb +127 -0
- data/spec/units/reportinator_spec.rb +35 -0
- data/spec/units/ruby_expandinator_spec.rb +36 -0
- data/spec/units/standin_headerinator_spec.rb +168 -0
- data/spec/units/system_wrapper_spec.rb +16 -0
- data/spec/units/test_build_executor_spec.rb +1653 -8
- data/spec/units/test_build_planner_spec.rb +878 -0
- data/spec/units/test_build_setup_spec.rb +583 -0
- data/spec/units/test_context_extractor_spec.rb +51 -3
- data/spec/units/test_file_preprocessinator_spec.rb +206 -0
- data/spec/units/test_includes_extractinator_spec.rb +764 -0
- data/spec/units/test_invoker/objects_wiring_spec.rb +31 -0
- data/spec/units/test_invoker_spec.rb +147 -0
- data/spec/units/test_invoker_types_spec.rb +182 -0
- data/spec/units/test_pipeline_helpers_spec.rb +100 -0
- data/spec/units/test_pipeline_manager_spec.rb +415 -0
- data/spec/units/test_runner_generatinator_spec.rb +215 -0
- data/spec/units/test_runner_manager_spec.rb +70 -0
- data/spec/units/test_search_paths_spec.rb +84 -0
- data/spec/units/test_source_file_directive_resolver_spec.rb +239 -0
- data/spec/units/tool_executor_helper_spec.rb +1 -1
- data/spec/units/tool_executor_spec.rb +571 -2
- data/spec/units/tool_validator_spec.rb +303 -24
- data/spec/units/version_spec.rb +74 -0
- data/spec/units/yaml_wrapper_spec.rb +4 -1
- data/vendor/cmock/docs/CMock_Summary.md +11 -0
- data/vendor/cmock/lib/cmock_config.rb +1 -0
- data/vendor/cmock/lib/cmock_generator.rb +5 -1
- data/vendor/cmock/test/unit/cmock_generator_main_test.rb +31 -0
- data/vendor/cmock/vendor/unity/auto/generate_module.rb +4 -4
- data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +8 -2
- data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +2 -2
- data/vendor/cmock/vendor/unity/docs/UnityChangeLog.md +7 -0
- data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +4 -0
- data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
- data/vendor/cmock/vendor/unity/src/unity_internals.h +21 -7
- data/vendor/cmock/vendor/unity/test/Makefile +9 -2
- data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +1 -0
- data/vendor/cmock/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
- data/vendor/cmock/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
- data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
- data/vendor/cmock/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
- data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +78 -0
- data/vendor/cmock/vendor/unity/test/tests/test_unity_test_summary.rb +58 -0
- data/vendor/diy/lib/diy/factory.rb +5 -4
- data/vendor/diy/lib/diy.rb +5 -4
- data/vendor/diy/sample_code/car.rb +5 -4
- data/vendor/diy/sample_code/chassis.rb +5 -4
- data/vendor/diy/sample_code/diy_example.rb +5 -4
- data/vendor/diy/sample_code/engine.rb +5 -4
- data/vendor/diy/sample_code/objects.yml +5 -4
- data/vendor/diy/test/constructor.rb +5 -4
- data/vendor/diy/test/diy_test.rb +5 -4
- data/vendor/diy/test/factory_test.rb +5 -4
- data/vendor/diy/test/files/broken_construction.yml +5 -4
- data/vendor/diy/test/files/cat/cat.rb +5 -4
- data/vendor/diy/test/files/cat/extra_conflict.yml +5 -4
- data/vendor/diy/test/files/cat/heritage.rb +5 -4
- data/vendor/diy/test/files/cat/needs_input.yml +5 -4
- data/vendor/diy/test/files/cat/the_cat_lineage.rb +5 -4
- data/vendor/diy/test/files/dog/dog_model.rb +5 -4
- data/vendor/diy/test/files/dog/dog_presenter.rb +5 -4
- data/vendor/diy/test/files/dog/dog_view.rb +5 -4
- data/vendor/diy/test/files/dog/file_resolver.rb +5 -4
- data/vendor/diy/test/files/dog/other_thing.rb +5 -4
- data/vendor/diy/test/files/dog/simple.yml +5 -4
- data/vendor/diy/test/files/donkey/foo/bar/qux.rb +5 -4
- data/vendor/diy/test/files/donkey/foo.rb +5 -4
- data/vendor/diy/test/files/factory/beef.rb +5 -4
- data/vendor/diy/test/files/factory/dog.rb +5 -4
- data/vendor/diy/test/files/factory/factory.yml +5 -4
- data/vendor/diy/test/files/factory/farm/llama.rb +5 -4
- data/vendor/diy/test/files/factory/farm/pork.rb +5 -4
- data/vendor/diy/test/files/factory/kitten.rb +5 -4
- data/vendor/diy/test/files/fud/objects.yml +5 -4
- data/vendor/diy/test/files/fud/toy.rb +5 -4
- data/vendor/diy/test/files/functions/attached_things_builder.rb +5 -4
- data/vendor/diy/test/files/functions/invalid_method.yml +5 -4
- data/vendor/diy/test/files/functions/method_extractor.rb +5 -4
- data/vendor/diy/test/files/functions/nonsingleton_objects.yml +5 -4
- data/vendor/diy/test/files/functions/objects.yml +5 -4
- data/vendor/diy/test/files/functions/thing.rb +5 -4
- data/vendor/diy/test/files/functions/thing_builder.rb +5 -4
- data/vendor/diy/test/files/functions/things_builder.rb +5 -4
- data/vendor/diy/test/files/gnu/objects.yml +5 -4
- data/vendor/diy/test/files/gnu/thinger.rb +5 -4
- data/vendor/diy/test/files/goat/base.rb +5 -4
- data/vendor/diy/test/files/goat/can.rb +5 -4
- data/vendor/diy/test/files/goat/goat.rb +5 -4
- data/vendor/diy/test/files/goat/objects.yml +5 -4
- data/vendor/diy/test/files/goat/paper.rb +5 -4
- data/vendor/diy/test/files/goat/plane.rb +5 -4
- data/vendor/diy/test/files/goat/shirt.rb +5 -4
- data/vendor/diy/test/files/goat/wings.rb +5 -4
- data/vendor/diy/test/files/horse/holder_thing.rb +5 -4
- data/vendor/diy/test/files/horse/objects.yml +5 -4
- data/vendor/diy/test/files/namespace/animal/bird.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/cat.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/reptile/hardshell/turtle.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/reptile/lizard.rb +5 -4
- data/vendor/diy/test/files/namespace/bad_module_specified.yml +5 -4
- data/vendor/diy/test/files/namespace/class_name_combine.yml +5 -4
- data/vendor/diy/test/files/namespace/no_module_specified.yml +5 -4
- data/vendor/diy/test/files/namespace/objects.yml +5 -4
- data/vendor/diy/test/files/namespace/road.rb +5 -4
- data/vendor/diy/test/files/namespace/sky.rb +5 -4
- data/vendor/diy/test/files/namespace/subcontext.yml +5 -4
- data/vendor/diy/test/files/non_singleton/air.rb +5 -4
- data/vendor/diy/test/files/non_singleton/fat_cat.rb +5 -4
- data/vendor/diy/test/files/non_singleton/objects.yml +5 -4
- data/vendor/diy/test/files/non_singleton/pig.rb +5 -4
- data/vendor/diy/test/files/non_singleton/thread_spinner.rb +5 -4
- data/vendor/diy/test/files/non_singleton/tick.rb +5 -4
- data/vendor/diy/test/files/non_singleton/yard.rb +5 -4
- data/vendor/diy/test/files/yak/core_model.rb +5 -4
- data/vendor/diy/test/files/yak/core_presenter.rb +5 -4
- data/vendor/diy/test/files/yak/core_view.rb +5 -4
- data/vendor/diy/test/files/yak/data_source.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_model.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_presenter.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_view.rb +5 -4
- data/vendor/diy/test/files/yak/giant_squid.rb +5 -4
- data/vendor/diy/test/files/yak/krill.rb +5 -4
- data/vendor/diy/test/files/yak/my_objects.yml +5 -4
- data/vendor/diy/test/files/yak/sub_sub_context_test.yml +5 -4
- data/vendor/diy/test/test_helper.rb +5 -4
- data/vendor/unity/auto/generate_module.rb +4 -4
- data/vendor/unity/auto/generate_test_runner.rb +5 -1
- data/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
- data/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
- data/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
- data/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
- data/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
- data/vendor/unity/test/tests/test_generate_test_runner.rb +29 -0
- metadata +770 -287
- data/assets/tests_with_fallback_conditionals/src/conditional_module.c +0 -18
- data/bin/actions_wrapper.rb +0 -51
- data/docs/mkdocs/assets/images/ceedling-logo-circle.png +0 -0
- data/docs/mkdocs/assets/images/ceedling.svg +0 -90
- data/docs/mkdocs/assets/images/favicon.png +0 -0
- data/docs/mkdocs/assets/stylesheets/admonitions.css +0 -152
- data/docs/mkdocs/assets/stylesheets/fixes-local.css +0 -15
- data/docs/mkdocs/assets/stylesheets/styling.css +0 -102
- data/docs/mkdocs/configuration/environment-vars.md +0 -14
- data/docs/mkdocs/configuration/global-collections.md +0 -156
- data/docs/mkdocs/configuration/index.md +0 -75
- data/docs/mkdocs/configuration/loading.md +0 -89
- data/docs/mkdocs/configuration/mixins.md +0 -607
- data/docs/mkdocs/configuration/parallel-builds.md +0 -97
- data/docs/mkdocs/configuration/project-file.md +0 -216
- data/docs/mkdocs/configuration/reference/cexception.md +0 -35
- data/docs/mkdocs/configuration/reference/cmock.md +0 -106
- data/docs/mkdocs/configuration/reference/defines.md +0 -352
- data/docs/mkdocs/configuration/reference/environment.md +0 -55
- data/docs/mkdocs/configuration/reference/extension.md +0 -63
- data/docs/mkdocs/configuration/reference/files.md +0 -154
- data/docs/mkdocs/configuration/reference/flags.md +0 -296
- data/docs/mkdocs/configuration/reference/index.md +0 -176
- data/docs/mkdocs/configuration/reference/libraries.md +0 -82
- data/docs/mkdocs/configuration/reference/mixins.md +0 -24
- data/docs/mkdocs/configuration/reference/partials.md +0 -38
- data/docs/mkdocs/configuration/reference/paths.md +0 -276
- data/docs/mkdocs/configuration/reference/plugins.md +0 -60
- data/docs/mkdocs/configuration/reference/project.md +0 -333
- data/docs/mkdocs/configuration/reference/release-build.md +0 -62
- data/docs/mkdocs/configuration/reference/test-build.md +0 -55
- data/docs/mkdocs/configuration/reference/test-runner.md +0 -61
- data/docs/mkdocs/configuration/reference/tools.md +0 -457
- data/docs/mkdocs/configuration/reference/unity.md +0 -49
- data/docs/mkdocs/configuration/which-ceedling.md +0 -77
- data/docs/mkdocs/development/index.md +0 -61
- data/docs/mkdocs/development/plugins/configuration.md +0 -164
- data/docs/mkdocs/development/plugins/index.md +0 -84
- data/docs/mkdocs/development/plugins/plugin-subclass.md +0 -513
- data/docs/mkdocs/development/plugins/rake-tasks.md +0 -54
- data/docs/mkdocs/development/workflow.md +0 -284
- data/docs/mkdocs/getting-started/command-line.md +0 -477
- data/docs/mkdocs/getting-started/example-projects/cipher-quest.md +0 -65
- data/docs/mkdocs/getting-started/example-projects/index.md +0 -49
- data/docs/mkdocs/getting-started/example-projects/temp-sensor.md +0 -60
- data/docs/mkdocs/getting-started/example-projects/wondrous-forest.md +0 -45
- data/docs/mkdocs/getting-started/index.md +0 -41
- data/docs/mkdocs/getting-started/installation.md +0 -179
- data/docs/mkdocs/getting-started/quick-start.md +0 -86
- data/docs/mkdocs/help.md +0 -49
- data/docs/mkdocs/index.md +0 -222
- data/docs/mkdocs/overview/build-system.md +0 -115
- data/docs/mkdocs/overview/index.md +0 -29
- data/docs/mkdocs/overview/test-environments.md +0 -33
- data/docs/mkdocs/overview/tools-and-frameworks.md +0 -115
- data/docs/mkdocs/plugins/beep.md +0 -134
- data/docs/mkdocs/plugins/bullseye.md +0 -83
- data/docs/mkdocs/plugins/command-hooks.md +0 -268
- data/docs/mkdocs/plugins/compile-commands-json-db.md +0 -42
- data/docs/mkdocs/plugins/cppcheck.md +0 -377
- data/docs/mkdocs/plugins/dependencies.md +0 -310
- data/docs/mkdocs/plugins/fff.md +0 -247
- data/docs/mkdocs/plugins/gcov/examples.md +0 -92
- data/docs/mkdocs/plugins/gcov/gcovr.md +0 -526
- data/docs/mkdocs/plugins/gcov/index.md +0 -74
- data/docs/mkdocs/plugins/gcov/overview.md +0 -145
- data/docs/mkdocs/plugins/gcov/reportgenerator.md +0 -246
- data/docs/mkdocs/plugins/gcov/reporting.md +0 -147
- data/docs/mkdocs/plugins/gcov/setup.md +0 -232
- data/docs/mkdocs/plugins/gcov/tool-versions.md +0 -60
- data/docs/mkdocs/plugins/gcov/troubleshooting.md +0 -78
- data/docs/mkdocs/plugins/index.md +0 -261
- data/docs/mkdocs/plugins/module-generator.md +0 -267
- data/docs/mkdocs/plugins/report-build-warnings-log.md +0 -42
- data/docs/mkdocs/plugins/report-tests-gtestlike-stdout.md +0 -98
- data/docs/mkdocs/plugins/report-tests-ide-stdout.md +0 -63
- data/docs/mkdocs/plugins/report-tests-log-factory.md +0 -454
- data/docs/mkdocs/plugins/report-tests-pretty-stdout.md +0 -56
- data/docs/mkdocs/plugins/report-tests-raw-output-log.md +0 -52
- data/docs/mkdocs/plugins/report-tests-teamcity-stdout.md +0 -96
- data/docs/mkdocs/plugins/sample_html_report.png +0 -0
- data/docs/mkdocs/plugins/valgrind.md +0 -198
- data/docs/mkdocs/project/release-history.md +0 -61
- data/docs/mkdocs/project/upgrade.md +0 -85
- data/docs/mkdocs/reference/build-directives.md +0 -37
- data/docs/mkdocs/reference/command-line.md +0 -323
- data/docs/mkdocs/reference/environment-vars.md +0 -60
- data/docs/mkdocs/reference/gcov-plugin.md +0 -600
- data/docs/mkdocs/reference/global-collections.md +0 -160
- data/docs/mkdocs/reference/index.md +0 -65
- data/docs/mkdocs/reference/partials-macros.md +0 -79
- data/docs/mkdocs/reference/project-configuration.md +0 -46
- data/docs/mkdocs/snapshot/examples/cipher_quest/README.md +0 -210
- data/docs/mkdocs/snapshot/examples/temp_sensor/README.md +0 -283
- data/docs/mkdocs/snapshot/examples/wondrous_forest/README.md +0 -92
- data/docs/mkdocs/snapshot/plugins/gcov/config/defaults.yml +0 -32
- data/docs/mkdocs/snapshot/plugins/gcov/config/defaults_gcov.rb +0 -136
- data/docs/mkdocs/snapshot.yml +0 -20
- data/docs/mkdocs/testing-guide/build-directives.md +0 -153
- data/docs/mkdocs/testing-guide/conventions.md +0 -616
- data/docs/mkdocs/testing-guide/frameworks.md +0 -192
- data/docs/mkdocs/testing-guide/index.md +0 -80
- data/docs/mkdocs/testing-guide/partials/configuration.md +0 -67
- data/docs/mkdocs/testing-guide/partials/conventions.md +0 -68
- data/docs/mkdocs/testing-guide/partials/directives.md +0 -212
- data/docs/mkdocs/testing-guide/partials/example.md +0 -149
- data/docs/mkdocs/testing-guide/partials/index.md +0 -88
- data/docs/mkdocs/testing-guide/partials/overview.md +0 -81
- data/docs/mkdocs/testing-guide/partials/variables.md +0 -244
- data/docs/mkdocs/testing-guide/test-cases.md +0 -194
- data/docs/mkdocs/testing-guide/test-sample.md +0 -94
- data/docs/mkdocs/testing-guide/test-suite-anatomy.md +0 -58
- data/lib/ceedling/cacheinator.rb +0 -53
- data/lib/ceedling/cacheinator_helper.rb +0 -60
- data/lib/ceedling/dependinator.rb +0 -31
- data/lib/ceedling/makefile.rb +0 -52
- data/lib/ceedling/release_invoker.rb +0 -112
- data/lib/ceedling/rules_release.rake +0 -109
- data/lib/ceedling/rules_tests.rake +0 -40
- data/lib/ceedling/tasks_release.rake +0 -36
- data/plugins/fff/vendor/fff/Makefile +0 -10
- data/plugins/fff/vendor/fff/buildandtest +0 -15
- data/plugins/fff/vendor/fff/examples/Makefile +0 -7
- data/plugins/fff/vendor/fff/examples/driver_testing/Makefile +0 -64
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.c +0 -32
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.h +0 -21
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.cpp +0 -58
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.fff.cpp +0 -70
- data/plugins/fff/vendor/fff/examples/driver_testing/hardware_abstraction.h +0 -25
- data/plugins/fff/vendor/fff/examples/driver_testing/registers.h +0 -23
- data/plugins/fff/vendor/fff/examples/embedded_ui/DISPLAY.h +0 -27
- data/plugins/fff/vendor/fff/examples/embedded_ui/Kata.txt +0 -25
- data/plugins/fff/vendor/fff/examples/embedded_ui/Makefile +0 -67
- data/plugins/fff/vendor/fff/examples/embedded_ui/SYSTEM.h +0 -31
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI.c +0 -56
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI.h +0 -22
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_ansic.c +0 -191
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_cpp.cpp +0 -144
- data/plugins/fff/vendor/fff/examples/embedded_ui/test_suite_template.c +0 -42
- data/plugins/fff/vendor/fff/gtest/Makefile +0 -22
- data/plugins/fff/vendor/fff/gtest/gtest-all.cc +0 -9118
- data/plugins/fff/vendor/fff/gtest/gtest-main.cc +0 -6
- data/plugins/fff/vendor/fff/gtest/gtest.h +0 -19547
- data/plugins/fff/vendor/fff/test/Makefile +0 -81
- data/plugins/fff/vendor/fff/test/c_test_framework.h +0 -25
- data/plugins/fff/vendor/fff/test/fff_test_c.c +0 -116
- data/plugins/fff/vendor/fff/test/fff_test_cpp.cpp +0 -53
- data/plugins/fff/vendor/fff/test/fff_test_global_c.c +0 -84
- data/plugins/fff/vendor/fff/test/fff_test_global_cpp.cpp +0 -31
- data/plugins/fff/vendor/fff/test/global_fakes.c +0 -21
- data/plugins/fff/vendor/fff/test/global_fakes.h +0 -47
- data/plugins/fff/vendor/fff/test/test_cases.include +0 -276
- data/plugins/report_tests_gtestlike_stdout/assets/template.erb +0 -83
- data/site-local/snapshot/assets/project.yml +0 -404
- data/spec/system/partials_types_header_spec.rb +0 -166
- data/spec/units/configurator_spec.rb +0 -232
- /data/assets/{ceedling → features/ceedling} +0 -0
- /data/assets/{ceedling.cmd → features/ceedling.cmd} +0 -0
- /data/assets/{default_gitignore → features/default_gitignore} +0 -0
- /data/assets/{broken_uncovered_file.c → fixtures/broken_uncovered_file.c} +0 -0
- /data/assets/{example_file.c → fixtures/example_file.c} +0 -0
- /data/assets/{example_file.h → fixtures/example_file.h} +0 -0
- /data/assets/{example_file_call.c → fixtures/example_file_call.c} +0 -0
- /data/assets/{example_file_call.h → fixtures/example_file_call.h} +0 -0
- /data/assets/{example_file_with_statics.c → fixtures/example_file_with_statics.c} +0 -0
- /data/assets/{example_file_with_stdio.c → fixtures/example_file_with_stdio.c} +0 -0
- /data/assets/{example_file_with_stdio.h → fixtures/example_file_with_stdio.h} +0 -0
- /data/assets/{fake_crash_test_fixture.rb → fixtures/fake_crash_test_fixture.rb} +0 -0
- /data/assets/{partial_all_module.h → fixtures/partial_all_module.h} +0 -0
- /data/assets/{run_with_ubsan.rb → fixtures/run_with_ubsan.rb} +0 -0
- /data/assets/{same_dir_pairing_module.c → fixtures/same_dir_pairing_module.c} +0 -0
- /data/assets/{same_dir_pairing_module.h → fixtures/same_dir_pairing_module.h} +0 -0
- /data/assets/{same_dir_pairing_module_func.h → fixtures/same_dir_pairing_module_func.h} +0 -0
- /data/assets/{same_dir_pairing_other.c → fixtures/same_dir_pairing_other.c} +0 -0
- /data/assets/{same_dir_pairing_other.h → fixtures/same_dir_pairing_other.h} +0 -0
- /data/assets/{test_example_file.c → fixtures/test_example_file.c} +0 -0
- /data/assets/{test_example_file_2.c → fixtures/test_example_file_2.c} +0 -0
- /data/assets/{test_example_file_source_include.c → fixtures/test_example_file_source_include.c} +0 -0
- /data/assets/{test_example_file_success.c → fixtures/test_example_file_success.c} +0 -0
- /data/assets/{test_example_file_unity_printf.c → fixtures/test_example_file_unity_printf.c} +0 -0
- /data/assets/{test_example_file_verbose.c → fixtures/test_example_file_verbose.c} +0 -0
- /data/assets/{test_example_file_with_mock.c → fixtures/test_example_file_with_mock.c} +0 -0
- /data/assets/{test_example_file_with_stdio.c → fixtures/test_example_file_with_stdio.c} +0 -0
- /data/assets/{test_example_with_parameterized_tests.c → fixtures/test_example_with_parameterized_tests.c} +0 -0
- /data/assets/{test_partial_all_module.c → fixtures/test_partial_all_module.c} +0 -0
- /data/assets/{test_same_dir_pairing.c → fixtures/test_same_dir_pairing.c} +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_config.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/local_flag_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_wrapper.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/project_flag_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware_special.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.h +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder_partial.c +0 -0
- /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/conditional_module.h +0 -0
- /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/optional_dep.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_blanks.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_counter.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_decorators.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorA.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorB.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorC.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareA.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareB.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareC.c +0 -0
- /data/assets/{uncovered_example_file.c → fixtures/uncovered_example_file.c} +0 -0
- /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
|