ceedling 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1263) hide show
  1. checksums.yaml +4 -4
  2. data/GIT_COMMIT_SHA +1 -1
  3. data/Gemfile +7 -1
  4. data/Gemfile.lock +19 -12
  5. data/README.md +140 -156
  6. data/Rakefile +189 -9
  7. data/assets/example_file.c +1 -1
  8. data/assets/example_file.h +1 -1
  9. data/assets/example_file_call.c +1 -1
  10. data/assets/example_file_call.h +1 -1
  11. data/assets/example_file_with_statics.c +10 -0
  12. data/assets/example_file_with_stdio.c +13 -0
  13. data/assets/example_file_with_stdio.h +15 -0
  14. data/assets/project.yml +20 -18
  15. data/assets/test_example_file.c +1 -1
  16. data/assets/test_example_file_boom.c +1 -1
  17. data/assets/test_example_file_crash_assert.c +25 -0
  18. data/assets/{test_example_file_crash.c → test_example_file_crash_sigsegv.c} +4 -3
  19. data/assets/test_example_file_source_include.c +17 -0
  20. data/assets/test_example_file_success.c +1 -1
  21. data/assets/test_example_file_unity_printf.c +1 -1
  22. data/assets/test_example_file_verbose.c +1 -1
  23. data/assets/test_example_file_with_mock.c +1 -1
  24. data/assets/test_example_file_with_stdio.c +18 -0
  25. data/assets/test_example_with_parameterized_tests.c +1 -1
  26. data/assets/tests_with_defines/src/adc_hardware.c +1 -1
  27. data/assets/tests_with_defines/src/adc_hardware.h +1 -1
  28. data/assets/tests_with_defines/src/adc_hardware_configurator.c +1 -1
  29. data/assets/tests_with_defines/src/adc_hardware_configurator.h +1 -1
  30. data/assets/tests_with_defines/test/test_adc_hardware.c +1 -1
  31. data/assets/tests_with_defines/test/test_adc_hardware_special.c +1 -1
  32. data/assets/tests_with_encoding/src/unicoder.c +12 -0
  33. data/assets/tests_with_encoding/src/unicoder.h +14 -0
  34. data/assets/tests_with_encoding/test/test_unicoder.c +15 -0
  35. data/assets/tests_with_encoding/test/test_unicoder_partial.c +17 -0
  36. data/assets/tests_with_fallback_conditionals/src/conditional_module.c +18 -0
  37. data/assets/tests_with_fallback_conditionals/src/conditional_module.h +13 -0
  38. data/assets/tests_with_fallback_conditionals/src/optional_dep.h +12 -0
  39. data/assets/tests_with_fallback_conditionals/test/test_conditionals.c +49 -0
  40. data/assets/tests_with_preprocessing/src/adc_hardwareA.c +1 -1
  41. data/assets/tests_with_preprocessing/src/adc_hardwareA.h +1 -1
  42. data/assets/tests_with_preprocessing/src/adc_hardwareB.c +1 -1
  43. data/assets/tests_with_preprocessing/src/adc_hardwareB.h +1 -1
  44. data/assets/tests_with_preprocessing/src/adc_hardwareC.c +1 -1
  45. data/assets/tests_with_preprocessing/src/adc_hardwareC.h +1 -1
  46. data/assets/tests_with_preprocessing/src/adc_hardware_configuratorA.h +1 -1
  47. data/assets/tests_with_preprocessing/src/adc_hardware_configuratorB.h +1 -1
  48. data/assets/tests_with_preprocessing/src/adc_hardware_configuratorC.h +1 -1
  49. data/assets/tests_with_preprocessing/test/test_adc_hardwareA.c +1 -1
  50. data/assets/tests_with_preprocessing/test/test_adc_hardwareB.c +1 -1
  51. data/assets/tests_with_preprocessing/test/test_adc_hardwareC.c +1 -1
  52. data/assets/uncovered_example_file.c +1 -1
  53. data/bin/actions_wrapper.rb +1 -1
  54. data/bin/app_cfg.rb +1 -1
  55. data/bin/ceedling +14 -3
  56. data/bin/cli.rb +110 -38
  57. data/bin/cli_handler.rb +167 -68
  58. data/bin/cli_helper.rb +179 -55
  59. data/bin/configinator.rb +71 -12
  60. data/bin/merginator.rb +82 -0
  61. data/bin/mixin_standardizer.rb +127 -0
  62. data/bin/mixinator.rb +199 -33
  63. data/bin/mixins.rb +4 -2
  64. data/bin/objects.yml +22 -1
  65. data/bin/path_validator.rb +1 -1
  66. data/bin/projectinator.rb +29 -20
  67. data/bin/rake_patches.rb +31 -0
  68. data/bin/recursive_merger.rb +128 -0
  69. data/bin/versionator.rb +2 -2
  70. data/ceedling.gemspec +31 -14
  71. data/config/test_environment.rb +1 -1
  72. data/docs/BreakingChanges.md +16 -3
  73. data/docs/Changelog.md +177 -6
  74. data/docs/KnownIssues.md +26 -0
  75. data/docs/ReleaseNotes.md +133 -19
  76. data/docs/mkdocs/assets/images/ceedling-logo-circle.png +0 -0
  77. data/docs/mkdocs/assets/images/ceedling.svg +90 -0
  78. data/docs/mkdocs/assets/images/favicon.png +0 -0
  79. data/docs/mkdocs/assets/stylesheets/admonitions.css +152 -0
  80. data/docs/mkdocs/assets/stylesheets/fixes-local.css +15 -0
  81. data/docs/mkdocs/assets/stylesheets/styling.css +102 -0
  82. data/docs/mkdocs/configuration/environment-vars.md +14 -0
  83. data/docs/mkdocs/configuration/global-collections.md +156 -0
  84. data/docs/mkdocs/configuration/index.md +75 -0
  85. data/docs/mkdocs/configuration/loading.md +89 -0
  86. data/docs/mkdocs/configuration/mixins.md +607 -0
  87. data/docs/mkdocs/configuration/parallel-builds.md +97 -0
  88. data/docs/mkdocs/configuration/project-file.md +198 -0
  89. data/docs/mkdocs/configuration/reference/cexception.md +35 -0
  90. data/docs/mkdocs/configuration/reference/cmock.md +106 -0
  91. data/docs/mkdocs/configuration/reference/defines.md +352 -0
  92. data/docs/mkdocs/configuration/reference/environment.md +55 -0
  93. data/docs/mkdocs/configuration/reference/extension.md +63 -0
  94. data/docs/mkdocs/configuration/reference/files.md +154 -0
  95. data/docs/mkdocs/configuration/reference/flags.md +296 -0
  96. data/docs/mkdocs/configuration/reference/index.md +168 -0
  97. data/docs/mkdocs/configuration/reference/libraries.md +82 -0
  98. data/docs/mkdocs/configuration/reference/mixins.md +24 -0
  99. data/docs/mkdocs/configuration/reference/paths.md +276 -0
  100. data/docs/mkdocs/configuration/reference/plugins.md +60 -0
  101. data/docs/mkdocs/configuration/reference/project.md +333 -0
  102. data/docs/mkdocs/configuration/reference/release-build.md +62 -0
  103. data/docs/mkdocs/configuration/reference/test-build.md +55 -0
  104. data/docs/mkdocs/configuration/reference/test-runner.md +61 -0
  105. data/docs/mkdocs/configuration/reference/tools.md +457 -0
  106. data/docs/mkdocs/configuration/reference/unity.md +49 -0
  107. data/docs/mkdocs/configuration/which-ceedling.md +77 -0
  108. data/docs/mkdocs/development/index.md +50 -0
  109. data/docs/mkdocs/development/plugins/configuration.md +164 -0
  110. data/docs/mkdocs/development/plugins/index.md +84 -0
  111. data/docs/{PluginDevelopmentGuide.md → mkdocs/development/plugins/plugin-subclass.md} +61 -312
  112. data/docs/mkdocs/development/plugins/rake-tasks.md +54 -0
  113. data/docs/mkdocs/development/workflow.md +284 -0
  114. data/docs/mkdocs/getting-started/command-line.md +477 -0
  115. data/docs/mkdocs/getting-started/example-projects/cipher-quest.md +65 -0
  116. data/docs/mkdocs/getting-started/example-projects/index.md +49 -0
  117. data/docs/mkdocs/getting-started/example-projects/temp-sensor.md +60 -0
  118. data/docs/mkdocs/getting-started/example-projects/wondrous-forest.md +45 -0
  119. data/docs/mkdocs/getting-started/index.md +41 -0
  120. data/docs/mkdocs/getting-started/installation.md +172 -0
  121. data/docs/mkdocs/getting-started/quick-start.md +65 -0
  122. data/docs/mkdocs/help.md +49 -0
  123. data/docs/mkdocs/index.md +215 -0
  124. data/docs/mkdocs/overview/build-system.md +115 -0
  125. data/docs/mkdocs/overview/index.md +29 -0
  126. data/docs/mkdocs/overview/test-environments.md +33 -0
  127. data/docs/mkdocs/overview/tools-and-frameworks.md +115 -0
  128. data/{plugins/beep/README.md → docs/mkdocs/plugins/beep.md} +10 -9
  129. data/{plugins/bullseye/README.md → docs/mkdocs/plugins/bullseye.md} +8 -12
  130. data/{plugins/command_hooks/README.md → docs/mkdocs/plugins/command-hooks.md} +69 -47
  131. data/{plugins/compile_commands_json_db/README.md → docs/mkdocs/plugins/compile-commands-json-db.md} +7 -5
  132. data/docs/mkdocs/plugins/cppcheck.md +377 -0
  133. data/{plugins/dependencies/README.md → docs/mkdocs/plugins/dependencies.md} +39 -50
  134. data/{plugins/fff/README.md → docs/mkdocs/plugins/fff.md} +42 -37
  135. data/docs/mkdocs/plugins/gcov/examples.md +92 -0
  136. data/docs/mkdocs/plugins/gcov/gcovr.md +251 -0
  137. data/docs/mkdocs/plugins/gcov/index.md +68 -0
  138. data/docs/mkdocs/plugins/gcov/overview.md +145 -0
  139. data/docs/mkdocs/plugins/gcov/reportgenerator.md +58 -0
  140. data/docs/mkdocs/plugins/gcov/reporting.md +147 -0
  141. data/docs/mkdocs/plugins/gcov/setup.md +232 -0
  142. data/docs/mkdocs/plugins/gcov/tool-versions.md +60 -0
  143. data/docs/mkdocs/plugins/gcov/troubleshooting.md +78 -0
  144. data/docs/mkdocs/plugins/index.md +221 -0
  145. data/{plugins/module_generator/README.md → docs/mkdocs/plugins/module-generator.md} +44 -44
  146. data/{plugins/report_build_warnings_log/README.md → docs/mkdocs/plugins/report-build-warnings-log.md} +6 -4
  147. data/{plugins/report_tests_gtestlike_stdout/README.md → docs/mkdocs/plugins/report-tests-gtestlike-stdout.md} +9 -7
  148. data/{plugins/report_tests_ide_stdout/README.md → docs/mkdocs/plugins/report-tests-ide-stdout.md} +8 -7
  149. data/{plugins/report_tests_log_factory/README.md → docs/mkdocs/plugins/report-tests-log-factory.md} +44 -36
  150. data/{plugins/report_tests_pretty_stdout/README.md → docs/mkdocs/plugins/report-tests-pretty-stdout.md} +8 -6
  151. data/{plugins/report_tests_raw_output_log/README.md → docs/mkdocs/plugins/report-tests-raw-output-log.md} +9 -7
  152. data/{plugins/report_tests_teamcity_stdout/README.md → docs/mkdocs/plugins/report-tests-teamcity-stdout.md} +8 -6
  153. data/docs/mkdocs/plugins/sample_html_report.png +0 -0
  154. data/docs/mkdocs/plugins/valgrind.md +192 -0
  155. data/docs/mkdocs/project/release-history.md +61 -0
  156. data/docs/{CeedlingUpgrade.md → mkdocs/project/upgrade.md} +9 -7
  157. data/docs/mkdocs/reference/build-directives.md +37 -0
  158. data/docs/mkdocs/reference/command-line.md +323 -0
  159. data/docs/mkdocs/reference/environment-vars.md +60 -0
  160. data/docs/mkdocs/reference/gcov-plugin.md +577 -0
  161. data/docs/mkdocs/reference/global-collections.md +160 -0
  162. data/docs/mkdocs/reference/index.md +65 -0
  163. data/docs/mkdocs/reference/partials-macros.md +79 -0
  164. data/docs/mkdocs/reference/project-configuration.md +46 -0
  165. data/docs/mkdocs/snapshot/assets/project.yml +404 -0
  166. data/docs/mkdocs/snapshot/examples/cipher_quest/README.md +210 -0
  167. data/docs/mkdocs/snapshot/examples/temp_sensor/README.md +283 -0
  168. data/docs/mkdocs/snapshot/examples/wondrous_forest/README.md +92 -0
  169. data/docs/mkdocs/snapshot/plugins/gcov/config/defaults.yml +33 -0
  170. data/docs/mkdocs/snapshot/plugins/gcov/config/defaults_gcov.rb +136 -0
  171. data/docs/mkdocs/snapshot.yml +20 -0
  172. data/docs/mkdocs/testing-guide/build-directives.md +153 -0
  173. data/docs/mkdocs/testing-guide/conventions.md +616 -0
  174. data/docs/mkdocs/testing-guide/frameworks.md +192 -0
  175. data/docs/mkdocs/testing-guide/index.md +80 -0
  176. data/docs/mkdocs/testing-guide/partials/configuration.md +67 -0
  177. data/docs/mkdocs/testing-guide/partials/conventions.md +68 -0
  178. data/docs/mkdocs/testing-guide/partials/directives.md +212 -0
  179. data/docs/mkdocs/testing-guide/partials/example.md +149 -0
  180. data/docs/mkdocs/testing-guide/partials/index.md +79 -0
  181. data/docs/mkdocs/testing-guide/partials/overview.md +81 -0
  182. data/docs/mkdocs/testing-guide/partials/variables.md +244 -0
  183. data/docs/mkdocs/testing-guide/test-cases.md +194 -0
  184. data/docs/mkdocs/testing-guide/test-sample.md +94 -0
  185. data/docs/mkdocs/testing-guide/test-suite-anatomy.md +58 -0
  186. data/examples/cipher_quest/README.md +210 -0
  187. data/examples/cipher_quest/mixin/release_analyze.yml +28 -0
  188. data/examples/cipher_quest/mixin/release_caesar.yml +28 -0
  189. data/examples/cipher_quest/mixin/release_full.yml +30 -0
  190. data/examples/cipher_quest/mixin/release_rot13.yml +28 -0
  191. data/examples/cipher_quest/project.yml +108 -0
  192. data/examples/cipher_quest/src/analyzer.c +83 -0
  193. data/examples/cipher_quest/src/analyzer.h +29 -0
  194. data/examples/cipher_quest/src/cipher.c +59 -0
  195. data/examples/cipher_quest/src/cipher.h +27 -0
  196. data/examples/cipher_quest/src/main.c +151 -0
  197. data/examples/cipher_quest/src/text_utils.c +119 -0
  198. data/examples/cipher_quest/src/text_utils.h +23 -0
  199. data/examples/cipher_quest/test/TestAnalyzer.c +133 -0
  200. data/examples/cipher_quest/test/TestCipherCaesar.c +81 -0
  201. data/examples/cipher_quest/test/TestCipherRot13.c +74 -0
  202. data/examples/cipher_quest/test/TestTextUtils.c +184 -0
  203. data/examples/temp_sensor/README.md +279 -14
  204. data/examples/temp_sensor/mixin/add_gcov.yml +1 -1
  205. data/examples/temp_sensor/mixin/add_unity_helper.yml +1 -1
  206. data/examples/temp_sensor/project.yml +4 -15
  207. data/examples/temp_sensor/src/AdcConductor.c +5 -1
  208. data/examples/temp_sensor/src/AdcConductor.h +1 -1
  209. data/examples/temp_sensor/src/AdcHardware.c +1 -1
  210. data/examples/temp_sensor/src/AdcHardware.h +1 -1
  211. data/examples/temp_sensor/src/AdcHardwareConfigurator.c +2 -1
  212. data/examples/temp_sensor/src/AdcHardwareConfigurator.h +1 -1
  213. data/examples/temp_sensor/src/AdcModel.c +2 -2
  214. data/examples/temp_sensor/src/AdcModel.h +1 -1
  215. data/examples/temp_sensor/src/AdcTemperatureSensor.c +2 -1
  216. data/examples/temp_sensor/src/AdcTemperatureSensor.h +1 -1
  217. data/examples/temp_sensor/src/Executor.c +1 -1
  218. data/examples/temp_sensor/src/Executor.h +1 -1
  219. data/examples/temp_sensor/src/IntrinsicsWrapper.c +1 -1
  220. data/examples/temp_sensor/src/IntrinsicsWrapper.h +1 -1
  221. data/examples/temp_sensor/src/Main.c +3 -3
  222. data/examples/temp_sensor/src/Main.h +1 -1
  223. data/examples/temp_sensor/src/Model.c +1 -1
  224. data/examples/temp_sensor/src/Model.h +1 -1
  225. data/examples/temp_sensor/src/ModelConfig.h +1 -1
  226. data/examples/temp_sensor/src/TaskScheduler.c +1 -1
  227. data/examples/temp_sensor/src/TaskScheduler.h +1 -1
  228. data/examples/temp_sensor/src/TemperatureFilter.c +1 -1
  229. data/examples/temp_sensor/src/TemperatureFilter.h +1 -1
  230. data/examples/temp_sensor/src/TimerConductor.c +1 -1
  231. data/examples/temp_sensor/src/TimerConductor.h +1 -1
  232. data/examples/temp_sensor/src/TimerConfigurator.c +2 -1
  233. data/examples/temp_sensor/src/TimerConfigurator.h +1 -1
  234. data/examples/temp_sensor/src/TimerHardware.c +1 -1
  235. data/examples/temp_sensor/src/TimerHardware.h +1 -1
  236. data/examples/temp_sensor/src/TimerInterruptConfigurator.c +2 -1
  237. data/examples/temp_sensor/src/TimerInterruptConfigurator.h +1 -1
  238. data/examples/temp_sensor/src/TimerInterruptHandler.c +2 -1
  239. data/examples/temp_sensor/src/TimerInterruptHandler.h +1 -1
  240. data/examples/temp_sensor/src/TimerModel.c +1 -1
  241. data/examples/temp_sensor/src/TimerModel.h +1 -1
  242. data/examples/temp_sensor/src/Types.h +5 -2
  243. data/examples/temp_sensor/src/UsartConductor.c +1 -1
  244. data/examples/temp_sensor/src/UsartConductor.h +1 -1
  245. data/examples/temp_sensor/src/UsartConfigurator.c +2 -1
  246. data/examples/temp_sensor/src/UsartConfigurator.h +1 -1
  247. data/examples/temp_sensor/src/UsartHardware.c +1 -1
  248. data/examples/temp_sensor/src/UsartHardware.h +1 -1
  249. data/examples/temp_sensor/src/UsartModel.c +2 -2
  250. data/examples/temp_sensor/src/UsartModel.h +1 -1
  251. data/examples/temp_sensor/src/UsartPutChar.c +2 -1
  252. data/examples/temp_sensor/src/UsartPutChar.h +1 -1
  253. data/examples/temp_sensor/src/UsartTransmitBufferStatus.c +2 -1
  254. data/examples/temp_sensor/src/UsartTransmitBufferStatus.h +1 -1
  255. data/examples/temp_sensor/src/{TemperatureCalculator.c → calculators/TemperatureCalculator.c} +1 -1
  256. data/examples/temp_sensor/src/{TemperatureCalculator.h → calculators/TemperatureCalculator.h} +1 -1
  257. data/examples/temp_sensor/src/{UsartBaudRateRegisterCalculator.c → calculators/UsartBaudRateRegisterCalculator.c} +1 -1
  258. data/examples/temp_sensor/src/{UsartBaudRateRegisterCalculator.h → calculators/UsartBaudRateRegisterCalculator.h} +1 -1
  259. data/examples/temp_sensor/test/TestExecutor.c +1 -1
  260. data/examples/temp_sensor/test/TestMain.c +5 -1
  261. data/examples/temp_sensor/test/TestModel.c +1 -1
  262. data/examples/temp_sensor/test/TestTaskScheduler.c +1 -1
  263. data/examples/temp_sensor/test/TestTemperatureCalculator.c +2 -2
  264. data/examples/temp_sensor/test/TestTemperatureFilter.c +5 -2
  265. data/examples/temp_sensor/test/TestTimerConductor.c +1 -1
  266. data/examples/temp_sensor/test/TestTimerHardware.c +1 -1
  267. data/examples/temp_sensor/test/TestTimerIntegrated.c +8 -4
  268. data/examples/temp_sensor/test/TestTimerModel.c +1 -1
  269. data/examples/temp_sensor/test/TestTimerPlatformStandin.c +154 -0
  270. data/examples/temp_sensor/test/TestUsartBaudRateRegisterCalculator.c +1 -1
  271. data/examples/temp_sensor/test/TestUsartConductor.c +1 -1
  272. data/examples/temp_sensor/test/TestUsartHardware.c +1 -1
  273. data/examples/temp_sensor/test/TestUsartIntegrated.c +9 -5
  274. data/examples/temp_sensor/test/TestUsartModel.c +2 -2
  275. data/examples/temp_sensor/test/TestUsartPlatformStandin.c +145 -0
  276. data/examples/temp_sensor/test/adc/TestAdcConductor.c +1 -1
  277. data/examples/temp_sensor/test/adc/TestAdcHardware.c +1 -1
  278. data/examples/temp_sensor/test/adc/TestAdcModel.c +1 -1
  279. data/examples/temp_sensor/test/adc/TestAdcPlatformStandin.c +100 -0
  280. data/examples/temp_sensor/test/platform/at91sam7s256.c +25 -0
  281. data/examples/temp_sensor/test/platform/at91sam7s256.h +183 -0
  282. data/examples/temp_sensor/test/support/UnityHelper.c +1 -1
  283. data/examples/temp_sensor/test/support/UnityHelper.h +1 -1
  284. data/examples/wondrous_forest/README.md +92 -0
  285. data/{lib/ceedling/release_invoker_helper.rb → examples/wondrous_forest/mixin/add_gcov.yml} +14 -4
  286. data/examples/wondrous_forest/project.yml +86 -0
  287. data/examples/wondrous_forest/src/AlertManager.c +125 -0
  288. data/examples/wondrous_forest/src/AlertManager.h +30 -0
  289. data/examples/wondrous_forest/src/EventQueue.c +73 -0
  290. data/examples/wondrous_forest/src/EventQueue.h +22 -0
  291. data/examples/wondrous_forest/src/ForestMonitor.c +88 -0
  292. data/examples/wondrous_forest/src/ForestMonitor.h +18 -0
  293. data/examples/wondrous_forest/src/HumiditySensor.c +57 -0
  294. data/examples/wondrous_forest/src/HumiditySensor.h +17 -0
  295. data/examples/wondrous_forest/src/LightSensor.c +51 -0
  296. data/examples/wondrous_forest/src/LightSensor.h +18 -0
  297. data/examples/wondrous_forest/src/SensorHal.c +62 -0
  298. data/examples/wondrous_forest/src/SensorHal.h +19 -0
  299. data/examples/wondrous_forest/src/SoilMoisture.c +61 -0
  300. data/examples/wondrous_forest/src/SoilMoisture.h +19 -0
  301. data/examples/wondrous_forest/src/TemperatureSensor.c +67 -0
  302. data/examples/wondrous_forest/src/TemperatureSensor.h +18 -0
  303. data/examples/wondrous_forest/src/Types.h +84 -0
  304. data/examples/wondrous_forest/src/UartDriver.c +55 -0
  305. data/examples/wondrous_forest/src/UartDriver.h +18 -0
  306. data/examples/wondrous_forest/test/TestAlertManager.c +105 -0
  307. data/examples/wondrous_forest/test/TestEventQueue.c +117 -0
  308. data/examples/wondrous_forest/test/TestForestMonitor.c +118 -0
  309. data/examples/wondrous_forest/test/TestHumiditySensor.c +85 -0
  310. data/examples/wondrous_forest/test/TestLightSensor.c +79 -0
  311. data/examples/wondrous_forest/test/TestSensorHal.c +58 -0
  312. data/examples/wondrous_forest/test/TestSoilMoisture.c +96 -0
  313. data/examples/wondrous_forest/test/TestTemperatureSensor.c +100 -0
  314. data/examples/wondrous_forest/test/TestUartDriver.c +55 -0
  315. data/lib/ceedling/application.rb +1 -1
  316. data/lib/ceedling/array_patches.rb +28 -0
  317. data/lib/ceedling/batchinator.rb +76 -0
  318. data/lib/ceedling/c_extractor/c_extractor.rb +340 -0
  319. data/lib/ceedling/c_extractor/c_extractor_code_text.rb +283 -0
  320. data/lib/ceedling/c_extractor/c_extractor_constants.rb +38 -0
  321. data/lib/ceedling/c_extractor/c_extractor_declarations.rb +415 -0
  322. data/lib/ceedling/c_extractor/c_extractor_definitions.rb +157 -0
  323. data/lib/ceedling/c_extractor/c_extractor_functions.rb +402 -0
  324. data/lib/ceedling/c_extractor/c_extractor_preprocessing.rb +262 -0
  325. data/lib/ceedling/c_extractor/c_extractor_types.rb +122 -0
  326. data/lib/ceedling/cacheinator.rb +1 -1
  327. data/lib/ceedling/cacheinator_helper.rb +23 -4
  328. data/lib/ceedling/ceedling.h +40 -0
  329. data/lib/ceedling/{config_matchinator.rb → config/config_matchinator.rb} +67 -5
  330. data/lib/ceedling/{config_walkinator.rb → config/config_walkinator.rb} +1 -1
  331. data/lib/ceedling/{configurator.rb → config/configurator.rb} +269 -107
  332. data/lib/ceedling/{configurator_builder.rb → config/configurator_builder.rb} +25 -6
  333. data/lib/ceedling/{configurator_plugins.rb → config/configurator_plugins.rb} +2 -4
  334. data/lib/ceedling/{configurator_setup.rb → config/configurator_setup.rb} +39 -71
  335. data/lib/ceedling/{configurator_validator.rb → config/configurator_validator.rb} +1 -1
  336. data/lib/ceedling/constants.rb +59 -18
  337. data/lib/ceedling/defaults.rb +31 -44
  338. data/lib/ceedling/defineinator.rb +2 -2
  339. data/lib/ceedling/dependinator.rb +1 -1
  340. data/lib/ceedling/encodinator.rb +1 -1
  341. data/lib/ceedling/erb_wrapper.rb +1 -1
  342. data/lib/ceedling/exceptions.rb +23 -3
  343. data/lib/ceedling/file_finder.rb +39 -10
  344. data/lib/ceedling/file_finder_helper.rb +2 -2
  345. data/lib/ceedling/file_path_collection_utils.rb +37 -23
  346. data/lib/ceedling/file_path_utils.rb +183 -26
  347. data/lib/ceedling/file_system_wrapper.rb +1 -1
  348. data/lib/ceedling/file_wrapper.rb +14 -1
  349. data/lib/ceedling/flaginator.rb +1 -1
  350. data/lib/ceedling/{generator.rb → generators/generator.rb} +86 -23
  351. data/lib/ceedling/{generator_helper.rb → generators/generator_helper.rb} +17 -11
  352. data/lib/ceedling/{generator_mocks.rb → generators/generator_mocks.rb} +1 -1
  353. data/lib/ceedling/generators/generator_partials.rb +177 -0
  354. data/lib/ceedling/{generator_test_results.rb → generators/generator_test_results.rb} +43 -17
  355. data/lib/ceedling/generators/generator_test_results_backtrace.rb +290 -0
  356. data/lib/ceedling/{generator_test_results_sanity_checker.rb → generators/generator_test_results_sanity_checker.rb} +1 -1
  357. data/lib/ceedling/generators/generator_test_runner.rb +97 -0
  358. data/lib/ceedling/includes/include_factory.rb +43 -0
  359. data/lib/ceedling/{include_pathinator.rb → includes/include_pathinator.rb} +1 -1
  360. data/lib/ceedling/includes/includes.rb +341 -0
  361. data/lib/ceedling/loginator.rb +115 -12
  362. data/lib/ceedling/makefile.rb +1 -1
  363. data/lib/ceedling/objects.yml +145 -43
  364. data/lib/ceedling/parsing_parcels.rb +35 -9
  365. data/lib/ceedling/partials/partializer.rb +444 -0
  366. data/lib/ceedling/partials/partializer_config.rb +217 -0
  367. data/lib/ceedling/partials/partializer_helper.rb +344 -0
  368. data/lib/ceedling/partials/partializer_runtime.rb +29 -0
  369. data/lib/ceedling/partials/partializer_utils.rb +222 -0
  370. data/lib/ceedling/partials/partials.rb +82 -0
  371. data/lib/ceedling/{plugin.rb → plugins/plugin.rb} +1 -1
  372. data/lib/ceedling/{plugin_manager.rb → plugins/plugin_manager.rb} +47 -21
  373. data/lib/ceedling/{plugin_manager_helper.rb → plugins/plugin_manager_helper.rb} +1 -1
  374. data/lib/ceedling/{plugin_reportinator.rb → plugins/plugin_reportinator.rb} +10 -18
  375. data/lib/ceedling/{plugin_reportinator_helper.rb → plugins/plugin_reportinator_helper.rb} +22 -26
  376. data/lib/ceedling/plugins/report_tests_stdout_plugin.rb +88 -0
  377. data/lib/ceedling/preprocess/README.md +184 -0
  378. data/lib/ceedling/preprocess/c_comment_scanner.rb +194 -0
  379. data/lib/ceedling/preprocess/c_preprocessor_conditionals.rb +170 -0
  380. data/lib/ceedling/preprocess/preprocessinator.rb +605 -0
  381. data/lib/ceedling/preprocess/preprocessinator_bare_includes_extractor.rb +69 -0
  382. data/lib/ceedling/preprocess/preprocessinator_code_finder.rb +150 -0
  383. data/lib/ceedling/preprocess/preprocessinator_comment_stripper.rb +80 -0
  384. data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +378 -0
  385. data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +224 -0
  386. data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +215 -0
  387. data/lib/ceedling/preprocess/preprocessinator_reconstructor.rb +398 -0
  388. data/lib/ceedling/rake_app/rake_invocation_tracker.rb +39 -0
  389. data/lib/ceedling/rake_app/rake_task_registry.rb +210 -0
  390. data/lib/ceedling/{rake_utils.rb → rake_app/rake_utils.rb} +1 -1
  391. data/lib/ceedling/{rake_wrapper.rb → rake_app/rake_wrapper.rb} +1 -1
  392. data/lib/ceedling/rake_app/rakefile_component_resolver.rb +77 -0
  393. data/lib/ceedling/rakefile.rb +16 -8
  394. data/lib/ceedling/release_invoker.rb +48 -4
  395. data/lib/ceedling/reportinator.rb +39 -18
  396. data/lib/ceedling/ruby_expandinator.rb +61 -0
  397. data/lib/ceedling/rules_release.rake +4 -2
  398. data/lib/ceedling/rules_tests.rake +1 -23
  399. data/lib/ceedling/setupinator.rb +23 -11
  400. data/lib/ceedling/stream_wrapper.rb +1 -1
  401. data/lib/ceedling/system_utils.rb +1 -1
  402. data/lib/ceedling/system_wrapper.rb +18 -21
  403. data/lib/ceedling/tasks_base.rake +3 -3
  404. data/lib/ceedling/tasks_filesystem.rake +22 -12
  405. data/lib/ceedling/tasks_release.rake +11 -18
  406. data/lib/ceedling/tasks_tests.rake +1 -1
  407. data/lib/ceedling/test_context_extractor.rb +178 -109
  408. data/lib/ceedling/test_invoker/test_build_executor.rb +661 -0
  409. data/lib/ceedling/test_invoker/test_build_planner.rb +277 -0
  410. data/lib/ceedling/test_invoker/test_build_setup.rb +441 -0
  411. data/lib/ceedling/test_invoker/test_invoker.rb +251 -0
  412. data/lib/ceedling/test_invoker/test_invoker_types.rb +56 -0
  413. data/lib/ceedling/test_runner_manager.rb +1 -1
  414. data/lib/ceedling/tool_executor.rb +29 -19
  415. data/lib/ceedling/tool_executor_helper.rb +7 -15
  416. data/lib/ceedling/tool_validator.rb +24 -8
  417. data/lib/ceedling/verbosinator.rb +1 -1
  418. data/lib/ceedling/yaml_wrapper.rb +72 -12
  419. data/lib/ceedling.rb +1 -1
  420. data/lib/snapshot.rb +43 -0
  421. data/lib/version.rb +2 -2
  422. data/license.txt +1 -1
  423. data/mkdocs.local.yml +45 -0
  424. data/mkdocs.yml +202 -0
  425. data/plugins/beep/config/defaults.yml +1 -1
  426. data/plugins/beep/config/defaults_beep.rb +1 -1
  427. data/plugins/beep/lib/beep.rb +7 -5
  428. data/plugins/bullseye/assets/template.erb +1 -1
  429. data/plugins/bullseye/bullseye.rake +1 -1
  430. data/plugins/bullseye/config/defaults.yml +1 -1
  431. data/plugins/bullseye/lib/bullseye.rb +9 -9
  432. data/plugins/command_hooks/lib/command_hooks.rb +43 -38
  433. data/plugins/compile_commands_json_db/lib/compile_commands_json_db.rb +2 -2
  434. data/plugins/cppcheck/AUTHORS.md +8 -0
  435. data/plugins/cppcheck/config/defaults.yml +44 -0
  436. data/plugins/cppcheck/config/defaults_cppcheck.rb +32 -0
  437. data/plugins/cppcheck/cppcheck.rake +54 -0
  438. data/plugins/cppcheck/lib/cppcheck.rb +247 -0
  439. data/plugins/cppcheck/lib/cppcheck_constants.rb +20 -0
  440. data/plugins/cppcheck/lib/cppcheck_reports.rb +160 -0
  441. data/plugins/dependencies/Rakefile +1 -1
  442. data/plugins/dependencies/config/defaults.yml +1 -1
  443. data/plugins/dependencies/dependencies.rake +3 -3
  444. data/plugins/dependencies/example/boss/project.yml +1 -3
  445. data/plugins/dependencies/example/boss/src/boss.c +1 -1
  446. data/plugins/dependencies/example/boss/src/boss.h +1 -1
  447. data/plugins/dependencies/example/boss/src/main.c +1 -1
  448. data/plugins/dependencies/example/boss/test/test_boss.c +1 -1
  449. data/plugins/dependencies/example/supervisor/project.yml +1 -3
  450. data/plugins/dependencies/example/supervisor/src/supervisor.c +1 -1
  451. data/plugins/dependencies/example/supervisor/src/supervisor.h +1 -1
  452. data/plugins/dependencies/example/supervisor/test/test_supervisor.c +1 -1
  453. data/plugins/dependencies/lib/dependencies.rb +14 -2
  454. data/plugins/fff/Rakefile +1 -1
  455. data/plugins/fff/config/fff.yml +1 -1
  456. data/plugins/fff/examples/fff_example/project.yml +2 -2
  457. data/plugins/fff/examples/fff_example/src/bar.c +1 -1
  458. data/plugins/fff/examples/fff_example/src/bar.h +1 -1
  459. data/plugins/fff/examples/fff_example/src/custom_types.h +1 -1
  460. data/plugins/fff/examples/fff_example/src/display.c +1 -1
  461. data/plugins/fff/examples/fff_example/src/display.h +1 -1
  462. data/plugins/fff/examples/fff_example/src/event_processor.c +1 -1
  463. data/plugins/fff/examples/fff_example/src/event_processor.h +1 -1
  464. data/plugins/fff/examples/fff_example/src/foo.c +1 -1
  465. data/plugins/fff/examples/fff_example/src/foo.h +1 -1
  466. data/plugins/fff/examples/fff_example/src/subfolder/zzz.c +1 -1
  467. data/plugins/fff/examples/fff_example/src/subfolder/zzz.h +1 -1
  468. data/plugins/fff/examples/fff_example/test/test_event_processor.c +1 -1
  469. data/plugins/fff/examples/fff_example/test/test_foo.c +1 -1
  470. data/plugins/fff/lib/fff.rb +10 -5
  471. data/plugins/fff/lib/fff_mock_generator.rb +1 -1
  472. data/plugins/fff/spec/fff_mock_header_generator_spec.rb +1 -1
  473. data/plugins/fff/spec/fff_mock_source_generator_spec.rb +1 -1
  474. data/plugins/fff/spec/header_generator.rb +1 -1
  475. data/plugins/fff/spec/spec_helper.rb +1 -1
  476. data/plugins/fff/src/fff_unity_helper.h +1 -1
  477. data/plugins/gcov/config/defaults.yml +4 -1
  478. data/plugins/gcov/config/defaults_gcov.rb +40 -13
  479. data/plugins/gcov/gcov.rake +31 -1
  480. data/plugins/gcov/lib/console_reportinator.rb +180 -0
  481. data/plugins/gcov/lib/gcov.rb +189 -103
  482. data/plugins/gcov/lib/gcov_constants.rb +16 -4
  483. data/plugins/gcov/lib/gcov_reportinator.rb +63 -0
  484. data/{spec/configurator_helper_spec.rb → plugins/gcov/lib/gcov_types.rb} +2 -6
  485. data/plugins/gcov/lib/gcovr_reportinator.rb +237 -136
  486. data/plugins/gcov/lib/reportgenerator_reportinator.rb +242 -116
  487. data/plugins/module_generator/Rakefile +1 -1
  488. data/plugins/module_generator/assets/stubby1.h +1 -1
  489. data/plugins/module_generator/assets/stubby2.h +1 -1
  490. data/plugins/module_generator/config/module_generator.yml +1 -1
  491. data/plugins/module_generator/example/project.yml +1 -3
  492. data/plugins/module_generator/lib/module_generator.rb +2 -2
  493. data/plugins/module_generator/module_generator.rake +1 -1
  494. data/plugins/report_build_warnings_log/lib/report_build_warnings_log.rb +14 -20
  495. data/plugins/report_tests_gtestlike_stdout/assets/template.erb +3 -3
  496. data/plugins/report_tests_gtestlike_stdout/config/report_tests_gtestlike_stdout.yml +1 -1
  497. data/plugins/report_tests_gtestlike_stdout/lib/report_tests_gtestlike_stdout.rb +4 -61
  498. data/plugins/report_tests_ide_stdout/config/report_tests_ide_stdout.yml +1 -1
  499. data/plugins/report_tests_ide_stdout/lib/report_tests_ide_stdout.rb +7 -60
  500. data/plugins/report_tests_log_factory/config/defaults.yml +1 -1
  501. data/plugins/report_tests_log_factory/lib/cppunit_tests_reporter.rb +5 -5
  502. data/plugins/report_tests_log_factory/lib/html_tests_reporter.rb +302 -133
  503. data/plugins/report_tests_log_factory/lib/json_tests_reporter.rb +9 -7
  504. data/plugins/report_tests_log_factory/lib/junit_tests_reporter.rb +6 -5
  505. data/plugins/report_tests_log_factory/lib/report_tests_log_factory.rb +72 -36
  506. data/plugins/report_tests_log_factory/lib/tests_reporter.rb +8 -8
  507. data/plugins/report_tests_pretty_stdout/assets/template.erb +1 -2
  508. data/plugins/report_tests_pretty_stdout/config/report_tests_pretty_stdout.yml +1 -1
  509. data/plugins/report_tests_pretty_stdout/lib/report_tests_pretty_stdout.rb +4 -65
  510. data/plugins/report_tests_raw_output_log/lib/report_tests_raw_output_log.rb +4 -4
  511. data/plugins/report_tests_teamcity_stdout/config/defaults.yml +1 -1
  512. data/plugins/report_tests_teamcity_stdout/config/report_tests_teamcity_stdout.yml +1 -1
  513. data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +2 -2
  514. data/plugins/valgrind/config/defaults.yml +19 -0
  515. data/plugins/valgrind/config/defaults_valgrind.rb +20 -0
  516. data/plugins/valgrind/lib/valgrind.rb +132 -0
  517. data/plugins/valgrind/lib/valgrind_constants.rb +13 -0
  518. data/plugins/valgrind/valgrind.rake +87 -0
  519. data/site-local/404.html +4002 -0
  520. data/site-local/assets/images/ceedling-logo-circle.png +0 -0
  521. data/site-local/assets/images/ceedling.svg +90 -0
  522. data/site-local/assets/images/favicon.png +0 -0
  523. data/site-local/assets/javascripts/bundle.79ae519e.min.js +16 -0
  524. data/site-local/assets/javascripts/bundle.79ae519e.min.js.map +7 -0
  525. data/site-local/assets/javascripts/lunr/min/lunr.ar.min.js +1 -0
  526. data/site-local/assets/javascripts/lunr/min/lunr.da.min.js +18 -0
  527. data/site-local/assets/javascripts/lunr/min/lunr.de.min.js +18 -0
  528. data/site-local/assets/javascripts/lunr/min/lunr.du.min.js +18 -0
  529. data/site-local/assets/javascripts/lunr/min/lunr.el.min.js +1 -0
  530. data/site-local/assets/javascripts/lunr/min/lunr.es.min.js +18 -0
  531. data/site-local/assets/javascripts/lunr/min/lunr.fi.min.js +18 -0
  532. data/site-local/assets/javascripts/lunr/min/lunr.fr.min.js +18 -0
  533. data/site-local/assets/javascripts/lunr/min/lunr.he.min.js +1 -0
  534. data/site-local/assets/javascripts/lunr/min/lunr.hi.min.js +1 -0
  535. data/site-local/assets/javascripts/lunr/min/lunr.hu.min.js +18 -0
  536. data/site-local/assets/javascripts/lunr/min/lunr.hy.min.js +1 -0
  537. data/site-local/assets/javascripts/lunr/min/lunr.it.min.js +18 -0
  538. data/site-local/assets/javascripts/lunr/min/lunr.ja.min.js +1 -0
  539. data/site-local/assets/javascripts/lunr/min/lunr.jp.min.js +1 -0
  540. data/site-local/assets/javascripts/lunr/min/lunr.kn.min.js +1 -0
  541. data/site-local/assets/javascripts/lunr/min/lunr.ko.min.js +1 -0
  542. data/site-local/assets/javascripts/lunr/min/lunr.multi.min.js +1 -0
  543. data/site-local/assets/javascripts/lunr/min/lunr.nl.min.js +18 -0
  544. data/site-local/assets/javascripts/lunr/min/lunr.no.min.js +18 -0
  545. data/site-local/assets/javascripts/lunr/min/lunr.pt.min.js +18 -0
  546. data/site-local/assets/javascripts/lunr/min/lunr.ro.min.js +18 -0
  547. data/site-local/assets/javascripts/lunr/min/lunr.ru.min.js +18 -0
  548. data/site-local/assets/javascripts/lunr/min/lunr.sa.min.js +1 -0
  549. data/site-local/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +1 -0
  550. data/site-local/assets/javascripts/lunr/min/lunr.sv.min.js +18 -0
  551. data/site-local/assets/javascripts/lunr/min/lunr.ta.min.js +1 -0
  552. data/site-local/assets/javascripts/lunr/min/lunr.te.min.js +1 -0
  553. data/site-local/assets/javascripts/lunr/min/lunr.th.min.js +1 -0
  554. data/site-local/assets/javascripts/lunr/min/lunr.tr.min.js +18 -0
  555. data/site-local/assets/javascripts/lunr/min/lunr.vi.min.js +1 -0
  556. data/site-local/assets/javascripts/lunr/min/lunr.zh.min.js +1 -0
  557. data/site-local/assets/javascripts/lunr/tinyseg.js +206 -0
  558. data/site-local/assets/javascripts/lunr/wordcut.js +6708 -0
  559. data/site-local/assets/javascripts/workers/search.2c215733.min.js +42 -0
  560. data/site-local/assets/javascripts/workers/search.2c215733.min.js.map +7 -0
  561. data/site-local/assets/stylesheets/admonitions.css +152 -0
  562. data/site-local/assets/stylesheets/fixes-local.css +15 -0
  563. data/site-local/assets/stylesheets/main.484c7ddc.min.css +1 -0
  564. data/site-local/assets/stylesheets/main.484c7ddc.min.css.map +1 -0
  565. data/site-local/assets/stylesheets/palette.ab4e12ef.min.css +1 -0
  566. data/site-local/assets/stylesheets/palette.ab4e12ef.min.css.map +1 -0
  567. data/site-local/assets/stylesheets/styling.css +102 -0
  568. data/site-local/configuration/environment-vars.html +4102 -0
  569. data/site-local/configuration/global-collections.html +4248 -0
  570. data/site-local/configuration/index.html +4169 -0
  571. data/site-local/configuration/loading.html +4348 -0
  572. data/site-local/configuration/mixins.html +5060 -0
  573. data/site-local/configuration/parallel-builds.html +4347 -0
  574. data/site-local/configuration/project-file.html +4474 -0
  575. data/site-local/configuration/reference/cexception.html +4225 -0
  576. data/site-local/configuration/reference/cmock.html +4401 -0
  577. data/site-local/configuration/reference/defines.html +4734 -0
  578. data/site-local/configuration/reference/environment.html +4242 -0
  579. data/site-local/configuration/reference/extension.html +4387 -0
  580. data/site-local/configuration/reference/files.html +4541 -0
  581. data/site-local/configuration/reference/flags.html +4681 -0
  582. data/site-local/configuration/reference/index.html +4290 -0
  583. data/site-local/configuration/reference/libraries.html +4365 -0
  584. data/site-local/configuration/reference/mixins.html +4195 -0
  585. data/site-local/configuration/reference/paths.html +4714 -0
  586. data/site-local/configuration/reference/plugins.html +4262 -0
  587. data/site-local/configuration/reference/project.html +4777 -0
  588. data/site-local/configuration/reference/release-build.html +4287 -0
  589. data/site-local/configuration/reference/test-build.html +4264 -0
  590. data/site-local/configuration/reference/test-runner.html +4289 -0
  591. data/site-local/configuration/reference/tools.html +5120 -0
  592. data/site-local/configuration/reference/unity.html +4255 -0
  593. data/site-local/configuration/which-ceedling.html +4269 -0
  594. data/site-local/development/index.html +4148 -0
  595. data/site-local/development/plugins/configuration.html +4446 -0
  596. data/site-local/development/plugins/index.html +4212 -0
  597. data/site-local/development/plugins/plugin-subclass.html +5068 -0
  598. data/site-local/development/plugins/rake-tasks.html +4236 -0
  599. data/site-local/development/workflow.html +4664 -0
  600. data/site-local/getting-started/command-line.html +5498 -0
  601. data/site-local/getting-started/example-projects/cipher-quest.html +4272 -0
  602. data/site-local/getting-started/example-projects/index.html +4173 -0
  603. data/site-local/getting-started/example-projects/temp-sensor.html +4322 -0
  604. data/site-local/getting-started/example-projects/wondrous-forest.html +4290 -0
  605. data/site-local/getting-started/index.html +4116 -0
  606. data/site-local/getting-started/installation.html +4452 -0
  607. data/site-local/getting-started/quick-start.html +4262 -0
  608. data/site-local/help.html +4081 -0
  609. data/site-local/index.html +4364 -0
  610. data/site-local/overview/build-system.html +4288 -0
  611. data/site-local/overview/index.html +4103 -0
  612. data/site-local/overview/test-environments.html +4116 -0
  613. data/site-local/overview/tools-and-frameworks.html +4433 -0
  614. data/site-local/plugins/beep.html +4413 -0
  615. data/site-local/plugins/bullseye.html +4249 -0
  616. data/site-local/plugins/command-hooks.html +5023 -0
  617. data/site-local/plugins/compile-commands-json-db.html +4243 -0
  618. data/site-local/plugins/cppcheck.html +4851 -0
  619. data/site-local/plugins/dependencies.html +4828 -0
  620. data/site-local/plugins/fff.html +4661 -0
  621. data/site-local/plugins/gcov/examples.html +4293 -0
  622. data/site-local/plugins/gcov/gcovr.html +4512 -0
  623. data/site-local/plugins/gcov/index.html +4150 -0
  624. data/site-local/plugins/gcov/overview.html +4410 -0
  625. data/site-local/plugins/gcov/reportgenerator.html +4164 -0
  626. data/site-local/plugins/gcov/reporting.html +4336 -0
  627. data/site-local/plugins/gcov/setup.html +4597 -0
  628. data/site-local/plugins/gcov/tool-versions.html +4269 -0
  629. data/site-local/plugins/gcov/troubleshooting.html +4313 -0
  630. data/site-local/plugins/index.html +4348 -0
  631. data/site-local/plugins/module-generator.html +4588 -0
  632. data/site-local/plugins/report-build-warnings-log.html +4229 -0
  633. data/site-local/plugins/report-tests-gtestlike-stdout.html +4357 -0
  634. data/site-local/plugins/report-tests-ide-stdout.html +4270 -0
  635. data/site-local/plugins/report-tests-log-factory.html +4792 -0
  636. data/site-local/plugins/report-tests-pretty-stdout.html +4265 -0
  637. data/site-local/plugins/report-tests-raw-output-log.html +4292 -0
  638. data/site-local/plugins/report-tests-teamcity-stdout.html +4291 -0
  639. data/site-local/plugins/sample_html_report.png +0 -0
  640. data/site-local/plugins/valgrind.html +4605 -0
  641. data/site-local/project/release-history.html +4225 -0
  642. data/site-local/project/upgrade.html +4314 -0
  643. data/site-local/reference/build-directives.html +4210 -0
  644. data/site-local/reference/command-line.html +4989 -0
  645. data/site-local/reference/environment-vars.html +4278 -0
  646. data/site-local/reference/gcov-plugin.html +5886 -0
  647. data/site-local/reference/global-collections.html +4385 -0
  648. data/site-local/reference/index.html +4126 -0
  649. data/site-local/reference/partials-macros.html +4326 -0
  650. data/site-local/reference/project-configuration.html +4253 -0
  651. data/site-local/sitemap.xml +3 -0
  652. data/site-local/sitemap.xml.gz +0 -0
  653. data/site-local/snapshot/assets/project.yml +404 -0
  654. data/site-local/snapshot/examples/cipher_quest/index.html +4292 -0
  655. data/site-local/snapshot/examples/temp_sensor/index.html +4416 -0
  656. data/site-local/snapshot/examples/wondrous_forest/index.html +4200 -0
  657. data/site-local/snapshot/plugins/gcov/config/defaults.yml +33 -0
  658. data/site-local/snapshot/plugins/gcov/config/defaults_gcov.rb +136 -0
  659. data/site-local/testing-guide/build-directives.html +4481 -0
  660. data/site-local/testing-guide/conventions.html +5233 -0
  661. data/site-local/testing-guide/frameworks.html +4488 -0
  662. data/site-local/testing-guide/index.html +4174 -0
  663. data/site-local/testing-guide/partials/configuration.html +4347 -0
  664. data/site-local/testing-guide/partials/conventions.html +4327 -0
  665. data/site-local/testing-guide/partials/directives.html +4680 -0
  666. data/site-local/testing-guide/partials/example.html +4448 -0
  667. data/site-local/testing-guide/partials/index.html +4167 -0
  668. data/site-local/testing-guide/partials/overview.html +4322 -0
  669. data/site-local/testing-guide/partials/variables.html +4548 -0
  670. data/site-local/testing-guide/test-cases.html +4436 -0
  671. data/site-local/testing-guide/test-sample.html +4265 -0
  672. data/site-local/testing-guide/test-suite-anatomy.html +4249 -0
  673. data/spec/manual/stress_test.rb +1 -1
  674. data/spec/support/other_target.yml +1 -1
  675. data/spec/support/spec_helper.rb +20 -0
  676. data/spec/support/system/gem_dir_layout.rb +20 -0
  677. data/spec/support/system/spec_system_helper.rb +206 -0
  678. data/spec/support/system/system_context.rb +310 -0
  679. data/spec/support/system/system_test_output.rb +28 -0
  680. data/spec/support/target.yml +1 -1
  681. data/spec/system/cppcheck_deployment_spec.rb +49 -0
  682. data/spec/system/deployment_as_gem_spec.rb +86 -48
  683. data/spec/system/deployment_as_vendor_spec.rb +141 -79
  684. data/spec/system/encoding_stress_spec.rb +153 -0
  685. data/spec/system/example_cipher_quest_spec.rb +186 -0
  686. data/spec/system/example_temp_sensor_spec.rb +41 -35
  687. data/spec/system/example_wondrous_forest_spec.rb +117 -0
  688. data/spec/{gcov → system}/gcov_deployment_spec.rb +55 -26
  689. data/spec/system/mixin_ordering_spec.rb +548 -0
  690. data/spec/system/preprocessing_encoding_spec.rb +114 -0
  691. data/spec/system/preprocessing_fallback_conditionals_spec.rb +166 -0
  692. data/spec/system/preprocessing_locale_spec.rb +153 -0
  693. data/spec/system/preprocessing_parameterized_tests_spec.rb +183 -0
  694. data/spec/system/ruby_replacement_spec.rb +141 -0
  695. data/spec/{spec_system_helper.rb → system/support/common_test_cases.rb} +301 -350
  696. data/spec/system/support/cppcheck_common_test_cases.rb +98 -0
  697. data/spec/system/support/cppcheck_helpers.rb +27 -0
  698. data/spec/{gcov/gcov_test_cases_spec.rb → system/support/gcov_common_test_cases.rb} +224 -111
  699. data/spec/system/support/gcov_helpers.rb +81 -0
  700. data/spec/system/support/valgrind_common_test_cases.rb +120 -0
  701. data/spec/system/support/valgrind_helpers.rb +21 -0
  702. data/spec/system/upgrade_as_vendor_spec.rb +74 -39
  703. data/spec/system/valgrind_deployment_spec.rb +53 -0
  704. data/spec/units/bin/cli_helper_spec.rb +69 -0
  705. data/spec/units/bin/merginator_spec.rb +279 -0
  706. data/spec/units/bin/mixin_standardizer_spec.rb +231 -0
  707. data/spec/units/bin/mixinator_spec.rb +583 -0
  708. data/spec/units/bin/projectinator_mixin_spec.rb +362 -0
  709. data/spec/units/bin/recursive_merger_spec.rb +241 -0
  710. data/spec/units/c_extractor/c_extractor_code_text_spec.rb +2091 -0
  711. data/spec/units/c_extractor/c_extractor_declarations_spec.rb +746 -0
  712. data/spec/units/c_extractor/c_extractor_definitions_spec.rb +417 -0
  713. data/spec/units/c_extractor/c_extractor_functions_spec.rb +2742 -0
  714. data/spec/units/c_extractor/c_extractor_integration_spec.rb +935 -0
  715. data/spec/units/c_extractor/c_extractor_preprocessing_spec.rb +497 -0
  716. data/spec/units/c_extractor/c_extractor_spec.rb +356 -0
  717. data/spec/units/config_matchinator_spec.rb +401 -0
  718. data/spec/{config_walkinator_spec.rb → units/config_walkinator_spec.rb} +2 -2
  719. data/spec/{configurator_builder_spec.rb → units/configurator_builder_spec.rb} +1 -1
  720. data/spec/units/configurator_spec.rb +187 -0
  721. data/spec/{file_finder_helper_spec.rb → units/file_finder_helper_spec.rb} +1 -1
  722. data/spec/units/file_path_collection_utils_spec.rb +222 -0
  723. data/spec/units/file_path_utils_spec.rb +274 -0
  724. data/spec/units/generators/generator_helper_spec.rb +112 -0
  725. data/spec/units/generators/generator_partials_spec.rb +795 -0
  726. data/spec/units/generators/generator_test_results_backtrace_spec.rb +492 -0
  727. data/spec/{generator_test_results_sanity_checker_spec.rb → units/generators/generator_test_results_sanity_checker_spec.rb} +5 -4
  728. data/spec/units/generators/generator_test_results_spec.rb +412 -0
  729. data/spec/units/generators/generator_test_runner_spec.rb +120 -0
  730. data/spec/units/includes/include_spec.rb +716 -0
  731. data/spec/units/includes/includes_spec.rb +1069 -0
  732. data/spec/units/parsing_parcels_spec.rb +139 -0
  733. data/spec/units/partials/partializer_config_spec.rb +388 -0
  734. data/spec/units/partials/partializer_helper_spec.rb +992 -0
  735. data/spec/units/partials/partializer_spec.rb +1629 -0
  736. data/spec/units/partials/partializer_utils_spec.rb +587 -0
  737. data/spec/units/plugin_manager_spec.rb +48 -0
  738. data/spec/units/plugins/cppcheck_spec.rb +557 -0
  739. data/spec/units/preprocess/c_comment_scanner_spec.rb +409 -0
  740. data/spec/units/preprocess/c_preprocessor_conditionals_spec.rb +396 -0
  741. data/spec/units/preprocess/preprocessinator_code_finder_spec.rb +361 -0
  742. data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +580 -0
  743. data/spec/units/preprocess/preprocessinator_file_assembler_spec.rb +263 -0
  744. data/spec/units/preprocess/preprocessinator_includes_handler_spec.rb +337 -0
  745. data/spec/{preprocessinator_extractor_spec.rb → units/preprocess/preprocessinator_reconstructor_spec.rb} +297 -5
  746. data/spec/units/reportinator_spec.rb +251 -0
  747. data/spec/units/ruby_expandinator_spec.rb +91 -0
  748. data/spec/{system_utils_spec.rb → units/system_utils_spec.rb} +4 -4
  749. data/spec/units/test_context_extractor_spec.rb +437 -0
  750. data/spec/{tool_executor_helper_spec.rb → units/tool_executor_helper_spec.rb} +19 -33
  751. data/spec/units/tool_executor_spec.rb +83 -0
  752. data/spec/units/tool_validator_spec.rb +60 -0
  753. data/spec/units/yaml_wrapper_spec.rb +108 -0
  754. data/vendor/cmock/Gemfile +4 -1
  755. data/vendor/cmock/LICENSE.txt +1 -1
  756. data/vendor/cmock/config/production_environment.rb +1 -1
  757. data/vendor/cmock/config/test_environment.rb +1 -1
  758. data/vendor/cmock/docs/CMockChangeLog.md +47 -0
  759. data/vendor/cmock/docs/CMockKnownIssues.md +0 -1
  760. data/vendor/cmock/docs/CMock_ArgumentValidation.md +180 -25
  761. data/vendor/cmock/docs/CMock_Summary.md +158 -16
  762. data/vendor/cmock/examples/make_example/Makefile +1 -1
  763. data/vendor/cmock/examples/make_example/src/foo.c +1 -1
  764. data/vendor/cmock/examples/make_example/src/foo.h +1 -1
  765. data/vendor/cmock/examples/make_example/src/main.c +1 -1
  766. data/vendor/cmock/examples/make_example/test/test_foo.c +1 -1
  767. data/vendor/cmock/examples/make_example/test/test_main.c +2 -2
  768. data/vendor/cmock/examples/temp_sensor/project.yml +75 -0
  769. data/vendor/cmock/examples/temp_sensor/rakefile.rb +3 -3
  770. data/vendor/cmock/examples/temp_sensor/rakefile_helper.rb +163 -119
  771. data/vendor/cmock/examples/temp_sensor/src/AT91SAM7X256.h +1 -1
  772. data/vendor/cmock/examples/temp_sensor/src/AdcConductor.c +1 -1
  773. data/vendor/cmock/examples/temp_sensor/src/AdcConductor.h +1 -1
  774. data/vendor/cmock/examples/temp_sensor/src/AdcHardware.c +1 -1
  775. data/vendor/cmock/examples/temp_sensor/src/AdcHardware.h +1 -1
  776. data/vendor/cmock/examples/temp_sensor/src/AdcHardwareConfigurator.c +1 -1
  777. data/vendor/cmock/examples/temp_sensor/src/AdcHardwareConfigurator.h +1 -1
  778. data/vendor/cmock/examples/temp_sensor/src/AdcModel.c +3 -1
  779. data/vendor/cmock/examples/temp_sensor/src/AdcModel.h +1 -1
  780. data/vendor/cmock/examples/temp_sensor/src/AdcTemperatureSensor.c +1 -1
  781. data/vendor/cmock/examples/temp_sensor/src/AdcTemperatureSensor.h +1 -1
  782. data/vendor/cmock/examples/temp_sensor/src/Executor.c +1 -1
  783. data/vendor/cmock/examples/temp_sensor/src/Executor.h +1 -1
  784. data/vendor/cmock/examples/temp_sensor/src/IntrinsicsWrapper.c +1 -1
  785. data/vendor/cmock/examples/temp_sensor/src/IntrinsicsWrapper.h +1 -1
  786. data/vendor/cmock/examples/temp_sensor/src/Main.c +1 -1
  787. data/vendor/cmock/examples/temp_sensor/src/Main.h +1 -1
  788. data/vendor/cmock/examples/temp_sensor/src/Model.c +1 -1
  789. data/vendor/cmock/examples/temp_sensor/src/Model.h +1 -1
  790. data/vendor/cmock/examples/temp_sensor/src/ModelConfig.h +1 -1
  791. data/vendor/cmock/examples/temp_sensor/src/TaskScheduler.c +1 -1
  792. data/vendor/cmock/examples/temp_sensor/src/TaskScheduler.h +1 -1
  793. data/vendor/cmock/examples/temp_sensor/src/TemperatureCalculator.c +1 -1
  794. data/vendor/cmock/examples/temp_sensor/src/TemperatureCalculator.h +1 -1
  795. data/vendor/cmock/examples/temp_sensor/src/TemperatureFilter.c +2 -2
  796. data/vendor/cmock/examples/temp_sensor/src/TemperatureFilter.h +1 -1
  797. data/vendor/cmock/examples/temp_sensor/src/TimerConductor.c +1 -1
  798. data/vendor/cmock/examples/temp_sensor/src/TimerConductor.h +1 -1
  799. data/vendor/cmock/examples/temp_sensor/src/TimerConfigurator.c +2 -2
  800. data/vendor/cmock/examples/temp_sensor/src/TimerConfigurator.h +1 -1
  801. data/vendor/cmock/examples/temp_sensor/src/TimerHardware.c +1 -1
  802. data/vendor/cmock/examples/temp_sensor/src/TimerHardware.h +1 -1
  803. data/vendor/cmock/examples/temp_sensor/src/TimerInterruptConfigurator.c +10 -1
  804. data/vendor/cmock/examples/temp_sensor/src/TimerInterruptConfigurator.h +1 -1
  805. data/vendor/cmock/examples/temp_sensor/src/TimerInterruptHandler.c +1 -1
  806. data/vendor/cmock/examples/temp_sensor/src/TimerInterruptHandler.h +1 -1
  807. data/vendor/cmock/examples/temp_sensor/src/TimerModel.c +1 -1
  808. data/vendor/cmock/examples/temp_sensor/src/TimerModel.h +1 -1
  809. data/vendor/cmock/examples/temp_sensor/src/Types.h +1 -1
  810. data/vendor/cmock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.c +1 -1
  811. data/vendor/cmock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.h +1 -1
  812. data/vendor/cmock/examples/temp_sensor/src/UsartConductor.c +1 -1
  813. data/vendor/cmock/examples/temp_sensor/src/UsartConductor.h +1 -1
  814. data/vendor/cmock/examples/temp_sensor/src/UsartConfigurator.c +1 -1
  815. data/vendor/cmock/examples/temp_sensor/src/UsartConfigurator.h +1 -1
  816. data/vendor/cmock/examples/temp_sensor/src/UsartHardware.c +1 -1
  817. data/vendor/cmock/examples/temp_sensor/src/UsartHardware.h +1 -1
  818. data/vendor/cmock/examples/temp_sensor/src/UsartModel.c +2 -2
  819. data/vendor/cmock/examples/temp_sensor/src/UsartModel.h +1 -1
  820. data/vendor/cmock/examples/temp_sensor/src/UsartPutChar.c +2 -2
  821. data/vendor/cmock/examples/temp_sensor/src/UsartPutChar.h +1 -1
  822. data/vendor/cmock/examples/temp_sensor/src/UsartTransmitBufferStatus.c +1 -1
  823. data/vendor/cmock/examples/temp_sensor/src/UsartTransmitBufferStatus.h +1 -1
  824. data/vendor/cmock/examples/temp_sensor/test/TestAdcConductor.c +1 -1
  825. data/vendor/cmock/examples/temp_sensor/test/TestAdcHardware.c +1 -1
  826. data/vendor/cmock/examples/temp_sensor/test/TestAdcHardwareConfigurator.c +1 -1
  827. data/vendor/cmock/examples/temp_sensor/test/TestAdcModel.c +1 -1
  828. data/vendor/cmock/examples/temp_sensor/test/TestAdcTemperatureSensor.c +1 -1
  829. data/vendor/cmock/examples/temp_sensor/test/TestExecutor.c +1 -1
  830. data/vendor/cmock/examples/temp_sensor/test/TestMain.c +1 -1
  831. data/vendor/cmock/examples/temp_sensor/test/TestModel.c +1 -1
  832. data/vendor/cmock/examples/temp_sensor/test/TestTaskScheduler.c +1 -1
  833. data/vendor/cmock/examples/temp_sensor/test/TestTemperatureCalculator.c +1 -1
  834. data/vendor/cmock/examples/temp_sensor/test/TestTemperatureFilter.c +2 -2
  835. data/vendor/cmock/examples/temp_sensor/test/TestTimerConductor.c +1 -1
  836. data/vendor/cmock/examples/temp_sensor/test/TestTimerConfigurator.c +1 -1
  837. data/vendor/cmock/examples/temp_sensor/test/TestTimerHardware.c +1 -1
  838. data/vendor/cmock/examples/temp_sensor/test/TestTimerInterruptConfigurator.c +1 -1
  839. data/vendor/cmock/examples/temp_sensor/test/TestTimerInterruptHandler.c +1 -1
  840. data/vendor/cmock/examples/temp_sensor/test/TestTimerModel.c +1 -1
  841. data/vendor/cmock/examples/temp_sensor/test/TestUsartBaudRateRegisterCalculator.c +1 -1
  842. data/vendor/cmock/examples/temp_sensor/test/TestUsartConductor.c +7 -5
  843. data/vendor/cmock/examples/temp_sensor/test/TestUsartConfigurator.c +1 -1
  844. data/vendor/cmock/examples/temp_sensor/test/TestUsartHardware.c +3 -2
  845. data/vendor/cmock/examples/temp_sensor/test/TestUsartModel.c +1 -1
  846. data/vendor/cmock/examples/temp_sensor/test/TestUsartPutChar.c +1 -1
  847. data/vendor/cmock/examples/temp_sensor/test/TestUsartTransmitBufferStatus.c +1 -1
  848. data/vendor/cmock/lib/cmock.rb +1 -1
  849. data/vendor/cmock/lib/cmock_config.rb +8 -2
  850. data/vendor/cmock/lib/cmock_file_writer.rb +38 -1
  851. data/vendor/cmock/lib/cmock_generator.rb +44 -27
  852. data/vendor/cmock/lib/cmock_generator_plugin_array.rb +68 -15
  853. data/vendor/cmock/lib/cmock_generator_plugin_callback.rb +13 -3
  854. data/vendor/cmock/lib/cmock_generator_plugin_cexception.rb +12 -3
  855. data/vendor/cmock/lib/cmock_generator_plugin_expect.rb +33 -15
  856. data/vendor/cmock/lib/cmock_generator_plugin_expect_any_args.rb +13 -8
  857. data/vendor/cmock/lib/cmock_generator_plugin_ignore.rb +15 -10
  858. data/vendor/cmock/lib/cmock_generator_plugin_ignore_arg.rb +4 -2
  859. data/vendor/cmock/lib/cmock_generator_plugin_ignore_stateless.rb +15 -10
  860. data/vendor/cmock/lib/cmock_generator_plugin_return_thru_ptr.rb +53 -3
  861. data/vendor/cmock/lib/cmock_generator_utils.rb +159 -43
  862. data/vendor/cmock/lib/cmock_header_parser.rb +217 -26
  863. data/vendor/cmock/lib/cmock_plugin_manager.rb +1 -1
  864. data/vendor/cmock/lib/cmock_unityhelper_parser.rb +7 -2
  865. data/vendor/cmock/lib/cmock_version.rb +1 -1
  866. data/vendor/cmock/scripts/create_makefile.rb +7 -5
  867. data/vendor/cmock/src/cmock.c +132 -129
  868. data/vendor/cmock/src/cmock.h +7 -13
  869. data/vendor/cmock/src/cmock_internals.h +73 -39
  870. data/vendor/cmock/test/c/TestCMockC.c +1 -7
  871. data/vendor/cmock/test/c/TestCMockC.yml +1 -1
  872. data/vendor/cmock/test/c/TestCMockCDynamic.c +1 -7
  873. data/vendor/cmock/test/c/TestCMockCDynamic.yml +1 -1
  874. data/vendor/cmock/test/c/TestCMockCDynamic_Runner.c +1 -7
  875. data/vendor/cmock/test/c/TestCMockC_Runner.c +1 -7
  876. data/vendor/cmock/{vendor/unity/test/targets/gcc_manual_math.yml → test/gcc_64_valgrind.yml} +8 -17
  877. data/vendor/cmock/test/iar/iar_v4/incIAR/AT91SAM7X-EK.h +1 -1
  878. data/vendor/cmock/test/iar/iar_v4/incIAR/AT91SAM7X256_inc.h +1 -1
  879. data/vendor/cmock/test/iar/iar_v4/incIAR/ioat91sam7x256.h +1 -1
  880. data/vendor/cmock/test/iar/iar_v4/srcIAR/Cstartup_SAM7.c +1 -1
  881. data/vendor/cmock/test/iar/iar_v5/incIAR/AT91SAM7X-EK.h +1 -1
  882. data/vendor/cmock/test/iar/iar_v5/incIAR/AT91SAM7X256_inc.h +1 -1
  883. data/vendor/cmock/test/iar/iar_v5/incIAR/project.h +1 -1
  884. data/vendor/cmock/test/iar/iar_v5/srcIAR/Cstartup_SAM7.c +1 -1
  885. data/vendor/cmock/test/project.yml +32 -0
  886. data/vendor/cmock/test/rakefile +74 -58
  887. data/vendor/cmock/test/rakefile_helper.rb +359 -152
  888. data/vendor/cmock/test/system/systest_generator.rb +2 -2
  889. data/vendor/cmock/test/system/test_compilation/callingconv.h +1 -7
  890. data/vendor/cmock/test/system/test_compilation/config.yml +10 -1
  891. data/vendor/cmock/test/system/test_compilation/const.h +7 -13
  892. data/vendor/cmock/test/system/test_compilation/inline.h +1 -2
  893. data/vendor/cmock/test/system/test_compilation/osek.h +1 -7
  894. data/vendor/cmock/test/system/test_compilation/parsing.h +37 -7
  895. data/vendor/cmock/test/system/test_interactions/all_plugins_but_other_limits.yml +5 -13
  896. data/vendor/cmock/test/system/test_interactions/all_plugins_coexist.yml +5 -5
  897. data/vendor/cmock/test/system/test_interactions/array_handling.yml +758 -0
  898. data/vendor/cmock/test/system/test_interactions/basic_expect_and_return.yml +2 -2
  899. data/vendor/cmock/test/system/test_interactions/char_string_array_plugin.yml +113 -0
  900. data/vendor/cmock/test/system/test_interactions/const_custom_type.yml +68 -0
  901. data/vendor/cmock/test/system/test_interactions/const_primitives_handling.yml +4 -3
  902. data/vendor/cmock/test/system/test_interactions/const_ptr_return_and_arg.yml +89 -0
  903. data/vendor/cmock/test/system/test_interactions/debug_output.yml +235 -0
  904. data/vendor/cmock/test/system/test_interactions/doesnt_leave_details_behind.yml +16 -16
  905. data/vendor/cmock/test/system/test_interactions/enforce_strict_ordering.yml +1 -1
  906. data/vendor/cmock/test/system/test_interactions/expect_and_return_custom_types.yml +1 -1
  907. data/vendor/cmock/test/system/test_interactions/expect_and_return_treat_as.yml +3 -3
  908. data/vendor/cmock/test/system/test_interactions/expect_and_throw.yml +1 -1
  909. data/vendor/cmock/test/system/test_interactions/expect_any_args.yml +1 -1
  910. data/vendor/cmock/test/system/test_interactions/fancy_pointer_handling.yml +3 -3
  911. data/vendor/cmock/test/system/test_interactions/function_pointer_handling.yml +1 -1
  912. data/vendor/cmock/test/system/test_interactions/ignore_and_return.yml +1 -1
  913. data/vendor/cmock/test/system/test_interactions/ignore_and_return_stateless.yml +1 -1
  914. data/vendor/cmock/test/system/test_interactions/ignore_strict_mock_calling.yml +1 -1
  915. data/vendor/cmock/test/system/test_interactions/newer_standards_stuff1.yml +1 -1
  916. data/vendor/cmock/test/system/test_interactions/nonstandard_parsed_stuff_1.yml +2 -2
  917. data/vendor/cmock/test/system/test_interactions/nonstandard_parsed_stuff_2.yml +7 -4
  918. data/vendor/cmock/test/system/test_interactions/out_of_memory.yml +65 -8
  919. data/vendor/cmock/test/system/test_interactions/parsing_challenges.yml +1 -1
  920. data/vendor/cmock/test/system/test_interactions/parsing_challenges_with_func_pointers.yml +88 -0
  921. data/vendor/cmock/test/system/test_interactions/pointer_handling.yml +465 -0
  922. data/vendor/cmock/test/system/test_interactions/{return_thru_ptr_and_expect_any_args.yml → return_thru_ptr_expect_any_args.yml} +9 -13
  923. data/vendor/cmock/test/system/test_interactions/return_thru_ptr_ignore.yml +142 -0
  924. data/vendor/cmock/test/system/test_interactions/return_thru_ptr_ignore_arg.yml +13 -9
  925. data/vendor/cmock/test/system/test_interactions/skeleton.yml +1 -1
  926. data/vendor/cmock/test/system/test_interactions/skeleton_update.yml +1 -1
  927. data/vendor/cmock/test/system/test_interactions/struct_union_enum_expect_and_return.yml +1 -1
  928. data/vendor/cmock/test/system/test_interactions/struct_union_enum_expect_and_return_with_plugins.yml +1 -1
  929. data/vendor/cmock/test/system/test_interactions/stubs_with_callbacks.yml +14 -2
  930. data/vendor/cmock/test/system/test_interactions/teardown_mock_calls.yml +57 -0
  931. data/vendor/cmock/test/system/test_interactions/teardown_mock_expectations.yml +59 -0
  932. data/vendor/cmock/test/system/test_interactions/unity_64bit_support.yml +1 -1
  933. data/vendor/cmock/test/system/test_interactions/unity_ignores.yml +1 -1
  934. data/vendor/cmock/test/system/test_interactions/unity_void_pointer_compare.yml +9 -9
  935. data/vendor/cmock/test/system/test_interactions/void_pointer_no_array_plugin.yml +133 -0
  936. data/vendor/cmock/test/system/test_interactions/void_pointer_treat_as_void_array_plugin.yml +102 -0
  937. data/vendor/cmock/test/system/test_interactions/volatile_pointer_handling.yml +291 -0
  938. data/vendor/cmock/test/system/test_interactions/wrong_expect_and_return.yml +9 -1
  939. data/vendor/cmock/test/targets/iar_arm.yml +14 -0
  940. data/vendor/cmock/test/targets/tiny.yml +36 -0
  941. data/vendor/cmock/test/test_helper.rb +1 -2
  942. data/vendor/cmock/test/unit/cmock_config_test.rb +1 -2
  943. data/vendor/cmock/test/unit/cmock_config_test.yml +1 -1
  944. data/vendor/cmock/test/unit/cmock_file_writer_test.rb +1 -1
  945. data/vendor/cmock/test/unit/cmock_generator_main_test.rb +6 -0
  946. data/vendor/cmock/test/unit/cmock_generator_no_error_stubs_plugin_array_test.rb +90 -0
  947. data/vendor/cmock/test/unit/cmock_generator_no_error_stubs_plugin_expect_any_args_test.rb +38 -0
  948. data/vendor/cmock/test/unit/cmock_generator_no_error_stubs_plugin_expect_test.rb +55 -0
  949. data/vendor/cmock/test/unit/cmock_generator_no_error_stubs_plugin_ignore_stateless_test.rb +42 -0
  950. data/vendor/cmock/test/unit/cmock_generator_no_error_stubs_plugin_ignore_test.rb +42 -0
  951. data/vendor/cmock/test/unit/cmock_generator_plugin_array_test.rb +63 -2
  952. data/vendor/cmock/test/unit/cmock_generator_plugin_callback_test.rb +24 -6
  953. data/vendor/cmock/test/unit/cmock_generator_plugin_cexception_test.rb +1 -1
  954. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_a_test.rb +118 -2
  955. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_any_args_test.rb +2 -2
  956. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_b_test.rb +4 -2
  957. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_arg_test.rb +2 -1
  958. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_stateless_test.rb +2 -2
  959. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_test.rb +2 -2
  960. data/vendor/cmock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb +135 -3
  961. data/vendor/cmock/test/unit/cmock_generator_utils_test.rb +177 -9
  962. data/vendor/cmock/test/unit/cmock_header_parser_test.rb +705 -109
  963. data/vendor/cmock/test/unit/cmock_plugin_manager_test.rb +4 -2
  964. data/vendor/cmock/test/unit/cmock_unityhelper_parser_test.rb +1 -1
  965. data/vendor/cmock/vendor/unity/CMakeLists.txt +10 -0
  966. data/vendor/cmock/vendor/unity/LICENSE.txt +1 -1
  967. data/vendor/cmock/vendor/unity/README.md +2 -2
  968. data/vendor/cmock/vendor/unity/auto/__init__.py +1 -1
  969. data/vendor/cmock/vendor/unity/auto/colour_prompt.rb +1 -1
  970. data/vendor/cmock/vendor/unity/auto/colour_reporter.rb +7 -1
  971. data/vendor/cmock/vendor/unity/auto/extract_version.py +1 -1
  972. data/vendor/cmock/vendor/unity/auto/generate_config.yml +1 -1
  973. data/vendor/cmock/vendor/unity/auto/generate_module.rb +6 -6
  974. data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +95 -14
  975. data/vendor/cmock/vendor/unity/auto/parse_output.rb +10 -7
  976. data/vendor/cmock/vendor/unity/auto/stylize_as_junit.py +4 -3
  977. data/vendor/cmock/vendor/unity/auto/stylize_as_junit.rb +4 -2
  978. data/vendor/cmock/vendor/unity/auto/test_file_filter.rb +1 -1
  979. data/vendor/cmock/vendor/unity/auto/type_sanitizer.rb +1 -1
  980. data/vendor/cmock/vendor/unity/auto/unity_test_summary.py +2 -2
  981. data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +5 -2
  982. data/vendor/cmock/vendor/unity/auto/yaml_helper.rb +1 -1
  983. data/vendor/cmock/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +2 -2
  984. data/vendor/cmock/vendor/unity/docs/UnityAssertionsReference.md +66 -1
  985. data/vendor/cmock/vendor/unity/docs/UnityChangeLog.md +41 -0
  986. data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +2 -2
  987. data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +28 -12
  988. data/vendor/cmock/vendor/unity/examples/example_1/makefile +1 -1
  989. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.c +1 -1
  990. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.h +1 -1
  991. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.c +1 -1
  992. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.h +1 -1
  993. data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode.c +1 -1
  994. data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode2.c +1 -1
  995. data/vendor/cmock/vendor/unity/examples/example_2/makefile +1 -1
  996. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.c +1 -1
  997. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.h +1 -1
  998. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.c +1 -1
  999. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.h +1 -1
  1000. data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode.c +1 -1
  1001. data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode2.c +1 -1
  1002. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +1 -1
  1003. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +1 -1
  1004. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/all_tests.c +1 -1
  1005. data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.c +1 -1
  1006. data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.h +1 -1
  1007. data/vendor/cmock/vendor/unity/examples/example_3/project.yml +24 -0
  1008. data/vendor/cmock/vendor/unity/examples/example_3/rakefile.rb +2 -3
  1009. data/vendor/cmock/vendor/unity/examples/example_3/rakefile_helper.rb +107 -153
  1010. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.c +3 -3
  1011. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.h +1 -1
  1012. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.c +1 -1
  1013. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.h +1 -1
  1014. data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode.c +1 -1
  1015. data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode2.c +1 -1
  1016. data/vendor/cmock/vendor/unity/examples/example_4/src/ProductionCode.c +1 -1
  1017. data/vendor/cmock/vendor/unity/examples/example_4/src/ProductionCode.h +1 -1
  1018. data/vendor/cmock/vendor/unity/examples/example_4/src/ProductionCode2.c +1 -1
  1019. data/vendor/cmock/vendor/unity/examples/example_4/src/ProductionCode2.h +1 -1
  1020. data/vendor/cmock/vendor/unity/examples/example_4/test/TestProductionCode.c +1 -1
  1021. data/vendor/cmock/vendor/unity/examples/example_4/test/TestProductionCode2.c +1 -1
  1022. data/vendor/cmock/vendor/unity/examples/example_5/makefile +63 -0
  1023. data/vendor/cmock/vendor/unity/examples/example_5/readme.txt +38 -0
  1024. data/vendor/cmock/vendor/unity/examples/example_5/src/ProductionCode.c +56 -0
  1025. data/vendor/cmock/vendor/unity/examples/example_5/src/ProductionCode.h +16 -0
  1026. data/vendor/cmock/vendor/unity/examples/example_5/subprojects/unity.wrap +3 -0
  1027. data/vendor/cmock/vendor/unity/examples/example_5/test/TestProductionCode.c +45 -0
  1028. data/vendor/cmock/vendor/unity/examples/example_5/test/test_runners/TestProductionCode_Runner.c +48 -0
  1029. data/vendor/cmock/vendor/unity/examples/example_5/test/unity_detail_config.h +25 -0
  1030. data/vendor/cmock/vendor/unity/examples/unity_config.h +5 -3
  1031. data/vendor/cmock/vendor/unity/extras/bdd/src/unity_bdd.h +1 -1
  1032. data/vendor/cmock/vendor/unity/extras/bdd/test/test_bdd.c +1 -1
  1033. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.c +59 -15
  1034. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.h +1 -1
  1035. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_internals.h +4 -1
  1036. data/vendor/cmock/vendor/unity/extras/fixture/test/main/AllTests.c +1 -1
  1037. data/vendor/cmock/vendor/unity/extras/fixture/test/template_fixture_tests.c +1 -1
  1038. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_Test.c +46 -1
  1039. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +4 -1
  1040. data/vendor/cmock/vendor/unity/extras/memory/src/unity_memory.c +1 -1
  1041. data/vendor/cmock/vendor/unity/extras/memory/src/unity_memory.h +1 -1
  1042. data/vendor/cmock/vendor/unity/extras/memory/test/unity_memory_Test.c +1 -1
  1043. data/vendor/cmock/vendor/unity/extras/memory/test/unity_memory_TestRunner.c +1 -1
  1044. data/vendor/cmock/vendor/unity/extras/memory/test/unity_output_Spy.c +1 -1
  1045. data/vendor/cmock/vendor/unity/extras/memory/test/unity_output_Spy.h +1 -1
  1046. data/vendor/cmock/vendor/unity/library.json +0 -7
  1047. data/vendor/cmock/vendor/unity/meson.build +16 -8
  1048. data/vendor/cmock/vendor/unity/meson_options.txt +5 -3
  1049. data/vendor/cmock/vendor/unity/src/unity.c +480 -141
  1050. data/vendor/cmock/vendor/unity/src/unity.h +16 -4
  1051. data/vendor/cmock/vendor/unity/src/unity_internals.h +291 -148
  1052. data/vendor/cmock/vendor/unity/test/Makefile +4 -6
  1053. data/vendor/cmock/vendor/unity/test/rakefile +42 -21
  1054. data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +154 -15
  1055. data/vendor/cmock/vendor/unity/test/spec/generate_module_existing_file_spec.rb +1 -1
  1056. data/vendor/cmock/vendor/unity/test/targets/clang.yml +157 -0
  1057. data/vendor/cmock/vendor/unity/test/targets/gcc.yml +139 -0
  1058. data/vendor/cmock/vendor/unity/test/targets/hitech_picc18.yml +9 -16
  1059. data/vendor/cmock/vendor/unity/test/targets/iar_arm.yml +88 -0
  1060. data/vendor/cmock/vendor/unity/test/targets/no_stdlib.yml +23 -0
  1061. data/vendor/cmock/vendor/unity/test/testdata/CException.h +1 -1
  1062. data/vendor/cmock/vendor/unity/test/testdata/Defs.h +1 -1
  1063. data/vendor/cmock/vendor/unity/test/testdata/cmock.h +1 -1
  1064. data/vendor/cmock/vendor/unity/test/testdata/mockMock.h +1 -1
  1065. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGenerator.c +1 -1
  1066. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +1 -1
  1067. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +1 -1
  1068. data/vendor/cmock/vendor/unity/test/tests/self_assessment_utils.h +23 -7
  1069. data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +1 -4
  1070. data/vendor/cmock/vendor/unity/test/tests/test_unity_arrays.c +1 -1
  1071. data/vendor/cmock/vendor/unity/test/tests/test_unity_core.c +33 -38
  1072. data/vendor/cmock/vendor/unity/test/tests/test_unity_doubles.c +4 -4
  1073. data/vendor/cmock/vendor/unity/test/tests/test_unity_floats.c +15 -6
  1074. data/vendor/cmock/vendor/unity/test/tests/test_unity_integers.c +35 -1
  1075. data/vendor/cmock/vendor/unity/test/tests/test_unity_integers_64.c +1 -1
  1076. data/vendor/cmock/vendor/unity/test/tests/test_unity_memory.c +69 -1
  1077. data/vendor/cmock/vendor/unity/test/tests/test_unity_parameterized.c +5 -5
  1078. data/vendor/cmock/vendor/unity/test/tests/test_unity_parameterizedDemo.c +1 -1
  1079. data/vendor/cmock/vendor/unity/test/tests/test_unity_strings.c +65 -1
  1080. data/vendor/cmock/vendor/unity/test/tests/types_for_test.h +1 -1
  1081. data/vendor/unity/CMakeLists.txt +10 -0
  1082. data/vendor/unity/LICENSE.txt +1 -1
  1083. data/vendor/unity/README.md +2 -2
  1084. data/vendor/unity/auto/__init__.py +1 -1
  1085. data/vendor/unity/auto/colour_prompt.rb +1 -1
  1086. data/vendor/unity/auto/colour_reporter.rb +7 -1
  1087. data/vendor/unity/auto/extract_version.py +1 -1
  1088. data/vendor/unity/auto/generate_config.yml +1 -1
  1089. data/vendor/unity/auto/generate_module.rb +6 -6
  1090. data/vendor/unity/auto/generate_test_runner.rb +95 -14
  1091. data/vendor/unity/auto/parse_output.rb +10 -7
  1092. data/vendor/unity/auto/stylize_as_junit.py +4 -3
  1093. data/vendor/unity/auto/stylize_as_junit.rb +4 -2
  1094. data/vendor/unity/auto/test_file_filter.rb +1 -1
  1095. data/vendor/unity/auto/type_sanitizer.rb +1 -1
  1096. data/vendor/unity/auto/unity_test_summary.py +2 -2
  1097. data/vendor/unity/auto/unity_test_summary.rb +5 -2
  1098. data/vendor/unity/auto/yaml_helper.rb +1 -1
  1099. data/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +2 -2
  1100. data/vendor/unity/docs/UnityAssertionsReference.md +66 -1
  1101. data/vendor/unity/docs/UnityChangeLog.md +41 -0
  1102. data/vendor/unity/docs/UnityConfigurationGuide.md +2 -2
  1103. data/vendor/unity/docs/UnityHelperScriptsGuide.md +28 -12
  1104. data/vendor/unity/examples/example_1/makefile +1 -1
  1105. data/vendor/unity/examples/example_1/src/ProductionCode.c +1 -1
  1106. data/vendor/unity/examples/example_1/src/ProductionCode.h +1 -1
  1107. data/vendor/unity/examples/example_1/src/ProductionCode2.c +1 -1
  1108. data/vendor/unity/examples/example_1/src/ProductionCode2.h +1 -1
  1109. data/vendor/unity/examples/example_1/test/TestProductionCode.c +1 -1
  1110. data/vendor/unity/examples/example_1/test/TestProductionCode2.c +1 -1
  1111. data/vendor/unity/examples/example_2/makefile +1 -1
  1112. data/vendor/unity/examples/example_2/src/ProductionCode.c +1 -1
  1113. data/vendor/unity/examples/example_2/src/ProductionCode.h +1 -1
  1114. data/vendor/unity/examples/example_2/src/ProductionCode2.c +1 -1
  1115. data/vendor/unity/examples/example_2/src/ProductionCode2.h +1 -1
  1116. data/vendor/unity/examples/example_2/test/TestProductionCode.c +1 -1
  1117. data/vendor/unity/examples/example_2/test/TestProductionCode2.c +1 -1
  1118. data/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +1 -1
  1119. data/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +1 -1
  1120. data/vendor/unity/examples/example_2/test/test_runners/all_tests.c +1 -1
  1121. data/vendor/unity/examples/example_3/helper/UnityHelper.c +1 -1
  1122. data/vendor/unity/examples/example_3/helper/UnityHelper.h +1 -1
  1123. data/vendor/unity/examples/example_3/project.yml +24 -0
  1124. data/vendor/unity/examples/example_3/rakefile.rb +2 -3
  1125. data/vendor/unity/examples/example_3/rakefile_helper.rb +107 -153
  1126. data/vendor/unity/examples/example_3/src/ProductionCode.c +3 -3
  1127. data/vendor/unity/examples/example_3/src/ProductionCode.h +1 -1
  1128. data/vendor/unity/examples/example_3/src/ProductionCode2.c +1 -1
  1129. data/vendor/unity/examples/example_3/src/ProductionCode2.h +1 -1
  1130. data/vendor/unity/examples/example_3/test/TestProductionCode.c +1 -1
  1131. data/vendor/unity/examples/example_3/test/TestProductionCode2.c +1 -1
  1132. data/vendor/unity/examples/example_4/src/ProductionCode.c +1 -1
  1133. data/vendor/unity/examples/example_4/src/ProductionCode.h +1 -1
  1134. data/vendor/unity/examples/example_4/src/ProductionCode2.c +1 -1
  1135. data/vendor/unity/examples/example_4/src/ProductionCode2.h +1 -1
  1136. data/vendor/unity/examples/example_4/test/TestProductionCode.c +1 -1
  1137. data/vendor/unity/examples/example_4/test/TestProductionCode2.c +1 -1
  1138. data/vendor/unity/examples/example_5/makefile +63 -0
  1139. data/vendor/unity/examples/example_5/readme.txt +38 -0
  1140. data/vendor/unity/examples/example_5/src/ProductionCode.c +56 -0
  1141. data/vendor/unity/examples/example_5/src/ProductionCode.h +16 -0
  1142. data/vendor/unity/examples/example_5/subprojects/unity.wrap +3 -0
  1143. data/vendor/unity/examples/example_5/test/TestProductionCode.c +45 -0
  1144. data/vendor/unity/examples/example_5/test/test_runners/TestProductionCode_Runner.c +48 -0
  1145. data/vendor/unity/examples/example_5/test/unity_detail_config.h +25 -0
  1146. data/vendor/unity/examples/unity_config.h +5 -3
  1147. data/vendor/unity/extras/bdd/src/unity_bdd.h +1 -1
  1148. data/vendor/unity/extras/bdd/test/test_bdd.c +1 -1
  1149. data/vendor/unity/extras/fixture/src/unity_fixture.c +59 -15
  1150. data/vendor/unity/extras/fixture/src/unity_fixture.h +1 -1
  1151. data/vendor/unity/extras/fixture/src/unity_fixture_internals.h +4 -1
  1152. data/vendor/unity/extras/fixture/test/main/AllTests.c +1 -1
  1153. data/vendor/unity/extras/fixture/test/template_fixture_tests.c +1 -1
  1154. data/vendor/unity/extras/fixture/test/unity_fixture_Test.c +46 -1
  1155. data/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +4 -1
  1156. data/vendor/unity/extras/memory/src/unity_memory.c +1 -1
  1157. data/vendor/unity/extras/memory/src/unity_memory.h +1 -1
  1158. data/vendor/unity/extras/memory/test/unity_memory_Test.c +1 -1
  1159. data/vendor/unity/extras/memory/test/unity_memory_TestRunner.c +1 -1
  1160. data/vendor/unity/extras/memory/test/unity_output_Spy.c +1 -1
  1161. data/vendor/unity/extras/memory/test/unity_output_Spy.h +1 -1
  1162. data/vendor/unity/library.json +0 -7
  1163. data/vendor/unity/meson.build +16 -8
  1164. data/vendor/unity/meson_options.txt +5 -3
  1165. data/vendor/unity/src/unity.c +480 -141
  1166. data/vendor/unity/src/unity.h +16 -4
  1167. data/vendor/unity/src/unity_internals.h +291 -148
  1168. data/vendor/unity/test/Makefile +4 -6
  1169. data/vendor/unity/test/rakefile +42 -21
  1170. data/vendor/unity/test/rakefile_helper.rb +154 -15
  1171. data/vendor/unity/test/spec/generate_module_existing_file_spec.rb +1 -1
  1172. data/vendor/unity/test/targets/clang.yml +157 -0
  1173. data/vendor/unity/test/targets/gcc.yml +139 -0
  1174. data/vendor/unity/test/targets/hitech_picc18.yml +9 -16
  1175. data/vendor/unity/test/targets/iar_arm.yml +88 -0
  1176. data/vendor/unity/test/targets/no_stdlib.yml +23 -0
  1177. data/vendor/unity/test/testdata/CException.h +1 -1
  1178. data/vendor/unity/test/testdata/Defs.h +1 -1
  1179. data/vendor/unity/test/testdata/cmock.h +1 -1
  1180. data/vendor/unity/test/testdata/mockMock.h +1 -1
  1181. data/vendor/unity/test/testdata/testRunnerGenerator.c +1 -1
  1182. data/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +1 -1
  1183. data/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +1 -1
  1184. data/vendor/unity/test/tests/self_assessment_utils.h +23 -7
  1185. data/vendor/unity/test/tests/test_generate_test_runner.rb +1 -4
  1186. data/vendor/unity/test/tests/test_unity_arrays.c +1 -1
  1187. data/vendor/unity/test/tests/test_unity_core.c +33 -38
  1188. data/vendor/unity/test/tests/test_unity_doubles.c +4 -4
  1189. data/vendor/unity/test/tests/test_unity_floats.c +15 -6
  1190. data/vendor/unity/test/tests/test_unity_integers.c +35 -1
  1191. data/vendor/unity/test/tests/test_unity_integers_64.c +1 -1
  1192. data/vendor/unity/test/tests/test_unity_memory.c +69 -1
  1193. data/vendor/unity/test/tests/test_unity_parameterized.c +5 -5
  1194. data/vendor/unity/test/tests/test_unity_parameterizedDemo.c +1 -1
  1195. data/vendor/unity/test/tests/test_unity_strings.c +65 -1
  1196. data/vendor/unity/test/tests/types_for_test.h +1 -1
  1197. metadata +702 -177
  1198. data/docs/CeedlingPacket.md +0 -5651
  1199. data/lib/ceedling/build_batchinator.rb +0 -113
  1200. data/lib/ceedling/generator_test_results_backtrace.rb +0 -215
  1201. data/lib/ceedling/generator_test_runner.rb +0 -84
  1202. data/lib/ceedling/preprocessinator.rb +0 -239
  1203. data/lib/ceedling/preprocessinator_extractor.rb +0 -257
  1204. data/lib/ceedling/preprocessinator_file_handler.rb +0 -229
  1205. data/lib/ceedling/preprocessinator_includes_handler.rb +0 -382
  1206. data/lib/ceedling/task_invoker.rb +0 -70
  1207. data/lib/ceedling/test_invoker.rb +0 -506
  1208. data/lib/ceedling/test_invoker_helper.rb +0 -347
  1209. data/plugins/gcov/README.md +0 -893
  1210. data/plugins/gcov/lib/reportinator_helper.rb +0 -30
  1211. data/plugins/report_tests_log_factory/sample_html_report.png +0 -0
  1212. data/spec/configurator_spec.rb +0 -18
  1213. data/spec/generator_test_results_spec.rb +0 -131
  1214. data/spec/parsing_parcels_spec.rb +0 -66
  1215. data/spec/preprocessinator_includes_handler_spec.rb +0 -289
  1216. data/spec/reportinator_spec.rb +0 -26
  1217. data/spec/spec_helper.rb +0 -31
  1218. data/spec/test_context_extractor_spec.rb +0 -328
  1219. data/spec/uncategorized_specs_spec.rb +0 -15
  1220. data/vendor/cmock/examples/temp_sensor/targets/gcc.yml +0 -97
  1221. data/vendor/cmock/examples/temp_sensor/targets/iar_v4.yml +0 -143
  1222. data/vendor/cmock/examples/temp_sensor/targets/iar_v5.yml +0 -132
  1223. data/vendor/cmock/scripts/create_mock.rb +0 -15
  1224. data/vendor/cmock/scripts/create_runner.rb +0 -25
  1225. data/vendor/cmock/scripts/test_summary.rb +0 -25
  1226. data/vendor/cmock/test/system/test_interactions/array_and_pointer_handling.yml +0 -453
  1227. data/vendor/cmock/test/targets/clang_strict.yml +0 -97
  1228. data/vendor/cmock/test/targets/gcc.yml +0 -65
  1229. data/vendor/cmock/test/targets/gcc_64.yml +0 -65
  1230. data/vendor/cmock/test/targets/gcc_tiny.yml +0 -87
  1231. data/vendor/cmock/test/targets/iar_arm_v4.yml +0 -117
  1232. data/vendor/cmock/test/targets/iar_arm_v5.yml +0 -102
  1233. data/vendor/cmock/vendor/unity/examples/example_3/target_gcc_32.yml +0 -54
  1234. data/vendor/cmock/vendor/unity/test/targets/ansi.yml +0 -51
  1235. data/vendor/cmock/vendor/unity/test/targets/clang_file.yml +0 -79
  1236. data/vendor/cmock/vendor/unity/test/targets/clang_strict.yml +0 -79
  1237. data/vendor/cmock/vendor/unity/test/targets/gcc_32.yml +0 -52
  1238. data/vendor/cmock/vendor/unity/test/targets/gcc_64.yml +0 -53
  1239. data/vendor/cmock/vendor/unity/test/targets/gcc_auto_limits.yml +0 -50
  1240. data/vendor/cmock/vendor/unity/test/targets/gcc_auto_stdint.yml +0 -62
  1241. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v4.yml +0 -105
  1242. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5.yml +0 -99
  1243. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5_3.yml +0 -99
  1244. data/vendor/cmock/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml +0 -97
  1245. data/vendor/cmock/vendor/unity/test/targets/iar_cortexm3_v5.yml +0 -101
  1246. data/vendor/cmock/vendor/unity/test/targets/iar_msp430.yml +0 -119
  1247. data/vendor/cmock/vendor/unity/test/targets/iar_sh2a_v6.yml +0 -106
  1248. data/vendor/unity/examples/example_3/target_gcc_32.yml +0 -54
  1249. data/vendor/unity/test/targets/ansi.yml +0 -51
  1250. data/vendor/unity/test/targets/clang_file.yml +0 -79
  1251. data/vendor/unity/test/targets/clang_strict.yml +0 -79
  1252. data/vendor/unity/test/targets/gcc_32.yml +0 -52
  1253. data/vendor/unity/test/targets/gcc_64.yml +0 -53
  1254. data/vendor/unity/test/targets/gcc_auto_limits.yml +0 -50
  1255. data/vendor/unity/test/targets/gcc_auto_stdint.yml +0 -62
  1256. data/vendor/unity/test/targets/gcc_manual_math.yml +0 -50
  1257. data/vendor/unity/test/targets/iar_arm_v4.yml +0 -105
  1258. data/vendor/unity/test/targets/iar_arm_v5.yml +0 -99
  1259. data/vendor/unity/test/targets/iar_arm_v5_3.yml +0 -99
  1260. data/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml +0 -97
  1261. data/vendor/unity/test/targets/iar_cortexm3_v5.yml +0 -101
  1262. data/vendor/unity/test/targets/iar_msp430.yml +0 -119
  1263. data/vendor/unity/test/targets/iar_sh2a_v6.yml +0 -106
