ceedling 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/GIT_COMMIT_SHA +1 -1
  3. data/README.md +57 -58
  4. data/Rakefile +5 -3
  5. data/assets/features/ceedling +1 -1
  6. data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_typo.c +14 -0
  7. data/assets/fixtures/tests_with_duplicate_test_names/test_foo.c +21 -0
  8. data/bin/actionator.rb +6 -12
  9. data/bin/app_cfg.rb +35 -1
  10. data/bin/ceedling +13 -3
  11. data/bin/cli.rb +25 -6
  12. data/bin/cli_handler.rb +119 -73
  13. data/bin/cli_helper.rb +56 -78
  14. data/bin/installation_selector.rb +81 -0
  15. data/bin/launchinator.rb +69 -0
  16. data/bin/mixin_resolvinator.rb +26 -36
  17. data/bin/objects.yml +13 -0
  18. data/bin/path_validator.rb +25 -29
  19. data/bin/versionator.rb +47 -48
  20. data/ceedling.gemspec +19 -15
  21. data/docs/BreakingChanges.md +70 -1
  22. data/docs/Changelog.md +84 -3
  23. data/docs/KnownIssues.md +90 -4
  24. data/docs/ReleaseNotes.md +13 -0
  25. data/docs/overrides/main.html +11 -8
  26. data/lib/ceedling/build_log_writer.rb +33 -0
  27. data/lib/ceedling/config/build_root_policy.rb +70 -0
  28. data/lib/ceedling/config/configurator.rb +19 -18
  29. data/lib/ceedling/config/configurator_builder.rb +58 -28
  30. data/lib/ceedling/config/configurator_paths_validator.rb +179 -0
  31. data/lib/ceedling/config/configurator_plugins.rb +1 -1
  32. data/lib/ceedling/config/configurator_setup.rb +39 -41
  33. data/lib/ceedling/config/configurator_validator.rb +1 -110
  34. data/lib/ceedling/defaults.rb +4 -4
  35. data/lib/ceedling/dependencies/README.md +18 -16
  36. data/lib/ceedling/dependencies/dependency_cache_store.rb +20 -3
  37. data/lib/ceedling/dependencies/dependency_hasher.rb +35 -1
  38. data/lib/ceedling/filename_extension.rb +7 -1
  39. data/lib/ceedling/filesystem/FILE_TREE.md +253 -0
  40. data/lib/ceedling/filesystem/PATH_HANDLING.md +304 -0
  41. data/lib/ceedling/filesystem/README.md +41 -0
  42. data/lib/ceedling/filesystem/build_subpath.rb +102 -0
  43. data/lib/ceedling/filesystem/destination_collision.rb +25 -0
  44. data/lib/ceedling/{file_finder.rb → filesystem/file_finder.rb} +159 -104
  45. data/lib/ceedling/{file_finder_helper.rb → filesystem/file_finder_helper.rb} +36 -31
  46. data/lib/ceedling/filesystem/file_path_collection_utils.rb +183 -0
  47. data/lib/ceedling/{file_path_utils.rb → filesystem/file_path_utils.rb} +108 -97
  48. data/lib/ceedling/{file_system_wrapper.rb → filesystem/file_system_wrapper.rb} +6 -5
  49. data/lib/ceedling/filesystem/file_tree.rb +241 -0
  50. data/lib/ceedling/{file_wrapper.rb → filesystem/file_wrapper.rb} +65 -28
  51. data/lib/ceedling/filesystem/path_exclusions.rb +30 -0
  52. data/lib/ceedling/{path_matcher.rb → filesystem/path_matcher.rb} +27 -23
  53. data/lib/ceedling/{path_mirror.rb → filesystem/path_mirror.rb} +19 -18
  54. data/lib/ceedling/filesystem/path_spellings.rb +55 -0
  55. data/lib/ceedling/filesystem/project_paths.rb +184 -0
  56. data/lib/ceedling/filesystem/working_dir.rb +40 -0
  57. data/lib/ceedling/generators/generator.rb +5 -6
  58. data/lib/ceedling/generators/generator_partials.rb +1 -1
  59. data/lib/ceedling/generators/generator_test_results_backtrace.rb +7 -7
  60. data/lib/ceedling/handoff.rb +121 -0
  61. data/lib/ceedling/includes/include_factory.rb +3 -3
  62. data/lib/ceedling/includes/include_pathinator.rb +67 -10
  63. data/lib/ceedling/includes/includes.rb +1 -1
  64. data/lib/ceedling/installation.rb +92 -0
  65. data/lib/ceedling/library_resolver.rb +99 -0
  66. data/lib/ceedling/objects.yml +23 -2
  67. data/lib/ceedling/partials/partializer.rb +4 -4
  68. data/lib/ceedling/partials/partializer_config.rb +3 -1
  69. data/lib/ceedling/plugins/report_log_writer_plugin.rb +3 -5
  70. data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +1 -1
  71. data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +1 -1
  72. data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +1 -1
  73. data/lib/ceedling/rake_app/rakefile_component_resolver.rb +10 -17
  74. data/lib/ceedling/rake_app/test_task_name.rb +29 -0
  75. data/lib/ceedling/rakefile.rb +16 -1
  76. data/lib/ceedling/rakefiles/base/tasks_base.rake +1 -1
  77. data/lib/ceedling/rakefiles/release/rules_release.rake +4 -7
  78. data/lib/ceedling/rakefiles/tests/rules_tests.rake +3 -20
  79. data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +4 -30
  80. data/lib/ceedling/release_invoker/release_build_executor.rb +33 -44
  81. data/lib/ceedling/release_invoker/release_build_planner.rb +14 -6
  82. data/lib/ceedling/reportinator.rb +3 -4
  83. data/lib/ceedling/setupinator.rb +95 -87
  84. data/lib/ceedling/test_context_extractor.rb +5 -1
  85. data/lib/ceedling/test_invoker/PIPELINE.md +9 -7
  86. data/lib/ceedling/test_invoker/mock_locator.rb +60 -2
  87. data/lib/ceedling/test_invoker/partials_manager.rb +12 -0
  88. data/lib/ceedling/test_invoker/standin_headerinator.rb +22 -13
  89. data/lib/ceedling/test_invoker/test_build_executor.rb +42 -41
  90. data/lib/ceedling/test_invoker/test_build_planner.rb +37 -18
  91. data/lib/ceedling/test_invoker/test_build_setup.rb +17 -12
  92. data/lib/ceedling/test_invoker/test_build_validations.rb +16 -31
  93. data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +1 -1
  94. data/lib/ceedling/test_invoker/test_invoker.rb +6 -1
  95. data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +1 -1
  96. data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +40 -20
  97. data/lib/ceedling/tool_executor.rb +9 -3
  98. data/lib/ceedling/yaml_wrapper.rb +3 -2
  99. data/lib/version.rb +1 -1
  100. data/plugins/bullseye/bullseye.rake +6 -9
  101. data/plugins/bullseye/config/defaults_bullseye.rb +1 -1
  102. data/plugins/bullseye/lib/bullseye.rb +9 -7
  103. data/plugins/cppcheck/config/defaults_cppcheck.rb +1 -1
  104. data/plugins/dependencies/config/defaults.yml +6 -6
  105. data/plugins/dependencies/dependencies.rake +4 -1
  106. data/plugins/dependencies/lib/dependencies.rb +18 -8
  107. data/plugins/dependencies/lib/dependency_spec.rb +17 -5
  108. data/plugins/fff/lib/fff.rb +45 -39
  109. data/plugins/fff/spec/fff_cmock_wrapper_spec.rb +128 -0
  110. data/plugins/gcov/config/defaults_gcov.rb +1 -1
  111. data/plugins/gcov/gcov.rake +6 -9
  112. data/plugins/gcov/lib/console_reportinator.rb +4 -18
  113. data/plugins/gcov/lib/gcov.rb +9 -2
  114. data/plugins/gcov/lib/gcovr_reportinator.rb +8 -40
  115. data/plugins/gcov/lib/gcovr_thresholds.rb +74 -0
  116. data/plugins/gcov/lib/reportgenerator_reportinator.rb +1 -1
  117. data/plugins/module_generator/lib/module_generator.rb +3 -3
  118. data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +53 -80
  119. data/plugins/sanitize/lib/sanitize_records.rb +3 -6
  120. data/plugins/sanitize/sanitize.rake +6 -6
  121. data/plugins/valgrind/lib/valgrind.rb +14 -7
  122. data/plugins/valgrind/valgrind.rake +6 -6
  123. data/site-local/404.html +6 -20
  124. data/site-local/assets/javascripts/{bundle.d7400e89.min.js → bundle.c21346df.min.js} +3 -3
  125. data/site-local/assets/javascripts/{bundle.d7400e89.min.js.map → bundle.c21346df.min.js.map} +2 -2
  126. data/site-local/assets/javascripts/workers/{search.2c215733.min.js → search.a7633da7.min.js} +2 -2
  127. data/site-local/assets/javascripts/workers/{search.2c215733.min.js.map → search.a7633da7.min.js.map} +1 -1
  128. data/site-local/assets/stylesheets/main.57a0d79d.min.css +6 -0
  129. data/site-local/assets/stylesheets/main.57a0d79d.min.css.map +1 -0
  130. data/site-local/assets/stylesheets/palette.fb2fffe2.min.css +4 -0
  131. data/site-local/assets/stylesheets/palette.fb2fffe2.min.css.map +1 -0
  132. data/site-local/configuration/environment-vars.html +6 -20
  133. data/site-local/configuration/global-collections.html +6 -20
  134. data/site-local/configuration/index.html +6 -20
  135. data/site-local/configuration/loading.html +6 -20
  136. data/site-local/configuration/mixins.html +10 -24
  137. data/site-local/configuration/parallel-builds.html +6 -20
  138. data/site-local/configuration/project-file.html +8 -22
  139. data/site-local/configuration/reference/cexception.html +6 -20
  140. data/site-local/configuration/reference/cmock.html +8 -21
  141. data/site-local/configuration/reference/defines.html +16 -30
  142. data/site-local/configuration/reference/environment.html +10 -24
  143. data/site-local/configuration/reference/extension.html +6 -20
  144. data/site-local/configuration/reference/files.html +22 -30
  145. data/site-local/configuration/reference/flags.html +13 -27
  146. data/site-local/configuration/reference/index.html +6 -20
  147. data/site-local/configuration/reference/libraries.html +27 -23
  148. data/site-local/configuration/reference/mixins.html +6 -20
  149. data/site-local/configuration/reference/partials.html +6 -20
  150. data/site-local/configuration/reference/paths.html +38 -29
  151. data/site-local/configuration/reference/plugins.html +6 -20
  152. data/site-local/configuration/reference/project.html +32 -36
  153. data/site-local/configuration/reference/release-build.html +8 -20
  154. data/site-local/configuration/reference/test-build.html +6 -20
  155. data/site-local/configuration/reference/test-runner.html +6 -20
  156. data/site-local/configuration/reference/tools.html +27 -32
  157. data/site-local/configuration/reference/unity.html +6 -20
  158. data/site-local/configuration/which-ceedling.html +383 -37
  159. data/site-local/development/index.html +6 -20
  160. data/site-local/development/plugins/configuration.html +6 -20
  161. data/site-local/development/plugins/index.html +6 -20
  162. data/site-local/development/plugins/plugin-subclass.html +54 -68
  163. data/site-local/development/plugins/rake-tasks.html +8 -22
  164. data/site-local/development/releases.html +84 -29
  165. data/site-local/development/workflow.html +62 -71
  166. data/site-local/getting-started/builds.html +8 -20
  167. data/site-local/getting-started/command-line.html +62 -24
  168. data/site-local/getting-started/example-projects/cipher-quest.html +6 -20
  169. data/site-local/getting-started/example-projects/index.html +6 -20
  170. data/site-local/getting-started/example-projects/temp-sensor.html +6 -20
  171. data/site-local/getting-started/example-projects/wondrous-forest.html +6 -20
  172. data/site-local/getting-started/index.html +6 -20
  173. data/site-local/getting-started/installation.html +6 -20
  174. data/site-local/getting-started/quick-start.html +6 -20
  175. data/site-local/help.html +6 -20
  176. data/site-local/index.html +11 -24
  177. data/site-local/overview/build-system.html +6 -20
  178. data/site-local/overview/index.html +6 -20
  179. data/site-local/overview/test-environments.html +6 -20
  180. data/site-local/overview/tools-and-frameworks.html +6 -20
  181. data/site-local/plugins/beep.html +6 -20
  182. data/site-local/plugins/bullseye/index.html +13 -24
  183. data/site-local/plugins/bullseye/licensing.html +14 -28
  184. data/site-local/plugins/command-hooks.html +8 -22
  185. data/site-local/plugins/compile-commands-json-db.html +6 -20
  186. data/site-local/plugins/cppcheck.html +8 -22
  187. data/site-local/plugins/dependencies.html +16 -27
  188. data/site-local/plugins/fff.html +49 -32
  189. data/site-local/plugins/gcov/examples.html +7 -21
  190. data/site-local/plugins/gcov/gcovr.html +22 -33
  191. data/site-local/plugins/gcov/index.html +6 -20
  192. data/site-local/plugins/gcov/overview.html +9 -20
  193. data/site-local/plugins/gcov/reportgenerator.html +9 -23
  194. data/site-local/plugins/gcov/reporting.html +6 -20
  195. data/site-local/plugins/gcov/setup.html +8 -21
  196. data/site-local/plugins/gcov/tool-versions.html +6 -20
  197. data/site-local/plugins/gcov/troubleshooting.html +10 -24
  198. data/site-local/plugins/index.html +6 -20
  199. data/site-local/plugins/module-generator.html +21 -35
  200. data/site-local/plugins/report-build-warnings-log.html +53 -67
  201. data/site-local/plugins/report-tests-gtestlike-stdout.html +6 -20
  202. data/site-local/plugins/report-tests-ide-stdout.html +43 -57
  203. data/site-local/plugins/report-tests-log-factory.html +50 -64
  204. data/site-local/plugins/report-tests-pretty-stdout.html +7 -21
  205. data/site-local/plugins/report-tests-raw-output-log.html +9 -21
  206. data/site-local/plugins/report-tests-teamcity-stdout.html +20 -31
  207. data/site-local/plugins/sanitize.html +56 -65
  208. data/site-local/plugins/valgrind.html +49 -58
  209. data/site-local/project/index.html +6 -20
  210. data/site-local/project/release-history.html +6 -20
  211. data/site-local/project/sbom.html +6 -20
  212. data/site-local/project/upgrade.html +9 -20
  213. data/site-local/reference/build-directives.html +6 -20
  214. data/site-local/reference/command-line.html +15 -22
  215. data/site-local/reference/environment-vars.html +6 -20
  216. data/site-local/reference/gcov-plugin.html +6 -20
  217. data/site-local/reference/global-collections.html +6 -20
  218. data/site-local/reference/index.html +6 -20
  219. data/site-local/reference/partials-macros.html +6 -20
  220. data/site-local/reference/project-configuration.html +6 -20
  221. data/site-local/sitemap.xml.gz +0 -0
  222. data/site-local/snapshot/examples/cipher_quest/index.html +16 -30
  223. data/site-local/snapshot/examples/temp_sensor/index.html +8 -22
  224. data/site-local/snapshot/examples/wondrous_forest/index.html +6 -20
  225. data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +1 -1
  226. data/site-local/snapshot/plugins/gcov/config/defaults_gcov.rb +1 -1
  227. data/site-local/testing-guide/build-directives.html +14 -28
  228. data/site-local/testing-guide/conventions.html +66 -27
  229. data/site-local/testing-guide/frameworks.html +11 -25
  230. data/site-local/testing-guide/index.html +6 -20
  231. data/site-local/testing-guide/partials/configuration.html +8 -22
  232. data/site-local/testing-guide/partials/conventions.html +8 -22
  233. data/site-local/testing-guide/partials/directives.html +16 -30
  234. data/site-local/testing-guide/partials/example.html +14 -28
  235. data/site-local/testing-guide/partials/index.html +6 -20
  236. data/site-local/testing-guide/partials/overview.html +6 -20
  237. data/site-local/testing-guide/partials/variables.html +11 -25
  238. data/site-local/testing-guide/test-cases.html +13 -27
  239. data/site-local/testing-guide/test-sample.html +12 -26
  240. data/site-local/testing-guide/test-suite-anatomy.html +6 -20
  241. data/spec/integration/actionator_file_operations_spec.rb +91 -1
  242. data/spec/integration/compile_commands_json_db_spec.rb +1 -1
  243. data/spec/integration/configurator_pipeline_spec.rb +10 -0
  244. data/spec/integration/configurator_validation_spec.rb +1 -1
  245. data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +26 -0
  246. data/spec/integration/dependencies/dependency_tracker_core_spec.rb +62 -0
  247. data/spec/integration/launcher_handoff_spec.rb +297 -0
  248. data/spec/integration/mixin_loading_spec.rb +1 -1
  249. data/spec/integration/module_generator_spec.rb +3 -3
  250. data/spec/integration/nested_test_artifacts_spec.rb +99 -0
  251. data/spec/integration/partials_module_resolution_spec.rb +7 -4
  252. data/spec/integration/path_intake_scenarios_spec.rb +101 -0
  253. data/spec/integration/path_scenarios_spec.rb +322 -0
  254. data/spec/integration/quote_include_isolator_spec.rb +1 -1
  255. data/spec/integration/rake_task_registry_plugins_spec.rb +95 -0
  256. data/spec/integration/report_build_warnings_log_spec.rb +1 -1
  257. data/spec/integration/report_tests_log_factory_spec.rb +1 -1
  258. data/spec/integration/test_executable_manifest_spec.rb +1 -1
  259. data/spec/integration/test_includes_extractinator_spec.rb +2 -1
  260. data/spec/integration/test_naming_spec.rb +198 -0
  261. data/spec/integration/test_source_file_checks_spec.rb +166 -0
  262. data/spec/integration/tool_validator_spec.rb +1 -1
  263. data/spec/integration/upgrade_docs_spec.rb +84 -0
  264. data/spec/integration/vendor_copy_transient_io_retry_spec.rb +192 -75
  265. data/spec/support/file_tree_helper.rb +88 -0
  266. data/spec/support/integration/configurator_integration_helper.rb +10 -7
  267. data/spec/support/integration/dependency_tracker_integration_helper.rb +1 -1
  268. data/spec/support/integration/partials_generation_integration_helper.rb +2 -2
  269. data/spec/support/integration/path_scenario_harness.rb +173 -0
  270. data/spec/support/integration/spec_integration_helper.rb +1 -1
  271. data/spec/support/integration/test_includes_harness.rb +13 -2
  272. data/spec/support/spec_helper.rb +2 -0
  273. data/spec/support/system/spec_system_helper.rb +7 -6
  274. data/spec/support/system/system_context.rb +21 -3
  275. data/spec/support/working_dir_tracking.rb +49 -0
  276. data/spec/system/build_output_mirroring_spec.rb +2 -2
  277. data/spec/system/conditional_mock_includes_spec.rb +1 -1
  278. data/spec/system/delta_builds_spec.rb +137 -11
  279. data/spec/system/gcov_deployment_spec.rb +1 -0
  280. data/spec/system/header_include_path_validation_spec.rb +4 -4
  281. data/spec/system/launcher_handoff_spec.rb +82 -0
  282. data/spec/system/mock_include_folders_spec.rb +91 -0
  283. data/spec/system/parent_directory_reference_spec.rb +5 -3
  284. data/spec/system/path_handling_probes_spec.rb +192 -0
  285. data/spec/system/preprocessing_parameterized_tests_spec.rb +1 -1
  286. data/spec/system/rake_release_task_path_disambiguation_spec.rb +6 -6
  287. data/spec/system/rake_test_task_path_disambiguation_spec.rb +85 -0
  288. data/spec/system/special_path_characters_spec.rb +86 -0
  289. data/spec/system/support/common_test_cases.rb +23 -21
  290. data/spec/system/support/gcov_common_test_cases.rb +37 -9
  291. data/spec/system/support/sanitize_common_test_cases.rb +2 -2
  292. data/spec/system/support/valgrind_common_test_cases.rb +12 -12
  293. data/spec/system/test_pipeline_stop_points_spec.rb +4 -4
  294. data/spec/system/test_runner_system_include_spec.rb +1 -1
  295. data/spec/system/test_source_file_directive_spec.rb +34 -5
  296. data/spec/units/bin/actionator_spec.rb +14 -17
  297. data/spec/units/bin/app_cfg_spec.rb +47 -0
  298. data/spec/units/bin/cli_handler_spec.rb +284 -7
  299. data/spec/units/bin/cli_helper_spec.rb +126 -45
  300. data/spec/units/bin/installation_selector_spec.rb +114 -0
  301. data/spec/units/bin/launchinator_spec.rb +171 -0
  302. data/spec/units/bin/path_validator_spec.rb +10 -0
  303. data/spec/units/bin/versionator_spec.rb +38 -6
  304. data/spec/units/build_log_writer_spec.rb +57 -0
  305. data/spec/units/config/build_root_policy_spec.rb +61 -0
  306. data/spec/units/config/configurator_builder_spec.rb +37 -6
  307. data/spec/units/config/configurator_paths_validator_spec.rb +292 -0
  308. data/spec/units/config/configurator_setup_spec.rb +65 -103
  309. data/spec/units/config/configurator_spec.rb +37 -6
  310. data/spec/units/config/configurator_validator_spec.rb +1 -172
  311. data/spec/units/default_tools_quoting_spec.rb +83 -0
  312. data/spec/units/dependencies/dependency_cache_store_spec.rb +33 -2
  313. data/spec/units/dependencies/dependency_debug_tree_spec.rb +1 -1
  314. data/spec/units/dependencies/dependency_hasher_spec.rb +42 -1
  315. data/spec/units/dependencies/dependency_path_normalizer_spec.rb +1 -1
  316. data/spec/units/dependencies/dependency_tracker_spec.rb +3 -1
  317. data/spec/units/filename_extension_spec.rb +11 -0
  318. data/spec/units/filesystem/build_subpath_spec.rb +122 -0
  319. data/spec/units/filesystem/destination_collision_spec.rb +30 -0
  320. data/spec/units/{file_finder_helper_spec.rb → filesystem/file_finder_helper_spec.rb} +46 -1
  321. data/spec/units/{file_finder_spec.rb → filesystem/file_finder_spec.rb} +188 -22
  322. data/spec/units/{file_path_collection_utils_spec.rb → filesystem/file_path_collection_utils_spec.rb} +181 -1
  323. data/spec/units/{file_path_utils_spec.rb → filesystem/file_path_utils_spec.rb} +204 -87
  324. data/spec/units/filesystem/file_system_wrapper_spec.rb +33 -0
  325. data/spec/units/filesystem/file_tree_spec.rb +511 -0
  326. data/spec/units/filesystem/file_tree_windows_spec.rb +78 -0
  327. data/spec/units/{file_wrapper_spec.rb → filesystem/file_wrapper_spec.rb} +154 -32
  328. data/spec/units/{path_matcher_spec.rb → filesystem/path_matcher_spec.rb} +12 -1
  329. data/spec/units/{path_mirror_spec.rb → filesystem/path_mirror_spec.rb} +32 -4
  330. data/spec/units/filesystem/project_paths_spec.rb +147 -0
  331. data/spec/units/filesystem/working_dir_spec.rb +71 -0
  332. data/spec/units/generators/generator_spec.rb +12 -6
  333. data/spec/units/generators/generator_test_results_backtrace_spec.rb +50 -46
  334. data/spec/units/generators/generator_test_results_spec.rb +1 -1
  335. data/spec/units/handoff_spec.rb +205 -0
  336. data/spec/units/includes/include_factory_spec.rb +3 -3
  337. data/spec/units/includes/include_pathinator_spec.rb +46 -0
  338. data/spec/units/installation_spec.rb +228 -0
  339. data/spec/units/library_resolver_spec.rb +157 -0
  340. data/spec/units/mock_locator_spec.rb +76 -1
  341. data/spec/units/partials/partializer_config_spec.rb +7 -0
  342. data/spec/units/partials/partializer_spec.rb +1 -0
  343. data/spec/units/partials_manager_spec.rb +17 -0
  344. data/spec/units/plugins/bullseye_spec.rb +15 -2
  345. data/spec/units/plugins/console_reportinator_spec.rb +18 -20
  346. data/spec/units/plugins/dependencies_spec.rb +33 -7
  347. data/spec/units/plugins/dependency_spec_spec.rb +17 -0
  348. data/spec/units/plugins/gcov_spec.rb +28 -3
  349. data/spec/units/plugins/gcovr_reportinator_spec.rb +19 -47
  350. data/spec/units/plugins/gcovr_thresholds_spec.rb +95 -0
  351. data/spec/units/plugins/module_generator_spec.rb +5 -5
  352. data/spec/units/plugins/report_build_warnings_log_spec.rb +3 -3
  353. data/spec/units/plugins/report_log_writer_plugin_spec.rb +10 -1
  354. data/spec/units/plugins/report_tests_raw_output_log_spec.rb +13 -2
  355. data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +77 -3
  356. data/spec/units/plugins/reportgenerator_reportinator_spec.rb +1 -1
  357. data/spec/units/plugins/sanitize_records_spec.rb +3 -1
  358. data/spec/units/plugins/sanitize_spec.rb +1 -1
  359. data/spec/units/plugins/valgrind_spec.rb +23 -8
  360. data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +1 -1
  361. data/spec/units/rake_app/rakefile_component_resolver_spec.rb +21 -0
  362. data/spec/units/rake_app/test_task_name_spec.rb +47 -0
  363. data/spec/units/release_build_executor_spec.rb +53 -14
  364. data/spec/units/release_build_planner_spec.rb +15 -3
  365. data/spec/units/reportinator_spec.rb +5 -5
  366. data/spec/units/standin_headerinator_spec.rb +31 -1
  367. data/spec/units/test_build_executor_spec.rb +107 -5
  368. data/spec/units/test_build_planner_spec.rb +104 -2
  369. data/spec/units/test_build_setup_spec.rb +96 -12
  370. data/spec/units/test_context_extractor_spec.rb +25 -0
  371. data/spec/units/test_file_preprocessinator_spec.rb +17 -1
  372. data/spec/units/test_includes_extractinator_spec.rb +5 -1
  373. data/spec/units/test_invoker/objects_wiring_spec.rb +6 -3
  374. data/spec/units/test_invoker_spec.rb +14 -1
  375. data/spec/units/test_source_file_directive_resolver_spec.rb +38 -7
  376. data/spec/units/tool_executor_spec.rb +26 -0
  377. data/spec/units/yaml_wrapper_spec.rb +11 -0
  378. metadata +122 -33
  379. data/lib/ceedling/file_path_collection_utils.rb +0 -164
  380. data/site-local/assets/stylesheets/main.ec1eaa64.min.css +0 -1
  381. data/site-local/assets/stylesheets/main.ec1eaa64.min.css.map +0 -1
  382. data/site-local/assets/stylesheets/palette.ab4e12ef.min.css +0 -1
  383. data/site-local/assets/stylesheets/palette.ab4e12ef.min.css.map +0 -1
