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,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'yaml'
2
3
 
3
4
  module Cucumber
@@ -10,7 +11,7 @@ module Cucumber
10
11
  end
11
12
 
12
13
  def args_from(profile)
13
- unless cucumber_yml.has_key?(profile)
14
+ unless cucumber_yml.key?(profile)
14
15
  raise(ProfileNotFound, <<-END_OF_ERROR)
15
16
  Could not find profile: '#{profile}'
16
17
 
@@ -21,34 +22,39 @@ Defined profiles in cucumber.yml:
21
22
 
22
23
  args_from_yml = cucumber_yml[profile] || ''
23
24
 
24
- case(args_from_yml)
25
- when String
26
- raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/
27
- if(Cucumber::WINDOWS)
28
- #Shellwords treats backslash as an escape character so here's a rudimentary approximation of the same code
29
- args_from_yml = args_from_yml.split
30
- args_from_yml = args_from_yml.collect {|x| x.gsub(/^\"(.*)\"/,'\1') }
31
- else
32
- require 'shellwords'
33
- args_from_yml = Shellwords.shellwords(args_from_yml)
34
- end
35
- when Array
36
- raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
25
+ require 'shellwords'
26
+
27
+ case args_from_yml
28
+ when String
29
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/
30
+ if Cucumber::WINDOWS
31
+ # Shellwords treats backslash as an escape character so we have to mask it out temporarily
32
+
33
+ placeholder = 'pseudo_unique_backslash_placeholder'
34
+ sanitized_line = args_from_yml.gsub('\\', placeholder)
35
+
36
+ args_from_yml = Shellwords.shellwords(sanitized_line).collect { |argument| argument.gsub(placeholder, '\\') }
37
37
  else
38
- raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array"
38
+ args_from_yml = Shellwords.shellwords(args_from_yml)
39
+ end
40
+ when Array
41
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
42
+ else
43
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array"
39
44
  end
45
+
40
46
  args_from_yml
41
47
  end
42
48
 
43
49
  def has_profile?(profile)
44
- cucumber_yml.has_key?(profile)
50
+ cucumber_yml.key?(profile)
45
51
  end
46
52
 
47
53
  def cucumber_yml_defined?
48
54
  cucumber_file && File.exist?(cucumber_file)
49
55
  end
50
56
 
51
- private
57
+ private
52
58
 
53
59
  # Loads the profile, processing it through ERB and YAML, and returns it as a hash.
54
60
  def cucumber_yml
@@ -61,13 +67,13 @@ Defined profiles in cucumber.yml:
61
67
  require 'yaml'
62
68
  begin
63
69
  @cucumber_erb = ERB.new(IO.read(cucumber_file), nil, '%').result(binding)
64
- rescue Exception => e
70
+ rescue StandardError
65
71
  raise(YmlLoadError,"cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$!.inspect}")
66
72
  end
67
73
 
68
74
  begin
69
- @cucumber_yml = YAML::load(@cucumber_erb)
70
- rescue StandardError => e
75
+ @cucumber_yml = YAML.load(@cucumber_erb)
76
+ rescue StandardError
71
77
  raise(YmlLoadError,"cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage.\n")
72
78
  end
73
79
 
@@ -88,4 +94,3 @@ Defined profiles in cucumber.yml:
88
94
  end
89
95
  end
90
96
  end
91
-
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Cli
3
4
  class RerunFile
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/constantize'
2
3
  require 'cucumber/cli/rerun_file'
3
4
  require 'cucumber/events'
5
+ require 'cucumber/core/event_bus'
6
+ require 'cucumber/core/test/result'
4
7
  require 'forwardable'
5
- require 'cucumber/core/gherkin/tag_expression'
8
+ require 'cucumber'
6
9
 
7
10
  module Cucumber
8
11
  # The base class for configuring settings for a Cucumber run.
@@ -20,27 +23,23 @@ module Cucumber
20
23
  #
21
24
  # @param event_id [Symbol, Class, String] Identifier for the type of event to subscribe to
22
25
  # @param handler_object [Object optional] an object to be called when the event occurs
23
- # @yield [Object] Block to be called when th event occurs
26
+ # @yield [Object] Block to be called when the event occurs
24
27
  # @method on_event
25
- def_instance_delegator :event_bus, :register, :on_event
28
+ def_instance_delegator :event_bus, :on, :on_event
26
29
 
27
30
  # @private
28
- def_instance_delegator :event_bus, :notify
31
+ def notify(message, *args)
32
+ event_bus.send(message, *args)
33
+ end
29
34
 
30
35
  def initialize(user_options = {})
31
- @options = default_options.merge(Cucumber::Hash(user_options))
36
+ @options = default_options.merge(Hash(user_options))
32
37
  end
33
38
 
34
39
  def with_options(new_options)
35
40
  self.class.new(@options.merge(new_options))
36
41
  end
37
42
 
38
- # TODO: Actually Deprecate???
39
- def options
40
- warn("Deprecated: Configuration#options will be removed from the next release of Cucumber. Please use the configuration object directly instead.")
41
- Marshal.load(Marhal.dump(@options))
42
- end
43
-
44
43
  def out_stream
45
44
  @options[:out_stream]
46
45
  end
@@ -73,7 +72,7 @@ module Cucumber
73
72
  @options[:guess]
74
73
  end
75
74
 
76
- def strict?
75
+ def strict
77
76
  @options[:strict]
78
77
  end
79
78
 
@@ -85,6 +84,30 @@ module Cucumber
85
84
  @options[:expand]
86
85
  end
87
86
 
87
+ def source?
88
+ @options[:source]
89
+ end
90
+
91
+ def duration?
92
+ @options[:duration]
93
+ end
94
+
95
+ def snippets?
96
+ @options[:snippets]
97
+ end
98
+
99
+ def skip_profile_information?
100
+ @options[:skip_profile_information]
101
+ end
102
+
103
+ def profiles
104
+ @options[:profiles] || []
105
+ end
106
+
107
+ def custom_profiles
108
+ profiles - [@options[:default_profile]]
109
+ end
110
+
88
111
  def paths
89
112
  @options[:paths]
90
113
  end
@@ -107,13 +130,8 @@ module Cucumber
107
130
  with_default_features_path(dirs)
108
131
  end
109
132
 
110
- # todo: remove
111
- def tag_expression
112
- Cucumber::Core::Gherkin::TagExpression.new(@options[:tag_expressions])
113
- end
114
-
115
133
  def tag_limits
116
- tag_expression.limits.to_hash
134
+ @options[:tag_limits]
117
135
  end
118
136
 
119
137
  def tag_expressions
@@ -130,7 +148,7 @@ module Cucumber
130
148
 
131
149
  def feature_files
132
150
  potential_feature_files = with_default_features_path(paths).map do |path|
133
- path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
151
+ path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
134
152
  path = path.chomp('/')
135
153
 
136
154
  # TODO: Move to using feature loading strategies stored in
@@ -156,7 +174,7 @@ module Cucumber
156
174
 
157
175
  def all_files_to_load
158
176
  files = require_dirs.map do |path|
159
- path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
177
+ path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
160
178
  path = path.gsub(/\/$/, '') # Strip trailing slash.
161
179
  File.directory?(path) ? Dir["#{path}/**/*"] : path
162
180
  end.flatten.uniq
@@ -172,21 +190,21 @@ module Cucumber
172
190
  end
173
191
 
174
192
  def formatter_factories
175
- @options[:formats].map do |format_and_out|
176
- format = format_and_out[0]
177
- path_or_io = format_and_out[1]
193
+ formats.map do |format, formatter_options, path_or_io|
178
194
  begin
179
195
  factory = formatter_class(format)
180
- yield factory, path_or_io, Cli::Options.new(STDOUT, STDERR, @options)
196
+ yield factory,
197
+ formatter_options,
198
+ path_or_io,
199
+ Cli::Options.new(STDOUT, STDERR, @options)
181
200
  rescue Exception => e
182
- e.message << "\nError creating formatter: #{format}"
183
- raise e
201
+ raise e, "#{e.message}\nError creating formatter: #{format}", e.backtrace
184
202
  end
185
203
  end
186
204
  end
187
205
 
188
206
  def formatter_class(format)
189
- if(builtin = Cli::Options::BUILTIN_FORMATS[format])
207
+ if (builtin = Cli::Options::BUILTIN_FORMATS[format])
190
208
  constantize(builtin[0])
191
209
  else
192
210
  constantize(format)
@@ -201,7 +219,7 @@ module Cucumber
201
219
  # formatter wants to display snippets to the user.
202
220
  #
203
221
  # Each proc should take the following arguments:
204
- #
222
+ #
205
223
  # - keyword
206
224
  # - step text
207
225
  # - multiline argument
@@ -216,13 +234,17 @@ module Cucumber
216
234
  self
217
235
  end
218
236
 
219
- private
237
+ def event_bus
238
+ @options[:event_bus]
239
+ end
240
+
241
+ private
220
242
 
221
243
  def default_options
222
244
  {
223
245
  :autoload_code_paths => ['features/support', 'features/step_definitions'],
224
246
  :filters => [],
225
- :strict => false,
247
+ :strict => Cucumber::Core::Test::Result::StrictConfiguration.new,
226
248
  :require => [],
227
249
  :dry_run => false,
228
250
  :fail_fast => false,
@@ -235,17 +257,12 @@ module Cucumber
235
257
  :snippets => true,
236
258
  :source => true,
237
259
  :duration => true,
238
- :event_bus => Events::Bus.new(Cucumber::Events)
260
+ :event_bus => Cucumber::Events.make_event_bus
239
261
  }
240
262
  end
241
263
 
242
- def event_bus
243
- @options[:event_bus]
244
- end
245
-
246
-
247
264
  def default_features_paths
248
- ["features"]
265
+ ['features']
249
266
  end
250
267
 
251
268
  def with_default_features_path(paths)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/platform'
2
3
  module Cucumber
3
4
  module Constantize #:nodoc:
@@ -28,7 +29,7 @@ module Cucumber
28
29
  camel_cased_word.to_s.gsub(/::/, '/').
29
30
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
30
31
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
31
- tr("-", "_").
32
+ tr('-', '_').
32
33
  downcase
33
34
  end
34
35
 
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  class String #:nodoc:
2
3
  def indent(n)
3
4
  if n >= 0
4
5
  gsub(/^/, ' ' * n)
5
6
  else
6
- gsub(/^ {0,#{-n}}/, "")
7
+ gsub(/^ {0,#{-n}}/, '')
7
8
  end
8
9
  end
9
10
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/platform'
2
3
  require 'cucumber/gherkin/formatter/ansi_escapes'
3
4
 
@@ -12,18 +13,18 @@ module Cucumber
12
13
  end
13
14
 
14
15
  module ForDevelopers
15
- def self.call(message, method, remove_after_version)
16
+ def self.call(_message, _method, remove_after_version)
16
17
  if Cucumber::VERSION > remove_after_version
17
18
  raise "This method is due for removal after version #{remove_after_version}"
18
19
  end
19
20
  end
20
21
  end
21
22
 
22
- Strategy = $0.match(/rspec$/) ? ForDevelopers : ForUsers
23
+ STRATEGY = $0.match(/rspec$/) ? ForDevelopers : ForUsers
23
24
  end
24
25
 
25
26
  def self.deprecate(*args)
26
- Deprecate::Strategy.call(*args)
27
+ Deprecate::STRATEGY.call(*args)
27
28
  end
28
29
 
29
30
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # See https://github.com/cucumber/cucumber/issues/693
2
3
  if defined? Encoding
3
4
  Encoding.default_external = 'utf-8'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/core/test/result'
2
3
 
3
4
  module Cucumber
@@ -35,7 +36,8 @@ module Cucumber
35
36
  # Raised when a step matches 2 or more StepDefinitions
36
37
  class Ambiguous < StandardError
37
38
  def initialize(step_name, step_definitions, used_guess)
38
- message = "Ambiguous match of \"#{step_name}\":\n\n"
39
+ message = String.new
40
+ message << "Ambiguous match of \"#{step_name}\":\n\n"
39
41
  message << step_definitions.map{|sd| sd.backtrace_line}.join("\n")
40
42
  message << "\n\n"
41
43
  message << "You can run again with --guess to make Cucumber be more smart about it\n" unless used_guess
@@ -0,0 +1,17 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Fired after we've read in the contents of a feature file
7
+ class GherkinSourceRead < Core::Event.new(:path, :body)
8
+
9
+ # The path to the file
10
+ attr_reader :path
11
+
12
+ # The raw Gherkin source
13
+ attr_reader :body
14
+ end
15
+
16
+ end
17
+ end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/core/events'
3
+
1
4
  module Cucumber
2
5
  module Events
3
6
 
4
- # Event fired when a step is matched to a definition
5
- class StepMatch
7
+ # Event fired when a step is activated
8
+ class StepActivated < Core::Event.new(:test_step, :step_match)
6
9
 
7
10
  # The test step that was matched.
8
11
  #
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/core/events'
3
+
4
+ module Cucumber
5
+ module Events
6
+
7
+ # Event fired after each step definition has been registered
8
+ class StepDefinitionRegistered < Core::Event.new(:step_definition)
9
+
10
+
11
+ #_The step definition that was just registered.
12
+ #
13
+ # @return [RbSupport::RbStepDefinition]
14
+ attr_reader :step_definition
15
+
16
+ #_@private
17
+ def initialize(step_definition)
18
+ @step_definition = step_definition
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Signals that a {Cucumber::Core::Test::Case} has finished executing
7
+ class TestCaseFinished < Core::Events::TestCaseFinished
8
+
9
+ # @return [Cucumber::Core::Test::Case] that was executed
10
+ attr_reader :test_case
11
+
12
+ # @return [Cucumber::Core::Test::Result] the result of running the {Cucumber::Core::Test::Case}
13
+ attr_reader :result
14
+
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Signals that a {Cucumber::Core::Test::Case} is about to be executed
7
+ class TestCaseStarted < Core::Events::TestCaseStarted
8
+
9
+ # @return [Cucumber::Core::Test::Case] the test case to be executed
10
+ attr_reader :test_case
11
+
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/core/events'
3
+
4
+ module Cucumber
5
+ module Events
6
+
7
+ # Event fired after all test cases have finished executing
8
+ class TestRunFinished < Core::Event.new
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ require 'cucumber/core/events'
3
+
4
+ module Cucumber
5
+ module Events
6
+
7
+ # Event fired once all test cases have been filtered before
8
+ # the first one is executed.
9
+ class TestRunStarted < Core::Event.new(:test_cases)
10
+
11
+ # @return [Array<Cucumber::Core::Test::Case>] the test cases to be executed
12
+ attr_reader :test_cases
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Signals that a {Cucumber::Core::Test::Step} has finished executing
7
+ class TestStepFinished < Core::Events::TestStepFinished
8
+
9
+ # @return [Cucumber::Core::Test::Step] the test step that was executed
10
+ attr_reader :test_step
11
+
12
+ # @return [Cucumber::Core::Test::Result] the result of running the {Cucumber::Core::Test::Step}
13
+ attr_reader :result
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+
20
+
@@ -0,0 +1,17 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+
6
+ # Signals that a {Cucumber::Core::Test::Step} is about to be executed
7
+ class TestStepStarted < Core::Events::TestStepStarted
8
+
9
+ # @return [Cucumber::Core::Test::Step] the test step to be executed
10
+ attr_reader :test_step
11
+
12
+ end
13
+
14
+ end
15
+ end
16
+
17
+
@@ -1,20 +1,40 @@
1
+ # frozen_string_literal: true
2
+ Dir[File.dirname(__FILE__) + '/events/*.rb'].map(&method(:require))
3
+
1
4
  module Cucumber
2
5
 
3
6
  # Events tell you what's happening while Cucumber runs your features.
4
7
  #
5
8
  # They're designed to be read-only, appropriate for writing formatters and other
6
- # output tools. If you need to be able to influence the result of a scenario, use a hook instead.
9
+ # output tools. If you need to be able to influence the result of a scenario, use a {RbSupport::RbDsl hook} instead.
7
10
  #
8
11
  # To subscribe to an event, use {Cucumber::Configuration#on_event}
9
12
  #
10
13
  # @example
11
14
  # AfterConfiguration do |config|
12
- # config.on_event :after_test_step do |event|
15
+ # config.on_event :test_case_finished do |event|
13
16
  # puts event.result
14
17
  # end
15
18
  # end
19
+ #
16
20
  module Events
21
+ def self.make_event_bus
22
+ Core::EventBus.new(registry)
23
+ end
24
+
25
+ def self.registry
26
+ Core::Events.build_registry(
27
+ TestCaseStarted,
28
+ TestCaseFinished,
29
+ TestStepFinished,
30
+ TestStepStarted,
31
+ StepDefinitionRegistered,
32
+ StepActivated,
33
+ TestRunFinished,
34
+ GherkinSourceRead,
35
+ TestRunStarted
36
+ )
37
+ end
17
38
  end
18
39
  end
19
40
 
20
- Dir[File.dirname(__FILE__) + '/events/*.rb'].map(&method(:require))
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber'
2
3
  require 'cucumber/core/ast/location'
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/core/filter'
2
3
  require 'cucumber/step_match'
3
4
  require 'cucumber/events'
@@ -42,8 +43,12 @@ module Cucumber
42
43
  end
43
44
 
44
45
  def result
45
- return NoStepMatch.new(test_step.source.last, test_step.name) unless matches.any?
46
- configuration.notify Events::StepMatch.new(test_step, match)
46
+ begin
47
+ return NoStepMatch.new(test_step.source.last, test_step.text) unless matches.any?
48
+ rescue Cucumber::Ambiguous => e
49
+ return AmbiguousStepMatch.new(e)
50
+ end
51
+ configuration.notify :step_activated, test_step, match
47
52
  return SkippingStepMatch.new if configuration.dry_run?
48
53
  match
49
54
  end
@@ -58,7 +63,7 @@ module Cucumber
58
63
  end
59
64
 
60
65
  def matches
61
- step_match_search.call(test_step.name)
66
+ step_match_search.call(test_step.text)
62
67
  end
63
68
  end
64
69
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Filters
3
4
  class ApplyAfterHooks < Core::Filter.new(:hooks)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/core/filter'
2
3
 
3
4
  module Cucumber
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/core/filter'
2
3
 
3
4
  module Cucumber
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Filters
3
4
  class ApplyBeforeHooks < Core::Filter.new(:hooks)
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module Cucumber
3
+ module Filters
4
+ # Added at the end of the filter chain to broadcast a list of
5
+ # all of the test cases that have made it through the filters.
6
+ class BroadcastTestRunStartedEvent < Core::Filter.new(:config)
7
+ def initialize(config, receiver=nil)
8
+ super
9
+ @test_cases = []
10
+ end
11
+
12
+ def test_case(test_case)
13
+ @test_cases << test_case
14
+ self
15
+ end
16
+
17
+ def done
18
+ config.notify :test_run_started, @test_cases
19
+ @test_cases.map do |test_case|
20
+ test_case.describe_to(@receiver)
21
+ end
22
+ super
23
+ self
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Filters
3
4