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,24 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
- require 'cucumber/rb_support/snippet'
3
+ require 'cucumber/cucumber_expressions/parameter_type_registry'
4
+ require 'cucumber/cucumber_expressions/parameter_type'
5
+ require 'cucumber/cucumber_expressions/cucumber_expression_generator'
6
+ require 'cucumber/glue/snippet'
3
7
 
4
8
  module Cucumber
5
- module RbSupport
9
+ module Glue
6
10
  describe Snippet do
7
- let(:code_keyword) { "Given" }
11
+ let(:code_keyword) { 'Given' }
8
12
 
9
13
  before do
10
- @pattern = 'we have a missing step'
14
+ @step_text = 'we have a missing step'
11
15
  @multiline_argument = Core::Ast::EmptyMultilineArgument.new
16
+ @registry = CucumberExpressions::ParameterTypeRegistry.new
17
+ @cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(@registry)
12
18
  end
13
19
 
14
20
  let(:snippet) do
15
- snippet_class.new(code_keyword, @pattern, @multiline_argument)
21
+ snippet_class.new(@cucumber_expression_generator, code_keyword, @step_text, @multiline_argument)
16
22
  end
17
23
 
18
24
  def unindented(s)
@@ -23,8 +29,8 @@ module Cucumber
23
29
  let(:snippet_class) { Snippet::Regexp }
24
30
  let(:snippet_text) { snippet.to_s }
25
31
 
26
- it "wraps snippet patterns in parentheses" do
27
- @pattern = 'A "string" with 4 spaces'
32
+ it 'wraps snippet patterns in parentheses' do
33
+ @step_text = 'A "string" with 4 spaces'
28
34
 
29
35
  expect(snippet_text).to eq unindented(%{
30
36
  Given(/^A "([^"]*)" with (\\d+) spaces$/) do |arg1, arg2|
@@ -33,8 +39,8 @@ module Cucumber
33
39
  })
34
40
  end
35
41
 
36
- it "recognises numbers in name and make according regexp" do
37
- @pattern = 'Cloud 9 yeah'
42
+ it 'recognises numbers in name and make according regexp' do
43
+ @step_text = 'Cloud 9 yeah'
38
44
 
39
45
  expect(snippet_text).to eq unindented(%{
40
46
  Given(/^Cloud (\\d+) yeah$/) do |arg1|
@@ -43,8 +49,8 @@ module Cucumber
43
49
  })
44
50
  end
45
51
 
46
- it "recognises a mix of ints, strings and why not a table too" do
47
- @pattern = 'I have 9 "awesome" cukes in 37 "boxes"'
52
+ it 'recognises a mix of ints, strings and why not a table too' do
53
+ @step_text = 'I have 9 "awesome" cukes in 37 "boxes"'
48
54
  @multiline_argument = Core::Ast::DataTable.new([[]], Core::Ast::Location.new(''))
49
55
 
50
56
  expect(snippet_text).to eq unindented(%{
@@ -55,8 +61,8 @@ module Cucumber
55
61
  })
56
62
  end
57
63
 
58
- it "recognises quotes in name and make according regexp" do
59
- @pattern = 'A "first" arg'
64
+ it 'recognises quotes in name and make according regexp' do
65
+ @step_text = 'A "first" arg'
60
66
 
61
67
  expect(snippet_text).to eq unindented(%{
62
68
  Given(/^A "([^"]*)" arg$/) do |arg1|
@@ -65,8 +71,8 @@ module Cucumber
65
71
  })
66
72
  end
67
73
 
68
- it "recognises several quoted words in name and make according regexp and args" do
69
- @pattern = 'A "first" and "second" arg'
74
+ it 'recognises several quoted words in name and make according regexp and args' do
75
+ @step_text = 'A "first" and "second" arg'
70
76
 
71
77
  expect(snippet_text).to eq unindented(%{
72
78
  Given(/^A "([^"]*)" and "([^"]*)" arg$/) do |arg1, arg2|
@@ -75,8 +81,8 @@ module Cucumber
75
81
  })
