cucumber 2.99.0 → 3.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/.cucumberproignore +6 -0
  3. data/.gitattributes +32 -0
  4. data/.github/ISSUE_TEMPLATE.md +1 -1
  5. data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  6. data/.rubocop.yml +13 -0
  7. data/.rubocop_todo.yml +991 -0
  8. data/.travis.yml +56 -10
  9. data/{History.md → CHANGELOG.md} +166 -32
  10. data/CONTRIBUTING.md +21 -1
  11. data/Gemfile +18 -5
  12. data/README.md +13 -4
  13. data/Rakefile +12 -2
  14. data/appveyor.yml +27 -0
  15. data/bin/cucumber +2 -1
  16. data/cucumber.gemspec +15 -10
  17. data/cucumber.yml +10 -11
  18. data/examples/i18n/Rakefile +1 -1
  19. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +8 -3
  20. data/examples/i18n/ar/lib/calculator.rb +2 -2
  21. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +6 -6
  22. data/examples/i18n/bg/features/support/env.rb +6 -1
  23. data/examples/i18n/bg/lib/calculator.rb +2 -1
  24. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +10 -5
  25. data/examples/i18n/ca/lib/calculadora.rb +2 -2
  26. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +10 -5
  27. data/examples/i18n/cs/lib/calculator.rb +3 -3
  28. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +10 -5
  29. data/examples/i18n/da/lib/lommeregner.rb +2 -2
  30. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +10 -5
  31. data/examples/i18n/de/lib/calculator.rb +2 -2
  32. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +10 -5
  33. data/examples/i18n/el/lib/calculator.rb +2 -2
  34. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +9 -4
  35. data/examples/i18n/en/lib/calculator.rb +2 -2
  36. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +4 -4
  37. data/examples/i18n/en-lol/features/support/env.rb +6 -2
  38. data/examples/i18n/en-lol/lib/basket.rb +2 -2
  39. data/examples/i18n/en-lol/lib/belly.rb +2 -2
  40. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +9 -4
  41. data/examples/i18n/eo/lib/calculator.rb +2 -2
  42. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +10 -5
  43. data/examples/i18n/es/lib/calculador.rb +2 -2
  44. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +10 -5
  45. data/examples/i18n/et/lib/kalkulaator.rb +3 -3
  46. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +9 -4
  47. data/examples/i18n/fi/lib/laskin.rb +1 -1
  48. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +8 -8
  49. data/examples/i18n/fr/features/support/env.rb +7 -2
  50. data/examples/i18n/fr/lib/calculatrice.rb +2 -2
  51. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +10 -5
  52. data/examples/i18n/he/lib/calculator.rb +1 -1
  53. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +9 -4
  54. data/examples/i18n/hi/lib/calculator.rb +1 -1
  55. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +9 -5
  56. data/examples/i18n/ht/lib/kalkilatris.rb +2 -2
  57. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +10 -5
  58. data/examples/i18n/hu/lib/calculator.rb +1 -1
  59. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +10 -5
  60. data/examples/i18n/id/lib/calculator.rb +2 -2
  61. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +10 -5
  62. data/examples/i18n/it/lib/calcolatrice.rb +3 -3
  63. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +3 -3
  64. data/examples/i18n/ja/features/support/env.rb +7 -2
  65. data/examples/i18n/ja/lib/calculator.rb +2 -2
  66. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +10 -5
  67. data/examples/i18n/ko/lib/calculator.rb +2 -2
  68. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +10 -5
  69. data/examples/i18n/lt/lib/calculator.rb +2 -2
  70. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +10 -5
  71. data/examples/i18n/lv/lib/calculator.rb +2 -2
  72. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +3 -3
  73. data/examples/i18n/no/features/support/env.rb +7 -2
  74. data/examples/i18n/no/lib/kalkulator.rb +2 -2
  75. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +10 -5
  76. data/examples/i18n/pl/features/support/env.rb +6 -1
  77. data/examples/i18n/pl/lib/calculator.rb +2 -2
  78. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -3
  79. data/examples/i18n/pt/features/support/env.rb +7 -2
  80. data/examples/i18n/pt/lib/calculadora.rb +1 -1
  81. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +11 -6
  82. data/examples/i18n/ro/lib/calculator.rb +1 -1
  83. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +5 -5
  84. data/examples/i18n/ru/features/support/env.rb +6 -1
  85. data/examples/i18n/ru/lib/calculator.rb +2 -1
  86. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +10 -5
  87. data/examples/i18n/sk/lib/calculator.rb +2 -2
  88. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +3 -3
  89. data/examples/i18n/sr-Cyrl/features/support/env.rb +7 -2
  90. data/examples/i18n/sr-Cyrl/lib/calculator.rb +2 -2
  91. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +10 -5
  92. data/examples/i18n/sr-Latn/lib/calculator.rb +2 -2
  93. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +9 -4
  94. data/examples/i18n/sv/lib/kalkulator.rb +2 -2
  95. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +10 -5
  96. data/examples/i18n/tr/lib/hesap_makinesi.rb +2 -2
  97. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +4 -4
  98. data/examples/i18n/uk/features/support/env.rb +6 -1
  99. data/examples/i18n/uk/lib/calculator.rb +2 -1
  100. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +4 -4
  101. data/examples/i18n/uz/features/support/env.rb +6 -1
  102. data/examples/i18n/uz/lib/calculator.rb +2 -1
  103. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +11 -6
  104. data/examples/i18n/zh-CN/lib/calculator.rb +2 -2
  105. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +10 -5
  106. data/examples/i18n/zh-TW/lib/calculator.rb +2 -2
  107. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +3 -3
  108. data/examples/sinatra/features/step_definitions/add_steps.rb +4 -4
  109. data/examples/sinatra/features/support/env.rb +6 -1
  110. data/examples/tcl/features/step_definitions/fib_steps.rb +2 -2
  111. data/examples/tcl/features/support/env.rb +2 -1
  112. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +4 -4
  113. data/examples/watir/features/step_definitions/search_steps.rb +6 -5
  114. data/examples/watir/features/support/env.rb +5 -1
  115. data/examples/watir/features/support/screenshots.rb +5 -5
  116. data/features/docs/api/list_step_defs_as_json.feature +21 -7
  117. data/features/docs/api/listen_for_events.feature +9 -8
  118. data/features/docs/api/run_cli_main_with_existing_runtime.feature +1 -0
  119. data/features/docs/cli/dry_run.feature +3 -0
  120. data/features/docs/cli/execute_with_tag_filter.feature +8 -6
  121. data/features/docs/cli/fail_fast.feature +2 -0
  122. data/features/docs/cli/help.feature +8 -0
  123. data/features/docs/{gherkin/language_help.feature → cli/i18n.feature} +6 -6
  124. data/features/docs/cli/randomize.feature +2 -2
  125. data/features/docs/cli/retry_failing_tests.feature +75 -15
  126. data/features/docs/cli/run_scenarios_matching_name.feature +1 -0
  127. data/features/docs/cli/specifying_multiple_formatters.feature +3 -0
  128. data/features/docs/cli/strict_mode.feature +6 -0
  129. data/features/docs/defining_steps/ambiguous_steps.feature +89 -0
  130. data/features/docs/defining_steps/nested_steps.feature +5 -1
  131. data/features/docs/defining_steps/nested_steps_i18n.feature +3 -0
  132. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +2 -0
  133. data/features/docs/defining_steps/printing_messages.feature +1 -2
  134. data/features/docs/defining_steps/skip_scenario.feature +1 -34
  135. data/features/docs/defining_steps/snippets.feature +18 -18
  136. data/features/docs/events/gherkin_source_read_event.feature +43 -0
  137. data/features/docs/events/step_activated_event.feature +36 -0
  138. data/features/docs/events/step_definition_registered_event.feature +29 -0
  139. data/features/docs/events/test_case_finished_event.feature +35 -0
  140. data/features/docs/events/test_case_started_event.feature +54 -0
  141. data/features/docs/events/test_run_finished_event.feature +40 -0
  142. data/features/docs/events/test_run_started_event.feature +41 -0
  143. data/features/docs/events/test_step_finished_event.feature +47 -0
  144. data/features/docs/events/test_step_started_event.feature +43 -0
  145. data/features/docs/exception_in_after_hook.feature +3 -2
  146. data/features/docs/exception_in_after_step_hook.feature +2 -0
  147. data/features/docs/exception_in_around_hook.feature +2 -0
  148. data/features/docs/exception_in_before_hook.feature +3 -1
  149. data/features/docs/extending_cucumber/custom_formatter.feature +12 -48
  150. data/features/docs/formatters/json_formatter.feature +4 -4
  151. data/features/docs/formatters/junit_formatter.feature +7 -6
  152. data/features/docs/formatters/pretty_formatter.feature +1 -0
  153. data/features/docs/formatters/progress_formatter.feature +1 -0
  154. data/features/docs/formatters/rerun_formatter.feature +2 -0
  155. data/features/docs/formatters/summary_formatter.feature +35 -0
  156. data/features/docs/formatters/usage_formatter.feature +3 -0
  157. data/features/docs/getting_started.feature +2 -1
  158. data/features/docs/gherkin/background.feature +5 -5
  159. data/features/docs/gherkin/doc_strings.feature +2 -0
  160. data/features/docs/gherkin/expand_option_for_outlines.feature +1 -0
  161. data/features/docs/gherkin/outlines.feature +6 -4
  162. data/features/docs/gherkin/unicode_table.feature +2 -1
  163. data/features/docs/gherkin/using_descriptions.feature +1 -0
  164. data/features/docs/gherkin/using_star_notation.feature +1 -1
  165. data/features/docs/post_configuration_hook.feature +1 -17
  166. data/features/docs/rake_task.feature +5 -0
  167. data/features/docs/raketask.feature +3 -1
  168. data/features/docs/work_in_progress.feature +5 -2
  169. data/features/docs/writing_support_code/after_step_hooks.feature +3 -1
  170. data/features/docs/writing_support_code/around_hooks.feature +6 -0
  171. data/features/docs/writing_support_code/before_hook.feature +1 -0
  172. data/features/docs/writing_support_code/hook_order.feature +3 -1
  173. data/features/docs/writing_support_code/parameter_types.feature +53 -0
  174. data/features/docs/writing_support_code/tagged_hooks.feature +1 -1
  175. data/features/docs/writing_support_code/world.feature +129 -0
  176. data/features/lib/step_definitions/aruba_steps.rb +5 -10
  177. data/features/lib/step_definitions/cli_steps.rb +4 -0
  178. data/features/lib/step_definitions/cucumber_steps.rb +9 -12
  179. data/features/lib/step_definitions/iso-8859-1_steps.rb +9 -5
  180. data/features/lib/step_definitions/json_steps.rb +2 -1
  181. data/features/lib/step_definitions/junit_steps.rb +2 -1
  182. data/features/lib/step_definitions/language_steps.rb +3 -2
  183. data/features/lib/step_definitions/profile_steps.rb +7 -6
  184. data/features/lib/step_definitions/retry_steps.rb +33 -13
  185. data/features/lib/step_definitions/ruby_steps.rb +2 -1
  186. data/features/lib/support/env.rb +3 -2
  187. data/features/lib/support/fake_wire_server.rb +17 -3
  188. data/features/lib/support/feature_factory.rb +2 -1
  189. data/features/lib/support/normalise_output.rb +14 -12
  190. data/features/lib/support/parameter_types.rb +5 -0
  191. data/gem_tasks/contributors.rake +10 -6
  192. data/gem_tasks/cov.rake +1 -0
  193. data/gem_tasks/downloads.rb +1 -0
  194. data/gem_tasks/environment.rake +2 -5
  195. data/gem_tasks/examples.rake +3 -2
  196. data/gem_tasks/fix_cr_lf.rake +19 -7
  197. data/gem_tasks/flog.rake +4 -3
  198. data/gem_tasks/rspec.rake +2 -1
  199. data/gem_tasks/sass.rake +2 -1
  200. data/lib/autotest/cucumber.rb +1 -0
  201. data/lib/autotest/cucumber_mixin.rb +17 -16
  202. data/lib/autotest/cucumber_rails.rb +1 -0
  203. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  204. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  205. data/lib/autotest/cucumber_rspec.rb +1 -0
  206. data/lib/autotest/cucumber_rspec2.rb +1 -0
  207. data/lib/autotest/discover.rb +3 -2
  208. data/lib/cucumber/cli/configuration.rb +12 -21
  209. data/lib/cucumber/cli/main.rb +8 -7
  210. data/lib/cucumber/cli/options.rb +341 -217
  211. data/lib/cucumber/cli/profile_loader.rb +26 -21
  212. data/lib/cucumber/cli/rerun_file.rb +1 -0
  213. data/lib/cucumber/configuration.rb +54 -37
  214. data/lib/cucumber/constantize.rb +2 -1
  215. data/lib/cucumber/core_ext/string.rb +2 -1
  216. data/lib/cucumber/deprecate.rb +4 -3
  217. data/lib/cucumber/encoding.rb +1 -0
  218. data/lib/cucumber/errors.rb +3 -1
  219. data/lib/cucumber/events/gherkin_source_read.rb +17 -0
  220. data/lib/cucumber/events/{step_match.rb → step_activated.rb} +5 -2
  221. data/lib/cucumber/events/step_definition_registered.rb +24 -0
  222. data/lib/cucumber/events/test_case_finished.rb +18 -0
  223. data/lib/cucumber/events/test_case_started.rb +15 -0
  224. data/lib/cucumber/events/test_run_finished.rb +12 -0
  225. data/lib/cucumber/events/test_run_started.rb +16 -0
  226. data/lib/cucumber/events/test_step_finished.rb +20 -0
  227. data/lib/cucumber/events/test_step_started.rb +17 -0
  228. data/lib/cucumber/events.rb +23 -3
  229. data/lib/cucumber/file_specs.rb +1 -0
  230. data/lib/cucumber/filters/activate_steps.rb +8 -3
  231. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  232. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  233. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  234. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  235. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +27 -0
  236. data/lib/cucumber/filters/gated_receiver.rb +1 -0
  237. data/lib/cucumber/filters/prepare_world.rb +1 -0
  238. data/lib/cucumber/filters/quit.rb +1 -0
  239. data/lib/cucumber/filters/randomizer.rb +1 -0
  240. data/lib/cucumber/filters/retry.rb +4 -4
  241. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -0
  242. data/lib/cucumber/filters/tag_limits/verifier.rb +2 -1
  243. data/lib/cucumber/filters/tag_limits.rb +4 -3
  244. data/lib/cucumber/filters.rb +3 -0
  245. data/lib/cucumber/formatter/ansicolor.rb +9 -11
  246. data/lib/cucumber/formatter/backtrace_filter.rb +21 -8
  247. data/lib/cucumber/formatter/console.rb +72 -66
  248. data/lib/cucumber/formatter/console_counts.rb +44 -0
  249. data/lib/cucumber/formatter/console_issues.rb +58 -0
  250. data/lib/cucumber/formatter/duration.rb +2 -1
  251. data/lib/cucumber/formatter/duration_extractor.rb +1 -0
  252. data/lib/cucumber/formatter/fail_fast.rb +4 -2
  253. data/lib/cucumber/formatter/fanout.rb +1 -0
  254. data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
  255. data/lib/cucumber/formatter/html.rb +175 -249
  256. data/lib/cucumber/formatter/html_builder.rb +120 -0
  257. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -0
  258. data/lib/cucumber/formatter/inline-js.js +30 -0
  259. data/lib/cucumber/formatter/interceptor.rb +3 -2
  260. data/lib/cucumber/formatter/io.rb +2 -1
  261. data/lib/cucumber/formatter/json.rb +33 -30
  262. data/lib/cucumber/formatter/json_pretty.rb +1 -0
  263. data/lib/cucumber/formatter/junit.rb +26 -24
  264. data/lib/cucumber/formatter/legacy_api/adapter.rb +81 -69
  265. data/lib/cucumber/formatter/legacy_api/ast.rb +27 -22
  266. data/lib/cucumber/formatter/legacy_api/results.rb +7 -8
  267. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +1 -0
  268. data/lib/cucumber/formatter/pretty.rb +24 -18
  269. data/lib/cucumber/formatter/progress.rb +55 -13
  270. data/lib/cucumber/formatter/rerun.rb +15 -18
  271. data/lib/cucumber/formatter/stepdefs.rb +1 -0
  272. data/lib/cucumber/formatter/steps.rb +2 -1
  273. data/lib/cucumber/formatter/summary.rb +43 -20
  274. data/lib/cucumber/formatter/unicode.rb +2 -1
  275. data/lib/cucumber/formatter/usage.rb +33 -28
  276. data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
  277. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -1
  278. data/lib/cucumber/gherkin/formatter/escaping.rb +2 -1
  279. data/lib/cucumber/gherkin/i18n.rb +1 -0
  280. data/lib/cucumber/gherkin/steps_parser.rb +1 -0
  281. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +41 -30
  282. data/lib/cucumber/glue/hook.rb +43 -0
  283. data/lib/cucumber/glue/invoke_in_world.rb +70 -0
  284. data/lib/cucumber/glue/proto_world.rb +220 -0
  285. data/lib/cucumber/{rb_support/rb_language.rb → glue/registry_and_more.rb} +60 -90
  286. data/lib/cucumber/{rb_support → glue}/snippet.rb +64 -26
  287. data/lib/cucumber/glue/step_definition.rb +143 -0
  288. data/lib/cucumber/glue/world_factory.rb +23 -0
  289. data/lib/cucumber/hooks.rb +9 -8
  290. data/lib/cucumber/load_path.rb +1 -0
  291. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +158 -0
  292. data/lib/cucumber/multiline_argument/data_table.rb +47 -181
  293. data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
  294. data/lib/cucumber/multiline_argument.rb +6 -15
  295. data/lib/cucumber/platform.rb +4 -5
  296. data/lib/cucumber/project_initializer.rb +3 -2
  297. data/lib/cucumber/rake/task.rb +19 -14
  298. data/lib/cucumber/rspec/disable_option_parser.rb +2 -1
  299. data/lib/cucumber/rspec/doubles.rb +2 -1
  300. data/lib/cucumber/running_test_case.rb +3 -27
  301. data/lib/cucumber/runtime/after_hooks.rb +2 -1
  302. data/lib/cucumber/runtime/before_hooks.rb +1 -0
  303. data/lib/cucumber/runtime/for_programming_languages.rb +2 -36
  304. data/lib/cucumber/runtime/step_hooks.rb +1 -0
  305. data/lib/cucumber/runtime/support_code.rb +21 -16
  306. data/lib/cucumber/runtime/user_interface.rb +10 -16
  307. data/lib/cucumber/runtime.rb +49 -32
  308. data/lib/cucumber/step_argument.rb +1 -2
  309. data/lib/cucumber/step_definition_light.rb +2 -0
  310. data/lib/cucumber/step_definitions.rb +1 -0
  311. data/lib/cucumber/step_match.rb +30 -15
  312. data/lib/cucumber/step_match_search.rb +3 -3
  313. data/lib/cucumber/term/ansicolor.rb +2 -1
  314. data/lib/cucumber/unit.rb +1 -0
  315. data/lib/cucumber/version +1 -1
  316. data/lib/cucumber.rb +1 -13
  317. data/lib/simplecov_setup.rb +2 -1
  318. data/scripts/invite-collaborator +40 -0
  319. data/scripts/update-changelog +86 -0
  320. data/spec/cucumber/cli/configuration_spec.rb +109 -98
  321. data/spec/cucumber/cli/main_spec.rb +8 -7
  322. data/spec/cucumber/cli/options_spec.rb +114 -79
  323. data/spec/cucumber/cli/profile_loader_spec.rb +25 -5
  324. data/spec/cucumber/cli/rerun_spec.rb +21 -20
  325. data/spec/cucumber/configuration_spec.rb +48 -47
  326. data/spec/cucumber/constantize_spec.rb +3 -2
  327. data/spec/cucumber/events_spec.rb +9 -0
  328. data/spec/cucumber/file_specs_spec.rb +26 -25
  329. data/spec/cucumber/filters/activate_steps_spec.rb +25 -22
  330. data/spec/cucumber/filters/gated_receiver_spec.rb +7 -6
  331. data/spec/cucumber/filters/retry_spec.rb +42 -23
  332. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +12 -11
  333. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +15 -14
  334. data/spec/cucumber/filters/tag_limits_spec.rb +9 -8
  335. data/spec/cucumber/formatter/ansicolor_spec.rb +10 -9
  336. data/spec/cucumber/formatter/backtrace_filter_spec.rb +32 -0
  337. data/spec/cucumber/formatter/console_counts_spec.rb +14 -0
  338. data/spec/cucumber/formatter/duration_spec.rb +4 -3
  339. data/spec/cucumber/formatter/fail_fast_spec.rb +27 -27
  340. data/spec/cucumber/formatter/html_spec.rb +65 -60
  341. data/spec/cucumber/formatter/interceptor_spec.rb +1 -0
  342. data/spec/cucumber/formatter/json_spec.rb +71 -97
  343. data/spec/cucumber/formatter/junit_spec.rb +46 -47
  344. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +134 -141
  345. data/spec/cucumber/formatter/pretty_spec.rb +105 -117
  346. data/spec/cucumber/formatter/progress_spec.rb +22 -21
  347. data/spec/cucumber/formatter/rerun_spec.rb +70 -64
  348. data/spec/cucumber/formatter/spec_helper.rb +14 -12
  349. data/spec/cucumber/{rb_support/rb_world_spec.rb → glue/proto_world_spec.rb} +22 -6
  350. data/spec/cucumber/glue/registry_and_more_spec.rb +213 -0
  351. data/spec/cucumber/{rb_support → glue}/snippet_spec.rb +62 -25
  352. data/spec/cucumber/glue/step_definition_spec.rb +207 -0
  353. data/spec/cucumber/hooks_spec.rb +5 -4
  354. data/spec/cucumber/multiline_argument/data_table_spec.rb +179 -129
  355. data/spec/cucumber/project_initializer_spec.rb +12 -11
  356. data/spec/cucumber/rake/forked_spec.rb +22 -17
  357. data/spec/cucumber/rake/task_spec.rb +21 -20
  358. data/spec/cucumber/running_test_case_spec.rb +36 -35
  359. data/spec/cucumber/runtime/for_programming_languages_spec.rb +2 -30
  360. data/spec/cucumber/runtime/support_code_spec.rb +1 -0
  361. data/spec/cucumber/runtime_spec.rb +3 -2
  362. data/spec/cucumber/step_argument_spec.rb +6 -5
  363. data/spec/cucumber/step_match_search_spec.rb +32 -41
  364. data/spec/cucumber/step_match_spec.rb +34 -33
  365. data/spec/cucumber/world/pending_spec.rb +12 -11
  366. data/spec/spec_helper.rb +1 -0
  367. data/spec/support/standard_step_actions.rb +2 -1
  368. metadata +132 -61
  369. data/features/docs/formatters/debug_formatter.feature +0 -47
  370. data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
  371. data/features/docs/writing_support_code/transforms.feature +0 -98
  372. data/features/lib/step_definitions/wire_steps.rb +0 -58
  373. data/gem_tasks/cucumber.rake +0 -25
  374. data/lib/cucumber/ast.rb +0 -13
  375. data/lib/cucumber/core_ext/instance_exec.rb +0 -70
  376. data/lib/cucumber/events/after_test_case.rb +0 -25
  377. data/lib/cucumber/events/after_test_step.rb +0 -30
  378. data/lib/cucumber/events/before_test_case.rb +0 -18
  379. data/lib/cucumber/events/before_test_step.rb +0 -23
  380. data/lib/cucumber/events/bus.rb +0 -86
  381. data/lib/cucumber/events/finished_testing.rb +0 -9
  382. data/lib/cucumber/formatter/debug.rb +0 -35
  383. data/lib/cucumber/formatter/event_bus_report.rb +0 -38
  384. data/lib/cucumber/rb_support/rb_hook.rb +0 -19
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -131
  386. data/lib/cucumber/rb_support/rb_transform.rb +0 -59
  387. data/lib/cucumber/rb_support/rb_world.rb +0 -149
  388. data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -4
  389. data/spec/cucumber/events/bus_spec.rb +0 -94
  390. data/spec/cucumber/formatter/debug_spec.rb +0 -64
  391. data/spec/cucumber/formatter/event_bus_report_spec.rb +0 -88
  392. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -243
  393. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -199
  394. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
  395. data/spec/cucumber_spec.rb +0 -39
