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,26 +1,27 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  module Cucumber
4
5
  describe Configuration do
5
- describe ".default" do
6
+ describe '.default' do
6
7
  subject { Configuration.default }
7
8
 
8
- it "has an autoload_code_paths containing the standard support and step_definitions folders" do
9
+ it 'has an autoload_code_paths containing the standard support and step_definitions folders' do
9
10
  expect(subject.autoload_code_paths).to include('features/support')
10
11
  expect(subject.autoload_code_paths).to include('features/step_definitions')
11
12
  end
12
13
  end
13
14
 
14
- describe "with custom user options" do
15
+ describe 'with custom user options' do
15
16
  let(:user_options) { { :autoload_code_paths => ['foo/bar/baz'] } }
16
17
  subject { Configuration.new(user_options) }
17
18
 
18
- it "allows you to override the defaults" do
19
+ it 'allows you to override the defaults' do
19
20
  expect(subject.autoload_code_paths).to eq ['foo/bar/baz']
20
21
  end
21
22
  end
22
23
 
23
- context "selecting files to load" do
24
+ context 'selecting files to load' do
24
25
 
25
26
  def given_the_following_files(*files)
26
27
  allow(File).to receive(:directory?) { true }
@@ -28,114 +29,114 @@ module Cucumber
28
29
  allow(Dir).to receive(:[]) { files }
29
30
  end
30
31
 
31
- it "requires env.rb files first" do
32
+ it 'requires env.rb files first' do
32
33
  configuration = Configuration.new
33
- given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
34
+ given_the_following_files('/features/support/a_file.rb','/features/support/env.rb')
34
35
 
35
36
  expect(configuration.support_to_load).to eq [
36
- "/features/support/env.rb",
37
- "/features/support/a_file.rb"
37
+ '/features/support/env.rb',
38
+ '/features/support/a_file.rb'
38
39
  ]
39
40
  end
40
41
 
41
- it "does not require env.rb files when dry run" do
42
+ it 'does not require env.rb files when dry run' do
42
43
  configuration = Configuration.new(dry_run: true)
43
- given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
44
+ given_the_following_files('/features/support/a_file.rb','/features/support/env.rb')
44
45
 
45
46
  expect(configuration.support_to_load).to eq [
46
- "/features/support/a_file.rb"
47
+ '/features/support/a_file.rb'
47
48
  ]
48
49
  end
49
50
 
50
- it "requires step defs in vendor/{plugins,gems}/*/cucumber/*.rb" do
51
- given_the_following_files("/vendor/gems/gem_a/cucumber/bar.rb",
52
- "/vendor/plugins/plugin_a/cucumber/foo.rb")
51
+ it 'requires step defs in vendor/{plugins,gems}/*/cucumber/*.rb' do
52
+ given_the_following_files('/vendor/gems/gem_a/cucumber/bar.rb',
53
+ '/vendor/plugins/plugin_a/cucumber/foo.rb')
53
54
 
54
55
  configuration = Configuration.new
55
56
 
56
57
  expect(configuration.step_defs_to_load).to eq [
57
- "/vendor/gems/gem_a/cucumber/bar.rb",
58
- "/vendor/plugins/plugin_a/cucumber/foo.rb"
58
+ '/vendor/gems/gem_a/cucumber/bar.rb',
59
+ '/vendor/plugins/plugin_a/cucumber/foo.rb'
59
60
  ]
60
61
  end
61
62
 
62
- describe "--exclude" do
63
+ describe '--exclude' do
63
64
 
64
- it "excludes a ruby file from requiring when the name matches exactly" do
65
- given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
65
+ it 'excludes a ruby file from requiring when the name matches exactly' do
66
+ given_the_following_files('/features/support/a_file.rb','/features/support/env.rb')
66
67
 
67
68
  configuration = Configuration.new(excludes: [/a_file.rb/])
68
69
 
69
70
  expect(configuration.all_files_to_load).to eq [
70
- "/features/support/env.rb"
71
+ '/features/support/env.rb'
71
72
  ]
