ceedling 0.9.0 → 1.0.1

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 (1282) hide show
  1. checksums.yaml +7 -0
  2. data/GIT_COMMIT_SHA +1 -0
  3. data/Gemfile +23 -2
  4. data/Gemfile.lock +50 -0
  5. data/README.md +728 -42
  6. data/Rakefile +21 -75
  7. data/assets/ceedling +9 -0
  8. data/assets/ceedling.cmd +1 -0
  9. data/assets/default_gitignore +7 -0
  10. data/assets/example_file.c +16 -0
  11. data/assets/example_file.h +15 -0
  12. data/assets/example_file_call.c +13 -0
  13. data/assets/example_file_call.h +13 -0
  14. data/assets/project.yml +402 -0
  15. data/assets/test_example_file.c +20 -0
  16. data/assets/test_example_file_boom.c +20 -0
  17. data/assets/test_example_file_crash.c +25 -0
  18. data/assets/test_example_file_success.c +21 -0
  19. data/assets/test_example_file_unity_printf.c +19 -0
  20. data/assets/test_example_file_verbose.c +19 -0
  21. data/assets/test_example_file_with_mock.c +20 -0
  22. data/assets/test_example_with_parameterized_tests.c +28 -0
  23. data/assets/tests_with_defines/src/adc_hardware.c +18 -0
  24. data/assets/tests_with_defines/src/adc_hardware.h +13 -0
  25. data/assets/tests_with_defines/src/adc_hardware_configurator.c +18 -0
  26. data/assets/tests_with_defines/src/adc_hardware_configurator.h +17 -0
  27. data/assets/tests_with_defines/test/test_adc_hardware.c +28 -0
  28. data/assets/tests_with_defines/test/test_adc_hardware_special.c +28 -0
  29. data/assets/tests_with_preprocessing/src/adc_hardwareA.c +17 -0
  30. data/assets/tests_with_preprocessing/src/adc_hardwareA.h +13 -0
  31. data/assets/tests_with_preprocessing/src/adc_hardwareB.c +14 -0
  32. data/assets/tests_with_preprocessing/src/adc_hardwareB.h +13 -0
  33. data/assets/tests_with_preprocessing/src/adc_hardwareC.c +14 -0
  34. data/assets/tests_with_preprocessing/src/adc_hardwareC.h +13 -0
  35. data/assets/tests_with_preprocessing/src/adc_hardware_configuratorA.h +13 -0
  36. data/assets/tests_with_preprocessing/src/adc_hardware_configuratorB.h +15 -0
  37. data/assets/tests_with_preprocessing/src/adc_hardware_configuratorC.h +15 -0
  38. data/assets/tests_with_preprocessing/test/test_adc_hardwareA.c +41 -0
  39. data/assets/tests_with_preprocessing/test/test_adc_hardwareB.c +25 -0
  40. data/assets/tests_with_preprocessing/test/test_adc_hardwareC.c +29 -0
  41. data/assets/uncovered_example_file.c +12 -0
  42. data/bin/actions_wrapper.rb +50 -0
  43. data/bin/app_cfg.rb +134 -0
  44. data/bin/ceedling +146 -57
  45. data/bin/cli.rb +542 -0
  46. data/bin/cli_handler.rb +480 -0
  47. data/bin/cli_helper.rb +512 -0
  48. data/bin/configinator.rb +111 -0
  49. data/bin/mixinator.rb +136 -0
  50. data/bin/mixins.rb +12 -0
  51. data/bin/objects.yml +80 -0
  52. data/bin/path_validator.rb +54 -0
  53. data/bin/projectinator.rb +244 -0
  54. data/bin/versionator.rb +81 -0
  55. data/ceedling.gemspec +54 -14
  56. data/config/test_environment.rb +14 -0
  57. data/docs/BreakingChanges.md +260 -0
  58. data/docs/CODE_OF_CONDUCT.md +138 -0
  59. data/docs/CONTRIBUTING.md +240 -0
  60. data/docs/Ceedling Basic Porting.pdf +0 -0
  61. data/docs/Ceedling Managing Release Code.pdf +0 -0
  62. data/docs/Ceedling Working with IDEs.pdf +0 -0
  63. data/docs/CeedlingPacket.md +5651 -0
  64. data/docs/CeedlingPullRequestChecklist.md +24 -0
  65. data/docs/CeedlingUpgrade.md +83 -0
  66. data/docs/Changelog.md +493 -0
  67. data/docs/PluginDevelopmentGuide.md +764 -0
  68. data/docs/ReleaseNotes.md +353 -0
  69. data/docs/SECURITY.md +41 -0
  70. data/docs/ThrowTheSwitchCodingStandard.md +207 -0
  71. data/examples/temp_sensor/README.md +18 -0
  72. data/examples/temp_sensor/mixin/add_gcov.yml +51 -0
  73. data/examples/temp_sensor/mixin/add_unity_helper.yml +26 -0
  74. data/examples/temp_sensor/project.yml +355 -70
  75. data/examples/temp_sensor/src/AdcConductor.c +49 -42
  76. data/examples/temp_sensor/src/AdcConductor.h +20 -11
  77. data/examples/temp_sensor/src/AdcHardware.c +34 -27
  78. data/examples/temp_sensor/src/AdcHardware.h +18 -11
  79. data/examples/temp_sensor/src/AdcHardwareConfigurator.c +25 -18
  80. data/examples/temp_sensor/src/AdcHardwareConfigurator.h +17 -10
  81. data/examples/temp_sensor/src/AdcModel.c +40 -33
  82. data/examples/temp_sensor/src/AdcModel.h +20 -13
  83. data/examples/temp_sensor/src/AdcTemperatureSensor.c +58 -51
  84. data/examples/temp_sensor/src/AdcTemperatureSensor.h +17 -10
  85. data/examples/temp_sensor/src/Executor.c +32 -25
  86. data/examples/temp_sensor/src/Executor.h +16 -9
  87. data/examples/temp_sensor/src/IntrinsicsWrapper.c +25 -18
  88. data/examples/temp_sensor/src/IntrinsicsWrapper.h +14 -7
  89. data/examples/temp_sensor/src/Main.c +53 -46
  90. data/examples/temp_sensor/src/Main.h +14 -7
  91. data/examples/temp_sensor/src/Model.c +17 -10
  92. data/examples/temp_sensor/src/Model.h +15 -8
  93. data/examples/temp_sensor/src/ModelConfig.h +14 -7
  94. data/examples/temp_sensor/src/TaskScheduler.c +79 -72
  95. data/examples/temp_sensor/src/TaskScheduler.h +18 -11
  96. data/examples/temp_sensor/src/TemperatureCalculator.c +38 -27
  97. data/examples/temp_sensor/src/TemperatureCalculator.h +15 -6
  98. data/examples/temp_sensor/src/TemperatureFilter.c +45 -39
  99. data/examples/temp_sensor/src/TemperatureFilter.h +17 -10
  100. data/examples/temp_sensor/src/TimerConductor.c +22 -15
  101. data/examples/temp_sensor/src/TimerConductor.h +16 -9
  102. data/examples/temp_sensor/src/TimerConfigurator.c +58 -51
  103. data/examples/temp_sensor/src/TimerConfigurator.h +22 -15
  104. data/examples/temp_sensor/src/TimerHardware.c +22 -15
  105. data/examples/temp_sensor/src/TimerHardware.h +15 -8
  106. data/examples/temp_sensor/src/TimerInterruptConfigurator.c +62 -55
  107. data/examples/temp_sensor/src/TimerInterruptConfigurator.h +20 -13
  108. data/examples/temp_sensor/src/TimerInterruptHandler.c +32 -25
  109. data/examples/temp_sensor/src/TimerInterruptHandler.h +17 -10
  110. data/examples/temp_sensor/src/TimerModel.c +16 -9
  111. data/examples/temp_sensor/src/TimerModel.h +15 -8
  112. data/examples/temp_sensor/src/Types.h +97 -103
  113. data/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.c +25 -18
  114. data/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.h +15 -6
  115. data/examples/temp_sensor/src/UsartConductor.c +28 -21
  116. data/examples/temp_sensor/src/UsartConductor.h +14 -7
  117. data/examples/temp_sensor/src/UsartConfigurator.c +46 -39
  118. data/examples/temp_sensor/src/UsartConfigurator.h +20 -13
  119. data/examples/temp_sensor/src/UsartHardware.c +29 -34
  120. data/examples/temp_sensor/src/UsartHardware.h +16 -10
  121. data/examples/temp_sensor/src/UsartModel.c +41 -34
  122. data/examples/temp_sensor/src/UsartModel.h +17 -10
  123. data/examples/temp_sensor/src/UsartPutChar.c +23 -16
  124. data/examples/temp_sensor/src/UsartPutChar.h +15 -8
  125. data/examples/temp_sensor/src/UsartTransmitBufferStatus.c +14 -7
  126. data/examples/temp_sensor/src/UsartTransmitBufferStatus.h +15 -8
  127. data/examples/temp_sensor/test/TestExecutor.c +43 -0
  128. data/examples/temp_sensor/test/TestMain.c +31 -0
  129. data/examples/temp_sensor/test/TestModel.c +27 -0
  130. data/examples/temp_sensor/test/TestTaskScheduler.c +111 -0
  131. data/examples/temp_sensor/test/TestTemperatureCalculator.c +43 -0
  132. data/examples/temp_sensor/test/TestTemperatureFilter.c +86 -0
  133. data/examples/temp_sensor/test/TestTimerConductor.c +39 -0
  134. data/examples/temp_sensor/test/TestTimerHardware.c +33 -0
  135. data/examples/temp_sensor/test/TestTimerIntegrated.c +53 -0
  136. data/examples/temp_sensor/test/TestTimerModel.c +25 -0
  137. data/examples/temp_sensor/test/TestUsartBaudRateRegisterCalculator.c +28 -0
  138. data/examples/temp_sensor/test/TestUsartConductor.c +47 -0
  139. data/examples/temp_sensor/test/TestUsartHardware.c +43 -0
  140. data/examples/temp_sensor/test/TestUsartIntegrated.c +63 -0
  141. data/examples/temp_sensor/test/TestUsartModel.c +47 -0
  142. data/examples/temp_sensor/test/adc/TestAdcConductor.c +128 -0
  143. data/examples/temp_sensor/test/adc/TestAdcHardware.c +51 -0
  144. data/examples/temp_sensor/test/adc/TestAdcModel.c +40 -0
  145. data/examples/temp_sensor/test/support/UnityHelper.c +19 -10
  146. data/examples/temp_sensor/test/support/UnityHelper.h +17 -12
  147. data/lib/ceedling/application.rb +26 -0
  148. data/lib/ceedling/backtrace.gdb +5 -0
  149. data/lib/ceedling/build_batchinator.rb +113 -0
  150. data/lib/ceedling/cacheinator.rb +53 -0
  151. data/lib/ceedling/cacheinator_helper.rb +41 -0
  152. data/lib/ceedling/config_matchinator.rb +192 -0
  153. data/lib/ceedling/config_walkinator.rb +35 -0
  154. data/lib/ceedling/configurator.rb +735 -0
  155. data/lib/ceedling/configurator_builder.rb +558 -0
  156. data/lib/ceedling/configurator_plugins.rb +165 -0
  157. data/lib/ceedling/configurator_setup.rb +799 -0
  158. data/lib/ceedling/configurator_validator.rb +203 -0
  159. data/lib/ceedling/constants.rb +160 -0
  160. data/lib/ceedling/defaults.rb +477 -0
  161. data/lib/ceedling/defineinator.rb +90 -0
  162. data/lib/ceedling/dependinator.rb +31 -0
  163. data/lib/ceedling/encodinator.rb +26 -0
  164. data/lib/ceedling/erb_wrapper.rb +16 -0
  165. data/lib/ceedling/exceptions.rb +47 -0
  166. data/lib/ceedling/file_finder.rb +183 -0
  167. data/lib/ceedling/file_finder_helper.rb +116 -0
  168. data/lib/ceedling/file_path_collection_utils.rb +137 -0
  169. data/lib/ceedling/file_path_utils.rb +190 -0
  170. data/lib/ceedling/file_system_wrapper.rb +16 -0
  171. data/lib/ceedling/file_wrapper.rb +122 -0
  172. data/lib/ceedling/flaginator.rb +65 -0
  173. data/lib/ceedling/generator.rb +365 -0
  174. data/lib/ceedling/generator_helper.rb +78 -0
  175. data/lib/ceedling/generator_mocks.rb +41 -0
  176. data/lib/ceedling/generator_test_results.rb +270 -0
  177. data/lib/ceedling/generator_test_results_backtrace.rb +215 -0
  178. data/lib/ceedling/generator_test_results_sanity_checker.rb +70 -0
  179. data/lib/ceedling/generator_test_runner.rb +84 -0
  180. data/lib/ceedling/include_pathinator.rb +83 -0
  181. data/lib/ceedling/loginator.rb +326 -0
  182. data/lib/ceedling/makefile.rb +52 -0
  183. data/lib/ceedling/objects.yml +352 -0
  184. data/lib/ceedling/parsing_parcels.rb +77 -0
  185. data/lib/ceedling/plugin.rb +30 -0
  186. data/lib/ceedling/plugin_manager.rb +133 -0
  187. data/lib/ceedling/plugin_manager_helper.rb +25 -0
  188. data/lib/ceedling/plugin_reportinator.rb +139 -0
  189. data/lib/ceedling/plugin_reportinator_helper.rb +84 -0
  190. data/lib/ceedling/preprocessinator.rb +239 -0
  191. data/lib/ceedling/preprocessinator_extractor.rb +257 -0
  192. data/lib/ceedling/preprocessinator_file_handler.rb +229 -0
  193. data/lib/ceedling/preprocessinator_includes_handler.rb +382 -0
  194. data/lib/ceedling/rake_utils.rb +23 -0
  195. data/lib/ceedling/rake_wrapper.rb +40 -0
  196. data/lib/ceedling/rakefile.rb +145 -0
  197. data/lib/ceedling/release_invoker.rb +68 -0
  198. data/lib/ceedling/release_invoker_helper.rb +12 -0
  199. data/lib/ceedling/reportinator.rb +124 -0
  200. data/lib/ceedling/rules_release.rake +107 -0
  201. data/lib/ceedling/rules_tests.rake +62 -0
  202. data/lib/ceedling/setupinator.rb +199 -0
  203. data/lib/ceedling/stream_wrapper.rb +51 -0
  204. data/lib/ceedling/system_utils.rb +43 -0
  205. data/lib/ceedling/system_wrapper.rb +150 -0
  206. data/lib/ceedling/task_invoker.rb +70 -0
  207. data/lib/ceedling/tasks_base.rake +39 -0
  208. data/lib/ceedling/tasks_filesystem.rake +99 -0
  209. data/lib/ceedling/tasks_release.rake +43 -0
  210. data/lib/ceedling/tasks_tests.rake +71 -0
  211. data/lib/ceedling/test_context_extractor.rb +379 -0
  212. data/lib/ceedling/test_invoker.rb +506 -0
  213. data/lib/ceedling/test_invoker_helper.rb +347 -0
  214. data/lib/ceedling/test_runner_manager.rb +47 -0
  215. data/lib/ceedling/tool_executor.rb +233 -0
  216. data/lib/ceedling/tool_executor_helper.rb +107 -0
  217. data/lib/ceedling/tool_validator.rb +149 -0
  218. data/lib/ceedling/verbosinator.rb +22 -0
  219. data/lib/ceedling/yaml_wrapper.rb +37 -0
  220. data/lib/ceedling.rb +12 -4
  221. data/lib/version.rb +24 -0
  222. data/license.txt +24 -0
  223. data/plugins/beep/README.md +133 -0
  224. data/plugins/beep/config/defaults.yml +12 -0
  225. data/plugins/beep/config/defaults_beep.rb +67 -0
  226. data/plugins/beep/lib/beep.rb +85 -0
  227. data/plugins/bullseye/README.md +81 -0
  228. data/plugins/bullseye/bullseye.rake +180 -0
  229. data/plugins/bullseye/config/defaults.yml +66 -0
  230. data/plugins/bullseye/lib/bullseye.rb +203 -0
  231. data/plugins/command_hooks/README.md +241 -0
  232. data/plugins/command_hooks/lib/command_hooks.rb +231 -0
  233. data/plugins/compile_commands_json_db/README.md +40 -0
  234. data/plugins/compile_commands_json_db/lib/compile_commands_json_db.rb +51 -0
  235. data/plugins/dependencies/README.md +321 -0
  236. data/plugins/dependencies/Rakefile +188 -0
  237. data/plugins/dependencies/config/defaults.yml +78 -0
  238. data/plugins/dependencies/dependencies.rake +157 -0
  239. data/plugins/dependencies/example/boss/project.yml +231 -0
  240. data/plugins/dependencies/example/boss/src/boss.c +80 -0
  241. data/plugins/dependencies/example/boss/src/boss.h +16 -0
  242. data/plugins/dependencies/example/boss/src/main.c +45 -0
  243. data/plugins/dependencies/example/boss/test/test_boss.c +118 -0
  244. data/plugins/dependencies/example/supervisor/project.yml +165 -0
  245. data/plugins/dependencies/example/supervisor/src/supervisor.c +45 -0
  246. data/plugins/dependencies/example/supervisor/src/supervisor.h +14 -0
  247. data/plugins/dependencies/example/supervisor/test/test_supervisor.c +58 -0
  248. data/plugins/dependencies/example/version.tar.gzip +0 -0
  249. data/plugins/dependencies/example/workerbees.zip +0 -0
  250. data/plugins/dependencies/lib/dependencies.rb +531 -0
  251. data/plugins/fff/README.md +242 -0
  252. data/plugins/fff/Rakefile +26 -0
  253. data/plugins/fff/config/fff.yml +13 -0
  254. data/plugins/fff/examples/fff_example/project.yml +145 -0
  255. data/plugins/fff/examples/fff_example/src/bar.c +8 -0
  256. data/plugins/fff/examples/fff_example/src/bar.h +21 -0
  257. data/plugins/fff/examples/fff_example/src/custom_types.h +13 -0
  258. data/plugins/fff/examples/fff_example/src/display.c +14 -0
  259. data/plugins/fff/examples/fff_example/src/display.h +23 -0
  260. data/plugins/fff/examples/fff_example/src/event_processor.c +100 -0
  261. data/plugins/fff/examples/fff_example/src/event_processor.h +18 -0
  262. data/plugins/fff/examples/fff_example/src/foo.c +23 -0
  263. data/plugins/fff/examples/fff_example/src/foo.h +15 -0
  264. data/plugins/fff/examples/fff_example/src/subfolder/zzz.c +8 -0
  265. data/plugins/fff/examples/fff_example/src/subfolder/zzz.h +13 -0
  266. data/plugins/fff/examples/fff_example/test/test_event_processor.c +160 -0
  267. data/plugins/fff/examples/fff_example/test/test_foo.c +54 -0
  268. data/plugins/fff/lib/fff.rb +90 -0
  269. data/plugins/fff/lib/fff_mock_generator.rb +172 -0
  270. data/plugins/fff/spec/fff_mock_header_generator_spec.rb +311 -0
  271. data/plugins/fff/spec/fff_mock_source_generator_spec.rb +156 -0
  272. data/plugins/fff/spec/header_generator.rb +58 -0
  273. data/plugins/fff/spec/spec_helper.rb +103 -0
  274. data/plugins/fff/src/fff_unity_helper.h +40 -0
  275. data/plugins/fff/vendor/fff/LICENSE +25 -0
  276. data/plugins/fff/vendor/fff/Makefile +10 -0
  277. data/plugins/fff/vendor/fff/README.md +454 -0
  278. data/plugins/fff/vendor/fff/buildandtest +15 -0
  279. data/plugins/fff/vendor/fff/examples/Makefile +7 -0
  280. data/plugins/fff/vendor/fff/examples/driver_testing/Makefile +64 -0
  281. data/plugins/fff/vendor/fff/examples/driver_testing/driver.c +32 -0
  282. data/plugins/fff/vendor/fff/examples/driver_testing/driver.h +21 -0
  283. data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.cpp +58 -0
  284. data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.fff.cpp +70 -0
  285. data/plugins/fff/vendor/fff/examples/driver_testing/hardware_abstraction.h +25 -0
  286. data/plugins/fff/vendor/fff/examples/driver_testing/registers.h +23 -0
  287. data/plugins/fff/vendor/fff/examples/embedded_ui/DISPLAY.h +27 -0
  288. data/plugins/fff/vendor/fff/examples/embedded_ui/Kata.txt +25 -0
  289. data/plugins/fff/vendor/fff/examples/embedded_ui/Makefile +67 -0
  290. data/plugins/fff/vendor/fff/examples/embedded_ui/SYSTEM.h +31 -0
  291. data/plugins/fff/vendor/fff/examples/embedded_ui/UI.c +56 -0
  292. data/plugins/fff/vendor/fff/examples/embedded_ui/UI.h +22 -0
  293. data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_ansic.c +191 -0
  294. data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_cpp.cpp +144 -0
  295. data/plugins/fff/vendor/fff/examples/embedded_ui/test_suite_template.c +42 -0
  296. data/plugins/fff/vendor/fff/fakegen.rb +428 -0
  297. data/plugins/fff/vendor/fff/fff.h +5122 -0
  298. data/plugins/fff/vendor/fff/gtest/Makefile +22 -0
  299. data/plugins/fff/vendor/fff/gtest/gtest-all.cc +9118 -0
  300. data/plugins/fff/vendor/fff/gtest/gtest-main.cc +6 -0
  301. data/plugins/fff/vendor/fff/gtest/gtest.h +19547 -0
  302. data/plugins/fff/vendor/fff/test/Makefile +81 -0
  303. data/plugins/fff/vendor/fff/test/c_test_framework.h +25 -0
  304. data/plugins/fff/vendor/fff/test/fff_test_c.c +116 -0
  305. data/plugins/fff/vendor/fff/test/fff_test_cpp.cpp +53 -0
  306. data/plugins/fff/vendor/fff/test/fff_test_global_c.c +84 -0
  307. data/plugins/fff/vendor/fff/test/fff_test_global_cpp.cpp +31 -0
  308. data/plugins/fff/vendor/fff/test/global_fakes.c +21 -0
  309. data/plugins/fff/vendor/fff/test/global_fakes.h +47 -0
  310. data/plugins/fff/vendor/fff/test/test_cases.include +276 -0
  311. data/plugins/gcov/README.md +893 -0
  312. data/plugins/gcov/config/defaults.yml +30 -0
  313. data/plugins/gcov/config/defaults_gcov.rb +109 -0
  314. data/plugins/gcov/gcov.rake +100 -0
  315. data/plugins/gcov/lib/gcov.rb +282 -0
  316. data/plugins/gcov/lib/gcov_constants.rb +63 -0
  317. data/plugins/gcov/lib/gcovr_reportinator.rb +425 -0
  318. data/plugins/gcov/lib/reportgenerator_reportinator.rb +220 -0
  319. data/plugins/gcov/lib/reportinator_helper.rb +30 -0
  320. data/plugins/module_generator/README.md +267 -0
  321. data/plugins/module_generator/Rakefile +232 -0
  322. data/plugins/module_generator/assets/stubby1.h +13 -0
  323. data/plugins/module_generator/assets/stubby2.h +15 -0
  324. data/plugins/module_generator/config/module_generator.yml +13 -0
  325. data/plugins/module_generator/example/project.yml +174 -0
  326. data/plugins/module_generator/lib/module_generator.rb +122 -0
  327. data/plugins/module_generator/module_generator.rake +69 -0
  328. data/plugins/report_build_warnings_log/README.md +40 -0
  329. data/plugins/report_build_warnings_log/config/defaults.yml +12 -0
  330. data/plugins/report_build_warnings_log/lib/report_build_warnings_log.rb +143 -0
  331. data/plugins/report_tests_gtestlike_stdout/README.md +96 -0
  332. data/plugins/report_tests_gtestlike_stdout/assets/template.erb +83 -0
  333. data/plugins/report_tests_gtestlike_stdout/config/report_tests_gtestlike_stdout.yml +11 -0
  334. data/plugins/report_tests_gtestlike_stdout/lib/report_tests_gtestlike_stdout.rb +69 -0
  335. data/plugins/report_tests_ide_stdout/README.md +62 -0
  336. data/plugins/report_tests_ide_stdout/config/report_tests_ide_stdout.yml +11 -0
  337. data/plugins/report_tests_ide_stdout/lib/report_tests_ide_stdout.rb +72 -0
  338. data/plugins/report_tests_log_factory/README.md +446 -0
  339. data/plugins/report_tests_log_factory/config/defaults.yml +11 -0
  340. data/plugins/report_tests_log_factory/lib/cppunit_tests_reporter.rb +100 -0
  341. data/plugins/report_tests_log_factory/lib/html_tests_reporter.rb +181 -0
  342. data/plugins/report_tests_log_factory/lib/json_tests_reporter.rb +72 -0
  343. data/plugins/report_tests_log_factory/lib/junit_tests_reporter.rb +197 -0
  344. data/plugins/report_tests_log_factory/lib/report_tests_log_factory.rb +135 -0
  345. data/plugins/report_tests_log_factory/lib/tests_reporter.rb +70 -0
  346. data/plugins/report_tests_log_factory/sample_html_report.png +0 -0
  347. data/plugins/report_tests_pretty_stdout/README.md +54 -0
  348. data/plugins/report_tests_pretty_stdout/assets/template.erb +63 -0
  349. data/plugins/report_tests_pretty_stdout/config/report_tests_pretty_stdout.yml +11 -0
  350. data/plugins/report_tests_pretty_stdout/lib/report_tests_pretty_stdout.rb +73 -0
  351. data/plugins/report_tests_raw_output_log/README.md +50 -0
  352. data/plugins/report_tests_raw_output_log/lib/report_tests_raw_output_log.rb +129 -0
  353. data/plugins/report_tests_teamcity_stdout/README.md +94 -0
  354. data/plugins/report_tests_teamcity_stdout/config/defaults.yml +12 -0
  355. data/plugins/report_tests_teamcity_stdout/config/report_tests_teamcity_stdout.yml +11 -0
  356. data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +163 -0
  357. data/spec/config_walkinator_spec.rb +62 -0
  358. data/spec/configurator_builder_spec.rb +16 -0
  359. data/spec/configurator_helper_spec.rb +12 -0
  360. data/spec/configurator_spec.rb +18 -0
  361. data/spec/file_finder_helper_spec.rb +73 -0
  362. data/spec/gcov/gcov_deployment_spec.rb +135 -0
  363. data/spec/gcov/gcov_test_cases_spec.rb +344 -0
  364. data/spec/generator_test_results_sanity_checker_spec.rb +104 -0
  365. data/spec/generator_test_results_spec.rb +131 -0
  366. data/spec/manual/stress_test.rb +31 -0
  367. data/spec/parsing_parcels_spec.rb +66 -0
  368. data/spec/preprocessinator_extractor_spec.rb +408 -0
  369. data/spec/preprocessinator_includes_handler_spec.rb +289 -0
  370. data/spec/reportinator_spec.rb +26 -0
  371. data/spec/spec_helper.rb +31 -0
  372. data/spec/spec_system_helper.rb +994 -0
  373. data/spec/support/other_target.yml +7 -0
  374. data/spec/support/target.yml +7 -0
  375. data/spec/support/test_example.fail +25 -0
  376. data/spec/support/test_example.pass +25 -0
  377. data/spec/support/test_example_empty.pass +15 -0
  378. data/spec/support/test_example_ignore.pass +25 -0
  379. data/spec/support/test_example_mangled.pass +22 -0
  380. data/spec/support/test_example_with_time.pass +25 -0
  381. data/spec/system/deployment_as_gem_spec.rb +76 -0
  382. data/spec/system/deployment_as_vendor_spec.rb +123 -0
  383. data/spec/system/example_temp_sensor_spec.rb +264 -0
  384. data/spec/system/upgrade_as_vendor_spec.rb +68 -0
  385. data/spec/system_utils_spec.rb +65 -0
  386. data/spec/test_context_extractor_spec.rb +328 -0
  387. data/spec/tool_executor_helper_spec.rb +219 -0
  388. data/spec/uncategorized_specs_spec.rb +15 -0
  389. data/vendor/c_exception/README.md +236 -0
  390. data/vendor/c_exception/docs/CException.md +289 -0
  391. data/vendor/c_exception/docs/CODE_OF_CONDUCT.md +138 -0
  392. data/vendor/c_exception/docs/CONTRIBUTING.md +238 -0
  393. data/vendor/c_exception/docs/ThrowTheSwitchCodingStandard.md +207 -0
  394. data/vendor/c_exception/lib/CException.c +59 -0
  395. data/vendor/c_exception/lib/CException.h +122 -0
  396. data/vendor/c_exception/lib/meson.build +11 -0
  397. data/vendor/c_exception/license.txt +22 -0
  398. data/vendor/c_exception/meson.build +14 -0
  399. data/vendor/c_exception/project.yml +263 -0
  400. data/vendor/c_exception/test/TestException.c +398 -0
  401. data/vendor/c_exception/test/support/CExceptionConfig.h +53 -0
  402. data/vendor/cmock/Gemfile +1 -0
  403. data/vendor/cmock/LICENSE.txt +21 -0
  404. data/vendor/cmock/README.md +55 -0
  405. data/vendor/cmock/cmock.gemspec +34 -0
  406. data/vendor/cmock/config/production_environment.rb +13 -0
  407. data/vendor/cmock/config/test_environment.rb +17 -0
  408. data/vendor/cmock/docs/CMockChangeLog.md +166 -0
  409. data/vendor/cmock/docs/CMockKnownIssues.md +13 -0
  410. data/vendor/cmock/docs/CMock_ArgumentValidation.md +274 -0
  411. data/vendor/cmock/docs/CMock_Summary.md +866 -0
  412. data/vendor/cmock/docs/CODE_OF_CONDUCT.md +138 -0
  413. data/vendor/cmock/docs/CONTRIBUTING.md +238 -0
  414. data/vendor/cmock/docs/ThrowTheSwitchCodingStandard.md +207 -0
  415. data/vendor/cmock/examples/make_example/Makefile +30 -0
  416. data/vendor/cmock/examples/make_example/src/foo.c +12 -0
  417. data/vendor/cmock/examples/make_example/src/foo.h +12 -0
  418. data/vendor/cmock/examples/make_example/src/main.c +22 -0
  419. data/vendor/cmock/examples/make_example/test/test_foo.c +24 -0
  420. data/vendor/cmock/examples/make_example/test/test_main.c +22 -0
  421. data/vendor/cmock/examples/temp_sensor/rakefile.rb +49 -0
  422. data/vendor/cmock/examples/temp_sensor/rakefile_helper.rb +280 -0
  423. data/vendor/cmock/examples/temp_sensor/src/AT91SAM7X256.h +2564 -0
  424. data/vendor/cmock/examples/temp_sensor/src/AdcConductor.c +49 -0
  425. data/vendor/cmock/examples/temp_sensor/src/AdcConductor.h +18 -0
  426. data/vendor/cmock/examples/temp_sensor/src/AdcHardware.c +34 -0
  427. data/vendor/cmock/examples/temp_sensor/src/AdcHardware.h +16 -0
  428. data/vendor/cmock/examples/temp_sensor/src/AdcHardwareConfigurator.c +25 -0
  429. data/vendor/cmock/examples/temp_sensor/src/AdcHardwareConfigurator.h +17 -0
  430. data/vendor/cmock/examples/temp_sensor/src/AdcModel.c +40 -0
  431. data/vendor/cmock/examples/temp_sensor/src/AdcModel.h +20 -0
  432. data/vendor/cmock/examples/temp_sensor/src/AdcTemperatureSensor.c +58 -0
  433. data/vendor/cmock/examples/temp_sensor/src/AdcTemperatureSensor.h +17 -0
  434. data/vendor/cmock/examples/temp_sensor/src/Executor.c +32 -0
  435. data/vendor/cmock/examples/temp_sensor/src/Executor.h +16 -0
  436. data/vendor/cmock/examples/temp_sensor/src/IntrinsicsWrapper.c +25 -0
  437. data/vendor/cmock/examples/temp_sensor/src/IntrinsicsWrapper.h +14 -0
  438. data/vendor/cmock/examples/temp_sensor/src/Main.c +53 -0
  439. data/vendor/cmock/examples/temp_sensor/src/Main.h +14 -0
  440. data/vendor/cmock/examples/temp_sensor/src/Model.c +17 -0
  441. data/vendor/cmock/examples/temp_sensor/src/Model.h +15 -0
  442. data/vendor/cmock/examples/temp_sensor/src/ModelConfig.h +14 -0
  443. data/vendor/cmock/examples/temp_sensor/src/TaskScheduler.c +79 -0
  444. data/vendor/cmock/examples/temp_sensor/src/TaskScheduler.h +18 -0
  445. data/vendor/cmock/examples/temp_sensor/src/TemperatureCalculator.c +34 -0
  446. data/vendor/cmock/examples/temp_sensor/src/TemperatureCalculator.h +13 -0
  447. data/vendor/cmock/examples/temp_sensor/src/TemperatureFilter.c +49 -0
  448. data/vendor/cmock/examples/temp_sensor/src/TemperatureFilter.h +17 -0
  449. data/vendor/cmock/examples/temp_sensor/src/TimerConductor.c +22 -0
  450. data/vendor/cmock/examples/temp_sensor/src/TimerConductor.h +16 -0
  451. data/vendor/cmock/examples/temp_sensor/src/TimerConfigurator.c +58 -0
  452. data/vendor/cmock/examples/temp_sensor/src/TimerConfigurator.h +22 -0
  453. data/vendor/cmock/examples/temp_sensor/src/TimerHardware.c +22 -0
  454. data/vendor/cmock/examples/temp_sensor/src/TimerHardware.h +15 -0
  455. data/vendor/cmock/examples/temp_sensor/src/TimerInterruptConfigurator.c +62 -0
  456. data/vendor/cmock/examples/temp_sensor/src/TimerInterruptConfigurator.h +20 -0
  457. data/vendor/cmock/examples/temp_sensor/src/TimerInterruptHandler.c +32 -0
  458. data/vendor/cmock/examples/temp_sensor/src/TimerInterruptHandler.h +17 -0
  459. data/vendor/cmock/examples/temp_sensor/src/TimerModel.c +16 -0
  460. data/vendor/cmock/examples/temp_sensor/src/TimerModel.h +15 -0
  461. data/vendor/cmock/examples/temp_sensor/src/Types.h +110 -0
  462. data/vendor/cmock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.c +25 -0
  463. data/vendor/cmock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.h +13 -0
  464. data/vendor/cmock/examples/temp_sensor/src/UsartConductor.c +28 -0
  465. data/vendor/cmock/examples/temp_sensor/src/UsartConductor.h +14 -0
  466. data/vendor/cmock/examples/temp_sensor/src/UsartConfigurator.c +46 -0
  467. data/vendor/cmock/examples/temp_sensor/src/UsartConfigurator.h +20 -0
  468. data/vendor/cmock/examples/temp_sensor/src/UsartHardware.c +29 -0
  469. data/vendor/cmock/examples/temp_sensor/src/UsartHardware.h +16 -0
  470. data/vendor/cmock/examples/temp_sensor/src/UsartModel.c +41 -0
  471. data/vendor/cmock/examples/temp_sensor/src/UsartModel.h +17 -0
  472. data/vendor/cmock/examples/temp_sensor/src/UsartPutChar.c +23 -0
  473. data/vendor/cmock/examples/temp_sensor/src/UsartPutChar.h +15 -0
  474. data/vendor/cmock/examples/temp_sensor/src/UsartTransmitBufferStatus.c +14 -0
  475. data/vendor/cmock/examples/temp_sensor/src/UsartTransmitBufferStatus.h +15 -0
  476. data/vendor/cmock/examples/temp_sensor/targets/gcc.yml +97 -0
  477. data/vendor/cmock/examples/temp_sensor/targets/iar_v4.yml +143 -0
  478. data/vendor/cmock/examples/temp_sensor/targets/iar_v5.yml +132 -0
  479. data/vendor/cmock/examples/temp_sensor/test/TestAdcConductor.c +128 -0
  480. data/vendor/cmock/examples/temp_sensor/test/TestAdcHardware.c +51 -0
  481. data/vendor/cmock/examples/temp_sensor/test/TestAdcHardwareConfigurator.c +50 -0
  482. data/vendor/cmock/examples/temp_sensor/test/TestAdcModel.c +40 -0
  483. data/vendor/cmock/examples/temp_sensor/test/TestAdcTemperatureSensor.c +54 -0
  484. data/vendor/cmock/examples/temp_sensor/test/TestExecutor.c +43 -0
  485. data/vendor/cmock/examples/temp_sensor/test/TestMain.c +31 -0
  486. data/vendor/cmock/examples/temp_sensor/test/TestModel.c +27 -0
  487. data/vendor/cmock/examples/temp_sensor/test/TestTaskScheduler.c +111 -0
  488. data/vendor/cmock/examples/temp_sensor/test/TestTemperatureCalculator.c +40 -0
  489. data/vendor/cmock/examples/temp_sensor/test/TestTemperatureFilter.c +76 -0
  490. data/vendor/cmock/examples/temp_sensor/test/TestTimerConductor.c +39 -0
  491. data/vendor/cmock/examples/temp_sensor/test/TestTimerConfigurator.c +119 -0
  492. data/vendor/cmock/examples/temp_sensor/test/TestTimerHardware.c +33 -0
  493. data/vendor/cmock/examples/temp_sensor/test/TestTimerInterruptConfigurator.c +85 -0
  494. data/vendor/cmock/examples/temp_sensor/test/TestTimerInterruptHandler.c +73 -0
  495. data/vendor/cmock/examples/temp_sensor/test/TestTimerModel.c +25 -0
  496. data/vendor/cmock/examples/temp_sensor/test/TestUsartBaudRateRegisterCalculator.c +28 -0
  497. data/vendor/cmock/examples/temp_sensor/test/TestUsartConductor.c +47 -0
  498. data/vendor/cmock/examples/temp_sensor/test/TestUsartConfigurator.c +84 -0
  499. data/vendor/cmock/examples/temp_sensor/test/TestUsartHardware.c +44 -0
  500. data/vendor/cmock/examples/temp_sensor/test/TestUsartModel.c +47 -0
  501. data/vendor/cmock/examples/temp_sensor/test/TestUsartPutChar.c +50 -0
  502. data/vendor/cmock/examples/temp_sensor/test/TestUsartTransmitBufferStatus.c +29 -0
  503. data/vendor/cmock/lib/cmock.rb +127 -0
  504. data/vendor/cmock/lib/cmock_config.rb +184 -0
  505. data/vendor/cmock/lib/cmock_file_writer.rb +48 -0
  506. data/vendor/cmock/lib/cmock_generator.rb +379 -0
  507. data/vendor/cmock/lib/cmock_generator_plugin_array.rb +68 -0
  508. data/vendor/cmock/lib/cmock_generator_plugin_callback.rb +88 -0
  509. data/vendor/cmock/lib/cmock_generator_plugin_cexception.rb +50 -0
  510. data/vendor/cmock/lib/cmock_generator_plugin_expect.rb +105 -0
  511. data/vendor/cmock/lib/cmock_generator_plugin_expect_any_args.rb +52 -0
  512. data/vendor/cmock/lib/cmock_generator_plugin_ignore.rb +90 -0
  513. data/vendor/cmock/lib/cmock_generator_plugin_ignore_arg.rb +49 -0
  514. data/vendor/cmock/lib/cmock_generator_plugin_ignore_stateless.rb +87 -0
  515. data/vendor/cmock/lib/cmock_generator_plugin_return_thru_ptr.rb +102 -0
  516. data/vendor/cmock/lib/cmock_generator_utils.rb +251 -0
  517. data/vendor/cmock/lib/cmock_header_parser.rb +629 -0
  518. data/vendor/cmock/lib/cmock_plugin_manager.rb +51 -0
  519. data/vendor/cmock/lib/cmock_unityhelper_parser.rb +82 -0
  520. data/vendor/cmock/lib/cmock_version.rb +29 -0
  521. data/vendor/cmock/meson.build +17 -0
  522. data/vendor/cmock/scripts/create_makefile.rb +210 -0
  523. data/vendor/cmock/scripts/create_mock.rb +15 -0
  524. data/vendor/cmock/scripts/create_runner.rb +25 -0
  525. data/vendor/cmock/scripts/test_summary.rb +25 -0
  526. data/vendor/cmock/src/cmock.c +238 -0
  527. data/vendor/cmock/src/cmock.h +54 -0
  528. data/vendor/cmock/src/cmock_internals.h +98 -0
  529. data/vendor/cmock/src/meson.build +12 -0
  530. data/vendor/cmock/test/c/TestCMockC.c +340 -0
  531. data/vendor/cmock/test/c/TestCMockC.yml +21 -0
  532. data/vendor/cmock/test/c/TestCMockCDynamic.c +193 -0
  533. data/vendor/cmock/test/c/TestCMockCDynamic.yml +19 -0
  534. data/vendor/cmock/test/c/TestCMockCDynamic_Runner.c +43 -0
  535. data/vendor/cmock/test/c/TestCMockC_Runner.c +48 -0
  536. data/vendor/cmock/test/iar/iar_v4/Resource/SAM7_FLASH.mac +71 -0
  537. data/vendor/cmock/test/iar/iar_v4/Resource/SAM7_RAM.mac +94 -0
  538. data/vendor/cmock/test/iar/iar_v4/Resource/SAM7_SIM.mac +67 -0
  539. data/vendor/cmock/test/iar/iar_v4/Resource/at91SAM7X256_FLASH.xcl +185 -0
  540. data/vendor/cmock/test/iar/iar_v4/Resource/at91SAM7X256_RAM.xcl +185 -0
  541. data/vendor/cmock/test/iar/iar_v4/Resource/ioat91sam7x256.ddf +2259 -0
  542. data/vendor/cmock/test/iar/iar_v4/cmock_demo.dep +3691 -0
  543. data/vendor/cmock/test/iar/iar_v4/cmock_demo.ewd +1696 -0
  544. data/vendor/cmock/test/iar/iar_v4/cmock_demo.ewp +2581 -0
  545. data/vendor/cmock/test/iar/iar_v4/cmock_demo.eww +10 -0
  546. data/vendor/cmock/test/iar/iar_v4/incIAR/AT91SAM7X-EK.h +68 -0
  547. data/vendor/cmock/test/iar/iar_v4/incIAR/AT91SAM7X256.inc +2314 -0
  548. data/vendor/cmock/test/iar/iar_v4/incIAR/AT91SAM7X256.rdf +4704 -0
  549. data/vendor/cmock/test/iar/iar_v4/incIAR/AT91SAM7X256.tcl +3407 -0
  550. data/vendor/cmock/test/iar/iar_v4/incIAR/AT91SAM7X256_inc.h +2275 -0
  551. data/vendor/cmock/test/iar/iar_v4/incIAR/ioat91sam7x256.h +4387 -0
  552. data/vendor/cmock/test/iar/iar_v4/incIAR/lib_AT91SAM7X256.h +4211 -0
  553. data/vendor/cmock/test/iar/iar_v4/settings/cmock_demo.cspy.bat +32 -0
  554. data/vendor/cmock/test/iar/iar_v4/settings/cmock_demo.dbgdt +86 -0
  555. data/vendor/cmock/test/iar/iar_v4/settings/cmock_demo.dni +42 -0
  556. data/vendor/cmock/test/iar/iar_v4/settings/cmock_demo.wsdt +76 -0
  557. data/vendor/cmock/test/iar/iar_v4/srcIAR/Cstartup.s79 +266 -0
  558. data/vendor/cmock/test/iar/iar_v4/srcIAR/Cstartup_SAM7.c +105 -0
  559. data/vendor/cmock/test/iar/iar_v5/Resource/SAM7_FLASH.mac +71 -0
  560. data/vendor/cmock/test/iar/iar_v5/Resource/SAM7_RAM.mac +94 -0
  561. data/vendor/cmock/test/iar/iar_v5/Resource/SAM7_SIM.mac +67 -0
  562. data/vendor/cmock/test/iar/iar_v5/Resource/at91SAM7X256_FLASH.icf +43 -0
  563. data/vendor/cmock/test/iar/iar_v5/Resource/at91SAM7X256_RAM.icf +42 -0
  564. data/vendor/cmock/test/iar/iar_v5/cmock_demo.dep +4204 -0
  565. data/vendor/cmock/test/iar/iar_v5/cmock_demo.ewd +1906 -0
  566. data/vendor/cmock/test/iar/iar_v5/cmock_demo.ewp +2426 -0
  567. data/vendor/cmock/test/iar/iar_v5/cmock_demo.eww +26 -0
  568. data/vendor/cmock/test/iar/iar_v5/incIAR/AT91SAM7X-EK.h +68 -0
  569. data/vendor/cmock/test/iar/iar_v5/incIAR/AT91SAM7X256_inc.h +2275 -0
  570. data/vendor/cmock/test/iar/iar_v5/incIAR/lib_AT91SAM7X256.h +4211 -0
  571. data/vendor/cmock/test/iar/iar_v5/incIAR/project.h +37 -0
  572. data/vendor/cmock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.cspy.bat +33 -0
  573. data/vendor/cmock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dbgdt +5 -0
  574. data/vendor/cmock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dni +18 -0
  575. data/vendor/cmock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.wsdt +74 -0
  576. data/vendor/cmock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X_FLASH_Debug.jlink +12 -0
  577. data/vendor/cmock/test/iar/iar_v5/settings/cmock_demo.cspy.bat +33 -0
  578. data/vendor/cmock/test/iar/iar_v5/settings/cmock_demo.dbgdt +85 -0
  579. data/vendor/cmock/test/iar/iar_v5/settings/cmock_demo.dni +44 -0
  580. data/vendor/cmock/test/iar/iar_v5/settings/cmock_demo.wsdt +73 -0
  581. data/vendor/cmock/test/iar/iar_v5/settings/cmock_demo_Binary.jlink +12 -0
  582. data/vendor/cmock/test/iar/iar_v5/settings/cmock_demo_FLASH_Debug.jlink +12 -0
  583. data/vendor/cmock/test/iar/iar_v5/settings/cmock_demo_RAM_Debug.jlink +12 -0
  584. data/vendor/cmock/test/iar/iar_v5/srcIAR/Cstartup.s +299 -0
  585. data/vendor/cmock/test/iar/iar_v5/srcIAR/Cstartup_SAM7.c +105 -0
  586. data/vendor/cmock/test/rakefile +150 -0
  587. data/vendor/cmock/test/rakefile_helper.rb +417 -0
  588. data/vendor/cmock/test/system/systest_generator.rb +206 -0
  589. data/vendor/cmock/test/system/test_compilation/callingconv.h +18 -0
  590. data/vendor/cmock/test/system/test_compilation/config.yml +17 -0
  591. data/vendor/cmock/test/system/test_compilation/const.h +44 -0
  592. data/vendor/cmock/test/system/test_compilation/inline.h +30 -0
  593. data/vendor/cmock/test/system/test_compilation/osek.h +282 -0
  594. data/vendor/cmock/test/system/test_compilation/parsing.h +99 -0
  595. data/vendor/cmock/test/system/test_interactions/all_plugins_but_other_limits.yml +382 -0
  596. data/vendor/cmock/test/system/test_interactions/all_plugins_coexist.yml +467 -0
  597. data/vendor/cmock/test/system/test_interactions/array_and_pointer_handling.yml +453 -0
  598. data/vendor/cmock/test/system/test_interactions/basic_expect_and_return.yml +131 -0
  599. data/vendor/cmock/test/system/test_interactions/const_primitives_handling.yml +94 -0
  600. data/vendor/cmock/test/system/test_interactions/doesnt_leave_details_behind.yml +315 -0
  601. data/vendor/cmock/test/system/test_interactions/enforce_strict_ordering.yml +254 -0
  602. data/vendor/cmock/test/system/test_interactions/expect_and_return_custom_types.yml +115 -0
  603. data/vendor/cmock/test/system/test_interactions/expect_and_return_treat_as.yml +180 -0
  604. data/vendor/cmock/test/system/test_interactions/expect_and_throw.yml +177 -0
  605. data/vendor/cmock/test/system/test_interactions/expect_any_args.yml +245 -0
  606. data/vendor/cmock/test/system/test_interactions/fancy_pointer_handling.yml +217 -0
  607. data/vendor/cmock/test/system/test_interactions/function_pointer_handling.yml +90 -0
  608. data/vendor/cmock/test/system/test_interactions/ignore_and_return.yml +336 -0
  609. data/vendor/cmock/test/system/test_interactions/ignore_and_return_stateless.yml +332 -0
  610. data/vendor/cmock/test/system/test_interactions/ignore_strict_mock_calling.yml +44 -0
  611. data/vendor/cmock/test/system/test_interactions/newer_standards_stuff1.yml +59 -0
  612. data/vendor/cmock/test/system/test_interactions/nonstandard_parsed_stuff_1.yml +98 -0
  613. data/vendor/cmock/test/system/test_interactions/nonstandard_parsed_stuff_2.yml +66 -0
  614. data/vendor/cmock/test/system/test_interactions/out_of_memory.yml +72 -0
  615. data/vendor/cmock/test/system/test_interactions/parsing_challenges.yml +249 -0
  616. data/vendor/cmock/test/system/test_interactions/return_thru_ptr_and_expect_any_args.yml +242 -0
  617. data/vendor/cmock/test/system/test_interactions/return_thru_ptr_ignore_arg.yml +238 -0
  618. data/vendor/cmock/test/system/test_interactions/skeleton.yml +62 -0
  619. data/vendor/cmock/test/system/test_interactions/skeleton_update.yml +83 -0
  620. data/vendor/cmock/test/system/test_interactions/struct_union_enum_expect_and_return.yml +284 -0
  621. data/vendor/cmock/test/system/test_interactions/struct_union_enum_expect_and_return_with_plugins.yml +287 -0
  622. data/vendor/cmock/test/system/test_interactions/stubs_with_callbacks.yml +228 -0
  623. data/vendor/cmock/test/system/test_interactions/unity_64bit_support.yml +84 -0
  624. data/vendor/cmock/test/system/test_interactions/unity_ignores.yml +146 -0
  625. data/vendor/cmock/test/system/test_interactions/unity_void_pointer_compare.yml +98 -0
  626. data/vendor/cmock/test/system/test_interactions/wrong_expect_and_return.yml +149 -0
  627. data/vendor/cmock/test/targets/clang_strict.yml +97 -0
  628. data/vendor/cmock/test/targets/gcc.yml +65 -0
  629. data/vendor/cmock/test/targets/gcc_64.yml +65 -0
  630. data/vendor/cmock/test/targets/gcc_tiny.yml +87 -0
  631. data/vendor/cmock/test/targets/iar_arm_v4.yml +117 -0
  632. data/vendor/cmock/test/targets/iar_arm_v5.yml +102 -0
  633. data/vendor/cmock/test/test_helper.rb +45 -0
  634. data/vendor/cmock/test/unit/cmock_config_test.rb +127 -0
  635. data/vendor/cmock/test/unit/cmock_config_test.yml +14 -0
  636. data/vendor/cmock/test/unit/cmock_file_writer_test.rb +28 -0
  637. data/vendor/cmock/test/unit/cmock_generator_main_test.rb +706 -0
  638. data/vendor/cmock/test/unit/cmock_generator_plugin_array_test.rb +145 -0
  639. data/vendor/cmock/test/unit/cmock_generator_plugin_callback_test.rb +282 -0
  640. data/vendor/cmock/test/unit/cmock_generator_plugin_cexception_test.rb +109 -0
  641. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_a_test.rb +189 -0
  642. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_any_args_test.rb +71 -0
  643. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_b_test.rb +205 -0
  644. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_arg_test.rb +117 -0
  645. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_stateless_test.rb +121 -0
  646. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_test.rb +124 -0
  647. data/vendor/cmock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb +209 -0
  648. data/vendor/cmock/test/unit/cmock_generator_utils_test.rb +404 -0
  649. data/vendor/cmock/test/unit/cmock_header_parser_test.rb +2886 -0
  650. data/vendor/cmock/test/unit/cmock_plugin_manager_test.rb +102 -0
  651. data/vendor/cmock/test/unit/cmock_unityhelper_parser_test.rb +224 -0
  652. data/vendor/cmock/vendor/behaviors/Manifest.txt +9 -0
  653. data/vendor/cmock/vendor/behaviors/Rakefile +19 -0
  654. data/vendor/cmock/vendor/behaviors/lib/behaviors/reporttask.rb +158 -0
  655. data/vendor/cmock/vendor/behaviors/lib/behaviors.rb +76 -0
  656. data/vendor/cmock/vendor/behaviors/test/behaviors_tasks_test.rb +73 -0
  657. data/vendor/cmock/vendor/behaviors/test/behaviors_test.rb +50 -0
  658. data/vendor/cmock/vendor/behaviors/test/tasks_test/Rakefile +19 -0
  659. data/vendor/cmock/vendor/behaviors/test/tasks_test/lib/user.rb +2 -0
  660. data/vendor/cmock/vendor/behaviors/test/tasks_test/test/user_test.rb +17 -0
  661. data/vendor/cmock/vendor/c_exception/README.md +236 -0
  662. data/vendor/cmock/vendor/c_exception/docs/CException.md +289 -0
  663. data/vendor/cmock/vendor/c_exception/docs/CODE_OF_CONDUCT.md +138 -0
  664. data/vendor/cmock/vendor/c_exception/docs/CONTRIBUTING.md +238 -0
  665. data/vendor/cmock/vendor/c_exception/docs/ThrowTheSwitchCodingStandard.md +207 -0
  666. data/vendor/cmock/vendor/c_exception/lib/CException.c +59 -0
  667. data/vendor/cmock/vendor/c_exception/lib/CException.h +122 -0
  668. data/vendor/cmock/vendor/c_exception/lib/meson.build +11 -0
  669. data/vendor/cmock/vendor/c_exception/license.txt +22 -0
  670. data/vendor/cmock/vendor/c_exception/meson.build +14 -0
  671. data/vendor/cmock/vendor/c_exception/project.yml +263 -0
  672. data/vendor/cmock/vendor/c_exception/test/TestException.c +398 -0
  673. data/vendor/cmock/vendor/c_exception/test/support/CExceptionConfig.h +53 -0
  674. data/vendor/cmock/vendor/unity/CMakeLists.txt +172 -0
  675. data/vendor/cmock/vendor/unity/LICENSE.txt +21 -0
  676. data/vendor/cmock/vendor/unity/README.md +234 -0
  677. data/vendor/cmock/vendor/unity/auto/__init__.py +7 -0
  678. data/vendor/cmock/vendor/unity/auto/colour_prompt.rb +120 -0
  679. data/vendor/cmock/vendor/unity/auto/colour_reporter.rb +40 -0
  680. data/vendor/cmock/vendor/unity/auto/extract_version.py +22 -0
  681. data/vendor/cmock/vendor/unity/auto/generate_config.yml +43 -0
  682. data/vendor/cmock/vendor/unity/auto/generate_module.rb +318 -0
  683. data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +547 -0
  684. data/vendor/cmock/vendor/unity/auto/parse_output.rb +390 -0
  685. data/vendor/cmock/vendor/unity/auto/run_test.erb +37 -0
  686. data/vendor/cmock/vendor/unity/auto/stylize_as_junit.py +161 -0
  687. data/vendor/cmock/vendor/unity/auto/stylize_as_junit.rb +253 -0
  688. data/vendor/cmock/vendor/unity/auto/test_file_filter.rb +28 -0
  689. data/vendor/cmock/vendor/unity/auto/type_sanitizer.rb +13 -0
  690. data/vendor/cmock/vendor/unity/auto/unity_test_summary.py +140 -0
  691. data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +140 -0
  692. data/vendor/cmock/vendor/unity/auto/yaml_helper.rb +23 -0
  693. data/vendor/cmock/vendor/unity/docs/CODE_OF_CONDUCT.md +138 -0
  694. data/vendor/cmock/vendor/unity/docs/CONTRIBUTING.md +238 -0
  695. data/vendor/cmock/vendor/unity/docs/MesonGeneratorRunner.md +18 -0
  696. data/vendor/cmock/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +187 -0
  697. data/vendor/cmock/vendor/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf +0 -0
  698. data/vendor/cmock/vendor/unity/docs/UnityAssertionsReference.md +860 -0
  699. data/vendor/cmock/vendor/unity/docs/UnityChangeLog.md +110 -0
  700. data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +654 -0
  701. data/vendor/cmock/vendor/unity/docs/UnityGettingStartedGuide.md +242 -0
  702. data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +533 -0
  703. data/vendor/cmock/vendor/unity/docs/UnityKnownIssues.md +13 -0
  704. data/vendor/cmock/vendor/unity/examples/example_1/makefile +73 -0
  705. data/vendor/cmock/vendor/unity/examples/example_1/meson.build +48 -0
  706. data/vendor/cmock/vendor/unity/examples/example_1/readme.txt +12 -0
  707. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.c +30 -0
  708. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode.h +9 -0
  709. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.c +17 -0
  710. data/vendor/cmock/vendor/unity/examples/example_1/src/ProductionCode2.h +8 -0
  711. data/vendor/cmock/vendor/unity/examples/example_1/subprojects/unity.wrap +3 -0
  712. data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode.c +68 -0
  713. data/vendor/cmock/vendor/unity/examples/example_1/test/TestProductionCode2.c +37 -0
  714. data/vendor/cmock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c +53 -0
  715. data/vendor/cmock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c +57 -0
  716. data/vendor/cmock/vendor/unity/examples/example_2/makefile +72 -0
  717. data/vendor/cmock/vendor/unity/examples/example_2/readme.txt +5 -0
  718. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.c +30 -0
  719. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode.h +9 -0
  720. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.c +17 -0
  721. data/vendor/cmock/vendor/unity/examples/example_2/src/ProductionCode2.h +8 -0
  722. data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode.c +71 -0
  723. data/vendor/cmock/vendor/unity/examples/example_2/test/TestProductionCode2.c +40 -0
  724. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +16 -0
  725. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +18 -0
  726. data/vendor/cmock/vendor/unity/examples/example_2/test/test_runners/all_tests.c +19 -0
  727. data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.c +17 -0
  728. data/vendor/cmock/vendor/unity/examples/example_3/helper/UnityHelper.h +19 -0
  729. data/vendor/cmock/vendor/unity/examples/example_3/rakefile.rb +45 -0
  730. data/vendor/cmock/vendor/unity/examples/example_3/rakefile_helper.rb +255 -0
  731. data/vendor/cmock/vendor/unity/examples/example_3/readme.txt +13 -0
  732. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.c +30 -0
  733. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode.h +9 -0
  734. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.c +17 -0
  735. data/vendor/cmock/vendor/unity/examples/example_3/src/ProductionCode2.h +8 -0
  736. data/vendor/cmock/vendor/unity/examples/example_3/target_gcc_32.yml +54 -0
  737. data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode.c +68 -0
  738. data/vendor/cmock/vendor/unity/examples/example_3/test/TestProductionCode2.c +37 -0
  739. data/vendor/cmock/vendor/unity/examples/example_4/meson.build +12 -0
  740. data/vendor/cmock/vendor/unity/examples/example_4/readme.txt +15 -0
  741. data/vendor/cmock/vendor/unity/examples/example_4/src/ProductionCode.c +30 -0
  742. data/vendor/cmock/vendor/unity/examples/example_4/src/ProductionCode.h +9 -0
  743. data/vendor/cmock/vendor/unity/examples/example_4/src/ProductionCode2.c +17 -0
  744. data/vendor/cmock/vendor/unity/examples/example_4/src/ProductionCode2.h +8 -0
  745. data/vendor/cmock/vendor/unity/examples/example_4/src/meson.build +16 -0
  746. data/vendor/cmock/vendor/unity/examples/example_4/subprojects/unity.wrap +6 -0
  747. data/vendor/cmock/vendor/unity/examples/example_4/test/TestProductionCode.c +69 -0
  748. data/vendor/cmock/vendor/unity/examples/example_4/test/TestProductionCode2.c +41 -0
  749. data/vendor/cmock/vendor/unity/examples/example_4/test/meson.build +7 -0
  750. data/vendor/cmock/vendor/unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c +53 -0
  751. data/vendor/cmock/vendor/unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c +57 -0
  752. data/vendor/cmock/vendor/unity/examples/example_4/test/test_runners/meson.build +13 -0
  753. data/vendor/cmock/vendor/unity/examples/unity_config.h +251 -0
  754. data/vendor/cmock/vendor/unity/extras/bdd/readme.md +40 -0
  755. data/vendor/cmock/vendor/unity/extras/bdd/src/unity_bdd.h +44 -0
  756. data/vendor/cmock/vendor/unity/extras/bdd/test/meson.build +9 -0
  757. data/vendor/cmock/vendor/unity/extras/bdd/test/test_bdd.c +129 -0
  758. data/vendor/cmock/vendor/unity/extras/eclipse/error_parsers.txt +26 -0
  759. data/vendor/cmock/vendor/unity/extras/fixture/readme.md +26 -0
  760. data/vendor/cmock/vendor/unity/extras/fixture/src/meson.build +10 -0
  761. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.c +310 -0
  762. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture.h +94 -0
  763. data/vendor/cmock/vendor/unity/extras/fixture/src/unity_fixture_internals.h +50 -0
  764. data/vendor/cmock/vendor/unity/extras/fixture/test/Makefile +72 -0
  765. data/vendor/cmock/vendor/unity/extras/fixture/test/main/AllTests.c +20 -0
  766. data/vendor/cmock/vendor/unity/extras/fixture/test/template_fixture_tests.c +39 -0
  767. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_Test.c +245 -0
  768. data/vendor/cmock/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +32 -0
  769. data/vendor/cmock/vendor/unity/extras/memory/readme.md +42 -0
  770. data/vendor/cmock/vendor/unity/extras/memory/src/meson.build +9 -0
  771. data/vendor/cmock/vendor/unity/extras/memory/src/unity_memory.c +203 -0
  772. data/vendor/cmock/vendor/unity/extras/memory/src/unity_memory.h +61 -0
  773. data/vendor/cmock/vendor/unity/extras/memory/test/Makefile +85 -0
  774. data/vendor/cmock/vendor/unity/extras/memory/test/unity_memory_Test.c +326 -0
  775. data/vendor/cmock/vendor/unity/extras/memory/test/unity_memory_TestRunner.c +50 -0
  776. data/vendor/cmock/vendor/unity/extras/memory/test/unity_output_Spy.c +57 -0
  777. data/vendor/cmock/vendor/unity/extras/memory/test/unity_output_Spy.h +17 -0
  778. data/vendor/cmock/vendor/unity/library.json +25 -0
  779. data/vendor/cmock/vendor/unity/meson.build +80 -0
  780. data/vendor/cmock/vendor/unity/meson_options.txt +3 -0
  781. data/vendor/cmock/vendor/unity/platformio-build.py +24 -0
  782. data/vendor/cmock/vendor/unity/src/meson.build +17 -0
  783. data/vendor/cmock/vendor/unity/src/unity.c +2501 -0
  784. data/vendor/cmock/vendor/unity/src/unity.h +698 -0
  785. data/vendor/cmock/vendor/unity/src/unity_internals.h +1183 -0
  786. data/vendor/cmock/vendor/unity/test/Makefile +167 -0
  787. data/vendor/cmock/vendor/unity/test/expectdata/testsample_cmd.c +61 -0
  788. data/vendor/cmock/vendor/unity/test/expectdata/testsample_def.c +57 -0
  789. data/vendor/cmock/vendor/unity/test/expectdata/testsample_head1.c +55 -0
  790. data/vendor/cmock/vendor/unity/test/expectdata/testsample_head1.h +15 -0
  791. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_cmd.c +80 -0
  792. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_def.c +76 -0
  793. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_head1.c +75 -0
  794. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_head1.h +13 -0
  795. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_new1.c +89 -0
  796. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_new2.c +89 -0
  797. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_param.c +77 -0
  798. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_run1.c +89 -0
  799. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_run2.c +89 -0
  800. data/vendor/cmock/vendor/unity/test/expectdata/testsample_mock_yaml.c +90 -0
  801. data/vendor/cmock/vendor/unity/test/expectdata/testsample_new1.c +67 -0
  802. data/vendor/cmock/vendor/unity/test/expectdata/testsample_new2.c +70 -0
  803. data/vendor/cmock/vendor/unity/test/expectdata/testsample_param.c +58 -0
  804. data/vendor/cmock/vendor/unity/test/expectdata/testsample_run1.c +67 -0
  805. data/vendor/cmock/vendor/unity/test/expectdata/testsample_run2.c +70 -0
  806. data/vendor/cmock/vendor/unity/test/expectdata/testsample_yaml.c +71 -0
  807. data/vendor/cmock/vendor/unity/test/rakefile +164 -0
  808. data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +316 -0
  809. data/vendor/cmock/vendor/unity/test/spec/generate_module_existing_file_spec.rb +164 -0
  810. data/vendor/cmock/vendor/unity/test/targets/ansi.yml +51 -0
  811. data/vendor/cmock/vendor/unity/test/targets/clang_file.yml +79 -0
  812. data/vendor/cmock/vendor/unity/test/targets/clang_strict.yml +79 -0
  813. data/vendor/cmock/vendor/unity/test/targets/gcc_32.yml +52 -0
  814. data/vendor/cmock/vendor/unity/test/targets/gcc_64.yml +53 -0
  815. data/vendor/cmock/vendor/unity/test/targets/gcc_auto_limits.yml +50 -0
  816. data/vendor/cmock/vendor/unity/test/targets/gcc_auto_stdint.yml +62 -0
  817. data/vendor/cmock/vendor/unity/test/targets/gcc_manual_math.yml +50 -0
  818. data/vendor/cmock/vendor/unity/test/targets/hitech_picc18.yml +98 -0
  819. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v4.yml +105 -0
  820. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5.yml +99 -0
  821. data/vendor/cmock/vendor/unity/test/targets/iar_arm_v5_3.yml +99 -0
  822. data/vendor/cmock/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml +97 -0
  823. data/vendor/cmock/vendor/unity/test/targets/iar_cortexm3_v5.yml +101 -0
  824. data/vendor/cmock/vendor/unity/test/targets/iar_msp430.yml +119 -0
  825. data/vendor/cmock/vendor/unity/test/targets/iar_sh2a_v6.yml +106 -0
  826. data/vendor/cmock/vendor/unity/test/testdata/CException.h +18 -0
  827. data/vendor/cmock/vendor/unity/test/testdata/Defs.h +16 -0
  828. data/vendor/cmock/vendor/unity/test/testdata/cmock.h +21 -0
  829. data/vendor/cmock/vendor/unity/test/testdata/mockMock.h +20 -0
  830. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGenerator.c +204 -0
  831. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +73 -0
  832. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +200 -0
  833. data/vendor/cmock/vendor/unity/test/tests/self_assessment_utils.h +151 -0
  834. data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +1341 -0
  835. data/vendor/cmock/vendor/unity/test/tests/test_unity_arrays.c +2941 -0
  836. data/vendor/cmock/vendor/unity/test/tests/test_unity_core.c +375 -0
  837. data/vendor/cmock/vendor/unity/test/tests/test_unity_doubles.c +1285 -0
  838. data/vendor/cmock/vendor/unity/test/tests/test_unity_floats.c +1395 -0
  839. data/vendor/cmock/vendor/unity/test/tests/test_unity_integers.c +2863 -0
  840. data/vendor/cmock/vendor/unity/test/tests/test_unity_integers_64.c +783 -0
  841. data/vendor/cmock/vendor/unity/test/tests/test_unity_memory.c +82 -0
  842. data/vendor/cmock/vendor/unity/test/tests/test_unity_parameterized.c +309 -0
  843. data/vendor/cmock/vendor/unity/test/tests/test_unity_parameterizedDemo.c +28 -0
  844. data/vendor/cmock/vendor/unity/test/tests/test_unity_strings.c +330 -0
  845. data/vendor/cmock/vendor/unity/test/tests/types_for_test.h +21 -0
  846. data/vendor/cmock/vendor/unity/unityConfig.cmake +1 -0
  847. data/vendor/diy/History.txt +28 -0
  848. data/vendor/diy/LICENSE.txt +7 -0
  849. data/vendor/diy/README.rdoc +215 -0
  850. data/vendor/diy/Rakefile +33 -0
  851. data/vendor/diy/TODO.txt +9 -0
  852. data/vendor/diy/diy.gemspec +131 -0
  853. data/vendor/diy/lib/diy/factory.rb +44 -0
  854. data/vendor/diy/lib/diy.rb +411 -0
  855. data/vendor/diy/sample_code/car.rb +15 -0
  856. data/vendor/diy/sample_code/chassis.rb +13 -0
  857. data/vendor/diy/sample_code/diy_example.rb +34 -0
  858. data/vendor/diy/sample_code/engine.rb +13 -0
  859. data/vendor/diy/sample_code/objects.yml +18 -0
  860. data/vendor/diy/test/constructor.rb +127 -0
  861. data/vendor/diy/test/diy_test.rb +616 -0
  862. data/vendor/diy/test/factory_test.rb +87 -0
  863. data/vendor/diy/test/files/broken_construction.yml +15 -0
  864. data/vendor/diy/test/files/cat/cat.rb +11 -0
  865. data/vendor/diy/test/files/cat/extra_conflict.yml +13 -0
  866. data/vendor/diy/test/files/cat/heritage.rb +10 -0
  867. data/vendor/diy/test/files/cat/needs_input.yml +11 -0
  868. data/vendor/diy/test/files/cat/the_cat_lineage.rb +9 -0
  869. data/vendor/diy/test/files/dog/dog_model.rb +11 -0
  870. data/vendor/diy/test/files/dog/dog_presenter.rb +11 -0
  871. data/vendor/diy/test/files/dog/dog_view.rb +10 -0
  872. data/vendor/diy/test/files/dog/file_resolver.rb +10 -0
  873. data/vendor/diy/test/files/dog/other_thing.rb +10 -0
  874. data/vendor/diy/test/files/dog/simple.yml +19 -0
  875. data/vendor/diy/test/files/donkey/foo/bar/qux.rb +15 -0
  876. data/vendor/diy/test/files/donkey/foo.rb +16 -0
  877. data/vendor/diy/test/files/factory/beef.rb +13 -0
  878. data/vendor/diy/test/files/factory/dog.rb +14 -0
  879. data/vendor/diy/test/files/factory/factory.yml +27 -0
  880. data/vendor/diy/test/files/factory/farm/llama.rb +15 -0
  881. data/vendor/diy/test/files/factory/farm/pork.rb +15 -0
  882. data/vendor/diy/test/files/factory/kitten.rb +21 -0
  883. data/vendor/diy/test/files/fud/objects.yml +21 -0
  884. data/vendor/diy/test/files/fud/toy.rb +22 -0
  885. data/vendor/diy/test/files/functions/attached_things_builder.rb +10 -0
  886. data/vendor/diy/test/files/functions/invalid_method.yml +13 -0
  887. data/vendor/diy/test/files/functions/method_extractor.rb +11 -0
  888. data/vendor/diy/test/files/functions/nonsingleton_objects.yml +14 -0
  889. data/vendor/diy/test/files/functions/objects.yml +30 -0
  890. data/vendor/diy/test/files/functions/thing.rb +11 -0
  891. data/vendor/diy/test/files/functions/thing_builder.rb +33 -0
  892. data/vendor/diy/test/files/functions/things_builder.rb +11 -0
  893. data/vendor/diy/test/files/gnu/objects.yml +22 -0
  894. data/vendor/diy/test/files/gnu/thinger.rb +15 -0
  895. data/vendor/diy/test/files/goat/base.rb +16 -0
  896. data/vendor/diy/test/files/goat/can.rb +14 -0
  897. data/vendor/diy/test/files/goat/goat.rb +14 -0
  898. data/vendor/diy/test/files/goat/objects.yml +20 -0
  899. data/vendor/diy/test/files/goat/paper.rb +14 -0
  900. data/vendor/diy/test/files/goat/plane.rb +15 -0
  901. data/vendor/diy/test/files/goat/shirt.rb +14 -0
  902. data/vendor/diy/test/files/goat/wings.rb +16 -0
  903. data/vendor/diy/test/files/horse/holder_thing.rb +11 -0
  904. data/vendor/diy/test/files/horse/objects.yml +15 -0
  905. data/vendor/diy/test/files/namespace/animal/bird.rb +13 -0
  906. data/vendor/diy/test/files/namespace/animal/cat.rb +13 -0
  907. data/vendor/diy/test/files/namespace/animal/reptile/hardshell/turtle.rb +16 -0
  908. data/vendor/diy/test/files/namespace/animal/reptile/lizard.rb +15 -0
  909. data/vendor/diy/test/files/namespace/bad_module_specified.yml +16 -0
  910. data/vendor/diy/test/files/namespace/class_name_combine.yml +16 -0
  911. data/vendor/diy/test/files/namespace/hello.txt +1 -0
  912. data/vendor/diy/test/files/namespace/no_module_specified.yml +16 -0
  913. data/vendor/diy/test/files/namespace/objects.yml +29 -0
  914. data/vendor/diy/test/files/namespace/road.rb +10 -0
  915. data/vendor/diy/test/files/namespace/sky.rb +10 -0
  916. data/vendor/diy/test/files/namespace/subcontext.yml +30 -0
  917. data/vendor/diy/test/files/non_singleton/air.rb +10 -0
  918. data/vendor/diy/test/files/non_singleton/fat_cat.rb +11 -0
  919. data/vendor/diy/test/files/non_singleton/objects.yml +27 -0
  920. data/vendor/diy/test/files/non_singleton/pig.rb +11 -0
  921. data/vendor/diy/test/files/non_singleton/thread_spinner.rb +11 -0
  922. data/vendor/diy/test/files/non_singleton/tick.rb +11 -0
  923. data/vendor/diy/test/files/non_singleton/yard.rb +10 -0
  924. data/vendor/diy/test/files/yak/core_model.rb +11 -0
  925. data/vendor/diy/test/files/yak/core_presenter.rb +11 -0
  926. data/vendor/diy/test/files/yak/core_view.rb +9 -0
  927. data/vendor/diy/test/files/yak/data_source.rb +9 -0
  928. data/vendor/diy/test/files/yak/fringe_model.rb +11 -0
  929. data/vendor/diy/test/files/yak/fringe_presenter.rb +11 -0
  930. data/vendor/diy/test/files/yak/fringe_view.rb +9 -0
  931. data/vendor/diy/test/files/yak/giant_squid.rb +11 -0
  932. data/vendor/diy/test/files/yak/krill.rb +10 -0
  933. data/vendor/diy/test/files/yak/my_objects.yml +29 -0
  934. data/vendor/diy/test/files/yak/sub_sub_context_test.yml +35 -0
  935. data/vendor/diy/test/test_helper.rb +63 -0
  936. data/vendor/unity/CMakeLists.txt +172 -0
  937. data/vendor/unity/LICENSE.txt +21 -0
  938. data/vendor/unity/README.md +234 -0
  939. data/vendor/unity/auto/__init__.py +7 -0
  940. data/vendor/unity/auto/colour_prompt.rb +120 -0
  941. data/vendor/unity/auto/colour_reporter.rb +40 -0
  942. data/vendor/unity/auto/extract_version.py +22 -0
  943. data/vendor/unity/auto/generate_config.yml +43 -0
  944. data/vendor/unity/auto/generate_module.rb +318 -0
  945. data/vendor/unity/auto/generate_test_runner.rb +547 -0
  946. data/vendor/unity/auto/parse_output.rb +390 -0
  947. data/vendor/unity/auto/run_test.erb +37 -0
  948. data/vendor/unity/auto/stylize_as_junit.py +161 -0
  949. data/vendor/unity/auto/stylize_as_junit.rb +253 -0
  950. data/vendor/unity/auto/test_file_filter.rb +28 -0
  951. data/vendor/unity/auto/type_sanitizer.rb +13 -0
  952. data/vendor/unity/auto/unity_test_summary.py +140 -0
  953. data/vendor/unity/auto/unity_test_summary.rb +140 -0
  954. data/vendor/unity/auto/yaml_helper.rb +23 -0
  955. data/vendor/unity/docs/CODE_OF_CONDUCT.md +138 -0
  956. data/vendor/unity/docs/CONTRIBUTING.md +238 -0
  957. data/vendor/unity/docs/MesonGeneratorRunner.md +18 -0
  958. data/vendor/unity/docs/ThrowTheSwitchCodingStandard.md +187 -0
  959. data/vendor/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf +0 -0
  960. data/vendor/unity/docs/UnityAssertionsReference.md +860 -0
  961. data/vendor/unity/docs/UnityChangeLog.md +110 -0
  962. data/vendor/unity/docs/UnityConfigurationGuide.md +654 -0
  963. data/vendor/unity/docs/UnityGettingStartedGuide.md +242 -0
  964. data/vendor/unity/docs/UnityHelperScriptsGuide.md +533 -0
  965. data/vendor/unity/docs/UnityKnownIssues.md +13 -0
  966. data/vendor/unity/examples/example_1/makefile +73 -0
  967. data/vendor/unity/examples/example_1/meson.build +48 -0
  968. data/vendor/unity/examples/example_1/readme.txt +12 -0
  969. data/vendor/unity/examples/example_1/src/ProductionCode.c +30 -0
  970. data/vendor/unity/examples/example_1/src/ProductionCode.h +9 -0
  971. data/vendor/unity/examples/example_1/src/ProductionCode2.c +17 -0
  972. data/vendor/unity/examples/example_1/src/ProductionCode2.h +8 -0
  973. data/vendor/unity/examples/example_1/subprojects/unity.wrap +3 -0
  974. data/vendor/unity/examples/example_1/test/TestProductionCode.c +68 -0
  975. data/vendor/unity/examples/example_1/test/TestProductionCode2.c +37 -0
  976. data/vendor/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c +53 -0
  977. data/vendor/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c +57 -0
  978. data/vendor/unity/examples/example_2/makefile +72 -0
  979. data/vendor/unity/examples/example_2/readme.txt +5 -0
  980. data/vendor/unity/examples/example_2/src/ProductionCode.c +30 -0
  981. data/vendor/unity/examples/example_2/src/ProductionCode.h +9 -0
  982. data/vendor/unity/examples/example_2/src/ProductionCode2.c +17 -0
  983. data/vendor/unity/examples/example_2/src/ProductionCode2.h +8 -0
  984. data/vendor/unity/examples/example_2/test/TestProductionCode.c +71 -0
  985. data/vendor/unity/examples/example_2/test/TestProductionCode2.c +40 -0
  986. data/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c +16 -0
  987. data/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c +18 -0
  988. data/vendor/unity/examples/example_2/test/test_runners/all_tests.c +19 -0
  989. data/vendor/unity/examples/example_3/helper/UnityHelper.c +17 -0
  990. data/vendor/unity/examples/example_3/helper/UnityHelper.h +19 -0
  991. data/vendor/unity/examples/example_3/rakefile.rb +45 -0
  992. data/vendor/unity/examples/example_3/rakefile_helper.rb +255 -0
  993. data/vendor/unity/examples/example_3/readme.txt +13 -0
  994. data/vendor/unity/examples/example_3/src/ProductionCode.c +30 -0
  995. data/vendor/unity/examples/example_3/src/ProductionCode.h +9 -0
  996. data/vendor/unity/examples/example_3/src/ProductionCode2.c +17 -0
  997. data/vendor/unity/examples/example_3/src/ProductionCode2.h +8 -0
  998. data/vendor/unity/examples/example_3/target_gcc_32.yml +54 -0
  999. data/vendor/unity/examples/example_3/test/TestProductionCode.c +68 -0
  1000. data/vendor/unity/examples/example_3/test/TestProductionCode2.c +37 -0
  1001. data/vendor/unity/examples/example_4/meson.build +12 -0
  1002. data/vendor/unity/examples/example_4/readme.txt +15 -0
  1003. data/vendor/unity/examples/example_4/src/ProductionCode.c +30 -0
  1004. data/vendor/unity/examples/example_4/src/ProductionCode.h +9 -0
  1005. data/vendor/unity/examples/example_4/src/ProductionCode2.c +17 -0
  1006. data/vendor/unity/examples/example_4/src/ProductionCode2.h +8 -0
  1007. data/vendor/unity/examples/example_4/src/meson.build +16 -0
  1008. data/vendor/unity/examples/example_4/subprojects/unity.wrap +6 -0
  1009. data/vendor/unity/examples/example_4/test/TestProductionCode.c +69 -0
  1010. data/vendor/unity/examples/example_4/test/TestProductionCode2.c +41 -0
  1011. data/vendor/unity/examples/example_4/test/meson.build +7 -0
  1012. data/vendor/unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c +53 -0
  1013. data/vendor/unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c +57 -0
  1014. data/vendor/unity/examples/example_4/test/test_runners/meson.build +13 -0
  1015. data/vendor/unity/examples/unity_config.h +251 -0
  1016. data/vendor/unity/extras/bdd/readme.md +40 -0
  1017. data/vendor/unity/extras/bdd/src/unity_bdd.h +44 -0
  1018. data/vendor/unity/extras/bdd/test/meson.build +9 -0
  1019. data/vendor/unity/extras/bdd/test/test_bdd.c +129 -0
  1020. data/vendor/unity/extras/eclipse/error_parsers.txt +26 -0
  1021. data/vendor/unity/extras/fixture/readme.md +26 -0
  1022. data/vendor/unity/extras/fixture/src/meson.build +10 -0
  1023. data/vendor/unity/extras/fixture/src/unity_fixture.c +310 -0
  1024. data/vendor/unity/extras/fixture/src/unity_fixture.h +94 -0
  1025. data/vendor/unity/extras/fixture/src/unity_fixture_internals.h +50 -0
  1026. data/vendor/unity/extras/fixture/test/Makefile +72 -0
  1027. data/vendor/unity/extras/fixture/test/main/AllTests.c +20 -0
  1028. data/vendor/unity/extras/fixture/test/template_fixture_tests.c +39 -0
  1029. data/vendor/unity/extras/fixture/test/unity_fixture_Test.c +245 -0
  1030. data/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +32 -0
  1031. data/vendor/unity/extras/memory/readme.md +42 -0
  1032. data/vendor/unity/extras/memory/src/meson.build +9 -0
  1033. data/vendor/unity/extras/memory/src/unity_memory.c +203 -0
  1034. data/vendor/unity/extras/memory/src/unity_memory.h +61 -0
  1035. data/vendor/unity/extras/memory/test/Makefile +85 -0
  1036. data/vendor/unity/extras/memory/test/unity_memory_Test.c +326 -0
  1037. data/vendor/unity/extras/memory/test/unity_memory_TestRunner.c +50 -0
  1038. data/vendor/unity/extras/memory/test/unity_output_Spy.c +57 -0
  1039. data/vendor/unity/extras/memory/test/unity_output_Spy.h +17 -0
  1040. data/vendor/unity/library.json +25 -0
  1041. data/vendor/unity/meson.build +80 -0
  1042. data/vendor/unity/meson_options.txt +3 -0
  1043. data/vendor/unity/platformio-build.py +24 -0
  1044. data/vendor/unity/src/meson.build +17 -0
  1045. data/vendor/unity/src/unity.c +2501 -0
  1046. data/vendor/unity/src/unity.h +698 -0
  1047. data/vendor/unity/src/unity_internals.h +1183 -0
  1048. data/vendor/unity/test/Makefile +167 -0
  1049. data/vendor/unity/test/expectdata/testsample_cmd.c +61 -0
  1050. data/vendor/unity/test/expectdata/testsample_def.c +57 -0
  1051. data/vendor/unity/test/expectdata/testsample_head1.c +55 -0
  1052. data/vendor/unity/test/expectdata/testsample_head1.h +15 -0
  1053. data/vendor/unity/test/expectdata/testsample_mock_cmd.c +80 -0
  1054. data/vendor/unity/test/expectdata/testsample_mock_def.c +76 -0
  1055. data/vendor/unity/test/expectdata/testsample_mock_head1.c +75 -0
  1056. data/vendor/unity/test/expectdata/testsample_mock_head1.h +13 -0
  1057. data/vendor/unity/test/expectdata/testsample_mock_new1.c +89 -0
  1058. data/vendor/unity/test/expectdata/testsample_mock_new2.c +89 -0
  1059. data/vendor/unity/test/expectdata/testsample_mock_param.c +77 -0
  1060. data/vendor/unity/test/expectdata/testsample_mock_run1.c +89 -0
  1061. data/vendor/unity/test/expectdata/testsample_mock_run2.c +89 -0
  1062. data/vendor/unity/test/expectdata/testsample_mock_yaml.c +90 -0
  1063. data/vendor/unity/test/expectdata/testsample_new1.c +67 -0
  1064. data/vendor/unity/test/expectdata/testsample_new2.c +70 -0
  1065. data/vendor/unity/test/expectdata/testsample_param.c +58 -0
  1066. data/vendor/unity/test/expectdata/testsample_run1.c +67 -0
  1067. data/vendor/unity/test/expectdata/testsample_run2.c +70 -0
  1068. data/vendor/unity/test/expectdata/testsample_yaml.c +71 -0
  1069. data/vendor/unity/test/rakefile +164 -0
  1070. data/vendor/unity/test/rakefile_helper.rb +316 -0
  1071. data/vendor/unity/test/spec/generate_module_existing_file_spec.rb +164 -0
  1072. data/vendor/unity/test/targets/ansi.yml +51 -0
  1073. data/vendor/unity/test/targets/clang_file.yml +79 -0
  1074. data/vendor/unity/test/targets/clang_strict.yml +79 -0
  1075. data/vendor/unity/test/targets/gcc_32.yml +52 -0
  1076. data/vendor/unity/test/targets/gcc_64.yml +53 -0
  1077. data/vendor/unity/test/targets/gcc_auto_limits.yml +50 -0
  1078. data/vendor/unity/test/targets/gcc_auto_stdint.yml +62 -0
  1079. data/vendor/unity/test/targets/gcc_manual_math.yml +50 -0
  1080. data/vendor/unity/test/targets/hitech_picc18.yml +98 -0
  1081. data/vendor/unity/test/targets/iar_arm_v4.yml +105 -0
  1082. data/vendor/unity/test/targets/iar_arm_v5.yml +99 -0
  1083. data/vendor/unity/test/targets/iar_arm_v5_3.yml +99 -0
  1084. data/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml +97 -0
  1085. data/vendor/unity/test/targets/iar_cortexm3_v5.yml +101 -0
  1086. data/vendor/unity/test/targets/iar_msp430.yml +119 -0
  1087. data/vendor/unity/test/targets/iar_sh2a_v6.yml +106 -0
  1088. data/vendor/unity/test/testdata/CException.h +18 -0
  1089. data/vendor/unity/test/testdata/Defs.h +16 -0
  1090. data/vendor/unity/test/testdata/cmock.h +21 -0
  1091. data/vendor/unity/test/testdata/mockMock.h +20 -0
  1092. data/vendor/unity/test/testdata/testRunnerGenerator.c +204 -0
  1093. data/vendor/unity/test/testdata/testRunnerGeneratorSmall.c +73 -0
  1094. data/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c +200 -0
  1095. data/vendor/unity/test/tests/self_assessment_utils.h +151 -0
  1096. data/vendor/unity/test/tests/test_generate_test_runner.rb +1341 -0
  1097. data/vendor/unity/test/tests/test_unity_arrays.c +2941 -0
  1098. data/vendor/unity/test/tests/test_unity_core.c +375 -0
  1099. data/vendor/unity/test/tests/test_unity_doubles.c +1285 -0
  1100. data/vendor/unity/test/tests/test_unity_floats.c +1395 -0
  1101. data/vendor/unity/test/tests/test_unity_integers.c +2863 -0
  1102. data/vendor/unity/test/tests/test_unity_integers_64.c +783 -0
  1103. data/vendor/unity/test/tests/test_unity_memory.c +82 -0
  1104. data/vendor/unity/test/tests/test_unity_parameterized.c +309 -0
  1105. data/vendor/unity/test/tests/test_unity_parameterizedDemo.c +28 -0
  1106. data/vendor/unity/test/tests/test_unity_strings.c +330 -0
  1107. data/vendor/unity/test/tests/types_for_test.h +21 -0
  1108. data/vendor/unity/unityConfig.cmake +1 -0
  1109. metadata +1211 -251
  1110. data/.gitignore +0 -14
  1111. data/.vim +0 -1
  1112. data/.yardopts +0 -1
  1113. data/LICENSE +0 -19
  1114. data/ceedling-gem.sublime-project +0 -575
  1115. data/examples/temp_sensor/rakefile.rb +0 -4
  1116. data/examples/temp_sensor/src/AT91SAM7X256.h +0 -2556
  1117. data/examples/temp_sensor/src/UsartGetChar.c +0 -6
  1118. data/examples/temp_sensor/src/UsartGetChar.h +0 -8
  1119. data/examples/temp_sensor/test/test_AdcConductor.c +0 -121
  1120. data/examples/temp_sensor/test/test_AdcHardware.c +0 -44
  1121. data/examples/temp_sensor/test/test_AdcHardwareConfigurator.c +0 -43
  1122. data/examples/temp_sensor/test/test_AdcModel.c +0 -33
  1123. data/examples/temp_sensor/test/test_AdcTemperatureSensor.c +0 -47
  1124. data/examples/temp_sensor/test/test_Executor.c +0 -36
  1125. data/examples/temp_sensor/test/test_Main.c +0 -24
  1126. data/examples/temp_sensor/test/test_Model.c +0 -20
  1127. data/examples/temp_sensor/test/test_TaskScheduler.c +0 -104
  1128. data/examples/temp_sensor/test/test_TemperatureCalculator.c +0 -33
  1129. data/examples/temp_sensor/test/test_TemperatureFilter.c +0 -71
  1130. data/examples/temp_sensor/test/test_TimerConductor.c +0 -32
  1131. data/examples/temp_sensor/test/test_TimerConfigurator.c +0 -112
  1132. data/examples/temp_sensor/test/test_TimerHardware.c +0 -26
  1133. data/examples/temp_sensor/test/test_TimerInterruptConfigurator.c +0 -78
  1134. data/examples/temp_sensor/test/test_TimerInterruptHandler.c +0 -66
  1135. data/examples/temp_sensor/test/test_TimerModel.c +0 -18
  1136. data/examples/temp_sensor/test/test_UsartBaudRateRegisterCalculator.c +0 -21
  1137. data/examples/temp_sensor/test/test_UsartConductor.c +0 -40
  1138. data/examples/temp_sensor/test/test_UsartConfigurator.c +0 -77
  1139. data/examples/temp_sensor/test/test_UsartGetChar.c +0 -17
  1140. data/examples/temp_sensor/test/test_UsartHardware.c +0 -56
  1141. data/examples/temp_sensor/test/test_UsartModel.c +0 -40
  1142. data/examples/temp_sensor/test/test_UsartPutChar.c +0 -43
  1143. data/examples/temp_sensor/test/test_UsartTransmitBufferStatus.c +0 -22
  1144. data/lib/ceedling/version.rb +0 -16
  1145. data/lib/ceedling/version.rb.erb +0 -16
  1146. data/new_project_template/build/.gitkeep +0 -0
  1147. data/new_project_template/project.yml +0 -65
  1148. data/new_project_template/rakefile.rb +0 -4
  1149. data/new_project_template/src/.gitkeep +0 -0
  1150. data/new_project_template/test/.gitkeep +0 -0
  1151. data/new_project_template/test/support/.gitkeep +0 -0
  1152. data/new_project_template/vendor/ceedling/docs/CExceptionSummary.pdf +0 -0
  1153. data/new_project_template/vendor/ceedling/docs/CMock Summary.pdf +0 -0
  1154. data/new_project_template/vendor/ceedling/docs/Ceedling Packet.pdf +0 -0
  1155. data/new_project_template/vendor/ceedling/docs/Unity Summary.pdf +0 -0
  1156. data/new_project_template/vendor/ceedling/lib/build_invoker_utils.rb +0 -27
  1157. data/new_project_template/vendor/ceedling/lib/cacheinator.rb +0 -42
  1158. data/new_project_template/vendor/ceedling/lib/cacheinator_helper.rb +0 -12
  1159. data/new_project_template/vendor/ceedling/lib/cmock_builder.rb +0 -15
  1160. data/new_project_template/vendor/ceedling/lib/configurator.rb +0 -329
  1161. data/new_project_template/vendor/ceedling/lib/configurator_builder.rb +0 -419
  1162. data/new_project_template/vendor/ceedling/lib/configurator_plugins.rb +0 -93
  1163. data/new_project_template/vendor/ceedling/lib/configurator_setup.rb +0 -123
  1164. data/new_project_template/vendor/ceedling/lib/configurator_validator.rb +0 -184
  1165. data/new_project_template/vendor/ceedling/lib/constants.rb +0 -91
  1166. data/new_project_template/vendor/ceedling/lib/defaults.rb +0 -378
  1167. data/new_project_template/vendor/ceedling/lib/dependinator.rb +0 -92
  1168. data/new_project_template/vendor/ceedling/lib/file_finder.rb +0 -132
  1169. data/new_project_template/vendor/ceedling/lib/file_finder_helper.rb +0 -54
  1170. data/new_project_template/vendor/ceedling/lib/file_path_utils.rb +0 -189
  1171. data/new_project_template/vendor/ceedling/lib/file_system_utils.rb +0 -69
  1172. data/new_project_template/vendor/ceedling/lib/file_wrapper.rb +0 -74
  1173. data/new_project_template/vendor/ceedling/lib/flaginator.rb +0 -54
  1174. data/new_project_template/vendor/ceedling/lib/generator.rb +0 -162
  1175. data/new_project_template/vendor/ceedling/lib/generator_helper.rb +0 -40
  1176. data/new_project_template/vendor/ceedling/lib/generator_test_results.rb +0 -89
  1177. data/new_project_template/vendor/ceedling/lib/generator_test_results_sanity_checker.rb +0 -62
  1178. data/new_project_template/vendor/ceedling/lib/generator_test_runner.rb +0 -63
  1179. data/new_project_template/vendor/ceedling/lib/loginator.rb +0 -31
  1180. data/new_project_template/vendor/ceedling/lib/makefile.rb +0 -46
  1181. data/new_project_template/vendor/ceedling/lib/objects.yml +0 -301
  1182. data/new_project_template/vendor/ceedling/lib/plugin.rb +0 -79
  1183. data/new_project_template/vendor/ceedling/lib/plugin_manager.rb +0 -95
  1184. data/new_project_template/vendor/ceedling/lib/plugin_manager_helper.rb +0 -19
  1185. data/new_project_template/vendor/ceedling/lib/plugin_reportinator.rb +0 -75
  1186. data/new_project_template/vendor/ceedling/lib/plugin_reportinator_helper.rb +0 -52
  1187. data/new_project_template/vendor/ceedling/lib/preprocessinator.rb +0 -43
  1188. data/new_project_template/vendor/ceedling/lib/preprocessinator_extractor.rb +0 -36
  1189. data/new_project_template/vendor/ceedling/lib/preprocessinator_file_handler.rb +0 -21
  1190. data/new_project_template/vendor/ceedling/lib/preprocessinator_helper.rb +0 -46
  1191. data/new_project_template/vendor/ceedling/lib/preprocessinator_includes_handler.rb +0 -55
  1192. data/new_project_template/vendor/ceedling/lib/project_config_manager.rb +0 -38
  1193. data/new_project_template/vendor/ceedling/lib/project_file_loader.rb +0 -64
  1194. data/new_project_template/vendor/ceedling/lib/rake_utils.rb +0 -17
  1195. data/new_project_template/vendor/ceedling/lib/rake_wrapper.rb +0 -31
  1196. data/new_project_template/vendor/ceedling/lib/rakefile.rb +0 -61
  1197. data/new_project_template/vendor/ceedling/lib/release_invoker.rb +0 -58
  1198. data/new_project_template/vendor/ceedling/lib/release_invoker_helper.rb +0 -16
  1199. data/new_project_template/vendor/ceedling/lib/reportinator.rb +0 -9
  1200. data/new_project_template/vendor/ceedling/lib/rules_cmock.rake +0 -9
  1201. data/new_project_template/vendor/ceedling/lib/rules_preprocess.rake +0 -26
  1202. data/new_project_template/vendor/ceedling/lib/rules_release.rake +0 -79
  1203. data/new_project_template/vendor/ceedling/lib/rules_release_deep_dependencies.rake +0 -15
  1204. data/new_project_template/vendor/ceedling/lib/rules_tests.rake +0 -59
  1205. data/new_project_template/vendor/ceedling/lib/rules_tests_deep_dependencies.rake +0 -15
  1206. data/new_project_template/vendor/ceedling/lib/setupinator.rb +0 -51
  1207. data/new_project_template/vendor/ceedling/lib/stream_wrapper.rb +0 -20
  1208. data/new_project_template/vendor/ceedling/lib/streaminator.rb +0 -41
  1209. data/new_project_template/vendor/ceedling/lib/streaminator_helper.rb +0 -15
  1210. data/new_project_template/vendor/ceedling/lib/system_utils.rb +0 -32
  1211. data/new_project_template/vendor/ceedling/lib/system_wrapper.rb +0 -75
  1212. data/new_project_template/vendor/ceedling/lib/task_invoker.rb +0 -85
  1213. data/new_project_template/vendor/ceedling/lib/tasks_base.rake +0 -104
  1214. data/new_project_template/vendor/ceedling/lib/tasks_filesystem.rake +0 -91
  1215. data/new_project_template/vendor/ceedling/lib/tasks_release.rake +0 -28
  1216. data/new_project_template/vendor/ceedling/lib/tasks_release_deep_dependencies.rake +0 -9
  1217. data/new_project_template/vendor/ceedling/lib/tasks_tests.rake +0 -52
  1218. data/new_project_template/vendor/ceedling/lib/tasks_tests_deep_dependencies.rake +0 -9
  1219. data/new_project_template/vendor/ceedling/lib/tasks_vendor.rake +0 -36
  1220. data/new_project_template/vendor/ceedling/lib/test_includes_extractor.rb +0 -81
  1221. data/new_project_template/vendor/ceedling/lib/test_invoker.rb +0 -97
  1222. data/new_project_template/vendor/ceedling/lib/test_invoker_helper.rb +0 -28
  1223. data/new_project_template/vendor/ceedling/lib/tool_executor.rb +0 -212
  1224. data/new_project_template/vendor/ceedling/lib/tool_executor_helper.rb +0 -115
  1225. data/new_project_template/vendor/ceedling/lib/verbosinator.rb +0 -10
  1226. data/new_project_template/vendor/ceedling/lib/yaml_wrapper.rb +0 -16
  1227. data/new_project_template/vendor/ceedling/plugins/bullseye/bullseye.rake +0 -162
  1228. data/new_project_template/vendor/ceedling/plugins/bullseye/bullseye.rb +0 -173
  1229. data/new_project_template/vendor/ceedling/plugins/bullseye/defaults.yml +0 -53
  1230. data/new_project_template/vendor/ceedling/plugins/bullseye/readme.txt +0 -0
  1231. data/new_project_template/vendor/ceedling/plugins/gcov/defaults.yml +0 -34
  1232. data/new_project_template/vendor/ceedling/plugins/gcov/gcov.rake +0 -152
  1233. data/new_project_template/vendor/ceedling/plugins/gcov/gcov.rb +0 -128
  1234. data/new_project_template/vendor/ceedling/plugins/gcov/readme.txt +0 -0
  1235. data/new_project_template/vendor/ceedling/plugins/gcov/template.erb +0 -15
  1236. data/new_project_template/vendor/ceedling/plugins/module_generator/module_generator.rake +0 -14
  1237. data/new_project_template/vendor/ceedling/plugins/module_generator/module_generator.rb +0 -218
  1238. data/new_project_template/vendor/ceedling/plugins/module_generator/module_generator.yml +0 -4
  1239. data/new_project_template/vendor/ceedling/plugins/stdout_ide_tests_report/stdout_ide_tests_report.rb +0 -44
  1240. data/new_project_template/vendor/ceedling/plugins/stdout_ide_tests_report/stdout_ide_tests_report.yml +0 -4
  1241. data/new_project_template/vendor/ceedling/plugins/stdout_pretty_tests_report/stdout_pretty_tests_report.rb +0 -48
  1242. data/new_project_template/vendor/ceedling/plugins/stdout_pretty_tests_report/stdout_pretty_tests_report.yml +0 -4
  1243. data/new_project_template/vendor/ceedling/plugins/stdout_pretty_tests_report/template.erb +0 -59
  1244. data/new_project_template/vendor/ceedling/plugins/warnings_report/warnings_report.rb +0 -71
  1245. data/new_project_template/vendor/ceedling/plugins/xml_tests_report/xml_tests_report.rb +0 -110
  1246. data/new_project_template/vendor/ceedling/release/build.info +0 -1
  1247. data/new_project_template/vendor/ceedling/release/version.info +0 -1
  1248. data/new_project_template/vendor/ceedling/vendor/c_exception/lib/CException.c +0 -39
  1249. data/new_project_template/vendor/ceedling/vendor/c_exception/lib/CException.h +0 -70
  1250. data/new_project_template/vendor/ceedling/vendor/c_exception/release/build.info +0 -1
  1251. data/new_project_template/vendor/ceedling/vendor/c_exception/release/version.info +0 -2
  1252. data/new_project_template/vendor/ceedling/vendor/cmock/config/production_environment.rb +0 -14
  1253. data/new_project_template/vendor/ceedling/vendor/cmock/config/test_environment.rb +0 -16
  1254. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock.rb +0 -65
  1255. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_config.rb +0 -129
  1256. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_file_writer.rb +0 -33
  1257. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_generator.rb +0 -194
  1258. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_generator_plugin_array.rb +0 -57
  1259. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_generator_plugin_callback.rb +0 -78
  1260. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_generator_plugin_cexception.rb +0 -51
  1261. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_generator_plugin_expect.rb +0 -86
  1262. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_generator_plugin_ignore.rb +0 -85
  1263. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_generator_utils.rb +0 -177
  1264. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_header_parser.rb +0 -273
  1265. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_plugin_manager.rb +0 -40
  1266. data/new_project_template/vendor/ceedling/vendor/cmock/lib/cmock_unityhelper_parser.rb +0 -74
  1267. data/new_project_template/vendor/ceedling/vendor/cmock/release/build.info +0 -1
  1268. data/new_project_template/vendor/ceedling/vendor/cmock/release/version.info +0 -2
  1269. data/new_project_template/vendor/ceedling/vendor/cmock/src/cmock.c +0 -186
  1270. data/new_project_template/vendor/ceedling/vendor/cmock/src/cmock.h +0 -30
  1271. data/new_project_template/vendor/ceedling/vendor/constructor/lib/constructor.rb +0 -127
  1272. data/new_project_template/vendor/ceedling/vendor/constructor/lib/constructor_struct.rb +0 -33
  1273. data/new_project_template/vendor/ceedling/vendor/deep_merge/lib/deep_merge.rb +0 -211
  1274. data/new_project_template/vendor/ceedling/vendor/diy/lib/diy/factory.rb +0 -36
  1275. data/new_project_template/vendor/ceedling/vendor/diy/lib/diy.rb +0 -403
  1276. data/new_project_template/vendor/ceedling/vendor/unity/auto/generate_test_runner.rb +0 -308
  1277. data/new_project_template/vendor/ceedling/vendor/unity/release/build.info +0 -1
  1278. data/new_project_template/vendor/ceedling/vendor/unity/release/version.info +0 -2
  1279. data/new_project_template/vendor/ceedling/vendor/unity/src/unity.c +0 -960
  1280. data/new_project_template/vendor/ceedling/vendor/unity/src/unity.h +0 -232
  1281. data/new_project_template/vendor/ceedling/vendor/unity/src/unity_internals.h +0 -414
  1282. /data/{new_project_template/vendor/ceedling/plugins/bullseye → plugins/bullseye/assets}/template.erb +0 -0
