cucumber 1.3.10 → 2.0.0

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 (465) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.rspec +1 -1
  4. data/.travis.yml +4 -3
  5. data/CONTRIBUTING.md +9 -0
  6. data/Gemfile +9 -2
  7. data/History.md +212 -22
  8. data/LICENSE +2 -2
  9. data/README.md +4 -4
  10. data/Rakefile +10 -1
  11. data/bin/cucumber +1 -5
  12. data/cucumber.gemspec +10 -13
  13. data/cucumber.yml +14 -24
  14. data/examples/{ramaze → i18n/el}/Rakefile +1 -1
  15. data/examples/i18n/el/features/addition.feature +17 -0
  16. data/examples/i18n/el/features/division.feature +10 -0
  17. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +24 -0
  18. data/examples/i18n/el/lib/calculator.rb +14 -0
  19. data/examples/i18n/fr/Rakefile +3 -1
  20. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +2 -2
  21. data/examples/i18n/ht/Rakefile +6 -0
  22. data/examples/i18n/ht/features/adisyon.feature +17 -0
  23. data/examples/i18n/ht/features/divizyon.feature +10 -0
  24. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +25 -0
  25. data/examples/i18n/ht/lib/kalkilatris.rb +14 -0
  26. data/examples/i18n/zh-CN/features/{step_definitons → step_definitions}/calculator_steps.rb +4 -4
  27. data/examples/tcl/features/step_definitions/fib_steps.rb +1 -1
  28. data/{legacy_features → features/docs}/api/list_step_defs_as_json.feature +14 -14
  29. data/{legacy_features → features/docs}/api/run_cli_main_with_existing_runtime.feature +5 -10
  30. data/features/{backtraces.feature → docs/cli/backtraces.feature} +2 -2
  31. data/features/docs/cli/dry_run.feature +73 -0
  32. data/features/docs/cli/exclude_files.feature +18 -0
  33. data/features/docs/cli/execute_with_tag_filter.feature +117 -0
  34. data/features/docs/cli/randomize.feature +46 -0
  35. data/features/docs/cli/require.feature +27 -0
  36. data/features/docs/cli/run_scenarios_matching_name.feature +104 -0
  37. data/features/docs/cli/run_specific_scenarios.feature +75 -0
  38. data/features/docs/cli/showing_differences.feature +43 -0
  39. data/features/docs/cli/specifying_multiple_formatters.feature +44 -0
  40. data/features/docs/cli/strict_mode.feature +64 -0
  41. data/features/{nested_steps.feature → docs/defining_steps/nested_steps.feature} +52 -6
  42. data/features/{nested_steps_i18n.feature → docs/defining_steps/nested_steps_i18n.feature} +0 -2
  43. data/features/{step_definitions.feature → docs/defining_steps/one_line_step_definitions.feature} +3 -3
  44. data/features/docs/defining_steps/printing_messages.feature +148 -0
  45. data/features/docs/defining_steps/skip_scenario.feature +62 -0
  46. data/features/docs/defining_steps/snippets.feature +56 -0
  47. data/{legacy_features → features/docs/defining_steps}/table_diffing.feature +21 -16
  48. data/features/{transforms.feature → docs/defining_steps/transforms.feature} +2 -2
  49. data/{legacy_features/exception_in_after_block.feature → features/docs/exception_in_after_hook.feature} +25 -26
  50. data/{legacy_features/exception_in_after_step_block.feature → features/docs/exception_in_after_step_hook.feature} +22 -24
  51. data/features/docs/exception_in_around_hook.feature +80 -0
  52. data/{legacy_features/exception_in_before_block.feature → features/docs/exception_in_before_hook.feature} +18 -20
  53. data/features/docs/extending_cucumber/custom_filter.feature +29 -0
  54. data/features/docs/extending_cucumber/custom_formatter.feature +94 -0
  55. data/features/docs/formatters/debug_formatter.feature +47 -0
  56. data/features/{formatter_step_file_colon_line.feature → docs/formatters/formatter_step_file_colon_line.feature} +2 -4
  57. data/features/{html_formatter.feature → docs/formatters/html_formatter.feature} +10 -14
  58. data/features/docs/formatters/json_formatter.feature +760 -0
  59. data/features/docs/formatters/junit_formatter.feature +316 -0
  60. data/features/docs/formatters/pretty_formatter.feature +73 -0
  61. data/features/{progress_formatter.feature → docs/formatters/progress_formatter.feature} +1 -1
  62. data/features/docs/formatters/rerun_formatter.feature +136 -0
  63. data/features/docs/formatters/usage_formatter.feature +102 -0
  64. data/features/docs/getting_started.feature +27 -0
  65. data/features/{background.feature → docs/gherkin/background.feature} +149 -91
  66. data/features/{doc_strings.feature → docs/gherkin/doc_strings.feature} +1 -0
  67. data/features/docs/gherkin/expand_option_for_outlines.feature +46 -0
  68. data/features/docs/gherkin/language_from_header.feature +32 -0
  69. data/features/docs/gherkin/outlines.feature +158 -0
  70. data/features/docs/gherkin/unicode_table.feature +32 -0
  71. data/features/docs/gherkin/using_descriptions.feature +88 -0
  72. data/features/docs/gherkin/using_star_notation.feature +37 -0
  73. data/{legacy_features → features/docs}/post_configuration_hook.feature +17 -18
  74. data/{legacy_features → features/docs}/profiles.feature +30 -36
  75. data/{legacy_features → features/docs}/rake_task.feature +30 -41
  76. data/features/{raketask.feature → docs/raketask.feature} +6 -13
  77. data/{legacy_features/wire_protocol_erb.feature → features/docs/wire_protocol/erb_configuration.feature} +7 -8
  78. data/features/docs/wire_protocol/handle_unexpected_response.feature +30 -0
  79. data/features/docs/wire_protocol/invoke_message.feature +216 -0
  80. data/features/docs/wire_protocol/readme.md +26 -0
  81. data/features/docs/wire_protocol/snippets_message.feature +51 -0
  82. data/features/docs/wire_protocol/step_matches_message.feature +81 -0
  83. data/{legacy_features/wire_protocol_table_diffing.feature → features/docs/wire_protocol/table_diffing.feature} +19 -12
  84. data/{legacy_features/wire_protocol_tags.feature → features/docs/wire_protocol/tags.feature} +7 -7
  85. data/{legacy_features/wire_protocol_timeouts.feature → features/docs/wire_protocol/timeouts.feature} +7 -6
  86. data/{legacy_features → features/docs}/work_in_progress.feature +52 -54
  87. data/features/docs/writing_support_code/after_hooks.feature +80 -0
  88. data/{legacy_features → features/docs/writing_support_code}/around_hooks.feature +56 -28
  89. data/features/docs/writing_support_code/before_hook.feature +65 -0
  90. data/features/docs/writing_support_code/hook_order.feature +61 -0
  91. data/features/{load_path.feature → docs/writing_support_code/load_path.feature} +3 -0
  92. data/features/docs/writing_support_code/state.feature +32 -0
  93. data/features/docs/writing_support_code/tagged_hooks.feature +95 -0
  94. data/features/lib/step_definitions/aruba_steps.rb +22 -0
  95. data/features/lib/step_definitions/cucumber_steps.rb +50 -0
  96. data/features/{step_definitions → lib/step_definitions}/iso-8859-1_steps.rb +3 -15
  97. data/features/lib/step_definitions/json_steps.rb +7 -0
  98. data/features/lib/step_definitions/junit_steps.rb +13 -0
  99. data/features/lib/step_definitions/language_steps.rb +4 -5
  100. data/features/lib/step_definitions/profile_steps.rb +15 -0
  101. data/features/lib/step_definitions/ruby_steps.rb +3 -0
  102. data/features/lib/step_definitions/wire_steps.rb +58 -0
  103. data/features/lib/support/env.rb +21 -0
  104. data/{legacy_features → features/lib}/support/fake_wire_server.rb +10 -7
  105. data/features/{support → lib/support}/feature_factory.rb +1 -1
  106. data/features/lib/support/normalise_output.rb +33 -0
  107. data/gem_tasks/cov.rake +5 -0
  108. data/gem_tasks/cucumber.rake +3 -8
  109. data/gem_tasks/rspec.rake +0 -2
  110. data/lib/cucumber/ast.rb +8 -25
  111. data/lib/cucumber/cli/configuration.rb +33 -37
  112. data/lib/cucumber/cli/main.rb +14 -27
  113. data/lib/cucumber/cli/options.rb +22 -60
  114. data/lib/cucumber/cli/profile_loader.rb +1 -1
  115. data/lib/cucumber/configuration.rb +4 -0
  116. data/lib/cucumber/constantize.rb +7 -6
  117. data/lib/cucumber/core_ext/instance_exec.rb +7 -38
  118. data/lib/cucumber/core_ext/proc.rb +1 -1
  119. data/lib/cucumber/encoding.rb +5 -0
  120. data/lib/cucumber/errors.rb +21 -10
  121. data/lib/cucumber/file_specs.rb +37 -0
  122. data/lib/cucumber/filters/activate_steps.rb +33 -0
  123. data/lib/cucumber/filters/apply_after_hooks.rb +9 -0
  124. data/lib/cucumber/filters/apply_after_step_hooks.rb +12 -0
  125. data/lib/cucumber/filters/apply_around_hooks.rb +12 -0
  126. data/lib/cucumber/filters/apply_before_hooks.rb +9 -0
  127. data/lib/cucumber/filters/gated_receiver.rb +25 -0
  128. data/lib/cucumber/filters/prepare_world.rb +45 -0
  129. data/lib/cucumber/filters/quit.rb +28 -0
  130. data/lib/cucumber/filters/randomizer.rb +40 -0
  131. data/lib/cucumber/filters/tag_limits/test_case_index.rb +31 -0
  132. data/lib/cucumber/filters/tag_limits/verifier.rb +59 -0
  133. data/lib/cucumber/filters/tag_limits.rb +45 -0
  134. data/lib/cucumber/filters.rb +9 -0
  135. data/lib/cucumber/formatter/ansicolor.rb +0 -8
  136. data/lib/cucumber/formatter/console.rb +66 -36
  137. data/lib/cucumber/formatter/debug.rb +10 -8
  138. data/lib/cucumber/formatter/fanout.rb +27 -0
  139. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +122 -12
  140. data/lib/cucumber/formatter/html.rb +67 -18
  141. data/lib/cucumber/formatter/ignore_missing_messages.rb +20 -0
  142. data/lib/cucumber/formatter/interceptor.rb +17 -3
  143. data/lib/cucumber/formatter/json.rb +1 -1
  144. data/lib/cucumber/formatter/junit.rb +105 -5
  145. data/lib/cucumber/formatter/legacy_api/adapter.rb +1060 -0
  146. data/lib/cucumber/formatter/legacy_api/ast.rb +376 -0
  147. data/lib/cucumber/formatter/legacy_api/results.rb +51 -0
  148. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +30 -0
  149. data/lib/cucumber/formatter/pretty.rb +16 -8
  150. data/lib/cucumber/formatter/progress.rb +10 -0
  151. data/lib/cucumber/formatter/rerun.rb +14 -71
  152. data/lib/cucumber/formatter/unicode.rb +8 -21
  153. data/lib/cucumber/formatter/usage.rb +7 -1
  154. data/lib/cucumber/hooks.rb +97 -0
  155. data/lib/cucumber/language_support/language_methods.rb +0 -54
  156. data/lib/cucumber/{ast/table.rb → multiline_argument/data_table.rb} +77 -84
  157. data/lib/cucumber/multiline_argument/doc_string.rb +10 -0
  158. data/lib/cucumber/multiline_argument.rb +74 -0
  159. data/lib/cucumber/platform.rb +21 -20
  160. data/lib/cucumber/project_initializer.rb +43 -0
  161. data/lib/cucumber/rake/task.rb +3 -54
  162. data/lib/cucumber/rb_support/rb_hook.rb +2 -2
  163. data/lib/cucumber/rb_support/rb_language.rb +4 -34
  164. data/lib/cucumber/rb_support/rb_step_definition.rb +11 -2
  165. data/lib/cucumber/rb_support/rb_transform.rb +3 -1
  166. data/lib/cucumber/rb_support/rb_world.rb +13 -20
  167. data/lib/cucumber/rb_support/snippet.rb +61 -20
  168. data/lib/cucumber/rspec/doubles.rb +9 -6
  169. data/lib/cucumber/running_test_case.rb +115 -0
  170. data/lib/cucumber/runtime/after_hooks.rb +24 -0
  171. data/lib/cucumber/runtime/before_hooks.rb +23 -0
  172. data/lib/cucumber/runtime/for_programming_languages.rb +14 -10
  173. data/lib/cucumber/runtime/step_hooks.rb +22 -0
  174. data/lib/cucumber/runtime/support_code.rb +78 -21
  175. data/lib/cucumber/runtime/user_interface.rb +4 -0
  176. data/lib/cucumber/runtime.rb +153 -98
  177. data/lib/cucumber/step_match.rb +27 -3
  178. data/lib/cucumber/term/ansicolor.rb +1 -9
  179. data/lib/cucumber/wire_support/wire_language.rb +23 -9
  180. data/lib/cucumber/wire_support/wire_packet.rb +1 -1
  181. data/lib/cucumber/wire_support/wire_protocol/requests.rb +13 -5
  182. data/lib/cucumber/wire_support/wire_step_definition.rb +1 -8
  183. data/lib/cucumber.rb +8 -6
  184. data/spec/cucumber/cli/configuration_spec.rb +165 -134
  185. data/spec/cucumber/cli/main_spec.rb +36 -99
  186. data/spec/cucumber/cli/options_spec.rb +238 -272
  187. data/spec/cucumber/cli/profile_loader_spec.rb +18 -7
  188. data/spec/cucumber/configuration_spec.rb +3 -3
  189. data/spec/cucumber/constantize_spec.rb +2 -1
  190. data/spec/cucumber/core_ext/instance_exec_spec.rb +4 -0
  191. data/spec/cucumber/core_ext/proc_spec.rb +32 -43
  192. data/spec/cucumber/file_specs_spec.rb +60 -0
  193. data/spec/cucumber/filters/activate_steps_spec.rb +57 -0
  194. data/spec/cucumber/filters/gated_receiver_spec.rb +47 -0
  195. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +38 -0
  196. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +57 -0
  197. data/spec/cucumber/filters/tag_limits_spec.rb +59 -0
  198. data/spec/cucumber/formatter/ansicolor_spec.rb +11 -10
  199. data/spec/cucumber/formatter/debug_spec.rb +64 -0
  200. data/spec/cucumber/formatter/duration_spec.rb +6 -6
  201. data/spec/cucumber/formatter/html_spec.rb +233 -39
  202. data/spec/cucumber/formatter/interceptor_spec.rb +38 -31
  203. data/spec/cucumber/formatter/junit_spec.rb +213 -151
  204. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +2090 -0
  205. data/spec/cucumber/formatter/pretty_spec.rb +481 -49
  206. data/spec/cucumber/formatter/progress_spec.rb +63 -16
  207. data/spec/cucumber/formatter/rerun_spec.rb +107 -0
  208. data/spec/cucumber/formatter/spec_helper.rb +32 -17
  209. data/spec/cucumber/hooks_spec.rb +30 -0
  210. data/spec/cucumber/{ast/table_spec.rb → multiline_argument/data_table_spec.rb} +128 -208
  211. data/spec/cucumber/project_initializer_spec.rb +87 -0
  212. data/spec/cucumber/rake/forked_spec.rb +13 -22
  213. data/spec/cucumber/rb_support/rb_language_spec.rb +78 -69
  214. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +90 -44
  215. data/spec/cucumber/rb_support/rb_transform_spec.rb +24 -3
  216. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +6 -4
  217. data/spec/cucumber/rb_support/snippet_spec.rb +47 -38
  218. data/spec/cucumber/running_test_case_spec.rb +83 -0
  219. data/spec/cucumber/runtime/for_programming_languages_spec.rb +18 -13
  220. data/spec/cucumber/runtime/support_code_spec.rb +29 -29
  221. data/spec/cucumber/runtime_spec.rb +35 -34
  222. data/spec/cucumber/step_match_spec.rb +30 -20
  223. data/spec/cucumber/wire_support/configuration_spec.rb +8 -5
  224. data/spec/cucumber/wire_support/connection_spec.rb +12 -8
  225. data/spec/cucumber/wire_support/wire_exception_spec.rb +14 -8
  226. data/spec/cucumber/wire_support/wire_language_spec.rb +8 -9
  227. data/spec/cucumber/wire_support/wire_packet_spec.rb +17 -13
  228. data/spec/cucumber/world/pending_spec.rb +36 -36
  229. data/spec/simplecov_setup.rb +18 -0
  230. data/spec/spec_helper.rb +6 -13
  231. metadata +348 -350
  232. data/.gitattributes +0 -1
  233. data/.ruby-version +0 -1
  234. data/examples/python/README.textile +0 -8
  235. data/examples/python/Rakefile +0 -4
  236. data/examples/python/features/fibonacci.feature +0 -19
  237. data/examples/python/features/step_definitions/fib_steps.py +0 -11
  238. data/examples/python/lib/fib.py +0 -7
  239. data/examples/ramaze/README.textile +0 -7
  240. data/examples/ramaze/app.rb +0 -21
  241. data/examples/ramaze/features/add.feature +0 -11
  242. data/examples/ramaze/features/step_definitions/add_steps.rb +0 -15
  243. data/examples/ramaze/features/support/env.rb +0 -32
  244. data/examples/ramaze/layout/default.html.erb +0 -8
  245. data/examples/ramaze/view/index.html.erb +0 -5
  246. data/examples/ruby2python/README.textile +0 -8
  247. data/examples/ruby2python/Rakefile +0 -4
  248. data/examples/ruby2python/features/fibonacci.feature +0 -19
  249. data/examples/ruby2python/features/step_definitions/fib_steps.rb +0 -7
  250. data/examples/ruby2python/features/support/env.rb +0 -21
  251. data/examples/ruby2python/lib/fib.py +0 -7
  252. data/examples/v8/Rakefile +0 -6
  253. data/examples/v8/features/fibonacci.feature +0 -43
  254. data/examples/v8/features/step_definitions/fib_steps.js +0 -49
  255. data/examples/v8/features/support/env.js +0 -14
  256. data/examples/v8/lib/fibonacci.js +0 -19
  257. data/features/.cucumber/stepdefs.json +0 -627
  258. data/features/assertions.feature +0 -73
  259. data/features/autoformat_profile_output.feature +0 -23
  260. data/features/before_hook.feature +0 -43
  261. data/features/bootstrap.feature +0 -27
  262. data/features/custom_formatter.feature +0 -41
  263. data/features/drb_server_integration.feature +0 -63
  264. data/features/execute_with_tag_filter.feature +0 -63
  265. data/features/formatter_callbacks.feature +0 -189
  266. data/features/json_formatter.feature +0 -338
  267. data/features/parsing.feature +0 -18
  268. data/features/pretty_formatter.feature +0 -31
  269. data/features/rerun_formatter.feature +0 -35
  270. data/features/run_specific_scenarios.feature +0 -47
  271. data/features/stats_formatters.feature +0 -73
  272. data/features/step_definitions/cucumber-features/cucumber_ruby_mappings.rb +0 -197
  273. data/features/step_definitions/cucumber_steps.rb +0 -55
  274. data/features/step_definitions/drb_steps.rb +0 -3
  275. data/features/support/env.rb +0 -57
  276. data/features/tagged_hooks.feature +0 -59
  277. data/fixtures/json/features/background.feature +0 -7
  278. data/fixtures/json/features/embed.feature +0 -4
  279. data/fixtures/json/features/one_passing_one_failing.feature +0 -11
  280. data/fixtures/json/features/step_definitions/steps.rb +0 -32
  281. data/fixtures/json/features/tables.feature +0 -13
  282. data/fixtures/junit/features/one_passing_one_failing.feature +0 -8
  283. data/fixtures/junit/features/pending.feature +0 -7
  284. data/fixtures/junit/features/scenario_outline.feature +0 -9
  285. data/fixtures/junit/features/some_subdirectory/one_passing_one_failing.feature +0 -8
  286. data/fixtures/junit/features/step_definitions/steps.rb +0 -11
  287. data/fixtures/self_test/README.textile +0 -6
  288. data/fixtures/self_test/Rakefile +0 -6
  289. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +0 -7
  290. data/fixtures/self_test/features/failing_expectation.feature +0 -4
  291. data/fixtures/self_test/features/lots_of_undefined.feature +0 -8
  292. data/fixtures/self_test/features/multiline_name.feature +0 -27
  293. data/fixtures/self_test/features/outline_sample.feature +0 -15
  294. data/fixtures/self_test/features/sample.feature +0 -21
  295. data/fixtures/self_test/features/search_sample.feature +0 -32
  296. data/fixtures/self_test/features/step_definitions/sample_steps.rb +0 -84
  297. data/fixtures/self_test/features/support/bubble_256x256.png +0 -0
  298. data/fixtures/self_test/features/support/env.rb +0 -26
  299. data/fixtures/self_test/features/tags_sample.feature +0 -17
  300. data/fixtures/self_test/features/tons_of_cukes.feature +0 -52
  301. data/fixtures/self_test/features/undefined_multiline_args.feature +0 -12
  302. data/fixtures/self_test/list-of-features.txt +0 -1
  303. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +0 -8
  304. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +0 -8
  305. data/fixtures/tickets/Rakefile +0 -20
  306. data/fixtures/tickets/features/172.feature +0 -28
  307. data/fixtures/tickets/features/177/1.feature +0 -28
  308. data/fixtures/tickets/features/177/2.feature +0 -20
  309. data/fixtures/tickets/features/177/3.feature +0 -18
  310. data/fixtures/tickets/features/180.feature +0 -7
  311. data/fixtures/tickets/features/229/tagged_hooks.feature +0 -8
  312. data/fixtures/tickets/features/229/tagged_hooks.rb +0 -14
  313. data/fixtures/tickets/features/236.feature +0 -13
  314. data/fixtures/tickets/features/241.feature +0 -12
  315. data/fixtures/tickets/features/246.feature +0 -4
  316. data/fixtures/tickets/features/248.feature +0 -11
  317. data/fixtures/tickets/features/270/back.feature +0 -14
  318. data/fixtures/tickets/features/270/back.steps.rb +0 -14
  319. data/fixtures/tickets/features/272/hooks.feature +0 -26
  320. data/fixtures/tickets/features/272/hooks_steps.rb +0 -53
  321. data/fixtures/tickets/features/279/py_string_indent.feature +0 -25
  322. data/fixtures/tickets/features/279/py_string_indent.steps.rb +0 -12
  323. data/fixtures/tickets/features/279/wrong.feature_ +0 -11
  324. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +0 -6
  325. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +0 -12
  326. data/fixtures/tickets/features/306/only_background.feature +0 -4
  327. data/fixtures/tickets/features/around_timeout.feature +0 -6
  328. data/fixtures/tickets/features/gherkin_67.feature +0 -12
  329. data/fixtures/tickets/features/gherkin_68.feature +0 -4
  330. data/fixtures/tickets/features/half_manual.feature +0 -11
  331. data/fixtures/tickets/features/lib/eatting_machine.rb +0 -18
  332. data/fixtures/tickets/features/lib/pantry.rb +0 -20
  333. data/fixtures/tickets/features/scenario_outline.feature +0 -95
  334. data/fixtures/tickets/features/step_definitons/246_steps.rb +0 -3
  335. data/fixtures/tickets/features/step_definitons/248_steps.rb +0 -15
  336. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +0 -9
  337. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +0 -11
  338. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +0 -42
  339. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +0 -88
  340. data/fixtures/tickets/features/table_diffing.feature +0 -13
  341. data/fixtures/tickets/features/tickets.feature +0 -28
  342. data/fixtures/tickets/features.html +0 -138
  343. data/gem_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  344. data/gem_tasks/yard/default/layout/html/footer.erb +0 -5
  345. data/gem_tasks/yard/default/layout/html/index.erb +0 -1
  346. data/gem_tasks/yard/default/layout/html/layout.erb +0 -25
  347. data/gem_tasks/yard/default/layout/html/logo.erb +0 -1
  348. data/gem_tasks/yard/default/layout/html/setup.rb +0 -4
  349. data/gem_tasks/yard.rake +0 -40
  350. data/legacy_features/README.md +0 -14
  351. data/legacy_features/announce.feature +0 -152
  352. data/legacy_features/bug_371.feature +0 -32
  353. data/legacy_features/bug_464.feature +0 -16
  354. data/legacy_features/bug_475.feature +0 -42
  355. data/legacy_features/bug_585_tab_indentation.feature +0 -22
  356. data/legacy_features/bug_600.feature +0 -73
  357. data/legacy_features/cucumber_cli.feature +0 -584
  358. data/legacy_features/cucumber_cli_outlines.feature +0 -117
  359. data/legacy_features/default_snippets.feature +0 -43
  360. data/legacy_features/diffing.feature +0 -25
  361. data/legacy_features/drb_server_integration.feature +0 -174
  362. data/legacy_features/exclude_files.feature +0 -20
  363. data/legacy_features/expand.feature +0 -60
  364. data/legacy_features/junit_formatter.feature +0 -214
  365. data/legacy_features/language_from_header.feature +0 -30
  366. data/legacy_features/listener_debugger_formatter.feature +0 -42
  367. data/legacy_features/multiline_names.feature +0 -44
  368. data/legacy_features/report_called_undefined_steps.feature +0 -35
  369. data/legacy_features/rerun_formatter.feature +0 -52
  370. data/legacy_features/simplest.feature +0 -11
  371. data/legacy_features/snippet.feature +0 -23
  372. data/legacy_features/snippets_when_using_star_keyword.feature +0 -38
  373. data/legacy_features/step_definitions/cucumber_steps.rb +0 -179
  374. data/legacy_features/step_definitions/extra_steps.rb +0 -2
  375. data/legacy_features/step_definitions/simplest_steps.rb +0 -3
  376. data/legacy_features/step_definitions/wire_steps.rb +0 -34
  377. data/legacy_features/support/env.rb +0 -161
  378. data/legacy_features/support/env.rb.simplest +0 -7
  379. data/legacy_features/table_mapping.feature +0 -34
  380. data/legacy_features/transform.feature +0 -245
  381. data/legacy_features/unicode_table.feature +0 -35
  382. data/legacy_features/wire_protocol.feature +0 -332
  383. data/lib/README.rdoc +0 -12
  384. data/lib/cucumber/ast/background.rb +0 -116
  385. data/lib/cucumber/ast/comment.rb +0 -31
  386. data/lib/cucumber/ast/doc_string.rb +0 -61
  387. data/lib/cucumber/ast/empty_background.rb +0 -33
  388. data/lib/cucumber/ast/examples.rb +0 -49
  389. data/lib/cucumber/ast/feature.rb +0 -99
  390. data/lib/cucumber/ast/features.rb +0 -38
  391. data/lib/cucumber/ast/has_steps.rb +0 -74
  392. data/lib/cucumber/ast/location.rb +0 -41
  393. data/lib/cucumber/ast/multiline_argument.rb +0 -30
  394. data/lib/cucumber/ast/names.rb +0 -13
  395. data/lib/cucumber/ast/outline_table.rb +0 -194
  396. data/lib/cucumber/ast/scenario.rb +0 -103
  397. data/lib/cucumber/ast/scenario_outline.rb +0 -146
  398. data/lib/cucumber/ast/step.rb +0 -122
  399. data/lib/cucumber/ast/step_collection.rb +0 -92
  400. data/lib/cucumber/ast/step_invocation.rb +0 -196
  401. data/lib/cucumber/ast/tags.rb +0 -28
  402. data/lib/cucumber/ast/tree_walker.rb +0 -191
  403. data/lib/cucumber/ast/visitor.rb +0 -11
  404. data/lib/cucumber/broadcaster.rb +0 -13
  405. data/lib/cucumber/cli/drb_client.rb +0 -43
  406. data/lib/cucumber/feature_file.rb +0 -94
  407. data/lib/cucumber/formatter/ordered_xml_markup.rb +0 -24
  408. data/lib/cucumber/js_support/js_dsl.js +0 -57
  409. data/lib/cucumber/js_support/js_language.rb +0 -185
  410. data/lib/cucumber/js_support/js_snippets.rb +0 -27
  411. data/lib/cucumber/parser/gherkin_builder.rb +0 -284
  412. data/lib/cucumber/parser.rb +0 -2
  413. data/lib/cucumber/py_support/py_dsl.py +0 -10
  414. data/lib/cucumber/py_support/py_language.py +0 -10
  415. data/lib/cucumber/py_support/py_language.rb +0 -80
  416. data/lib/cucumber/runtime/features_loader.rb +0 -62
  417. data/lib/cucumber/runtime/results.rb +0 -64
  418. data/lib/cucumber/step_mother.rb +0 -10
  419. data/spec/cucumber/ast/background_spec.rb +0 -122
  420. data/spec/cucumber/ast/doc_string_spec.rb +0 -40
  421. data/spec/cucumber/ast/feature_factory.rb +0 -72
  422. data/spec/cucumber/ast/feature_spec.rb +0 -63
  423. data/spec/cucumber/ast/features_spec.rb +0 -51
  424. data/spec/cucumber/ast/outline_table_spec.rb +0 -21
  425. data/spec/cucumber/ast/scenario_outline_spec.rb +0 -74
  426. data/spec/cucumber/ast/step_spec.rb +0 -68
  427. data/spec/cucumber/ast/tree_walker_spec.rb +0 -19
  428. data/spec/cucumber/broadcaster_spec.rb +0 -15
  429. data/spec/cucumber/cli/drb_client_spec.rb +0 -76
  430. data/spec/cucumber/rake/rcov_spec.rb +0 -71
  431. data/spec/cucumber/runtime/results_spec.rb +0 -81
  432. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +0 -20
  433. /data/examples/i18n/ar/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  434. /data/examples/i18n/bg/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  435. /data/examples/i18n/ca/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  436. /data/examples/i18n/cs/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  437. /data/examples/i18n/da/features/{step_definitons → step_definitions}/lommeregner_steps.rb +0 -0
  438. /data/examples/i18n/de/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  439. /data/examples/i18n/en/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  440. /data/examples/i18n/eo/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  441. /data/examples/i18n/es/features/{step_definitons → step_definitions}/calculador_steps.rb +0 -0
  442. /data/examples/i18n/fi/features/{step_definitons → step_definitions}/laskin_steps.rb +0 -0
  443. /data/examples/i18n/he/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  444. /data/examples/i18n/hi/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  445. /data/examples/i18n/hu/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  446. /data/examples/i18n/id/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  447. /data/examples/i18n/it/features/{step_definitons → step_definitions}/calcolatrice_steps.rb +0 -0
  448. /data/examples/i18n/ja/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  449. /data/examples/i18n/ko/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  450. /data/examples/i18n/lt/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  451. /data/examples/i18n/lv/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  452. /data/examples/i18n/no/features/{step_definitons → step_definitions}/kalkulator_steps.rb +0 -0
  453. /data/examples/i18n/pl/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  454. /data/examples/i18n/ro/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  455. /data/examples/i18n/ru/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  456. /data/examples/i18n/sk/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  457. /data/examples/i18n/sr-Cyrl/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  458. /data/examples/i18n/sr-Latn/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  459. /data/examples/i18n/sv/features/{step_definitons → step_definitions}/kalkulator_steps.rb +0 -0
  460. /data/examples/i18n/tr/features/{step_definitons → step_definitions}/hesap_makinesi_adimlari.rb +0 -0
  461. /data/examples/i18n/uk/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  462. /data/examples/i18n/uz/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  463. /data/examples/i18n/zh-TW/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  464. /data/features/{nested_steps_with_second_arg.feature → docs/defining_steps/nested_steps_with_second_arg.feature} +0 -0
  465. /data/features/{iso-8859-1.feature → docs/iso-8859-1.feature} +0 -0
