rr 1.1.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Appraisals +6 -0
- data/CHANGES.md +102 -1
- data/CREDITS.md +5 -0
- data/Gemfile +3 -0
- data/README.md +91 -110
- data/Rakefile +43 -0
- data/doc/02_syntax_comparison.md +1 -0
- data/gemfiles/ruby_19_rspec_2.gemfile +14 -0
- data/gemfiles/ruby_19_rspec_2.gemfile.lock +49 -0
- data/gemfiles/ruby_19_rspec_2_rails_4.gemfile +15 -0
- data/gemfiles/ruby_19_rspec_2_rails_4.gemfile.lock +119 -0
- data/lib/rr/class_instance_method_defined.rb +1 -1
- data/lib/rr/core_ext/array.rb +2 -0
- data/lib/rr/core_ext/hash.rb +2 -0
- data/lib/rr/deprecations.rb +97 -0
- data/lib/rr/double.rb +28 -10
- data/lib/rr/double_definitions/double_definition.rb +39 -16
- data/lib/rr/double_definitions/double_definition_create.rb +5 -5
- data/lib/rr/double_definitions/double_definition_create_blank_slate.rb +10 -4
- data/lib/rr/double_definitions/double_injections/any_instance_of.rb +1 -1
- data/lib/rr/double_definitions/double_injections/instance.rb +2 -2
- data/lib/rr/double_definitions/strategies/strategy.rb +27 -8
- data/lib/rr/double_definitions/strategies/verification/mock.rb +8 -2
- data/lib/rr/double_matches.rb +4 -3
- data/lib/rr/dsl.rb +152 -0
- data/lib/rr/expectations/any_argument_expectation.rb +4 -4
- data/lib/rr/expectations/argument_equality_expectation.rb +43 -5
- data/lib/rr/injections/double_injection.rb +67 -19
- data/lib/rr/injections/method_missing_injection.rb +37 -6
- data/lib/rr/integrations.rb +13 -12
- data/lib/rr/integrations/decorator.rb +4 -1
- data/lib/rr/integrations/minitest_4.rb +1 -1
- data/lib/rr/integrations/minitest_4_active_support.rb +1 -1
- data/lib/rr/integrations/rspec/invocation_matcher.rb +0 -8
- data/lib/rr/integrations/rspec_2.rb +28 -3
- data/lib/rr/keyword_arguments.rb +15 -0
- data/lib/rr/method_dispatches/base_method_dispatch.rb +22 -5
- data/lib/rr/method_dispatches/method_dispatch.rb +21 -10
- data/lib/rr/method_dispatches/method_missing_dispatch.rb +14 -5
- data/lib/rr/recorded_call.rb +35 -0
- data/lib/rr/recorded_calls.rb +23 -9
- data/lib/rr/space.rb +15 -5
- data/lib/rr/spy_verification.rb +13 -5
- data/lib/rr/version.rb +1 -2
- data/lib/rr/wildcard_matchers.rb +10 -10
- data/lib/rr/without_autohook.rb +7 -14
- data/rr.gemspec +14 -5
- data/spec/custom_formatter_for_rspec.rb +18 -0
- data/spec/custom_formatter_for_rspec_2.rb +40 -0
- data/spec/defines_spec_suite_tasks.rb +57 -0
- data/spec/fixtures/rubygems_patch_for_187.rb +598 -0
- data/spec/global_helper.rb +38 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_suite_configuration.rb +126 -0
- data/spec/spec_suite_runner.rb +47 -0
- data/spec/suites.yml +10 -0
- data/spec/suites/rspec_2/functional/any_instance_of_spec.rb +147 -0
- data/spec/suites/rspec_2/functional/dont_allow_spec.rb +17 -0
- data/spec/suites/rspec_2/functional/mock_bang_spec.rb +20 -0
- data/spec/suites/rspec_2/functional/mock_instance_of_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/mock_instance_of_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/mock_proxy_instance_of_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/mock_proxy_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/mock_spec.rb +17 -0
- data/spec/suites/rspec_2/functional/mock_strong_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/received_spec.rb +16 -0
- data/spec/suites/rspec_2/functional/spy_spec.rb +102 -0
- data/spec/suites/rspec_2/functional/stub_bang_spec.rb +20 -0
- data/spec/suites/rspec_2/functional/stub_instance_of_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/stub_instance_of_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/stub_proxy_instance_of_spec.rb +16 -0
- data/spec/suites/rspec_2/functional/stub_proxy_spec.rb +45 -0
- data/spec/suites/rspec_2/functional/stub_spec.rb +71 -0
- data/spec/suites/rspec_2/functional/stub_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/wildcard_matchers_spec.rb +128 -0
- data/spec/suites/rspec_2/helper.rb +28 -0
- data/spec/suites/rspec_2/integration/minitest_4_spec.rb +109 -0
- data/spec/suites/rspec_2/integration/minitest_spec.rb +109 -0
- data/spec/suites/rspec_2/spec_helper.rb +3 -0
- data/spec/suites/rspec_2/support/matchers/wildcard_matcher_matchers.rb +32 -0
- data/spec/suites/rspec_2/support/mixins/double_definition_creator_helpers.rb +173 -0
- data/spec/suites/rspec_2/support/mixins/mock_definition_creator_helpers.rb +45 -0
- data/spec/suites/rspec_2/support/mixins/proxy_definition_creator_helpers.rb +33 -0
- data/spec/suites/rspec_2/support/mixins/stub_creator_helpers.rb +43 -0
- data/spec/suites/rspec_2/support/mixins/stub_definition_creator_helpers.rb +45 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_never_called_qualifier.rb +39 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_times_called_qualifier.rb +50 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_without_qualifiers.rb +131 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/dont_allow.rb +148 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of.rb +26 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of_strong.rb +28 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_proxy.rb +11 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_strong.rb +37 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mocking.rb +107 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of.rb +32 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of_strong.rb +39 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_proxy.rb +11 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_strong.rb +37 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stubbing.rb +57 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/array_flatten_bug.rb +35 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/block_form.rb +31 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/comparing_arity.rb +63 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/object_is_proxy.rb +43 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/sequential_invocations.rb +26 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/setting_implementation.rb +51 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/yields.rb +81 -0
- data/spec/suites/rspec_2/support/shared_examples/space.rb +13 -0
- data/spec/suites/rspec_2/support/shared_examples/times_called_expectation.rb +9 -0
- data/spec/suites/rspec_2/unit/core_ext/array_spec.rb +39 -0
- data/spec/suites/rspec_2/unit/core_ext/enumerable_spec.rb +53 -0
- data/spec/suites/rspec_2/unit/core_ext/hash_spec.rb +55 -0
- data/spec/suites/rspec_2/unit/core_ext/range_spec.rb +41 -0
- data/spec/suites/rspec_2/unit/core_ext/regexp_spec.rb +41 -0
- data/spec/suites/rspec_2/unit/deprecations_spec.rb +27 -0
- data/spec/suites/rspec_2/unit/double_definitions/child_double_definition_create_spec.rb +114 -0
- data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_blank_slate_spec.rb +93 -0
- data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_spec.rb +446 -0
- data/spec/suites/rspec_2/unit/dsl/double_creators_spec.rb +133 -0
- data/spec/suites/rspec_2/unit/dsl/space_spec.rb +99 -0
- data/spec/suites/rspec_2/unit/dsl/wildcard_matchers_spec.rb +67 -0
- data/spec/suites/rspec_2/unit/errors/rr_error_spec.rb +67 -0
- data/spec/suites/rspec_2/unit/expectations/any_argument_expectation_spec.rb +48 -0
- data/spec/suites/rspec_2/unit/expectations/anything_argument_equality_expectation_spec.rb +14 -0
- data/spec/suites/rspec_2/unit/expectations/argument_equality_expectation_spec.rb +135 -0
- data/spec/suites/rspec_2/unit/expectations/boolean_argument_equality_expectation_spec.rb +30 -0
- data/spec/suites/rspec_2/unit/expectations/hash_including_argument_equality_expectation_spec.rb +92 -0
- data/spec/suites/rspec_2/unit/expectations/satisfy_argument_equality_expectation_spec.rb +61 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/any_times_matcher_spec.rb +22 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_least_matcher_spec.rb +37 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_most_matcher_spec.rb +43 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/integer_matcher_spec.rb +58 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/proc_matcher_spec.rb +35 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/range_matcher_spec.rb +39 -0
- data/spec/suites/rspec_2/unit/hash_with_object_id_key_spec.rb +88 -0
- data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_spec.rb +533 -0
- data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_verify_spec.rb +32 -0
- data/spec/suites/rspec_2/unit/integrations/rspec/invocation_matcher_spec.rb +297 -0
- data/spec/suites/rspec_2/unit/integrations/rspec_spec.rb +70 -0
- data/spec/suites/rspec_2/unit/rr_spec.rb +28 -0
- data/spec/suites/rspec_2/unit/space_spec.rb +598 -0
- data/spec/suites/rspec_2/unit/spy_verification_spec.rb +133 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/any_times_matcher_spec.rb +46 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/at_least_matcher_spec.rb +54 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/at_most_matcher_spec.rb +69 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/integer_matcher_spec.rb +69 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/proc_matcher_spec.rb +54 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/range_matcher_spec.rb +75 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/times_called_matcher_spec.rb +117 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/anything_spec.rb +33 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/boolean_spec.rb +45 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/duck_type_spec.rb +64 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/hash_including_spec.rb +64 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/is_a_spec.rb +55 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/numeric_spec.rb +46 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/satisfy_spec.rb +57 -0
- data/spec/support/adapter.rb +22 -0
- data/spec/support/adapter_tests/base.rb +45 -0
- data/spec/support/adapter_tests/minitest.rb +7 -0
- data/spec/support/adapter_tests/rspec.rb +70 -0
- data/spec/support/adapter_tests/test_unit.rb +47 -0
- data/spec/support/command_runner.rb +105 -0
- data/spec/support/generator.rb +56 -0
- data/spec/support/integration_tests/base.rb +64 -0
- data/spec/support/integration_tests/rails.rb +60 -0
- data/spec/support/integration_tests/rails_minitest.rb +13 -0
- data/spec/support/integration_tests/rails_rspec.rb +13 -0
- data/spec/support/integration_tests/rails_test_unit.rb +13 -0
- data/spec/support/integration_tests/rails_test_unit_like.rb +13 -0
- data/spec/support/integration_tests/ruby.rb +7 -0
- data/spec/support/integration_tests/ruby_minitest.rb +13 -0
- data/spec/support/integration_tests/ruby_rspec.rb +13 -0
- data/spec/support/integration_tests/ruby_test_unit.rb +13 -0
- data/spec/support/matchers/be_a_subset_of_matcher.rb +24 -0
- data/spec/support/project/cucumber.rb +50 -0
- data/spec/support/project/generator.rb +348 -0
- data/spec/support/project/minitest.rb +39 -0
- data/spec/support/project/rails.rb +199 -0
- data/spec/support/project/rails_minitest.rb +17 -0
- data/spec/support/project/rails_rspec.rb +50 -0
- data/spec/support/project/rails_test_unit.rb +17 -0
- data/spec/support/project/rails_test_unit_like.rb +17 -0
- data/spec/support/project/rspec.rb +69 -0
- data/spec/support/project/ruby.rb +34 -0
- data/spec/support/project/ruby_minitest.rb +11 -0
- data/spec/support/project/ruby_rspec.rb +29 -0
- data/spec/support/project/ruby_test_unit.rb +11 -0
- data/spec/support/project/ruby_test_unit_like.rb +21 -0
- data/spec/support/project/test_unit.rb +29 -0
- data/spec/support/project/test_unit_like.rb +7 -0
- data/spec/support/project/tests_runner.rb +22 -0
- data/spec/support/test.sqlite3 +0 -0
- data/spec/support/test_case/generator.rb +53 -0
- data/spec/support/test_case/minitest.rb +13 -0
- data/spec/support/test_case/rspec.rb +19 -0
- data/spec/support/test_case/test_unit.rb +21 -0
- data/spec/support/test_file/generator.rb +120 -0
- data/spec/support/test_file/minitest.rb +19 -0
- data/spec/support/test_file/rails_minitest.rb +7 -0
- data/spec/support/test_file/rails_rspec.rb +12 -0
- data/spec/support/test_file/rails_test_unit.rb +25 -0
- data/spec/support/test_file/rspec.rb +33 -0
- data/spec/support/test_file/test_unit.rb +36 -0
- data/spec/support/test_helper/generator.rb +27 -0
- data/spec/support/test_helper/minitest.rb +7 -0
- data/spec/support/test_helper/rails.rb +31 -0
- data/spec/support/test_helper/rails_minitest.rb +7 -0
- data/spec/support/test_helper/rails_rspec.rb +25 -0
- data/spec/support/test_helper/rails_test_unit.rb +23 -0
- data/spec/support/test_helper/rspec.rb +7 -0
- data/spec/support/test_helper/ruby.rb +31 -0
- data/spec/support/test_helper/test_unit.rb +7 -0
- metadata +240 -19
- data/VERSION +0 -1
- data/lib/rr/adapters.rb +0 -44
- data/lib/rr/adapters/rr_methods.rb +0 -142
- data/lib/rr/integrations/rspec_1.rb +0 -46
- data/lib/rr/integrations/test_unit_1.rb +0 -63
- data/lib/rr/integrations/test_unit_2.rb +0 -15
- data/lib/rr/integrations/test_unit_200.rb +0 -27
- data/lib/rr/integrations/test_unit_200_active_support.rb +0 -25
- data/lib/rr/integrations/test_unit_2_active_support.rb +0 -38
- data/lib/rr/proc_from_block.rb +0 -11
data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/comparing_arity.rb
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
shared_examples_for 'comparing the arity between the method and double definition' do
|
|
2
|
+
it "succeeds if both have no arity" do
|
|
3
|
+
object = build_object_with_methods(some_method: -> {}) do |subject|
|
|
4
|
+
double_creator = double_definition_creator_for(subject)
|
|
5
|
+
double_creator.some_method
|
|
6
|
+
end
|
|
7
|
+
object.some_method
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "fails if the former has no arity and the latter does" do
|
|
11
|
+
build_object_with_methods(some_method: -> {}) do |subject|
|
|
12
|
+
double_creator = double_definition_creator_for(subject)
|
|
13
|
+
expect { double_creator.some_method(1) }.to \
|
|
14
|
+
raise_error(RR::Errors::SubjectHasDifferentArityError)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "fails if the former has arity but the latter doesn't" do
|
|
19
|
+
build_object_with_methods(some_method: ->(arg) {}) do |subject|
|
|
20
|
+
double_creator = double_definition_creator_for(subject)
|
|
21
|
+
expect { double_creator.some_method }.to \
|
|
22
|
+
raise_error(RR::Errors::SubjectHasDifferentArityError)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "succeeds if both have a finite number of arguments" do
|
|
27
|
+
object = build_object_with_methods(some_method: ->(arg) {}) do |subject|
|
|
28
|
+
double_creator = double_definition_creator_for(subject)
|
|
29
|
+
double_creator.some_method(1)
|
|
30
|
+
end
|
|
31
|
+
object.some_method(1)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "succeeds if both have a variable number of arguments" do
|
|
35
|
+
object = build_object_with_methods(some_method: ->(*args) {}) do |subject|
|
|
36
|
+
double_creator = double_definition_creator_for(subject)
|
|
37
|
+
double_creator.some_method(1)
|
|
38
|
+
double_creator.some_method(1, 2, 3)
|
|
39
|
+
double_creator.some_method(1, 2)
|
|
40
|
+
end
|
|
41
|
+
object.some_method(1)
|
|
42
|
+
object.some_method(1, 2)
|
|
43
|
+
object.some_method(1, 2, 3)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "succeeds if both have finite and variable number of arguments" do
|
|
47
|
+
object = build_object_with_methods(some_method: ->(arg1, arg2, *rest) {}) do |subject|
|
|
48
|
+
double_creator = double_definition_creator_for(subject)
|
|
49
|
+
double_creator.some_method(1, 2)
|
|
50
|
+
double_creator.some_method(1, 2, 3)
|
|
51
|
+
end
|
|
52
|
+
object.some_method(1, 2)
|
|
53
|
+
object.some_method(1, 2, 3)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "fails if the finite arguments are not matched before the variable arguments" do
|
|
57
|
+
build_object_with_methods(some_method: ->(arg1, arg2, *rest) {}) do |subject|
|
|
58
|
+
double_creator = double_definition_creator_for(subject)
|
|
59
|
+
expect { double_creator.some_method(1) }.to \
|
|
60
|
+
raise_error(RR::Errors::SubjectHasDifferentArityError)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/object_is_proxy.rb
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# btakita/rr issue #24
|
|
2
|
+
# this happens when defining a double on an ActiveRecord association object
|
|
3
|
+
shared_examples_for 'defining a method double on an object which is a proxy for another object' do
|
|
4
|
+
include DoubleDefinitionCreatorHelpers
|
|
5
|
+
|
|
6
|
+
it "places the double on the proxy object and not the target object by mistake" do
|
|
7
|
+
target_object = build_object_with_possible_methods(some_method: -> { 'existing value' })
|
|
8
|
+
proxy_object = proxy_object_class.new(target_object)
|
|
9
|
+
expect(proxy_object.methods).to match_array(target_object.methods)
|
|
10
|
+
double_definition_creator_for(proxy_object).some_method { 'value' }
|
|
11
|
+
expect(proxy_object.some_method).to eq 'value'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "resets the double correctly" do
|
|
15
|
+
target_object = build_object_with_possible_methods(some_method: -> { 'existing value' })
|
|
16
|
+
proxy_object = proxy_object_class.new(target_object)
|
|
17
|
+
expect(proxy_object.methods).to match_array(target_object.methods)
|
|
18
|
+
double_definition_creator_for(proxy_object).some_method { 'value' }
|
|
19
|
+
RR.reset
|
|
20
|
+
expect_method_to_have_value_or_be_absent('existing value', proxy_object, :some_method)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def proxy_object_class
|
|
24
|
+
Class.new do
|
|
25
|
+
# This matches what AssociationProxy was like as of Rails 2
|
|
26
|
+
instance_methods.each do |m|
|
|
27
|
+
undef_method m unless m.to_s =~ /^(?:nil\?|send|object_id|to_a)$|^__|^respond_to|proxy_/
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def initialize(target)
|
|
31
|
+
@target = target
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def method_missing(name, *args, &block)
|
|
35
|
+
if @target.respond_to?(name)
|
|
36
|
+
@target.__send__(name, *args, &block)
|
|
37
|
+
else
|
|
38
|
+
super
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
shared_examples_for 'defining a method double for sequential invocations of that method using #ordered/#then' do
|
|
2
|
+
include DoubleDefinitionCreatorHelpers
|
|
3
|
+
|
|
4
|
+
it "works" do
|
|
5
|
+
object = build_object_with_possible_methods(some_method: -> {}) do |subject|
|
|
6
|
+
double_creator = double_definition_creator_for(subject)
|
|
7
|
+
double_creator.some_method { 'value 1' }.twice.ordered
|
|
8
|
+
double_creator.some_method { 'value 2' }.once.ordered
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
expect(object.some_method).to eq 'value 1'
|
|
12
|
+
expect(object.some_method).to eq 'value 1'
|
|
13
|
+
expect(object.some_method).to eq 'value 2'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "works when using #then instead of #ordered" do
|
|
17
|
+
object = build_object_with_possible_methods(some_method: -> {}) do |subject|
|
|
18
|
+
double_definition_creator_for(subject).
|
|
19
|
+
some_method { 'value 1' }.once.then.
|
|
20
|
+
some_method { 'value 2' }.once
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
expect(object.some_method).to eq 'value 1'
|
|
24
|
+
expect(object.some_method).to eq 'value 2'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
shared_examples_for 'defining a method double that sets the implementation of that method' do
|
|
2
|
+
include DoubleDefinitionCreatorHelpers
|
|
3
|
+
|
|
4
|
+
it "works when not given a block" do
|
|
5
|
+
expect_that_double_can_be_defined_without_block
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
context 'by giving a block' do
|
|
9
|
+
it "replaces the implementation with the block" do
|
|
10
|
+
expect_that_double_sets_implementation do |double_creator, method_name, block|
|
|
11
|
+
double_creator.__send__(method_name, &block)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "resets the double correctly" do
|
|
16
|
+
expect_that_double_sets_implementation_and_resets do |double_creator, method_name, block|
|
|
17
|
+
double_creator.__send__(method_name, &block)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context 'by using #returns' do
|
|
23
|
+
context 'with a block' do
|
|
24
|
+
it "replaces the implementation with the block" do
|
|
25
|
+
expect_that_double_sets_implementation do |double_creator, method_name, block|
|
|
26
|
+
double_creator.__send__(method_name).returns(&block)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "resets the double correctly" do
|
|
31
|
+
expect_that_double_sets_implementation_and_resets do |double_creator, method_name, block|
|
|
32
|
+
double_creator.__send__(method_name).returns(&block)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'with a straight argument' do
|
|
38
|
+
it "makes the method return the argument" do
|
|
39
|
+
expect_that_double_sets_value do |double_creator, method_name, value|
|
|
40
|
+
double_creator.__send__(method_name).returns(value)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "resets the double correctly" do
|
|
45
|
+
expect_that_double_sets_value_and_resets do |double, method_name, value|
|
|
46
|
+
double_creator.__send__(method_name).returns(value)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
shared_examples_for 'defining a method double qualified with #yields' do
|
|
2
|
+
include DoubleDefinitionCreatorHelpers
|
|
3
|
+
|
|
4
|
+
context 'without arguments' do
|
|
5
|
+
it "inserts a yield that passes no arguments" do
|
|
6
|
+
object = build_object_with_possible_methods(some_method: -> {}) do |subject|
|
|
7
|
+
double_definition_creator_for(subject).some_method.yields
|
|
8
|
+
end
|
|
9
|
+
x = 0
|
|
10
|
+
object.some_method { x = 1 }
|
|
11
|
+
expect(x).to eq 1
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "does not affect setting the implementation otherwise" do
|
|
15
|
+
object = build_object_with_possible_methods(some_method: -> { 'existing value' }) do |subject|
|
|
16
|
+
double_definition_creator_for(subject).some_method { 'value' }.yields
|
|
17
|
+
end
|
|
18
|
+
expect(object.some_method { }).to eq 'value'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "also lets you set the implementation in preference to #returns" do
|
|
22
|
+
object = build_object_with_possible_methods(some_method: -> { 'existing value' }) do |subject|
|
|
23
|
+
double_definition_creator_for(subject).some_method.yields { 'value' }
|
|
24
|
+
end
|
|
25
|
+
expect(object.some_method { }).to eq 'value'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "is reset correctly" do
|
|
29
|
+
object = build_object_with_possible_methods(some_method: -> {}) do |subject|
|
|
30
|
+
double_definition_creator_for(subject).some_method.yields
|
|
31
|
+
end
|
|
32
|
+
RR.reset
|
|
33
|
+
x = 0
|
|
34
|
+
if methods_being_doubled_exist_already?
|
|
35
|
+
object.some_method { x = 1 }
|
|
36
|
+
expect(x).to eq 0
|
|
37
|
+
else
|
|
38
|
+
expect_method_to_not_exist(object, :some_method)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context 'with arguments' do
|
|
44
|
+
it "inserts a yield that passes those arguments" do
|
|
45
|
+
object = build_object_with_possible_methods(some_method: -> {}) do |subject|
|
|
46
|
+
double_definition_creator_for(subject).some_method.yields(1)
|
|
47
|
+
end
|
|
48
|
+
x = 0
|
|
49
|
+
object.some_method {|a| x = a }
|
|
50
|
+
expect(x).to eq 1
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "does not affect setting the implementation otherwise" do
|
|
54
|
+
object = build_object_with_possible_methods(some_method: -> { 'existing value' }) do |subject|
|
|
55
|
+
double_definition_creator_for(subject).some_method { 'value' }.yields(1)
|
|
56
|
+
end
|
|
57
|
+
expect(object.some_method { }).to eq 'value'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "also lets you set the implementation in preference to #returns" do
|
|
61
|
+
object = build_object_with_possible_methods(some_method: -> { 'existing value' }) do |subject|
|
|
62
|
+
double_definition_creator_for(subject).some_method.yields(1) { 'value' }
|
|
63
|
+
end
|
|
64
|
+
expect(object.some_method { }).to eq 'value'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "is reset correctly" do
|
|
68
|
+
object = build_object_with_possible_methods(some_method: -> {}) do |subject|
|
|
69
|
+
double_definition_creator_for(subject).some_method.yields(1)
|
|
70
|
+
end
|
|
71
|
+
RR.reset
|
|
72
|
+
if methods_being_doubled_exist_already?
|
|
73
|
+
x = 0
|
|
74
|
+
object.some_method {|a| x = a }
|
|
75
|
+
expect(x).to eq 0
|
|
76
|
+
else
|
|
77
|
+
expect_method_to_not_exist(object, :some_method)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
shared_examples_for "Swapped Space" do
|
|
2
|
+
attr_reader :space, :original_space
|
|
3
|
+
|
|
4
|
+
before do
|
|
5
|
+
@original_space = RR::Space.instance
|
|
6
|
+
RR::Space.instance = RR::Space.new
|
|
7
|
+
@space = RR::Space.instance
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
after do
|
|
11
|
+
RR::Space.instance = @original_space
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe Array do
|
|
4
|
+
include WildcardMatcherMatchers
|
|
5
|
+
|
|
6
|
+
describe '#wildcard_match?' do
|
|
7
|
+
context 'when this Array has items that respond to #wildcard_match?' do
|
|
8
|
+
subject { [hash_including({:foo => 'bar'})] }
|
|
9
|
+
|
|
10
|
+
it "returns true if all items in the given Array wildcard-match corresponding items in this Array" do
|
|
11
|
+
should wildcard_match([{:foo => 'bar', :baz => 'quux'}])
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "returns true if any items in the given Array do not wildcard-match corresponding items in this Array" do
|
|
15
|
+
should_not wildcard_match([{:foo => 'bat', :baz => 'quux'}])
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'when this Array has items that do not respond to #wildcard_match?' do
|
|
20
|
+
subject { [:a_symbol] }
|
|
21
|
+
|
|
22
|
+
it "returns true if all items in the given Array equal-match corresponding items in this Array" do
|
|
23
|
+
should wildcard_match([:a_symbol])
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "returns true if any items in the given Array do not equal-match corresponding items in this Array" do
|
|
27
|
+
should_not wildcard_match([:another_symbol])
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context 'when not given an Array' do
|
|
32
|
+
subject { [{:foo => 'bar'}] }
|
|
33
|
+
|
|
34
|
+
it "returns false" do
|
|
35
|
+
should_not wildcard_match(:something_else)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe Enumerable do
|
|
4
|
+
include WildcardMatcherMatchers
|
|
5
|
+
|
|
6
|
+
let(:klass) {
|
|
7
|
+
Class.new do
|
|
8
|
+
include Enumerable
|
|
9
|
+
|
|
10
|
+
def initialize(*items)
|
|
11
|
+
@arr = items
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def each(&block)
|
|
15
|
+
@arr.each(&block)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
describe '#wildcard_match?' do
|
|
21
|
+
context 'when this Enumerable has items that respond to #wildcard_match?' do
|
|
22
|
+
subject { klass.new(hash_including({:foo => 'bar'})) }
|
|
23
|
+
|
|
24
|
+
it "returns true if all items in the given Enumerable wildcard-match corresponding items in this Enumerable" do
|
|
25
|
+
should wildcard_match([{:foo => 'bar', :baz => 'quux'}])
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "returns true if any items in the given Enumerable do not wildcard-match corresponding items in this Enumerable" do
|
|
29
|
+
should_not wildcard_match([{:foo => 'bat', :baz => 'quux'}])
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context 'when this Enumerable has items that do not respond to #wildcard_match?' do
|
|
34
|
+
subject { klass.new(:a_symbol) }
|
|
35
|
+
|
|
36
|
+
it "returns true if all items in the given Enumerable equal-match corresponding items in this Enumerable" do
|
|
37
|
+
should wildcard_match([:a_symbol])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "returns true if any items in the given Enumerable do not equal-match corresponding items in this Enumerable" do
|
|
41
|
+
should_not wildcard_match([:another_symbol])
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context 'when not given an Enumerable' do
|
|
46
|
+
subject { klass.new({:foo => 'bar'}) }
|
|
47
|
+
|
|
48
|
+
it "returns false" do
|
|
49
|
+
should_not wildcard_match(:something_else)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe Hash do
|
|
4
|
+
include WildcardMatcherMatchers
|
|
5
|
+
|
|
6
|
+
describe '#wildcard_match?' do
|
|
7
|
+
context 'when this Hash has keys that respond to #wildcard_match?' do
|
|
8
|
+
subject { {is_a(Symbol) => 'x'} }
|
|
9
|
+
|
|
10
|
+
it "returns true if all keys in the given Hash wildcard-match the corresponding keys in this Hash" do
|
|
11
|
+
should wildcard_match({:foo => 'x'})
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "returns true if any keys in the given Hash do not wildcard-match the corresponding keys in this Hash" do
|
|
15
|
+
should_not wildcard_match({'foo' => 'x'})
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'when this Hash has values that respond to #wildcard_match?' do
|
|
20
|
+
subject { {'x' => is_a(Symbol)} }
|
|
21
|
+
|
|
22
|
+
it "returns true if all values in the given Hash wildcard-match the corresponding values in this Hash" do
|
|
23
|
+
should wildcard_match({'x' => :foo})
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "returns false if any values in the given Hash do not wildcard-match the corresponding values in this Hash" do
|
|
27
|
+
should_not wildcard_match({'x' => 'foo'})
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context 'when this Hash does not have keys or values that respond to #wildcard_match?' do
|
|
32
|
+
subject { {:x => :y} }
|
|
33
|
+
|
|
34
|
+
it "returns true if all pairs in the given Hash wildcard-match the corresponding values in this Hash" do
|
|
35
|
+
should wildcard_match({:x => :y})
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "returns false if any keys do not equal-match corresponding items in the subject" do
|
|
39
|
+
should_not wildcard_match({:z => :y})
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "returns false if any values do not equal-match corresponding items in the subject" do
|
|
43
|
+
should_not wildcard_match({:x => :z})
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context 'when not given a Hash' do
|
|
48
|
+
subject { {:foo => 'bar'} }
|
|
49
|
+
|
|
50
|
+
it "returns false" do
|
|
51
|
+
should_not wildcard_match(:something_else)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|