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 'yaml'
3
4
  require 'cucumber/cli/options'
@@ -48,47 +49,49 @@ module Cucumber
48
49
  end
49
50
 
50
51
  context '-r or --require' do
51
- it "collects all specified files into an array" do
52
+ it 'collects all specified files into an array' do
52
53
  after_parsing('--require some_file.rb -r another_file.rb') do
53
54
  expect(options[:require]).to eq ['some_file.rb', 'another_file.rb']
54
55
  end
55
56
  end
56
57
  end
57
58
 
58
- context '--i18n' do
59
- context "with LANG specified as 'help'" do
60
- include RSpec::WorkInProgress
59
+ context '--i18n-languages' do
60
+ include RSpec::WorkInProgress
61
61
 
62
- it "lists all known languages" do
63
- when_parsing '--i18n help' do
64
- expect(Kernel).to receive(:exit)
62
+ it 'lists all known languages' do
63
+ after_parsing '--i18n-languages' do
64
+ ::Gherkin::DIALECTS.keys.map do |key|
65
+ expect(@output_stream.string).to include(key.to_s);
65
66
  end
66
67
  end
68
+ end
67
69
 
68
- it "exits the program" do
69
- when_parsing('--i18n help') { expect(Kernel).to receive(:exit) }
70
- end
70
+ it 'exits the program' do
71
+ when_parsing('--i18n-languages') { expect(Kernel).to receive(:exit) }
71
72
  end
73
+ end
72
74
 
73
- context "with invalid LANG" do
75
+ context '--i18n-keywords' do
76
+ context 'with invalid LANG' do
74
77
  include RSpec::WorkInProgress
75
78
 
76
- it "exits" do
77
- when_parsing '--i18n foo' do
79
+ it 'exits' do
80
+ when_parsing '--i18n-keywords foo' do
78
81
  expect(Kernel).to receive(:exit)
79
82
  end
80
83
  end
81
84
 
82
- it "says the language was invalid" do
83
- after_parsing '--i18n foo' do
85
+ it 'says the language was invalid' do
86
+ after_parsing '--i18n-keywords foo' do
84
87
  expect(@output_stream.string).to include("Invalid language 'foo'. Available languages are:")
85
88
  end
86
89
  end
87
90
 
88
- it "displays the language table" do
89
- after_parsing '--i18n foo' do
91
+ it 'displays the language table' do
92
+ after_parsing '--i18n-keywords foo' do
90
93
  ::Gherkin::DIALECTS.keys.map do |key|
91
- expect(@output_stream.string).to include("#{key}");
94
+ expect(@output_stream.string).to include(key.to_s);
92
95
  end
93
96
  end
94
97
  end
@@ -96,75 +99,94 @@ module Cucumber
96
99
  end
97
100
 
98
101
  context '-f FORMAT or --format FORMAT' do
99
- it "defaults the output for the formatter to the output stream (STDOUT)" do
100
- after_parsing('-f pretty') { expect(options[:formats]).to eq [['pretty', output_stream]] }
102
+ it 'defaults the output for the formatter to the output stream (STDOUT)' do
103
+ after_parsing('-f pretty') { expect(options[:formats]).to eq [['pretty', {}, output_stream]] }
104
+ end
105
+
106
+ it 'extracts per-formatter options' do
107
+ after_parsing('-f pretty,foo=bar,foo2=bar2') do
108
+ expect(options[:formats]).to eq [['pretty', { 'foo' => 'bar', 'foo2' => 'bar2' }, output_stream]]
109
+ end
101
110
  end
102
111
  end
103
112
 
104
113
  context '-o [FILE|DIR] or --out [FILE|DIR]' do
105
114
  it "defaults the formatter to 'pretty' when not specified earlier" do
106
- after_parsing('-o file.txt') { expect(options[:formats]).to eq [['pretty', 'file.txt']] }
115
+ after_parsing('-o file.txt') { expect(options[:formats]).to eq [['pretty', {}, 'file.txt']] }
107
116
  end
108
- it "sets the output for the formatter defined immediatly before it" do
117
+ it 'sets the output for the formatter defined immediatly before it' do
109
118
  after_parsing('-f profile --out file.txt -f pretty -o file2.txt') do
110
- expect(options[:formats]).to eq [['profile', 'file.txt'], ['pretty', 'file2.txt']]
119
+ expect(options[:formats]).to eq [['profile', {}, 'file.txt'], ['pretty', {}, 'file2.txt']]
111
120
  end
