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
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
2
|
+
|
|
3
|
+
module RR
|
|
4
|
+
describe DSL do
|
|
5
|
+
subject { Object.new }
|
|
6
|
+
|
|
7
|
+
after(:each) do
|
|
8
|
+
RR.reset
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe "normal strategy definitions" do
|
|
12
|
+
attr_reader :strategy_method_name
|
|
13
|
+
|
|
14
|
+
def call_strategy(*args, &block)
|
|
15
|
+
__send__(strategy_method_name, *args, &block)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "#mock" do
|
|
19
|
+
before do
|
|
20
|
+
@strategy_method_name = :mock
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "when passing no args" do
|
|
24
|
+
it "returns a DoubleDefinitionCreate" do
|
|
25
|
+
expect(call_strategy.class).to eq RR::DoubleDefinitions::DoubleDefinitionCreate
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "when passed a method_name argument" do
|
|
30
|
+
it "creates a mock Double for method" do
|
|
31
|
+
double_definition = mock(subject, :foobar).returns {:baz}
|
|
32
|
+
expect(double_definition.times_matcher).to eq RR::TimesCalledMatchers::IntegerMatcher.new(1)
|
|
33
|
+
expect(double_definition.argument_expectation.class).to eq RR::Expectations::ArgumentEqualityExpectation
|
|
34
|
+
expect(double_definition.argument_expectation.expected_arguments).to eq []
|
|
35
|
+
expect(subject.foobar).to eq :baz
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "#stub" do
|
|
41
|
+
before do
|
|
42
|
+
@strategy_method_name = :stub
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context "when passing no args" do
|
|
46
|
+
it "returns a DoubleDefinitionCreate" do
|
|
47
|
+
expect(call_strategy.class).to eq RR::DoubleDefinitions::DoubleDefinitionCreate
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "when passed a method_name argument" do
|
|
52
|
+
it "creates a stub Double for method when passed a method_name argument" do
|
|
53
|
+
double_definition = stub(subject, :foobar).returns {:baz}
|
|
54
|
+
expect(double_definition.times_matcher).to eq RR::TimesCalledMatchers::AnyTimesMatcher.new
|
|
55
|
+
expect(double_definition.argument_expectation.class).to eq RR::Expectations::AnyArgumentExpectation
|
|
56
|
+
expect(subject.foobar).to eq :baz
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe "#dont_allow" do
|
|
62
|
+
before do
|
|
63
|
+
@strategy_method_name = :dont_allow
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context "when passing no args" do
|
|
67
|
+
it "returns a DoubleDefinitionCreate" do
|
|
68
|
+
expect(call_strategy.class).to eq RR::DoubleDefinitions::DoubleDefinitionCreate
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "when passed a method_name argument_expectation" do
|
|
73
|
+
it "creates a mock Double for method" do
|
|
74
|
+
double_definition = dont_allow(subject, :foobar)
|
|
75
|
+
expect(double_definition.times_matcher).to eq RR::TimesCalledMatchers::NeverMatcher.new
|
|
76
|
+
expect(double_definition.argument_expectation.class).to eq RR::Expectations::AnyArgumentExpectation
|
|
77
|
+
|
|
78
|
+
expect {
|
|
79
|
+
subject.foobar
|
|
80
|
+
}.to raise_error(RR::Errors::TimesCalledError)
|
|
81
|
+
RR.reset
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "! strategy definitions" do
|
|
88
|
+
attr_reader :strategy_method_name
|
|
89
|
+
def call_strategy(*args, &definition_eval_block)
|
|
90
|
+
__send__(strategy_method_name, *args, &definition_eval_block)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
describe "#mock!" do
|
|
94
|
+
before do
|
|
95
|
+
@strategy_method_name = :mock!
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context "when passed a method_name argument" do
|
|
99
|
+
it "sets #verification_strategy to Mock" do
|
|
100
|
+
proxy = mock!(:foobar)
|
|
101
|
+
expect(proxy.double_definition_create.verification_strategy.class).to eq RR::DoubleDefinitions::Strategies::Verification::Mock
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
describe "#stub!" do
|
|
107
|
+
before do
|
|
108
|
+
@strategy_method_name = :stub!
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context "when passed a method_name argument" do
|
|
112
|
+
it "sets #verification_strategy to Stub" do
|
|
113
|
+
proxy = stub!(:foobar)
|
|
114
|
+
expect(proxy.double_definition_create.verification_strategy.class).to eq RR::DoubleDefinitions::Strategies::Verification::Stub
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
describe "#dont_allow!" do
|
|
120
|
+
before do
|
|
121
|
+
@strategy_method_name = :dont_allow!
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context "when passed a method_name argument" do
|
|
125
|
+
it "sets #verification_strategy to DontAllow" do
|
|
126
|
+
proxy = dont_allow!(:foobar)
|
|
127
|
+
expect(proxy.double_definition_create.verification_strategy.class).to eq RR::DoubleDefinitions::Strategies::Verification::DontAllow
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
2
|
+
|
|
3
|
+
module RR
|
|
4
|
+
describe DSL do
|
|
5
|
+
attr_reader :space, :subject_1, :subject_2, :method_name
|
|
6
|
+
|
|
7
|
+
include_examples "Swapped Space"
|
|
8
|
+
|
|
9
|
+
include RR::DSL
|
|
10
|
+
|
|
11
|
+
before do
|
|
12
|
+
@subject_1 = Object.new
|
|
13
|
+
@subject_2 = Object.new
|
|
14
|
+
@method_name = :foobar
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "#verify" do
|
|
18
|
+
it "aliases #rr_verify" do
|
|
19
|
+
expect(DSL.instance_method("verify")).to eq DSL.instance_method("rr_verify")
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "#rr_verify" do
|
|
24
|
+
it "verifies and deletes the double_injections" do
|
|
25
|
+
double_1 = ::RR::Injections::DoubleInjection.find_or_create_by_subject(subject_1, method_name)
|
|
26
|
+
double_1_verify_calls = 0
|
|
27
|
+
double_1_reset_calls = 0
|
|
28
|
+
(
|
|
29
|
+
class << double_1;
|
|
30
|
+
self;
|
|
31
|
+
end).class_eval do
|
|
32
|
+
define_method(:verify) do ||
|
|
33
|
+
double_1_verify_calls += 1
|
|
34
|
+
end
|
|
35
|
+
define_method(:reset) do ||
|
|
36
|
+
double_1_reset_calls += 1
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
double_2 = ::RR::Injections::DoubleInjection.find_or_create_by_subject(subject_2, method_name)
|
|
40
|
+
double_2_verify_calls = 0
|
|
41
|
+
double_2_reset_calls = 0
|
|
42
|
+
( class << double_2; self; end).class_eval do
|
|
43
|
+
define_method(:verify) do ||
|
|
44
|
+
double_2_verify_calls += 1
|
|
45
|
+
end
|
|
46
|
+
define_method(:reset) do ||
|
|
47
|
+
double_2_reset_calls += 1
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
rr_verify
|
|
52
|
+
expect(double_1_verify_calls).to eq 1
|
|
53
|
+
expect(double_2_verify_calls).to eq 1
|
|
54
|
+
expect(double_1_reset_calls).to eq 1
|
|
55
|
+
expect(double_1_reset_calls).to eq 1
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe "#reset" do
|
|
60
|
+
it "aliases #rr_reset" do
|
|
61
|
+
expect(DSL.instance_method("reset")).to eq DSL.instance_method("rr_reset")
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe "#rr_reset" do
|
|
66
|
+
it "removes the ordered doubles" do
|
|
67
|
+
mock(subject_1).foobar1.ordered
|
|
68
|
+
mock(subject_2).foobar2.ordered
|
|
69
|
+
|
|
70
|
+
::RR::Injections::DoubleInjection.instances.should_not be_empty
|
|
71
|
+
|
|
72
|
+
rr_reset
|
|
73
|
+
::RR::Injections::DoubleInjection.instances
|
|
74
|
+
expect(::RR::Injections::DoubleInjection.instances).to be_empty
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "resets all double_injections" do
|
|
78
|
+
double_1 = ::RR::Injections::DoubleInjection.find_or_create_by_subject(subject_1, method_name)
|
|
79
|
+
double_1_reset_calls = 0
|
|
80
|
+
( class << double_1; self; end).class_eval do
|
|
81
|
+
define_method(:reset) do ||
|
|
82
|
+
double_1_reset_calls += 1
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
double_2 = ::RR::Injections::DoubleInjection.find_or_create_by_subject(subject_2, method_name)
|
|
86
|
+
double_2_reset_calls = 0
|
|
87
|
+
( class << double_2; self; end).class_eval do
|
|
88
|
+
define_method(:reset) do ||
|
|
89
|
+
double_2_reset_calls += 1
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
rr_reset
|
|
94
|
+
expect(double_1_reset_calls).to eq 1
|
|
95
|
+
expect(double_2_reset_calls).to eq 1
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
2
|
+
|
|
3
|
+
module RR
|
|
4
|
+
describe DSL do
|
|
5
|
+
include DSL
|
|
6
|
+
|
|
7
|
+
describe "#anything" do
|
|
8
|
+
it "returns an Anything matcher" do
|
|
9
|
+
expect(anything).to eq RR::WildcardMatchers::Anything.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "rr_anything returns an Anything matcher" do
|
|
13
|
+
expect(rr_anything).to eq RR::WildcardMatchers::Anything.new
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "#is_a" do
|
|
18
|
+
it "returns an IsA matcher" do
|
|
19
|
+
expect(is_a(Integer)).to eq RR::WildcardMatchers::IsA.new(Integer)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "rr_is_a returns an IsA matcher" do
|
|
23
|
+
expect(rr_is_a(Integer)).to eq RR::WildcardMatchers::IsA.new(Integer)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "#numeric" do
|
|
28
|
+
it "returns an Numeric matcher" do
|
|
29
|
+
expect(numeric).to eq RR::WildcardMatchers::Numeric.new
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "rr_numeric returns an Numeric matcher" do
|
|
33
|
+
expect(rr_numeric).to eq RR::WildcardMatchers::Numeric.new
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "#boolean" do
|
|
38
|
+
it "returns an Boolean matcher" do
|
|
39
|
+
expect(boolean).to eq RR::WildcardMatchers::Boolean.new
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "rr_boolean returns an Boolean matcher" do
|
|
43
|
+
expect(rr_boolean).to eq RR::WildcardMatchers::Boolean.new
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "#duck_type" do
|
|
48
|
+
it "returns a DuckType matcher" do
|
|
49
|
+
expect(duck_type(:one, :two)).to eq RR::WildcardMatchers::DuckType.new(:one, :two)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "rr_duck_type returns a DuckType matcher" do
|
|
53
|
+
expect(rr_duck_type(:one, :two)).to eq RR::WildcardMatchers::DuckType.new(:one, :two)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "#any_times" do
|
|
59
|
+
it "returns an AnyTimesMatcher" do
|
|
60
|
+
expect(any_times).to eq RR::TimesCalledMatchers::AnyTimesMatcher.new
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "rr_any_times returns an AnyTimesMatcher" do
|
|
64
|
+
expect(rr_any_times).to eq RR::TimesCalledMatchers::AnyTimesMatcher.new
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
2
|
+
|
|
3
|
+
module RR
|
|
4
|
+
module Errors
|
|
5
|
+
describe RRError do
|
|
6
|
+
describe "#backtrace" do
|
|
7
|
+
before do
|
|
8
|
+
@original_trim_backtrace = RR.trim_backtrace
|
|
9
|
+
end
|
|
10
|
+
after do
|
|
11
|
+
RR.trim_backtrace = @original_trim_backtrace
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "does not include the rr library files when trim_backtrace is true" do
|
|
15
|
+
RR.trim_backtrace = true
|
|
16
|
+
|
|
17
|
+
error = nil
|
|
18
|
+
begin
|
|
19
|
+
obj = Object.new
|
|
20
|
+
mock(obj).foobar
|
|
21
|
+
RR.verify_double(obj, :foobar)
|
|
22
|
+
rescue RRError=> e
|
|
23
|
+
error = e
|
|
24
|
+
end
|
|
25
|
+
backtrace = error.backtrace.join("\n")
|
|
26
|
+
|
|
27
|
+
backtrace.should_not include("lib/rr")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "includes the rr library files when trim_backtrace is false" do
|
|
31
|
+
RR.trim_backtrace = false
|
|
32
|
+
|
|
33
|
+
error = nil
|
|
34
|
+
begin
|
|
35
|
+
obj = Object.new
|
|
36
|
+
mock(obj).foobar
|
|
37
|
+
RR.verify_double(obj, :foobar)
|
|
38
|
+
rescue RRError=> e
|
|
39
|
+
error = e
|
|
40
|
+
end
|
|
41
|
+
backtrace = error.backtrace.join("\n")
|
|
42
|
+
|
|
43
|
+
expect(backtrace).to include("lib/rr")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "returns custom backtrace when backtrace is set" do
|
|
47
|
+
error = RRError.new
|
|
48
|
+
custom_backtrace = caller
|
|
49
|
+
error.backtrace = custom_backtrace
|
|
50
|
+
expect(error.backtrace).to eq custom_backtrace
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "returns normal backtrace when backtrace is not set" do
|
|
54
|
+
error = nil
|
|
55
|
+
expected_line = __LINE__ + 2
|
|
56
|
+
begin
|
|
57
|
+
raise RRError
|
|
58
|
+
rescue RRError => e
|
|
59
|
+
error = e
|
|
60
|
+
end
|
|
61
|
+
expect(error.backtrace.first).to include(__FILE__)
|
|
62
|
+
expect(error.backtrace.first).to include(expected_line.to_s)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
2
|
+
|
|
3
|
+
module RR
|
|
4
|
+
module Expectations
|
|
5
|
+
describe AnyArgumentExpectation do
|
|
6
|
+
attr_reader :expectation
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
@expectation = AnyArgumentExpectation.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe "#expected_arguments" do
|
|
13
|
+
it "returns an empty array" do
|
|
14
|
+
expect(expectation.expected_arguments).to eq []
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "==" do
|
|
19
|
+
it "returns true when comparing with another AnyArgumentExpectation" do
|
|
20
|
+
expect(expectation).to eq AnyArgumentExpectation.new
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "returns false when comparing with ArgumentEqualityExpectation" do
|
|
24
|
+
expect(expectation).to_not eq ArgumentEqualityExpectation.new([1], {})
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "#exact_match?" do
|
|
29
|
+
it "returns false" do
|
|
30
|
+
expectation.should_not be_exact_match([1, 2, 3], {})
|
|
31
|
+
expectation.should_not be_exact_match([1, 2], {})
|
|
32
|
+
expectation.should_not be_exact_match([1], {})
|
|
33
|
+
expectation.should_not be_exact_match([], {})
|
|
34
|
+
expectation.should_not be_exact_match(["does not match"], {})
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe "#wildcard_match?" do
|
|
39
|
+
it "returns true" do
|
|
40
|
+
expectation = AnyArgumentExpectation.new
|
|
41
|
+
expect(expectation).to be_wildcard_match([1, 2, 3], {})
|
|
42
|
+
expect(expectation).to be_wildcard_match(["whatever"], {})
|
|
43
|
+
expect(expectation).to be_wildcard_match(["whatever", "else"], {})
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
2
|
+
|
|
3
|
+
module RR
|
|
4
|
+
module Expectations
|
|
5
|
+
describe ArgumentEqualityExpectation do
|
|
6
|
+
context "when matching anything" do
|
|
7
|
+
attr_reader :expectation
|
|
8
|
+
before do
|
|
9
|
+
@expectation = ArgumentEqualityExpectation.new(anything)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
2
|
+
|
|
3
|
+
module RR
|
|
4
|
+
module Expectations
|
|
5
|
+
describe ArgumentEqualityExpectation do
|
|
6
|
+
attr_reader :expectation
|
|
7
|
+
before do
|
|
8
|
+
@expectation = ArgumentEqualityExpectation.new([1, 2, 3], {})
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe "#expected_arguments" do
|
|
12
|
+
it "returns the passed in expected_arguments" do
|
|
13
|
+
expect(expectation.expected_arguments).to eq [1, 2, 3]
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "==" do
|
|
18
|
+
it "returns true when passed in expected_arguments are equal" do
|
|
19
|
+
expect(expectation).to eq ArgumentEqualityExpectation.new([1, 2, 3], {})
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "returns false when passed in expected_arguments are not equal" do
|
|
23
|
+
expect(expectation).to_not eq ArgumentEqualityExpectation.new([1, 2], {})
|
|
24
|
+
expect(expectation).to_not eq ArgumentEqualityExpectation.new([1], {})
|
|
25
|
+
expect(expectation).to_not eq ArgumentEqualityExpectation.new([:something], {})
|
|
26
|
+
expect(expectation).to_not eq ArgumentEqualityExpectation.new([], {})
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "#exact_match?" do
|
|
31
|
+
context "when all arguments exactly match" do
|
|
32
|
+
it "returns true" do
|
|
33
|
+
expect(expectation).to be_exact_match([1, 2, 3], {})
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context "when all arguments do not exactly match" do
|
|
38
|
+
it "returns false" do
|
|
39
|
+
expectation.should_not be_exact_match([1, 2], {})
|
|
40
|
+
expectation.should_not be_exact_match([1], {})
|
|
41
|
+
expectation.should_not be_exact_match([], {})
|
|
42
|
+
expectation.should_not be_exact_match(["does not match"], {})
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "#wildcard_match?" do
|
|
48
|
+
context "when not an exact match" do
|
|
49
|
+
it "returns false" do
|
|
50
|
+
expectation = ArgumentEqualityExpectation.new([1], {})
|
|
51
|
+
expectation.should_not be_wildcard_match([1, 2, 3], {})
|
|
52
|
+
expectation.should_not be_wildcard_match(["whatever"], {})
|
|
53
|
+
expectation.should_not be_wildcard_match(["whatever", "else"], {})
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context "when an exact match" do
|
|
58
|
+
it "returns true" do
|
|
59
|
+
expectation = ArgumentEqualityExpectation.new([1, 2], {})
|
|
60
|
+
expect(expectation).to be_wildcard_match([1, 2], {})
|
|
61
|
+
expectation.should_not be_wildcard_match([1], {})
|
|
62
|
+
expectation.should_not be_wildcard_match(["whatever", "else"], {})
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context "when not passed correct number of arguments" do
|
|
67
|
+
it "returns false" do
|
|
68
|
+
expectation.should_not be_wildcard_match([], {})
|
|
69
|
+
expectation.should_not be_wildcard_match([Object.new, Object.new], {})
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe "Functional spec" do
|
|
75
|
+
class ArgumentEqualityFunctionalFixture
|
|
76
|
+
attr_reader :arg1, :arg2
|
|
77
|
+
def initialize(arg1, arg2)
|
|
78
|
+
@arg1, @arg2 = arg1, arg2
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def ==(other)
|
|
82
|
+
arg1 == (other.arg1) &&
|
|
83
|
+
arg2 == (other.arg2)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def eql?(other)
|
|
87
|
+
arg1.eql?(other.arg1) &&
|
|
88
|
+
arg2.eql?(other.arg2)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
before(:each) do
|
|
93
|
+
@predicate1 = 'first' # these should be mocks, waiting on rr bug fix
|
|
94
|
+
@predicate2 = 'second'
|
|
95
|
+
@predicate3 = 'third'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
describe "when mock.proxy ==" do
|
|
99
|
+
it "does not have infinite recursion" do
|
|
100
|
+
mock.proxy(@predicate1) == @predicate1
|
|
101
|
+
mock.proxy(@predicate2) == @predicate2
|
|
102
|
+
expect(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2)).to eq ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2)
|
|
103
|
+
|
|
104
|
+
mock.proxy(@predicate1) == @predicate1
|
|
105
|
+
mock.proxy(@predicate2) == @predicate3
|
|
106
|
+
expect(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2)).to_not eq ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate3)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "matches Hashes properly (using ==)" do
|
|
110
|
+
mock.proxy(@predicate1) == {:foo => :bar}
|
|
111
|
+
@predicate1 == {:foo => :bar}
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
describe "when mock.proxy .eql?" do
|
|
116
|
+
it "does not have infinite recursion" do
|
|
117
|
+
mock.proxy(@predicate1).eql? @predicate1
|
|
118
|
+
mock.proxy(@predicate2).eql? @predicate2
|
|
119
|
+
expect(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2)).to be_eql(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2))
|
|
120
|
+
|
|
121
|
+
mock.proxy(@predicate1).eql? @predicate1
|
|
122
|
+
mock.proxy(@predicate2).eql? @predicate3
|
|
123
|
+
ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2).should_not be_eql(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate3))
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "matches Hashes properly (using ==)" do
|
|
127
|
+
mock.proxy(@predicate1).eql?({:foo => :bar})
|
|
128
|
+
@predicate1.eql?({:foo => :bar})
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|