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/json'
@@ -10,39 +11,14 @@ module Cucumber
10
11
  extend SpecHelperDsl
11
12
  include SpecHelper
12
13
 
13
- context "Given a single feature" do
14
+ context 'Given a single feature' do
14
15
  before(:each) do
15
16
  @out = StringIO.new
16
17
  @formatter = Json.new(actual_runtime.configuration.with_options(out_stream: @out))
17
18
  run_defined_feature
18
19
  end
19
20
 
20
- describe "with a scenario with no steps" do
21
- define_feature <<-FEATURE
22
- Feature: Banana party
23
-
24
- Scenario: Monkey eats bananas
25
- FEATURE
26
-
27
- it "outputs the json data" do
28
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
29
- [{"id": "banana-party",
30
- "uri": "spec.feature",
31
- "keyword": "Feature",
32
- "name": "Banana party",
33
- "line": 1,
34
- "description": "",
35
- "elements":
36
- [{"id": "banana-party;monkey-eats-bananas",
37
- "keyword": "Scenario",
38
- "name": "Monkey eats bananas",
39
- "line": 3,
40
- "description": "",
41
- "type": "scenario"}]}]})
42
- end
43
- end
44
-
45
- describe "with a scenario with an undefined step" do
21
+ describe 'with a scenario with an undefined step' do
46
22
  define_feature <<-FEATURE
47
23
  Feature: Banana party
48
24
 
@@ -50,7 +26,7 @@ module Cucumber
50
26
  Given there are bananas
51
27
  FEATURE
52
28
 
53
- it "outputs the json data" do
29
+ it 'outputs the json data' do
54
30
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
55
31
  [{"id": "banana-party",
56
32
  "uri": "spec.feature",
@@ -74,7 +50,7 @@ module Cucumber
74
50
  end
75
51
  end
76
52
 
77
- describe "with a scenario with a passed step" do
53
+ describe 'with a scenario with a passed step' do
78
54
  define_feature <<-FEATURE
79
55
  Feature: Banana party
80
56
 
@@ -86,7 +62,7 @@ module Cucumber
86
62
  Given(/^there are bananas$/) {}
87
63
  end
88
64
 
89
- it "outputs the json data" do
65
+ it 'outputs the json data' do
90
66
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
91
67
  [{"id": "banana-party",
92
68
  "uri": "spec.feature",
@@ -105,13 +81,13 @@ module Cucumber
105
81
  [{"keyword": "Given ",
106
82
  "name": "there are bananas",
107
83
  "line": 4,
108
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:86"},
84
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:62"},
109
85
  "result": {"status": "passed",
110
86
  "duration": 1}}]}]}]})
111
87
  end
112
88
  end
113
89
 
114
- describe "with a scenario with a failed step" do
90
+ describe 'with a scenario with a failed step' do
115
91
  define_feature <<-FEATURE
116
92
  Feature: Banana party
117
93
 
@@ -120,10 +96,10 @@ module Cucumber
120
96
  FEATURE
121
97
 
122
98
  define_steps do
123
- Given(/^there are bananas$/) { raise "no bananas" }
99
+ Given(/^there are bananas$/) { raise 'no bananas' }
124
100
  end
125
101
 
126
- it "outputs the json data" do
102
+ it 'outputs the json data' do
127
103
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
128
104
  [{"id": "banana-party",
129
105
  "uri": "spec.feature",
@@ -142,14 +118,14 @@ module Cucumber
142
118
  [{"keyword": "Given ",
143
119
  "name": "there are bananas",
144
120
  "line": 4,
145
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:123"},
121
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:99"},
146
122
  "result": {"status": "failed",
147
- "error_message": "no bananas (RuntimeError)\\n./spec/cucumber/formatter/json_spec.rb:123:in `/^there are bananas$/'\\nspec.feature:4:in `Given there are bananas'",
123
+ "error_message": "no bananas (RuntimeError)\\n./spec/cucumber/formatter/json_spec.rb:99:in `/^there are bananas$/'\\nspec.feature:4:in `Given there are bananas'",
148
124
  "duration": 1}}]}]}]})
149
125
  end
150
126
  end
151
127
 