@@ -6,8 +6,8 @@
6
6
  # =========================================================================
7
7
 
8
8
  require 'spec_helper'
9
- require 'ceedling/file_path_utils'
10
- require 'ceedling/file_wrapper'
9
+ require 'ceedling/filesystem/file_path_utils'
10
+ require 'ceedling/filesystem/file_wrapper'
11
11
  require 'ceedling/filename_extension'
12
12
 
13
13
  describe FilePathUtils do
@@ -37,6 +37,12 @@ describe FilePathUtils do
37
37
  expect(result).to match_array(['a'])
38
38
  end
39
39
 
40
+ # The path handling audit around GH #1370: `..` holds `../sib` but not `../../far/x`
41
+ it 'keeps a path above the project that no other path holds' do
42
+ result = FilePathUtils.collapse_to_common_parents(['..', '../../far/x', '../sib'])
43
+ expect(result).to match_array(['..', '../../far/x'])
44
+ end
45
+
40
46
  it 'handles deeply nested redundant paths' do
41
47
  result = FilePathUtils.collapse_to_common_parents(['src', 'src/a/b/c', 'lib'])
42
48
  expect(result).to match_array(['src', 'lib'])
@@ -78,6 +84,11 @@ describe FilePathUtils do
78
84
  expect( FilePathUtils.standardize_in_place( 'foo/bar/baz' ) ).to eq( 'foo/bar/baz' )