76
82
  end
77
83
 
78
- it "does not use quote group when there are no quotes" do
79
- @pattern = 'A first arg'
84
+ it 'does not use quote group when there are no quotes' do
85
+ @step_text = 'A first arg'
80
86
 
81
87
  expect(snippet_text).to eq unindented(%{
82
88
  Given(/^A first arg$/) do
@@ -85,9 +91,9 @@ module Cucumber
85
91
  })
86
92
  end
87
93
 
88
- it "is helpful with tables" do
89
- @pattern = 'A "first" arg'
90
- @multiline_argument = Core::Ast::DataTable.new([[]], Core::Ast::Location.new(""))
94
+ it 'is helpful with tables' do
95
+ @step_text = 'A "first" arg'
96
+ @multiline_argument = Core::Ast::DataTable.new([[]], Core::Ast::Location.new(''))
91
97
 
92
98
  expect(snippet_text).to eq unindented(%{
93
99
  Given(/^A "([^"]*)" arg$/) do |arg1, table|
@@ -97,9 +103,9 @@ module Cucumber
97
103
  })
98
104
  end
99
105
 
100
- it "is helpful with doc string" do
101
- @pattern = 'A "first" arg'
102
- @multiline_argument = MultilineArgument.from("", Core::Ast::Location.new(""))
106
+ it 'is helpful with doc string' do
107
+ @step_text = 'A "first" arg'
108
+ @multiline_argument = MultilineArgument.from('', Core::Ast::Location.new(''))
103
109
 