@@ -0,0 +1,43 @@
1
+ module Cucumber
2
+
3
+ # Generates generic file structure for a cucumber project
4
+ class ProjectInitializer
5
+ def run
6
+ create_directory('features')
7
+ create_directory('features/step_definitions')
8
+ create_directory('features/support')
9
+ create_file('features/support/env.rb')
10
+ end
11
+
12
+ private
13
+
14
+ def create_directory(dir_name)
15
+ create_directory_or_file dir_name, true
16
+ end
17
+
18
+ def create_file(file_name)
19
+ create_directory_or_file file_name, false
20
+ end
21
+
22
+ def create_directory_or_file(file_name, directory)
23
+ file_type = if directory
24
+ :mkdir_p
25
+ else
26
+ :touch
27
+ end
28
+
29
+ report_exists(file_name) || return if File.exists?(file_name)
30
+
31
+ report_creating(file_name)
32
+ FileUtils.send file_type, file_name
33
+ end
34
+
35
+ def report_exists(file)
36
+ puts " exist #{file}"
37
+ end
38
+
39
+ def report_creating(file)
40
+ puts " create #{file}"
41
+ end
42
+ end
43
+ end
@@ -23,12 +23,6 @@ module Cucumber
23
23
  # t.cucumber_opts = %w{--format progress}