79
85
  end
80
86
 
87
+ # GH #1370 audit (G21)
88
+ it 'reads `~` as the home directory' do
89
+ expect( FilePathUtils.standardize_in_place( +'~/inc' ) ).to eq( File.join( Dir.home, 'inc' ) )
90
+ end
91
+
81
92
  it 'returns nil unchanged for a nil argument' do
82
93
  expect( FilePathUtils.standardize_in_place( nil ) ).to be_nil
83
94
  end
@@ -365,25 +376,25 @@ describe FilePathUtils do
365
376
  .to eq('build/test/runners/test_foo_runner.c')
366
377
  end
367
378
 
368
- it 'forms a flat runner filepath for a flat test\'s own identity' do
369
- expect( @fpu.form_runner_filepath_from_test('test/test_foo.c', name: 'test_foo') )
379
+ it 'forms a runner filepath in the runners directory itself for a test at the project root' do
380
+ expect( @fpu.form_runner_filepath_from_test('test_foo.c', name: 'test_foo') )
370
381
  .to eq('build/test/runners/test_foo_runner.c')
371
382
  end
372
383
 
373
- it 'mirrors the runner beneath the test\'s own mirrored subdirectory, distinguishing same-named tests' do
374
- expect( @fpu.form_runner_filepath_from_test('test/unit/test_foo.c', name: 'unit/test_foo') )
375
- .to eq('build/test/runners/unit/test_foo_runner.c')
384
+ it 'places the runner beneath the directories of the test\'s name, distinguishing same-named tests' do
385
+ expect( @fpu.form_runner_filepath_from_test('test/unit/test_foo.c', name: 'test/unit/test_foo') )
386
+ .to eq('build/test/runners/test/unit/test_foo_runner.c')
376
387
 
