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,59 +0,0 @@
|
|
|
1
|
-
module Cucumber
|
|
2
|
-
module RbSupport
|
|
3
|
-
# A Ruby Transform holds a Regexp and a Proc, and is created
|
|
4
|
-
# by calling <tt>Transform in the <tt>support</tt> ruby files.
|
|
5
|
-
# See also RbDsl.
|
|
6
|
-
#
|
|
7
|
-
# Example:
|
|
8
|
-
#
|
|
9
|
-
# Transform /^(\d+) cucumbers$/ do |cucumbers_string|
|
|
10
|
-
# cucumbers_string.to_i
|
|
11
|
-
# end
|
|
12
|
-
#
|
|
13
|
-
class RbTransform
|
|
14
|
-
class MissingProc < StandardError
|
|
15
|
-
def message
|
|
16
|
-
"Transforms must always have a proc with at least one argument"
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def initialize(rb_language, pattern, proc)
|
|
21
|
-
raise MissingProc if proc.nil? || proc.arity < 1
|
|
22
|
-
@rb_language, @regexp, @proc = rb_language, Regexp.new(pattern), proc
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def match(arg)
|
|
26
|
-
arg ? arg.match(@regexp) : nil
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def invoke(arg)
|
|
30
|
-
if matched = match(arg)
|
|
31
|
-
args = matched.captures.empty? ? [arg] : matched.captures
|
|
32
|
-
@rb_language.current_world.cucumber_instance_exec(true, @regexp.inspect, *args, &@proc)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def to_s
|
|
37
|
-
convert_captures(strip_anchors(@regexp.source))
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
private
|
|
41
|
-
def convert_captures(regexp_source)
|
|
42
|
-
regexp_source
|
|
43
|
-
.gsub(/(\()(?!\?[<:=!])/,'(?:')
|
|
44
|
-
.gsub(/(\(\?<)(?![=!])/,'(?:<')
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def strip_captures(regexp_source)
|
|
48
|
-
regexp_source.
|
|
49
|
-
gsub(/(\()/, '').
|
|
50
|
-
gsub(/(\))/, '')
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def strip_anchors(regexp_source)
|
|
54
|
-
regexp_source.
|
|
55
|
-
gsub(/(^\^|\$$)/, '')
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
require 'cucumber/gherkin/formatter/ansi_escapes'
|
|
2
|
-
|
|
3
|
-
module Cucumber
|
|
4
|
-
module RbSupport
|
|
5
|
-
# Defines the basic DSL methods availlable in all Cucumber step definitions.
|
|
6
|
-
#
|
|
7
|
-
# You can, and probably should, extend this DSL with your own methods that
|
|
8
|
-
# make sense in your domain. For more on that, see {Cucumber::RbSupport::RbDsl#World}
|
|
9
|
-
module RbWorld
|
|
10
|
-
|
|
11
|
-
# @private
|
|
12
|
-
AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
|
|
13
|
-
|
|
14
|
-
# Call a Transform with a string from another Transform definition
|
|
15
|
-
def Transform(arg)
|
|
16
|
-
rb = @__cucumber_runtime.support_code.ruby
|
|
17
|
-
rb.execute_transforms([arg]).first
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# @private
|
|
21
|
-
attr_writer :__cucumber_runtime, :__natural_language
|
|
22
|
-
|
|
23
|
-
# Run a single Gherkin step
|
|
24
|
-
# @example Call another step
|
|
25
|
-
# step "I am logged in"
|
|
26
|
-
# @example Call a step with quotes in the name
|
|
27
|
-
# step %{the user "Dave" is logged in}
|
|
28
|
-
# @example Passing a table
|
|
29
|
-
# step "the following users exist:", table(%{
|
|
30
|
-
# | name | email |
|
|
31
|
-
# | Matt | matt@matt.com |
|
|
32
|
-
# | Aslak | aslak@aslak.com |
|
|
33
|
-
# })
|
|
34
|
-
# @example Passing a multiline string
|
|
35
|
-
# step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
|
|
36
|
-
# @param [String] name The name of the step
|
|
37
|
-
# @param [String,Cucumber::Ast::DocString,Cucumber::Ast::Table] multiline_argument
|
|
38
|
-
def step(name, raw_multiline_arg=nil)
|
|
39
|
-
location = Core::Ast::Location.of_caller
|
|
40
|
-
@__cucumber_runtime.invoke_dynamic_step(name, MultilineArgument.from(raw_multiline_arg, location))
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Run a snippet of Gherkin
|
|
44
|
-
# @example
|
|
45
|
-
# steps %{
|
|
46
|
-
# Given the user "Susan" exists
|
|
47
|
-
# And I am logged in as "Susan"
|
|
48
|
-
# }
|
|
49
|
-
# @param [String] steps_text The Gherkin snippet to run
|
|
50
|
-
def steps(steps_text)
|
|
51
|
-
location = Core::Ast::Location.of_caller
|
|
52
|
-
@__cucumber_runtime.invoke_dynamic_steps(steps_text, @__natural_language, location)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# Parse Gherkin into a {Cucumber::Ast::Table} object.
|
|
56
|
-
#
|
|
57
|
-
# Useful in conjunction with the #step method.
|
|
58
|
-
# @example Create a table
|
|
59
|
-
# users = table(%{
|
|
60
|
-
# | name | email |
|
|
61
|
-
# | Matt | matt@matt.com |
|
|
62
|
-
# | Aslak | aslak@aslak.com |
|
|
63
|
-
# })
|
|
64
|
-
# @param [String] text_or_table The Gherkin string that represents the table
|
|
65
|
-
def table(text_or_table, file=nil, line_offset=0)
|
|
66
|
-
@__cucumber_runtime.table(text_or_table, file, line_offset)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Create an {Cucumber::Ast::DocString} object
|
|
70
|
-
#
|
|
71
|
-
# Useful in conjunction with the #step method, when
|
|
72
|
-
# want to specify a content type.
|
|
73
|
-
# @example Create a multiline string
|
|
74
|
-
# code = multiline_string(%{
|
|
75
|
-
# puts "this is ruby code"
|
|
76
|
-
# %}, 'ruby')
|
|
77
|
-
def doc_string(string_without_triple_quotes, content_type='', line_offset=0)
|
|
78
|
-
STDERR.puts AnsiEscapes.failed + "WARNING: #doc_string is deprecated. Just pass a regular String instead:" + caller[0] + AnsiEscapes.reset
|
|
79
|
-
# TODO: rename this method to multiline_string
|
|
80
|
-
@__cucumber_runtime.doc_string(string_without_triple_quotes, content_type, line_offset)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# @deprecated Use {#puts} instead.
|
|
84
|
-
def announce(*messages)
|
|
85
|
-
STDERR.puts AnsiEscapes.failed + "WARNING: #announce is deprecated. Use #puts instead:" + caller[0] + AnsiEscapes.reset
|
|
86
|
-
puts(*messages)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# Print a message to the output.
|
|
90
|
-
#
|
|
91
|
-
# @note Cucumber might surprise you with the behaviour of this method. Instead
|
|
92
|
-
# of sending the output directly to STDOUT, Cucumber will intercept and cache
|
|
93
|
-
# the message until the current step has finished, and then display it.
|
|
94
|
-
#
|
|
95
|
-
# If you'd prefer to see the message immediately, call {Kernel.puts} instead.
|
|
96
|
-
def puts(*messages)
|
|
97
|
-
# Even though they won't be output until later, converting the messages to
|
|
98
|
-
# strings right away will protect them from modifications to their original
|
|
99
|
-
# objects in the mean time
|
|
100
|
-
messages.collect! { |message| "#{message}" }
|
|
101
|
-
|
|
102
|
-
@__cucumber_runtime.puts(*messages)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# Pause the tests and ask the operator for input
|
|
106
|
-
def ask(question, timeout_seconds=60)
|
|
107
|
-
@__cucumber_runtime.ask(question, timeout_seconds)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# Embed an image in the output
|
|
111
|
-
def embed(file, mime_type, label='Screenshot')
|
|
112
|
-
@__cucumber_runtime.embed(file, mime_type, label)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# Mark the matched step as pending.
|
|
116
|
-
def pending(message = "TODO")
|
|
117
|
-
if block_given?
|
|
118
|
-
begin
|
|
119
|
-
yield
|
|
120
|
-
rescue Exception
|
|
121
|
-
raise Pending, message
|
|
122
|
-
end
|
|
123
|
-
raise Pending, "Expected pending '#{message}' to fail. No Error was raised. No longer pending?"
|
|
124
|
-
else
|
|
125
|
-
raise Pending, message
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
# Skips this step and the remaining steps in the scenario
|
|
130
|
-
def skip_this_scenario(message = "Scenario skipped")
|
|
131
|
-
raise Core::Test::Result::Skipped, message
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
# Prints the list of modules that are included in the World
|
|
135
|
-
def inspect
|
|
136
|
-
modules = [self.class]
|
|
137
|
-
(class << self; self; end).instance_eval do
|
|
138
|
-
modules += included_modules
|
|
139
|
-
end
|
|
140
|
-
sprintf("#<%s:0x%x>", modules.join('+'), self.object_id)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
# see {#inspect}
|
|
144
|
-
def to_s
|
|
145
|
-
inspect
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
end
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
require "cucumber/events/bus"
|
|
2
|
-
|
|
3
|
-
module Cucumber
|
|
4
|
-
module Events
|
|
5
|
-
class TestEvent
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
class AnotherTestEvent
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe Bus do
|
|
12
|
-
let(:bus) { Bus.new(Cucumber::Events) }
|
|
13
|
-
let(:test_event) { TestEvent.new }
|
|
14
|
-
let(:another_test_event) { AnotherTestEvent.new }
|
|
15
|
-
|
|
16
|
-
it "calls subscriber with event payload" do
|
|
17
|
-
received_payload = nil
|
|
18
|
-
bus.register(TestEvent) do |event|
|
|
19
|
-
received_payload = event
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
bus.notify test_event
|
|
23
|
-
|
|
24
|
-
expect(received_payload).to eq(test_event)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it "does not call subscribers for other events" do
|
|
28
|
-
handler_called = false
|
|
29
|
-
bus.register(TestEvent) do |event|
|
|
30
|
-
handler_called = true
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
bus.notify another_test_event
|
|
34
|
-
|
|
35
|
-
expect(handler_called).to eq(false)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "broadcasts to multiple subscribers" do
|
|
39
|
-
received_events = []
|
|
40
|
-
bus.register(TestEvent) do |event|
|
|
41
|
-
received_events << event
|
|
42
|
-
end
|
|
43
|
-
bus.register(TestEvent) do |event|
|
|
44
|
-
received_events << event
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
bus.notify test_event
|
|
48
|
-
|
|
49
|
-
expect(received_events.length).to eq 2
|
|
50
|
-
expect(received_events).to all eq test_event
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it "allows subscription by string" do
|
|
54
|
-
received_payload = nil
|
|
55
|
-
bus.register('Cucumber::Events::TestEvent') do |event|
|
|
56
|
-
received_payload = event
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
bus.notify test_event
|
|
60
|
-
|
|
61
|
-
expect(received_payload).to eq(test_event)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it "allows subscription by symbol (for events in the Cucumber::Events namespace)" do
|
|
65
|
-
received_payload = nil
|
|
66
|
-
bus.register(:test_event) do |event|
|
|
67
|
-
received_payload = event
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
bus.notify test_event
|
|
71
|
-
|
|
72
|
-
expect(received_payload).to eq(test_event)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it "allows handlers that are objects with a `call` method" do
|
|
76
|
-
class MyHandler
|
|
77
|
-
attr_reader :received_payload
|
|
78
|
-
|
|
79
|
-
def call(event)
|
|
80
|
-
@received_payload = event
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
handler = MyHandler.new
|
|
85
|
-
bus.register(TestEvent, handler)
|
|
86
|
-
|
|
87
|
-
bus.notify test_event
|
|
88
|
-
|
|
89
|
-
expect(handler.received_payload).to eq test_event
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'cucumber/formatter/spec_helper'
|
|
3
|
-
require 'cucumber/formatter/debug'
|
|
4
|
-
require 'cucumber/cli/options'
|
|
5
|
-
|
|
6
|
-
module Cucumber
|
|
7
|
-
module Formatter
|
|
8
|
-
describe Debug do
|
|
9
|
-
extend SpecHelperDsl
|
|
10
|
-
include SpecHelper
|
|
11
|
-
|
|
12
|
-
before(:each) do
|
|
13
|
-
Cucumber::Term::ANSIColor.coloring = false
|
|
14
|
-
@out = StringIO.new
|
|
15
|
-
@formatter = Debug.new(runtime, @out, {})
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe "given a single feature" do
|
|
19
|
-
before(:each) { run_defined_feature }
|
|
20
|
-
|
|
21
|
-
describe "with a scenario" do
|
|
22
|
-
define_feature <<-FEATURE
|
|
23
|
-
Feature: Banana party
|
|
24
|
-
|
|
25
|
-
Scenario: Monkey eats banana
|
|
26
|
-
Given there are bananas
|
|
27
|
-
FEATURE
|
|
28
|
-
|
|
29
|
-
it "outputs the events as expected" do
|
|
30
|
-
expect(@out.string).to eq(<<EXPECTED)
|
|
31
|
-
before_test_case
|
|
32
|
-
before_features
|
|
33
|
-
before_feature
|
|
34
|
-
before_tags
|
|
35
|
-
after_tags
|
|
36
|
-
feature_name
|
|
37
|
-
before_test_step
|
|
38
|
-
after_test_step
|
|
39
|
-
before_test_step
|
|
40
|
-
before_feature_element
|
|
41
|
-
before_tags
|
|
42
|
-
after_tags
|
|
43
|
-
scenario_name
|
|
44
|
-
before_steps
|
|
45
|
-
before_step
|
|
46
|
-
before_step_result
|
|
47
|
-
step_name
|
|
48
|
-
after_step_result
|
|
49
|
-
after_step
|
|
50
|
-
after_test_step
|
|
51
|
-
after_steps
|
|
52
|
-
after_feature_element
|
|
53
|
-
after_test_case
|
|
54
|
-
after_feature
|
|
55
|
-
after_features
|
|
56
|
-
done
|
|
57
|
-
EXPECTED
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
end
|
|
64
|
-
end
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
require 'cucumber/configuration'
|
|
2
|
-
require 'cucumber/runtime'
|
|
3
|
-
require 'cucumber/formatter/spec_helper'
|
|
4
|
-
require 'cucumber/formatter/event_bus_report'
|
|
5
|
-
|
|
6
|
-
module Cucumber
|
|
7
|
-
module Formatter
|
|
8
|
-
describe EventBusReport do
|
|
9
|
-
extend SpecHelperDsl
|
|
10
|
-
include SpecHelper
|
|
11
|
-
|
|
12
|
-
context "With no options" do
|
|
13
|
-
let(:config) { Cucumber::Configuration.new }
|
|
14
|
-
|
|
15
|
-
before(:each) do
|
|
16
|
-
@formatter = EventBusReport.new(config)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
describe "given a single feature" do
|
|
20
|
-
|
|
21
|
-
describe "a scenario with a single passing step" do
|
|
22
|
-
define_feature <<-FEATURE
|
|
23
|
-
Feature:
|
|
24
|
-
Scenario: Test Scenario
|
|
25
|
-
Given passing
|
|
26
|
-
FEATURE
|
|
27
|
-
|
|
28
|
-
define_steps do
|
|
29
|
-
Given(/pass/) {}
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it "emits a BeforeTestCase event" do
|
|
33
|
-
received_event = nil
|
|
34
|
-
config.on_event Cucumber::Events::BeforeTestCase do |event|
|
|
35
|
-
received_event = event
|
|
36
|
-
end
|
|
37
|
-
run_defined_feature
|
|
38
|
-
expect(received_event.test_case.name).to eq "Test Scenario"
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it "emits a BeforeTestStep event" do
|
|
42
|
-
received_event = nil
|
|
43
|
-
config.on_event Cucumber::Events::BeforeTestStep do |event|
|
|
44
|
-
received_event = event
|
|
45
|
-
end
|
|
46
|
-
run_defined_feature
|
|
47
|
-
expect(received_event.test_case.name).to eq "Test Scenario"
|
|
48
|
-
expect(received_event.test_step.name).to eq "passing"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it "emits an AfterTestStep event with a passed result" do
|
|
52
|
-
received_event = nil
|
|
53
|
-
config.on_event Cucumber::Events::AfterTestStep do |event|
|
|
54
|
-
received_event = event
|
|
55
|
-
end
|
|
56
|
-
run_defined_feature
|
|
57
|
-
expect(received_event.test_case.name).to eq "Test Scenario"
|
|
58
|
-
expect(received_event.test_step.name).to eq "passing"
|
|
59
|
-
expect(received_event.result).to be_passed
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "emits an AfterTestCase event with a passed result" do
|
|
63
|
-
received_event = nil
|
|
64
|
-
config.on_event Cucumber::Events::AfterTestCase do |event|
|
|
65
|
-
received_event = event
|
|
66
|
-
end
|
|
67
|
-
run_defined_feature
|
|
68
|
-
expect(received_event.test_case.name).to eq "Test Scenario"
|
|
69
|
-
expect(received_event.result).to be_passed
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
it "emits a Done event when the test run is finished" do
|
|
73
|
-
received_event = nil
|
|
74
|
-
config.on_event Cucumber::Events::FinishedTesting do |event|
|
|
75
|
-
received_event = event
|
|
76
|
-
end
|
|
77
|
-
run_defined_feature
|
|
78
|
-
expect(received_event).not_to be_nil
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'cucumber/rb_support/rb_language'
|
|
3
|
-
|
|
4
|
-
module Cucumber
|
|
5
|
-
module RbSupport
|
|
6
|
-
describe RbStepDefinition do
|
|
7
|
-
let(:user_interface) { double('user interface') }
|
|
8
|
-
let(:rb) { support_code.ruby }
|
|
9
|
-
let(:support_code) do
|
|
10
|
-
Cucumber::Runtime::SupportCode.new(user_interface)
|
|
11
|
-
end
|
|
12
|
-
let(:dsl) do
|
|
13
|
-
rb
|
|
14
|
-
Object.new.extend(RbSupport::RbDsl)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe "#load_code_file" do
|
|
18
|
-
after do
|
|
19
|
-
FileUtils.rm_rf('tmp.rb')
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def a_file_called(name)
|
|
23
|
-
File.open('tmp.rb', 'w') do |f|
|
|
24
|
-
f.puts yield
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it "re-loads the file when called multiple times" do
|
|
29
|
-
a_file_called('tmp.rb') do
|
|
30
|
-
"$foo = 1"
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
rb.load_code_file('tmp.rb')
|
|
34
|
-
expect($foo).to eq 1
|
|
35
|
-
|
|
36
|
-
a_file_called('tmp.rb') do
|
|
37
|
-
"$foo = 2"
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
rb.load_code_file('tmp.rb')
|
|
41
|
-
|
|
42
|
-
expect($foo).to eq 2
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "only loads ruby files" do
|
|
46
|
-
a_file_called("readme.md") do
|
|
47
|
-
"yo"
|
|
48
|
-
end
|
|
49
|
-
rb.load_code_file('readme.md')
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
describe "Handling the World" do
|
|
54
|
-
it "raises an error if the world is nil" do
|
|
55
|
-
dsl.World {}
|
|
56
|
-
|
|
57
|
-
begin
|
|
58
|
-
rb.begin_scenario(nil)
|
|
59
|
-
raise "Should fail"
|
|
60
|
-
rescue RbSupport::NilWorld => e
|
|
61
|
-
expect(e.message).to eq "World procs should never return nil"
|
|
62
|
-
expect(e.backtrace.length).to eq 1
|
|
63
|
-
expect(e.backtrace[0]).to match(/spec\/cucumber\/rb_support\/rb_language_spec\.rb\:\d+\:in `World'/)
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
module ModuleOne
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
module ModuleTwo
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
class ClassOne
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
it "implicitlys extend world with modules" do
|
|
77
|
-
dsl.World(ModuleOne, ModuleTwo)
|
|
78
|
-
rb.begin_scenario(double('scenario').as_null_object)
|
|
79
|
-
class << rb.current_world
|
|
80
|
-
extend RSpec::Matchers
|
|
81
|
-
|
|
82
|
-
expect(included_modules.inspect).to match(/ModuleOne/) # Workaround for RSpec/Ruby 1.9 issue with namespaces
|
|
83
|
-
expect(included_modules.inspect).to match(/ModuleTwo/)
|
|
84
|
-
end
|
|
85
|
-
expect(rb.current_world.class).to eq Object
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "raises error when we try to register more than one World proc" do
|
|
89
|
-
expected_error = %{You can only pass a proc to #World once, but it's happening
|
|
90
|
-
in 2 places:
|
|
91
|
-
|
|
92
|
-
spec/cucumber/rb_support/rb_language_spec.rb:\\d+:in `World'
|
|
93
|
-
spec/cucumber/rb_support/rb_language_spec.rb:\\d+:in `World'
|
|
94
|
-
|
|
95
|
-
Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc
|
|
96
|
-
or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
dsl.World { Hash.new }
|
|
100
|
-
|
|
101
|
-
expect(-> {
|
|
102
|
-
dsl.World { Array.new }
|
|
103
|
-
}).to raise_error(RbSupport::MultipleWorld, /#{expected_error}/)
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
describe "step argument transformations" do
|
|
108
|
-
describe "without capture groups" do
|
|
109
|
-
it "complains when registering with a with no transform block" do
|
|
110
|
-
expect(-> {
|
|
111
|
-
dsl.Transform('^abc$')
|
|
112
|
-
}).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "complains when registering with a zero-arg transform block" do
|
|
116
|
-
expect(-> {
|
|
117
|
-
dsl.Transform('^abc$') {42}
|
|
118
|
-
}).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
it "complains when registering with a splat-arg transform block" do
|
|
122
|
-
expect(-> {
|
|
123
|
-
dsl.Transform('^abc$') {|*splat| 42 }
|
|
124
|
-
}).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
it "complains when transforming with an arity mismatch" do
|
|
128
|
-
expect(-> {
|
|
129
|
-
dsl.Transform('^abc$') {|one, two| 42 }
|
|
130
|
-
rb.execute_transforms(['abc'])
|
|
131
|
-
}).to raise_error(Cucumber::ArityMismatchError)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
it "allows registering a regexp pattern that yields the step_arg matched" do
|
|
135
|
-
dsl.Transform(/^ab*c$/) {|arg| 42}
|
|
136
|
-
|
|
137
|
-
expect(rb.execute_transforms(['ab'])).to eq ['ab']
|
|
138
|
-
expect(rb.execute_transforms(['ac'])).to eq [42]
|
|
139
|
-
expect(rb.execute_transforms(['abc'])).to eq [42]
|
|
140
|
-
expect(rb.execute_transforms(['abbc'])).to eq [42]
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it "transforms times" do
|
|
144
|
-
require 'time'
|
|
145
|
-
dsl.Transform(/^(\d\d-\d\d-\d\d\d\d)$/) do |arg|
|
|
146
|
-
Time.parse(arg)
|
|
147
|
-
end
|
|
148
|
-
expect(rb.execute_transforms(['10-0E-1971'])).to eq ['10-0E-1971']
|
|
149
|
-
expect(rb.execute_transforms(['10-03-1971'])).to eq [Time.parse('10-03-1971')]
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
describe "with capture groups" do
|
|
154
|
-
it "complains when registering with a with no transform block" do
|
|
155
|
-
expect(-> {
|
|
156
|
-
dsl.Transform('^a(.)c$')
|
|
157
|
-
}).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
it "complains when registering with a zero-arg transform block" do
|
|
161
|
-
expect(-> {
|
|
162
|
-
dsl.Transform('^a(.)c$') { 42 }
|
|
163
|
-
}).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
it "complains when registering with a splat-arg transform block" do
|
|
167
|
-
expect(-> {
|
|
168
|
-
dsl.Transform('^a(.)c$') {|*splat| 42 }
|
|
169
|
-
}).to raise_error(Cucumber::RbSupport::RbTransform::MissingProc)
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
it "complains when transforming with an arity mismatch" do
|
|
173
|
-
expect(-> {
|
|
174
|
-
dsl.Transform('^a(.)c$') {|one, two| 42 }
|
|
175
|
-
rb.execute_transforms(['abc'])
|
|
176
|
-
}).to raise_error(Cucumber::ArityMismatchError)
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
it "allows registering a regexp pattern that yields capture groups" do
|
|
180
|
-
dsl.Transform(/^shape: (.+), color: (.+)$/) do |shape, color|
|
|
181
|
-
{shape.to_sym => color.to_sym}
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
expect(rb.execute_transforms(['shape: circle, color: blue'])).to eq [{:circle => :blue}]
|
|
185
|
-
expect(rb.execute_transforms(['shape: square, color: red'])).to eq [{:square => :red}]
|
|
186
|
-
expect(rb.execute_transforms(['not shape: square, not color: red'])).to eq ['not shape: square, not color: red']
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
it "allows registering a string pattern" do
|
|
191
|
-
dsl.Transform('^ab*c$') {|arg| 42}
|
|
192
|
-
|
|
193
|
-
expect(rb.execute_transforms(['ab'])).to eq ['ab']
|
|
194
|
-
expect(rb.execute_transforms(['ac'])).to eq [42]
|
|
195
|
-
expect(rb.execute_transforms(['abc'])).to eq [42]
|
|
196
|
-
expect(rb.execute_transforms(['abbc'])).to eq [42]
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
it "gives match priority to transforms defined last" do
|
|
200
|
-
dsl.Transform(/^transform_me$/) {|arg| :foo }
|
|
201
|
-
dsl.Transform(/^transform_me$/) {|arg| :bar }
|
|
202
|
-
dsl.Transform(/^transform_me$/) {|arg| :baz }
|
|
203
|
-
|
|
204
|
-
expect(rb.execute_transforms(['transform_me'])).to eq [:baz]
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
it "allows registering a transform which returns nil" do
|
|
208
|
-
dsl.Transform('^ac$') {|arg| nil}
|
|
209
|
-
|
|
210
|
-
expect(rb.execute_transforms(['ab'])).to eq ['ab']
|
|
211
|
-
expect(rb.execute_transforms(['ac'])).to eq [nil]
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
describe "hooks" do
|
|
216
|
-
it "finds before hooks" do
|
|
217
|
-
fish = dsl.Before('@fish'){}
|
|
218
|
-
meat = dsl.Before('@meat'){}
|
|
219
|
-
|
|
220
|
-
scenario = double('Scenario')
|
|
221
|
-
|
|
222
|
-
expect(scenario).to receive(:accept_hook?).with(fish) { true }
|
|
223
|
-
expect(scenario).to receive(:accept_hook?).with(meat) { false }
|
|
224
|
-
expect(rb.hooks_for(:before, scenario)).to eq [fish]
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
it "finds around hooks" do
|
|
228
|
-
a = dsl.Around do |scenario, block|
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
b = dsl.Around('@tag') do |scenario, block|
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
scenario = double('Scenario')
|
|
235
|
-
|
|
236
|
-
expect(scenario).to receive(:accept_hook?).with(a) { true }
|
|
237
|
-
expect(scenario).to receive(:accept_hook?).with(b) { false }
|
|
238
|
-
expect(rb.hooks_for(:around, scenario)).to eq [a]
|
|
239
|
-
end
|
|
240
|
-
end
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
end
|