@@ -0,0 +1,2886 @@
1
+ # =========================================================================
2
+ # CMock - Automatic Mock Generation for C
3
+ # ThrowTheSwitch.org
4
+ # Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams
5
+ # SPDX-License-Identifier: MIT
6
+ # =========================================================================
7
+
8
+ $ThisIsOnlyATest = true
9
+
10
+ require File.expand_path(File.dirname(__FILE__)) + "/../test_helper"
11
+ require File.expand_path(File.dirname(__FILE__)) + '/../../lib/cmock_header_parser'
12
+
13
+ describe CMockHeaderParser, "Verify CMockHeaderParser Module" do
14
+
15
+ before do
16
+ create_mocks :config
17
+ @config.expect :strippables, ["STRIPPABLE"]
18
+ @config.expect :attributes, ['__ramfunc', 'funky_attrib', 'SQLITE_API']
19
+ @config.expect :c_calling_conventions, ['__stdcall']
20
+ @config.expect :treat_as_void, ['MY_FUNKY_VOID']
21
+ @config.expect :treat_as, { "BANJOS" => "INT", "TUBAS" => "HEX16"}
22
+ @config.expect :treat_as_array, {"IntArray" => "int", "Book" => "Page"}
23
+ @config.expect :when_no_prototypes, :error
24
+ @config.expect :verbosity, 1
25
+ @config.expect :treat_externs, :exclude
26
+ @config.expect :treat_inlines, :exclude
27
+ @config.expect :inline_function_patterns, ['(static\s+inline|inline\s+static)\s*', '(\bstatic\b|\binline\b)\s*']
28
+ @config.expect :array_size_type, ['int', 'size_t']
29
+ @config.expect :array_size_name, 'size|len'
30
+
31
+ @parser = CMockHeaderParser.new(@config)
32
+
33
+ @test_project = {
34
+ :module_name => 'test_file.h',
35
+ :typedefs => [],
36
+ :functions => [],
37
+ :normalized_source => nil
38
+ }
39
+ end
40
+
41
+ after do
42
+ end
43
+
44
+ it "create and initialize variables to defaults appropriately" do
45
+ assert_nil(@parser.funcs)
46
+ assert_equal(['const', '__ramfunc', 'funky_attrib', 'SQLITE_API'], @parser.c_attributes)
47
+ assert_equal(['void','MY_FUNKY_VOID'], @parser.treat_as_void)
48
+ end
49
+
50
+ it "strip out line comments" do
51
+ source =
52
+ " abcd;\n" +
53
+ "// hello;\n" +
54
+ "who // is you\n"
55
+
56
+ expected =
57
+ [
58
+ "abcd",
59
+ "who"
60
+ ]
61
+
62
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
63
+ end
64
+
65
+ it "remove block comments" do
66
+ source =
67
+ " no_comments;\n" +
68
+ "// basic_line_comment;\n" +
69
+ "/* basic_block_comment;*/\n" +
70
+ "pre_block; /* start_of_block_comment;\n" +
71
+ "// embedded_line_comment_in_block_comment; */\n" +
72
+ "// /* commented_out_block_comment_line\n" +
73
+ "shown_because_block_comment_invalid_from_line_comment;\n" +
74
+ "// */\n" +
75
+ "//* shorter_commented_out_block_comment_line; \n" +
76
+ "shown_because_block_comment_invalid_from_shorter_line_comment;\n" +
77
+ "/*/\n" +
78
+ "not_shown_because_line_above_started_comment;\n" +
79
+ "//*/\n" +
80
+ "/* \n" +
81
+ "not_shown_because_block_comment_started_this_time;\n" +
82
+ "/*/\n" +
83
+ "shown_because_line_above_ended_comment_this_time;\n" +
84
+ "//*/\n"
85
+
86
+ expected =
87
+ [
88
+ "no_comments",
89
+ "pre_block",
90
+ "shown_because_block_comment_invalid_from_line_comment",
91
+ "shown_because_block_comment_invalid_from_shorter_line_comment",
92
+ "shown_because_line_above_ended_comment_this_time"
93
+ ]
94
+
95
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
96
+ end
97
+
98
+ it "remove strippables from the beginning or end of function declarations" do
99
+ source =
100
+ "void* my_calloc(size_t, size_t) STRIPPABLE;\n" +
101
+ "void\n" +
102
+ " my_realloc(void*, size_t) STRIPPABLE;\n" +
103
+ "extern int\n" +
104
+ " my_printf (void *my_object, const char *my_format, ...)\n" +
105
+ " STRIPPABLE;\n" +
106
+ " void STRIPPABLE universal_handler ();\n"
107
+
108
+ expected =
109
+ [
110
+ "void* my_calloc(size_t, size_t)",
111
+ "void my_realloc(void*, size_t)",
112
+ "void universal_handler()"
113
+ ]
114
+
115
+ assert_equal(expected, @parser.import_source(source, @test_project))
116
+ end
117
+
118
+ it "remove gcc's function __attribute__'s" do
119
+ source =
120
+ "void* my_calloc(size_t, size_t) __attribute__((alloc_size(1,2)));\n" +
121
+ "void\n" +
122
+ " my_realloc(void*, size_t) __attribute__((alloc_size(2)));\n" +
123
+ "extern int\n" +
124
+ " my_printf (void *my_object, const char *my_format, ...)\n" +
125
+ " __attribute__ ( (format (printf, 2, 3)) );\n" +
126
+ " void __attribute__ ((interrupt)) universal_handler ();\n"
127
+
128
+ expected =
129
+ [
130
+ "void* my_calloc(size_t, size_t)",
131
+ "void my_realloc(void*, size_t)",
132
+ "void universal_handler()"
133
+ ]
134
+
135
+ assert_equal(expected, @parser.import_source(source, @test_project))
136
+ end
137
+
138
+ it "remove preprocessor directives" do
139
+ source =
140
+ "#when stuff_happens\n" +
141
+ "#ifdef _TEST\n" +
142
+ "#pragma stack_switch"
143
+
144
+ expected = []
145
+
146
+ assert_equal(expected, @parser.import_source(source, @test_project))
147
+ end
148
+
149
+
150
+ it "remove assembler pragma sections" do
151
+ source =
152
+ " #pragma\tasm\n" +
153
+ " .foo\n" +
154
+ " lda %m\n" +
155
+ " nop\n" +
156
+ "# pragma endasm \n" +
157
+ "foo"
158
+
159
+ expected = ["foo"]
160
+
161
+ assert_equal(expected, @parser.import_source(source, @test_project))
162
+ end
163
+
164
+
165
+ it "smush lines together that contain continuation characters" do
166
+ source =
167
+ "hoo hah \\\n" +
168
+ "when \\ \n"
169
+
170
+ expected =
171
+ [
172
+ "hoo hah when"
173
+ ]
174
+
175
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
176
+ end
177
+
178
+
179
+ it "remove C macro definitions" do
180
+ source =
181
+ "#define this is the first line\\\n" +
182
+ "and the second\\\n" +
183
+ "and the third that should be removed\n" +
184
+ "but I'm here\n"
185
+
186
+ expected = ["but I'm here"]
187
+
188
+ assert_equal(expected, @parser.import_source(source, @test_project))
189
+ end
190
+
191
+
192
+ it "remove typedef statements" do
193
+ source =
194
+ "typedef uint32 (unsigned int);\n" +
195
+ "const typedef int INT;\n" +
196
+ "int notatypedef;\n" +
197
+ "int typedef_isnt_me;\n" +
198
+ " typedef who cares what really comes here \n" + # exercise multiline typedef
199
+ " continuation;\n" +
200
+ "this should remain!;\n" +
201
+ "typedef blah bleh;\n" +
202
+ "typedef struct shell_command_struct {\n" +
203
+ " char_ptr COMMAND;\n" +
204
+ " int_32 (*SHELL_FUNC)(int_32 argc);\n" +
205
+ "} SHELL_COMMAND_STRUCT, * SHELL_COMMAND_PTR;\n" +
206
+ "typedef struct shell_command_struct {\n" +
207
+ " char_ptr COMMAND;\n" +
208
+ " int_32 (*SHELL_FUNC)(int_32 argc, char_ptr argv[]);\n" +
209
+ "} SHELL_COMMAND_STRUCT, * SHELL_COMMAND_PTR;\n" +
210
+ "typedef struct shell_command_struct {\n" +
211
+ " char_ptr COMMAND;\n" +
212
+ " int_32 (*SHELL_FUNC)(int_32 argc);\n" +
213
+ "};\n"
214
+
215
+ expected =
216
+ [
217
+ "int notatypedef",
218
+ "int typedef_isnt_me",
219
+ "this should remain!"
220
+ ]
221
+
222
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
223
+ end
224
+
225
+
226
+ it "remove enum statements" do
227
+ source =
228
+ "enum _NamedEnum {\n" +
229
+ " THING1 = (0x0001),\n" +
230
+ " THING2 = (0x0001 << 5),\n" +
231
+ "}ListOValues;\n\n" +
232
+ "don't delete me!!\n" +
233
+ " modifier_str enum _NamedEnum {THING1 = (0x0001), THING2 = (0x0001 << 5)} ListOValues;\n\n" +
234
+ "typedef enum {\n" +
235
+ " THING1,\n" +
236
+ " THING2,\n" +
237
+ "} Thinger;\n" +
238
+ "or me!!\n"
239
+
240
+ assert_equal(["don't delete me!! or me!!"], @parser.import_source(source, @test_project).map!{|s|s.strip})
241
+ end
242
+
243
+
244
+ it "remove union statements" do
245
+ source =
246
+ "union _NamedDoohicky {\n" +
247
+ " unsigned int a;\n" +
248
+ " char b;\n" +
249
+ "} Doohicky;\n\n" +
250
+ "I want to live!!\n" +
251
+ "some_modifier union { unsigned int a; char b;} Whatever;\n" +
252
+ "typedef union {\n" +
253
+ " unsigned int a;\n" +
254
+ " char b;\n" +
255
+ "} Whatever;\n" +
256
+ "me too!!\n"
257
+
258
+ assert_equal(["I want to live!! me too!!"], @parser.import_source(source, @test_project).map!{|s|s.strip})
259
+ end
260
+
261
+
262
+ it "remove struct statements" do
263
+ source =
264
+ "struct _NamedStruct1 {\n" +
265
+ " unsigned int a;\n" +
266
+ " signed long int b;\n" +
267
+ "} Thing ;\n\n" +
268
+ "extern struct ForwardDeclared_t TestDataType1;\n" +
269
+ "void foo(void);\n" +
270
+ "struct\n"+
271
+ " MultilineForwardDeclared_t\n" +
272
+ " TestDataType2;\n" +
273
+ "struct THINGER foo(void);\n" +
274
+ "typedef struct {\n" +
275
+ " unsigned int a;\n" +
276
+ " signed char b;\n" +
277
+ "}Thinger;\n" +
278
+ "I want to live!!\n"
279
+
280
+ assert_equal(["void foo(void)", "struct THINGER foo(void)", "I want to live!!"],
281
+ @parser.import_source(source, @test_project).map!{|s|s.strip})
282
+ end
283
+
284
+ it "remove externed and inline functions" do
285
+ source =
286
+ " extern uint32 foobar(unsigned int);\n" +
287
+ "uint32 extern_name_func(unsigned int);\n" +
288
+ "uint32 funcinline(unsigned int);\n" +
289
+ "extern void bar(unsigned int);\n" +
290
+ "inline void bar(unsigned int);\n" +
291
+ "extern\n" +
292
+ "void kinda_ugly_on_the_next_line(unsigned int);\n"
293
+
294
+ expected =
295
+ [
296
+ "uint32 extern_name_func(unsigned int)",
297
+ "uint32 funcinline(unsigned int)"
298
+ ]
299
+
300
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
301
+ end
302
+
303
+ it "remove function definitions but keep function declarations" do
304
+ source =
305
+ "uint32 func_with_decl_a(unsigned int);\n" +
306
+ "uint32 func_with_decl_a(unsigned int a) { return a; }\n" +
307
+ "uint32 func_with_decl_b(unsigned int);\n" +
308
+ "uint32 func_with_decl_b(unsigned int a)\n" +
309
+ "{\n" +
310
+ " bar((unsigned int) a);\n" +
311
+ " stripme(a);\n" +
312
+ "}\n"
313
+
314
+ expected =
315
+ [
316
+ "uint32 func_with_decl_a(unsigned int)",
317
+ "uint32 func_with_decl_a", #okay. it's not going to be interpretted as another function
318
+ "uint32 func_with_decl_b(unsigned int)",
319
+ "uint32 func_with_decl_b", #okay. it's not going to be interpretted as another function
320
+ ]
321
+
322
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
323
+ end
324
+
325
+ it "remove function definitions with nested braces but keep function declarations" do
326
+ source =
327
+ "uint32 func_with_decl_a(unsigned int);\n" +
328
+ "uint32 func_with_decl_a(unsigned int a) {\n" +
329
+ " while (stuff) {\n" +
330
+ " not_a_definition1(void);\n" +
331
+ " }\n" +
332
+ " not_a_definition2(blah, bleh);\n" +
333
+ " return a;\n" +
334
+ "}\n" +
335
+ "uint32 func_with_decl_b(unsigned int);\n" +
336
+ "uint32 func_with_decl_b(unsigned int a)\n" +
337
+ "{\n" +
338
+ " bar((unsigned int) a);\n" +
339
+ " stripme(a);\n" +
340
+ "}\n" +
341
+ "uint32 func_with_decl_c(unsigned int);\n" +
342
+ "uint32 func_with_decl_c(unsigned int a)\n" +
343
+ "{\n" +
344
+ " if(a > 0)\n" +
345
+ " {\n" +
346
+ " return 1;\n" +
347
+ " }\n" +
348
+ " else\n"+
349
+ " {\n" +
350
+ " return 2;\n" +
351
+ " }\n" +
352
+ "}\n"
353
+
354
+ expected =
355
+ [
356
+ "uint32 func_with_decl_a(unsigned int)",
357
+ "uint32 func_with_decl_a", #okay. it's not going to be interpretted as another function
358
+ "uint32 func_with_decl_b(unsigned int)",
359
+ "uint32 func_with_decl_b", #okay. it's not going to be interpretted as another function
360
+ "uint32 func_with_decl_c(unsigned int)",
361
+ "uint32 func_with_decl_c", #okay. it's not going to be interpretted as another function
362
+ ]
363
+
364
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
365
+ end
366
+
367
+ it "remove a fully defined inline function" do
368
+ source =
369
+ "inline void foo(unsigned int a) { oranges = a; }\n" +
370
+ "inline void bar(unsigned int a) { apples = a; };\n" +
371
+ "inline void bar(unsigned int a)\n" +
372
+ "{" +
373
+ " bananas = a;\n" +
374
+ "}"
375
+
376
+ # ensure it's expected type of exception
377
+ assert_raises RuntimeError do
378
+ @parser.parse("module", source)
379
+ end
380
+
381
+ assert_nil(@parser.funcs)
382
+
383
+ # verify exception message
384
+ begin
385
+ @parser.parse("module", source)
386
+ rescue RuntimeError => e
387
+ assert_match("ERROR: No function prototypes found", e.message)
388
+ end
389
+ end
390
+
391
+ it "remove a fully defined inline function that is multiple lines" do
392
+ source =
393
+ "inline void bar(unsigned int a)\n" +
394
+ "{" +
395
+ " bananas = a;\n" +
396
+ " grapes = a;\n" +
397
+ " apples(bananas, grapes);\n" +
398
+ "}"
399
+
400
+ # ensure it's expected type of exception
401
+ assert_raises RuntimeError do
402
+ @parser.parse("module", source)
403
+ end
404
+
405
+ assert_nil(@parser.funcs)
406
+
407
+ # verify exception message
408
+ begin
409
+ @parser.parse("module", source)
410
+ rescue RuntimeError => e
411
+ assert_match("ERROR: No function prototypes found", e.message)
412
+ end
413
+ end
414
+
415
+ it "remove a fully defined inline function that contains nested braces" do
416
+ source =
417
+ "inline void bar(unsigned int a)\n" +
418
+ "{" +
419
+ " apples(bananas, grapes);\n" +
420
+ " if (bananas == a)\n" +
421
+ " {\n" +
422
+ " oranges(a);\n" +
423
+ " grapes = a;\n" +
424
+ " }\n" +
425
+ " grapefruit(bananas, grapes);\n" +
426
+ "}"
427
+
428
+ # ensure it's expected type of exception
429
+ assert_raises RuntimeError do
430
+ @parser.parse("module", source)
431
+ end
432
+
433
+ assert_nil(@parser.funcs)
434
+
435
+ # verify exception message
436
+ begin
437
+ @parser.parse("module", source)
438
+ rescue RuntimeError => e
439
+ assert_match("ERROR: No function prototypes found", e.message)
440
+ end
441
+ end
442
+
443
+ it "remove just inline functions if externs to be included" do
444
+ source =
445
+ " extern uint32 foobar(unsigned int);\n" +
446
+ "uint32 extern_name_func(unsigned int);\n" +
447
+ "uint32 funcinline(unsigned int);\n" +
448
+ "extern void bar(unsigned int);\n" +
449
+ "inline void bar(unsigned int);\n" +
450
+ "extern\n" +
451
+ "void kinda_ugly_on_the_next_line(unsigned int);\n"
452
+
453
+ expected =
454
+ [ "extern uint32 foobar(unsigned int)",
455
+ "uint32 extern_name_func(unsigned int)",
456
+ "uint32 funcinline(unsigned int)",
457
+ "extern void bar(unsigned int)",
458
+ "extern void kinda_ugly_on_the_next_line(unsigned int)"
459
+ ]
460
+
461
+ @parser.treat_externs = :include
462
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
463
+ end
464
+
465
+ it "leave inline functions if inline to be included" do
466
+ source =
467
+ "extern uint32 foobar(unsigned int);\n" +
468
+ "uint32 extern_name_func(unsigned int);\n" +
469
+ "uint32 funcinline(unsigned int);\n" +
470
+ "inline void inlineBar(unsigned int);\n" +
471
+ "extern int extern_bar(void);\n" +
472
+ "static inline void staticinlineBar(unsigned int);\n" +
473
+ "static inline void bar(unsigned int);\n" +
474
+ "static inline void bar(unsigned int)\n" +
475
+ "{\n" +
476
+ " // NOP\n" +
477
+ "}\n"
478
+
479
+ expected =
480
+ [ "uint32 extern_name_func(unsigned int)",
481
+ "uint32 funcinline(unsigned int)",
482
+ "void inlineBar(unsigned int)",
483
+ "void staticinlineBar(unsigned int)",
484
+ "void bar(unsigned int)"
485
+ ]
486
+
487
+ @parser.treat_inlines = :include
488
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
489
+ end
490
+
491
+ it "leave inline and extern functions if inline and extern to be included" do
492
+ source =
493
+ "extern uint32 foobar(unsigned int);\n" +
494
+ "uint32 extern_name_func(unsigned int);\n" +
495
+ "uint32 funcinline(unsigned int);\n" +
496
+ "inline void inlineBar(unsigned int);\n" +
497
+ "extern int extern_bar(void);\n" +
498
+ "static inline void staticinlineBar(unsigned int);\n" +
499
+ "static inline void bar(unsigned int);\n" +
500
+ "static inline void bar(unsigned int)\n" +
501
+ "{\n" +
502
+ " // NOP\n" +
503
+ "}\n"
504
+
505
+ expected =
506
+ [ "extern uint32 foobar(unsigned int)",
507
+ "uint32 extern_name_func(unsigned int)",
508
+ "uint32 funcinline(unsigned int)",
509
+ "void inlineBar(unsigned int)",
510
+ "extern int extern_bar(void)",
511
+ "void staticinlineBar(unsigned int)",
512
+ "void bar(unsigned int)"
513
+ ]
514
+
515
+ @parser.treat_externs = :include
516
+ @parser.treat_inlines = :include
517
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
518
+ end
519
+
520
+ it "Include inline functions that contain user defined inline function formats" do
521
+ source =
522
+ "uint32 foo(unsigned int);\n" +
523
+ "uint32 bar(unsigned int);\n" +
524
+ "inline void inlineBar(void)\n" +
525
+ "{\n" +
526
+ " return 43;\n" +
527
+ "}\n" +
528
+ "static __inline__ __attribute__ ((always_inline)) int alwaysinlinefunc(int a)\n" +
529
+ "{\n" +
530
+ " return a + inlineBar();\n" +
531
+ "}\n" +
532
+ "static __inline__ void inlinebar(unsigned int)\n" +
533
+ "{\n" +
534
+ " int a = alwaysinlinefunc()\n" +
535
+ "}\n"
536
+
537
+ expected =
538
+ [
539
+ "uint32 foo(unsigned int)",
540
+ "uint32 bar(unsigned int)",
541
+ "void inlineBar(void)",
542
+ "int alwaysinlinefunc(int a)",
543
+ "void inlinebar(unsigned int)"
544
+ ]
545
+
546
+ @parser.treat_inlines = :include
547
+ @parser.inline_function_patterns = ['static __inline__ __attribute__ \(\(always_inline\)\)', 'static __inline__', '\binline\b']
548
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
549
+ end
550
+
551
+ it "remove defines" do
552
+ source =
553
+ "#define whatever you feel like defining\n" +
554
+ "void hello(void);\n" +
555
+ "#DEFINE I JUST DON'T CARE\n" +
556
+ "#deFINE\n" +
557
+ "#define get_foo() \\\n ((Thing)foo.bar)" # exercise multiline define
558
+
559
+ expected =
560
+ [
561
+ "void hello(void)",
562
+ ]
563
+
564
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
565
+ end
566
+
567
+
568
+ it "remove keywords that would keep things from going smoothly in the future" do
569
+ source =
570
+ "const int TheMatrix(register int Trinity, unsigned int *restrict Neo)"
571
+
572
+ expected =
573
+ [
574
+ "const int TheMatrix(int Trinity, unsigned int * Neo)",
575
+ ]
576
+
577
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
578
+ end
579
+
580
+
581
+ # some code actually typedef's void even though it's not ANSI C and is, frankly, weird
582
+ # since cmock treats void specially, we can't let void be obfuscated
583
+ it "handle odd case of typedef'd void returned" do
584
+ source = "MY_FUNKY_VOID FunkyVoidReturned(int a)"
585
+ expected = { :var_arg=>nil,
586
+ :name=>"FunkyVoidReturned",
587
+ :unscoped_name=>"FunkyVoidReturned",
588
+ :namespace=>[],
589
+ :class=>nil,
590
+ :return=>{ :type => "void",
591
+ :name => 'cmock_to_return',
592
+ :ptr? => false,
593
+ :const? => false,
594
+ :const_ptr? => false,
595
+ :str => "void cmock_to_return",
596
+ :void? => true
597
+ },
598
+ :modifier=>"",
599
+ :contains_ptr? => false,
600
+ :args=>[{:type=>"int", :name=>"a", :ptr? => false, :const? => false, :const_ptr? => false}],
601
+ :args_string=>"int a",
602
+ :args_call=>"a"}
603
+ assert_equal(expected, @parser.parse_declaration(@test_project, source))
604
+ end
605
+
606
+ it "handle odd case of typedef'd void as arg" do
607
+ source = "int FunkyVoidAsArg(MY_FUNKY_VOID)"
608
+ expected = { :var_arg=>nil,
609
+ :name=>"FunkyVoidAsArg",
610
+ :unscoped_name=>"FunkyVoidAsArg",
611
+ :namespace=>[],
612
+ :class=>nil,
613
+ :return=>{ :type => "int",
614
+ :name => 'cmock_to_return',
615
+ :ptr? => false,
616
+ :const? => false,
617
+ :const_ptr? => false,
618
+ :str => "int cmock_to_return",
619
+ :void? => false
620
+ },
621
+ :modifier=>"",
622
+ :contains_ptr? => false,
623
+ :args=>[],
624
+ :args_string=>"void",
625
+ :args_call=>"" }
626
+ assert_equal(expected, @parser.parse_declaration(@test_project, source))
627
+ end
628
+
629
+ it "handle odd case of typedef'd void as arg pointer" do
630
+ source = "char FunkyVoidPointer(MY_FUNKY_VOID* bluh)"
631
+ expected = { :var_arg=>nil,
632
+ :name=>"FunkyVoidPointer",
633
+ :unscoped_name=>"FunkyVoidPointer",
634
+ :namespace=>[],
635
+ :class=>nil,
636
+ :return=>{ :type => "char",
637
+ :name => 'cmock_to_return',
638
+ :ptr? => false,
639
+ :const? => false,
640
+ :const_ptr? => false,
641
+ :str => "char cmock_to_return",
642
+ :void? => false
643
+ },
644
+ :modifier=>"",
645
+ :contains_ptr? => true,
646
+ :args=>[{:type=>"MY_FUNKY_VOID*", :name=>"bluh", :ptr? => true, :const? => false, :const_ptr? => false}],
647
+ :args_string=>"MY_FUNKY_VOID* bluh",
648
+ :args_call=>"bluh" }
649
+ assert_equal(expected, @parser.parse_declaration(@test_project, source))
650
+ end
651
+
652
+
653
+ it "strip default values from function parameter lists" do
654
+ source =
655
+ "void Foo(int a = 57, float b=37.52, char c= 'd', char* e=\"junk\");\n"
656
+
657
+ expected =
658
+ [
659
+ "void Foo(int a, float b, char c, char* e)"
660
+ ]
661
+
662
+ assert_equal(expected, @parser.import_source(source, @test_project).map!{|s|s.strip})
663
+ end
664
+
665
+
666
+ it "raise upon empty file" do
667
+ source = ''
668
+
669
+ # ensure it's expected type of exception
670
+ assert_raises RuntimeError do
671
+ @parser.parse("module", source)
672
+ end
673
+
674
+ assert_nil(@parser.funcs)
675
+
676
+ # verify exception message
677
+ begin
678
+ @parser.parse("module", source)
679
+ rescue RuntimeError => e
680
+ assert_match("ERROR: No function prototypes found", e.message)
681
+ end
682
+ end
683
+
684
+ it "clean up module names that contain spaces, dashes, and such" do
685
+ source = 'void meh(int (*func)(int));'
686
+
687
+ retval = @parser.parse("C:\Ugly Module-Name", source)
688
+ assert (retval[:typedefs][0] =~ /CUglyModuleName/)
689
+ end
690
+
691
+ it "raise upon no function prototypes found in file" do
692
+ source =
693
+ "typedef void SILLY_VOID_TYPE1;\n" +
694
+ "typedef (void) SILLY_VOID_TYPE2 ;\n" +
695
+ "typedef ( void ) (*FUNCPTR)(void);\n\n" +
696
+ "#define get_foo() \\\n ((Thing)foo.bar)"
697
+
698
+ # ensure it's expected type of exception
699
+ assert_raises(RuntimeError) do
700
+ @parser.parse("module", source)
701
+ end
702
+
703
+ assert_nil(@parser.funcs)
704
+
705
+ # verify exception message
706
+ begin
707
+ @parser.parse("module", source)
708
+ rescue RuntimeError => e
709
+ assert_match("ERROR: No function prototypes found", e.message)
710
+ end
711
+ end
712
+
713
+
714
+ it "raise upon prototype parsing failure" do
715
+ source = "void (int, )"
716
+
717
+ # ensure it's expected type of exception
718
+ assert_raises(RuntimeError) do
719
+ @parser.parse("module", source)
720
+ end
721
+
722
+ # verify exception message
723
+ begin
724
+ @parser.parse("module", source)
725
+ rescue RuntimeError => e
726
+ assert(e.message.include?("Failed Parsing Declaration Prototype!"))
727
+ end
728
+ end
729
+
730
+ it "extract and return function declarations with retval and args" do
731
+
732
+ source = "int Foo(int a, unsigned int b)"
733
+ expected = { :var_arg=>nil,
734
+ :name=>"Foo",
735
+ :unscoped_name=>"Foo",
736
+ :namespace=>[],
737
+ :class=>nil,
738
+ :return=>{ :type => "int",
739
+ :name => 'cmock_to_return',
740
+ :ptr? => false,
741
+ :const? => false,
742
+ :const_ptr? => false,
743
+ :str => "int cmock_to_return",
744
+ :void? => false
745
+ },
746
+ :modifier=>"",
747
+ :contains_ptr? => false,
748
+ :args=>[ {:type=>"int", :name=>"a", :ptr? => false, :const? => false, :const_ptr? => false},
749
+ {:type=>"unsigned int", :name=>"b", :ptr? => false, :const? => false, :const_ptr? => false}
750
+ ],
751
+ :args_string=>"int a, unsigned int b",
752
+ :args_call=>"a, b" }
753
+ assert_equal(expected, @parser.parse_declaration(@test_project, source))
754
+ end
755
+
756
+ it "extract and return function declarations with no retval" do
757
+
758
+ source = "void FunkyChicken( uint la, int de, bool da)"
759
+ expected = { :var_arg=>nil,
760
+ :return=>{ :type => "void",
761
+ :name => 'cmock_to_return',
762
+ :ptr? => false,
763
+ :const? => false,
764
+ :const_ptr? => false,
765
+ :str => "void cmock_to_return",
766
+ :void? => true
767
+ },
768
+ :name=>"FunkyChicken",
769
+ :unscoped_name=>"FunkyChicken",
770
+ :namespace=>[],
771
+ :class=>nil,
772
+ :modifier=>"",
773
+ :contains_ptr? => false,
774
+ :args=>[ {:type=>"uint", :name=>"la", :ptr? => false, :const? => false, :const_ptr? => false},
775
+ {:type=>"int", :name=>"de", :ptr? => false, :const? => false, :const_ptr? => false},
776
+ {:type=>"bool", :name=>"da", :ptr? => false, :const? => false, :const_ptr? => false}
777
+ ],
778
+ :args_string=>"uint la, int de, bool da",
779
+ :args_call=>"la, de, da" }
780
+ assert_equal(expected, @parser.parse_declaration(@test_project, source))
781
+ end
782
+
783
+ it "extract and return function declarations with implied voids" do
784
+
785
+ source = "void tat()"
786
+ expected = { :var_arg=>nil,
787
+ :return=>{ :type => "void",
788
+ :name => 'cmock_to_return',
789
+ :ptr? => false,
790
+ :const? => false,
791
+ :const_ptr? => false,
792
+ :str => "void cmock_to_return",
793
+ :void? => true
794
+ },
795
+ :name=>"tat",
796
+ :unscoped_name=>"tat",
797
+ :namespace=>[],
798
+ :class=>nil,
799
+ :modifier=>"",
800
+ :contains_ptr? => false,
801
+ :args=>[ ],
802
+ :args_string=>"void",
803
+ :args_call=>"" }
804
+ assert_equal(expected, @parser.parse_declaration(@test_project, source))
805
+ end
806
+
807
+ it "extract modifiers properly" do
808
+
809
+ source = "const int TheMatrix(int Trinity, unsigned int * Neo)"
810
+ expected = { :var_arg=>nil,
811
+ :return=>{ :type => "int",
812
+ :name => 'cmock_to_return',
813
+ :ptr? => false,
814
+ :const? => true,
815
+ :const_ptr? => false,
816
+ :str => "int cmock_to_return",
817
+ :void? => false
818
+ },
819
+ :name=>"TheMatrix",
820
+ :unscoped_name=>"TheMatrix",
821
+ :namespace=>[],
822
+ :class=>nil,
823
+ :modifier=>"const",
824
+ :contains_ptr? => true,
825
+ :args=>[ {:type=>"int", :name=>"Trinity", :ptr? => false, :const? => false, :const_ptr? => false},
826
+ {:type=>"unsigned int*", :name=>"Neo", :ptr? => true, :const? => false, :const_ptr? => false}
827
+ ],
828
+ :args_string=>"int Trinity, unsigned int* Neo",
829
+ :args_call=>"Trinity, Neo" }
830
+ assert_equal(expected, @parser.parse_declaration(@test_project, source))
831
+ end
832
+
833
+ it "extract c calling conventions properly" do
834
+
835
+ source = "const int __stdcall TheMatrix(int Trinity, unsigned int * Neo)"
836
+ expected = { :var_arg=>nil,
837
+ :return=>{ :type => "int",
838
+ :name => 'cmock_to_return',
839
+ :ptr? => false,
840
+ :const? => true,
841
+ :const_ptr? => false,
842
+ :str => "int cmock_to_return",
843
+ :void? => false
844
+ },
845
+ :name=>"TheMatrix",
846
+ :unscoped_name=>"TheMatrix",
847
+ :namespace=>[],
848
+ :class=>nil,
849
+ :modifier=>"const",
850
+ :c_calling_convention=>"__stdcall",
851
+ :contains_ptr? => true,
852
+ :args=>[ {:type=>"int", :name=>"Trinity", :ptr? => false, :const? => false, :const_ptr? => false},
853
+ {:type=>"unsigned int*", :name=>"Neo", :ptr? => true, :const? => false, :const_ptr? => false}
854
+ ],
855
+ :args_string=>"int Trinity, unsigned int* Neo",
856
+ :args_call=>"Trinity, Neo" }
857
+ assert_equal(expected, @parser.parse_declaration(@test_project, source))
858
+ end
859
+
860
+ it "extract and return function declarations inside namespace and class" do
861
+ source = "int Foo(int a, unsigned int b)"
862
+ expected = { :var_arg=>nil,
863
+ :name=>"ns1_ns2_Bar_Foo",
864
+ :unscoped_name=>"Foo",
865
+ :class=>"Bar",
866
+ :namespace=>["ns1", "ns2"],
867
+ :return=>{ :type => "int",
868
+ :name => 'cmock_to_return',
869
+ :ptr? => false,
870
+ :const? => false,
871
+ :const_ptr? => false,
872
+ :str => "int cmock_to_return",
873
+ :void? => false
874
+ },
875
+ :modifier=>"",
876
+ :contains_ptr? => false,
877
+ :args=>[ {:type=>"int", :name=>"a", :ptr? => false, :const? => false, :const_ptr? => false},
878
+ {:type=>"unsigned int", :name=>"b", :ptr? => false, :const? => false, :const_ptr? => false}
879
+ ],
880
+ :args_string=>"int a, unsigned int b",
881
+ :args_call=>"a, b" }
882
+ assert_equal(expected, @parser.parse_declaration(@test_project, source, ["ns1", "ns2"], "Bar"))
883
+ end
884
+
885
+ it "fully parse multiple prototypes" do
886
+
887
+ source = "const int TheMatrix(int Trinity, unsigned int * Neo);\n" +
888
+ "int Morpheus(int, unsigned int*);\n"
889
+
890
+ expected = [{ :var_arg=>nil,
891
+ :return=> { :type => "int",
892
+ :name => 'cmock_to_return',
893
+ :ptr? => false,
894
+ :const? => true,
895
+ :const_ptr? => false,
896
+ :str => "int cmock_to_return",
897
+ :void? => false
898
+ },
899
+ :name=>"TheMatrix",
900
+ :unscoped_name=>"TheMatrix",
901
+ :namespace=>[],
902
+ :class=>nil,
903
+ :modifier=>"const",
904
+ :contains_ptr? => true,
905
+ :args=>[ {:type=>"int", :name=>"Trinity", :ptr? => false, :const? => false, :const_ptr? => false},
906
+ {:type=>"unsigned int*", :name=>"Neo", :ptr? => true, :const? => false, :const_ptr? => false}
907
+ ],
908
+ :args_string=>"int Trinity, unsigned int* Neo",
909
+ :args_call=>"Trinity, Neo" },
910
+ { :var_arg=>nil,
911
+ :return=> { :type => "int",
912
+ :name => 'cmock_to_return',
913
+ :ptr? => false,
914
+ :const? => false,
915
+ :const_ptr? => false,
916
+ :str => "int cmock_to_return",
917
+ :void? => false
918
+ },
919
+ :name=>"Morpheus",
920
+ :unscoped_name=>"Morpheus",
921
+ :namespace=>[],
922
+ :class=>nil,
923
+ :modifier=>"",
924
+ :contains_ptr? => true,
925
+ :args=>[ {:type=>"int", :name=>"cmock_arg1", :ptr? => false, :const? => false, :const_ptr? => false},
926
+ {:type=>"unsigned int*", :name=>"cmock_arg2", :ptr? => true, :const? => false, :const_ptr? => false}
927
+ ],
928
+ :args_string=>"int cmock_arg1, unsigned int* cmock_arg2",
929
+ :args_call=>"cmock_arg1, cmock_arg2"
930
+ }]
931
+ assert_equal(expected, @parser.parse("module", source)[:functions])
932
+ end
933
+
934
+ it "not extract for mocking multiply defined prototypes" do
935
+
936
+ source = "const int TheMatrix(int Trinity, unsigned int * Neo);\n" +
937
+ "const int TheMatrix(int, unsigned int*);\n"
938
+
939
+ expected = [{ :var_arg=>nil,
940
+ :name=>"TheMatrix",
941
+ :unscoped_name=>"TheMatrix",
942
+ :namespace=>[],
943
+ :class=>nil,
944
+ :return=> { :type => "int",
945
+ :name => 'cmock_to_return',
946
+ :ptr? => false,
947
+ :const? => true,
948
+ :const_ptr? => false,
949
+ :str => "int cmock_to_return",
950
+ :void? => false
951
+ },
952
+ :modifier=>"const",
953
+ :contains_ptr? => true,
954
+ :args=>[ {:type=>"int", :name=>"Trinity", :ptr? => false, :const? => false, :const_ptr? => false},
955
+ {:type=>"unsigned int*", :name=>"Neo", :ptr? => true, :const? => false, :const_ptr? => false}
956
+ ],
957
+ :args_string=>"int Trinity, unsigned int* Neo",
958
+ :args_call=>"Trinity, Neo"
959
+ }]
960
+ assert_equal(expected, @parser.parse("module", source)[:functions])
961
+ end
962
+
963
+ it "should properly handle const before return type" do
964
+ sources = [
965
+ "const int * PorkRoast(void);\n",
966
+ "const int* PorkRoast(void);\n",
967
+ "const int *PorkRoast(void);\n"
968
+ ]
969
+
970
+ expected = [{ :var_arg => nil,
971
+ :name => "PorkRoast",
972
+ :unscoped_name => "PorkRoast",
973
+ :namespace=>[],
974
+ :class=>nil,
975
+ :return => { :type => "const int*",
976
+ :name => 'cmock_to_return',
977
+ :ptr? => true,
978
+ :const? => true,
979
+ :const_ptr? => false,
980
+ :str => "const int* cmock_to_return",
981
+ :void? => false
982
+ },
983
+ :modifier => "",
984
+ :contains_ptr? => false,
985
+ :args => [],
986
+ :args_string => "void",
987
+ :args_call => ""
988
+ }]
989
+
990
+ sources.each do |source|
991
+ assert_equal(expected, @parser.parse("module", source)[:functions])
992
+ end
993
+ end
994
+
995
+ it "should properly handle const before return type" do
996
+ sources = [
997
+ "int const * PorkRoast(void);\n",
998
+ "int const* PorkRoast(void);\n",
999
+ "int const *PorkRoast(void);\n"
1000
+ ]
1001
+
1002
+ expected = [{ :var_arg => nil,
1003
+ :name => "PorkRoast",
1004
+ :unscoped_name => "PorkRoast",
1005
+ :namespace=>[],
1006
+ :class=>nil,
1007
+ :return => { :type => "int const*",
1008
+ :name => 'cmock_to_return',
1009
+ :ptr? => true,
1010
+ :const? => true,
1011
+ :const_ptr? => false,
1012
+ :str => "int const* cmock_to_return",
1013
+ :void? => false
1014
+ },
1015
+ :modifier => "",
1016
+ :contains_ptr? => false,
1017
+ :args => [],
1018
+ :args_string => "void",
1019
+ :args_call => ""
1020
+ }]
1021
+
1022
+ sources.each do |source|
1023
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1024
+ end
1025
+ end
1026
+
1027
+ it "should properly handle const applied after asterisk in return type (not legal C, but sometimes used)" do
1028
+
1029
+ source = "int * const PorkRoast(void);\n"
1030
+
1031
+ expected = [{ :var_arg=>nil,
1032
+ :name=>"PorkRoast",
1033
+ :unscoped_name=>"PorkRoast",
1034
+ :namespace=>[],
1035
+ :class=>nil,
1036
+ :return=> { :type => "int*",
1037
+ :name => 'cmock_to_return',
1038
+ :ptr? => true,
1039
+ :const? => false,
1040
+ :const_ptr? => true,
1041
+ :str => "int* cmock_to_return",
1042
+ :void? => false
1043
+ },
1044
+ :modifier=>"const",
1045
+ :contains_ptr? => false,
1046
+ :args=>[],
1047
+ :args_string=>"void",
1048
+ :args_call=>""
1049
+ }]
1050
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1051
+ end
1052
+
1053
+ it "properly parse const and pointer argument types with no arg names" do
1054
+
1055
+ source = "void foo(int const*, int*const, const int*, const int*const, int const*const, int*, int, const int);\n"
1056
+
1057
+ expected = [{ :name => "foo",
1058
+ :unscoped_name => "foo",
1059
+ :namespace=>[],
1060
+ :class=>nil,
1061
+ :modifier => "",
1062
+ :return => { :type => "void",
1063
+ :name => "cmock_to_return",
1064
+ :str => "void cmock_to_return",
1065
+ :void? => true,
1066
+ :ptr? => false,
1067
+ :const? => false,
1068
+ :const_ptr? => false
1069
+ },
1070
+ :var_arg => nil,
1071
+ :args_string => "int const* cmock_arg1, int* const cmock_arg2, const int* cmock_arg3, const int* const cmock_arg4, " +
1072
+ "int const* const cmock_arg5, int* cmock_arg6, int cmock_arg7, const int cmock_arg8",
1073
+ :args => [{ :type=>"int const*", :name => "cmock_arg1", :ptr? => true, :const? => true, :const_ptr? => false },
1074
+ { :type=>"int*", :name => "cmock_arg2", :ptr? => true, :const? => false, :const_ptr? => true },
1075
+ { :type=>"const int*", :name => "cmock_arg3", :ptr? => true, :const? => true, :const_ptr? => false },
1076
+ { :type=>"const int*", :name => "cmock_arg4", :ptr? => true, :const? => true, :const_ptr? => true },
1077
+ { :type=>"int const*", :name => "cmock_arg5", :ptr? => true, :const? => true, :const_ptr? => true },
1078
+ { :type=>"int*", :name => "cmock_arg6", :ptr? => true, :const? => false, :const_ptr? => false },
1079
+ { :type=>"int", :name => "cmock_arg7", :ptr? => false, :const? => false, :const_ptr? => false },
1080
+ { :type=>"int", :name => "cmock_arg8", :ptr? => false, :const? => true, :const_ptr? => false }],
1081
+ :args_call => "cmock_arg1, cmock_arg2, cmock_arg3, cmock_arg4, cmock_arg5, cmock_arg6, cmock_arg7, cmock_arg8",
1082
+ :contains_ptr? => true
1083
+ }]
1084
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1085
+ end
1086
+
1087
+ it "properly parse const and pointer argument types with arg names" do
1088
+
1089
+ source = "void bar(int const* param1, int*const param2, const int* param3, const int*const param4,\n" +
1090
+ " int const*const param5, int*param6, int param7, const int param8);\n"
1091
+
1092
+ expected = [{ :name => "bar",
1093
+ :unscoped_name => "bar",
1094
+ :namespace=>[],
1095
+ :class=>nil,
1096
+ :modifier => "",
1097
+ :return => { :type => "void",
1098
+ :name => "cmock_to_return",
1099
+ :str => "void cmock_to_return",
1100
+ :void? => true,
1101
+ :ptr? => false,
1102
+ :const? => false,
1103
+ :const_ptr? => false
1104
+ },
1105
+ :var_arg => nil,
1106
+ :args_string => "int const* param1, int* const param2, const int* param3, const int* const param4, " +
1107
+ "int const* const param5, int* param6, int param7, const int param8",
1108
+ :args => [{ :type=>"int const*", :name => "param1", :ptr? => true, :const? => true, :const_ptr? => false },
1109
+ { :type=>"int*", :name => "param2", :ptr? => true, :const? => false, :const_ptr? => true },
1110
+ { :type=>"const int*", :name => "param3", :ptr? => true, :const? => true, :const_ptr? => false },
1111
+ { :type=>"const int*", :name => "param4", :ptr? => true, :const? => true, :const_ptr? => true },
1112
+ { :type=>"int const*", :name => "param5", :ptr? => true, :const? => true, :const_ptr? => true },
1113
+ { :type=>"int*", :name => "param6", :ptr? => true, :const? => false, :const_ptr? => false },
1114
+ { :type=>"int", :name => "param7", :ptr? => false, :const? => false, :const_ptr? => false },
1115
+ { :type=>"int", :name => "param8", :ptr? => false, :const? => true, :const_ptr? => false }],
1116
+ :args_call => "param1, param2, param3, param4, param5, param6, param7, param8",
1117
+ :contains_ptr? => true
1118
+ }].freeze
1119
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1120
+ end
1121
+
1122
+ it "converts typedef'd array arguments to pointers" do
1123
+
1124
+ source = "Book AddToBook(Book book, const IntArray values);\n"
1125
+
1126
+ expected = [{ :name => "AddToBook",
1127
+ :unscoped_name => "AddToBook",
1128
+ :namespace=>[],
1129
+ :class=>nil,
1130
+ :modifier=>"",
1131
+ :return => { :type => "Book",
1132
+ :name => "cmock_to_return",
1133
+ :str => "Book cmock_to_return",
1134
+ :void? => false,
1135
+ :ptr? => false,
1136
+ :const? => false,
1137
+ :const_ptr? => false
1138
+ },
1139
+ :var_arg => nil,
1140
+ :args => [{ :type => "Page*", :name => "book", :ptr? => true, :const? => false, :const_ptr? => false },
1141
+ { :type => "const int*", :name => "values", :ptr? => true, :const? => true, :const_ptr? => false }],
1142
+ :args_string => "Book book, const IntArray values",
1143
+ :args_call => "book, values",
1144
+ :contains_ptr? => true
1145
+ }]
1146
+
1147
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1148
+
1149
+ end
1150
+
1151
+ it "properly detect typedef'd variants of void and use those" do
1152
+
1153
+ source = "typedef (void) FUNKY_VOID_T;\n" +
1154
+ "typedef void CHUNKY_VOID_T;\n" +
1155
+ "FUNKY_VOID_T DrHorrible(int SingAlong);\n" +
1156
+ "int CaptainHammer(CHUNKY_VOID_T);\n"
1157
+
1158
+ expected = [{ :var_arg=>nil,
1159
+ :name=>"DrHorrible",
1160
+ :unscoped_name=>"DrHorrible",
1161
+ :namespace=>[],
1162
+ :class=>nil,
1163
+ :return => { :type => "void",
1164
+ :name => 'cmock_to_return',
1165
+ :ptr? => false,
1166
+ :const? => false,
1167
+ :const_ptr? => false,
1168
+ :str => "void cmock_to_return",
1169
+ :void? => true
1170
+ },
1171
+ :modifier=>"",
1172
+ :contains_ptr? => false,
1173
+ :args=>[ {:type=>"int", :name=>"SingAlong", :ptr? => false, :const? => false, :const_ptr? => false} ],
1174
+ :args_string=>"int SingAlong",
1175
+ :args_call=>"SingAlong"
1176
+ },
1177
+ { :var_arg=>nil,
1178
+ :return=> { :type => "int",
1179
+ :name => 'cmock_to_return',
1180
+ :ptr? => false,
1181
+ :const? => false,
1182
+ :const_ptr? => false,
1183
+ :str => "int cmock_to_return",
1184
+ :void? => false
1185
+ },
1186
+ :name=>"CaptainHammer",
1187
+ :unscoped_name=>"CaptainHammer",
1188
+ :namespace=>[],
1189
+ :class=>nil,
1190
+ :modifier=>"",
1191
+ :contains_ptr? => false,
1192
+ :args=>[ ],
1193
+ :args_string=>"void",
1194
+ :args_call=>""
1195
+ }]
1196
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1197
+ end
1198
+
1199
+ it "be ok with structs inside of function declarations" do
1200
+
1201
+ source = "int DrHorrible(struct SingAlong Blog);\n" +
1202
+ "void Penny(struct const _KeepYourHeadUp_ * const BillyBuddy);\n" +
1203
+ "struct TheseArentTheHammer CaptainHammer(void);\n"
1204
+
1205
+ expected = [{ :var_arg=>nil,
1206
+ :return =>{ :type => "int",
1207
+ :name => 'cmock_to_return',
1208
+ :ptr? => false,
1209
+ :const? => false,
1210
+ :const_ptr? => false,
1211
+ :str => "int cmock_to_return",
1212
+ :void? => false
1213
+ },
1214
+ :name=>"DrHorrible",
1215
+ :unscoped_name=>"DrHorrible",
1216
+ :namespace=>[],
1217
+ :class=>nil,
1218
+ :modifier=>"",
1219
+ :contains_ptr? => false,
1220
+ :args=>[ {:type=>"struct SingAlong", :name=>"Blog", :ptr? => false, :const? => false, :const_ptr? => false} ],
1221
+ :args_string=>"struct SingAlong Blog",
1222
+ :args_call=>"Blog"
1223
+ },
1224
+ { :var_arg=>nil,
1225
+ :return=> { :type => "void",
1226
+ :name => 'cmock_to_return',
1227
+ :ptr? => false,
1228
+ :const? => false,
1229
+ :const_ptr? => false,
1230
+ :str => "void cmock_to_return",
1231
+ :void? => true
1232
+ },
1233
+ :name=>"Penny",
1234
+ :unscoped_name=>"Penny",
1235
+ :namespace=>[],
1236
+ :class=>nil,
1237
+ :modifier=>"",
1238
+ :contains_ptr? => true,
1239
+ :args=>[ {:type=>"struct const _KeepYourHeadUp_*", :name=>"BillyBuddy", :ptr? => true, :const? => true, :const_ptr? => true} ],
1240
+ :args_string=>"struct const _KeepYourHeadUp_* const BillyBuddy",
1241
+ :args_call=>"BillyBuddy"
1242
+ },
1243
+ { :var_arg=>nil,
1244
+ :return=> { :type => "struct TheseArentTheHammer",
1245
+ :name => 'cmock_to_return',
1246
+ :ptr? => false,
1247
+ :const? => false,
1248
+ :const_ptr? => false,
1249
+ :str => "struct TheseArentTheHammer cmock_to_return",
1250
+ :void? => false
1251
+ },
1252
+ :name=>"CaptainHammer",
1253
+ :unscoped_name=>"CaptainHammer",
1254
+ :namespace=>[],
1255
+ :class=>nil,
1256
+ :modifier=>"",
1257
+ :contains_ptr? => false,
1258
+ :args=>[ ],
1259
+ :args_string=>"void",
1260
+ :args_call=>""
1261
+ }]
1262
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1263
+ end
1264
+
1265
+ it "extract functions containing unions with union specifier" do
1266
+ source = "void OrangePeel(union STARS_AND_STRIPES * a, union AFL_CIO b)"
1267
+ expected = [{ :var_arg=>nil,
1268
+ :return=>{ :type => "void",
1269
+ :name => 'cmock_to_return',
1270
+ :ptr? => false,
1271
+ :const? => false,
1272
+ :const_ptr? => false,
1273
+ :str => "void cmock_to_return",
1274
+ :void? => true
1275
+ },
1276
+ :name=>"OrangePeel",
1277
+ :unscoped_name=>"OrangePeel",
1278
+ :namespace=>[],
1279
+ :class=>nil,
1280
+ :modifier=>"",
1281
+ :contains_ptr? => true,
1282
+ :args=>[ {:type=>"union STARS_AND_STRIPES*", :name=>"a", :ptr? => true, :const? => false, :const_ptr? => false},
1283
+ {:type=>"union AFL_CIO", :name=>"b", :ptr? => false, :const? => false, :const_ptr? => false}
1284
+ ],
1285
+ :args_string=>"union STARS_AND_STRIPES* a, union AFL_CIO b",
1286
+ :args_call=>"a, b" }]
1287
+ result = @parser.parse("module", source)
1288
+ assert_equal(expected, result[:functions])
1289
+ end
1290
+
1291
+ it "not be thwarted by variables named with primitive types as part of the name" do
1292
+ source = "void ApplePeel(const unsigned int const_param, int int_param, int integer, char character, int* const constant)"
1293
+ expected = [{ :var_arg=>nil,
1294
+ :return=>{ :type => "void",
1295
+ :name => 'cmock_to_return',
1296
+ :ptr? => false,
1297
+ :const? => false,
1298
+ :const_ptr? => false,
1299
+ :str => "void cmock_to_return",
1300
+ :void? => true
1301
+ },
1302
+ :name=>"ApplePeel",
1303
+ :unscoped_name=>"ApplePeel",
1304
+ :namespace=>[],
1305
+ :class=>nil,
1306
+ :modifier=>"",
1307
+ :contains_ptr? => true,
1308
+ :args=>[ {:type=> "unsigned int", :name=>"const_param", :ptr? => false, :const? => true, :const_ptr? => false},
1309
+ {:type=>"int", :name=>"int_param", :ptr? => false, :const? => false, :const_ptr? => false},
1310
+ {:type=>"int", :name=>"integer", :ptr? => false, :const? => false, :const_ptr? => false},
1311
+ {:type=>"char", :name=>"character", :ptr? => false, :const? => false, :const_ptr? => false},
1312
+ {:type=>"int*", :name=>"constant", :ptr? => true, :const? => false, :const_ptr? => true}
1313
+ ],
1314
+ :args_string=>"const unsigned int const_param, int int_param, int integer, char character, int* const constant",
1315
+ :args_call=>"const_param, int_param, integer, character, constant" }]
1316
+ result = @parser.parse("module", source)
1317
+ assert_equal(expected, result[:functions])
1318
+ end
1319
+
1320
+ it "not be thwarted by custom types named similarly to primitive types" do
1321
+ source = "void LemonPeel(integer param, character thing, longint * junk, constant value, int32_t const number)"
1322
+ expected = [{:var_arg=>nil,
1323
+ :return=>{ :type => "void",
1324
+ :name => 'cmock_to_return',
1325
+ :ptr? => false,
1326
+ :const? => false,
1327
+ :const_ptr? => false,
1328
+ :str => "void cmock_to_return",
1329
+ :void? => true
1330
+ },
1331
+ :name=>"LemonPeel",
1332
+ :unscoped_name=>"LemonPeel",
1333
+ :namespace=>[],
1334
+ :class=>nil,
1335
+ :modifier=>"",
1336
+ :contains_ptr? => true,
1337
+ :args=>[ {:type=>"integer", :name=>"param", :ptr? => false, :const? => false, :const_ptr? => false},
1338
+ {:type=>"character", :name=>"thing", :ptr? => false, :const? => false, :const_ptr? => false},
1339
+ {:type=>"longint*", :name=>"junk", :ptr? => true, :const? => false, :const_ptr? => false},
1340
+ {:type=>"constant", :name=>"value", :ptr? => false, :const? => false, :const_ptr? => false},
1341
+ {:type=>"int32_t", :name=>"number", :ptr? => false, :const? => true, :const_ptr? => false}
1342
+ ],
1343
+ :args_string=>"integer param, character thing, longint* junk, constant value, int32_t const number",
1344
+ :args_call=>"param, thing, junk, value, number" }]
1345
+ result = @parser.parse("module", source)
1346
+ assert_equal(expected, result[:functions])
1347
+ end
1348
+
1349
+ it "handle some of those chains of C name specifiers naturally" do
1350
+ source = "void CoinOperated(signed char abc, const unsigned long int xyz_123, unsigned int const abc_123, long long arm_of_the_law)"
1351
+ expected = [{:var_arg=>nil,
1352
+ :return=>{ :type => "void",
1353
+ :name => 'cmock_to_return',
1354
+ :ptr? => false,
1355
+ :const? => false,
1356
+ :const_ptr? => false,
1357
+ :str => "void cmock_to_return",
1358
+ :void? => true
1359
+ },
1360
+ :name=>"CoinOperated",
1361
+ :unscoped_name=>"CoinOperated",
1362
+ :namespace=>[],
1363
+ :class=>nil,
1364
+ :modifier=>"",
1365
+ :contains_ptr? => false,
1366
+ :args=>[ {:type=>"signed char", :name=>"abc", :ptr? => false, :const? => false, :const_ptr? => false},
1367
+ {:type=>"unsigned long int", :name=>"xyz_123", :ptr? => false, :const? => true, :const_ptr? => false},
1368
+ {:type=>"unsigned int", :name=>"abc_123", :ptr? => false, :const? => true, :const_ptr? => false},
1369
+ {:type=>"long long", :name=>"arm_of_the_law", :ptr? => false, :const? => false, :const_ptr? => false}
1370
+ ],
1371
+ :args_string=>"signed char abc, const unsigned long int xyz_123, unsigned int const abc_123, long long arm_of_the_law",
1372
+ :args_call=>"abc, xyz_123, abc_123, arm_of_the_law" }]
1373
+ result = @parser.parse("module", source)
1374
+ assert_equal(expected, result[:functions])
1375
+ end
1376
+
1377
+ it "handle custom types of various formats" do
1378
+ source = "void CardOperated(CUSTOM_TYPE abc, CUSTOM_TYPE* xyz_123, CUSTOM_TYPE const abcxyz, struct CUSTOM_TYPE const * const abc123)"
1379
+ expected = [{:var_arg=>nil,
1380
+ :return=>{ :type => "void",
1381
+ :name => 'cmock_to_return',
1382
+ :ptr? => false,
1383
+ :const? => false,
1384
+ :const_ptr? => false,
1385
+ :str => "void cmock_to_return",
1386
+ :void? => true
1387
+ },
1388
+ :name=>"CardOperated",
1389
+ :unscoped_name=>"CardOperated",
1390
+ :namespace=>[],
1391
+ :class=>nil,
1392
+ :modifier=>"",
1393
+ :contains_ptr? => true,
1394
+ :args=>[ {:type=>"CUSTOM_TYPE", :name=>"abc", :ptr? => false, :const? => false, :const_ptr? => false},
1395
+ {:type=>"CUSTOM_TYPE*", :name=>"xyz_123", :ptr? => true, :const? => false, :const_ptr? => false},
1396
+ {:type=>"CUSTOM_TYPE", :name=>"abcxyz", :ptr? => false, :const? => true, :const_ptr? => false},
1397
+ {:type=>"struct CUSTOM_TYPE const*", :name=>"abc123", :ptr? => true, :const? => true, :const_ptr? => true}
1398
+ ],
1399
+ :args_string=>"CUSTOM_TYPE abc, CUSTOM_TYPE* xyz_123, CUSTOM_TYPE const abcxyz, struct CUSTOM_TYPE const* const abc123",
1400
+ :args_call=>"abc, xyz_123, abcxyz, abc123" }]
1401
+ result = @parser.parse("module", source)
1402
+ assert_equal(expected, result[:functions])
1403
+ end
1404
+
1405
+ it "handle arrays and treat them as pointers or strings" do
1406
+ source = 'void KeyOperated(CUSTOM_TYPE thing1[], int thing2 [ ], ' \
1407
+ 'char thing3 [][2 ][ 3], int* thing4[4], u8 thing5[((u8)((5 + 5*2)/3))])'
1408
+ expected_args = [
1409
+ { type: 'CUSTOM_TYPE*', name: 'thing1', ptr?: true, const?: false, const_ptr?: false },
1410
+ { type: 'int*', name: 'thing2', ptr?: true, const?: false, const_ptr?: false },
1411
+ # this one will likely change in the future when we improve multidimensional array support
1412
+ { type: 'char*', name: 'thing3', ptr?: false, const?: false, const_ptr?: false },
1413
+ # this one will likely change in the future when we improve multidimensional array support
1414
+ { type: 'int**', name: 'thing4', ptr?: true, const?: false, const_ptr?: false },
1415
+ { type: 'u8*', name: 'thing5', ptr?: true, const?: false, const_ptr?: false }
1416
+ ]
1417
+ expected = [{:var_arg=>nil,
1418
+ :return=>{ :type => "void",
1419
+ :name => 'cmock_to_return',
1420
+ :ptr? => false,
1421
+ :const? => false,
1422
+ :const_ptr? => false,
1423
+ :str => "void cmock_to_return",
1424
+ :void? => true
1425
+ },
1426
+ :name=>"KeyOperated",
1427
+ :unscoped_name=>"KeyOperated",
1428
+ :namespace=>[],
1429
+ :class=>nil,
1430
+ :modifier=>"",
1431
+ :contains_ptr? => true,
1432
+ :args => expected_args,
1433
+ :args_string => 'CUSTOM_TYPE* thing1, int* thing2, ' \
1434
+ 'char* thing3, int** thing4, u8* thing5',
1435
+ :args_call => 'thing1, thing2, thing3, thing4, thing5' }]
1436
+ result = @parser.parse("module", source)
1437
+ assert_equal(expected, result[:functions])
1438
+ end
1439
+
1440
+ it "give a reasonable guess when dealing with weird combinations of custom types and modifiers" do
1441
+ source = "void Cheese(unsigned CUSTOM_TYPE abc, unsigned xyz, CUSTOM_TYPE1 CUSTOM_TYPE2 pdq)"
1442
+ expected = [{:var_arg=>nil,
1443
+ :return=>{ :type => "void",
1444
+ :name => 'cmock_to_return',
1445
+ :ptr? => false,
1446
+ :const? => false,
1447
+ :const_ptr? => false,
1448
+ :str => "void cmock_to_return",
1449
+ :void? => true
1450
+ },
1451
+ :name=>"Cheese",
1452
+ :unscoped_name=>"Cheese",
1453
+ :namespace=>[],
1454
+ :class=>nil,
1455
+ :modifier=>"",
1456
+ :contains_ptr? => false,
1457
+ :args=>[ {:type=>"unsigned CUSTOM_TYPE", :name=>"abc", :ptr? => false, :const? => false, :const_ptr? => false},
1458
+ {:type=>"unsigned", :name=>"xyz", :ptr? => false, :const? => false, :const_ptr? => false},
1459
+ {:type=>"CUSTOM_TYPE1 CUSTOM_TYPE2", :name=>"pdq", :ptr? => false, :const? => false, :const_ptr? => false}
1460
+ ],
1461
+ :args_string=>"unsigned CUSTOM_TYPE abc, unsigned xyz, CUSTOM_TYPE1 CUSTOM_TYPE2 pdq",
1462
+ :args_call=>"abc, xyz, pdq" }]
1463
+ result = @parser.parse("module", source)
1464
+ assert_equal(expected, result[:functions])
1465
+ end
1466
+
1467
+ it "extract functions containing a function pointer" do
1468
+ source = "void FunkyTurkey(unsigned int (*func_ptr)(int, char))"
1469
+ expected = [{ :var_arg=>nil,
1470
+ :return=>{ :type => "void",
1471
+ :name => 'cmock_to_return',
1472
+ :ptr? => false,
1473
+ :const? => false,
1474
+ :const_ptr? => false,
1475
+ :str => "void cmock_to_return",
1476
+ :void? => true
1477
+ },
1478
+ :name=>"FunkyTurkey",
1479
+ :unscoped_name=>"FunkyTurkey",
1480
+ :namespace=>[],
1481
+ :class=>nil,
1482
+ :modifier=>"",
1483
+ :contains_ptr? => false,
1484
+ :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr", :ptr? => false, :const? => false, :const_ptr? => false}
1485
+ ],
1486
+ :args_string=>"cmock_module_func_ptr1 func_ptr",
1487
+ :args_call=>"func_ptr" }]
1488
+ typedefs = ["typedef unsigned int(*cmock_module_func_ptr1)(int, char);"]
1489
+ result = @parser.parse("module", source)
1490
+ assert_equal(expected, result[:functions])
1491
+ assert_equal(typedefs, result[:typedefs])
1492
+ end
1493
+
1494
+ it "extract functions using a function pointer with shorthand notation" do
1495
+ source = "void FunkyTurkey(unsigned int func_ptr(int, char))"
1496
+ expected = [{ :var_arg=>nil,
1497
+ :return=>{ :type => "void",
1498
+ :name => 'cmock_to_return',
1499
+ :ptr? => false,
1500
+ :const? => false,
1501
+ :const_ptr? => false,
1502
+ :str => "void cmock_to_return",
1503
+ :void? => true
1504
+ },
1505
+ :name=>"FunkyTurkey",
1506
+ :unscoped_name=>"FunkyTurkey",
1507
+ :namespace=>[],
1508
+ :class=>nil,
1509
+ :modifier=>"",
1510
+ :contains_ptr? => false,
1511
+ :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr", :ptr? => false, :const? => false, :const_ptr? => false}
1512
+ ],
1513
+ :args_string=>"cmock_module_func_ptr1 func_ptr",
1514
+ :args_call=>"func_ptr" }]
1515
+ typedefs = ["typedef unsigned int(*cmock_module_func_ptr1)(int, char);"]
1516
+ result = @parser.parse("module", source)
1517
+ assert_equal(expected, result[:functions])
1518
+ assert_equal(typedefs, result[:typedefs])
1519
+ end
1520
+
1521
+ it "extract functions containing a function pointer with a void" do
1522
+ source = "void FunkyTurkey(void (*func_ptr)(void))"
1523
+ expected = [{ :var_arg=>nil,
1524
+ :return=>{ :type => "void",
1525
+ :name => 'cmock_to_return',
1526
+ :ptr? => false,
1527
+ :const? => false,
1528
+ :const_ptr? => false,
1529
+ :str => "void cmock_to_return",
1530
+ :void? => true
1531
+ },
1532
+ :name=>"FunkyTurkey",
1533
+ :unscoped_name=>"FunkyTurkey",
1534
+ :namespace=>[],
1535
+ :class=>nil,
1536
+ :modifier=>"",
1537
+ :contains_ptr? => false,
1538
+ :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr", :ptr? => false, :const? => false, :const_ptr? => false}
1539
+ ],
1540
+ :args_string=>"cmock_module_func_ptr1 func_ptr",
1541
+ :args_call=>"func_ptr" }]
1542
+ typedefs = ["typedef void(*cmock_module_func_ptr1)(void);"]
1543
+ result = @parser.parse("module", source)
1544
+ assert_equal(expected, result[:functions])
1545
+ assert_equal(typedefs, result[:typedefs])
1546
+ end
1547
+
1548
+ it "extract functions containing a function pointer with an implied void" do
1549
+ source = "void FunkyTurkey(unsigned int (*func_ptr)())"
1550
+ expected = [{ :var_arg=>nil,
1551
+ :return=>{ :type => "void",
1552
+ :name => 'cmock_to_return',
1553
+ :ptr? => false,
1554
+ :const? => false,
1555
+ :const_ptr? => false,
1556
+ :str => "void cmock_to_return",
1557
+ :void? => true
1558
+ },
1559
+ :name=>"FunkyTurkey",
1560
+ :unscoped_name=>"FunkyTurkey",
1561
+ :namespace=>[],
1562
+ :class=>nil,
1563
+ :modifier=>"",
1564
+ :contains_ptr? => false,
1565
+ :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr", :ptr? => false, :const? => false, :const_ptr? => false}
1566
+ ],
1567
+ :args_string=>"cmock_module_func_ptr1 func_ptr",
1568
+ :args_call=>"func_ptr" }]
1569
+ typedefs = ["typedef unsigned int(*cmock_module_func_ptr1)();"]
1570
+ result = @parser.parse("module", source)
1571
+ assert_equal(expected, result[:functions])
1572
+ assert_equal(typedefs, result[:typedefs])
1573
+ end
1574
+
1575
+ it "extract functions containing a constant function pointer and a pointer in the nested arg list" do
1576
+ source = "void FunkyChicken(unsigned int (* const func_ptr)(unsigned long int * , char))"
1577
+ expected = [{ :var_arg=>nil,
1578
+ :return=>{ :type => "void",
1579
+ :name => 'cmock_to_return',
1580
+ :ptr? => false,
1581
+ :const? => false,
1582
+ :const_ptr? => false,
1583
+ :str => "void cmock_to_return",
1584
+ :void? => true
1585
+ },
1586
+ :name=>"FunkyChicken",
1587
+ :unscoped_name=>"FunkyChicken",
1588
+ :namespace=>[],
1589
+ :class=>nil,
1590
+ :modifier=>"",
1591
+ :contains_ptr? => false,
1592
+ :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr", :ptr? => false, :const? => true, :const_ptr? => false}
1593
+ ],
1594
+ :args_string=>"cmock_module_func_ptr1 const func_ptr",
1595
+ :args_call=>"func_ptr" }]
1596
+ typedefs = ["typedef unsigned int(*cmock_module_func_ptr1)(unsigned long int* , char);"]
1597
+ result = @parser.parse("module", source)
1598
+ assert_equal(expected, result[:functions])
1599
+ assert_equal(typedefs, result[:typedefs])
1600
+ end
1601
+
1602
+ # it "extract functions containing a function pointer taking a vararg" do
1603
+ # source = "void FunkyParrot(unsigned int (*func_ptr)(int, char, ...))"
1604
+ # expected = [{ :var_arg=>nil,
1605
+ # :return=>{ :type => "void",
1606
+ # :name => 'cmock_to_return',
1607
+ # :ptr? => false,
1608
+ # :const? => false,
1609
+ # :const_ptr? => false,
1610
+ # :str => "void cmock_to_return",
1611
+ # :void? => true
1612
+ # },
1613
+ # :name=>"FunkyParrot",
1614
+ # :unscoped_name=>"FunkyParrot",
1615
+ # :namespace=>[],
1616
+ # :class=>nil,
1617
+ # :modifier=>"",
1618
+ # :contains_ptr? => false,
1619
+ # :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr", :ptr? => false, :const? => false, :const_ptr? => false}
1620
+ # ],
1621
+ # :args_string=>"cmock_module_func_ptr1 func_ptr",
1622
+ # :args_call=>"func_ptr" }]
1623
+ # typedefs = ["typedef unsigned int(*cmock_module_func_ptr1)(int, char, ...);"]
1624
+ # result = @parser.parse("module", source)
1625
+ # assert_equal(expected, result[:functions])
1626
+ # assert_equal(typedefs, result[:typedefs])
1627
+ # end
1628
+
1629
+ it "extract functions containing a function pointer with extra parenthesis and two sets" do
1630
+ source = "void FunkyBudgie(int (((* func_ptr1)(int, char))), void (*func_ptr2)(void))"
1631
+ expected = [{ :var_arg=>nil,
1632
+ :return=>{ :type => "void",
1633
+ :name => 'cmock_to_return',
1634
+ :ptr? => false,
1635
+ :const? => false,
1636
+ :const_ptr? => false,
1637
+ :str => "void cmock_to_return",
1638
+ :void? => true
1639
+ },
1640
+ :name=>"FunkyBudgie",
1641
+ :unscoped_name=>"FunkyBudgie",
1642
+ :namespace=>[],
1643
+ :class=>nil,
1644
+ :modifier=>"",
1645
+ :contains_ptr? => false,
1646
+ :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr1", :ptr? => false, :const? => false, :const_ptr? => false},
1647
+ {:type=>"cmock_module_func_ptr2", :name=>"func_ptr2", :ptr? => false, :const? => false, :const_ptr? => false}
1648
+ ],
1649
+ :args_string=>"cmock_module_func_ptr1 func_ptr1, cmock_module_func_ptr2 func_ptr2",
1650
+ :args_call=>"func_ptr1, func_ptr2" }]
1651
+ typedefs = ["typedef int(*cmock_module_func_ptr1)(int, char);", "typedef void(*cmock_module_func_ptr2)(void);"]
1652
+ result = @parser.parse("module", source)
1653
+ assert_equal(expected, result[:functions])
1654
+ assert_equal(typedefs, result[:typedefs])
1655
+ end
1656
+
1657
+ it "extract functions containing a function pointers, structs and other things" do
1658
+ source = "struct mytype *FunkyRobin(uint16_t num1, uint16_t num2, void (*func_ptr1)(uint16_t num3, struct mytype2 *s));"
1659
+ expected = [{ :var_arg=>nil,
1660
+ :return=>{ :type => "struct mytype*",
1661
+ :name => 'cmock_to_return',
1662
+ :ptr? => true,
1663
+ :const? => false,
1664
+ :const_ptr? => false,
1665
+ :str => "struct mytype* cmock_to_return",
1666
+ :void? => false
1667
+ },
1668
+ :name=>"FunkyRobin",
1669
+ :unscoped_name=>"FunkyRobin",
1670
+ :namespace=>[],
1671
+ :class=>nil,
1672
+ :modifier=>"",
1673
+ :contains_ptr? => false,
1674
+ :args=>[ {:type=>"uint16_t", :name=>"num1", :ptr? => false, :const? => false, :const_ptr? => false},
1675
+ {:type=>"uint16_t", :name=>"num2", :ptr? => false, :const? => false, :const_ptr? => false},
1676
+ {:type=>"cmock_module_func_ptr1", :name=>"func_ptr1", :ptr? => false, :const? => false, :const_ptr? => false}
1677
+ ],
1678
+ :args_string=>"uint16_t num1, uint16_t num2, cmock_module_func_ptr1 func_ptr1",
1679
+ :args_call=>"num1, num2, func_ptr1" }]
1680
+ typedefs = ["typedef void(*cmock_module_func_ptr1)(uint16_t num3, struct mytype2* s);"]
1681
+ result = @parser.parse("module", source)
1682
+ assert_equal(expected, result[:functions])
1683
+ assert_equal(typedefs, result[:typedefs])
1684
+ end
1685
+
1686
+ it "extract functions containing an anonymous function pointer" do
1687
+ source = "void FunkyFowl(unsigned int (* const)(int, char))"
1688
+ expected = [{ :var_arg=>nil,
1689
+ :return=>{ :type => "void",
1690
+ :name => 'cmock_to_return',
1691
+ :ptr? => false,
1692
+ :const? => false,
1693
+ :const_ptr? => false,
1694
+ :str => "void cmock_to_return",
1695
+ :void? => true
1696
+ },
1697
+ :name=>"FunkyFowl",
1698
+ :unscoped_name=>"FunkyFowl",
1699
+ :namespace=>[],
1700
+ :class=>nil,
1701
+ :modifier=>"",
1702
+ :contains_ptr? => false,
1703
+ :args=>[ {:type=>"cmock_module_func_ptr1", :name=>"cmock_arg1", :ptr? => false, :const? => true, :const_ptr? => false}
1704
+ ],
1705
+ :args_string=>"cmock_module_func_ptr1 const cmock_arg1",
1706
+ :args_call=>"cmock_arg1" }]
1707
+ typedefs = ["typedef unsigned int(*cmock_module_func_ptr1)(int, char);"]
1708
+ result = @parser.parse("module", source)
1709
+ assert_equal(expected, result[:functions])
1710
+ assert_equal(typedefs, result[:typedefs])
1711
+ end
1712
+
1713
+ it "extract functions returning a function pointer" do
1714
+ source = "unsigned short (*FunkyPidgeon( const char op_code ))( int, long int )"
1715
+ expected = [{ :var_arg=>nil,
1716
+ :return=>{ :type => "cmock_module_func_ptr1",
1717
+ :name => 'cmock_to_return',
1718
+ :ptr? => false,
1719
+ :const? => false,
1720
+ :const_ptr? => false,
1721
+ :str => "cmock_module_func_ptr1 cmock_to_return",
1722
+ :void? => false
1723
+ },
1724
+ :name=>"FunkyPidgeon",
1725
+ :unscoped_name=>"FunkyPidgeon",
1726
+ :namespace=>[],
1727
+ :class=>nil,
1728
+ :modifier=>"",
1729
+ :contains_ptr? => false,
1730
+ :args=>[ {:type=>"char", :name=>"op_code", :ptr? => false, :const? => true, :const_ptr? => false}
1731
+ ],
1732
+ :args_string=>"const char op_code",
1733
+ :args_call=>"op_code" }]
1734
+ typedefs = ["typedef unsigned short(*cmock_module_func_ptr1)( int, long int );"]
1735
+ result = @parser.parse("module", source)
1736
+ assert_equal(expected, result[:functions])
1737
+ assert_equal(typedefs, result[:typedefs])
1738
+ end
1739
+
1740
+ it "extract functions returning a function pointer with implied void" do
1741
+ source = "unsigned short (*FunkyTweetie())()"
1742
+ expected = [{ :var_arg=>nil,
1743
+ :return=>{ :type => "cmock_module_func_ptr1",
1744
+ :name => 'cmock_to_return',
1745
+ :ptr? => false,
1746
+ :const? => false,
1747
+ :const_ptr? => false,
1748
+ :str => "cmock_module_func_ptr1 cmock_to_return",
1749
+ :void? => false
1750
+ },
1751
+ :name=>"FunkyTweetie",
1752
+ :unscoped_name=>"FunkyTweetie",
1753
+ :namespace=>[],
1754
+ :class=>nil,
1755
+ :modifier=>"",
1756
+ :contains_ptr? => false,
1757
+ :args=>[],
1758
+ :args_string=>"void",
1759
+ :args_call=>"" }]
1760
+ typedefs = ["typedef unsigned short(*cmock_module_func_ptr1)();"]
1761
+ result = @parser.parse("module", source)
1762
+ assert_equal(expected, result[:functions])
1763
+ assert_equal(typedefs, result[:typedefs])
1764
+ end
1765
+
1766
+ it "extract functions returning a function pointer where everything is a void" do
1767
+ source = "void (* FunkySeaGull(void))(void)"
1768
+ expected = [{ :var_arg=>nil,
1769
+ :return=>{ :type => "cmock_module_func_ptr1",
1770
+ :name => 'cmock_to_return',
1771
+ :ptr? => false,
1772
+ :const? => false,
1773
+ :const_ptr? => false,
1774
+ :str => "cmock_module_func_ptr1 cmock_to_return",
1775
+ :void? => false
1776
+ },
1777
+ :name=>"FunkySeaGull",
1778
+ :unscoped_name=>"FunkySeaGull",
1779
+ :namespace=>[],
1780
+ :class=>nil,
1781
+ :modifier=>"",
1782
+ :contains_ptr? => false,
1783
+ :args=>[],
1784
+ :args_string=>"void",
1785
+ :args_call=>"" }]
1786
+ typedefs = ["typedef void(*cmock_module_func_ptr1)(void);"]
1787
+ result = @parser.parse("module", source)
1788
+ assert_equal(expected, result[:functions])
1789
+ assert_equal(typedefs, result[:typedefs])
1790
+ end
1791
+
1792
+ it "extract functions returning a function pointer with some pointer nonsense" do
1793
+ source = "unsigned int * (* FunkyMacaw(double* foo, THING *bar))(unsigned int)"
1794
+ expected = [{ :var_arg=>nil,
1795
+ :return=>{ :type => "cmock_module_func_ptr1",
1796
+ :name => 'cmock_to_return',
1797
+ :ptr? => false,
1798
+ :const? => false,
1799
+ :const_ptr? => false,
1800
+ :str => "cmock_module_func_ptr1 cmock_to_return",
1801
+ :void? => false
1802
+ },
1803
+ :name=>"FunkyMacaw",
1804
+ :unscoped_name=>"FunkyMacaw",
1805
+ :namespace=>[],
1806
+ :class=>nil,
1807
+ :modifier=>"",
1808
+ :contains_ptr? => true,
1809
+ :args=>[ {:type=>"double*", :name=>"foo", :ptr? => true, :const? => false, :const_ptr? => false},
1810
+ {:type=>"THING*", :name=>"bar", :ptr? => true, :const? => false, :const_ptr? => false}
1811
+ ],
1812
+ :args_string=>"double* foo, THING* bar",
1813
+ :args_call=>"foo, bar" }]
1814
+ typedefs = ["typedef unsigned int *(*cmock_module_func_ptr1)(unsigned int);"]
1815
+ result = @parser.parse("module", source)
1816
+ assert_equal(expected, result[:functions])
1817
+ assert_equal(typedefs, result[:typedefs])
1818
+ end
1819
+
1820
+ it "extract this SQLite3 function with an anonymous function pointer arg (regression test)" do
1821
+ source = "SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*))"
1822
+ expected = [{ :var_arg=>nil,
1823
+ :return=>{ :type => "int",
1824
+ :name => "cmock_to_return",
1825
+ :ptr? => false,
1826
+ :const? => false,
1827
+ :const_ptr? => false,
1828
+ :str => "int cmock_to_return",
1829
+ :void? => false
1830
+ },
1831
+ :name=>"sqlite3_bind_text",
1832
+ :unscoped_name=>"sqlite3_bind_text",
1833
+ :namespace=>[],
1834
+ :class=>nil,
1835
+ :modifier=>"SQLITE_API",
1836
+ :contains_ptr? => true,
1837
+ :args=>[ {:type=>"sqlite3_stmt*", :name=>"cmock_arg2", :ptr? => true, :const? => false, :const_ptr? => false},
1838
+ {:type=>"int", :name=>"cmock_arg3", :ptr? => false, :const? => false, :const_ptr? => false},
1839
+ {:type=>"const char*", :name=>"cmock_arg4", :ptr? => false, :const? => true, :const_ptr? => false},
1840
+ {:type=>"int", :name=>"n", :ptr? => false, :const? => false, :const_ptr? => false},
1841
+ {:type=>"cmock_module_func_ptr1", :name=>"cmock_arg1", :ptr? => false, :const? => false, :const_ptr? => false}
1842
+ ],
1843
+ :args_string=>"sqlite3_stmt* cmock_arg2, int cmock_arg3, const char* cmock_arg4, int n, cmock_module_func_ptr1 cmock_arg1",
1844
+ :args_call=>"cmock_arg2, cmock_arg3, cmock_arg4, n, cmock_arg1" }]
1845
+ typedefs = ["typedef void(*cmock_module_func_ptr1)(void*);"]
1846
+ result = @parser.parse("module", source)
1847
+ assert_equal(expected, result[:functions])
1848
+ assert_equal(typedefs, result[:typedefs])
1849
+ end
1850
+
1851
+ it "extract functions with varargs" do
1852
+ source = "int XFiles(int Scully, int Mulder, ...);\n"
1853
+ expected = [{ :var_arg=>"...",
1854
+ :return=> { :type => "int",
1855
+ :name => 'cmock_to_return',
1856
+ :ptr? => false,
1857
+ :const? => false,
1858
+ :const_ptr? => false,
1859
+ :str => "int cmock_to_return",
1860
+ :void? => false
1861
+ },
1862
+ :name=>"XFiles",
1863
+ :unscoped_name=>"XFiles",
1864
+ :namespace=>[],
1865
+ :class=>nil,
1866
+ :modifier=>"",
1867
+ :contains_ptr? => false,
1868
+ :args=>[ {:type=>"int", :name=>"Scully", :ptr? => false, :const? => false, :const_ptr? => false},
1869
+ {:type=>"int", :name=>"Mulder", :ptr? => false, :const? => false, :const_ptr? => false}
1870
+ ],
1871
+ :args_string=>"int Scully, int Mulder",
1872
+ :args_call=>"Scully, Mulder"
1873
+ }]
1874
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1875
+ end
1876
+
1877
+ it "extract functions with void pointers" do
1878
+ source = "void* MoreSillySongs(void* stuff);\n"
1879
+ expected = [{ :var_arg=>nil,
1880
+ :return=> { :type => "void*",
1881
+ :name => 'cmock_to_return',
1882
+ :ptr? => true,
1883
+ :const? => false,
1884
+ :const_ptr? => false,
1885
+ :str => "void* cmock_to_return",
1886
+ :void? => false
1887
+ },
1888
+ :name=>"MoreSillySongs",
1889
+ :unscoped_name=>"MoreSillySongs",
1890
+ :namespace=>[],
1891
+ :class=>nil,
1892
+ :modifier=>"",
1893
+ :contains_ptr? => true,
1894
+ :args=>[ {:type=>"void*", :name=>"stuff", :ptr? => true, :const? => false, :const_ptr? => false}
1895
+ ],
1896
+ :args_string=>"void* stuff",
1897
+ :args_call=>"stuff"
1898
+ }]
1899
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1900
+ end
1901
+
1902
+ it "extract functions with strippable confusing junk like gcc attributes" do
1903
+ source = "int LaverneAndShirley(int Lenny, int Squiggy) __attribute__((weak)) __attribute__ ((deprecated));\n"
1904
+ expected = [{ :var_arg=>nil,
1905
+ :return=> { :type => "int",
1906
+ :name => 'cmock_to_return',
1907
+ :ptr? => false,
1908
+ :const? => false,
1909
+ :const_ptr? => false,
1910
+ :str => "int cmock_to_return",
1911
+ :void? => false
1912
+ },
1913
+ :name=>"LaverneAndShirley",
1914
+ :unscoped_name=>"LaverneAndShirley",
1915
+ :namespace=>[],
1916
+ :class=>nil,
1917
+ :modifier=>"",
1918
+ :contains_ptr? => false,
1919
+ :args=>[ {:type=>"int", :name=>"Lenny", :ptr? => false, :const? => false, :const_ptr? => false},
1920
+ {:type=>"int", :name=>"Squiggy", :ptr? => false, :const? => false, :const_ptr? => false}
1921
+ ],
1922
+ :args_string=>"int Lenny, int Squiggy",
1923
+ :args_call=>"Lenny, Squiggy"
1924
+ }]
1925
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1926
+ end
1927
+
1928
+ it "extract functions with strippable confusing junk like gcc attributes with parenthesis" do
1929
+ source = "int TheCosbyShow(int Cliff, int Claire) __attribute__((weak, alias (\"__f\"));\n"
1930
+ expected = [{ :var_arg=>nil,
1931
+ :return=> { :type => "int",
1932
+ :name => 'cmock_to_return',
1933
+ :ptr? => false,
1934
+ :const? => false,
1935
+ :const_ptr? => false,
1936
+ :str => "int cmock_to_return",
1937
+ :void? => false
1938
+ },
1939
+ :name=>"TheCosbyShow",
1940
+ :unscoped_name=>"TheCosbyShow",
1941
+ :namespace=>[],
1942
+ :class=>nil,
1943
+ :modifier=>"",
1944
+ :contains_ptr? => false,
1945
+ :args=>[ {:type=>"int", :name=>"Cliff", :ptr? => false, :const? => false, :const_ptr? => false},
1946
+ {:type=>"int", :name=>"Claire", :ptr? => false, :const? => false, :const_ptr? => false}
1947
+ ],
1948
+ :args_string=>"int Cliff, int Claire",
1949
+ :args_call=>"Cliff, Claire"
1950
+ }]
1951
+ assert_equal(expected, @parser.parse("module", source)[:functions])
1952
+ end
1953
+
1954
+ it "divines all permutations of ptr, const, and const_ptr correctly" do
1955
+ truth_table = [
1956
+ # argument ptr const const_ptr
1957
+ [ "constNOTconst constNOTconst", false, false, false ],
1958
+ [ "const constNOTconst constNOTconst", false, true, false ],
1959
+ [ "constNOTconst const constNOTconst", false, true, false ],
1960
+ [ "constNOTconst *constNOTconst", true, false, false ],
1961
+ [ "const constNOTconst *constNOTconst", true, true, false ],
1962
+ [ "constNOTconst const *constNOTconst", true, true, false ],
1963
+ [ "constNOTconst *const constNOTconst", true, false, true ],
1964
+ [ "const constNOTconst *const constNOTconst", true, true, true ],
1965
+ [ "constNOTconst const *const constNOTconst", true, true, true ],
1966
+ [ "constNOTconst **constNOTconst", true, false, false ],
1967
+ [ "const constNOTconst **constNOTconst", true, false, false ],
1968
+ [ "constNOTconst const **constNOTconst", true, false, false ],
1969
+ [ "constNOTconst *const *constNOTconst", true, true, false ],
1970
+ [ "const constNOTconst *const *constNOTconst", true, true, false ],
1971
+ [ "constNOTconst const *const *constNOTconst", true, true, false ],
1972
+ [ "constNOTconst **const constNOTconst", true, false, true ],
1973
+ [ "const constNOTconst **const constNOTconst", true, false, true ],
1974
+ [ "constNOTconst const **const constNOTconst", true, false, true ],
1975
+ [ "constNOTconst *const *const constNOTconst", true, true, true ],
1976
+ [ "const constNOTconst *const *const constNOTconst", true, true, true ],
1977
+ [ "constNOTconst const *const *const constNOTconst", true, true, true ]
1978
+ ]
1979
+
1980
+ truth_table.each do |entry|
1981
+ assert_equal(@parser.divine_ptr(entry[0]), entry[1])
1982
+ assert_equal(@parser.divine_const(entry[0]), entry[2])
1983
+ assert_equal(@parser.divine_ptr_and_const(entry[0]),
1984
+ { ptr?: entry[1], const?: entry[2], const_ptr?: entry[3] })
1985
+ end
1986
+ end
1987
+
1988
+ it "divines ptr correctly for string types" do
1989
+ truth_table = [
1990
+ # argument ptr
1991
+ [ "char s", false ],
1992
+ [ "const char s", false ],
1993
+ [ "char const s", false ],
1994
+ [ "char *s", false ],
1995
+ [ "const char *s", false ],
1996
+ [ "char const *s", false ],
1997
+ [ "char *const s", false ],
1998
+ [ "const char *const s", false ],
1999
+ [ "char const *const s", false ],
2000
+ [ "char **s", true ],
2001
+ [ "const char **s", true ],
2002
+ [ "char const **s", true ],
2003
+ [ "char *const *s", true ],
2004
+ [ "const char *const *s", true ],
2005
+ [ "char const *const *s", true ],
2006
+ [ "char **const s", true ],
2007
+ [ "const char **const s", true ],
2008
+ [ "char const **const s", true ],
2009
+ [ "char *const *const s", true ],
2010
+ [ "const char *const *const s", true ],
2011
+ [ "char const *const *const s", true ]
2012
+ ]
2013
+
2014
+ truth_table.each do |entry|
2015
+ assert_equal(@parser.divine_ptr(entry[0]), entry[1])
2016
+ end
2017
+ end
2018
+
2019
+ it "Transform inline functions only removes comments from a header with no inlines" do
2020
+ # We remove the comments from the header, this is to protect the parser from wrongfully recognizing inline functions
2021
+ source =
2022
+ "#ifndef _NOINCLUDES\n" +
2023
+ "#define _NOINCLUDES\n" +
2024
+ "#include \"unity.h\"\n" +
2025
+ "#include \"cmock.h\"\n" +
2026
+ "#include \"YetAnotherHeader.h\"\n" +
2027
+ "\n" +
2028
+ "/* Ignore the following warnings since we are copying code */\n" +
2029
+ "#if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__)\n" +
2030
+ "#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))\n" +
2031
+ "#pragma GCC diagnostic push\n" +
2032
+ "#endif\n" +
2033
+ "#if !defined(__clang__)\n" +
2034
+ "#pragma GCC diagnostic ignored \"-Wpragmas\"\n" +
2035
+ "#endif\n" +
2036
+ "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n" +
2037
+ "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n" +
2038
+ "#endif\n" +
2039
+ "\n" +
2040
+ "struct my_struct {\n" +
2041
+ "int a;\n" +
2042
+ "int b;\n" +
2043
+ "int b;\n" +
2044
+ "char c;\n" +
2045
+ "};\n" +
2046
+ "int my_function(int a);\n" +
2047
+ "int my_better_function(struct my_struct *s);\n" +
2048
+ "\n" +
2049
+ "#endif _NOINCLUDES\n"
2050
+
2051
+ expected =
2052
+ "#ifndef _NOINCLUDES\n" +
2053
+ "#define _NOINCLUDES\n" +
2054
+ "#include \"unity.h\"\n" +
2055
+ "#include \"cmock.h\"\n" +
2056
+ "#include \"YetAnotherHeader.h\"\n" +
2057
+ "\n" +
2058
+ "\n" + # Removed comment
2059
+ "#if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__)\n" +
2060
+ "#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))\n" +
2061
+ "#pragma GCC diagnostic push\n" +
2062
+ "#endif\n" +
2063
+ "#if !defined(__clang__)\n" +
2064
+ "#pragma GCC diagnostic ignored \"-Wpragmas\"\n" +
2065
+ "#endif\n" +
2066
+ "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n" +
2067
+ "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n" +
2068
+ "#endif\n" +
2069
+ "\n" +
2070
+ "struct my_struct {\n" +
2071
+ "int a;\n" +
2072
+ "int b;\n" +
2073
+ "int b;\n" +
2074
+ "char c;\n" +
2075
+ "};\n" +
2076
+ "int my_function(int a);\n" +
2077
+ "int my_better_function(struct my_struct *s);\n" +
2078
+ "\n" +
2079
+ "#endif _NOINCLUDES\n"
2080
+
2081
+ assert_equal(expected, @parser.transform_inline_functions(source))
2082
+ end
2083
+
2084
+ it "Transform inline functions changes inline functions to function declarations" do
2085
+ source =
2086
+ "#ifndef _NOINCLUDES\n" +
2087
+ "#define _NOINCLUDES\n" +
2088
+ "#include \"unity.h\"\n" +
2089
+ "#include \"cmock.h\"\n" +
2090
+ "#include \"YetAnotherHeader.h\"\n" +
2091
+ "\n" +
2092
+ "/* Ignore the following warnings since we are copying code */\n" +
2093
+ "#if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__)\n" +
2094
+ "#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))\n" +
2095
+ "#pragma GCC diagnostic push\n" +
2096
+ "#endif\n" +
2097
+ "#if !defined(__clang__)\n" +
2098
+ "#pragma GCC diagnostic ignored \"-Wpragmas\"\n" +
2099
+ "#endif\n" +
2100
+ "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n" +
2101
+ "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n" +
2102
+ "#endif\n" +
2103
+ "\n" +
2104
+ "struct my_struct {\n" +
2105
+ "int a;\n" +
2106
+ "int b;\n" +
2107
+ "int b;\n" +
2108
+ "char c;\n" +
2109
+ "};\n" +
2110
+ "int my_function(int a);\n" +
2111
+ "int my_better_function(struct my_struct *s);\n" +
2112
+ "static inline int staticinlinebar(struct my_struct *s)\n" + # This is a function with a lot of indentation levels, we should be able to handle it
2113
+ "{\n" +
2114
+ "\t{\n" +
2115
+ "\t\t{\n" +
2116
+ "\t\t\treturn s->a;\n" +
2117
+ "\t\t}\n" +
2118
+ "\t}\n" +
2119
+ "}\n" +
2120
+ "static inline int staticinlinefunc(struct my_struct *s)\n" +
2121
+ "{\n" +
2122
+ " return s->a;\n" +
2123
+ "}\n" +
2124
+ "int bar(struct my_struct *s);\n" + # A normal function to screw with our parser
2125
+ "inline static int inlinestaticfunc(int a) {\n" +
2126
+ " return a + 42;\n" +
2127
+ "}\n" +
2128
+ "inline int StaticInlineFunc(struct my_struct *s)\n" +
2129
+ "{\n" +
2130
+ " return get_member_a(s) + 42;\n" +
2131
+ "}\n" +
2132
+ "int inline StaticInlineBar(struct my_struct *s)\n" +
2133
+ "{\n" +
2134
+ " return get_member_a(s) + 42;\n" +
2135
+ "}\n" +
2136
+ "struct staticinlinestruct {\n" + # Add a structure declaration between the inline functions, just to make sure we don't touch it!
2137
+ "int a;\n" +
2138
+ "};\n" +
2139
+ "\n" +
2140
+ "struct staticinlinestruct fubarstruct(struct my_struct *s);\n" + # Another normal function to screw with our parser
2141
+ "static inline struct staticinlinestruct inlinefubarfunction(struct my_struct *s)\n" +
2142
+ "{\n" +
2143
+ " return (struct staticinlinestruct)*s;\n" +
2144
+ "}\n" +
2145
+ "int fubar(struct my_struct *s);\n" + # Another normal function to screw with our parser
2146
+ "inline int stuff(int num)" +
2147
+ "{" +
2148
+ " int reg = 0x12;" +
2149
+ " if (num > 0)" +
2150
+ " {" +
2151
+ " reg |= (0x0Eu);" +
2152
+ " }" +
2153
+ " else" +
2154
+ " {" +
2155
+ " reg |= (0x07u);" +
2156
+ " }" +
2157
+ " return reg;" +
2158
+ "}" +
2159
+ "\n" +
2160
+ "int inline static dummy_func_2(int a, char b, float c) {" + # This is a sneaky one, inline static is placed AFTER the return value
2161
+ " c += 3.14;" +
2162
+ " b -= 32;" +
2163
+ " return a + (int)(b) + (int)c;" +
2164
+ "}" +
2165
+ "#endif _NOINCLUDES\n"
2166
+
2167
+ expected =
2168
+ "#ifndef _NOINCLUDES\n" +
2169
+ "#define _NOINCLUDES\n" +
2170
+ "#include \"unity.h\"\n" +
2171
+ "#include \"cmock.h\"\n" +
2172
+ "#include \"YetAnotherHeader.h\"\n" +
2173
+ "\n" +
2174
+ "\n" + # Removed comment
2175
+ "#if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__)\n" +
2176
+ "#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))\n" +
2177
+ "#pragma GCC diagnostic push\n" +
2178
+ "#endif\n" +
2179
+ "#if !defined(__clang__)\n" +
2180
+ "#pragma GCC diagnostic ignored \"-Wpragmas\"\n" +
2181
+ "#endif\n" +
2182
+ "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n" +
2183
+ "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n" +
2184
+ "#endif\n" +
2185
+ "\n" +
2186
+ "struct my_struct {\n" +
2187
+ "int a;\n" +
2188
+ "int b;\n" +
2189
+ "int b;\n" +
2190
+ "char c;\n" +
2191
+ "};\n" +
2192
+ "int my_function(int a);\n" +
2193
+ "int my_better_function(struct my_struct *s);\n" +
2194
+ "int staticinlinebar(struct my_struct *s);\n" +
2195
+ "int staticinlinefunc(struct my_struct *s);\n" +
2196
+ "int bar(struct my_struct *s);\n" +
2197
+ "int inlinestaticfunc(int a);\n" +
2198
+ "int StaticInlineFunc(struct my_struct *s);\n" +
2199
+ "int StaticInlineBar(struct my_struct *s);\n" +
2200
+ "struct staticinlinestruct {\n" +
2201
+ "int a;\n" +
2202
+ "};\n" +
2203
+ "\n" +
2204
+ "struct staticinlinestruct fubarstruct(struct my_struct *s);\n" +
2205
+ "struct staticinlinestruct inlinefubarfunction(struct my_struct *s);\n" +
2206
+ "int fubar(struct my_struct *s);\n" +
2207
+ "int stuff(int num);\n" +
2208
+ "int dummy_func_2(int a, char b, float c);" +
2209
+ "#endif _NOINCLUDES\n"
2210
+
2211
+ assert_equal(expected, @parser.transform_inline_functions(source))
2212
+ end
2213
+
2214
+ it "Transform inline functions leaves static variables" do
2215
+ source =
2216
+ "#ifndef _NOINCLUDES\n" +
2217
+ "#define _NOINCLUDES\n" +
2218
+ "#include \"unity.h\"\n" +
2219
+ "#include \"cmock.h\"\n" +
2220
+ "#include \"YetAnotherHeader.h\"\n" +
2221
+ "\n" +
2222
+ "/* Ignore the following warnings since we are copying code */\n" +
2223
+ "#if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__)\n" +
2224
+ "#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))\n" +
2225
+ "#pragma GCC diagnostic push\n" +
2226
+ "#endif\n" +
2227
+ "#if !defined(__clang__)\n" +
2228
+ "#pragma GCC diagnostic ignored \"-Wpragmas\"\n" +
2229
+ "#endif\n" +
2230
+ "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n" +
2231
+ "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n" +
2232
+ "#endif\n" +
2233
+ "\n" +
2234
+ "int my_function(int a);\n" +
2235
+ "static inline int staticinlinefunc(struct my_struct *s)\n" +
2236
+ "{\n" +
2237
+ " return s->a;\n" +
2238
+ "}\n" +
2239
+ "static const int my_variable = 5;\n" +
2240
+ "struct my_struct {\n" +
2241
+ "int a;\n" +
2242
+ "int b;\n" +
2243
+ "int b;\n" +
2244
+ "char c;\n" +
2245
+ "};\n" +
2246
+ "#endif _NOINCLUDES\n"
2247
+
2248
+ expected =
2249
+ "#ifndef _NOINCLUDES\n" +
2250
+ "#define _NOINCLUDES\n" +
2251
+ "#include \"unity.h\"\n" +
2252
+ "#include \"cmock.h\"\n" +
2253
+ "#include \"YetAnotherHeader.h\"\n" +
2254
+ "\n" +
2255
+ "\n" + #The comments are now removed
2256
+ "#if defined(__GNUC__) && !defined(__ICC) && !defined(__TMS470__)\n" +
2257
+ "#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))\n" +
2258
+ "#pragma GCC diagnostic push\n" +
2259
+ "#endif\n" +
2260
+ "#if !defined(__clang__)\n" +
2261
+ "#pragma GCC diagnostic ignored \"-Wpragmas\"\n" +
2262
+ "#endif\n" +
2263
+ "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n" +
2264
+ "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n" +
2265
+ "#endif\n" +
2266
+ "\n" +
2267
+ "int my_function(int a);\n" +
2268
+ "int staticinlinefunc(struct my_struct *s);\n" +
2269
+ "static const int my_variable = 5;\n" +
2270
+ "struct my_struct {\n" +
2271
+ "int a;\n" +
2272
+ "int b;\n" +
2273
+ "int b;\n" +
2274
+ "char c;\n" +
2275
+ "};\n" +
2276
+ "#endif _NOINCLUDES\n"
2277
+
2278
+ assert_equal(expected, @parser.transform_inline_functions(source))
2279
+ end
2280
+
2281
+ it "Count number of pairs of braces in function succesfully" do
2282
+ source =
2283
+ "int foo(struct my_struct *s)\n" +
2284
+ "{\n" +
2285
+ " return get_member_a(s) + 42;\n" +
2286
+ "}\n"
2287
+ complex_source =
2288
+ "int bar(struct my_struct *s)\n" +
2289
+ "{\n" +
2290
+ "\tint a = 6;\n" +
2291
+ "\tint res = foo(&(struct my_struct){.nr = a});\n" +
2292
+ "\t{\n" +
2293
+ "\t\tint a = 5;\n" +
2294
+ "\t\tint res = foo(&(struct my_struct){.nr = a});\n" +
2295
+ "\t\t{\n" +
2296
+ "\t\t\tstruct my_struct a = {.nr = 1};\n" +
2297
+ "\t\t}\n" +
2298
+ "\t}\n" +
2299
+ "\treturn 42;\n" +
2300
+ "}\n"
2301
+
2302
+ assert_equal(1, @parser.count_number_of_pairs_of_braces_in_function(source))
2303
+ assert_equal(6, @parser.count_number_of_pairs_of_braces_in_function(complex_source))
2304
+ end
2305
+
2306
+ it "Count number of pairs of braces returns 0 if bad source is supplied" do
2307
+ bad_source_0 =
2308
+ "int foo(struct my_struct *s)\n" +
2309
+ "{\n" +
2310
+ " return get_member_a(s) + 42;\n" +
2311
+ "\n" # Missing closing brace
2312
+ bad_source_1 =
2313
+ "int bar(struct my_struct *s)\n" +
2314
+ "{\n" +
2315
+ "\tint a = 6;\n" +
2316
+ "\tint res = foo(&(struct my_struct){.nr = a});\n" +
2317
+ "\t{\n" +
2318
+ "\t\tint a = 5;\n" +
2319
+ "\t\tint res = foo(&(struct my_struct){.nr = a});\n" +
2320
+ "\t\t{\n" +
2321
+ "\t\t\n" + # Missing closing brace
2322
+ "\t}\n" +
2323
+ "\treturn 42;\n" +
2324
+ "}\n"
2325
+ bad_source_2 =
2326
+ "int foo(struct my_struct *s)\n" +
2327
+ "\n" # No braces in source
2328
+
2329
+ assert_equal(0, @parser.count_number_of_pairs_of_braces_in_function(bad_source_0))
2330
+ assert_equal(0, @parser.count_number_of_pairs_of_braces_in_function(bad_source_1))
2331
+ assert_equal(0, @parser.count_number_of_pairs_of_braces_in_function(bad_source_2))
2332
+ end
2333
+
2334
+ it "handles parsing multiline functions" do
2335
+ source = "int\nLaverneAndShirley(int Lenny,\n int Squiggy);\n"
2336
+ expected = [{ :var_arg=>nil,
2337
+ :return=> { :type => "int",
2338
+ :name => 'cmock_to_return',
2339
+ :ptr? => false,
2340
+ :const? => false,
2341
+ :const_ptr? => false,
2342
+ :str => "int cmock_to_return",
2343
+ :void? => false
2344
+ },
2345
+ :name=>"LaverneAndShirley",
2346
+ :unscoped_name=>"LaverneAndShirley",
2347
+ :namespace=>[],
2348
+ :class=>nil,
2349
+ :modifier=>"",
2350
+ :contains_ptr? => false,
2351
+ :args=>[ {:type=>"int", :name=>"Lenny", :ptr? => false, :const? => false, :const_ptr? => false},
2352
+ {:type=>"int", :name=>"Squiggy", :ptr? => false, :const? => false, :const_ptr? => false}
2353
+ ],
2354
+ :args_string=>"int Lenny, int Squiggy",
2355
+ :args_call=>"Lenny, Squiggy"
2356
+ }]
2357
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2358
+ end
2359
+
2360
+ it "imports C++ differently when asked" do
2361
+ source =
2362
+ [
2363
+ "namespace ns1 {\n",
2364
+ " namespace ns2 {\n",
2365
+ "\n",
2366
+ " class cls1 {\n",
2367
+ " public:\n",
2368
+ " int f_header_impl(int a, int b){\n",
2369
+ " return a + b;\n",
2370
+ " }\n",
2371
+ "\n",
2372
+ " static void f_void();\n",
2373
+ " static int f_ret_simple();\n",
2374
+ "\n",
2375
+ " protected:\n",
2376
+ " static void protected_f_void();\n",
2377
+ "\n",
2378
+ " public:\n",
2379
+ " private:\n",
2380
+ " static void private_f_void();\n",
2381
+ " }; // cls1\n",
2382
+ " } // ns2\n",
2383
+ "} // ns1\n"
2384
+ ].join
2385
+
2386
+ expected =
2387
+ [
2388
+ "namespace ns1 { namespace ns2 { class cls1 { public: int f_header_impl",
2389
+ "static void f_void()",
2390
+ "static int f_ret_simple()",
2391
+ "protected: static void protected_f_void()",
2392
+ "public: private: static void private_f_void()",
2393
+ "}",
2394
+ "} }"
2395
+ ]
2396
+
2397
+ assert_equal(expected, @parser.import_source(source, @test_project, cpp=true))
2398
+ refute_equal(expected, @parser.import_source(source, @test_project))
2399
+ end
2400
+
2401
+ # only so parse_functions does not raise an error
2402
+ def dummy_source
2403
+ "void dummy(void);"
2404
+ end
2405
+
2406
+ # Expected result of above
2407
+ def dummy_func
2408
+ { :name => "dummy",
2409
+ :unscoped_name => "dummy",
2410
+ :class => nil,
2411
+ :namespace => [],
2412
+ :var_arg => nil,
2413
+ :args_string => "void",
2414
+ :args => [],
2415
+ :args_call => "",
2416
+ :contains_ptr? => false,
2417
+ :modifier => "",
2418
+ :return => {
2419
+ :type => "void",
2420
+ :name => "cmock_to_return",
2421
+ :str => "void cmock_to_return",
2422
+ :void? => true,
2423
+ :ptr? => false,
2424
+ :const? => false,
2425
+ :const_ptr? => false}}
2426
+ end
2427
+
2428
+ # Commonly used example function
2429
+ def voidvoid_func(namespace=[], name="Classic_functional")
2430
+ { :name => name,
2431
+ :unscoped_name => "functional",
2432
+ :class => "Classic",
2433
+ :namespace => namespace,
2434
+ :var_arg => nil,
2435
+ :args_string => "void",
2436
+ :args => [],
2437
+ :args_call => "",
2438
+ :contains_ptr? => false,
2439
+ :modifier => "",
2440
+ :return => {
2441
+ :type=>"void",
2442
+ :name=>"cmock_to_return",
2443
+ :str=>"void cmock_to_return",
2444
+ :void? => true,
2445
+ :ptr? => false,
2446
+ :const? => false,
2447
+ :const_ptr? => false}}
2448
+ end
2449
+
2450
+ it "parses public C++ functions" do
2451
+ source = dummy_source + <<~SOURCE
2452
+ class Classic {
2453
+ public:
2454
+ static void functional(void);
2455
+ };
2456
+ SOURCE
2457
+
2458
+ expected = [dummy_func, voidvoid_func]
2459
+
2460
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2461
+ end
2462
+
2463
+ it "handles a namespace" do
2464
+ source = dummy_source + <<~SOURCE
2465
+ namespace ns1 {
2466
+ class Classic {
2467
+ public:
2468
+ static void functional(void);
2469
+ };
2470
+ } // ns1
2471
+ SOURCE
2472
+
2473
+ expected = [dummy_func,
2474
+ voidvoid_func(namespace=["ns1"], name="ns1_Classic_functional")]
2475
+
2476
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2477
+ end
2478
+
2479
+ it "handles nested namespaces" do
2480
+ source = dummy_source + <<~SOURCE
2481
+ namespace ns1 {
2482
+ namespace ns2 {
2483
+ class Classic {
2484
+ public:
2485
+ static void functional(void);
2486
+ };
2487
+ } // ns1
2488
+ } // ns1
2489
+ SOURCE
2490
+
2491
+ expected = [dummy_func,
2492
+ voidvoid_func(namespace=["ns1", "ns2"], name="ns1_ns2_Classic_functional")]
2493
+
2494
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2495
+ end
2496
+
2497
+ it "ignores non-static C++ functions" do
2498
+ source = dummy_source + <<~SOURCE
2499
+ class Classic {
2500
+ public:
2501
+ void functional(void);
2502
+ };
2503
+ SOURCE
2504
+
2505
+ expected = [dummy_func]
2506
+
2507
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2508
+ end
2509
+
2510
+ it "ignores private functions" do
2511
+ source = dummy_source + <<~SOURCE
2512
+ class Classic {
2513
+ private:
2514
+ static void functional(void);
2515
+ };
2516
+ SOURCE
2517
+
2518
+ expected = [dummy_func]
2519
+
2520
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2521
+ end
2522
+
2523
+ it "parses public C++ functions after private functions" do
2524
+ source = dummy_source + <<~SOURCE
2525
+ class Classic {
2526
+ private:
2527
+ static void ignoreme(void);
2528
+ public:
2529
+ static void functional(void);
2530
+ };
2531
+ SOURCE
2532
+
2533
+ expected = [dummy_func, voidvoid_func]
2534
+
2535
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2536
+ end
2537
+
2538
+ it "ignores protected functions" do
2539
+ source = dummy_source + <<~SOURCE
2540
+ class Classic {
2541
+ protected:
2542
+ static void functional(void);
2543
+ };
2544
+ SOURCE
2545
+
2546
+ expected = [dummy_func]
2547
+
2548
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2549
+ end
2550
+
2551
+ it "parses public C++ functions after protected functions" do
2552
+ source = dummy_source + <<~SOURCE
2553
+ class Classic {
2554
+ protected:
2555
+ static void ignoreme(void);
2556
+ public:
2557
+ static void functional(void);
2558
+ };
2559
+ SOURCE
2560
+
2561
+ expected = [dummy_func, voidvoid_func]
2562
+
2563
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2564
+ end
2565
+
2566
+ it "parses multiple classes in same file with uniquely named functions" do
2567
+ source = dummy_source + <<~SOURCE
2568
+ namespace ns1 {
2569
+ class Classic {
2570
+ public:
2571
+ static void functional(void);
2572
+ };
2573
+
2574
+ class Classical {
2575
+ public:
2576
+ static int functionality(int a);
2577
+ };
2578
+ } // ns1
2579
+
2580
+ class Classy {
2581
+ public:
2582
+ static int* func(int* a);
2583
+ };
2584
+ SOURCE
2585
+
2586
+ expected = [dummy_func,
2587
+ voidvoid_func(["ns1"], name="ns1_Classic_functional"),
2588
+ { :name => "ns1_Classical_functionality",
2589
+ :unscoped_name => "functionality",
2590
+ :class => "Classical",
2591
+ :namespace => ["ns1"],
2592
+ :var_arg => nil,
2593
+ :args_string => "int a",
2594
+ :args => [
2595
+ { :ptr? => false,
2596
+ :const? => false,
2597
+ :const_ptr? => false,
2598
+ :name => "a",
2599
+ :type => "int"}],
2600
+ :args_call => "a",
2601
+ :contains_ptr? => false,
2602
+ :modifier => "",
2603
+ :return => {
2604
+ :type=>"int",
2605
+ :name=>"cmock_to_return",
2606
+ :str=>"int cmock_to_return",
2607
+ :void? => false,
2608
+ :ptr? => false,
2609
+ :const? => false,
2610
+ :const_ptr? => false}},
2611
+ { :name => "Classy_func",
2612
+ :unscoped_name => "func",
2613
+ :class => "Classy",
2614
+ :namespace => [],
2615
+ :var_arg => nil,
2616
+ :args_string => "int* a",
2617
+ :args => [
2618
+ { :ptr? => true,
2619
+ :const? => false,
2620
+ :const_ptr? => false,
2621
+ :name => "a",
2622
+ :type => "int*"}],
2623
+ :args_call => "a",
2624
+ :contains_ptr? => true,
2625
+ :modifier => "",
2626
+ :return => {
2627
+ :type=>"int*",
2628
+ :name=>"cmock_to_return",
2629
+ :str=>"int* cmock_to_return",
2630
+ :void? => false,
2631
+ :ptr? => true,
2632
+ :const? => false,
2633
+ :const_ptr? => false}}]
2634
+
2635
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2636
+ end
2637
+
2638
+ it "handles multiple classes in same file with identically named functions" do
2639
+ source = dummy_source + <<~SOURCE
2640
+ namespace ns1 {
2641
+ class Classic {
2642
+ public:
2643
+ static void functional(void);
2644
+ };
2645
+
2646
+ class Classical {
2647
+ public:
2648
+ static int functional(int a);
2649
+ };
2650
+ } // ns1
2651
+
2652
+ class Classy {
2653
+ public:
2654
+ static int* functional(int* a);
2655
+ };
2656
+ SOURCE
2657
+
2658
+ expected = [dummy_func,
2659
+ voidvoid_func(["ns1"], name="ns1_Classic_functional"),
2660
+ { :name => "ns1_Classical_functional",
2661
+ :unscoped_name => "functional",
2662
+ :class => "Classical",
2663
+ :namespace => ["ns1"],
2664
+ :var_arg => nil,
2665
+ :args_string => "int a",
2666
+ :args => [
2667
+ { :ptr? => false,
2668
+ :const? => false,
2669
+ :const_ptr? => false,
2670
+ :name => "a",
2671
+ :type => "int"}],
2672
+ :args_call => "a",
2673
+ :contains_ptr? => false,
2674
+ :modifier => "",
2675
+ :return => {
2676
+ :type=>"int",
2677
+ :name=>"cmock_to_return",
2678
+ :str=>"int cmock_to_return",
2679
+ :void? => false,
2680
+ :ptr? => false,
2681
+ :const? => false,
2682
+ :const_ptr? => false}},
2683
+ { :name => "Classy_functional",
2684
+ :unscoped_name => "functional",
2685
+ :class => "Classy",
2686
+ :namespace => [],
2687
+ :var_arg => nil,
2688
+ :args_string => "int* a",
2689
+ :args => [
2690
+ { :ptr? => true,
2691
+ :const? => false,
2692
+ :const_ptr? => false,
2693
+ :name => "a",
2694
+ :type => "int*"}],
2695
+ :args_call => "a",
2696
+ :contains_ptr? => true,
2697
+ :modifier => "",
2698
+ :return => {
2699
+ :type=>"int*",
2700
+ :name=>"cmock_to_return",
2701
+ :str=>"int* cmock_to_return",
2702
+ :void? => false,
2703
+ :ptr? => true,
2704
+ :const? => false,
2705
+ :const_ptr? => false}}]
2706
+
2707
+ assert_equal(expected, @parser.parse("module", source)[:functions])
2708
+ end
2709
+
2710
+ it "Transform inline functions can handle inline function declarations" do
2711
+ source =
2712
+ "static inline int dummy_func_decl(int a, char b, float c);\n" + # First declaration
2713
+ "static inline int dummy_func_decl2(int a, char b, float c)\n\n\n\n\n\n;\n" + # Second declaration with a lot of newlines before the semicolon to mess with the parser
2714
+ "static inline int staticinlinefunc(struct my_struct *s)\n" + # 'normal' inline pattern
2715
+ "{\n" +
2716
+ " return dummy_func_decl(1, 1, 1);\n" +
2717
+ "}\n" +
2718
+ "struct my_struct_with_inline_in_it\n" + # struct definition in between to mess with the parser
2719
+ "{\n" +
2720
+ " int a;\n" +
2721
+ " char b;\n" +
2722
+ " float inlineb;\n" +
2723
+ "};\n" +
2724
+ "static inline int dummy_func_decl(int a, char b, float c) {\n" + # Second user pattern
2725
+ " return 42;\n" +
2726
+ "}\n" +
2727
+ "\n"
2728
+
2729
+ expected =
2730
+ "int dummy_func_decl(int a, char b, float c);\n" +
2731
+ "int dummy_func_decl2(int a, char b, float c)\n\n\n\n\n\n;\n" + # Second declaration with a lot of newlines until the semicolon to mess with the parser
2732
+ "int staticinlinefunc(struct my_struct *s);\n" +
2733
+ "struct my_struct_with_inline_in_it\n" +
2734
+ "{\n" +
2735
+ " int a;\n" +
2736
+ " char b;\n" +
2737
+ " float inlineb;\n" +
2738
+ "};\n" +
2739
+ "int dummy_func_decl(int a, char b, float c);\n" +
2740
+ "\n"
2741
+
2742
+ @parser.treat_inlines = :include
2743
+ assert_equal(expected, @parser.transform_inline_functions(source))
2744
+ end
2745
+
2746
+ it "Transform inline functions can handle header with only inline function declarations" do
2747
+ source =
2748
+ "static inline int dummy_func_decl(int a, char b, float c);\n" +
2749
+ "\n"
2750
+
2751
+ expected =
2752
+ "int dummy_func_decl(int a, char b, float c);\n" +
2753
+ "\n"
2754
+
2755
+ @parser.treat_inlines = :include
2756
+ assert_equal(expected, @parser.transform_inline_functions(source))
2757
+ end
2758
+
2759
+ it "Transform inline functions using gnu attribute notation" do
2760
+ source =
2761
+ "static __inline__ __attribute__ ((always_inline)) uint16_t _somefunc (uint32_t a)\n" +
2762
+ "{\n" +
2763
+ " return _someotherfunc (a);\n" +
2764
+ "}\n" +
2765
+ "static __attribute__ (( always_inline )) uint16_t _somefunc_0 (uint32_t a)\n" +
2766
+ "{\n" +
2767
+ " return (uint16_t) a;\n" +
2768
+ "}\n" +
2769
+ "\n"
2770
+
2771
+ expected =
2772
+ "uint16_t _somefunc (uint32_t a);\n" +
2773
+ "uint16_t _somefunc_0 (uint32_t a);\n" +
2774
+ "\n"
2775
+
2776
+ @parser.treat_inlines = :include
2777
+ @parser.inline_function_patterns = ['(?:static\s*)?(?:__inline__)?__attribute__\s*\([ (]*always_inline[ )]*\)', 'static __inline__']
2778
+ assert_equal(expected, @parser.transform_inline_functions(source))
2779
+ end
2780
+
2781
+ it "Transform inline functions takes user provided patterns into account" do
2782
+ source =
2783
+ "static __inline__ __attribute__ ((always_inline)) uint16_t _somefunc (uint32_t a)\n" +
2784
+ "{\n" +
2785
+ " return _someotherfunc (a);\n" +
2786
+ "}\n" +
2787
+ "static __inline__ uint16_t _somefunc_0 (uint32_t a)\n" +
2788
+ "{\n" +
2789
+ " return (uint16_t) a;\n" +
2790
+ "}\n" +
2791
+ "\n"
2792
+
2793
+ expected =
2794
+ "uint16_t _somefunc (uint32_t a);\n" +
2795
+ "uint16_t _somefunc_0 (uint32_t a);\n" +
2796
+ "\n"
2797
+
2798
+ @parser.treat_inlines = :include
2799
+ @parser.inline_function_patterns = ['static __inline__ __attribute__ \(\(always_inline\)\)', 'static __inline__']
2800
+ assert_equal(expected, @parser.transform_inline_functions(source))
2801
+ end
2802
+
2803
+ it "Transform inline functions limits deleting user macro to actual line/word" do
2804
+ source =
2805
+ "#if defined (FORCE_INLINE)\n" +
2806
+ "#define MY_LIBRARY_INLINE static __inline__ __attribute__ ((always_inline))\n" +
2807
+ "#else\n" +
2808
+ "#define MY_LIBRARY_INLINE\n" +
2809
+ "#endif\n" +
2810
+ "#define INLINE static __inline__ __attribute__ ((always_inline))\n" +
2811
+ "#define INLINE_TWO \\\nstatic\\\ninline\n" +
2812
+ "INLINE uint16_t _somefunc (uint32_t a)\n" +
2813
+ "{\n" +
2814
+ " return _someotherfunc (a);\n" +
2815
+ "}\n" +
2816
+ "static __inline__ uint16_t _somefunc_0 (uint32_t a)\n" +
2817
+ "{\n" +
2818
+ " return (uint16_t) a;\n" +
2819
+ "}\n" +
2820
+ "static __inline__ __attribute__ \(\(always_inline\)\) uint16_t _somefunc_1 (uint32_t a)\n" +
2821
+ "{\n" +
2822
+ " return (uint16_t) a;\n" +
2823
+ "}\n" +
2824
+ "INLINE_TWO uint16_t _somefunc_2(uint32_t a)\n" +
2825
+ "{\n" +
2826
+ " return (uint16_t) a;\n" +
2827
+ "}\n" +
2828
+ "#define INLINE_THREE \\\nstatic\\\ninline"
2829
+
2830
+ expected =
2831
+ "#if defined (FORCE_INLINE)\n" +
2832
+ "#else\n" +
2833
+ "#endif\n" +
2834
+ "uint16_t _somefunc (uint32_t a);\n" +
2835
+ "uint16_t _somefunc_0 (uint32_t a);\n" +
2836
+ "uint16_t _somefunc_1 (uint32_t a);\n" +
2837
+ "uint16_t _somefunc_2(uint32_t a);\n"
2838
+
2839
+ @parser.treat_inlines = :include
2840
+ @parser.inline_function_patterns = ['MY_LIBRARY_INLINE', 'INLINE_THREE', 'INLINE_TWO', 'INLINE', 'static __inline__ __attribute__ \(\(always_inline\)\)', 'static __inline__']
2841
+ assert_equal(expected, @parser.transform_inline_functions(source))
2842
+ end
2843
+
2844
+ it "Transform inline functions will ignore comments containing static" do
2845
+ source =
2846
+ "typedef struct {\n" +
2847
+ "const uint32_t var1;\n" +
2848
+ "const uint16_t var2; // comment with the word static in it\n" +
2849
+ "} struct1;\n" +
2850
+ "\n" +
2851
+ "typedef struct {\n" +
2852
+ "const uint32_t var1;\n" +
2853
+ "const uint16_t var2;\n" +
2854
+ "} struct2;\n"
2855
+
2856
+ expected =
2857
+ "typedef struct {\n" +
2858
+ "const uint32_t var1;\n" +
2859
+ "const uint16_t var2; \n" +
2860
+ "} struct1;\n" +
2861
+ "\n" +
2862
+ "typedef struct {\n" +
2863
+ "const uint32_t var1;\n" +
2864
+ "const uint16_t var2;\n" +
2865
+ "} struct2;\n"
2866
+
2867
+ @parser.treat_inlines = :include
2868
+ assert_equal(expected, @parser.transform_inline_functions(source))
2869
+ end
2870
+
2871
+ it "Transform macros with escapes of empty lines" do
2872
+ source =
2873
+ "#define some_msg_t_FIELDLIST(X, a) \\\n" +
2874
+ "\n" +
2875
+ "#define some_msg_t_CALLBACK NULL\n"
2876
+
2877
+ expected =
2878
+ "#define some_msg_t_FIELDLIST(X, a) \n" +
2879
+ "#define some_msg_t_CALLBACK NULL\n"
2880
+
2881
+ @parser.treat_inlines = :include
2882
+ assert_equal(expected, @parser.transform_inline_functions(source))
2883
+ end
2884
+
2885
+
2886
+ end