377
- expect( @fpu.form_runner_filepath_from_test('test/integration/test_foo.c', name: 'integration/test_foo') )
378
- .to eq('build/test/runners/integration/test_foo_runner.c')
388
+ expect( @fpu.form_runner_filepath_from_test('test/integration/test_foo.c', name: 'test/integration/test_foo') )
389
+ .to eq('build/test/runners/test/integration/test_foo_runner.c')
379
390
  end
380
391
 
381
- it 'forms a flat runner directory for a flat test' do
392
+ it 'forms the runners directory itself for a test at the project root' do
382
393
  expect( @fpu.form_test_runners_path('test_foo') ).to eq('build/test/runners')
383
394
  end
384
395
 
385
- it 'forms the runner directory itself beneath a nested test\'s own mirrored subdirectory' do
386
- expect( @fpu.form_test_runners_path('unit/test_foo') ).to eq('build/test/runners/unit')
396
+ it 'forms the runner directory beneath the directories of the test\'s name' do
397
+ expect( @fpu.form_test_runners_path('test/unit/test_foo') ).to eq('build/test/runners/test/unit')
387
398
  end
388
399
  end
389
400
 
@@ -449,12 +460,54 @@ describe FilePathUtils do
449
460
  .to eq('build/gcov/dependencies/AdcCalc.d')
