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,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'cucumber/formatter/spec_helper'
3
4
  require 'cucumber/formatter/html'
4
5
  require 'nokogiri'
5
- require 'cucumber/rb_support/rb_language'
6
+ require 'cucumber/glue/registry_and_more'
6
7
  require 'rspec/mocks'
7
8
 
8
9
  module Cucumber
@@ -23,22 +24,21 @@ module Cucumber
23
24
  @formatter = Html.new(runtime, @out, {})
24
25
  end
25
26
 
26
- it "does not raise an error when visiting a blank feature name" do
27
+ it 'does not raise an error when visiting a blank feature name' do
27
28
  expect(-> {
28
- @formatter.feature_name("Feature", "")
29
+ @formatter.feature_name('Feature', '')
29
30
  }).not_to raise_error
30
31
  end
31
32
 
32
- describe "when writing the report to a file" do
33
+ describe 'when writing the report to a file' do
33
34
  before(:each) do
34
- allow(@out).to receive(:respond_to?).with(:path, false).and_return(true)
35
35
  allow(@out).to receive(:respond_to?).with(:path).and_return(true)
36
36
  expect(@out).to receive(:path).and_return('out/file.html')
37
37
  run_defined_feature
38
38
  @doc = Nokogiri.HTML(@out.string)
39
39
  end
40
40
 
41
- describe "with a step that embeds a snapshot" do
41
+ describe 'with a step that embeds a snapshot' do
42
42
  define_steps do
