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,396 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/parser/natural_language'
3
+
4
+ module Cucumber
5
+ module Parser
6
+ describe Feature do
7
+ before do
8
+ @step_mother = StepMother.new
9
+ @parser = NaturalLanguage.get(@step_mother, 'en').parser
10
+ end
11
+
12
+ after do
13
+ NaturalLanguage.instance_variable_set(:@languages, nil) # So that new StepMothers can be created and have adverbs registered
14
+ end
15
+
16
+ def parse(text)
17
+ feature = @parser.parse_or_fail(text)
18
+ end
19
+
20
+ def parse_file(file)
21
+ FeatureFile.new(File.dirname(__FILE__) + "/../treetop_parser/" + file).parse(@step_mother, {})
22
+ end
23
+
24
+ def parse_example_file(file)
25
+ FeatureFile.new(File.dirname(__FILE__) + "/../../../examples/" + file).parse(@step_mother, {})
26
+ end
27
+
28
+ describe "Comments" do
29
+ it "should parse a file with only a one line comment" do
30
+ parse(%{# My comment
31
+ Feature: hi
32
+ }).to_sexp.should ==
33
+ [:feature, nil, "Feature: hi",
34
+ [:comment, "# My comment\n"]]
35
+ end
36
+
37
+ it "should parse a file with only a multiline comment" do
38
+ parse(%{# Hello
39
+ # World
40
+ Feature: hi
41
+ }).to_sexp.should ==
42
+ [:feature, nil, "Feature: hi",
43
+ [:comment, "# Hello\n# World\n"]]
44
+ end
45
+
46
+ it "should parse a file with no comments" do
47
+ parse("Feature: hi\n").to_sexp.should ==
48
+ [:feature, nil, "Feature: hi"]
49
+ end
50
+
51
+ it "should parse a file with only a multiline comment with newlines" do
52
+ parse("# Hello\n\n# World\n").to_sexp.should ==
53
+ [:feature, nil, "",
54
+ [:comment, "# Hello\n\n# World\n"]]
55
+ end
56
+
57
+ it "should not consume comments as part of a multiline name" do
58
+ parse("Feature: hi\n Scenario: test\n\n#hello\n Scenario: another").to_sexp.should ==
59
+ [:feature, nil, "Feature: hi",
60
+ [:scenario, 2, "Scenario:", "test"],
61
+ [:scenario, 5, "Scenario:", "another",
62
+ [:comment, "#hello\n "]]]
63
+ end
64
+ end
65
+
66
+ describe "Tags" do
67
+ it "should parse a file with tags on a feature" do
68
+ parse("# My comment\n@hello @world Feature: hi\n").to_sexp.should ==
69
+ [:feature, nil, "Feature: hi",
70
+ [:comment, "# My comment\n"],
71
+ [:tag, "hello"],
72
+ [:tag, "world"]]
73
+ end
74
+
75
+ it "should not take the tags as part of a multiline name feature element" do
76
+ parse("Feature: hi\n Scenario: test\n\n@hello Scenario: another").to_sexp.should ==
77
+ [:feature, nil, "Feature: hi",
78
+ [:scenario, 2, "Scenario:", "test"],
79
+ [:scenario, 4, "Scenario:", "another",
80
+ [:tag, "hello"]]]
81
+ end
82
+
83
+ it "should parse a file with tags on a scenario" do
84
+ parse(%{# FC
85
+ @ft
86
+ Feature: hi
87
+
88
+ @st1 @st2
89
+ Scenario: First
90
+ Given Pepper
91
+
92
+ @st3
93
+ @st4 @ST5 @#^%&ST6**!
94
+ Scenario: Second}).to_sexp.should ==
95
+ [:feature, nil, "Feature: hi",
96
+ [:comment, "# FC\n "],
97
+ [:tag, "ft"],
98
+ [:scenario, 6, 'Scenario:', 'First',
99
+ [:tag, "st1"], [:tag, "st2"],
100
+ [:step_invocation, 7, "Given", "Pepper"]
101
+ ],
102
+ [:scenario, 11, 'Scenario:', 'Second',
103
+ [:tag, "st3"], [:tag, "st4"], [:tag, "ST5"], [:tag, "#^%&ST6**!"]]]
104
+ end
105
+ end
106
+
107
+ describe "Background" do
108
+ it "should have steps" do
109
+ parse("Feature: Hi\nBackground:\nGiven I am a step\n").to_sexp.should ==
110
+ [:feature, nil, "Feature: Hi",
111
+ [:background, 2, "Background:",
112
+ [:step, 3, "Given", "I am a step"]]]
113
+ end
114
+
115
+ it "should allow multiline names" do
116
+ parse(%{Feature: Hi
117
+ Background: It is my ambition to say
118
+ in ten sentences
119
+ what others say
120
+ in a whole book.
121
+ Given I am a step}).to_sexp.should ==
122
+ [:feature, nil, "Feature: Hi",
123
+ [:background, 2, "Background:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
124
+ [:step, 6, "Given", "I am a step"]]]
125
+ end
126
+ end
127
+
128
+ describe "Scenarios" do
129
+ it "can be empty" do
130
+ parse("Feature: Hi\n\nScenario: Hello\n").to_sexp.should ==
131
+ [:feature, nil, "Feature: Hi",
132
+ [:scenario, 3, "Scenario:", "Hello"]]
133
+ end
134
+
135
+ it "should allow whitespace lines after the Scenario line" do
136
+ parse(%{Feature: Foo
137
+
138
+ Scenario: bar
139
+
140
+ Given baz})
141
+ end
142
+
143
+ it "should have steps" do
144
+ parse("Feature: Hi\nScenario: Hello\nGiven I am a step\n").to_sexp.should ==
145
+ [:feature, nil, "Feature: Hi",
146
+ [:scenario, 2, "Scenario:", "Hello",
147
+ [:step_invocation, 3, "Given", "I am a step"]]]
148
+ end
149
+
150
+ it "should have steps with inline table" do
151
+ parse(%{Feature: Hi
152
+ Scenario: Hello
153
+ Given I have a table
154
+ |a|b|
155
+ }).to_sexp.should ==
156
+ [:feature, nil, "Feature: Hi",
157
+ [:scenario, 2, "Scenario:", "Hello",
158
+ [:step_invocation, 3, "Given", "I have a table",
159
+ [:table,
160
+ [:row, 4,
161
+ [:cell, "a"],
162
+ [:cell, "b"]]]]]]
163
+ end
164
+
165
+ it "should have steps with inline py_string" do
166
+ parse(%{Feature: Hi
167
+ Scenario: Hello
168
+ Given I have a string
169
+
170
+
171
+ """
172
+ hello
173
+ world
174
+ """
175
+
176
+ }).to_sexp.should ==
177
+ [:feature, nil, "Feature: Hi",
178
+ [:scenario, 2, "Scenario:", "Hello",
179
+ [:step_invocation, 3, "Given", "I have a string",
180
+ [:py_string, "hello\nworld"]]]]
181
+ end
182
+
183
+ it "should allow multiline names" do
184
+ parse(%{Feature: Hi
185
+ Scenario: It is my ambition to say
186
+ in ten sentences
187
+ what others say
188
+ in a whole book.
189
+ Given I am a step
190
+
191
+ }).to_sexp.should ==
192
+ [:feature, nil, "Feature: Hi",
193
+ [:scenario, 2, "Scenario:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
194
+ [:step_invocation, 6, "Given", "I am a step"]]]
195
+ end
196
+
197
+ it "should ignore gherkin keywords which are parts of other words in the name" do
198
+ parse(%{Feature: Parser bug
199
+ Scenario: I have a Button
200
+ Buttons are great
201
+ Given I have it
202
+ }).to_sexp.should ==
203
+ [:feature, nil, "Feature: Parser bug",
204
+ [:scenario, 2, "Scenario:", "I have a Button\nButtons are great",
205
+ [:step_invocation, 4, "Given", "I have it"]]]
206
+
207
+ end
208
+ end
209
+
210
+ describe "Scenario Outlines" do
211
+ it "can be empty" do
212
+ parse(%{Feature: Hi
213
+ Scenario Outline: Hello
214
+ Given a <what> cucumber
215
+ Examples:
216
+ |what|
217
+ |green|
218
+ }).to_sexp.should ==
219
+ [:feature, nil, "Feature: Hi",
220
+ [:scenario_outline, "Scenario Outline:", "Hello",
221
+ [:step, 3, "Given", "a <what> cucumber"],
222
+ [:examples, "Examples:", "",
223
+ [:table,
224
+ [:row, 5,
225
+ [:cell, "what"]],
226
+ [:row, 6,
227
+ [:cell, "green"]]]]]]
228
+ end
229
+
230
+ it "should have line numbered steps with inline table" do
231
+ parse(%{Feature: Hi
232
+ Scenario Outline: Hello
233
+
234
+ Given I have a table
235
+
236
+ |<a>|<b>|
237
+ Examples:
238
+ |a|b|
239
+ |c|d|
240
+ }).to_sexp.should ==
241
+ [:feature, nil, "Feature: Hi",
242
+ [:scenario_outline, "Scenario Outline:", "Hello",
243
+ [:step, 4, "Given", "I have a table",
244
+ [:table,
245
+ [:row, 6,
246
+ [:cell, "<a>"],
247
+ [:cell, "<b>"]]]],
248
+ [:examples, "Examples:", "",
249
+ [:table,
250
+ [:row, 8,
251
+ [:cell, "a"],
252
+ [:cell, "b"]],
253
+ [:row, 9,
254
+ [:cell, "c"],
255
+ [:cell, "d"]]]]]]
256
+ end
257
+
258
+ it "should have examples" do
259
+ parse("Feature: Hi
260
+
261
+ Scenario Outline: Hello
262
+
263
+ Given I have a table
264
+ |1|2|
265
+
266
+ Examples:
267
+ |x|y|
268
+ |5|6|
269
+
270
+ ").to_sexp.should ==
271
+ [:feature, nil, "Feature: Hi",
272
+ [:scenario_outline, "Scenario Outline:", "Hello",
273
+ [:step, 5, "Given", "I have a table",
274
+ [:table,
275
+ [:row, 6,
276
+ [:cell, "1"],
277
+ [:cell, "2"]]]],
278
+ [:examples, "Examples:", "",
279
+ [:table,
280
+ [:row, 9,
281
+ [:cell, "x"],
282
+ [:cell, "y"]],
283
+ [:row, 10,
284
+ [:cell, "5"],
285
+ [:cell, "6"]]]]]]
286
+ end
287
+
288
+ it "should allow multiline names" do
289
+ parse(%{Feature: Hi
290
+ Scenario Outline: It is my ambition to say
291
+ in ten sentences
292
+ what others say
293
+ in a whole book.
294
+ Given I am a step
295
+
296
+ }).to_sexp.should ==
297
+ [:feature, nil, "Feature: Hi",
298
+ [:scenario_outline, "Scenario Outline:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
299
+ [:step, 6, "Given", "I am a step"]]]
300
+ end
301
+
302
+ it "should allow Examples to have multiline names" do
303
+ parse(%{Feature: Hi
304
+ Scenario Outline: name
305
+ Given I am a step
306
+
307
+ Examples: I'm a multiline name
308
+ and I'm ok
309
+ |x|
310
+ |5|
311
+
312
+ }).to_sexp.should ==
313
+ [:feature, nil, "Feature: Hi",
314
+ [:scenario_outline, "Scenario Outline:", "name",
315
+ [:step, 3, "Given", "I am a step"],
316
+ [:examples, "Examples:", "I'm a multiline name\nand I'm ok",
317
+ [:table,
318
+ [:row, 7,
319
+ [:cell, "x"]],
320
+ [:row, 8,
321
+ [:cell, "5"]]]]]]
322
+ end
323
+
324
+ it "should allow Examples to have multiline names" do
325
+ parse(%{Feature: Hi
326
+ Scenario: When I have when in scenario
327
+ I should be fine
328
+ Given I am a step
329
+ }).to_sexp.should ==
330
+ [:feature, nil, "Feature: Hi",
331
+ [:scenario, 2, "Scenario:", "When I have when in scenario\nI should be fine",
332
+ [:step_invocation, 4, "Given", "I am a step"]]]
333
+ end
334
+ end
335
+
336
+ describe "Syntax" do
337
+ it "should parse empty_feature" do
338
+ parse_file("empty_feature.feature")
339
+ end
340
+
341
+ it "should parse empty_scenario" do
342
+ parse_file("empty_scenario.feature")
343
+ end
344
+
345
+ it "should parse empty_scenario_outline" do
346
+ parse_file("empty_scenario_outline.feature")
347
+ end
348
+
349
+ it "should parse fit_scenario" do
350
+ parse_file("multiline_steps.feature")
351
+ end
352
+
353
+ it "should parse scenario_outline" do
354
+ parse_file("scenario_outline.feature")
355
+ end
356
+
357
+ it "should parse comments" do
358
+ parse_file("with_comments.feature")
359
+ end
360
+ end
361
+
362
+ describe "Filtering" do
363
+ it "should filter outline tables" do
364
+ ff = FeatureFile.new(
365
+ File.dirname(__FILE__) + '/../../../examples/self_test/features/outline_sample.feature:12')
366
+ f = ff.parse(@step_mother, {:lang => 'en'})
367
+ f.to_sexp.should ==
368
+ [:feature,
369
+ "./spec/cucumber/parser/../../../examples/self_test/features/outline_sample.feature",
370
+ "Feature: Outline Sample",
371
+ [:scenario_outline,
372
+ "Scenario Outline:",
373
+ "Test state",
374
+ [:step, 6, "Given", "<state> without a table"],
375
+ [:step, 7, "Given", "<other_state> without a table"],
376
+ [:examples,
377
+ "Examples:",
378
+ "Rainbow colours",
379
+ [:table,
380
+ [:row, 9, [:cell, "state"], [:cell, "other_state"]],
381
+ # [:row, 10, [:cell, "missing"], [:cell, "passing"]],
382
+ # [:row, 11, [:cell, "passing"], [:cell, "passing"]],
383
+ [:row, 12, [:cell, "failing"], [:cell, "passing"]]]]
384
+ # ,
385
+ # [:examples,
386
+ # "Examples:",
387
+ # "Only passing",
388
+ # [:table,
389
+ # [:row, 14, [:cell, "state"], [:cell, "other_state"]],
390
+ # [:row, 15, [:cell, "passing"], [:cell, "passing"]]]]]
391
+ ]]
392
+ end
393
+ end
394
+ end
395
+ end
396
+ end
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'treetop'
3
+ require 'cucumber/parser'
4
+
5
+ module Cucumber
6
+ module Parser
7
+ describe 'Tables' do
8
+ before do
9
+ @parser = NaturalLanguage.get(StepMother.new, 'en').parser
10
+ end
11
+
12
+ after do
13
+ NaturalLanguage.instance_variable_set(:@languages, nil)
14
+ end
15
+
16
+ def parse(text)
17
+ @parser.__send__(:prepare_to_parse, text)
18
+ @parser.root = :table
19
+ table = @parser._nt_table
20
+ table.raw
21
+ end
22
+
23
+ it "should parse a 1x2 table with newline" do
24
+ parse(" | 1 | 2 | \n").should == [%w{1 2}]
25
+ end
26
+
27
+ it "should parse a 1x2 table without newline" do
28
+ parse("| 1 | 2 |").should == [%w{1 2}]
29
+ end
30
+
31
+ it "should parse a 1x2 table without spaces" do
32
+ parse("|1|2|").should == [%w{1 2}]
33
+ end
34
+
35
+ it "should parse a 2x2 table" do
36
+ parse("| 1 | 2 |\n| 3 | 4 |\n").should == [%w{1 2}, %w{3 4}]
37
+ end
38
+
39
+ it "should parse a 2x2 table with several newlines" do
40
+ parse("| 1 | 2 |\n| 3 | 4 |\n\n\n").should == [%w{1 2}, %w{3 4}]
41
+ end
42
+
43
+ it "should parse a 2x2 table with empty cells" do
44
+ parse("| 1 | |\n|| 4 |\n").should == [['1', nil], [nil, '4']]
45
+ end
46
+
47
+ it "should not parse a 2x2 table that isn't closed" do
48
+ parse("| 1 | |\n|| 4 ").should_not == [['1', nil], [nil, '4']]
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,18 @@
1
+ # Define some stubs to fake Rails...
2
+ module ActiveRecord
3
+ class Base
4
+ end
5
+ end
6
+
7
+ module ActionController
8
+ class Dispatcher
9
+ end
10
+
11
+ class Base
12
+ end
13
+
14
+ class IntegrationTest
15
+ def self.use_transactional_fixtures=(x)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1 @@
1
+ # This file is loaded by rails/world.rb
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ $:.unshift(File.dirname(__FILE__) + '/stubs')
3
+
4
+ describe "Rails world" do
5
+
6
+ it "should run without Test::Unit.run defined" do
7
+ require "mini_rails"
8
+
9
+ step_mother = Cucumber::StepMother.new
10
+ step_mother.load_natural_language('en')
11
+ rb = step_mother.load_programming_language('rb')
12
+
13
+ require "cucumber/rails/world"
14
+ end
15
+
16
+ end
@@ -0,0 +1,123 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ require 'cucumber/ast'
4
+ require 'cucumber/step_mother'
5
+ require 'cucumber/rb_support/rb_language'
6
+
7
+ module Cucumber
8
+ module RbSupport
9
+ describe RbStepDefinition do
10
+ before do
11
+ @step_mother = StepMother.new
12
+ @step_mother.load_natural_language('en')
13
+ @rb = @step_mother.load_programming_language('rb')
14
+ @dsl = Object.new
15
+ @dsl.extend RbSupport::RbDsl
16
+ @step_mother.before(nil)
17
+
18
+ $inside = nil
19
+ end
20
+
21
+ def register
22
+ @step_mother.register_step_definitions(@rb.step_definitions)
23
+ end
24
+
25
+ it "should allow calling of other steps" do
26
+ @dsl.Given /Outside/ do
27
+ Given "Inside"
28
+ end
29
+ @dsl.Given /Inside/ do
30
+ $inside = true
31
+ end
32
+ register
33
+
34
+ @step_mother.step_match("Outside").invoke(nil)
35
+ $inside.should == true
36
+ end
37
+
38
+ it "should allow calling of other steps with inline arg" do
39
+ @dsl.Given /Outside/ do
40
+ Given "Inside", Ast::Table.new([['inside']])
41
+ end
42
+ @dsl.Given /Inside/ do |table|
43
+ $inside = table.raw[0][0]
44
+ end
45
+ register
46
+
47
+ @step_mother.step_match("Outside").invoke(nil)
48
+ $inside.should == 'inside'
49
+ end
50
+
51
+ it "should raise Undefined when inside step is not defined" do
52
+ @dsl.Given /Outside/ do
53
+ Given 'Inside'
54
+ end
55
+ register
56
+
57
+ lambda do
58
+ @step_mother.step_match('Outside').invoke(nil)
59
+ end.should raise_error(Undefined, 'Undefined step: "Inside"')
60
+ end
61
+
62
+ it "should allow forced pending" do
63
+ @dsl.Given /Outside/ do
64
+ pending("Do me!")
65
+ end
66
+ register
67
+
68
+ lambda do
69
+ @step_mother.step_match("Outside").invoke(nil)
70
+ end.should raise_error(Pending, "Do me!")
71
+ end
72
+
73
+ it "should allow announce" do
74
+ v = mock('visitor')
75
+ v.should_receive(:announce).with('wasup')
76
+ @step_mother.visitor = v
77
+ @dsl.Given /Loud/ do
78
+ announce 'wasup'
79
+ end
80
+ register
81
+
82
+ @step_mother.step_match("Loud").invoke(nil)
83
+ end
84
+
85
+ def unindented(s)
86
+ s.split("\n")[1..-2].join("\n").indent(-10)
87
+ end
88
+
89
+ it "should recognise quotes in name and make according regexp" do
90
+ @rb.snippet_text('Given', 'A "first" arg').should == unindented(%{
91
+ Given /^A "([^\\"]*)" arg$/ do |arg1|
92
+ pending
93
+ end
94
+ })
95
+ end
96
+
97
+ it "should recognise several quoted words in name and make according regexp and args" do
98
+ @rb.snippet_text('Given', 'A "first" and "second" arg').should == unindented(%{
99
+ Given /^A "([^\\"]*)" and "([^\\"]*)" arg$/ do |arg1, arg2|
100
+ pending
101
+ end
102
+ })
103
+ end
104
+
105
+ it "should not use quote group when there are no quotes" do
106
+ @rb.snippet_text('Given', 'A first arg').should == unindented(%{
107
+ Given /^A first arg$/ do
108
+ pending
109
+ end
110
+ })
111
+ end
112
+
113
+ it "should be helpful with tables" do
114
+ @rb.snippet_text('Given', 'A "first" arg', Cucumber::Ast::Table).should == unindented(%{
115
+ Given /^A "([^\\"]*)" arg$/ do |arg1, table|
116
+ # table is a Cucumber::Ast::Table
117
+ pending
118
+ end
119
+ })
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,19 @@
1
+ Feature: Sell cucumbers
2
+ As a cucumber farmer
3
+ I want to sell cucumbers
4
+ So that I buy meat
5
+
6
+ Scenario: Sell a dozen
7
+ Given there are 5 cucumbers
8
+ When I sell 12 cucumbers
9
+ Then I should owe 7 cucumbers
10
+
11
+ Scenario: Sell twenty
12
+ Given there are 5 cucumbers
13
+ When I sell 20 cucumbers
14
+ Then I should owe 15 cucumbers
15
+
16
+ Scenario: Sell fifty
17
+ Given there are 5 cucumbers
18
+ When I sell 50 cucumbers
19
+ Then I should owe 45 cucumbers