450
461
  end
451
462
 
463
+ # A context's own objects, outside any test, are placed by their sources' paths too
464
+ it 'follows a context\'s own object below its output root when no test identity is given' do
465
+ expect( @fpu.form_test_dependencies_filepath('build/gcov/out/src/a/util.o', context: :gcov) )
466
+ .to eq('build/gcov/dependencies/src/a/util.d')
467
+ end
468
+
452
469
  it 'forms the list filepath directly alongside the object, wherever it was mirrored to' do
453
470
  expect( @fpu.form_test_build_list_filepath('build/test/out/TestFoo/calculators/AdcCalc.o') )
454
471
  .to eq('build/test/out/TestFoo/calculators/AdcCalc.lst')
455
472
  end
456
473
  end
457
474
 
475
+ describe '#form_test_object_filepath' do
476
+ before(:each) do
477
+ @configurator = double('configurator')
478
+ @file_wrapper = double('file_wrapper')
479
+ allow(@file_wrapper).to receive(:check_path_length)
480
+ @fpu = described_class.new({
481
+ :configurator => @configurator,
482
+ :file_wrapper => @file_wrapper
483
+ })
484
+
485
+ allow(@configurator).to receive(:project_build_root).and_return('build')
486
+ allow(@configurator).to receive(:extension_object).and_return( FilenameExtension.new('.o') )
487
+ allow(@configurator).to receive(:project_use_partials).and_return( true )
488
+ allow(@configurator).to receive(:project_use_mocks).and_return( true )
489
+ allow(@configurator).to receive(:project_test_partials_path).and_return('build/test/partials')
490
+ allow(@configurator).to receive(:cmock_mock_path).and_return('build/test/mocks')
491
+ end
492
+
493
+ it 'places a test\'s object where its build does, by the source\'s path from the project root' do
494
+ expect( @fpu.form_test_object_filepath('src/a/util.c', name: 'test/test_util', context: :gcov) )
495
+ .to eq('build/gcov/out/test/test_util/src/a/util.o')
496
+ end
497
+
498
+ # Untested sources compile outside any test, so same-named ones keep apart only by path
499
+ it 'places a context\'s own objects apart, by their sources\' paths, when no test is named' do
500
+ expect( @fpu.form_test_object_filepath('src/a/util.c', context: :gcov) ).to eq('build/gcov/out/src/a/util.o')
501
+ expect( @fpu.form_test_object_filepath('src/b/util.c', context: :gcov) ).to eq('build/gcov/out/src/b/util.o')
502
+ end
503
+
504
+ it 'places a test\'s generated Partial below its own subdirectory, as its build does' do
505
+ expect(
506
+ @fpu.form_test_object_filepath('build/test/partials/test/test_util/drv/ceedling_partial_util_impl.c', name: 'test/test_util', context: :gcov)
507
+ ).to eq('build/gcov/out/test/test_util/drv/ceedling_partial_util_impl.o')
508
+ end
509
+ end
510
+
458
511
  describe '#form_test_preprocess_build_directives_path, #form_test_build_directives_cache_filepath, #form_preprocessed_source_files_cache_filepath' do
459
512
  before(:each) do
460
513
  @configurator = double('configurator')
@@ -497,19 +550,28 @@ describe FilePathUtils do
497
550
  })
498
551
 
499
552
  allow(@configurator).to receive(:project_release_build_output_path).and_return('build/release/out')
553
+ allow(@configurator).to receive(:project_build_root).and_return('build')
500
554
  allow(@configurator).to receive(:extension_object).and_return( FilenameExtension.new('.o') )
501
- allow(@configurator).to receive(:paths_source).and_return( ['drivers'] )
502
555
  end
503
556
 
504
- it 'mirrors each object beneath whichever configured source root matched its file, distinguishing same-named sources' do
505
- objects = @fpu.form_release_build_objects_filelist( ['drivers/foo/bar.c', 'drivers/baz/bar.c'] )
506
- expect( objects ).to include('build/release/out/foo/bar.o')
507
- expect( objects ).to include('build/release/out/baz/bar.o')
557
+ it 'places each object by its source\'s path from the project root, distinguishing same-named sources' do
558
+ objects = @fpu.form_release_build_objects_filelist( ['drivers/foo/bar.c', 'drivers/baz/bar.c', 'lib/bar.c'] )
559
+ expect( objects ).to eq(['build/release/out/drivers/foo/bar.o', 'build/release/out/drivers/baz/bar.o', 'build/release/out/lib/bar.o'])
508
560
  end
509
561
 