43
43
  Given(/snap/) {
44
44
  RSpec::Mocks.allow_message(File, :file?) { true }
@@ -52,19 +52,19 @@ module Cucumber
52
52
  Given snap
53
53
  FEATURE
54
54
 
55
- it "converts the snapshot path to a relative path" do
56
- expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "snapshot.jpeg"
55
+ it 'converts the snapshot path to a relative path' do
56
+ expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq 'snapshot.jpeg'
57
57
  end
58
58
  end
59
59
  end
60
60
 
61
- describe "given a single feature" do
61
+ describe 'given a single feature' do
62
62
  before(:each) do
63
63
  run_defined_feature
64
64
  @doc = Nokogiri.HTML(@out.string)
65
65
  end
66
66
 
67
- describe "basic feature" do
67
+ describe 'basic feature' do
68
68
  define_feature <<-FEATURE
69
69
  Feature: Bananas
70
70
  In order to find my inner monkey
@@ -72,12 +72,12 @@ module Cucumber
72
72
  I must eat bananas
73
73
  FEATURE
74
74
 
75
- it "should output a main container div" do
75
+ it 'should output a main container div' do
76
76
  expect(@out.string).to match(/\<div class="cucumber"\>/)
77
77
  end
78
78
  end
79
79
 
80
- describe "with a comment" do
80
+ describe 'with a comment' do
81
81
  define_feature <<-FEATURE
82
82
  # Healthy
83
83
  Feature: Foo
@@ -88,16 +88,16 @@ module Cucumber
88
88
  it { expect(@out.string).to match(/^\<!DOCTYPE/) }
89
89
  it { expect(@out.string).to match(/\<\/html\>$/) }
90
90
 
91
- it "nests the comment within the feature" do
91
+ it 'nests the comment within the feature' do
92
92
  expect(@doc).to have_css_node('.feature .comment', /Healthy/)
93
93
  end
94
94
 
95
- it "properly closes the comment" do
95
+ it 'properly closes the comment' do
96
96
  expect(@out.string).to match(%r{<pre class="comment"># Healthy<br/></pre>})
97
97
  end
98
98
  end
99
99
 
100
- describe "with a comment at scenario level" do
100
+ describe 'with a comment at scenario level' do
101
101
  define_feature <<-FEATURE
102
102
  Feature: Foo
103
103
  # Healthy Scenario
@@ -108,7 +108,7 @@ module Cucumber
108
108
  it { expect(@doc).to have_css_node('.scenario .comment', /Healthy Scenario/) }
109
109
  end
110
110
 
111
- describe "with a tag" do
111
+ describe 'with a tag' do
112
112
  define_feature <<-FEATURE
113
113
  @foo
114
114
  Feature: can't have standalone tag :)
@@ -119,7 +119,7 @@ module Cucumber
119
119
  it { expect(@doc).to have_css_node('.feature .tag', /foo/) }
120
120
  end
121
121
 
122
- describe "with a narrative" do
122
+ describe 'with a narrative' do
123
123
  define_feature <<-FEATURE
124
124
  Feature: Bananas
125
125
  In order to find my inner monkey
@@ -134,7 +134,7 @@ module Cucumber
134
134
  it { expect(@doc).to have_css_node('.feature .narrative', /must eat bananas/) }
135
135
  end
136
136
 
137
- describe "with a background" do
137
+ describe 'with a background' do
138
138
  define_feature <<-FEATURE
139
139
  Feature: Bananas
140
140
 
@@ -148,7 +148,7 @@ module Cucumber
148
148
  it { expect(@doc).to have_css_node('.feature .background', /there are bananas/) }
149
149
  end
150
150
 
151
- describe "with a scenario" do
151
+ describe 'with a scenario' do
152
152
  define_feature <<-FEATURE
153
153
  Feature: Banana party
154
154
 
@@ -160,7 +160,7 @@ module Cucumber
160
160
  it { expect(@doc).to have_css_node('.feature .scenario .step', /there are bananas/) }
161
161
  end
162
162
 
163
- describe "with a scenario outline" do
163
+ describe 'with a scenario outline' do
164
164
  define_feature <<-FEATURE
165
165
  Feature: Fud Pyramid
166
166
 
@@ -184,7 +184,7 @@ module Cucumber
184
184
  it { expect(@doc).to have_css_node('.feature .scenario.outline table td', /carrots/) }
185
185
  end
186
186
 
187
- describe "with a step with a py string" do
187
+ describe 'with a step with a py string' do
188
188
  define_feature <<-FEATURE
189
189
  Feature: Traveling circus
190
190
 
@@ -198,7 +198,7 @@ module Cucumber
198
198
  it { expect(@doc).to have_css_node('.feature .scenario .val', /foo/) }
199
199
  end
200
200
 
201
- describe "with a multiline step arg" do
201
+ describe 'with a multiline step arg' do
202
202
  define_steps do
203
203
  Given(/there are monkeys:/) { |table| }
204
204
  end
@@ -216,7 +216,7 @@ module Cucumber
216
216
  it { expect(@out.string.include?('makeYellow(\'scenario_1\')')).to be false }
217
217
  end
218
218
 
219
- describe "with a table in the background and the scenario" do
219
+ describe 'with a table in the background and the scenario' do
220
220
  define_feature <<-FEATURE
221
221
  Feature: accountant monkey
222
222
 
@@ -233,7 +233,7 @@ module Cucumber
233
233
  it { expect(@doc.css('td').length).to eq 8 }
234
234
  end
235
235
 
236
- describe "with a py string in the background and the scenario" do
236
+ describe 'with a py string in the background and the scenario' do
237
237
  define_feature <<-FEATURE
238
238
  Feature: py strings
239
239
 
@@ -253,7 +253,7 @@ module Cucumber
253
253
  it { expect(@doc.css('.feature .scenario pre.val').length).to eq 1 }
254
254
  end
255
255
 
256
- describe "with a step that fails in the scenario" do
256
+ describe 'with a step that fails in the scenario' do
257
257
  define_steps do
258
258
  Given(/boo/) { raise StandardError, 'eek'.freeze }
259
259
  end
@@ -267,9 +267,14 @@ module Cucumber
267
267
 
268
268
  it { expect(@doc).to have_css_node('.feature .scenario .step.failed .message', /eek/) }
269
269
  it { expect(@doc).to have_css_node('.feature .scenario .step.failed .message', /StandardError/) }
270
+ it 'has the backtrace embeded in the output once and only once' do
271
+ html_str = @doc.to_s
272
+ expect(html_str).not_to match(%r{<pre\b.*html_spec.rb:.*html_spec.rb:.*</pre>}m)
273
+ expect(html_str).to match(%r{<pre\b.*html_spec.rb:.*</pre>}m)
274
+ end
270
275
  end
271
276
 
272
- describe "with a step that fails in the background" do
277
+ describe 'with a step that fails in the background' do
273
278
  define_steps do
274
279
  Given(/boo/) { raise 'eek' }
275
280
  end
@@ -291,8 +296,8 @@ module Cucumber
291
296
  it { expect(@doc).not_to have_css_node('.feature .scenario .backtrace', //) }
292
297
  end
293
298
 
294
- context "with a before hook that fails" do
295
- describe "in a scenario" do
299
+ context 'with a before hook that fails' do
300
+ describe 'in a scenario' do
296
301
  define_steps do
297
302
  Before { raise 'eek' }
298
303
  Given(/yay/) {}
@@ -309,7 +314,7 @@ module Cucumber
309
314
  it { expect(@doc).to have_css_node('.feature .scenario .step.skipped', /yay/) }
310
315
  end
311
316
 
312
- describe "in a scenario outline" do
317
+ describe 'in a scenario outline' do
313
318
  define_steps do
314
319
  Before { raise 'eek' }
315
320
  Given(/yay/) {}
@@ -331,7 +336,7 @@ module Cucumber
331
336
 
332
337
  end
333
338
 
334
- describe "with a step that embeds a snapshot" do
339
+ describe 'with a step that embeds a snapshot' do
335
340
  define_steps do
336
341
  Given(/snap/) {
337
342
  RSpec::Mocks.allow_message(File, :file?) { true }
@@ -345,12 +350,12 @@ module Cucumber
345
350
  Given snap
346
351
  FEATURE
347
352
 
348
- it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "snapshot.jpeg" }
353
+ it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq 'snapshot.jpeg' }
349
354
  end
350
355
 
351
- describe "with a step that embeds a text" do
356
+ describe 'with a step that embeds a text' do
352
357
  define_steps do
353
- Given(/log/) { embed('log.txt', 'text/plain') }
358
+ Given(/log/) { embed('log.txt', 'text/plain', 'foo') }
354
359
  end
355
360
 
356
361
  define_feature(<<-FEATURE)
@@ -359,10 +364,10 @@ module Cucumber
359
364
  Given log
360
365
  FEATURE
361
366
 
362
- it { expect(@doc.at('a#text_0')['href'].to_s).to eq "log.txt" }
367
+ it { expect(@doc.at('a#text_0')['href'].to_s).to eq 'log.txt' }
363
368
  end
364
369
 
365
- describe "with a step that embeds a snapshot content manually" do
370
+ describe 'with a step that embeds a snapshot content manually' do
366
371
  define_steps do
367
372
  Given(/snap/) { embed('data:image/png;base64,YWJj', 'image/png') }
368
373
  end
@@ -373,10 +378,10 @@ module Cucumber
373
378
  Given snap
374
379
  FEATURE
375
380
 
376
- it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "data:image/png;base64,YWJj" }
381
+ it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq 'data:image/png;base64,YWJj' }
377
382
  end
378
383
 
379
- describe "with a step that embeds a snapshot content" do
384
+ describe 'with a step that embeds a snapshot content' do
380
385
  define_steps do
381
386
  Given(/snap/) { embed('YWJj', 'image/png;base64') }
382
387
  end
@@ -387,10 +392,10 @@ module Cucumber
387
392
  Given snap
388
393
  FEATURE
389
394
 
390
- it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "data:image/png;base64,YWJj" }
395
+ it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq 'data:image/png;base64,YWJj' }
391
396
  end
