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 'spec_helper'
2
3
  require 'cucumber/formatter/spec_helper'
3
4
  require 'cucumber/formatter/progress'
@@ -12,15 +13,15 @@ module Cucumber
12
13
  before(:each) do
13
14
  Cucumber::Term::ANSIColor.coloring = false
14
15
  @out = StringIO.new
15
- @formatter = Progress.new(runtime, @out, Cucumber::Cli::Options.new)
16
+ @formatter = Progress.new(actual_runtime.configuration.with_options(out_stream: @out))
16
17
  end
17
18
 
18
- describe "given a single feature" do
19
+ describe 'given a single feature' do
19
20
  before(:each) do
20
21
  run_defined_feature
21
22
  end
22
23
 
23
- describe "with a scenario" do
24
+ describe 'with a scenario' do
24
25
  define_feature <<-FEATURE
25
26
  Feature: Banana party
26
27
 
@@ -28,12 +29,12 @@ module Cucumber
28
29
  Given there are bananas
29
30
  FEATURE
30
31
 
31
- it "outputs the undefined step" do
32
+ it 'outputs the undefined step' do
32
33
  expect(@out.string).to include "U\n"
33
34
  end
34
35
  end
35
36
 
36
- describe "with a background" do
37
+ describe 'with a background' do
37
38
  define_feature <<-FEATURE
38
39
  Feature: Banana party
39
40
 
@@ -44,12 +45,12 @@ module Cucumber
44
45
  Given there are bananas
45
46
  FEATURE
46
47
 
47
- it "outputs the two undefined steps" do
48
+ it 'outputs the two undefined steps' do
48
49
  expect(@out.string).to include "UU\n"
49
50
  end
50
51
  end
51
52
 
52
- describe "with a scenario outline" do
53
+ describe 'with a scenario outline' do
53
54
  define_feature <<-FEATURE
54
55
  Feature: Fud Pyramid
55
56
 
@@ -66,23 +67,23 @@ module Cucumber
66
67
  | carrots |
67
68
  FEATURE
68
69
 
69
- it "outputs each undefined step" do
70
+ it 'outputs each undefined step' do
70
71
  expect(@out.string).to include "UUUU\n"
71
72
  end
72
73
 
73
- it "has 4 undefined scenarios" do
74
- expect(@out.string).to include "4 scenarios (4 undefined)"
74
+ it 'has 4 undefined scenarios' do
75
+ expect(@out.string).to include '4 scenarios (4 undefined)'
75
76
  end
76
77
 
77
- it "has 4 undefined steps" do
78
- expect(@out.string).to include "4 steps (4 undefined)"
78
+ it 'has 4 undefined steps' do
79
+ expect(@out.string).to include '4 steps (4 undefined)'
79
80
  end
80
81
 
81
82
  end
82
83
 
83
- describe "with hooks" do
84
+ describe 'with hooks' do
84
85
 
85
- describe "all hook passes" do
86
+ describe 'all hook passes' do
86
87
  define_feature <<-FEATURE
87
88
  Feature:
88
89
  Scenario:
@@ -99,7 +100,7 @@ module Cucumber
99
100
  Given(/^this step passes$/) {}
100
101
  end
101
102
 
102
- it "only steps generate output" do
103
+ it 'only steps generate output' do
103
104
  lines = <<-OUTPUT
104
105
  .
105
106
  1 scenario (1 passed)
@@ -111,7 +112,7 @@ module Cucumber
111
112
  end
112
113
  end
113
114
 
114
- describe "with a failing before hook" do
115
+ describe 'with a failing before hook' do
115
116
  define_feature <<-FEATURE
116
117
  Feature:
117
118
  Scenario:
@@ -120,12 +121,12 @@ module Cucumber
120
121
 
121
122
  define_steps do
122
123
  Before do
123
- fail "hook failed"
124
+ fail 'hook failed'
124
125
  end
125
126
  Given(/^this step passes$/) {}
126
127
  end
127
128
 
128
- it "the failing hook generate output" do
129
+ it 'the failing hook generate output' do
129
130
  lines = <<-OUTPUT
130
131
  F-
131
132
  1 scenario (1 failed)
@@ -137,7 +138,7 @@ module Cucumber
137
138
  end
138
139
  end
139
140
 
140
- describe "with a failing after hook" do
141
+ describe 'with a failing after hook' do
141
142
  define_feature <<-FEATURE