@@ -0,0 +1,2091 @@
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 'ceedling/c_extractor/c_extractor_code_text'
10
+ require 'stringio'
11
+
12
+ describe CExtractorCodeText do
13
+
14
+ ###
15
+ ### skip_c_string()
16
+ ###
17
+ describe "#skip_c_string" do
18
+ # Helper to access private method
19
+ let(:skip_c_string) do
20
+ ->(content, quote) do
21
+ scanner = StringScanner.new(content)
22
+ code_text = CExtractorCodeText.new
23
+ bytes_skipped = code_text.skip_c_string( scanner, quote )
24
+ return [bytes_skipped, scanner.pos, scanner.rest]
25
+ end
26
+ end
27
+
28
+ context "double-quoted string handling" do
29
+ it "skips simple double-quoted string" do
30
+ content = '"hello"code'
31
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
32
+
33
+ expect(bytes_skipped).to eq(7)
34
+ expect(pos).to eq(7)
35
+ expect(rest).to eq("code")
36
+ end
37
+
38
+ it "skips empty double-quoted string" do
39
+ content = '""code'
40
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
41
+
42
+ expect(bytes_skipped).to eq(2)
43
+ expect(pos).to eq(2)
44
+ expect(rest).to eq("code")
45
+ end
46
+
47
+ it "skips string with spaces" do
48
+ content = '"hello world"code'
49
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
50
+
51
+ expect(bytes_skipped).to eq(15)
52
+ expect(pos).to eq(15)
53
+ expect(rest).to eq("code")
54
+ end
55
+
56
+ it "skips string with special characters" do
57
+ content = '"hello!@#$%^&*()"code'
58
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
59
+
60
+ expect(bytes_skipped).to eq(17)
61
+ expect(pos).to eq(17)
62
+ expect(rest).to eq("code")
63
+ end
64
+
65
+ it "skips string with newlines" do
66
+ content = "\"hello\nworld\"code"
67
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
68
+
69
+ expect(bytes_skipped).to eq(13)
70
+ expect(pos).to eq(13)
71
+ expect(rest).to eq("code")
72
+ end
73
+
74
+ it "skips string with tabs" do
75
+ content = "\"hello\tworld\"code"
76
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
77
+
78
+ expect(bytes_skipped).to eq(13)
79
+ expect(pos).to eq(13)
80
+ expect(rest).to eq("code")
81
+ end
82
+ end
83
+
84
+ context "single-quoted character handling" do
85
+ it "skips simple single-quoted character" do
86
+ content = "'a'code"
87
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
88
+
89
+ expect(bytes_skipped).to eq(3)
90
+ expect(pos).to eq(3)
91
+ expect(rest).to eq("code")
92
+ end
93
+
94
+ it "skips single-quoted digit" do
95
+ content = "'5'code"
96
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
97
+
98
+ expect(bytes_skipped).to eq(3)
99
+ expect(pos).to eq(3)
100
+ expect(rest).to eq("code")
101
+ end
102
+
103
+ it "skips single-quoted special character" do
104
+ content = "'@'code"
105
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
106
+
107
+ expect(bytes_skipped).to eq(3)
108
+ expect(pos).to eq(3)
109
+ expect(rest).to eq("code")
110
+ end
111
+
112
+ it "skips single-quoted space" do
113
+ content = "' 'code"
114
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
115
+
116
+ expect(bytes_skipped).to eq(3)
117
+ expect(pos).to eq(3)
118
+ expect(rest).to eq("code")
119
+ end
120
+ end
121
+
122
+ context "escape sequence handling" do
123
+ it "skips string with escaped double quote" do
124
+ content = '"hello \\"world\\""code'
125
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
126
+
127
+ expect(bytes_skipped).to eq(17)
128
+ expect(pos).to eq(17)
129
+ expect(rest).to eq("code")
130
+ end
131
+
132
+ it "skips string with escaped backslash" do
133
+ content = '"path\\\\to\\\\file"code'
134
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
135
+
136
+ expect(bytes_skipped).to eq(16)
137
+ expect(pos).to eq(16)
138
+ expect(rest).to eq("code")
139
+ end
140
+
141
+ it "skips string with escaped newline" do
142
+ content = '"hello\\nworld"code'
143
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
144
+
145
+ expect(bytes_skipped).to eq(14)
146
+ expect(pos).to eq(14)
147
+ expect(rest).to eq("code")
148
+ end
149
+
150
+ it "skips string with escaped tab" do
151
+ content = '"hello\\tworld"code'
152
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
153
+
154
+ expect(bytes_skipped).to eq(14)
155
+ expect(pos).to eq(14)
156
+ expect(rest).to eq("code")
157
+ end
158
+
159
+ it "skips string with escaped carriage return" do
160
+ content = '"hello\\rworld"code'
161
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
162
+
163
+ expect(bytes_skipped).to eq(14)
164
+ expect(pos).to eq(14)
165
+ expect(rest).to eq("code")
166
+ end
167
+
168
+ it "skips string with multiple escape sequences" do
169
+ content = '"\\n\\t\\r\\\\\\"\\\'"code'
170
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
171
+
172
+ expect(bytes_skipped).to eq(14)
173
+ expect(pos).to eq(14)
174
+ expect(rest).to eq("code")
175
+ end
176
+
177
+ it "skips character with escaped single quote" do
178
+ content = "'\\\''code"
179
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
180
+
181
+ expect(bytes_skipped).to eq(4)
182
+ expect(pos).to eq(4)
183
+ expect(rest).to eq("code")
184
+ end
185
+
186
+ it "skips character with escaped backslash" do
187
+ content = "'\\\\'code"
188
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
189
+
190
+ expect(bytes_skipped).to eq(4)
191
+ expect(pos).to eq(4)
192
+ expect(rest).to eq("code")
193
+ end
194
+
195
+ it "skips character with escaped newline" do
196
+ content = "'\\n'code"
197
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
198
+
199
+ expect(bytes_skipped).to eq(4)
200
+ expect(pos).to eq(4)
201
+ expect(rest).to eq("code")
202
+ end
203
+
204
+ it "skips string with octal escape sequence" do
205
+ content = '"\\101\\102\\103"code'
206
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
207
+
208
+ expect(bytes_skipped).to eq(14)
209
+ expect(pos).to eq(14)
210
+ expect(rest).to eq("code")
211
+ end
212
+
213
+ it "skips string with hexadecimal escape sequence" do
214
+ content = '"\\x41\\x42\\x43"code'
215
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
216
+
217
+ expect(bytes_skipped).to eq(14)
218
+ expect(pos).to eq(14)
219
+ expect(rest).to eq("code")
220
+ end
221
+
222
+ it "skips string with unicode escape sequence" do
223
+ content = '"\\u0041\\u0042"code'
224
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
225
+
226
+ expect(bytes_skipped).to eq(14)
227
+ expect(pos).to eq(14)
228
+ expect(rest).to eq("code")
229
+ end
230
+ end
231
+
232
+ context "unterminated string handling" do
233
+ it "handles unterminated double-quoted string" do
234
+ content = '"hello world'
235
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
236
+
237
+ expect(bytes_skipped).to eq(12)
238
+ expect(pos).to eq(12)
239
+ expect(rest).to eq("")
240
+ end
241
+
242
+ it "handles unterminated single-quoted character" do
243
+ content = "'a"
244
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
245
+
246
+ expect(bytes_skipped).to eq(2)
247
+ expect(pos).to eq(2)
248
+ expect(rest).to eq("")
249
+ end
250
+
251
+ it "handles unterminated string with escape at end" do
252
+ content = '"hello\\'
253
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
254
+
255
+ expect(bytes_skipped).to eq(7)
256
+ expect(pos).to eq(7)
257
+ expect(rest).to eq("")
258
+ end
259
+
260
+ it "handles unterminated string with newline" do
261
+ content = "\"hello\nworld"
262
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
263
+
264
+ expect(bytes_skipped).to eq(12)
265
+ expect(pos).to eq(12)
266
+ expect(rest).to eq("")
267
+ end
268
+ end
269
+
270
+ context "edge cases" do
271
+ it "handles string with only opening quote" do
272
+ content = '"'
273
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
274
+
275
+ expect(bytes_skipped).to eq(1)
276
+ expect(pos).to eq(1)
277
+ expect(rest).to eq("")
278
+ end
279
+
280
+ it "handles character with only opening quote" do
281
+ content = "'"
282
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
283
+
284
+ expect(bytes_skipped).to eq(1)
285
+ expect(pos).to eq(1)
286
+ expect(rest).to eq("")
287
+ end
288
+
289
+ it "handles string with consecutive escaped backslashes" do
290
+ content = '"\\\\\\\\"code'
291
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
292
+
293
+ expect(bytes_skipped).to eq(6)
294
+ expect(pos).to eq(6)
295
+ expect(rest).to eq("code")
296
+ end
297
+
298
+ it "handles string ending with backslash before quote" do
299
+ content = '"test\\\\"code'
300
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
301
+
302
+ expect(bytes_skipped).to eq(8)
303
+ expect(pos).to eq(8)
304
+ expect(rest).to eq("code")
305
+ end
306
+
307
+ it "does not confuse single quote inside double-quoted string" do
308
+ content = '"don\'t"code'
309
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
310
+
311
+ expect(bytes_skipped).to eq(7)
312
+ expect(pos).to eq(7)
313
+ expect(rest).to eq("code")
314
+ end
315
+
316
+ it "does not confuse double quote inside single-quoted character" do
317
+ content = '\'"\'code'
318
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
319
+
320
+ expect(bytes_skipped).to eq(3)
321
+ expect(pos).to eq(3)
322
+ expect(rest).to eq("code")
323
+ end
324
+
325
+ it "handles very long string" do
326
+ long_string = '"' + ('x' * 1000) + '"code'
327
+ bytes_skipped, pos, rest = skip_c_string.call(long_string, '"')
328
+
329
+ expect(bytes_skipped).to eq(1002)
330
+ expect(pos).to eq(1002)
331
+ expect(rest).to eq("code")
332
+ end
333
+
334
+ it "handles string with null character" do
335
+ content = "\"hello\\0world\"code"
336
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
337
+
338
+ expect(bytes_skipped).to eq(14)
339
+ expect(pos).to eq(14)
340
+ expect(rest).to eq("code")
341
+ end
342
+ end
343
+
344
+ context "real-world C code patterns" do
345
+ it "skips string literal in printf statement" do
346
+ content = '"Hello, World!")'
347
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
348
+
349
+ expect(bytes_skipped).to eq(15)
350
+ expect(pos).to eq(15)
351
+ expect(rest).to eq(")")
352
+ end
353
+
354
+ it "skips format string with specifiers" do
355
+ content = '"%d %s %f", x, y, z)'
356
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
357
+
358
+ expect(bytes_skipped).to eq(10)
359
+ expect(pos).to eq(10)
360
+ expect(rest).to eq(', x, y, z)')
361
+ end
362
+
363
+ it "skips file path string" do
364
+ content = '"C:\\\\Users\\\\file.txt"code'
365
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
366
+
367
+ expect(bytes_skipped).to eq(21)
368
+ expect(pos).to eq(21)
369
+ expect(rest).to eq("code")
370
+ end
371
+
372
+ it "skips character constant in switch case" do
373
+ content = "'a': return 1;"
374
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
375
+
376
+ expect(bytes_skipped).to eq(3)
377
+ expect(pos).to eq(3)
378
+ expect(rest).to eq(": return 1;")
379
+ end
380
+
381
+ it "skips string with JSON-like content" do
382
+ content = '"{\"key\": \"value\"}"code'
383
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
384
+
385
+ expect(bytes_skipped).to eq(22)
386
+ expect(pos).to eq(22)
387
+ expect(rest).to eq("code")
388
+ end
389
+
390
+ it "skips multi-line string literal (C11 style)" do
391
+ content = "\"line1\\\nline2\\\nline3\"code"
392
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
393
+
394
+ expect(bytes_skipped).to eq(21)
395
+ expect(pos).to eq(21)
396
+ expect(rest).to eq("code")
397
+ end
398
+
399
+ it "skips string with SQL query" do
400
+ content = '"SELECT * FROM users WHERE id = 1"code'
401
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
402
+
403
+ expect(bytes_skipped).to eq(34)
404
+ expect(pos).to eq(34)
405
+ expect(rest).to eq("code")
406
+ end
407
+ end
408
+
409
+ context "consecutive strings" do
410
+ it "skips first string when followed by another string" do
411
+ content = '"first" "second"'
412
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
413
+
414
+ expect(bytes_skipped).to eq(7)
415
+ expect(pos).to eq(7)
416
+ expect(rest).to eq(' "second"')
417
+ end
418
+
419
+ it "skips string followed by character literal" do
420
+ content = '"string" \'c\''
421
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
422
+
423
+ expect(bytes_skipped).to eq(8)
424
+ expect(pos).to eq(8)
425
+ expect(rest).to eq(" 'c'")
426
+ end
427
+
428
+ it "skips character literal followed by string" do
429
+ content = "'c' \"string\""
430
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
431
+
432
+ expect(bytes_skipped).to eq(3)
433
+ expect(pos).to eq(3)
434
+ expect(rest).to eq(' "string"')
435
+ end
436
+ end
437
+
438
+ context "strings in complex expressions" do
439
+ it "skips string in array initialization" do
440
+ content = '"element1", "element2"'
441
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
442
+
443
+ expect(bytes_skipped).to eq(10)
444
+ expect(pos).to eq(10)
445
+ expect(rest).to eq(', "element2"')
446
+ end
447
+
448
+ it "skips string in function call" do
449
+ content = '"argument", 42)'
450
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
451
+
452
+ expect(bytes_skipped).to eq(10)
453
+ expect(pos).to eq(10)
454
+ expect(rest).to eq(", 42)")
455
+ end
456
+
457
+ it "skips string in ternary operator" do
458
+ content = '"true" : "false"'
459
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
460
+
461
+ expect(bytes_skipped).to eq(6)
462
+ expect(pos).to eq(6)
463
+ expect(rest).to eq(' : "false"')
464
+ end
465
+ end
466
+
467
+ context "performance and boundary conditions" do
468
+ it "handles string at end of input" do
469
+ content = '"last"'
470
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
471
+
472
+ expect(bytes_skipped).to eq(6)
473
+ expect(pos).to eq(6)
474
+ expect(rest).to eq("")
475
+ end
476
+
477
+ it "handles character at end of input" do
478
+ content = "'x'"
479
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
480
+
481
+ expect(bytes_skipped).to eq(3)
482
+ expect(pos).to eq(3)
483
+ expect(rest).to eq("")
484
+ end
485
+
486
+ it "handles alternating escaped and regular characters" do
487
+ content = '"a\\nb\\tc\\rd\\\\e"code'
488
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
489
+
490
+ expect(bytes_skipped).to eq(15)
491
+ expect(pos).to eq(15)
492
+ expect(rest).to eq("code")
493
+ end
494
+ end
495
+
496
+ context "invalid but handled gracefully" do
497
+ it "handles empty character literal" do
498
+ content = "''code"
499
+ bytes_skipped, pos, rest = skip_c_string.call(content, "'")
500
+
501
+ expect(bytes_skipped).to eq(2)
502
+ expect(pos).to eq(2)
503
+ expect(rest).to eq("code")
504
+ end
505
+
506
+ it "handles string with unrecognized escape sequence" do
507
+ # \q is not a valid escape, but should still consume it
508
+ content = '"\\q"code'
509
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
510
+
511
+ expect(bytes_skipped).to eq(4)
512
+ expect(pos).to eq(4)
513
+ expect(rest).to eq("code")
514
+ end
515
+
516
+ it "handles incomplete octal escape at end of string" do
517
+ content = '"\\1"code'
518
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
519
+
520
+ expect(bytes_skipped).to eq(4)
521
+ expect(pos).to eq(4)
522
+ expect(rest).to eq("code")
523
+ end
524
+
525
+ it "handles incomplete hex escape at end of string" do
526
+ content = '"\\x"code'
527
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
528
+
529
+ expect(bytes_skipped).to eq(4)
530
+ expect(pos).to eq(4)
531
+ expect(rest).to eq("code")
532
+ end
533
+
534
+ it "handles backslash at very end of unterminated string" do
535
+ content = '"test\\'
536
+ bytes_skipped, pos, rest = skip_c_string.call(content, '"')
537
+
538
+ expect(bytes_skipped).to eq(6)
539
+ expect(pos).to eq(6)
540
+ expect(rest).to eq("")
541
+ end
542
+ end
543
+ end
544
+
545
+ ###
546
+ ### skip_semicolons()
547
+ ###
548
+ describe "#skip_semicolons" do
549
+ let(:skip_semicolons) do
550
+ ->(content) do
551
+ scanner = StringScanner.new(content)
552
+ code_text = CExtractorCodeText.new()
553
+ code_text.skip_semicolons( scanner )
554
+ return [scanner.pos, scanner.rest]
555
+ end
556
+ end
557
+
558
+ context "single semicolon handling" do
559
+ it "skips single semicolon" do
560
+ content = ";code"
561
+ pos, rest = skip_semicolons.call(content)
562
+
563
+ expect(pos).to eq(1)
564
+ expect(rest).to eq("code")
565
+ end
566
+
567
+ it "skips semicolon with trailing space" do
568
+ content = "; code"
569
+ pos, rest = skip_semicolons.call(content)
570
+
571
+ expect(pos).to eq(1)
572
+ expect(rest).to eq(" code")
573
+ end
574
+
575
+ it "skips semicolon at end of input" do
576
+ content = ";"
577
+ pos, rest = skip_semicolons.call(content)
578
+
579
+ expect(pos).to eq(1)
580
+ expect(rest).to eq("")
581
+ end
582
+ end
583
+
584
+ context "multiple consecutive semicolons" do
585
+ it "skips two consecutive semicolons" do
586
+ content = ";;code"
587
+ pos, rest = skip_semicolons.call(content)
588
+
589
+ expect(pos).to eq(2)
590
+ expect(rest).to eq("code")
591
+ end
592
+
593
+ it "skips three consecutive semicolons" do
594
+ content = ";;;code"
595
+ pos, rest = skip_semicolons.call(content)
596
+
597
+ expect(pos).to eq(3)
598
+ expect(rest).to eq("code")
599
+ end
600
+
601
+ it "skips many consecutive semicolons" do
602
+ content = ";;;;;;;;;;code"
603
+ pos, rest = skip_semicolons.call(content)
604
+
605
+ expect(pos).to eq(10)
606
+ expect(rest).to eq("code")
607
+ end
608
+ end
609
+
610
+ context "semicolons with whitespace" do
611
+ it "skips semicolons separated by spaces" do
612
+ content = "; ; ;code"
613
+ pos, rest = skip_semicolons.call(content)
614
+
615
+ expect(pos).to eq(5)
616
+ expect(rest).to eq("code")
617
+ end
618
+
619
+ it "skips semicolons separated by tabs" do
620
+ content = ";\t;\t;code"
621
+ pos, rest = skip_semicolons.call(content)
622
+
623
+ expect(pos).to eq(5)
624
+ expect(rest).to eq("code")
625
+ end
626
+
627
+ it "skips semicolons separated by newlines" do
628
+ content = ";\n;\n;code"
629
+ pos, rest = skip_semicolons.call(content)
630
+
631
+ expect(pos).to eq(5)
632
+ expect(rest).to eq("code")
633
+ end
634
+
635
+ it "skips semicolons with mixed whitespace" do
636
+ content = "; \t\n ; \r\n ;code"
637
+ pos, rest = skip_semicolons.call(content)
638
+
639
+ expect(pos).to eq(11)
640
+ expect(rest).to eq("code")
641
+ end
642
+
643
+ it "skips leading whitespace before first semicolon" do
644
+ content = " \t;code"
645
+ pos, rest = skip_semicolons.call(content)
646
+
647
+ expect(pos).to eq(4)
648
+ expect(rest).to eq("code")
649
+ end
650
+ end
651
+
652
+ context "semicolons with comments" do
653
+ it "skips semicolons separated by line comments" do
654
+ content = "; // comment\n;code"
655
+ pos, rest = skip_semicolons.call(content)
656
+
657
+ expect(pos).to eq(14)
658
+ expect(rest).to eq("code")
659
+ end
660
+
661
+ it "skips semicolons separated by block comments" do
662
+ content = "; /* comment */ ;code"
663
+ pos, rest = skip_semicolons.call(content)
664
+
665
+ expect(pos).to eq(17)
666
+ expect(rest).to eq("code")
667
+ end
668
+
669
+ it "skips semicolons with multi-line block comments" do
670
+ content = ";\n/* comment\n spanning\n lines */\n;code"
671
+ pos, rest = skip_semicolons.call(content)
672
+
673
+ expect(pos).to eq(38)
674
+ expect(rest).to eq("code")
675
+ end
676
+
677
+ it "skips semicolons with multiple comments" do
678
+ content = "; // first\n; /* second */ ;code"
679
+ pos, rest = skip_semicolons.call(content)
680
+
681
+ expect(pos).to eq(27)
682
+ expect(rest).to eq("code")
683
+ end
684
+ end
685
+
686
+ context "stopping at non-semicolon content" do
687
+ it "stops at identifier" do
688
+ content = ";code"
689
+ pos, rest = skip_semicolons.call(content)
690
+
691
+ expect(pos).to eq(1)
692
+ expect(rest).to eq("code")
693
+ end
694
+
695
+ it "stops at number" do
696
+ content = ";;123"
697
+ pos, rest = skip_semicolons.call(content)
698
+
699
+ expect(pos).to eq(2)
700
+ expect(rest).to eq("123")
701
+ end
702
+
703
+ it "stops at opening brace" do
704
+ content = "; ; {"
705
+ pos, rest = skip_semicolons.call(content)
706
+
707
+ expect(pos).to eq(3)
708
+ expect(rest).to eq(" {")
709
+ end
710
+
711
+ it "stops at closing brace" do
712
+ content = ";;}"
713
+ pos, rest = skip_semicolons.call(content)
714
+
715
+ expect(pos).to eq(2)
716
+ expect(rest).to eq("}")
717
+ end
718
+
719
+ it "stops at comma" do
720
+ content = "; , next"
721
+ pos, rest = skip_semicolons.call(content)
722
+
723
+ expect(pos).to eq(1)
724
+ expect(rest).to eq(" , next")
725
+ end
726
+
727
+ it "stops at operator" do
728
+ content = ";;++"
729
+ pos, rest = skip_semicolons.call(content)
730
+
731
+ expect(pos).to eq(2)
732
+ expect(rest).to eq("++")
733
+ end
734
+ end
735
+
736
+ context "no semicolons present" do
737
+ it "does not advance when no semicolons" do
738
+ content = "code"
739
+ pos, rest = skip_semicolons.call(content)
740
+
741
+ expect(pos).to eq(0)
742
+ expect(rest).to eq("code")
743
+ end
744
+
745
+ it "does not advance with only whitespace" do
746
+ content = " \t\ncode"
747
+ pos, rest = skip_semicolons.call(content)
748
+
749
+ expect(pos).to eq(0)
750
+ expect(rest).to eq(" \t\ncode")
751
+ end
752
+
753
+ it "does not advance with only comments" do
754
+ content = "// comment\ncode"
755
+ pos, rest = skip_semicolons.call(content)
756
+
757
+ expect(pos).to eq(0)
758
+ expect(rest).to eq("// comment\ncode")
759
+ end
760
+
761
+ it "does not advance with only preprocessor" do
762
+ content = "#define FOO\ncode"
763
+ pos, rest = skip_semicolons.call(content)
764
+
765
+ expect(pos).to eq(0)
766
+ expect(rest).to eq("#define FOO\ncode")
767
+ end
768
+ end
769
+
770
+ context "edge cases" do
771
+ it "handles empty string" do
772
+ content = ""
773
+ pos, rest = skip_semicolons.call(content)
774
+
775
+ expect(pos).to eq(0)
776
+ expect(rest).to eq("")
777
+ end
778
+
779
+ it "handles only semicolons" do
780
+ content = ";;;;;"
781
+ pos, rest = skip_semicolons.call(content)
782
+
783
+ expect(pos).to eq(5)
784
+ expect(rest).to eq("")
785
+ end
786
+
787
+ it "handles only semicolons and whitespace" do
788
+ content = "; ; ; "
789
+ pos, rest = skip_semicolons.call(content)
790
+
791
+ expect(pos).to eq(6)
792
+ expect(rest).to eq("")
793
+ end
794
+
795
+ it "handles semicolons with unterminated comment" do
796
+ content = "; /* unterminated"
797
+ pos, rest = skip_semicolons.call(content)
798
+
799
+ expect(pos).to eq(17)
800
+ expect(rest).to eq("")
801
+ end
802
+
803
+ end
804
+
805
+ context "real-world C code patterns" do
806
+ it "skips null statements in for loop" do
807
+ content = ";;) {"
808
+ pos, rest = skip_semicolons.call(content)
809
+
810
+ expect(pos).to eq(2)
811
+ expect(rest).to eq(") {")
812
+ end
813
+
814
+ it "skips multiple null statements" do
815
+ content = ";;;\nreturn 0;"
816
+ pos, rest = skip_semicolons.call(content)
817
+
818
+ expect(pos).to eq(3)
819
+ expect(rest).to eq("\nreturn 0;")
820
+ end
821
+
822
+ it "handles semicolons from macro expansion pattern" do
823
+ content = "; // from MACRO_CALL()\n;code"
824
+ pos, rest = skip_semicolons.call(content)
825
+
826
+ expect(pos).to eq(24)
827
+ expect(rest).to eq("code")
828
+ end
829
+
830
+ it "skips null statements in switch case" do
831
+ content = ";case 2:"
832
+ pos, rest = skip_semicolons.call(content)
833
+
834
+ expect(pos).to eq(1)
835
+ expect(rest).to eq("case 2:")
836
+ end
837
+
838
+ it "skips multiple null statements between switch cases" do
839
+ content = ";;;\ncase 3:"
840
+ pos, rest = skip_semicolons.call(content)
841
+
842
+ expect(pos).to eq(3)
843
+ expect(rest).to eq("\ncase 3:")
844
+ end
845
+
846
+ it "skips null statements after break in switch" do
847
+ content = ";;default:"
848
+ pos, rest = skip_semicolons.call(content)
849
+
850
+ expect(pos).to eq(2)
851
+ expect(rest).to eq("default:")
852
+ end
853
+ end
854
+ end
855
+
856
+ ###
857
+ ### skip_deadspace()
858
+ ###
859
+ describe "#skip_deadspace" do
860
+ # Helper to access private method
861
+ let(:skip_deadspace) do
862
+ ->(content) do
863
+ scanner = StringScanner.new(content)
864
+ code_text = CExtractorCodeText.new()
865
+ bytes_skipped = code_text.skip_deadspace( scanner )
866
+ return [bytes_skipped, scanner.pos, scanner.rest]
867
+ end
868
+ end
869
+
870
+ context "whitespace handling" do
871
+ it "skips spaces" do
872
+ content = " code"
873
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
874
+
875
+ expect(bytes_skipped).to eq(5)
876
+ expect(pos).to eq(5)
877
+ expect(rest).to eq("code")
878
+ end
879
+
880
+ it "skips tabs" do
881
+ content = "\t\t\tcode"
882
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
883
+
884
+ expect(bytes_skipped).to eq(3)
885
+ expect(pos).to eq(3)
886
+ expect(rest).to eq("code")
887
+ end
888
+
889
+ it "skips newlines" do
890
+ content = "\n\n\ncode"
891
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
892
+
893
+ expect(bytes_skipped).to eq(3)
894
+ expect(pos).to eq(3)
895
+ expect(rest).to eq("code")
896
+ end
897
+
898
+ it "skips carriage returns" do
899
+ content = "\r\n\r\ncode"
900
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
901
+
902
+ expect(bytes_skipped).to eq(4)
903
+ expect(pos).to eq(4)
904
+ expect(rest).to eq("code")
905
+ end
906
+
907
+ it "skips mixed whitespace" do
908
+ content = " \t\n \r\n\t code"
909
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
910
+
911
+ expect(bytes_skipped).to eq(8)
912
+ expect(pos).to eq(8)
913
+ expect(rest).to eq("code")
914
+ end
915
+
916
+ it "returns 0 when no whitespace present" do
917
+ content = "code"
918
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
919
+
920
+ expect(bytes_skipped).to eq(0)
921
+ expect(pos).to eq(0)
922
+ expect(rest).to eq("code")
923
+ end
924
+ end
925
+
926
+ context "line comment handling" do
927
+ it "skips single line comment" do
928
+ content = "// comment\ncode"
929
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
930
+
931
+ expect(bytes_skipped).to eq(11)
932
+ expect(pos).to eq(11)
933
+ expect(rest).to eq("code")
934
+ end
935
+
936
+ it "skips line comment without trailing newline" do
937
+ content = "// comment at end"
938
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
939
+
940
+ expect(bytes_skipped).to eq(17)
941
+ expect(pos).to eq(17)
942
+ expect(rest).to eq("")
943
+ end
944
+
945
+ it "skips multiple consecutive line comments" do
946
+ content = "// comment 1\n// comment 2\n// comment 3\ncode"
947
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
948
+
949
+ expect(bytes_skipped).to eq(39)
950
+ expect(pos).to eq(39)
951
+ expect(rest).to eq("code")
952
+ end
953
+
954
+ it "skips line comment with whitespace before it" do
955
+ content = " // comment\ncode"
956
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
957
+
958
+ expect(bytes_skipped).to eq(14)
959
+ expect(pos).to eq(14)
960
+ expect(rest).to eq("code")
961
+ end
962
+
963
+ it "handles line comment with special characters" do
964
+ content = "// TODO: fix this!!!\ncode"
965
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
966
+
967
+ expect(bytes_skipped).to eq(21)
968
+ expect(pos).to eq(21)
969
+ expect(rest).to eq("code")
970
+ end
971
+ end
972
+
973
+ context "block comment handling" do
974
+ it "skips single-line block comment" do
975
+ content = "/* comment */code"
976
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
977
+
978
+ expect(bytes_skipped).to eq(13)
979
+ expect(pos).to eq(13)
980
+ expect(rest).to eq("code")
981
+ end
982
+
983
+ it "skips multi-line block comment" do
984
+ content = "/* comment\nline 2\nline 3 */code"
985
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
986
+
987
+ expect(bytes_skipped).to eq(27)
988
+ expect(pos).to eq(27)
989
+ expect(rest).to eq("code")
990
+ end
991
+
992
+ it "skips multiple consecutive block comments" do
993
+ content = "/* first *//* second *//* third */code"
994
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
995
+
996
+ expect(bytes_skipped).to eq(34)
997
+ expect(pos).to eq(34)
998
+ expect(rest).to eq("code")
999
+ end
1000
+
1001
+ it "skips block comment with whitespace before it" do
1002
+ content = " /* comment */code"
1003
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1004
+
1005
+ expect(bytes_skipped).to eq(16)
1006
+ expect(pos).to eq(16)
1007
+ expect(rest).to eq("code")
1008
+ end
1009
+
1010
+ it "handles block comment with asterisks inside" do
1011
+ content = "/* ** comment ** */code"
1012
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1013
+
1014
+ expect(bytes_skipped).to eq(19)
1015
+ expect(pos).to eq(19)
1016
+ expect(rest).to eq("code")
1017
+ end
1018
+
1019
+ it "handles block comment with forward slashes inside" do
1020
+ content = "/* comment // not a line comment */code"
1021
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1022
+
1023
+ expect(bytes_skipped).to eq(35)
1024
+ expect(pos).to eq(35)
1025
+ expect(rest).to eq("code")
1026
+ end
1027
+
1028
+ it "handles unterminated block comment" do
1029
+ content = "/* unterminated comment"
1030
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1031
+
1032
+ expect(bytes_skipped).to eq(23)
1033
+ expect(pos).to eq(23)
1034
+ expect(rest).to eq("")
1035
+ end
1036
+ end
1037
+
1038
+ context "mixed deadspace handling" do
1039
+ it "skips whitespace followed by comment" do
1040
+ content = " \t/* comment */code"
1041
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1042
+
1043
+ expect(bytes_skipped).to eq(16)
1044
+ expect(pos).to eq(16)
1045
+ expect(rest).to eq("code")
1046
+ end
1047
+
1048
+ it "skips comment followed by whitespace" do
1049
+ content = "/* comment */ \ncode"
1050
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1051
+
1052
+ expect(bytes_skipped).to eq(16)
1053
+ expect(pos).to eq(16)
1054
+ expect(rest).to eq("code")
1055
+ end
1056
+
1057
+ it "skips line comment followed by block comment" do
1058
+ content = "// line\n/* block */code"
1059
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1060
+
1061
+ expect(bytes_skipped).to eq(19)
1062
+ expect(pos).to eq(19)
1063
+ expect(rest).to eq("code")
1064
+ end
1065
+
1066
+ end
1067
+
1068
+ context "edge cases" do
1069
+ it "handles empty string" do
1070
+ content = ""
1071
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1072
+
1073
+ expect(bytes_skipped).to eq(0)
1074
+ expect(pos).to eq(0)
1075
+ expect(rest).to eq("")
1076
+ end
1077
+
1078
+ it "handles string with only whitespace" do
1079
+ content = " \t\n "
1080
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1081
+
1082
+ expect(bytes_skipped).to eq(7)
1083
+ expect(pos).to eq(7)
1084
+ expect(rest).to eq("")
1085
+ end
1086
+
1087
+ it "handles string with only comments" do
1088
+ content = "// comment\n/* block */"
1089
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1090
+
1091
+ expect(bytes_skipped).to eq(22)
1092
+ expect(pos).to eq(22)
1093
+ expect(rest).to eq("")
1094
+ end
1095
+
1096
+ it "does not skip code that looks like comment but isn't" do
1097
+ content = "int a = 5 / 2; // actual comment\ncode"
1098
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1099
+
1100
+ expect(bytes_skipped).to eq(0)
1101
+ expect(pos).to eq(0)
1102
+ expect(rest).to start_with("int a")
1103
+ end
1104
+
1105
+ it "handles nested block comments (not standard C)" do
1106
+ # NOTE: C extraction is not implemented as a full C parser and/or preprocessor
1107
+ # We assume that the file to be processed is either relatively simple or has already been preprocessed
1108
+ # to remove complex preprocessor directives, etc.
1109
+
1110
+ content = "/* outer /* inner */ still outer */code"
1111
+ bytes_skipped, pos, rest = skip_deadspace.call(content)
1112
+
1113
+ # We expect only partial comment block handling for nested blocks
1114
+ expect(bytes_skipped).to eq(21)
1115
+ expect(pos).to eq(21)
1116
+ expect(rest).to eq("still outer */code")
1117
+ end
1118
+ end
1119
+
1120
+ context "real-world C code patterns" do
1121
+ it "handles Doxygen-style comments" do
1122
+ content = <<~CODE
1123
+ /**
1124
+ * @brief Function description
1125
+ * @param x The parameter
1126
+ * @return The result
1127
+ */
1128
+ int func(int x) {
1129
+ CODE
1130
+
1131
+ _, _, rest = skip_deadspace.call(content)
1132
+
1133
+ expect(rest).to start_with("int func(int x)")
1134
+ end
1135
+
1136
+ end
1137
+ end
1138
+
1139
+ ###
1140
+ ### collect_balanced()
1141
+ ###
1142
+
1143
+ describe "#collect_balanced" do
1144
+ let(:collect_balanced) do
1145
+ ->(content, open_char, close_char) do
1146
+ scanner = StringScanner.new(content)
1147
+ code_text = CExtractorCodeText.new
1148
+ success, text = code_text.collect_balanced(scanner, open_char, close_char)
1149
+ [success, text, scanner.pos, scanner.rest]
1150
+ end
1151
+ end
1152
+
1153
+ context "failure cases" do
1154
+ it "returns [false, nil] when not positioned at open_char" do
1155
+ success, text, pos, _ = collect_balanced.call("x{content}", '{', '}')
1156
+ expect(success).to be false
1157
+ expect(text).to be_nil
1158
+ expect(pos).to eq(0) # scanner not advanced
1159
+ end
1160
+
1161
+ it "returns [false, nil] for empty input" do
1162
+ success, text, _, _ = collect_balanced.call("", '{', '}')
1163
+ expect(success).to be false
1164
+ expect(text).to be_nil
1165
+ end
1166
+
1167
+ it "returns [false, nil] for unbalanced input (no matching close)" do
1168
+ success, text, _, _ = collect_balanced.call("{content without close", '{', '}')
1169
+ expect(success).to be false
1170
+ expect(text).to be_nil
1171
+ end
1172
+ end
1173
+
1174
+ context "successful extraction" do
1175
+ it "extracts a simple brace pair and returns text including delimiters" do
1176
+ success, text, pos, rest = collect_balanced.call("{content}", '{', '}')
1177
+ expect(success).to be true
1178
+ expect(text).to eq("{content}")
1179
+ expect(pos).to eq(9)
1180
+ expect(rest).to eq("")
1181
+ end
1182
+
1183
+ it "extracts a simple paren pair" do
1184
+ success, text, pos, rest = collect_balanced.call("(args)", '(', ')')
1185
+ expect(success).to be true
1186
+ expect(text).to eq("(args)")
1187
+ expect(pos).to eq(6)
1188
+ end
1189
+
1190
+ it "extracts a simple bracket pair" do
1191
+ success, text, pos, rest = collect_balanced.call("[items]", '[', ']')
1192
+ expect(success).to be true
1193
+ expect(text).to eq("[items]")
1194
+ expect(pos).to eq(7)
1195
+ end
1196
+
1197
+ it "handles nested same-pair delimiters" do
1198
+ success, text, pos, rest = collect_balanced.call("{a {b} c}", '{', '}')
1199
+ expect(success).to be true
1200
+ expect(text).to eq("{a {b} c}")
1201
+ expect(pos).to eq(9)
1202
+ expect(rest).to eq("")
1203
+ end
1204
+
1205
+ it "stops at matching close and does not consume following code" do
1206
+ success, text, pos, rest = collect_balanced.call("{block} remaining", '{', '}')
1207
+ expect(success).to be true
1208
+ expect(text).to eq("{block}")
1209
+ expect(pos).to eq(7)
1210
+ expect(rest).to eq(" remaining")
1211
+ end
1212
+ end
1213
+
1214
+ context "string literals" do
1215
+ it "preserves string literals verbatim and does not treat close_char inside them as closer" do
1216
+ success, text, _, _ = collect_balanced.call('{"string with }"}', '{', '}')
1217
+ expect(success).to be true
1218
+ expect(text).to eq('{"string with }"}')
1219
+ end
1220
+
1221
+ it "preserves char literals verbatim" do
1222
+ success, text, _, _ = collect_balanced.call("{ char c = '}'; }", '{', '}')
1223
+ expect(success).to be true
1224
+ expect(text).to eq("{ char c = '}'; }")
1225
+ end
1226
+ end
1227
+
1228
+ context "comments replaced with a single space" do
1229
+ it "replaces a block comment containing close_char with a space — does not terminate early" do
1230
+ success, text, pos, _ = collect_balanced.call("{ /* } */ }", '{', '}')
1231
+ expect(success).to be true
1232
+ expect(text).to eq("{ }") # space + space (before/after comment) + space for comment
1233
+ expect(pos).to eq(11) # scanner advanced through full original content
1234
+ end
1235
+
1236
+ it "replaces a line comment containing close_char with a space — does not terminate early" do
1237
+ success, text, pos, _ = collect_balanced.call("{ // }\n}", '{', '}')
1238
+ expect(success).to be true
1239
+ expect(text).to eq("{ }") # space before comment + space for comment+newline
1240
+ expect(pos).to eq(8)
1241
+ end
1242
+
1243
+ it "replaces a block comment with exactly one space regardless of comment length" do
1244
+ success, text, _, _ = collect_balanced.call("{ /* long comment text */ code }", '{', '}')
1245
+ expect(success).to be true
1246
+ expect(text).to eq("{ code }") # space + comment→space + space before code
1247
+ end
1248
+
1249
+ it "replaces a line comment with exactly one space (consuming the newline too)" do
1250
+ success, text, _, _ = collect_balanced.call("{ code // comment\n more }", '{', '}')
1251
+ expect(success).to be true
1252
+ expect(text).to eq("{ code more }") # space before comment + comment→space + space before more
1253
+ end
1254
+ end
1255
+ end
1256
+
1257
+ ###
1258
+ ### extract_balanced_braces()
1259
+ ###
1260
+
1261
+ describe "#extract_balanced_braces" do
1262
+ # Helper to access private method
1263
+ let(:extract_braces) do
1264
+ ->(content) do
1265
+ scanner = StringScanner.new(content)
1266
+ code_text = CExtractorCodeText.new()
1267
+ success, block = code_text.extract_balanced_braces( scanner )
1268
+ return [success, block, scanner.pos, scanner.rest]
1269
+ end
1270
+ end
1271
+
1272
+ context "simple balanced braces" do
1273
+ it "extracts single-level braces" do
1274
+ content = "{ code }"
1275
+ success, block, pos, rest = extract_braces.call(content)
1276
+
1277
+ expect(success).to be true
1278
+ expect(block).to eq("{ code }")
1279
+ expect(pos).to eq(8)
1280
+ expect(rest).to eq("")
1281
+ end
1282
+
1283
+ it "extracts empty braces" do
1284
+ content = "{}"
1285
+ success, block, pos, rest = extract_braces.call(content)
1286
+
1287
+ expect(success).to be true
1288
+ expect(block).to eq("{}")
1289
+ expect(pos).to eq(2)
1290
+ expect(rest).to eq("")
1291
+ end
1292
+
1293
+ it "extracts braces with content after" do
1294
+ content = "{ code } more"
1295
+ success, block, pos, rest = extract_braces.call(content)
1296
+
1297
+ expect(success).to be true
1298
+ expect(block).to eq("{ code }")
1299
+ expect(pos).to eq(8)
1300
+ expect(rest).to eq(" more")
1301
+ end
1302
+
1303
+ it "extracts braces with whitespace" do
1304
+ content = "{ \n\t }"
1305
+ success, block, pos, rest = extract_braces.call(content)
1306
+
1307
+ expect(success).to be true
1308
+ expect(block).to eq("{ \n\t }")
1309
+ expect(pos).to eq(9)
1310
+ expect(rest).to eq("")
1311
+ end
1312
+ end
1313
+
1314
+ context "nested braces" do
1315
+ it "extracts one level of nesting" do
1316
+ content = "{ outer { inner } }"
1317
+ success, block, pos, rest = extract_braces.call(content)
1318
+
1319
+ expect(success).to be true
1320
+ expect(block).to eq("{ outer { inner } }")
1321
+ expect(pos).to eq(19)
1322
+ expect(rest).to eq("")
1323
+ end
1324
+
1325
+ it "extracts two levels of nesting" do
1326
+ content = "{ a { b { c } } }"
1327
+ success, block, pos, rest = extract_braces.call(content)
1328
+
1329
+ expect(success).to be true
1330
+ expect(block).to eq("{ a { b { c } } }")
1331
+ expect(pos).to eq(17)
1332
+ expect(rest).to eq("")
1333
+ end
1334
+
1335
+ it "extracts multiple nested blocks at same level" do
1336
+ content = "{ { a } { b } { c } }"
1337
+ success, block, pos, rest = extract_braces.call(content)
1338
+
1339
+ expect(success).to be true
1340
+ expect(block).to eq("{ { a } { b } { c } }")
1341
+ expect(pos).to eq(21)
1342
+ expect(rest).to eq("")
1343
+ end
1344
+
1345
+ it "extracts deeply nested braces" do
1346
+ content = "{ { { { { deep } } } } }"
1347
+ success, block, pos, rest = extract_braces.call(content)
1348
+
1349
+ expect(success).to be true
1350
+ expect(block).to eq("{ { { { { deep } } } } }")
1351
+ expect(pos).to eq(24)
1352
+ expect(rest).to eq("")
1353
+ end
1354
+ end
1355
+
1356
+ context "braces in strings" do
1357
+ it "ignores braces in double-quoted strings" do
1358
+ content = '{ "string with brace }" }'
1359
+ success, block, pos, rest = extract_braces.call(content)
1360
+
1361
+ expect(success).to be true
1362
+ expect(block).to eq('{ "string with brace }" }')
1363
+ expect(pos).to eq(25)
1364
+ expect(rest).to eq("")
1365
+ end
1366
+
1367
+ it "ignores braces in single-quoted strings" do
1368
+ content = "{ 'char {' }"
1369
+ success, block, pos, rest = extract_braces.call(content)
1370
+
1371
+ expect(success).to be true
1372
+ expect(block).to eq("{ 'char {' }")
1373
+ expect(pos).to eq(12)
1374
+ expect(rest).to eq("")
1375
+ end
1376
+
1377
+ it "handles escaped quotes in strings with braces" do
1378
+ content = '{ "string with \\" and { brace" }'
1379
+ success, block, pos, rest = extract_braces.call(content)
1380
+
1381
+ expect(success).to be true
1382
+ expect(block).to eq('{ "string with \\" and { brace" }')
1383
+ expect(pos).to eq(32)
1384
+ expect(rest).to eq("")
1385
+ end
1386
+
1387
+ it "handles multiple strings with braces" do
1388
+ content = '{ "first { }" "second } " }'
1389
+ success, block, pos, rest = extract_braces.call(content)
1390
+
1391
+ expect(success).to be true
1392
+ expect(block).to eq('{ "first { }" "second } " }')
1393
+ expect(pos).to eq(27)
1394
+ expect(rest).to eq("")
1395
+ end
1396
+
1397
+ it "handles empty strings" do
1398
+ content = '{ "" }'
1399
+ success, block, pos, rest = extract_braces.call(content)
1400
+
1401
+ expect(success).to be true
1402
+ expect(block).to eq('{ "" }')
1403
+ expect(pos).to eq(6)
1404
+ expect(rest).to eq("")
1405
+ end
1406
+ end
1407
+
1408
+ context "braces in comments" do
1409
+ it "ignores braces in line comments (comment replaced with space)" do
1410
+ content = "{ code // comment with { brace\n}"
1411
+ success, block, pos, rest = extract_braces.call(content)
1412
+
1413
+ expect(success).to be true
1414
+ expect(block).to eq("{ code }") # comment+newline → single space
1415
+ expect(pos).to eq(32) # scanner.pos spans full original content
1416
+ expect(rest).to eq("")
1417
+ end
1418
+
1419
+ it "ignores braces in block comments (comment replaced with space)" do
1420
+ content = "{ code /* comment with { brace */ }"
1421
+ success, block, pos, rest = extract_braces.call(content)
1422
+
1423
+ expect(success).to be true
1424
+ expect(block).to eq("{ code }") # comment → single space; space before } preserved
1425
+ expect(pos).to eq(35)
1426
+ expect(rest).to eq("")
1427
+ end
1428
+
1429
+ it "handles multiple comments with braces (each comment replaced with space)" do
1430
+ content = "{ /* { */ code // }\n}"
1431
+ success, block, pos, rest = extract_braces.call(content)
1432
+
1433
+ expect(success).to be true
1434
+ expect(block).to eq("{ code }") # block comment → space; line comment+newline → space
1435
+ expect(pos).to eq(21)
1436
+ expect(rest).to eq("")
1437
+ end
1438
+
1439
+ it "handles nested block comments with braces (only innermost comment consumed)" do
1440
+ content = "{ /* outer { /* inner } */ */ }"
1441
+ success, block, pos, rest = extract_braces.call(content)
1442
+
1443
+ expect(success).to be true
1444
+ # First */ closes the comment; remaining */ */ is literal text
1445
+ expect(block).to eq("{ */ }")
1446
+ expect(pos).to eq(31)
1447
+ expect(rest).to eq("")
1448
+ end
1449
+ end
1450
+
1451
+ context "real C code patterns" do
1452
+ it "extracts simple function body" do
1453
+ content = "{ return 0; }"
1454
+ success, block, pos, rest = extract_braces.call(content)
1455
+
1456
+ expect(success).to be true
1457
+ expect(block).to eq("{ return 0; }")
1458
+ expect(pos).to eq(13)
1459
+ expect(rest).to eq("")
1460
+ end
1461
+
1462
+ it "extracts function body with nested blocks" do
1463
+ content = "{ if (x) { do_something(); } }"
1464
+ success, block, pos, rest = extract_braces.call(content)
1465
+
1466
+ expect(success).to be true
1467
+ expect(block).to eq("{ if (x) { do_something(); } }")
1468
+ expect(pos).to eq(30)
1469
+ expect(rest).to eq("")
1470
+ end
1471
+
1472
+ it "extracts function body with multiple statements" do
1473
+ content = <<~CODE.chomp
1474
+ {
1475
+ int x = 5;
1476
+ printf("value: %d", x);
1477
+ return x;
1478
+ }
1479
+ CODE
1480
+ success, block, pos, rest = extract_braces.call(content)
1481
+
1482
+ expect(success).to be true
1483
+ expect(block).to eq(content)
1484
+ expect(pos).to eq(content.length)
1485
+ expect(rest).to eq("")
1486
+ end
1487
+
1488
+ it "extracts struct initialization" do
1489
+ content = '{ .field1 = 10, .field2 = "test" }'
1490
+ success, block, pos, rest = extract_braces.call(content)
1491
+
1492
+ expect(success).to be true
1493
+ expect(block).to eq('{ .field1 = 10, .field2 = "test" }')
1494
+ expect(pos).to eq(34)
1495
+ expect(rest).to eq("")
1496
+ end
1497
+
1498
+ it "extracts array initialization" do
1499
+ content = "{ 1, 2, 3, 4, 5 }"
1500
+ success, block, pos, rest = extract_braces.call(content)
1501
+
1502
+ expect(success).to be true
1503
+ expect(block).to eq("{ 1, 2, 3, 4, 5 }")
1504
+ expect(pos).to eq(17)
1505
+ expect(rest).to eq("")
1506
+ end
1507
+
1508
+ it "extracts switch statement" do
1509
+ content = <<~CODE.chomp
1510
+ {
1511
+ switch (x) {
1512
+ case 1: { action1(); break; }
1513
+ case 2: { action2(); break; }
1514
+ default: { action_default(); }
1515
+ }
1516
+ }
1517
+ CODE
1518
+ success, block, pos, rest = extract_braces.call(content)
1519
+
1520
+ expect(success).to be true
1521
+ expect(block).to eq(content)
1522
+ expect(pos).to eq(content.length)
1523
+ expect(rest).to eq("")
1524
+ end
1525
+
1526
+ it "extracts do-while loop" do
1527
+ content = "{ do { process(); } while (condition); }"
1528
+ success, block, pos, rest = extract_braces.call(content)
1529
+
1530
+ expect(success).to be true
1531
+ expect(block).to eq("{ do { process(); } while (condition); }")
1532
+ expect(pos).to eq(40)
1533
+ expect(rest).to eq("")
1534
+ end
1535
+
1536
+ it "extracts nested if-else blocks" do
1537
+ content = <<~CODE.chomp
1538
+ {
1539
+ if (a) {
1540
+ if (b) { x(); }
1541
+ else { y(); }
1542
+ } else {
1543
+ z();
1544
+ }
1545
+ }
1546
+ CODE
1547
+ success, block, pos, rest = extract_braces.call(content)
1548
+
1549
+ expect(success).to be true
1550
+ expect(block).to eq(content)
1551
+ expect(pos).to eq(content.length)
1552
+ expect(rest).to eq("")
1553
+ end
1554
+ end
1555
+
1556
+ context "failure cases" do
1557
+ it "fails when not starting at opening brace" do
1558
+ content = "not a brace"
1559
+ success, block, pos, rest = extract_braces.call(content)
1560
+
1561
+ expect(success).to be false
1562
+ expect(block).to be_nil
1563
+ expect(pos).to eq(0) # Scanner not advanced on failure (peek, not getch)
1564
+ expect(rest).to eq("not a brace")
1565
+ end
1566
+
1567
+ it "fails on unbalanced braces (missing closing)" do
1568
+ content = "{ incomplete"
1569
+ success, block, pos, rest = extract_braces.call(content)
1570
+
1571
+ expect(success).to be false
1572
+ expect(block).to be_nil
1573
+ expect(pos).to eq(12) # At end of string
1574
+ expect(rest).to eq("")
1575
+ end
1576
+
1577
+ it "fails on unbalanced braces (extra closing)" do
1578
+ content = "{ code } }"
1579
+ success, block, pos, rest = extract_braces.call(content)
1580
+
1581
+ expect(success).to be true
1582
+ expect(block).to eq("{ code }")
1583
+ expect(pos).to eq(8)
1584
+ expect(rest).to eq(" }")
1585
+ end
1586
+
1587
+ it "fails on unbalanced nested braces" do
1588
+ content = "{ outer { inner }"
1589
+ success, block, pos, rest = extract_braces.call(content)
1590
+
1591
+ expect(success).to be false
1592
+ expect(block).to be_nil
1593
+ expect(pos).to eq(17)
1594
+ expect(rest).to eq("")
1595
+ end
1596
+
1597
+ it "fails on empty content" do
1598
+ content = ""
1599
+ success, block, pos, rest = extract_braces.call(content)
1600
+
1601
+ expect(success).to be false
1602
+ expect(block).to be_nil
1603
+ expect(pos).to eq(0)
1604
+ expect(rest).to eq("")
1605
+ end
1606
+
1607
+ it "fails when starting with closing brace" do
1608
+ content = "} wrong"
1609
+ success, block, pos, rest = extract_braces.call(content)
1610
+
1611
+ expect(success).to be false
1612
+ expect(block).to be_nil
1613
+ expect(pos).to eq(0) # Scanner not advanced on failure (peek, not getch)
1614
+ expect(rest).to eq("} wrong")
1615
+ end
1616
+ end
1617
+
1618
+ context "edge cases with strings and comments" do
1619
+ it "handles string with escaped backslash before quote" do
1620
+ content = '{ "path\\\\file" }'
1621
+ success, block, pos, rest = extract_braces.call(content)
1622
+
1623
+ expect(success).to be true
1624
+ expect(block).to eq('{ "path\\\\file" }')
1625
+ expect(pos).to eq(16)
1626
+ expect(rest).to eq("")
1627
+ end
1628
+
1629
+ it "handles string with escaped newline" do
1630
+ content = '{ "line1\\nline2" }'
1631
+ success, block, pos, rest = extract_braces.call(content)
1632
+
1633
+ expect(success).to be true
1634
+ expect(block).to eq('{ "line1\\nline2" }')
1635
+ expect(pos).to eq(18)
1636
+ expect(rest).to eq("")
1637
+ end
1638
+
1639
+ it "handles character literal with closing brace" do
1640
+ content = "{ char c = '}'; }"
1641
+ success, block, pos, rest = extract_braces.call(content)
1642
+
1643
+ expect(success).to be true
1644
+ expect(block).to eq("{ char c = '}'; }")
1645
+ expect(pos).to eq(17)
1646
+ expect(rest).to eq("")
1647
+ end
1648
+
1649
+ it "handles character literal with opening brace" do
1650
+ content = "{ char c = '{'; }"
1651
+ success, block, pos, rest = extract_braces.call(content)
1652
+
1653
+ expect(success).to be true
1654
+ expect(block).to eq("{ char c = '{'; }")
1655
+ expect(pos).to eq(17)
1656
+ expect(rest).to eq("")
1657
+ end
1658
+
1659
+ it "handles escaped single quote in character literal" do
1660
+ content = "{ char c = '\\''; }"
1661
+ success, block, pos, rest = extract_braces.call(content)
1662
+
1663
+ expect(success).to be true
1664
+ expect(block).to eq("{ char c = '\\''; }")
1665
+ expect(pos).to eq(18)
1666
+ expect(rest).to eq("")
1667
+ end
1668
+
1669
+ it "handles comment at end of line with brace (comment replaced with space)" do
1670
+ content = "{ code; // comment }\n}"
1671
+ success, block, pos, rest = extract_braces.call(content)
1672
+
1673
+ expect(success).to be true
1674
+ expect(block).to eq("{ code; }") # comment+newline → single space; } is the real closer
1675
+ expect(pos).to eq(22)
1676
+ expect(rest).to eq("")
1677
+ end
1678
+
1679
+ it "handles block comment spanning multiple lines with braces (comment replaced with space)" do
1680
+ content = <<~CODE.chomp
1681
+ {
1682
+ /* This is a comment
1683
+ with { braces } in it
1684
+ spanning lines */
1685
+ code;
1686
+ }
1687
+ CODE
1688
+ success, block, pos, rest = extract_braces.call(content)
1689
+
1690
+ expect(success).to be true
1691
+ expect(block).to eq("{\n \n code;\n}") # comment block → single space; newline+indent after preserved
1692
+ expect(pos).to eq(content.length)
1693
+ expect(rest).to eq("")
1694
+ end
1695
+
1696
+ it "handles unterminated string (malformed C)" do
1697
+ # NOTE: This tests behavior with malformed C code
1698
+ content = '{ "unterminated }'
1699
+ success, block, _, _ = extract_braces.call(content)
1700
+
1701
+ # The extractor should fail because the closing brace is inside an unterminated string
1702
+ expect(success).to be false
1703
+ expect(block).to be_nil
1704
+ end
1705
+
1706
+ it "handles unterminated comment (malformed C)" do
1707
+ # NOTE: This tests behavior with malformed C code
1708
+ content = "{ /* unterminated }"
1709
+ success, block, _, _ = extract_braces.call(content)
1710
+
1711
+ # The extractor should fail because the closing brace is inside an unterminated comment
1712
+ expect(success).to be false
1713
+ expect(block).to be_nil
1714
+ end
1715
+ end
1716
+
1717
+ context "complex real-world patterns" do
1718
+ it "extracts function with macro usage" do
1719
+ content = <<~CODE.chomp
1720
+ {
1721
+ MACRO_CALL(arg1, arg2);
1722
+ if (CHECK_FLAG(x)) {
1723
+ DO_SOMETHING();
1724
+ }
1725
+ }
1726
+ CODE
1727
+ success, block, pos, rest = extract_braces.call(content)
1728
+
1729
+ expect(success).to be true
1730
+ expect(block).to eq(content)
1731
+ expect(pos).to eq(content.length)
1732
+ expect(rest).to eq("")
1733
+ end
1734
+
1735
+ it "extracts function with string containing comment-like text" do
1736
+ content = '{ printf("/* not a comment */"); }'
1737
+ success, block, pos, rest = extract_braces.call(content)
1738
+
1739
+ expect(success).to be true
1740
+ expect(block).to eq('{ printf("/* not a comment */"); }')
1741
+ expect(pos).to eq(34)
1742
+ expect(rest).to eq("")
1743
+ end
1744
+
1745
+ it "extracts function with comment containing string-like text (comment replaced with space)" do
1746
+ content = '{ /* "not a string" */ code; }'
1747
+ success, block, pos, rest = extract_braces.call(content)
1748
+
1749
+ expect(success).to be true
1750
+ expect(block).to eq("{ code; }") # comment → space; surrounding spaces preserved
1751
+ expect(pos).to eq(30)
1752
+ expect(rest).to eq("")
1753
+ end
1754
+
1755
+ it "extracts nested struct and array initializers" do
1756
+ content = <<~CODE.chomp
1757
+ {
1758
+ struct data d = {
1759
+ .array = { 1, 2, 3 },
1760
+ .nested = { { 4, 5 }, { 6, 7 } }
1761
+ };
1762
+ }
1763
+ CODE
1764
+ success, block, pos, rest = extract_braces.call(content)
1765
+
1766
+ expect(success).to be true
1767
+ expect(block).to eq(content)
1768
+ expect(pos).to eq(content.length)
1769
+ expect(rest).to eq("")
1770
+ end
1771
+
1772
+ it "extracts function with ternary operator and braces" do
1773
+ content = "{ result = condition ? { .a = 1 } : { .b = 2 }; }"
1774
+ success, block, pos, rest = extract_braces.call(content)
1775
+
1776
+ expect(success).to be true
1777
+ expect(block).to eq("{ result = condition ? { .a = 1 } : { .b = 2 }; }")
1778
+ expect(pos).to eq(49)
1779
+ expect(rest).to eq("")
1780
+ end
1781
+
1782
+ it "extracts function with compound literal" do
1783
+ content = "{ func((struct point){ .x = 10, .y = 20 }); }"
1784
+ success, block, pos, rest = extract_braces.call(content)
1785
+
1786
+ expect(success).to be true
1787
+ expect(block).to eq("{ func((struct point){ .x = 10, .y = 20 }); }")
1788
+ expect(pos).to eq(45)
1789
+ expect(rest).to eq("")
1790
+ end
1791
+
1792
+ it "extracts function with designated initializers and nested braces" do
1793
+ content = <<~CODE.chomp
1794
+ {
1795
+ struct config cfg = {
1796
+ [0] = { .name = "first", .value = { 1, 2 } },
1797
+ [1] = { .name = "second", .value = { 3, 4 } }
1798
+ };
1799
+ }
1800
+ CODE
1801
+ success, block, pos, rest = extract_braces.call(content)
1802
+
1803
+ expect(success).to be true
1804
+ expect(block).to eq(content)
1805
+ expect(pos).to eq(content.length)
1806
+ expect(rest).to eq("")
1807
+ end
1808
+ end
1809
+
1810
+ context "scanner position management" do
1811
+ it "leaves scanner at correct position after successful extraction" do
1812
+ content = "{ first }{ second }{third}"
1813
+ scanner = StringScanner.new(content)
1814
+ code_text = CExtractorCodeText.new()
1815
+
1816
+ success1, block1 = code_text.extract_balanced_braces( scanner )
1817
+
1818
+ expect(success1).to be true
1819
+ expect(block1).to eq("{ first }")
1820
+
1821
+ success2, block2 = code_text.extract_balanced_braces( scanner )
1822
+
1823
+ expect(success2).to be true
1824
+ expect(block2).to eq("{ second }")
1825
+
1826
+ success3, block3 = code_text.extract_balanced_braces( scanner )
1827
+
1828
+ expect(success3).to be true
1829
+ expect(block3).to eq("{third}")
1830
+
1831
+ expect(scanner.eos?).to be true
1832
+ end
1833
+
1834
+ it "leaves scanner at correct position after failed extraction" do
1835
+ content = "not_brace { valid }"
1836
+ scanner = StringScanner.new(content)
1837
+ code_text = CExtractorCodeText.new()
1838
+
1839
+ success1, block1 = code_text.extract_balanced_braces( scanner )
1840
+
1841
+ expect(success1).to be false
1842
+ expect(block1).to be_nil
1843
+ expect(scanner.pos).to eq(0) # Scanner not advanced on failure (peek, not getch)
1844
+
1845
+ # Skip to the valid brace
1846
+ scanner.scan(/[^{]*/)
1847
+ success2, block2 = code_text.extract_balanced_braces( scanner )
1848
+
1849
+ expect(success2).to be true
1850
+ expect(block2).to eq("{ valid }")
1851
+ end
1852
+
1853
+ it "handles scanner at end of string" do
1854
+ content = "{ code }"
1855
+ scanner = StringScanner.new(content)
1856
+ code_text = CExtractorCodeText.new()
1857
+
1858
+ # Extract the only block
1859
+ code_text.extract_balanced_braces( scanner )
1860
+
1861
+ # Try to extract again at end of string
1862
+ success, block = code_text.extract_balanced_braces( scanner )
1863
+
1864
+ expect(success).to be false
1865
+ expect(block).to be_nil
1866
+ expect(scanner.eos?).to be true
1867
+ end
1868
+ end
1869
+
1870
+ context "performance considerations" do
1871
+ it "handles very long brace blocks" do
1872
+ # Create a large but balanced brace block
1873
+ inner_content = "int x = 0;\n" * 100
1874
+ content = "{\n#{inner_content}}"
1875
+ success, block, pos, rest = extract_braces.call(content)
1876
+
1877
+ expect(success).to be true
1878
+ expect(block).to eq(content)
1879
+ expect(pos).to eq(content.length)
1880
+ expect(rest).to eq("")
1881
+ end
1882
+
1883
+ it "handles deeply nested braces" do
1884
+ # Create 50 levels of nesting
1885
+ opening = "{ " * 50
1886
+ closing = " }" * 50
1887
+ content = opening + "core" + closing
1888
+ success, block, pos, rest = extract_braces.call(content)
1889
+
1890
+ expect(success).to be true
1891
+ expect(block).to eq(content)
1892
+ expect(pos).to eq(content.length)
1893
+ expect(rest).to eq("")
1894
+ end
1895
+
1896
+ it "handles many sequential brace blocks" do
1897
+ # Create 100 sequential blocks
1898
+ blocks = (1..100).map { |i| "{ block#{i} }" }.join(" ")
1899
+ scanner = StringScanner.new(blocks)
1900
+ code_text = CExtractorCodeText.new()
1901
+
1902
+ count = 0
1903
+ while !scanner.eos?
1904
+ scanner.scan(/\s*/)
1905
+ break if scanner.eos?
1906
+ success, _ = code_text.extract_balanced_braces( scanner )
1907
+ break unless success
1908
+ count += 1
1909
+ end
1910
+
1911
+ expect(count).to eq(100)
1912
+ end
1913
+
1914
+ it "handles large strings within braces" do
1915
+ large_string = "x" * 1000
1916
+ content = "{ char* str = \"#{large_string}\"; }"
1917
+ success, block, pos, rest = extract_braces.call(content)
1918
+
1919
+ expect(success).to be true
1920
+ expect(block).to eq(content)
1921
+ expect(pos).to eq(content.length)
1922
+ expect(rest).to eq("")
1923
+ end
1924
+
1925
+ it "handles large comments within braces (comment replaced with space)" do
1926
+ large_comment = "comment text " * 100
1927
+ content = "{ /* #{large_comment} */ code; }"
1928
+ success, block, pos, rest = extract_braces.call(content)
1929
+
1930
+ expect(success).to be true
1931
+ expect(block).to eq("{ code; }") # entire comment → single space; spaces around preserved
1932
+ expect(pos).to eq(content.length)
1933
+ expect(rest).to eq("")
1934
+ end
1935
+ end
1936
+ end
1937
+
1938
+ ###
1939
+ ### skip_compiler_extension()
1940
+ ###
1941
+ describe "#skip_compiler_extension" do
1942
+ let(:skip_ext) do
1943
+ ->(content) do
1944
+ scanner = StringScanner.new(content)
1945
+ code_text = CExtractorCodeText.new
1946
+ result = code_text.skip_compiler_extension(scanner)
1947
+ [result, scanner.pos, scanner.rest]
1948
+ end
1949
+ end
1950
+
1951
+ it "returns false and does not advance on plain identifier" do
1952
+ result, pos, rest = skip_ext.call("int foo")
1953
+ expect(result).to be false
1954
+ expect(rest).to eq("int foo")
1955
+ end
1956
+
1957
+ it "returns false and does not advance on empty input" do
1958
+ result, pos, rest = skip_ext.call("")
1959
+ expect(result).to be false
1960
+ expect(pos).to eq(0)
1961
+ end
1962
+
1963
+ it "skips __cdecl calling convention" do
1964
+ result, _pos, rest = skip_ext.call("__cdecl foo")
1965
+ expect(result).to be true
1966
+ expect(rest).to eq(" foo")
1967
+ end
1968
+
1969
+ it "skips __stdcall calling convention" do
1970
+ result, _pos, rest = skip_ext.call("__stdcall foo")
1971
+ expect(result).to be true
1972
+ expect(rest).to eq(" foo")
1973
+ end
1974
+
1975
+ it "skips __fastcall calling convention" do
1976
+ result, _pos, rest = skip_ext.call("__fastcall foo")
1977
+ expect(result).to be true
1978
+ expect(rest).to eq(" foo")
1979
+ end
1980
+
1981
+ it "skips __declspec(dllexport)" do
1982
+ result, _pos, rest = skip_ext.call("__declspec(dllexport) void")
1983
+ expect(result).to be true
1984
+ expect(rest).to eq(" void")
1985
+ end
1986
+
1987
+ it "skips __declspec with nested parens" do
1988
+ result, _pos, rest = skip_ext.call("__declspec(align(8)) void")
1989
+ expect(result).to be true
1990
+ expect(rest).to eq(" void")
1991
+ end
1992
+
1993
+ it 'skips __declspec with nested parens and string argument' do
1994
+ result, _pos, rest = skip_ext.call('__declspec(deprecated("msg")) void')
1995
+ expect(result).to be true
1996
+ expect(rest).to eq(" void")
1997
+ end
1998
+
1999
+ it "skips __attribute__((interrupt))" do
2000
+ result, _pos, rest = skip_ext.call("__attribute__((interrupt)) void")
2001
+ expect(result).to be true
2002
+ expect(rest).to eq(" void")
2003
+ end
2004
+
2005
+ it "skips __attribute__ with deeply nested arguments" do
2006
+ result, _pos, rest = skip_ext.call("__attribute__((format(printf,1,2))) void")
2007
+ expect(result).to be true
2008
+ expect(rest).to eq(" void")
2009
+ end
2010
+
2011
+ it "returns false for __int64 (MSVC type — must not be skipped)" do
2012
+ result, _pos, rest = skip_ext.call("__int64 x")
2013
+ expect(result).to be false
2014
+ expect(rest).to eq("__int64 x")
2015
+ end
2016
+ end
2017
+
2018
+ ###
2019
+ ### strip_compiler_extensions()
2020
+ ###
2021
+ describe "#strip_compiler_extensions" do
2022
+ let(:strip_ext) do
2023
+ ->(text) { CExtractorCodeText.new.strip_compiler_extensions(text) }
2024
+ end
2025
+
2026
+ it "returns input unchanged when there are no extensions" do
2027
+ expect(strip_ext.call("int foo(void)")).to eq("int foo(void)")
2028
+ end
2029
+
2030
+ it "returns empty string for empty input" do
2031
+ expect(strip_ext.call("")).to eq("")
2032
+ end
2033
+
2034
+ it "strips __declspec(dllexport)" do
2035
+ expect(strip_ext.call("__declspec(dllexport) void foo(void)")).to eq("void foo(void)")
2036
+ end
2037
+
2038
+ it "strips __declspec with nested parens" do
2039
+ expect(strip_ext.call("__declspec(align(8)) int foo(void)")).to eq("int foo(void)")
2040
+ end
2041
+
2042
+ it "strips __attribute__((interrupt)) in mid-signature position" do
2043
+ expect(strip_ext.call("void __attribute__((interrupt)) ISR(void)")).to eq("void ISR(void)")
2044
+ end
2045
+
2046
+ it "strips __attribute__ with deeply nested arguments" do
2047
+ expect(strip_ext.call("__attribute__((format(printf,1,2))) int foo(char *fmt, ...)")).to eq("int foo(char *fmt, ...)")
2048
+ end
2049
+
2050
+ it "strips __cdecl calling convention" do
2051
+ expect(strip_ext.call("int __cdecl foo(void)")).to eq("int foo(void)")
2052
+ end
2053
+
2054
+ it "strips __stdcall calling convention" do
2055
+ expect(strip_ext.call("int __stdcall foo(void)")).to eq("int foo(void)")
2056
+ end
2057
+
2058
+ it "strips __forceinline" do
2059
+ expect(strip_ext.call("__forceinline void foo(void)")).to eq("void foo(void)")
2060
+ end
2061
+
2062
+ it "strips __inline__" do
2063
+ expect(strip_ext.call("__inline__ void foo(void)")).to eq("void foo(void)")
2064
+ end
2065
+
2066
+ it "strips _Noreturn C11 specifier" do
2067
+ expect(strip_ext.call("_Noreturn void exit_prog(int code)")).to eq("void exit_prog(int code)")
2068
+ end
2069
+
2070
+ it "strips _Thread_local C11 specifier" do
2071
+ expect(strip_ext.call("_Thread_local int counter")).to eq("int counter")
2072
+ end
2073
+
2074
+ it "strips multiple extensions in one signature" do
2075
+ expect(strip_ext.call("__declspec(dllexport) __cdecl void foo(void)")).to eq("void foo(void)")
2076
+ end
2077
+
2078
+ it "preserves __int64 (MSVC type — must not be stripped)" do
2079
+ expect(strip_ext.call("__int64 foo(void)")).to eq("__int64 foo(void)")
2080
+ end
2081
+
2082
+ it "preserves __int32 (MSVC type — must not be stripped)" do
2083
+ expect(strip_ext.call("static __int32 foo(void)")).to eq("static __int32 foo(void)")
2084
+ end
2085
+
2086
+ it "normalizes whitespace left by stripping" do
2087
+ expect(strip_ext.call("void __cdecl foo(void)")).to eq("void foo(void)")
2088
+ end
2089
+ end
2090
+
2091
+ end