@@ -1,18 +1,18 @@
1
- Given /^(\w+) = (\w+)$/ do |var, value|
1
+ Given(/^(\w+) = (\w+)$/) do |var, value|
2
2
  instance_variable_set("@#{var}", value)
3
3
  end
4
4
 
5
5
  begin
6
6
  require 'rubygems'
7
7
  require 'matchy'
8
- Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
8
+ Then(/^I can assert that (\w+) == (\w+)$/) do |var_a, var_b|
9
9
  a = instance_variable_get("@#{var_a}")
10
10
  b = instance_variable_get("@#{var_b}")
11
11
  a.should == b
12
12
  end
13
13
  rescue LoadError
14
- STDERR.puts "***** You should install matchy *****"
15
- Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
14
+ STDERR.puts '***** You should install matchy *****'
15
+ Then(/^I can assert that (\w+) == (\w+)$/) do |var_a, var_b|
16
16
  a = instance_variable_get("@#{var_a}")
17
17
  b = instance_variable_get("@#{var_b}")
18
18
  assert_equal(a, b)
@@ -5,12 +5,12 @@ Given 'I am on the Google search page' do
5
5
  @browser.goto 'http://www.google.com/'
6
6
  end
7
7
 
8
- When /I search for "(.*)"/ do |query|
8
+ When(/I search for "(.*)"/) do |query|
9
9
  @browser.text_field(:name, 'q').set(query)