112
121
  end
113
122
  end
114
123
 
115
124
  context 'handling multiple formatters' do
116
- it "catches multiple command line formatters using the same stream" do
117
- expect{ options.parse!(prepare_args('-f pretty -f progress')) }.to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
125
+ it 'catches multiple command line formatters using the same stream' do
126
+ expect{ options.parse!(prepare_args('-f pretty -f progress')) }.to raise_error('All but one formatter must use --out, only one can print to each stream (or STDOUT)')
118
127
  end
119
128
 
120
- it "catches multiple profile formatters using the same stream" do
129
+ it 'catches multiple profile formatters using the same stream' do
121
130
  given_cucumber_yml_defined_as({'default' => '-f progress -f pretty'})
122
131
  options = Options.new(output_stream, error_stream, :default_profile => 'default')
123
132
 
124
- expect{ options.parse!(%w{}) }.to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
133
+ expect{ options.parse!(%w{}) }.to raise_error('All but one formatter must use --out, only one can print to each stream (or STDOUT)')
125
134
  end
126
135
 
127
- it "profiles does not affect the catching of multiple command line formatters using the same stream" do
136
+ it 'profiles does not affect the catching of multiple command line formatters using the same stream' do
128
137
  given_cucumber_yml_defined_as({'default' => '-q'})
129
138
  options = Options.new(output_stream, error_stream, :default_profile => 'default')
130
139
 
131
- expect{ options.parse!(%w{-f progress -f pretty}) }.to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
140
+ expect{ options.parse!(%w{-f progress -f pretty}) }.to raise_error('All but one formatter must use --out, only one can print to each stream (or STDOUT)')
132
141
  end
133
142
 
134
- it "merges profile formatters and command line formatters" do
143
+ it 'merges profile formatters and command line formatters' do
135
144
  given_cucumber_yml_defined_as({'default' => '-f junit -o result.xml'})
136
145
  options = Options.new(output_stream, error_stream, :default_profile => 'default')
137
146
 
138
147
  options.parse!(%w{-f pretty})
139
-
140
- expect(options[:formats]).to eq [['pretty', output_stream], ["junit", "result.xml"]]
148
+
149
+ expect(options[:formats]).to eq [['pretty', {}, output_stream], ['junit', {}, 'result.xml']]
141
150
  end
142
151
  end
143
152
 
144
153
  context '-t TAGS --tags TAGS' do
145
- it "designates tags prefixed with ~ as tags to be excluded" do
146
- after_parsing('--tags ~@foo,@bar') { expect(options[:tag_expressions]).to eq ['~@foo,@bar'] }
154
+ it 'handles tag expressions as argument' do
155
+ after_parsing(['--tags', 'not @foo or @bar']) { expect(options[:tag_expressions]).to eq ['not @foo or @bar'] }
147
156
  end
148
157
 
149
- it "stores tags passed with different --tags seperately" do
158
+ it 'stores tags passed with different --tags seperately' do
150
159
  after_parsing('--tags @foo --tags @bar') { expect(options[:tag_expressions]).to eq ['@foo', '@bar'] }
151
160
  end
161
+
162
+ it 'strips tag limits from the tag expressions stored' do
163
+ after_parsing(['--tags', 'not @foo:2 or @bar:3']) { expect(options[:tag_expressions]).to eq ['not @foo or @bar'] }
164
+ end
165
+
166
+ it 'stores tag limits separately' do
167
+ after_parsing(['--tags', 'not @foo:2 or @bar:3']) { expect(options[:tag_limits]).to eq Hash('@foo' => 2, '@bar' => 3) }
168
+ end
169
+
170
+ it 'raise exception for inconsistent tag limits' do
171
+ expect{ after_parsing('--tags @foo:2 --tags @foo:3') }.to raise_error(RuntimeError, 'Inconsistent tag limits for @foo: 2 and 3')
172
+
173
+ end
152
174
  end
153
175
 
154
176
  context '-n NAME or --name NAME' do
155
- it "stores the provided names as regular expressions" do
177
+ it 'stores the provided names as regular expressions' do
156
178
  after_parsing('-n foo --name bar') { expect(options[:name_regexps]).to eq [/foo/,/bar/] }
157
179
  end
