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,4 +1,5 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
require 'spec_helper'
|
|
3
4
|
require 'cucumber/multiline_argument/data_table'
|
|
4
5
|
|
|
@@ -12,30 +13,30 @@ module Cucumber
|
|
|
12
13
|
])
|
|
13
14
|
end
|
|
14
15
|
|
|
15
|
-
it
|
|
16
|
+
it 'should have rows' do
|
|
16
17
|
expect( @table.cells_rows[0].map{|cell| cell.value} ).to eq %w{one four seven}
|
|
17
18
|
end
|
|
18
19
|
|
|
19
|
-
it
|
|
20
|
+
it 'should have columns' do
|
|
20
21
|
expect( @table.columns[1].map{|cell| cell.value} ).to eq %w{four 55555}
|
|
21
22
|
end
|
|
22
23
|
|
|
23
|
-
it
|
|
24
|
+
it 'should have same cell objects in rows and columns' do
|
|
24
25
|
# 666666
|
|
25
26
|
expect( @table.cells_rows[1][2] ).to equal(@table.columns[2][1])
|
|
26
27
|
end
|
|
27
28
|
|
|
28
|
-
it
|
|
29
|
+
it 'should be convertible to an array of hashes' do
|
|
29
30
|
expect( @table.hashes ).to eq [
|
|
30
31
|
{'one' => '4444', 'four' => '55555', 'seven' => '666666'}
|
|
31
32
|
]
|
|
32
33
|
end
|
|
33
34
|
|
|
34
|
-
it
|
|
35
|
+
it 'should accept symbols as keys for the hashes' do
|
|
35
36
|
expect( @table.hashes.first[:one] ).to eq '4444'
|
|
36
37
|
end
|
|
37
38
|
|
|
38
|
-
it
|
|
39
|
+
it 'should return the row values in order' do
|
|
39
40
|
expect( @table.rows.first ).to eq %w{4444 55555 666666}
|
|
40
41
|
end
|
|
41
42
|
|
|
@@ -52,15 +53,20 @@ module Cucumber
|
|
|
52
53
|
expect{@table.symbolic_hashes}.to_not raise_error
|
|
53
54
|
end
|
|
54
55
|
|
|
56
|
+
it 'should not interfere with use of #hashes' do
|
|
57
|
+
@table.symbolic_hashes
|
|
58
|
+
expect{@table.hashes}.to_not raise_error
|
|
59
|
+
end
|
|
60
|
+
|
|
55
61
|
end
|
|
56
62
|
|
|
57
63
|
describe '#map_column!' do
|
|
58
|
-
it
|
|
64
|
+
it 'should allow mapping columns' do
|
|
59
65
|
@table.map_column!('one') { |v| v.to_i }
|
|
60
66
|
expect( @table.hashes.first['one'] ).to eq 4444
|
|
61
67
|
end
|
|
62
68
|
|
|
63
|
-
it
|
|
69
|
+
it 'applies the block once to each value' do
|
|
64
70
|
headers = ['header']
|
|
65
71
|
rows = ['value']
|
|
66
72
|
table = DataTable.from [headers, rows]
|
|
@@ -70,43 +76,43 @@ module Cucumber
|
|
|
70
76
|
expect( count ).to eq rows.size
|
|
71
77
|
end
|
|
72
78
|
|
|
73
|
-
it
|
|
79
|
+
it 'should allow mapping columns and take a symbol as the column name' do
|
|
74
80
|
@table.map_column!(:one) { |v| v.to_i }
|
|
75
81
|
expect( @table.hashes.first['one'] ).to eq 4444
|
|
76
82
|
end
|
|
77
83
|
|
|
78
|
-
it
|
|
84
|
+
it 'should allow mapping columns and modify the rows as well' do
|
|
79
85
|
@table.map_column!(:one) { |v| v.to_i }
|
|
80
86
|
expect( @table.rows.first ).to include(4444)
|
|
81
87
|
expect( @table.rows.first ).to_not include('4444')
|
|
82
88
|
end
|
|
83
89
|
|
|
84
|
-
it
|
|
90
|
+
it 'should pass silently if a mapped column does not exist in non-strict mode' do
|
|
85
91
|
expect {
|
|
86
92
|
@table.map_column!('two', false) { |v| v.to_i }
|
|
87
93
|
@table.hashes
|
|
88
94
|
}.not_to raise_error
|
|
89
95
|
end
|
|
90
96
|
|
|
91
|
-
it
|
|
97
|
+
it 'should fail if a mapped column does not exist in strict mode' do
|
|
92
98
|
expect {
|
|
93
99
|
@table.map_column!('two', true) { |v| v.to_i }
|
|
94
100
|
@table.hashes
|
|
95
101
|
}.to raise_error('The column named "two" does not exist')
|
|
96
102
|
end
|
|
97
103
|
|
|
98
|
-
it
|
|
104
|
+
it 'should return the table' do
|
|
99
105
|
expect( (@table.map_column!(:one) { |v| v.to_i }) ).to eq @table
|
|
100
106
|
end
|
|
101
107
|
end
|
|
102
108
|
|
|
103
109
|
describe '#map_column' do
|
|
104
|
-
it
|
|
110
|
+
it 'should allow mapping columns' do
|
|
105
111
|
new_table = @table.map_column('one') { |v| v.to_i }
|
|
106
112
|
expect( new_table.hashes.first['one'] ).to eq 4444
|
|
107
113
|
end
|
|
108
114
|
|
|
109
|
-
it
|
|
115
|
+
it 'applies the block once to each value' do
|
|
110
116
|
headers = ['header']
|
|
111
117
|
rows = ['value']
|
|
112
118
|
table = DataTable.from [headers, rows]
|
|
@@ -116,37 +122,37 @@ module Cucumber
|
|
|
116
122
|
expect( count ).to eq rows.size
|
|
117
123
|
end
|
|
118
124
|
|
|
119
|
-
it
|
|
125
|
+
it 'should allow mapping columns and take a symbol as the column name' do
|
|
120
126
|
new_table = @table.map_column(:one) { |v| v.to_i }
|
|
121
127
|
expect( new_table.hashes.first['one'] ).to eq 4444
|
|
122
128
|
end
|
|
123
129
|
|
|
124
|
-
it
|
|
130
|
+
it 'should allow mapping columns and modify the rows as well' do
|
|
125
131
|
new_table = @table.map_column(:one) { |v| v.to_i }
|
|
126
132
|
expect( new_table.rows.first ).to include(4444)
|
|
127
133
|
expect( new_table.rows.first ).to_not include('4444')
|
|
128
134
|
end
|
|
129
135
|
|
|
130
|
-
it
|
|
136
|
+
it 'should pass silently if a mapped column does not exist in non-strict mode' do
|
|
131
137
|
expect {
|
|
132
138
|
new_table = @table.map_column('two', false) { |v| v.to_i }
|
|
133
139
|
new_table.hashes
|
|
134
140
|
}.not_to raise_error
|
|
135
141
|
end
|
|
136
142
|
|
|
137
|
-
it
|
|
143
|
+
it 'should fail if a mapped column does not exist in strict mode' do
|
|
138
144
|
expect {
|
|
139
145
|
new_table = @table.map_column('two', true) { |v| v.to_i }
|
|
140
146
|
new_table.hashes
|
|
141
147
|
}.to raise_error('The column named "two" does not exist')
|
|
142
148
|
end
|
|
143
149
|
|
|
144
|
-
it
|
|
150
|
+
it 'should return a new table' do
|
|
145
151
|
expect( (@table.map_column(:one) { |v| v.to_i }) ).to_not eq @table
|
|
146
152
|
end
|
|
147
153
|
end
|
|
148
154
|
|
|
149
|
-
describe
|
|
155
|
+
describe '#match' do
|
|
150
156
|
before(:each) do
|
|
151
157
|
@table = DataTable.from([
|
|
152
158
|
%w{one four seven},
|
|
@@ -154,18 +160,18 @@ module Cucumber
|
|
|
154
160
|
])
|
|
155
161
|
end
|
|
156
162
|
|
|
157
|
-
it
|
|
163
|
+
it 'returns nil if headers do not match' do
|
|
158
164
|
expect( @table.match('does,not,match') ).to be_nil
|
|
159
165
|
end
|
|
160
|
-
it
|
|
166
|
+
it 'requires a table: prefix on match' do
|
|
161
167
|
expect( @table.match('table:one,four,seven') ).to_not be_nil
|
|
162
168
|
end
|
|
163
|
-
it
|
|
169
|
+
it 'does not match if no table: prefix on match' do
|
|
164
170
|
expect( @table.match('one,four,seven') ).to be_nil
|
|
165
171
|
end
|
|
166
172
|
end
|
|
167
173
|
|
|
168
|
-
describe
|
|
174
|
+
describe '#transpose' do
|
|
169
175
|
before(:each) do
|
|
170
176
|
@table = DataTable.from([
|
|
171
177
|
%w{one 1111},
|
|
@@ -173,14 +179,14 @@ module Cucumber
|
|
|
173
179
|
])
|
|
174
180
|
end
|
|
175
181
|
|
|
176
|
-
it
|
|
182
|
+
it 'should be convertible in to an array where each row is a hash' do
|
|
177
183
|
expect( @table.transpose.hashes[0] ).to eq('one' => '1111', 'two' => '22222')
|
|
178
184
|
end
|
|
179
185
|
end
|
|
180
186
|
|
|
181
|
-
describe
|
|
187
|
+
describe '#rows_hash' do
|
|
182
188
|
|
|
183
|
-
it
|
|
189
|
+
it 'should return a hash of the rows' do
|
|
184
190
|
table = DataTable.from([
|
|
185
191
|
%w{one 1111},
|
|
186
192
|
%w{two 22222}
|
|
@@ -198,7 +204,7 @@ module Cucumber
|
|
|
198
204
|
}.to raise_error('The table must have exactly 2 columns')
|
|
199
205
|
end
|
|
200
206
|
|
|
201
|
-
it
|
|
207
|
+
it 'should support header and column mapping' do
|
|
202
208
|
table = DataTable.from([
|
|
203
209
|
%w{one 1111},
|
|
204
210
|
%w{two 22222}
|
|
@@ -217,30 +223,30 @@ module Cucumber
|
|
|
217
223
|
])
|
|
218
224
|
end
|
|
219
225
|
|
|
220
|
-
it
|
|
226
|
+
it 'renames the columns to the specified values in the provided hash' do
|
|
221
227
|
@table.map_headers!('one' => :three)
|
|
222
228
|
expect( @table.hashes.first[:three] ).to eq '4444'
|
|
223
229
|
end
|
|
224
230
|
|
|
225
|
-
it
|
|
231
|
+
it 'allows renaming columns using regexp' do
|
|
226
232
|
@table.map_headers!(/one|uno/ => :three)
|
|
227
233
|
expect( @table.hashes.first[:three] ).to eq '4444'
|
|
228
234
|
end
|
|
229
235
|
|
|
230
|
-
it
|
|
236
|
+
it 'copies column mappings' do
|
|
231
237
|
@table.map_column!('one') { |v| v.to_i }
|
|
232
238
|
@table.map_headers!('one' => 'three')
|
|
233
239
|
expect( @table.hashes.first['three'] ).to eq 4444
|
|
234
240
|
end
|
|
235
241
|
|
|
236
|
-
it
|
|
242
|
+
it 'takes a block and operates on all the headers with it' do
|
|
237
243
|
table.map_headers! do |header|
|
|
238
244
|
header.downcase
|
|
239
245
|
end
|
|
240
246
|
expect( table.hashes.first.keys ).to match %w[hello world]
|
|
241
247
|
end
|
|
242
248
|
|
|
243
|
-
it
|
|
249
|
+
it 'treats the mappings in the provided hash as overrides when used with a block' do
|
|
244
250
|
table.map_headers!('WORLD' => 'foo') do |header|
|
|
245
251
|
header.downcase
|
|
246
252
|
end
|
|
@@ -257,23 +263,23 @@ module Cucumber
|
|
|
257
263
|
])
|
|
258
264
|
end
|
|
259
265
|
|
|
260
|
-
it
|
|
266
|
+
it 'renames the columns to the specified values in the provided hash' do
|
|
261
267
|
table2 = @table.map_headers('one' => :three)
|
|
262
268
|
expect( table2.hashes.first[:three] ).to eq '4444'
|
|
263
269
|
end
|
|
264
270
|
|
|
265
|
-
it
|
|
271
|
+
it 'allows renaming columns using regexp' do
|
|
266
272
|
table2 = @table.map_headers(/one|uno/ => :three)
|
|
267
273
|
expect( table2.hashes.first[:three] ).to eq '4444'
|
|
268
274
|
end
|
|
269
275
|
|
|
270
|
-
it
|
|
276
|
+
it 'copies column mappings' do
|
|
271
277
|
@table.map_column!('one') { |v| v.to_i }
|
|
272
278
|
table2 = @table.map_headers('one' => 'three')
|
|
273
279
|
expect( table2.hashes.first['three'] ).to eq 4444
|
|
274
280
|
end
|
|
275
281
|
|
|
276
|
-
it
|
|
282
|
+
it 'takes a block and operates on all the headers with it' do
|
|
277
283
|
table2 = table.map_headers do |header|
|
|
278
284
|
header.downcase
|
|
279
285
|
end
|
|
@@ -281,7 +287,7 @@ module Cucumber
|
|
|
281
287
|
expect( table2.hashes.first.keys ).to match %w[hello world]
|
|
282
288
|
end
|
|
283
289
|
|
|
284
|
-
it
|
|
290
|
+
it 'treats the mappings in the provided hash as overrides when used with a block' do
|
|
285
291
|
table2 = table.map_headers('WORLD' => 'foo') do |header|
|
|
286
292
|
header.downcase
|
|
287
293
|
end
|
|
@@ -290,8 +296,8 @@ module Cucumber
|
|
|
290
296
|
end
|
|
291
297
|
end
|
|
292
298
|
|
|
293
|
-
describe
|
|
294
|
-
it
|
|
299
|
+
describe 'diff!' do
|
|
300
|
+
it 'should detect a complex diff' do
|
|
295
301
|
t1 = DataTable.from(%{
|
|
296
302
|
| 1 | 22 | 333 | 4444 |
|
|
297
303
|
| 55555 | 666666 | 7777777 | 88888888 |
|
|
@@ -306,18 +312,19 @@ module Cucumber
|
|
|
306
312
|
| dddd | 4000 | 300 |
|
|
307
313
|
| e | 50000 | 4000 |
|
|
308
314
|
})
|
|
309
|
-
expect { t1.diff!(t2) }.to raise_error
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
315
|
+
expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
|
|
316
|
+
expect(error.table.to_s(indent: 14, color: false)).to eq %{
|
|
317
|
+
| 1 | (-) 22 | (-) 333 | 4444 | (+) a |
|
|
318
|
+
| 55555 | (-) 666666 | (-) 7777777 | 88888888 | (+) bb |
|
|
319
|
+
| (-) 999999999 | (-) 0000000000 | (-) 01010101010 | (-) 121212121212 | (+) |
|
|
320
|
+
| (+) 999999999 | (+) | (+) | (+) xxxxxxxx | (+) ccc |
|
|
321
|
+
| (+) 300 | (+) | (+) | (+) 4000 | (+) dddd |
|
|
322
|
+
| 4000 | (-) ABC | (-) DEF | 50000 | (+) e |
|
|
323
|
+
}
|
|
324
|
+
end
|
|
318
325
|
end
|
|
319
326
|
|
|
320
|
-
it
|
|
327
|
+
it 'should not change table when diffed with identical' do
|
|
321
328
|
t = DataTable.from(%{
|
|
322
329
|
|a|b|c|
|
|
323
330
|
|d|e|f|
|
|
@@ -331,8 +338,48 @@ module Cucumber
|
|
|
331
338
|
}
|
|
332
339
|
end
|
|
333
340
|
|
|
334
|
-
context
|
|
335
|
-
it
|
|
341
|
+
context 'with empty tables' do
|
|
342
|
+
it 'should allow diffing empty tables' do
|
|
343
|
+
t1 = DataTable.from([[]])
|
|
344
|
+
t2 = DataTable.from([[]])
|
|
345
|
+
expect{ t1.diff!(t2) }.not_to raise_error
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
it 'should be able to diff when the right table is empty' do
|
|
349
|
+
t1 = DataTable.from(%{
|
|
350
|
+
|a|b|c|
|
|
351
|
+
|d|e|f|
|
|
352
|
+
|g|h|i|
|
|
353
|
+
})
|
|
354
|
+
t2 = DataTable.from([[]])
|
|
355
|
+
expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
|
|
356
|
+
expect(error.table.to_s(indent: 16, color: false)).to eq %{
|
|
357
|
+
| (-) a | (-) b | (-) c |
|
|
358
|
+
| (-) d | (-) e | (-) f |
|
|
359
|
+
| (-) g | (-) h | (-) i |
|
|
360
|
+
}
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
it 'should be able to diff when the left table is empty' do
|
|
365
|
+
t1 = DataTable.from([[]])
|
|
366
|
+
t2 = DataTable.from(%{
|
|
367
|
+
|a|b|c|
|
|
368
|
+
|d|e|f|
|
|
369
|
+
|g|h|i|
|
|
370
|
+
})
|
|
371
|
+
expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
|
|
372
|
+
expect(error.table.to_s(indent: 16, color: false)).to eq %{
|
|
373
|
+
| (+) a | (+) b | (+) c |
|
|
374
|
+
| (+) d | (+) e | (+) f |
|
|
375
|
+
| (+) g | (+) h | (+) i |
|
|
376
|
+
}
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
context 'in case of duplicate header values' do
|
|
382
|
+
it 'raises no error for two identical tables' do
|
|
336
383
|
t = DataTable.from(%{
|
|
337
384
|
|a|a|c|
|
|
338
385
|
|d|e|f|
|
|
@@ -346,7 +393,7 @@ module Cucumber
|
|
|
346
393
|
}
|
|
347
394
|
end
|
|
348
395
|
|
|
349
|
-
it
|
|
396
|
+
it 'detects a diff in one cell' do
|
|
350
397
|
t1 = DataTable.from(%{
|
|
351
398
|
|a|a|c|
|
|
352
399
|
|d|e|f|
|
|
@@ -357,16 +404,17 @@ module Cucumber
|
|
|
357
404
|
|d|oops|f|
|
|
358
405
|
|g|h|i|
|
|
359
406
|
})
|
|
360
|
-
expect{ t1.diff!(t2) }.to raise_error
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
407
|
+
expect{ t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
|
|
408
|
+
expect(error.table.to_s(indent: 16, color: false)).to eq %{
|
|
409
|
+
| a | a | c |
|
|
410
|
+
| (-) d | (-) e | (-) f |
|
|
411
|
+
| (+) d | (+) oops | (+) f |
|
|
412
|
+
| g | h | i |
|
|
413
|
+
}
|
|
414
|
+
end
|
|
367
415
|
end
|
|
368
416
|
|
|
369
|
-
it
|
|
417
|
+
it 'detects missing columns' do
|
|
370
418
|
t1 = DataTable.from(%{
|
|
371
419
|
|a|a|b|c|
|
|
372
420
|
|d|d|e|f|
|
|
@@ -377,15 +425,16 @@ module Cucumber
|
|
|
377
425
|
|d|e|f|
|
|
378
426
|
|g|h|i|
|
|
379
427
|
})
|
|
380
|
-
expect{ t1.diff!(t2) }.to raise_error
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
428
|
+
expect{ t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
|
|
429
|
+
expect(error.table.to_s(indent: 16, color: false)).to eq %{
|
|
430
|
+
| a | (-) a | b | c |
|
|
431
|
+
| d | (-) d | e | f |
|
|
432
|
+
| g | (-) g | h | i |
|
|
433
|
+
}
|
|
434
|
+
end
|
|
386
435
|
end
|
|
387
436
|
|
|
388
|
-
it
|
|
437
|
+
it 'detects surplus columns' do
|
|
389
438
|
t1 = DataTable.from(%{
|
|
390
439
|
|a|b|c|
|
|
391
440
|
|d|e|f|
|
|
@@ -396,41 +445,42 @@ module Cucumber
|
|
|
396
445
|
|d|e|d|f|
|
|
397
446
|
|g|h|g|i|
|
|
398
447
|
})
|
|
399
|
-
expect{ t1.diff!(t2, :surplus_col => true) }.to raise_error
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
448
|
+
expect{ t1.diff!(t2, :surplus_col => true) }.to raise_error(DataTable::Different) do |error|
|
|
449
|
+
expect(error.table.to_s(indent: 16, color: false)).to eq %{
|
|
450
|
+
| a | b | c | (+) a |
|
|
451
|
+
| d | e | f | (+) d |
|
|
452
|
+
| g | h | i | (+) g |
|
|
453
|
+
}
|
|
454
|
+
end
|
|
405
455
|
end
|
|
406
456
|
end
|
|
407
457
|
|
|
408
|
-
it
|
|
458
|
+
it 'should inspect missing and surplus cells' do
|
|
409
459
|
t1 = DataTable.from([
|
|
410
|
-
|
|
411
|
-
|
|
460
|
+
%w(name male lastname swedish),
|
|
461
|
+
%w(aslak true hellesøy false)
|
|
412
462
|
])
|
|
413
463
|
t2 = DataTable.from([
|
|
414
|
-
|
|
415
|
-
['aslak', true,
|
|
464
|
+
%w(name male lastname swedish),
|
|
465
|
+
['aslak', true, 'hellesøy', false]
|
|
416
466
|
])
|
|
417
|
-
expect { t1.diff!(t2) }.to raise_error
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
467
|
+
expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
|
|
468
|
+
expect(error.table.to_s(indent: 14, color: false)).to eq %{
|
|
469
|
+
| name | male | lastname | swedish |
|
|
470
|
+
| (-) aslak | (-) (i) "true" | (-) hellesøy | (-) (i) "false" |
|
|
471
|
+
| (+) aslak | (+) (i) true | (+) hellesøy | (+) (i) false |
|
|
472
|
+
}
|
|
473
|
+
end
|
|
424
474
|
end
|
|
425
475
|
|
|
426
|
-
it
|
|
476
|
+
it 'should allow column mapping of target before diffing' do
|
|
427
477
|
t1 = DataTable.from([
|
|
428
|
-
|
|
429
|
-
|
|
478
|
+
%w(name male),
|
|
479
|
+
%w(aslak true)
|
|
430
480
|
])
|
|
431
481
|
t1.map_column!('male') { |m| m == 'true' }
|
|
432
482
|
t2 = DataTable.from([
|
|
433
|
-
|
|
483
|
+
%w(name male),
|
|
434
484
|
['aslak', true]
|
|
435
485
|
])
|
|
436
486
|
t1.diff!(t2)
|
|
@@ -440,17 +490,17 @@ module Cucumber
|
|
|
440
490
|
}
|
|
441
491
|
end
|
|
442
492
|
|
|
443
|
-
it
|
|
493
|
+
it 'should allow column mapping of argument before diffing' do
|
|
444
494
|
t1 = DataTable.from([
|
|
445
|
-
|
|
495
|
+
%w(name male),
|
|
446
496
|
['aslak', true]
|
|
447
497
|
])
|
|
448
498
|
t1.map_column!('male') {
|
|
449
499
|
'true'
|
|
450
500
|
}
|
|
451
501
|
t2 = DataTable.from([
|
|
452
|
-
|
|
453
|
-
|
|
502
|
+
%w(name male),
|
|
503
|
+
%w(aslak true)
|
|
454
504
|
])
|
|
455
505
|
t2.diff!(t1)
|
|
456
506
|
expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
|
|
@@ -459,15 +509,15 @@ module Cucumber
|
|
|
459
509
|
}
|
|
460
510
|
end
|
|
461
511
|
|
|
462
|
-
it
|
|
512
|
+
it 'should allow header mapping before diffing' do
|
|
463
513
|
t1 = DataTable.from([
|
|
464
|
-
|
|
465
|
-
|
|
514
|
+
%w(Name Male),
|
|
515
|
+
%w(aslak true)
|
|
466
516
|
])
|
|
467
517
|
t1.map_headers!('Name' => 'name', 'Male' => 'male')
|
|
468
518
|
t1.map_column!('male') { |m| m == 'true' }
|
|
469
519
|
t2 = DataTable.from([
|
|
470
|
-
|
|
520
|
+
%w(name male),
|
|
471
521
|
['aslak', true]
|
|
472
522
|
])
|
|
473
523
|
t1.diff!(t2)
|
|
@@ -477,27 +527,28 @@ module Cucumber
|
|
|
477
527
|
}
|
|
478
528
|
end
|
|
479
529
|
|
|
480
|
-
it
|
|
530
|
+
it 'should detect seemingly identical tables as different' do
|
|
481
531
|
t1 = DataTable.from([
|
|
482
|
-
|
|
483
|
-
|
|
532
|
+
%w(X Y),
|
|
533
|
+
%w(2 1)
|
|
484
534
|
])
|
|
485
535
|
t2 = DataTable.from([
|
|
486
|
-
|
|
536
|
+
%w(X Y),
|
|
487
537
|
[2, 1]
|
|
488
538
|
])
|
|
489
|
-
expect { t1.diff!(t2) }.to raise_error
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
539
|
+
expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
|
|
540
|
+
expect(error.table.to_s(indent: 14, color: false)).to eq %{
|
|
541
|
+
| X | Y |
|
|
542
|
+
| (-) (i) "2" | (-) (i) "1" |
|
|
543
|
+
| (+) (i) 2 | (+) (i) 1 |
|
|
544
|
+
}
|
|
545
|
+
end
|
|
495
546
|
end
|
|
496
547
|
|
|
497
|
-
it
|
|
548
|
+
it 'should not allow mappings that match more than 1 column' do
|
|
498
549
|
t1 = DataTable.from([
|
|
499
|
-
|
|
500
|
-
|
|
550
|
+
%w(Cuke Duke),
|
|
551
|
+
%w(Foo Bar)
|
|
501
552
|
])
|
|
502
553
|
expect do
|
|
503
554
|
t1.map_headers!(/uk/ => 'u')
|
|
@@ -505,7 +556,7 @@ module Cucumber
|
|
|
505
556
|
end.to raise_error(%{2 headers matched /uk/: ["Cuke", "Duke"]})
|
|
506
557
|
end
|
|
507
558
|
|
|
508
|
-
describe
|
|
559
|
+
describe 'raising' do
|
|
509
560
|
before do
|
|
510
561
|
@t = DataTable.from(%{
|
|
511
562
|
| a | b |
|
|
@@ -514,25 +565,25 @@ module Cucumber
|
|
|
514
565
|
expect( @t ).not_to eq nil
|
|
515
566
|
end
|
|
516
567
|
|
|
517
|
-
it
|
|
568
|
+
it 'should raise on missing rows' do
|
|
518
569
|
t = DataTable.from(%{
|
|
519
570
|
| a | b |
|
|
520
571
|
})
|
|
521
|
-
expect
|
|
572
|
+
expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
|
|
522
573
|
expect { @t.dup.diff!(t, :missing_row => false) }.not_to raise_error
|
|
523
574
|
end
|
|
524
575
|
|
|
525
|
-
it
|
|
576
|
+
it 'should not raise on surplus rows when surplus is at the end' do
|
|
526
577
|
t = DataTable.from(%{
|
|
527
578
|
| a | b |
|
|
528
579
|
| c | d |
|
|
529
580
|
| e | f |
|
|
530
581
|
})
|
|
531
|
-
expect { @t.dup.diff!(t) }.to raise_error
|
|
582
|
+
expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
|
|
532
583
|
expect { @t.dup.diff!(t, :surplus_row => false) }.not_to raise_error
|
|
533
584
|
end
|
|
534
585
|
|
|
535
|
-
it
|
|
586
|
+
it 'should not raise on surplus rows when surplus is interleaved' do
|
|
536
587
|
t1 = DataTable.from(%{
|
|
537
588
|
| row_1 | row_2 |
|
|
538
589
|
| four | 4 |
|
|
@@ -545,40 +596,39 @@ module Cucumber
|
|
|
545
596
|
| four | 4 |
|
|
546
597
|
| five | 5 |
|
|
547
598
|
})
|
|
548
|
-
expect { t1.dup.diff!(t2) }.to raise_error
|
|
549
|
-
|
|
599
|
+
expect { t1.dup.diff!(t2) }.to raise_error(DataTable::Different)
|
|
550
600
|
expect { t1.dup.diff!(t2, :surplus_row => false) }.not_to raise_error
|
|
551
601
|
end
|
|
552
602
|
|
|
553
|
-
it
|
|
603
|
+
it 'should raise on missing columns' do
|
|
554
604
|
t = DataTable.from(%{
|
|
555
605
|
| a |
|
|
556
606
|
| c |
|
|
557
607
|
})
|
|
558
|
-
expect { @t.dup.diff!(t) }.to raise_error
|
|
608
|
+
expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
|
|
559
609
|
expect { @t.dup.diff!(t, :missing_col => false) }.not_to raise_error
|
|
560
610
|
end
|
|
561
611
|
|
|
562
|
-
it
|
|
612
|
+
it 'should not raise on surplus columns' do
|
|
563
613
|
t = DataTable.from(%{
|
|
564
614
|
| a | b | x |
|
|
565
615
|
| c | d | y |
|
|
566
616
|
})
|
|
567
617
|
expect { @t.dup.diff!(t) }.not_to raise_error
|
|
568
|
-
expect { @t.dup.diff!(t, :surplus_col => true) }.to raise_error
|
|
618
|
+
expect { @t.dup.diff!(t, :surplus_col => true) }.to raise_error(DataTable::Different)
|
|
569
619
|
end
|
|
570
620
|
|
|
571
|
-
it
|
|
621
|
+
it 'should not raise on misplaced columns' do
|
|
572
622
|
t = DataTable.from(%{
|
|
573
623
|
| b | a |
|
|
574
624
|
| d | c |
|
|
575
625
|
})
|
|
576
626
|
expect { @t.dup.diff!(t) }.not_to raise_error
|
|
577
|
-
expect { @t.dup.diff!(t, :misplaced_col => true) }.to raise_error
|
|
627
|
+
expect { @t.dup.diff!(t, :misplaced_col => true) }.to raise_error(DataTable::Different)
|
|
578
628
|
end
|
|
579
629
|
end
|
|
580
630
|
|
|
581
|
-
it
|
|
631
|
+
it 'can compare to an Array' do
|
|
582
632
|
t = DataTable.from(%{
|
|
583
633
|
| b | a |
|
|
584
634
|
| d | c |
|
|
@@ -589,8 +639,8 @@ module Cucumber
|
|
|
589
639
|
end
|
|
590
640
|
end
|
|
591
641
|
|
|
592
|
-
describe
|
|
593
|
-
it
|
|
642
|
+
describe '#from' do
|
|
643
|
+
it 'should allow Array of Hash' do
|
|
594
644
|
t1 = DataTable.from([{'name' => 'aslak', 'male' => 'true'}])
|
|
595
645
|
expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
|
|
596
646
|
| male | name |
|