152
- describe "with a scenario with a pending step" do
128
+ describe 'with a scenario with a pending step' do
153
129
  define_feature <<-FEATURE
154
130
  Feature: Banana party
155
131
 
@@ -161,7 +137,7 @@ module Cucumber
161
137
  Given(/^there are bananas$/) { pending }
162
138
  end
163
139
 
164
- it "outputs the json data" do
140
+ it 'outputs the json data' do
165
141
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
166
142
  [{"id": "banana-party",
167
143
  "uri": "spec.feature",
@@ -180,14 +156,14 @@ module Cucumber
180
156
  [{"keyword": "Given ",
181
157
  "name": "there are bananas",
182
158
  "line": 4,
183
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:161"},
159
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:137"},
184
160
  "result": {"status": "pending",
185
- "error_message": "TODO (Cucumber::Pending)\\n./spec/cucumber/formatter/json_spec.rb:161:in `/^there are bananas$/'\\nspec.feature:4:in `Given there are bananas'",
161
+ "error_message": "TODO (Cucumber::Pending)\\n./spec/cucumber/formatter/json_spec.rb:137:in `/^there are bananas$/'\\nspec.feature:4:in `Given there are bananas'",
186
162
  "duration": 1}}]}]}]})
187
163
  end
188
164
  end
189
165
 
190
- describe "with a scenario outline with one example" do
166
+ describe 'with a scenario outline with one example' do
191
167
  define_feature <<-FEATURE
192
168
  Feature: Banana party
193
169
 
@@ -203,7 +179,7 @@ module Cucumber
203
179
  Given(/^there are bananas$/) {}
204
180
  end
205
181
 
206
- it "outputs the json data" do
182
+ it 'outputs the json data' do
207
183
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
208
184
  [{"id": "banana-party",
209
185
  "uri": "spec.feature",
@@ -222,13 +198,13 @@ module Cucumber
222
198
  [{"keyword": "Given ",
223
199
  "name": "there are bananas",
224
200
  "line": 8,
225
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:203"},
201
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:179"},
226
202
  "result": {"status": "passed",
227
203
  "duration": 1}}]}]}]})
228
204
  end
229
205
  end
230
206
 
231
- describe "with tags in the feature file" do
207
+ describe 'with tags in the feature file' do
232
208
  define_feature <<-FEATURE
233
209
  @f
234
210
  Feature: Banana party
@@ -251,7 +227,7 @@ module Cucumber
251
227
  Given(/^there are bananas$/) {}
252
228
  end
253
229
 
254
- it "the tags are included in the json data" do
230
+ it 'the tags are included in the json data' do
255
231
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
256
232
  [{"id": "banana-party",
257
233
  "uri": "spec.feature",
@@ -276,7 +252,7 @@ module Cucumber
276
252
  [{"keyword": "Given ",
277
253
  "name": "there are bananas",
278
254
  "line": 6,
279
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:251"},
255
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:227"},
280
256
  "result": {"status": "passed",
281
257
  "duration": 1}}]},
282
258
  {"id": "banana-party;monkey-eats-bananas;fruit-table;2",
@@ -295,13 +271,13 @@ module Cucumber
295
271
  [{"keyword": "Given ",
296
272
  "name": "there are bananas",
297
273
  "line": 15,
298
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:251"},
274
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:227"},
299
275
  "result": {"status": "passed",
300
276
  "duration": 1}}]}]}]})
301
277
  end
302
278
  end
303
279
 
304
- describe "with comments in the feature file" do
280
+ describe 'with comments in the feature file' do
305
281
  define_feature <<-FEATURE
306
282
  #feature comment
307
283
  Feature: Banana party
@@ -332,7 +308,7 @@ module Cucumber
332
308
  Then(/^the monkey eats bananas$/) {}
333
309
  end
334
310
 
335
- it "the comments are included in the json data" do
311
+ it 'the comments are included in the json data' do
336
312
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
337
313
  [{"id": "banana-party",
338
314
  "uri": "spec.feature",
@@ -354,7 +330,7 @@ module Cucumber
354
330
  [{"keyword": "Given ",
355
331
  "name": "there are bananas",
356
332
  "line": 6,
357
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:331"},
333
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:307"},
358
334
  "result": {"status": "passed",
359
335
  "duration": 1}}]},
360
336
  {"id": "banana-party;monkey-eats-bananas",
@@ -371,7 +347,7 @@ module Cucumber
371
347
  "line": 11,
372
348
  "comments": [{"value": "#step comment1",
373
349
  "line": 10}],
374
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:332"},
350
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:308"},
375
351
  "result": {"status": "passed",
376
352
  "duration": 1}}]},