72
73
  end
73
74
 
74
- it "excludes all ruby files that match the provided patterns from requiring" do
75
- given_the_following_files("/features/support/foof.rb","/features/support/bar.rb",
76
- "/features/support/food.rb","/features/blah.rb",
77
- "/features/support/fooz.rb")
75
+ it 'excludes all ruby files that match the provided patterns from requiring' do
76
+ given_the_following_files('/features/support/foof.rb','/features/support/bar.rb',
77
+ '/features/support/food.rb','/features/blah.rb',
78
+ '/features/support/fooz.rb')
78
79
 
79
80
  configuration = Configuration.new(excludes: [/foo[df]/, /blah/])
80
81
 
81
82
  expect(configuration.all_files_to_load).to eq [
82
- "/features/support/bar.rb",
83
- "/features/support/fooz.rb"
83
+ '/features/support/bar.rb',
84
+ '/features/support/fooz.rb'
84
85
  ]
85
86
  end
86
87
  end
87
88
 
88
89
  end
89
90
 
90
- context "selecting feature files" do
91
+ context 'selecting feature files' do
91
92
 
92
- it "preserves the order of the feature files" do
93
+ it 'preserves the order of the feature files' do
93
94
  configuration = Configuration.new(paths: %w{b.feature c.feature a.feature})
94
95
 
95
- expect(configuration.feature_files).to eq ["b.feature", "c.feature", "a.feature"]
96
+ expect(configuration.feature_files).to eq ['b.feature', 'c.feature', 'a.feature']
96
97
  end
97
98
 
98
- it "searchs for all features in the specified directory" do
99
+ it 'searchs for all features in the specified directory' do
99
100
  allow(File).to receive(:directory?) { true }
100
- allow(Dir).to receive(:[]).with("feature_directory/**/*.feature") { ["cucumber.feature"] }
101
+ allow(Dir).to receive(:[]).with('feature_directory/**/*.feature') { ['cucumber.feature'] }
101
102
 
102
103
  configuration = Configuration.new(paths: %w{feature_directory/})
103
104
 
104
- expect(configuration.feature_files).to eq ["cucumber.feature"]
105
+ expect(configuration.feature_files).to eq ['cucumber.feature']
105
106
  end
106
107
 
107
- it "defaults to the features directory when no feature file are provided" do
108
+ it 'defaults to the features directory when no feature file are provided' do
108
109
  allow(File).to receive(:directory?) { true }
109
- allow(Dir).to receive(:[]).with("features/**/*.feature") { ["cucumber.feature"] }
110
+ allow(Dir).to receive(:[]).with('features/**/*.feature') { ['cucumber.feature'] }
110
111
 
111
112
  configuration = Configuration.new(paths: [])
112
113
 
113
- expect(configuration.feature_files).to eq ["cucumber.feature"]
114
+ expect(configuration.feature_files).to eq ['cucumber.feature']
114
115
  end
115
116
 
116
- it "gets the feature files from the rerun file" do
117
+ it 'gets the feature files from the rerun file' do
117
118
  allow(File).to receive(:directory?).and_return(false)
118
119
  allow(File).to receive(:file?).and_return(true)
119
120
  allow(IO).to receive(:read).and_return(
120
121
  "cucumber.feature:1:3\ncucumber.feature:5 cucumber.feature:10\n"\
121
122
  "domain folder/different cuke.feature:134 domain folder/cuke.feature:1\n"\
122
- "domain folder/different cuke.feature:4:5 bar.feature")
123
+ 'domain folder/different cuke.feature:4:5 bar.feature')
123
124
 
124
125
  configuration = Configuration.new(paths: %w{@rerun.txt})
125
126
 
