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 'yaml'
|
|
2
3
|
|
|
3
4
|
module Cucumber
|
|
@@ -10,7 +11,7 @@ module Cucumber
|
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def args_from(profile)
|
|
13
|
-
unless cucumber_yml.
|
|
14
|
+
unless cucumber_yml.key?(profile)
|
|
14
15
|
raise(ProfileNotFound, <<-END_OF_ERROR)
|
|
15
16
|
Could not find profile: '#{profile}'
|
|
16
17
|
|
|
@@ -21,34 +22,39 @@ Defined profiles in cucumber.yml:
|
|
|
21
22
|
|
|
22
23
|
args_from_yml = cucumber_yml[profile] || ''
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
|
|
25
|
+
require 'shellwords'
|
|
26
|
+
|
|
27
|
+
case args_from_yml
|
|
28
|
+
when String
|
|
29
|
+
raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/
|
|
30
|
+
if Cucumber::WINDOWS
|
|
31
|
+
# Shellwords treats backslash as an escape character so we have to mask it out temporarily
|
|
32
|
+
|
|
33
|
+
placeholder = 'pseudo_unique_backslash_placeholder'
|
|
34
|
+
sanitized_line = args_from_yml.gsub('\\', placeholder)
|
|
35
|
+
|
|
36
|
+
args_from_yml = Shellwords.shellwords(sanitized_line).collect { |argument| argument.gsub(placeholder, '\\') }
|
|
37
37
|
else
|
|
38
|
-
|
|
38
|
+
args_from_yml = Shellwords.shellwords(args_from_yml)
|
|
39
|
+
end
|
|
40
|
+
when Array
|
|
41
|
+
raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
|
|
42
|
+
else
|
|
43
|
+
raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array"
|
|
39
44
|
end
|
|
45
|
+
|
|
40
46
|
args_from_yml
|
|
41
47
|
end
|
|
42
48
|
|
|
43
49
|
def has_profile?(profile)
|
|
44
|
-
cucumber_yml.
|
|
50
|
+
cucumber_yml.key?(profile)
|
|
45
51
|
end
|
|
46
52
|
|
|
47
53
|
def cucumber_yml_defined?
|
|
48
54
|
cucumber_file && File.exist?(cucumber_file)
|
|
49
55
|
end
|
|
50
56
|
|
|
51
|
-
|
|
57
|
+
private
|
|
52
58
|
|
|
53
59
|
# Loads the profile, processing it through ERB and YAML, and returns it as a hash.
|
|
54
60
|
def cucumber_yml
|
|
@@ -61,13 +67,13 @@ Defined profiles in cucumber.yml:
|
|
|
61
67
|
require 'yaml'
|
|
62
68
|
begin
|
|
63
69
|
@cucumber_erb = ERB.new(IO.read(cucumber_file), nil, '%').result(binding)
|
|
64
|
-
rescue
|
|
70
|
+
rescue StandardError
|
|
65
71
|
raise(YmlLoadError,"cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$!.inspect}")
|
|
66
72
|
end
|
|
67
73
|
|
|
68
74
|
begin
|
|
69
|
-
@cucumber_yml = YAML
|
|
70
|
-
rescue StandardError
|
|
75
|
+
@cucumber_yml = YAML.load(@cucumber_erb)
|
|
76
|
+
rescue StandardError
|
|
71
77
|
raise(YmlLoadError,"cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage.\n")
|
|
72
78
|
end
|
|
73
79
|
|
|
@@ -88,4 +94,3 @@ Defined profiles in cucumber.yml:
|
|
|
88
94
|
end
|
|
89
95
|
end
|
|
90
96
|
end
|
|
91
|
-
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'cucumber/constantize'
|
|
2
3
|
require 'cucumber/cli/rerun_file'
|
|
3
4
|
require 'cucumber/events'
|
|
5
|
+
require 'cucumber/core/event_bus'
|
|
6
|
+
require 'cucumber/core/test/result'
|
|
4
7
|
require 'forwardable'
|
|
5
|
-
require 'cucumber
|
|
8
|
+
require 'cucumber'
|
|
6
9
|
|
|
7
10
|
module Cucumber
|
|
8
11
|
# The base class for configuring settings for a Cucumber run.
|
|
@@ -20,27 +23,23 @@ module Cucumber
|
|
|
20
23
|
#
|
|
21
24
|
# @param event_id [Symbol, Class, String] Identifier for the type of event to subscribe to
|
|
22
25
|
# @param handler_object [Object optional] an object to be called when the event occurs
|
|
23
|
-
# @yield [Object] Block to be called when
|
|
26
|
+
# @yield [Object] Block to be called when the event occurs
|
|
24
27
|
# @method on_event
|
|
25
|
-
def_instance_delegator :event_bus, :
|
|
28
|
+
def_instance_delegator :event_bus, :on, :on_event
|
|
26
29
|
|
|
27
30
|
# @private
|
|
28
|
-
|
|
31
|
+
def notify(message, *args)
|
|
32
|
+
event_bus.send(message, *args)
|
|
33
|
+
end
|
|
29
34
|
|
|
30
35
|
def initialize(user_options = {})
|
|
31
|
-
@options = default_options.merge(
|
|
36
|
+
@options = default_options.merge(Hash(user_options))
|
|
32
37
|
end
|
|
33
38
|
|
|
34
39
|
def with_options(new_options)
|
|
35
40
|
self.class.new(@options.merge(new_options))
|
|
36
41
|
end
|
|
37
42
|
|
|
38
|
-
# TODO: Actually Deprecate???
|
|
39
|
-
def options
|
|
40
|
-
warn("Deprecated: Configuration#options will be removed from the next release of Cucumber. Please use the configuration object directly instead.")
|
|
41
|
-
Marshal.load(Marhal.dump(@options))
|
|
42
|
-
end
|
|
43
|
-
|
|
44
43
|
def out_stream
|
|
45
44
|
@options[:out_stream]
|
|
46
45
|
end
|
|
@@ -73,7 +72,7 @@ module Cucumber
|
|
|
73
72
|
@options[:guess]
|
|
74
73
|
end
|
|
75
74
|
|
|
76
|
-
def strict
|
|
75
|
+
def strict
|
|
77
76
|
@options[:strict]
|
|
78
77
|
end
|
|
79
78
|
|
|
@@ -85,6 +84,30 @@ module Cucumber
|
|
|
85
84
|
@options[:expand]
|
|
86
85
|
end
|
|
87
86
|
|
|
87
|
+
def source?
|
|
88
|
+
@options[:source]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def duration?
|
|
92
|
+
@options[:duration]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def snippets?
|
|
96
|
+
@options[:snippets]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def skip_profile_information?
|
|
100
|
+
@options[:skip_profile_information]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def profiles
|
|
104
|
+
@options[:profiles] || []
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def custom_profiles
|
|
108
|
+
profiles - [@options[:default_profile]]
|
|
109
|
+
end
|
|
110
|
+
|
|
88
111
|
def paths
|
|
89
112
|
@options[:paths]
|
|
90
113
|
end
|
|
@@ -107,13 +130,8 @@ module Cucumber
|
|
|
107
130
|
with_default_features_path(dirs)
|
|
108
131
|
end
|
|
109
132
|
|
|
110
|
-
# todo: remove
|
|
111
|
-
def tag_expression
|
|
112
|
-
Cucumber::Core::Gherkin::TagExpression.new(@options[:tag_expressions])
|
|
113
|
-
end
|
|
114
|
-
|
|
115
133
|
def tag_limits
|
|
116
|
-
|
|
134
|
+
@options[:tag_limits]
|
|
117
135
|
end
|
|
118
136
|
|
|
119
137
|
def tag_expressions
|
|
@@ -130,7 +148,7 @@ module Cucumber
|
|
|
130
148
|
|
|
131
149
|
def feature_files
|
|
132
150
|
potential_feature_files = with_default_features_path(paths).map do |path|
|
|
133
|
-
path = path.
|
|
151
|
+
path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
|
|
134
152
|
path = path.chomp('/')
|
|
135
153
|
|
|
136
154
|
# TODO: Move to using feature loading strategies stored in
|
|
@@ -156,7 +174,7 @@ module Cucumber
|
|
|
156
174
|
|
|
157
175
|
def all_files_to_load
|
|
158
176
|
files = require_dirs.map do |path|
|
|
159
|
-
path = path.
|
|
177
|
+
path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
|
|
160
178
|
path = path.gsub(/\/$/, '') # Strip trailing slash.
|
|
161
179
|
File.directory?(path) ? Dir["#{path}/**/*"] : path
|
|
162
180
|
end.flatten.uniq
|
|
@@ -172,21 +190,21 @@ module Cucumber
|
|
|
172
190
|
end
|
|
173
191
|
|
|
174
192
|
def formatter_factories
|
|
175
|
-
|
|
176
|
-
format = format_and_out[0]
|
|
177
|
-
path_or_io = format_and_out[1]
|
|
193
|
+
formats.map do |format, formatter_options, path_or_io|
|
|
178
194
|
begin
|
|
179
195
|
factory = formatter_class(format)
|
|
180
|
-
yield factory,
|
|
196
|
+
yield factory,
|
|
197
|
+
formatter_options,
|
|
198
|
+
path_or_io,
|
|
199
|
+
Cli::Options.new(STDOUT, STDERR, @options)
|
|
181
200
|
rescue Exception => e
|
|
182
|
-
e.message
|
|
183
|
-
raise e
|
|
201
|
+
raise e, "#{e.message}\nError creating formatter: #{format}", e.backtrace
|
|
184
202
|
end
|
|
185
203
|
end
|
|
186
204
|
end
|
|
187
205
|
|
|
188
206
|
def formatter_class(format)
|
|
189
|
-
if(builtin = Cli::Options::BUILTIN_FORMATS[format])
|
|
207
|
+
if (builtin = Cli::Options::BUILTIN_FORMATS[format])
|
|
190
208
|
constantize(builtin[0])
|
|
191
209
|
else
|
|
192
210
|
constantize(format)
|
|
@@ -201,7 +219,7 @@ module Cucumber
|
|
|
201
219
|
# formatter wants to display snippets to the user.
|
|
202
220
|
#
|
|
203
221
|
# Each proc should take the following arguments:
|
|
204
|
-
#
|
|
222
|
+
#
|
|
205
223
|
# - keyword
|
|
206
224
|
# - step text
|
|
207
225
|
# - multiline argument
|
|
@@ -216,13 +234,17 @@ module Cucumber
|
|
|
216
234
|
self
|
|
217
235
|
end
|
|
218
236
|
|
|
219
|
-
|
|
237
|
+
def event_bus
|
|
238
|
+
@options[:event_bus]
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
private
|
|
220
242
|
|
|
221
243
|
def default_options
|
|
222
244
|
{
|
|
223
245
|
:autoload_code_paths => ['features/support', 'features/step_definitions'],
|
|
224
246
|
:filters => [],
|
|
225
|
-
:strict =>
|
|
247
|
+
:strict => Cucumber::Core::Test::Result::StrictConfiguration.new,
|
|
226
248
|
:require => [],
|
|
227
249
|
:dry_run => false,
|
|
228
250
|
:fail_fast => false,
|
|
@@ -235,17 +257,12 @@ module Cucumber
|
|
|
235
257
|
:snippets => true,
|
|
236
258
|
:source => true,
|
|
237
259
|
:duration => true,
|
|
238
|
-
:event_bus =>
|
|
260
|
+
:event_bus => Cucumber::Events.make_event_bus
|
|
239
261
|
}
|
|
240
262
|
end
|
|
241
263
|
|
|
242
|
-
def event_bus
|
|
243
|
-
@options[:event_bus]
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
|
|
247
264
|
def default_features_paths
|
|
248
|
-
[
|
|
265
|
+
['features']
|
|
249
266
|
end
|
|
250
267
|
|
|
251
268
|
def with_default_features_path(paths)
|
data/lib/cucumber/constantize.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'cucumber/platform'
|
|
2
3
|
module Cucumber
|
|
3
4
|
module Constantize #:nodoc:
|
|
@@ -28,7 +29,7 @@ module Cucumber
|
|
|
28
29
|
camel_cased_word.to_s.gsub(/::/, '/').
|
|
29
30
|
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
|
30
31
|
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
|
31
|
-
tr(
|
|
32
|
+
tr('-', '_').
|
|
32
33
|
downcase
|
|
33
34
|
end
|
|
34
35
|
|
data/lib/cucumber/deprecate.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'cucumber/platform'
|
|
2
3
|
require 'cucumber/gherkin/formatter/ansi_escapes'
|
|
3
4
|
|
|
@@ -12,18 +13,18 @@ module Cucumber
|
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
module ForDevelopers
|
|
15
|
-
def self.call(
|
|
16
|
+
def self.call(_message, _method, remove_after_version)
|
|
16
17
|
if Cucumber::VERSION > remove_after_version
|
|
17
18
|
raise "This method is due for removal after version #{remove_after_version}"
|
|
18
19
|
end
|
|
19
20
|
end
|
|
20
21
|
end
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
STRATEGY = $0.match(/rspec$/) ? ForDevelopers : ForUsers
|
|
23
24
|
end
|
|
24
25
|
|
|
25
26
|
def self.deprecate(*args)
|
|
26
|
-
Deprecate::
|
|
27
|
+
Deprecate::STRATEGY.call(*args)
|
|
27
28
|
end
|
|
28
29
|
|
|
29
30
|
end
|
data/lib/cucumber/encoding.rb
CHANGED
data/lib/cucumber/errors.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'cucumber/core/test/result'
|
|
2
3
|
|
|
3
4
|
module Cucumber
|
|
@@ -35,7 +36,8 @@ module Cucumber
|
|
|
35
36
|
# Raised when a step matches 2 or more StepDefinitions
|
|
36
37
|
class Ambiguous < StandardError
|
|
37
38
|
def initialize(step_name, step_definitions, used_guess)
|
|
38
|
-
message =
|
|
39
|
+
message = String.new
|
|
40
|
+
message << "Ambiguous match of \"#{step_name}\":\n\n"
|
|
39
41
|
message << step_definitions.map{|sd| sd.backtrace_line}.join("\n")
|
|
40
42
|
message << "\n\n"
|
|
41
43
|
message << "You can run again with --guess to make Cucumber be more smart about it\n" unless used_guess
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'cucumber/core/events'
|
|
2
|
+
|
|
3
|
+
module Cucumber
|
|
4
|
+
module Events
|
|
5
|
+
|
|
6
|
+
# Fired after we've read in the contents of a feature file
|
|
7
|
+
class GherkinSourceRead < Core::Event.new(:path, :body)
|
|
8
|
+
|
|
9
|
+
# The path to the file
|
|
10
|
+
attr_reader :path
|
|
11
|
+
|
|
12
|
+
# The raw Gherkin source
|
|
13
|
+
attr_reader :body
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'cucumber/core/events'
|
|
3
|
+
|
|
1
4
|
module Cucumber
|
|
2
5
|
module Events
|
|
3
6
|
|
|
4
|
-
# Event fired when a step is
|
|
5
|
-
class
|
|
7
|
+
# Event fired when a step is activated
|
|
8
|
+
class StepActivated < Core::Event.new(:test_step, :step_match)
|
|
6
9
|
|
|
7
10
|
# The test step that was matched.
|
|
8
11
|
#
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'cucumber/core/events'
|
|
3
|
+
|
|
4
|
+
module Cucumber
|
|
5
|
+
module Events
|
|
6
|
+
|
|
7
|
+
# Event fired after each step definition has been registered
|
|
8
|
+
class StepDefinitionRegistered < Core::Event.new(:step_definition)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
#_The step definition that was just registered.
|
|
12
|
+
#
|
|
13
|
+
# @return [RbSupport::RbStepDefinition]
|
|
14
|
+
attr_reader :step_definition
|
|
15
|
+
|
|
16
|
+
#_@private
|
|
17
|
+
def initialize(step_definition)
|
|
18
|
+
@step_definition = step_definition
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'cucumber/core/events'
|
|
2
|
+
|
|
3
|
+
module Cucumber
|
|
4
|
+
module Events
|
|
5
|
+
|
|
6
|
+
# Signals that a {Cucumber::Core::Test::Case} has finished executing
|
|
7
|
+
class TestCaseFinished < Core::Events::TestCaseFinished
|
|
8
|
+
|
|
9
|
+
# @return [Cucumber::Core::Test::Case] that was executed
|
|
10
|
+
attr_reader :test_case
|
|
11
|
+
|
|
12
|
+
# @return [Cucumber::Core::Test::Result] the result of running the {Cucumber::Core::Test::Case}
|
|
13
|
+
attr_reader :result
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'cucumber/core/events'
|
|
2
|
+
|
|
3
|
+
module Cucumber
|
|
4
|
+
module Events
|
|
5
|
+
|
|
6
|
+
# Signals that a {Cucumber::Core::Test::Case} is about to be executed
|
|
7
|
+
class TestCaseStarted < Core::Events::TestCaseStarted
|
|
8
|
+
|
|
9
|
+
# @return [Cucumber::Core::Test::Case] the test case to be executed
|
|
10
|
+
attr_reader :test_case
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'cucumber/core/events'
|
|
3
|
+
|
|
4
|
+
module Cucumber
|
|
5
|
+
module Events
|
|
6
|
+
|
|
7
|
+
# Event fired once all test cases have been filtered before
|
|
8
|
+
# the first one is executed.
|
|
9
|
+
class TestRunStarted < Core::Event.new(:test_cases)
|
|
10
|
+
|
|
11
|
+
# @return [Array<Cucumber::Core::Test::Case>] the test cases to be executed
|
|
12
|
+
attr_reader :test_cases
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'cucumber/core/events'
|
|
2
|
+
|
|
3
|
+
module Cucumber
|
|
4
|
+
module Events
|
|
5
|
+
|
|
6
|
+
# Signals that a {Cucumber::Core::Test::Step} has finished executing
|
|
7
|
+
class TestStepFinished < Core::Events::TestStepFinished
|
|
8
|
+
|
|
9
|
+
# @return [Cucumber::Core::Test::Step] the test step that was executed
|
|
10
|
+
attr_reader :test_step
|
|
11
|
+
|
|
12
|
+
# @return [Cucumber::Core::Test::Result] the result of running the {Cucumber::Core::Test::Step}
|
|
13
|
+
attr_reader :result
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'cucumber/core/events'
|
|
2
|
+
|
|
3
|
+
module Cucumber
|
|
4
|
+
module Events
|
|
5
|
+
|
|
6
|
+
# Signals that a {Cucumber::Core::Test::Step} is about to be executed
|
|
7
|
+
class TestStepStarted < Core::Events::TestStepStarted
|
|
8
|
+
|
|
9
|
+
# @return [Cucumber::Core::Test::Step] the test step to be executed
|
|
10
|
+
attr_reader :test_step
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
|
data/lib/cucumber/events.rb
CHANGED
|
@@ -1,20 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
Dir[File.dirname(__FILE__) + '/events/*.rb'].map(&method(:require))
|
|
3
|
+
|
|
1
4
|
module Cucumber
|
|
2
5
|
|
|
3
6
|
# Events tell you what's happening while Cucumber runs your features.
|
|
4
7
|
#
|
|
5
8
|
# They're designed to be read-only, appropriate for writing formatters and other
|
|
6
|
-
# output tools. If you need to be able to influence the result of a scenario, use a hook instead.
|
|
9
|
+
# output tools. If you need to be able to influence the result of a scenario, use a {RbSupport::RbDsl hook} instead.
|
|
7
10
|
#
|
|
8
11
|
# To subscribe to an event, use {Cucumber::Configuration#on_event}
|
|
9
12
|
#
|
|
10
13
|
# @example
|
|
11
14
|
# AfterConfiguration do |config|
|
|
12
|
-
# config.on_event :
|
|
15
|
+
# config.on_event :test_case_finished do |event|
|
|
13
16
|
# puts event.result
|
|
14
17
|
# end
|
|
15
18
|
# end
|
|
19
|
+
#
|
|
16
20
|
module Events
|
|
21
|
+
def self.make_event_bus
|
|
22
|
+
Core::EventBus.new(registry)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.registry
|
|
26
|
+
Core::Events.build_registry(
|
|
27
|
+
TestCaseStarted,
|
|
28
|
+
TestCaseFinished,
|
|
29
|
+
TestStepFinished,
|
|
30
|
+
TestStepStarted,
|
|
31
|
+
StepDefinitionRegistered,
|
|
32
|
+
StepActivated,
|
|
33
|
+
TestRunFinished,
|
|
34
|
+
GherkinSourceRead,
|
|
35
|
+
TestRunStarted
|
|
36
|
+
)
|
|
37
|
+
end
|
|
17
38
|
end
|
|
18
39
|
end
|
|
19
40
|
|
|
20
|
-
Dir[File.dirname(__FILE__) + '/events/*.rb'].map(&method(:require))
|
data/lib/cucumber/file_specs.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'cucumber/core/filter'
|
|
2
3
|
require 'cucumber/step_match'
|
|
3
4
|
require 'cucumber/events'
|
|
@@ -42,8 +43,12 @@ module Cucumber
|
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
def result
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
begin
|
|
47
|
+
return NoStepMatch.new(test_step.source.last, test_step.text) unless matches.any?
|
|
48
|
+
rescue Cucumber::Ambiguous => e
|
|
49
|
+
return AmbiguousStepMatch.new(e)
|
|
50
|
+
end
|
|
51
|
+
configuration.notify :step_activated, test_step, match
|
|
47
52
|
return SkippingStepMatch.new if configuration.dry_run?
|
|
48
53
|
match
|
|
49
54
|
end
|
|
@@ -58,7 +63,7 @@ module Cucumber
|
|
|
58
63
|
end
|
|
59
64
|
|
|
60
65
|
def matches
|
|
61
|
-
step_match_search.call(test_step.
|
|
66
|
+
step_match_search.call(test_step.text)
|
|
62
67
|
end
|
|
63
68
|
end
|
|
64
69
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Cucumber
|
|
3
|
+
module Filters
|
|
4
|
+
# Added at the end of the filter chain to broadcast a list of
|
|
5
|
+
# all of the test cases that have made it through the filters.
|
|
6
|
+
class BroadcastTestRunStartedEvent < Core::Filter.new(:config)
|
|
7
|
+
def initialize(config, receiver=nil)
|
|
8
|
+
super
|
|
9
|
+
@test_cases = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_case(test_case)
|
|
13
|
+
@test_cases << test_case
|
|
14
|
+
self
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def done
|
|
18
|
+
config.notify :test_run_started, @test_cases
|
|
19
|
+
@test_cases.map do |test_case|
|
|
20
|
+
test_case.describe_to(@receiver)
|
|
21
|
+
end
|
|
22
|
+
super
|
|
23
|
+
self
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|