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.
- checksums.yaml +4 -4
- data/.cucumberproignore +6 -0
- data/.gitattributes +32 -0
- data/.github/ISSUE_TEMPLATE.md +1 -1
- data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
- data/.rubocop.yml +13 -0
- data/.rubocop_todo.yml +991 -0
- data/.travis.yml +56 -10
- data/{History.md → CHANGELOG.md} +166 -32
- data/CONTRIBUTING.md +21 -1
- data/Gemfile +18 -5
- data/README.md +13 -4
- data/Rakefile +12 -2
- data/appveyor.yml +27 -0
- data/bin/cucumber +2 -1
- data/cucumber.gemspec +15 -10
- data/cucumber.yml +10 -11
- data/examples/i18n/Rakefile +1 -1
- data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +8 -3
- data/examples/i18n/ar/lib/calculator.rb +2 -2
- data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +6 -6
- data/examples/i18n/bg/features/support/env.rb +6 -1
- data/examples/i18n/bg/lib/calculator.rb +2 -1
- data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/ca/lib/calculadora.rb +2 -2
- data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/cs/lib/calculator.rb +3 -3
- data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +10 -5
- data/examples/i18n/da/lib/lommeregner.rb +2 -2
- data/examples/i18n/de/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/de/lib/calculator.rb +2 -2
- data/examples/i18n/el/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/el/lib/calculator.rb +2 -2
- data/examples/i18n/en/features/step_definitions/calculator_steps.rb +9 -4
- data/examples/i18n/en/lib/calculator.rb +2 -2
- data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +4 -4
- data/examples/i18n/en-lol/features/support/env.rb +6 -2
- data/examples/i18n/en-lol/lib/basket.rb +2 -2
- data/examples/i18n/en-lol/lib/belly.rb +2 -2
- data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +9 -4
- data/examples/i18n/eo/lib/calculator.rb +2 -2
- data/examples/i18n/es/features/step_definitions/calculador_steps.rb +10 -5
- data/examples/i18n/es/lib/calculador.rb +2 -2
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +10 -5
- data/examples/i18n/et/lib/kalkulaator.rb +3 -3
- data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +9 -4
- data/examples/i18n/fi/lib/laskin.rb +1 -1
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +8 -8
- data/examples/i18n/fr/features/support/env.rb +7 -2
- data/examples/i18n/fr/lib/calculatrice.rb +2 -2
- data/examples/i18n/he/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/he/lib/calculator.rb +1 -1
- data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +9 -4
- data/examples/i18n/hi/lib/calculator.rb +1 -1
- data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +9 -5
- data/examples/i18n/ht/lib/kalkilatris.rb +2 -2
- data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/hu/lib/calculator.rb +1 -1
- data/examples/i18n/id/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/id/lib/calculator.rb +2 -2
- data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +10 -5
- data/examples/i18n/it/lib/calcolatrice.rb +3 -3
- data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +3 -3
- data/examples/i18n/ja/features/support/env.rb +7 -2
- data/examples/i18n/ja/lib/calculator.rb +2 -2
- data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/ko/lib/calculator.rb +2 -2
- data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/lt/lib/calculator.rb +2 -2
- data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/lv/lib/calculator.rb +2 -2
- data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +3 -3
- data/examples/i18n/no/features/support/env.rb +7 -2
- data/examples/i18n/no/lib/kalkulator.rb +2 -2
- data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/pl/features/support/env.rb +6 -1
- data/examples/i18n/pl/lib/calculator.rb +2 -2
- data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -3
- data/examples/i18n/pt/features/support/env.rb +7 -2
- data/examples/i18n/pt/lib/calculadora.rb +1 -1
- data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +11 -6
- data/examples/i18n/ro/lib/calculator.rb +1 -1
- data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +5 -5
- data/examples/i18n/ru/features/support/env.rb +6 -1
- data/examples/i18n/ru/lib/calculator.rb +2 -1
- data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/sk/lib/calculator.rb +2 -2
- data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +3 -3
- data/examples/i18n/sr-Cyrl/features/support/env.rb +7 -2
- data/examples/i18n/sr-Cyrl/lib/calculator.rb +2 -2
- data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/sr-Latn/lib/calculator.rb +2 -2
- data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +9 -4
- data/examples/i18n/sv/lib/kalkulator.rb +2 -2
- data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +10 -5
- data/examples/i18n/tr/lib/hesap_makinesi.rb +2 -2
- data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +4 -4
- data/examples/i18n/uk/features/support/env.rb +6 -1
- data/examples/i18n/uk/lib/calculator.rb +2 -1
- data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +4 -4
- data/examples/i18n/uz/features/support/env.rb +6 -1
- data/examples/i18n/uz/lib/calculator.rb +2 -1
- data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +11 -6
- data/examples/i18n/zh-CN/lib/calculator.rb +2 -2
- data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/zh-TW/lib/calculator.rb +2 -2
- data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +3 -3
- data/examples/sinatra/features/step_definitions/add_steps.rb +4 -4
- data/examples/sinatra/features/support/env.rb +6 -1
- data/examples/tcl/features/step_definitions/fib_steps.rb +2 -2
- data/examples/tcl/features/support/env.rb +2 -1
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +4 -4
- data/examples/watir/features/step_definitions/search_steps.rb +6 -5
- data/examples/watir/features/support/env.rb +5 -1
- data/examples/watir/features/support/screenshots.rb +5 -5
- data/features/docs/api/list_step_defs_as_json.feature +21 -7
- data/features/docs/api/listen_for_events.feature +9 -8
- data/features/docs/api/run_cli_main_with_existing_runtime.feature +1 -0
- data/features/docs/cli/dry_run.feature +3 -0
- data/features/docs/cli/execute_with_tag_filter.feature +8 -6
- data/features/docs/cli/fail_fast.feature +2 -0
- data/features/docs/cli/help.feature +8 -0
- data/features/docs/{gherkin/language_help.feature → cli/i18n.feature} +6 -6
- data/features/docs/cli/randomize.feature +2 -2
- data/features/docs/cli/retry_failing_tests.feature +75 -15
- data/features/docs/cli/run_scenarios_matching_name.feature +1 -0
- data/features/docs/cli/specifying_multiple_formatters.feature +3 -0
- data/features/docs/cli/strict_mode.feature +6 -0
- data/features/docs/defining_steps/ambiguous_steps.feature +89 -0
- data/features/docs/defining_steps/nested_steps.feature +5 -1
- data/features/docs/defining_steps/nested_steps_i18n.feature +3 -0
- data/features/docs/defining_steps/nested_steps_with_second_arg.feature +2 -0
- data/features/docs/defining_steps/printing_messages.feature +1 -2
- data/features/docs/defining_steps/skip_scenario.feature +1 -34
- data/features/docs/defining_steps/snippets.feature +18 -18
- data/features/docs/events/gherkin_source_read_event.feature +43 -0
- data/features/docs/events/step_activated_event.feature +36 -0
- data/features/docs/events/step_definition_registered_event.feature +29 -0
- data/features/docs/events/test_case_finished_event.feature +35 -0
- data/features/docs/events/test_case_started_event.feature +54 -0
- data/features/docs/events/test_run_finished_event.feature +40 -0
- data/features/docs/events/test_run_started_event.feature +41 -0
- data/features/docs/events/test_step_finished_event.feature +47 -0
- data/features/docs/events/test_step_started_event.feature +43 -0
- data/features/docs/exception_in_after_hook.feature +3 -2
- data/features/docs/exception_in_after_step_hook.feature +2 -0
- data/features/docs/exception_in_around_hook.feature +2 -0
- data/features/docs/exception_in_before_hook.feature +3 -1
- data/features/docs/extending_cucumber/custom_formatter.feature +12 -48
- data/features/docs/formatters/json_formatter.feature +4 -4
- data/features/docs/formatters/junit_formatter.feature +7 -6
- data/features/docs/formatters/pretty_formatter.feature +1 -0
- data/features/docs/formatters/progress_formatter.feature +1 -0
- data/features/docs/formatters/rerun_formatter.feature +2 -0
- data/features/docs/formatters/summary_formatter.feature +35 -0
- data/features/docs/formatters/usage_formatter.feature +3 -0
- data/features/docs/getting_started.feature +2 -1
- data/features/docs/gherkin/background.feature +5 -5
- data/features/docs/gherkin/doc_strings.feature +2 -0
- data/features/docs/gherkin/expand_option_for_outlines.feature +1 -0
- data/features/docs/gherkin/outlines.feature +6 -4
- data/features/docs/gherkin/unicode_table.feature +2 -1
- data/features/docs/gherkin/using_descriptions.feature +1 -0
- data/features/docs/gherkin/using_star_notation.feature +1 -1
- data/features/docs/post_configuration_hook.feature +1 -17
- data/features/docs/rake_task.feature +5 -0
- data/features/docs/raketask.feature +3 -1
- data/features/docs/work_in_progress.feature +5 -2
- data/features/docs/writing_support_code/after_step_hooks.feature +3 -1
- data/features/docs/writing_support_code/around_hooks.feature +6 -0
- data/features/docs/writing_support_code/before_hook.feature +1 -0
- data/features/docs/writing_support_code/hook_order.feature +3 -1
- data/features/docs/writing_support_code/parameter_types.feature +53 -0
- data/features/docs/writing_support_code/tagged_hooks.feature +1 -1
- data/features/docs/writing_support_code/world.feature +129 -0
- data/features/lib/step_definitions/aruba_steps.rb +5 -10
- data/features/lib/step_definitions/cli_steps.rb +4 -0
- data/features/lib/step_definitions/cucumber_steps.rb +9 -12
- data/features/lib/step_definitions/iso-8859-1_steps.rb +9 -5
- data/features/lib/step_definitions/json_steps.rb +2 -1
- data/features/lib/step_definitions/junit_steps.rb +2 -1
- data/features/lib/step_definitions/language_steps.rb +3 -2
- data/features/lib/step_definitions/profile_steps.rb +7 -6
- data/features/lib/step_definitions/retry_steps.rb +33 -13
- data/features/lib/step_definitions/ruby_steps.rb +2 -1
- data/features/lib/support/env.rb +3 -2
- data/features/lib/support/fake_wire_server.rb +17 -3
- data/features/lib/support/feature_factory.rb +2 -1
- data/features/lib/support/normalise_output.rb +14 -12
- data/features/lib/support/parameter_types.rb +5 -0
- data/gem_tasks/contributors.rake +10 -6
- data/gem_tasks/cov.rake +1 -0
- data/gem_tasks/downloads.rb +1 -0
- data/gem_tasks/environment.rake +2 -5
- data/gem_tasks/examples.rake +3 -2
- data/gem_tasks/fix_cr_lf.rake +19 -7
- data/gem_tasks/flog.rake +4 -3
- data/gem_tasks/rspec.rake +2 -1
- data/gem_tasks/sass.rake +2 -1
- data/lib/autotest/cucumber.rb +1 -0
- data/lib/autotest/cucumber_mixin.rb +17 -16
- data/lib/autotest/cucumber_rails.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
- data/lib/autotest/cucumber_rspec.rb +1 -0
- data/lib/autotest/cucumber_rspec2.rb +1 -0
- data/lib/autotest/discover.rb +3 -2
- data/lib/cucumber/cli/configuration.rb +12 -21
- data/lib/cucumber/cli/main.rb +8 -7
- data/lib/cucumber/cli/options.rb +341 -217
- data/lib/cucumber/cli/profile_loader.rb +26 -21
- data/lib/cucumber/cli/rerun_file.rb +1 -0
- data/lib/cucumber/configuration.rb +54 -37
- data/lib/cucumber/constantize.rb +2 -1
- data/lib/cucumber/core_ext/string.rb +2 -1
- data/lib/cucumber/deprecate.rb +4 -3
- data/lib/cucumber/encoding.rb +1 -0
- data/lib/cucumber/errors.rb +3 -1
- data/lib/cucumber/events/gherkin_source_read.rb +17 -0
- data/lib/cucumber/events/{step_match.rb → step_activated.rb} +5 -2
- data/lib/cucumber/events/step_definition_registered.rb +24 -0
- data/lib/cucumber/events/test_case_finished.rb +18 -0
- data/lib/cucumber/events/test_case_started.rb +15 -0
- data/lib/cucumber/events/test_run_finished.rb +12 -0
- data/lib/cucumber/events/test_run_started.rb +16 -0
- data/lib/cucumber/events/test_step_finished.rb +20 -0
- data/lib/cucumber/events/test_step_started.rb +17 -0
- data/lib/cucumber/events.rb +23 -3
- data/lib/cucumber/file_specs.rb +1 -0
- data/lib/cucumber/filters/activate_steps.rb +8 -3
- data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
- data/lib/cucumber/filters/broadcast_test_run_started_event.rb +27 -0
- data/lib/cucumber/filters/gated_receiver.rb +1 -0
- data/lib/cucumber/filters/prepare_world.rb +1 -0
- data/lib/cucumber/filters/quit.rb +1 -0
- data/lib/cucumber/filters/randomizer.rb +1 -0
- data/lib/cucumber/filters/retry.rb +4 -4
- data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -0
- data/lib/cucumber/filters/tag_limits/verifier.rb +2 -1
- data/lib/cucumber/filters/tag_limits.rb +4 -3
- data/lib/cucumber/filters.rb +3 -0
- data/lib/cucumber/formatter/ansicolor.rb +9 -11
- data/lib/cucumber/formatter/backtrace_filter.rb +21 -8
- data/lib/cucumber/formatter/console.rb +72 -66
- data/lib/cucumber/formatter/console_counts.rb +44 -0
- data/lib/cucumber/formatter/console_issues.rb +58 -0
- data/lib/cucumber/formatter/duration.rb +2 -1
- data/lib/cucumber/formatter/duration_extractor.rb +1 -0
- data/lib/cucumber/formatter/fail_fast.rb +4 -2
- data/lib/cucumber/formatter/fanout.rb +1 -0
- data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
- data/lib/cucumber/formatter/html.rb +175 -249
- data/lib/cucumber/formatter/html_builder.rb +120 -0
- data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -0
- data/lib/cucumber/formatter/inline-js.js +30 -0
- data/lib/cucumber/formatter/interceptor.rb +3 -2
- data/lib/cucumber/formatter/io.rb +2 -1
- data/lib/cucumber/formatter/json.rb +33 -30
- data/lib/cucumber/formatter/json_pretty.rb +1 -0
- data/lib/cucumber/formatter/junit.rb +26 -24
- data/lib/cucumber/formatter/legacy_api/adapter.rb +81 -69
- data/lib/cucumber/formatter/legacy_api/ast.rb +27 -22
- data/lib/cucumber/formatter/legacy_api/results.rb +7 -8
- data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +1 -0
- data/lib/cucumber/formatter/pretty.rb +24 -18
- data/lib/cucumber/formatter/progress.rb +55 -13
- data/lib/cucumber/formatter/rerun.rb +15 -18
- data/lib/cucumber/formatter/stepdefs.rb +1 -0
- data/lib/cucumber/formatter/steps.rb +2 -1
- data/lib/cucumber/formatter/summary.rb +43 -20
- data/lib/cucumber/formatter/unicode.rb +2 -1
- data/lib/cucumber/formatter/usage.rb +33 -28
- data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -1
- data/lib/cucumber/gherkin/formatter/escaping.rb +2 -1
- data/lib/cucumber/gherkin/i18n.rb +1 -0
- data/lib/cucumber/gherkin/steps_parser.rb +1 -0
- data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +41 -30
- data/lib/cucumber/glue/hook.rb +43 -0
- data/lib/cucumber/glue/invoke_in_world.rb +70 -0
- data/lib/cucumber/glue/proto_world.rb +220 -0
- data/lib/cucumber/{rb_support/rb_language.rb → glue/registry_and_more.rb} +60 -90
- data/lib/cucumber/{rb_support → glue}/snippet.rb +64 -26
- data/lib/cucumber/glue/step_definition.rb +143 -0
- data/lib/cucumber/glue/world_factory.rb +23 -0
- data/lib/cucumber/hooks.rb +9 -8
- data/lib/cucumber/load_path.rb +1 -0
- data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +158 -0
- data/lib/cucumber/multiline_argument/data_table.rb +47 -181
- data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
- data/lib/cucumber/multiline_argument.rb +6 -15
- data/lib/cucumber/platform.rb +4 -5
- data/lib/cucumber/project_initializer.rb +3 -2
- data/lib/cucumber/rake/task.rb +19 -14
- data/lib/cucumber/rspec/disable_option_parser.rb +2 -1
- data/lib/cucumber/rspec/doubles.rb +2 -1
- data/lib/cucumber/running_test_case.rb +3 -27
- data/lib/cucumber/runtime/after_hooks.rb +2 -1
- data/lib/cucumber/runtime/before_hooks.rb +1 -0
- data/lib/cucumber/runtime/for_programming_languages.rb +2 -36
- data/lib/cucumber/runtime/step_hooks.rb +1 -0
- data/lib/cucumber/runtime/support_code.rb +21 -16
- data/lib/cucumber/runtime/user_interface.rb +10 -16
- data/lib/cucumber/runtime.rb +49 -32
- data/lib/cucumber/step_argument.rb +1 -2
- data/lib/cucumber/step_definition_light.rb +2 -0
- data/lib/cucumber/step_definitions.rb +1 -0
- data/lib/cucumber/step_match.rb +30 -15
- data/lib/cucumber/step_match_search.rb +3 -3
- data/lib/cucumber/term/ansicolor.rb +2 -1
- data/lib/cucumber/unit.rb +1 -0
- data/lib/cucumber/version +1 -1
- data/lib/cucumber.rb +1 -13
- data/lib/simplecov_setup.rb +2 -1
- data/scripts/invite-collaborator +40 -0
- data/scripts/update-changelog +86 -0
- data/spec/cucumber/cli/configuration_spec.rb +109 -98
- data/spec/cucumber/cli/main_spec.rb +8 -7
- data/spec/cucumber/cli/options_spec.rb +114 -79
- data/spec/cucumber/cli/profile_loader_spec.rb +25 -5
- data/spec/cucumber/cli/rerun_spec.rb +21 -20
- data/spec/cucumber/configuration_spec.rb +48 -47
- data/spec/cucumber/constantize_spec.rb +3 -2
- data/spec/cucumber/events_spec.rb +9 -0
- data/spec/cucumber/file_specs_spec.rb +26 -25
- data/spec/cucumber/filters/activate_steps_spec.rb +25 -22
- data/spec/cucumber/filters/gated_receiver_spec.rb +7 -6
- data/spec/cucumber/filters/retry_spec.rb +42 -23
- data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +12 -11
- data/spec/cucumber/filters/tag_limits/verifier_spec.rb +15 -14
- data/spec/cucumber/filters/tag_limits_spec.rb +9 -8
- data/spec/cucumber/formatter/ansicolor_spec.rb +10 -9
- data/spec/cucumber/formatter/backtrace_filter_spec.rb +32 -0
- data/spec/cucumber/formatter/console_counts_spec.rb +14 -0
- data/spec/cucumber/formatter/duration_spec.rb +4 -3
- data/spec/cucumber/formatter/fail_fast_spec.rb +27 -27
- data/spec/cucumber/formatter/html_spec.rb +65 -60
- data/spec/cucumber/formatter/interceptor_spec.rb +1 -0
- data/spec/cucumber/formatter/json_spec.rb +71 -97
- data/spec/cucumber/formatter/junit_spec.rb +46 -47
- data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +134 -141
- data/spec/cucumber/formatter/pretty_spec.rb +105 -117
- data/spec/cucumber/formatter/progress_spec.rb +22 -21
- data/spec/cucumber/formatter/rerun_spec.rb +70 -64
- data/spec/cucumber/formatter/spec_helper.rb +14 -12
- data/spec/cucumber/{rb_support/rb_world_spec.rb → glue/proto_world_spec.rb} +22 -6
- data/spec/cucumber/glue/registry_and_more_spec.rb +213 -0
- data/spec/cucumber/{rb_support → glue}/snippet_spec.rb +62 -25
- data/spec/cucumber/glue/step_definition_spec.rb +207 -0
- data/spec/cucumber/hooks_spec.rb +5 -4
- data/spec/cucumber/multiline_argument/data_table_spec.rb +179 -129
- data/spec/cucumber/project_initializer_spec.rb +12 -11
- data/spec/cucumber/rake/forked_spec.rb +22 -17
- data/spec/cucumber/rake/task_spec.rb +21 -20
- data/spec/cucumber/running_test_case_spec.rb +36 -35
- data/spec/cucumber/runtime/for_programming_languages_spec.rb +2 -30
- data/spec/cucumber/runtime/support_code_spec.rb +1 -0
- data/spec/cucumber/runtime_spec.rb +3 -2
- data/spec/cucumber/step_argument_spec.rb +6 -5
- data/spec/cucumber/step_match_search_spec.rb +32 -41
- data/spec/cucumber/step_match_spec.rb +34 -33
- data/spec/cucumber/world/pending_spec.rb +12 -11
- data/spec/spec_helper.rb +1 -0
- data/spec/support/standard_step_actions.rb +2 -1
- metadata +132 -61
- data/features/docs/formatters/debug_formatter.feature +0 -47
- data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
- data/features/docs/writing_support_code/transforms.feature +0 -98
- data/features/lib/step_definitions/wire_steps.rb +0 -58
- data/gem_tasks/cucumber.rake +0 -25
- data/lib/cucumber/ast.rb +0 -13
- data/lib/cucumber/core_ext/instance_exec.rb +0 -70
- data/lib/cucumber/events/after_test_case.rb +0 -25
- data/lib/cucumber/events/after_test_step.rb +0 -30
- data/lib/cucumber/events/before_test_case.rb +0 -18
- data/lib/cucumber/events/before_test_step.rb +0 -23
- data/lib/cucumber/events/bus.rb +0 -86
- data/lib/cucumber/events/finished_testing.rb +0 -9
- data/lib/cucumber/formatter/debug.rb +0 -35
- data/lib/cucumber/formatter/event_bus_report.rb +0 -38
- data/lib/cucumber/rb_support/rb_hook.rb +0 -19
- data/lib/cucumber/rb_support/rb_step_definition.rb +0 -131
- data/lib/cucumber/rb_support/rb_transform.rb +0 -59
- data/lib/cucumber/rb_support/rb_world.rb +0 -149
- data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -4
- data/spec/cucumber/events/bus_spec.rb +0 -94
- data/spec/cucumber/formatter/debug_spec.rb +0 -64
- data/spec/cucumber/formatter/event_bus_report_spec.rb +0 -88
- data/spec/cucumber/rb_support/rb_language_spec.rb +0 -243
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -199
- data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
- 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
|
|
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
|
-
|
|
60
|
-
include RSpec::WorkInProgress
|
|
59
|
+
context '--i18n-languages' do
|
|
60
|
+
include RSpec::WorkInProgress
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
69
|
-
|
|
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
|
-
|
|
75
|
+
context '--i18n-keywords' do
|
|
76
|
+
context 'with invalid LANG' do
|
|
74
77
|
include RSpec::WorkInProgress
|
|
75
78
|
|
|
76
|
-
it
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
117
|
-
expect{ options.parse!(prepare_args('-f pretty -f progress')) }.to raise_error(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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], [
|
|
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
|
|
146
|
-
after_parsing('--tags
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 [
|
|
232
|
+
expect(options[:tag_expressions]).to eq ['@foo', '@bar']
|
|
211
233
|
end
|
|
212
234
|
|
|
213
|
-
it
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
387
|
-
it
|
|
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
|
|
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
|
|
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
|
|
21
|
-
given_cucumber_yml_defined_as(
|
|
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
|
|
30
|
-
given_cucumber_yml_defined_as(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
25
|
+
context 'rerun file containing single feature' do
|
|
25
26
|
before(:each) do
|
|
26
|
-
allow(IO).to receive(:read).and_return(
|
|
27
|
+
allow(IO).to receive(:read).and_return('cucumber.feature')
|
|
27
28
|
end
|
|
28
29
|
|
|
29
|
-
it
|
|
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
|
|
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
|
|
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
|
|
45
|
+
context 'contains multiple features on same line' do
|
|
45
46
|
before(:each) do
|
|
46
|
-
allow(IO).to receive(:read).and_return(
|
|
47
|
+
allow(IO).to receive(:read).and_return('cucumber.feature foo.feature')
|
|
47
48
|
end
|
|
48
49
|
|
|
49
|
-
it
|
|
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
|
|
55
|
+
context 'contains multiple scenarios on same line' do
|
|
55
56
|
before(:each) do
|
|
56
|
-
allow(IO).to receive(:read).and_return(
|
|
57
|
+
allow(IO).to receive(:read).and_return('cucumber.feature:8 foo.feature:8:16')
|
|
57
58
|
end
|
|
58
59
|
|
|
59
|
-
it
|
|
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
|
|
65
|
+
context 'contains features with spaces in file names' do
|
|
65
66
|
before(:each) do
|
|
66
|
-
allow(IO).to receive(:read).and_return(
|
|
67
|
+
allow(IO).to receive(:read).and_return('cucumber test.feature:8 foo.feature:8:16')
|
|
67
68
|
end
|
|
68
69
|
|
|
69
|
-
it
|
|
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
|
|
75
|
+
context 'contains multiple scenarios without spaces between them' do
|
|
75
76
|
before(:each) do
|
|
76
|
-
allow(IO).to receive(:read).and_return(
|
|
77
|
+
allow(IO).to receive(:read).and_return('cucumber test.feature:8foo.feature:8:16')
|
|
77
78
|
end
|
|
78
79
|
|
|
79
|
-
it
|
|
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
|