opal-connect-rspec 0.5.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 +7 -0
- data/.gitignore +5 -0
- data/.gitmodules +15 -0
- data/.travis.yml +51 -0
- data/.yardopts +5 -0
- data/CHANGELOG.md +54 -0
- data/Gemfile +19 -0
- data/README.md +325 -0
- data/Rakefile +169 -0
- data/config.ru +15 -0
- data/example/Gemfile +4 -0
- data/example/README.md +13 -0
- data/example/Rakefile +8 -0
- data/example/opal/user.rb +11 -0
- data/example/spec/user_spec.rb +15 -0
- data/gemfiles/opal_master.gemfile +18 -0
- data/lib/opal-rspec.rb +2 -0
- data/lib/opal/rspec.rb +39 -0
- data/lib/opal/rspec/cached_environment.rb +25 -0
- data/lib/opal/rspec/post_rack_locator.rb +20 -0
- data/lib/opal/rspec/pre_rack_locator.rb +32 -0
- data/lib/opal/rspec/rake_task.rb +132 -0
- data/lib/opal/rspec/sprockets_environment.rb +37 -0
- data/lib/opal/rspec/version.rb +5 -0
- data/opal-rspec.gemspec +21 -0
- data/opal/opal-rspec.rb +1 -0
- data/opal/opal/rspec.rb +23 -0
- data/opal/opal/rspec/async.rb +5 -0
- data/opal/opal/rspec/async/async_example.rb +96 -0
- data/opal/opal/rspec/async/example_group.rb +96 -0
- data/opal/opal/rspec/async/hooks.rb +10 -0
- data/opal/opal/rspec/async/legacy.rb +50 -0
- data/opal/opal/rspec/async/reporter.rb +9 -0
- data/opal/opal/rspec/fixes.rb +5 -0
- data/opal/opal/rspec/fixes/opal.rb +5 -0
- data/opal/opal/rspec/fixes/opal/class.rb +8 -0
- data/opal/opal/rspec/fixes/opal/compatibility.rb +228 -0
- data/opal/opal/rspec/fixes/opal/corelib.rb +3 -0
- data/opal/opal/rspec/fixes/opal/corelib/error.rb +61 -0
- data/opal/opal/rspec/fixes/opal/corelib/regexp.rb +92 -0
- data/opal/opal/rspec/fixes/opal/corelib/struct.rb +260 -0
- data/opal/opal/rspec/fixes/opal/kernel.rb +80 -0
- data/opal/opal/rspec/fixes/opal/stdlib.rb +2 -0
- data/opal/opal/rspec/fixes/opal/stdlib/pp.rb +23 -0
- data/opal/opal/rspec/fixes/opal/stdlib/set.rb +36 -0
- data/opal/opal/rspec/fixes/rspec.rb +7 -0
- data/opal/opal/rspec/fixes/rspec/caller_filter.rb +6 -0
- data/opal/opal/rspec/fixes/rspec/core.rb +9 -0
- data/opal/opal/rspec/fixes/rspec/core/configuration.rb +11 -0
- data/opal/opal/rspec/fixes/rspec/core/example.rb +20 -0
- data/opal/opal/rspec/fixes/rspec/core/example_group.rb +9 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters.rb +6 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/backtrace_formatter.rb +20 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/console_codes.rb +11 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/deprecation_formatter.rb +20 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/generated_deprecation_message.rb +15 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/json_formatter.rb +10 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/loader.rb +38 -0
- data/opal/opal/rspec/fixes/rspec/core/metadata.rb +39 -0
- data/opal/opal/rspec/fixes/rspec/core/notifications.rb +3 -0
- data/opal/opal/rspec/fixes/rspec/core/notifications/examples_notification.rb +30 -0
- data/opal/opal/rspec/fixes/rspec/core/notifications/failed_example_notification.rb +20 -0
- data/opal/opal/rspec/fixes/rspec/core/notifications/summary_notification.rb +26 -0
- data/opal/opal/rspec/fixes/rspec/core/ordering.rb +1 -0
- data/opal/opal/rspec/fixes/rspec/core/ordering/random.rb +13 -0
- data/opal/opal/rspec/fixes/rspec/core/reporter.rb +14 -0
- data/opal/opal/rspec/fixes/rspec/core/warnings.rb +18 -0
- data/opal/opal/rspec/fixes/rspec/example_groups.rb +49 -0
- data/opal/opal/rspec/fixes/rspec/expectations.rb +2 -0
- data/opal/opal/rspec/fixes/rspec/expectations/fail_with.rb +21 -0
- data/opal/opal/rspec/fixes/rspec/expectations/syntax.rb +25 -0
- data/opal/opal/rspec/fixes/rspec/matchers.rb +2 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in.rb +4 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in/all.rb +10 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in/compound.rb +15 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in/start_and_end_with.rb +42 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in/yield.rb +21 -0
- data/opal/opal/rspec/fixes/rspec/matchers/pretty.rb +15 -0
- data/opal/opal/rspec/fixes/rspec/mocks.rb +4 -0
- data/opal/opal/rspec/fixes/rspec/mocks/error_generator.rb +40 -0
- data/opal/opal/rspec/fixes/rspec/mocks/space.rb +37 -0
- data/opal/opal/rspec/fixes/rspec/mocks/test_double.rb +39 -0
- data/opal/opal/rspec/fixes/rspec/mocks/verifying_double.rb +29 -0
- data/opal/opal/rspec/fixes/rspec/support.rb +4 -0
- data/opal/opal/rspec/fixes/rspec/support/encoded_string.rb +10 -0
- data/opal/opal/rspec/fixes/rspec/support/fuzzy_matcher.rb +23 -0
- data/opal/opal/rspec/fixes/rspec/support/recursive_const_methods.rb +7 -0
- data/opal/opal/rspec/fixes/rspec/support/ruby_features.rb +8 -0
- data/opal/opal/rspec/fixes/rspec/support/warnings.rb +18 -0
- data/opal/opal/rspec/formatter/browser_formatter.rb +38 -0
- data/opal/opal/rspec/formatter/document_io.rb +27 -0
- data/opal/opal/rspec/formatter/element.rb +100 -0
- data/opal/opal/rspec/formatter/html_printer.rb +121 -0
- data/opal/opal/rspec/formatter/noop_flush_string_io.rb +9 -0
- data/opal/opal/rspec/formatter/opal_closed_tty_io.rb +27 -0
- data/opal/opal/rspec/pre_require_fixes.rb +11 -0
- data/opal/opal/rspec/requires.rb +145 -0
- data/opal/opal/rspec/runner.rb +91 -0
- data/opal/opal/rspec/spec_opts.rb.erb +28 -0
- data/opal/opal/rspec/sprockets_runner.rb.erb +13 -0
- data/rspec-core/benchmarks/call_v_yield.rb +81 -0
- data/rspec-core/benchmarks/check_inclusion.rb +125 -0
- data/rspec-core/benchmarks/define_method_v_attr_reader_v_def.rb +81 -0
- data/rspec-core/benchmarks/eager_vs_lazy_metadata.rb +126 -0
- data/rspec-core/benchmarks/eager_vs_lazy_metadata/define_examples.rb +22 -0
- data/rspec-core/benchmarks/filter_object.rb +35 -0
- data/rspec-core/benchmarks/index_v_take_while.rb +47 -0
- data/rspec-core/benchmarks/map_then_flatten_vs_flat_map_benchmarks.rb +94 -0
- data/rspec-core/benchmarks/require_relative_v_require.rb +75 -0
- data/rspec-core/benchmarks/respond_to_v_defined.rb +72 -0
- data/rspec-core/benchmarks/several_regexps_v_one_big_one.rb +86 -0
- data/rspec-core/benchmarks/sort_by_v_shuffle.rb +83 -0
- data/rspec-core/benchmarks/to_proc_v_not_to_proc.rb +539 -0
- data/rspec-core/features/step_definitions/additional_cli_steps.rb +126 -0
- data/rspec-core/features/step_definitions/core_standalone_steps.rb +12 -0
- data/rspec-core/features/support/env.rb +21 -0
- data/rspec-core/features/support/require_expect_syntax_in_aruba_specs.rb +29 -0
- data/rspec-core/features/support/rubinius.rb +6 -0
- data/rspec-core/lib/rspec/autorun.rb +2 -0
- data/rspec-core/lib/rspec/core.rb +169 -0
- data/rspec-core/lib/rspec/core/backport_random.rb +336 -0
- data/rspec-core/lib/rspec/core/backtrace_formatter.rb +66 -0
- data/rspec-core/lib/rspec/core/configuration.rb +1440 -0
- data/rspec-core/lib/rspec/core/configuration_options.rb +173 -0
- data/rspec-core/lib/rspec/core/drb.rb +111 -0
- data/rspec-core/lib/rspec/core/dsl.rb +93 -0
- data/rspec-core/lib/rspec/core/example.rb +502 -0
- data/rspec-core/lib/rspec/core/example_group.rb +606 -0
- data/rspec-core/lib/rspec/core/filter_manager.rb +259 -0
- data/rspec-core/lib/rspec/core/flat_map.rb +18 -0
- data/rspec-core/lib/rspec/core/formatters.rb +240 -0
- data/rspec-core/lib/rspec/core/formatters/base_formatter.rb +67 -0
- data/rspec-core/lib/rspec/core/formatters/base_text_formatter.rb +76 -0
- data/rspec-core/lib/rspec/core/formatters/console_codes.rb +64 -0
- data/rspec-core/lib/rspec/core/formatters/deprecation_formatter.rb +222 -0
- data/rspec-core/lib/rspec/core/formatters/documentation_formatter.rb +68 -0
- data/rspec-core/lib/rspec/core/formatters/helpers.rb +87 -0
- data/rspec-core/lib/rspec/core/formatters/html_formatter.rb +149 -0
- data/rspec-core/lib/rspec/core/formatters/html_printer.rb +403 -0
- data/rspec-core/lib/rspec/core/formatters/json_formatter.rb +94 -0
- data/rspec-core/lib/rspec/core/formatters/profile_formatter.rb +65 -0
- data/rspec-core/lib/rspec/core/formatters/progress_formatter.rb +28 -0
- data/rspec-core/lib/rspec/core/formatters/protocol.rb +163 -0
- data/rspec-core/lib/rspec/core/formatters/snippet_extractor.rb +104 -0
- data/rspec-core/lib/rspec/core/hooks.rb +591 -0
- data/rspec-core/lib/rspec/core/memoized_helpers.rb +472 -0
- data/rspec-core/lib/rspec/core/metadata.rb +437 -0
- data/rspec-core/lib/rspec/core/metadata_filter.rb +95 -0
- data/rspec-core/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/flexmock.rb +31 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/mocha.rb +57 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/null.rb +14 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/rr.rb +31 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/rspec.rb +32 -0
- data/rspec-core/lib/rspec/core/notifications.rb +542 -0
- data/rspec-core/lib/rspec/core/option_parser.rb +222 -0
- data/rspec-core/lib/rspec/core/ordering.rb +155 -0
- data/rspec-core/lib/rspec/core/pending.rb +163 -0
- data/rspec-core/lib/rspec/core/project_initializer.rb +48 -0
- data/rspec-core/lib/rspec/core/project_initializer/spec/spec_helper.rb +89 -0
- data/rspec-core/lib/rspec/core/rake_task.rb +187 -0
- data/rspec-core/lib/rspec/core/reporter.rb +149 -0
- data/rspec-core/lib/rspec/core/ruby_project.rb +45 -0
- data/rspec-core/lib/rspec/core/runner.rb +158 -0
- data/rspec-core/lib/rspec/core/shared_context.rb +55 -0
- data/rspec-core/lib/rspec/core/shared_example_group.rb +182 -0
- data/rspec-core/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
- data/rspec-core/lib/rspec/core/version.rb +9 -0
- data/rspec-core/lib/rspec/core/warnings.rb +40 -0
- data/rspec-core/lib/rspec/core/world.rb +183 -0
- data/rspec-core/spec/command_line/order_spec.rb +213 -0
- data/rspec-core/spec/rspec/core/backtrace_formatter_spec.rb +306 -0
- data/rspec-core/spec/rspec/core/configuration_options_spec.rb +425 -0
- data/rspec-core/spec/rspec/core/configuration_spec.rb +1963 -0
- data/rspec-core/spec/rspec/core/drb_spec.rb +278 -0
- data/rspec-core/spec/rspec/core/dsl_spec.rb +85 -0
- data/rspec-core/spec/rspec/core/example_execution_result_spec.rb +142 -0
- data/rspec-core/spec/rspec/core/example_group_constants_spec.rb +16 -0
- data/rspec-core/spec/rspec/core/example_group_spec.rb +1621 -0
- data/rspec-core/spec/rspec/core/example_spec.rb +662 -0
- data/rspec-core/spec/rspec/core/failed_example_notification_spec.rb +25 -0
- data/rspec-core/spec/rspec/core/filter_manager_spec.rb +299 -0
- data/rspec-core/spec/rspec/core/formatters/base_text_formatter_spec.rb +182 -0
- data/rspec-core/spec/rspec/core/formatters/console_codes_spec.rb +65 -0
- data/rspec-core/spec/rspec/core/formatters/deprecation_formatter_spec.rb +225 -0
- data/rspec-core/spec/rspec/core/formatters/documentation_formatter_spec.rb +111 -0
- data/rspec-core/spec/rspec/core/formatters/helpers_spec.rb +104 -0
- data/rspec-core/spec/rspec/core/formatters/html_formatter_spec.rb +111 -0
- data/rspec-core/spec/rspec/core/formatters/json_formatter_spec.rb +183 -0
- data/rspec-core/spec/rspec/core/formatters/profile_formatter_spec.rb +99 -0
- data/rspec-core/spec/rspec/core/formatters/progress_formatter_spec.rb +55 -0
- data/rspec-core/spec/rspec/core/formatters/snippet_extractor_spec.rb +26 -0
- data/rspec-core/spec/rspec/core/formatters_spec.rb +160 -0
- data/rspec-core/spec/rspec/core/hooks_filtering_spec.rb +227 -0
- data/rspec-core/spec/rspec/core/hooks_spec.rb +447 -0
- data/rspec-core/spec/rspec/core/memoized_helpers_spec.rb +537 -0
- data/rspec-core/spec/rspec/core/metadata_filter_spec.rb +181 -0
- data/rspec-core/spec/rspec/core/metadata_spec.rb +642 -0
- data/rspec-core/spec/rspec/core/notifications_spec.rb +92 -0
- data/rspec-core/spec/rspec/core/option_parser_spec.rb +270 -0
- data/rspec-core/spec/rspec/core/ordering_spec.rb +102 -0
- data/rspec-core/spec/rspec/core/pending_example_spec.rb +221 -0
- data/rspec-core/spec/rspec/core/pending_spec.rb +8 -0
- data/rspec-core/spec/rspec/core/project_initializer_spec.rb +123 -0
- data/rspec-core/spec/rspec/core/rake_task_spec.rb +351 -0
- data/rspec-core/spec/rspec/core/random_spec.rb +47 -0
- data/rspec-core/spec/rspec/core/reporter_spec.rb +198 -0
- data/rspec-core/spec/rspec/core/resources/a_bar.rb +0 -0
- data/rspec-core/spec/rspec/core/resources/a_foo.rb +0 -0
- data/rspec-core/spec/rspec/core/resources/a_spec.rb +1 -0
- data/rspec-core/spec/rspec/core/resources/acceptance/bar.rb +0 -0
- data/rspec-core/spec/rspec/core/resources/acceptance/foo_spec.rb +0 -0
- data/rspec-core/spec/rspec/core/resources/custom_example_group_runner.rb +14 -0
- data/rspec-core/spec/rspec/core/resources/formatter_specs.rb +58 -0
- data/rspec-core/spec/rspec/core/resources/utf8_encoded.rb +9 -0
- data/rspec-core/spec/rspec/core/rspec_matchers_spec.rb +45 -0
- data/rspec-core/spec/rspec/core/ruby_project_spec.rb +26 -0
- data/rspec-core/spec/rspec/core/runner_spec.rb +309 -0
- data/rspec-core/spec/rspec/core/shared_context_spec.rb +102 -0
- data/rspec-core/spec/rspec/core/shared_example_group_spec.rb +268 -0
- data/rspec-core/spec/rspec/core/warnings_spec.rb +72 -0
- data/rspec-core/spec/rspec/core/world_spec.rb +142 -0
- data/rspec-core/spec/rspec/core_spec.rb +103 -0
- data/rspec-core/spec/spec_helper.rb +89 -0
- data/rspec-core/spec/support/config_options_helper.rb +13 -0
- data/rspec-core/spec/support/fake_minitest/minitest.rb +0 -0
- data/rspec-core/spec/support/fake_minitest/minitest/minitest_assertions.rb +4 -0
- data/rspec-core/spec/support/fake_minitest/test/unit/assertions.rb +6 -0
- data/rspec-core/spec/support/formatter_support.rb +263 -0
- data/rspec-core/spec/support/helper_methods.rb +26 -0
- data/rspec-core/spec/support/isolated_home_directory.rb +16 -0
- data/rspec-core/spec/support/matchers.rb +103 -0
- data/rspec-core/spec/support/mathn_integration_support.rb +12 -0
- data/rspec-core/spec/support/sandboxing.rb +50 -0
- data/rspec-core/spec/support/shared_example_groups.rb +43 -0
- data/rspec-core/spec/support/spec_files.rb +44 -0
- data/rspec-expectations/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +253 -0
- data/rspec-expectations/benchmarks/autoload_v_require.rb +25 -0
- data/rspec-expectations/benchmarks/cloning_matchers.rb +19 -0
- data/rspec-expectations/benchmarks/default_messages_as_methods_v_blocks.rb +27 -0
- data/rspec-expectations/benchmarks/example_spec.rb +9 -0
- data/rspec-expectations/benchmarks/include_v_superclass.rb +39 -0
- data/rspec-expectations/benchmarks/match_array/failing_with_distinct_items.rb +147 -0
- data/rspec-expectations/benchmarks/match_array/failing_with_duplicate_items.rb +122 -0
- data/rspec-expectations/benchmarks/match_array/passing_with_distinct_items.rb +154 -0
- data/rspec-expectations/benchmarks/match_array/passing_with_duplicate_items.rb +132 -0
- data/rspec-expectations/benchmarks/match_array/rubyprof/passing_with_distinct_items.rb +9 -0
- data/rspec-expectations/benchmarks/matcher_dsl_vs_classes.rb +180 -0
- data/rspec-expectations/benchmarks/method_to_proc.rb +72 -0
- data/rspec-expectations/benchmarks/set_vs_array_include.rb +68 -0
- data/rspec-expectations/features/step_definitions/additional_cli_steps.rb +22 -0
- data/rspec-expectations/features/support/disallow_certain_apis.rb +34 -0
- data/rspec-expectations/features/support/env.rb +21 -0
- data/rspec-expectations/features/support/rubinius.rb +6 -0
- data/rspec-expectations/lib/rspec/expectations.rb +68 -0
- data/rspec-expectations/lib/rspec/expectations/configuration.rb +147 -0
- data/rspec-expectations/lib/rspec/expectations/expectation_target.rb +119 -0
- data/rspec-expectations/lib/rspec/expectations/fail_with.rb +34 -0
- data/rspec-expectations/lib/rspec/expectations/handler.rb +167 -0
- data/rspec-expectations/lib/rspec/expectations/minitest_integration.rb +17 -0
- data/rspec-expectations/lib/rspec/expectations/syntax.rb +132 -0
- data/rspec-expectations/lib/rspec/expectations/version.rb +8 -0
- data/rspec-expectations/lib/rspec/matchers.rb +967 -0
- data/rspec-expectations/lib/rspec/matchers/aliased_matcher.rb +116 -0
- data/rspec-expectations/lib/rspec/matchers/built_in.rb +52 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/all.rb +85 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/base_matcher.rb +132 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be.rb +277 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be_between.rb +77 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be_instance_of.rb +22 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be_kind_of.rb +16 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be_within.rb +72 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/change.rb +337 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/compound.rb +258 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/contain_exactly.rb +249 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/cover.rb +24 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/eq.rb +75 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/eql.rb +34 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/equal.rb +81 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/exist.rb +86 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/has.rb +101 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/have_attributes.rb +84 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/include.rb +105 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/match.rb +29 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/operators.rb +119 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/output.rb +152 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/raise_error.rb +174 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/respond_to.rb +91 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/satisfy.rb +39 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/start_and_end_with.rb +82 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/throw_symbol.rb +132 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/yield.rb +420 -0
- data/rspec-expectations/lib/rspec/matchers/composable.rb +183 -0
- data/rspec-expectations/lib/rspec/matchers/dsl.rb +391 -0
- data/rspec-expectations/lib/rspec/matchers/generated_descriptions.rb +42 -0
- data/rspec-expectations/lib/rspec/matchers/matcher_delegator.rb +33 -0
- data/rspec-expectations/lib/rspec/matchers/matcher_protocol.rb +99 -0
- data/rspec-expectations/lib/rspec/matchers/pretty.rb +77 -0
- data/rspec-expectations/spec/rspec/expectations/configuration_spec.rb +226 -0
- data/rspec-expectations/spec/rspec/expectations/expectation_target_spec.rb +147 -0
- data/rspec-expectations/spec/rspec/expectations/extensions/kernel_spec.rb +69 -0
- data/rspec-expectations/spec/rspec/expectations/fail_with_spec.rb +73 -0
- data/rspec-expectations/spec/rspec/expectations/handler_spec.rb +200 -0
- data/rspec-expectations/spec/rspec/expectations/minitest_integration_spec.rb +25 -0
- data/rspec-expectations/spec/rspec/expectations/syntax_spec.rb +93 -0
- data/rspec-expectations/spec/rspec/expectations_spec.rb +15 -0
- data/rspec-expectations/spec/rspec/matchers/aliased_matcher_spec.rb +113 -0
- data/rspec-expectations/spec/rspec/matchers/aliases_spec.rb +455 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/all_spec.rb +212 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/base_matcher_spec.rb +140 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_between_spec.rb +157 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_instance_of_spec.rb +61 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_kind_of_spec.rb +39 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_spec.rb +685 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_within_spec.rb +139 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/change_spec.rb +829 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/compound_spec.rb +537 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/contain_exactly_spec.rb +556 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/cover_spec.rb +67 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/eq_spec.rb +176 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/eql_spec.rb +39 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/equal_spec.rb +130 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/exist_spec.rb +139 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/has_spec.rb +179 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/have_attributes_spec.rb +177 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/include_spec.rb +587 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/match_spec.rb +100 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/operators_spec.rb +250 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/output_spec.rb +168 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/raise_error_spec.rb +446 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/respond_to_spec.rb +290 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/satisfy_spec.rb +42 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/start_and_end_with_spec.rb +347 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/throw_symbol_spec.rb +133 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/yield_spec.rb +643 -0
- data/rspec-expectations/spec/rspec/matchers/composable_spec.rb +77 -0
- data/rspec-expectations/spec/rspec/matchers/define_negated_matcher_spec.rb +199 -0
- data/rspec-expectations/spec/rspec/matchers/description_generation_spec.rb +189 -0
- data/rspec-expectations/spec/rspec/matchers/dsl_spec.rb +1036 -0
- data/rspec-expectations/spec/rspec/matchers/legacy_spec.rb +104 -0
- data/rspec-expectations/spec/rspec/matchers_spec.rb +108 -0
- data/rspec-expectations/spec/spec_helper.rb +94 -0
- data/rspec-expectations/spec/support/matchers.rb +54 -0
- data/rspec-expectations/spec/support/shared_examples.rb +101 -0
- data/rspec-mocks/benchmarks/double_creation.rb +66 -0
- data/rspec-mocks/benchmarks/each_value_v_values_each.rb +58 -0
- data/rspec-mocks/benchmarks/find_original_method_early.rb +64 -0
- data/rspec-mocks/benchmarks/method_defined_at_any_visibility.rb +101 -0
- data/rspec-mocks/benchmarks/thread_safety.rb +24 -0
- data/rspec-mocks/benchmarks/transfer_nested_constants.rb +77 -0
- data/rspec-mocks/features/step_definitions/additional_cli_steps.rb +21 -0
- data/rspec-mocks/features/support/disallow_certain_apis.rb +24 -0
- data/rspec-mocks/features/support/env.rb +22 -0
- data/rspec-mocks/features/support/rubinius.rb +6 -0
- data/rspec-mocks/lib/rspec/mocks.rb +126 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance.rb +10 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/chain.rb +109 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/expect_chain_chain.rb +35 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/expectation_chain.rb +48 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/message_chains.rb +85 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb +116 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/recorder.rb +267 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/stub_chain_chain.rb +27 -0
- data/rspec-mocks/lib/rspec/mocks/argument_list_matcher.rb +72 -0
- data/rspec-mocks/lib/rspec/mocks/argument_matchers.rb +282 -0
- data/rspec-mocks/lib/rspec/mocks/configuration.rb +157 -0
- data/rspec-mocks/lib/rspec/mocks/error_generator.rb +253 -0
- data/rspec-mocks/lib/rspec/mocks/example_methods.rb +379 -0
- data/rspec-mocks/lib/rspec/mocks/instance_method_stasher.rb +135 -0
- data/rspec-mocks/lib/rspec/mocks/marshal_extension.rb +41 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/expectation_customization.rb +20 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/have_received.rb +121 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/receive.rb +106 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/receive_message_chain.rb +66 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/receive_messages.rb +71 -0
- data/rspec-mocks/lib/rspec/mocks/message_chain.rb +91 -0
- data/rspec-mocks/lib/rspec/mocks/message_expectation.rb +694 -0
- data/rspec-mocks/lib/rspec/mocks/method_double.rb +260 -0
- data/rspec-mocks/lib/rspec/mocks/method_reference.rb +155 -0
- data/rspec-mocks/lib/rspec/mocks/mutate_const.rb +324 -0
- data/rspec-mocks/lib/rspec/mocks/object_reference.rb +91 -0
- data/rspec-mocks/lib/rspec/mocks/order_group.rb +81 -0
- data/rspec-mocks/lib/rspec/mocks/proxy.rb +431 -0
- data/rspec-mocks/lib/rspec/mocks/space.rb +221 -0
- data/rspec-mocks/lib/rspec/mocks/standalone.rb +3 -0
- data/rspec-mocks/lib/rspec/mocks/syntax.rb +329 -0
- data/rspec-mocks/lib/rspec/mocks/targets.rb +97 -0
- data/rspec-mocks/lib/rspec/mocks/test_double.rb +135 -0
- data/rspec-mocks/lib/rspec/mocks/verifying_double.rb +127 -0
- data/rspec-mocks/lib/rspec/mocks/verifying_message_expecation.rb +62 -0
- data/rspec-mocks/lib/rspec/mocks/verifying_proxy.rb +171 -0
- data/rspec-mocks/lib/rspec/mocks/version.rb +9 -0
- data/rspec-mocks/spec/rspec/mocks/and_call_original_spec.rb +267 -0
- data/rspec-mocks/spec/rspec/mocks/and_return_spec.rb +21 -0
- data/rspec-mocks/spec/rspec/mocks/and_wrap_original_spec.rb +63 -0
- data/rspec-mocks/spec/rspec/mocks/and_yield_spec.rb +161 -0
- data/rspec-mocks/spec/rspec/mocks/any_instance/message_chains_spec.rb +39 -0
- data/rspec-mocks/spec/rspec/mocks/any_instance_spec.rb +1242 -0
- data/rspec-mocks/spec/rspec/mocks/argument_matchers_spec.rb +336 -0
- data/rspec-mocks/spec/rspec/mocks/array_including_matcher_spec.rb +39 -0
- data/rspec-mocks/spec/rspec/mocks/at_least_spec.rb +147 -0
- data/rspec-mocks/spec/rspec/mocks/at_most_spec.rb +113 -0
- data/rspec-mocks/spec/rspec/mocks/before_all_spec.rb +75 -0
- data/rspec-mocks/spec/rspec/mocks/block_return_value_spec.rb +68 -0
- data/rspec-mocks/spec/rspec/mocks/combining_implementation_instructions_spec.rb +196 -0
- data/rspec-mocks/spec/rspec/mocks/configuration_spec.rb +175 -0
- data/rspec-mocks/spec/rspec/mocks/double_spec.rb +830 -0
- data/rspec-mocks/spec/rspec/mocks/example_methods_spec.rb +11 -0
- data/rspec-mocks/spec/rspec/mocks/expiration_spec.rb +90 -0
- data/rspec-mocks/spec/rspec/mocks/hash_excluding_matcher_spec.rb +65 -0
- data/rspec-mocks/spec/rspec/mocks/hash_including_matcher_spec.rb +92 -0
- data/rspec-mocks/spec/rspec/mocks/instance_method_stasher_spec.rb +72 -0
- data/rspec-mocks/spec/rspec/mocks/marshal_extension_spec.rb +67 -0
- data/rspec-mocks/spec/rspec/mocks/matchers/have_received_spec.rb +513 -0
- data/rspec-mocks/spec/rspec/mocks/matchers/receive_message_chain_spec.rb +227 -0
- data/rspec-mocks/spec/rspec/mocks/matchers/receive_messages_spec.rb +148 -0
- data/rspec-mocks/spec/rspec/mocks/matchers/receive_spec.rb +525 -0
- data/rspec-mocks/spec/rspec/mocks/methods_spec.rb +24 -0
- data/rspec-mocks/spec/rspec/mocks/mock_expectation_error_spec.rb +20 -0
- data/rspec-mocks/spec/rspec/mocks/mock_ordering_spec.rb +112 -0
- data/rspec-mocks/spec/rspec/mocks/multiple_return_value_spec.rb +130 -0
- data/rspec-mocks/spec/rspec/mocks/mutate_const_spec.rb +561 -0
- data/rspec-mocks/spec/rspec/mocks/nil_expectation_warning_spec.rb +52 -0
- data/rspec-mocks/spec/rspec/mocks/null_object_double_spec.rb +135 -0
- data/rspec-mocks/spec/rspec/mocks/once_counts_spec.rb +50 -0
- data/rspec-mocks/spec/rspec/mocks/order_group_spec.rb +26 -0
- data/rspec-mocks/spec/rspec/mocks/partial_double_spec.rb +379 -0
- data/rspec-mocks/spec/rspec/mocks/partial_double_using_mocks_directly_spec.rb +83 -0
- data/rspec-mocks/spec/rspec/mocks/precise_counts_spec.rb +66 -0
- data/rspec-mocks/spec/rspec/mocks/serialization_spec.rb +89 -0
- data/rspec-mocks/spec/rspec/mocks/should_syntax_spec.rb +539 -0
- data/rspec-mocks/spec/rspec/mocks/space_spec.rb +242 -0
- data/rspec-mocks/spec/rspec/mocks/spy_spec.rb +127 -0
- data/rspec-mocks/spec/rspec/mocks/stash_spec.rb +43 -0
- data/rspec-mocks/spec/rspec/mocks/stub_chain_spec.rb +166 -0
- data/rspec-mocks/spec/rspec/mocks/stub_implementation_spec.rb +98 -0
- data/rspec-mocks/spec/rspec/mocks/stub_spec.rb +520 -0
- data/rspec-mocks/spec/rspec/mocks/stubbed_message_expectations_spec.rb +56 -0
- data/rspec-mocks/spec/rspec/mocks/syntax_agnostic_message_matchers_spec.rb +99 -0
- data/rspec-mocks/spec/rspec/mocks/syntax_spec.rb +7 -0
- data/rspec-mocks/spec/rspec/mocks/test_double_spec.rb +53 -0
- data/rspec-mocks/spec/rspec/mocks/thrice_counts_spec.rb +72 -0
- data/rspec-mocks/spec/rspec/mocks/to_ary_spec.rb +52 -0
- data/rspec-mocks/spec/rspec/mocks/twice_counts_spec.rb +64 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/class_double_with_class_loaded_spec.rb +118 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/class_double_with_class_not_loaded_spec.rb +58 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/construction_spec.rb +54 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb +81 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/instance_double_with_class_loaded_spec.rb +195 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/instance_double_with_class_not_loaded_spec.rb +57 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/method_visibility_spec.rb +129 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/object_double_spec.rb +68 -0
- data/rspec-mocks/spec/rspec/mocks_spec.rb +199 -0
- data/rspec-mocks/spec/spec_helper.rb +131 -0
- data/rspec-mocks/spec/support/before_all_shared_example_group.rb +16 -0
- data/rspec-mocks/spec/support/doubled_classes.rb +74 -0
- data/rspec-mocks/spec/support/matchers.rb +15 -0
- data/rspec-support/benchmarks/caller.rb +81 -0
- data/rspec-support/lib/rspec/support.rb +76 -0
- data/rspec-support/lib/rspec/support/caller_filter.rb +63 -0
- data/rspec-support/lib/rspec/support/differ.rb +214 -0
- data/rspec-support/lib/rspec/support/directory_maker.rb +61 -0
- data/rspec-support/lib/rspec/support/encoded_string.rb +69 -0
- data/rspec-support/lib/rspec/support/fuzzy_matcher.rb +48 -0
- data/rspec-support/lib/rspec/support/hunk_generator.rb +47 -0
- data/rspec-support/lib/rspec/support/matcher_definition.rb +31 -0
- data/rspec-support/lib/rspec/support/method_signature_verifier.rb +272 -0
- data/rspec-support/lib/rspec/support/os.rb +18 -0
- data/rspec-support/lib/rspec/support/recursive_const_methods.rb +76 -0
- data/rspec-support/lib/rspec/support/ruby_features.rb +45 -0
- data/rspec-support/lib/rspec/support/spec.rb +72 -0
- data/rspec-support/lib/rspec/support/spec/deprecation_helpers.rb +60 -0
- data/rspec-support/lib/rspec/support/spec/formatting_support.rb +9 -0
- data/rspec-support/lib/rspec/support/spec/in_sub_process.rb +43 -0
- data/rspec-support/lib/rspec/support/spec/prevent_load_time_warnings.rb +44 -0
- data/rspec-support/lib/rspec/support/spec/shell_out.rb +69 -0
- data/rspec-support/lib/rspec/support/spec/stderr_splitter.rb +52 -0
- data/rspec-support/lib/rspec/support/spec/with_isolated_directory.rb +9 -0
- data/rspec-support/lib/rspec/support/spec/with_isolated_stderr.rb +13 -0
- data/rspec-support/lib/rspec/support/version.rb +7 -0
- data/rspec-support/lib/rspec/support/version_checker.rb +53 -0
- data/rspec-support/lib/rspec/support/warnings.rb +39 -0
- data/rspec-support/spec/rspec/support/caller_filter_spec.rb +66 -0
- data/rspec-support/spec/rspec/support/differ_spec.rb +322 -0
- data/rspec-support/spec/rspec/support/directory_maker_spec.rb +58 -0
- data/rspec-support/spec/rspec/support/encoded_string_spec.rb +86 -0
- data/rspec-support/spec/rspec/support/fuzzy_matcher_spec.rb +179 -0
- data/rspec-support/spec/rspec/support/method_signature_verifier_spec.rb +357 -0
- data/rspec-support/spec/rspec/support/os_spec.rb +36 -0
- data/rspec-support/spec/rspec/support/recursive_const_methods_spec.rb +49 -0
- data/rspec-support/spec/rspec/support/spec/in_sub_process_spec.rb +36 -0
- data/rspec-support/spec/rspec/support/spec/prevent_load_time_warnings_spec.rb +10 -0
- data/rspec-support/spec/rspec/support/spec/shell_out_spec.rb +44 -0
- data/rspec-support/spec/rspec/support/spec/stderr_splitter_spec.rb +60 -0
- data/rspec-support/spec/rspec/support/spec/with_isolated_std_err_spec.rb +21 -0
- data/rspec-support/spec/rspec/support/version_checker_spec.rb +29 -0
- data/rspec-support/spec/rspec/support/warnings_spec.rb +66 -0
- data/rspec-support/spec/rspec/support_spec.rb +119 -0
- data/rspec-support/spec/spec_helper.rb +2 -0
- data/rspec/lib/rspec.rb +3 -0
- data/rspec/lib/rspec/version.rb +5 -0
- data/spec/mri/integration/browser_spec.rb +31 -0
- data/spec/mri/integration/rack/sprockets_runner_js_errors.rb.erb +20 -0
- data/spec/mri/integration/spec_opts_spec.rb +81 -0
- data/spec/mri/unit/opal/rspec/browser_formatter_spec.rb +35 -0
- data/spec/mri/unit/opal/rspec/cached_environment_spec.rb +85 -0
- data/spec/mri/unit/opal/rspec/opal/browser_formatter_spec.rb +14 -0
- data/spec/mri/unit/opal/rspec/rack/config.ru +12 -0
- data/spec/mri/unit/opal/rspec/rake_task_spec.rb +261 -0
- data/spec/mri/unit/opal/rspec/sprockets_environment_spec.rb +55 -0
- data/spec/mri/unit/opal/rspec/temp_dir_helper.rb +19 -0
- data/spec/opal/after_hooks_spec.rb +140 -0
- data/spec/opal/around_hooks_spec.rb +164 -0
- data/spec/opal/async_spec.rb +184 -0
- data/spec/opal/before_hooks_spec.rb +183 -0
- data/spec/opal/example_spec.rb +174 -0
- data/spec/opal/expected_failures.txt +40 -0
- data/spec/opal/matchers_spec.rb +205 -0
- data/spec/opal/mock_spec.rb +63 -0
- data/spec/opal/should_syntax_spec.rb +17 -0
- data/spec/opal/skip_pending_spec.rb +43 -0
- data/spec/opal/subject_spec.rb +87 -0
- data/spec/other/color_on_by_default_spec.rb +9 -0
- data/spec/other/dummy_spec.rb +5 -0
- data/spec/other/formatter_dependency.rb +3 -0
- data/spec/other/ignored_spec.opal +5 -0
- data/spec/other/test_formatter.rb +9 -0
- data/spec/rspec/core/config.rb +5 -0
- data/spec/rspec/core/config.ru +4 -0
- data/spec/rspec/core/core_spec_loader.rb +46 -0
- data/spec/rspec/core/filter/core/async/example_group.txt +13 -0
- data/spec/rspec/core/filter/core/async/hooks.rb +12 -0
- data/spec/rspec/core/filter/core/async/memoized_helpers.txt +3 -0
- data/spec/rspec/core/filter/core/async/metadata.txt +2 -0
- data/spec/rspec/core/filter/core/bugs/filter_manager.txt +4 -0
- data/spec/rspec/core/filter/core/bugs/formatters.txt +4 -0
- data/spec/rspec/core/filter/core/bugs/memoized_helpers.rb +11 -0
- data/spec/rspec/core/filter/core/bugs/metadata.txt +5 -0
- data/spec/rspec/core/filter/core/bugs/sandbox/subject_issue_test.rb +328 -0
- data/spec/rspec/core/filter/core/bugs/warnings_deprecations.txt +3 -0
- data/spec/rspec/core/filter/core/unsupported/core.txt +5 -0
- data/spec/rspec/core/filter/core/unsupported/example.txt +7 -0
- data/spec/rspec/core/filter/core/unsupported/example_group.txt +13 -0
- data/spec/rspec/core/filter/core/unsupported/filter_manager.txt +7 -0
- data/spec/rspec/core/filter/core/unsupported/formatters.txt +27 -0
- data/spec/rspec/core/filter/core/unsupported/hooks.txt +2 -0
- data/spec/rspec/core/filter/core/unsupported/memoized_helpers.txt +6 -0
- data/spec/rspec/core/filter/core/unsupported/metadata.txt +14 -0
- data/spec/rspec/core/filter/core/unsupported/metadata_filter.txt +2 -0
- data/spec/rspec/core/filter/core/unsupported/notifications.txt +8 -0
- data/spec/rspec/core/filter/core/unsupported/world.txt +3 -0
- data/spec/rspec/core/fixes/missing_constants.rb +20 -0
- data/spec/rspec/core/fixes/opal_itself.rb +38 -0
- data/spec/rspec/core/fixes/shared_examples.rb +3 -0
- data/spec/rspec/core/opal_alternates/rspec/core/example_group_spec.rb +145 -0
- data/spec/rspec/core/opal_alternates/rspec/core/failed_example_notification_spec.rb +31 -0
- data/spec/rspec/core/opal_alternates/rspec/core/hooks_spec.rb +113 -0
- data/spec/rspec/core/opal_alternates/rspec/core/memoized_helpers_spec.rb +36 -0
- data/spec/rspec/core/opal_alternates/rspec/core/metadata_spec.rb +48 -0
- data/spec/rspec/core/require_specs.rb +25 -0
- data/spec/rspec/core/sandboxing.rb +72 -0
- data/spec/rspec/core/spec_files_exclude.txt +41 -0
- data/spec/rspec/expectations/config.rb +16 -0
- data/spec/rspec/expectations/config.ru +4 -0
- data/spec/rspec/expectations/expectation_spec_loader.rb +110 -0
- data/spec/rspec/expectations/filter/bugs/aliased_matcher.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/aliases.rb +13 -0
- data/spec/rspec/expectations/filter/bugs/base_matcher.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/be.rb +4 -0
- data/spec/rspec/expectations/filter/bugs/be_instance_of.rb +7 -0
- data/spec/rspec/expectations/filter/bugs/be_spec.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/configuration.txt +8 -0
- data/spec/rspec/expectations/filter/bugs/contain_exactly.rb +13 -0
- data/spec/rspec/expectations/filter/bugs/define_negated_matcher.rb +9 -0
- data/spec/rspec/expectations/filter/bugs/description_generation.rb +4 -0
- data/spec/rspec/expectations/filter/bugs/dsl.txt +14 -0
- data/spec/rspec/expectations/filter/bugs/equal.txt +3 -0
- data/spec/rspec/expectations/filter/bugs/expectation_target.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/expectations.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/have_attributes.rb +8 -0
- data/spec/rspec/expectations/filter/bugs/include.rb +4 -0
- data/spec/rspec/expectations/filter/bugs/operators.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/raise_error.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/respond_to.rb +13 -0
- data/spec/rspec/expectations/filter/bugs/sandbox/undef.rb +20 -0
- data/spec/rspec/expectations/filter/unsupported/aliases.txt +5 -0
- data/spec/rspec/expectations/filter/unsupported/be.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/be_instance_of.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/change.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/configuration.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/contain_exactly.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/description_generation.txt +6 -0
- data/spec/rspec/expectations/filter/unsupported/dsl.txt +8 -0
- data/spec/rspec/expectations/filter/unsupported/eq.txt +10 -0
- data/spec/rspec/expectations/filter/unsupported/equal.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/expectation_target.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/expectations.txt +8 -0
- data/spec/rspec/expectations/filter/unsupported/has.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/include.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/match.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/matchers.txt +11 -0
- data/spec/rspec/expectations/filter/unsupported/output.txt +14 -0
- data/spec/rspec/expectations/filter/unsupported/raise_error.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/respond_to.rb +5 -0
- data/spec/rspec/expectations/filter/unsupported/syntax.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/yield.txt +2 -0
- data/spec/rspec/expectations/fixes/example_patches.rb +32 -0
- data/spec/rspec/expectations/fixes/missing_constants.rb +12 -0
- data/spec/rspec/expectations/fixes/not_compatible.rb +6 -0
- data/spec/rspec/expectations/fixes/opal_itself.rb +140 -0
- data/spec/rspec/expectations/opal_alternates/be_instance_of_spec.rb +11 -0
- data/spec/rspec/expectations/opal_alternates/dsl_spec.rb +66 -0
- data/spec/rspec/expectations/opal_alternates/expectation_target_spec.rb +21 -0
- data/spec/rspec/expectations/opal_alternates/yield_spec.rb +11 -0
- data/spec/rspec/expectations/require_specs.rb +16 -0
- data/spec/rspec/expectations/shared_examples.rb +47 -0
- data/spec/rspec/expectations/spec_files_exclude.txt +2 -0
- data/spec/rspec/expectations/spec_helper_opal.rb +13 -0
- data/spec/rspec/filter_processor.rb +77 -0
- data/spec/rspec/mocks/config.ru +4 -0
- data/spec/rspec/mocks/filter/bugs/and_call_original.txt +9 -0
- data/spec/rspec/mocks/filter/bugs/and_wrap_original.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/any_instance.rb +24 -0
- data/spec/rspec/mocks/filter/bugs/argument_matchers.rb +3 -0
- data/spec/rspec/mocks/filter/bugs/configuration.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/double.txt +3 -0
- data/spec/rspec/mocks/filter/bugs/expiration.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/instance_method_stasher.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/methods.rb +5 -0
- data/spec/rspec/mocks/filter/bugs/mocks.txt +6 -0
- data/spec/rspec/mocks/filter/bugs/mutate_const.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/partial_double.rb +8 -0
- data/spec/rspec/mocks/filter/bugs/receive.txt +5 -0
- data/spec/rspec/mocks/filter/bugs/should_syntax.txt +5 -0
- data/spec/rspec/mocks/filter/bugs/space.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/spy.txt +5 -0
- data/spec/rspec/mocks/filter/bugs/stub_implementation.rb +9 -0
- data/spec/rspec/mocks/filter/unsupported/and_call_original.txt +5 -0
- data/spec/rspec/mocks/filter/unsupported/and_return.txt +2 -0
- data/spec/rspec/mocks/filter/unsupported/any_instance.rb +6 -0
- data/spec/rspec/mocks/filter/unsupported/argument_matchers.rb +10 -0
- data/spec/rspec/mocks/filter/unsupported/combining_implementation_instructions.rb +9 -0
- data/spec/rspec/mocks/filter/unsupported/double.rb +16 -0
- data/spec/rspec/mocks/filter/unsupported/expected_arg_verification.txt +2 -0
- data/spec/rspec/mocks/filter/unsupported/have_received.txt +2 -0
- data/spec/rspec/mocks/filter/unsupported/instance_double_with_class_loaded.txt +8 -0
- data/spec/rspec/mocks/filter/unsupported/mocks.rb +8 -0
- data/spec/rspec/mocks/filter/unsupported/nil_expectation_warning.rb +8 -0
- data/spec/rspec/mocks/filter/unsupported/partial_double.rb +6 -0
- data/spec/rspec/mocks/filter/unsupported/receive.txt +13 -0
- data/spec/rspec/mocks/filter/unsupported/receive_message_chain.rb +4 -0
- data/spec/rspec/mocks/filter/unsupported/receive_messages.txt +2 -0
- data/spec/rspec/mocks/filter/unsupported/should_syntax.txt +1 -0
- data/spec/rspec/mocks/filter/unsupported/space.rb +7 -0
- data/spec/rspec/mocks/filter/unsupported/stub.rb +7 -0
- data/spec/rspec/mocks/fixes/doubled_classes.rb +76 -0
- data/spec/rspec/mocks/fixes/missing_constants.rb +3 -0
- data/spec/rspec/mocks/fixes/opal_itself.rb +59 -0
- data/spec/rspec/mocks/mocks_spec_loader.rb +91 -0
- data/spec/rspec/mocks/require_specs.rb +15 -0
- data/spec/rspec/mocks/spec_files_exclude.txt +11 -0
- data/spec/rspec/mocks/spec_helper_opal.rb +129 -0
- data/spec/rspec/opal_rspec_spec_loader.rb +359 -0
- data/spec/rspec/shared/opal/fixes/deprecation_helpers.rb +31 -0
- data/spec/rspec/shared/opal/fixes/rspec_helpers.rb +6 -0
- data/spec/rspec/shared/opal/progress_json_formatter.rb +29 -0
- data/spec/rspec/support/config.rb +5 -0
- data/spec/rspec/support/config.ru +4 -0
- data/spec/rspec/support/filter/bugs/recursive_const_methods.txt +3 -0
- data/spec/rspec/support/filter/bugs/sandbox/basic_object.rb +30 -0
- data/spec/rspec/support/filter/bugs/stderr_splitter_spec.txt +2 -0
- data/spec/rspec/support/filter/bugs/support.txt +2 -0
- data/spec/rspec/support/filter/unsupported/fuzzy_matcher.txt +2 -0
- data/spec/rspec/support/filter/unsupported/support.rb +7 -0
- data/spec/rspec/support/filter/unsupported/warnings.txt +6 -0
- data/spec/rspec/support/fixes/missing_constants.rb +3 -0
- data/spec/rspec/support/fixes/opal_itself.rb +13 -0
- data/spec/rspec/support/require_specs.rb +15 -0
- data/spec/rspec/support/spec_files_exclude.txt +26 -0
- data/spec/rspec/support/spec_helper.rb +27 -0
- data/spec/rspec/support/support_spec_loader.rb +38 -0
- data/util/create_requires.rb +49 -0
- data/vendor/spec_runner.js +64 -0
- metadata +774 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Mocks
|
|
3
|
+
# @private
|
|
4
|
+
class MethodDouble
|
|
5
|
+
# @private
|
|
6
|
+
attr_reader :method_name, :object, :expectations, :stubs
|
|
7
|
+
|
|
8
|
+
# @private
|
|
9
|
+
def initialize(object, method_name, proxy)
|
|
10
|
+
@method_name = method_name
|
|
11
|
+
@object = object
|
|
12
|
+
@proxy = proxy
|
|
13
|
+
|
|
14
|
+
@original_visibility = nil
|
|
15
|
+
@method_stasher = InstanceMethodStasher.new(object, method_name)
|
|
16
|
+
@method_is_proxied = false
|
|
17
|
+
@expectations = []
|
|
18
|
+
@stubs = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def original_method
|
|
22
|
+
# If original method is not present, uses the `method_missing`
|
|
23
|
+
# handler of the object. This accounts for cases where the user has not
|
|
24
|
+
# correctly defined `respond_to?`, and also 1.8 which does not provide
|
|
25
|
+
# method handles for missing methods even if `respond_to?` is correct.
|
|
26
|
+
@original_method ||=
|
|
27
|
+
@method_stasher.original_method ||
|
|
28
|
+
@proxy.original_method_handle_for(method_name) ||
|
|
29
|
+
Proc.new do |*args, &block|
|
|
30
|
+
@object.__send__(:method_missing, @method_name, *args, &block)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
alias_method :save_original_method!, :original_method
|
|
35
|
+
|
|
36
|
+
# @private
|
|
37
|
+
def visibility
|
|
38
|
+
@proxy.visibility_for(@method_name)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @private
|
|
42
|
+
def object_singleton_class
|
|
43
|
+
class << @object; self; end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @private
|
|
47
|
+
def configure_method
|
|
48
|
+
@original_visibility = [visibility, method_name]
|
|
49
|
+
@method_stasher.stash unless @method_is_proxied
|
|
50
|
+
define_proxy_method
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @private
|
|
54
|
+
def define_proxy_method
|
|
55
|
+
return if @method_is_proxied
|
|
56
|
+
|
|
57
|
+
save_original_method!
|
|
58
|
+
definition_target.class_exec(self, method_name, visibility) do |method_double, method_name, visibility|
|
|
59
|
+
define_method(method_name) do |*args, &block|
|
|
60
|
+
method_double.proxy_method_invoked(self, *args, &block)
|
|
61
|
+
end
|
|
62
|
+
__send__(visibility, method_name)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
@method_is_proxied = true
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# The implementation of the proxied method. Subclasses may override this
|
|
69
|
+
# method to perform additional operations.
|
|
70
|
+
#
|
|
71
|
+
# @private
|
|
72
|
+
def proxy_method_invoked(_obj, *args, &block)
|
|
73
|
+
@proxy.message_received method_name, *args, &block
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# @private
|
|
77
|
+
def restore_original_method
|
|
78
|
+
return show_frozen_warning if object_singleton_class.frozen?
|
|
79
|
+
return unless @method_is_proxied
|
|
80
|
+
|
|
81
|
+
definition_target.__send__(:remove_method, @method_name)
|
|
82
|
+
|
|
83
|
+
@method_stasher.restore if @method_stasher.method_is_stashed?
|
|
84
|
+
restore_original_visibility
|
|
85
|
+
|
|
86
|
+
@method_is_proxied = false
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @private
|
|
90
|
+
def show_frozen_warning
|
|
91
|
+
RSpec.warn_with(
|
|
92
|
+
"WARNING: rspec-mocks was unable to restore the original `#{@method_name}` " \
|
|
93
|
+
"method on #{@object.inspect} because it has been frozen. If you reuse this " \
|
|
94
|
+
"object, `#{@method_name}` will continue to respond with its stub implementation.",
|
|
95
|
+
:call_site => nil,
|
|
96
|
+
:use_spec_location_as_call_site => true
|
|
97
|
+
)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# @private
|
|
101
|
+
def restore_original_visibility
|
|
102
|
+
return unless @original_visibility &&
|
|
103
|
+
MethodReference.method_defined_at_any_visibility?(object_singleton_class, @method_name)
|
|
104
|
+
|
|
105
|
+
object_singleton_class.__send__(*@original_visibility)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# @private
|
|
109
|
+
def verify
|
|
110
|
+
expectations.each { |e| e.verify_messages_received }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# @private
|
|
114
|
+
def reset
|
|
115
|
+
restore_original_method
|
|
116
|
+
clear
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# @private
|
|
120
|
+
def clear
|
|
121
|
+
expectations.clear
|
|
122
|
+
stubs.clear
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# The type of message expectation to create has been extracted to its own
|
|
126
|
+
# method so that subclasses can override it.
|
|
127
|
+
#
|
|
128
|
+
# @private
|
|
129
|
+
def message_expectation_class
|
|
130
|
+
MessageExpectation
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# @private
|
|
134
|
+
def add_expectation(error_generator, expectation_ordering, expected_from, opts, &implementation)
|
|
135
|
+
configure_method
|
|
136
|
+
expectation = message_expectation_class.new(error_generator, expectation_ordering,
|
|
137
|
+
expected_from, self, :expectation, opts, &implementation)
|
|
138
|
+
expectations << expectation
|
|
139
|
+
expectation
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# @private
|
|
143
|
+
def build_expectation(error_generator, expectation_ordering)
|
|
144
|
+
expected_from = IGNORED_BACKTRACE_LINE
|
|
145
|
+
message_expectation_class.new(error_generator, expectation_ordering, expected_from, self)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# @private
|
|
149
|
+
def add_stub(error_generator, expectation_ordering, expected_from, opts={}, &implementation)
|
|
150
|
+
configure_method
|
|
151
|
+
stub = message_expectation_class.new(error_generator, expectation_ordering, expected_from,
|
|
152
|
+
self, :stub, opts, &implementation)
|
|
153
|
+
stubs.unshift stub
|
|
154
|
+
stub
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# A simple stub can only return a concrete value for a message, and
|
|
158
|
+
# cannot match on arguments. It is used as an optimization over
|
|
159
|
+
# `add_stub` / `add_expectation` where it is known in advance that this
|
|
160
|
+
# is all that will be required of a stub, such as when passing attributes
|
|
161
|
+
# to the `double` example method. They do not stash or restore existing method
|
|
162
|
+
# definitions.
|
|
163
|
+
#
|
|
164
|
+
# @private
|
|
165
|
+
def add_simple_stub(method_name, response)
|
|
166
|
+
setup_simple_method_double method_name, response, stubs
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# @private
|
|
170
|
+
def add_simple_expectation(method_name, response, error_generator, backtrace_line)
|
|
171
|
+
setup_simple_method_double method_name, response, expectations, error_generator, backtrace_line
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# @private
|
|
175
|
+
def setup_simple_method_double(method_name, response, collection, error_generator=nil, backtrace_line=nil)
|
|
176
|
+
define_proxy_method
|
|
177
|
+
|
|
178
|
+
me = SimpleMessageExpectation.new(method_name, response, error_generator, backtrace_line)
|
|
179
|
+
collection.unshift me
|
|
180
|
+
me
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# @private
|
|
184
|
+
def add_default_stub(*args, &implementation)
|
|
185
|
+
return if stubs.any?
|
|
186
|
+
add_stub(*args, &implementation)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# @private
|
|
190
|
+
def remove_stub
|
|
191
|
+
raise_method_not_stubbed_error if stubs.empty?
|
|
192
|
+
remove_stub_if_present
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# @private
|
|
196
|
+
def remove_stub_if_present
|
|
197
|
+
expectations.empty? ? reset : stubs.clear
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# @private
|
|
201
|
+
def raise_method_not_stubbed_error
|
|
202
|
+
raise MockExpectationError, "The method `#{method_name}` was not stubbed or was already unstubbed"
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# In Ruby 2.0.0 and above prepend will alter the method lookup chain.
|
|
206
|
+
# We use an object's singleton class to define method doubles upon,
|
|
207
|
+
# however if the object has had it's singleton class (as opposed to
|
|
208
|
+
# it's actual class) prepended too then the the method lookup chain
|
|
209
|
+
# will look in the prepended module first, **before** the singleton
|
|
210
|
+
# class.
|
|
211
|
+
#
|
|
212
|
+
# This code works around that by providing a mock definition target
|
|
213
|
+
# that is either the singleton class, or if necessary, a prepended module
|
|
214
|
+
# of our own.
|
|
215
|
+
#
|
|
216
|
+
if Support::RubyFeatures.module_prepends_supported?
|
|
217
|
+
|
|
218
|
+
private
|
|
219
|
+
|
|
220
|
+
# We subclass `Module` in order to be able to easily detect our prepended module.
|
|
221
|
+
RSpecPrependedModule = Class.new(Module)
|
|
222
|
+
|
|
223
|
+
def definition_target
|
|
224
|
+
@definition_target ||= usable_rspec_prepended_module || object_singleton_class
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def usable_rspec_prepended_module
|
|
228
|
+
@proxy.prepended_modules_of_singleton_class.each do |mod|
|
|
229
|
+
# If we have one of our modules prepended before one of the user's
|
|
230
|
+
# modules that defines the method, use that, since our module's
|
|
231
|
+
# definition will take precedence.
|
|
232
|
+
return mod if RSpecPrependedModule === mod
|
|
233
|
+
|
|
234
|
+
# If we hit a user module with the method defined first,
|
|
235
|
+
# we must create a new prepend module, even if one exists later,
|
|
236
|
+
# because ours will only take precedence if it comes first.
|
|
237
|
+
return new_rspec_prepended_module if mod.method_defined?(method_name)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
nil
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def new_rspec_prepended_module
|
|
244
|
+
RSpecPrependedModule.new.tap do |mod|
|
|
245
|
+
object_singleton_class.__send__ :prepend, mod
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
else
|
|
250
|
+
|
|
251
|
+
private
|
|
252
|
+
|
|
253
|
+
def definition_target
|
|
254
|
+
object_singleton_class
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Mocks
|
|
3
|
+
# Represents a method on an object that may or may not be defined.
|
|
4
|
+
# The method may be an instance method on a module or a method on
|
|
5
|
+
# any object.
|
|
6
|
+
#
|
|
7
|
+
# @private
|
|
8
|
+
class MethodReference
|
|
9
|
+
def initialize(object_reference, method_name)
|
|
10
|
+
@object_reference = object_reference
|
|
11
|
+
@method_name = method_name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# A method is implemented if sending the message does not result in
|
|
15
|
+
# a `NoMethodError`. It might be dynamically implemented by
|
|
16
|
+
# `method_missing`.
|
|
17
|
+
def implemented?
|
|
18
|
+
@object_reference.when_loaded do |m|
|
|
19
|
+
method_implemented?(m)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Returns true if we definitively know that sending the method
|
|
24
|
+
# will result in a `NoMethodError`.
|
|
25
|
+
#
|
|
26
|
+
# This is not simply the inverse of `implemented?`: there are
|
|
27
|
+
# cases when we don't know if a method is implemented and
|
|
28
|
+
# both `implemented?` and `unimplemented?` will return false.
|
|
29
|
+
def unimplemented?
|
|
30
|
+
@object_reference.when_loaded do |_m|
|
|
31
|
+
return !implemented?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# If it's not loaded, then it may be implemented but we can't check.
|
|
35
|
+
false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# A method is defined if we are able to get a `Method` object for it.
|
|
39
|
+
# In that case, we can assert against metadata like the arity.
|
|
40
|
+
def defined?
|
|
41
|
+
@object_reference.when_loaded do |m|
|
|
42
|
+
method_defined?(m)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def with_signature
|
|
47
|
+
return unless (original = original_method)
|
|
48
|
+
yield Support::MethodSignature.new(original)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def visibility
|
|
52
|
+
@object_reference.when_loaded do |m|
|
|
53
|
+
return visibility_from(m)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# When it's not loaded, assume it's public. We don't want to
|
|
57
|
+
# wrongly treat the method as private.
|
|
58
|
+
:public
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def original_method
|
|
64
|
+
@object_reference.when_loaded do |m|
|
|
65
|
+
self.defined? && find_method(m)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.instance_method_visibility_for(klass, method_name)
|
|
70
|
+
if klass.public_method_defined?(method_name)
|
|
71
|
+
:public
|
|
72
|
+
elsif klass.private_method_defined?(method_name)
|
|
73
|
+
:private
|
|
74
|
+
elsif klass.protected_method_defined?(method_name)
|
|
75
|
+
:protected
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
class << self
|
|
80
|
+
alias method_defined_at_any_visibility? instance_method_visibility_for
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def self.method_visibility_for(object, method_name)
|
|
84
|
+
instance_method_visibility_for(class << object; self; end, method_name).tap do |vis|
|
|
85
|
+
# If the method is not defined on the class, `instance_method_visibility_for`
|
|
86
|
+
# returns `nil`. However, it may be handled dynamically by `method_missing`,
|
|
87
|
+
# so here we check `respond_to` (passing false to not check private methods).
|
|
88
|
+
#
|
|
89
|
+
# This only considers the public case, but I don't think it's possible to
|
|
90
|
+
# write `method_missing` in such a way that it handles a dynamic message
|
|
91
|
+
# with private or protected visibility. Ruby doesn't provide you with
|
|
92
|
+
# the caller info.
|
|
93
|
+
return :public if vis.nil? && object.respond_to?(method_name, false)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# @private
|
|
99
|
+
class InstanceMethodReference < MethodReference
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
def method_implemented?(mod)
|
|
103
|
+
MethodReference.method_defined_at_any_visibility?(mod, @method_name)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Ideally, we'd use `respond_to?` for `method_implemented?` but we need a
|
|
107
|
+
# reference to an instance to do that and we don't have one. Note that
|
|
108
|
+
# we may get false negatives: if the method is implemented via
|
|
109
|
+
# `method_missing`, we'll return `false` even though it meets our
|
|
110
|
+
# definition of "implemented". However, it's the best we can do.
|
|
111
|
+
alias method_defined? method_implemented?
|
|
112
|
+
|
|
113
|
+
# works around the fact that repeated calls for method parameters will
|
|
114
|
+
# falsely return empty arrays on JRuby in certain circumstances, this
|
|
115
|
+
# is necessary here because we can't dup/clone UnboundMethods.
|
|
116
|
+
#
|
|
117
|
+
# This is necessary due to a bug in JRuby prior to 1.7.5 fixed in:
|
|
118
|
+
# https://github.com/jruby/jruby/commit/99a0613fe29935150d76a9a1ee4cf2b4f63f4a27
|
|
119
|
+
if RUBY_PLATFORM == 'java' && JRUBY_VERSION.split('.')[-1].to_i < 5
|
|
120
|
+
def find_method(mod)
|
|
121
|
+
mod.dup.instance_method(@method_name)
|
|
122
|
+
end
|
|
123
|
+
else
|
|
124
|
+
def find_method(mod)
|
|
125
|
+
mod.instance_method(@method_name)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def visibility_from(mod)
|
|
130
|
+
MethodReference.instance_method_visibility_for(mod, @method_name)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# @private
|
|
135
|
+
class ObjectMethodReference < MethodReference
|
|
136
|
+
private
|
|
137
|
+
|
|
138
|
+
def method_implemented?(object)
|
|
139
|
+
object.respond_to?(@method_name, true)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def method_defined?(object)
|
|
143
|
+
(class << object; self; end).method_defined?(@method_name)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def find_method(object)
|
|
147
|
+
object.method(@method_name)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def visibility_from(object)
|
|
151
|
+
MethodReference.method_visibility_for(object, @method_name)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
RSpec::Support.require_rspec_support 'recursive_const_methods'
|
|
2
|
+
|
|
3
|
+
module RSpec
|
|
4
|
+
module Mocks
|
|
5
|
+
# Provides information about constants that may (or may not)
|
|
6
|
+
# have been mutated by rspec-mocks.
|
|
7
|
+
class Constant
|
|
8
|
+
extend Support::RecursiveConstMethods
|
|
9
|
+
|
|
10
|
+
# @api private
|
|
11
|
+
def initialize(name)
|
|
12
|
+
@name = name
|
|
13
|
+
@previously_defined = false
|
|
14
|
+
@stubbed = false
|
|
15
|
+
@hidden = false
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @return [String] The fully qualified name of the constant.
|
|
19
|
+
attr_reader :name
|
|
20
|
+
|
|
21
|
+
# @return [Object, nil] The original value (e.g. before it
|
|
22
|
+
# was mutated by rspec-mocks) of the constant, or
|
|
23
|
+
# nil if the constant was not previously defined.
|
|
24
|
+
attr_accessor :original_value
|
|
25
|
+
|
|
26
|
+
# @private
|
|
27
|
+
attr_writer :previously_defined, :stubbed, :hidden
|
|
28
|
+
|
|
29
|
+
# @return [Boolean] Whether or not the constant was defined
|
|
30
|
+
# before the current example.
|
|
31
|
+
def previously_defined?
|
|
32
|
+
@previously_defined
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [Boolean] Whether or not rspec-mocks has mutated
|
|
36
|
+
# (stubbed or hidden) this constant.
|
|
37
|
+
def mutated?
|
|
38
|
+
@stubbed || @hidden
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @return [Boolean] Whether or not rspec-mocks has stubbed
|
|
42
|
+
# this constant.
|
|
43
|
+
def stubbed?
|
|
44
|
+
@stubbed
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @return [Boolean] Whether or not rspec-mocks has hidden
|
|
48
|
+
# this constant.
|
|
49
|
+
def hidden?
|
|
50
|
+
@hidden
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# The default `to_s` isn't very useful, so a custom version is provided.
|
|
54
|
+
def to_s
|
|
55
|
+
"#<#{self.class.name} #{name}>"
|
|
56
|
+
end
|
|
57
|
+
alias inspect to_s
|
|
58
|
+
|
|
59
|
+
# @private
|
|
60
|
+
def self.unmutated(name)
|
|
61
|
+
const = new(name)
|
|
62
|
+
const.previously_defined = recursive_const_defined?(name)
|
|
63
|
+
const.stubbed = false
|
|
64
|
+
const.hidden = false
|
|
65
|
+
const.original_value = recursive_const_get(name) if const.previously_defined?
|
|
66
|
+
|
|
67
|
+
const
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Queries rspec-mocks to find out information about the named constant.
|
|
71
|
+
#
|
|
72
|
+
# @param [String] name the name of the constant
|
|
73
|
+
# @return [Constant] an object contaning information about the named
|
|
74
|
+
# constant.
|
|
75
|
+
def self.original(name)
|
|
76
|
+
mutator = ::RSpec::Mocks.space.constant_mutator_for(name)
|
|
77
|
+
mutator ? mutator.to_constant : unmutated(name)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Provides a means to stub constants.
|
|
82
|
+
class ConstantMutator
|
|
83
|
+
extend Support::RecursiveConstMethods
|
|
84
|
+
|
|
85
|
+
# Stubs a constant.
|
|
86
|
+
#
|
|
87
|
+
# @param (see ExampleMethods#stub_const)
|
|
88
|
+
# @option (see ExampleMethods#stub_const)
|
|
89
|
+
# @return (see ExampleMethods#stub_const)
|
|
90
|
+
#
|
|
91
|
+
# @see ExampleMethods#stub_const
|
|
92
|
+
# @note It's recommended that you use `stub_const` in your
|
|
93
|
+
# examples. This is an alternate public API that is provided
|
|
94
|
+
# so you can stub constants in other contexts (e.g. helper
|
|
95
|
+
# classes).
|
|
96
|
+
def self.stub(constant_name, value, options={})
|
|
97
|
+
mutator = if recursive_const_defined?(constant_name, &raise_on_invalid_const)
|
|
98
|
+
DefinedConstantReplacer
|
|
99
|
+
else
|
|
100
|
+
UndefinedConstantSetter
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
mutate(mutator.new(constant_name, value, options[:transfer_nested_constants]))
|
|
104
|
+
value
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Hides a constant.
|
|
108
|
+
#
|
|
109
|
+
# @param (see ExampleMethods#hide_const)
|
|
110
|
+
#
|
|
111
|
+
# @see ExampleMethods#hide_const
|
|
112
|
+
# @note It's recommended that you use `hide_const` in your
|
|
113
|
+
# examples. This is an alternate public API that is provided
|
|
114
|
+
# so you can hide constants in other contexts (e.g. helper
|
|
115
|
+
# classes).
|
|
116
|
+
def self.hide(constant_name)
|
|
117
|
+
mutate(ConstantHider.new(constant_name, nil, {}))
|
|
118
|
+
nil
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Contains common functionality used by all of the constant mutators.
|
|
122
|
+
#
|
|
123
|
+
# @private
|
|
124
|
+
class BaseMutator
|
|
125
|
+
include Support::RecursiveConstMethods
|
|
126
|
+
|
|
127
|
+
attr_reader :original_value, :full_constant_name
|
|
128
|
+
|
|
129
|
+
def initialize(full_constant_name, mutated_value, transfer_nested_constants)
|
|
130
|
+
@full_constant_name = normalize_const_name(full_constant_name)
|
|
131
|
+
@mutated_value = mutated_value
|
|
132
|
+
@transfer_nested_constants = transfer_nested_constants
|
|
133
|
+
@context_parts = @full_constant_name.split('::')
|
|
134
|
+
@const_name = @context_parts.pop
|
|
135
|
+
@reset_performed = false
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def to_constant
|
|
139
|
+
const = Constant.new(full_constant_name)
|
|
140
|
+
const.original_value = original_value
|
|
141
|
+
|
|
142
|
+
const
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def idempotently_reset
|
|
146
|
+
reset unless @reset_performed
|
|
147
|
+
@reset_performed = true
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Hides a defined constant for the duration of an example.
|
|
152
|
+
#
|
|
153
|
+
# @private
|
|
154
|
+
class ConstantHider < BaseMutator
|
|
155
|
+
def mutate
|
|
156
|
+
return unless (@defined = recursive_const_defined?(full_constant_name))
|
|
157
|
+
@context = recursive_const_get(@context_parts.join('::'))
|
|
158
|
+
@original_value = get_const_defined_on(@context, @const_name)
|
|
159
|
+
|
|
160
|
+
@context.__send__(:remove_const, @const_name)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def to_constant
|
|
164
|
+
return Constant.unmutated(full_constant_name) unless @defined
|
|
165
|
+
|
|
166
|
+
const = super
|
|
167
|
+
const.hidden = true
|
|
168
|
+
const.previously_defined = true
|
|
169
|
+
|
|
170
|
+
const
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def reset
|
|
174
|
+
return unless @defined
|
|
175
|
+
@context.const_set(@const_name, @original_value)
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Replaces a defined constant for the duration of an example.
|
|
180
|
+
#
|
|
181
|
+
# @private
|
|
182
|
+
class DefinedConstantReplacer < BaseMutator
|
|
183
|
+
def initialize(*args)
|
|
184
|
+
super
|
|
185
|
+
@constants_to_transfer = []
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def mutate
|
|
189
|
+
@context = recursive_const_get(@context_parts.join('::'))
|
|
190
|
+
@original_value = get_const_defined_on(@context, @const_name)
|
|
191
|
+
|
|
192
|
+
@constants_to_transfer = verify_constants_to_transfer!
|
|
193
|
+
|
|
194
|
+
@context.__send__(:remove_const, @const_name)
|
|
195
|
+
@context.const_set(@const_name, @mutated_value)
|
|
196
|
+
|
|
197
|
+
transfer_nested_constants
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def to_constant
|
|
201
|
+
const = super
|
|
202
|
+
const.stubbed = true
|
|
203
|
+
const.previously_defined = true
|
|
204
|
+
|
|
205
|
+
const
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def reset
|
|
209
|
+
@constants_to_transfer.each do |const|
|
|
210
|
+
@mutated_value.__send__(:remove_const, const)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
@context.__send__(:remove_const, @const_name)
|
|
214
|
+
@context.const_set(@const_name, @original_value)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def transfer_nested_constants
|
|
218
|
+
@constants_to_transfer.each do |const|
|
|
219
|
+
@mutated_value.const_set(const, get_const_defined_on(original_value, const))
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def verify_constants_to_transfer!
|
|
224
|
+
return [] unless should_transfer_nested_constants?
|
|
225
|
+
|
|
226
|
+
{ @original_value => "the original value", @mutated_value => "the stubbed value" }.each do |value, description|
|
|
227
|
+
next if value.respond_to?(:constants)
|
|
228
|
+
|
|
229
|
+
raise ArgumentError,
|
|
230
|
+
"Cannot transfer nested constants for #{@full_constant_name} " \
|
|
231
|
+
"since #{description} is not a class or module and only classes " \
|
|
232
|
+
"and modules support nested constants."
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
if Array === @transfer_nested_constants
|
|
236
|
+
@transfer_nested_constants = @transfer_nested_constants.map(&:to_s) if RUBY_VERSION == '1.8.7'
|
|
237
|
+
undefined_constants = @transfer_nested_constants - constants_defined_on(@original_value)
|
|
238
|
+
|
|
239
|
+
if undefined_constants.any?
|
|
240
|
+
available_constants = constants_defined_on(@original_value) - @transfer_nested_constants
|
|
241
|
+
raise ArgumentError,
|
|
242
|
+
"Cannot transfer nested constant(s) #{undefined_constants.join(' and ')} " \
|
|
243
|
+
"for #{@full_constant_name} since they are not defined. Did you mean " \
|
|
244
|
+
"#{available_constants.join(' or ')}?"
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
@transfer_nested_constants
|
|
248
|
+
else
|
|
249
|
+
constants_defined_on(@original_value)
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def should_transfer_nested_constants?
|
|
254
|
+
return true if @transfer_nested_constants
|
|
255
|
+
return false unless RSpec::Mocks.configuration.transfer_nested_constants?
|
|
256
|
+
@original_value.respond_to?(:constants) && @mutated_value.respond_to?(:constants)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# Sets an undefined constant for the duration of an example.
|
|
261
|
+
#
|
|
262
|
+
# @private
|
|
263
|
+
class UndefinedConstantSetter < BaseMutator
|
|
264
|
+
def mutate
|
|
265
|
+
@parent = @context_parts.inject(Object) do |klass, name|
|
|
266
|
+
if const_defined_on?(klass, name)
|
|
267
|
+
get_const_defined_on(klass, name)
|
|
268
|
+
else
|
|
269
|
+
ConstantMutator.stub(name_for(klass, name), Module.new)
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
@parent.const_set(@const_name, @mutated_value)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def to_constant
|
|
277
|
+
const = super
|
|
278
|
+
const.stubbed = true
|
|
279
|
+
const.previously_defined = false
|
|
280
|
+
|
|
281
|
+
const
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def reset
|
|
285
|
+
@parent.__send__(:remove_const, @const_name)
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
private
|
|
289
|
+
|
|
290
|
+
def name_for(parent, name)
|
|
291
|
+
root = if parent == Object
|
|
292
|
+
''
|
|
293
|
+
else
|
|
294
|
+
parent.name
|
|
295
|
+
end
|
|
296
|
+
root + '::' + name
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
# Uses the mutator to mutate (stub or hide) a constant. Ensures that
|
|
301
|
+
# the mutator is correctly registered so it can be backed out at the end
|
|
302
|
+
# of the test.
|
|
303
|
+
#
|
|
304
|
+
# @private
|
|
305
|
+
def self.mutate(mutator)
|
|
306
|
+
::RSpec::Mocks.space.register_constant_mutator(mutator)
|
|
307
|
+
mutator.mutate
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# Used internally by the constant stubbing to raise a helpful
|
|
311
|
+
# error when a constant like "A::B::C" is stubbed and A::B is
|
|
312
|
+
# not a module (and thus, it's impossible to define "A::B::C"
|
|
313
|
+
# since only modules can have nested constants).
|
|
314
|
+
#
|
|
315
|
+
# @api private
|
|
316
|
+
def self.raise_on_invalid_const
|
|
317
|
+
lambda do |const_name, failed_name|
|
|
318
|
+
raise "Cannot stub constant #{failed_name} on #{const_name} " \
|
|
319
|
+
"since #{const_name} is not a module."
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
end
|