ceedling 0.13.0.rc1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (426) hide show
  1. data/Gemfile.lock +32 -0
  2. data/README.md +8 -8
  3. data/assets/example_file.c +5 -0
  4. data/assets/example_file.h +6 -0
  5. data/assets/project_as_gem.yml +71 -0
  6. data/assets/{project.yml → project_with_guts.yml} +2 -0
  7. data/assets/rakefile_as_gem.rb +1 -0
  8. data/assets/{rakefile.rb → rakefile_with_guts.rb} +0 -0
  9. data/assets/test_example_file.c +13 -0
  10. data/bin/ceedling +55 -31
  11. data/ceedling-0.13.0.rc4.gem +0 -0
  12. data/ceedling.gemspec +13 -12
  13. data/ceedling.sublime-project +8 -0
  14. data/ceedling.sublime-workspace +365 -0
  15. data/examples/temp_sensor/project.yml +3 -4
  16. data/lib/ceedling.rb +13 -4
  17. data/lib/ceedling/version.rb +3 -3
  18. data/lib/project_file_loader.rb +1 -1
  19. data/lib/rakefile.rb +14 -1
  20. data/lib/target_loader.rb +38 -0
  21. data/plugins/bullseye/{template.erb → assets/template.erb} +0 -0
  22. data/plugins/bullseye/{defaults.yml → config/defaults.yml} +0 -0
  23. data/plugins/bullseye/{bullseye.rb → lib/bullseye.rb} +9 -10
  24. data/spec/spec_system_helper.rb +192 -0
  25. data/spec/system/deployment_spec.rb +116 -0
  26. data/tags +977 -0
  27. data/vendor/c_exception/docs/CExceptionSummary.odt +0 -0
  28. data/vendor/c_exception/docs/CExceptionSummary.pdf +0 -0
  29. data/vendor/c_exception/docs/license.txt +30 -0
  30. data/vendor/c_exception/docs/readme.txt +242 -0
  31. data/vendor/c_exception/makefile +24 -0
  32. data/vendor/c_exception/rakefile.rb +41 -0
  33. data/vendor/c_exception/test/CExceptionConfig.h +44 -0
  34. data/vendor/c_exception/test/TestException.c +328 -0
  35. data/vendor/c_exception/test/TestException_Runner.c +57 -0
  36. data/vendor/c_exception/vendor/unity/auto/colour_prompt.rb +94 -0
  37. data/vendor/c_exception/vendor/unity/auto/colour_reporter.rb +39 -0
  38. data/vendor/c_exception/vendor/unity/auto/generate_config.yml +36 -0
  39. data/vendor/c_exception/vendor/unity/auto/generate_module.rb +202 -0
  40. data/vendor/c_exception/vendor/unity/auto/generate_test_runner.rb +313 -0
  41. data/vendor/c_exception/vendor/unity/auto/test_file_filter.rb +23 -0
  42. data/vendor/c_exception/vendor/unity/auto/unity_test_summary.rb +139 -0
  43. data/vendor/c_exception/vendor/unity/docs/Unity Summary.odt +0 -0
  44. data/vendor/c_exception/vendor/unity/docs/Unity Summary.pdf +0 -0
  45. data/vendor/c_exception/vendor/unity/docs/Unity Summary.txt +217 -0
  46. data/vendor/c_exception/vendor/unity/docs/license.txt +31 -0
  47. data/vendor/c_exception/vendor/unity/examples/helper/UnityHelper.c +10 -0
  48. data/vendor/c_exception/vendor/unity/examples/helper/UnityHelper.h +12 -0
  49. data/vendor/c_exception/vendor/unity/examples/makefile +40 -0
  50. data/vendor/c_exception/vendor/unity/examples/rakefile.rb +32 -0
  51. data/vendor/c_exception/vendor/unity/examples/rakefile_helper.rb +256 -0
  52. data/vendor/c_exception/vendor/unity/examples/readme.txt +18 -0
  53. data/vendor/c_exception/vendor/unity/examples/src/ProductionCode.c +24 -0
  54. data/vendor/c_exception/vendor/unity/examples/src/ProductionCode.h +3 -0
  55. data/vendor/c_exception/vendor/unity/examples/src/ProductionCode2.c +9 -0
  56. data/vendor/c_exception/vendor/unity/examples/src/ProductionCode2.h +2 -0
  57. data/vendor/c_exception/vendor/unity/examples/test/TestProductionCode.c +62 -0
  58. data/vendor/c_exception/vendor/unity/examples/test/TestProductionCode2.c +31 -0
  59. data/vendor/c_exception/vendor/unity/examples/test/no_ruby/TestProductionCode2_Runner.c +46 -0
  60. data/vendor/c_exception/vendor/unity/examples/test/no_ruby/TestProductionCode_Runner.c +50 -0
  61. data/vendor/c_exception/vendor/unity/extras/fixture/build/MakefileWorker.mk +331 -0
  62. data/vendor/c_exception/vendor/unity/extras/fixture/build/filterGcov.sh +61 -0
  63. data/vendor/c_exception/vendor/unity/extras/fixture/rakefile.rb +37 -0
  64. data/vendor/c_exception/vendor/unity/extras/fixture/rakefile_helper.rb +178 -0
  65. data/vendor/c_exception/vendor/unity/extras/fixture/readme.txt +9 -0
  66. data/vendor/c_exception/vendor/unity/extras/fixture/src/unity_fixture.c +381 -0
  67. data/vendor/c_exception/vendor/unity/extras/fixture/src/unity_fixture.h +81 -0
  68. data/vendor/c_exception/vendor/unity/extras/fixture/src/unity_fixture_internals.h +44 -0
  69. data/vendor/c_exception/vendor/unity/extras/fixture/src/unity_fixture_malloc_overrides.h +16 -0
  70. data/vendor/c_exception/vendor/unity/extras/fixture/test/main/AllTests.c +21 -0
  71. data/vendor/c_exception/vendor/unity/extras/fixture/test/testunity_fixture.c +39 -0
  72. data/vendor/c_exception/vendor/unity/extras/fixture/test/unity_fixture_Test.c +321 -0
  73. data/vendor/c_exception/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +40 -0
  74. data/vendor/c_exception/vendor/unity/extras/fixture/test/unity_output_Spy.c +56 -0
  75. data/vendor/c_exception/vendor/unity/extras/fixture/test/unity_output_Spy.h +17 -0
  76. data/vendor/c_exception/vendor/unity/makefile +35 -0
  77. data/vendor/c_exception/vendor/unity/rakefile.rb +59 -0
  78. data/vendor/c_exception/vendor/unity/rakefile_helper.rb +240 -0
  79. data/vendor/c_exception/vendor/unity/release/build.info +2 -0
  80. data/vendor/c_exception/vendor/unity/release/version.info +2 -0
  81. data/vendor/c_exception/vendor/unity/src/unity.c +979 -0
  82. data/vendor/c_exception/vendor/unity/src/unity.h +232 -0
  83. data/vendor/c_exception/vendor/unity/src/unity_internals.h +424 -0
  84. data/vendor/c_exception/vendor/unity/targets/gcc.yml +43 -0
  85. data/vendor/c_exception/vendor/unity/targets/gcc_64.yml +44 -0
  86. data/vendor/c_exception/vendor/unity/targets/hitech_picc18.yml +101 -0
  87. data/vendor/c_exception/vendor/unity/targets/iar_arm_v4.yml +89 -0
  88. data/vendor/c_exception/vendor/unity/targets/iar_arm_v5.yml +79 -0
  89. data/vendor/c_exception/vendor/unity/targets/iar_arm_v5_3.yml +79 -0
  90. data/vendor/c_exception/vendor/unity/targets/iar_armcortex_LM3S9B92_v5_4.yml +93 -0
  91. data/vendor/c_exception/vendor/unity/targets/iar_cortexm3_v5.yml +83 -0
  92. data/vendor/c_exception/vendor/unity/targets/iar_msp430.yml +94 -0
  93. data/vendor/c_exception/vendor/unity/targets/iar_sh2a_v6.yml +85 -0
  94. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_cmd.c +54 -0
  95. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_def.c +50 -0
  96. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_mock_cmd.c +76 -0
  97. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_mock_def.c +72 -0
  98. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_mock_new1.c +85 -0
  99. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_mock_new2.c +85 -0
  100. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_mock_param.c +73 -0
  101. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_mock_run1.c +85 -0
  102. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_mock_run2.c +85 -0
  103. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_mock_yaml.c +86 -0
  104. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_new1.c +60 -0
  105. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_new2.c +63 -0
  106. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_param.c +51 -0
  107. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_run1.c +60 -0
  108. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_run2.c +63 -0
  109. data/vendor/c_exception/vendor/unity/test/expectdata/testsample_yaml.c +64 -0
  110. data/vendor/c_exception/vendor/unity/test/test_generate_test_runner.rb +94 -0
  111. data/vendor/c_exception/vendor/unity/test/testdata/mocksample.c +51 -0
  112. data/vendor/c_exception/vendor/unity/test/testdata/sample.yml +9 -0
  113. data/vendor/c_exception/vendor/unity/test/testdata/testsample.c +51 -0
  114. data/vendor/c_exception/vendor/unity/test/testparameterized.c +101 -0
  115. data/vendor/c_exception/vendor/unity/test/testunity.c +2024 -0
  116. data/vendor/cmock/docs/CMock Summary.odt +0 -0
  117. data/vendor/cmock/docs/CMock Summary.pdf +0 -0
  118. data/vendor/cmock/docs/CMock_Summary.md +356 -0
  119. data/vendor/cmock/docs/license.txt +31 -0
  120. data/vendor/cmock/examples/gcc.yml +43 -0
  121. data/vendor/cmock/examples/iar_v4.yml +91 -0
  122. data/vendor/cmock/examples/iar_v5.yml +80 -0
  123. data/vendor/cmock/examples/rakefile.rb +32 -0
  124. data/vendor/cmock/examples/rakefile_helper.rb +270 -0
  125. data/vendor/cmock/examples/src/AT91SAM7X256.h +2556 -0
  126. data/vendor/cmock/examples/src/AdcConductor.c +42 -0
  127. data/vendor/cmock/examples/src/AdcConductor.h +11 -0
  128. data/vendor/cmock/examples/src/AdcHardware.c +27 -0
  129. data/vendor/cmock/examples/src/AdcHardware.h +9 -0
  130. data/vendor/cmock/examples/src/AdcHardwareConfigurator.c +18 -0
  131. data/vendor/cmock/examples/src/AdcHardwareConfigurator.h +10 -0
  132. data/vendor/cmock/examples/src/AdcModel.c +33 -0
  133. data/vendor/cmock/examples/src/AdcModel.h +13 -0
  134. data/vendor/cmock/examples/src/AdcTemperatureSensor.c +51 -0
  135. data/vendor/cmock/examples/src/AdcTemperatureSensor.h +10 -0
  136. data/vendor/cmock/examples/src/Executor.c +25 -0
  137. data/vendor/cmock/examples/src/Executor.h +9 -0
  138. data/vendor/cmock/examples/src/IntrinsicsWrapper.c +18 -0
  139. data/vendor/cmock/examples/src/IntrinsicsWrapper.h +7 -0
  140. data/vendor/cmock/examples/src/Main.c +46 -0
  141. data/vendor/cmock/examples/src/Main.h +7 -0
  142. data/vendor/cmock/examples/src/Model.c +10 -0
  143. data/vendor/cmock/examples/src/Model.h +8 -0
  144. data/vendor/cmock/examples/src/ModelConfig.h +7 -0
  145. data/vendor/cmock/examples/src/TaskScheduler.c +72 -0
  146. data/vendor/cmock/examples/src/TaskScheduler.h +11 -0
  147. data/vendor/cmock/examples/src/TemperatureCalculator.c +27 -0
  148. data/vendor/cmock/examples/src/TemperatureCalculator.h +6 -0
  149. data/vendor/cmock/examples/src/TemperatureFilter.c +39 -0
  150. data/vendor/cmock/examples/src/TemperatureFilter.h +10 -0
  151. data/vendor/cmock/examples/src/TimerConductor.c +15 -0
  152. data/vendor/cmock/examples/src/TimerConductor.h +9 -0
  153. data/vendor/cmock/examples/src/TimerConfigurator.c +51 -0
  154. data/vendor/cmock/examples/src/TimerConfigurator.h +15 -0
  155. data/vendor/cmock/examples/src/TimerHardware.c +15 -0
  156. data/vendor/cmock/examples/src/TimerHardware.h +8 -0
  157. data/vendor/cmock/examples/src/TimerInterruptConfigurator.c +55 -0
  158. data/vendor/cmock/examples/src/TimerInterruptConfigurator.h +13 -0
  159. data/vendor/cmock/examples/src/TimerInterruptHandler.c +25 -0
  160. data/vendor/cmock/examples/src/TimerInterruptHandler.h +10 -0
  161. data/vendor/cmock/examples/src/TimerModel.c +9 -0
  162. data/vendor/cmock/examples/src/TimerModel.h +8 -0
  163. data/vendor/cmock/examples/src/Types.h +103 -0
  164. data/vendor/cmock/examples/src/UsartBaudRateRegisterCalculator.c +18 -0
  165. data/vendor/cmock/examples/src/UsartBaudRateRegisterCalculator.h +6 -0
  166. data/vendor/cmock/examples/src/UsartConductor.c +21 -0
  167. data/vendor/cmock/examples/src/UsartConductor.h +7 -0
  168. data/vendor/cmock/examples/src/UsartConfigurator.c +39 -0
  169. data/vendor/cmock/examples/src/UsartConfigurator.h +13 -0
  170. data/vendor/cmock/examples/src/UsartHardware.c +22 -0
  171. data/vendor/cmock/examples/src/UsartHardware.h +9 -0
  172. data/vendor/cmock/examples/src/UsartModel.c +34 -0
  173. data/vendor/cmock/examples/src/UsartModel.h +10 -0
  174. data/vendor/cmock/examples/src/UsartPutChar.c +16 -0
  175. data/vendor/cmock/examples/src/UsartPutChar.h +8 -0
  176. data/vendor/cmock/examples/src/UsartTransmitBufferStatus.c +7 -0
  177. data/vendor/cmock/examples/src/UsartTransmitBufferStatus.h +8 -0
  178. data/vendor/cmock/examples/test/TestAdcConductor.c +121 -0
  179. data/vendor/cmock/examples/test/TestAdcHardware.c +44 -0
  180. data/vendor/cmock/examples/test/TestAdcHardwareConfigurator.c +43 -0
  181. data/vendor/cmock/examples/test/TestAdcModel.c +33 -0
  182. data/vendor/cmock/examples/test/TestAdcTemperatureSensor.c +47 -0
  183. data/vendor/cmock/examples/test/TestExecutor.c +36 -0
  184. data/vendor/cmock/examples/test/TestMain.c +24 -0
  185. data/vendor/cmock/examples/test/TestModel.c +20 -0
  186. data/vendor/cmock/examples/test/TestTaskScheduler.c +104 -0
  187. data/vendor/cmock/examples/test/TestTemperatureCalculator.c +33 -0
  188. data/vendor/cmock/examples/test/TestTemperatureFilter.c +69 -0
  189. data/vendor/cmock/examples/test/TestTimerConductor.c +32 -0
  190. data/vendor/cmock/examples/test/TestTimerConfigurator.c +112 -0
  191. data/vendor/cmock/examples/test/TestTimerHardware.c +26 -0
  192. data/vendor/cmock/examples/test/TestTimerInterruptConfigurator.c +78 -0
  193. data/vendor/cmock/examples/test/TestTimerInterruptHandler.c +66 -0
  194. data/vendor/cmock/examples/test/TestTimerModel.c +18 -0
  195. data/vendor/cmock/examples/test/TestUsartBaudRateRegisterCalculator.c +21 -0
  196. data/vendor/cmock/examples/test/TestUsartConductor.c +40 -0
  197. data/vendor/cmock/examples/test/TestUsartConfigurator.c +77 -0
  198. data/vendor/cmock/examples/test/TestUsartHardware.c +37 -0
  199. data/vendor/cmock/examples/test/TestUsartModel.c +40 -0
  200. data/vendor/cmock/examples/test/TestUsartPutChar.c +43 -0
  201. data/vendor/cmock/examples/test/TestUsartTransmitBufferStatus.c +22 -0
  202. data/vendor/cmock/iar/iar_v4/Resource/SAM7_FLASH.mac +71 -0
  203. data/vendor/cmock/iar/iar_v4/Resource/SAM7_RAM.mac +94 -0
  204. data/vendor/cmock/iar/iar_v4/Resource/SAM7_SIM.mac +67 -0
  205. data/vendor/cmock/iar/iar_v4/Resource/at91SAM7X256_FLASH.xcl +185 -0
  206. data/vendor/cmock/iar/iar_v4/Resource/at91SAM7X256_RAM.xcl +185 -0
  207. data/vendor/cmock/iar/iar_v4/Resource/ioat91sam7x256.ddf +2259 -0
  208. data/vendor/cmock/iar/iar_v4/cmock_demo.dep +3691 -0
  209. data/vendor/cmock/iar/iar_v4/cmock_demo.ewd +1696 -0
  210. data/vendor/cmock/iar/iar_v4/cmock_demo.ewp +2581 -0
  211. data/vendor/cmock/iar/iar_v4/cmock_demo.eww +10 -0
  212. data/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X-EK.h +61 -0
  213. data/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X256.inc +2314 -0
  214. data/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X256.rdf +4704 -0
  215. data/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X256.tcl +3407 -0
  216. data/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X256_inc.h +2268 -0
  217. data/vendor/cmock/iar/iar_v4/incIAR/ioat91sam7x256.h +4380 -0
  218. data/vendor/cmock/iar/iar_v4/incIAR/lib_AT91SAM7X256.h +4211 -0
  219. data/vendor/cmock/iar/iar_v4/settings/cmock_demo.cspy.bat +32 -0
  220. data/vendor/cmock/iar/iar_v4/settings/cmock_demo.dbgdt +86 -0
  221. data/vendor/cmock/iar/iar_v4/settings/cmock_demo.dni +42 -0
  222. data/vendor/cmock/iar/iar_v4/settings/cmock_demo.wsdt +76 -0
  223. data/vendor/cmock/iar/iar_v4/srcIAR/Cstartup.s79 +266 -0
  224. data/vendor/cmock/iar/iar_v4/srcIAR/Cstartup_SAM7.c +98 -0
  225. data/vendor/cmock/iar/iar_v5/Resource/SAM7_FLASH.mac +71 -0
  226. data/vendor/cmock/iar/iar_v5/Resource/SAM7_RAM.mac +94 -0
  227. data/vendor/cmock/iar/iar_v5/Resource/SAM7_SIM.mac +67 -0
  228. data/vendor/cmock/iar/iar_v5/Resource/at91SAM7X256_FLASH.icf +43 -0
  229. data/vendor/cmock/iar/iar_v5/Resource/at91SAM7X256_RAM.icf +42 -0
  230. data/vendor/cmock/iar/iar_v5/cmock_demo.dep +4204 -0
  231. data/vendor/cmock/iar/iar_v5/cmock_demo.ewd +1906 -0
  232. data/vendor/cmock/iar/iar_v5/cmock_demo.ewp +2426 -0
  233. data/vendor/cmock/iar/iar_v5/cmock_demo.eww +26 -0
  234. data/vendor/cmock/iar/iar_v5/incIAR/AT91SAM7X-EK.h +61 -0
  235. data/vendor/cmock/iar/iar_v5/incIAR/AT91SAM7X256_inc.h +2268 -0
  236. data/vendor/cmock/iar/iar_v5/incIAR/lib_AT91SAM7X256.h +4211 -0
  237. data/vendor/cmock/iar/iar_v5/incIAR/project.h +30 -0
  238. data/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X.cspy.bat +33 -0
  239. data/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X.dbgdt +5 -0
  240. data/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X.dni +18 -0
  241. data/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X.wsdt +74 -0
  242. data/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X_FLASH_Debug.jlink +12 -0
  243. data/vendor/cmock/iar/iar_v5/settings/cmock_demo.cspy.bat +33 -0
  244. data/vendor/cmock/iar/iar_v5/settings/cmock_demo.dbgdt +85 -0
  245. data/vendor/cmock/iar/iar_v5/settings/cmock_demo.dni +44 -0
  246. data/vendor/cmock/iar/iar_v5/settings/cmock_demo.wsdt +73 -0
  247. data/vendor/cmock/iar/iar_v5/settings/cmock_demo_Binary.jlink +12 -0
  248. data/vendor/cmock/iar/iar_v5/settings/cmock_demo_FLASH_Debug.jlink +12 -0
  249. data/vendor/cmock/iar/iar_v5/settings/cmock_demo_RAM_Debug.jlink +12 -0
  250. data/vendor/cmock/iar/iar_v5/srcIAR/Cstartup.s +299 -0
  251. data/vendor/cmock/iar/iar_v5/srcIAR/Cstartup_SAM7.c +98 -0
  252. data/vendor/cmock/rakefile.rb +111 -0
  253. data/vendor/cmock/rakefile_helper.rb +381 -0
  254. data/vendor/cmock/targets/gcc.yml +53 -0
  255. data/vendor/cmock/targets/iar_arm_v4.yml +108 -0
  256. data/vendor/cmock/targets/iar_arm_v5.yml +93 -0
  257. data/vendor/cmock/test/c/TestCMockC.c +280 -0
  258. data/vendor/cmock/test/c/TestCMockC.yml +12 -0
  259. data/vendor/cmock/test/c/TestCMockCDynamic.c +186 -0
  260. data/vendor/cmock/test/c/TestCMockCDynamic.yml +12 -0
  261. data/vendor/cmock/test/c/TestCMockCDynamic_Runner.c +35 -0
  262. data/vendor/cmock/test/c/TestCMockC_Runner.c +37 -0
  263. data/vendor/cmock/test/spec/cmock_file_writer_spec.rb +25 -0
  264. data/vendor/cmock/test/spec/spec_helper.rb +12 -0
  265. data/vendor/cmock/test/system/systest_generator.rb +178 -0
  266. data/vendor/cmock/test/system/test_compilation/callingconv.h +11 -0
  267. data/vendor/cmock/test/system/test_compilation/config.yml +9 -0
  268. data/vendor/cmock/test/system/test_compilation/const.h +15 -0
  269. data/vendor/cmock/test/system/test_compilation/osek.h +275 -0
  270. data/vendor/cmock/test/system/test_compilation/parsing.h +47 -0
  271. data/vendor/cmock/test/system/test_interactions/all_plugins_but_other_limits.yml +341 -0
  272. data/vendor/cmock/test/system/test_interactions/all_plugins_coexist.yml +382 -0
  273. data/vendor/cmock/test/system/test_interactions/array_and_pointer_handling.yml +382 -0
  274. data/vendor/cmock/test/system/test_interactions/basic_expect_and_return.yml +123 -0
  275. data/vendor/cmock/test/system/test_interactions/const_primitives_handling.yml +87 -0
  276. data/vendor/cmock/test/system/test_interactions/enforce_strict_ordering.yml +247 -0
  277. data/vendor/cmock/test/system/test_interactions/expect_and_return_custom_types.yml +108 -0
  278. data/vendor/cmock/test/system/test_interactions/expect_and_return_treat_as.yml +173 -0
  279. data/vendor/cmock/test/system/test_interactions/expect_and_throw.yml +170 -0
  280. data/vendor/cmock/test/system/test_interactions/fancy_pointer_handling.yml +208 -0
  281. data/vendor/cmock/test/system/test_interactions/function_pointer_handling.yml +82 -0
  282. data/vendor/cmock/test/system/test_interactions/ignore_and_return.yml +153 -0
  283. data/vendor/cmock/test/system/test_interactions/newer_standards_stuff1.yml +52 -0
  284. data/vendor/cmock/test/system/test_interactions/nonstandard_parsed_stuff_1.yml +91 -0
  285. data/vendor/cmock/test/system/test_interactions/nonstandard_parsed_stuff_2.yml +59 -0
  286. data/vendor/cmock/test/system/test_interactions/parsing_challenges.yml +222 -0
  287. data/vendor/cmock/test/system/test_interactions/struct_union_enum_expect_and_return.yml +277 -0
  288. data/vendor/cmock/test/system/test_interactions/stubs_with_callbacks.yml +221 -0
  289. data/vendor/cmock/test/system/test_interactions/unity_64bit_support.yml +77 -0
  290. data/vendor/cmock/test/system/test_interactions/unity_ignores.yml +139 -0
  291. data/vendor/cmock/test/test_helper.rb +44 -0
  292. data/vendor/cmock/test/unit/cmock_config_test.rb +121 -0
  293. data/vendor/cmock/test/unit/cmock_config_test.yml +5 -0
  294. data/vendor/cmock/test/unit/cmock_file_writer_test.rb +30 -0
  295. data/vendor/cmock/test/unit/cmock_generator_main_test.rb +413 -0
  296. data/vendor/cmock/test/unit/cmock_generator_plugin_array_test.rb +114 -0
  297. data/vendor/cmock/test/unit/cmock_generator_plugin_callback_test.rb +190 -0
  298. data/vendor/cmock/test/unit/cmock_generator_plugin_cexception_test.rb +94 -0
  299. data/vendor/cmock/test/unit/cmock_generator_plugin_expect_test.rb +206 -0
  300. data/vendor/cmock/test/unit/cmock_generator_plugin_ignore_test.rb +168 -0
  301. data/vendor/cmock/test/unit/cmock_generator_utils_test.rb +291 -0
  302. data/vendor/cmock/test/unit/cmock_header_parser_test.rb +1247 -0
  303. data/vendor/cmock/test/unit/cmock_plugin_manager_test.rb +85 -0
  304. data/vendor/cmock/test/unit/cmock_unityhelper_parser_test.rb +223 -0
  305. data/vendor/cmock/vendor/behaviors/Manifest.txt +9 -0
  306. data/vendor/cmock/vendor/behaviors/Rakefile +19 -0
  307. data/vendor/cmock/vendor/behaviors/lib/behaviors.rb +76 -0
  308. data/vendor/cmock/vendor/behaviors/lib/behaviors/reporttask.rb +158 -0
  309. data/vendor/cmock/vendor/behaviors/test/behaviors_tasks_test.rb +73 -0
  310. data/vendor/cmock/vendor/behaviors/test/behaviors_test.rb +50 -0
  311. data/vendor/cmock/vendor/behaviors/test/tasks_test/Rakefile +19 -0
  312. data/vendor/cmock/vendor/behaviors/test/tasks_test/lib/user.rb +2 -0
  313. data/vendor/cmock/vendor/behaviors/test/tasks_test/test/user_test.rb +17 -0
  314. data/vendor/cmock/vendor/hardmock/CHANGES +78 -0
  315. data/vendor/cmock/vendor/hardmock/LICENSE +7 -0
  316. data/vendor/cmock/vendor/hardmock/README +70 -0
  317. data/vendor/cmock/vendor/hardmock/Rakefile +8 -0
  318. data/vendor/cmock/vendor/hardmock/config/environment.rb +12 -0
  319. data/vendor/cmock/vendor/hardmock/lib/assert_error.rb +23 -0
  320. data/vendor/cmock/vendor/hardmock/lib/extend_test_unit.rb +14 -0
  321. data/vendor/cmock/vendor/hardmock/lib/hardmock.rb +86 -0
  322. data/vendor/cmock/vendor/hardmock/lib/hardmock/errors.rb +22 -0
  323. data/vendor/cmock/vendor/hardmock/lib/hardmock/expectation.rb +229 -0
  324. data/vendor/cmock/vendor/hardmock/lib/hardmock/expectation_builder.rb +9 -0
  325. data/vendor/cmock/vendor/hardmock/lib/hardmock/expector.rb +26 -0
  326. data/vendor/cmock/vendor/hardmock/lib/hardmock/method_cleanout.rb +33 -0
  327. data/vendor/cmock/vendor/hardmock/lib/hardmock/mock.rb +180 -0
  328. data/vendor/cmock/vendor/hardmock/lib/hardmock/mock_control.rb +53 -0
  329. data/vendor/cmock/vendor/hardmock/lib/hardmock/stubbing.rb +210 -0
  330. data/vendor/cmock/vendor/hardmock/lib/hardmock/trapper.rb +31 -0
  331. data/vendor/cmock/vendor/hardmock/lib/hardmock/utils.rb +9 -0
  332. data/vendor/cmock/vendor/hardmock/lib/test_unit_before_after.rb +169 -0
  333. data/vendor/cmock/vendor/hardmock/rake_tasks/rdoc.rake +19 -0
  334. data/vendor/cmock/vendor/hardmock/rake_tasks/rdoc_options.rb +4 -0
  335. data/vendor/cmock/vendor/hardmock/rake_tasks/test.rake +22 -0
  336. data/vendor/cmock/vendor/hardmock/test/functional/assert_error_test.rb +52 -0
  337. data/vendor/cmock/vendor/hardmock/test/functional/auto_verify_test.rb +178 -0
  338. data/vendor/cmock/vendor/hardmock/test/functional/direct_mock_usage_test.rb +396 -0
  339. data/vendor/cmock/vendor/hardmock/test/functional/hardmock_test.rb +434 -0
  340. data/vendor/cmock/vendor/hardmock/test/functional/stubbing_test.rb +479 -0
  341. data/vendor/cmock/vendor/hardmock/test/test_helper.rb +43 -0
  342. data/vendor/cmock/vendor/hardmock/test/unit/expectation_builder_test.rb +19 -0
  343. data/vendor/cmock/vendor/hardmock/test/unit/expectation_test.rb +372 -0
  344. data/vendor/cmock/vendor/hardmock/test/unit/expector_test.rb +57 -0
  345. data/vendor/cmock/vendor/hardmock/test/unit/method_cleanout_test.rb +36 -0
  346. data/vendor/cmock/vendor/hardmock/test/unit/mock_control_test.rb +175 -0
  347. data/vendor/cmock/vendor/hardmock/test/unit/mock_test.rb +279 -0
  348. data/vendor/cmock/vendor/hardmock/test/unit/test_unit_before_after_test.rb +452 -0
  349. data/vendor/cmock/vendor/hardmock/test/unit/trapper_test.rb +62 -0
  350. data/vendor/cmock/vendor/hardmock/test/unit/verify_error_test.rb +40 -0
  351. data/vendor/unity/auto/generate_config.yml +36 -0
  352. data/vendor/unity/auto/unity_test_summary.rb +2 -2
  353. data/vendor/unity/docs/Unity Summary.odt +0 -0
  354. data/vendor/unity/docs/Unity Summary.pdf +0 -0
  355. data/vendor/unity/docs/Unity Summary.txt +216 -0
  356. data/vendor/unity/docs/license.txt +31 -0
  357. data/vendor/unity/examples/helper/UnityHelper.c +10 -0
  358. data/vendor/unity/examples/helper/UnityHelper.h +12 -0
  359. data/vendor/unity/examples/makefile +40 -0
  360. data/vendor/unity/examples/rakefile.rb +32 -0
  361. data/vendor/unity/examples/rakefile_helper.rb +256 -0
  362. data/vendor/unity/examples/readme.txt +18 -0
  363. data/vendor/unity/examples/src/ProductionCode.c +24 -0
  364. data/vendor/unity/examples/src/ProductionCode.h +3 -0
  365. data/vendor/unity/examples/src/ProductionCode2.c +9 -0
  366. data/vendor/unity/examples/src/ProductionCode2.h +2 -0
  367. data/vendor/unity/examples/test/TestProductionCode.c +62 -0
  368. data/vendor/unity/examples/test/TestProductionCode2.c +31 -0
  369. data/vendor/unity/examples/test/no_ruby/TestProductionCode2_Runner.c +46 -0
  370. data/vendor/unity/examples/test/no_ruby/TestProductionCode_Runner.c +50 -0
  371. data/vendor/unity/extras/fixture/build/MakefileWorker.mk +331 -0
  372. data/vendor/unity/extras/fixture/build/filterGcov.sh +61 -0
  373. data/vendor/unity/extras/fixture/rakefile.rb +37 -0
  374. data/vendor/unity/extras/fixture/rakefile_helper.rb +178 -0
  375. data/vendor/unity/extras/fixture/readme.txt +9 -0
  376. data/vendor/unity/extras/fixture/src/unity_fixture.c +381 -0
  377. data/vendor/unity/extras/fixture/src/unity_fixture.h +81 -0
  378. data/vendor/unity/extras/fixture/src/unity_fixture_internals.h +44 -0
  379. data/vendor/unity/extras/fixture/src/unity_fixture_malloc_overrides.h +16 -0
  380. data/vendor/unity/extras/fixture/test/main/AllTests.c +21 -0
  381. data/vendor/unity/extras/fixture/test/testunity_fixture.c +39 -0
  382. data/vendor/unity/extras/fixture/test/unity_fixture_Test.c +321 -0
  383. data/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c +40 -0
  384. data/vendor/unity/extras/fixture/test/unity_output_Spy.c +56 -0
  385. data/vendor/unity/extras/fixture/test/unity_output_Spy.h +17 -0
  386. data/vendor/unity/makefile +35 -0
  387. data/vendor/unity/rakefile.rb +59 -0
  388. data/vendor/unity/rakefile_helper.rb +240 -0
  389. data/vendor/unity/release/version.info +1 -1
  390. data/vendor/unity/src/unity.c +1 -1
  391. data/vendor/unity/src/unity_internals.h +5 -5
  392. data/vendor/unity/targets/gcc_32.yml +44 -0
  393. data/vendor/unity/targets/hitech_picc18.yml +101 -0
  394. data/vendor/unity/targets/iar_arm_v4.yml +89 -0
  395. data/vendor/unity/targets/iar_arm_v5.yml +79 -0
  396. data/vendor/unity/targets/iar_arm_v5_3.yml +79 -0
  397. data/vendor/unity/targets/iar_armcortex_LM3S9B92_v5_4.yml +93 -0
  398. data/vendor/unity/targets/iar_cortexm3_v5.yml +83 -0
  399. data/vendor/unity/targets/iar_msp430.yml +94 -0
  400. data/vendor/unity/targets/iar_sh2a_v6.yml +85 -0
  401. data/vendor/unity/test/expectdata/testsample_cmd.c +54 -0
  402. data/vendor/unity/test/expectdata/testsample_def.c +50 -0
  403. data/vendor/unity/test/expectdata/testsample_mock_cmd.c +76 -0
  404. data/vendor/unity/test/expectdata/testsample_mock_def.c +72 -0
  405. data/vendor/unity/test/expectdata/testsample_mock_new1.c +85 -0
  406. data/vendor/unity/test/expectdata/testsample_mock_new2.c +85 -0
  407. data/vendor/unity/test/expectdata/testsample_mock_param.c +73 -0
  408. data/vendor/unity/test/expectdata/testsample_mock_run1.c +85 -0
  409. data/vendor/unity/test/expectdata/testsample_mock_run2.c +85 -0
  410. data/vendor/unity/test/expectdata/testsample_mock_yaml.c +86 -0
  411. data/vendor/unity/test/expectdata/testsample_new1.c +60 -0
  412. data/vendor/unity/test/expectdata/testsample_new2.c +63 -0
  413. data/vendor/unity/test/expectdata/testsample_param.c +51 -0
  414. data/vendor/unity/test/expectdata/testsample_run1.c +60 -0
  415. data/vendor/unity/test/expectdata/testsample_run2.c +63 -0
  416. data/vendor/unity/test/expectdata/testsample_yaml.c +64 -0
  417. data/vendor/unity/test/test_generate_test_runner.rb +94 -0
  418. data/vendor/unity/test/testdata/mocksample.c +51 -0
  419. data/vendor/unity/test/testdata/sample.yml +9 -0
  420. data/vendor/unity/test/testdata/testsample.c +51 -0
  421. data/vendor/unity/test/testparameterized.c +101 -0
  422. data/vendor/unity/test/testunity.c +2559 -0
  423. metadata +464 -53
  424. data/.gitignore +0 -6
  425. data/.gitmodules +0 -9
  426. data/.rspec +0 -1