377
353
  {"keyword": "Background",
@@ -385,7 +361,7 @@ module Cucumber
385
361
  [{"keyword": "Given ",
386
362
  "name": "there are bananas",
387
363
  "line": 6,
388
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:331"},
364
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:307"},
389
365
  "result": {"status": "passed",
390
366
  "duration": 1}}]},
391
367
  {"id": "banana-party;monkey-eats-bananas;fruit-table;2",
@@ -406,13 +382,13 @@ module Cucumber
406
382
  "line": 22,
407
383
  "comments": [{"value": "#step comment2",
408
384
  "line": 15}],
409
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:332"},
385
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:308"},
410
386
  "result": {"status": "passed",
411
387
  "duration": 1}}]}]}]})
412
388
  end
413
389
  end
414
390
 
415
- describe "with a scenario with a step with a doc string" do
391
+ describe 'with a scenario with a step with a doc string' do
416
392
  define_feature <<-FEATURE
417
393
  Feature: Banana party
418
394
 
@@ -427,7 +403,7 @@ module Cucumber
427
403
  Given(/^there are bananas$/) { |s| s }
428
404
  end
429
405
 
430
- it "includes the doc string in the json data" do
406
+ it 'includes the doc string in the json data' do
431
407
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
432
408
  [{"id": "banana-party",
433
409
  "uri": "spec.feature",
@@ -449,13 +425,13 @@ module Cucumber
449
425
  "doc_string": {"value": "the doc string",
450
426
  "content_type": "",
451
427
  "line": 5},
452
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:427"},
428
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:403"},
453
429
  "result": {"status": "passed",
454
430
  "duration": 1}}]}]}]})
455
431
  end
456
432
  end
457
433
 
458
- describe "with a scenario with a step that use puts" do
434
+ describe 'with a scenario with a step that use puts' do
459
435
  define_feature <<-FEATURE
460
436
  Feature: Banana party
461
437
 
@@ -464,10 +440,10 @@ module Cucumber
464
440
  FEATURE
465
441
 
466
442
  define_steps do
467
- Given(/^there are bananas$/) { puts "from step" }
443
+ Given(/^there are bananas$/) { puts 'from step' }
468
444
  end
469
445
 
470
- it "includes the output from the step in the json data" do
446
+ it 'includes the output from the step in the json data' do
471
447
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
472
448
  [{"id": "banana-party",
473
449
  "uri": "spec.feature",
@@ -487,13 +463,13 @@ module Cucumber
487
463
  "name": "there are bananas",
488
464
  "line": 4,
489
465
  "output": ["from step"],
490
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:467"},
466
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:443"},
491
467
  "result": {"status": "passed",
492
468
  "duration": 1}}]}]}]})
493
469
  end
494
470
  end
495
471
 
496
- describe "with a background" do
472
+ describe 'with a background' do
497
473
  define_feature <<-FEATURE
498
474
  Feature: Banana party
499
475
 
@@ -507,7 +483,7 @@ module Cucumber
507
483
  Then the monkey eats more bananas
508
484
  FEATURE
509
485
 
