rr 0.3.3 → 0.3.4
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.
- data/CHANGES +3 -0
- data/README +5 -0
- data/Rakefile +1 -1
- data/examples/rr/double/double_register_scenario_example.rb +1 -1
- data/examples/rr/double/double_verify_example.rb +1 -1
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_example.rb +0 -5
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_integer_example.rb +2 -1
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_proc_example.rb +2 -2
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_range_example.rb +2 -1
- data/examples/rr/extensions/instance_methods_creator_example.rb +54 -9
- data/examples/rr/scenario_creator_example.rb +32 -42
- data/examples/rr/scenario_definition_example.rb +503 -0
- data/examples/rr/scenario_example.rb +48 -32
- data/examples/rr/scenario_method_proxy_example.rb +2 -2
- data/examples/rr/space/space_verify_example.rb +3 -3
- data/lib/rr.rb +4 -0
- data/lib/rr/expectations/times_called_expectation.rb +4 -5
- data/lib/rr/extensions/instance_methods.rb +16 -0
- data/lib/rr/scenario.rb +60 -82
- data/lib/rr/scenario_creator.rb +67 -56
- data/lib/rr/scenario_definition.rb +277 -0
- data/lib/rr/scenario_definition_builder.rb +43 -0
- data/lib/rr/space.rb +7 -2
- metadata +5 -2
@@ -16,8 +16,12 @@ end
|
|
16
16
|
describe Scenario, "#with" do
|
17
17
|
it_should_behave_like "RR::Scenario"
|
18
18
|
|
19
|
+
it "returns ScenarioDefinition" do
|
20
|
+
@scenario.with(1).should === @scenario.definition
|
21
|
+
end
|
22
|
+
|
19
23
|
it "sets an ArgumentEqualityExpectation" do
|
20
|
-
@scenario.with(1)
|
24
|
+
@scenario.with(1)
|
21
25
|
@scenario.should be_exact_match(1)
|
22
26
|
@scenario.should_not be_exact_match(2)
|
23
27
|
end
|
@@ -35,8 +39,8 @@ describe Scenario, "#with_any_args" do
|
|
35
39
|
@scenario.with_any_args {:return_value}
|
36
40
|
end
|
37
41
|
|
38
|
-
it "returns
|
39
|
-
@scenario.with_no_args.should === @scenario
|
42
|
+
it "returns ScenarioDefinition" do
|
43
|
+
@scenario.with_no_args.should === @scenario.definition
|
40
44
|
end
|
41
45
|
|
42
46
|
it "sets an AnyArgumentExpectation" do
|
@@ -56,8 +60,8 @@ describe Scenario, "#with_no_args" do
|
|
56
60
|
@scenario.with_no_args {:return_value}
|
57
61
|
end
|
58
62
|
|
59
|
-
it "returns
|
60
|
-
@scenario.with_no_args.should === @scenario
|
63
|
+
it "returns ScenarioDefinition" do
|
64
|
+
@scenario.with_no_args.should === @scenario.definition
|
61
65
|
end
|
62
66
|
|
63
67
|
it "sets an ArgumentEqualityExpectation with no arguments" do
|
@@ -72,8 +76,8 @@ end
|
|
72
76
|
describe Scenario, "#never" do
|
73
77
|
it_should_behave_like "RR::Scenario"
|
74
78
|
|
75
|
-
it "returns
|
76
|
-
@scenario.never.should === @scenario
|
79
|
+
it "returns ScenarioDefinition" do
|
80
|
+
@scenario.never.should === @scenario.definition
|
77
81
|
end
|
78
82
|
|
79
83
|
it "sets up a Times Called Expectation with 0" do
|
@@ -90,8 +94,12 @@ end
|
|
90
94
|
describe Scenario, "#once" do
|
91
95
|
it_should_behave_like "RR::Scenario"
|
92
96
|
|
97
|
+
it "returns ScenarioDefinition" do
|
98
|
+
@scenario.once.should === @scenario.definition
|
99
|
+
end
|
100
|
+
|
93
101
|
it "sets up a Times Called Expectation with 1" do
|
94
|
-
@scenario.once
|
102
|
+
@scenario.once
|
95
103
|
@scenario.call(@double)
|
96
104
|
proc {@scenario.call(@double)}.should raise_error(Errors::TimesCalledError)
|
97
105
|
end
|
@@ -105,8 +113,12 @@ end
|
|
105
113
|
describe Scenario, "#twice" do
|
106
114
|
it_should_behave_like "RR::Scenario"
|
107
115
|
|
116
|
+
it "returns ScenarioDefinition" do
|
117
|
+
@scenario.twice.should === @scenario.definition
|
118
|
+
end
|
119
|
+
|
108
120
|
it "sets up a Times Called Expectation with 2" do
|
109
|
-
@scenario.twice
|
121
|
+
@scenario.twice
|
110
122
|
@scenario.call(@double)
|
111
123
|
@scenario.call(@double)
|
112
124
|
proc {@scenario.call(@double)}.should raise_error(Errors::TimesCalledError)
|
@@ -121,13 +133,13 @@ end
|
|
121
133
|
describe Scenario, "#at_least" do
|
122
134
|
it_should_behave_like "RR::Scenario"
|
123
135
|
|
124
|
-
it "returns
|
125
|
-
@scenario.with_any_args.at_least(2).should === @scenario
|
136
|
+
it "returns ScenarioDefinition" do
|
137
|
+
@scenario.with_any_args.at_least(2).should === @scenario.definition
|
126
138
|
end
|
127
139
|
|
128
|
-
it "sets up a
|
140
|
+
it "sets up a AtLeastMatcher with 2" do
|
129
141
|
@scenario.at_least(2)
|
130
|
-
@scenario.times_matcher.should == TimesCalledMatchers::AtLeastMatcher.new(2)
|
142
|
+
@scenario.definition.times_matcher.should == TimesCalledMatchers::AtLeastMatcher.new(2)
|
131
143
|
end
|
132
144
|
|
133
145
|
it "sets return value when block passed in" do
|
@@ -139,8 +151,8 @@ end
|
|
139
151
|
describe Scenario, "#at_most" do
|
140
152
|
it_should_behave_like "RR::Scenario"
|
141
153
|
|
142
|
-
it "returns
|
143
|
-
@scenario.with_any_args.at_most(2).should === @scenario
|
154
|
+
it "returns ScenarioDefinition" do
|
155
|
+
@scenario.with_any_args.at_most(2).should === @scenario.definition
|
144
156
|
end
|
145
157
|
|
146
158
|
it "sets up a Times Called Expectation with 1" do
|
@@ -164,8 +176,12 @@ end
|
|
164
176
|
describe Scenario, "#times" do
|
165
177
|
it_should_behave_like "RR::Scenario"
|
166
178
|
|
179
|
+
it "returns ScenarioDefinition" do
|
180
|
+
@scenario.times(3).should === @scenario.definition
|
181
|
+
end
|
182
|
+
|
167
183
|
it "sets up a Times Called Expectation with passed in times" do
|
168
|
-
@scenario.times(3)
|
184
|
+
@scenario.times(3)
|
169
185
|
@scenario.call(@double)
|
170
186
|
@scenario.call(@double)
|
171
187
|
@scenario.call(@double)
|
@@ -181,8 +197,8 @@ end
|
|
181
197
|
describe Scenario, "#any_number_of_times" do
|
182
198
|
it_should_behave_like "RR::Scenario"
|
183
199
|
|
184
|
-
it "returns
|
185
|
-
@scenario.any_number_of_times.should === @scenario
|
200
|
+
it "returns ScenarioDefinition" do
|
201
|
+
@scenario.any_number_of_times.should === @scenario.definition
|
186
202
|
end
|
187
203
|
|
188
204
|
it "sets up a Times Called Expectation with AnyTimes matcher" do
|
@@ -232,8 +248,8 @@ end
|
|
232
248
|
describe Scenario, "#yields" do
|
233
249
|
it_should_behave_like "RR::Scenario"
|
234
250
|
|
235
|
-
it "returns
|
236
|
-
@scenario.yields(:baz).should === @scenario
|
251
|
+
it "returns ScenarioDefinition" do
|
252
|
+
@scenario.yields(:baz).should === @scenario.definition
|
237
253
|
end
|
238
254
|
|
239
255
|
it "yields the passed in argument to the call block when there is no returns value set" do
|
@@ -260,8 +276,8 @@ end
|
|
260
276
|
describe Scenario, "#after_call" do
|
261
277
|
it_should_behave_like "RR::Scenario"
|
262
278
|
|
263
|
-
it "returns
|
264
|
-
@scenario.after_call {}.should === @scenario
|
279
|
+
it "returns ScenarioDefinition" do
|
280
|
+
@scenario.after_call {}.should === @scenario.definition
|
265
281
|
end
|
266
282
|
|
267
283
|
it "sends return value of Scenario implementation to after_call" do
|
@@ -306,9 +322,9 @@ end
|
|
306
322
|
describe Scenario, "#returns" do
|
307
323
|
it_should_behave_like "RR::Scenario"
|
308
324
|
|
309
|
-
it "returns
|
310
|
-
@scenario.returns {:baz}.should === @scenario
|
311
|
-
@scenario.returns(:baz).should === @scenario
|
325
|
+
it "returns ScenarioDefinition" do
|
326
|
+
@scenario.returns {:baz}.should === @scenario.definition
|
327
|
+
@scenario.returns(:baz).should === @scenario.definition
|
312
328
|
end
|
313
329
|
|
314
330
|
it "sets the value of the method when passed a block" do
|
@@ -336,8 +352,8 @@ end
|
|
336
352
|
describe Scenario, "#implemented_by" do
|
337
353
|
it_should_behave_like "RR::Scenario"
|
338
354
|
|
339
|
-
it "returns the
|
340
|
-
@scenario.implemented_by(proc{:baz}).should === @scenario
|
355
|
+
it "returns the ScenarioDefinition" do
|
356
|
+
@scenario.implemented_by(proc{:baz}).should === @scenario.definition
|
341
357
|
end
|
342
358
|
|
343
359
|
it "sets the implementation to the passed in proc" do
|
@@ -357,8 +373,8 @@ end
|
|
357
373
|
describe Scenario, "#implemented_by_original_method" do
|
358
374
|
it_should_behave_like "RR::Scenario"
|
359
375
|
|
360
|
-
it "returns the
|
361
|
-
@scenario.implemented_by_original_method.should === @scenario
|
376
|
+
it "returns the ScenarioDefinition object" do
|
377
|
+
@scenario.implemented_by_original_method.should === @scenario.definition
|
362
378
|
end
|
363
379
|
|
364
380
|
it "sets the implementation to the original method" do
|
@@ -573,7 +589,7 @@ describe Scenario, "#attempt?" do
|
|
573
589
|
|
574
590
|
it "returns true when there is no Times Called expectation" do
|
575
591
|
@scenario.with(1, 2, 3)
|
576
|
-
@scenario.
|
592
|
+
@scenario.definition.times_matcher.should be_nil
|
577
593
|
@scenario.should be_attempt
|
578
594
|
end
|
579
595
|
end
|
@@ -616,8 +632,8 @@ describe Scenario, "#terminal?" do
|
|
616
632
|
@scenario.should_not be_terminal
|
617
633
|
end
|
618
634
|
|
619
|
-
it "returns false when there is
|
620
|
-
@scenario.
|
635
|
+
it "returns false when there is no times_matcher" do
|
636
|
+
@scenario.definition.times_matcher.should be_nil
|
621
637
|
@scenario.should_not be_terminal
|
622
638
|
end
|
623
639
|
end
|
@@ -32,7 +32,7 @@ describe ScenarioMethodProxy, ".new without block" do
|
|
32
32
|
proxy_subclass.instance_methods.should include('i_should_be_a_scenario')
|
33
33
|
|
34
34
|
proxy = proxy_subclass.new(@space, @creator, @subject)
|
35
|
-
proxy.i_should_be_a_scenario.should be_instance_of(
|
35
|
+
proxy.i_should_be_a_scenario.should be_instance_of(ScenarioDefinition)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -63,7 +63,7 @@ describe ScenarioMethodProxy, ".new with block" do
|
|
63
63
|
proxy_subclass.instance_methods.should include('i_should_be_a_scenario')
|
64
64
|
|
65
65
|
proxy_subclass.new(@space, @creator, @subject) do |m|
|
66
|
-
m.i_should_be_a_scenario.should be_instance_of(
|
66
|
+
m.i_should_be_a_scenario.should be_instance_of(ScenarioDefinition)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -161,9 +161,9 @@ describe Space, "#verify_ordered_scenario where the passed in scenario is not at
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def scenario
|
164
|
-
|
165
|
-
@space.register_ordered_scenario(scenario)
|
166
|
-
scenario
|
164
|
+
scenario_definition = @space.scenario(@double).once
|
165
|
+
@space.register_ordered_scenario(scenario_definition.scenario)
|
166
|
+
scenario_definition.scenario
|
167
167
|
end
|
168
168
|
end
|
169
169
|
end
|
data/lib/rr.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
1
3
|
require "rr/errors/rr_error"
|
2
4
|
require "rr/errors/scenario_definition_error"
|
3
5
|
require "rr/errors/scenario_not_found_error"
|
@@ -14,6 +16,8 @@ require "rr/scenario_method_proxy"
|
|
14
16
|
require "rr/scenario_creator"
|
15
17
|
|
16
18
|
require "rr/scenario"
|
19
|
+
require "rr/scenario_definition"
|
20
|
+
require "rr/scenario_definition_builder"
|
17
21
|
require "rr/scenario_matches"
|
18
22
|
|
19
23
|
require "rr/expectations/argument_equality_expectation"
|
@@ -1,12 +1,11 @@
|
|
1
1
|
module RR
|
2
2
|
module Expectations
|
3
3
|
class TimesCalledExpectation
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :times_called
|
5
|
+
attr_accessor :matcher
|
5
6
|
|
6
|
-
def initialize(matcher=nil
|
7
|
-
|
8
|
-
matcher_value = matcher || time_condition_block
|
9
|
-
@matcher = TimesCalledMatchers::TimesCalledMatcher.create(matcher_value)
|
7
|
+
def initialize(matcher=nil)
|
8
|
+
@matcher = matcher
|
10
9
|
@times_called = 0
|
11
10
|
@verify_backtrace = caller[1..-1]
|
12
11
|
end
|
@@ -153,6 +153,22 @@ module Extensions
|
|
153
153
|
alias_method :do_not_allow, :do_not_call
|
154
154
|
alias_method :dont_allow, :do_not_call
|
155
155
|
|
156
|
+
# Calling instance_of will cause all instances of the passed in Class
|
157
|
+
# to have the Scenario defined.
|
158
|
+
#
|
159
|
+
# The following example mocks all User's valid? method and return false.
|
160
|
+
# mock.instance_of(User).valid? {false}
|
161
|
+
#
|
162
|
+
# The following example mocks and probes User#projects and returns the
|
163
|
+
# first 3 projects.
|
164
|
+
# mock.instance_of(User).projects do |projects|
|
165
|
+
# projects[0..2]
|
166
|
+
# end
|
167
|
+
def instance_of(subject=ScenarioCreator::NO_SUBJECT_ARG, method_name=nil, &definition)
|
168
|
+
creator = RR::Space.scenario_creator
|
169
|
+
creator.instance_of(subject, method_name, &definition)
|
170
|
+
end
|
171
|
+
|
156
172
|
# Returns a AnyTimesMatcher. This is meant to be passed in as an argument
|
157
173
|
# to Scenario#times.
|
158
174
|
#
|
data/lib/rr/scenario.rb
CHANGED
@@ -15,19 +15,15 @@ module RR
|
|
15
15
|
end.join("\n")
|
16
16
|
end
|
17
17
|
end
|
18
|
-
ORIGINAL_METHOD = Object.new
|
19
18
|
|
20
|
-
attr_reader :times_called, :
|
19
|
+
attr_reader :times_called, :double, :definition
|
21
20
|
|
22
|
-
def initialize(space, double)
|
21
|
+
def initialize(space, double, definition)
|
23
22
|
@space = space
|
24
23
|
@double = double
|
25
|
-
@
|
26
|
-
@argument_expectation = nil
|
27
|
-
@times_called_expectation = nil
|
24
|
+
@definition = definition
|
28
25
|
@times_called = 0
|
29
|
-
@
|
30
|
-
@yields = nil
|
26
|
+
@times_called_expectation = Expectations::TimesCalledExpectation.new
|
31
27
|
end
|
32
28
|
|
33
29
|
# Scenario#with sets the expectation that the Scenario will receive
|
@@ -37,9 +33,7 @@ module RR
|
|
37
33
|
#
|
38
34
|
# mock(subject).method_name.with(1, 2) {:return_value}
|
39
35
|
def with(*args, &returns)
|
40
|
-
|
41
|
-
returns(&returns) if returns
|
42
|
-
self
|
36
|
+
definition.with(*args, &returns)
|
43
37
|
end
|
44
38
|
|
45
39
|
# Scenario#with_any_args sets the expectation that the Scenario can receive
|
@@ -49,9 +43,7 @@ module RR
|
|
49
43
|
#
|
50
44
|
# mock(subject).method_name.with_any_args {:return_value}
|
51
45
|
def with_any_args(&returns)
|
52
|
-
|
53
|
-
returns(&returns) if returns
|
54
|
-
self
|
46
|
+
definition.with_any_args(&returns)
|
55
47
|
end
|
56
48
|
|
57
49
|
# Scenario#with_no_args sets the expectation that the Scenario will receive
|
@@ -61,9 +53,7 @@ module RR
|
|
61
53
|
#
|
62
54
|
# mock(subject).method_name.with_no_args {:return_value}
|
63
55
|
def with_no_args(&returns)
|
64
|
-
|
65
|
-
returns(&returns) if returns
|
66
|
-
self
|
56
|
+
definition.with_no_args(&returns)
|
67
57
|
end
|
68
58
|
|
69
59
|
# Scenario#never sets the expectation that the Scenario will never be
|
@@ -73,8 +63,7 @@ module RR
|
|
73
63
|
#
|
74
64
|
# mock(subject).method_name.never
|
75
65
|
def never
|
76
|
-
|
77
|
-
self
|
66
|
+
definition.never
|
78
67
|
end
|
79
68
|
|
80
69
|
# Scenario#once sets the expectation that the Scenario will be called
|
@@ -84,9 +73,7 @@ module RR
|
|
84
73
|
#
|
85
74
|
# mock(subject).method_name.once {:return_value}
|
86
75
|
def once(&returns)
|
87
|
-
|
88
|
-
returns(&returns) if returns
|
89
|
-
self
|
76
|
+
definition.once(&returns)
|
90
77
|
end
|
91
78
|
|
92
79
|
# Scenario#twice sets the expectation that the Scenario will be called
|
@@ -96,9 +83,7 @@ module RR
|
|
96
83
|
#
|
97
84
|
# mock(subject).method_name.twice {:return_value}
|
98
85
|
def twice(&returns)
|
99
|
-
|
100
|
-
returns(&returns) if returns
|
101
|
-
self
|
86
|
+
definition.twice(&returns)
|
102
87
|
end
|
103
88
|
|
104
89
|
# Scenario#at_least sets the expectation that the Scenario
|
@@ -109,10 +94,7 @@ module RR
|
|
109
94
|
#
|
110
95
|
# mock(subject).method_name.at_least(4) {:return_value}
|
111
96
|
def at_least(number, &returns)
|
112
|
-
|
113
|
-
@times_called_expectation = Expectations::TimesCalledExpectation.new(matcher)
|
114
|
-
returns(&returns) if returns
|
115
|
-
self
|
97
|
+
definition.at_least(number, &returns)
|
116
98
|
end
|
117
99
|
|
118
100
|
# Scenario#at_most allows sets the expectation that the Scenario
|
@@ -123,10 +105,7 @@ module RR
|
|
123
105
|
#
|
124
106
|
# mock(subject).method_name.at_most(4) {:return_value}
|
125
107
|
def at_most(number, &returns)
|
126
|
-
|
127
|
-
@times_called_expectation = Expectations::TimesCalledExpectation.new(matcher)
|
128
|
-
returns(&returns) if returns
|
129
|
-
self
|
108
|
+
definition.at_most(number, &returns)
|
130
109
|
end
|
131
110
|
|
132
111
|
# Scenario#any_number_of_times sets an that the Scenario will be called
|
@@ -137,9 +116,7 @@ module RR
|
|
137
116
|
#
|
138
117
|
# mock(subject).method_name.any_number_of_times
|
139
118
|
def any_number_of_times(&returns)
|
140
|
-
|
141
|
-
returns(&returns) if returns
|
142
|
-
self
|
119
|
+
definition.any_number_of_times(&returns)
|
143
120
|
end
|
144
121
|
|
145
122
|
# Scenario#times creates an TimesCalledExpectation of the passed
|
@@ -149,9 +126,7 @@ module RR
|
|
149
126
|
#
|
150
127
|
# mock(subject).method_name.times(4) {:return_value}
|
151
128
|
def times(number, &returns)
|
152
|
-
|
153
|
-
returns(&returns) if returns
|
154
|
-
self
|
129
|
+
definition.times(number, &returns)
|
155
130
|
end
|
156
131
|
|
157
132
|
# Scenario#ordered sets the Scenario to have an ordered
|
@@ -161,17 +136,14 @@ module RR
|
|
161
136
|
#
|
162
137
|
# mock(subject).method_name.ordered {return_value}
|
163
138
|
def ordered(&returns)
|
164
|
-
|
165
|
-
@space.ordered_scenarios << self unless @space.ordered_scenarios.include?(self)
|
166
|
-
returns(&returns) if returns
|
167
|
-
self
|
139
|
+
definition.ordered(&returns)
|
168
140
|
end
|
169
141
|
|
170
142
|
# Scenario#ordered? returns true when the Scenario is ordered.
|
171
143
|
#
|
172
144
|
# mock(subject).method_name.ordered?
|
173
145
|
def ordered?
|
174
|
-
|
146
|
+
definition.ordered?
|
175
147
|
end
|
176
148
|
|
177
149
|
# Scenario#yields sets the Scenario to invoke a passed in block when
|
@@ -184,9 +156,7 @@ module RR
|
|
184
156
|
# mock(subject).method_name.yields(yield_arg1, yield_arg2) {return_value}
|
185
157
|
# subject.method_name {|yield_arg1, yield_arg2|}
|
186
158
|
def yields(*args, &returns)
|
187
|
-
|
188
|
-
returns(&returns) if returns
|
189
|
-
self
|
159
|
+
definition.yields(*args, &returns)
|
190
160
|
end
|
191
161
|
|
192
162
|
# Scenario#after_call creates a callback that occurs after call
|
@@ -200,9 +170,7 @@ module RR
|
|
200
170
|
# This feature is built into probes.
|
201
171
|
# probe(User).find('1') {|user| mock(user).valid? {false}}
|
202
172
|
def after_call(&block)
|
203
|
-
|
204
|
-
@after_call = block
|
205
|
-
self
|
173
|
+
definition.after_call &block
|
206
174
|
end
|
207
175
|
|
208
176
|
# Scenario#returns accepts an argument value or a block.
|
@@ -213,14 +181,7 @@ module RR
|
|
213
181
|
#
|
214
182
|
# Passing in an argument causes Scenario to return the argument.
|
215
183
|
def returns(value=nil, &implementation)
|
216
|
-
|
217
|
-
raise ArgumentError, "returns cannot accept both an argument and a block"
|
218
|
-
end
|
219
|
-
if value.nil?
|
220
|
-
implemented_by implementation
|
221
|
-
else
|
222
|
-
implemented_by proc {value}
|
223
|
-
end
|
184
|
+
definition.returns(value, &implementation)
|
224
185
|
end
|
225
186
|
|
226
187
|
# Scenario#implemented_by sets the implementation of the Scenario.
|
@@ -233,8 +194,7 @@ module RR
|
|
233
194
|
# end
|
234
195
|
# mock(obj).method_name.implemented_by(obj.method(:foobar))
|
235
196
|
def implemented_by(implementation)
|
236
|
-
|
237
|
-
self
|
197
|
+
definition.implemented_by implementation
|
238
198
|
end
|
239
199
|
|
240
200
|
# Scenario#implemented_by_original_method sets the implementation
|
@@ -248,8 +208,7 @@ module RR
|
|
248
208
|
# mock(obj).method_name.implemented_by_original_method
|
249
209
|
# obj.foobar {|arg| puts arg} # puts 1
|
250
210
|
def implemented_by_original_method
|
251
|
-
|
252
|
-
self
|
211
|
+
definition.implemented_by_original_method
|
253
212
|
end
|
254
213
|
|
255
214
|
# Scenario#call calls the Scenario's implementation. The return
|
@@ -258,28 +217,28 @@ module RR
|
|
258
217
|
# A TimesCalledError is raised when the times called
|
259
218
|
# exceeds the expected TimesCalledExpectation.
|
260
219
|
def call(double, *args, &block)
|
261
|
-
|
220
|
+
self.times_called_expectation.attempt! if definition.times_matcher
|
262
221
|
@space.verify_ordered_scenario(self) if ordered?
|
263
222
|
yields!(block)
|
264
223
|
return_value = call_implementation(double, *args, &block)
|
265
|
-
return return_value unless
|
266
|
-
|
224
|
+
return return_value unless definition.after_call_value
|
225
|
+
definition.after_call_value.call(return_value)
|
267
226
|
end
|
268
227
|
|
269
228
|
def yields!(block)
|
270
|
-
if
|
229
|
+
if definition.yields_value
|
271
230
|
unless block
|
272
231
|
raise ArgumentError, "A Block must be passed into the method call when using yields"
|
273
232
|
end
|
274
|
-
block.call(
|
233
|
+
block.call(*definition.yields_value)
|
275
234
|
end
|
276
235
|
end
|
277
236
|
protected :yields!
|
278
237
|
|
279
238
|
def call_implementation(double, *args, &block)
|
280
|
-
return nil unless
|
239
|
+
return nil unless implementation
|
281
240
|
|
282
|
-
if
|
241
|
+
if implementation === ScenarioDefinition::ORIGINAL_METHOD
|
283
242
|
if double.original_method
|
284
243
|
return double.original_method.call(*args, &block)
|
285
244
|
else
|
@@ -292,11 +251,11 @@ module RR
|
|
292
251
|
end
|
293
252
|
end
|
294
253
|
|
295
|
-
if
|
296
|
-
return
|
254
|
+
if implementation.is_a?(Method)
|
255
|
+
return implementation.call(*args, &block)
|
297
256
|
else
|
298
257
|
args << block if block
|
299
|
-
return
|
258
|
+
return implementation.call(*args)
|
300
259
|
end
|
301
260
|
end
|
302
261
|
protected :call_implementation
|
@@ -304,36 +263,34 @@ module RR
|
|
304
263
|
# Scenario#exact_match? returns true when the passed in arguments
|
305
264
|
# exactly match the ArgumentEqualityExpectation arguments.
|
306
265
|
def exact_match?(*arguments)
|
307
|
-
|
308
|
-
@argument_expectation.exact_match?(*arguments)
|
266
|
+
definition.exact_match?(*arguments)
|
309
267
|
end
|
310
268
|
|
311
269
|
# Scenario#wildcard_match? returns true when the passed in arguments
|
312
270
|
# wildcard match the ArgumentEqualityExpectation arguments.
|
313
271
|
def wildcard_match?(*arguments)
|
314
|
-
|
315
|
-
@argument_expectation.wildcard_match?(*arguments)
|
272
|
+
definition.wildcard_match?(*arguments)
|
316
273
|
end
|
317
274
|
|
318
275
|
# Scenario#attempt? returns true when the
|
319
276
|
# TimesCalledExpectation is satisfied.
|
320
277
|
def attempt?
|
321
|
-
return true unless
|
322
|
-
|
278
|
+
return true unless definition.times_matcher
|
279
|
+
times_called_expectation.attempt?
|
323
280
|
end
|
324
281
|
|
325
282
|
# Scenario#verify verifies the the TimesCalledExpectation
|
326
283
|
# is satisfied for this scenario. A TimesCalledError
|
327
284
|
# is raised if the TimesCalledExpectation is not met.
|
328
285
|
def verify
|
329
|
-
return true unless
|
330
|
-
|
286
|
+
return true unless definition.times_matcher
|
287
|
+
times_called_expectation.verify!
|
331
288
|
true
|
332
289
|
end
|
333
290
|
|
334
291
|
def terminal?
|
335
|
-
return false unless
|
336
|
-
|
292
|
+
return false unless definition.times_matcher
|
293
|
+
times_called_expectation.terminal?
|
337
294
|
end
|
338
295
|
|
339
296
|
# The method name that this Scenario is attatched to
|
@@ -351,5 +308,26 @@ module RR
|
|
351
308
|
def times_matcher
|
352
309
|
times_called_expectation.matcher
|
353
310
|
end
|
311
|
+
|
312
|
+
def times_called_expectation
|
313
|
+
@times_called_expectation.matcher = definition.times_matcher
|
314
|
+
@times_called_expectation
|
315
|
+
end
|
316
|
+
|
317
|
+
def implementation
|
318
|
+
definition.implementation
|
319
|
+
end
|
320
|
+
def implementation=(value)
|
321
|
+
definition.implementation = value
|
322
|
+
end
|
323
|
+
protected :implementation=
|
324
|
+
|
325
|
+
def argument_expectation
|
326
|
+
definition.argument_expectation
|
327
|
+
end
|
328
|
+
def argument_expectation=(value)
|
329
|
+
definition.argument_expectation = value
|
330
|
+
end
|
331
|
+
protected :argument_expectation=
|
354
332
|
end
|
355
333
|
end
|