158
180
  end
159
181
 
160
182
  context '-e PATTERN or --exclude PATTERN' do
161
- it "stores the provided exclusions as regular expressions" do
183
+ it 'stores the provided exclusions as regular expressions' do
162
184
  after_parsing('-e foo --exclude bar') { expect(options[:excludes]).to eq [/foo/,/bar/] }
163
185
  end
164
186
  end
165
187
 
166
188
  context '-l LINES or --lines LINES' do
167
- it "adds line numbers to args" do
189
+ it 'adds line numbers to args' do
168
190
  options.parse!(%w{-l24 FILE})
169
191
 
170
192
  expect(options.instance_variable_get(:@args)).to eq ['FILE:24']
@@ -172,7 +194,7 @@ module Cucumber
172
194
  end
173
195
 
174
196
  context '-p PROFILE or --profile PROFILE' do
175
- it "uses the default profile passed in during initialization if none are specified by the user" do
197
+ it 'uses the default profile passed in during initialization if none are specified by the user' do
176
198
  given_cucumber_yml_defined_as({'default' => '--require some_file'})
177
199
 
178
200
  options = Options.new(output_stream, error_stream, :default_profile => 'default')
@@ -181,7 +203,7 @@ module Cucumber
181
203
  expect(options[:require]).to include('some_file')
182
204
  end
183
205
 
184
- it "merges all uniq values from both cmd line and the profile" do
206
+ it 'merges all uniq values from both cmd line and the profile' do
185
207
  given_cucumber_yml_defined_as('foo' => %w[--verbose])
186
208
  options.parse!(%w[--wip --profile foo])
187
209
 
@@ -196,77 +218,90 @@ module Cucumber
196
218
  expect(options[:paths]).to eq %w[my.feature]
197
219
  end
198
220
 
199
- it "combines the require files of both" do
221
+ it 'combines the require files of both' do
200
222
  given_cucumber_yml_defined_as('bar' => %w[--require features -r dog.rb])
201
223
  options.parse!(%w[--require foo.rb -p bar])
202
224
 
203
225
  expect(options[:require]).to eq %w[foo.rb features dog.rb]
204
226
  end
205
227
 
206
- it "combines the tag names of both" do
228
+ it 'combines the tag names of both' do
207
229
  given_cucumber_yml_defined_as('baz' => %w[-t @bar])
208
230
  options.parse!(%w[--tags @foo -p baz])
209
231
 
210
- expect(options[:tag_expressions]).to eq ["@foo", "@bar"]
232
+ expect(options[:tag_expressions]).to eq ['@foo', '@bar']
211
233
  end
212
234
 
213
- it "only takes the paths from the original options, and disgregards the profiles" do
235
+ it 'combines the tag limits of both' do
236
+ given_cucumber_yml_defined_as('baz' => %w[-t @bar:2])
237
+ options.parse!(%w[--tags @foo:3 -p baz])
238
+
239
+ expect(options[:tag_limits]).to eq Hash('@foo' => 3, '@bar' => 2)
240
+ end
241
+
242
+ it 'raise exceptions for inconsistent tag limits' do
243
+ given_cucumber_yml_defined_as('baz' => %w[-t @bar:2])
244
+
245
+ expect{ options.parse!(%w[--tags @bar:3 -p baz]) }.to raise_error(RuntimeError, 'Inconsistent tag limits for @bar: 3 and 2')
246
+ end
247
+
248
+ it 'only takes the paths from the original options, and disgregards the profiles' do
214
249
  given_cucumber_yml_defined_as('baz' => %w[features])
215
250
  options.parse!(%w[my.feature -p baz])
216
251
 
217
252
  expect(options[:paths]).to eq ['my.feature']
218
253
  end
219
254
 
220
- it "uses the paths from the profile when none are specified originally" do
255
+ it 'uses the paths from the profile when none are specified originally' do
221
256
  given_cucumber_yml_defined_as('baz' => %w[some.feature])
222
257
  options.parse!(%w[-p baz])
223
258
 
224
259
  expect(options[:paths]).to eq ['some.feature']
225
260
  end
226
261
 
227
- it "combines environment variables from the profile but gives precendene to cmd line args" do
262
+ it 'combines environment variables from the profile but gives precendene to cmd line args' do
228
263
  given_cucumber_yml_defined_as('baz' => %w[FOO=bar CHEESE=swiss])