510
- it 'leaves a file matching no configured source root flat' do
511
- objects = @fpu.form_release_build_objects_filelist( ['vendor/unity.c'] )
512
- expect( objects ).to eq(['build/release/out/unity.o'])
562
+ it 'places a source above the project root below the output root' do
563
+ objects = @fpu.form_release_build_objects_filelist( ['../shared/src/crc.c'] )
564
+ expect( objects ).to eq(['build/release/out/_up_/shared/src/crc.o'])
565
+ end
566
+
567
+ it 'leaves a source below the build root flat' do
568
+ objects = @fpu.form_release_build_objects_filelist( ['build/vendor/c_exception/lib/CException.c'] )
569
+ expect( objects ).to eq(['build/release/out/CException.o'])
570
+ end
571
+
572
+ it 'refuses two sources that would build to one object, naming both' do
573
+ expect { @fpu.form_release_build_objects_filelist( ['build/vendor/c_exception/lib/CException.c', 'CException.c'] ) }
574
+ .to raise_error( CeedlingException, /`build\/vendor\/c_exception\/lib\/CException.c` and `CException.c`.*`build\/release\/out\/CException.o`/ )
513
575
  end
514
576
  end
515
577
 
@@ -526,21 +588,16 @@ describe FilePathUtils do
526
588
  })
527
589
 
528
590
  allow(@configurator).to receive(:project_release_dependencies_path).and_return('build/release/dependencies')
591
+ allow(@configurator).to receive(:project_build_root).and_return('build')
529
592
  allow(@configurator).to receive(:extension_dependencies).and_return( FilenameExtension.new('.d') )
530
- allow(@configurator).to receive(:paths_source).and_return( ['drivers'] )
531
593
  end
532
594
 
533
- it 'mirrors each dependency file the same way as its corresponding object' do
595
+ it 'places each dependency file the same way as its corresponding object' do
534
596
  deps = @fpu.form_release_dependencies_filelist( ['drivers/foo/bar.c', 'drivers/baz/bar.c'] )
535
- expect( deps ).to include('build/release/dependencies/foo/bar.d')
536
- expect( deps ).to include('build/release/dependencies/baz/bar.d')
597
+ expect( deps ).to eq(['build/release/dependencies/drivers/foo/bar.d', 'build/release/dependencies/drivers/baz/bar.d'])
537
598
  end
538
599
  end
539
600
 
540
- # Every preprocessed artifact for a test lands below that test's own subdirectory.
541
- # That alone kept artifacts apart while a test had at most one source of any given
542
- # basename. Two same-basename sources in one test overwrite each other, so the
543
- # source's own namespace below its configured root is mirrored as well.
544
601
  # A mock's generated files sit below its test's mock root, in the subdirectory mirroring
545
602
  # whatever it mocks. Two places need that directory -- the stage that compiles the mock
546
603
  # and the stage that generates it -- and they must agree, or a mock is compiled from a
@@ -580,46 +637,35 @@ describe FilePathUtils do
580
637
 
581
638
  allow(@configurator).to receive(:project_test_preprocess_files_path).and_return('build/test/preprocess/files')
582
639
  allow(@configurator).to receive(:project_test_preprocess_includes_path).and_return('build/test/preprocess/includes')
583
- allow(@configurator).to receive(:paths_source).and_return( ['src/**'] )
584
- allow(@configurator).to receive(:paths_include).and_return( ['include/**'] )
585
- allow(@configurator).to receive(:paths_support).and_return( [] )
586
- allow(@configurator).to receive(:paths_test).and_return( ['test/**'] )
640
+ allow(@configurator).to receive(:project_build_root).and_return('build')
587
641
  allow(@configurator).to receive(:project_use_partials).and_return( true )
588
642
  allow(@configurator).to receive(:project_use_mocks).and_return( true )
589
643
  allow(@configurator).to receive(:project_test_partials_path).and_return('build/test/partials')
590
644
  allow(@configurator).to receive(:cmock_mock_path).and_return('build/test/mocks')
591
645
  end
592
646
 
593
- # A file sitting directly in a configured root has no namespace of its own, so its
594
- # artifact stays flat -- the layout every project has always seen.
595
- it 'keeps a file directly in a configured root flat' do
596
- expect( @fpu.form_preprocessed_file_filepath('src/foo.c', 'test_foo') )
597
- .to eq('build/test/preprocess/files/test_foo/foo.c')
598
- expect( @fpu.form_preprocessed_file_full_expansion_filepath('src/foo.c', 'test_foo') )
599
- .to eq('build/test/preprocess/files/test_foo/full_expansion/foo.c')
600
- expect( @fpu.form_preprocessed_file_raw_directives_only_filepath('src/foo.c', 'test_foo') )
601
- .to eq('build/test/preprocess/files/test_foo/directives_only/raw/foo.c')
602
- expect( @fpu.form_preprocessed_file_compacted_directives_only_filepath('src/foo.c', 'test_foo') )
603
- .to eq('build/test/preprocess/files/test_foo/directives_only/foo.c')
604
- expect( @fpu.form_preprocessed_file_fallback_expansion_filepath('src/foo.c', 'test_foo') )
605
- .to eq('build/test/preprocess/files/test_foo/fallback_expansion/foo.c')
606
- expect( @fpu.form_preprocessed_includes_list_filepath('src/foo.c', 'test_foo') )
607
- .to eq('build/test/preprocess/includes/test_foo/foo.c.yml')
608
- end
609
-
610
- it 'mirrors a nested source below the test subdirectory' do
647
+ # Each artifact of a test sits below the test's own subdirectory, at its file's path
648
+ # from the project root, so two same-named files in one test never share one
649
+ it 'places a file by its path from the project root below the test subdirectory' do
611
650
  expect( @fpu.form_preprocessed_file_filepath('src/drivers/uart/config.c', 'test_both') )
612
- .to eq('build/test/preprocess/files/test_both/drivers/uart/config.c')
651
+ .to eq('build/test/preprocess/files/test_both/src/drivers/uart/config.c')
613
652
  expect( @fpu.form_preprocessed_file_full_expansion_filepath('src/drivers/uart/config.c', 'test_both') )
614
- .to eq('build/test/preprocess/files/test_both/full_expansion/drivers/uart/config.c')
653
+ .to eq('build/test/preprocess/files/test_both/full_expansion/src/drivers/uart/config.c')
615
654
  expect( @fpu.form_preprocessed_file_raw_directives_only_filepath('src/drivers/uart/config.c', 'test_both') )
616
- .to eq('build/test/preprocess/files/test_both/directives_only/raw/drivers/uart/config.c')
655
+ .to eq('build/test/preprocess/files/test_both/directives_only/raw/src/drivers/uart/config.c')
617
656
  expect( @fpu.form_preprocessed_file_compacted_directives_only_filepath('src/drivers/uart/config.c', 'test_both') )
618
- .to eq('build/test/preprocess/files/test_both/directives_only/drivers/uart/config.c')
657
+ .to eq('build/test/preprocess/files/test_both/directives_only/src/drivers/uart/config.c')
619
658
  expect( @fpu.form_preprocessed_file_fallback_expansion_filepath('src/drivers/uart/config.c', 'test_both') )
620
- .to eq('build/test/preprocess/files/test_both/fallback_expansion/drivers/uart/config.c')
659
+ .to eq('build/test/preprocess/files/test_both/fallback_expansion/src/drivers/uart/config.c')
621
660
  expect( @fpu.form_preprocessed_includes_list_filepath('src/drivers/uart/config.c', 'test_both') )