10
10
  @browser.button(:name, 'btnG').click
11
11
  end
12
12
 
13
- Then /I should see/ do |text|
13
+ Then(/I should see/) do |text|
14
14
  @browser.text.should =~ /#{text}/m
15
15
  end
16
16
 
@@ -18,9 +18,10 @@ end
18
18
  # consider creating classes for your pages - such as this:
19
19
  # http://github.com/cucumber/cucumber/tree/v0.1.15/examples/watir/features/step_definitons/search_steps.rb
20
20
  #
21
- # You may keep the page classes along your steps, or even better, put them in separate files, e.g.
22
- # support/pages/google_search.rb
21
+ # You may keep the page classes along your steps, or even better, put them in
22
+ # separate files, e.g. support/pages/google_search.rb
23
23
  #
24
24
  # This technique is called "Page Objects", and you can read more about it here:
25
25
  # http://github.com/marekj/watirloo/tree/master
26
- # We're not using this technique here, since we want to illustrate the basics only.
26
+ # We're not using this technique here, since we want to illustrate the
27
+ # basics only.
@@ -1,4 +1,8 @@
1
- begin require 'rspec/expectations'; rescue LoadError; require 'spec/expectations'; end
1
+ begin
2
+ require 'rspec/expectations'
3
+ rescue LoadError
4
+ require 'spec/expectations'
5
+ end
2
6
 