392
397
 
393
- describe "with an undefined Given step then an undefined And step" do
398
+ describe 'with an undefined Given step then an undefined And step' do
394
399
  define_feature(<<-FEATURE)
395
400
  Feature:
396
401
  Scenario:
@@ -398,10 +403,10 @@ module Cucumber
398
403
  And another undefined step
399
404
  FEATURE
400
405
 
401
- it { expect(@doc.css('pre').map { |pre| /^(Given|And)/.match(pre.text)[1] }).to eq ["Given", "Given"] }
406
+ it { expect(@doc.css('pre').map { |pre| /^(Given|And)/.match(pre.text)[1] }).to eq %w(Given Given) }
402
407
  end
403
408
 
404
- describe "with an undefined When step then an undefined And step" do
409
+ describe 'with an undefined When step then an undefined And step' do
405
410
  define_feature(<<-FEATURE)
406
411
  Feature:
407
412
  Scenario:
@@ -410,10 +415,10 @@ module Cucumber
410
415
  And another undefined step
411
416
  FEATURE
412
417
 
413
- it { expect(@doc.css('pre').map { |pre| /^(Given|When|And)/.match(pre.text)[1] }).to eq ["Given", "When", "When"] }
418
+ it { expect(@doc.css('pre').map { |pre| /^(Given|When|And)/.match(pre.text)[1] }).to eq %w(Given When When) }
414
419
  end