126
127
  expect(configuration.feature_files).to eq [
127
- "cucumber.feature:1:3",
128
- "cucumber.feature:5",
129
- "cucumber.feature:10",
130
- "domain folder/different cuke.feature:134",
131
- "domain folder/cuke.feature:1",
132
- "domain folder/different cuke.feature:4:5",
133
- "bar.feature"]
128
+ 'cucumber.feature:1:3',
129
+ 'cucumber.feature:5',
130
+ 'cucumber.feature:10',
131
+ 'domain folder/different cuke.feature:134',
132
+ 'domain folder/cuke.feature:1',
133
+ 'domain folder/different cuke.feature:4:5',
134
+ 'bar.feature']
134
135
  end
135
136
  end
136
137
 
137
- describe "#with_options" do
138
- it "returns a copy of the configuration with new options" do
138
+ describe '#with_options' do
139
+ it 'returns a copy of the configuration with new options' do
139
140
  old_out_stream = double('Old out_stream')
140
141
  new_out_stream = double('New out_stream')
141
142
  config = Configuration.new(out_stream: old_out_stream).with_options(out_stream: new_out_stream)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  module Html end
@@ -6,13 +7,13 @@ module Cucumber
6
7
  describe Constantize do
7
8
  include Constantize
8
9
 
9
- it "loads html formatter" do
10
+ it 'loads html formatter' do
10
11
  clazz = constantize('Cucumber::Formatter::Html')
11
12
 
12
13
  expect(clazz.name).to eq 'Cucumber::Formatter::Html'
13
14
  end
14
15
 
15
- it "fails to load a made up class" do
16
+ it 'fails to load a made up class' do
16
17
  expect { constantize('My::MadeUp::ClassName') }.to raise_error(LoadError)
17
18
  end
18
19
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cucumber
4
+ describe Events do
5
+ it 'builds a registry without failing' do
6
+ expect { described_class.registry }.not_to raise_error
7
+ end
8
+ end
9
+ end
@@ -1,58 +1,59 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/file_specs'
2
3
 
3
4
  module Cucumber
4
5
  describe FileSpecs do
5
- let(:file_specs) { FileSpecs.new(["features/foo.feature:1:2:3", "features/bar.feature:4:5:6"]) }
6
+ let(:file_specs) { FileSpecs.new(['features/foo.feature:1:2:3', 'features/bar.feature:4:5:6']) }
6
7
  let(:locations) { file_specs.locations }
7
8
  let(:files) { file_specs.files }
8
9
 
9
- it "parses locations from multiple files" do
10
+ it 'parses locations from multiple files' do
10
11
  expect(locations.length).to eq 6
11
12
  expect(locations).to eq [
12
- Cucumber::Core::Ast::Location.new("features/foo.feature", 1),
13
- Cucumber::Core::Ast::Location.new("features/foo.feature", 2),
14
- Cucumber::Core::Ast::Location.new("features/foo.feature", 3),
15
- Cucumber::Core::Ast::Location.new("features/bar.feature", 4),
16
- Cucumber::Core::Ast::Location.new("features/bar.feature", 5),
17
- Cucumber::Core::Ast::Location.new("features/bar.feature", 6),
13
+ Cucumber::Core::Ast::Location.new('features/foo.feature', 1),
14
+ Cucumber::Core::Ast::Location.new('features/foo.feature', 2),
15
+ Cucumber::Core::Ast::Location.new('features/foo.feature', 3),
16
+ Cucumber::Core::Ast::Location.new('features/bar.feature', 4),
17
+ Cucumber::Core::Ast::Location.new('features/bar.feature', 5),
18
+ Cucumber::Core::Ast::Location.new('features/bar.feature', 6)
18
19
  ]
19
20
  end
20
21
 
21
- it "parses file names from multiple file specs" do
22
+ it 'parses file names from multiple file specs' do
22
23
  expect(files.length).to eq 2
23
24
  expect(files).to eq [
24
- "features/foo.feature",
25
- "features/bar.feature",
25
+ 'features/foo.feature',
26
+ 'features/bar.feature'
26
27
  ]
27
28
  end
28
29
 
29
- context "when files are not unique" do
30
- let(:file_specs) { FileSpecs.new(["features/foo.feature:4", "features/foo.feature:34"]) }
30
+ context 'when files are not unique' do
31
+ let(:file_specs) { FileSpecs.new(['features/foo.feature:4', 'features/foo.feature:34']) }
31
32
 