3
7
  browser = nil
4
8
 
@@ -2,14 +2,14 @@
2
2
  # browser testing. Just run cucumber with --format html --out report.html
3
3
  #
4
4
  # The code below will work on OS X or Windows (with IE Watir only).
5
- # Adding support for other platforms should be easy - as long as there is a
5
+ # Adding support for other platforms should be easy - as long as there is a
6
6
  # ruby library or command line tool to take pictures.
7
7
  #
8
8
  module Screenshots
9
9
  if Cucumber::OS_X
10
10
  def embed_screenshot(id)
11
11
  `screencapture -t png #{id}.png`
12
- embed("#{id}.png", "image/png")
12
+ embed("#{id}.png", 'image/png')
13
13
  end
14
14
  elsif Cucumber::WINDOWS
15
15
  # http://wtr.rubyforge.org/rdoc/classes/Watir/ScreenCapture.html
@@ -17,12 +17,12 @@ module Screenshots
17
17
  include Watir::ScreenCapture
18
18
  def embed_screenshot(id)
19
19
  screen_capture("#{id}.jpg", true)
20
- embed("#{id}.jpg", "image/jpeg")
20
+ embed("#{id}.jpg", 'image/jpeg')
21
21
  end
22
22
  else
23
23
  # Other platforms...