24
24
  # end
25
25
  #
26
- # This task can also be configured to be run with RCov:
27
- #
28
- # Cucumber::Rake::Task.new do |t|
29
- # t.rcov = true
30
- # end
31
- #
32
26
  # See the attributes for additional configuration possibilities.
33
27
  class Task
34
28
  include Gherkin::Formatter::AnsiEscapes
@@ -103,27 +97,6 @@ module Cucumber
103
97
  end
104
98
  end
105
99
 
106
- class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
107
-
108
- def initialize(libs, cucumber_bin, cucumber_opts, bundler, feature_files, rcov_opts)
109
- super( libs, cucumber_bin, cucumber_opts, bundler, feature_files )
110
- @rcov_opts = rcov_opts
111
- end
112
-
113
- def cmd
114
- if use_bundler
115
- [Cucumber::RUBY_BINARY, '-S', 'bundle', 'exec', 'rcov', @rcov_opts,
116
- quoted_binary(@cucumber_bin), '--', @cucumber_opts, @feature_files].flatten
117
- else
118
- [Cucumber::RUBY_BINARY, '-I', load_path(@libs), '-S', 'rcov', @rcov_opts,
119
- quoted_binary(@cucumber_bin), '--', @cucumber_opts, @feature_files].flatten
120
- end
121
- end
122
-
123
- end
124
-
125
- LIB = File.expand_path(File.dirname(__FILE__) + '/../..') #:nodoc:
126
-
127
100
  # Directories to add to the Ruby $LOAD_PATH
