jwilger-cucumber 0.3.11.200906161550

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 (411) hide show
  1. data/History.txt +830 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +410 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +76 -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 +30 -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 +16 -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/zh-CN/Rakefile +6 -0
  151. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  152. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  153. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  154. data/examples/i18n/zh-TW/Rakefile +6 -0
  155. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  156. data/examples/i18n/zh-TW/features/division.feature +11 -0
  157. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  158. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  159. data/examples/java/README.textile +18 -0
  160. data/examples/java/build.xml +33 -0
  161. data/examples/java/features/hello.feature +11 -0
  162. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  163. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  164. data/examples/java/features/tree.feature +9 -0
  165. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  166. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  167. data/examples/junit/features/pending.feature +5 -0
  168. data/examples/junit/features/step_definitions/steps.rb +11 -0
  169. data/examples/pure_java/README.textile +5 -0
  170. data/examples/selenium/Rakefile +6 -0
  171. data/examples/selenium/features/search.feature +9 -0
  172. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  173. data/examples/selenium/features/support/env.rb +19 -0
  174. data/examples/selenium_webrat/Rakefile +6 -0
  175. data/examples/selenium_webrat/config.ru +0 -0
  176. data/examples/selenium_webrat/features/search.feature +9 -0
  177. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  178. data/examples/selenium_webrat/features/support/env.rb +45 -0
  179. data/examples/self_test/README.textile +6 -0
  180. data/examples/self_test/Rakefile +6 -0
  181. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  182. data/examples/self_test/features/background/background_with_name.feature +7 -0
  183. data/examples/self_test/features/background/failing_background.feature +12 -0
  184. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  185. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  186. data/examples/self_test/features/background/passing_background.feature +10 -0
  187. data/examples/self_test/features/background/pending_background.feature +10 -0
  188. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  189. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  190. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  191. data/examples/self_test/features/failing_expectation.feature +4 -0
  192. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  193. data/examples/self_test/features/multiline_name.feature +27 -0
  194. data/examples/self_test/features/outline_sample.feature +15 -0
  195. data/examples/self_test/features/sample.feature +21 -0
  196. data/examples/self_test/features/search_sample.feature +32 -0
  197. data/examples/self_test/features/step_definitions/sample_steps.rb +81 -0
  198. data/examples/self_test/features/support/env.rb +17 -0
  199. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  200. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  201. data/examples/sinatra/Rakefile +6 -0
  202. data/examples/sinatra/app.rb +14 -0
  203. data/examples/sinatra/features/add.feature +11 -0
  204. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  205. data/examples/sinatra/features/support/env.rb +28 -0
  206. data/examples/sinatra/views/add.erb +5 -0
  207. data/examples/sinatra/views/layout.erb +8 -0
  208. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  209. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  210. data/examples/test_unit/Rakefile +6 -0
  211. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  212. data/examples/test_unit/features/test_unit.feature +9 -0
  213. data/examples/tickets/Rakefile +16 -0
  214. data/examples/tickets/features/172.feature +28 -0
  215. data/examples/tickets/features/177/1.feature +29 -0
  216. data/examples/tickets/features/177/2.feature +21 -0
  217. data/examples/tickets/features/177/3.feature +18 -0
  218. data/examples/tickets/features/180.feature +7 -0
  219. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  220. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  221. data/examples/tickets/features/236.feature +13 -0
  222. data/examples/tickets/features/241.feature +13 -0
  223. data/examples/tickets/features/246.feature +4 -0
  224. data/examples/tickets/features/248.feature +11 -0
  225. data/examples/tickets/features/270/back.feature +14 -0
  226. data/examples/tickets/features/270/back.steps.rb +14 -0
  227. data/examples/tickets/features/272/hooks.feature +26 -0
  228. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  229. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  230. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  231. data/examples/tickets/features/279/wrong.feature_ +11 -0
  232. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  233. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  234. data/examples/tickets/features/306/only_background.feature +4 -0
  235. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  236. data/examples/tickets/features/lib/pantry.rb +20 -0
  237. data/examples/tickets/features/scenario_outline.feature +95 -0
  238. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  239. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  240. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  241. data/examples/tickets/features/step_definitons/tickets_steps.rb +66 -0
  242. data/examples/tickets/features/tickets.feature +28 -0
  243. data/examples/watir/README.textile +16 -0
  244. data/examples/watir/Rakefile +6 -0
  245. data/examples/watir/features/search.feature +12 -0
  246. data/examples/watir/features/step_definitons/search_steps.rb +22 -0
  247. data/examples/watir/features/support/env.rb +32 -0
  248. data/features/after_block_exceptions.feature +102 -0
  249. data/features/after_step_block_exceptions.feature +104 -0
  250. data/features/background.feature +311 -0
  251. data/features/bug_371.feature +32 -0
  252. data/features/cucumber_cli.feature +549 -0
  253. data/features/cucumber_cli_diff_disabled.feature +53 -0
  254. data/features/cucumber_cli_outlines.feature +109 -0
  255. data/features/custom_formatter.feature +11 -0
  256. data/features/drb_server_integration.feature +115 -0
  257. data/features/exclude_files.feature +20 -0
  258. data/features/expand.feature +49 -0
  259. data/features/html_formatter/a.html +185 -0
  260. data/features/html_formatter.feature +7 -0
  261. data/features/junit_formatter.feature +71 -0
  262. data/features/language_from_header.feature +30 -0
  263. data/features/multiline_names.feature +43 -0
  264. data/features/rake_task.feature +150 -0
  265. data/features/report_called_undefined_steps.feature +35 -0
  266. data/features/snippet.feature +22 -0
  267. data/features/step_definitions/cucumber_steps.rb +130 -0
  268. data/features/step_definitions/extra_steps.rb +2 -0
  269. data/features/steps_formatter.feature +25 -0
  270. data/features/support/env.rb +120 -0
  271. data/features/usage.feature +126 -0
  272. data/features/work_in_progress.feature +151 -0
  273. data/gem_tasks/deployment.rake +11 -0
  274. data/gem_tasks/environment.rake +7 -0
  275. data/gem_tasks/features.rake +10 -0
  276. data/gem_tasks/fix_cr_lf.rake +10 -0
  277. data/gem_tasks/flog.rake +4 -0
  278. data/gem_tasks/gemspec.rake +10 -0
  279. data/gem_tasks/rspec.rake +45 -0
  280. data/gem_tasks/sass.rake +4 -0
  281. data/gem_tasks/yard.rake +8 -0
  282. data/lib/autotest/cucumber.rb +6 -0
  283. data/lib/autotest/cucumber_mixin.rb +125 -0
  284. data/lib/autotest/cucumber_rails.rb +6 -0
  285. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  286. data/lib/autotest/cucumber_rspec.rb +6 -0
  287. data/lib/autotest/discover.rb +9 -0
  288. data/lib/cucumber/ast/background.rb +62 -0
  289. data/lib/cucumber/ast/comment.rb +30 -0
  290. data/lib/cucumber/ast/examples.rb +26 -0
  291. data/lib/cucumber/ast/feature.rb +58 -0
  292. data/lib/cucumber/ast/feature_element.rb +57 -0
  293. data/lib/cucumber/ast/features.rb +30 -0
  294. data/lib/cucumber/ast/outline_table.rb +143 -0
  295. data/lib/cucumber/ast/py_string.rb +57 -0
  296. data/lib/cucumber/ast/scenario.rb +83 -0
  297. data/lib/cucumber/ast/scenario_outline.rb +93 -0
  298. data/lib/cucumber/ast/step.rb +112 -0
  299. data/lib/cucumber/ast/step_collection.rb +75 -0
  300. data/lib/cucumber/ast/step_invocation.rb +136 -0
  301. data/lib/cucumber/ast/table.rb +334 -0
  302. data/lib/cucumber/ast/tags.rb +33 -0
  303. data/lib/cucumber/ast/visitor.rb +116 -0
  304. data/lib/cucumber/ast.rb +29 -0
  305. data/lib/cucumber/broadcaster.rb +13 -0
  306. data/lib/cucumber/cli/configuration.rb +427 -0
  307. data/lib/cucumber/cli/drb_client.rb +20 -0
  308. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  309. data/lib/cucumber/cli/main.rb +136 -0
  310. data/lib/cucumber/core_ext/exception.rb +53 -0
  311. data/lib/cucumber/core_ext/instance_exec.rb +67 -0
  312. data/lib/cucumber/core_ext/proc.rb +29 -0
  313. data/lib/cucumber/core_ext/string.rb +48 -0
  314. data/lib/cucumber/feature_file.rb +47 -0
  315. data/lib/cucumber/filter.rb +50 -0
  316. data/lib/cucumber/formatter/ansicolor.rb +110 -0
  317. data/lib/cucumber/formatter/color_io.rb +23 -0
  318. data/lib/cucumber/formatter/console.rb +149 -0
  319. data/lib/cucumber/formatter/cucumber.css +132 -0
  320. data/lib/cucumber/formatter/cucumber.sass +139 -0
  321. data/lib/cucumber/formatter/duration.rb +10 -0
  322. data/lib/cucumber/formatter/html.rb +258 -0
  323. data/lib/cucumber/formatter/junit.rb +75 -0
  324. data/lib/cucumber/formatter/pretty.rb +188 -0
  325. data/lib/cucumber/formatter/profile.rb +77 -0
  326. data/lib/cucumber/formatter/progress.rb +60 -0
  327. data/lib/cucumber/formatter/rerun.rb +44 -0
  328. data/lib/cucumber/formatter/steps.rb +49 -0
  329. data/lib/cucumber/formatter/tag_cloud.rb +28 -0
  330. data/lib/cucumber/formatter/unicode.rb +35 -0
  331. data/lib/cucumber/formatter/usage.rb +85 -0
  332. data/lib/cucumber/formatters/unicode.rb +7 -0
  333. data/lib/cucumber/languages.yml +532 -0
  334. data/lib/cucumber/parser/feature.rb +1787 -0
  335. data/lib/cucumber/parser/feature.tt +324 -0
  336. data/lib/cucumber/parser/i18n/language.rb +80 -0
  337. data/lib/cucumber/parser/i18n.tt +42 -0
  338. data/lib/cucumber/parser/table.rb +414 -0
  339. data/lib/cucumber/parser/table.tt +71 -0
  340. data/lib/cucumber/parser/treetop_ext.rb +52 -0
  341. data/lib/cucumber/parser.rb +6 -0
  342. data/lib/cucumber/platform.rb +23 -0
  343. data/lib/cucumber/rails/rspec.rb +10 -0
  344. data/lib/cucumber/rails/world.rb +99 -0
  345. data/lib/cucumber/rake/task.rb +233 -0
  346. data/lib/cucumber/rspec_neuter.rb +23 -0
  347. data/lib/cucumber/step_definition.rb +122 -0
  348. data/lib/cucumber/step_match.rb +61 -0
  349. data/lib/cucumber/step_mother.rb +362 -0
  350. data/lib/cucumber/version.rb +10 -0
  351. data/lib/cucumber/world.rb +53 -0
  352. data/lib/cucumber.rb +11 -0
  353. data/rails_generators/cucumber/USAGE +11 -0
  354. data/rails_generators/cucumber/cucumber_generator.rb +66 -0
  355. data/rails_generators/cucumber/templates/cucumber +8 -0
  356. data/rails_generators/cucumber/templates/cucumber.rake +20 -0
  357. data/rails_generators/cucumber/templates/cucumber_environment.rb +23 -0
  358. data/rails_generators/cucumber/templates/env.rb +26 -0
  359. data/rails_generators/cucumber/templates/paths.rb +27 -0
  360. data/rails_generators/cucumber/templates/spork_env.rb +36 -0
  361. data/rails_generators/cucumber/templates/webrat_steps.rb +147 -0
  362. data/rails_generators/feature/USAGE +12 -0
  363. data/rails_generators/feature/feature_generator.rb +40 -0
  364. data/rails_generators/feature/templates/feature.erb +31 -0
  365. data/rails_generators/feature/templates/steps.erb +20 -0
  366. data/spec/cucumber/ast/background_spec.rb +50 -0
  367. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  368. data/spec/cucumber/ast/feature_factory.rb +63 -0
  369. data/spec/cucumber/ast/feature_spec.rb +38 -0
  370. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  371. data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
  372. data/spec/cucumber/ast/scenario_spec.rb +38 -0
  373. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  374. data/spec/cucumber/ast/step_spec.rb +66 -0
  375. data/spec/cucumber/ast/table_spec.rb +186 -0
  376. data/spec/cucumber/ast/visitor_spec.rb +27 -0
  377. data/spec/cucumber/broadcaster_spec.rb +15 -0
  378. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  379. data/spec/cucumber/cli/drb_client_spec.rb +43 -0
  380. data/spec/cucumber/cli/main_spec.rb +140 -0
  381. data/spec/cucumber/core_ext/proc_spec.rb +54 -0
  382. data/spec/cucumber/core_ext/string_spec.rb +42 -0
  383. data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
  384. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  385. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  386. data/spec/cucumber/formatter/progress_spec.rb +36 -0
  387. data/spec/cucumber/parser/feature_parser_spec.rb +387 -0
  388. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  389. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  390. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  391. data/spec/cucumber/rails/world_spec.rb +11 -0
  392. data/spec/cucumber/sell_cucumbers.feature +19 -0
  393. data/spec/cucumber/step_definition_spec.rb +101 -0
  394. data/spec/cucumber/step_mother_spec.rb +155 -0
  395. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  396. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  397. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  398. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  399. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  400. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  401. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  402. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  403. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  404. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  405. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  406. data/spec/cucumber/treetop_parser/with_comments.feature +10 -0
  407. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  408. data/spec/cucumber/world/pending_spec.rb +47 -0
  409. data/spec/spec.opts +2 -0
  410. data/spec/spec_helper.rb +13 -0
  411. metadata +506 -0