229
264
  options.parse!(%w[-p baz CHEESE=cheddar BAR=foo])
230
265
 
231
266
  expect(options[:env_vars]).to eq({ 'BAR' => 'foo', 'FOO' => 'bar', 'CHEESE' => 'cheddar' })
232
267
  end
233
268
 
234
- it "disregards STDOUT formatter defined in profile when another is passed in (via cmd line)" do
269
+ it 'disregards STDOUT formatter defined in profile when another is passed in (via cmd line)' do
235
270
  given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
236
271
  options.parse!(%w{--format progress --profile foo})
237
272
 
238
- expect(options[:formats]).to eq [['progress', output_stream]]
273
+ expect(options[:formats]).to eq [['progress', {}, output_stream]]
239
274
  end
240
275
 
241
- it "includes any non-STDOUT formatters from the profile" do
276
+ it 'includes any non-STDOUT formatters from the profile' do
242
277
  given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html]})
243
278
  options.parse!(%w{--format progress --profile html})
244
279
 
245
- expect(options[:formats]).to eq [['progress', output_stream], ['html', 'features.html']]
280
+ expect(options[:formats]).to eq [['progress', {}, output_stream], ['html', {}, 'features.html']]
246
281
  end
247
282
 
248
- it "does not include STDOUT formatters from the profile if there is a STDOUT formatter in command line" do
283
+ it 'does not include STDOUT formatters from the profile if there is a STDOUT formatter in command line' do
249
284
  given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html --format pretty]})
250
285
  options.parse!(%w{--format progress --profile html})
251
286
 
252
- expect(options[:formats]).to eq [['progress', output_stream], ['html', 'features.html']]
287
+ expect(options[:formats]).to eq [['progress', {}, output_stream], ['html', {}, 'features.html']]
253
288
  end
254
289
 
255
- it "includes any STDOUT formatters from the profile if no STDOUT formatter was specified in command line" do
290
+ it 'includes any STDOUT formatters from the profile if no STDOUT formatter was specified in command line' do
256
291
  given_cucumber_yml_defined_as({'html' => %w[--format html]})
257
292
  options.parse!(%w{--format rerun -o rerun.txt --profile html})
258
293
 
259
- expect(options[:formats]).to eq [['html', output_stream], ['rerun', 'rerun.txt']]
294
+ expect(options[:formats]).to eq [['html', {}, output_stream], ['rerun', {}, 'rerun.txt']]
260
295
  end
261
296
 
262
- it "assumes all of the formatters defined in the profile when none are specified on cmd line" do
297
+ it 'assumes all of the formatters defined in the profile when none are specified on cmd line' do
263
298
  given_cucumber_yml_defined_as({'html' => %w[--format progress --format html -o features.html]})
264
299
  options.parse!(%w{--profile html})
265
300
 
266
- expect(options[:formats]).to eq [['progress', output_stream], ['html', 'features.html']]
301
+ expect(options[:formats]).to eq [['progress', {}, output_stream], ['html', {}, 'features.html']]
267
302
  end
268
303
 
269
- it "only reads cucumber.yml once" do
304
+ it 'only reads cucumber.yml once' do
270
305
  original_parse_count = $cucumber_yml_read_count
271
306
  $cucumber_yml_read_count = 0
272
307
 
@@ -275,7 +310,7 @@ module Cucumber
275
310
  <% $cucumber_yml_read_count += 1 %>
276
311
  default: --format pretty
277
312
  END
278
- )
313
+ )
279
314
  options = Options.new(output_stream, error_stream, :default_profile => 'default')
280
315
  options.parse!(%w(-f progress))
281
316
 
@@ -285,7 +320,7 @@ module Cucumber
285
320
  end
286
321
  end
287
322
 
288
- it "respects --quiet when defined in the profile" do
323
+ it 'respects --quiet when defined in the profile' do
289
324
  given_cucumber_yml_defined_as('foo' => '-q')
290
325
  options.parse!(%w[-p foo])
291
326
 
@@ -293,8 +328,8 @@ module Cucumber
293
328
  expect(options[:source]).to be false
294
329
  expect(options[:duration]).to be false
295
330
  end
296
-
297
- it "uses --no-duration when defined in the profile" do
331
+
332
+ it 'uses --no-duration when defined in the profile' do
298
333
  given_cucumber_yml_defined_as('foo' => '--no-duration')