128
101
  attr_accessor :libs
129
102
 
@@ -137,23 +110,6 @@ module Cucumber
137
110
  @cucumber_opts = String === opts ? opts.split(' ') : opts
138
111
  end
139
112
 
140
- # Run cucumber with RCov? Defaults to false. If you set this to
141
- # true, +fork+ is implicit.
142
- attr_accessor :rcov
143
- def rcov=(flag)
144
- if flag && !Cucumber::RUBY_1_8_7
145
- raise failed + "RCov only works on Ruby 1.8.x. You may want to use SimpleCov: https://github.com/colszowka/simplecov" + reset
146
- end
147
- @rcov = flag
148
- end
149
-
150
- # Extra options to pass to rcov.
151
- # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
152
- attr_accessor :rcov_opts
153
- def rcov_opts=(opts) #:nodoc:
154
- @rcov_opts = String === opts ? opts.split(' ') : opts
155
- end
156
-
157
113
  # Whether or not to fork a new ruby interpreter. Defaults to true. You may gain
158
114
  # some startup speed if you set it to false, but this may also cause issues with
159
115
  # your load path and gems.
@@ -176,12 +132,8 @@ module Cucumber
176
132
  @fork = true
177
133
  @libs = ['lib']
178
134
  @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
179
-
180
135
  yield self if block_given?