24
- def embed_screenshot(id)
25
- STDERR.puts "Sorry - no screenshots on your platform yet."
24
+ def embed_screenshot(_id)
25
+ STDERR.puts 'Sorry - no screenshots on your platform yet.'
26
26
  end
27
27
  end
28
28
  end
@@ -8,6 +8,7 @@ Feature: List step defs as json
8
8
  Background:
9
9
  Given a directory named "features"
10
10
 
11
+ @todo-windows
11
12
  Scenario: Two Ruby step definitions, in the same file
12
13
  Given a file named "features/step_definitions/steps.rb" with:
13
14
  """
@@ -18,16 +19,23 @@ Feature: List step defs as json
18
19
  """
19
20
  require 'cucumber'
20
21
  puts Cucumber::StepDefinitions.new.to_json
21
-
22
+
22
23
  """
23
24
  Then it should pass with JSON:
24
25
  """
25
26
  [
26
- {"source": "foo", "flags": "i"},
27
- {"source": "b.r", "flags": "mx"}
27
+ {
28
+ "source": {"expression": "foo", "type": "regular expression"},
29
+ "regexp": {"source": "foo", "flags": "i"}
30
+ },
31
+ {
32
+ "source": {"expression": "b.r", "type": "regular expression"},
33
+ "regexp": {"source": "b.r", "flags": "mx"}
34
+ }
28
35
  ]
29
36
  """
30
37
 
38
+ @todo-windows
31
39
  Scenario: Non-default directory structure
32
40
  Given a file named "my_weird/place/steps.rb" with:
33
41
  """
@@ -38,13 +46,19 @@ Feature: List step defs as json
38
46
  """
39
47
  require 'cucumber'
40
48
  puts Cucumber::StepDefinitions.new(:autoload_code_paths => ['my_weird']).to_json
41
-
49
+
42
50
  """
43
51
  Then it should pass with JSON:
44
52
  """
45
53
  [
46
- {"source": "foo", "flags": ""},
47
- {"source": "b.r", "flags": "x"}
54
+ {
55
+ "source": {"expression": "foo", "type": "regular expression"},
56
+ "regexp": {"source": "foo", "flags": ""}
57
+ },
58
+ {
59
+ "source": {"expression": "b.r", "type": "regular expression"},
60
+ "regexp": {"source": "b.r", "flags": "x"}
61
+ }
48
62
  ]
49
-
63
+
50
64
  """