299
334
  options.parse!(%w[-p foo])
300
335
 
@@ -303,18 +338,18 @@ module Cucumber
303
338
  end
304
339
 
305
340
  context '-P or --no-profile' do
306
- it "disables profiles" do
341
+ it 'disables profiles' do
307
342
  given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
308
343
 
309
- after_parsing("-P --require some_file.rb") do
344
+ after_parsing('-P --require some_file.rb') do
310
345
  expect(options[:require]).to eq ['some_file.rb']
311
346
  end
312
347
  end
313
348
 
314
- it "notifies the user that the profiles are being disabled" do
349
+ it 'notifies the user that the profiles are being disabled' do
315
350
  given_cucumber_yml_defined_as({'default' => '-v'})
316
351
 
317
- after_parsing("--no-profile --require some_file.rb") do
352
+ after_parsing('--no-profile --require some_file.rb') do
318
353
  expect(output_stream.string).to match(/Disabling profiles.../)
319
354
  end
320
355
  end
@@ -322,7 +357,7 @@ module Cucumber
322
357
 
323
358
  context '-b or --backtrace' do
324
359
  it "turns on cucumber's full backtrace" do
325
- when_parsing("-b") do
360
+ when_parsing('-b') do
326
361
  expect(Cucumber).to receive(:use_full_backtrace=).with(true)
327
362
  end
328
363
  end
@@ -335,13 +370,13 @@ module Cucumber
335
370
  end
336
371
  end
337
372
 
338
- it "exits the program" do
373
+ it 'exits the program' do
339
374
  when_parsing('--version') { expect(Kernel).to receive(:exit) }
340
375
  end
341
376
  end
342
377
 
343
378
  context 'environment variables (i.e. MODE=webrat)' do
344
- it "places all of the environment variables into a hash" do
379
+ it 'places all of the environment variables into a hash' do
345
380
  after_parsing('MODE=webrat FOO=bar') do
346
381
  expect(options[:env_vars]).to eq({ 'MODE' => 'webrat', 'FOO' => 'bar' })
347
382
  end
@@ -349,33 +384,33 @@ module Cucumber
349
384
  end
350
385
 
351
386
  context '--retry ATTEMPTS' do
352
- it 'is 0 by default' do
353
- after_parsing("") do
387
+ it 'is 0 by default' do
388
+ after_parsing('') do
354
389
  expect(options[:retry]).to eql 0
355
390
  end
356
391
  end
357
392
 
358
- it 'sets the options[:retry] value' do
359
- after_parsing("--retry 4") do
393
+ it 'sets the options[:retry] value' do
394
+ after_parsing('--retry 4') do
360
395
  expect(options[:retry]).to eql 4
361
396
  end
362
397
  end
363
398
  end
364
399
 
365
- it "assigns any extra arguments as paths to features" do
400
+ it 'assigns any extra arguments as paths to features' do
366
401
  after_parsing('-f pretty my_feature.feature my_other_features') do
367
402
  expect(options[:paths]).to eq ['my_feature.feature', 'my_other_features']
368
403
  end
369
404
  end
370
405
 
371
- it "does not mistake environment variables as feature paths" do
406
+ it 'does not mistake environment variables as feature paths' do
372
407
  after_parsing('my_feature.feature FOO=bar') do
373
408
  expect(options[:paths]).to eq ['my_feature.feature']
374
409
  end
375
410
  end
376
411
 
377
412
  context '--snippet-type' do
378
- it "parses the snippet type argument" do
413
+ it 'parses the snippet type argument' do
379
414
  after_parsing('--snippet-type classic') do
380
415
  expect(options[:snippet_type]).to eq :classic
381
416
  end
@@ -383,22 +418,22 @@ module Cucumber
383
418
  end
384
419
  end
385
420
 
386
- describe "dry-run" do
387
- it "has the default value for snippets" do
421
+ describe 'dry-run' do
422
+ it 'has the default value for snippets' do
388
423
  given_cucumber_yml_defined_as({'foo' => %w[--dry-run]})
389
424
  options.parse!(%w{--dry-run})
390
425
 
391
426
  expect(options[:snippets]).to be true
392
427
  end
393
428
 
394
- it "sets snippets to false when no-snippets provided after dry-run" do
429
+ it 'sets snippets to false when no-snippets provided after dry-run' do
395
430
  given_cucumber_yml_defined_as({'foo' => %w[--dry-run --no-snippets]})