181
-
182
136
  @binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
183
- @libs.insert(0, LIB) if binary == Cucumber::BINARY
184
-
185
137
  define_task
186
138
  end
187
139
 
@@ -194,13 +146,10 @@ module Cucumber
194
146
 
195
147
  def runner(task_args = nil) #:nodoc:
196
148
  cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
197
- if(@rcov)
198
- RCovCucumberRunner.new(libs, binary, cucumber_opts, bundler, feature_files, rcov_opts)
199
- elsif(@fork)
200
- ForkedCucumberRunner.new(libs, binary, cucumber_opts, bundler, feature_files)
201
- else
202
- InProcessCucumberRunner.new(libs, cucumber_opts, feature_files)
149
+ if(@fork)
150
+ return ForkedCucumberRunner.new(libs, binary, cucumber_opts, bundler, feature_files)
203
151
  end
152
+ InProcessCucumberRunner.new(libs, cucumber_opts, feature_files)
204
153
  end
205
154
 
206
155
  def cucumber_opts_with_profile #:nodoc:
@@ -10,8 +10,8 @@ module Cucumber
10
10
  @proc = proc
11
11
  end
12
12
 
13
- def invoke(location, argument, &block)
14
- @rb_language.current_world.cucumber_instance_exec(false, location, *[argument, block].compact, &@proc)
13
+ def invoke(pseudo_method, arguments, &block)
14
+ @rb_language.current_world.cucumber_instance_exec(false, pseudo_method, *[arguments, block].compact, &@proc)
15
15
  end