32
- it "parses unique file names" do
33
+ it 'parses unique file names' do
33
34
  expect(files.length).to eq 1
34
- expect(files).to eq ["features/foo.feature"]
35
+ expect(files).to eq ['features/foo.feature']
35
36
  end
36
37
  end
37
38
 
38
- context "when no line number is specified" do
39
- let(:file_specs) { FileSpecs.new(["features/foo.feature", "features/bar.feature:34"]) }
39
+ context 'when no line number is specified' do
40
+ let(:file_specs) { FileSpecs.new(['features/foo.feature', 'features/bar.feature:34']) }
40
41
 
41
- it "returns a wildcard location for that file" do
42
+ it 'returns a wildcard location for that file' do
42
43
  expect(locations).to eq [
43
- Cucumber::Core::Ast::Location.new("features/foo.feature"),
44
- Cucumber::Core::Ast::Location.new("features/bar.feature", 34),
44
+ Cucumber::Core::Ast::Location.new('features/foo.feature'),
45
+ Cucumber::Core::Ast::Location.new('features/bar.feature', 34)
45
46
  ]
46
47
  end
47
48
  end
48
49
 
49
- context "when the same file is referenced more than once" do
50
- let(:file_specs) { FileSpecs.new(["features/foo.feature:10", "features/foo.feature:1"]) }
50
+ context 'when the same file is referenced more than once' do
51
+ let(:file_specs) { FileSpecs.new(['features/foo.feature:10', 'features/foo.feature:1']) }
51
52
 
52
- it "returns locations in the order specified" do
53
+ it 'returns locations in the order specified' do
53
54
  expect(locations).to eq [
54
- Cucumber::Core::Ast::Location.new("features/foo.feature", 10),
55
- Cucumber::Core::Ast::Location.new("features/foo.feature", 1),
55
+ Cucumber::Core::Ast::Location.new('features/foo.feature', 10),
56
+ Cucumber::Core::Ast::Location.new('features/foo.feature', 1)
56
57
  ]
57
58
  end
58
59
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber/filters/activate_steps'
2
3
  require 'cucumber/core/gherkin/writer'
3
4
  require 'cucumber/core'
@@ -13,7 +14,7 @@ describe Cucumber::Filters::ActivateSteps do
13
14
  let(:step_match_search) { Proc.new { [step_match] } }
14
15
  let(:configuration) { double(dry_run?: false, notify: nil) }
15
16
 
16
- context "a scenario with a single step" do
17
+ context 'a scenario with a single step' do
17
18
  let(:doc) do
18
19
  gherkin do
19
20
  feature do
@@ -24,23 +25,24 @@ describe Cucumber::Filters::ActivateSteps do
24
25
  end
25
26
  end
26
27
 
27
- it "activates each step" do
28
+ it 'activates each step' do
28
29
  expect(step_match).to receive(:activate) do |test_step|
29
- expect(test_step.name).to eq 'a passing step'
30
+ expect(test_step.text).to eq 'a passing step'
30
31
  end
31
32
  compile [doc], receiver, [filter]
32
33
  end
33
34
 
34
- it "notifies with a StepMatch event" do
35
- expect(configuration).to receive(:notify) do |event|
36
- expect(event.test_step.name).to eq 'a passing step'
37
- expect(event.step_match).to eq step_match
35
+ it 'notifies with a StepActivated event' do
36
+ expect(configuration).to receive(:notify) do |message, test_step, step_match|
37
+ expect(message).to eq :step_activated
38
+ expect(test_step.text).to eq 'a passing step'
39
+ expect(step_match).to eq step_match
38
40
  end
39
41
  compile [doc], receiver, [filter]
40
42
  end
41
43
  end
42
44
 
43
- context "a scenario outline" do
45
+ context 'a scenario outline' do
44
46
  let(:doc) do
45
47
  gherkin do
46
48
  feature do
@@ -56,15 +58,15 @@ describe Cucumber::Filters::ActivateSteps do
56
58
  end
