rr 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +1 -0
- data/README +45 -0
- data/Rakefile +60 -0
- data/examples/environment_fixture_setup.rb +7 -0
- data/examples/example_helper.rb +8 -0
- data/examples/example_suite.rb +45 -0
- data/examples/high_level_example.rb +132 -0
- data/examples/rr/do_not_allow_creator_example.rb +90 -0
- data/examples/rr/double_bind_example.rb +32 -0
- data/examples/rr/double_dispatching_example.rb +167 -0
- data/examples/rr/double_example.rb +67 -0
- data/examples/rr/double_register_scenario_example.rb +25 -0
- data/examples/rr/double_reset_example.rb +60 -0
- data/examples/rr/double_verify_example.rb +24 -0
- data/examples/rr/expectations/any_argument_expectation_example.rb +43 -0
- data/examples/rr/expectations/anything_argument_equality_expectation_example.rb +39 -0
- data/examples/rr/expectations/argument_equality_expectation_example.rb +53 -0
- data/examples/rr/expectations/boolean_argument_equality_expectation_example.rb +49 -0
- data/examples/rr/expectations/duck_type_argument_equality_expectation_example.rb +68 -0
- data/examples/rr/expectations/is_a_argument_equality_expectation_example.rb +51 -0
- data/examples/rr/expectations/numeric_argument_equality_expectation_example.rb +47 -0
- data/examples/rr/expectations/range_argument_equality_expectation_example.rb +60 -0
- data/examples/rr/expectations/regexp_argument_equality_expectation_example.rb +68 -0
- data/examples/rr/expectations/times_called_expectation_example.rb +176 -0
- data/examples/rr/extensions/double_methods_example.rb +130 -0
- data/examples/rr/mock_creator_example.rb +65 -0
- data/examples/rr/probe_creator_example.rb +83 -0
- data/examples/rr/rspec/rspec_adapter_example.rb +64 -0
- data/examples/rr/rspec/rspec_usage_example.rb +38 -0
- data/examples/rr/scenario_example.rb +399 -0
- data/examples/rr/space_create_example.rb +185 -0
- data/examples/rr/space_example.rb +30 -0
- data/examples/rr/space_helper.rb +7 -0
- data/examples/rr/space_register_example.rb +33 -0
- data/examples/rr/space_reset_example.rb +73 -0
- data/examples/rr/space_verify_example.rb +146 -0
- data/examples/rr/stub_creator_example.rb +74 -0
- data/examples/rr/test_unit/test_helper.rb +9 -0
- data/examples/rr/test_unit/test_unit_integration_test.rb +39 -0
- data/examples/rspec_example_suite.rb +25 -0
- data/examples/test_unit_example_suite.rb +21 -0
- data/lib/rr.rb +27 -0
- data/lib/rr/adapters/rspec.rb +19 -0
- data/lib/rr/adapters/test_unit.rb +27 -0
- data/lib/rr/do_not_allow_creator.rb +39 -0
- data/lib/rr/double.rb +91 -0
- data/lib/rr/expectations/any_argument_expectation.rb +17 -0
- data/lib/rr/expectations/argument_equality_expectation.rb +35 -0
- data/lib/rr/expectations/times_called_expectation.rb +39 -0
- data/lib/rr/expectations/wildcard_matchers/anything.rb +15 -0
- data/lib/rr/expectations/wildcard_matchers/boolean.rb +20 -0
- data/lib/rr/expectations/wildcard_matchers/duck_type.rb +26 -0
- data/lib/rr/expectations/wildcard_matchers/is_a.rb +22 -0
- data/lib/rr/expectations/wildcard_matchers/numeric.rb +11 -0
- data/lib/rr/expectations/wildcard_matchers/range.rb +7 -0
- data/lib/rr/expectations/wildcard_matchers/regexp.rb +7 -0
- data/lib/rr/extensions/double_methods.rb +81 -0
- data/lib/rr/mock_creator.rb +32 -0
- data/lib/rr/probe_creator.rb +31 -0
- data/lib/rr/scenario.rb +184 -0
- data/lib/rr/scenario_not_found_error.rb +4 -0
- data/lib/rr/scenario_order_error.rb +4 -0
- data/lib/rr/space.rb +111 -0
- data/lib/rr/stub_creator.rb +36 -0
- metadata +113 -0
@@ -0,0 +1,185 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
require "#{dir}/../example_helper"
|
3
|
+
|
4
|
+
module RR
|
5
|
+
describe Space, "#create_mock_creator" do
|
6
|
+
it_should_behave_like "RR::Space"
|
7
|
+
|
8
|
+
before do
|
9
|
+
@space = Space.new
|
10
|
+
@object = Object.new
|
11
|
+
end
|
12
|
+
|
13
|
+
it "creates a MockCreator" do
|
14
|
+
creator = @space.create_mock_creator(@object)
|
15
|
+
creator.foobar(1) {:baz}
|
16
|
+
@object.foobar(1).should == :baz
|
17
|
+
proc {@object.foobar(1)}.should raise_error(Expectations::TimesCalledExpectationError)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "uses block definition when passed a block" do
|
21
|
+
creator = @space.create_mock_creator(@object) do |c|
|
22
|
+
c.foobar(1) {:baz}
|
23
|
+
end
|
24
|
+
@object.foobar(1).should == :baz
|
25
|
+
proc {@object.foobar(1)}.should raise_error(Expectations::TimesCalledExpectationError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe Space, "#create_stub_creator" do
|
30
|
+
it_should_behave_like "RR::Space"
|
31
|
+
|
32
|
+
before do
|
33
|
+
@space = Space.new
|
34
|
+
@object = Object.new
|
35
|
+
@method_name = :foobar
|
36
|
+
end
|
37
|
+
|
38
|
+
it "creates a StubCreator" do
|
39
|
+
creator = @space.create_stub_creator(@object)
|
40
|
+
creator.foobar {:baz}
|
41
|
+
@object.foobar.should == :baz
|
42
|
+
@object.foobar.should == :baz
|
43
|
+
end
|
44
|
+
|
45
|
+
it "uses block definition when passed a block" do
|
46
|
+
creator = @space.create_stub_creator(@object) do |c|
|
47
|
+
c.foobar(1) {:return_value}
|
48
|
+
c.foobar.with_any_args {:default}
|
49
|
+
c.baz(1) {:baz_value}
|
50
|
+
end
|
51
|
+
@object.foobar(1).should == :return_value
|
52
|
+
@object.foobar.should == :default
|
53
|
+
proc {@object.baz.should == :return_value}.should raise_error
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe Space, "#create_probe_creator" do
|
58
|
+
it_should_behave_like "RR::Space"
|
59
|
+
|
60
|
+
before do
|
61
|
+
@space = Space.new
|
62
|
+
@object = Object.new
|
63
|
+
@method_name = :foobar
|
64
|
+
def @object.foobar(*args)
|
65
|
+
:original_foobar
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it "creates a ProbeCreator" do
|
70
|
+
creator = @space.create_probe_creator(@object)
|
71
|
+
creator.foobar(1)
|
72
|
+
@object.foobar(1).should == :original_foobar
|
73
|
+
proc {@object.foobar(1)}.should raise_error(Expectations::TimesCalledExpectationError)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "uses block definition when passed a block" do
|
77
|
+
creator = @space.create_probe_creator(@object) do |c|
|
78
|
+
c.foobar(1)
|
79
|
+
end
|
80
|
+
@object.foobar(1).should == :original_foobar
|
81
|
+
proc {@object.foobar(1)}.should raise_error(Expectations::TimesCalledExpectationError)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe Space, "#create_do_not_allow_creator" do
|
86
|
+
it_should_behave_like "RR::Space"
|
87
|
+
|
88
|
+
before do
|
89
|
+
@space = Space.new
|
90
|
+
@object = Object.new
|
91
|
+
end
|
92
|
+
|
93
|
+
it "creates a MockCreator" do
|
94
|
+
creator = @space.create_do_not_allow_creator(@object)
|
95
|
+
creator.foobar(1)
|
96
|
+
proc {@object.foobar(1)}.should raise_error(Expectations::TimesCalledExpectationError)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "uses block definition when passed a block" do
|
100
|
+
creator = @space.create_do_not_allow_creator(@object) do |c|
|
101
|
+
c.foobar(1)
|
102
|
+
end
|
103
|
+
proc {@object.foobar(1)}.should raise_error(Expectations::TimesCalledExpectationError)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe Space, "#create_scenario" do
|
108
|
+
it_should_behave_like "RR::Space"
|
109
|
+
|
110
|
+
before do
|
111
|
+
@space = Space.new
|
112
|
+
@object = Object.new
|
113
|
+
@method_name = :foobar
|
114
|
+
end
|
115
|
+
|
116
|
+
it "creates a Scenario and registers it to the double" do
|
117
|
+
double = @space.create_double(@object, @method_name)
|
118
|
+
def double.scenarios
|
119
|
+
@scenarios
|
120
|
+
end
|
121
|
+
|
122
|
+
scenario = @space.create_scenario(double)
|
123
|
+
double.scenarios.should include(scenario)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe Space, "#create_double when double does not exist" do
|
128
|
+
it_should_behave_like "RR::Space"
|
129
|
+
|
130
|
+
before do
|
131
|
+
@space = Space.new
|
132
|
+
@object = Object.new
|
133
|
+
def @object.foobar(*args)
|
134
|
+
:original_foobar
|
135
|
+
end
|
136
|
+
@method_name = :foobar
|
137
|
+
end
|
138
|
+
|
139
|
+
it "returns double and adds double to double list when method_name is a symbol" do
|
140
|
+
double = @space.create_double(@object, @method_name)
|
141
|
+
@space.doubles[@object][@method_name].should === double
|
142
|
+
double.space.should === @space
|
143
|
+
double.object.should === @object
|
144
|
+
double.method_name.should === @method_name
|
145
|
+
end
|
146
|
+
|
147
|
+
it "returns double and adds double to double list when method_name is a string" do
|
148
|
+
double = @space.create_double(@object, 'foobar')
|
149
|
+
@space.doubles[@object][@method_name].should === double
|
150
|
+
double.space.should === @space
|
151
|
+
double.object.should === @object
|
152
|
+
double.method_name.should === @method_name
|
153
|
+
end
|
154
|
+
|
155
|
+
it "overrides the method when passing a block" do
|
156
|
+
double = @space.create_double(@object, @method_name)
|
157
|
+
@object.methods.should include("__rr__#{@method_name}__rr__")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe Space, "#create_double when double exists" do
|
162
|
+
it_should_behave_like "RR::Space"
|
163
|
+
|
164
|
+
before do
|
165
|
+
@space = Space.new
|
166
|
+
@object = Object.new
|
167
|
+
def @object.foobar(*args)
|
168
|
+
:original_foobar
|
169
|
+
end
|
170
|
+
@method_name = :foobar
|
171
|
+
end
|
172
|
+
|
173
|
+
it "returns the existing double" do
|
174
|
+
original_foobar_method = @object.method(:foobar)
|
175
|
+
double = @space.create_double(@object, 'foobar')
|
176
|
+
|
177
|
+
double.original_method.should == original_foobar_method
|
178
|
+
|
179
|
+
@space.create_double(@object, 'foobar').should === double
|
180
|
+
|
181
|
+
double.reset
|
182
|
+
@object.foobar.should == :original_foobar
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
require "#{dir}/../example_helper"
|
3
|
+
|
4
|
+
module RR
|
5
|
+
describe Space, " class" do
|
6
|
+
it_should_behave_like "RR::Space"
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@original_space = Space.instance
|
10
|
+
@space = Space.new
|
11
|
+
Space.instance = @space
|
12
|
+
end
|
13
|
+
|
14
|
+
after(:each) do
|
15
|
+
Space.instance = @original_space
|
16
|
+
end
|
17
|
+
|
18
|
+
it "proxies to a singleton instance of Space" do
|
19
|
+
create_double_args = nil
|
20
|
+
(class << @space; self; end).class_eval do
|
21
|
+
define_method :create_double do |*args|
|
22
|
+
create_double_args = args
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Space.create_double(:foo, :bar)
|
27
|
+
create_double_args.should == [:foo, :bar]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
require "#{dir}/../example_helper"
|
3
|
+
|
4
|
+
module RR
|
5
|
+
describe Space, "#register_ordered_scenario" do
|
6
|
+
it_should_behave_like "RR::Space"
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@space = Space.new
|
10
|
+
@original_space = Space.instance
|
11
|
+
Space.instance = @space
|
12
|
+
@object = Object.new
|
13
|
+
@method_name = :foobar
|
14
|
+
@double = @space.create_double(@object, @method_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
after(:each) do
|
18
|
+
Space.instance = @original_space
|
19
|
+
end
|
20
|
+
|
21
|
+
it "adds the ordered scenario to the ordered_scenarios collection" do
|
22
|
+
scenario1 = @space.create_scenario(@double)
|
23
|
+
|
24
|
+
@space.ordered_scenarios.should == []
|
25
|
+
@space.register_ordered_scenario scenario1
|
26
|
+
@space.ordered_scenarios.should == [scenario1]
|
27
|
+
|
28
|
+
scenario2 = @space.create_scenario(@double)
|
29
|
+
@space.register_ordered_scenario scenario2
|
30
|
+
@space.ordered_scenarios.should == [scenario1, scenario2]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
require "#{dir}/../example_helper"
|
3
|
+
|
4
|
+
module RR
|
5
|
+
describe Space, "#reset_double" do
|
6
|
+
it_should_behave_like "RR::Space"
|
7
|
+
|
8
|
+
before do
|
9
|
+
@space = Space.new
|
10
|
+
@object = Object.new
|
11
|
+
@method_name = :foobar
|
12
|
+
end
|
13
|
+
|
14
|
+
it "resets the doubles" do
|
15
|
+
double = @space.create_double(@object, @method_name)
|
16
|
+
@space.doubles[@object][@method_name].should === double
|
17
|
+
@object.methods.should include("__rr__#{@method_name}__rr__")
|
18
|
+
|
19
|
+
@space.reset_double(@object, @method_name)
|
20
|
+
@space.doubles[@object][@method_name].should be_nil
|
21
|
+
@object.methods.should_not include("__rr__#{@method_name}__rr__")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "removes the object from the doubles map when it has no doubles" do
|
25
|
+
double1 = @space.create_double(@object, :foobar1)
|
26
|
+
double2 = @space.create_double(@object, :foobar2)
|
27
|
+
|
28
|
+
@space.doubles.include?(@object).should == true
|
29
|
+
@space.doubles[@object][:foobar1].should_not be_nil
|
30
|
+
@space.doubles[@object][:foobar2].should_not be_nil
|
31
|
+
|
32
|
+
@space.reset_double(@object, :foobar1)
|
33
|
+
@space.doubles.include?(@object).should == true
|
34
|
+
@space.doubles[@object][:foobar1].should be_nil
|
35
|
+
@space.doubles[@object][:foobar2].should_not be_nil
|
36
|
+
|
37
|
+
@space.reset_double(@object, :foobar2)
|
38
|
+
@space.doubles.include?(@object).should == false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe Space, "#reset_doubles" do
|
43
|
+
it_should_behave_like "RR::Space"
|
44
|
+
|
45
|
+
before do
|
46
|
+
@space = Space.new
|
47
|
+
@object1 = Object.new
|
48
|
+
@object2 = Object.new
|
49
|
+
@method_name = :foobar
|
50
|
+
end
|
51
|
+
|
52
|
+
it "resets the double and removes it from the doubles list" do
|
53
|
+
double1 = @space.create_double(@object1, @method_name)
|
54
|
+
double1_reset_calls = 0
|
55
|
+
(class << double1; self; end).class_eval do
|
56
|
+
define_method(:reset) do ||
|
57
|
+
double1_reset_calls += 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
double2 = @space.create_double(@object2, @method_name)
|
61
|
+
double2_reset_calls = 0
|
62
|
+
(class << double2; self; end).class_eval do
|
63
|
+
define_method(:reset) do ||
|
64
|
+
double2_reset_calls += 1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
@space.reset_doubles
|
69
|
+
double1_reset_calls.should == 1
|
70
|
+
double1_reset_calls.should == 1
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
require "#{dir}/../example_helper"
|
3
|
+
|
4
|
+
module RR
|
5
|
+
describe Space, "#verify_doubles" do
|
6
|
+
it_should_behave_like "RR::Space"
|
7
|
+
|
8
|
+
before do
|
9
|
+
@space = Space.new
|
10
|
+
@object1 = Object.new
|
11
|
+
@object2 = Object.new
|
12
|
+
@method_name = :foobar
|
13
|
+
end
|
14
|
+
|
15
|
+
it "verifies and deletes the doubles" do
|
16
|
+
double1 = @space.create_double(@object1, @method_name)
|
17
|
+
double1_verify_calls = 0
|
18
|
+
double1_reset_calls = 0
|
19
|
+
(class << double1; self; end).class_eval do
|
20
|
+
define_method(:verify) do ||
|
21
|
+
double1_verify_calls += 1
|
22
|
+
end
|
23
|
+
define_method(:reset) do ||
|
24
|
+
double1_reset_calls += 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
double2 = @space.create_double(@object2, @method_name)
|
28
|
+
double2_verify_calls = 0
|
29
|
+
double2_reset_calls = 0
|
30
|
+
(class << double2; self; end).class_eval do
|
31
|
+
define_method(:verify) do ||
|
32
|
+
double2_verify_calls += 1
|
33
|
+
end
|
34
|
+
define_method(:reset) do ||
|
35
|
+
double2_reset_calls += 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
@space.verify_doubles
|
40
|
+
double1_verify_calls.should == 1
|
41
|
+
double2_verify_calls.should == 1
|
42
|
+
double1_reset_calls.should == 1
|
43
|
+
double1_reset_calls.should == 1
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe Space, "#verify_double" do
|
48
|
+
it_should_behave_like "RR::Space"
|
49
|
+
|
50
|
+
before do
|
51
|
+
@space = Space.new
|
52
|
+
@object = Object.new
|
53
|
+
@method_name = :foobar
|
54
|
+
end
|
55
|
+
|
56
|
+
it "verifies and deletes the double" do
|
57
|
+
double = @space.create_double(@object, @method_name)
|
58
|
+
@space.doubles[@object][@method_name].should === double
|
59
|
+
@object.methods.should include("__rr__#{@method_name}__rr__")
|
60
|
+
|
61
|
+
verify_calls = 0
|
62
|
+
(class << double; self; end).class_eval do
|
63
|
+
define_method(:verify) do ||
|
64
|
+
verify_calls += 1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
@space.verify_double(@object, @method_name)
|
68
|
+
verify_calls.should == 1
|
69
|
+
|
70
|
+
@space.doubles[@object][@method_name].should be_nil
|
71
|
+
@object.methods.should_not include("__rr__#{@method_name}__rr__")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "deletes the double when verifying the double raises an error" do
|
75
|
+
double = @space.create_double(@object, @method_name)
|
76
|
+
@space.doubles[@object][@method_name].should === double
|
77
|
+
@object.methods.should include("__rr__#{@method_name}__rr__")
|
78
|
+
|
79
|
+
verify_called = true
|
80
|
+
(class << double; self; end).class_eval do
|
81
|
+
define_method(:verify) do ||
|
82
|
+
verify_called = true
|
83
|
+
raise "An Error"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
proc {@space.verify_double(@object, @method_name)}.should raise_error
|
87
|
+
verify_called.should be_true
|
88
|
+
|
89
|
+
@space.doubles[@object][@method_name].should be_nil
|
90
|
+
@object.methods.should_not include("__rr__#{@method_name}__rr__")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe Space, "#verify_ordered_scenario", :shared => true do
|
95
|
+
it_should_behave_like "RR::Space"
|
96
|
+
|
97
|
+
before do
|
98
|
+
@space = Space.new
|
99
|
+
@object = Object.new
|
100
|
+
@method_name = :foobar
|
101
|
+
@double = @space.create_double(@object, @method_name)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe Space, "#verify_ordered_scenario where the passed in scenario is at the front of the queue" do
|
106
|
+
it_should_behave_like "RR::Space#verify_ordered_scenario"
|
107
|
+
|
108
|
+
it "keeps the scenario when times called is not verified" do
|
109
|
+
scenario = @space.create_scenario(@double)
|
110
|
+
@space.register_ordered_scenario(scenario)
|
111
|
+
|
112
|
+
scenario.twice
|
113
|
+
scenario.should_not be_times_called_verified
|
114
|
+
|
115
|
+
@space.verify_ordered_scenario(scenario)
|
116
|
+
@space.ordered_scenarios.should include(scenario)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "removes the scenario when times called in verified" do
|
120
|
+
scenario = @space.create_scenario(@double)
|
121
|
+
@space.register_ordered_scenario(scenario)
|
122
|
+
|
123
|
+
scenario.with(1).once
|
124
|
+
@object.foobar(1)
|
125
|
+
scenario.should be_times_called_verified
|
126
|
+
|
127
|
+
@space.verify_ordered_scenario(scenario)
|
128
|
+
@space.ordered_scenarios.should_not include(scenario)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe Space, "#verify_ordered_scenario where the passed in scenario is not at the front of the queue" do
|
133
|
+
it_should_behave_like "RR::Space#verify_ordered_scenario"
|
134
|
+
|
135
|
+
it "raises error" do
|
136
|
+
first_scenario = @space.create_scenario(@double)
|
137
|
+
@space.register_ordered_scenario(first_scenario)
|
138
|
+
second_scenario = @space.create_scenario(@double)
|
139
|
+
@space.register_ordered_scenario(second_scenario)
|
140
|
+
|
141
|
+
proc do
|
142
|
+
@space.verify_ordered_scenario(second_scenario)
|
143
|
+
end.should raise_error(RR::ScenarioOrderError)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|