622
- .to eq('build/test/preprocess/includes/test_both/drivers/uart/config.c.yml')
661
+ .to eq('build/test/preprocess/includes/test_both/src/drivers/uart/config.c.yml')
662
+ end
663
+
664
+ it 'keeps a header far above the project below the test subdirectory' do
665
+ far = File.expand_path( '../../far/inc/sdk.h' )
666
+ expect( @fpu.form_preprocessed_file_filepath( far, 'test_both' ) )
667
+ .to eq( File.join( 'build/test/preprocess/files/test_both', BuildSubpath.of_directory( File.dirname( far ) ), 'sdk.h' ) )
668
+ expect( BuildSubpath.of_directory( File.dirname( far ) ) ).to_not include( '..' )
623
669
  end
624
670
 
625
671
  # The defect itself: two sources sharing a basename in one test.
@@ -641,9 +687,9 @@ describe FilePathUtils do
641
687
  @fpu.form_preprocessed_includes_list_filepath('src/drivers/uart/config.c', 'test_both')
642
688
  end
643
689
 
644
- it 'mirrors a nested header below its own include root' do
690
+ it 'places a header by its path from the project root' do
645
691
  expect( @fpu.form_preprocessed_file_filepath('include/drivers/uart/config.h', 'test_both') )
646
- .to eq('build/test/preprocess/files/test_both/drivers/uart/config.h')
692
+ .to eq('build/test/preprocess/files/test_both/include/drivers/uart/config.h')
647
693
  end
648
694
 
649
695
  # A generated Partial or mock sits below its own test's generated root rather than a
@@ -676,9 +722,7 @@ describe FilePathUtils do
676
722
  ).to eq('build/test/preprocess/files/test_both/drivers/spi/mock_config.h')
677
723
  end
678
724
 
679
- # A generated file sits below no configured root, so nothing mirrors it and its
680
- # artifact stays where it has always been.
681
- it 'keeps a generated file flat' do
725
+ it 'keeps a generated file directly in its test root flat' do
682
726
  expect( @fpu.form_preprocessed_file_filepath('build/test/mocks/test_both/Mockconfig.h', 'test_both') )
683
727
  .to eq('build/test/preprocess/files/test_both/Mockconfig.h')
684
728
  end
@@ -697,27 +741,42 @@ describe FilePathUtils do
697
741
  })
698
742
 
699
743
  allow(@configurator).to receive(:extension_object).and_return( FilenameExtension.new('.o') )
700
- allow(@configurator).to receive(:paths_source).and_return( ['drivers'] )
701
- allow(@configurator).to receive(:paths_support).and_return( ['support'] )
744
+ allow(@configurator).to receive(:project_build_root).and_return('build')
702
745
  end
703
746
 
704
- it 'mirrors a module-under-test or support source beneath its matching configured root' do
747
+ it 'places a test, module-under-test or support source by its path from the project root' do
705
748
  objects = @fpu.form_test_build_objects_filelist(
706
- 'build/test/out/TestFoo', ['drivers/foo/bar.c', 'drivers/baz/bar.c']
749
+ 'build/test/out/TestFoo', ['test/TestFoo.c', 'drivers/foo/bar.c', 'drivers/baz/bar.c', 'support/qux.c']
707
750
  )
708
- expect( objects ).to include('build/test/out/TestFoo/foo/bar.o')
709
- expect( objects ).to include('build/test/out/TestFoo/baz/bar.o')
751
+ expect( objects ).to eq([
752
+ 'build/test/out/TestFoo/test/TestFoo.o',
753
+ 'build/test/out/TestFoo/drivers/foo/bar.o',
754
+ 'build/test/out/TestFoo/drivers/baz/bar.o',
755
+ 'build/test/out/TestFoo/support/qux.o'
756
+ ])
710
757
  end
711
758
 
712
- it 'leaves the test file itself, mocks, and other unmatched inputs flat' do
759
+ # A source collected by one spelling and configured by another is still one source
760
+ it 'builds one file named by two spellings once, as no collision' do
713
761
  objects = @fpu.form_test_build_objects_filelist(
714
- 'build/test/out/TestFoo', ['test/TestFoo.c', 'MockBar.c', 'support/qux.c']
762
+ 'build/test/out/TestFoo', ['test/support/helper.c', './test/support/helper.c', 'build/vendor/c_exception/lib/CException.c', './build/vendor/c_exception/lib/CException.c']
715
763
  )
716
- expect( objects ).to eq([
717
- 'build/test/out/TestFoo/TestFoo.o',
718
- 'build/test/out/TestFoo/MockBar.o',
719
- 'build/test/out/TestFoo/qux.o'
720
- ])
764
+ expect( objects ).to eq(['build/test/out/TestFoo/test/support/helper.o', 'build/test/out/TestFoo/CException.o'])
765
+ end
766
+
767
+ # A source far from the project gains a directory for each level its path climbs, which
768
+ # can reach Windows' path length limit
769
+ it 'checks the length of each object\'s whole path, once' do
770
+ expect(@file_wrapper).to receive(:check_path_length).with( 'build/test/out/TestFoo/_up_/_up_/far/src/x.o', origin: 'FilePathUtils#build_filepath' ).once
771
+
772
+ 2.times { @fpu.form_test_build_objects_filelist( 'build/test/out/TestFoo', ['../../far/src/x.c'] ) }
773
+ end
774
+
775
+ it 'leaves a runner or vendored framework source below the build root flat' do
776
+ objects = @fpu.form_test_build_objects_filelist(
777
+ 'build/test/out/TestFoo', ['build/test/runners/TestFoo_runner.c', 'build/vendor/unity/src/unity.c']
778
+ )
779
+ expect( objects ).to eq(['build/test/out/TestFoo/TestFoo_runner.o', 'build/test/out/TestFoo/unity.o'])
721
780
  end
722
781
 
723
782
  # Generated Partial sources sit below their own build root, not a configured source
@@ -739,7 +798,7 @@ describe FilePathUtils do
739
798
  ])
740
799
  end
741
800
 
742
- it 'leaves inputs flat when no extra root is supplied' do
801
+ it 'leaves a generated source flat when its root is not supplied' do
743
802
  objects = @fpu.form_test_build_objects_filelist(
744
803
  'build/test/out/TestFoo',
745
804
  ['build/test/partials/TestFoo/drivers/uart/ceedling_partial_config_impl.c']
@@ -762,20 +821,82 @@ describe FilePathUtils do
762
821
  })
763
822
 
764
823
  allow(@configurator).to receive(:extension_testpass).and_return( FilenameExtension.new('.pass') )
765
- allow(@configurator).to receive(:paths_test).and_return( ['test'] )
824
+ allow(@configurator).to receive(:project_build_root).and_return( 'build' )
825
+ allow(@file_wrapper).to receive(:check_path_length)
766
826
  end
767
827
 
768
- it 'mirrors each expected results file beneath the same test identity its own build directory uses' do
828
+ it 'mirrors each expected results file beneath the same test name its own build directory uses' do
769
829
  results = @fpu.form_pass_results_filelist(
770
830
  'build/test/results', ['test/unit/test_foo.c', 'test/integration/test_foo.c']
771
831
  )