510
- it "includes the background in the json data each time it is executed" do
486
+ it 'includes the background in the json data each time it is executed' do
511
487
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
512
488
  [{"id": "banana-party",
513
489
  "uri": "spec.feature",
@@ -565,7 +541,7 @@ module Cucumber
565
541
  end
566
542
  end
567
543
 
568
- describe "with a scenario with a step that embeds data directly" do
544
+ describe 'with a scenario with a step that embeds data directly' do
569
545
  define_feature <<-FEATURE
570
546
  Feature: Banana party
571
547
 
@@ -574,11 +550,11 @@ module Cucumber
574
550
  FEATURE
575
551
 
576
552
  define_steps do
577
- Given(/^there are bananas$/) { data = "YWJj"
578
- embed data, "mime-type;base64" }
553
+ Given(/^there are bananas$/) { data = 'YWJj'
554
+ embed data, 'mime-type;base64' }
579
555
  end
580
556
 
581
- it "includes the data from the step in the json data" do
557
+ it 'includes the data from the step in the json data' do
582
558
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
583
559
  [{"id": "banana-party",
584
560
  "uri": "spec.feature",
@@ -599,13 +575,13 @@ module Cucumber
599
575
  "line": 4,
600
576
  "embeddings": [{"mime_type": "mime-type",
601
577
  "data": "YWJj"}],
602
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:577"},
578
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:553"},
603
579
  "result": {"status": "passed",
604
580
  "duration": 1}}]}]}]})
605
581
  end
606
582
  end
607
583
 
608
- describe "with a scenario with a step that embeds a file" do
584
+ describe 'with a scenario with a step that embeds a file' do
609
585
  define_feature <<-FEATURE
610
586
  Feature: Banana party
611
587
 
@@ -618,12 +594,12 @@ module Cucumber
618
594
  RSpec::Mocks.allow_message(File, :file?) { true }
619
595
  f1 = RSpec::Mocks::Double.new
620
596
  RSpec::Mocks.allow_message(File, :open) { |&block| block.call(f1) }
621
- RSpec::Mocks.allow_message(f1, :read) { "foo" }
597
+ RSpec::Mocks.allow_message(f1, :read) { 'foo' }
622
598
  embed('out/snapshot.jpeg', 'image/png')
623
599
  }
624
600
  end
625
601
 
626
- it "includes the file content in the json data" do
602
+ it 'includes the file content in the json data' do
627
603
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
628
604
  [{"id": "banana-party",
629
605
  "uri": "spec.feature",
@@ -644,13 +620,13 @@ module Cucumber
644
620
  "line": 4,
645
621
  "embeddings": [{"mime_type": "image/png",
646
622
  "data": "Zm9v"}],
647
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:617"},
623
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:593"},
648
624
  "result": {"status": "passed",
649
625
  "duration": 1}}]}]}]})
650
626
  end
651
627
  end
652
628
 
653
- describe "with a scenario with hooks" do
629
+ describe 'with a scenario with hooks' do
654
630
  define_feature <<-FEATURE
655
631
  Feature: Banana party
656
632
 
@@ -669,7 +645,7 @@ module Cucumber
669
645
  Given(/^there are bananas$/) {}
670
646
  end
671
647
 
672
- it "includes all hooks except the around hook in the json data" do
648
+ it 'includes all hooks except the around hook in the json data' do
673
649
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
674
650
  [{"id": "banana-party",
675
651
  "uri": "spec.feature",
@@ -685,37 +661,37 @@ module Cucumber
685
661
  "description": "",
686
662
  "type": "scenario",
687
663
  "before":
688
- [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:662"},
664
+ [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:638"},
689
665
  "result": {"status": "passed",
690
666
  "duration": 1}},
691
- {"match": {"location": "spec/cucumber/formatter/json_spec.rb:663"},
667
+ {"match": {"location": "spec/cucumber/formatter/json_spec.rb:639"},
692
668
  "result": {"status": "passed",
693
669
  "duration": 1}}],
694
670
  "steps":
695
671
  [{"keyword": "Given ",
696
672
  "name": "there are bananas",
697
673
  "line": 4,
698
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:669"},
674
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:645"},
699
675
  "result": {"status": "passed",
700
676
  "duration": 1},
701
677
  "after":
702
- [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:666"},
678
+ [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:642"},
703
679
  "result": {"status": "passed",
704
680
  "duration": 1}},
705
- {"match": {"location": "spec/cucumber/formatter/json_spec.rb:667"},
681
+ {"match": {"location": "spec/cucumber/formatter/json_spec.rb:643"},
706
682
  "result": {"status": "passed",
707
683
  "duration": 1}}]}],
708
684
  "after":
709
- [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:665"},
685
+ [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:641"},
710
686
  "result": {"status": "passed",
711
687
  "duration": 1}},
712
- {"match": {"location": "spec/cucumber/formatter/json_spec.rb:664"},
688
+ {"match": {"location": "spec/cucumber/formatter/json_spec.rb:640"},
713
689
  "result": {"status": "passed",
714
690
  "duration": 1}}]}]}]})