142
143
  Feature:
143
144
  Scenario:
@@ -146,12 +147,12 @@ module Cucumber
146
147
 
147
148
  define_steps do
148
149
  After do
149
- fail "hook failed"
150
+ fail 'hook failed'
150
151
  end
151
152
  Given(/^this step passes$/) {}
152
153
  end
153
154
 
154
- it "the failing hook generate output" do
155
+ it 'the failing hook generate output' do
155
156
  lines = <<-OUTPUT
156
157
  .F
157
158
  1 scenario (1 failed)
@@ -1,90 +1,96 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/formatter/rerun'
2
3
  require 'cucumber/core'
3
4
  require 'cucumber/core/gherkin/writer'
4
5
  require 'cucumber/core/filter'
5
6
  require 'support/standard_step_actions'
6
-
7
- module Cucumber::Formatter
8
- describe Rerun do
9
- include Cucumber::Core::Gherkin::Writer
10
- include Cucumber::Core
11
-
12
- # after_test_case
13
- context 'when 2 scenarios fail in the same file' do
14
- it 'Prints the locations of the failed scenarios' do
15
- gherkin = gherkin('foo.feature') do
16
- feature do
17
- scenario do
18
- step 'failing'
19
- end
20
-
21
- scenario do
22
- step 'failing'
23
- end
24
-
25
- scenario do
26
- step 'passing'
7
+ require 'cucumber/configuration'
8
+
9
+ module Cucumber
10
+ module Formatter
11
+ describe Rerun do
12
+ include Cucumber::Core::Gherkin::Writer
13
+ include Cucumber::Core
14
+
15
+ let(:config) { Cucumber::Configuration.new(out_stream: io) }
16
+ let(:io) { StringIO.new }
17
+
18
+ # after_test_case
19
+ context 'when 2 scenarios fail in the same file' do
20
+ it 'Prints the locations of the failed scenarios' do
21
+ gherkin = gherkin('foo.feature') do
22
+ feature do
23
+ scenario do
24
+ step 'failing'
25
+ end
26
+
27
+ scenario do
28
+ step 'failing'
29
+ end
30
+
31
+ scenario do
32
+ step 'passing'
33
+ end
27
34
  end
28
35
  end
29
- end
30
- io = StringIO.new
31
- report = Rerun.new(double, io, {})
32
-
33
- execute [gherkin], report, [StandardStepActions.new]
36
+ Rerun.new(config)
37
+ execute [gherkin], [StandardStepActions.new], config.event_bus
38
+ config.event_bus.test_run_finished
34
39
 
35
- expect( io.string ).to eq 'foo.feature:3:6'
40
+ expect( io.string ).to eq 'foo.feature:3:6'
41
+ end
36
42
  end
37
- end
38
43
 
39
- context 'with failures in multiple files' do
40
- it 'prints the location of the failed scenarios in each file' do
41
- foo = gherkin('foo.feature') do
42
- feature do
43
- scenario do
44
- step 'failing'
45
- end
46
-
47
- scenario do
48
- step 'failing'
49
- end
50
-
51
- scenario do
52
- step 'passing'
44
+ context 'with failures in multiple files' do
45
+ it 'prints the location of the failed scenarios in each file' do
46
+ foo = gherkin('foo.feature') do
47
+ feature do
48
+ scenario do
49
+ step 'failing'
50
+ end
51
+
52
+ scenario do
53
+ step 'failing'
54
+ end
55
+
56
+ scenario do
57
+ step 'passing'
58
+ end
53
59
  end
54
60
  end
55
- end
56
61
 
57
- bar = gherkin('bar.feature') do
58
- feature do
59
- scenario do
60
- step 'failing'
62
+ bar = gherkin('bar.feature') do
63
+ feature do
64
+ scenario do
65
+ step 'failing'
66
+ end
61
67
  end
62
68
  end
63
- end
64
69
 
65
- io = StringIO.new
66
- report = Rerun.new(double, io, {})
70
+ Rerun.new(config)
71
+ execute [foo, bar], [StandardStepActions.new], config.event_bus
72
+ config.event_bus.test_run_finished
67
73
 
68
- execute [foo, bar], report, [StandardStepActions.new]
69
-
70
- expect(io.string).to eq 'foo.feature:3:6 bar.feature:3'
74
+ expect(io.string).to eq 'foo.feature:3:6\nbar.feature:3'
75
+ end
71
76
  end