772
- expect( results ).to include('build/test/results/unit/test_foo.pass')
773
- expect( results ).to include('build/test/results/integration/test_foo.pass')
832
+ expect( results ).to include('build/test/results/test/unit/test_foo.pass')
833
+ expect( results ).to include('build/test/results/test/integration/test_foo.pass')
774
834
  end
775
835
 
776
- it 'leaves a flat test\'s own results file flat, undisturbed by mirroring' do
836
+ it 'places a test at its root beneath that root, as its name does' do
777
837
  results = @fpu.form_pass_results_filelist('build/test/results', ['test/test_bar.c'])
778
- expect( results ).to eq(['build/test/results/test_bar.pass'])
838
+ expect( results ).to eq(['build/test/results/test/test_bar.pass'])
839
+ end
840
+
841
+ # GH #1364: same-named tests at a root and below it, and under two roots
842
+ it 'gives same-named tests distinct results files' do
843
+ tests = ['test/test_calc.c', 'test/unit/test_calc.c', 'extra/unit/test_calc.c']
844
+ results = @fpu.form_pass_results_filelist( 'build/test/results', tests )
845
+ expect( results.uniq.size ).to eq(3)
846
+ end
847
+
848
+ it 'agrees with the results path each test is given' do
849
+ ['test/test_calc.c', 'test/unit/test_calc.c', '../shared/test/test_s.c'].each do |test|
850
+ name = @fpu.form_test_name( test )
851
+ expected = @fpu.form_pass_results_filepath( @fpu.form_test_results_path( name, context: 'test' ), test )
852
+ expect( @fpu.form_pass_results_filelist( 'build/test/results', [test] ) ).to eq([expected])
853
+ end
854
+ end
855
+ end
856
+
857
+ describe '#form_test_name' do
858
+ before(:each) do
859
+ @fpu = described_class.new({ :configurator => double('configurator'), :file_wrapper => double('file_wrapper') })
860
+ end
861
+
862
+ it 'names a test by its path from the project root, without its extension' do
863
+ expect( @fpu.form_test_name( 'test/test_calc.c' ) ).to eq('test/test_calc')
864
+ expect( @fpu.form_test_name( 'test/unit/test_calc.c' ) ).to eq('test/unit/test_calc')
865
+ end
866
+
867
+ # GH #1364: the same layout under two roots and a :files test outside every root
868
+ it 'keeps the root, so same-named tests under different roots get different names' do
869
+ names = ['test/foo/test_x.c', 'extra/foo/test_x.c', 'other/test_x.c'].map { |test| @fpu.form_test_name( test ) }
870
+ expect( names ).to eq(['test/foo/test_x', 'extra/foo/test_x', 'other/test_x'])
871
+ end
872
+
873
+ it 'gives one name however the path is written' do
874
+ expect( @fpu.form_test_name( './test/unit/test_calc.c' ) ).to eq('test/unit/test_calc')
875
+ expect( @fpu.form_test_name( 'test\\unit\\test_calc.c' ) ).to eq('test/unit/test_calc')
876
+ expect( @fpu.form_test_name( File.join( Dir.pwd, 'test/unit/test_calc.c' ) ) ).to eq('test/unit/test_calc')
877
+ end
878
+
879
+ it 'keeps a test outside the project inside the build directory' do
880
+ expect( @fpu.form_test_name( '../shared/test/unit/test_s.c' ) ).to eq('_up_/shared/test/unit/test_s')
881
+ expect( @fpu.form_test_name( '../../other/test_o.c' ) ).to eq('_up_/_up_/other/test_o')
882
+ end
883
+
884
+ it 'names an absolute path outside the project by its path from the project' do
885
+ outside = File.join( File.dirname( Dir.pwd ), 'shared', 'test', 'test_s.c' )
886
+ expect( @fpu.form_test_name( outside ) ).to eq('_up_/shared/test/test_s')
887
+ end
888
+
889
+ # A drive other than the working directory's, which on Windows may itself be C: or D:
890
+ it 'places a test on another Windows drive beneath its drive letter' do
891
+ drive = Dir.pwd.match?( /\A[Qq]:/ ) ? 'R' : 'Q'
892
+
893
+ expect( @fpu.form_test_name( "#{drive}:/work/test/test_x.c" ) ).to eq("_abs_/#{drive}/work/test/test_x")
894
+ expect( @fpu.form_test_name( "#{drive}:\\work\\test\\test_x.c" ) ).to eq("_abs_/#{drive}/work/test/test_x")
895
+ end
896
+
897
+ it 'names a test on the working directory\'s own Windows drive by its relative path', if: Dir.pwd.match?( /\A[A-Za-z]:/ ) do
898
+ inside = File.join( Dir.pwd, 'test', 'test_x.c' ).tr( '/', '\\' )
899
+ expect( @fpu.form_test_name( inside ) ).to eq('test/test_x')
779
900
  end
780
901
  end
781
902
 
@@ -790,19 +911,15 @@ describe FilePathUtils do
790
911
  })
791
912
 
792
913
  allow(@configurator).to receive(:project_test_preprocess_includes_path).and_return('build/test/preprocess/includes')
793
- # The test file sits directly in its root, so nothing is mirrored here.
914
+ allow(@configurator).to receive(:project_build_root).and_return('build')
794
915
  allow(@configurator).to receive(:project_use_partials).and_return( false )
795
916
  allow(@configurator).to receive(:project_use_mocks).and_return( false )
796
- allow(@configurator).to receive(:paths_source).and_return( [] )
797
- allow(@configurator).to receive(:paths_support).and_return( [] )
798
- allow(@configurator).to receive(:paths_include).and_return( [] )
799
- allow(@configurator).to receive(:paths_test).and_return( ['test'] )
800
917
  end
801
918
 
802
919
  it 'uses the fixed internal .yml extension regardless of a project-configured :extension ↳ :yaml setting' do
803
920
  expect(@configurator).to_not receive(:extension_yaml)
804
921
  expect( @fpu.form_preprocessed_includes_list_filepath('test/TestFoo.c', 'TestFoo') )
805
- .to eq('build/test/preprocess/includes/TestFoo/TestFoo.c.yml')
922
+ .to eq('build/test/preprocess/includes/TestFoo/test/TestFoo.c.yml')
806
923
  end
807
924
  end
808
925
 
@@ -0,0 +1,33 @@
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
+ require 'spec_helper'
9
+ require 'tmpdir'
10
+ require 'fileutils'
11
+ require 'ceedling/filesystem/file_system_wrapper'
12
+ require 'ceedling/filesystem/working_dir'
13
+
14
+ describe FileSystemWrapper do
15
+ around(:each) do |example|
16
+ Dir.mktmpdir do |dir|
17
+ @ws = File.realpath( dir )
18
+ FileUtils.mkdir_p( File.join( @ws, 'app/dep' ) )
19
+ Dir.chdir( File.join( @ws, 'app' ) ) { WorkingDirTracking.untracked { example.run } }
20
+ end
21
+ end
22
+
23
+ # A plugin can change directory through this object, and paths it resolves inside must
24
+ # resolve against the directory it changed to
25
+ it 'changes directory for the block as WorkingDir.chdir does' do
26
+ WorkingDir.path
27
+
28
+ inside = described_class.new.cd( 'dep' ) { WorkingDir.path }
29
+
30
+ expect(inside).to eq( File.join( @ws, 'app/dep' ) )
31
+ expect(WorkingDir.path).to eq( File.join( @ws, 'app' ) )
32
+ end
33
+ end