57
59
  end
58
60
 
59
- it "activates each step" do
61
+ it 'activates each step' do
60
62
  expect(step_match).to receive(:activate) do |test_step|
61
- expect(test_step.name).to eq 'a passing step'
63
+ expect(test_step.text).to eq 'a passing step'
62
64
  end
63
65
  compile [doc], receiver, [filter]
64
66
  end
65
67
  end
66
68
 
67
- context "undefined step" do
69
+ context 'undefined step' do
68
70
  let(:step_match_search) { Proc.new { [] } }
69
71
 
70
72
  let(:doc) do
@@ -77,20 +79,20 @@ describe Cucumber::Filters::ActivateSteps do
77
79
  end
78
80
  end
79
81
 
80
- it "does not activate the step" do
82
+ it 'does not activate the step' do
81
83
  expect(receiver).to receive(:test_case) do |test_case|
82
84
  expect(test_case.test_steps[0].execute).to be_undefined
83
85
  end
84
86
  compile [doc], receiver, [filter]
85
87
  end
86
88
 
87
- it "does not notify" do
89
+ it 'does not notify' do
88
90
  expect(configuration).not_to receive(:notify)
89
91
  compile [doc], receiver, [filter]
90
92
  end
91
93
  end
92
94
 
93
- context "dry run" do
95
+ context 'dry run' do
94
96
  let(:configuration) { double(dry_run?: true, notify: nil) }
95
97
 
96
98
  let(:doc) do
@@ -103,23 +105,24 @@ describe Cucumber::Filters::ActivateSteps do
103
105
  end
104
106
  end
105
107
 
106
- it "activates each step with a skipping action" do
108
+ it 'activates each step with a skipping action' do
107
109
  expect(receiver).to receive(:test_case) do |test_case|
108
110
  expect(test_case.test_steps[0].execute).to be_skipped
109
111
  end
110
112
  compile [doc], receiver, [filter]
111
113
  end
112
114
 
113
- it "notifies with a StepMatch event" do
114
- expect(configuration).to receive(:notify) do |event|
115
- expect(event.test_step.name).to eq 'a passing step'
116
- expect(event.step_match).to eq step_match
115
+ it 'notifies with a StepActivated event' do
116
+ expect(configuration).to receive(:notify) do |message, test_step, step_match|
117
+ expect(message).to eq :step_activated
118
+ expect(test_step.text).to eq 'a passing step'
119
+ expect(step_match).to eq step_match
117
120
  end
118
121
  compile [doc], receiver, [filter]
119
122
  end
120
123
  end
121
124
 
122
- context "undefined step in a dry run" do
125
+ context 'undefined step in a dry run' do
123
126
  let(:step_match_search) { Proc.new { [] } }
124
127
  let(:configuration) { double(dry_run?: true, notify: nil) }
125
128
 
@@ -133,14 +136,14 @@ describe Cucumber::Filters::ActivateSteps do
133
136
  end
134
137
  end
135
138
 
136
- it "does not activate the step" do
139
+ it 'does not activate the step' do
137
140
  expect(receiver).to receive(:test_case) do |test_case|
138
141
  expect(test_case.test_steps[0].execute).to be_undefined
139
142
  end
140
143
  compile [doc], receiver, [filter]
141
144
  end
142
145
 
143
- it "does not notify" do
146
+ it 'does not notify' do
144
147
  expect(configuration).not_to receive(:notify)
145
148
  compile [doc], receiver, [filter]
146
149
  end
@@ -1,4 +1,5 @@
1
- require "cucumber/filters/gated_receiver"
1
+ # frozen_string_literal: true
2
+ require 'cucumber/filters/gated_receiver'
2
3
 
3
4
  describe Cucumber::Filters::GatedReceiver do
4
5
  subject(:gated_receiver) { Cucumber::Filters::GatedReceiver.new(receiver) }
@@ -6,8 +7,8 @@ describe Cucumber::Filters::GatedReceiver do
6
7
  let(:receiver) { double(:receiver) }
