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,59 +0,0 @@
1
- module Cucumber
2
- module RbSupport
3
- # A Ruby Transform holds a Regexp and a Proc, and is created
4
- # by calling <tt>Transform in the <tt>support</tt> ruby files.
5
- # See also RbDsl.
6
- #
7
- # Example:
8
- #
9
- # Transform /^(\d+) cucumbers$/ do |cucumbers_string|
10
- # cucumbers_string.to_i
11
- # end
12
- #
13
- class RbTransform
14
- class MissingProc < StandardError
15
- def message
16
- "Transforms must always have a proc with at least one argument"
17
- end
18
- end
19
-
20
- def initialize(rb_language, pattern, proc)
21
- raise MissingProc if proc.nil? || proc.arity < 1
22
- @rb_language, @regexp, @proc = rb_language, Regexp.new(pattern), proc
23
- end
24
-
25
- def match(arg)
26
- arg ? arg.match(@regexp) : nil
27
- end
28
-
29
- def invoke(arg)
30
- if matched = match(arg)
31
- args = matched.captures.empty? ? [arg] : matched.captures
32
- @rb_language.current_world.cucumber_instance_exec(true, @regexp.inspect, *args, &@proc)
33
- end
34
- end
35
-
36
- def to_s
37
- convert_captures(strip_anchors(@regexp.source))
38
- end
39
-
40
- private
41
- def convert_captures(regexp_source)
42
- regexp_source
43
- .gsub(/(\()(?!\?[<:=!])/,'(?:')
44
- .gsub(/(\(\?<)(?![=!])/,'(?:<')
45
- end
46
-
47
- def strip_captures(regexp_source)
48
- regexp_source.
49
- gsub(/(\()/, '').
50
- gsub(/(\))/, '')
51
- end
52
-
53
- def strip_anchors(regexp_source)
54
- regexp_source.
55
- gsub(/(^\^|\$$)/, '')
56
- end
57
- end
58
- end
59
- end
@@ -1,149 +0,0 @@
1
- require 'cucumber/gherkin/formatter/ansi_escapes'
2
-
3
- module Cucumber
4
- module RbSupport
5
- # Defines the basic DSL methods availlable in all Cucumber step definitions.
6
- #
7
- # You can, and probably should, extend this DSL with your own methods that
8
- # make sense in your domain. For more on that, see {Cucumber::RbSupport::RbDsl#World}
9
- module RbWorld
10
-
11
- # @private
12
- AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
13
-
14
- # Call a Transform with a string from another Transform definition
15
- def Transform(arg)
16
- rb = @__cucumber_runtime.support_code.ruby
17
- rb.execute_transforms([arg]).first
18
- end
19
-
20
- # @private
21
- attr_writer :__cucumber_runtime, :__natural_language
22
-
23
- # Run a single Gherkin step
24
- # @example Call another step
25
- # step "I am logged in"
26
- # @example Call a step with quotes in the name
27
- # step %{the user "Dave" is logged in}
28
- # @example Passing a table
29
- # step "the following users exist:", table(%{
30
- # | name | email |
31
- # | Matt | matt@matt.com |
32
- # | Aslak | aslak@aslak.com |
33
- # })
34
- # @example Passing a multiline string
35
- # step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
36
- # @param [String] name The name of the step
37
- # @param [String,Cucumber::Ast::DocString,Cucumber::Ast::Table] multiline_argument
38
- def step(name, raw_multiline_arg=nil)
39
- location = Core::Ast::Location.of_caller
40
- @__cucumber_runtime.invoke_dynamic_step(name, MultilineArgument.from(raw_multiline_arg, location))
41
- end
42
-
43
- # Run a snippet of Gherkin
44
- # @example
45
- # steps %{
46
- # Given the user "Susan" exists
47
- # And I am logged in as "Susan"
48
- # }
49
- # @param [String] steps_text The Gherkin snippet to run
50
- def steps(steps_text)
51
- location = Core::Ast::Location.of_caller
52
- @__cucumber_runtime.invoke_dynamic_steps(steps_text, @__natural_language, location)
53
- end
54
-
55
- # Parse Gherkin into a {Cucumber::Ast::Table} object.
56
- #
57
- # Useful in conjunction with the #step method.
58
- # @example Create a table
59
- # users = table(%{
60
- # | name | email |
61
- # | Matt | matt@matt.com |
62
- # | Aslak | aslak@aslak.com |
63
- # })
64
- # @param [String] text_or_table The Gherkin string that represents the table
65
- def table(text_or_table, file=nil, line_offset=0)
66
- @__cucumber_runtime.table(text_or_table, file, line_offset)
67
- end
68
-
69
- # Create an {Cucumber::Ast::DocString} object
70
- #
71
- # Useful in conjunction with the #step method, when
72
- # want to specify a content type.
73
- # @example Create a multiline string
74
- # code = multiline_string(%{
75
- # puts "this is ruby code"
76
- # %}, 'ruby')
77
- def doc_string(string_without_triple_quotes, content_type='', line_offset=0)
78
- STDERR.puts AnsiEscapes.failed + "WARNING: #doc_string is deprecated. Just pass a regular String instead:" + caller[0] + AnsiEscapes.reset
79
- # TODO: rename this method to multiline_string
80
- @__cucumber_runtime.doc_string(string_without_triple_quotes, content_type, line_offset)
81
- end
82
-
83
- # @deprecated Use {#puts} instead.
84
- def announce(*messages)
85
- STDERR.puts AnsiEscapes.failed + "WARNING: #announce is deprecated. Use #puts instead:" + caller[0] + AnsiEscapes.reset
86
- puts(*messages)
87
- end
88
-
89
- # Print a message to the output.
90
- #
91
- # @note Cucumber might surprise you with the behaviour of this method. Instead
92
- # of sending the output directly to STDOUT, Cucumber will intercept and cache
93
- # the message until the current step has finished, and then display it.
94
- #
95
- # If you'd prefer to see the message immediately, call {Kernel.puts} instead.
96
- def puts(*messages)
97
- # Even though they won't be output until later, converting the messages to
98
- # strings right away will protect them from modifications to their original
99
- # objects in the mean time
100
- messages.collect! { |message| "#{message}" }
101
-
102
- @__cucumber_runtime.puts(*messages)
103
- end
104
-
105
- # Pause the tests and ask the operator for input
106
- def ask(question, timeout_seconds=60)
107
- @__cucumber_runtime.ask(question, timeout_seconds)
108
- end
109
-
110
- # Embed an image in the output
111
- def embed(file, mime_type, label='Screenshot')
112
- @__cucumber_runtime.embed(file, mime_type, label)
113
- end
114
-
115
- # Mark the matched step as pending.
116
- def pending(message = "TODO")
117
- if block_given?
118
- begin
119
- yield
120
- rescue Exception
121
- raise Pending, message
122
- end
123
- raise Pending, "Expected pending '#{message}' to fail. No Error was raised. No longer pending?"
124
- else
125
- raise Pending, message
126
- end
127
- end
128
-
129
- # Skips this step and the remaining steps in the scenario
130
- def skip_this_scenario(message = "Scenario skipped")
131
- raise Core::Test::Result::Skipped, message
132
- end
133
-
134
- # Prints the list of modules that are included in the World
135
- def inspect
136
- modules = [self.class]
137
- (class << self; self; end).instance_eval do
138
- modules += included_modules
139
- end
140
- sprintf("#<%s:0x%x>", modules.join('+'), self.object_id)
141
- end
142
-
143
- # see {#inspect}
144
- def to_s
145
- inspect
146
- end
147
- end
148
- end
149
- end
@@ -1,4 +0,0 @@
1
- require 'cucumber/core_ext/instance_exec'
2
-
3
- describe 'cucumber_instance_exec' do
4
- end
@@ -1,94 +0,0 @@
1
- require "cucumber/events/bus"
2
-
3
- module Cucumber
4
- module Events
5
- class TestEvent
6
- end
7
-
8
- class AnotherTestEvent
9
- end
10
-
11
- describe Bus do
12
- let(:bus) { Bus.new(Cucumber::Events) }
13
- let(:test_event) { TestEvent.new }
14
- let(:another_test_event) { AnotherTestEvent.new }
15
-
16
- it "calls subscriber with event payload" do
17
- received_payload = nil
18
- bus.register(TestEvent) do |event|
19
- received_payload = event
20
- end
21
-
22
- bus.notify test_event
23
-
24
- expect(received_payload).to eq(test_event)
25
- end
26
-
27
- it "does not call subscribers for other events" do
28
- handler_called = false
29
- bus.register(TestEvent) do |event|
30
- handler_called = true
31
- end
32
-
33
- bus.notify another_test_event
34
-
35
- expect(handler_called).to eq(false)
36
- end
37
-
38
- it "broadcasts to multiple subscribers" do
39
- received_events = []
40
- bus.register(TestEvent) do |event|
41
- received_events << event
42
- end
43
- bus.register(TestEvent) do |event|
44
- received_events << event
45
- end
46
-
47
- bus.notify test_event
48
-
49
- expect(received_events.length).to eq 2
50
- expect(received_events).to all eq test_event
51
- end
52
-
53
- it "allows subscription by string" do
54
- received_payload = nil
55
- bus.register('Cucumber::Events::TestEvent') do |event|
56
- received_payload = event
57
- end
58
-
59
- bus.notify test_event
60
-
61
- expect(received_payload).to eq(test_event)
62
- end
63
-
64
- it "allows subscription by symbol (for events in the Cucumber::Events namespace)" do
65
- received_payload = nil
66
- bus.register(:test_event) do |event|
67
- received_payload = event
68
- end
69
-
70
- bus.notify test_event
71
-
72
- expect(received_payload).to eq(test_event)
73
- end
74
-
75
- it "allows handlers that are objects with a `call` method" do
76
- class MyHandler
77
- attr_reader :received_payload
78
-
79
- def call(event)
80
- @received_payload = event
81
- end
82
- end
83
-
84
- handler = MyHandler.new
85
- bus.register(TestEvent, handler)
86
-
87
- bus.notify test_event
88
-
89
- expect(handler.received_payload).to eq test_event
90
- end
91
-
92
- end
93
- end
94
- end
@@ -1,64 +0,0 @@
1
- require 'spec_helper'
2
- require 'cucumber/formatter/spec_helper'
3
- require 'cucumber/formatter/debug'
4
- require 'cucumber/cli/options'
5
-
6
- module Cucumber
7
- module Formatter
8
- describe Debug do
9
- extend SpecHelperDsl
10
- include SpecHelper
11
-
12
- before(:each) do
13
- Cucumber::Term::ANSIColor.coloring = false
14
- @out = StringIO.new
15
- @formatter = Debug.new(runtime, @out, {})
16
- end
17
-
18
- describe "given a single feature" do
19
- before(:each) { run_defined_feature }
20
-
21
- describe "with a scenario" do
22
- define_feature <<-FEATURE
23
- Feature: Banana party
24
-
25
- Scenario: Monkey eats banana
26
- Given there are bananas
27
- FEATURE
28
-
29
- it "outputs the events as expected" do
30
- expect(@out.string).to eq(<<EXPECTED)
31
- before_test_case
32
- before_features
33
- before_feature
34
- before_tags
35
- after_tags
36
- feature_name
37
- before_test_step
38
- after_test_step
39
- before_test_step
40
- before_feature_element
41
- before_tags
42
- after_tags
43
- scenario_name
44
- before_steps
45
- before_step
46
- before_step_result
47
- step_name
48
- after_step_result
49
- after_step
50
- after_test_step
51
- after_steps
52
- after_feature_element
53
- after_test_case
54
- after_feature
55
- after_features
56
- done
57
- EXPECTED
58
- end
59
- end
60
- end
61
- end
62
-
63
- end
64
- end
@@ -1,88 +0,0 @@
1
- require 'cucumber/configuration'
2
- require 'cucumber/runtime'
3
- require 'cucumber/formatter/spec_helper'
4
- require 'cucumber/formatter/event_bus_report'
5
-
6
- module Cucumber
7
- module Formatter
8
- describe EventBusReport do
9
- extend SpecHelperDsl
10
- include SpecHelper
11
-
12
- context "With no options" do
13
- let(:config) { Cucumber::Configuration.new }
14
-
15
- before(:each) do
16
- @formatter = EventBusReport.new(config)
17
- end
18
-
19
- describe "given a single feature" do
20
-
21
- describe "a scenario with a single passing step" do
22
- define_feature <<-FEATURE
23
- Feature:
24
- Scenario: Test Scenario
25
- Given passing
26
- FEATURE
27
-
28
- define_steps do
29
- Given(/pass/) {}
30
- end
31
-
32
- it "emits a BeforeTestCase event" do
33
- received_event = nil
34
- config.on_event Cucumber::Events::BeforeTestCase do |event|
35
- received_event = event
36
- end
37
- run_defined_feature
38
- expect(received_event.test_case.name).to eq "Test Scenario"
39
- end
40
-
41
- it "emits a BeforeTestStep event" do
42
- received_event = nil
43
- config.on_event Cucumber::Events::BeforeTestStep do |event|
44
- received_event = event
45
- end
46
- run_defined_feature
47
- expect(received_event.test_case.name).to eq "Test Scenario"
48
- expect(received_event.test_step.name).to eq "passing"
49
- end
50
-
51
- it "emits an AfterTestStep event with a passed result" do
52
- received_event = nil
53
- config.on_event Cucumber::Events::AfterTestStep do |event|
54
- received_event = event
55
- end
56
- run_defined_feature
57
- expect(received_event.test_case.name).to eq "Test Scenario"
58
- expect(received_event.test_step.name).to eq "passing"
59
- expect(received_event.result).to be_passed
60
- end
61
-
62
- it "emits an AfterTestCase event with a passed result" do
63
- received_event = nil
64
- config.on_event Cucumber::Events::AfterTestCase do |event|
65
- received_event = event
66
- end
67
- run_defined_feature
68
- expect(received_event.test_case.name).to eq "Test Scenario"
69
- expect(received_event.result).to be_passed
70
- end
71
-
72
- it "emits a Done event when the test run is finished" do
73
- received_event = nil
74
- config.on_event Cucumber::Events::FinishedTesting do |event|
75
- received_event = event
76
- end
77
- run_defined_feature
78
- expect(received_event).not_to be_nil
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
85
- end
86
-
87
-
88
-
@@ -1,243 +0,0 @@
1
- require 'spec_helper'
2
- require 'cucumber/rb_support/rb_language'
3
-
4
- module Cucumber
5
- module RbSupport
6
- describe RbStepDefinition do
7
- let(:user_interface) { double('user interface') }
8
- let(:rb) { support_code.ruby }
9
- let(:support_code) do
10
- Cucumber::Runtime::SupportCode.new(user_interface)
11
- end
12
- let(:dsl) do
13
- rb
14
- Object.new.extend(RbSupport::RbDsl)
15
- end
16
-
17
- describe "#load_code_file" do
18
- after do
19
- FileUtils.rm_rf('tmp.rb')
20
- end
21
-
22
- def a_file_called(name)
23
- File.open('tmp.rb', 'w') do |f|
24
- f.puts yield
25
- end
26
- end
27
-
28
- it "re-loads the file when called multiple times" do
29
- a_file_called('tmp.rb') do
30
- "$foo = 1"
31
- end
32
-
33
- rb.load_code_file('tmp.rb')
34
- expect($foo).to eq 1
35
-
36
- a_file_called('tmp.rb') do
37
- "$foo = 2"
38
- end
39
-
40
- rb.load_code_file('tmp.rb')
41
-
42
- expect($foo).to eq 2
43
- end
44
-
45
- it "only loads ruby files" do
46
- a_file_called("readme.md") do
47
- "yo"
48
- end
49
- rb.load_code_file('readme.md')
50
- end
51
- end
52
-
53
- describe "Handling the World" do
54
- it "raises an error if the world is nil" do
55
- dsl.World {}
56
-
57
- begin
58
- rb.begin_scenario(nil)
59
- raise "Should fail"
60
- rescue RbSupport::NilWorld => e
61
- expect(e.message).to eq "World procs should never return nil"
62
- expect(e.backtrace.length).to eq 1
63
- expect(e.backtrace[0]).to match(/spec\/cucumber\/rb_support\/rb_language_spec\.rb\:\d+\:in `World'/)
64
- end
65
- end
66
-
67
- module ModuleOne
68
- end
69
-
70
- module ModuleTwo
71
- end
72
-
73
- class ClassOne
74
- end
75
-
76
- it "implicitlys extend world with modules" do
77
- dsl.World(ModuleOne, ModuleTwo)
78
- rb.begin_scenario(double('scenario').as_null_object)
79
- class << rb.current_world
80
- extend RSpec::Matchers
81
-
82
- expect(included_modules.inspect).to match(/ModuleOne/) # Workaround for RSpec/Ruby 1.9 issue with namespaces
83
- expect(included_modules.inspect).to match(/ModuleTwo/)
84
- end
85
- expect(rb.current_world.class).to eq Object
86
- end
87
-
88
- it "raises error when we try to register more than one World proc" do
89
- expected_error = %{You can only pass a proc to #World once, but it's happening
90
- in 2 places:
91
-
92
- spec/cucumber/rb_support/rb_language_spec.rb:\\d+:in `World'
93
- spec/cucumber/rb_support/rb_language_spec.rb:\\d+:in `World'
94
-
95
- Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc
96
- or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.
97
-
98
- }
99
- dsl.World { Hash.new }
100
-
101
- expect(-> {
102
- dsl.World { Array.new }
103
- }).to raise_error(RbSupport::MultipleWorld, /#{expected_error}/)
104
- end
105
- end
106
-
107
- describe "step argument transformations" do
108
- describe "without capture groups" do
109
- it "complains when registering with a with no transform block" do
110
- expect(-> {
111
- dsl.Transform('^abc$')
112
- }).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
113
- end
114
-
115
- it "complains when registering with a zero-arg transform block" do
116
- expect(-> {
117
- dsl.Transform('^abc$') {42}
118
- }).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
119
- end
120
-
121
- it "complains when registering with a splat-arg transform block" do
122
- expect(-> {
123
- dsl.Transform('^abc$') {|*splat| 42 }
124
- }).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
125
- end
126
-
127
- it "complains when transforming with an arity mismatch" do
128
- expect(-> {
129
- dsl.Transform('^abc$') {|one, two| 42 }
130
- rb.execute_transforms(['abc'])
131
- }).to raise_error(Cucumber::ArityMismatchError)
132
- end
133
-
134
- it "allows registering a regexp pattern that yields the step_arg matched" do
135
- dsl.Transform(/^ab*c$/) {|arg| 42}
136
-
137
- expect(rb.execute_transforms(['ab'])).to eq ['ab']
138
- expect(rb.execute_transforms(['ac'])).to eq [42]
139
- expect(rb.execute_transforms(['abc'])).to eq [42]
140
- expect(rb.execute_transforms(['abbc'])).to eq [42]
141
- end
142
-
143
- it "transforms times" do
144
- require 'time'
145
- dsl.Transform(/^(\d\d-\d\d-\d\d\d\d)$/) do |arg|
146
- Time.parse(arg)
147
- end
148
- expect(rb.execute_transforms(['10-0E-1971'])).to eq ['10-0E-1971']
149
- expect(rb.execute_transforms(['10-03-1971'])).to eq [Time.parse('10-03-1971')]
150
- end
151
- end
152
-
153
- describe "with capture groups" do
154
- it "complains when registering with a with no transform block" do
155
- expect(-> {
156
- dsl.Transform('^a(.)c$')
157
- }).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
158
- end
159
-
160
- it "complains when registering with a zero-arg transform block" do
161
- expect(-> {
162
- dsl.Transform('^a(.)c$') { 42 }
163
- }).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
164
- end
165
-
166
- it "complains when registering with a splat-arg transform block" do
167
- expect(-> {
168
- dsl.Transform('^a(.)c$') {|*splat| 42 }
169
- }).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
170
- end
171
-
172
- it "complains when transforming with an arity mismatch" do
173
- expect(-> {
174
- dsl.Transform('^a(.)c$') {|one, two| 42 }
175
- rb.execute_transforms(['abc'])
176
- }).to raise_error(Cucumber::ArityMismatchError)
177
- end
178
-
179
- it "allows registering a regexp pattern that yields capture groups" do
180
- dsl.Transform(/^shape: (.+), color: (.+)$/) do |shape, color|
181
- {shape.to_sym => color.to_sym}
182
- end
183
-
184
- expect(rb.execute_transforms(['shape: circle, color: blue'])).to eq [{:circle => :blue}]
185
- expect(rb.execute_transforms(['shape: square, color: red'])).to eq [{:square => :red}]
186
- expect(rb.execute_transforms(['not shape: square, not color: red'])).to eq ['not shape: square, not color: red']
187
- end
188
- end
189
-
190
- it "allows registering a string pattern" do
191
- dsl.Transform('^ab*c$') {|arg| 42}
192
-
193
- expect(rb.execute_transforms(['ab'])).to eq ['ab']
194
- expect(rb.execute_transforms(['ac'])).to eq [42]
195
- expect(rb.execute_transforms(['abc'])).to eq [42]
196
- expect(rb.execute_transforms(['abbc'])).to eq [42]
197
- end
198
-
199
- it "gives match priority to transforms defined last" do
200
- dsl.Transform(/^transform_me$/) {|arg| :foo }
201
- dsl.Transform(/^transform_me$/) {|arg| :bar }
202
- dsl.Transform(/^transform_me$/) {|arg| :baz }
203
-
204
- expect(rb.execute_transforms(['transform_me'])).to eq [:baz]
205
- end
206
-
207
- it "allows registering a transform which returns nil" do
208
- dsl.Transform('^ac$') {|arg| nil}
209
-
210
- expect(rb.execute_transforms(['ab'])).to eq ['ab']
211
- expect(rb.execute_transforms(['ac'])).to eq [nil]
212
- end
213
- end
214
-
215
- describe "hooks" do
216
- it "finds before hooks" do
217
- fish = dsl.Before('@fish'){}
218
- meat = dsl.Before('@meat'){}
219
-
220
- scenario = double('Scenario')
221
-
222
- expect(scenario).to receive(:accept_hook?).with(fish) { true }
223
- expect(scenario).to receive(:accept_hook?).with(meat) { false }
224
- expect(rb.hooks_for(:before, scenario)).to eq [fish]
225
- end
226
-
227
- it "finds around hooks" do
228
- a = dsl.Around do |scenario, block|
229
- end
230
-
231
- b = dsl.Around('@tag') do |scenario, block|
232
- end
233
-
234
- scenario = double('Scenario')
235
-
236
- expect(scenario).to receive(:accept_hook?).with(a) { true }
237
- expect(scenario).to receive(:accept_hook?).with(b) { false }
238
- expect(rb.hooks_for(:around, scenario)).to eq [a]
239
- end
240
- end
241
- end
242
- end
243
- end