16
16
  end
17
17
  end
@@ -5,18 +5,7 @@ require 'cucumber/rb_support/rb_step_definition'
5
5
  require 'cucumber/rb_support/rb_hook'
6
6
  require 'cucumber/rb_support/rb_transform'
7
7
  require 'cucumber/rb_support/snippet'
8
-
9
- begin
10
- require 'rspec/expectations'
11
- rescue LoadError
12
- begin
13
- require 'spec/expectations'
14
- require 'spec/runner/differs/default'
15
- require 'ostruct'
16
- rescue LoadError
17
- require 'test/unit/assertions'
18
- end
19
- end
8
+ require 'multi_test'
20
9
 
21
10
  module Cucumber
22
11
  module RbSupport
@@ -48,7 +37,6 @@ module Cucumber
48
37
 
49
38
  Gherkin::I18n.code_keywords.each do |adverb|
50
39
  RbDsl.alias_adverb(adverb)
51
- RbWorld.alias_adverb(adverb)
52
40
  end
53
41
 
54
42
  def initialize(runtime)
@@ -56,22 +44,6 @@ module Cucumber
56
44
  @step_definitions = []
57
45
  RbDsl.rb_language = self
58
46
  @world_proc = @world_modules = nil
59
- @assertions_module = find_best_assertions_module
60
- end
61
-
62
- def find_best_assertions_module
63
- begin
64
- ::RSpec::Matchers
65
- rescue NameError
66
- # RSpec >=1.2.4
67
- begin
68
- options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
69
- Spec::Expectations.differ = Spec::Expectations::Differs::Default.new(options)
70
- ::Spec::Matchers
71
- rescue NameError
72
- ::Test::Unit::Assertions
73
- end
74
- end
75
47
  end
76
48
 
77
49
  def step_matches(name_to_match, name_to_format)
@@ -84,9 +56,9 @@ module Cucumber
84
56
  end.compact
85
57
  end
86
58
 
87
- def snippet_text(code_keyword, step_name, multiline_arg_class, snippet_type = :regexp)
59
+ def snippet_text(code_keyword, step_name, multiline_arg, snippet_type = :regexp)
88
60
  snippet_class = typed_snippet_class(snippet_type)
89
- snippet_class.new(code_keyword, step_name, multiline_arg_class).to_s
61
+ snippet_class.new(code_keyword, step_name, multiline_arg).to_s
90
62
  end
91
63
 
92
64
  def begin_rb_scenario(scenario)
@@ -122,8 +94,6 @@ module Cucumber
122
94
  load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
123
95
  end
124
96
 
125
- protected
126
-
127
97
  def begin_scenario(scenario)
128
98
  begin_rb_scenario(scenario)
129
99
  end
@@ -145,7 +115,7 @@ module Cucumber
145
115
 
146
116
  def extend_world
147
117
  @current_world.extend(RbWorld)
148
- @current_world.extend(@assertions_module)
118
+ MultiTest.extend_with_best_assertion_library(@current_world)
149
119
  (@world_modules || []).each do |mod|
150
120
  @current_world.extend(mod)
151
121
  end
@@ -44,10 +44,19 @@ module Cucumber
44
44
  raise ArgumentError unless proc_or_sym.is_a?(Symbol)
45
45
  message = proc_or_sym
46
46
  target_proc = parse_target_proc_from(options)
