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
@@ -6,6 +6,7 @@ Feature: Nested Steps with either table or doc string
6
6
  Given two turtles
7
7
  """
8
8
 
9
+ @todo-windows
9
10
  Scenario: Use #step with table
10
11
  Given a step definition that looks like this:
11
12
  """ruby
@@ -34,6 +35,7 @@ Feature: Nested Steps with either table or doc string
34
35
 
35
36
  """
36
37
 
38
+ @todo-windows
37
39
  Scenario: Use #step with Doc String
38
40
  Given a step definition that looks like this:
39
41
  """ruby
@@ -76,7 +76,7 @@ Feature: Pretty formatter - Printing messages
76
76
  """
77
77
 
78
78
  # Don't know why, but we need to spawn this for JRuby otherwise it gives wierd errors
79
- @spawn
79
+ @spawn @todo-windows
80
80
  Scenario: Delayed messages feature
81
81
  When I run `cucumber --quiet --format pretty features/f.feature`
82
82
  Then the stderr should not contain anything
@@ -135,7 +135,6 @@ Feature: Pretty formatter - Printing messages
135
135
  Multiple
136
136
 
137
137
  Announce
138
-
139
138
  Me
140
139
  ..UUU
141
140
  Announce with fail
@@ -1,5 +1,6 @@
1
1
  Feature: Skip Scenario
2
2
 
3
+ @todo-windows
3
4
  Scenario: With a passing step
4
5
  Given a file named "features/test.feature" with:
5
6
  """
@@ -28,37 +29,3 @@ Feature: Skip Scenario
28
29
  2 steps (2 skipped)
29
30
 
30
31
  """
31
-
32
- @spawn
33
- Scenario: Use (deprecated) legacy API
34
- Given a file named "features/test.feature" with:
35
- """
36
- Feature: test
37
- Scenario: test
38
- Given this step passes
39
- And this step passes
40
- """
41
- And the standard step definitions
42
- And a file named "features/support/hook.rb" with:
43
- """
44
- Before do |scenario|
45
- scenario.skip_invoke!
46
- end
47
- """
48
- When I run `cucumber -q`
49
- Then it should pass with:
50
- """
51
- Feature: test
52
-
53
- Scenario: test
54
- Given this step passes
55
- And this step passes
56
-
57
- 1 scenario (1 skipped)
58
- 2 steps (2 skipped)
59
-
60
- """
61
- And the stderr should contain:
62
- """
63
- deprecated
64
- """
@@ -4,35 +4,35 @@ Feature: Snippets
4
4
  snippet suggestion, which you can then paste into a step definitions
5
5
  file of your choosing.
6
6
 
7
- Scenario: Snippet for undefined step with a pystring
7
+ Scenario: Snippet for undefined step with a Doc String
8
8
  Given a file named "features/undefined_steps.feature" with:
9
9
  """
10
10
  Feature:
11
- Scenario: pystring
12
- Given a pystring
13
- \"\"\"
14
- example with <html> entities
15
- \"\"\"
16
- When a simple when step
17
- And another when step
18
- Then a simple then step
11
+ Scenario: Doc String
12
+ Given a Doc String
13
+ \"\"\"
14
+ example with <html> entities
15
+ \"\"\"
16
+ When 1 simple when step
17
+ And another "when" step
18
+ Then a simple then step
19
19
  """
20
20
  When I run `cucumber features/undefined_steps.feature -s`
21
21
  Then the output should contain:
22
22
  """
23
- Given(/^a pystring$/) do |string|
23
+ Given("a Doc String") do |string|
24
24
  pending # Write code here that turns the phrase above into concrete actions
25
25
  end
26
26
 
27
- When(/^a simple when step$/) do
27
+ When("{int} simple when step") do |int|
28
28
  pending # Write code here that turns the phrase above into concrete actions
29
29
  end
30
30
 
31
- When(/^another when step$/) do
31
+ When("another {string} step") do |string|
32
32
  pending # Write code here that turns the phrase above into concrete actions
33
33
  end
34
34
 
