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
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'cucumber/platform'
|
|
3
|
+
module Cucumber
|
|
4
|
+
module Glue
|
|
5
|
+
# Utility methods for executing step definitions with nice backtraces etc.
|
|
6
|
+
# TODO: add unit tests
|
|
7
|
+
# TODO: refactor for readability
|
|
8
|
+
class InvokeInWorld
|
|
9
|
+
def self.replace_instance_exec_invocation_line!(backtrace, instance_exec_invocation_line, pseudo_method)
|
|
10
|
+
return if Cucumber.use_full_backtrace
|
|
11
|
+
|
|
12
|
+
instance_exec_pos = backtrace.index(instance_exec_invocation_line)
|
|
13
|
+
if instance_exec_pos
|
|
14
|
+
replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
|
|
15
|
+
backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
|
|
16
|
+
|
|
17
|
+
depth = backtrace.count { |line| line == instance_exec_invocation_line }
|
|
18
|
+
end_pos = depth > 1 ? instance_exec_pos : -1
|
|
19
|
+
|
|
20
|
+
backtrace[replacement_line+1..end_pos] = nil
|
|
21
|
+
backtrace.compact!
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.cucumber_instance_exec_in(world, check_arity, pseudo_method, *args, &block)
|
|
26
|
+
cucumber_run_with_backtrace_filtering(pseudo_method) do
|
|
27
|
+
if check_arity && !cucumber_compatible_arity?(args, block)
|
|
28
|
+
world.instance_exec do
|
|
29
|
+
ari = block.arity
|
|
30
|
+
ari = ari < 0 ? (ari.abs-1).to_s+'+' : ari
|
|
31
|
+
s1 = ari == 1 ? '' : 's'
|
|
32
|
+
s2 = args.length == 1 ? '' : 's'
|
|
33
|
+
raise ArityMismatchError.new(
|
|
34
|
+
"Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
world.instance_exec(*args, &block)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.cucumber_compatible_arity?(args, block)
|
|
44
|
+
return true if block.arity == args.length
|
|
45
|
+
if block.arity < 0
|
|
46
|
+
return true if args.length >= (block.arity.abs - 1)
|
|
47
|
+
end
|
|
48
|
+
false
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.cucumber_run_with_backtrace_filtering(pseudo_method)
|
|
52
|
+
begin
|
|
53
|
+
yield
|
|
54
|
+
rescue Exception => e
|
|
55
|
+
instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
|
|
56
|
+
replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
|
|
57
|
+
raise e
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
INSTANCE_EXEC_OFFSET = -3
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Raised if the number of a StepDefinition's Regexp match groups
|
|
65
|
+
# is different from the number of Proc arguments.
|
|
66
|
+
class ArityMismatchError < StandardError
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'cucumber/gherkin/formatter/ansi_escapes'
|
|
3
|
+
require 'cucumber/core/ast/data_table'
|
|
4
|
+
|
|
5
|
+
module Cucumber
|
|
6
|
+
module Glue
|
|
7
|
+
# Defines the basic API methods availlable in all Cucumber step definitions.
|
|
8
|
+
#
|
|
9
|
+
# You can, and probably should, extend this API with your own methods that
|
|
10
|
+
# make sense in your domain. For more on that, see {Cucumber::Glue::Dsl#World}
|
|
11
|
+
module ProtoWorld
|
|
12
|
+
|
|
13
|
+
# Run a single Gherkin step
|
|
14
|
+
# @example Call another step
|
|
15
|
+
# step "I am logged in"
|
|
16
|
+
# @example Call a step with quotes in the name
|
|
17
|
+
# step %{the user "Dave" is logged in}
|
|
18
|
+
# @example Passing a table
|
|
19
|
+
# step "the following users exist:", table(%{
|
|
20
|
+
# | name | email |
|
|
21
|
+
# | Matt | matt@matt.com |
|
|
22
|
+
# | Aslak | aslak@aslak.com |
|
|
23
|
+
# })
|
|
24
|
+
# @example Passing a multiline string
|
|
25
|
+
# step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
|
|
26
|
+
# @param [String] name The name of the step
|
|
27
|
+
# @param [String,Cucumber::Ast::DocString,Cucumber::Ast::Table] multiline_argument
|
|
28
|
+
def step(name, raw_multiline_arg=nil)
|
|
29
|
+
super
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Run a snippet of Gherkin
|
|
33
|
+
# @example
|
|
34
|
+
# steps %{
|
|
35
|
+
# Given the user "Susan" exists
|
|
36
|
+
# And I am logged in as "Susan"
|
|
37
|
+
# }
|
|
38
|
+
# @param [String] steps_text The Gherkin snippet to run
|
|
39
|
+
def steps(steps_text)
|
|
40
|
+
super
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Parse Gherkin into a {Cucumber::Ast::Table} object.
|
|
44
|
+
#
|
|
45
|
+
# Useful in conjunction with the #step method.
|
|
46
|
+
# @example Create a table
|
|
47
|
+
# users = table(%{
|
|
48
|
+
# | name | email |
|
|
49
|
+
# | Matt | matt@matt.com |
|
|
50
|
+
# | Aslak | aslak@aslak.com |
|
|
51
|
+
# })
|
|
52
|
+
# @param [String] text_or_table The Gherkin string that represents the table
|
|
53
|
+
# Returns a Cucumber::MultilineArgument::DataTable for +text_or_table+, which can either
|
|
54
|
+
# be a String:
|
|
55
|
+
#
|
|
56
|
+
# table(%{
|
|
57
|
+
# | account | description | amount |
|
|
58
|
+
# | INT-100 | Taxi | 114 |
|
|
59
|
+
# | CUC-101 | Peeler | 22 |
|
|
60
|
+
# })
|
|
61
|
+
#
|
|
62
|
+
# or a 2D Array:
|
|
63
|
+
#
|
|
64
|
+
# table([
|
|
65
|
+
# %w{ account description amount },
|
|
66
|
+
# %w{ INT-100 Taxi 114 },
|
|
67
|
+
# %w{ CUC-101 Peeler 22 }
|
|
68
|
+
# ])
|
|
69
|
+
#
|
|
70
|
+
def table(text_or_table, file=nil, line=0)
|
|
71
|
+
location = !file ? Core::Ast::Location.of_caller : Core::Ast::Location.new(file, line)
|
|
72
|
+
MultilineArgument::DataTable.from(text_or_table, location)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Print a message to the output.
|
|
76
|
+
#
|
|
77
|
+
# @note Cucumber might surprise you with the behaviour of this method. Instead
|
|
78
|
+
# of sending the output directly to STDOUT, Cucumber will intercept and cache
|
|
79
|
+
# the message until the current step has finished, and then display it.
|
|
80
|
+
#
|
|
81
|
+
# If you'd prefer to see the message immediately, call {Kernel.puts} instead.
|
|
82
|
+
def puts(*messages)
|
|
83
|
+
super
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Pause the tests and ask the operator for input
|
|
87
|
+
def ask(question, timeout_seconds=60)
|
|
88
|
+
super
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Embed an image in the output
|
|
92
|
+
def embed(file, mime_type, label='Screenshot')
|
|
93
|
+
super
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Mark the matched step as pending.
|
|
97
|
+
def pending(message = 'TODO')
|
|
98
|
+
if block_given?
|
|
99
|
+
begin
|
|
100
|
+
yield
|
|
101
|
+
rescue Exception
|
|
102
|
+
raise Pending, message
|
|
103
|
+
end
|
|
104
|
+
raise Pending, "Expected pending '#{message}' to fail. No Error was raised. No longer pending?"
|
|
105
|
+
else
|
|
106
|
+
raise Pending, message
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Skips this step and the remaining steps in the scenario
|
|
111
|
+
def skip_this_scenario(message = 'Scenario skipped')
|
|
112
|
+
raise Core::Test::Result::Skipped, message
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Prints the list of modules that are included in the World
|
|
116
|
+
def inspect
|
|
117
|
+
super
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# see {#inspect}
|
|
121
|
+
def to_s
|
|
122
|
+
inspect
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Dynamially generate the API module, closuring the dependencies
|
|
126
|
+
def self.for(runtime, language)
|
|
127
|
+
Module.new do
|
|
128
|
+
def self.extended(object)
|
|
129
|
+
# wrap the dynamically generated module so that we can document the methods
|
|
130
|
+
# for yardoc, which doesn't like define_method.
|
|
131
|
+
object.extend(ProtoWorld)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# TODO: pass these in when building the module, instead of mutating them later
|
|
135
|
+
# Extend the World with user-defined modules
|
|
136
|
+
def add_modules!(world_modules, namespaced_world_modules)
|
|
137
|
+
add_world_modules!(world_modules)
|
|
138
|
+
add_namespaced_modules!(namespaced_world_modules)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
define_method(:step) do |name, raw_multiline_arg=nil|
|
|
142
|
+
location = Core::Ast::Location.of_caller
|
|
143
|
+
runtime.invoke_dynamic_step(name, MultilineArgument.from(raw_multiline_arg, location))
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
define_method(:steps) do |steps_text|
|
|
147
|
+
location = Core::Ast::Location.of_caller
|
|
148
|
+
runtime.invoke_dynamic_steps(steps_text, language, location)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
define_method(:puts) do |*messages|
|
|
152
|
+
# Even though they won't be output until later, converting the messages to
|
|
153
|
+
# strings right away will protect them from modifications to their original
|
|
154
|
+
# objects in the mean time
|
|
155
|
+
messages.collect! { |message| "#{message}" }
|
|
156
|
+
|
|
157
|
+
runtime.puts(*messages)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
define_method(:ask) do |question, timeout_seconds=60|
|
|
161
|
+
runtime.ask(question, timeout_seconds)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
define_method(:embed) do |file, mime_type, label='Screenshot'|
|
|
165
|
+
runtime.embed(file, mime_type, label)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Prints the list of modules that are included in the World
|
|
169
|
+
def inspect
|
|
170
|
+
modules = [self.class]
|
|
171
|
+
(class << self; self; end).instance_eval do
|
|
172
|
+
modules += included_modules
|
|
173
|
+
end
|
|
174
|
+
modules << stringify_namespaced_modules
|
|
175
|
+
format('#<%s:0x%x>', modules.join('+'), self.object_id)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
private
|
|
179
|
+
|
|
180
|
+
# @private
|
|
181
|
+
def add_world_modules!(modules)
|
|
182
|
+
modules.each do |world_module|
|
|
183
|
+
extend(world_module)
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# @private
|
|
188
|
+
def add_namespaced_modules!(modules)
|
|
189
|
+
@__namespaced_modules = modules
|
|
190
|
+
modules.each do |namespace, world_modules|
|
|
191
|
+
world_modules.each do |world_module|
|
|
192
|
+
variable_name = "@__#{namespace}_world"
|
|
193
|
+
|
|
194
|
+
inner_world = if self.class.respond_to?(namespace)
|
|
195
|
+
instance_variable_get(variable_name)
|
|
196
|
+
else
|
|
197
|
+
Object.new
|
|
198
|
+
end
|
|
199
|
+
instance_variable_set(variable_name,
|
|
200
|
+
inner_world.extend(world_module))
|
|
201
|
+
self.class.send(:define_method, namespace) do
|
|
202
|
+
instance_variable_get(variable_name)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# @private
|
|
209
|
+
def stringify_namespaced_modules
|
|
210
|
+
@__namespaced_modules.map { |k, v| "#{v.join(',')} (as #{k})" }.join('+')
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# @private
|
|
217
|
+
AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
@@ -1,39 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
require 'cucumber/
|
|
3
|
-
require 'cucumber/
|
|
4
|
-
require 'cucumber/
|
|
5
|
-
require 'cucumber/
|
|
6
|
-
require 'cucumber/
|
|
7
|
-
require 'cucumber/
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'cucumber/cucumber_expressions/parameter_type_registry'
|
|
3
|
+
require 'cucumber/cucumber_expressions/cucumber_expression'
|
|
4
|
+
require 'cucumber/cucumber_expressions/regular_expression'
|
|
5
|
+
require 'cucumber/cucumber_expressions/cucumber_expression_generator'
|
|
6
|
+
require 'cucumber/glue/dsl'
|
|
7
|
+
require 'cucumber/glue/snippet'
|
|
8
|
+
require 'cucumber/glue/hook'
|
|
9
|
+
require 'cucumber/glue/proto_world'
|
|
10
|
+
require 'cucumber/glue/step_definition'
|
|
11
|
+
require 'cucumber/glue/world_factory'
|
|
8
12
|
require 'cucumber/gherkin/i18n'
|
|
9
13
|
require 'multi_test'
|
|
10
14
|
require 'cucumber/step_match'
|
|
11
15
|
require 'cucumber/step_definition_light'
|
|
16
|
+
require 'cucumber/events/step_definition_registered'
|
|
12
17
|
|
|
13
18
|
module Cucumber
|
|
14
|
-
module
|
|
19
|
+
module Glue
|
|
15
20
|
# Raised if a World block returns Nil.
|
|
16
21
|
class NilWorld < StandardError
|
|
17
22
|
def initialize
|
|
18
|
-
super(
|
|
23
|
+
super('World procs should never return nil')
|
|
19
24
|
end
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
# Raised if there are 2 or more World blocks.
|
|
23
28
|
class MultipleWorld < StandardError
|
|
24
29
|
def initialize(first_proc, second_proc)
|
|
25
|
-
message =
|
|
30
|
+
message = String.new
|
|
31
|
+
message << "You can only pass a proc to #World once, but it's happening\n"
|
|
26
32
|
message << "in 2 places:\n\n"
|
|
27
|
-
message <<
|
|
28
|
-
message <<
|
|
29
|
-
message << "Use Ruby modules instead to extend your worlds. See the Cucumber::
|
|
33
|
+
message << Glue.backtrace_line(first_proc, 'World') << "\n"
|
|
34
|
+
message << Glue.backtrace_line(second_proc, 'World') << "\n\n"
|
|
35
|
+
message << "Use Ruby modules instead to extend your worlds. See the Cucumber::Glue::Dsl#World RDoc\n"
|
|
30
36
|
message << "or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.\n\n"
|
|
31
37
|
super(message)
|
|
32
38
|
end
|
|
33
39
|
end
|
|
34
40
|
|
|
35
|
-
#
|
|
36
|
-
class
|
|
41
|
+
# TODO: This class has too many responsibilities, split off
|
|
42
|
+
class RegistryAndMore
|
|
37
43
|
attr_reader :current_world,
|
|
38
44
|
:step_definitions
|
|
39
45
|
|
|
@@ -42,15 +48,17 @@ module Cucumber
|
|
|
42
48
|
dialect.given_keywords + dialect.when_keywords + dialect.then_keywords + dialect.and_keywords + dialect.but_keywords
|
|
43
49
|
end
|
|
44
50
|
Cucumber::Gherkin::I18n.code_keywords_for(all_keywords.flatten.uniq.sort).each do |adverb|
|
|
45
|
-
|
|
51
|
+
Glue::Dsl.alias_adverb(adverb.strip)
|
|
46
52
|
end
|
|
47
53
|
|
|
48
54
|
def initialize(runtime, configuration)
|
|
49
|
-
@runtime = runtime
|
|
55
|
+
@runtime, @configuration = runtime, configuration
|
|
50
56
|
@step_definitions = []
|
|
51
|
-
|
|
57
|
+
Glue::Dsl.rb_language = self
|
|
52
58
|
@world_proc = @world_modules = nil
|
|
53
|
-
|
|
59
|
+
@parameter_type_registry = CucumberExpressions::ParameterTypeRegistry.new
|
|
60
|
+
cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(@parameter_type_registry)
|
|
61
|
+
@configuration.register_snippet_generator(Snippet::Generator.new(cucumber_expression_generator))
|
|
54
62
|
end
|
|
55
63
|
|
|
56
64
|
def step_matches(name_to_match)
|
|
@@ -62,42 +70,48 @@ module Cucumber
|
|
|
62
70
|
}
|
|
63
71
|
end
|
|
64
72
|
|
|
65
|
-
def begin_rb_scenario(scenario)
|
|
66
|
-
create_world
|
|
67
|
-
extend_world
|
|
68
|
-
connect_world(scenario)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
73
|
def register_rb_hook(phase, tag_expressions, proc)
|
|
72
|
-
add_hook(phase,
|
|
74
|
+
add_hook(phase, Hook.new(self, tag_expressions, proc))
|
|
73
75
|
end
|
|
74
76
|
|
|
75
|
-
def
|
|
76
|
-
|
|
77
|
+
def define_parameter_type(parameter_type)
|
|
78
|
+
@parameter_type_registry.define_parameter_type(parameter_type)
|
|
77
79
|
end
|
|
78
80
|
|
|
79
|
-
def register_rb_step_definition(
|
|
80
|
-
step_definition =
|
|
81
|
+
def register_rb_step_definition(string_or_regexp, proc_or_sym, options)
|
|
82
|
+
step_definition = StepDefinition.new(self, string_or_regexp, proc_or_sym, options)
|
|
81
83
|
@step_definitions << step_definition
|
|
84
|
+
@configuration.notify :step_definition_registered, step_definition
|
|
82
85
|
step_definition
|
|
83
86
|
end
|
|
84
87
|
|
|
85
|
-
def build_rb_world_factory(world_modules, proc)
|
|
86
|
-
if
|
|
88
|
+
def build_rb_world_factory(world_modules, namespaced_world_modules, proc)
|
|
89
|
+
if proc
|
|
87
90
|
raise MultipleWorld.new(@world_proc, proc) if @world_proc
|
|
88
91
|
@world_proc = proc
|
|
89
92
|
end
|
|
90
93
|
@world_modules ||= []
|
|
91
94
|
@world_modules += world_modules
|
|
95
|
+
|
|
96
|
+
@namespaced_world_modules ||= Hash.new { |h, k| h[k] = [] }
|
|
97
|
+
namespaced_world_modules.each do |namespace, world_module|
|
|
98
|
+
unless @namespaced_world_modules[namespace].include?(world_module)
|
|
99
|
+
@namespaced_world_modules[namespace] << world_module
|
|
100
|
+
end
|
|
101
|
+
end
|
|
92
102
|
end
|
|
93
103
|
|
|
94
104
|
def load_code_file(code_file)
|
|
95
|
-
return unless File.extname(code_file) ==
|
|
96
|
-
load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.
|
|
105
|
+
return unless File.extname(code_file) == '.rb'
|
|
106
|
+
load File.expand_path(code_file) # This will cause self.add_step_definition, self.add_hook, and self.define_parameter_type to be called from Glue::Dsl
|
|
97
107
|
end
|
|
98
108
|
|
|
99
|
-
def begin_scenario(
|
|
100
|
-
|
|
109
|
+
def begin_scenario(test_case)
|
|
110
|
+
@current_world = WorldFactory.new(@world_proc).create_world
|
|
111
|
+
@current_world.extend(ProtoWorld.for(@runtime, test_case.language))
|
|
112
|
+
MultiTest.extend_with_best_assertion_library(@current_world)
|
|
113
|
+
@current_world.add_modules!(@world_modules || [],
|
|
114
|
+
@namespaced_world_modules || {})
|
|
101
115
|
end
|
|
102
116
|
|
|
103
117
|
def end_scenario
|
|
@@ -110,13 +124,6 @@ module Cucumber
|
|
|
110
124
|
end
|
|
111
125
|
end
|
|
112
126
|
|
|
113
|
-
def execute_transforms(args)
|
|
114
|
-
args.map do |arg|
|
|
115
|
-
matching_transform = transforms.detect {|transform| transform.match(arg) }
|
|
116
|
-
matching_transform ? matching_transform.invoke(arg) : arg
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
|
|
120
127
|
def add_hook(phase, hook)
|
|
121
128
|
hooks[phase.to_sym] << hook
|
|
122
129
|
hook
|
|
@@ -126,11 +133,6 @@ module Cucumber
|
|
|
126
133
|
@hooks = nil
|
|
127
134
|
end
|
|
128
135
|
|
|
129
|
-
def add_transform(transform)
|
|
130
|
-
transforms.unshift transform
|
|
131
|
-
transform
|
|
132
|
-
end
|
|
133
|
-
|
|
134
136
|
def hooks_for(phase, scenario) #:nodoc:
|
|
135
137
|
hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
|
|
136
138
|
end
|
|
@@ -147,6 +149,12 @@ module Cucumber
|
|
|
147
149
|
invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
|
|
148
150
|
end
|
|
149
151
|
|
|
152
|
+
def create_expression(string_or_regexp)
|
|
153
|
+
return CucumberExpressions::CucumberExpression.new(string_or_regexp, @parameter_type_registry) if string_or_regexp.is_a?(String)
|
|
154
|
+
return CucumberExpressions::RegularExpression.new(string_or_regexp, @parameter_type_registry) if string_or_regexp.is_a?(Regexp)
|
|
155
|
+
raise ArgumentError.new('Expression must be a String or Regexp')
|
|
156
|
+
end
|
|
157
|
+
|
|
150
158
|
private
|
|
151
159
|
|
|
152
160
|
def available_step_definition_hash
|
|
@@ -161,56 +169,18 @@ module Cucumber
|
|
|
161
169
|
@hooks ||= Hash.new{|h,k| h[k] = []}
|
|
162
170
|
end
|
|
163
171
|
|
|
164
|
-
def transforms
|
|
165
|
-
@transforms ||= []
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def create_world
|
|
169
|
-
if(@world_proc)
|
|
170
|
-
@current_world = @world_proc.call
|
|
171
|
-
check_nil(@current_world, @world_proc)
|
|
172
|
-
else
|
|
173
|
-
@current_world = Object.new
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
def extend_world
|
|
178
|
-
@current_world.extend(RbWorld)
|
|
179
|
-
MultiTest.extend_with_best_assertion_library(@current_world)
|
|
180
|
-
(@world_modules || []).each do |mod|
|
|
181
|
-
@current_world.extend(mod)
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
def connect_world(scenario)
|
|
186
|
-
@current_world.__cucumber_runtime = @runtime
|
|
187
|
-
@current_world.__natural_language = scenario.language
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def check_nil(o, proc)
|
|
191
|
-
if o.nil?
|
|
192
|
-
begin
|
|
193
|
-
raise NilWorld.new
|
|
194
|
-
rescue NilWorld => e
|
|
195
|
-
e.backtrace.clear
|
|
196
|
-
e.backtrace.push(RbSupport.backtrace_line(proc, "World"))
|
|
197
|
-
raise e
|
|
198
|
-
end
|
|
199
|
-
else
|
|
200
|
-
o
|
|
201
|
-
end
|
|
202
|
-
end
|
|
203
|
-
|
|
204
172
|
def self.cli_snippet_type_options
|
|
173
|
+
registry = CucumberExpressions::ParameterTypeRegistry.new
|
|
174
|
+
cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(registry)
|
|
205
175
|
Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
|
|
206
|
-
Snippet::SNIPPET_TYPES[type].cli_option_string(type)
|
|
176
|
+
Snippet::SNIPPET_TYPES[type].cli_option_string(type, cucumber_expression_generator)
|
|
207
177
|
end
|
|
208
178
|
end
|
|
209
179
|
end
|
|
210
180
|
|
|
211
181
|
def self.backtrace_line(proc, name)
|
|
212
182
|
location = Cucumber::Core::Ast::Location.from_source_location(*proc.source_location)
|
|
213
|
-
"#{location
|
|
183
|
+
"#{location}:in `#{name}'"
|
|
214
184
|
end
|
|
215
185
|
end
|
|
216
186
|
end
|