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,98 +0,0 @@
|
|
|
1
|
-
Feature: Transforms
|
|
2
|
-
|
|
3
|
-
Transforms allow you to convert primitive string arguments captured in step definitions
|
|
4
|
-
into more meaningful data types.
|
|
5
|
-
|
|
6
|
-
Background:
|
|
7
|
-
Let's just create a simple feature for testing out Transforms.
|
|
8
|
-
We also have a Person class that we need to be able to build.
|
|
9
|
-
|
|
10
|
-
Given a file named "features/foo.feature" with:
|
|
11
|
-
"""
|
|
12
|
-
Feature:
|
|
13
|
-
Scenario:
|
|
14
|
-
Given a Person aged 15 with blonde hair
|
|
15
|
-
"""
|
|
16
|
-
And a file named "features/support/person.rb" with:
|
|
17
|
-
"""
|
|
18
|
-
class Person
|
|
19
|
-
attr_accessor :age
|
|
20
|
-
|
|
21
|
-
def to_s
|
|
22
|
-
"I am #{age} years old"
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
Scenario: Basic Transform
|
|
28
|
-
This is the most basic way to use a transform. Notice that the regular
|
|
29
|
-
expression is pretty much duplicated between the step defintion and the
|
|
30
|
-
transform itself.
|
|
31
|
-
|
|
32
|
-
And a file named "features/step_definitions/steps.rb" with:
|
|
33
|
-
"""
|
|
34
|
-
Transform(/a Person aged (\d+)/) do |age|
|
|
35
|
-
person = Person.new
|
|
36
|
-
person.age = age.to_i
|
|
37
|
-
person
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
Given /^(a Person aged \d+) with blonde hair$/ do |person|
|
|
41
|
-
expect(person.age).to eq 15
|
|
42
|
-
end
|
|
43
|
-
"""
|
|
44
|
-
When I run `cucumber features/foo.feature`
|
|
45
|
-
Then it should pass
|
|
46
|
-
|
|
47
|
-
Scenario: Re-use Transform's Regular Expression
|
|
48
|
-
If you keep a reference to the transform, you can use it in your
|
|
49
|
-
regular expressions to avoid repeating the regular expression.
|
|
50
|
-
|
|
51
|
-
And a file named "features/step_definitions/steps.rb" with:
|
|
52
|
-
"""
|
|
53
|
-
A_PERSON = Transform(/a Person aged (\d+)/) do |age|
|
|
54
|
-
person = Person.new
|
|
55
|
-
person.age = age.to_i
|
|
56
|
-
person
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
Given /^(#{A_PERSON}) with blonde hair$/ do |person|
|
|
60
|
-
expect(person.age).to eq 15
|
|
61
|
-
end
|
|
62
|
-
"""
|
|
63
|
-
When I run `cucumber features/foo.feature`
|
|
64
|
-
Then it should pass
|
|
65
|
-
|
|
66
|
-
Scenario: Use Transform from code
|
|
67
|
-
You can also call the `Transform` method from within a step definition to
|
|
68
|
-
dynamically run a tranform.
|
|
69
|
-
|
|
70
|
-
Note that this is rather useless at present, unless the transform itself has a side-effect, since the `Transform`
|
|
71
|
-
function still returns the regular expression pattern.
|
|
72
|
-
|
|
73
|
-
Given a file named "features/people.feature" with:
|
|
74
|
-
"""
|
|
75
|
-
Feature:
|
|
76
|
-
Scenario:
|
|
77
|
-
Given people with these ages:
|
|
78
|
-
| name | age |
|
|
79
|
-
| sue | 25 |
|
|
80
|
-
| sally | 77 |
|
|
81
|
-
"""
|
|
82
|
-
And a file named "features/step_definitions/steps.rb" with:
|
|
83
|
-
"""
|
|
84
|
-
Transform(/a Person aged (\d+)/) do |age|
|
|
85
|
-
$person = Person.new
|
|
86
|
-
$person.age = age.to_i
|
|
87
|
-
$person
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
Given(/^people with these ages:$/) do |table|
|
|
91
|
-
table.rows.each do |name, age|
|
|
92
|
-
Transform("a Person aged #{age}")
|
|
93
|
-
expect($person.age).to eq age.to_i
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
"""
|
|
97
|
-
When I run `cucumber features/people.feature`
|
|
98
|
-
Then it should pass
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
Given /^there is a wire server (running |)on port (\d+) which understands the following protocol:$/ do |running, port, table|
|
|
2
|
-
protocol = table.hashes.map do |table_hash|
|
|
3
|
-
table_hash['response'] = table_hash['response'].gsub(/\n/, '\n')
|
|
4
|
-
table_hash
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
@server = FakeWireServer.new(port.to_i, protocol)
|
|
8
|
-
start_wire_server if running.strip == "running"
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
Given /^the wire server takes (.*) seconds to respond to the invoke message$/ do |timeout|
|
|
12
|
-
@server.delay_response(:invoke, timeout.to_f)
|
|
13
|
-
start_wire_server
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
Given /^I have environment variable (\w+) set to "([^"]*)"$/ do |variable, value|
|
|
17
|
-
set_env(variable, value)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
Then(/^the wire server should have received the following messages:$/) do |expected_messages|
|
|
21
|
-
expect(messages_received).to eq expected_messages.raw.flatten
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
module WireHelper
|
|
25
|
-
attr_reader :messages_received
|
|
26
|
-
|
|
27
|
-
def start_wire_server
|
|
28
|
-
@messages_received = []
|
|
29
|
-
reader, writer = IO.pipe
|
|
30
|
-
@wire_pid = fork {
|
|
31
|
-
reader.close
|
|
32
|
-
@server.run(writer)
|
|
33
|
-
}
|
|
34
|
-
writer.close
|
|
35
|
-
Thread.new do
|
|
36
|
-
while message = reader.gets
|
|
37
|
-
@messages_received << message.strip
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
at_exit { stop_wire_server }
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def stop_wire_server
|
|
44
|
-
return unless @wire_pid
|
|
45
|
-
Process.kill('KILL', @wire_pid)
|
|
46
|
-
Process.wait(@wire_pid)
|
|
47
|
-
rescue Errno::ESRCH
|
|
48
|
-
# No such process - wire server has already been stopped by the After hook
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
Before('@wire') do
|
|
53
|
-
extend(WireHelper)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
After('@wire') do
|
|
57
|
-
stop_wire_server
|
|
58
|
-
end
|
data/gem_tasks/cucumber.rake
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
require 'cucumber/rake/task'
|
|
2
|
-
require 'cucumber/platform'
|
|
3
|
-
|
|
4
|
-
class Cucumber::Rake::Task
|
|
5
|
-
def set_profile_for_current_ruby
|
|
6
|
-
self.profile = if Cucumber::JRUBY
|
|
7
|
-
Cucumber::WINDOWS ? 'jruby_win' : 'jruby'
|
|
8
|
-
elsif Cucumber::WINDOWS_MRI
|
|
9
|
-
'windows_mri'
|
|
10
|
-
elsif Cucumber::RUBY_1_9
|
|
11
|
-
'ruby_1_9'
|
|
12
|
-
elsif Cucumber::RUBY_2_0
|
|
13
|
-
'ruby_2_0'
|
|
14
|
-
elsif Cucumber::RUBY_2_1
|
|
15
|
-
'ruby_2_1'
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
Cucumber::Rake::Task.new(:features) do |t|
|
|
21
|
-
t.fork = true
|
|
22
|
-
t.set_profile_for_current_ruby
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
task :cucumber => :features
|
data/lib/cucumber/ast.rb
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
require 'cucumber/multiline_argument'
|
|
2
|
-
|
|
3
|
-
module Cucumber
|
|
4
|
-
module Ast
|
|
5
|
-
def self.const_missing(const_name)
|
|
6
|
-
if const_name == :Table
|
|
7
|
-
warn "`Cucumber::Ast::Table` has been deprecated. Use `Cucumber::MultilineArgument::DataTable` instead."
|
|
8
|
-
return Cucumber::MultilineArgument::DataTable
|
|
9
|
-
end
|
|
10
|
-
raise "`Cucumber::Ast` no longer exists. These classes have moved into the `Cucumber::Core::Ast` namespace, but may not have the same API."
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
require 'cucumber/platform'
|
|
2
|
-
|
|
3
|
-
module Cucumber
|
|
4
|
-
# Raised if the number of a StepDefinition's Regexp match groups
|
|
5
|
-
# is different from the number of Proc arguments.
|
|
6
|
-
class ArityMismatchError < StandardError
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
class Object #:nodoc:
|
|
11
|
-
# TODO: Move most of this stuff out to an InstanceExecutor class.
|
|
12
|
-
def cucumber_instance_exec(check_arity, pseudo_method, *args, &block)
|
|
13
|
-
cucumber_run_with_backtrace_filtering(pseudo_method) do
|
|
14
|
-
if check_arity && !cucumber_compatible_arity?(args, block)
|
|
15
|
-
instance_exec do
|
|
16
|
-
ari = block.arity
|
|
17
|
-
ari = ari < 0 ? (ari.abs-1).to_s+"+" : ari
|
|
18
|
-
s1 = ari == 1 ? "" : "s"
|
|
19
|
-
s2 = args.length == 1 ? "" : "s"
|
|
20
|
-
raise Cucumber::ArityMismatchError.new(
|
|
21
|
-
"Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
|
|
22
|
-
)
|
|
23
|
-
end
|
|
24
|
-
else
|
|
25
|
-
instance_exec(*args, &block)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def cucumber_compatible_arity?(args, block)
|
|
33
|
-
return true if block.arity == args.length
|
|
34
|
-
if block.arity < 0
|
|
35
|
-
return true if args.length >= (block.arity.abs - 1)
|
|
36
|
-
end
|
|
37
|
-
false
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def cucumber_run_with_backtrace_filtering(pseudo_method)
|
|
41
|
-
begin
|
|
42
|
-
yield
|
|
43
|
-
rescue Exception => e
|
|
44
|
-
instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
|
|
45
|
-
replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
|
|
46
|
-
raise e
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
INSTANCE_EXEC_OFFSET = -3
|
|
51
|
-
|
|
52
|
-
def replace_instance_exec_invocation_line!(backtrace, instance_exec_invocation_line, pseudo_method)
|
|
53
|
-
return if Cucumber.use_full_backtrace
|
|
54
|
-
|
|
55
|
-
instance_exec_pos = backtrace.index(instance_exec_invocation_line)
|
|
56
|
-
if instance_exec_pos
|
|
57
|
-
replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
|
|
58
|
-
backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
|
|
59
|
-
|
|
60
|
-
depth = backtrace.count { |line| line == instance_exec_invocation_line }
|
|
61
|
-
end_pos = depth > 1 ? instance_exec_pos : -1
|
|
62
|
-
|
|
63
|
-
backtrace[replacement_line+1..end_pos] = nil
|
|
64
|
-
backtrace.compact!
|
|
65
|
-
else
|
|
66
|
-
# This happens with rails, because they screw up the backtrace
|
|
67
|
-
# before we get here (injecting erb stacktrace and such)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
module Events
|
|
3
|
-
|
|
4
|
-
# Event fired after a test case has finished executing
|
|
5
|
-
class AfterTestCase
|
|
6
|
-
|
|
7
|
-
# The test case that was just executed.
|
|
8
|
-
#
|
|
9
|
-
# @return [Cucumber::Core::Test::Case]
|
|
10
|
-
attr_reader :test_case
|
|
11
|
-
|
|
12
|
-
# The result of executing the test case.
|
|
13
|
-
#
|
|
14
|
-
# @return [Cucumber::Core::Test::Result]
|
|
15
|
-
attr_reader :result
|
|
16
|
-
|
|
17
|
-
# @private
|
|
18
|
-
def initialize(test_case, result)
|
|
19
|
-
@test_case, @result = test_case, result
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
end
|
|
25
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
module Events
|
|
3
|
-
|
|
4
|
-
# Event fired after each test step has been executed
|
|
5
|
-
class AfterTestStep
|
|
6
|
-
|
|
7
|
-
# The test case currently being executed.
|
|
8
|
-
#
|
|
9
|
-
# @return [Cucumber::Core::Test::Case]
|
|
10
|
-
attr_reader :test_case
|
|
11
|
-
|
|
12
|
-
# The test step that was just executed.
|
|
13
|
-
#
|
|
14
|
-
# @return [Cucumber::Core::Test::Step]
|
|
15
|
-
attr_reader :test_step
|
|
16
|
-
|
|
17
|
-
# The result of executing the test step.
|
|
18
|
-
#
|
|
19
|
-
# @return [Cucumber::Core::Test::Result]
|
|
20
|
-
attr_reader :result
|
|
21
|
-
|
|
22
|
-
# @private
|
|
23
|
-
def initialize(test_case, test_step, result)
|
|
24
|
-
@test_case, @test_step, @result = test_case, test_step, result
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
module Events
|
|
3
|
-
|
|
4
|
-
# Event fired before a test case is executed
|
|
5
|
-
class BeforeTestCase
|
|
6
|
-
|
|
7
|
-
# The test case about to be executed.
|
|
8
|
-
#
|
|
9
|
-
# @return [Cucumber::Core::Test::Case]
|
|
10
|
-
attr_reader :test_case
|
|
11
|
-
|
|
12
|
-
# @private
|
|
13
|
-
def initialize(test_case)
|
|
14
|
-
@test_case = test_case
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
module Events
|
|
3
|
-
|
|
4
|
-
# Event fired before a test step is executed
|
|
5
|
-
class BeforeTestStep
|
|
6
|
-
|
|
7
|
-
# The test case currently being executed.
|
|
8
|
-
#
|
|
9
|
-
# @return [Cucumber::Core::Test::Case]
|
|
10
|
-
attr_reader :test_case
|
|
11
|
-
|
|
12
|
-
# The test step about to be executed.
|
|
13
|
-
#
|
|
14
|
-
# @return [Cucumber::Core::Test::Step]
|
|
15
|
-
attr_reader :test_step
|
|
16
|
-
|
|
17
|
-
# @private
|
|
18
|
-
def initialize(test_case, test_step)
|
|
19
|
-
@test_case, @test_step = test_case, test_step
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
data/lib/cucumber/events/bus.rb
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
module Events
|
|
3
|
-
|
|
4
|
-
# Event bus
|
|
5
|
-
#
|
|
6
|
-
# Implements and in-process pub-sub events broadcaster allowing multiple observers
|
|
7
|
-
# to subscribe to different events that fire as your tests are executed.
|
|
8
|
-
#
|
|
9
|
-
# @private
|
|
10
|
-
class Bus
|
|
11
|
-
|
|
12
|
-
def initialize(default_namespace)
|
|
13
|
-
@default_namespace = default_namespace.to_s
|
|
14
|
-
@handlers = {}
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# Register for an event
|
|
18
|
-
def register(event_id, handler_object = nil, &handler_proc)
|
|
19
|
-
handler = handler_proc || handler_object
|
|
20
|
-
raise ArgumentError.new("Please pass either an object or a handler block") unless handler
|
|
21
|
-
event_class = parse_event_id(event_id)
|
|
22
|
-
handlers_for(event_class) << handler
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Broadcast an event
|
|
26
|
-
def notify(event)
|
|
27
|
-
handlers_for(event.class).each { |handler| handler.call(event) }
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def handlers_for(event_class)
|
|
33
|
-
@handlers[event_class.to_s] ||= []
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def parse_event_id(event_id)
|
|
37
|
-
case event_id
|
|
38
|
-
when Class
|
|
39
|
-
return event_id
|
|
40
|
-
when String
|
|
41
|
-
constantize(event_id)
|
|
42
|
-
else
|
|
43
|
-
constantize("#{@default_namespace}::#{camel_case(event_id)}")
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def camel_case(underscored_name)
|
|
48
|
-
underscored_name.to_s.split("_").map { |word| word.upcase[0] + word[1..-1] }.join
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Thanks ActiveSupport
|
|
52
|
-
# (Only needed to support Ruby 1.9.3 and JRuby)
|
|
53
|
-
def constantize(camel_cased_word)
|
|
54
|
-
names = camel_cased_word.split('::')
|
|
55
|
-
|
|
56
|
-
# Trigger a built-in NameError exception including the ill-formed constant in the message.
|
|
57
|
-
Object.const_get(camel_cased_word) if names.empty?
|
|
58
|
-
|
|
59
|
-
# Remove the first blank element in case of '::ClassName' notation.
|
|
60
|
-
names.shift if names.size > 1 && names.first.empty?
|
|
61
|
-
|
|
62
|
-
names.inject(Object) do |constant, name|
|
|
63
|
-
if constant == Object
|
|
64
|
-
constant.const_get(name)
|
|
65
|
-
else
|
|
66
|
-
candidate = constant.const_get(name)
|
|
67
|
-
next candidate if constant.const_defined?(name, false)
|
|
68
|
-
next candidate unless Object.const_defined?(name)
|
|
69
|
-
|
|
70
|
-
# Go down the ancestors to check if it is owned directly. The check
|
|
71
|
-
# stops when we reach Object or the end of ancestors tree.
|
|
72
|
-
constant = constant.ancestors.inject do |const, ancestor|
|
|
73
|
-
break const if ancestor == Object
|
|
74
|
-
break ancestor if ancestor.const_defined?(name, false)
|
|
75
|
-
const
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# owner is in Object, so raise
|
|
79
|
-
constant.const_get(name, false)
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
require 'cucumber/formatter/progress'
|
|
2
|
-
require 'cucumber/step_definition_light'
|
|
3
|
-
|
|
4
|
-
module Cucumber
|
|
5
|
-
module Formatter
|
|
6
|
-
class Debug
|
|
7
|
-
def initialize(runtime, io, options)
|
|
8
|
-
@io = io
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def log(message)
|
|
12
|
-
return unless ENV['DEBUG']
|
|
13
|
-
@io.puts "* #{message}"
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def respond_to?(*args)
|
|
17
|
-
true
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def method_missing(name, *args)
|
|
21
|
-
print(name)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def puts(*args)
|
|
25
|
-
print("puts")
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
private
|
|
29
|
-
|
|
30
|
-
def print(text)
|
|
31
|
-
@io.puts text
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
module Formatter
|
|
3
|
-
|
|
4
|
-
# Adapter between Cucumber::Core::Test::Runner's Report API and
|
|
5
|
-
# Cucumber's event bus
|
|
6
|
-
class EventBusReport
|
|
7
|
-
attr_reader :config
|
|
8
|
-
private :config
|
|
9
|
-
|
|
10
|
-
def initialize(config)
|
|
11
|
-
@config = config
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def before_test_case(test_case)
|
|
15
|
-
@config.notify Events::BeforeTestCase.new(test_case)
|
|
16
|
-
@test_case = test_case
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def before_test_step(test_step)
|
|
20
|
-
@config.notify Events::BeforeTestStep.new(@test_case, test_step)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def after_test_step(test_step, result)
|
|
24
|
-
@config.notify Events::AfterTestStep.new(@test_case, test_step, result)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def after_test_case(test_case, result)
|
|
28
|
-
@config.notify Events::AfterTestCase.new(test_case, result)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def done
|
|
32
|
-
@config.notify Events::FinishedTesting.new
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
module RbSupport
|
|
3
|
-
# Wrapper for Before, After and AfterStep hooks
|
|
4
|
-
class RbHook
|
|
5
|
-
attr_reader :tag_expressions, :location
|
|
6
|
-
|
|
7
|
-
def initialize(rb_language, tag_expressions, proc)
|
|
8
|
-
@rb_language = rb_language
|
|
9
|
-
@tag_expressions = tag_expressions
|
|
10
|
-
@proc = proc
|
|
11
|
-
@location = Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def invoke(pseudo_method, arguments, &block)
|
|
15
|
-
@rb_language.current_world.cucumber_instance_exec(false, pseudo_method, *[arguments, block].flatten.compact, &@proc)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
require 'cucumber/step_match'
|
|
2
|
-
require 'cucumber/step_argument'
|
|
3
|
-
require 'cucumber/core_ext/string'
|
|
4
|
-
|
|
5
|
-
module Cucumber
|
|
6
|
-
module RbSupport
|
|
7
|
-
# A Ruby Step Definition holds a Regexp and a Proc, and is created
|
|
8
|
-
# by calling <tt>Given</tt>, <tt>When</tt> or <tt>Then</tt>
|
|
9
|
-
# in the <tt>step_definitions</tt> ruby files. See also RbDsl.
|
|
10
|
-
#
|
|
11
|
-
# Example:
|
|
12
|
-
#
|
|
13
|
-
# Given /I have (\d+) cucumbers in my belly/ do
|
|
14
|
-
# # some code here
|
|
15
|
-
# end
|
|
16
|
-
#
|
|
17
|
-
class RbStepDefinition
|
|
18
|
-
|
|
19
|
-
class MissingProc < StandardError
|
|
20
|
-
def message
|
|
21
|
-
"Step definitions must always have a proc or symbol"
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
class << self
|
|
26
|
-
def new(rb_language, pattern, proc_or_sym, options)
|
|
27
|
-
raise MissingProc if proc_or_sym.nil?
|
|
28
|
-
super rb_language, parse_pattern(pattern), create_proc(proc_or_sym, options)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
def parse_pattern(pattern)
|
|
34
|
-
return pattern if pattern.is_a?(Regexp)
|
|
35
|
-
raise ArgumentError unless pattern.is_a?(String)
|
|
36
|
-
p = Regexp.escape(pattern)
|
|
37
|
-
p = p.gsub(/\\\$\w+/, '(.*)') # Replace $var with (.*)
|
|
38
|
-
Regexp.new("^#{p}$")
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def create_proc(proc_or_sym, options)
|
|
42
|
-
return proc_or_sym if proc_or_sym.is_a?(Proc)
|
|
43
|
-
raise ArgumentError unless proc_or_sym.is_a?(Symbol)
|
|
44
|
-
message = proc_or_sym
|
|
45
|
-
target_proc = parse_target_proc_from(options)
|
|
46
|
-
patch_location_onto lambda { |*args|
|
|
47
|
-
target = instance_exec(&target_proc)
|
|
48
|
-
target.send(message, *args)
|
|
49
|
-
}
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def patch_location_onto(block)
|
|
53
|
-
location = Core::Ast::Location.of_caller(5)
|
|
54
|
-
block.define_singleton_method(:source_location) { [location.file, location.line] }
|
|
55
|
-
block
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def parse_target_proc_from(options)
|
|
59
|
-
return lambda { self } unless options.key?(:on)
|
|
60
|
-
target = options[:on]
|
|
61
|
-
case target
|
|
62
|
-
when Proc
|
|
63
|
-
target
|
|
64
|
-
when Symbol
|
|
65
|
-
lambda { self.send(target) }
|
|
66
|
-
else
|
|
67
|
-
lambda { raise ArgumentError, "Target must be a symbol or a proc" }
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def initialize(rb_language, regexp, proc)
|
|
73
|
-
@rb_language, @regexp, @proc = rb_language, regexp, proc
|
|
74
|
-
@rb_language.available_step_definition(regexp_source, location)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def regexp_source
|
|
78
|
-
@regexp.inspect
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def to_hash
|
|
82
|
-
flags = ''
|
|
83
|
-
flags += 'm' if (@regexp.options & Regexp::MULTILINE) != 0
|
|
84
|
-
flags += 'i' if (@regexp.options & Regexp::IGNORECASE) != 0
|
|
85
|
-
flags += 'x' if (@regexp.options & Regexp::EXTENDED) != 0
|
|
86
|
-
{'source' => @regexp.source, 'flags' => flags}
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def ==(step_definition)
|
|
90
|
-
regexp_source == step_definition.regexp_source
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def arguments_from(step_name)
|
|
94
|
-
args = StepArgument.arguments_from(@regexp, step_name)
|
|
95
|
-
@rb_language.invoked_step_definition(regexp_source, location) if args
|
|
96
|
-
args
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def invoke(args)
|
|
100
|
-
begin
|
|
101
|
-
args = @rb_language.execute_transforms(args)
|
|
102
|
-
@rb_language.current_world.cucumber_instance_exec(true, regexp_source, *args, &@proc)
|
|
103
|
-
rescue Cucumber::ArityMismatchError => e
|
|
104
|
-
e.backtrace.unshift(self.backtrace_line)
|
|
105
|
-
raise e
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def backtrace_line
|
|
110
|
-
"#{location.to_s}:in `#{regexp_source}'"
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def file_colon_line
|
|
114
|
-
case @proc
|
|
115
|
-
when Proc
|
|
116
|
-
location.to_s
|
|
117
|
-
when Symbol
|
|
118
|
-
":#{@proc}"
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def location
|
|
123
|
-
@location ||= Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def file
|
|
127
|
-
@file ||= location.file
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
end
|