35
- Then(/^a simple then step$/) do
35
+ Then("a simple then step") do
36
36
  pending # Write code here that turns the phrase above into concrete actions
37
37
  end
38
38
  """
@@ -41,15 +41,15 @@ Feature: Snippets
41
41
  Given a file named "features/undefined_steps.feature" with:
42
42
  """
43
43
  Feature:
44
- Scenario: table
45
- Given a table
46
- | table |
47
- |example|
44
+ Scenario: table
45
+ Given a table
46
+ | table |
47
+ |example|
48
48
  """
49
49
  When I run `cucumber features/undefined_steps.feature -s`
50
50
  Then the output should contain:
51
51
  """
52
- Given(/^a table$/) do |table|
52
+ Given("a table") do |table|
53
53
  # table is a Cucumber::MultilineArgument::DataTable
54
54
  pending # Write code here that turns the phrase above into concrete actions
55
55
  end
@@ -0,0 +1,43 @@
1
+ Feature: Gherkin Source Read Event
2
+
3
+ This event is fired when Cucumber reads a Gherkin document.
4
+
5
+ See [the API documentation](http://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Events/GherkinSourceRead)
6
+ for more information about the data available on this event.
7
+
8
+ @todo-windows
9
+ Scenario: Read two documents
10
+ Given a file named "features/one.feature" with:
11
+ """
12
+ Feature: One
13
+ This is the first feature
14
+
15
+ """
16
+ And a file named "features/two.feature" with:
17
+ """
18
+ Feature: Two
19
+ This is the other feature
20
+
21
+ """
22
+ And a file named "features/support/events.rb" with:
23
+ """
24
+ AfterConfiguration do |config|
25
+ config.on_event :gherkin_source_read do |event|
26
+ config.out_stream.puts "path: #{event.path}"
27
+ config.out_stream.puts "body:\n#{event.body}"
28
+ end
29
+ end
30
+ """
31
+ When I run `cucumber --dry-run`
32
+ Then it should pass with:
33
+ """
34
+ path: features/one.feature
35
+ body:
36
+ Feature: One
37
+ This is the first feature
38
+ path: features/two.feature
39
+ body:
40
+ Feature: Two
41
+ This is the other feature
42
+ """
43
+
@@ -0,0 +1,36 @@
1
+ Feature: Step Activated Event
2
+
3
+ This event is fired when Cucumber finds a matching definition for a Gherkin step.
4
+
5
+ See [the API documentation](http://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Events/StepActivated)
6
+ for more information about the data available on this event.
7
+
8
+ Scenario: Activate a step
9
+ Given a file named "features/step_definitions/steps.rb" with:
10
+ """
11
+ Given /a step/ do
12
+ # automation goes here
13
+ end
14
+ """
15
+ And a file named "features/test.feature" with:
16
+ """
17
+ Feature:
18
+ Scenario:
19
+ Given a step
20
+ """
21
+ And a file named "features/support/events.rb" with:
22
+ """
23
+ AfterConfiguration do |config|
24
+ config.on_event :step_activated do |event|
25
+ config.out_stream.puts "The step: #{event.test_step.location}"
26
+ config.out_stream.puts "The step definition: #{event.step_match.location}"
27
+ end
28
+ end
29
+ """
30
+ When I run `cucumber`
31
+ Then it should pass with:
32
+ """
33
+ The step: features/test.feature:3
34
+ The step definition: features/step_definitions/steps.rb:1
35
+ """
36
+
@@ -0,0 +1,29 @@
1
+ Feature: Step definition registered
2
+
3
+ This event is fired when Cucumber loads the user's step definitions. Typically, this is
4
+ when the `Given /^my step$/ do` methods are called.
5
+
6
+ See [the API documentation](http://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Events/StepDefinitionRegistered) for more information about the data available on this event.
7
+
8
+ Scenario: Register a new step definition
9
+ Given the standard step definitions
10
+ And a file named "features/step_definitions/steps.rb" with:
11
+ """
12
+ Given /a step/ do
13
+ # automation goes here
14
+ end
15
+ """
16
+ And a file named "features/support/events.rb" with:
17
+ """
18
+ AfterConfiguration do |config|
19
+ config.on_event :step_definition_registered do |event|
20
+ config.out_stream.puts "The step definition: #{event.step_definition.location}"
21
+ end
22
+ end
23
+ """
24
+ When I run `cucumber`
25
+ Then it should pass with:
26
+ """
27
+ The step definition: features/step_definitions/steps.rb:1
28
+ """
29
+
@@ -0,0 +1,35 @@
1
+ Feature: Test Case Finished Event
2
+
3
+ This event is fired after each scenario or examples table row (generally named a
4
+ Test Case) has finished executing. You can use the event to learn about the
5
+ result of the test case.
6
+
7
+ See [the API documentation](http://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Events/TestCaseFinished) for more information about the data available on this event.
8
+
9
+ Scenario: Test case passes
10
+ Given the standard step definitions
11
+ And a file named "features/passing.feature" with:
12
+ """
13
+ Feature: A feature
14
+ Scenario: A scenario
15
+ Given this step passes
16
+ """
17
+ And a file named "features/support/events.rb" with:
18
+ """
19
+ AfterConfiguration do |config|
20
+ config.on_event :test_case_finished do |event|
21
+ config.out_stream.puts "Results"
22
+ config.out_stream.puts "-------"
23
+ config.out_stream.puts "Test case: #{event.test_case.name}"
24
+ config.out_stream.puts "The result is: #{event.result}"
25
+ end
26
+ end
27
+ """
28
+ When I run `cucumber`
29
+ Then it should pass with:
30
+ """
31
+ Results
32
+ -------
33
+ Test case: A scenario
34
+ The result is: ✓
35
+ """
@@ -0,0 +1,54 @@
1
+ @wip
2
+ Feature: Test Case Started Event
3
+
4
+ This event is fired just before each scenario or scenario outline example row
5
+ (generally named a Test Case) starts to be executed. This event is read-only.
6
+
7
+ See [the API documentation](http://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Events/TestCaseStarted) for more information about the data available on this event and the result object.
8
+
9
+ Background:
10
+ Given the standard step definitions
11
+ And a file named "features/test.feature" with:
12
+ """
13
+ @feature
14
+ Feature: A feature
15
+
16
+ @scenario
17
+ Scenario: A passing scenario
18
+ Given this is a step
19
+ """
20
+ And a file named "features/support/events.rb" with:
21
+ """
22
+ stdout = nil
23
+ AfterConfiguration do |config|
24
+ stdout = config.out_stream # make sure all the `puts` calls can write to the same output
25
+ config.on_event :test_case_started do |event|
26
+ stdout.puts "before"
27
+ stdout.puts event.test_case.tags.map(&:name)
28
+ end
29
+ config.on_event :test_case_finished do |event|
30
+ stdout.puts "after"
31
+ end
32
+ end
33
+
34
+ Given(/this is a step/) do
35
+ end
36
+
37
+ """
38
+
39
+ Scenario: Run the test case
40
+ When I run `cucumber -q`
41
+ Then it should pass with:
42
+ """
43
+ before
44
+ @feature
45
+ @scenario
46
+ @feature
47
+ Feature: A feature
48
+
49
+ @scenario
50
+ Scenario: A passing scenario
51
+ Given this is a step
52
+ after
53
+ """
54
+
@@ -0,0 +1,40 @@
1
+ Feature: Test Run Finished
2
+
3
+ This event is fired after all the test cases have been executed.
4
+
5
+ Typically, a formatter would use this to print out summary information.
6
+
7
+ At the moment this event contains no data, but it could be extended
8
+ in the future to carry the summary information for the convenience
9
+ of formatter authors.
10
+
11
+ Background:
12
+ Given the standard step definitions
13
+ And a file named "features/test.feature" with:
14
+ """
15
+ Feature: A feature
16
+
17
+ Scenario: A passing scenario
18
+ Given this is a step
19
+ """
20
+ And a file named "features/support/events.rb" with:
21
+ """
22
+ class MyFormatter
23
+ def initialize(config)
24
+ config.on_event :test_case_finished do
25
+ config.out_stream.puts "test case finished"
26
+ end
27
+ config.on_event :test_run_finished do
28
+ config.out_stream.puts "the end"
29
+ end
30
+ end
31
+ end
32
+ """
33
+
34
+ Scenario: Run the test case
35
+ When I run `cucumber -q -f MyFormatter`
36
+ Then it should pass with:
37
+ """
38
+ test case finished
39
+ the end
40
+ """
@@ -0,0 +1,41 @@
1
+ Feature: Test Run Started Event
2
+
3
+ This event is fired once all test cases have been filtered, just before
4
+ the first one is executed.
5
+
6
+ See [the API documentation](http://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Events/TestRunStarted) for more information about the data available on this event.
7
+
8
+ Background:
9
+ Given the standard step definitions
10
+ And a file named "features/foo.feature" with:
11
+ """
12
+ Feature: Foo
13
+ Scenario:
14
+ Given a passing step
15
+ """
16
+ And a file named "features/bar.feature" with:
17
+ """
18
+ Feature: Foo
19
+ Scenario:
20
+ Given a passing step
21
+ """
22
+ And a file named "features/support/events.rb" with:
23
+ """
24
+ AfterConfiguration do |config|
25
+ config.on_event :test_run_started do |event|
26
+ config.out_stream.puts "test run started"
27
+ config.out_stream.puts event.test_cases.map(&:location)
28
+ end
29
+ end
30
+ """
31
+
32
+ @todo-windows
33
+ Scenario: Run the test case
34
+ When I run `cucumber -q`
35
+ Then it should pass with:
36
+ """
37
+ test run started
38
+ features/bar.feature:2
39
+ features/foo.feature:2
40
+ """
41
+
@@ -0,0 +1,47 @@
1
+ Feature: Test Step Finished Event
2
+
3
+ This event is fired after each step in a scenario or scenario outline example
4
+ (generally named a Test Step) has finished executing. You can use the event to learn about the
5
+ result of the test step.
6
+
7
+ See [the API documentation](http://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Events/TestStepFinished) for more information about the data available on this event and the result object.
8
+
9
+ Background:
10
+ Given the standard step definitions
11
+ And a file named "features/test.feature" with:
12
+ """
13
+ Feature: A feature
14
+
15
+ @pass
16
+ Scenario: A passing scenario
17
+ Given this step passes
18
+
19
+ @fail
20
+ Scenario: A failing scenario
21
+ Given this step fails
22
+ """
23
+ And a file named "features/support/events.rb" with:
24
+ """
25
+ AfterConfiguration do |config|
26
+ config.on_event :test_step_finished do |event|
27
+ config.out_stream.puts "Test step: #{event.test_step}"
28
+ config.out_stream.puts "The result is: #{event.result}"
29
+ end
30
+ end
31
+ """
32
+
33
+ Scenario: Test step passes
34
+ When I run `cucumber --tags @pass`
35
+ Then it should pass with:
36
+ """
37
+ Test step: this step passes
38
+ The result is: ✓
39
+ """
40
+
41
+ Scenario: Test step fails
42
+ When I run `cucumber --tags @fail`
43
+ Then it should fail with:
44
+ """
45
+ Test step: this step fails
46
+ The result is: ✗
47
+ """
@@ -0,0 +1,43 @@
1
+ Feature: Test Step Started Event
2
+
3
+ This event is fired just before each step in a scenario or scenario outline example
4
+ (generally named a Test Step) starts to be executed. This event is read-only, so there
5
+ is no way to prevent the test step from running, but you can use it for logging or user
6
+ notification.
7
+
8
+ See [the API documentation](http://www.rubydoc.info/github/cucumber/cucumber-ruby/Cucumber/Events/TestStepStarted) for more information about the data available on this event and the result object.
9
+
10
+ Background:
11
+ Given the standard step definitions
12
+ And a file named "features/test.feature" with:
13
+ """
14
+ Feature: A feature
15
+
16
+ Scenario: A passing scenario
17
+ Given this is a step
18
+ """
19
+ And a file named "features/support/events.rb" with:
20
+ """
21
+ stdout = nil
22
+ AfterConfiguration do |config|
23
+ stdout = config.out_stream # make sure all the `puts` calls can write to the same output
24
+ config.on_event :test_step_started do |event|
25
+ stdout.puts "before"
26
+ end
27
+ config.on_event :test_step_finished do |event|
28
+ stdout.puts "after"
29
+ end
30
+ end
31
+ Given(/this is a step/) do
32
+ stdout.puts "during"
33
+ end
34
+ """
35
+
36
+ Scenario: Test step passes
37
+ When I run `cucumber`
38
+ Then it should pass with:
39
+ """
40
+ before
41
+ during
42
+ after
43
+ """
@@ -21,7 +21,7 @@ Feature: Exception in After Block
21
21
  end
22
22
  """
23
23
 
24
- @spawn
24
+ @spawn @todo-windows
25
25
  Scenario: Handle Exception in standard scenario step and carry on
26
26
  Given a file named "features/naughty_step_in_scenario.feature" with:
27
27
  """
@@ -54,7 +54,7 @@ Feature: Exception in After Block
54
54
 
55
55
  """
56
56
 
57
- @spawn
57
+ @spawn @todo-windows
58
58
  Scenario: Handle Exception in scenario outline table row and carry on
59
59
  Given a file named "features/naughty_step_in_scenario_outline.feature" with:
60
60
  """
@@ -100,6 +100,7 @@ Feature: Exception in After Block
100
100
 
101
101
  """
102
102
 
103
+ @todo-windows
103
104
  Scenario: Handle Exception using the progress format
104
105
  Given a file named "features/naughty_step_in_scenario.feature" with:
105
106
  """
@@ -21,6 +21,7 @@ Feature: Exception in AfterStep Block
21
21
  end
22
22
  """
23
23
 
24
+ @todo-windows
24
25
  Scenario: Handle Exception in standard scenario step and carry on
25
26
  Given a file named "features/naughty_step_in_scenario.feature" with:
26
27
  """
@@ -54,6 +55,7 @@ Feature: Exception in AfterStep Block
54
55
 
55
56
  """
56
57
 
58
+ @todo-windows
57
59
  Scenario: Handle Exception in scenario outline table row and carry on
58
60
  Given a file named "features/naughty_step_in_scenario_outline.feature" with:
59
61
  """
@@ -12,6 +12,7 @@ Feature: Exceptions in Around Hooks
12
12
  There's another scenario to consider, where the exception occurs after the steps
13
13
  have been run. How would we want to report in that case?
14
14
 
15
+ @todo-windows
15
16
  Scenario: Exception before the test case is run
16
17
  Given the standard step definitions
17
18
  And a file named "features/support/env.rb" with:
@@ -44,6 +45,7 @@ Feature: Exceptions in Around Hooks
44
45
 
45
46
  """
46
47
 
48
+ @todo-windows
47
49
  Scenario: Exception after the test case is run
48
50
  Given the standard step definitions
49
51
  And a file named "features/support/env.rb" with:
@@ -14,7 +14,7 @@ Feature: Exception in Before Block
14
14
  end
15
15
  """
16
16
 
17
- @spawn
17
+ @spawn @todo-windows
18
18
  Scenario: Handle Exception in standard scenario step and carry on
19
19
  Given a file named "features/naughty_step_in_scenario.feature" with:
20
20
  """
@@ -41,6 +41,7 @@ Feature: Exception in Before Block
41
41
 
42
42
  """
43
43
 
44
+ @todo-windows
44
45
  Scenario: Handle Exception in Before hook for Scenario with Background
45
46
  Given a file named "features/naughty_step_in_before.feature" with:
46
47
  """
@@ -74,6 +75,7 @@ Feature: Exception in Before Block
74
75
 
75
76
  """
76
77
 
78
+ @todo-windows
77
79
  Scenario: Handle Exception using the progress format
78
80
  Given a file named "features/naughty_step_in_scenario.feature" with:
79
81
  """