47
- lambda do |*args|
47
+ patch_location_onto lambda { |*args|
48
48
  target = instance_exec(&target_proc)
49
49
  target.send(message, *args)
50
- end
50
+ }
51
+ end
52
+
53
+ def patch_location_onto(block)
54
+ file, line = caller[5].split(':')[0..1]
55
+ location = Core::Ast::Location.new(
56
+ Pathname.new(file).relative_path_from(Pathname.new(Dir.pwd)),
57
+ line)
58
+ block.define_singleton_method(:file_colon_line) { location.to_s }
59
+ block
51
60
  end
52
61
 
53
62
  def parse_target_proc_from(options)
@@ -39,7 +39,9 @@ module Cucumber
39
39
 
40
40
  private
41
41
  def convert_captures(regexp_source)
42
- regexp_source.gsub(/(\()(?!\?:)/,'(?:')
42
+ regexp_source
43
+ .gsub(/(\()(?!\?[<:=!])/,'(?:')
44
+ .gsub(/(\(\?<)(?![=!])/,'(?:<')
43
45
  end
44
46
 
45
47
  def strip_captures(regexp_source)
@@ -11,13 +11,6 @@ module Cucumber
11
11
  # @private
12
12
  AnsiEscapes = Gherkin::Formatter::AnsiEscapes
13
13
 
14
- class << self
15
- # @private
16
- def alias_adverb(adverb)
17
- alias_method adverb, :__cucumber_invoke
18
- end
19
- end
20
-
21
14
  # Call a Transform with a string from another Transform definition
22
15
  def Transform(arg)
23
16
  rb = @__cucumber_runtime.load_programming_language('rb')
@@ -27,12 +20,6 @@ module Cucumber
27
20
  # @private
28
21
  attr_writer :__cucumber_runtime, :__natural_language
29
22
 
30
- # @private
31
- def __cucumber_invoke(name, multiline_argument=nil) #:nodoc:
32
- STDERR.puts AnsiEscapes.failed + "WARNING: Using 'Given/When/Then' in step definitions is deprecated, use 'step' to call other steps instead:" + caller[0] + AnsiEscapes.reset
33
- @__cucumber_runtime.invoke(name, multiline_argument)
34
- end
35
-
36
23
  # Run a single Gherkin step
37
24
  # @example Call another step
38
25
  # step "I am logged in"
@@ -48,8 +35,9 @@ module Cucumber
48
35
  # step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
49
36
  # @param [String] name The name of the step
50
37
  # @param [String,Cucumber::Ast::DocString,Cucumber::Ast::Table] multiline_argument
51
- def step(name, multiline_argument=nil)
52
- @__cucumber_runtime.invoke(name, multiline_argument)
38
+ def step(name, raw_multiline_arg=nil)
39
+ location = Core::Ast::Location.of_caller
40
+ @__cucumber_runtime.invoke_dynamic_step(name, MultilineArgument.from(raw_multiline_arg, location))
53
41
  end
54
42
 
55
43
  # Run a snippet of Gherkin
@@ -60,7 +48,7 @@ module Cucumber
60
48
  # }
61
49
  # @param [String] steps_text The Gherkin snippet to run
62
50
  def steps(steps_text)
63
- @__cucumber_runtime.invoke_steps(steps_text, @__natural_language, caller[0])
51
+ @__cucumber_runtime.invoke_dynamic_steps(steps_text, @__natural_language, caller[0])
64
52
  end
65
53
 
66
54
  # Parse Gherkin into a {Cucumber::Ast::Table} object.
@@ -102,7 +90,7 @@ module Cucumber
102
90
  # of sending the output directly to STDOUT, Cucumber will intercept and cache
103
91
  # the message until the current step has finished, and then display it.
104
92
  #
105
- # If you'd prefer to see the message immediately, call {Kernel#puts} instead.
93
+ # If you'd prefer to see the message immediately, call {Kernel.puts} instead.
106
94
  def puts(*messages)
107
95
  @__cucumber_runtime.puts(*messages)
108
96
  end
@@ -123,14 +111,19 @@ module Cucumber
123
111
  begin
124
112
  yield
125
113
  rescue Exception
126
- raise Pending.new(message)
114
+ raise Pending, message
127
115
  end
128
- raise Pending.new("Expected pending '#{message}' to fail. No Error was raised. No longer pending?")
116
+ raise Pending, "Expected pending '#{message}' to fail. No Error was raised. No longer pending?"
129
117
  else
130
- raise Pending.new(message)
118
+ raise Pending, message
131
119
  end
132
120
  end
133
121
 
122
+ # Skips this step and the remaining steps in the scenario
123
+ def skip_this_scenario(message = "Scenario skipped")
124
+ raise Core::Test::Result::Skipped, message
125
+ end
126
+
134
127
  # Prints the list of modules that are included in the World
135
128
  def inspect
136
129
  modules = [self.class]
@@ -2,15 +2,15 @@ module Cucumber
2
2
  module RbSupport
3
3
  module Snippet
4
4
 
5
- ARGUMENT_PATTERNS = ['"(.*?)"', '(\d+)']
5
+ ARGUMENT_PATTERNS = ['"([^"]*)"', '(\d+)']
6
6
 
7
7
  class BaseSnippet
8
8
 
9
- def initialize(code_keyword, pattern, multiline_argument_class)
9
+ def initialize(code_keyword, pattern, multiline_argument)
10
10
  @number_of_arguments = 0
11
11
  @code_keyword = code_keyword
12
12
  @pattern = replace_and_count_capturing_groups(pattern)
13
- @multiline_argument_class = multiline_argument_class
13
+ @multiline_argument = MultilineArgumentSnippet.new(multiline_argument)
14
14
  end
15
15
 
16
16
  def to_s
@@ -27,7 +27,7 @@ module Cucumber
27
27
 
28
28
  private
29
29
 
30
- attr_reader :code_keyword, :pattern, :multiline_argument_class, :number_of_arguments
30
+ attr_reader :code_keyword, :pattern, :multiline_argument, :number_of_arguments
31
31
 
32
32
  def replace_and_count_capturing_groups(pattern)
33
33
  modified_pattern = ::Regexp.escape(pattern).gsub('\ ', ' ').gsub('/', '\/')
@@ -43,32 +43,20 @@ module Cucumber
43
43
  def do_block
44
44
  do_block = ""
45
45
  do_block << "do#{arguments}\n"
46
- do_block << multiline_comment if multiline_argument_class?
47
- do_block << " pending # express the regexp above with the code you wish you had\n"
46
+ multiline_argument.append_comment_to(do_block)
47
+ do_block << " pending # Write code here that turns the phrase above into concrete actions\n"
48
48
  do_block << "end"
49
49
  do_block
50
50
  end
51
51
 
52
52
  def arguments
53
53
  block_args = (0...number_of_arguments).map { |n| "arg#{n+1}" }
54
-
55
- if multiline_argument_class
56
- block_args << multiline_argument_class.default_arg_name
57
- end
58
-
54
+ multiline_argument.append_block_argument_to(block_args)
59
55
  block_args.empty? ? "" : " |#{block_args.join(", ")}|"
60
56
  end
61
57
 
62
- def multiline_comment
63
- " # #{multiline_argument_class.default_arg_name} is a #{multiline_argument_class.to_s}\n"
64
- end
65
-
66
- def multiline_argument_class?
67
- multiline_argument_class == Ast::Table
68
- end
69
-
70
58
  def self.example
71
- new("Given", "missing step", nil).step
59
+ new("Given", "missing step", MultilineArgument::None.new).step
72
60
  end
73
61
 
74
62
  end
@@ -103,6 +91,59 @@ module Cucumber
103
91
  end
104
92
  end
105
93
 
94
+ module MultilineArgumentSnippet
95
+
96
+ def self.new(multiline_argument)
97
+ builder = Builder.new
98
+ multiline_argument.describe_to(builder)
99
+ builder.result
100
+ end
101
+
102
+ class Builder
103
+ def doc_string(*args)
104
+ @result = DocString.new
105
+ end
106
+
107
+ def data_table(table, *args)
108
+ @result = DataTable.new(table)
109
+ end
110
+
111
+ def result
112
+ @result || None.new
113
+ end
114
+ end
115
+
116
+ class DocString
117
+ def append_block_argument_to(array)
118
+ array << 'string'
119
+ end
120
+
121
+ def append_comment_to(string)
122
+ end
123
+ end
124
+
125
+ class DataTable
126
+ def initialize(table)
127
+ @table = table
128
+ end
129
+
130
+ def append_block_argument_to(array)
131
+ array << 'table'
132
+ end
133
+
134
+ def append_comment_to(string)
135
+ string << " # table is a #{@table.class.to_s}\n"
136
+ end
137
+ end
138
+
139
+ class None
140
+ def append_block_argument_to(array)
141
+ end
142
+
143
+ def append_comment_to(string)
144
+ end
145
+ end
146
+ end
106
147
  end
107
148
  end
108
149
  end
@@ -1,16 +1,19 @@
1
- require 'rspec/core'
1
+ require 'rspec/mocks'
2
2
 
3
- RSpec.configuration.configure_mock_framework
4
- World(RSpec::Core::MockFrameworkAdapter)
3
+ World(RSpec::Mocks::ExampleMethods)
5
4
 
6
5
  Before do
7
- RSpec::Mocks::setup(self)
6
+ if RSpec::Mocks::Version::STRING >= "2.9.9"
7
+ RSpec::Mocks.setup
8
+ else
9
+ RSpec::Mocks.setup(self)
10
+ end
8
11
  end
9
12
 
10
13
  After do
11
14
  begin
12
- RSpec::Mocks::verify
15
+ RSpec::Mocks.verify
13
16
  ensure
14
- RSpec::Mocks::teardown
17
+ RSpec::Mocks.teardown
15
18
  end
16
19
  end
@@ -0,0 +1,115 @@
1
+ require 'delegate'
2
+
3
+ module Cucumber
4
+ # Represents the current status of a running test case.
5
+ #
6
+ # This wraps a `Cucumber::Core::Test::Case` and delegates
7
+ # many methods to that object.
8
+ #
9
+ # We decorete the core object with the current result.
10
+ # In the first Before hook of a scenario, this will be an
11
+ # instance of `Cucumber::Core::Test::Result::Unknown`
12
+ # but as the scenario runs, it will be updated to reflect
13
+ # the passed / failed / undefined / skipped status of
14
+ # the test case.
15
+ #
16
+ # The test case might come from a regular Scenario or
17
+ # a Scenario outline. You can call the `#outline?`
18
+ # predicate to find out. If it's from an outline,
19
+ # you get a couple of extra methods.
20
+ module RunningTestCase
21
+ def self.new(test_case)
22
+ Builder.new(test_case).result
23
+ end
24
+
25
+ class Builder
26
+ def initialize(test_case)
27
+ @test_case = test_case
28
+ test_case.describe_source_to(self)
29
+ end
30
+
31
+ def feature(feature)
32
+ end
33
+
34
+ def scenario(scenario)
35
+ @factory = Scenario
36
+ end
37
+
38
+ def scenario_outline(scenario)
39
+ @factory = ScenarioOutlineExample
40
+ end
41
+
42
+ def examples_table(examples_table)
43
+ end
44
+
45
+ def examples_table_row(row)
46
+ end
47
+
48
+ def result
49
+ @factory.new(@test_case)
50
+ end
51
+ end
52
+ private_constant :Builder
53
+
54
+ class Scenario < SimpleDelegator
55
+ def initialize(test_case, result = Core::Test::Result::Unknown.new)
56
+ @test_case = test_case
57
+ @result = result
58
+ super test_case
59
+ end
60
+
61
+ def accept_hook?(hook)
62
+ hook.tag_expressions.all? { |expression| @test_case.match_tags?(expression) }
63
+ end
64
+
65
+ def failed?
66
+ @result.failed?
67
+ end
68
+
69
+ def passed?
70
+ !failed?
71
+ end
72
+
73
+ def title
74
+ warn("deprecated: call #name instead")
75
+ name
76
+ end
77
+
78
+ def source_tags
79
+ #warn('deprecated: call #tags instead')
80
+ tags
81
+ end
82
+
83
+ def source_tag_names
84
+ tags.map &:name
85
+ end
86
+
87
+ def skip_invoke!
88
+ Cucumber.deprecate(self.class.name, __method__, "Call #skip_this_scenario on the World directly")
89
+ raise Cucumber::Core::Test::Result::Skipped
90
+ end
91
+
92
+ def outline?
93
+ false
94
+ end
95
+
96
+ def with_result(result)
97
+ self.class.new(@test_case, result)
98
+ end
99
+ end
100
+
101
+ class ScenarioOutlineExample < Scenario
102
+ def outline?
103
+ true
104
+ end
105
+
106
+ def scenario_outline
107
+ self
108
+ end
109
+
110
+ def cell_values
111
+ source.last.values
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,24 @@
1
+ module Cucumber
2
+ class Runtime
3
+ class AfterHooks
4
+ def initialize(action_blocks)
5
+ @action_blocks = action_blocks
6
+ end
7
+
8
+ def apply_to(test_case)
9
+ test_case.with_steps(
10
+ test_case.test_steps + after_hooks(test_case.source).reverse
11
+ )
12
+ end
13
+
14
+ private
15
+
16
+ def after_hooks(source)
17
+ @action_blocks.map do |action_block|
18
+ Hooks.after_hook(source, &action_block)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,23 @@
1
+ module Cucumber
2
+ class Runtime
3
+ class BeforeHooks
4
+ def initialize(action_blocks)
5
+ @action_blocks = action_blocks
6
+ end
7
+
8
+ def apply_to(test_case)
9
+ test_case.with_steps(
10
+ before_hooks(test_case.source) + test_case.test_steps
11
+ )
12
+ end
13
+
14
+ private
15
+
16
+ def before_hooks(source)
17
+ @action_blocks.map do |action_block|
18
+ Hooks.before_hook(source, &action_block)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end