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
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
Given scenario step
|
|
47
47
|
"""
|
|
48
48
|
|
|
49
|
+
@todo-windows
|
|
49
50
|
Scenario: Around hooks cover background steps
|
|
50
51
|
When I run `cucumber -o /dev/null features/around_hook_covers_background.feature`
|
|
51
52
|
Then the output should contain:
|
|
@@ -53,9 +54,10 @@
|
|
|
53
54
|
Event order: around_begin background_step scenario_step around_end
|
|
54
55
|
"""
|
|
55
56
|
|
|
57
|
+
@todo-windows
|
|
56
58
|
Scenario: All hooks execute in expected order
|
|
57
59
|
When I run `cucumber -o /dev/null features/all_hook_order.feature`
|
|
58
60
|
Then the output should contain:
|
|
59
61
|
"""
|
|
60
62
|
Event order: around_begin before background_step scenario_step after around_end
|
|
61
|
-
"""
|
|
63
|
+
"""
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
Feature: Parameter Types
|
|
2
|
+
|
|
3
|
+
Parameter Types 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 parameter types.
|
|
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 Joe has gone home
|
|
15
|
+
When Sally contacts Joe
|
|
16
|
+
"""
|
|
17
|
+
And a file named "features/step_definitions/steps.rb" with:
|
|
18
|
+
"""
|
|
19
|
+
# It works with Regular Expressions
|
|
20
|
+
Given /([A-Z]\w+) has gone home/ do |person|
|
|
21
|
+
expect(person.name).to eq 'Joe'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# It works with Cucumber Expressions too
|
|
25
|
+
When "{person} contacts {person}" do |contacter, contactee|
|
|
26
|
+
expect(contacter.name).to eq 'Sally'
|
|
27
|
+
expect(contactee.name).to eq 'Joe'
|
|
28
|
+
end
|
|
29
|
+
"""
|
|
30
|
+
And a file named "features/support/env.rb" with:
|
|
31
|
+
"""
|
|
32
|
+
class Person
|
|
33
|
+
attr_reader :name
|
|
34
|
+
|
|
35
|
+
def initialize(name)
|
|
36
|
+
@name = name
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
Scenario: Parameter type defined with ParameterType method
|
|
42
|
+
This is the most basic way to use a parameter type.
|
|
43
|
+
|
|
44
|
+
Given a file named "features/support/parameter_types.rb" with:
|
|
45
|
+
"""
|
|
46
|
+
ParameterType(
|
|
47
|
+
name: 'person',
|
|
48
|
+
regexp: /[A-Z]\w+/,
|
|
49
|
+
transformer: -> (name) { Person.new(name) }
|
|
50
|
+
)
|
|
51
|
+
"""
|
|
52
|
+
When I run `cucumber features/foo.feature`
|
|
53
|
+
Then it should pass
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
Feature: World
|
|
2
|
+
|
|
3
|
+
In order to isolate each test scenario, the steps definitions belonging to the
|
|
4
|
+
same scenario will run in a isolated context, called 'world'. A world also
|
|
5
|
+
contains the helpers methods that will be used in the step definitions.
|
|
6
|
+
|
|
7
|
+
It is possible to add helpers methods to a world in three different ways:
|
|
8
|
+
|
|
9
|
+
1. Passing a module. In this case its methods will be added directly to the
|
|
10
|
+
world and be usable in the step definitions.
|
|
11
|
+
|
|
12
|
+
2. Passing a block, where the return value is the world object.
|
|
13
|
+
|
|
14
|
+
3. Passing a hash, where the keys are namespaces and the values are
|
|
15
|
+
modules. In this case, the methods of each module will be accessible using
|
|
16
|
+
the key as prefix.
|
|
17
|
+
|
|
18
|
+
Scenario: A world is extended using a module
|
|
19
|
+
Given a file named "features/support/helpers.rb" with:
|
|
20
|
+
"""
|
|
21
|
+
module Helpers
|
|
22
|
+
def helper_method
|
|
23
|
+
42
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
World(Helpers)
|
|
28
|
+
"""
|
|
29
|
+
And a file named "features/step_definitions/step.rb" with:
|
|
30
|
+
"""
|
|
31
|
+
Then /^the helper method is called$/ do
|
|
32
|
+
expect(helper_method).to eql(42)
|
|
33
|
+
end
|
|
34
|
+
"""
|
|
35
|
+
And a file named "features/f.feature" with:
|
|
36
|
+
"""
|
|
37
|
+
Feature: Calling a method
|
|
38
|
+
Scenario: I call a method without namespaces
|
|
39
|
+
Then the helper method is called
|
|
40
|
+
"""
|
|
41
|
+
When I run `cucumber features/f.feature`
|
|
42
|
+
Then it should pass
|
|
43
|
+
|
|
44
|
+
Scenario: A world is created using a block
|
|
45
|
+
Given a file named "features/support/helpers.rb" with:
|
|
46
|
+
"""
|
|
47
|
+
class Helper
|
|
48
|
+
def helper_method
|
|
49
|
+
42
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
World do
|
|
54
|
+
Helper.new
|
|
55
|
+
end
|
|
56
|
+
"""
|
|
57
|
+
And a file named "features/step_definitions/step.rb" with:
|
|
58
|
+
"""
|
|
59
|
+
Then /^the helper method is called$/ do
|
|
60
|
+
expect(helper_method).to eql(42)
|
|
61
|
+
end
|
|
62
|
+
"""
|
|
63
|
+
And a file named "features/f.feature" with:
|
|
64
|
+
"""
|
|
65
|
+
Feature: Calling a method
|
|
66
|
+
Scenario: I call a method from a namespace
|
|
67
|
+
Then the helper method is called
|
|
68
|
+
"""
|
|
69
|
+
When I run `cucumber features/f.feature`
|
|
70
|
+
Then it should pass
|
|
71
|
+
|
|
72
|
+
Scenario: A world is extended using a module with namespace
|
|
73
|
+
Given a file named "features/support/helpers.rb" with:
|
|
74
|
+
"""
|
|
75
|
+
module Helpers
|
|
76
|
+
def helper_method
|
|
77
|
+
42
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
World(my_namespace: Helpers)
|
|
82
|
+
"""
|
|
83
|
+
And a file named "features/step_definitions/step.rb" with:
|
|
84
|
+
"""
|
|
85
|
+
Then /^the helper method is called$/ do
|
|
86
|
+
expect(my_namespace.helper_method).to eql(42)
|
|
87
|
+
end
|
|
88
|
+
"""
|
|
89
|
+
And a file named "features/f.feature" with:
|
|
90
|
+
"""
|
|
91
|
+
Feature: Calling a method
|
|
92
|
+
Scenario: I call a method from a namespace
|
|
93
|
+
Then the helper method is called
|
|
94
|
+
"""
|
|
95
|
+
When I run `cucumber features/f.feature`
|
|
96
|
+
Then it should pass
|
|
97
|
+
|
|
98
|
+
Scenario: A world is extended using multiple modules with different namespaces
|
|
99
|
+
Given a file named "features/support/helpers.rb" with:
|
|
100
|
+
"""
|
|
101
|
+
module ModuleOne
|
|
102
|
+
def forty_one
|
|
103
|
+
41
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
module ModuleTwo
|
|
108
|
+
def forty_two
|
|
109
|
+
42
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
World(module_one: ModuleOne, module_two: ModuleTwo)
|
|
114
|
+
"""
|
|
115
|
+
And a file named "features/step_definitions/step.rb" with:
|
|
116
|
+
"""
|
|
117
|
+
Then /^the helper method is called$/ do
|
|
118
|
+
expect(module_one.forty_one).to eql(41)
|
|
119
|
+
expect(module_two.forty_two).to eql(42)
|
|
120
|
+
end
|
|
121
|
+
"""
|
|
122
|
+
And a file named "features/f.feature" with:
|
|
123
|
+
"""
|
|
124
|
+
Feature: Calling a method
|
|
125
|
+
Scenario: I call a method from two namespaces
|
|
126
|
+
Then the helper method is called
|
|
127
|
+
"""
|
|
128
|
+
When I run `cucumber features/f.feature`
|
|
129
|
+
Then it should pass
|
|
@@ -1,26 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
path = File.expand_path(current_dir + "/Gemfile")
|
|
3
|
-
write_file path, content
|
|
4
|
-
set_env "BUNDLE_GEMFILE", path
|
|
5
|
-
end
|
|
6
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
7
2
|
Then(/^it should (pass|fail)$/) do |result|
|
|
8
3
|
assert_success result == 'pass'
|
|
9
4
|
end
|
|
10
5
|
|
|
11
|
-
Then(
|
|
6
|
+
Then('{string} should not be required') do |file_name|
|
|
12
7
|
expect(all_output).not_to include("* #{file_name}")
|
|
13
8
|
end
|
|
14
9
|
|
|
15
|
-
Then(
|
|
10
|
+
Then('{string} should be required') do |file_name|
|
|
16
11
|
expect(all_output).to include("* #{file_name}")
|
|
17
12
|
end
|
|
18
13
|
|
|
19
|
-
Then
|
|
14
|
+
Then('it fails before running features with:') do |expected|
|
|
20
15
|
assert_matching_output("\\A#{expected}", all_output)
|
|
21
16
|
assert_success(false)
|
|
22
17
|
end
|
|
23
18
|
|
|
24
|
-
Then(
|
|
19
|
+
Then('the output includes the message {string}') do |message|
|
|
25
20
|
expect(all_output).to include(message)
|
|
26
21
|
end
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
Given('a directory without standard Cucumber project directory structure') do
|
|
2
3
|
in_current_dir do
|
|
3
4
|
FileUtils.rm_rf 'features' if File.directory?('features')
|
|
4
5
|
end
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
Given
|
|
8
|
+
Given('a scenario with a step that looks like this:') do |string|
|
|
8
9
|
create_feature do
|
|
9
10
|
create_scenario { string }
|
|
10
11
|
end
|
|
11
12
|
end
|
|
12
13
|
|
|
13
|
-
Given(
|
|
14
|
+
Given('a scenario with a step that looks like this in japanese:') do |string|
|
|
14
15
|
create_feature_ja do
|
|
15
16
|
create_scenario_ja { string }
|
|
16
17
|
end
|
|
17
18
|
end
|
|
18
19
|
|
|
19
|
-
Given(
|
|
20
|
+
Given('the standard step definitions') do
|
|
20
21
|
write_file 'features/step_definitions/steps.rb',
|
|
21
22
|
|
|
22
23
|
<<-STEPS
|
|
@@ -28,11 +29,11 @@ Given(/^the standard step definitions$/) do
|
|
|
28
29
|
STEPS
|
|
29
30
|
end
|
|
30
31
|
|
|
31
|
-
Given
|
|
32
|
+
Given('a step definition that looks like this:') do |string|
|
|
32
33
|
create_step_definition { string }
|
|
33
34
|
end
|
|
34
35
|
|
|
35
|
-
Given
|
|
36
|
+
Given('a scenario {string} that passes') do |name|
|
|
36
37
|
write_file "features/#{name}.feature",
|
|
37
38
|
<<-FEATURE
|
|
38
39
|
Feature: #{name}
|
|
@@ -46,7 +47,7 @@ Given /^a scenario "([^\"]*)" that passes$/ do |name|
|
|
|
46
47
|
STEPS
|
|
47
48
|
end
|
|
48
49
|
|
|
49
|
-
Given
|
|
50
|
+
Given('a scenario {string} that fails') do |name|
|
|
50
51
|
write_file "features/#{name}.feature",
|
|
51
52
|
<<-FEATURE
|
|
52
53
|
Feature: #{name}
|
|
@@ -60,15 +61,11 @@ Given /^a scenario "([^\"]*)" that fails$/ do |name|
|
|
|
60
61
|
STEPS
|
|
61
62
|
end
|
|
62
63
|
|
|
63
|
-
When
|
|
64
|
+
When(/^I run the feature with the (\w+) formatter$/) do |formatter|
|
|
64
65
|
expect(features.length).to eq 1
|
|
65
66
|
run_feature features.first, formatter
|
|
66
67
|
end
|
|
67
68
|
|
|
68
|
-
Then /^the stderr should contain a warning message$/ do
|
|
69
|
-
expect(all_stderr).to include("[warning]")
|
|
70
|
-
end
|
|
71
|
-
|
|
72
69
|
module CucumberHelper
|
|
73
70
|
def run_feature(filename = 'features/a_feature.feature', formatter = 'progress')
|
|
74
71
|
run_simple "#{Cucumber::BINARY} #{filename} --format #{formatter}", false
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
# encoding: iso-8859-1
|
|
2
|
-
#
|
|
3
|
-
#
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
# Ideally we would use Norwegian keywords here, but that won't work unless this
|
|
4
|
+
# file is UTF-8 encoded.
|
|
5
|
+
# Alternatively, it would be possible to use Norwegian keywords and encode the
|
|
6
|
+
# file as UTF-8.
|
|
4
7
|
#
|
|
5
|
-
# In both cases, stepdef arguments will be sent in as UTF-8, regardless of what
|
|
6
|
-
|
|
8
|
+
# In both cases, stepdef arguments will be sent in as UTF-8, regardless of what
|
|
9
|
+
# encoding is used.
|
|
10
|
+
Given(/^jeg drikker en "([^"]*)"$/) do |drink|
|
|
7
11
|
expect(drink).to eq '�l'.encode('UTF-8')
|
|
8
12
|
end
|
|
9
13
|
|
|
10
|
-
When
|
|
14
|
+
When(/^skal de andre si "([^"]*)"$/) do |greeting|
|
|
11
15
|
expect(greeting).to eq 'sk�l'.encode('UTF-8')
|
|
12
16
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
Then('the junit output file {string} should contain:') do |actual_file, text|
|
|
2
3
|
actual = IO.read(current_dir + '/' + actual_file)
|
|
3
4
|
actual = replace_junit_time(actual)
|
|
4
5
|
expect(actual).to eq text
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
|
-
Then(
|
|
4
|
-
sample_languages =
|
|
4
|
+
Then('cucumber lists all the supported languages') do
|
|
5
|
+
sample_languages = %w(Arabic български Pirate English 日本語)
|
|
5
6
|
sample_languages.each do |language|
|
|
6
7
|
expect(all_output.force_encoding('utf-8')).to include(language)
|
|
7
8
|
end
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
Given('the following profile(s) are/is defined:') do |profiles|
|
|
2
3
|
write_file 'cucumber.yml', profiles
|
|
3
4
|
end
|
|
4
5
|
|
|
5
|
-
Then
|
|
6
|
+
Then('the {word} profile should be used') do |profile|
|
|
6
7
|
step 'the stdout should contain:', profile
|
|
7
8
|
end
|
|
8
9
|
|
|
9
|
-
Then
|
|
10
|
-
expect(all_stdout.scan(/^ \* (.*\.rb)$/).flatten).to eq files
|
|
10
|
+
Then('exactly these files should be loaded: {list}') do |files|
|
|
11
|
+
expect(all_stdout.scan(/^ \* (.*\.rb)$/).flatten).to eq files
|
|
11
12
|
end
|
|
12
13
|
|
|
13
|
-
Then
|
|
14
|
-
expect(all_stdout.scan(/^ \* (.*\.feature)$/).flatten).to eq files
|
|
14
|
+
Then('exactly these features should be run: {list}') do |files|
|
|
15
|
+
expect(all_stdout.scan(/^ \* (.*\.feature)$/).flatten).to eq files
|
|
15
16
|
end
|
|
@@ -1,35 +1,55 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
Given('a scenario {string} that fails once, then passes') do |full_name|
|
|
3
|
+
name = snake_case(full_name)
|
|
2
4
|
write_file "features/#{name}.feature",
|
|
3
5
|
<<-FEATURE
|
|
4
|
-
Feature: #{
|
|
5
|
-
Scenario: #{
|
|
6
|
+
Feature: #{full_name} feature
|
|
7
|
+
Scenario: #{full_name}
|
|
6
8
|
Given it fails once, then passes
|
|
7
9
|
FEATURE
|
|
8
10
|
|
|
9
|
-
write_file "features/
|
|
11
|
+
write_file "features/step_definitions/#{name}_steps.rb",
|
|
10
12
|
<<-STEPS
|
|
11
13
|
Given(/^it fails once, then passes$/) do
|
|
12
|
-
$#{name
|
|
13
|
-
$#{name.
|
|
14
|
-
expect($#{name.downcase}).to eql 2
|
|
14
|
+
$#{name} += 1
|
|
15
|
+
expect($#{name}).to be > 1
|
|
15
16
|
end
|
|
16
17
|
STEPS
|
|
18
|
+
|
|
19
|
+
write_file "features/support/#{name}_init.rb",
|
|
20
|
+
<<-INIT
|
|
21
|
+
$#{name} = 0
|
|
22
|
+
INIT
|
|
17
23
|
end
|
|
18
24
|
|
|
19
|
-
Given
|
|
25
|
+
Given('a scenario {string} that fails twice, then passes') do |full_name|
|
|
26
|
+
name = snake_case(full_name)
|
|
20
27
|
write_file "features/#{name}.feature",
|
|
21
28
|
<<-FEATURE
|
|
22
|
-
Feature: #{
|
|
23
|
-
Scenario: #{
|
|
29
|
+
Feature: #{full_name} feature
|
|
30
|
+
Scenario: #{full_name}
|
|
24
31
|
Given it fails twice, then passes
|
|
25
32
|
FEATURE
|
|
26
33
|
|
|
27
34
|
write_file "features/step_definitions/#{name}_steps.rb",
|
|
28
35
|
<<-STEPS
|
|
29
36
|
Given(/^it fails twice, then passes$/) do
|
|
30
|
-
$#{name
|
|
31
|
-
$#{name
|
|
32
|
-
expect($#{name
|
|
37
|
+
$#{name} ||= 0
|
|
38
|
+
$#{name} += 1
|
|
39
|
+
expect($#{name}).to be > 2
|
|
33
40
|
end
|
|
34
41
|
STEPS
|
|
42
|
+
|
|
43
|
+
write_file "features/support/#{name}_init.rb",
|
|
44
|
+
<<-INIT
|
|
45
|
+
$#{name} = 0
|
|
46
|
+
INIT
|
|
35
47
|
end
|
|
48
|
+
|
|
49
|
+
module SnakeCase
|
|
50
|
+
def snake_case(name)
|
|
51
|
+
name.downcase.gsub(/\W/, '_')
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
World(SnakeCase)
|
data/features/lib/support/env.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'aruba/cucumber'
|
|
2
3
|
require 'aruba/in_process'
|
|
3
4
|
require 'aruba/spawn_process'
|
|
@@ -7,7 +8,7 @@ Before('@spawn') do
|
|
|
7
8
|
Aruba.process = Aruba::SpawnProcess
|
|
8
9
|
end
|
|
9
10
|
|
|
10
|
-
Before('
|
|
11
|
+
Before('not @spawn') do
|
|
11
12
|
Aruba::InProcess.main_class = Cucumber::Cli::Main
|
|
12
13
|
Aruba.process = Aruba::InProcess
|
|
13
14
|
end
|
|
@@ -17,5 +18,5 @@ Before do
|
|
|
17
18
|
# set_env('SIMPLECOV', 'true')
|
|
18
19
|
|
|
19
20
|
# Set a longer timeout for aruba, and a really long one if running on JRuby
|
|
20
|
-
@aruba_timeout_seconds = Cucumber::JRUBY ?
|
|
21
|
+
@aruba_timeout_seconds = Cucumber::JRUBY ? 60 : 15
|
|
21
22
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'multi_json'
|
|
2
3
|
require 'socket'
|
|
3
4
|
|
|
@@ -42,15 +43,20 @@ class FakeWireServer
|
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
def start
|
|
45
|
-
|
|
46
|
+
message = @socket.gets
|
|
47
|
+
|
|
48
|
+
while message
|
|
46
49
|
handle(message)
|
|
50
|
+
message = @socket.gets
|
|
47
51
|
end
|
|
48
52
|
end
|
|
49
53
|
|
|
50
54
|
private
|
|
51
55
|
|
|
52
56
|
def handle(data)
|
|
53
|
-
|
|
57
|
+
protocol_entry = response_to(data.strip)
|
|
58
|
+
|
|
59
|
+
if protocol_entry
|
|
54
60
|
sleep delay(data)
|
|
55
61
|
@on_message.call(MultiJson.load(protocol_entry['request'])[0])
|
|
56
62
|
send_response(protocol_entry['response'])
|
|
@@ -59,7 +65,15 @@ class FakeWireServer
|
|
|
59
65
|
send_response(['fail', serialized_exception ].to_json)
|
|
60
66
|
end
|
|
61
67
|
rescue => e
|
|
62
|
-
|
|
68
|
+
response = [
|
|
69
|
+
'fail',
|
|
70
|
+
{
|
|
71
|
+
:message => e.message,
|
|
72
|
+
:backtrace => e.backtrace,
|
|
73
|
+
:exception => e.class
|
|
74
|
+
}
|
|
75
|
+
].to_json
|
|
76
|
+
send_response(response)
|
|
63
77
|
end
|
|
64
78
|
|
|
65
79
|
def response_to(data)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
module FeatureFactory
|
|
3
4
|
def create_feature(name = generate_feature_name)
|
|
4
5
|
gherkin = <<-GHERKIN
|
|
@@ -54,7 +55,7 @@ Feature: #{name}
|
|
|
54
55
|
end
|
|
55
56
|
|
|
56
57
|
def filename(name)
|
|
57
|
-
"features/#{name.downcase.
|
|
58
|
+
"features/#{name.downcase.tr(' ', '_')}.feature"
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
def features
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# override aruba to filter out some stuff
|
|
2
3
|
module NormaliseArubaOutput
|
|
3
4
|
def all_stdout
|
|
4
5
|
normalise_output(super)
|
|
5
6
|
end
|
|
6
7
|
|
|
8
|
+
def sanitize_text(text)
|
|
9
|
+
normalise_output(super)
|
|
10
|
+
end
|
|
11
|
+
|
|
7
12
|
def normalise_output(out)
|
|
8
|
-
out
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
out.gsub(/#{Dir.pwd}\/tmp\/aruba/, '.') # Remove absolute paths
|
|
14
|
+
.gsub(/tmp\/aruba\//, '') # Fix aruba path
|
|
15
|
+
.gsub(/^.*cucumber_process\.rb.*$\n/, '')
|
|
16
|
+
.gsub(/^\d+m\d+\.\d+s$/, '0m0.012s') # Make duration predictable
|
|
17
|
+
.gsub(/Coverage report generated .+$\n/, '') # Remove SimpleCov message
|
|
13
18
|
end
|
|
14
19
|
|
|
15
20
|
def normalise_json(json)
|
|
@@ -19,7 +24,7 @@ module NormaliseArubaOutput
|
|
|
19
24
|
elements = feature.fetch('elements') { [] }
|
|
20
25
|
elements.each do |scenario|
|
|
21
26
|
scenario['steps'].each do |step|
|
|
22
|
-
|
|
27
|
+
%w(steps before after).each do |type|
|
|
23
28
|
if scenario[type]
|
|
24
29
|
scenario[type].each do |step_or_hook|
|
|
25
30
|
normalise_json_step_or_hook(step_or_hook)
|
|
@@ -37,12 +42,9 @@ module NormaliseArubaOutput
|
|
|
37
42
|
end
|
|
38
43
|
|
|
39
44
|
def normalise_json_step_or_hook(step_or_hook)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
step_or_hook['result']['duration'] = 1
|
|
44
|
-
end
|
|
45
|
-
end
|
|
45
|
+
return unless step_or_hook['result'] && step_or_hook['result']['duration']
|
|
46
|
+
expect(step_or_hook['result']['duration']).to be >= 0
|
|
47
|
+
step_or_hook['result']['duration'] = 1
|
|
46
48
|
end
|
|
47
49
|
|
|
48
50
|
end
|
data/gem_tasks/contributors.rake
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
2
4
|
desc 'List contributors'
|
|
3
5
|
task :contributors do
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
IO.popen("git log --pretty=short --no-merges | git shortlog -ne | egrep -ve '^ +' | egrep -ve '^$'") do |f|
|
|
7
|
+
contributors = f.readlines
|
|
8
|
+
puts contributors
|
|
9
|
+
puts "Total: #{contributors.length}"
|
|
10
|
+
end
|
|
7
11
|
end
|
|
8
12
|
|
|
9
13
|
task :codeswarm do
|
|
10
|
-
sh
|
|
11
|
-
sh
|
|
14
|
+
sh 'code_swarm --reload' rescue nil # Fails because of encoding - which we'll fix
|
|
15
|
+
sh 'iconv -f latin1 -t utf-8 .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml'
|
|
12
16
|
sh "sed -e 's/Aslak\ Hellesøy@.BEKK.no/aslak.hellesoy@gmail.com/g' .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
|
|
13
17
|
sh "sed -e 's/josephwilk@joesniff.co.uk/joe@josephwilk.net/g' .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
|
|
14
|
-
sh
|
|
18
|
+
sh 'code_swarm'
|
|
15
19
|
end
|
data/gem_tasks/cov.rake
CHANGED
data/gem_tasks/downloads.rb
CHANGED