7
8
  let(:test_cases){ [double(:test_case), double(:test_case)] }
8
9
 
9
- describe "#test_case" do
10
- it "does not immediately describe the test case to the receiver" do
10
+ describe '#test_case' do
11
+ it 'does not immediately describe the test case to the receiver' do
11
12
  test_cases.each do |test_case|
12
13
  expect(test_case).to_not receive(:describe_to).with(receiver)
13
14
  end
@@ -18,7 +19,7 @@ describe Cucumber::Filters::GatedReceiver do
18
19
  end
19
20
  end
20
21
 
21
- describe "#done" do
22
+ describe '#done' do
22
23
  before do
23
24
  test_cases.each do |test_case|
24
25
  gated_receiver.test_case(test_case)
@@ -31,7 +32,7 @@ describe Cucumber::Filters::GatedReceiver do
31
32
  allow(receiver).to receive(:done)
32
33
  end
33
34
 
34
- it "describes all test cases to the receiver" do
35
+ it 'describes all test cases to the receiver' do
35
36
  test_cases.each do |test_case|
36
37
  expect(test_case).to receive(:describe_to).with(receiver)
37
38
  end
@@ -39,7 +40,7 @@ describe Cucumber::Filters::GatedReceiver do
39
40
  gated_receiver.done
40
41
  end
41
42
 
42
- it "calls done on the receiver" do
43
+ it 'calls done on the receiver' do
43
44
  expect(receiver).to receive(:done)
44
45
  gated_receiver.done
45
46
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'cucumber'
2
3
  require 'cucumber/filters/retry'
3
4
  require 'cucumber/core/gherkin/writer'
@@ -22,54 +23,72 @@ describe Cucumber::Filters::Retry do
22
23
  it { is_expected.to respond_to(:with_receiver) }
23
24
  it { is_expected.to respond_to(:done) }
24
25
 
25
- context "general" do
26
- before(:each) do
27
- filter.with_receiver(receiver)
28
- end
26
+ context 'passing test case' do
27
+ let(:result) { Cucumber::Core::Test::Result::Passed.new(0) }
29
28
 
30
- it "registers the :after_test_case event" do
31
- expect(configuration).to receive(:on_event).with(:after_test_case)
32
- filter.test_case(test_case)
29
+ it 'describes the test case once' do
30
+ expect(receiver).to receive(:test_case).with(test_case).once
31
+ test_case.describe_to filter
32
+ configuration.notify :test_case_finished, test_case, result
33
33
  end
34
34
  end
35
35
 
36
- context "passing test case" do
37
- it "describes the test case once" do
38
- expect(test_case).to receive(:describe_to).with(receiver)
36
+ context 'when performing retry' do
37
+ let(:result) { Cucumber::Core::Test::Result::Failed.new(0, StandardError.new) }
38
+
39
+ it 'describes the same test case object each time' do
40
+ allow(receiver).to receive(:test_case) {|tc|
41
+ expect(tc).to equal(test_case)
42
+ configuration.notify :test_case_finished, tc.with_steps(tc.test_steps), result
43
+ }
44
+
39
45
  filter.test_case(test_case)
40
- configuration.notify(pass)
41
46
  end
42
47
  end
43
48
 
44
- context "failing test case" do
45
- it "describes the test case the specified number of times" do
49
+ context 'consistently failing test case' do
50
+ let(:result) { Cucumber::Core::Test::Result::Failed.new(0, StandardError.new) }
51
+
52
+ it 'describes the test case the specified number of times' do
46
53
  expect(receiver).to receive(:test_case) {|test_case|
47
- configuration.notify(fail)
54
+ configuration.notify :test_case_finished, test_case, result
48
55
  }.exactly(3).times
49
56
 
50
57
  filter.test_case(test_case)
51
58
  end
52
59
  end
53
60
 