715
691
  end
716
692
  end
717
693
 
718
- describe "with a scenario when only an around hook is failing" do
694
+ describe 'with a scenario when only an around hook is failing' do
719
695
  define_feature <<-FEATURE
720
696
  Feature: Banana party
721
697
 
@@ -724,11 +700,11 @@ module Cucumber
724
700
  FEATURE
725
701
 
726
702
  define_steps do
727
- Around() { |scenario, block| block.call; raise RuntimeError, "error" }
703
+ Around() { |scenario, block| block.call; raise RuntimeError, 'error' }
728
704
  Given(/^there are bananas$/) {}
729
705
  end
730
706
 
731
- it "includes the around hook result in the json data" do
707
+ it 'includes the around hook result in the json data' do
732
708
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
733
709
  [{"id": "banana-party",
734
710
  "uri": "spec.feature",
@@ -747,18 +723,18 @@ module Cucumber
747
723
  [{"keyword": "Given ",
748
724
  "name": "there are bananas",
749
725
  "line": 4,
750
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:728"},
726
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:704"},
751
727
  "result": {"status": "passed",
752
728
  "duration": 1}}],
753
729
  "around":
754
730
  [{"match": {"location": "unknown_hook_location:1"},
755
731
  "result": {"status": "failed",
756
- "error_message": "error (RuntimeError)\\n./spec/cucumber/formatter/json_spec.rb:727:in `Around'",
732
+ "error_message": "error (RuntimeError)\\n./spec/cucumber/formatter/json_spec.rb:703:in `Around'",
757
733
  "duration": 1}}]}]}]})
758
734
  end
759
735
  end
760
736
 
761
- describe "with a scenario with a step with a data table" do
737
+ describe 'with a scenario with a step with a data table' do
762
738
  define_feature <<-FEATURE
763
739
  Feature: Banana party
764
740
 
@@ -772,7 +748,7 @@ module Cucumber
772
748
  Given(/^there are bananas$/) { |s| s }
773
749
  end
774
750
 
775
- it "includes the doc string in the json data" do
751
+ it 'includes the doc string in the json data' do
776
752
  expect(load_normalised_json(@out)).to eq MultiJson.load(%{
777
753
  [{"id": "banana-party",
778
754
  "uri": "spec.feature",
@@ -791,10 +767,10 @@ module Cucumber
791
767
  [{"keyword": "Given ",
792
768
  "name": "there are bananas",
793
769
  "line": 4,
794
- "rows":
795
- [{"cells": ["aa", "bb"]},
770
+ "rows":
771
+ [{"cells": ["aa", "bb"]},
796
772
  {"cells": ["cc", "dd"]}],
797
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:772"},
773
+ "match": {"location": "spec/cucumber/formatter/json_spec.rb:748"},
798
774
  "result": {"status": "passed",
799
775
  "duration": 1}}]}]}]})
800
776
  end
@@ -811,7 +787,7 @@ module Cucumber
811
787
  json.each do |feature|
812
788
  elements = feature.fetch('elements') { [] }
813
789
  elements.each do |scenario|
814
- ['steps', 'before', 'after', 'around'].each do |type|
790
+ %w(steps before after around).each do |type|
815
791
  if scenario[type]
816
792
  scenario[type].each do |step_or_hook|
817
793
  normalise_json_step_or_hook(step_or_hook)
@@ -828,12 +804,10 @@ module Cucumber
828
804
  end
829
805
 
830
806
  def normalise_json_step_or_hook(step_or_hook)
831
- if step_or_hook['result']
832
- if step_or_hook['result']['duration']
833
- expect(step_or_hook['result']['duration']).to be >= 0
834
- step_or_hook['result']['duration'] = 1
835
- end
836
- end
807
+ return unless step_or_hook['result'] && step_or_hook['result']['duration']
808
+
809
+ expect(step_or_hook['result']['duration']).to be >= 0
810
+ step_or_hook['result']['duration'] = 1
837
811
  end
838
812
 
839
813
  end