72
- end
73
77
 
74
- context 'when there are no failing scenarios' do
75
- it 'prints nothing' do
76
- gherkin = gherkin('foo.feature') do
77
- feature do
78
- scenario do
79
- step 'passing'
78
+ context 'when there are no failing scenarios' do
79
+ it 'prints nothing' do
80
+ gherkin = gherkin('foo.feature') do
81
+ feature do
82
+ scenario do
83
+ step 'passing'
84
+ end
80
85
  end
81
86
  end
82
- end
83
87
 
84
- io = StringIO.new
85
- report = Rerun.new(double, io, {})
88
+ Rerun.new(config)
89
+ execute [gherkin], [StandardStepActions.new], config.event_bus
90
+ config.event_bus.test_run_finished
86
91
 
87
- execute [gherkin], report, [StandardStepActions.new]
92
+ expect(io.string).to eq ''
93
+ end
88
94
  end
89
95
  end
90
96
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Cucumber
2
3
  module Formatter
3
4
  module SpecHelperDsl
@@ -21,10 +22,10 @@ module Cucumber
21
22
  define_steps
22
23
  actual_runtime.visitor = report
23
24
 
24
- receiver = Test::Runner.new(report)
25
+ receiver = Test::Runner.new(event_bus)
25
26
  filters = [
26
27
  Filters::ActivateSteps.new(
27
- StepMatchSearch.new(actual_runtime.support_code.ruby.method(:step_matches), actual_runtime.configuration),
28
+ StepMatchSearch.new(actual_runtime.support_code.registry.method(:step_matches), actual_runtime.configuration),
28
29
  actual_runtime.configuration
29
30
  ),
30
31
  Filters::ApplyAfterStepHooks.new(actual_runtime.support_code),
@@ -34,17 +35,13 @@ module Cucumber
34
35
  Filters::PrepareWorld.new(actual_runtime)
35
36
  ]
36
37
  compile [gherkin_doc], receiver, filters
37
- end
38
-
39
- require 'cucumber/formatter/event_bus_report'
40
- def event_bus_report
41
- @event_bus_report ||= Formatter::EventBusReport.new(actual_runtime.configuration)
38
+ event_bus.test_run_finished
42
39
  end
43
40
 
44
41
  require 'cucumber/formatter/legacy_api/adapter'
45
42
  def report
46
43
  @report ||= LegacyApi::Adapter.new(
47
- Fanout.new([@formatter, event_bus_report]),
44
+ Fanout.new([@formatter]),
48
45
  actual_runtime.results,
49
46
  actual_runtime.configuration)
50
47
  end
@@ -55,7 +52,7 @@ module Cucumber
55
52
  end
56
53
 
57
54
  def gherkin
58
- self.class.feature_content || raise("No feature content defined!")
55
+ self.class.feature_content || raise('No feature content defined!')
59
56
  end
60
57
 
61
58
  def runtime
@@ -66,11 +63,16 @@ module Cucumber
66
63
  @runtime ||= Runtime.new(options)
67
64
  end
68
65
 
66
+ def event_bus
67
+ actual_runtime.configuration.event_bus
68
+ end
69
+
69
70
  def define_steps
70
- return unless step_defs = self.class.step_defs
71
- rb = runtime.support_code.ruby
71
+ step_defs = self.class.step_defs
72
+
73
+ return unless step_defs
72
74
  dsl = Object.new
73
- dsl.extend RbSupport::RbDsl
75
+ dsl.extend Glue::Dsl
74
76
  dsl.instance_exec &step_defs
75
77
  end
76
78
 
@@ -1,14 +1,30 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'cucumber/formatter/spec_helper'
3
4
  require 'cucumber/formatter/pretty'
4
5
 
5
6
  module Cucumber
6
- module RbSupport
7
- describe RbWorld do
8
- extend Cucumber::Formatter::SpecHelperDsl
9
- include Cucumber::Formatter::SpecHelper
7
+ module Glue
8
+ describe ProtoWorld do
9
+
10
+ let(:runtime) { double('runtime') }
11
+ let(:language) { double('language') }
12
+ let(:world) { Object.new.extend(ProtoWorld.for(runtime, language)) }
13
+
14
+ describe '#table' do
15
+ it 'produces Ast::Table by #table' do
16
+ expect(world.table(%{
17
+ | account | description | amount |
18
+ | INT-100 | Taxi | 114 |
19
+ | CUC-101 | Peeler | 22 |
20
+ })).to be_kind_of(MultilineArgument::DataTable)
21
+ end
22
+ end
10
23
 
