opal-rspec 0.8.0.alpha3 → 1.0.0.alpha1
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/.github/workflows/build.yml +7 -7
- data/.gitmodules +6 -0
- data/CHANGELOG.md +16 -1
- data/Gemfile +13 -0
- data/README.md +63 -59
- data/diff-lcs/spec/files_to_exclude.txt +1 -0
- data/diff-lcs/spec/requires.rb +4 -0
- data/diff-lcs/upstream/.autotest +5 -0
- data/diff-lcs/upstream/.fasterer.yml +3 -0
- data/{stubs/diff/lcs.rb → diff-lcs/upstream/.gemtest} +0 -0
- data/diff-lcs/upstream/.github/workflows/ci.yml +64 -0
- data/diff-lcs/upstream/.github/workflows/codeql-analysis.yml +70 -0
- data/diff-lcs/upstream/.gitignore +20 -0
- data/diff-lcs/upstream/.hoerc +52 -0
- data/diff-lcs/upstream/.rspec +1 -0
- data/diff-lcs/upstream/.standard.yml +6 -0
- data/diff-lcs/upstream/Code-of-Conduct.md +74 -0
- data/diff-lcs/upstream/Contributing.md +119 -0
- data/diff-lcs/upstream/Gemfile +28 -0
- data/diff-lcs/upstream/History.md +407 -0
- data/diff-lcs/upstream/License.md +41 -0
- data/diff-lcs/upstream/Manifest.txt +59 -0
- data/diff-lcs/upstream/README.rdoc +84 -0
- data/diff-lcs/upstream/Rakefile +127 -0
- data/diff-lcs/upstream/bin/htmldiff +35 -0
- data/diff-lcs/upstream/bin/ldiff +9 -0
- data/diff-lcs/upstream/diff-lcs.gemspec +48 -0
- data/diff-lcs/upstream/docs/COPYING.txt +339 -0
- data/diff-lcs/upstream/docs/artistic.txt +127 -0
- data/diff-lcs/upstream/lib/diff/lcs/array.rb +7 -0
- data/diff-lcs/upstream/lib/diff/lcs/backports.rb +9 -0
- data/diff-lcs/upstream/lib/diff/lcs/block.rb +37 -0
- data/diff-lcs/upstream/lib/diff/lcs/callbacks.rb +327 -0
- data/diff-lcs/upstream/lib/diff/lcs/change.rb +174 -0
- data/diff-lcs/upstream/lib/diff/lcs/htmldiff.rb +158 -0
- data/diff-lcs/upstream/lib/diff/lcs/hunk.rb +363 -0
- data/diff-lcs/upstream/lib/diff/lcs/internals.rb +308 -0
- data/diff-lcs/upstream/lib/diff/lcs/ldiff.rb +173 -0
- data/diff-lcs/upstream/lib/diff/lcs/string.rb +5 -0
- data/diff-lcs/upstream/lib/diff/lcs.rb +741 -0
- data/diff-lcs/upstream/lib/diff-lcs.rb +3 -0
- data/diff-lcs/upstream/spec/change_spec.rb +89 -0
- data/diff-lcs/upstream/spec/diff_spec.rb +51 -0
- data/diff-lcs/upstream/spec/fixtures/aX +1 -0
- data/diff-lcs/upstream/spec/fixtures/bXaX +1 -0
- data/diff-lcs/upstream/spec/fixtures/ds1.csv +50 -0
- data/diff-lcs/upstream/spec/fixtures/ds2.csv +51 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff +4 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-c +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-e +3 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-f +3 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff-u +5 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef +4 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-c +15 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-e +3 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-f +3 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef-u +9 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2 +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-c +20 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-d +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-e +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-f +7 -0
- data/diff-lcs/upstream/spec/fixtures/ldiff/output.diff.chef2-u +16 -0
- data/diff-lcs/upstream/spec/fixtures/new-chef +4 -0
- data/diff-lcs/upstream/spec/fixtures/new-chef2 +17 -0
- data/diff-lcs/upstream/spec/fixtures/old-chef +4 -0
- data/diff-lcs/upstream/spec/fixtures/old-chef2 +14 -0
- data/diff-lcs/upstream/spec/hunk_spec.rb +83 -0
- data/diff-lcs/upstream/spec/issues_spec.rb +160 -0
- data/diff-lcs/upstream/spec/lcs_spec.rb +56 -0
- data/diff-lcs/upstream/spec/ldiff_spec.rb +89 -0
- data/diff-lcs/upstream/spec/patch_spec.rb +416 -0
- data/diff-lcs/upstream/spec/sdiff_spec.rb +216 -0
- data/diff-lcs/upstream/spec/spec_helper.rb +376 -0
- data/diff-lcs/upstream/spec/traverse_balanced_spec.rb +312 -0
- data/diff-lcs/upstream/spec/traverse_sequences_spec.rb +137 -0
- data/lib/opal/rspec/runner.rb +11 -0
- data/lib/opal/rspec/sprockets.rb +6 -0
- data/lib/opal/rspec/version.rb +1 -1
- data/lib/opal/rspec.rb +1 -2
- data/lib-opal/opal/rspec/async/configuration.rb +39 -0
- data/lib-opal/opal/rspec/async/example.rb +80 -168
- data/lib-opal/opal/rspec/async/example_group.rb +71 -81
- data/lib-opal/opal/rspec/async/hooks.rb +98 -8
- data/lib-opal/opal/rspec/async/memoized_helpers.rb +32 -0
- data/lib-opal/opal/rspec/async/reporter.rb +6 -3
- data/lib-opal/opal/rspec/async/runner.rb +33 -24
- data/lib-opal/opal/rspec/async.rb +4 -1
- data/lib-opal/opal/rspec/browser.rb +0 -8
- data/lib-opal/opal/rspec/browser_early.rb +5 -0
- data/lib-opal/opal/rspec/fixes/diff-lcs/hunk.rb +164 -0
- data/lib-opal/opal/rspec/fixes/diff-lcs/lcs.rb +112 -0
- data/lib-opal/opal/rspec/fixes/diff-lcs.rb +2 -0
- data/lib-opal/opal/rspec/fixes/opal.rb +4 -17
- data/lib-opal/opal/rspec/fixes/rspec/core/example_status_persister.rb +11 -0
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/deprecation_formatter.rb +3 -12
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/exception_presenter.rb +28 -0
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/loader.rb +0 -32
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/snippet_extractor.rb +17 -0
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/syntax_highlighter.rb +17 -0
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters.rb +3 -4
- data/lib-opal/opal/rspec/fixes/rspec/core/metadata.rb +24 -8
- data/lib-opal/opal/rspec/fixes/rspec/core/notifications/examples_notification.rb +3 -20
- data/lib-opal/opal/rspec/fixes/rspec/core/notifications.rb +0 -2
- data/lib-opal/opal/rspec/fixes/rspec/core.rb +1 -2
- data/lib-opal/opal/rspec/fixes/rspec/expectations.rb +0 -1
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/base_matcher.rb +26 -0
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in.rb +1 -3
- data/lib-opal/opal/rspec/fixes/rspec/matchers/expecteds_for_multiple_diffs.rb +13 -0
- data/lib-opal/opal/rspec/fixes/rspec/matchers.rb +1 -1
- data/lib-opal/opal/rspec/fixes/rspec/mocks/error_generator.rb +26 -10
- data/lib-opal/opal/rspec/fixes/rspec/mocks/proxy.rb +19 -0
- data/lib-opal/opal/rspec/fixes/rspec/mocks.rb +1 -3
- data/lib-opal/opal/rspec/fixes/rspec/support/differ.rb +29 -0
- data/lib-opal/opal/rspec/fixes/rspec/support/encoded_string.rb +9 -5
- data/lib-opal/opal/rspec/fixes/rspec/support/ruby_features.rb +22 -0
- data/lib-opal/opal/rspec/fixes/rspec/support/source.rb +15 -0
- data/lib-opal/opal/rspec/fixes/rspec/support.rb +3 -3
- data/lib-opal/opal/rspec/fixes/rspec.rb +0 -1
- data/lib-opal/opal/rspec/fixes.rb +1 -0
- data/lib-opal/opal/rspec/formatter/document_io.rb +1 -1
- data/lib-opal/opal/rspec/formatter/html_printer.rb +1 -1
- data/lib-opal/opal/rspec/pre_require_fixes.rb +1 -5
- data/lib-opal/opal/rspec/requires.rb +32 -19
- data/lib-opal/opal/rspec/sprockets_runner.rb.erb +1 -0
- data/lib-opal/opal/rspec.rb +3 -0
- data/opal-rspec.gemspec +1 -1
- data/rspec/upstream/.document +1 -1
- data/rspec/upstream/.github/FUNDING.yml +5 -0
- data/rspec/upstream/.gitignore +1 -0
- data/rspec/upstream/LICENSE.md +27 -0
- data/rspec/upstream/README.md +26 -26
- data/rspec/upstream/Rakefile +1 -1
- data/rspec/upstream/certs/rspec.pem +32 -20
- data/rspec/upstream/certs/samphippen.asc +18 -0
- data/rspec/upstream/code_of_conduct.md +59 -0
- data/rspec/upstream/lib/rspec/version.rb +1 -1
- data/rspec/upstream/rspec.gemspec +7 -2
- data/rspec-core/upstream/.document +1 -1
- data/rspec-core/upstream/.github/FUNDING.yml +5 -0
- data/rspec-core/upstream/.github/workflows/ci.yml +150 -0
- data/rspec-core/upstream/.gitignore +2 -0
- data/rspec-core/upstream/.rspec +1 -0
- data/rspec-core/upstream/.rubocop.yml +64 -12
- data/rspec-core/upstream/.rubocop_rspec_base.yml +224 -38
- data/rspec-core/upstream/.rubocop_todo.yml +1031 -0
- data/rspec-core/upstream/.yardopts +2 -1
- data/rspec-core/upstream/BUILD_DETAIL.md +149 -0
- data/rspec-core/upstream/CODE_OF_CONDUCT.md +59 -0
- data/rspec-core/upstream/CONTRIBUTING.md +86 -0
- data/rspec-core/upstream/Changelog.md +721 -2
- data/rspec-core/upstream/DEV-README.md +2 -2
- data/rspec-core/upstream/DEVELOPMENT.md +131 -0
- data/rspec-core/upstream/Filtering.md +173 -0
- data/rspec-core/upstream/Gemfile +78 -9
- data/rspec-core/upstream/ISSUE_TEMPLATE.md +24 -0
- data/rspec-core/upstream/{License.txt → LICENSE.md} +6 -5
- data/rspec-core/upstream/README.md +165 -24
- data/rspec-core/upstream/REPORT_TEMPLATE.md +43 -0
- data/rspec-core/upstream/Rakefile +1 -1
- data/rspec-core/upstream/benchmarks/allocations/1000_groups_1_example.rb +124 -0
- data/rspec-core/upstream/benchmarks/allocations/1_group_1000_examples.rb +63 -0
- data/rspec-core/upstream/benchmarks/allocations/helper.rb +30 -0
- data/rspec-core/upstream/benchmarks/allocations/running_1000_groups_1_example.rb +100 -0
- data/rspec-core/upstream/benchmarks/allocations/running_1_group_1000_examples.rb +60 -0
- data/rspec-core/upstream/benchmarks/capture_block_vs_yield.rb +208 -0
- data/rspec-core/upstream/benchmarks/flat_map_vs_inject.rb +55 -0
- data/rspec-core/upstream/benchmarks/hash_functions.rb +74 -0
- data/rspec-core/upstream/benchmarks/keys_each_vs_each_key.rb +43 -0
- data/rspec-core/upstream/benchmarks/module_inclusion_filtering.rb +89 -0
- data/rspec-core/upstream/benchmarks/precalculate_absolute_file_path_or_not.rb +29 -0
- data/rspec-core/upstream/benchmarks/shuffle_vs_sort_by_for_random_ordering.rb +131 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/helper.rb +122 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_config_hooks.rb +28 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_config_hooks_module_inclusions_and_shared_context_inclusions.rb +35 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_module_inclusions.rb +28 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_no_config_hooks_or_inclusions.rb +22 -0
- data/rspec-core/upstream/benchmarks/singleton_example_groups/with_shared_context_inclusions.rb +28 -0
- data/rspec-core/upstream/benchmarks/threadsafe_let_block.rb +312 -0
- data/rspec-core/upstream/cucumber.yml +7 -2
- data/rspec-core/upstream/features/.nav +5 -1
- data/rspec-core/upstream/features/README.md +2 -2
- data/rspec-core/upstream/features/clear_examples.feature +106 -0
- data/rspec-core/upstream/features/command_line/bisect.feature +178 -0
- data/rspec-core/upstream/features/command_line/example_matches_name_option.feature +131 -0
- data/rspec-core/upstream/features/command_line/example_name_option.feature +2 -0
- data/rspec-core/upstream/features/command_line/fail_fast.feature +21 -4
- data/rspec-core/upstream/features/command_line/init.feature +2 -2
- data/rspec-core/upstream/features/command_line/line_number_appended_to_path.feature +2 -2
- data/rspec-core/upstream/features/command_line/only_failures.feature +113 -0
- data/rspec-core/upstream/features/command_line/order.md +8 -1
- data/rspec-core/upstream/features/command_line/pattern_option.feature +6 -3
- data/rspec-core/upstream/features/command_line/rake_task.feature +3 -3
- data/rspec-core/upstream/features/command_line/randomization.feature +5 -2
- data/rspec-core/upstream/features/command_line/ruby.feature +6 -2
- data/rspec-core/upstream/features/command_line/tag.feature +13 -11
- data/rspec-core/upstream/features/command_line/warnings_option.feature +20 -3
- data/rspec-core/upstream/features/configuration/backtrace_exclusion_patterns.feature +45 -29
- data/rspec-core/upstream/features/configuration/color.feature +22 -0
- data/rspec-core/upstream/features/configuration/custom_settings.feature +9 -13
- data/rspec-core/upstream/features/configuration/default_path.feature +1 -1
- data/rspec-core/upstream/features/configuration/enable_global_dsl.feature +15 -1
- data/rspec-core/upstream/features/configuration/error_exit_code.feature +52 -0
- data/rspec-core/upstream/features/configuration/fail_fast.feature +42 -12
- data/rspec-core/upstream/features/configuration/fail_if_no_examples.feature +31 -0
- data/rspec-core/upstream/features/configuration/failure_exit_code.feature +26 -0
- data/rspec-core/upstream/features/configuration/overriding_global_ordering.feature +1 -1
- data/rspec-core/upstream/features/configuration/pattern.feature +1 -1
- data/rspec-core/upstream/features/configuration/profile.feature +25 -0
- data/rspec-core/upstream/features/configuration/read_options_from_file.feature +25 -19
- data/rspec-core/upstream/features/configuration/run_all_when_everything_filtered.feature +4 -0
- data/rspec-core/upstream/features/core_standalone.feature +2 -0
- data/rspec-core/upstream/features/example_groups/basic_structure.feature +1 -0
- data/rspec-core/upstream/features/example_groups/shared_context.feature +55 -5
- data/rspec-core/upstream/features/example_groups/shared_examples.feature +59 -15
- data/rspec-core/upstream/features/expectation_framework_integration/aggregating_failures.feature +602 -0
- data/rspec-core/upstream/features/expectation_framework_integration/configure_expectation_framework.feature +13 -5
- data/rspec-core/upstream/features/filtering/filter_run_when_matching.feature +75 -0
- data/rspec-core/upstream/features/formatters/configurable_colors.feature +23 -4
- data/rspec-core/upstream/features/helper_methods/let.feature +3 -0
- data/rspec-core/upstream/features/helper_methods/modules.feature +6 -0
- data/rspec-core/upstream/features/hooks/around_hooks.feature +36 -6
- data/rspec-core/upstream/features/hooks/before_and_after_hooks.feature +47 -5
- data/rspec-core/upstream/features/hooks/filtering.feature +199 -4
- data/rspec-core/upstream/features/hooks/when_first_matching_example_defined.feature +70 -0
- data/rspec-core/upstream/features/metadata/current_scope.feature +87 -0
- data/rspec-core/upstream/features/metadata/described_class.feature +12 -5
- data/rspec-core/upstream/features/metadata/user_defined.feature +3 -3
- data/rspec-core/upstream/features/mock_framework_integration/use_any_framework.feature +1 -1
- data/rspec-core/upstream/features/mock_framework_integration/use_flexmock.feature +5 -5
- data/rspec-core/upstream/features/mock_framework_integration/use_mocha.feature +5 -5
- data/rspec-core/upstream/features/mock_framework_integration/use_rr.feature +5 -5
- data/rspec-core/upstream/features/mock_framework_integration/use_rspec.feature +6 -6
- data/rspec-core/upstream/features/pending_and_skipped_examples/pending_examples.feature +8 -7
- data/rspec-core/upstream/features/pending_and_skipped_examples/skipped_examples.feature +49 -22
- data/rspec-core/upstream/features/step_definitions/additional_cli_steps.rb +142 -12
- data/rspec-core/upstream/features/step_definitions/core_standalone_steps.rb +6 -2
- data/rspec-core/upstream/features/subject/implicit_subject.feature +3 -2
- data/rspec-core/upstream/features/subject/one_liner_syntax.feature +9 -5
- data/rspec-core/upstream/features/support/diff_lcs_versions.rb +17 -0
- data/rspec-core/upstream/features/support/env.rb +20 -7
- data/rspec-core/upstream/features/support/jruby.rb +8 -0
- data/rspec-core/upstream/features/support/require_expect_syntax_in_aruba_specs.rb +6 -3
- data/rspec-core/upstream/features/support/rubinius.rb +5 -1
- data/rspec-core/upstream/features/support/ruby_27_support.rb +7 -0
- data/rspec-core/upstream/features/support/send_sigint_during_bisect.rb +21 -0
- data/rspec-core/upstream/lib/rspec/autorun.rb +1 -0
- data/rspec-core/upstream/lib/rspec/core/backtrace_formatter.rb +3 -4
- data/rspec-core/upstream/lib/rspec/core/bisect/coordinator.rb +62 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/example_minimizer.rb +173 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/fork_runner.rb +138 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/server.rb +61 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/shell_command.rb +126 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/shell_runner.rb +73 -0
- data/rspec-core/upstream/lib/rspec/core/bisect/utilities.rb +69 -0
- data/rspec-core/upstream/lib/rspec/core/configuration.rb +1157 -212
- data/rspec-core/upstream/lib/rspec/core/configuration_options.rb +82 -22
- data/rspec-core/upstream/lib/rspec/core/did_you_mean.rb +46 -0
- data/rspec-core/upstream/lib/rspec/core/drb.rb +10 -1
- data/rspec-core/upstream/lib/rspec/core/dsl.rb +10 -5
- data/rspec-core/upstream/lib/rspec/core/example.rb +271 -107
- data/rspec-core/upstream/lib/rspec/core/example_group.rb +426 -127
- data/rspec-core/upstream/lib/rspec/core/example_status_persister.rb +235 -0
- data/rspec-core/upstream/lib/rspec/core/filter_manager.rb +76 -104
- data/rspec-core/upstream/lib/rspec/core/flat_map.rb +6 -4
- data/rspec-core/upstream/lib/rspec/core/formatters/base_bisect_formatter.rb +45 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/base_formatter.rb +7 -4
- data/rspec-core/upstream/lib/rspec/core/formatters/base_text_formatter.rb +15 -16
- data/rspec-core/upstream/lib/rspec/core/formatters/bisect_drb_formatter.rb +29 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/bisect_progress_formatter.rb +157 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/console_codes.rb +28 -16
- data/rspec-core/upstream/lib/rspec/core/formatters/deprecation_formatter.rb +14 -13
- data/rspec-core/upstream/lib/rspec/core/formatters/documentation_formatter.rb +47 -13
- data/rspec-core/upstream/lib/rspec/core/formatters/exception_presenter.rb +525 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/failure_list_formatter.rb +23 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/fallback_message_formatter.rb +28 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/helpers.rb +40 -9
- data/rspec-core/upstream/lib/rspec/core/formatters/html_formatter.rb +20 -16
- data/rspec-core/upstream/lib/rspec/core/formatters/html_printer.rb +27 -18
- data/rspec-core/upstream/lib/rspec/core/formatters/html_snippet_extractor.rb +120 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/json_formatter.rb +15 -7
- data/rspec-core/upstream/lib/rspec/core/formatters/profile_formatter.rb +10 -7
- data/rspec-core/upstream/lib/rspec/core/formatters/progress_formatter.rb +1 -0
- data/rspec-core/upstream/lib/rspec/core/formatters/protocol.rb +62 -43
- data/rspec-core/upstream/lib/rspec/core/formatters/snippet_extractor.rb +115 -85
- data/rspec-core/upstream/lib/rspec/core/formatters/syntax_highlighter.rb +91 -0
- data/rspec-core/upstream/lib/rspec/core/formatters.rb +71 -32
- data/rspec-core/upstream/lib/rspec/core/hooks.rb +303 -248
- data/rspec-core/upstream/lib/rspec/core/invocations.rb +87 -0
- data/rspec-core/upstream/lib/rspec/core/memoized_helpers.rb +155 -47
- data/rspec-core/upstream/lib/rspec/core/metadata.rb +102 -41
- data/rspec-core/upstream/lib/rspec/core/metadata_filter.rb +209 -49
- data/rspec-core/upstream/lib/rspec/core/minitest_assertions_adapter.rb +5 -2
- data/rspec-core/upstream/lib/rspec/core/mocking_adapters/flexmock.rb +1 -1
- data/rspec-core/upstream/lib/rspec/core/mocking_adapters/mocha.rb +8 -8
- data/rspec-core/upstream/lib/rspec/core/notifications.rb +180 -201
- data/rspec-core/upstream/lib/rspec/core/option_parser.rb +159 -58
- data/rspec-core/upstream/lib/rspec/core/ordering.rb +40 -26
- data/rspec-core/upstream/lib/rspec/core/output_wrapper.rb +29 -0
- data/rspec-core/upstream/lib/rspec/core/pending.rb +19 -25
- data/rspec-core/upstream/lib/rspec/core/profiler.rb +34 -0
- data/rspec-core/upstream/lib/rspec/core/project_initializer/.rspec +0 -1
- data/rspec-core/upstream/lib/rspec/core/project_initializer/spec/spec_helper.rb +31 -22
- data/rspec-core/upstream/lib/rspec/core/project_initializer.rb +1 -1
- data/rspec-core/upstream/lib/rspec/core/rake_task.rb +73 -72
- data/rspec-core/upstream/lib/rspec/core/reporter.rb +134 -18
- data/rspec-core/upstream/lib/rspec/core/ruby_project.rb +13 -5
- data/rspec-core/upstream/lib/rspec/core/runner.rb +99 -45
- data/rspec-core/upstream/lib/rspec/core/sandbox.rb +37 -0
- data/rspec-core/upstream/lib/rspec/core/set.rb +54 -0
- data/rspec-core/upstream/lib/rspec/core/shared_example_group.rb +126 -37
- data/rspec-core/upstream/lib/rspec/core/shell_escape.rb +49 -0
- data/rspec-core/upstream/lib/rspec/core/test_unit_assertions_adapter.rb +3 -3
- data/rspec-core/upstream/lib/rspec/core/version.rb +1 -1
- data/rspec-core/upstream/lib/rspec/core/warnings.rb +2 -2
- data/rspec-core/upstream/lib/rspec/core/world.rb +164 -60
- data/rspec-core/upstream/lib/rspec/core.rb +64 -21
- data/rspec-core/upstream/maintenance-branch +1 -1
- data/rspec-core/upstream/rspec-core.gemspec +16 -11
- data/rspec-core/upstream/script/ci_functions.sh +73 -0
- data/rspec-core/upstream/script/clone_all_rspec_repos +2 -2
- data/rspec-core/upstream/script/cucumber.sh +8 -0
- data/rspec-core/upstream/script/custom_build_functions.sh +22 -0
- data/rspec-core/upstream/script/functions.sh +125 -89
- data/rspec-core/upstream/script/legacy_setup.sh +20 -0
- data/rspec-core/upstream/script/predicate_functions.sh +162 -0
- data/rspec-core/upstream/script/rspec_with_simplecov +6 -6
- data/rspec-core/upstream/script/run_build +14 -9
- data/rspec-core/upstream/script/run_rubocop +14 -0
- data/rspec-core/upstream/script/update_rubygems_and_install_bundler +20 -0
- data/rspec-expectations/upstream/.document +1 -1
- data/rspec-expectations/upstream/.github/FUNDING.yml +5 -0
- data/rspec-expectations/upstream/.github/workflows/ci.yml +150 -0
- data/rspec-expectations/upstream/.gitignore +2 -0
- data/rspec-expectations/upstream/.rubocop.yml +126 -2
- data/rspec-expectations/upstream/.rubocop_rspec_base.yml +224 -38
- data/rspec-expectations/upstream/.rubocop_todo.yml +335 -0
- data/rspec-expectations/upstream/.yardopts +1 -1
- data/rspec-expectations/upstream/BUILD_DETAIL.md +149 -0
- data/rspec-expectations/upstream/CODE_OF_CONDUCT.md +59 -0
- data/rspec-expectations/upstream/CONTRIBUTING.md +86 -0
- data/rspec-expectations/upstream/Changelog.md +454 -4
- data/rspec-expectations/upstream/DEV-README.md +3 -3
- data/rspec-expectations/upstream/DEVELOPMENT.md +131 -0
- data/rspec-expectations/upstream/Gemfile +77 -9
- data/rspec-expectations/upstream/ISSUE_TEMPLATE.md +24 -0
- data/{rspec-mocks/upstream/License.txt → rspec-expectations/upstream/LICENSE.md} +5 -4
- data/rspec-expectations/upstream/README.md +73 -31
- data/rspec-expectations/upstream/REPORT_TEMPLATE.md +43 -0
- data/rspec-expectations/upstream/Rakefile +13 -10
- data/rspec-expectations/upstream/Should.md +13 -5
- data/rspec-expectations/upstream/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +1 -2
- data/rspec-expectations/upstream/benchmarks/caller_vs_raise_for_backtrace.rb +77 -0
- data/rspec-expectations/upstream/benchmarks/count_vs_select_size.rb +68 -0
- data/rspec-expectations/upstream/benchmarks/default_messages_as_methods_v_blocks.rb +1 -1
- data/rspec-expectations/upstream/benchmarks/gsub_vs_tr_single_character.rb +28 -0
- data/rspec-expectations/upstream/benchmarks/include_matcher.rb +249 -0
- data/rspec-expectations/upstream/benchmarks/include_v_superclass.rb +0 -1
- data/rspec-expectations/upstream/benchmarks/match_array/failing_with_duplicate_items.rb +1 -1
- data/rspec-expectations/upstream/benchmarks/output_stringio_vs_tempfile.rb +31 -0
- data/rspec-expectations/upstream/benchmarks/set_vs_array_include.rb +1 -3
- data/rspec-expectations/upstream/cucumber.yml +9 -4
- data/rspec-expectations/upstream/features/.nav +1 -0
- data/rspec-expectations/upstream/features/aggregating_failures.feature +56 -0
- data/rspec-expectations/upstream/features/built_in_matchers/README.md +3 -3
- data/rspec-expectations/upstream/features/built_in_matchers/all.feature +3 -2
- data/rspec-expectations/upstream/features/built_in_matchers/be_within.feature +1 -1
- data/rspec-expectations/upstream/features/built_in_matchers/change.feature +8 -6
- data/rspec-expectations/upstream/features/built_in_matchers/comparisons.feature +33 -1
- data/rspec-expectations/upstream/features/built_in_matchers/contain_exactly.feature +1 -0
- data/rspec-expectations/upstream/features/built_in_matchers/cover.feature +3 -3
- data/rspec-expectations/upstream/features/built_in_matchers/exist.feature +1 -1
- data/rspec-expectations/upstream/features/built_in_matchers/have_attributes.feature +1 -2
- data/rspec-expectations/upstream/features/built_in_matchers/include.feature +74 -17
- data/rspec-expectations/upstream/features/built_in_matchers/match.feature +2 -2
- data/rspec-expectations/upstream/features/built_in_matchers/output.feature +67 -4
- data/rspec-expectations/upstream/features/built_in_matchers/predicates.feature +56 -19
- data/rspec-expectations/upstream/features/built_in_matchers/raise_error.feature +16 -2
- data/rspec-expectations/upstream/features/built_in_matchers/respond_to.feature +191 -3
- data/rspec-expectations/upstream/features/built_in_matchers/satisfy.feature +17 -8
- data/rspec-expectations/upstream/features/built_in_matchers/throw_symbol.feature +1 -1
- data/rspec-expectations/upstream/features/built_in_matchers/types.feature +34 -34
- data/rspec-expectations/upstream/features/built_in_matchers/yield.feature +2 -2
- data/rspec-expectations/upstream/features/composing_matchers.feature +4 -4
- data/rspec-expectations/upstream/features/custom_matchers/define_block_matcher.feature +78 -0
- data/rspec-expectations/upstream/features/custom_matchers/define_diffable_matcher.feature +115 -3
- data/rspec-expectations/upstream/features/custom_matchers/define_matcher.feature +173 -21
- data/rspec-expectations/upstream/features/custom_matchers/define_matcher_with_fluent_interface.feature +21 -2
- data/rspec-expectations/upstream/features/define_negated_matcher.feature +2 -1
- data/rspec-expectations/upstream/features/diffing.feature +29 -1
- data/rspec-expectations/upstream/features/implicit_docstrings.feature +8 -8
- data/rspec-expectations/upstream/features/step_definitions/additional_cli_steps.rb +11 -7
- data/rspec-expectations/upstream/features/support/diff_lcs_versions.rb +25 -0
- data/rspec-expectations/upstream/features/support/disallow_certain_apis.rb +3 -3
- data/rspec-expectations/upstream/features/support/env.rb +11 -11
- data/rspec-expectations/upstream/features/support/rubinius.rb +1 -1
- data/rspec-expectations/upstream/features/support/ruby_features.rb +39 -0
- data/rspec-expectations/upstream/features/syntax_configuration.feature +9 -9
- data/rspec-expectations/upstream/features/test_frameworks/minitest.feature +69 -2
- data/rspec-expectations/upstream/lib/rspec/expectations/block_snippet_extractor.rb +253 -0
- data/rspec-expectations/upstream/lib/rspec/expectations/configuration.rb +84 -1
- data/rspec-expectations/upstream/lib/rspec/expectations/expectation_target.rb +82 -38
- data/rspec-expectations/upstream/lib/rspec/expectations/fail_with.rb +11 -6
- data/rspec-expectations/upstream/lib/rspec/expectations/failure_aggregator.rb +212 -0
- data/rspec-expectations/upstream/lib/rspec/expectations/handler.rb +27 -12
- data/rspec-expectations/upstream/lib/rspec/expectations/minitest_integration.rb +43 -2
- data/rspec-expectations/upstream/lib/rspec/expectations/syntax.rb +5 -5
- data/rspec-expectations/upstream/lib/rspec/expectations/version.rb +1 -1
- data/rspec-expectations/upstream/lib/rspec/expectations.rb +15 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/all.rb +1 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/base_matcher.rb +77 -11
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be.rb +28 -114
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_between.rb +1 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_instance_of.rb +5 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_kind_of.rb +5 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/be_within.rb +4 -4
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/change.rb +168 -55
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/compound.rb +61 -29
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/contain_exactly.rb +73 -12
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/count_expectation.rb +169 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eq.rb +3 -38
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/eql.rb +2 -2
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/equal.rb +3 -3
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/exist.rb +7 -3
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/has.rb +90 -24
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/have_attributes.rb +37 -7
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/include.rb +124 -23
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/match.rb +79 -2
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/operators.rb +14 -5
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/output.rb +56 -1
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/raise_error.rb +126 -29
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/respond_to.rb +118 -9
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/satisfy.rb +28 -7
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/{start_and_end_with.rb → start_or_end_with.rb} +20 -8
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/throw_symbol.rb +11 -5
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in/yield.rb +110 -155
- data/rspec-expectations/upstream/lib/rspec/matchers/built_in.rb +4 -3
- data/rspec-expectations/upstream/lib/rspec/matchers/composable.rb +23 -35
- data/rspec-expectations/upstream/lib/rspec/matchers/dsl.rb +179 -26
- data/rspec-expectations/upstream/lib/rspec/matchers/english_phrasing.rb +58 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/expecteds_for_multiple_diffs.rb +82 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/fail_matchers.rb +42 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/generated_descriptions.rb +1 -2
- data/rspec-expectations/upstream/lib/rspec/matchers/matcher_delegator.rb +2 -0
- data/rspec-expectations/upstream/lib/rspec/matchers/matcher_protocol.rb +72 -66
- data/rspec-expectations/upstream/lib/rspec/matchers.rb +227 -150
- data/rspec-expectations/upstream/maintenance-branch +1 -1
- data/rspec-expectations/upstream/rspec-expectations.gemspec +13 -8
- data/rspec-expectations/upstream/script/ci_functions.sh +73 -0
- data/rspec-expectations/upstream/script/clone_all_rspec_repos +2 -2
- data/rspec-expectations/upstream/script/cucumber.sh +8 -0
- data/rspec-expectations/upstream/script/functions.sh +125 -89
- data/rspec-expectations/upstream/script/legacy_setup.sh +20 -0
- data/rspec-expectations/upstream/script/predicate_functions.sh +162 -0
- data/rspec-expectations/upstream/script/run_build +14 -9
- data/rspec-expectations/upstream/script/run_rubocop +14 -0
- data/rspec-expectations/upstream/script/update_rubygems_and_install_bundler +20 -0
- data/rspec-mocks/upstream/.document +1 -1
- data/rspec-mocks/upstream/.github/FUNDING.yml +5 -0
- data/rspec-mocks/upstream/.github/workflows/ci.yml +150 -0
- data/rspec-mocks/upstream/.gitignore +2 -0
- data/rspec-mocks/upstream/.rubocop.yml +28 -9
- data/rspec-mocks/upstream/.rubocop_rspec_base.yml +224 -38
- data/rspec-mocks/upstream/.rubocop_todo.yml +573 -0
- data/rspec-mocks/upstream/.yardopts +1 -1
- data/rspec-mocks/upstream/BUILD_DETAIL.md +149 -0
- data/rspec-mocks/upstream/CODE_OF_CONDUCT.md +59 -0
- data/rspec-mocks/upstream/CONTRIBUTING.md +86 -0
- data/rspec-mocks/upstream/Changelog.md +398 -3
- data/rspec-mocks/upstream/DEV-README.md +3 -3
- data/rspec-mocks/upstream/DEVELOPMENT.md +131 -0
- data/rspec-mocks/upstream/Gemfile +77 -10
- data/rspec-mocks/upstream/ISSUE_TEMPLATE.md +24 -0
- data/{rspec-expectations/upstream/License.txt → rspec-mocks/upstream/LICENSE.md} +5 -4
- data/rspec-mocks/upstream/README.md +83 -17
- data/rspec-mocks/upstream/REPORT_TEMPLATE.md +43 -0
- data/rspec-mocks/upstream/Rakefile +3 -3
- data/rspec-mocks/upstream/benchmarks/accessing_configuration_via_method_vs_cache.rb +52 -0
- data/rspec-mocks/upstream/benchmarks/allocations/1_object_1000_mocks.rb +76 -0
- data/rspec-mocks/upstream/benchmarks/allocations/helper.rb +17 -0
- data/rspec-mocks/upstream/benchmarks/each_value_v_values_each.rb +4 -5
- data/rspec-mocks/upstream/benchmarks/find_original_method_early.rb +1 -1
- data/rspec-mocks/upstream/benchmarks/method_defined_at_any_visibility.rb +3 -3
- data/rspec-mocks/upstream/benchmarks/thread_safety.rb +1 -1
- data/rspec-mocks/upstream/benchmarks/transfer_nested_constants.rb +1 -1
- data/rspec-mocks/upstream/cucumber.yml +8 -1
- data/rspec-mocks/upstream/features/.nav +2 -0
- data/rspec-mocks/upstream/features/basics/allowing_messages.feature +1 -1
- data/rspec-mocks/upstream/features/basics/expecting_messages.feature +40 -1
- data/rspec-mocks/upstream/features/basics/null_object_doubles.feature +1 -1
- data/rspec-mocks/upstream/features/basics/partial_test_doubles.feature +1 -1
- data/rspec-mocks/upstream/features/basics/scope.feature +5 -5
- data/rspec-mocks/upstream/features/basics/spies.feature +17 -30
- data/rspec-mocks/upstream/features/basics/test_doubles.feature +4 -4
- data/rspec-mocks/upstream/features/configuring_responses/README.md +2 -0
- data/rspec-mocks/upstream/features/configuring_responses/calling_the_original_implementation.feature +2 -2
- data/rspec-mocks/upstream/features/configuring_responses/mixed_responses.feature +25 -0
- data/rspec-mocks/upstream/features/configuring_responses/raising_an_error.feature +1 -0
- data/rspec-mocks/upstream/features/configuring_responses/wrapping_the_original_implementation.feature +3 -3
- data/rspec-mocks/upstream/features/configuring_responses/yielding.feature +2 -2
- data/rspec-mocks/upstream/features/mutating_constants/README.md +1 -1
- data/rspec-mocks/upstream/features/old_syntax/any_instance.feature +3 -3
- data/rspec-mocks/upstream/features/old_syntax/should_receive.feature +3 -1
- data/rspec-mocks/upstream/features/outside_rspec/any_test_framework.feature +116 -0
- data/rspec-mocks/upstream/features/outside_rspec/minitest.feature +202 -46
- data/rspec-mocks/upstream/features/outside_rspec/standalone.feature +5 -5
- data/rspec-mocks/upstream/features/setting_constraints/matching_arguments.feature +54 -27
- data/rspec-mocks/upstream/features/setting_constraints/message_order.feature +2 -2
- data/rspec-mocks/upstream/features/setting_constraints/receive_counts.feature +18 -0
- data/rspec-mocks/upstream/features/step_definitions/additional_cli_steps.rb +4 -4
- data/rspec-mocks/upstream/features/support/disallow_certain_apis.rb +3 -2
- data/rspec-mocks/upstream/features/support/env.rb +12 -12
- data/rspec-mocks/upstream/features/support/rubinius.rb +1 -1
- data/rspec-mocks/upstream/features/verifying_doubles/README.md +2 -2
- data/rspec-mocks/upstream/features/verifying_doubles/class_doubles.feature +1 -1
- data/rspec-mocks/upstream/features/verifying_doubles/dynamic_classes.feature +41 -5
- data/rspec-mocks/upstream/features/verifying_doubles/instance_doubles.feature +5 -3
- data/rspec-mocks/upstream/features/working_with_legacy_code/any_instance.feature +8 -6
- data/rspec-mocks/upstream/features/working_with_legacy_code/message_chains.feature +16 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/chain.rb +3 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/error_generator.rb +31 -0
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expect_chain_chain.rb +1 -5
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/expectation_chain.rb +7 -5
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/message_chains.rb +1 -3
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/recorder.rb +42 -14
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain.rb +13 -7
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance/stub_chain_chain.rb +1 -5
- data/rspec-mocks/upstream/lib/rspec/mocks/any_instance.rb +1 -0
- data/rspec-mocks/upstream/lib/rspec/mocks/argument_list_matcher.rb +53 -10
- data/rspec-mocks/upstream/lib/rspec/mocks/argument_matchers.rb +66 -26
- data/rspec-mocks/upstream/lib/rspec/mocks/configuration.rb +59 -4
- data/rspec-mocks/upstream/lib/rspec/mocks/error_generator.rb +235 -108
- data/rspec-mocks/upstream/lib/rspec/mocks/example_methods.rb +82 -27
- data/rspec-mocks/upstream/lib/rspec/mocks/instance_method_stasher.rb +12 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/matchers/have_received.rb +30 -17
- data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive.rb +28 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_message_chain.rb +17 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/matchers/receive_messages.rb +6 -0
- data/rspec-mocks/upstream/lib/rspec/mocks/message_chain.rb +0 -4
- data/rspec-mocks/upstream/lib/rspec/mocks/message_expectation.rb +430 -304
- data/rspec-mocks/upstream/lib/rspec/mocks/method_double.rb +46 -15
- data/rspec-mocks/upstream/lib/rspec/mocks/method_reference.rb +78 -19
- data/rspec-mocks/upstream/lib/rspec/mocks/minitest_integration.rb +68 -0
- data/rspec-mocks/upstream/lib/rspec/mocks/mutate_const.rb +23 -8
- data/rspec-mocks/upstream/lib/rspec/mocks/object_reference.rb +81 -23
- data/rspec-mocks/upstream/lib/rspec/mocks/proxy.rb +135 -41
- data/rspec-mocks/upstream/lib/rspec/mocks/space.rb +33 -16
- data/rspec-mocks/upstream/lib/rspec/mocks/standalone.rb +1 -1
- data/rspec-mocks/upstream/lib/rspec/mocks/syntax.rb +18 -22
- data/rspec-mocks/upstream/lib/rspec/mocks/targets.rb +51 -24
- data/rspec-mocks/upstream/lib/rspec/mocks/test_double.rb +42 -6
- data/rspec-mocks/upstream/lib/rspec/mocks/verifying_double.rb +15 -21
- data/rspec-mocks/upstream/lib/rspec/mocks/{verifying_message_expecation.rb → verifying_message_expectation.rb} +11 -18
- data/rspec-mocks/upstream/lib/rspec/mocks/verifying_proxy.rb +60 -11
- data/rspec-mocks/upstream/lib/rspec/mocks/version.rb +1 -1
- data/rspec-mocks/upstream/lib/rspec/mocks.rb +8 -1
- data/rspec-mocks/upstream/maintenance-branch +1 -1
- data/rspec-mocks/upstream/rspec-mocks.gemspec +14 -6
- data/rspec-mocks/upstream/script/ci_functions.sh +73 -0
- data/rspec-mocks/upstream/script/clone_all_rspec_repos +2 -2
- data/rspec-mocks/upstream/script/cucumber.sh +8 -0
- data/rspec-mocks/upstream/script/functions.sh +125 -89
- data/rspec-mocks/upstream/script/legacy_setup.sh +20 -0
- data/rspec-mocks/upstream/script/predicate_functions.sh +162 -0
- data/rspec-mocks/upstream/script/run_build +14 -9
- data/rspec-mocks/upstream/script/run_rubocop +14 -0
- data/rspec-mocks/upstream/script/update_rubygems_and_install_bundler +20 -0
- data/{stubs/diff/lcs/assertions.rb → rspec-mocks/upstream/tmp/.gitkeep} +0 -0
- data/rspec-support/upstream/.github/FUNDING.yml +5 -0
- data/rspec-support/upstream/.github/workflows/ci.yml +150 -0
- data/rspec-support/upstream/.gitignore +4 -0
- data/rspec-support/upstream/.rubocop.yml +33 -1
- data/rspec-support/upstream/.rubocop_rspec_base.yml +224 -38
- data/rspec-support/upstream/.rubocop_todo.yml +424 -0
- data/rspec-support/upstream/BUILD_DETAIL.md +149 -0
- data/rspec-support/upstream/CODE_OF_CONDUCT.md +59 -0
- data/rspec-support/upstream/CONTRIBUTING.md +86 -0
- data/rspec-support/upstream/Changelog.md +287 -0
- data/rspec-support/upstream/DEVELOPMENT.md +131 -0
- data/rspec-support/upstream/Gemfile +52 -4
- data/rspec-support/upstream/ISSUE_TEMPLATE.md +24 -0
- data/rspec-support/upstream/{LICENSE.txt → LICENSE.md} +3 -2
- data/rspec-support/upstream/README.md +29 -6
- data/rspec-support/upstream/REPORT_TEMPLATE.md +43 -0
- data/rspec-support/upstream/Rakefile +9 -5
- data/rspec-support/upstream/benchmarks/caller_vs_caller_locations.rb +19 -0
- data/rspec-support/upstream/benchmarks/caller_vs_caller_locations_vs_raise.rb +153 -0
- data/rspec-support/upstream/benchmarks/class_exec_vs_klass_exec.rb +43 -0
- data/rspec-support/upstream/benchmarks/map_hash.rb +70 -0
- data/rspec-support/upstream/benchmarks/ripper.rb +44 -0
- data/rspec-support/upstream/benchmarks/skip_frames_for_caller_filter.rb +27 -0
- data/rspec-support/upstream/lib/rspec/support/caller_filter.rb +35 -15
- data/rspec-support/upstream/lib/rspec/support/comparable_version.rb +46 -0
- data/rspec-support/upstream/lib/rspec/support/differ.rb +35 -34
- data/rspec-support/upstream/lib/rspec/support/directory_maker.rb +3 -1
- data/rspec-support/upstream/lib/rspec/support/encoded_string.rb +103 -11
- data/rspec-support/upstream/lib/rspec/support/fuzzy_matcher.rb +5 -5
- data/rspec-support/upstream/lib/rspec/support/matcher_definition.rb +11 -0
- data/rspec-support/upstream/lib/rspec/support/method_signature_verifier.rb +192 -26
- data/rspec-support/upstream/lib/rspec/support/mutex.rb +73 -0
- data/rspec-support/upstream/lib/rspec/support/object_formatter.rb +275 -0
- data/rspec-support/upstream/lib/rspec/support/recursive_const_methods.rb +1 -1
- data/rspec-support/upstream/lib/rspec/support/reentrant_mutex.rb +78 -0
- data/rspec-support/upstream/lib/rspec/support/ruby_features.rb +168 -15
- data/rspec-support/upstream/lib/rspec/support/source/location.rb +21 -0
- data/rspec-support/upstream/lib/rspec/support/source/node.rb +110 -0
- data/rspec-support/upstream/lib/rspec/support/source/token.rb +94 -0
- data/rspec-support/upstream/lib/rspec/support/source.rb +85 -0
- data/rspec-support/upstream/lib/rspec/support/spec/deprecation_helpers.rb +17 -29
- data/rspec-support/upstream/lib/rspec/support/spec/diff_helpers.rb +31 -0
- data/rspec-support/upstream/lib/rspec/support/spec/in_sub_process.rb +41 -17
- data/rspec-support/upstream/lib/rspec/support/spec/library_wide_checks.rb +150 -0
- data/rspec-support/upstream/lib/rspec/support/spec/shell_out.rb +39 -3
- data/rspec-support/upstream/lib/rspec/support/spec/stderr_splitter.rb +27 -4
- data/rspec-support/upstream/lib/rspec/support/spec/string_matcher.rb +45 -0
- data/rspec-support/upstream/lib/rspec/support/spec/with_isolated_directory.rb +5 -1
- data/rspec-support/upstream/lib/rspec/support/spec.rb +17 -7
- data/rspec-support/upstream/lib/rspec/support/version.rb +1 -1
- data/rspec-support/upstream/lib/rspec/support/warnings.rb +3 -3
- data/rspec-support/upstream/lib/rspec/support/with_keywords_when_needed.rb +33 -0
- data/rspec-support/upstream/lib/rspec/support.rb +81 -3
- data/rspec-support/upstream/maintenance-branch +1 -1
- data/rspec-support/upstream/rspec-support.gemspec +10 -4
- data/rspec-support/upstream/script/ci_functions.sh +73 -0
- data/rspec-support/upstream/script/clone_all_rspec_repos +2 -2
- data/rspec-support/upstream/script/cucumber.sh +8 -0
- data/rspec-support/upstream/script/functions.sh +125 -89
- data/rspec-support/upstream/script/legacy_setup.sh +20 -0
- data/rspec-support/upstream/script/predicate_functions.sh +162 -0
- data/rspec-support/upstream/script/run_build +14 -9
- data/rspec-support/upstream/script/run_rubocop +14 -0
- data/rspec-support/upstream/script/update_rubygems_and_install_bundler +20 -0
- data/stubs/{diff/lcs/block.rb → coderay.rb} +0 -0
- data/stubs/{diff/lcs/callbacks.rb → drb/acl.rb} +0 -0
- data/stubs/{diff/lcs/change.rb → erb/version.rb} +0 -0
- data/stubs/{diff/lcs/hunk.rb → open3.rb} +0 -0
- data/stubs/{diff/lcs/internals.rb → psych.rb} +0 -0
- data/stubs/{optparse.rb → ripper.rb} +0 -0
- data/stubs/{prettyprint.rb → thread_order.rb} +0 -0
- data/tasks/testing.rake +7 -3
- metadata +270 -61
- data/gemfiles/.bundle/config +0 -2
- data/gemfiles/opal_0.11.gemfile +0 -14
- data/gemfiles/opal_master.gemfile +0 -14
- data/lib-opal/opal/rspec/async/core_ext.rb +0 -23
- data/lib-opal/opal/rspec/async/legacy.rb +0 -49
- data/lib-opal/opal/rspec/fixes/rspec/caller_filter.rb +0 -6
- data/lib-opal/opal/rspec/fixes/rspec/core/example.rb +0 -20
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/backtrace_formatter.rb +0 -20
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/console_codes.rb +0 -11
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/generated_deprecation_message.rb +0 -15
- data/lib-opal/opal/rspec/fixes/rspec/core/formatters/json_formatter.rb +0 -15
- data/lib-opal/opal/rspec/fixes/rspec/core/notifications/failed_example_notification.rb +0 -20
- data/lib-opal/opal/rspec/fixes/rspec/core/notifications/summary_notification.rb +0 -21
- data/lib-opal/opal/rspec/fixes/rspec/core/warnings.rb +0 -27
- data/lib-opal/opal/rspec/fixes/rspec/expectations/fail_with.rb +0 -21
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/all.rb +0 -10
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/compound.rb +0 -15
- data/lib-opal/opal/rspec/fixes/rspec/matchers/built_in/yield.rb +0 -21
- data/lib-opal/opal/rspec/fixes/rspec/matchers/pretty.rb +0 -15
- data/lib-opal/opal/rspec/fixes/rspec/mocks/space.rb +0 -41
- data/lib-opal/opal/rspec/fixes/rspec/mocks/test_double.rb +0 -39
- data/lib-opal/opal/rspec/fixes/rspec/mocks/verifying_double.rb +0 -29
- data/lib-opal/opal/rspec/fixes/rspec/support/recursive_const_methods.rb +0 -7
- data/lib-opal/opal/rspec/fixes/rspec/support/spec/stderr_splitter.rb +0 -13
- data/lib-opal/opal/rspec/fixes/rspec/support/spec.rb +0 -1
- data/lib-opal/opal/rspec/fixes/rspec/support/warnings.rb +0 -16
- data/rspec/upstream/License.txt +0 -24
- data/rspec-core/upstream/.travis.yml +0 -35
- data/rspec-core/upstream/benchmarks/sort_by_v_shuffle.rb +0 -83
- data/rspec-core/upstream/features/Upgrade.md +0 -352
- data/rspec-core/upstream/lib/rspec/core/backport_random.rb +0 -336
- data/rspec-expectations/upstream/.travis.yml +0 -35
- data/rspec-expectations/upstream/lib/rspec/matchers/pretty.rb +0 -77
- data/rspec-mocks/upstream/.travis.yml +0 -35
- data/rspec-support/upstream/.travis.yml +0 -35
- data/rspec-support/upstream/lib/rspec/support/os.rb +0 -18
- data/rspec-support/upstream/lib/rspec/support/spec/prevent_load_time_warnings.rb +0 -44
- data/rspec-support/upstream/lib/rspec/support/version_checker.rb +0 -53
- data/stubs/shellwords.rb +0 -0
- data/stubs/uri.rb +0 -0
- data/vendor/spec_runner.js +0 -64
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
RSpec::Support.require_rspec_support 'mutex'
|
|
2
|
+
|
|
1
3
|
module RSpec
|
|
2
4
|
module Mocks
|
|
3
5
|
# A message expectation that only allows concrete return values to be set
|
|
4
6
|
# for a message. While this same effect can be achieved using a standard
|
|
5
|
-
#
|
|
7
|
+
# MessageExpectation, this version is much faster and so can be used as an
|
|
6
8
|
# optimization.
|
|
7
9
|
#
|
|
8
10
|
# @private
|
|
@@ -26,55 +28,21 @@ module RSpec
|
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
def verify_messages_received
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
return if @received
|
|
32
|
+
@error_generator.raise_expectation_error(
|
|
33
|
+
@message, 1, ArgumentListMatcher::MATCH_ALL, 0, nil, [], @backtrace_line
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def unadvise(_)
|
|
34
38
|
end
|
|
35
39
|
end
|
|
36
40
|
|
|
37
|
-
#
|
|
41
|
+
# Represents an individual method stub or message expectation. The methods
|
|
42
|
+
# defined here can be used to configure how it behaves. The methods return
|
|
43
|
+
# `self` so that they can be chained together to form a fluent interface.
|
|
38
44
|
class MessageExpectation
|
|
39
|
-
#
|
|
40
|
-
attr_accessor :error_generator, :implementation
|
|
41
|
-
attr_reader :message
|
|
42
|
-
attr_reader :orig_object
|
|
43
|
-
attr_writer :expected_received_count, :expected_from, :argument_list_matcher
|
|
44
|
-
protected :expected_received_count=, :expected_from=, :error_generator, :error_generator=, :implementation=
|
|
45
|
-
|
|
46
|
-
# rubocop:disable Style/ParameterLists
|
|
47
|
-
# @private
|
|
48
|
-
def initialize(error_generator, expectation_ordering, expected_from, method_double,
|
|
49
|
-
type=:expectation, opts={}, &implementation_block)
|
|
50
|
-
@error_generator = error_generator
|
|
51
|
-
@error_generator.opts = opts
|
|
52
|
-
@expected_from = expected_from
|
|
53
|
-
@method_double = method_double
|
|
54
|
-
@orig_object = @method_double.object
|
|
55
|
-
@message = @method_double.method_name
|
|
56
|
-
@actual_received_count = 0
|
|
57
|
-
@expected_received_count = type == :expectation ? 1 : :any
|
|
58
|
-
@argument_list_matcher = ArgumentListMatcher::MATCH_ALL
|
|
59
|
-
@order_group = expectation_ordering
|
|
60
|
-
@order_group.register(self) unless type == :stub
|
|
61
|
-
@expectation_type = type
|
|
62
|
-
@ordered = false
|
|
63
|
-
@at_least = @at_most = @exactly = nil
|
|
64
|
-
@args_to_yield = []
|
|
65
|
-
@failed_fast = nil
|
|
66
|
-
@eval_context = nil
|
|
67
|
-
@yield_receiver_to_implementation_block = false
|
|
68
|
-
|
|
69
|
-
@implementation = Implementation.new
|
|
70
|
-
self.inner_implementation_action = implementation_block
|
|
71
|
-
end
|
|
72
|
-
# rubocop:enable Style/ParameterLists
|
|
73
|
-
|
|
74
|
-
# @private
|
|
75
|
-
def expected_args
|
|
76
|
-
@argument_list_matcher.expected_args
|
|
77
|
-
end
|
|
45
|
+
# @!group Configuring Responses
|
|
78
46
|
|
|
79
47
|
# @overload and_return(value)
|
|
80
48
|
# @overload and_return(first_value, second_value)
|
|
@@ -85,10 +53,10 @@ module RSpec
|
|
|
85
53
|
# etc.
|
|
86
54
|
#
|
|
87
55
|
# If the message is received more times than there are values, the last
|
|
88
|
-
# value is
|
|
56
|
+
# value is returned for every subsequent call.
|
|
89
57
|
#
|
|
58
|
+
# @return [nil] No further chaining is supported after this.
|
|
90
59
|
# @example
|
|
91
|
-
#
|
|
92
60
|
# allow(counter).to receive(:count).and_return(1)
|
|
93
61
|
# counter.count # => 1
|
|
94
62
|
# counter.count # => 1
|
|
@@ -101,6 +69,7 @@ module RSpec
|
|
|
101
69
|
# counter.count # => 3
|
|
102
70
|
# # etc
|
|
103
71
|
def and_return(first_value, *values)
|
|
72
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
104
73
|
if negative?
|
|
105
74
|
raise "`and_return` is not supported with negative message expectations"
|
|
106
75
|
end
|
|
@@ -116,13 +85,46 @@ module RSpec
|
|
|
116
85
|
nil
|
|
117
86
|
end
|
|
118
87
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
88
|
+
# Tells the object to invoke a Proc when it receives the message. Given
|
|
89
|
+
# more than one value, the result of the first Proc is returned the first
|
|
90
|
+
# time the message is received, the result of the second Proc is returned
|
|
91
|
+
# the next time, etc, etc.
|
|
92
|
+
#
|
|
93
|
+
# If the message is received more times than there are Procs, the result of
|
|
94
|
+
# the last Proc is returned for every subsequent call.
|
|
95
|
+
#
|
|
96
|
+
# @return [nil] No further chaining is supported after this.
|
|
97
|
+
# @example
|
|
98
|
+
# allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout })
|
|
99
|
+
# api.get_foo # => raises ApiTimeout
|
|
100
|
+
# api.get_foo # => raises ApiTimeout
|
|
101
|
+
#
|
|
102
|
+
# allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }, -> { raise ApiTimeout }, -> { :a_foo })
|
|
103
|
+
# api.get_foo # => raises ApiTimeout
|
|
104
|
+
# api.get_foo # => rasies ApiTimeout
|
|
105
|
+
# api.get_foo # => :a_foo
|
|
106
|
+
# api.get_foo # => :a_foo
|
|
107
|
+
# api.get_foo # => :a_foo
|
|
108
|
+
# # etc
|
|
109
|
+
def and_invoke(first_proc, *procs)
|
|
110
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
111
|
+
if negative?
|
|
112
|
+
raise "`and_invoke` is not supported with negative message expectations"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
if block_given?
|
|
116
|
+
raise ArgumentError, "Implementation blocks aren't supported with `and_invoke`"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
procs.unshift(first_proc)
|
|
120
|
+
if procs.any? { |p| !p.respond_to?(:call) }
|
|
121
|
+
raise ArgumentError, "Arguments to `and_invoke` must be callable."
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
@expected_received_count = [@expected_received_count, procs.size].max unless ignoring_args? || (@expected_received_count == 0 && @at_least)
|
|
125
|
+
self.terminal_implementation_action = AndInvokeImplementation.new(procs)
|
|
123
126
|
|
|
124
|
-
|
|
125
|
-
@yield_receiver_to_implementation_block
|
|
127
|
+
nil
|
|
126
128
|
end
|
|
127
129
|
|
|
128
130
|
# Tells the object to delegate to the original unmodified method
|
|
@@ -130,16 +132,19 @@ module RSpec
|
|
|
130
132
|
#
|
|
131
133
|
# @note This is only available on partial doubles.
|
|
132
134
|
#
|
|
135
|
+
# @return [nil] No further chaining is supported after this.
|
|
133
136
|
# @example
|
|
134
|
-
#
|
|
135
137
|
# expect(counter).to receive(:increment).and_call_original
|
|
136
138
|
# original_count = counter.count
|
|
137
139
|
# counter.increment
|
|
138
140
|
# expect(counter.count).to eq(original_count + 1)
|
|
139
141
|
def and_call_original
|
|
140
|
-
|
|
141
|
-
original.call(*args, &
|
|
142
|
+
block = lambda do |original, *args, &b|
|
|
143
|
+
original.call(*args, &b)
|
|
142
144
|
end
|
|
145
|
+
block = block.ruby2_keywords if block.respond_to?(:ruby2_keywords)
|
|
146
|
+
|
|
147
|
+
wrap_original(__method__, &block)
|
|
143
148
|
end
|
|
144
149
|
|
|
145
150
|
# Decorates the stubbed method with the supplied block. The original
|
|
@@ -149,20 +154,13 @@ module RSpec
|
|
|
149
154
|
#
|
|
150
155
|
# @note This is only available on partial doubles.
|
|
151
156
|
#
|
|
157
|
+
# @return [nil] No further chaining is supported after this.
|
|
152
158
|
# @example
|
|
153
|
-
#
|
|
154
159
|
# expect(api).to receive(:large_list).and_wrap_original do |original_method, *args, &block|
|
|
155
160
|
# original_method.call(*args, &block).first(10)
|
|
156
161
|
# end
|
|
157
|
-
#
|
|
158
162
|
def and_wrap_original(&block)
|
|
159
|
-
|
|
160
|
-
@error_generator.raise_only_valid_on_a_partial_double(:and_call_original)
|
|
161
|
-
else
|
|
162
|
-
warn_about_stub_override if implementation.inner_action
|
|
163
|
-
@implementation = AndWrapOriginalImplementation.new(@method_double.original_method, block)
|
|
164
|
-
@yield_receiver_to_implementation_block = false
|
|
165
|
-
end
|
|
163
|
+
wrap_original(__method__, &block)
|
|
166
164
|
end
|
|
167
165
|
|
|
168
166
|
# @overload and_raise
|
|
@@ -172,8 +170,8 @@ module RSpec
|
|
|
172
170
|
#
|
|
173
171
|
# Tells the object to raise an exception when the message is received.
|
|
174
172
|
#
|
|
173
|
+
# @return [nil] No further chaining is supported after this.
|
|
175
174
|
# @note
|
|
176
|
-
#
|
|
177
175
|
# When you pass an exception class, the MessageExpectation will raise
|
|
178
176
|
# an instance of it, creating it with `exception` and passing `message`
|
|
179
177
|
# if specified. If the exception class initializer requires more than
|
|
@@ -181,17 +179,13 @@ module RSpec
|
|
|
181
179
|
# otherwise this method will raise an ArgumentError exception.
|
|
182
180
|
#
|
|
183
181
|
# @example
|
|
184
|
-
#
|
|
185
182
|
# allow(car).to receive(:go).and_raise
|
|
186
183
|
# allow(car).to receive(:go).and_raise(OutOfGas)
|
|
187
184
|
# allow(car).to receive(:go).and_raise(OutOfGas, "At least 2 oz of gas needed to drive")
|
|
188
185
|
# allow(car).to receive(:go).and_raise(OutOfGas.new(2, :oz))
|
|
189
|
-
def and_raise(
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
self.terminal_implementation_action = Proc.new { raise exception }
|
|
186
|
+
def and_raise(*args)
|
|
187
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
188
|
+
self.terminal_implementation_action = Proc.new { raise(*args) }
|
|
195
189
|
nil
|
|
196
190
|
end
|
|
197
191
|
|
|
@@ -201,11 +195,12 @@ module RSpec
|
|
|
201
195
|
# Tells the object to throw a symbol (with the object if that form is
|
|
202
196
|
# used) when the message is received.
|
|
203
197
|
#
|
|
198
|
+
# @return [nil] No further chaining is supported after this.
|
|
204
199
|
# @example
|
|
205
|
-
#
|
|
206
200
|
# allow(car).to receive(:go).and_throw(:out_of_gas)
|
|
207
201
|
# allow(car).to receive(:go).and_throw(:out_of_gas, :level => 0.1)
|
|
208
202
|
def and_throw(*args)
|
|
203
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
209
204
|
self.terminal_implementation_action = Proc.new { throw(*args) }
|
|
210
205
|
nil
|
|
211
206
|
end
|
|
@@ -213,167 +208,33 @@ module RSpec
|
|
|
213
208
|
# Tells the object to yield one or more args to a block when the message
|
|
214
209
|
# is received.
|
|
215
210
|
#
|
|
211
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
216
212
|
# @example
|
|
217
|
-
#
|
|
218
213
|
# stream.stub(:open).and_yield(StringIO.new)
|
|
219
214
|
def and_yield(*args, &block)
|
|
215
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
220
216
|
yield @eval_context = Object.new if block
|
|
217
|
+
|
|
218
|
+
# Initialize args to yield now that it's being used, see also: comment
|
|
219
|
+
# in constructor.
|
|
220
|
+
@args_to_yield ||= []
|
|
221
|
+
|
|
221
222
|
@args_to_yield << args
|
|
222
223
|
self.initial_implementation_action = AndYieldImplementation.new(@args_to_yield, @eval_context, @error_generator)
|
|
223
224
|
self
|
|
224
225
|
end
|
|
226
|
+
# @!endgroup
|
|
225
227
|
|
|
226
|
-
#
|
|
227
|
-
def matches?(message, *args)
|
|
228
|
-
@message == message && @argument_list_matcher.args_match?(*args)
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
# @private
|
|
232
|
-
def safe_invoke(parent_stub, *args, &block)
|
|
233
|
-
invoke_incrementing_actual_calls_by(1, false, parent_stub, *args, &block)
|
|
234
|
-
end
|
|
235
|
-
|
|
236
|
-
# @private
|
|
237
|
-
def invoke(parent_stub, *args, &block)
|
|
238
|
-
invoke_incrementing_actual_calls_by(1, true, parent_stub, *args, &block)
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
# @private
|
|
242
|
-
def invoke_without_incrementing_received_count(parent_stub, *args, &block)
|
|
243
|
-
invoke_incrementing_actual_calls_by(0, true, parent_stub, *args, &block)
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
# @private
|
|
247
|
-
def negative?
|
|
248
|
-
@expected_received_count == 0 && !@at_least
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
# @private
|
|
252
|
-
def called_max_times?
|
|
253
|
-
@expected_received_count != :any &&
|
|
254
|
-
!@at_least &&
|
|
255
|
-
@expected_received_count > 0 &&
|
|
256
|
-
@actual_received_count >= @expected_received_count
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
# @private
|
|
260
|
-
def matches_name_but_not_args(message, *args)
|
|
261
|
-
@message == message && !@argument_list_matcher.args_match?(*args)
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
# @private
|
|
265
|
-
def verify_messages_received
|
|
266
|
-
InsertOntoBacktrace.line(@expected_from) do
|
|
267
|
-
generate_error unless expected_messages_received? || failed_fast?
|
|
268
|
-
end
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
# @private
|
|
272
|
-
def expected_messages_received?
|
|
273
|
-
ignoring_args? || matches_exact_count? || matches_at_least_count? || matches_at_most_count?
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
def ensure_expected_ordering_received!
|
|
277
|
-
@order_group.verify_invocation_order(self) if @ordered
|
|
278
|
-
true
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
# @private
|
|
282
|
-
def ignoring_args?
|
|
283
|
-
@expected_received_count == :any
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
# @private
|
|
287
|
-
def matches_at_least_count?
|
|
288
|
-
@at_least && @actual_received_count >= @expected_received_count
|
|
289
|
-
end
|
|
290
|
-
|
|
291
|
-
# @private
|
|
292
|
-
def matches_at_most_count?
|
|
293
|
-
@at_most && @actual_received_count <= @expected_received_count
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
# @private
|
|
297
|
-
def matches_exact_count?
|
|
298
|
-
@expected_received_count == @actual_received_count
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
# @private
|
|
302
|
-
def similar_messages
|
|
303
|
-
@similar_messages ||= []
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
# @private
|
|
307
|
-
def advise(*args)
|
|
308
|
-
similar_messages << args
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
# @private
|
|
312
|
-
def generate_error
|
|
313
|
-
if similar_messages.empty?
|
|
314
|
-
@error_generator.raise_expectation_error(@message, @expected_received_count, @argument_list_matcher, @actual_received_count, expectation_count_type, *expected_args)
|
|
315
|
-
else
|
|
316
|
-
@error_generator.raise_similar_message_args_error(self, *@similar_messages)
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
def expectation_count_type
|
|
321
|
-
return :at_least if @at_least
|
|
322
|
-
return :at_most if @at_most
|
|
323
|
-
nil
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
# @private
|
|
327
|
-
def description
|
|
328
|
-
@error_generator.describe_expectation(@message, @expected_received_count, @actual_received_count, *expected_args)
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
def raise_out_of_order_error
|
|
332
|
-
@error_generator.raise_out_of_order_error @message
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
# Constrains a stub or message expectation to invocations with specific
|
|
336
|
-
# arguments.
|
|
337
|
-
#
|
|
338
|
-
# With a stub, if the message might be received with other args as well,
|
|
339
|
-
# you should stub a default value first, and then stub or mock the same
|
|
340
|
-
# message using `with` to constrain to specific arguments.
|
|
341
|
-
#
|
|
342
|
-
# A message expectation will fail if the message is received with different
|
|
343
|
-
# arguments.
|
|
344
|
-
#
|
|
345
|
-
# @example
|
|
346
|
-
#
|
|
347
|
-
# allow(cart).to receive(:add) { :failure }
|
|
348
|
-
# allow(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success }
|
|
349
|
-
# cart.add(Book.new(:isbn => 1234567890))
|
|
350
|
-
# # => :failure
|
|
351
|
-
# cart.add(Book.new(:isbn => 1934356379))
|
|
352
|
-
# # => :success
|
|
353
|
-
#
|
|
354
|
-
# expect(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success }
|
|
355
|
-
# cart.add(Book.new(:isbn => 1234567890))
|
|
356
|
-
# # => failed expectation
|
|
357
|
-
# cart.add(Book.new(:isbn => 1934356379))
|
|
358
|
-
# # => passes
|
|
359
|
-
def with(*args, &block)
|
|
360
|
-
if args.empty?
|
|
361
|
-
raise ArgumentError,
|
|
362
|
-
"`with` must have at least one argument. Use `no_args` matcher to set the expectation of receiving no arguments."
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
self.inner_implementation_action = block
|
|
366
|
-
@argument_list_matcher = ArgumentListMatcher.new(*args)
|
|
367
|
-
self
|
|
368
|
-
end
|
|
228
|
+
# @!group Constraining Receive Counts
|
|
369
229
|
|
|
370
230
|
# Constrain a message expectation to be received a specific number of
|
|
371
231
|
# times.
|
|
372
232
|
#
|
|
233
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
373
234
|
# @example
|
|
374
|
-
#
|
|
375
235
|
# expect(dealer).to receive(:deal_card).exactly(10).times
|
|
376
236
|
def exactly(n, &block)
|
|
237
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
377
238
|
self.inner_implementation_action = block
|
|
378
239
|
set_expected_received_count :exactly, n
|
|
379
240
|
self
|
|
@@ -382,10 +243,11 @@ module RSpec
|
|
|
382
243
|
# Constrain a message expectation to be received at least a specific
|
|
383
244
|
# number of times.
|
|
384
245
|
#
|
|
246
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
385
247
|
# @example
|
|
386
|
-
#
|
|
387
248
|
# expect(dealer).to receive(:deal_card).at_least(9).times
|
|
388
249
|
def at_least(n, &block)
|
|
250
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
389
251
|
set_expected_received_count :at_least, n
|
|
390
252
|
|
|
391
253
|
if n == 0
|
|
@@ -400,10 +262,11 @@ module RSpec
|
|
|
400
262
|
# Constrain a message expectation to be received at most a specific
|
|
401
263
|
# number of times.
|
|
402
264
|
#
|
|
265
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
403
266
|
# @example
|
|
404
|
-
#
|
|
405
267
|
# expect(dealer).to receive(:deal_card).at_most(10).times
|
|
406
268
|
def at_most(n, &block)
|
|
269
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
407
270
|
self.inner_implementation_action = block
|
|
408
271
|
set_expected_received_count :at_most, n
|
|
409
272
|
self
|
|
@@ -411,8 +274,8 @@ module RSpec
|
|
|
411
274
|
|
|
412
275
|
# Syntactic sugar for `exactly`, `at_least` and `at_most`
|
|
413
276
|
#
|
|
277
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
414
278
|
# @example
|
|
415
|
-
#
|
|
416
279
|
# expect(dealer).to receive(:deal_card).exactly(10).times
|
|
417
280
|
# expect(dealer).to receive(:deal_card).at_least(10).times
|
|
418
281
|
# expect(dealer).to receive(:deal_card).at_most(10).times
|
|
@@ -420,22 +283,23 @@ module RSpec
|
|
|
420
283
|
self.inner_implementation_action = block
|
|
421
284
|
self
|
|
422
285
|
end
|
|
286
|
+
alias time times
|
|
423
287
|
|
|
424
288
|
# Expect a message not to be received at all.
|
|
425
289
|
#
|
|
290
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
426
291
|
# @example
|
|
427
|
-
#
|
|
428
292
|
# expect(car).to receive(:stop).never
|
|
429
293
|
def never
|
|
430
|
-
|
|
294
|
+
error_generator.raise_double_negation_error("expect(obj)") if negative?
|
|
431
295
|
@expected_received_count = 0
|
|
432
296
|
self
|
|
433
297
|
end
|
|
434
298
|
|
|
435
299
|
# Expect a message to be received exactly one time.
|
|
436
300
|
#
|
|
301
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
437
302
|
# @example
|
|
438
|
-
#
|
|
439
303
|
# expect(car).to receive(:go).once
|
|
440
304
|
def once(&block)
|
|
441
305
|
self.inner_implementation_action = block
|
|
@@ -445,8 +309,8 @@ module RSpec
|
|
|
445
309
|
|
|
446
310
|
# Expect a message to be received exactly two times.
|
|
447
311
|
#
|
|
312
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
448
313
|
# @example
|
|
449
|
-
#
|
|
450
314
|
# expect(car).to receive(:go).twice
|
|
451
315
|
def twice(&block)
|
|
452
316
|
self.inner_implementation_action = block
|
|
@@ -456,23 +320,70 @@ module RSpec
|
|
|
456
320
|
|
|
457
321
|
# Expect a message to be received exactly three times.
|
|
458
322
|
#
|
|
323
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
459
324
|
# @example
|
|
460
|
-
#
|
|
461
325
|
# expect(car).to receive(:go).thrice
|
|
462
326
|
def thrice(&block)
|
|
463
327
|
self.inner_implementation_action = block
|
|
464
328
|
set_expected_received_count :exactly, 3
|
|
465
329
|
self
|
|
466
330
|
end
|
|
331
|
+
# @!endgroup
|
|
467
332
|
|
|
468
|
-
#
|
|
333
|
+
# @!group Other Constraints
|
|
334
|
+
|
|
335
|
+
# Constrains a stub or message expectation to invocations with specific
|
|
336
|
+
# arguments.
|
|
469
337
|
#
|
|
338
|
+
# With a stub, if the message might be received with other args as well,
|
|
339
|
+
# you should stub a default value first, and then stub or mock the same
|
|
340
|
+
# message using `with` to constrain to specific arguments.
|
|
341
|
+
#
|
|
342
|
+
# A message expectation will fail if the message is received with different
|
|
343
|
+
# arguments.
|
|
344
|
+
#
|
|
345
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
470
346
|
# @example
|
|
347
|
+
# allow(cart).to receive(:add) { :failure }
|
|
348
|
+
# allow(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success }
|
|
349
|
+
# cart.add(Book.new(:isbn => 1234567890))
|
|
350
|
+
# # => :failure
|
|
351
|
+
# cart.add(Book.new(:isbn => 1934356379))
|
|
352
|
+
# # => :success
|
|
353
|
+
#
|
|
354
|
+
# expect(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success }
|
|
355
|
+
# cart.add(Book.new(:isbn => 1234567890))
|
|
356
|
+
# # => failed expectation
|
|
357
|
+
# cart.add(Book.new(:isbn => 1934356379))
|
|
358
|
+
# # => passes
|
|
359
|
+
def with(*args, &block)
|
|
360
|
+
raise_already_invoked_error_if_necessary(__method__)
|
|
361
|
+
if args.empty?
|
|
362
|
+
raise ArgumentError,
|
|
363
|
+
"`with` must have at least one argument. Use `no_args` matcher to set the expectation of receiving no arguments."
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
self.inner_implementation_action = block
|
|
367
|
+
@argument_list_matcher = ArgumentListMatcher.new(*args)
|
|
368
|
+
self
|
|
369
|
+
end
|
|
370
|
+
ruby2_keywords(:with) if respond_to?(:ruby2_keywords, true)
|
|
371
|
+
|
|
372
|
+
# Expect messages to be received in a specific order.
|
|
471
373
|
#
|
|
374
|
+
# @return [MessageExpectation] self, to support further chaining.
|
|
375
|
+
# @example
|
|
472
376
|
# expect(api).to receive(:prepare).ordered
|
|
473
377
|
# expect(api).to receive(:run).ordered
|
|
474
378
|
# expect(api).to receive(:finish).ordered
|
|
475
379
|
def ordered(&block)
|
|
380
|
+
if type == :stub
|
|
381
|
+
RSpec.warning(
|
|
382
|
+
"`allow(...).to receive(..).ordered` is not supported and will " \
|
|
383
|
+
"have no effect, use `and_return(*ordered_values)` instead."
|
|
384
|
+
)
|
|
385
|
+
end
|
|
386
|
+
|
|
476
387
|
self.inner_implementation_action = block
|
|
477
388
|
additional_expected_calls.times do
|
|
478
389
|
@order_group.register(self)
|
|
@@ -481,94 +392,301 @@ module RSpec
|
|
|
481
392
|
self
|
|
482
393
|
end
|
|
483
394
|
|
|
484
|
-
# @
|
|
485
|
-
def
|
|
486
|
-
|
|
487
|
-
|
|
395
|
+
# @return [String] a nice representation of the message expectation
|
|
396
|
+
def to_s
|
|
397
|
+
args_description = error_generator.method_call_args_description(@argument_list_matcher.expected_args, "", "") { true }
|
|
398
|
+
args_description = "(#{args_description})" unless args_description.start_with?("(")
|
|
399
|
+
"#<#{self.class} #{error_generator.intro}.#{message}#{args_description}>"
|
|
488
400
|
end
|
|
401
|
+
alias inspect to_s
|
|
489
402
|
|
|
490
403
|
# @private
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
404
|
+
# Contains the parts of `MessageExpectation` that aren't part of
|
|
405
|
+
# rspec-mocks' public API. The class is very big and could really use
|
|
406
|
+
# some collaborators it delegates to for this stuff but for now this was
|
|
407
|
+
# the simplest way to split the public from private stuff to make it
|
|
408
|
+
# easier to publish the docs for the APIs we want published.
|
|
409
|
+
module ImplementationDetails
|
|
410
|
+
attr_accessor :error_generator, :implementation
|
|
411
|
+
attr_reader :message
|
|
412
|
+
attr_reader :orig_object
|
|
413
|
+
attr_writer :expected_received_count, :expected_from, :argument_list_matcher
|
|
414
|
+
protected :expected_received_count=, :expected_from=, :error_generator=, :implementation=
|
|
415
|
+
|
|
416
|
+
# @private
|
|
417
|
+
attr_reader :type
|
|
418
|
+
|
|
419
|
+
# rubocop:disable Metrics/ParameterLists
|
|
420
|
+
def initialize(error_generator, expectation_ordering, expected_from, method_double,
|
|
421
|
+
type=:expectation, opts={}, &implementation_block)
|
|
422
|
+
@type = type
|
|
423
|
+
@error_generator = error_generator
|
|
424
|
+
@error_generator.opts = error_generator.opts.merge(opts)
|
|
425
|
+
@expected_from = expected_from
|
|
426
|
+
@method_double = method_double
|
|
427
|
+
@orig_object = @method_double.object
|
|
428
|
+
@message = @method_double.method_name
|
|
429
|
+
@actual_received_count = 0
|
|
430
|
+
@actual_received_count_write_mutex = Support::Mutex.new
|
|
431
|
+
@expected_received_count = type == :expectation ? 1 : :any
|
|
432
|
+
@argument_list_matcher = ArgumentListMatcher::MATCH_ALL
|
|
433
|
+
@order_group = expectation_ordering
|
|
434
|
+
@order_group.register(self) unless type == :stub
|
|
435
|
+
@expectation_type = type
|
|
436
|
+
@ordered = false
|
|
437
|
+
@at_least = @at_most = @exactly = nil
|
|
438
|
+
|
|
439
|
+
# Initialized to nil so that we don't allocate an array for every
|
|
440
|
+
# mock or stub. See also comment in `and_yield`.
|
|
441
|
+
@args_to_yield = nil
|
|
442
|
+
@eval_context = nil
|
|
443
|
+
@yield_receiver_to_implementation_block = false
|
|
494
444
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
445
|
+
@implementation = Implementation.new
|
|
446
|
+
self.inner_implementation_action = implementation_block
|
|
447
|
+
end
|
|
448
|
+
# rubocop:enable Metrics/ParameterLists
|
|
499
449
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
end
|
|
450
|
+
def expected_args
|
|
451
|
+
@argument_list_matcher.expected_args
|
|
452
|
+
end
|
|
504
453
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
454
|
+
def and_yield_receiver_to_implementation
|
|
455
|
+
@yield_receiver_to_implementation_block = true
|
|
456
|
+
self
|
|
457
|
+
end
|
|
509
458
|
|
|
510
|
-
|
|
459
|
+
def yield_receiver_to_implementation_block?
|
|
460
|
+
@yield_receiver_to_implementation_block
|
|
461
|
+
end
|
|
511
462
|
|
|
512
|
-
|
|
513
|
-
|
|
463
|
+
def matches?(message, *args)
|
|
464
|
+
@message == message && @argument_list_matcher.args_match?(*args)
|
|
465
|
+
end
|
|
466
|
+
ruby2_keywords :matches? if respond_to?(:ruby2_keywords, true)
|
|
514
467
|
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
@failed_fast = true
|
|
518
|
-
# args are the args we actually received, @argument_list_matcher is the
|
|
519
|
-
# list of args we were expecting
|
|
520
|
-
@error_generator.raise_expectation_error(@message, @expected_received_count, @argument_list_matcher, @actual_received_count, expectation_count_type, *args)
|
|
468
|
+
def safe_invoke(parent_stub, *args, &block)
|
|
469
|
+
invoke_incrementing_actual_calls_by(1, false, parent_stub, *args, &block)
|
|
521
470
|
end
|
|
471
|
+
ruby2_keywords :safe_invoke if respond_to?(:ruby2_keywords, true)
|
|
522
472
|
|
|
523
|
-
|
|
473
|
+
def invoke(parent_stub, *args, &block)
|
|
474
|
+
invoke_incrementing_actual_calls_by(1, true, parent_stub, *args, &block)
|
|
475
|
+
end
|
|
476
|
+
ruby2_keywords :invoke if respond_to?(:ruby2_keywords, true)
|
|
477
|
+
|
|
478
|
+
def invoke_without_incrementing_received_count(parent_stub, *args, &block)
|
|
479
|
+
invoke_incrementing_actual_calls_by(0, true, parent_stub, *args, &block)
|
|
480
|
+
end
|
|
481
|
+
ruby2_keywords :invoke_without_incrementing_received_count if respond_to?(:ruby2_keywords, true)
|
|
482
|
+
|
|
483
|
+
def negative?
|
|
484
|
+
@expected_received_count == 0 && !@at_least
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
def called_max_times?
|
|
488
|
+
@expected_received_count != :any &&
|
|
489
|
+
!@at_least &&
|
|
490
|
+
@expected_received_count > 0 &&
|
|
491
|
+
@actual_received_count >= @expected_received_count
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
def matches_name_but_not_args(message, *args)
|
|
495
|
+
@message == message && !@argument_list_matcher.args_match?(*args)
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
def verify_messages_received
|
|
499
|
+
return if expected_messages_received?
|
|
500
|
+
generate_error
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
def expected_messages_received?
|
|
504
|
+
ignoring_args? || matches_exact_count? || matches_at_least_count? || matches_at_most_count?
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
def ensure_expected_ordering_received!
|
|
508
|
+
@order_group.verify_invocation_order(self) if @ordered
|
|
509
|
+
true
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
def ignoring_args?
|
|
513
|
+
@expected_received_count == :any
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
def matches_at_least_count?
|
|
517
|
+
@at_least && @actual_received_count >= @expected_received_count
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
def matches_at_most_count?
|
|
521
|
+
@at_most && @actual_received_count <= @expected_received_count
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
def matches_exact_count?
|
|
525
|
+
@expected_received_count == @actual_received_count
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
def similar_messages
|
|
529
|
+
@similar_messages ||= []
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
def advise(*args)
|
|
533
|
+
similar_messages << args
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
def unadvise(args)
|
|
537
|
+
similar_messages.delete_if { |message| args.include?(message) }
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
def generate_error
|
|
541
|
+
if similar_messages.empty?
|
|
542
|
+
@error_generator.raise_expectation_error(
|
|
543
|
+
@message, @expected_received_count, @argument_list_matcher,
|
|
544
|
+
@actual_received_count, expectation_count_type, expected_args,
|
|
545
|
+
@expected_from, exception_source_id
|
|
546
|
+
)
|
|
547
|
+
else
|
|
548
|
+
@error_generator.raise_similar_message_args_error(
|
|
549
|
+
self, @similar_messages, @expected_from
|
|
550
|
+
)
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
def raise_unexpected_message_args_error(args_for_multiple_calls)
|
|
555
|
+
@error_generator.raise_unexpected_message_args_error(self, args_for_multiple_calls, exception_source_id)
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
def expectation_count_type
|
|
559
|
+
return :at_least if @at_least
|
|
560
|
+
return :at_most if @at_most
|
|
561
|
+
nil
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
def description_for(verb)
|
|
565
|
+
@error_generator.describe_expectation(
|
|
566
|
+
verb, @message, @expected_received_count,
|
|
567
|
+
@actual_received_count, expected_args
|
|
568
|
+
)
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
def raise_out_of_order_error
|
|
572
|
+
@error_generator.raise_out_of_order_error @message
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
def additional_expected_calls
|
|
576
|
+
return 0 if @expectation_type == :stub || !@exactly
|
|
577
|
+
@expected_received_count - 1
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
def ordered?
|
|
581
|
+
@ordered
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
def negative_expectation_for?(message)
|
|
585
|
+
@message == message && negative?
|
|
586
|
+
end
|
|
587
|
+
|
|
588
|
+
def actual_received_count_matters?
|
|
589
|
+
@at_least || @at_most || @exactly
|
|
590
|
+
end
|
|
591
|
+
|
|
592
|
+
def increase_actual_received_count!
|
|
593
|
+
@actual_received_count_write_mutex.synchronize do
|
|
594
|
+
@actual_received_count += 1
|
|
595
|
+
end
|
|
596
|
+
end
|
|
597
|
+
|
|
598
|
+
private
|
|
599
|
+
|
|
600
|
+
def exception_source_id
|
|
601
|
+
@exception_source_id ||= "#{self.class.name} #{__id__}"
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
def invoke_incrementing_actual_calls_by(increment, allowed_to_fail, parent_stub, *args, &block)
|
|
605
|
+
args.unshift(orig_object) if yield_receiver_to_implementation_block?
|
|
606
|
+
|
|
607
|
+
if negative? || (allowed_to_fail && (@exactly || @at_most) && (@actual_received_count == @expected_received_count))
|
|
608
|
+
# args are the args we actually received, @argument_list_matcher is the
|
|
609
|
+
# list of args we were expecting
|
|
610
|
+
@error_generator.raise_expectation_error(
|
|
611
|
+
@message, @expected_received_count,
|
|
612
|
+
@argument_list_matcher,
|
|
613
|
+
@actual_received_count + increment,
|
|
614
|
+
expectation_count_type, args, nil, exception_source_id
|
|
615
|
+
)
|
|
616
|
+
end
|
|
617
|
+
|
|
618
|
+
@order_group.handle_order_constraint self
|
|
524
619
|
|
|
525
|
-
begin
|
|
526
620
|
if implementation.present?
|
|
527
621
|
implementation.call(*args, &block)
|
|
528
622
|
elsif parent_stub
|
|
529
623
|
parent_stub.invoke(nil, *args, &block)
|
|
530
624
|
end
|
|
531
625
|
ensure
|
|
532
|
-
@
|
|
626
|
+
@actual_received_count_write_mutex.synchronize do
|
|
627
|
+
@actual_received_count += increment
|
|
628
|
+
end
|
|
533
629
|
end
|
|
534
|
-
|
|
630
|
+
ruby2_keywords :invoke_incrementing_actual_calls_by if respond_to?(:ruby2_keywords, true)
|
|
535
631
|
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
632
|
+
def has_been_invoked?
|
|
633
|
+
@actual_received_count > 0
|
|
634
|
+
end
|
|
539
635
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
@at_most = (relativity == :at_most)
|
|
543
|
-
@exactly = (relativity == :exactly)
|
|
544
|
-
@expected_received_count = case n
|
|
545
|
-
when Numeric then n
|
|
546
|
-
when :once then 1
|
|
547
|
-
when :twice then 2
|
|
548
|
-
when :thrice then 3
|
|
549
|
-
end
|
|
550
|
-
end
|
|
636
|
+
def raise_already_invoked_error_if_necessary(calling_customization)
|
|
637
|
+
return unless has_been_invoked?
|
|
551
638
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
end
|
|
639
|
+
error_generator.raise_already_invoked_error(message, calling_customization)
|
|
640
|
+
end
|
|
555
641
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
642
|
+
def set_expected_received_count(relativity, n)
|
|
643
|
+
raise "`count` is not supported with negative message expectations" if negative?
|
|
644
|
+
@at_least = (relativity == :at_least)
|
|
645
|
+
@at_most = (relativity == :at_most)
|
|
646
|
+
@exactly = (relativity == :exactly)
|
|
647
|
+
@expected_received_count = case n
|
|
648
|
+
when Numeric then n
|
|
649
|
+
when :once then 1
|
|
650
|
+
when :twice then 2
|
|
651
|
+
when :thrice then 3
|
|
652
|
+
end
|
|
653
|
+
end
|
|
561
654
|
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
655
|
+
def initial_implementation_action=(action)
|
|
656
|
+
implementation.initial_action = action
|
|
657
|
+
end
|
|
565
658
|
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
659
|
+
def inner_implementation_action=(action)
|
|
660
|
+
return unless action
|
|
661
|
+
warn_about_stub_override if implementation.inner_action
|
|
662
|
+
implementation.inner_action = action
|
|
663
|
+
end
|
|
664
|
+
|
|
665
|
+
def terminal_implementation_action=(action)
|
|
666
|
+
implementation.terminal_action = action
|
|
667
|
+
end
|
|
668
|
+
|
|
669
|
+
def warn_about_stub_override
|
|
670
|
+
RSpec.warning(
|
|
671
|
+
"You're overriding a previous stub implementation of `#{@message}`. " \
|
|
672
|
+
"Called from #{CallerFilter.first_non_rspec_line}."
|
|
673
|
+
)
|
|
674
|
+
end
|
|
675
|
+
|
|
676
|
+
def wrap_original(method_name, &block)
|
|
677
|
+
if RSpec::Mocks::TestDouble === @method_double.object
|
|
678
|
+
@error_generator.raise_only_valid_on_a_partial_double(method_name)
|
|
679
|
+
else
|
|
680
|
+
warn_about_stub_override if implementation.inner_action
|
|
681
|
+
@implementation = AndWrapOriginalImplementation.new(@method_double.original_implementation_callable, block)
|
|
682
|
+
@yield_receiver_to_implementation_block = false
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
nil
|
|
686
|
+
end
|
|
571
687
|
end
|
|
688
|
+
|
|
689
|
+
include ImplementationDetails
|
|
572
690
|
end
|
|
573
691
|
|
|
574
692
|
# Handles the implementation of an `and_yield` declaration.
|
|
@@ -592,7 +710,7 @@ module RSpec
|
|
|
592
710
|
@error_generator.raise_wrong_arity_error(args, block_signature)
|
|
593
711
|
end
|
|
594
712
|
|
|
595
|
-
value = @eval_context ? @eval_context.instance_exec(*args, &block) :
|
|
713
|
+
value = @eval_context ? @eval_context.instance_exec(*args, &block) : yield(*args)
|
|
596
714
|
end
|
|
597
715
|
value
|
|
598
716
|
end
|
|
@@ -614,6 +732,24 @@ module RSpec
|
|
|
614
732
|
end
|
|
615
733
|
end
|
|
616
734
|
|
|
735
|
+
# Handles the implementation of an `and_invoke` implementation.
|
|
736
|
+
# @private
|
|
737
|
+
class AndInvokeImplementation
|
|
738
|
+
def initialize(procs_to_invoke)
|
|
739
|
+
@procs_to_invoke = procs_to_invoke
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
def call(*args, &block)
|
|
743
|
+
proc = if @procs_to_invoke.size > 1
|
|
744
|
+
@procs_to_invoke.shift
|
|
745
|
+
else
|
|
746
|
+
@procs_to_invoke.first
|
|
747
|
+
end
|
|
748
|
+
|
|
749
|
+
proc.call(*args, &block)
|
|
750
|
+
end
|
|
751
|
+
end
|
|
752
|
+
|
|
617
753
|
# Represents a configured implementation. Takes into account
|
|
618
754
|
# any number of sub-implementations.
|
|
619
755
|
# @private
|
|
@@ -625,6 +761,7 @@ module RSpec
|
|
|
625
761
|
action.call(*args, &block)
|
|
626
762
|
end.last
|
|
627
763
|
end
|
|
764
|
+
ruby2_keywords :call if respond_to?(:ruby2_keywords, true)
|
|
628
765
|
|
|
629
766
|
def present?
|
|
630
767
|
actions.any?
|
|
@@ -670,6 +807,7 @@ module RSpec
|
|
|
670
807
|
def call(*args, &block)
|
|
671
808
|
@block.call(@method, *args, &block)
|
|
672
809
|
end
|
|
810
|
+
ruby2_keywords :call if respond_to?(:ruby2_keywords, true)
|
|
673
811
|
|
|
674
812
|
private
|
|
675
813
|
|
|
@@ -678,17 +816,5 @@ module RSpec
|
|
|
678
816
|
"to call the original implementation, and cannot be modified further."
|
|
679
817
|
end
|
|
680
818
|
end
|
|
681
|
-
|
|
682
|
-
# Insert original locations into stacktraces
|
|
683
|
-
#
|
|
684
|
-
# @private
|
|
685
|
-
class InsertOntoBacktrace
|
|
686
|
-
def self.line(location)
|
|
687
|
-
yield
|
|
688
|
-
rescue RSpec::Mocks::MockExpectationError => error
|
|
689
|
-
error.backtrace.insert(0, location)
|
|
690
|
-
Kernel.raise error
|
|
691
|
-
end
|
|
692
|
-
end
|
|
693
819
|
end
|
|
694
820
|
end
|