396
431
  options.parse!(%w{--dry-run --no-snippets})
397
432
 
398
433
  expect(options[:snippets]).to be false
399
434
  end
400
435
 
401
- it "sets snippets to false when no-snippets provided before dry-run" do
436
+ it 'sets snippets to false when no-snippets provided before dry-run' do
402
437
  given_cucumber_yml_defined_as({'foo' => %w[--no-snippet --dry-run]})
403
438
  options.parse!(%w{--no-snippets --dry-run})
404
439
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'yaml'
3
4
 
@@ -17,8 +18,8 @@ module Cucumber
17
18
  ProfileLoader.new
18
19
  end
19
20
 
20
- it "treats backslashes as literals in rerun.txt when on Windows (JRuby or MRI)" do
21
- given_cucumber_yml_defined_as({'default' => '--format "pretty" features\sync_imap_mailbox.feature:16:22'})
21
+ it 'treats backslashes as literals in rerun.txt when on Windows (JRuby or MRI)' do
22
+ given_cucumber_yml_defined_as('default' => '--format "pretty" features\sync_imap_mailbox.feature:16:22')
22
23
  if(Cucumber::WINDOWS)
23
24
  expect(loader.args_from('default')).to eq ['--format','pretty','features\sync_imap_mailbox.feature:16:22']
24
25
  else
@@ -26,13 +27,13 @@ module Cucumber
26
27
  end
27
28
  end
28
29
 
29
- it "treats forward slashes as literals" do
30
- given_cucumber_yml_defined_as({'default' => '--format "ugly" features/sync_imap_mailbox.feature:16:22'})
30
+ it 'treats forward slashes as literals' do
31
+ given_cucumber_yml_defined_as('default' => '--format "ugly" features/sync_imap_mailbox.feature:16:22')
31
32
 
32
33
  expect(loader.args_from('default')).to eq ['--format','ugly','features/sync_imap_mailbox.feature:16:22']
33
34
  end
34
35
 
35
- it "treats percent sign as ERB code block after YAML directive" do
36
+ it 'treats percent sign as ERB code block after YAML directive' do
36
37
  yml = <<-HERE
37
38
  ---
38
39
  % x = '--format "pretty" features/sync_imap_mailbox.feature:16:22'
@@ -41,6 +42,25 @@ default: <%= x %>
41
42
  given_cucumber_yml_defined_as yml
42
43
  expect(loader.args_from('default')).to eq ['--format','pretty','features/sync_imap_mailbox.feature:16:22']
43
44
  end
45
+
46
+ it 'correctly parses a profile that uses tag expressions (with double quotes)' do
47
+ given_cucumber_yml_defined_as('default' => '--format "pretty" features\sync_imap_mailbox.feature:16:22 --tags "not @jruby"')
48
+ if(Cucumber::WINDOWS)
49
+ expect(loader.args_from('default')).to eq ['--format','pretty','features\sync_imap_mailbox.feature:16:22','--tags','not @jruby']
50
+ else
51
+ expect(loader.args_from('default')).to eq ['--format','pretty','featuressync_imap_mailbox.feature:16:22','--tags','not @jruby']
52
+ end
53
+ end
54
+
55
+ it 'correctly parses a profile that uses tag expressions (with single quotes)' do
56
+ given_cucumber_yml_defined_as('default' => "--format 'pretty' features\\sync_imap_mailbox.feature:16:22 --tags 'not @jruby'")
57
+ if(Cucumber::WINDOWS)
58
+ expect(loader.args_from('default')).to eq ['--format','pretty','features\sync_imap_mailbox.feature:16:22','--tags','not @jruby']
59
+ else
60
+ expect(loader.args_from('default')).to eq ['--format','pretty','featuressync_imap_mailbox.feature:16:22','--tags','not @jruby']
61
+ end
62
+ end
63
+
44
64
  end
45
65
  end
46
66
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  module Cucumber
@@ -6,77 +7,77 @@ module Cucumber
6
7
 
7
8
  let(:rerun_file) { RerunFile.new('@rerun.txt') }
8
9
 
9
- it "expects rerun files to have a leading @" do
10
+ it 'expects rerun files to have a leading @' do
10
11
  allow(File).to receive(:file?) { true }
