dwaite-cucumber 0.3.101

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 (454) hide show
  1. data/History.txt +1067 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +453 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +78 -0
  8. data/config/requirements.rb +15 -0
  9. data/cucumber.yml +2 -0
  10. data/examples/cs/README.textile +1 -0
  11. data/examples/cs/Rakefile +12 -0
  12. data/examples/cs/compile.bat +1 -0
  13. data/examples/cs/features/addition.feature +16 -0
  14. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  15. data/examples/cs/src/demo/Calculator.cs +20 -0
  16. data/examples/dos_line_endings/Rakefile +6 -0
  17. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  18. data/examples/i18n/README.textile +18 -0
  19. data/examples/i18n/Rakefile +32 -0
  20. data/examples/i18n/ar/Rakefile +6 -0
  21. data/examples/i18n/ar/features/addition.feature +17 -0
  22. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/ar/lib/calculator.rb +11 -0
  24. data/examples/i18n/bg/Rakefile +6 -0
  25. data/examples/i18n/bg/features/addition.feature +12 -0
  26. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  27. data/examples/i18n/bg/features/division.feature +17 -0
  28. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  29. data/examples/i18n/bg/features/support/env.rb +6 -0
  30. data/examples/i18n/bg/features/support/world.rb +8 -0
  31. data/examples/i18n/bg/lib/calculator.rb +24 -0
  32. data/examples/i18n/cat/Rakefile +6 -0
  33. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  34. data/examples/i18n/cat/features/suma.feature +17 -0
  35. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  36. data/examples/i18n/da/Rakefile +6 -0
  37. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
  38. data/examples/i18n/da/features/summering.feature +18 -0
  39. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  40. data/examples/i18n/de/Rakefile +6 -0
  41. data/examples/i18n/de/features/addition.feature +17 -0
  42. data/examples/i18n/de/features/division.feature +10 -0
  43. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  44. data/examples/i18n/de/lib/calculator.rb +14 -0
  45. data/examples/i18n/en/Rakefile +6 -0
  46. data/examples/i18n/en/features/addition.feature +17 -0
  47. data/examples/i18n/en/features/division.feature +10 -0
  48. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  49. data/examples/i18n/en/lib/calculator.rb +14 -0
  50. data/examples/i18n/en-lol/Rakefile +6 -0
  51. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  52. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  53. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  54. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  55. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  56. data/examples/i18n/es/Rakefile +6 -0
  57. data/examples/i18n/es/features/adicion.feature +17 -0
  58. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  59. data/examples/i18n/es/lib/calculador.rb +14 -0
  60. data/examples/i18n/et/Rakefile +6 -0
  61. data/examples/i18n/et/features/jagamine.feature +10 -0
  62. data/examples/i18n/et/features/liitmine.feature +17 -0
  63. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  64. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  65. data/examples/i18n/fi/Rakefile +6 -0
  66. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  67. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  68. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  69. data/examples/i18n/fi/lib/laskin.rb +14 -0
  70. data/examples/i18n/fr/Rakefile +6 -0
  71. data/examples/i18n/fr/features/addition.feature +18 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/Rakefile +6 -0
  80. data/examples/i18n/hu/features/addition.feature +17 -0
  81. data/examples/i18n/hu/features/division.feature +10 -0
  82. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  83. data/examples/i18n/hu/lib/calculator.rb +14 -0
  84. data/examples/i18n/id/Rakefile +6 -0
  85. data/examples/i18n/id/features/addition.feature +17 -0
  86. data/examples/i18n/id/features/division.feature +10 -0
  87. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  88. data/examples/i18n/id/lib/calculator.rb +14 -0
  89. data/examples/i18n/it/Rakefile +6 -0
  90. data/examples/i18n/it/features/somma.feature +11 -0
  91. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  92. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  93. data/examples/i18n/ja/Rakefile +6 -0
  94. data/examples/i18n/ja/features/addition.feature +17 -0
  95. data/examples/i18n/ja/features/division.feature +10 -0
  96. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  97. data/examples/i18n/ja/lib/calculator.rb +14 -0
  98. data/examples/i18n/ko/Rakefile +6 -0
  99. data/examples/i18n/ko/features/addition.feature +17 -0
  100. data/examples/i18n/ko/features/division.feature +11 -0
  101. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  102. data/examples/i18n/ko/lib/calculator.rb +14 -0
  103. data/examples/i18n/lt/Rakefile +6 -0
  104. data/examples/i18n/lt/features/addition.feature +17 -0
  105. data/examples/i18n/lt/features/division.feature +10 -0
  106. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  107. data/examples/i18n/lt/lib/calculator.rb +14 -0
  108. data/examples/i18n/lv/Rakefile +6 -0
  109. data/examples/i18n/lv/features/addition.feature +17 -0
  110. data/examples/i18n/lv/features/division.feature +10 -0
  111. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lv/lib/calculator.rb +14 -0
  113. data/examples/i18n/no/Rakefile +6 -0
  114. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  115. data/examples/i18n/no/features/summering.feature +19 -0
  116. data/examples/i18n/no/features/support/env.rb +6 -0
  117. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  118. data/examples/i18n/pl/Rakefile +6 -0
  119. data/examples/i18n/pl/features/addition.feature +17 -0
  120. data/examples/i18n/pl/features/division.feature +10 -0
  121. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/pl/features/support/env.rb +6 -0
  123. data/examples/i18n/pl/lib/calculator.rb +14 -0
  124. data/examples/i18n/pt/Rakefile +6 -0
  125. data/examples/i18n/pt/features/adicao.feature +11 -0
  126. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  127. data/examples/i18n/pt/features/support/env.rb +6 -0
  128. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  129. data/examples/i18n/ro/Rakefile +6 -0
  130. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  131. data/examples/i18n/ro/features/suma.feature +11 -0
  132. data/examples/i18n/ro/lib/calculator.rb +11 -0
  133. data/examples/i18n/ru/Rakefile +6 -0
  134. data/examples/i18n/ru/features/addition.feature +11 -0
  135. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  136. data/examples/i18n/ru/features/division.feature +16 -0
  137. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  138. data/examples/i18n/ru/features/support/env.rb +6 -0
  139. data/examples/i18n/ru/features/support/world.rb +8 -0
  140. data/examples/i18n/ru/lib/calculator.rb +24 -0
  141. data/examples/i18n/se/Rakefile +6 -0
  142. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  143. data/examples/i18n/se/features/summering.feature +18 -0
  144. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  145. data/examples/i18n/sk/Rakefile +6 -0
  146. data/examples/i18n/sk/features/addition.feature +17 -0
  147. data/examples/i18n/sk/features/division.feature +10 -0
  148. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  149. data/examples/i18n/sk/lib/calculator.rb +14 -0
  150. data/examples/i18n/uz/Rakefile +6 -0
  151. data/examples/i18n/uz/features/addition.feature +10 -0
  152. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  153. data/examples/i18n/uz/features/division.feature +17 -0
  154. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  155. data/examples/i18n/uz/features/support/env.rb +6 -0
  156. data/examples/i18n/uz/features/support/world.rb +8 -0
  157. data/examples/i18n/uz/lib/calculator.rb +24 -0
  158. data/examples/i18n/zh-CN/Rakefile +6 -0
  159. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  160. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  161. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  162. data/examples/i18n/zh-TW/Rakefile +6 -0
  163. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  164. data/examples/i18n/zh-TW/features/division.feature +11 -0
  165. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  166. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  167. data/examples/java/README.textile +18 -0
  168. data/examples/java/build.xml +33 -0
  169. data/examples/java/features/hello.feature +11 -0
  170. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  171. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  172. data/examples/java/features/tree.feature +9 -0
  173. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  174. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  175. data/examples/junit/features/pending.feature +5 -0
  176. data/examples/junit/features/step_definitions/steps.rb +11 -0
  177. data/examples/pure_java/README.textile +5 -0
  178. data/examples/python/features/fibonacci.feature +19 -0
  179. data/examples/python/features/step_definitions/fib_steps.py +3 -0
  180. data/examples/python/features/step_definitions/fib_steps.rb +7 -0
  181. data/examples/python/features/support/env.rb +21 -0
  182. data/examples/python/lib/fib.py +7 -0
  183. data/examples/selenium/Rakefile +6 -0
  184. data/examples/selenium/features/search.feature +9 -0
  185. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  186. data/examples/selenium/features/support/env.rb +19 -0
  187. data/examples/selenium_webrat/Rakefile +6 -0
  188. data/examples/selenium_webrat/config.ru +0 -0
  189. data/examples/selenium_webrat/features/search.feature +9 -0
  190. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  191. data/examples/selenium_webrat/features/support/env.rb +45 -0
  192. data/examples/self_test/README.textile +6 -0
  193. data/examples/self_test/Rakefile +6 -0
  194. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  195. data/examples/self_test/features/background/background_with_name.feature +7 -0
  196. data/examples/self_test/features/background/failing_background.feature +12 -0
  197. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  198. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  199. data/examples/self_test/features/background/passing_background.feature +10 -0
  200. data/examples/self_test/features/background/pending_background.feature +10 -0
  201. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  202. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  203. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  204. data/examples/self_test/features/failing_expectation.feature +4 -0
  205. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  206. data/examples/self_test/features/multiline_name.feature +27 -0
  207. data/examples/self_test/features/outline_sample.feature +15 -0
  208. data/examples/self_test/features/sample.feature +21 -0
  209. data/examples/self_test/features/search_sample.feature +32 -0
  210. data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
  211. data/examples/self_test/features/support/env.rb +24 -0
  212. data/examples/self_test/features/tags_sample.feature +17 -0
  213. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  214. data/examples/self_test/features/transform_sample.feature +10 -0
  215. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  216. data/examples/self_test/list-of-features.txt +1 -0
  217. data/examples/sinatra/README.textile +13 -0
  218. data/examples/sinatra/Rakefile +6 -0
  219. data/examples/sinatra/app.rb +14 -0
  220. data/examples/sinatra/features/add.feature +11 -0
  221. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  222. data/examples/sinatra/features/support/env.rb +32 -0
  223. data/examples/sinatra/views/add.erb +5 -0
  224. data/examples/sinatra/views/layout.erb +8 -0
  225. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  226. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  227. data/examples/test_unit/Rakefile +6 -0
  228. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  229. data/examples/test_unit/features/test_unit.feature +9 -0
  230. data/examples/tickets/Rakefile +16 -0
  231. data/examples/tickets/features/172.feature +28 -0
  232. data/examples/tickets/features/177/1.feature +29 -0
  233. data/examples/tickets/features/177/2.feature +21 -0
  234. data/examples/tickets/features/177/3.feature +18 -0
  235. data/examples/tickets/features/180.feature +7 -0
  236. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  237. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  238. data/examples/tickets/features/236.feature +13 -0
  239. data/examples/tickets/features/241.feature +13 -0
  240. data/examples/tickets/features/246.feature +4 -0
  241. data/examples/tickets/features/248.feature +11 -0
  242. data/examples/tickets/features/270/back.feature +14 -0
  243. data/examples/tickets/features/270/back.steps.rb +14 -0
  244. data/examples/tickets/features/272/hooks.feature +26 -0
  245. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  246. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  247. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  248. data/examples/tickets/features/279/wrong.feature_ +11 -0
  249. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  250. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  251. data/examples/tickets/features/306/only_background.feature +4 -0
  252. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  253. data/examples/tickets/features/lib/pantry.rb +20 -0
  254. data/examples/tickets/features/scenario_outline.feature +95 -0
  255. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  256. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  257. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  258. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  259. data/examples/tickets/features/table_diffing.feature +13 -0
  260. data/examples/tickets/features/tickets.feature +28 -0
  261. data/examples/watir/README.textile +16 -0
  262. data/examples/watir/Rakefile +6 -0
  263. data/examples/watir/features/search.feature +12 -0
  264. data/examples/watir/features/step_definitons/search_steps.rb +26 -0
  265. data/examples/watir/features/support/env.rb +32 -0
  266. data/features/background.feature +311 -0
  267. data/features/bug_371.feature +32 -0
  268. data/features/cucumber_cli.feature +667 -0
  269. data/features/cucumber_cli_diff_disabled.feature +54 -0
  270. data/features/cucumber_cli_outlines.feature +109 -0
  271. data/features/custom_formatter.feature +11 -0
  272. data/features/drb_server_integration.feature +173 -0
  273. data/features/exception_in_after_block.feature +102 -0
  274. data/features/exception_in_after_step_block.feature +104 -0
  275. data/features/exception_in_before_block.feature +47 -0
  276. data/features/exclude_files.feature +20 -0
  277. data/features/expand.feature +49 -0
  278. data/features/html_formatter/a.html +183 -0
  279. data/features/html_formatter.feature +7 -0
  280. data/features/junit_formatter.feature +89 -0
  281. data/features/language_from_header.feature +30 -0
  282. data/features/multiline_names.feature +43 -0
  283. data/features/post_configuration_hook.feature +37 -0
  284. data/features/profiles.feature +112 -0
  285. data/features/rake_task.feature +178 -0
  286. data/features/report_called_undefined_steps.feature +35 -0
  287. data/features/snippet.feature +22 -0
  288. data/features/step_definitions/cucumber_steps.rb +154 -0
  289. data/features/step_definitions/extra_steps.rb +2 -0
  290. data/features/steps_formatter.feature +25 -0
  291. data/features/support/env.rb +139 -0
  292. data/features/table_diffing.feature +45 -0
  293. data/features/transform.feature +24 -0
  294. data/features/unicode_table.feature +35 -0
  295. data/features/usage.feature +132 -0
  296. data/features/work_in_progress.feature +158 -0
  297. data/gem_tasks/contributors.rake +12 -0
  298. data/gem_tasks/deployment.rake +11 -0
  299. data/gem_tasks/environment.rake +7 -0
  300. data/gem_tasks/features.rake +11 -0
  301. data/gem_tasks/fix_cr_lf.rake +10 -0
  302. data/gem_tasks/flog.rake +4 -0
  303. data/gem_tasks/gemspec.rake +10 -0
  304. data/gem_tasks/rspec.rake +45 -0
  305. data/gem_tasks/sass.rake +4 -0
  306. data/gem_tasks/sdoc.rake +7 -0
  307. data/lib/README.rdoc +12 -0
  308. data/lib/autotest/cucumber.rb +6 -0
  309. data/lib/autotest/cucumber_mixin.rb +125 -0
  310. data/lib/autotest/cucumber_rails.rb +6 -0
  311. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  312. data/lib/autotest/cucumber_rspec.rb +6 -0
  313. data/lib/autotest/discover.rb +9 -0
  314. data/lib/cucumber/ast/background.rb +63 -0
  315. data/lib/cucumber/ast/comment.rb +31 -0
  316. data/lib/cucumber/ast/examples.rb +32 -0
  317. data/lib/cucumber/ast/feature.rb +81 -0
  318. data/lib/cucumber/ast/feature_element.rb +61 -0
  319. data/lib/cucumber/ast/features.rb +40 -0
  320. data/lib/cucumber/ast/outline_table.rb +146 -0
  321. data/lib/cucumber/ast/py_string.rb +57 -0
  322. data/lib/cucumber/ast/scenario.rb +108 -0
  323. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  324. data/lib/cucumber/ast/step.rb +116 -0
  325. data/lib/cucumber/ast/step_collection.rb +76 -0
  326. data/lib/cucumber/ast/step_invocation.rb +166 -0
  327. data/lib/cucumber/ast/table.rb +626 -0
  328. data/lib/cucumber/ast/tags.rb +44 -0
  329. data/lib/cucumber/ast/visitor.rb +115 -0
  330. data/lib/cucumber/ast.rb +29 -0
  331. data/lib/cucumber/broadcaster.rb +13 -0
  332. data/lib/cucumber/cli/configuration.rb +190 -0
  333. data/lib/cucumber/cli/drb_client.rb +26 -0
  334. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  335. data/lib/cucumber/cli/main.rb +116 -0
  336. data/lib/cucumber/cli/options.rb +394 -0
  337. data/lib/cucumber/cli/profile_loader.rb +70 -0
  338. data/lib/cucumber/constantize.rb +28 -0
  339. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  340. data/lib/cucumber/core_ext/proc.rb +29 -0
  341. data/lib/cucumber/core_ext/string.rb +48 -0
  342. data/lib/cucumber/feature_file.rb +54 -0
  343. data/lib/cucumber/filter.rb +52 -0
  344. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  345. data/lib/cucumber/formatter/color_io.rb +23 -0
  346. data/lib/cucumber/formatter/console.rb +185 -0
  347. data/lib/cucumber/formatter/cucumber.css +132 -0
  348. data/lib/cucumber/formatter/cucumber.sass +139 -0
  349. data/lib/cucumber/formatter/duration.rb +13 -0
  350. data/lib/cucumber/formatter/html.rb +261 -0
  351. data/lib/cucumber/formatter/junit.rb +121 -0
  352. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  353. data/lib/cucumber/formatter/pdf.rb +217 -0
  354. data/lib/cucumber/formatter/pretty.rb +222 -0
  355. data/lib/cucumber/formatter/profile.rb +78 -0
  356. data/lib/cucumber/formatter/progress.rb +67 -0
  357. data/lib/cucumber/formatter/rerun.rb +46 -0
  358. data/lib/cucumber/formatter/steps.rb +50 -0
  359. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  360. data/lib/cucumber/formatter/unicode.rb +35 -0
  361. data/lib/cucumber/formatter/usage.rb +86 -0
  362. data/lib/cucumber/formatters/unicode.rb +7 -0
  363. data/lib/cucumber/language_support/language_methods.rb +75 -0
  364. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  365. data/lib/cucumber/language_support.rb +30 -0
  366. data/lib/cucumber/languages.yml +561 -0
  367. data/lib/cucumber/parser/feature.rb +1838 -0
  368. data/lib/cucumber/parser/feature.tt +351 -0
  369. data/lib/cucumber/parser/i18n.tt +42 -0
  370. data/lib/cucumber/parser/natural_language.rb +72 -0
  371. data/lib/cucumber/parser/table.rb +417 -0
  372. data/lib/cucumber/parser/table.tt +71 -0
  373. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  374. data/lib/cucumber/parser.rb +6 -0
  375. data/lib/cucumber/platform.rb +27 -0
  376. data/lib/cucumber/py_support/py_dsl.py +8 -0
  377. data/lib/cucumber/py_support/py_language.py +2 -0
  378. data/lib/cucumber/py_support/py_language.rb +68 -0
  379. data/lib/cucumber/rails/rspec.rb +10 -0
  380. data/lib/cucumber/rails/world.rb +100 -0
  381. data/lib/cucumber/rake/task.rb +241 -0
  382. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  383. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  384. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  386. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  387. data/lib/cucumber/rspec_neuter.rb +23 -0
  388. data/lib/cucumber/step_match.rb +61 -0
  389. data/lib/cucumber/step_mother.rb +307 -0
  390. data/lib/cucumber/version.rb +10 -0
  391. data/lib/cucumber/webrat/element_locator.rb +87 -0
  392. data/lib/cucumber/webrat/table_locator.rb +1 -0
  393. data/lib/cucumber.rb +10 -0
  394. data/rails_generators/cucumber/USAGE +11 -0
  395. data/rails_generators/cucumber/cucumber_generator.rb +70 -0
  396. data/rails_generators/cucumber/templates/cucumber +9 -0
  397. data/rails_generators/cucumber/templates/cucumber.rake +36 -0
  398. data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
  399. data/rails_generators/cucumber/templates/env.rb +27 -0
  400. data/rails_generators/cucumber/templates/paths.rb +27 -0
  401. data/rails_generators/cucumber/templates/spork_env.rb +35 -0
  402. data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
  403. data/rails_generators/feature/USAGE +12 -0
  404. data/rails_generators/feature/feature_generator.rb +40 -0
  405. data/rails_generators/feature/templates/feature.erb +31 -0
  406. data/rails_generators/feature/templates/steps.erb +14 -0
  407. data/spec/cucumber/ast/background_spec.rb +60 -0
  408. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  409. data/spec/cucumber/ast/feature_factory.rb +62 -0
  410. data/spec/cucumber/ast/feature_spec.rb +44 -0
  411. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  412. data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
  413. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  414. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  415. data/spec/cucumber/ast/step_spec.rb +66 -0
  416. data/spec/cucumber/ast/table_spec.rb +394 -0
  417. data/spec/cucumber/broadcaster_spec.rb +15 -0
  418. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  419. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  420. data/spec/cucumber/cli/main_spec.rb +172 -0
  421. data/spec/cucumber/cli/options_spec.rb +331 -0
  422. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  423. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  424. data/spec/cucumber/core_ext/string_spec.rb +43 -0
  425. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  426. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  427. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  428. data/spec/cucumber/formatter/html_spec.rb +18 -0
  429. data/spec/cucumber/formatter/progress_spec.rb +33 -0
  430. data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
  431. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  432. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  433. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  434. data/spec/cucumber/rails/world_spec.rb +16 -0
  435. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
  436. data/spec/cucumber/sell_cucumbers.feature +19 -0
  437. data/spec/cucumber/step_mother_spec.rb +282 -0
  438. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  439. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  440. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  441. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  442. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  443. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  444. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  445. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  446. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  447. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  448. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  449. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  450. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  451. data/spec/cucumber/world/pending_spec.rb +46 -0
  452. data/spec/spec.opts +4 -0
  453. data/spec/spec_helper.rb +18 -0
  454. metadata +561 -0
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ module Cucumber
4
+ describe Broadcaster do
5
+ before do
6
+ @receiver = mock('receiver')
7
+ @broadcaster = Broadcaster.new([@receiver])
8
+ end
9
+
10
+ it "should broadcast methods to registered objects" do
11
+ @receiver.should_receive(:konbanwa).with('good evening')
12
+ @broadcaster.konbanwa('good evening')
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,396 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'yaml'
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe Configuration do
7
+
8
+ def given_cucumber_yml_defined_as(hash_or_string)
9
+ File.stub!(:exist?).and_return(true)
10
+ cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
11
+ IO.stub!(:read).with('cucumber.yml').and_return(cucumber_yml)
12
+ end
13
+
14
+ def given_the_following_files(*files)
15
+ File.stub!(:directory?).and_return(true)
16
+ File.stub!(:file?).and_return(true)
17
+ Dir.stub!(:[]).and_return(files)
18
+ end
19
+
20
+ before(:each) do
21
+ File.stub!(:exist?).and_return(false) # Meaning, no cucumber.yml exists
22
+ Kernel.stub!(:exit).and_return(nil)
23
+ end
24
+
25
+ def config
26
+ @config ||= Configuration.new(@out = StringIO.new, @error = StringIO.new)
27
+ end
28
+
29
+ def reset_config
30
+ @config = nil
31
+ end
32
+
33
+ attr_reader :out, :error
34
+
35
+ it "should require env.rb files first" do
36
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
37
+
38
+ config.parse!(%w{--require /features})
39
+
40
+ config.support_to_load.should == [
41
+ "/features/support/env.rb",
42
+ "/features/support/a_file.rb"
43
+ ]
44
+ end
45
+
46
+ it "should not require env.rb files when --dry-run" do
47
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
48
+
49
+ config.parse!(%w{--require /features --dry-run})
50
+
51
+ config.support_to_load.should == [
52
+ "/features/support/a_file.rb"
53
+ ]
54
+ end
55
+
56
+ it "should require files in vendor/{plugins,gems}/*/cucumber/*.rb" do
57
+ given_the_following_files("/vendor/plugins/plugin_a/cucumber/foo.rb",
58
+ "/vendor/gems/gem_a/cucumber/bar.rb")
59
+
60
+ config.parse!(%w{--require /features})
61
+
62
+ config.step_defs_to_load.should == [
63
+ "/vendor/plugins/plugin_a/cucumber/foo.rb",
64
+ "/vendor/gems/gem_a/cucumber/bar.rb"
65
+ ]
66
+ end
67
+
68
+ describe "--exclude" do
69
+
70
+ it "excludes a ruby file from requiring when the name matches exactly" do
71
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
72
+
73
+ config.parse!(%w{--require /features --exclude a_file.rb})
74
+
75
+ config.all_files_to_load.should == [
76
+ "/features/support/env.rb"
77
+ ]
78
+ end
79
+
80
+ it "excludes all ruby files that match the provided patterns from requiring" do
81
+ given_the_following_files("/features/support/foof.rb","/features/support/bar.rb",
82
+ "/features/support/food.rb","/features/blah.rb",
83
+ "/features/support/fooz.rb")
84
+
85
+ config.parse!(%w{--require /features --exclude foo[df] --exclude blah})
86
+
87
+ config.all_files_to_load.should == [
88
+ "/features/support/bar.rb",
89
+ "/features/support/fooz.rb"
90
+ ]
91
+ end
92
+ end
93
+
94
+ describe '#drb?' do
95
+ it "indicates whether the --drb flag was passed in or not" do
96
+ config.parse!(%w{features})
97
+ config.should_not be_drb
98
+
99
+
100
+ config.parse!(%w{features --drb})
101
+ config.should be_drb
102
+ end
103
+ end
104
+
105
+ describe "#drb_port" do
106
+ it "is nil when not configured" do
107
+ config.parse!([])
108
+ config.drb_port.should be_nil
109
+ end
110
+
111
+ it "is numeric when configured" do
112
+ config.parse!(%w{features --port 1000})
113
+ config.drb_port.should == 1000
114
+ end
115
+
116
+
117
+ end
118
+
119
+ it "uses the default profile when no profile is defined" do
120
+ given_cucumber_yml_defined_as({'default' => '--require some_file'})
121
+
122
+ config.parse!(%w{--format progress})
123
+ config.options[:require].should include('some_file')
124
+ end
125
+
126
+ context '--profile' do
127
+
128
+ it "expands args from profiles in the cucumber.yml file" do
129
+ given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
130
+
131
+ config.parse!(%w{--format progress --profile bongo})
132
+ config.options[:formats].should == [['progress', out]]
133
+ config.options[:require].should == ['from/yml']
134
+ end
135
+
136
+ it "expands args from the default profile when no flags are provided" do
137
+ given_cucumber_yml_defined_as({'default' => '--require from/yml'})
138
+
139
+ config.parse!([])
140
+ config.options[:require].should == ['from/yml']
141
+ end
142
+
143
+ it "parses ERB syntax in the cucumber.yml file" do
144
+ given_cucumber_yml_defined_as({'default' => '<%="--require some_file"%>'})
145
+
146
+ config.parse!([])
147
+ config.options[:require].should include('some_file')
148
+ end
149
+
150
+ it "provides a helpful error message when a specified profile does not exists in cucumber.yml" do
151
+ given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
152
+
153
+ expected_message = <<-END_OF_MESSAGE
154
+ Could not find profile: 'i_do_not_exist'
155
+
156
+ Defined profiles in cucumber.yml:
157
+ * default
158
+ * html_report
159
+ END_OF_MESSAGE
160
+
161
+ lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(ProfileNotFound, expected_message)
162
+ end
163
+
164
+ it "allows profiles to be defined in arrays" do
165
+ given_cucumber_yml_defined_as({'foo' => ['-f','progress']})
166
+
167
+ config.parse!(%w{--profile foo})
168
+ config.options[:formats].should == [['progress', out]]
169
+ end
170
+
171
+ it "disregards default STDOUT formatter defined in profile when another is passed in (via cmd line)" do
172
+ given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
173
+ config.parse!(%w{--format progress --profile foo})
174
+ config.options[:formats].should == [['progress', out]]#, ['pretty', 'pretty.txt']]
175
+ end
176
+
177
+
178
+
179
+ ["--no-profile", "-P"].each do |flag|
180
+ context 'when none is specified with #{flag}' do
181
+ it "disables profiles" do
182
+ given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
183
+
184
+ config.parse!("#{flag} --require some_file.rb".split(" "))
185
+ config.options[:require].should == ['some_file.rb']
186
+ end
187
+
188
+ it "notifies the user that the profiles are being disabled" do
189
+ given_cucumber_yml_defined_as({'default' => '-v'})
190
+
191
+ config.parse!("#{flag} --require some_file.rb".split(" "))
192
+ out.string.should =~ /Disabling profiles.../
193
+ end
194
+ end
195
+ end
196
+
197
+ it "issues a helpful error message when a specified profile exists but is nil or blank" do
198
+ [nil, ' '].each do |bad_input|
199
+ given_cucumber_yml_defined_as({'foo' => bad_input})
200
+
201
+ expected_error = /The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./
202
+ lambda{config.parse!(%w{--profile foo})}.should raise_error(expected_error)
203
+ end
204
+ end
205
+
206
+ it "issues a helpful error message when no YAML file exists and a profile is specified" do
207
+ File.should_receive(:exist?).with('cucumber.yml').and_return(false)
208
+
209
+ expected_error = /cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml./
210
+ lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(expected_error)
211
+ end
212
+
213
+ it "issues a helpful error message when cucumber.yml is blank or malformed" do
214
+ expected_error_message = /cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage./
215
+
216
+ ['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
217
+ given_cucumber_yml_defined_as(bad_input)
218
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
219
+ reset_config
220
+ end
221
+ end
222
+
223
+ it "issues a helpful error message when cucumber.yml can not be parsed" do
224
+ expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage./
225
+
226
+ given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
227
+ YAML.should_receive(:load).and_raise ArgumentError
228
+
229
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
230
+ end
231
+
232
+ it "issues a helpful error message when cucumber.yml can not be parsed by ERB" do
233
+ expected_error_message = /cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage./
234
+ given_cucumber_yml_defined_as("<% this_fails %>")
235
+
236
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
237
+ end
238
+ end
239
+
240
+
241
+ it "should accept --dry-run option" do
242
+ config.parse!(%w{--dry-run})
243
+ config.options[:dry_run].should be_true
244
+ end
245
+
246
+ it "should accept --no-source option" do
247
+ config.parse!(%w{--no-source})
248
+
249
+ config.options[:source].should be_false
250
+ end
251
+
252
+ it "should accept --no-snippets option" do
253
+ config.parse!(%w{--no-snippets})
254
+
255
+ config.options[:snippets].should be_false
256
+ end
257
+
258
+ it "should set snippets and source to false with --quiet option" do
259
+ config.parse!(%w{--quiet})
260
+
261
+ config.options[:snippets].should be_false
262
+ config.options[:source].should be_false
263
+ end
264
+
265
+ it "should accept --verbose option" do
266
+ config.parse!(%w{--verbose})
267
+
268
+ config.options[:verbose].should be_true
269
+ end
270
+
271
+ it "should accept --out option" do
272
+ config.parse!(%w{--out jalla.txt})
273
+ config.options[:formats].should == [['pretty', 'jalla.txt']]
274
+ end
275
+
276
+ it "should accept multiple --out options" do
277
+ config.parse!(%w{--format progress --out file1 --out file2})
278
+ config.options[:formats].should == [['progress', 'file2']]
279
+ end
280
+
281
+ it "should accept multiple --format options and put the STDOUT one first so progress is seen" do
282
+ config.parse!(%w{--format pretty --out pretty.txt --format progress})
283
+ config.options[:formats].should == [['progress', out], ['pretty', 'pretty.txt']]
284
+ end
285
+
286
+ it "should not accept multiple --format options when both use implicit STDOUT" do
287
+ lambda do
288
+ config.parse!(%w{--format pretty --format progress})
289
+ end.should raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
290
+ end
291
+
292
+ it "should not accept multiple --out streams pointing to the same place" do
293
+ lambda do
294
+ config.parse!(%w{--format pretty --out file1 --format progress --out file1})
295
+ end.should raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
296
+ end
297
+
298
+ it "should associate --out to previous --format" do
299
+ config.parse!(%w{--format progress --out file1 --format profile --out file2})
300
+ config.options[:formats].should == [["progress", "file1"], ["profile" ,"file2"]]
301
+ end
302
+
303
+ it "should accept --color option" do
304
+ Term::ANSIColor.should_receive(:coloring=).with(true)
305
+ config.parse!(['--color'])
306
+ end
307
+
308
+ it "should accept --no-color option" do
309
+ Term::ANSIColor.should_receive(:coloring=).with(false)
310
+ config = Configuration.new(StringIO.new)
311
+ config.parse!(['--no-color'])
312
+ end
313
+
314
+ describe "--backtrace" do
315
+ before do
316
+ Cucumber.use_full_backtrace = false
317
+ end
318
+
319
+ it "should show full backtrace when --backtrace is present" do
320
+ config = Main.new(['--backtrace'])
321
+ begin
322
+ "x".should == "y"
323
+ rescue => e
324
+ e.backtrace[0].should_not == "#{__FILE__}:#{__LINE__ - 2}"
325
+ end
326
+ end
327
+
328
+ after do
329
+ Cucumber.use_full_backtrace = false
330
+ end
331
+ end
332
+
333
+ describe "diff output" do
334
+
335
+ it "is enabled by default" do
336
+ config.diff_enabled?.should be_true
337
+ end
338
+
339
+ it "is disabled when the --no-diff option is supplied" do
340
+ config.parse!(%w{--no-diff})
341
+
342
+ config.diff_enabled?.should be_false
343
+ end
344
+
345
+ end
346
+
347
+ it "should accept multiple --name options" do
348
+ config.parse!(['--name', "User logs in", '--name', "User signs up"])
349
+
350
+ config.options[:name_regexps].should include(/User logs in/)
351
+ config.options[:name_regexps].should include(/User signs up/)
352
+ end
353
+
354
+ it "should accept multiple -n options" do
355
+ config.parse!(['-n', "User logs in", '-n', "User signs up"])
356
+
357
+ config.options[:name_regexps].should include(/User logs in/)
358
+ config.options[:name_regexps].should include(/User signs up/)
359
+ end
360
+
361
+ it "should search for all features in the specified directory" do
362
+ File.stub!(:directory?).and_return(true)
363
+ Dir.should_receive(:[]).with("feature_directory/**/*.feature").
364
+ any_number_of_times.and_return(["cucumber.feature"])
365
+
366
+ config.parse!(%w{feature_directory/})
367
+
368
+ config.feature_files.should == ["cucumber.feature"]
369
+ end
370
+
371
+ it "defaults to the features directory when no feature file are provided" do
372
+ File.stub!(:directory?).and_return(true)
373
+ Dir.should_receive(:[]).with("features/**/*.feature").
374
+ any_number_of_times.and_return(["cucumber.feature"])
375
+
376
+ config.parse!(%w{})
377
+
378
+ config.feature_files.should == ["cucumber.feature"]
379
+ end
380
+
381
+ it "should allow specifying environment variables on the command line" do
382
+ config.parse!(["foo=bar"])
383
+ ENV["foo"].should == "bar"
384
+ config.feature_files.should_not include('foo=bar')
385
+ end
386
+
387
+ it "should allow specifying environment variables in profiles" do
388
+ given_cucumber_yml_defined_as({'selenium' => 'RAILS_ENV=selenium'})
389
+ config.parse!(["--profile", "selenium"])
390
+ ENV["RAILS_ENV"].should == "selenium"
391
+ config.feature_files.should_not include('RAILS_ENV=selenium')
392
+ end
393
+
394
+ end
395
+ end
396
+ end
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe DRbClient do
7
+ before(:each) do
8
+ @args = ['features']
9
+ @error_stream = StringIO.new
10
+ @out_stream = StringIO.new
11
+
12
+ @drb_object = mock('DRbObject', :run => true)
13
+ DRbObject.stub!(:new_with_uri).and_return(@drb_object)
14
+ end
15
+
16
+ it "starts up a druby service" do
17
+ DRb.should_receive(:start_service).with("druby://localhost:0")
18
+ DRbClient.run(@args, @error_stream, @out_stream)
19
+ end
20
+
21
+ it "connects to the DRb server" do
22
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8990")
23
+ DRbClient.run(@args, @error_stream, @out_stream)
24
+ end
25
+
26
+ it "runs the features on the DRb server" do
27
+ @drb_object.should_receive(:run).with(@args, @error_stream, @out_stream)
28
+ DRbClient.run(@args, @error_stream, @out_stream)
29
+ end
30
+
31
+ it "returns raises an error when it can't connect to the server" do
32
+ DRbObject.stub!(:new_with_uri).and_raise(DRb::DRbConnError)
33
+ running { DRbClient.run(@args, @error_stream, @out_stream) }.should raise_error(DRbClientError, "No DRb server is running.")
34
+ end
35
+
36
+ it "returns the result from the DRb server call" do
37
+ @drb_object.should_receive(:run).and_return('foo')
38
+ DRbClient.run(@args, @error_stream, @out_stream).should == 'foo'
39
+ end
40
+
41
+ context "with $CUCUMBER_DRB set" do
42
+ before do
43
+ @original_env = ENV['CUCUMBER_DRB']
44
+ ENV['CUCUMBER_DRB'] = '90000'
45
+ end
46
+ after do
47
+ ENV['CUCUMBER_DRB'] = @original_env
48
+ end
49
+ it "connects to specified DRb server" do
50
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:90000")
51
+ DRbClient.run(@args, @error_stream, @out_stream)
52
+ end
53
+ end
54
+
55
+ context "with provided drb_port" do
56
+ before do
57
+ @args = @args + ['--port', '8000']
58
+ end
59
+ it "connects to specified drb port" do
60
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8000")
61
+ DRbClient.run(@args, @error_stream, @out_stream, 8000)
62
+ end
63
+ it "prefers configuration to environment" do
64
+ original = ENV['CUCUMBER_DRB'] = original
65
+ begin
66
+ ENV['CUCUMBER_DRB'] = "4000"
67
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8000")
68
+ DRbClient.run(@args, @error_stream, @out_stream, 8000)
69
+ ensure
70
+ ENV['CUCUMBER_DRB'] = original
71
+ end
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,172 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'yaml'
3
+ begin
4
+ require 'spec/runner/differs/default' # RSpec >=1.2.4
5
+ rescue ::LoadError
6
+ require 'spec/expectations/differs/default' # RSpec <=1.2.3
7
+ end
8
+
9
+ module Cucumber
10
+ module Cli
11
+ describe Main do
12
+ before(:each) do
13
+ @out = StringIO.new
14
+ @err = StringIO.new
15
+ Kernel.stub!(:exit).and_return(nil)
16
+ File.stub!(:exist?).and_return(false) # When Configuration checks for cucumber.yml
17
+ Dir.stub!(:[]).and_return([]) # to prevent cucumber's features dir to being laoded
18
+ end
19
+
20
+ describe "verbose mode" do
21
+
22
+ before(:each) do
23
+ @empty_feature = Ast::Feature.new(nil, Ast::Comment.new(''), Ast::Tags.new(2, []), "Feature", [])
24
+ end
25
+
26
+ it "should show feature files parsed" do
27
+ @cli = Main.new(%w{--verbose example.feature}, @out)
28
+ @cli.stub!(:require)
29
+
30
+ FeatureFile.stub!(:new).and_return(mock("feature file", :parse => @empty_feature))
31
+
32
+ @cli.execute!(StepMother.new)
33
+
34
+ @out.string.should include('example.feature')
35
+ end
36
+
37
+ end
38
+
39
+ describe "diffing" do
40
+
41
+ before :each do
42
+ @configuration = mock('Configuration', :null_object => true, :drb? => false)
43
+ Configuration.should_receive(:new).and_return(@configuration)
44
+
45
+ @step_mother = mock('StepMother', :null_object => true)
46
+
47
+ @cli = Main.new(nil, @out)
48
+ end
49
+
50
+ it "uses Spec Differ::Default when diff is enabled" do
51
+ @configuration.should_receive(:diff_enabled?).and_return(true)
52
+
53
+ ::Spec::Expectations::Differs::Default.should_receive(:new)
54
+
55
+ @cli.execute!(@step_mother)
56
+ end
57
+
58
+ it "does not use Spec Differ::Default when diff is disabled" do
59
+ @configuration.should_receive(:diff_enabled?).and_return(false)
60
+
61
+ ::Spec::Expectations::Differs::Default.should_not_receive(:new)
62
+
63
+ @cli.execute!(@step_mother)
64
+ end
65
+
66
+ end
67
+
68
+ describe "--format with class" do
69
+
70
+ describe "in module" do
71
+
72
+ it "should resolve each module until it gets Formatter class" do
73
+ cli = Main.new(%w{--format ZooModule::MonkeyFormatterClass}, nil)
74
+ mock_module = mock('module')
75
+ Object.stub!(:const_defined?).and_return(true)
76
+ mock_module.stub!(:const_defined?).and_return(true)
77
+
78
+ f = stub('formatter', :null_object => true)
79
+
80
+ Object.should_receive(:const_get).with('ZooModule').and_return(mock_module)
81
+ mock_module.should_receive(:const_get).with('MonkeyFormatterClass').and_return(mock('formatter class', :new => f))
82
+
83
+ cli.execute!(StepMother.new)
84
+ end
85
+
86
+ end
87
+ end
88
+
89
+ describe "setup step sequence" do
90
+
91
+ it "should load files and execute hooks in order" do
92
+ Configuration.stub!(:new).and_return(configuration = mock('configuration', :null_object => true))
93
+ step_mother = mock('step mother', :null_object => true)
94
+ configuration.stub!(:drb?).and_return false
95
+ cli = Main.new(%w{--verbose example.feature}, @out)
96
+ cli.stub!(:require)
97
+
98
+ configuration.stub!(:support_to_load).and_return(['support'])
99
+ configuration.stub!(:step_defs_to_load).and_return(['step defs'])
100
+
101
+ # Support must be loaded first to ensure post configuration hook can
102
+ # run before anything else.
103
+ step_mother.should_receive(:load_code_files).with(['support']).ordered
104
+ # The post configuration hook/s (if any) need to be run next to enable
105
+ # extensions to do their thing before features are loaded
106
+ step_mother.should_receive(:after_configuration).with(configuration).ordered
107
+ # Feature files must be loaded before step definitions are required.
108
+ # This is because i18n step methods are only aliased when
109
+ # features are loaded. If we swap the order, the requires
110
+ # will fail.
111
+ step_mother.should_receive(:load_plain_text_features).ordered
112
+ step_mother.should_receive(:load_code_files).with(['step defs']).ordered
113
+
114
+ cli.execute!(step_mother)
115
+ end
116
+
117
+ end
118
+
119
+ [ProfilesNotDefinedError, YmlLoadError, ProfileNotFound].each do |exception_klass|
120
+
121
+ it "rescues #{exception_klass}, prints the message to the error stream and returns true" do
122
+ Configuration.stub!(:new).and_return(configuration = mock('configuration'))
123
+ configuration.stub!(:parse!).and_raise(exception_klass.new("error message"))
124
+
125
+ main = Main.new('', out = StringIO.new, error = StringIO.new)
126
+ main.execute!(StepMother.new).should be_true
127
+ error.string.should == "error message\n"
128
+ end
129
+ end
130
+
131
+
132
+ context "--drb" do
133
+ before(:each) do
134
+ @configuration = mock('Configuration', :drb? => true, :null_object => true)
135
+ Configuration.stub!(:new).and_return(@configuration)
136
+
137
+ @args = ['features']
138
+
139
+ @cli = Main.new(@args, @out, @err)
140
+ @step_mother = mock('StepMother', :null_object => true)
141
+ end
142
+
143
+ it "delegates the execution to the DRB client passing the args and streams" do
144
+ @configuration.stub :drb_port => 1450
145
+ DRbClient.should_receive(:run).with(@args, @err, @out, 1450).and_return(true)
146
+ @cli.execute!(@step_mother)
147
+ end
148
+
149
+ it "returns the result from the DRbClient" do
150
+ DRbClient.stub!(:run).and_return('foo')
151
+ @cli.execute!(@step_mother).should == 'foo'
152
+ end
153
+
154
+ it "ceases execution if the DrbClient is able to perform the execution" do
155
+ DRbClient.stub!(:run).and_return(true)
156
+ @configuration.should_not_receive(:build_formatter_broadcaster)
157
+ @cli.execute!(@step_mother)
158
+ end
159
+
160
+ context "when the DrbClient is unable to perfrom the execution" do
161
+ before { DRbClient.stub!(:run).and_raise(DRbClientError.new('error message.')) }
162
+
163
+ it "alerts the user that execution will be performed locally" do
164
+ @cli.execute!(@step_mother)
165
+ @err.string.should include("WARNING: error message. Running features locally:")
166
+ end
167
+
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end