415
420
 
416
- describe "with an passing Then step and an undefined And step" do
421
+ describe 'with an passing Then step and an undefined And step' do
417
422
  define_feature <<-FEATURE
418
423
  Feature:
419
424
  Scenario:
@@ -426,11 +431,11 @@ module Cucumber
426
431
  Given(/^this step passes$/) {}
427
432
  end
428
433
 
429
- it { expect(@doc.css('pre').map { |pre| /^(Given|Then)/.match(pre.text)[1] }).to eq ["Then"] }
434
+ it { expect(@doc.css('pre').map { |pre| /^(Given|Then)/.match(pre.text)[1] }).to eq ['Then'] }
430
435
  end
431
436
 
432
- describe "with a output from hooks" do
433
- describe "in a scenario" do
437
+ describe 'with a output from hooks' do
438
+ describe 'in a scenario' do
434
439
  define_feature <<-FEATURE
435
440
  Feature:
436
441
  Scenario:
@@ -439,26 +444,26 @@ module Cucumber
439
444
 
440
445
  define_steps do
441
446
  Before do
442
- puts "Before hook"
447
+ puts 'Before hook'
443
448
  end
444
449
  AfterStep do
445
- puts "AfterStep hook"
450
+ puts 'AfterStep hook'
446
451
  end
447
452
  After do
448
- puts "After hook"
453
+ puts 'After hook'
449
454
  end
450
455
  Given(/^this step passes$/) {}
451
456
  end
452
457
 
453
458
  it 'should have ccs nodes ".step.message" for all the hooks' do
454
459
  expect(@doc.css('.step.message').length).to eq 3
455
- expect(@doc.css('.step.message')[0].text).to eq "Before hook"
456
- expect(@doc.css('.step.message')[1].text).to eq "AfterStep hook"
457
- expect(@doc.css('.step.message')[2].text).to eq "After hook"
460
+ expect(@doc.css('.step.message')[0].text).to eq 'Before hook'
461
+ expect(@doc.css('.step.message')[1].text).to eq 'AfterStep hook'
462
+ expect(@doc.css('.step.message')[2].text).to eq 'After hook'
458
463
  end
459
464
  end
460
465
 
461
- describe "in a scenario outline" do
466
+ describe 'in a scenario outline' do
462
467
  define_feature <<-FEATURE
463
468
  Feature:
464
469
  Scenario Outline:
@@ -470,13 +475,13 @@ module Cucumber
470
475
 
471
476
  define_steps do
472
477
  Before do
473
- puts "Before hook"
478
+ puts 'Before hook'
474
479
  end
475
480
  AfterStep do
476
- puts "AfterStep hook"
481
+ puts 'AfterStep hook'
477
482
  end
478
483
  After do
479
- puts "After hook"
484
+ puts 'After hook'
480
485
  end
481
486
  Given(/^this step passes$/) {}
482
487
  end
@@ -485,7 +490,7 @@ module Cucumber
485
490
  end
486
491
  end
487
492
  end
488
- context "in --expand mode" do
493
+ context 'in --expand mode' do
489
494
  let(:options) { { expand: true } }
490
495
  before(:each) do
491
496
  @out = StringIO.new
@@ -493,7 +498,7 @@ module Cucumber
493
498
  run_defined_feature
494
499
  @doc = Nokogiri.HTML(@out.string)
495
500
  end
496
- describe "with undefined * steps in a Scenario Outline" do
501
+ describe 'with undefined * steps in a Scenario Outline' do
497
502
  define_feature <<-FEATURE
498
503
  Feature:
499
504
  Scenario Outline:
@@ -509,10 +514,10 @@ module Cucumber
509
514
  Given(/^this step passes$/) {}
510
515
  end
511
516
 
512
- it { expect(@doc.css('pre').map { |pre| /^(Given|Then|When)/.match(pre.text)[1] }).to eq ["Given", "Given"] }
517
+ it { expect(@doc.css('pre').map { |pre| /^(Given|Then|When)/.match(pre.text)[1] }).to eq %w(Given Given) }
513
518
  end
514
519
 
515
- describe "with a scenario outline and a before hook that fails" do
520
+ describe 'with a scenario outline and a before hook that fails' do
516
521
  define_steps do
517
522
  Before { raise 'eek' }
518
523
  Given(/yay/) {}
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'cucumber/formatter/interceptor'
3
4