11
12
  expect(RerunFile.can_read?('rerun.txt')).to eq false
12
13
  expect(RerunFile.can_read?('@rerun.txt')).to eq true
13
14
  end
14
15
 
15
- it "does not treat directories as rerun files" do
16
+ it 'does not treat directories as rerun files' do
16
17
  allow(File).to receive(:file?) { false }
17
18
  expect(RerunFile.can_read?('@rerun.txt')).to eq false
18
19
  end
19
20
 
20
- it "removes leading @ character from filename" do
21
+ it 'removes leading @ character from filename' do
21
22
  expect(rerun_file.path).to eq 'rerun.txt'
22
23
  end
23
24
 
24
- context "rerun file containing single feature" do
25
+ context 'rerun file containing single feature' do
25
26
  before(:each) do
26
- allow(IO).to receive(:read).and_return("cucumber.feature")
27
+ allow(IO).to receive(:read).and_return('cucumber.feature')
27
28
  end
28
29
 
29
- it "produces an array containing a single feature file path" do
30
+ it 'produces an array containing a single feature file path' do
30
31
  expect(rerun_file.features).to eq %w(cucumber.feature)
31
32
  end
32
33
  end
33
34
 
34
- context "contains multiple features on multiple lines" do
35
+ context 'contains multiple features on multiple lines' do
35
36
  before(:each) do
36
37
  allow(IO).to receive(:read).and_return("cucumber.feature\nfoo.feature")
37
38
  end
38
39
 
39
- it "produces an array containing multiple feature file paths" do
40
+ it 'produces an array containing multiple feature file paths' do
40
41
  expect(rerun_file.features).to eq %w(cucumber.feature foo.feature)
41
42
  end
42
43
  end
43
44
 
44
- context "contains multiple features on same line" do
45
+ context 'contains multiple features on same line' do
45
46
  before(:each) do
46
- allow(IO).to receive(:read).and_return("cucumber.feature foo.feature")
47
+ allow(IO).to receive(:read).and_return('cucumber.feature foo.feature')
47
48
  end
48
49
 
49
- it "produces an array containing multiple feature file paths" do
50
+ it 'produces an array containing multiple feature file paths' do
50
51
  expect(rerun_file.features).to eq %w(cucumber.feature foo.feature)
51
52
  end
52
53
  end
53
54
 
54
- context "contains multiple scenarios on same line" do
55
+ context 'contains multiple scenarios on same line' do
55
56
  before(:each) do
56
- allow(IO).to receive(:read).and_return("cucumber.feature:8 foo.feature:8:16")
57
+ allow(IO).to receive(:read).and_return('cucumber.feature:8 foo.feature:8:16')
57
58
  end
58
59
 
59
- it "produces an array containing multiple feature file paths with scenario lines" do
60
+ it 'produces an array containing multiple feature file paths with scenario lines' do
60
61
  expect(rerun_file.features).to eq %w(cucumber.feature:8 foo.feature:8:16)
61
62
  end
62
63
  end
63
64
 
64
- context "contains features with spaces in file names" do
65
+ context 'contains features with spaces in file names' do
65
66
  before(:each) do
66
- allow(IO).to receive(:read).and_return("cucumber test.feature:8 foo.feature:8:16")
67
+ allow(IO).to receive(:read).and_return('cucumber test.feature:8 foo.feature:8:16')
67
68
  end
68
69
 
69
- it "produces an array containing multiple feature file paths with scenario lines" do
70
+ it 'produces an array containing multiple feature file paths with scenario lines' do
70
71
  expect(rerun_file.features).to eq ['cucumber test.feature:8', 'foo.feature:8:16']
71
72
  end
72
73
  end
73
74
 
74
- context "contains multiple scenarios without spaces between them" do
75
+ context 'contains multiple scenarios without spaces between them' do
75
76
  before(:each) do
76
- allow(IO).to receive(:read).and_return("cucumber test.feature:8foo.feature:8:16")
77
+ allow(IO).to receive(:read).and_return('cucumber test.feature:8foo.feature:8:16')
77
78
  end
78
79
 
79
- it "produces an array containing multiple feature file paths with scenario lines" do
80
+ it 'produces an array containing multiple feature file paths with scenario lines' do
80
81
  expect(rerun_file.features).to eq ['cucumber test.feature:8', 'foo.feature:8:16']
81
82
  end
82
83
  end