rr 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +4 -0
- data/README +25 -0
- data/Rakefile +1 -1
- data/lib/rr/double.rb +10 -10
- data/lib/rr/double_creator.rb +5 -5
- data/lib/rr/double_injection.rb +7 -7
- data/lib/rr/double_method_proxy.rb +1 -2
- data/lib/rr/space.rb +21 -21
- data/lib/rr/wildcard_matchers/anything.rb +4 -0
- data/lib/rr/wildcard_matchers/boolean.rb +4 -0
- data/lib/rr/wildcard_matchers/duck_type.rb +7 -0
- data/lib/rr/wildcard_matchers/is_a.rb +4 -0
- data/lib/rr/wildcard_matchers/numeric.rb +4 -0
- data/spec/high_level_spec.rb +14 -0
- data/spec/rr/adapters/rr_methods_space_spec.rb +16 -16
- data/spec/rr/double/double_injection_bind_spec.rb +47 -20
- data/spec/rr/double/double_injection_dispatching_spec.rb +26 -20
- data/spec/rr/double/double_injection_has_original_method_spec.rb +10 -11
- data/spec/rr/double/double_injection_register_scenario_spec.rb +6 -6
- data/spec/rr/double/double_injection_reset_spec.rb +11 -14
- data/spec/rr/double/double_injection_spec.rb +18 -12
- data/spec/rr/double/double_injection_verify_spec.rb +5 -5
- data/spec/rr/double_definition_spec.rb +5 -5
- data/spec/rr/double_method_proxy_spec.rb +5 -5
- data/spec/rr/double_spec.rb +48 -48
- data/spec/rr/expectations/anything_spec.rb +14 -0
- data/spec/rr/expectations/boolean_spec.rb +14 -0
- data/spec/rr/expectations/duck_type_spec.rb +14 -0
- data/spec/rr/expectations/is_a_spec.rb +14 -0
- data/spec/rr/expectations/numeric_spec.rb +14 -0
- data/spec/rr/expectations/range_spec.rb +10 -0
- data/spec/rr/expectations/regexp_spec.rb +10 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +3 -3
- data/spec/rr/rspec/rspec_adapter_spec.rb +12 -12
- data/spec/rr/space/space_create_spec.rb +27 -37
- data/spec/rr/space/space_register_spec.rb +3 -3
- data/spec/rr/space/space_reset_spec.rb +24 -24
- data/spec/rr/space/space_spec.rb +2 -2
- data/spec/rr/space/space_verify_spec.rb +18 -18
- metadata +9 -2
@@ -3,27 +3,23 @@ require "spec/spec_helper"
|
|
3
3
|
module RR
|
4
4
|
describe DoubleInjection, "#bind with an existing method" do
|
5
5
|
before do
|
6
|
-
@space = Space.new
|
7
6
|
@object = Object.new
|
8
7
|
@method_name = :foobar
|
9
8
|
def @object.foobar;
|
10
9
|
:original_foobar;
|
11
10
|
end
|
12
|
-
@original_method = @object.method(
|
11
|
+
@original_method = @object.method(@method_name)
|
13
12
|
@object.methods.should include(@method_name.to_s)
|
14
|
-
@
|
13
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
15
14
|
end
|
16
15
|
|
17
|
-
it "overrides the original method with the
|
16
|
+
it "overrides the original method with the double_injection's dispatching methods" do
|
18
17
|
@object.respond_to?(:__rr__foobar).should == false
|
19
|
-
@
|
18
|
+
@double_injection.bind
|
20
19
|
@object.respond_to?(:__rr__foobar).should == true
|
21
20
|
|
22
21
|
rr_foobar_called = false
|
23
|
-
(
|
24
|
-
class << @object;
|
25
|
-
self;
|
26
|
-
end).class_eval do
|
22
|
+
(class << @object; self; end).class_eval do
|
27
23
|
define_method :__rr__foobar do
|
28
24
|
rr_foobar_called = true
|
29
25
|
end
|
@@ -35,7 +31,7 @@ module RR
|
|
35
31
|
end
|
36
32
|
|
37
33
|
it "stores original method in __rr__original_method_name" do
|
38
|
-
@
|
34
|
+
@double_injection.bind
|
39
35
|
@object.respond_to?(:__rr__original_foobar).should == true
|
40
36
|
@object.method(:__rr__original_foobar).should == @original_method
|
41
37
|
end
|
@@ -43,23 +39,19 @@ module RR
|
|
43
39
|
|
44
40
|
describe DoubleInjection, "#bind without an existing method" do
|
45
41
|
before do
|
46
|
-
@space = Space.new
|
47
42
|
@object = Object.new
|
48
43
|
@method_name = :foobar
|
49
44
|
@object.methods.should_not include(@method_name.to_s)
|
50
|
-
@
|
45
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
51
46
|
end
|
52
47
|
|
53
|
-
it "
|
48
|
+
it "creates a new method with the double_injection's dispatching methods" do
|
54
49
|
@object.respond_to?(:__rr__foobar).should == false
|
55
|
-
@
|
50
|
+
@double_injection.bind
|
56
51
|
@object.respond_to?(:__rr__foobar).should == true
|
57
52
|
|
58
53
|
rr_foobar_called = false
|
59
|
-
(
|
60
|
-
class << @object;
|
61
|
-
self;
|
62
|
-
end).class_eval do
|
54
|
+
(class << @object; self; end).class_eval do
|
63
55
|
define_method :__rr__foobar do
|
64
56
|
rr_foobar_called = true
|
65
57
|
end
|
@@ -70,9 +62,44 @@ module RR
|
|
70
62
|
rr_foobar_called.should == true
|
71
63
|
end
|
72
64
|
|
73
|
-
it "
|
74
|
-
@
|
65
|
+
it "does not create method __rr__original_method_name" do
|
66
|
+
@double_injection.bind
|
75
67
|
@object.respond_to?(:__rr__original_foobar).should == false
|
76
68
|
end
|
77
69
|
end
|
70
|
+
|
71
|
+
describe DoubleInjection, "#bind with ==" do
|
72
|
+
before do
|
73
|
+
@object = Object.new
|
74
|
+
@method_name = :'=='
|
75
|
+
@object.should respond_to(@method_name)
|
76
|
+
@original_method = @object.method(@method_name)
|
77
|
+
@object.methods.should include(@method_name.to_s)
|
78
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "overrides the original method with the double_injection's dispatching methods" do
|
82
|
+
@object.respond_to?(:"__rr__#{@method_name}").should == false
|
83
|
+
@double_injection.bind
|
84
|
+
@object.respond_to?(:"__rr__#{@method_name}").should == true
|
85
|
+
|
86
|
+
override_called = false
|
87
|
+
method_name = @method_name
|
88
|
+
(class << @object; self; end).class_eval do
|
89
|
+
define_method :"__rr__#{method_name}" do
|
90
|
+
override_called = true
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
override_called.should == false
|
95
|
+
@object == 1
|
96
|
+
override_called.should == true
|
97
|
+
end
|
98
|
+
|
99
|
+
it "stores original method in __rr__original_method_name" do
|
100
|
+
@double_injection.bind
|
101
|
+
@object.respond_to?(:"__rr__original_#{@method_name}").should == true
|
102
|
+
@object.method(:"__rr__original_#{@method_name}").should == @original_method
|
103
|
+
end
|
104
|
+
end
|
78
105
|
end
|
@@ -6,7 +6,7 @@ module RR
|
|
6
6
|
@space = Space.new
|
7
7
|
@object = Object.new
|
8
8
|
@object.methods.should_not include(method_name.to_s)
|
9
|
-
@
|
9
|
+
@double_injection = @space.double_injection(@object, method_name)
|
10
10
|
end
|
11
11
|
|
12
12
|
describe "normal methods" do
|
@@ -22,7 +22,7 @@ module RR
|
|
22
22
|
yield(a, b)
|
23
23
|
end
|
24
24
|
end
|
25
|
-
double = @space.double(@
|
25
|
+
double = @space.double(@double_injection)
|
26
26
|
double.with(1, 2).implemented_by(method_fixture.method(:method_with_block))
|
27
27
|
@object.foobar(1, 2) {|a, b| [b, a]}.should == [2, 1]
|
28
28
|
end
|
@@ -30,11 +30,11 @@ module RR
|
|
30
30
|
|
31
31
|
describe "where there are no doubles with duplicate ArgumentExpectations" do
|
32
32
|
it "dispatches to Double that have an exact match" do
|
33
|
-
double1_with_exact_match = @space.double(@
|
33
|
+
double1_with_exact_match = @space.double(@double_injection)
|
34
34
|
double1_with_exact_match.with(:exact_match_1).returns {:return_1}
|
35
|
-
double_with_no_match = @space.double(@
|
35
|
+
double_with_no_match = @space.double(@double_injection)
|
36
36
|
double_with_no_match.with("nothing that matches").returns {:no_match}
|
37
|
-
double2_with_exact_match = @space.double(@
|
37
|
+
double2_with_exact_match = @space.double(@double_injection)
|
38
38
|
double2_with_exact_match.with(:exact_match_2).returns {:return_2}
|
39
39
|
|
40
40
|
@object.foobar(:exact_match_1).should == :return_1
|
@@ -42,9 +42,9 @@ module RR
|
|
42
42
|
end
|
43
43
|
|
44
44
|
it "dispatches to Double that have a wildcard match" do
|
45
|
-
double_with_wildcard_match = @space.double(@
|
45
|
+
double_with_wildcard_match = @space.double(@double_injection)
|
46
46
|
double_with_wildcard_match.with_any_args.returns {:wild_card_value}
|
47
|
-
double_with_no_match = @space.double(@
|
47
|
+
double_with_no_match = @space.double(@double_injection)
|
48
48
|
double_with_no_match.with("nothing that matches").returns {:no_match}
|
49
49
|
|
50
50
|
@object.foobar(:wildcard_match_1).should == :wild_card_value
|
@@ -54,18 +54,24 @@ module RR
|
|
54
54
|
|
55
55
|
describe "where there are doubles" do
|
56
56
|
it "raises DoubleNotFoundError error when arguments do not match a double" do
|
57
|
-
double_1 = @space.double(@
|
57
|
+
double_1 = @space.double(@double_injection)
|
58
58
|
double_1.with(1, 2)
|
59
59
|
|
60
|
-
double_2 = @space.double(@
|
60
|
+
double_2 = @space.double(@double_injection)
|
61
61
|
double_2.with(3)
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
63
|
+
error = nil
|
64
|
+
begin
|
65
|
+
@object.foobar(:arg1, :arg2)
|
66
|
+
viotated "Error should have been raised"
|
67
|
+
rescue Errors::DoubleNotFoundError => e
|
68
|
+
error = e
|
69
|
+
end
|
70
|
+
error.message.should include("On object #<Object")
|
71
|
+
expected_double_message_part = "unexpected method invocation foobar(:arg1, :arg2), expected\n" <<
|
72
|
+
"- foobar(1, 2)\n" <<
|
73
|
+
"- foobar(3)"
|
74
|
+
error.message.should include(expected_double_message_part)
|
69
75
|
end
|
70
76
|
end
|
71
77
|
|
@@ -102,7 +108,7 @@ module RR
|
|
102
108
|
end
|
103
109
|
|
104
110
|
def double(*arguments, &return_value)
|
105
|
-
double = @space.double(@
|
111
|
+
double = @space.double(@double_injection)
|
106
112
|
double.with(*arguments).any_number_of_times.returns(&return_value)
|
107
113
|
double.should_not be_terminal
|
108
114
|
double
|
@@ -144,7 +150,7 @@ module RR
|
|
144
150
|
end
|
145
151
|
|
146
152
|
def double(*arguments, &return_value)
|
147
|
-
double = @space.double(@
|
153
|
+
double = @space.double(@double_injection)
|
148
154
|
double.with(*arguments).once.returns(&return_value)
|
149
155
|
double.should be_terminal
|
150
156
|
double
|
@@ -186,7 +192,7 @@ module RR
|
|
186
192
|
end
|
187
193
|
|
188
194
|
def double(&return_value)
|
189
|
-
double = @space.double(@
|
195
|
+
double = @space.double(@double_injection)
|
190
196
|
double.with_any_args.once.returns(&return_value)
|
191
197
|
double.should be_terminal
|
192
198
|
double
|
@@ -200,7 +206,7 @@ module RR
|
|
200
206
|
end
|
201
207
|
|
202
208
|
it "executes the block" do
|
203
|
-
double = @space.double(@
|
209
|
+
double = @space.double(@double_injection)
|
204
210
|
double.with(1, 2) {:return_value}
|
205
211
|
@object.foobar!(1, 2).should == :return_value
|
206
212
|
end
|
@@ -212,7 +218,7 @@ module RR
|
|
212
218
|
end
|
213
219
|
|
214
220
|
it "executes the block" do
|
215
|
-
double = @space.double(@
|
221
|
+
double = @space.double(@double_injection)
|
216
222
|
double.with(1, 2) {:return_value}
|
217
223
|
@object.foobar?(1, 2).should == :return_value
|
218
224
|
end
|
@@ -3,22 +3,21 @@ require "spec/spec_helper"
|
|
3
3
|
module RR
|
4
4
|
describe DoubleInjection, "#object_has_original_method?" do
|
5
5
|
before do
|
6
|
-
@space = Space.new
|
7
6
|
@object = Object.new
|
8
7
|
@method_name = :to_s
|
9
|
-
@
|
10
|
-
class << @
|
8
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
9
|
+
class << @double_injection
|
11
10
|
public :original_method_name
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
15
14
|
it "returns true when method is still in object" do
|
16
|
-
@
|
17
|
-
@
|
15
|
+
@double_injection.bind
|
16
|
+
@double_injection.object_has_original_method?.should be_true
|
18
17
|
end
|
19
18
|
|
20
19
|
it "returns true when respond_to is true and methods include method" do
|
21
|
-
@
|
20
|
+
@double_injection.bind
|
22
21
|
def @object.methods
|
23
22
|
[:__rr_original_to_s]
|
24
23
|
end
|
@@ -26,11 +25,11 @@ module RR
|
|
26
25
|
true
|
27
26
|
end
|
28
27
|
|
29
|
-
@
|
28
|
+
@double_injection.object_has_original_method?.should be_true
|
30
29
|
end
|
31
30
|
|
32
31
|
it "returns true when respond_to is true and methods do not include method" do
|
33
|
-
@
|
32
|
+
@double_injection.bind
|
34
33
|
def @object.methods
|
35
34
|
[]
|
36
35
|
end
|
@@ -38,11 +37,11 @@ module RR
|
|
38
37
|
true
|
39
38
|
end
|
40
39
|
|
41
|
-
@
|
40
|
+
@double_injection.object_has_original_method?.should be_true
|
42
41
|
end
|
43
42
|
|
44
43
|
it "returns false when respond_to is false and methods do not include method" do
|
45
|
-
@
|
44
|
+
@double_injection.bind
|
46
45
|
def @object.methods
|
47
46
|
[]
|
48
47
|
end
|
@@ -50,7 +49,7 @@ module RR
|
|
50
49
|
false
|
51
50
|
end
|
52
51
|
|
53
|
-
@
|
52
|
+
@double_injection.object_has_original_method?.should be_false
|
54
53
|
end
|
55
54
|
end
|
56
55
|
end
|
@@ -7,18 +7,18 @@ module RR
|
|
7
7
|
@object = Object.new
|
8
8
|
@method_name = :foobar
|
9
9
|
@object.methods.should_not include(@method_name.to_s)
|
10
|
-
@
|
11
|
-
def @
|
10
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
11
|
+
def @double_injection.doubles
|
12
12
|
@doubles
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
it "adds the double to the doubles list" do
|
17
|
-
double = Double.new(@space, @
|
17
|
+
double = Double.new(@space, @double_injection, @space.double_definition)
|
18
18
|
|
19
|
-
@
|
20
|
-
@
|
21
|
-
@
|
19
|
+
@double_injection.doubles.should_not include(double)
|
20
|
+
@double_injection.register_double double
|
21
|
+
@double_injection.doubles.should include(double)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -3,10 +3,10 @@ require "spec/spec_helper"
|
|
3
3
|
module RR
|
4
4
|
describe DoubleInjection, "#reset", :shared => true do
|
5
5
|
it "cleans up by removing the __rr__method" do
|
6
|
-
@
|
6
|
+
@double_injection.bind
|
7
7
|
@object.methods.should include("__rr__foobar")
|
8
8
|
|
9
|
-
@
|
9
|
+
@double_injection.reset
|
10
10
|
@object.methods.should_not include("__rr__foobar")
|
11
11
|
end
|
12
12
|
end
|
@@ -15,18 +15,17 @@ module RR
|
|
15
15
|
it_should_behave_like "RR::DoubleInjection#reset"
|
16
16
|
|
17
17
|
before do
|
18
|
-
@space = Space.new
|
19
18
|
@object = Object.new
|
20
19
|
@method_name = :foobar
|
21
20
|
@object.methods.should_not include(@method_name.to_s)
|
22
|
-
@
|
21
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
23
22
|
end
|
24
23
|
|
25
24
|
it "removes the method" do
|
26
|
-
@
|
25
|
+
@double_injection.bind
|
27
26
|
@object.methods.should include(@method_name.to_s)
|
28
27
|
|
29
|
-
@
|
28
|
+
@double_injection.reset
|
30
29
|
@object.methods.should_not include(@method_name.to_s)
|
31
30
|
proc {@object.foobar}.should raise_error(NoMethodError)
|
32
31
|
end
|
@@ -36,7 +35,6 @@ module RR
|
|
36
35
|
it_should_behave_like "RR::DoubleInjection#reset"
|
37
36
|
|
38
37
|
before do
|
39
|
-
@space = Space.new
|
40
38
|
@object = Object.new
|
41
39
|
@method_name = :foobar
|
42
40
|
def @object.foobar
|
@@ -44,14 +42,14 @@ module RR
|
|
44
42
|
end
|
45
43
|
@object.methods.should include(@method_name.to_s)
|
46
44
|
@original_method = @object.method(@method_name)
|
47
|
-
@
|
45
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
48
46
|
|
49
|
-
@
|
47
|
+
@double_injection.bind
|
50
48
|
@object.methods.should include(@method_name.to_s)
|
51
49
|
end
|
52
50
|
|
53
51
|
it "rebind original method" do
|
54
|
-
@
|
52
|
+
@double_injection.reset
|
55
53
|
@object.methods.should include(@method_name.to_s)
|
56
54
|
@object.foobar.should == :original_foobar
|
57
55
|
end
|
@@ -61,7 +59,6 @@ module RR
|
|
61
59
|
it_should_behave_like "RR::DoubleInjection#reset"
|
62
60
|
|
63
61
|
before do
|
64
|
-
@space = Space.new
|
65
62
|
@object = Object.new
|
66
63
|
@method_name = :foobar
|
67
64
|
def @object.foobar
|
@@ -69,14 +66,14 @@ module RR
|
|
69
66
|
end
|
70
67
|
@object.methods.should include(@method_name.to_s)
|
71
68
|
@original_method = @object.method(@method_name)
|
72
|
-
@
|
69
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
73
70
|
|
74
|
-
@
|
71
|
+
@double_injection.bind
|
75
72
|
@object.methods.should include(@method_name.to_s)
|
76
73
|
end
|
77
74
|
|
78
75
|
it "rebinds original method with block" do
|
79
|
-
@
|
76
|
+
@double_injection.reset
|
80
77
|
@object.methods.should include(@method_name.to_s)
|
81
78
|
|
82
79
|
original_argument = nil
|
@@ -3,8 +3,8 @@ require "spec/spec_helper"
|
|
3
3
|
module RR
|
4
4
|
describe DoubleInjection, :shared => true do
|
5
5
|
it "sets up object and method_name" do
|
6
|
-
@
|
7
|
-
@
|
6
|
+
@double_injection.object.should === @object
|
7
|
+
@double_injection.method_name.should == @method_name.to_sym
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
@@ -12,11 +12,10 @@ module RR
|
|
12
12
|
it_should_behave_like "RR::DoubleInjection"
|
13
13
|
|
14
14
|
before do
|
15
|
-
@space = Space.new
|
16
15
|
@object = Object.new
|
17
16
|
@method_name = :foobar
|
18
17
|
@object.methods.should_not include(@method_name.to_s)
|
19
|
-
@
|
18
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
@@ -24,11 +23,10 @@ module RR
|
|
24
23
|
it_should_behave_like "RR::DoubleInjection"
|
25
24
|
|
26
25
|
before do
|
27
|
-
@space = Space.new
|
28
26
|
@object = Object.new
|
29
27
|
@method_name = 'foobar'
|
30
28
|
@object.methods.should_not include(@method_name)
|
31
|
-
@
|
29
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
@@ -36,15 +34,14 @@ module RR
|
|
36
34
|
it_should_behave_like "RR::DoubleInjection"
|
37
35
|
|
38
36
|
before do
|
39
|
-
@space = Space.new
|
40
37
|
@object = Object.new
|
41
38
|
@method_name = :foobar
|
42
39
|
@object.methods.should_not include(@method_name.to_s)
|
43
|
-
@
|
40
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
44
41
|
end
|
45
42
|
|
46
43
|
it "object does not have original method" do
|
47
|
-
@
|
44
|
+
@double_injection.object_has_original_method?.should be_false
|
48
45
|
end
|
49
46
|
end
|
50
47
|
|
@@ -52,15 +49,24 @@ module RR
|
|
52
49
|
it_should_behave_like "RR::DoubleInjection"
|
53
50
|
|
54
51
|
before do
|
55
|
-
@space = Space.new
|
56
52
|
@object = Object.new
|
57
53
|
@method_name = :to_s
|
58
54
|
@object.methods.should include(@method_name.to_s)
|
59
|
-
@
|
55
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
60
56
|
end
|
61
57
|
|
62
58
|
it "has a original_method" do
|
63
|
-
@
|
59
|
+
@double_injection.object_has_original_method?.should be_true
|
64
60
|
end
|
65
61
|
end
|
62
|
+
|
63
|
+
describe DoubleInjection, "#initialize where method_name is ==" do
|
64
|
+
it_should_behave_like "RR::DoubleInjection"
|
65
|
+
|
66
|
+
before do
|
67
|
+
@object = Object.new
|
68
|
+
@method_name = '=='
|
69
|
+
@double_injection = DoubleInjection.new(@object, @method_name)
|
70
|
+
end
|
71
|
+
end
|
66
72
|
end
|