@@ -1,5 +1,8 @@
1
1
  Feature: Listen for events
2
2
 
3
+ Cucumber's `config` object has an event bus that you can use to listen for
4
+ various events that happen during your test run.
5
+
3
6
  Scenario: Step Matched Event
4
7
  Given a file named "features/test.feature" with:
5
8
  """
@@ -16,10 +19,9 @@ Feature: Listen for events
16
19
  """
17
20
  AfterConfiguration do |config|
18
21
  io = config.out_stream
19
- config.on_event Cucumber::Events::StepMatch do |event|
22
+ config.on_event :step_activated do |event|
20
23
  io.puts "Success!"
21
- io.puts "Event type: #{event.class}"
22
- io.puts "Step name: #{event.test_step.name}"
24
+ io.puts "Step text: #{event.test_step}"
23
25
  io.puts "Source location: #{event.step_match.location}"
24
26
  end
25
27
  end
@@ -28,8 +30,7 @@ Feature: Listen for events
28
30
  Then it should pass with:
29
31
  """
30
32
  Success!
31
- Event type: Cucumber::Events::StepMatch
32
- Step name: matching
33
+ Step text: matching
33
34
  Source location: features/step_definitions/steps.rb:1
34
35
  """
35
36
 
@@ -45,14 +46,14 @@ Feature: Listen for events
45
46
  """
46
47
  AfterConfiguration do |config|
47
48
  io = config.out_stream
48
- config.on_event Cucumber::Events::AfterTestStep do |event|
49
- io.puts "YO"
49
+ config.on_event :test_step_finished do |event|
50
+ io.puts event.result.passed?
50
51
  end
51
52
  end
52
53
  """
53
54
  When I run `cucumber`
54
55
  Then it should pass with:
55
56
  """
56
- YO
57
+ true
57
58
  """
58
59
 
@@ -5,6 +5,7 @@ Feature: Run Cli::Main with existing Runtime
5
5
  When the process forks, Spork them passes the runtime to Cli::Main to
6
6
  run it.
7
7
 
8
+ @todo-windows
8
9
  Scenario: Run a single feature
9
10
  Given the standard step definitions
10
11
  Given a file named "features/success.feature" with:
@@ -64,6 +64,9 @@ Feature: Dry Run
64
64
  Undefined step: "this step is undefined" (Cucumber::Undefined)