@@ -0,0 +1,414 @@
1
+ module Cucumber
2
+ module Parser
3
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
4
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
5
+ # github gems).
6
+ #
7
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
8
+ # the rb file with tt feature.tt
9
+ module Table
10
+ include Treetop::Runtime
11
+
12
+ def root
13
+ @root || :table
14
+ end
15
+
16
+ module Table0
17
+ def at_line?(line)
18
+ elements.detect{|table_row| table_row.at_line?(line)}
19
+ end
20
+
21
+ def build(filter=nil)
22
+ Ast::Table.new(raw)
23
+ end
24
+
25
+ def raw(filter=nil, scenario_outline=nil)
26
+ elements.map do |table_row|
27
+ if(filter.nil? || table_row == elements[0] || filter.at_line?(table_row) || (scenario_outline && filter.outline_at_line?(scenario_outline)))
28
+ table_row.build
29
+ end
30
+ end.compact
31
+ end
32
+ end
33
+
34
+ def _nt_table
35
+ start_index = index
36
+ if node_cache[:table].has_key?(index)
37
+ cached = node_cache[:table][index]
38
+ @index = cached.interval.end if cached
39
+ return cached
40
+ end
41
+
42
+ s0, i0 = [], index
43
+ loop do
44
+ r1 = _nt_table_row
45
+ if r1
46
+ s0 << r1
47
+ else
48
+ break
49
+ end
50
+ end
51
+ if s0.empty?
52
+ self.index = i0
53
+ r0 = nil
54
+ else
55
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
56
+ r0.extend(Table0)
57
+ end
58
+
59
+ node_cache[:table][start_index] = r0
60
+
61
+ return r0
62
+ end
63
+
64
+ module TableRow0
65
+ def cell
66
+ elements[0]
67
+ end
68
+
69
+ end
70
+
71
+ module TableRow1
72
+ def cells
73
+ elements[2]
74
+ end
75
+
76
+ end
77
+
78
+ module TableRow2
79
+ def at_line?(line)
80
+ cells.line == line
81
+ end
82
+
83
+ def build
84
+ row = cells.elements.map do |elt|
85
+ value = elt.cell.text_value.strip
86
+ value.empty? ? nil : value
87
+ end
88
+
89
+ class << row
90
+ attr_accessor :line
91
+ end
92
+ row.line = cells.line
93
+
94
+ row
95
+ end
96
+ end
97
+
98
+ def _nt_table_row
99
+ start_index = index
100
+ if node_cache[:table_row].has_key?(index)
101
+ cached = node_cache[:table_row][index]
102
+ @index = cached.interval.end if cached
103
+ return cached
104
+ end
105
+
106
+ i0, s0 = index, []
107
+ s1, i1 = [], index
108
+ loop do
109
+ r2 = _nt_space
110
+ if r2
111
+ s1 << r2
112
+ else
113
+ break
114
+ end
115
+ end
116
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
117
+ s0 << r1
118
+ if r1
119
+ if input.index('|', index) == index
120
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
121
+ @index += 1
122
+ else
123
+ terminal_parse_failure('|')
124
+ r3 = nil
125
+ end
126
+ s0 << r3
127
+ if r3
128
+ s4, i4 = [], index
129
+ loop do
130
+ i5, s5 = index, []
131
+ r6 = _nt_cell
132
+ s5 << r6
133
+ if r6
134
+ if input.index('|', index) == index
135
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
136
+ @index += 1
137
+ else
138
+ terminal_parse_failure('|')
139
+ r7 = nil
140
+ end
141
+ s5 << r7
142
+ end
143
+ if s5.last
144
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
145
+ r5.extend(TableRow0)
146
+ else
147
+ self.index = i5
148
+ r5 = nil
149
+ end
150
+ if r5
151
+ s4 << r5
152
+ else
153
+ break
154
+ end
155
+ end
156
+ if s4.empty?
157
+ self.index = i4
158
+ r4 = nil
159
+ else
160
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
161
+ end
162
+ s0 << r4
163
+ if r4
164
+ s8, i8 = [], index
165
+ loop do
166
+ r9 = _nt_space
167
+ if r9
168
+ s8 << r9
169
+ else
170
+ break
171
+ end
172
+ end
173
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
174
+ s0 << r8
175
+ if r8
176
+ i10 = index
177
+ s11, i11 = [], index
178
+ loop do
179
+ r12 = _nt_eol
180
+ if r12
181
+ s11 << r12
182
+ else
183
+ break
184
+ end
185
+ end
186
+ if s11.empty?
187
+ self.index = i11
188
+ r11 = nil
189
+ else
190
+ r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
191
+ end
192
+ if r11
193
+ r10 = r11
194
+ else
195
+ r13 = _nt_eof
196
+ if r13
197
+ r10 = r13
198
+ else
199
+ self.index = i10
200
+ r10 = nil
201
+ end
202
+ end
203
+ s0 << r10
204
+ end
205
+ end
206
+ end
207
+ end
208
+ if s0.last
209
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
210
+ r0.extend(TableRow1)
211
+ r0.extend(TableRow2)
212
+ else
213
+ self.index = i0
214
+ r0 = nil
215
+ end
216
+
217
+ node_cache[:table_row][start_index] = r0
218
+
219
+ return r0
220
+ end
221
+
222
+ module Cell0
223
+ end
224
+
225
+ def _nt_cell
226
+ start_index = index
227
+ if node_cache[:cell].has_key?(index)
228
+ cached = node_cache[:cell][index]
229
+ @index = cached.interval.end if cached
230
+ return cached
231
+ end
232
+
233
+ s0, i0 = [], index
234
+ loop do
235
+ i1, s1 = index, []
236
+ i2 = index
237
+ i3 = index
238
+ if input.index('|', index) == index
239
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
240
+ @index += 1
241
+ else
242
+ terminal_parse_failure('|')
243
+ r4 = nil
244
+ end
245
+ if r4
246
+ r3 = r4
247
+ else
248
+ r5 = _nt_eol
249
+ if r5
250
+ r3 = r5
251
+ else
252
+ self.index = i3
253
+ r3 = nil
254
+ end
255
+ end
256
+ if r3
257
+ r2 = nil
258
+ else
259
+ self.index = i2
260
+ r2 = instantiate_node(SyntaxNode,input, index...index)
261
+ end
262
+ s1 << r2
263
+ if r2
264
+ if index < input_length
265
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
266
+ @index += 1
267
+ else
268
+ terminal_parse_failure("any character")
269
+ r6 = nil
270
+ end
271
+ s1 << r6
272
+ end
273
+ if s1.last
274
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
275
+ r1.extend(Cell0)
276
+ else
277
+ self.index = i1
278
+ r1 = nil
279
+ end
280
+ if r1
281
+ s0 << r1
282
+ else
283
+ break
284
+ end
285
+ end
286
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
287
+
288
+ node_cache[:cell][start_index] = r0
289
+
290
+ return r0
291
+ end
292
+
293
+ def _nt_space
294
+ start_index = index
295
+ if node_cache[:space].has_key?(index)
296
+ cached = node_cache[:space][index]
297
+ @index = cached.interval.end if cached
298
+ return cached
299
+ end
300
+
301
+ if input.index(Regexp.new('[ \\t]'), index) == index
302
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
303
+ @index += 1
304
+ else
305
+ r0 = nil
306
+ end
307
+
308
+ node_cache[:space][start_index] = r0
309
+
310
+ return r0
311
+ end
312
+
313
+ module Eol0
314
+ end
315
+
316
+ def _nt_eol
317
+ start_index = index
318
+ if node_cache[:eol].has_key?(index)
319
+ cached = node_cache[:eol][index]
320
+ @index = cached.interval.end if cached
321
+ return cached
322
+ end
323
+
324
+ i0 = index
325
+ if input.index("\n", index) == index
326
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
327
+ @index += 1
328
+ else
329
+ terminal_parse_failure("\n")
330
+ r1 = nil
331
+ end
332
+ if r1
333
+ r0 = r1
334
+ else
335
+ i2, s2 = index, []
336
+ if input.index("\r", index) == index
337
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
338
+ @index += 1
339
+ else
340
+ terminal_parse_failure("\r")
341
+ r3 = nil
342
+ end
343
+ s2 << r3
344
+ if r3
345
+ if input.index("\n", index) == index
346
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
347
+ @index += 1
348
+ else
349
+ terminal_parse_failure("\n")
350
+ r5 = nil
351
+ end
352
+ if r5
353
+ r4 = r5
354
+ else
355
+ r4 = instantiate_node(SyntaxNode,input, index...index)
356
+ end
357
+ s2 << r4
358
+ end
359
+ if s2.last
360
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
361
+ r2.extend(Eol0)
362
+ else
363
+ self.index = i2
364
+ r2 = nil
365
+ end
366
+ if r2
367
+ r0 = r2
368
+ else
369
+ self.index = i0
370
+ r0 = nil
371
+ end
372
+ end
373
+
374
+ node_cache[:eol][start_index] = r0
375
+
376
+ return r0
377
+ end
378
+
379
+ def _nt_eof
380
+ start_index = index
381
+ if node_cache[:eof].has_key?(index)
382
+ cached = node_cache[:eof][index]
383
+ @index = cached.interval.end if cached
384
+ return cached
385
+ end
386
+
387
+ i0 = index
388
+ if index < input_length
389
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
390
+ @index += 1
391
+ else
392
+ terminal_parse_failure("any character")
393
+ r1 = nil
394
+ end
395
+ if r1
396
+ r0 = nil
397
+ else
398
+ self.index = i0
399
+ r0 = instantiate_node(SyntaxNode,input, index...index)
400
+ end
401
+
402
+ node_cache[:eof][start_index] = r0
403
+
404
+ return r0
405
+ end
406
+
407
+ end
408
+
409
+ class TableParser < Treetop::Runtime::CompiledParser
410
+ include Table
411
+ end
412
+
413
+ end
414
+ end
@@ -0,0 +1,71 @@
1
+ module Cucumber
2
+ module Parser
3
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
4
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
5
+ # github gems).
6
+ #
7
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
8
+ # the rb file with tt feature.tt
9
+ grammar Table
10
+
11
+ rule table
12
+ table_row+ {
13
+ def at_line?(line)
14
+ elements.detect{|table_row| table_row.at_line?(line)}
15
+ end
16
+
17
+ def build(filter=nil)
18
+ Ast::Table.new(raw)
19
+ end
20
+
21
+ def raw(filter=nil, scenario_outline=nil)
22
+ elements.map do |table_row|
23
+ if(filter.nil? || table_row == elements[0] || filter.at_line?(table_row) || (scenario_outline && filter.outline_at_line?(scenario_outline)))
24
+ table_row.build
25
+ end
26
+ end.compact
27
+ end
28
+ }
29
+ end
30
+
31
+ rule table_row
32
+ space* '|' cells:(cell '|')+ space* (eol+ / eof) {
33
+ def at_line?(line)
34
+ cells.line == line
35
+ end
36
+
37
+ def build
38
+ row = cells.elements.map do |elt|
39
+ value = elt.cell.text_value.strip
40
+ value.empty? ? nil : value
41
+ end
42
+
43
+ class << row
44
+ attr_accessor :line
45
+ end
46
+ row.line = cells.line
47
+
48
+ row
49
+ end
50
+ }
51
+ end
52
+
53
+ rule cell
54
+ (!('|' / eol) .)*
55
+ end
56
+
57
+ rule space
58
+ [ \t]
59
+ end
60
+
61
+ rule eol
62
+ "\n" / ("\r" "\n"?)
63
+ end
64
+
65
+ rule eof
66
+ !.
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,52 @@
1
+ begin
2
+ require 'treetop'
3
+ require 'treetop/runtime'
4
+ require 'treetop/ruby_extensions'
5
+ rescue LoadError
6
+ require "rubygems"
7
+ gem "treetop"
8
+ require 'treetop'
9
+ require 'treetop/runtime'
10
+ require 'treetop/ruby_extensions'
11
+ end
12
+
13
+ module Cucumber
14
+ module Parser
15
+ class SyntaxError < StandardError
16
+ def initialize(parser, file, line_offset)
17
+ tf = parser.terminal_failures
18
+ expected = tf.size == 1 ? tf[0].expected_string.inspect : "one of #{tf.map{|f| f.expected_string.inspect}.uniq*', '}"
19
+ line = parser.failure_line + line_offset
20
+ message = "#{file}:#{line}:#{parser.failure_column}: Parse error, expected #{expected}."
21
+ super(message)
22
+ end
23
+ end
24
+
25
+ module TreetopExt
26
+ def parse_or_fail(source, file=nil, filter=nil, line_offset=0)
27
+ parse_tree = parse(source)
28
+ if parse_tree.nil?
29
+ raise Cucumber::Parser::SyntaxError.new(self, file, line_offset)
30
+ else
31
+ ast = parse_tree.build(filter) # may return nil if it doesn't match filter.
32
+ ast.file = file unless ast.nil?
33
+ ast
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ module Treetop
41
+ module Runtime
42
+ class SyntaxNode
43
+ def line
44
+ input.line_of(interval.first)
45
+ end
46
+ end
47
+
48
+ class CompiledParser
49
+ include Cucumber::Parser::TreetopExt
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,6 @@
1
+ require 'erb'
2
+ require 'cucumber/platform'
3
+ require 'cucumber/ast'
4
+ require 'cucumber/parser/treetop_ext'
5
+ require 'cucumber/parser/table'
6
+ require 'cucumber/parser/feature'
@@ -0,0 +1,23 @@
1
+ # Detect the platform we're running on so we can tweak behaviour
2
+ # in various places.
3
+ require 'rbconfig'
4
+ require 'yaml'
5
+
6
+ module Cucumber
7
+ # TODO: Move these constants and the file to Language. Update wiki
8
+ LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/languages.yml')
9
+ LANGUAGES = YAML.load_file(LANGUAGE_FILE)
10
+ BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
11
+ LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
12
+ JRUBY = defined?(JRUBY_VERSION)
13
+ IRONRUBY = Config::CONFIG['sitedir'] =~ /IronRuby/
14
+ WINDOWS = Config::CONFIG['host_os'] =~ /mswin|mingw/
15
+ WINDOWS_MRI = WINDOWS && !JRUBY && !IRONRUBY
16
+ RAILS = defined?(Rails)
17
+ RUBY_BINARY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
18
+ RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
19
+
20
+ def self.file_mode(m)
21
+ RUBY_1_9 ? "#{m}:UTF-8" : m
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ require 'cucumber/rails/world'
2
+ require 'spec/expectations'
3
+ require 'spec/rails/matchers'
4
+
5
+ [Cucumber::Rails::World, ActionController::Integration::Session].each do |klass|
6
+ klass.class_eval do
7
+ include Spec::Matchers
8
+ include Spec::Rails::Matchers
9
+ end
10
+ end
@@ -0,0 +1,99 @@
1
+ # Based on code from Brian Takita, Yurii Rashkovskii and Ben Mabey
2
+ # Adapted by Aslak Hellesøy
3
+
4
+ if defined?(ActiveRecord::Base)
5
+ require 'test_help'
6
+ else
7
+ require 'action_controller/test_process'
8
+ require 'action_controller/integration'
9
+ end
10
+
11
+ begin
12
+ require 'test/unit/testresult'
13
+ rescue LoadError => e
14
+ e.message << "\nYou must gem install test-unit. For more info see https://rspec.lighthouseapp.com/projects/16211/tickets/292"
15
+ e.message << "\nAlso make sure you have rack 1.0.0 or higher."
16
+ raise e
17
+ end
18
+
19
+ # So that Test::Unit doesn't launch at the end - makes it think it has already been run.
20
+ Test::Unit.run = true if Test::Unit.respond_to?(:run=)
21
+
22
+ $__cucumber_toplevel = self
23
+
24
+ module Cucumber #:nodoc:
25
+ module Rails
26
+ # All scenarios will execute in the context of a new instance of World.
27
+ class World < ActionController::IntegrationTest
28
+ if defined?(ActiveRecord::Base)
29
+ self.use_transactional_fixtures = false
30
+ else
31
+ def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
32
+ end
33
+
34
+ def initialize #:nodoc:
35
+ @_result = Test::Unit::TestResult.new
36
+ end
37
+ end
38
+
39
+ def self.use_transactional_fixtures
40
+
41
+ unless ::Rails.configuration.cache_classes
42
+ warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/test.rb). This setting is known to break Cucumber's use_transactional_fixtures method. Set config.cache_classes to true if you want to use transactional fixtures. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
43
+ end
44
+
45
+ World.use_transactional_fixtures = true
46
+ if defined?(ActiveRecord::Base)
47
+ $__cucumber_toplevel.Before do
48
+ @__cucumber_ar_connection = ActiveRecord::Base.connection
49
+ if @__cucumber_ar_connection.respond_to?(:increment_open_transactions)
50
+ @__cucumber_ar_connection.increment_open_transactions
51
+ else
52
+ ActiveRecord::Base.__send__(:increment_open_transactions)
53
+ end
54
+ @__cucumber_ar_connection.begin_db_transaction
55
+ ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
56
+ end
57
+
58
+ $__cucumber_toplevel.After do
59
+ @__cucumber_ar_connection.rollback_db_transaction
60
+ if @__cucumber_ar_connection.respond_to?(:decrement_open_transactions)
61
+ @__cucumber_ar_connection.decrement_open_transactions
62
+ else
63
+ ActiveRecord::Base.__send__(:decrement_open_transactions)
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ def self.bypass_rescue
70
+ ActionController::Base.class_eval do
71
+ alias_method :rescue_action_without_bypass, :rescue_action
72
+
73
+ def rescue_action(exception)
74
+ raise exception
75
+ end
76
+ end
77
+
78
+ begin
79
+ ActionController::Failsafe.class_eval do
80
+ alias_method :failsafe_response_without_bypass, :failsafe_response
81
+
82
+ def failsafe_response(exception)
83
+ raise exception
84
+ end
85
+ end
86
+ rescue NameError # Failsafe was introduced in Rails 2.3.2
87
+ ActionController::Dispatcher.class_eval do
88
+ def self.failsafe_response(output, status, exception = nil)
89
+ raise exception
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ World do
98
+ Cucumber::Rails::World.new
99
+ end