54
- context "flaky test cases" do
61
+ context 'flaky test cases' do
62
+
63
+ context 'a little flaky' do
64
+ let(:results) {
65
+ [
66
+ Cucumber::Core::Test::Result::Failed.new(0, StandardError.new),
67
+ Cucumber::Core::Test::Result::Passed.new(0)
68
+ ]
69
+ }
55
70
 
56
- context "a little flaky" do
57
- it "describes the test case twice" do
58
- results = [fail, pass]
71
+ it 'describes the test case twice' do
59
72
  expect(receiver).to receive(:test_case) {|test_case|
60
- configuration.notify(results.shift)
73
+ configuration.notify :test_case_finished, test_case, results.shift
61
74
  }.exactly(2).times
62
75
 
63
76
  filter.test_case(test_case)
64
77
  end
65
78
  end
66
79
 
67
- context "really flaky" do
68
- it "describes the test case 3 times" do
69
- results = [fail, fail, pass]
80
+ context 'really flaky' do
81
+ let(:results) {
82
+ [
83
+ Cucumber::Core::Test::Result::Failed.new(0, StandardError.new),
84
+ Cucumber::Core::Test::Result::Failed.new(0, StandardError.new),
85
+ Cucumber::Core::Test::Result::Passed.new(0)
86
+ ]
87
+ }
70
88
 
89
+ it 'describes the test case 3 times' do
71
90
  expect(receiver).to receive(:test_case) {|test_case|
72
- configuration.notify(results.shift)
91
+ configuration.notify :test_case_finished, test_case, results.shift
73
92
  }.exactly(3).times
74
93
 
75
94
  filter.test_case(test_case)
@@ -1,4 +1,5 @@
1
- require "cucumber/filters/tag_limits"
1
+ # frozen_string_literal: true
2
+ require 'cucumber/filters/tag_limits'
2
3
 
3
4
  describe Cucumber::Filters::TagLimits::TestCaseIndex do
4
5
  subject(:index) { Cucumber::Filters::TagLimits::TestCaseIndex.new }
@@ -10,8 +11,8 @@ describe Cucumber::Filters::TagLimits::TestCaseIndex do
10
11
  ]
11
12
  end
12
13
 
13
- let(:tag_one) { double(:tag_one, name: "@one") }
14
- let(:tag_two) { double(:tag_two, name: "@two") }
14
+ let(:tag_one) { double(:tag_one, name: '@one') }
15
+ let(:tag_two) { double(:tag_two, name: '@two') }
15
16
 
16
17
  let(:a_location_of_tag_one) { double(:a_location_of_tag_one) }
17
18
  let(:a_location_of_tag_one_and_tag_two) { double(:a_location_of_tag_one_and_tag_two) }
@@ -22,17 +23,17 @@ describe Cucumber::Filters::TagLimits::TestCaseIndex do
22
23
  end
23
24
  end
24
25
 
25
- describe "#count_by_tag_name" do
26
- it "returns the number of test cases with the tag" do
27
- expect(index.count_by_tag_name("@one")).to eq(2)
28
- expect(index.count_by_tag_name("@two")).to eq(1)
26
+ describe '#count_by_tag_name' do
27
+ it 'returns the number of test cases with the tag' do
28
+ expect(index.count_by_tag_name('@one')).to eq(2)
29
+ expect(index.count_by_tag_name('@two')).to eq(1)
29
30
  end
30
31
  end
31
32
 
32
- describe "#locations_by_tag_name" do
33
- it "returns the locations of test cases with the tag" do
34
- expect(index.locations_of_tag_name("@one")).to eq([a_location_of_tag_one, a_location_of_tag_one_and_tag_two])
35
- expect(index.locations_of_tag_name("@two")).to eq([a_location_of_tag_one_and_tag_two])
33
+ describe '#locations_by_tag_name' do
34
+ it 'returns the locations of test cases with the tag' do
35
+ expect(index.locations_of_tag_name('@one')).to eq([a_location_of_tag_one, a_location_of_tag_one_and_tag_two])
36
+ expect(index.locations_of_tag_name('@two')).to eq([a_location_of_tag_one_and_tag_two])
36
37
  end
37
38
  end
38
39
  end