65
65
  features/test.feature:3:in `Given this step is undefined'
66
66
 
67
+ Undefined Scenarios:
68
+ cucumber features/test.feature:2 # Scenario:
69
+
67
70
  1 scenario (1 undefined)
68
71
  1 step (1 undefined)
69
72
 
@@ -23,10 +23,11 @@ Feature: Tag logic
23
23
 
24
24
  @ignore
25
25
  Scenario: And yet another Example
26
+ Given passing
26
27
  """
27
28
 
28
29
  Scenario: ANDing tags
29
- When I run `cucumber -q -t @one -t @three features/test.feature`
30
+ When I run `cucumber -q -t '@one and @three' features/test.feature`
30
31
  Then it should pass with:
31
32
  """
32
33
  @feature
@@ -42,7 +43,7 @@ Feature: Tag logic
42
43
  """
43
44
 
44
45
  Scenario: ORing tags
45
- When I run `cucumber -q -t @one,@three features/test.feature`
46
+ When I run `cucumber -q -t '@one or @three' features/test.feature`
46
47
  Then it should pass with:
47
48
  """
48
49
  @feature
@@ -66,7 +67,7 @@ Feature: Tag logic
66
67
  """
67
68
 
68
69
  Scenario: Negative tags
69
- When I run `cucumber -q -t ~@three features/test.feature`
70
+ When I run `cucumber -q -t 'not @three' features/test.feature`
70
71
  Then it should pass with:
71
72
  """
72
73
  @feature
@@ -78,9 +79,10 @@ Feature: Tag logic
78
79
 
79
80
  @ignore
80
81
  Scenario: And yet another Example
82
+ Given passing
81
83
 
82
- 2 scenarios (1 undefined, 1 passed)
83
- 1 step (1 undefined)
84
+ 2 scenarios (2 undefined)
85
+ 2 steps (2 undefined)
84
86
  """
85
87
 
86
88
  Scenario: Run with limited tag count, blowing it on scenario
@@ -104,7 +106,7 @@ Feature: Tag logic
104
106
  """
105
107
 
106
108
  Scenario: Run with limited tag count using negative tag, blowing it via a tag that is not run
107
- When I run `cucumber -q --no-source --tags ~@one:1 features/test.feature`
109
+ When I run `cucumber -q --no-source --tags 'not @one:1' features/test.feature`
108
110
  Then it fails before running features with:
109
111
  """
110
112
  @one occurred 2 times, but the limit was set to 1
@@ -4,6 +4,7 @@ Feature: Fail fast
4
4
  The --fail-fast flag causes Cucumber to exit immediately after the first
5
5
  scenario fails.
6
6
 
7
+ @todo-windows
7
8
  Scenario: When a scenario fails
8
9
  Given a file named "features/bad.feature" with:
9
10
  """
@@ -25,6 +26,7 @@ Feature: Fail fast
25
26
  1 scenario (1 failed)
26
27
  """
27
28
 
29
+ @todo-windows
28
30
  Scenario: When all the scenarios pass
29
31
  Given a file named "features/first.feature" with:
30
32
  """
@@ -0,0 +1,8 @@
1
+ Feature: Help
2
+
3
+ Running `cucumber --help` shows you command-line options.
4
+
5
+ Scenario: Show help
6
+ When I run `cucumber --help`
7
+ Then it should pass
8
+ And I should see the CLI help
@@ -1,17 +1,17 @@
1
1
  @needs-many-fonts
2
- Feature: Language help
2
+ Feature: i18n
3
3
 
4
4
  It's possible to ask cucumber which keywords are used for any
5
5
  particular language by running:
6
6
 
7
- `cucumber --i18n <language code> help`
7
+ `cucumber --i18n-keywords <LANG>`
8
8
 
9
9
  This will print a table showing all the different words we use for
10
10
  that language, to allow you to easily write features in any language
11
11
  you choose.
12
12
 
13
13
  Scenario: Get help for Portuguese language
14
- When I run `cucumber --i18n pt help`
14
+ When I run `cucumber --i18n-keywords pt`
15
15
  Then it should pass with:
16
16
  """
17
17
  | feature | "Funcionalidade", "Característica", "Caracteristica" |
@@ -33,10 +33,10 @@ Feature: Language help
33
33
  """
34
34
 
35
35
  Scenario: List languages
36
- When I run `cucumber --i18n help`
36
+ When I run `cucumber --i18n-languages`
37
37
  Then cucumber lists all the supported languages
38
38
 
39
39
  Scenario: Seek help for invalid language
40
- When I run `cucumber --i18n foo`
40
+ When I run `cucumber --i18n-keywords foo`
41
41
  Then the output includes the message "Invalid language 'foo'"
42
- And cucumber lists all the supported languages
42
+ And cucumber lists all the supported languages
@@ -57,7 +57,7 @@ Feature: Randomize
57
57
  When I run `cucumber`
58
58
  Then it should pass
59
59
 
60
- @spawn
60
+ @spawn @todo-windows
61
61
  Scenario: Run scenarios randomized
62
62
  When I run `cucumber --order random:41544 -q`
63
63
  Then it should fail
@@ -101,7 +101,7 @@ Feature: Randomize
101
101
 
102
102
  """
103
103
 
104
- @spawn
104
+ @spawn @todo-windows
105
105
  Scenario: Run scenarios randomized with some skipped
106
106
  When I run `cucumber --tags ~@skipme --order random:41544 -q`
107
107
  Then it should fail
@@ -1,32 +1,92 @@
1
- @wip
2
1
  Feature: Retry failing tests
3
2
 
4
3
  Retry gives you a way to get through flaky tests that usually pass after a few runs.
5
4
  This gives a development team a way forward other than disabling a valuable test.
6
-
5
+
7
6
  - Specify max retry count in option
8
7
  - Output information to the screen
9
8
  - Output retry information in test report
10
-
9
+
11
10
  Questions:
12
11
  use a tag for flaky tests? Global option to retry any test that fails?
13
-
12
+
14
13
  Background:
15
- Given a scenario "Flakey" that fails once, then passes
16
- And a scenario "Shakey" that fails twice, then passes
14
+ Given a scenario "Fails-once" that fails once, then passes
15
+ And a scenario "Fails-twice" that fails twice, then passes
17
16
  And a scenario "Solid" that passes
18
- And a scenario "No Dice" that fails
19
-
20
- Scenario:
21
- When I run `cucumber -q --retry 1`
17
+
18
+ @todo-windows
19
+ Scenario: Retry once, so Fails-once starts to pass
20
+ Given a scenario "Fails-forever" that fails
21
+ When I run `cucumber -q --retry 1 --format summary`
22
+ Then it should fail with:
23
+ """
24
+ 4 scenarios (2 failed, 1 flaky, 1 passed)
25
+ """
26
+ And it should fail with:
27
+ """
28
+ Fails-forever
29
+ Fails-forever ✗
30
+ Fails-forever ✗
31
+
32
+ Solid
33
+ Solid ✓
34
+
35
+ Fails-once feature
36
+ Fails-once ✗
37
+ Fails-once ✓
38
+
39
+ Fails-twice feature
40
+ Fails-twice ✗
41
+ Fails-twice ✗
42
+ """
43
+
44
+ @todo-windows
45
+ Scenario: Retry twice, so Fails-twice starts to pass too
46
+ Given a scenario "Fails-forever" that fails
47
+ When I run `cucumber -q --retry 2 --format summary`
22
48
  Then it should fail with:
23
49
  """
24
- 4 scenarios (2 passed, 2 failed)
50
+ 4 scenarios (1 failed, 2 flaky, 1 passed)
25
51
  """
52
+ And it should fail with:
53
+ """
54
+ Fails-forever
55
+ Fails-forever ✗
56
+ Fails-forever ✗
57
+ Fails-forever ✗
58
+
59
+ Solid
60
+ Solid ✓
26
61
 
27
- Scenario:
28
- When I run `cucumber -q --retry 2`
62
+ Fails-once feature
63
+ Fails-once ✗
64
+ Fails-once ✓
65
+
66
+ Fails-twice feature
67
+ Fails-twice ✗
68
+ Fails-twice ✗
69
+ Fails-twice ✓
70
+ """
71
+
72
+ @todo-windows
73
+ Scenario: Flaky scenarios gives exit code zero in non-strict mode
74
+ When I run `cucumber -q --retry 2 --format summary`
29
75
  Then it should pass with:
30
76
  """
31
- 4 scenarios (3 passed, 1 failed)
32
- """
77
+
78
+
79
+ 3 scenarios (2 flaky, 1 passed)
80
+ """
81
+
82
+ @todo-windows
83
+ Scenario: Flaky scenarios gives non-zero exit code in strict mode
84
+ When I run `cucumber -q --retry 2 --format summary --strict`
85
+ Then it should fail with:
86
+ """
87
+ Flaky Scenarios:
88
+ cucumber features/fails_once.feature:2
89
+ cucumber features/fails_twice.feature:2
90
+
91
+ 3 scenarios (2 flaky, 1 passed)
92
+ """
@@ -33,6 +33,7 @@ Feature: Run feature elements matching a name with --name/-n
33
33
  | b |
34
34
  """
35
35
 
36
+ @todo-windows
36
37
  Scenario: Matching Feature names
37
38
  When I run `cucumber -q --name feature`
38
39
  Then it should pass with:
@@ -18,6 +18,7 @@ Feature: Running multiple formatters
18
18
  And there is world peace
19
19
  """
20
20
 
21
+ @todo-windows
21
22
  Scenario: Multiple formatters and outputs
22
23
  When I run `cucumber --no-color --format progress --out progress.txt --format pretty --out pretty.txt --no-source --dry-run --no-snippets features/test.feature`
23
24
  Then the stderr should not contain anything
@@ -45,6 +46,7 @@ Feature: Running multiple formatters
45
46
 
46
47
  """
47
48
 
49
+ @todo-windows
48
50
  Scenario: Two formatters to stdout
49
51
  When I run `cucumber -f progress -f pretty features/test.feature`
50
52
  Then it should fail with:
@@ -52,6 +54,7 @@ Feature: Running multiple formatters
52
54
  All but one formatter must use --out, only one can print to each stream (or STDOUT) (RuntimeError)
53
55
  """
54
56
 
57
+ @todo-windows
55
58
  Scenario: Two formatters to stdout when using a profile
56
59
  Given the following profiles are defined:
57
60
  """
@@ -28,6 +28,9 @@ Feature: Strict mode
28
28
  Undefined step: "this step passes" (Cucumber::Undefined)
29
29
  features/missing.feature:3:in `Given this step passes'