104
110
  expect(snippet_text).to eq unindented(%{
105
111
  Given(/^A "([^"]*)" arg$/) do |arg1, string|
@@ -112,7 +118,7 @@ module Cucumber
112
118
  describe Snippet::Classic do
113
119
  let(:snippet_class) { Snippet::Classic }
114
120
 
115
- it "renders snippet as unwrapped regular expression" do
121
+ it 'renders snippet as unwrapped regular expression' do
116
122
  expect(snippet.to_s).to eq unindented(%{
117
123
  Given /^we have a missing step$/ do
118
124
  pending # Write code here that turns the phrase above into concrete actions
@@ -124,7 +130,7 @@ module Cucumber
124
130
  describe Snippet::Percent do
125
131
  let(:snippet_class) { Snippet::Percent }
126
132
 
127
- it "renders snippet as percent-style regular expression" do
133
+ it 'renders snippet as percent-style regular expression' do
128
134
  expect(snippet.to_s).to eq unindented(%{
129
135
  Given %r{^we have a missing step$} do
130
136
  pending # Write code here that turns the phrase above into concrete actions
@@ -132,6 +138,37 @@ module Cucumber
132
138
  })
133
139
  end
134
140
  end
141
+
142
+ describe Snippet::CucumberExpression do
143
+ let(:snippet_class) { Snippet::CucumberExpression }
144
+
145
+ it 'renders snippet as cucumber expression' do
146
+ @step_text = 'I have 2.3 cukes in my belly'
147
+ @registry.define_parameter_type(CucumberExpressions::ParameterType.new(
148
+ 'veg',
149
+ /(cuke|banana)s?/,
150
+ Object,
151
+ ->(s) { s },
152
+ true,
153
+ false
154
+ ))
155
+ @registry.define_parameter_type(CucumberExpressions::ParameterType.new(
156
+ 'cucumis',
157
+ /(bella|cuke)s?/,
158
+ Object,
159
+ ->(s) { s },
160
+ true,
161
+ false
162
+ ))
163
+
164
+ expect(snippet.to_s).to eq unindented(%{
165
+ Given("I have {float} {cucumis} in my belly") do |float, cucumis|
166
+ # Given("I have {float} {veg} in my belly") do |float, veg|
167
+ pending # Write code here that turns the phrase above into concrete actions
168
+ end
169
+ })
170
+ end
171
+ end
135
172
  end
136
173
  end
137
174
  end
@@ -0,0 +1,207 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'cucumber/glue/registry_and_more'
4
+
5
+ module Cucumber
6
+ module Glue
7
+ describe StepDefinition do
8
+ let(:user_interface) { double('user interface') }
9
+ let(:support_code) { Cucumber::Runtime::SupportCode.new(user_interface) }
10
+ let(:registry) { support_code.registry }
11
+ let(:scenario) { double('scenario', iso_code: 'en').as_null_object }
12
+ let(:dsl) do
13
+ registry
14
+ Object.new.extend(Cucumber::Glue::Dsl)
15
+ end
16
+
17
+ before do
18
+ registry.begin_scenario(scenario)
19
+ $inside = nil
20
+ end
21
+
22
+ def run_step(text)
23
+ step_match(text).invoke(MultilineArgument::None.new)
24
+ end
25
+
26
+ def step_match(text)
27
+ StepMatchSearch.new(registry.method(:step_matches), Configuration.default).call(text).first
28
+ end
29
+
30
+ it 'allows calling of other steps' do
31
+ dsl.Given(/Outside/) do
32
+ step 'Inside'
33
+ end
34
+ dsl.Given(/Inside/) do
35
+ $inside = true
36
+ end
37
+
38
+ run_step 'Outside'
39
+
40
+ expect($inside).to be true
41
+ end
42
+
43
+ it 'allows calling of other steps with inline arg' do
44
+ dsl.Given(/Outside/) do
45
+ step 'Inside', table([['inside']])
46
+ end
47
+ dsl.Given(/Inside/) do |t|
48
+ $inside = t.raw[0][0]
49
+ end
50
+
51
+ run_step 'Outside'
52
+
53
+ expect($inside).to eq 'inside'
54
+ end
55
+
56
+ context 'mapping to world methods' do
57
+ it 'calls a method on the world when specified with a symbol' do
58
+ expect(registry.current_world).to receive(:with_symbol)
59
+
60
+ dsl.Given(/With symbol/, :with_symbol)
61
+
62
+ run_step 'With symbol'
63
+ end
64
+
65
+ it 'calls a method on a specified object' do
66
+ target = double('target')
67
+
68
+ allow(registry.current_world).to receive(:target) { target }
69
+
70
+ dsl.Given(/With symbol on block/, :with_symbol, :on => lambda { target })
71
+
72
+ expect(target).to receive(:with_symbol)
73
+
74
+ run_step 'With symbol on block'
75
+ end
76
+
77
+ it 'calls a method on a specified world attribute' do
78
+ target = double('target')
79
+
80
+ allow(registry.current_world).to receive(:target) { target }
81
+
82
+ dsl.Given(/With symbol on symbol/, :with_symbol, :on => :target)
83
+
84
+ expect(target).to receive(:with_symbol)
85
+
86
+ run_step 'With symbol on symbol'
87
+ end
88
+
89
+ it 'has the correct location' do
90
+ dsl.Given(/With symbol/, :with_symbol)
91
+ expect(step_match('With symbol').file_colon_line).to eq "spec/cucumber/glue/step_definition_spec.rb:#{__LINE__-1}"
92
+ end
93
+ end
94
+
95
+ it 'raises UndefinedDynamicStep when inside step is not defined' do
96
+ dsl.Given(/Outside/) do
97
+ step 'Inside'
98
+ end
99
+
100
+ expect(-> {
101
+ run_step 'Outside'
102
+ }).to raise_error(Cucumber::UndefinedDynamicStep)
103
+ end
104
+
105
+ it 'raises UndefinedDynamicStep when an undefined step is parsed dynamically' do
106
+ dsl.Given(/Outside/) do
107
+ steps %{
108
+ Given Inside
109
+ }
110
+ end
111
+
112
+ expect(-> {
113
+ run_step 'Outside'
114
+ }).to raise_error(Cucumber::UndefinedDynamicStep)
115
+ end
116
+
117
+ it 'raises UndefinedDynamicStep when an undefined step with doc string is parsed dynamically' do
118
+ dsl.Given(/Outside/) do
119
+ steps %{
120
+ Given Inside
121
+ """
122
+ abc
123
+ """
124
+ }
125
+ end
126
+
127
+ expect(-> {
128
+ run_step 'Outside'
129
+ }).to raise_error(Cucumber::UndefinedDynamicStep)
130
+ end
131
+
132
+ it 'raises UndefinedDynamicStep when an undefined step with data table is parsed dynamically' do
133
+ dsl.Given(/Outside/) do
134
+ steps %{
135
+ Given Inside
136
+ | a |
137
+ | 1 |
138
+ }
139
+ end
140
+
141
+ expect(-> {
142
+ run_step 'Outside'
143
+ }).to raise_error(Cucumber::UndefinedDynamicStep)
144
+ end
145
+
146
+ it 'allows forced pending' do
147
+ dsl.Given(/Outside/) do
148
+ pending('Do me!')
149
+ end
150
+
151
+ expect(-> {
152
+ run_step 'Outside'
153
+ }).to raise_error(Cucumber::Pending, 'Do me!')
154
+ end
155
+
156
+ it 'raises ArityMismatchError when the number of capture groups differs from the number of step arguments' do
157
+ dsl.Given(/No group: \w+/) do |arg|
158
+ end
159
+
160
+ expect(-> {
161
+ run_step 'No group: arg'
162
+ }).to raise_error(Cucumber::Glue::ArityMismatchError)
163
+ end
164
+
165
+ it 'does not modify the step_match arg when arg is modified in a step' do
166
+ dsl.Given(/My car is (.*)/) do |colour|
167
+ colour << 'xxx'
168
+ end
169
+
170
+ step_name = 'My car is white'
171
+ step_args = step_match(step_name).args
172
+
173
+ expect(-> {
174
+ run_step step_name
175
+ }).not_to change{ step_args.first }
176
+ end
177
+
178
+ it 'allows puts' do
179
+ expect(user_interface).to receive(:puts).with('wasup')
180
+ dsl.Given(/Loud/) do
181
+ puts 'wasup'
182
+ end
183
+ run_step 'Loud'
184
+ end
185
+
186
+ it 'recognizes $arg style captures' do
187
+ arg_value = 'up'
188
+ dsl.Given 'capture this: {word}' do |arg|
189
+ expect(arg).to eq arg_value
190
+ end
191
+ run_step 'capture this: up'
192
+ end
193
+
194
+ it 'has a JSON representation of the signature' do
195
+ expect(StepDefinition.new(registry, /I CAN HAZ (\d+) CUKES/i, lambda{}, {}).to_hash).to eq({
196
+ source: {
197
+ type: 'regular expression',
198
+ expression: 'I CAN HAZ (\\d+) CUKES'
199
+ },
200
+ regexp: {
201
+ source: 'I CAN HAZ (\\d+) CUKES', flags: 'i'
202
+ }
203
+ })
204
+ end
205
+ end
206
+ end
207
+ end
@@ -1,15 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/hooks'
2
3
  module Cucumber::Hooks
3
4
  shared_examples_for 'a source node' do
4
- it "responds to name" do
5
- expect( subject.name ).to be_a(String)
5
+ it 'responds to text' do
6
+ expect( subject.text ).to be_a(String)
6
7
  end
7
8
 
8
- it "responds to location" do
9
+ it 'responds to location' do
9
10
  expect( subject.location ).to eq(location)
10
11
  end
11
12
 
12
- it "responds to match_locations?" do
13
+ it 'responds to match_locations?' do
13
14
  expect( subject.match_locations? [location] ).to be_truthy
14
15
  expect( subject.match_locations? [] ).to be_falsey
15
16
  end