11
24
  describe 'Handling puts in step definitions' do
25
+ extend Cucumber::Formatter::SpecHelperDsl
26
+ include Cucumber::Formatter::SpecHelper
27
+
12
28
  before(:each) do
13
29
  Cucumber::Term::ANSIColor.coloring = false
14
30
  @out = StringIO.new
@@ -26,7 +42,7 @@ module Cucumber
26
42
 
27
43
  define_steps do
28
44
  When(/^puts is called twice for the same variable$/) do
29
- foo = 'a'
45
+ foo = String.new('a')
30
46
  puts foo
31
47
  foo.upcase!
32
48
  puts foo
@@ -34,7 +50,7 @@ module Cucumber
34
50
  end
35
51
 
36
52
  it 'prints the variable value at the time puts was called' do
37
- expect( @out.string ).to include <<OUTPUT
53
+ expect(@out.string).to include <<OUTPUT
38
54
  When puts is called twice for the same variable
39
55
  a
40
56
  A
@@ -0,0 +1,213 @@
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(:registry) { support_code.registry }
10
+ let(:support_code) do
11
+ Cucumber::Runtime::SupportCode.new(user_interface)
12
+ end
13
+ let(:dsl) do
14
+ registry
15
+ Object.new.extend(Glue::Dsl)
16
+ end
17
+
18
+ describe '#load_code_file' do
19
+ after do
20
+ FileUtils.rm_rf('tmp.rb')
21
+ FileUtils.rm_rf('docs.md')
22
+ end
23
+
24
+ def a_file_called(name)
25
+ File.open(name, 'w') do |f|
26
+ f.puts yield
27
+ end
28
+ end
29
+
30
+ it 're-loads the file when called multiple times' do
31
+ a_file_called('tmp.rb') do
32
+ '$foo = 1'
33
+ end
34
+
35
+ registry.load_code_file('tmp.rb')
36
+ expect($foo).to eq 1
37
+
38
+ a_file_called('tmp.rb') do
39
+ '$foo = 2'
40
+ end
41
+
42
+ registry.load_code_file('tmp.rb')
43
+
44
+ expect($foo).to eq 2
45
+ end
46
+
47
+ it 'only loads ruby files' do
48
+ a_file_called('docs.md') do
49
+ 'yo'
50
+ end
51
+ registry.load_code_file('docs.md')
52
+ end
53
+ end
54
+
55
+ describe 'Handling the World' do
56
+ it 'raises an error if the world is nil' do
57
+ dsl.World {}
58
+
59
+ begin
60
+ registry.begin_scenario(nil)
61
+ raise 'Should fail'
62
+ rescue Glue::NilWorld => e
63
+ expect(e.message).to eq 'World procs should never return nil'
64
+ expect(e.backtrace.length).to eq 1
65
+ expect(e.backtrace[0]).to match(/spec\/cucumber\/glue\/registry_and_more_spec\.rb\:\d+\:in `World'/)
66
+ end
67
+ end
68
+
69
+ module ModuleOne
70
+ end
71
+
72
+ module ModuleTwo
73
+ end
74
+
75
+ class ClassOne
76
+ end
77
+
78
+ it 'implicitlys extend world with modules' do
79
+ dsl.World(ModuleOne, ModuleTwo)
80
+ registry.begin_scenario(double('scenario').as_null_object)
81
+ class << registry.current_world
82
+ extend RSpec::Matchers
83
+
84
+ expect(included_modules.inspect).to match(/ModuleOne/) # Workaround for RSpec/Ruby 1.9 issue with namespaces
85
+ expect(included_modules.inspect).to match(/ModuleTwo/)
86
+ end
87
+ expect(registry.current_world.class).to eq Object
88
+ end
89
+
90
+ it 'raises error when we try to register more than one World proc' do
91
+ expected_error = %{You can only pass a proc to #World once, but it's happening
92
+ in 2 places:
93
+
94
+ spec/cucumber/glue/registry_and_more_spec.rb:\\d+:in `World'
95
+ spec/cucumber/glue/registry_and_more_spec.rb:\\d+:in `World'
96
+
97
+ Use Ruby modules instead to extend your worlds. See the Cucumber::Glue::Dsl#World RDoc
98
+ or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.
99
+
100
+ }
101
+ dsl.World { Hash.new }
102
+
103
+ expect(-> {
104
+ dsl.World { Array.new }
105
+ }).to raise_error(Glue::MultipleWorld, /#{expected_error}/)
106
+ end
107
+ end
108
+
109
+ describe 'Handling namespaced World' do
110
+ module ModuleOne
111
+ def method_one
112
+ 1
113
+ end
114
+ end
115
+
116
+ module ModuleMinusOne
117
+ def method_one
118
+ -1
119
+ end
120
+ end
121
+
122
+ module ModuleTwo
123
+ def method_two
124
+ 2
125
+ end
126
+ end
127
+
128
+ module ModuleThree
129
+ def method_three
130
+ 3
131
+ end
132
+ end
133
+
134
+ it 'extends the world with namespaces' do
135
+ dsl.World(ModuleOne, module_two: ModuleTwo, module_three: ModuleThree)
136
+ registry.begin_scenario(double('scenario').as_null_object)
137
+ class << registry.current_world
138
+ extend RSpec::Matchers
139
+ expect(included_modules.inspect).to match(/ModuleOne/)
140
+ end
141
+ expect(registry.current_world.class).to eq Object
142
+ expect(registry.current_world).to respond_to(:method_one)
143
+
144
+ expect(registry.current_world.module_two.class).to eq Object
145
+ expect(registry.current_world.module_two).to respond_to(:method_two)
146
+
147
+ expect(registry.current_world.module_three.class).to eq Object
148
+ expect(registry.current_world.module_three).to respond_to(:method_three)
149
+ end
150
+
151
+ it 'allows to inspect the included modules' do
152
+ dsl.World(ModuleOne, module_two: ModuleTwo, module_three: ModuleThree)
153
+ registry.begin_scenario(double('scenario').as_null_object)
154
+ class << registry.current_world
155
+ extend RSpec::Matchers
156
+ end
157
+ expect(registry.current_world.inspect).to match(/ModuleOne/)
158
+ expect(registry.current_world.inspect).to include('ModuleTwo (as module_two)')
159
+ expect(registry.current_world.inspect).to include('ModuleThree (as module_three)')
160
+ end
161
+
162
+ it 'merges methods when assigning different modules to the same namespace' do
163
+ dsl.World(namespace: ModuleOne)
164
+ dsl.World(namespace: ModuleTwo)
165
+ registry.begin_scenario(double('scenario').as_null_object)
166
+ class << registry.current_world
167
+ extend RSpec::Matchers
168
+ end
169
+ expect(registry.current_world.namespace).to respond_to(:method_one)
170
+ expect(registry.current_world.namespace).to respond_to(:method_two)
171
+ end
172
+
173
+ it 'resolves conflicts when assigning different modules to the same namespace' do
174
+ dsl.World(namespace: ModuleOne)
175
+ dsl.World(namespace: ModuleMinusOne)
176
+ registry.begin_scenario(double('scenario').as_null_object)
177
+ class << registry.current_world
178
+ extend RSpec::Matchers
179
+ end
180
+ expect(registry.current_world.namespace).to respond_to(:method_one)
181
+ expect(registry.current_world.namespace.method_one).to eql(-1)
182
+ end
183
+ end
184
+
185
+ describe 'hooks' do
186
+ it 'finds before hooks' do
187
+ fish = dsl.Before('@fish'){}
188
+ meat = dsl.Before('@meat'){}
189
+
190
+ scenario = double('Scenario')
191
+
192
+ expect(scenario).to receive(:accept_hook?).with(fish) { true }
193
+ expect(scenario).to receive(:accept_hook?).with(meat) { false }
194
+ expect(registry.hooks_for(:before, scenario)).to eq [fish]
195
+ end
196
+
197
+ it 'finds around hooks' do
198
+ a = dsl.Around do |scenario, block|
199
+ end
200
+
201
+ b = dsl.Around('@tag') do |scenario, block|
202
+ end
203
+
204
+ scenario = double('Scenario')
205
+
206
+ expect(scenario).to receive(:accept_hook?).with(a) { true }
207
+ expect(scenario).to receive(:accept_hook?).with(b) { false }
208
+ expect(registry.hooks_for(:around, scenario)).to eq [a]
209
+ end
210
+ end
211
+ end
212
+ end
213
+ end