30
30
 
31
+ Undefined Scenarios:
32
+ cucumber features/missing.feature:2
33
+
31
34
  1 scenario (1 undefined)
32
35
  1 step (1 undefined)
33
36
  """
@@ -45,6 +48,9 @@ Feature: Strict mode
45
48
  ./features/step_definitions/steps.rb:3:in `/^this step is pending$/'
46
49
  features/pending.feature:3:in `Given this step is pending'
47
50
 
51
+ Pending Scenarios:
52
+ cucumber features/pending.feature:2
53
+
48
54
  1 scenario (1 pending)
49
55
  1 step (1 pending)
50
56
  """
@@ -0,0 +1,89 @@
1
+ Feature: Ambiguous Steps
2
+
3
+ When Cucumber searches for a step definition for a step, it might find multiple step
4
+ definitions that could match. In that case, it will give you an error that the step
5
+ definitions are ambiguous.
6
+
7
+ You can also use a `--guess` mode, where it uses magic powers to try and figure
8
+ out which of those two step definitions is most likely to be the one you meant it
9
+ to use. Use it with caution!
10
+
11
+
12
+ Scenario: Ambiguous steps
13
+
14
+ Given a file named "features/ambiguous.feature" with:
15
+ """
16
+ Feature:
17
+
18
+ Scenario:
19
+ When a step
20
+ Then an ambiguous step
21
+
22
+ """
23
+ And a file named "features/step_definitions.rb" with:
24
+ """
25
+ When(/^a.*step$/) do
26
+ 'foo'
27
+ end
28
+
29
+ Then(/^an ambiguous step$/) do
30
+ 'bar'
31
+ end
32
+
33
+ """
34
+ When I run `cucumber`
35
+ Then it should fail with:
36
+ """
37
+ Ambiguous match of "an ambiguous step":
38
+
39
+ features/step_definitions.rb:1:in `/^a.*step$/'
40
+ features/step_definitions.rb:5:in `/^an ambiguous step$/'
41
+
42
+ You can run again with --guess to make Cucumber be more smart about it
43
+ (Cucumber::Ambiguous)
44
+ features/ambiguous.feature:5:in `Then an ambiguous step'
45
+
46
+ Failing Scenarios:
47
+ cucumber features/ambiguous.feature:3 # Scenario:
48
+
49
+ 1 scenario (1 failed)
50
+ 2 steps (1 failed, 1 passed)
51
+ 0m0.012s
52
+
53
+ """
54
+
55
+
56
+ Scenario: Ambiguous steps with guess mode
57
+
58
+ Given a file named "features/ambiguous.feature" with:
59
+ """
60
+ Feature:
61
+
62
+ Scenario:
63
+ When a step
64
+ Then an ambiguous step
65
+ """
66
+ And a file named "features/step_definitions.rb" with:
67
+ """
68
+ When(/^a.*step$/) do
69
+ 'foo'
70
+ end
71
+
72
+ Then(/^an ambiguous step$/) do
73
+ 'bar'
74
+ end
75
+ """
76
+ When I run `cucumber -g`
77
+ Then it should pass with exactly:
78
+ """
79
+ Feature:
80
+
81
+ Scenario: # features/ambiguous.feature:3
82
+ When a step # features/step_definitions.rb:1
83
+ Then an ambiguous step # features/step_definitions.rb:5
84
+
85
+ 1 scenario (1 passed)
86
+ 2 steps (2 passed)
87
+ 0m0.012s
88
+
89
+ """
@@ -12,6 +12,7 @@ Feature: Nested Steps
12
12
  end
13
13
  """
14
14
 
15
+ @todo-windows
15
16
  Scenario: Use #steps to call several steps at once
16
17
  Given a step definition that looks like this:
17
18
  """ruby
@@ -31,6 +32,7 @@ Feature: Nested Steps
31
32
 
32
33
  """
33
34
 
35
+ @todo-windows
34
36
  Scenario: Use #step to call a single step
35
37
  Given a step definition that looks like this:
36
38
  """ruby
@@ -48,6 +50,7 @@ Feature: Nested Steps
48
50
 
49
51
  """
50
52
 
53
+ @todo-windows
51
54
  Scenario: Use #steps to call a table
52
55
  Given a step definition that looks like this:
53
56
  """ruby
@@ -77,6 +80,7 @@ Feature: Nested Steps
77
80
 
78
81
  """
79
82
 
83
+ @todo-windows
80
84
  Scenario: Use #steps to call a multi-line string
81
85
  Given a step definition that looks like this:
82
86
  """ruby
@@ -103,7 +107,7 @@ Feature: Nested Steps
103
107
  Liouville
104
108
  """
105
109
 
106
- @spawn
110
+ @spawn @todo-windows
107
111
  Scenario: Backtrace doesn't skip nested steps
108
112
  Given a step definition that looks like this:
109
113
  """ruby
@@ -8,15 +8,18 @@ Feature: Nested Steps in I18n
8
8
  And a step definition that looks like this:
9
9
  """ruby
10
10
  # -*- coding: utf-8 -*-
11
+ # frozen_string_literal: true
11
12
  前提 /a turtle/ do
12
13
  puts "turtle!"
13
14
  end
14
15
  """
15
16
 
17
+ @todo-windows
16
18
  Scenario: Use #steps to call several steps at once
17
19
  Given a step definition that looks like this:
18
20
  """ruby
19
21
  # -*- coding: utf-8 -*-
22
+ # frozen_string_literal: true
20
23
  前提 /two turtles/ do
21
24
  steps %{
22
25
  前提 a turtle