@@ -0,0 +1,434 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+ require 'hardmock'
3
+ require 'assert_error'
4
+
5
+ class HardmockTest < Test::Unit::TestCase
6
+
7
+ #
8
+ # TESTS
9
+ #
10
+
11
+ it "conveniently creates mocks using create_mock and create_mocks" do
12
+
13
+ h = create_mock :donkey
14
+ assert_equal [ :donkey ], h.keys
15
+
16
+ assert_mock_exists :donkey
17
+ assert_same @donkey, h[:donkey]
18
+
19
+ assert_equal [ :donkey ], @all_mocks.keys, "Wrong keyset for @all_mocks"
20
+
21
+ h2 = create_mocks :cat, 'dog' # symbol/string indifference at this level
22
+ assert_equal [:cat,:dog].to_set, h2.keys.to_set, "Wrong keyset for second hash"
23
+ assert_equal [:cat,:dog,:donkey].to_set, @all_mocks.keys.to_set, "@all_mocks wrong"
24
+
25
+ assert_mock_exists :cat
26
+ assert_same @cat, h2[:cat]
27
+ assert_mock_exists :dog
28
+ assert_same @dog, h2[:dog]
29
+
30
+ assert_mock_exists :donkey
31
+ end
32
+
33
+ it "provides literal 'expects' syntax" do
34
+ assert_nil @order, "Should be no @order yet"
35
+ create_mock :order
36
+ assert_not_nil @order, "@order should be built"
37
+
38
+ # Setup an expectation
39
+ @order.expects.update_stuff :key1 => 'val1', :key2 => 'val2'
40
+
41
+ # Use the mock
42
+ @order.update_stuff :key1 => 'val1', :key2 => 'val2'
43
+
44
+ # Verify
45
+ verify_mocks
46
+
47
+ # See that it's ok to do it again
48
+ verify_mocks
49
+ end
50
+
51
+ it "supports 'with' for specifying argument expectations" do
52
+ create_mocks :car
53
+ @car.expects(:fill).with('gas','booze')
54
+ @car.fill('gas', 'booze')
55
+ verify_mocks
56
+ end
57
+
58
+ it "supports several mocks at once" do
59
+ create_mocks :order_builder, :order, :customer
60
+
61
+ @order_builder.expects.create_new_order.returns @order
62
+ @customer.expects.account_number.returns(1234)
63
+ @order.expects.account_no = 1234
64
+ @order.expects.save!
65
+
66
+ # Run "the code"
67
+ o = @order_builder.create_new_order
68
+ o.account_no = @customer.account_number
69
+ o.save!
70
+
71
+ verify_mocks
72
+ end
73
+
74
+ it "enforces inter-mock call ordering" do
75
+ create_mocks :order_builder, :order, :customer
76
+
77
+ @order_builder.expects.create_new_order.returns @order
78
+ @customer.expects.account_number.returns(1234)
79
+ @order.expects.account_no = 1234
80
+ @order.expects.save!
81
+
82
+ # Run "the code"
83
+ o = @order_builder.create_new_order
84
+ err = assert_raise ExpectationError do
85
+ o.save!
86
+ end
87
+ assert_match(/wrong object/i, err.message)
88
+ assert_match(/order.save!/i, err.message)
89
+ assert_match(/customer.account_number/i, err.message)
90
+
91
+ assert_error VerifyError, /unmet expectations/i do
92
+ verify_mocks
93
+ end
94
+ end
95
+
96
+ class UserPresenter
97
+ def initialize(args)
98
+ view = args[:view]
99
+ model = args[:model]
100
+ model.when :data_changes do
101
+ view.user_name = model.user_name
102
+ end
103
+ view.when :user_edited do
104
+ model.user_name = view.user_name
105
+ end
106
+ end
107
+ end
108
+
109
+ it "makes MVP testing simple" do
110
+ mox = create_mocks :model, :view
111
+
112
+ data_change = @model.expects.when(:data_changes) { |evt,block| block }
113
+ user_edit = @view.expects.when(:user_edited) { |evt,block| block }
114
+
115
+ UserPresenter.new mox
116
+
117
+ # Expect user name transfer from model to view
118
+ @model.expects.user_name.returns 'Da Croz'
119
+ @view.expects.user_name = 'Da Croz'
120
+ # Trigger data change event in model
121
+ data_change.block_value.call
122
+
123
+ # Expect user name transfer from view to model
124
+ @view.expects.user_name.returns '6:8'
125
+ @model.expects.user_name = '6:8'
126
+ # Trigger edit event in view
127
+ user_edit.block_value.call
128
+
129
+ verify_mocks
130
+ end
131
+
132
+ it "continues to function after verify, if verification error is controlled" do
133
+ mox = create_mocks :model, :view
134
+ data_change = @model.expects.when(:data_changes) { |evt,block| block }
135
+ user_edit = @view.expects.when(:user_edited) { |evt,block| block }
136
+ UserPresenter.new mox
137
+
138
+ # Expect user name transfer from model to view
139
+ @model.expects.user_name.returns 'Da Croz'
140
+ @view.expects.user_name = 'Da Croz'
141
+
142
+ assert_error ExpectationError, /model.monkey_wrench/i do
143
+ @model.monkey_wrench
144
+ end
145
+
146
+ # This should raise because of unmet expectations
147
+ assert_error VerifyError, /unmet expectations/i, /user_name/i do
148
+ verify_mocks
149
+ end
150
+
151
+ # See that the non-forced verification remains quiet
152
+ assert_nothing_raised VerifyError do
153
+ verify_mocks(false)
154
+ end
155
+
156
+ @model.expects.never_gonna_happen
157
+
158
+ assert_error VerifyError, /unmet expectations/i, /never_gonna_happen/i do
159
+ verify_mocks
160
+ end
161
+ end
162
+
163
+ class UserPresenterBroken
164
+ def initialize(args)
165
+ view = args[:view]
166
+ model = args[:model]
167
+ model.when :data_changes do
168
+ view.user_name = model.user_name
169
+ end
170
+ # no view stuff, will break appropriately
171
+ end
172
+ end
173
+
174
+ it "flunks for typical Presenter constructor wiring failure" do
175
+ mox = create_mocks :model, :view
176
+
177
+ data_change = @model.expects.when(:data_changes) { |evt,block| block }
178
+ user_edit = @view.expects.when(:user_edited) { |evt,block| block }
179
+
180
+ UserPresenterBroken.new mox
181
+
182
+ err = assert_raise VerifyError do
183
+ verify_mocks
184
+ end
185
+ assert_match(/unmet expectations/i, err.message)
186
+ assert_match(/view.when\(:user_edited\)/i, err.message)
187
+
188
+ end
189
+
190
+ it "provides convenient event-subscription trap syntax for MVP testing" do
191
+ mox = create_mocks :model, :view
192
+
193
+ data_change = @model.trap.when(:data_changes)
194
+ user_edit = @view.trap.when(:user_edited)
195
+
196
+ UserPresenter.new mox
197
+
198
+ # Expect user name transfer from model to view
199
+ @model.expects.user_name.returns 'Da Croz'
200
+ @view.expects.user_name = 'Da Croz'
201
+ # Trigger data change event in model
202
+ data_change.trigger
203
+
204
+ # Expect user name transfer from view to model
205
+ @view.expects.user_name.returns '6:8'
206
+ @model.expects.user_name = '6:8'
207
+ # Trigger edit event in view
208
+ user_edit.trigger
209
+
210
+ verify_mocks
211
+ end
212
+
213
+ it "raises if you try to pass an expectation block to 'trap'" do
214
+ create_mock :model
215
+ assert_error Hardmock::ExpectationError, /blocks/i, /trap/i do
216
+ @model.trap.when(:some_event) do raise "huh?" end
217
+ end
218
+ end
219
+
220
+ class Grinder
221
+ def initialize(objects)
222
+ @chute = objects[:chute]
223
+ @bucket = objects[:bucket]
224
+ @blade = objects[:blade]
225
+ end
226
+
227
+ def grind(slot)
228
+ @chute.each_bean(slot) do |bean|
229
+ @bucket << @blade.chop(bean)
230
+ end
231
+ end
232
+ end
233
+
234
+ it "lets you write clear iteration-oriented expectations" do
235
+ grinder = Grinder.new create_mocks(:blade, :chute, :bucket)
236
+
237
+ # Style 1: assertions on method args is done explicitly in block
238
+ @chute.expects.each_bean { |slot,block|
239
+ assert_equal :side_slot, slot, "Wrong slot"
240
+ block.call :bean1
241
+ block.call :bean2
242
+ }
243
+
244
+ @blade.expects.chop(:bean1).returns(:grounds1)
245
+ @bucket.expects('<<', :grounds1)
246
+
247
+ @blade.expects.chop(:bean2).returns(:grounds2)
248
+ @bucket.expects('<<', :grounds2)
249
+
250
+ # Run "the code"
251
+ grinder.grind(:side_slot)
252
+
253
+ verify_mocks
254
+
255
+ # Style 2: assertions on method arguments done implicitly in the expectation code
256
+ @chute.expects.each_bean(:main_slot) { |slot,block|
257
+ block.call :bean3
258
+ }
259
+ @blade.expects.chop(:bean3).returns(:grounds3)
260
+ @bucket.expects('<<', :grounds3)
261
+ grinder.grind :main_slot
262
+ verify_mocks
263
+ end
264
+
265
+ it "further supports iteration testing using 'yield'" do
266
+ grinder = Grinder.new create_mocks(:blade, :chute, :bucket)
267
+
268
+ @chute.expects.each_bean(:side_slot).yields :bean1, :bean2
269
+
270
+ @blade.expects.chop(:bean1).returns(:grounds1)
271
+ @bucket.expects('<<', :grounds1)
272
+
273
+ @blade.expects.chop(:bean2).returns(:grounds2)
274
+ @bucket.expects('<<', :grounds2)
275
+
276
+ grinder.grind :side_slot
277
+
278
+ verify_mocks
279
+ end
280
+
281
+ class HurtLocker
282
+ attr_reader :caught
283
+ def initialize(opts)
284
+ @locker = opts[:locker]
285
+ @store = opts[:store]
286
+ end
287
+
288
+ def do_the_thing(area,data)
289
+ @locker.with_lock(area) do
290
+ @store.eat(data)
291
+ end
292
+ rescue => oops
293
+ @caught = oops
294
+ end
295
+ end
296
+
297
+ it "makes mutex-style locking scenarios easy to test" do
298
+ hurt = HurtLocker.new create_mocks(:locker, :store)
299
+
300
+ @locker.expects.with_lock(:main).yields
301
+ @store.expects.eat("some info")
302
+
303
+ hurt.do_the_thing(:main, "some info")
304
+
305
+ verify_mocks
306
+ end
307
+
308
+ it "makes it easy to simulate error in mutex-style locking scenarios" do
309
+ hurt = HurtLocker.new create_mocks(:locker, :store)
310
+ err = StandardError.new('fmshooop')
311
+ @locker.expects.with_lock(:main).yields
312
+ @store.expects.eat("some info").raises(err)
313
+
314
+ hurt.do_the_thing(:main, "some info")
315
+
316
+ assert_same err, hurt.caught, "Expected that error to be handled internally"
317
+ verify_mocks
318
+ end
319
+
320
+ it "actually returns 'false' instead of nil when mocking boolean return values" do
321
+ create_mock :car
322
+ @car.expects.ignition_on?.returns(true)
323
+ assert_equal true, @car.ignition_on?, "Should be true"
324
+ @car.expects.ignition_on?.returns(false)
325
+ assert_equal false, @car.ignition_on?, "Should be false"
326
+ end
327
+
328
+ it "can mock most methods inherited from object using literal syntax" do
329
+ target_methods = %w|id clone display dup eql? ==|
330
+ create_mock :foo
331
+ target_methods.each do |m|
332
+ eval %{@foo.expects(m, "some stuff")}
333
+ eval %{@foo.#{m} "some stuff"}
334
+ end
335
+ end
336
+
337
+ it "provides 'expect' as an alias for 'expects'" do
338
+ create_mock :foo
339
+ @foo.expect.boomboom
340
+ @foo.boomboom
341
+ verify_mocks
342
+ end
343
+
344
+ it "provides 'should_receive' as an alias for 'expects'" do
345
+ create_mock :foo
346
+ @foo.should_receive.boomboom
347
+ @foo.boomboom
348
+ verify_mocks
349
+ end
350
+
351
+ it "provides 'and_return' as an alias for 'returns'" do
352
+ create_mock :foo
353
+ @foo.expects(:boomboom).and_return :brick
354
+ assert_equal :brick, @foo.boomboom
355
+ verify_mocks
356
+ end
357
+
358
+ it "does not interfere with a core subset of Object methods" do
359
+ create_mock :foo
360
+ @foo.method(:inspect)
361
+ @foo.inspect
362
+ @foo.to_s
363
+ @foo.instance_variables
364
+ @foo.instance_eval("")
365
+ verify_mocks
366
+ end
367
+
368
+ it "can raise errors from within an expectation block" do
369
+ create_mock :cat
370
+ @cat.expects.meow do |arg|
371
+ assert_equal "mix", arg
372
+ raise 'HAIRBALL'
373
+ end
374
+ assert_error RuntimeError, 'HAIRBALL' do
375
+ @cat.meow("mix")
376
+ end
377
+ end
378
+
379
+ it "can raise errors AFTER an expectation block" do
380
+ create_mock :cat
381
+ @cat.expects.meow do |arg|
382
+ assert_equal "mix", arg
383
+ end.raises('HAIRBALL')
384
+ assert_error RuntimeError, 'HAIRBALL' do
385
+ @cat.meow("mix")
386
+ end
387
+ end
388
+
389
+ it "raises an immediate error if a mock is created with a nil name (common mistake: create_mock @cat)" do
390
+ # I make this mistake all the time: Typing in an instance var name instead of a symbol in create_mocks.
391
+ # When you do that, you're effectively passing nil(s) in as mock names.
392
+ assert_error ArgumentError, /'nil' is not a valid name for a mock/ do
393
+ create_mocks @apples, @oranges
394
+ end
395
+ end
396
+
397
+ it "overrides 'inspect' to make nice output" do
398
+ create_mock :hay_bailer
399
+ assert_equal "<Mock hay_bailer>", @hay_bailer.inspect, "Wrong output from 'inspect'"
400
+ end
401
+
402
+ it "raises if prepare_hardmock_control is invoked after create_mocks, or more than once" do
403
+ create_mock :hi_there
404
+ create_mocks :another, :one
405
+ assert_error RuntimeError, /already setup/ do
406
+ prepare_hardmock_control
407
+ end
408
+ end
409
+
410
+ should "support alias verify_hardmocks" do
411
+ create_mock :tree
412
+ @tree.expects(:grow)
413
+ assert_error VerifyError, /unmet/i do
414
+ verify_hardmocks
415
+ end
416
+ end
417
+
418
+ #
419
+ # HELPERS
420
+ #
421
+
422
+ def assert_mock_exists(name)
423
+ assert_not_nil @all_mocks, "@all_mocks not here yet"
424
+ mo = @all_mocks[name]
425
+ assert_not_nil mo, "Mock '#{name}' not in @all_mocks"
426
+ assert_kind_of Mock, mo, "Wrong type of object, wanted a Mock"
427
+ assert_equal name.to_s, mo._name, "Mock '#{name}' had wrong name"
428
+ ivar = self.instance_variable_get("@#{name}")
429
+ assert_not_nil ivar, "Mock '#{name}' not set as ivar"
430
+ assert_same mo, ivar, "Mock '#{name}' ivar not same as instance in @all_mocks"
431
+ assert_same @main_mock_control, mo._control, "Mock '#{name}' doesn't share the main mock control"
432
+ end
433
+ end
434
+
@@ -0,0 +1,479 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+ require 'hardmock'
3
+ require 'assert_error'
4
+
5
+ class StubbingTest < Test::Unit::TestCase
6
+
7
+ #
8
+ # TESTS
9
+ #
10
+
11
+ it "stubs a class method (and un-stubs after reset_stubs)" do
12
+ assert_equal "stones and gravel", Concrete.pour
13
+ assert_equal "glug glug", Jug.pour
14
+
15
+ Concrete.stubs!(:pour).returns("dust and plaster")
16
+
17
+ 3.times do
18
+ assert_equal "dust and plaster", Concrete.pour
19
+ end
20
+
21
+ assert_equal "glug glug", Jug.pour, "Jug's 'pour' method broken"
22
+ assert_equal "stones and gravel", Concrete._hardmock_original_pour, "Original 'pour' method not aliased"
23
+
24
+ assert_equal "For roads", Concrete.describe, "'describe' method broken"
25
+
26
+ reset_stubs
27
+
28
+ assert_equal "stones and gravel", Concrete.pour, "'pour' method not restored"
29
+ assert_equal "For roads", Concrete.describe, "'describe' method broken after verify"
30
+
31
+ end
32
+
33
+ it "stubs several class methods" do
34
+ Concrete.stubs!(:pour).returns("sludge")
35
+ Concrete.stubs!(:describe).returns("awful")
36
+ Jug.stubs!(:pour).returns("milk")
37
+
38
+ assert_equal "sludge", Concrete.pour
39
+ assert_equal "awful", Concrete.describe
40
+ assert_equal "milk", Jug.pour
41
+
42
+ reset_stubs
43
+
44
+ assert_equal "stones and gravel", Concrete.pour
45
+ assert_equal "For roads", Concrete.describe
46
+ assert_equal "glug glug", Jug.pour
47
+ end
48
+
49
+ it "stubs instance methods" do
50
+ slab = Concrete.new
51
+ assert_equal "bonk", slab.hit
52
+
53
+ slab.stubs!(:hit).returns("slap")
54
+ assert_equal "slap", slab.hit, "'hit' not stubbed"
55
+
56
+ reset_stubs
57
+
58
+ assert_equal "bonk", slab.hit, "'hit' not restored"
59
+ end
60
+
61
+ it "stubs instance methods without breaking class methods or other instances" do
62
+ slab = Concrete.new
63
+ scrape = Concrete.new
64
+ assert_equal "an instance", slab.describe
65
+ assert_equal "an instance", scrape.describe
66
+ assert_equal "For roads", Concrete.describe
67
+
68
+ slab.stubs!(:describe).returns("new instance describe")
69
+ assert_equal "new instance describe", slab.describe, "'describe' on instance not stubbed"
70
+ assert_equal "an instance", scrape.describe, "'describe' on 'scrape' instance broken"
71
+ assert_equal "For roads", Concrete.describe, "'describe' class method broken"
72
+
73
+ reset_stubs
74
+
75
+ assert_equal "an instance", slab.describe, "'describe' instance method not restored"
76
+ assert_equal "an instance", scrape.describe, "'describe' on 'scrape' instance broken after restore"
77
+ assert_equal "For roads", Concrete.describe, "'describe' class method broken after restore"
78
+ end
79
+
80
+ should "allow stubbing of nonexistant class methods" do
81
+ Concrete.stubs!(:funky).returns('juice')
82
+ assert_equal 'juice', Concrete.funky
83
+ end
84
+
85
+ should "allow stubbing of nonexistant instance methods" do
86
+ chunk = Concrete.new
87
+ chunk.stubs!(:shark).returns('bite')
88
+ assert_equal 'bite', chunk.shark
89
+ end
90
+
91
+ should "allow re-stubbing" do
92
+ Concrete.stubs!(:pour).returns("one")
93
+ assert_equal "one", Concrete.pour
94
+
95
+ Concrete.stubs!(:pour).raises("hell")
96
+ assert_error RuntimeError, /hell/ do
97
+ Concrete.pour
98
+ end
99
+
100
+ Concrete.stubs!(:pour).returns("two")
101
+ assert_equal "two", Concrete.pour
102
+
103
+ reset_stubs
104
+
105
+ assert_equal "stones and gravel", Concrete.pour
106
+ end
107
+
108
+ it "does nothing with a runtime block when simply stubbing" do
109
+ slab = Concrete.new
110
+ slab.stubs!(:hit) do |nothing|
111
+ raise "BOOOMM!"
112
+ end
113
+ slab.hit
114
+ reset_stubs
115
+ end
116
+
117
+ it "can raise errors from a stubbed method" do
118
+ Concrete.stubs!(:pour).raises(StandardError.new("no!"))
119
+ assert_error StandardError, /no!/ do
120
+ Concrete.pour
121
+ end
122
+ end
123
+
124
+ it "provides string syntax for convenient raising of RuntimeErrors" do
125
+ Concrete.stubs!(:pour).raises("never!")
126
+ assert_error RuntimeError, /never!/ do
127
+ Concrete.pour
128
+ end
129
+ end
130
+
131
+
132
+ #
133
+ # Per-method mocking on classes or instances
134
+ #
135
+
136
+ it "mocks specific methods on existing classes, and returns the class method to normal after verification" do
137
+
138
+ assert_equal "stones and gravel", Concrete.pour, "Concrete.pour is already messed up"
139
+
140
+ Concrete.expects!(:pour).returns("ALIGATORS")
141
+ assert_equal "ALIGATORS", Concrete.pour
142
+
143
+ verify_mocks
144
+ assert_equal "stones and gravel", Concrete.pour, "Concrete.pour not restored"
145
+ end
146
+
147
+ it "flunks if expected class method is not invoked" do
148
+
149
+ Concrete.expects!(:pour).returns("ALIGATORS")
150
+ assert_error(Hardmock::VerifyError, /Concrete.pour/, /unmet expectations/i) do
151
+ verify_mocks
152
+ end
153
+ clear_expectations
154
+ end
155
+
156
+ it "supports all normal mock functionality for class methods" do
157
+
158
+ Concrete.expects!(:pour, "two tons").returns("mice")
159
+ Concrete.expects!(:pour, "three tons").returns("cats")
160
+ Concrete.expects!(:pour, "four tons").raises("Can't do it")
161
+ Concrete.expects!(:pour) do |some, args|
162
+ "==#{some}+#{args}=="
163
+ end
164
+
165
+ assert_equal "mice", Concrete.pour("two tons")
166
+ assert_equal "cats", Concrete.pour("three tons")
167
+ assert_error(RuntimeError, /Can't do it/) do
168
+ Concrete.pour("four tons")
169
+ end
170
+ assert_equal "==first+second==", Concrete.pour("first","second")
171
+ end
172
+
173
+
174
+ it "enforces inter-mock ordering when mocking class methods" do
175
+ create_mocks :truck, :foreman
176
+
177
+ @truck.expects.backup
178
+ Concrete.expects!(:pour, "something")
179
+ @foreman.expects.shout
180
+
181
+ @truck.backup
182
+ assert_error Hardmock::ExpectationError, /wrong/i, /expected call/i, /Concrete.pour/ do
183
+ @foreman.shout
184
+ end
185
+ assert_error Hardmock::VerifyError, /unmet expectations/i, /foreman.shout/ do
186
+ verify_mocks
187
+ end
188
+ clear_expectations
189
+ end
190
+
191
+ should "allow mocking non-existant class methods" do
192
+ Concrete.expects!(:something).returns("else")
193
+ assert_equal "else", Concrete.something
194
+ end
195
+
196
+ it "mocks specific methods on existing instances, then restore them after verify" do
197
+
198
+ slab = Concrete.new
199
+ assert_equal "bonk", slab.hit
200
+
201
+ slab.expects!(:hit).returns("slap")
202
+ assert_equal "slap", slab.hit, "'hit' not stubbed"
203
+
204
+ verify_mocks
205
+ assert_equal "bonk", slab.hit, "'hit' not restored"
206
+ end
207
+
208
+ it "flunks if expected instance method is not invoked" do
209
+
210
+ slab = Concrete.new
211
+ slab.expects!(:hit)
212
+
213
+ assert_error Hardmock::VerifyError, /unmet expectations/i, /Concrete.hit/ do
214
+ verify_mocks
215
+ end
216
+ clear_expectations
217
+ end
218
+
219
+ it "supports all normal mock functionality for instance methods" do
220
+
221
+ slab = Concrete.new
222
+
223
+ slab.expects!(:hit, "soft").returns("hey")
224
+ slab.expects!(:hit, "hard").returns("OOF")
225
+ slab.expects!(:hit).raises("stoppit")
226
+ slab.expects!(:hit) do |some, args|
227
+ "==#{some}+#{args}=="
228
+ end
229
+
230
+ assert_equal "hey", slab.hit("soft")
231
+ assert_equal "OOF", slab.hit("hard")
232
+ assert_error(RuntimeError, /stoppit/) do
233
+ slab.hit
234
+ end
235
+ assert_equal "==first+second==", slab.hit("first","second")
236
+
237
+ end
238
+
239
+ it "enforces inter-mock ordering when mocking instance methods" do
240
+ create_mocks :truck, :foreman
241
+ slab1 = Concrete.new
242
+ slab2 = Concrete.new
243
+
244
+ @truck.expects.backup
245
+ slab1.expects!(:hit)
246
+ @foreman.expects.shout
247
+ slab2.expects!(:hit)
248
+ @foreman.expects.whatever
249
+
250
+ @truck.backup
251
+ slab1.hit
252
+ @foreman.shout
253
+ assert_error Hardmock::ExpectationError, /wrong/i, /expected call/i, /Concrete.hit/ do
254
+ @foreman.whatever
255
+ end
256
+ assert_error Hardmock::VerifyError, /unmet expectations/i, /foreman.whatever/ do
257
+ verify_mocks
258
+ end
259
+ clear_expectations
260
+ end
261
+
262
+ should "allow mocking non-existant instance methods" do
263
+ slab = Concrete.new
264
+ slab.expects!(:wholly).returns('happy')
265
+ assert_equal 'happy', slab.wholly
266
+ end
267
+
268
+ should "support concrete expectations that deal with runtime blocks" do
269
+
270
+ Concrete.expects!(:pour, "a lot") do |how_much, block|
271
+ assert_equal "a lot", how_much, "Wrong how_much arg"
272
+ assert_not_nil block, "nil runtime block"
273
+ assert_equal "the block value", block.call, "Wrong runtime block value"
274
+ end
275
+
276
+ Concrete.pour("a lot") do
277
+ "the block value"
278
+ end
279
+
280
+ end
281
+
282
+ it "can stub methods on mock objects" do
283
+ create_mock :horse
284
+ @horse.stubs!(:speak).returns("silence")
285
+ @horse.stubs!(:hello).returns("nothing")
286
+ @horse.expects(:canter).returns("clip clop")
287
+
288
+ assert_equal "silence", @horse.speak
289
+ assert_equal "clip clop", @horse.canter
290
+ assert_equal "silence", @horse.speak
291
+ assert_equal "silence", @horse.speak
292
+ assert_equal "nothing", @horse.hello
293
+ assert_equal "nothing", @horse.hello
294
+
295
+ verify_mocks
296
+ reset_stubs
297
+ end
298
+
299
+ it "can stub the new method and return values" do
300
+ Concrete.stubs!(:new).returns("this value")
301
+ assert_equal "this value", Concrete.new, "did not properly stub new class method"
302
+ reset_stubs
303
+ end
304
+
305
+ it "can mock the new method and return values" do
306
+ Concrete.expects!(:new).with("foo").returns("hello")
307
+ Concrete.expects!(:new).with("bar").returns("world")
308
+
309
+ assert_equal "hello", Concrete.new("foo"), "did not properly mock out new class method"
310
+ assert_equal "world", Concrete.new("bar"), "did not properly mock out new class method"
311
+
312
+ verify_mocks
313
+ reset_stubs
314
+ end
315
+
316
+ it "can mock several different class methods at once" do
317
+ sim_code = lambda do |input|
318
+ record = Multitool.find_record(input)
319
+ report = Multitool.generate_report(record)
320
+ Multitool.format_output(report)
321
+ end
322
+
323
+ @identifier = "the id"
324
+ @record = "the record"
325
+ @report = "the report"
326
+ @output = "the output"
327
+
328
+ Multitool.expects!(:find_record).with(@identifier).returns(@record)
329
+ Multitool.expects!(:generate_report).with(@record).returns(@report)
330
+ Multitool.expects!(:format_output).with(@report).returns(@output)
331
+
332
+ result = sim_code.call(@identifier)
333
+ assert_equal @output, result, "Wrong output"
334
+ end
335
+
336
+ it "can handle a mix of different and repeat class method mock calls" do
337
+ prep = lambda {
338
+ Multitool.expects!(:find_record).with("A").returns("1")
339
+ Multitool.expects!(:generate_report).with("1")
340
+ Multitool.expects!(:find_record).with("B").returns("2")
341
+ Multitool.expects!(:generate_report).with("2")
342
+ }
343
+
344
+ prep[]
345
+ Multitool.generate_report(Multitool.find_record("A"))
346
+ Multitool.generate_report(Multitool.find_record("B"))
347
+
348
+ prep[]
349
+ Multitool.generate_report(Multitool.find_record("A"))
350
+ assert_error Hardmock::ExpectationError, /Wrong arguments/, /find_record\("B"\)/, /find_record\("C"\)/ do
351
+ Multitool.generate_report(Multitool.find_record("C"))
352
+ end
353
+ clear_expectations
354
+ end
355
+
356
+ it "can mock several concrete instance methods at once" do
357
+ inst = OtherMultitool.new
358
+ sim_code = lambda do |input|
359
+ record = inst.find_record(input)
360
+ report = inst.generate_report(record)
361
+ inst.format_output(report)
362
+ end
363
+
364
+ @identifier = "the id"
365
+ @record = "the record"
366
+ @report = "the report"
367
+ @output = "the output"
368
+
369
+ inst.expects!(:find_record).with(@identifier).returns(@record)
370
+ inst.expects!(:generate_report).with(@record).returns(@report)
371
+ inst.expects!(:format_output).with(@report).returns(@output)
372
+
373
+ result = sim_code.call(@identifier)
374
+ assert_equal @output, result, "Wrong output"
375
+ end
376
+
377
+ it "verifies all concrete expects! from several different expectations" do
378
+ Multitool.expects!(:find_record)
379
+ Multitool.expects!(:generate_report)
380
+ Multitool.expects!(:format_output)
381
+
382
+ Multitool.find_record
383
+ Multitool.generate_report
384
+
385
+ assert_error Hardmock::VerifyError, /unmet expectations/i, /format_output/i do
386
+ verify_mocks
387
+ end
388
+ end
389
+
390
+ it "will not allow expects! to be used on a mock object" do
391
+ create_mock :cow
392
+ assert_error Hardmock::StubbingError, /expects!/, /mock/i, /something/ do
393
+ @cow.expects!(:something)
394
+ end
395
+ end
396
+
397
+ it "does not allow stubbing on nil objects" do
398
+ [ nil, @this_is_nil ].each do |nil_obj|
399
+ assert_error Hardmock::StubbingError, /cannot/i, /nil/i, /intentionally/ do
400
+ nil_obj.stubs!(:wont_work)
401
+ end
402
+ end
403
+ end
404
+
405
+ it "does not allow concrete method mocking on nil objects" do
406
+ [ nil, @this_is_nil ].each do |nil_obj|
407
+ assert_error Hardmock::StubbingError, /cannot/i, /nil/i, /intentionally/ do
408
+ nil_obj.expects!(:wont_work)
409
+ end
410
+ end
411
+ end
412
+
413
+ it "provides an alternate method for stubbing on nil objects" do
414
+ @this_is_nil.intentionally_stubs!(:bogus).returns('output')
415
+ assert_equal 'output', @this_is_nil.bogus
416
+ end
417
+
418
+ it "provides an alternate method for mocking concreate methods on nil objects" do
419
+ @this_is_nil.intentionally_expects!(:bogus).returns('output')
420
+ assert_error Hardmock::VerifyError, /unmet expectations/i, /NilClass.bogus/ do
421
+ verify_mocks
422
+ end
423
+ end
424
+
425
+ #
426
+ # HELPERS
427
+ #
428
+
429
+ class Concrete
430
+ def initialize; end
431
+ def self.pour
432
+ "stones and gravel"
433
+ end
434
+
435
+ def self.describe
436
+ "For roads"
437
+ end
438
+
439
+ def hit
440
+ "bonk"
441
+ end
442
+
443
+ def describe
444
+ "an instance"
445
+ end
446
+ end
447
+
448
+ class Jug
449
+ def self.pour
450
+ "glug glug"
451
+ end
452
+ end
453
+
454
+ class Multitool
455
+ def self.find_record(*a)
456
+ raise "The real Multitool.find_record was called with #{a.inspect}"
457
+ end
458
+ def self.generate_report(*a)
459
+ raise "The real Multitool.generate_report was called with #{a.inspect}"
460
+ end
461
+ def self.format_output(*a)
462
+ raise "The real Multitool.format_output was called with #{a.inspect}"
463
+ end
464
+ end
465
+
466
+ class OtherMultitool
467
+ def find_record(*a)
468
+ raise "The real OtherMultitool#find_record was called with #{a.inspect}"
469
+ end
470
+ def generate_report(*a)
471
+ raise "The real OtherMultitool#generate_report was called with #{a.inspect}"
472
+ end
473
+ def format_output(*a)
474
+ raise "The real OtherMultitool#format_output was called with #{a.inspect}"
475
+ end
476
+ end
477
+
478
+ end
479
+