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 CHANGED
@@ -1,3 +1,6 @@
1
+ * 0.3.4
2
+ - Implemented instance_of
3
+
1
4
  * 0.3.3
2
5
  - Fixed [#12495] Error Probing method_missing interaction
3
6
 
data/README CHANGED
@@ -59,6 +59,11 @@ renders the partial.
59
59
  html
60
60
  end
61
61
 
62
+ == Instance of Doubles
63
+ Put double scenarios on instances of a Class.
64
+
65
+ mock.instance_of(User).valid? {false}
66
+
62
67
  == Block Syntax
63
68
  script = MyScript.new
64
69
  mock(script) do |m|
data/Rakefile CHANGED
@@ -21,7 +21,7 @@ def run_suite
21
21
  end
22
22
 
23
23
  PKG_NAME = "rr"
24
- PKG_VERSION = "0.3.3"
24
+ PKG_VERSION = "0.3.4"
25
25
  PKG_FILES = FileList[
26
26
  '[A-Z]*',
27
27
  '*.rb',
@@ -14,7 +14,7 @@ describe Double, "#register_scenario" do
14
14
  end
15
15
 
16
16
  it "adds the scenario to the scenarios list" do
17
- scenario = Scenario.new(@space, @double)
17
+ scenario = Scenario.new(@space, @double, @space.scenario_definition)
18
18
 
19
19
  @double.scenarios.should_not include(scenario)
20
20
  @double.register_scenario scenario
@@ -11,7 +11,7 @@ describe Double, "#verify" do
11
11
  end
12
12
 
13
13
  it "verifies each scenario was met" do
14
- scenario = Scenario.new(@space, @double)
14
+ scenario = Scenario.new(@space, @double, @space.scenario_definition)
15
15
  @double.register_scenario scenario
16
16
 
17
17
  scenario.with(1).once.returns {nil}
@@ -3,11 +3,6 @@ require "examples/example_helper"
3
3
  module RR
4
4
  module Expectations
5
5
  describe TimesCalledExpectation, ".new" do
6
- it "doesn't accept both an argument and a block" do
7
- proc do
8
- TimesCalledExpectation.new(2) {|value| value == 2}
9
- end.should raise_error(ArgumentError, "Cannot pass in both an argument and a block")
10
- end
11
6
  end
12
7
  end
13
8
  end
@@ -6,7 +6,8 @@ module Expectations
6
6
  it_should_behave_like "RR::Expectations::TimesCalledExpectation"
7
7
 
8
8
  before do
9
- @expectation = TimesCalledExpectation.new(2)
9
+ @matcher = TimesCalledMatchers::IntegerMatcher.new(2)
10
+ @expectation = TimesCalledExpectation.new(@matcher)
10
11
  @expected_line = __LINE__ - 1
11
12
  end
12
13
  end
@@ -6,12 +6,12 @@ module Expectations
6
6
  it_should_behave_like "RR::Expectations::TimesCalledExpectation"
7
7
 
8
8
  before do
9
- @expectation = TimesCalledExpectation.new {|value| value == 2}
9
+ @matcher = TimesCalledMatchers::ProcMatcher.new(proc {|value| value == 2})
10
+ @expectation = TimesCalledExpectation.new(@matcher)
10
11
  @expected_line = __LINE__ - 1
11
12
  end
12
13
  end
13
14
 
14
-
15
15
  describe TimesCalledExpectation, "#verify" do
16
16
  it_should_behave_like "RR::Expectations::TimesCalledExpectation with ProcMatcher"
17
17
 
@@ -6,7 +6,8 @@ module Expectations
6
6
  it_should_behave_like "RR::Expectations::TimesCalledExpectation"
7
7
 
8
8
  before do
9
- @expectation = TimesCalledExpectation.new(1..2)
9
+ @matcher = TimesCalledMatchers::RangeMatcher.new(1..2)
10
+ @expectation = TimesCalledExpectation.new(@matcher)
10
11
  @expected_line = __LINE__ - 1
11
12
  end
12
13
  end
@@ -41,13 +41,12 @@ module Extensions
41
41
  end
42
42
 
43
43
  def create_scenario_with_method_name(scenario)
44
- method_name = scenario.method_name
45
44
  scenario.with(1, 2) {:baz}
46
45
  scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
47
46
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
48
47
  scenario.argument_expectation.expected_arguments.should == [1, 2]
49
48
 
50
- @subject.__send__(method_name, 1, 2).should == :baz
49
+ @subject.foobar(1, 2).should == :baz
51
50
  end
52
51
 
53
52
  def create_mock_call_chain(creator)
@@ -99,11 +98,10 @@ module Extensions
99
98
  end
100
99
 
101
100
  def create_scenario_with_method_name(scenario)
102
- method_name = scenario.method_name
103
101
  scenario.with(1, 2) {:baz}
104
102
  scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
105
103
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
106
- @subject.__send__(method_name, 1, 2).should == :baz
104
+ @subject.foobar(1, 2).should == :baz
107
105
  end
108
106
 
109
107
  def create_stub_call_chain(creator)
@@ -169,13 +167,12 @@ module Extensions
169
167
  end
170
168
 
171
169
  def create_scenario_with_method_name(scenario)
172
- method_name = scenario.method_name
173
170
  scenario.with(1, 2)
174
171
  scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
175
172
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
176
173
  scenario.argument_expectation.expected_arguments.should == [1, 2]
177
174
 
178
- @subject.__send__(method_name, 1, 2).should == :original_value
175
+ @subject.foobar(1, 2).should == :original_value
179
176
  end
180
177
 
181
178
  def create_mock_probe_call_chain(creator)
@@ -227,7 +224,6 @@ module Extensions
227
224
  end
228
225
 
229
226
  def create_scenario_with_method_name(scenario)
230
- method_name = scenario.method_name
231
227
  scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
232
228
  scenario.argument_expectation.class.should == RR::Expectations::AnyArgumentExpectation
233
229
 
@@ -288,14 +284,13 @@ module Extensions
288
284
  end
289
285
 
290
286
  def create_scenario_with_method_name(scenario)
291
- method_name = scenario.method_name
292
287
  scenario.with(1, 2)
293
288
  scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
294
289
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
295
290
  scenario.argument_expectation.expected_arguments.should == [1, 2]
296
291
 
297
292
  proc do
298
- @subject.__send__(method_name, 1, 2)
293
+ @subject.foobar(1, 2)
299
294
  end.should raise_error(Errors::TimesCalledError)
300
295
  reset
301
296
  nil
@@ -314,5 +309,55 @@ module Extensions
314
309
  nil
315
310
  end
316
311
  end
312
+
313
+ describe ScenarioCreator, "#instance_of and #mock" do
314
+ before do
315
+ @klass = Class.new
316
+ end
317
+
318
+ it "returns a ScenarioCreator when passed no arguments" do
319
+ instance_of.instance_of.should be_instance_of(ScenarioCreator)
320
+ end
321
+
322
+ it "sets up the RR instance_of call chain" do
323
+ should create_instance_of_call_chain(instance_of.mock(@klass))
324
+ end
325
+
326
+ it "#rr_instance_of sets up the RR instance_of call chain" do
327
+ should create_instance_of_call_chain(rr_instance_of.mock(@klass))
328
+ end
329
+
330
+ it "creates a instance_of Scenario for method when passed a second argument" do
331
+ should create_scenario_with_method_name(instance_of.mock(@klass, :foobar))
332
+ end
333
+
334
+ it "creates a instance_of Scenario for method when passed a second argument with rr_instance_of" do
335
+ should create_scenario_with_method_name(rr_instance_of.mock(@klass, :foobar))
336
+ end
337
+
338
+ it "raises error if passed a method name and a block" do
339
+ proc do
340
+ instance_of.mock(@klass, :foobar) {}
341
+ end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
342
+ end
343
+
344
+ def create_scenario_with_method_name(scenario)
345
+ scenario.with(1, 2) {:baz}
346
+ scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
347
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
348
+ scenario.argument_expectation.expected_arguments.should == [1, 2]
349
+
350
+ @klass.new.foobar(1, 2).should == :baz
351
+ end
352
+
353
+ def create_instance_of_call_chain(creator)
354
+ scenario = creator.foobar(1, 2) {:baz}
355
+ scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
356
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
357
+ scenario.argument_expectation.expected_arguments.should == [1, 2]
358
+
359
+ @klass.new.foobar(1, 2).should == :baz
360
+ end
361
+ end
317
362
  end
318
363
  end
@@ -18,12 +18,12 @@ describe ScenarioCreator, " strategy definition", :shared => true do
18
18
 
19
19
  it "returns a ScenarioMethodProxy when passed a subject" do
20
20
  scenario = @creator.__send__(@method_name, @subject).foobar
21
- scenario.should be_instance_of(Scenario)
21
+ scenario.should be_instance_of(ScenarioDefinition)
22
22
  end
23
23
 
24
24
  it "returns a ScenarioMethodProxy when passed Kernel" do
25
25
  scenario = @creator.__send__(@method_name, Kernel).foobar
26
- scenario.should be_instance_of(Scenario)
26
+ scenario.should be_instance_of(ScenarioDefinition)
27
27
  end
28
28
 
29
29
  it "raises error if passed a method name and a block" do
@@ -81,13 +81,12 @@ describe ScenarioCreator, "#mock" do
81
81
  end
82
82
 
83
83
  def create_scenario_with_method_name(scenario)
84
- method_name = scenario.method_name
85
84
  scenario.with(1, 2) {:baz}
86
85
  scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
87
86
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
88
87
  scenario.argument_expectation.expected_arguments.should == [1, 2]
89
88
 
90
- @subject.__send__(method_name, 1, 2).should == :baz
89
+ @subject.foobar(1, 2).should == :baz
91
90
  end
92
91
 
93
92
  def create_mock_call_chain(creator)
@@ -116,11 +115,10 @@ describe ScenarioCreator, "#stub" do
116
115
  end
117
116
 
118
117
  def create_scenario_with_method_name(scenario)
119
- method_name = scenario.method_name
120
118
  scenario.with(1, 2) {:baz}
121
119
  scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
122
120
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
123
- @subject.__send__(method_name, 1, 2).should == :baz
121
+ @subject.foobar(1, 2).should == :baz
124
122
  end
125
123
 
126
124
  def create_stub_call_chain(creator)
@@ -181,14 +179,13 @@ describe ScenarioCreator, "#do_not_call" do
181
179
  end
182
180
 
183
181
  def create_scenario_with_method_name(scenario)
184
- method_name = scenario.method_name
185
182
  scenario.with(1, 2)
186
183
  scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
187
184
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
188
185
  scenario.argument_expectation.expected_arguments.should == [1, 2]
189
186
 
190
187
  proc do
191
- @subject.__send__(method_name, 1, 2)
188
+ @subject.foobar(1, 2)
192
189
  end.should raise_error(Errors::TimesCalledError)
193
190
  reset
194
191
  nil
@@ -248,26 +245,28 @@ end
248
245
  describe ScenarioCreator, "#instance_of" do
249
246
  it_should_behave_like "RR::ScenarioCreator"
250
247
 
251
- it "raises an error when not passed a class" #do
252
- # proc do
253
- # @creator.instance_of(Object.new)
254
- # end.should raise_error(ArgumentError, "instance_of only accepts class objects")
255
- # end
256
-
257
- it "sets up the RR probe call chain" #do
258
- # scenario = @creator.stub.instance_of(Class).foobar(1, 2) {:baz}
259
- # scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
260
- # scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
261
- # Class.new.foobar(1, 2).should == :baz
262
- # end
263
-
264
- it "creates a probe Scenario for method when passed a second argument" #do
265
- # scenario = @creator.stub.instance_of(Class, :foobar)
266
- # scenario.with(1, 2) {:baz}
267
- # scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
268
- # scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
269
- # Class.new.foobar(1, 2).should == :baz
270
- # end
248
+ it "raises an error when not passed a class" do
249
+ proc do
250
+ @creator.instance_of(Object.new)
251
+ end.should raise_error(ArgumentError, "instance_of only accepts class objects")
252
+ end
253
+
254
+ it "sets up the RR probe call chain" do
255
+ klass = Class.new
256
+ scenario = @creator.stub.instance_of(klass).foobar(1, 2) {:baz}
257
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
258
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
259
+ klass.new.foobar(1, 2).should == :baz
260
+ end
261
+
262
+ it "creates a probe Scenario for method when passed a second argument" do
263
+ klass = Class.new
264
+ scenario = @creator.stub.instance_of(klass, :foobar)
265
+ scenario.with(1, 2) {:baz}
266
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
267
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
268
+ klass.new.foobar(1, 2).should == :baz
269
+ end
271
270
  end
272
271
 
273
272
  describe ScenarioCreator, "#create! using no strategy" do
@@ -283,17 +282,8 @@ describe ScenarioCreator, "#create! using no strategy" do
283
282
  end
284
283
  end
285
284
 
286
- describe ScenarioCreator, "#create!", :shared => true do
287
- it_should_behave_like "RR::ScenarioCreator"
288
-
289
- it "initializes creator with passed in object" do
290
- @creator.create!(@subject, :foobar)
291
- @creator.subject.should === @subject
292
- end
293
- end
294
-
295
285
  describe ScenarioCreator, "#create! using mock strategy" do
296
- it_should_behave_like "RR::ScenarioCreator#create!"
286
+ it_should_behave_like "RR::ScenarioCreator"
297
287
 
298
288
  before do
299
289
  @creator.mock
@@ -309,7 +299,7 @@ describe ScenarioCreator, "#create! using mock strategy" do
309
299
  end
310
300
 
311
301
  describe ScenarioCreator, "#create! using stub strategy" do
312
- it_should_behave_like "RR::ScenarioCreator#create!"
302
+ it_should_behave_like "RR::ScenarioCreator"
313
303
 
314
304
  before do
315
305
  @creator.stub
@@ -331,7 +321,7 @@ describe ScenarioCreator, "#create! using stub strategy" do
331
321
  end
332
322
 
333
323
  describe ScenarioCreator, "#create! using do_not_call strategy" do
334
- it_should_behave_like "RR::ScenarioCreator#create!"
324
+ it_should_behave_like "RR::ScenarioCreator"
335
325
 
336
326
  before do
337
327
  @creator.do_not_call
@@ -357,7 +347,7 @@ describe ScenarioCreator, "#create! using do_not_call strategy" do
357
347
  end
358
348
 
359
349
  describe ScenarioCreator, "#create! using mock strategy with probe" do
360
- it_should_behave_like "RR::ScenarioCreator#create!"
350
+ it_should_behave_like "RR::ScenarioCreator"
361
351
 
362
352
  before do
363
353
  @creator.mock
@@ -389,7 +379,7 @@ describe ScenarioCreator, "#create! using mock strategy with probe" do
389
379
  end
390
380
 
391
381
  describe ScenarioCreator, "#create! using stub strategy with probe" do
392
- it_should_behave_like "RR::ScenarioCreator#create!"
382
+ it_should_behave_like "RR::ScenarioCreator"
393
383
 
394
384
  before do
395
385
  @creator.stub
@@ -0,0 +1,503 @@
1
+ require "examples/example_helper"
2
+
3
+ module RR
4
+ describe ScenarioDefinition, :shared => true do
5
+ before do
6
+ @space = Space.new
7
+ @object = Object.new
8
+ def @object.foobar(a, b)
9
+ [b, a]
10
+ end
11
+ @double = @space.double(@object, :foobar)
12
+ @scenario = @space.scenario(@double)
13
+ @definition = @scenario.definition
14
+ end
15
+ end
16
+
17
+ describe ScenarioDefinition, "#with" do
18
+ it_should_behave_like "RR::ScenarioDefinition"
19
+
20
+ it "returns ScenarioDefinition" do
21
+ @definition.with(1).should === @definition
22
+ end
23
+
24
+ it "sets an ArgumentEqualityExpectation" do
25
+ @definition.with(1)
26
+ @definition.should be_exact_match(1)
27
+ @definition.should_not be_exact_match(2)
28
+ end
29
+
30
+ it "sets return value when block passed in" do
31
+ @definition.with(1) {:return_value}
32
+ @object.foobar(1).should == :return_value
33
+ end
34
+ end
35
+
36
+ describe ScenarioDefinition, "#with_any_args" do
37
+ it_should_behave_like "RR::ScenarioDefinition"
38
+
39
+ before do
40
+ @definition.with_any_args {:return_value}
41
+ end
42
+
43
+ it "returns ScenarioDefinition" do
44
+ @definition.with_no_args.should === @definition
45
+ end
46
+
47
+ it "sets an AnyArgumentExpectation" do
48
+ @definition.should_not be_exact_match(1)
49
+ @definition.should be_wildcard_match(1)
50
+ end
51
+
52
+ it "sets return value when block passed in" do
53
+ @object.foobar(:anything).should == :return_value
54
+ end
55
+ end
56
+
57
+ describe ScenarioDefinition, "#with_no_args" do
58
+ it_should_behave_like "RR::ScenarioDefinition"
59
+
60
+ before do
61
+ @definition.with_no_args {:return_value}
62
+ end
63
+
64
+ it "returns ScenarioDefinition" do
65
+ @definition.with_no_args.should === @definition
66
+ end
67
+
68
+ it "sets an ArgumentEqualityExpectation with no arguments" do
69
+ @definition.argument_expectation.should == Expectations::ArgumentEqualityExpectation.new()
70
+ end
71
+
72
+ it "sets return value when block passed in" do
73
+ @object.foobar().should == :return_value
74
+ end
75
+ end
76
+
77
+ describe ScenarioDefinition, "#never" do
78
+ it_should_behave_like "RR::ScenarioDefinition"
79
+
80
+ it "returns ScenarioDefinition" do
81
+ @definition.never.should === @definition
82
+ end
83
+
84
+ it "sets up a Times Called Expectation with 0" do
85
+ @definition.with_any_args
86
+ @definition.never
87
+ proc {@object.foobar}.should raise_error(Errors::TimesCalledError)
88
+ end
89
+
90
+ it "sets return value when block passed in" do
91
+ @definition.with_any_args.never
92
+ proc {@object.foobar}.should raise_error(Errors::TimesCalledError)
93
+ end
94
+ end
95
+
96
+ describe ScenarioDefinition, "#once" do
97
+ it_should_behave_like "RR::ScenarioDefinition"
98
+
99
+ it "returns ScenarioDefinition" do
100
+ @definition.once.should === @definition
101
+ end
102
+
103
+ it "sets up a Times Called Expectation with 1" do
104
+ @definition.once.with_any_args
105
+ @object.foobar
106
+ proc {@object.foobar}.should raise_error(Errors::TimesCalledError)
107
+ end
108
+
109
+ it "sets return value when block passed in" do
110
+ @definition.with_any_args.once {:return_value}
111
+ @object.foobar.should == :return_value
112
+ end
113
+ end
114
+
115
+ describe ScenarioDefinition, "#twice" do
116
+ it_should_behave_like "RR::ScenarioDefinition"
117
+
118
+ it "returns ScenarioDefinition" do
119
+ @definition.twice.should === @definition
120
+ end
121
+
122
+ it "sets up a Times Called Expectation with 2" do
123
+ @definition.twice.with_any_args
124
+ @object.foobar
125
+ @object.foobar
126
+ proc {@object.foobar}.should raise_error(Errors::TimesCalledError)
127
+ end
128
+
129
+ it "sets return value when block passed in" do
130
+ @definition.with_any_args.twice {:return_value}
131
+ @object.foobar.should == :return_value
132
+ end
133
+ end
134
+
135
+ describe ScenarioDefinition, "#at_least" do
136
+ it_should_behave_like "RR::ScenarioDefinition"
137
+
138
+ it "returns ScenarioDefinition" do
139
+ @definition.with_any_args.at_least(2).should === @definition
140
+ end
141
+
142
+ it "sets up a Times Called Expectation with 1" do
143
+ @definition.at_least(2)
144
+ @definition.times_matcher.should == TimesCalledMatchers::AtLeastMatcher.new(2)
145
+ end
146
+
147
+ it "sets return value when block passed in" do
148
+ @definition.with_any_args.at_least(2) {:return_value}
149
+ @object.foobar.should == :return_value
150
+ end
151
+ end
152
+
153
+ describe ScenarioDefinition, "#at_most" do
154
+ it_should_behave_like "RR::ScenarioDefinition"
155
+
156
+ it "returns ScenarioDefinition" do
157
+ @definition.with_any_args.at_most(2).should === @definition
158
+ end
159
+
160
+ it "sets up a Times Called Expectation with 1" do
161
+ @definition.at_most(2).with_any_args
162
+ @object.foobar
163
+ @object.foobar
164
+ proc do
165
+ @object.foobar
166
+ end.should raise_error(
167
+ Errors::TimesCalledError,
168
+ "Called 3 times.\nExpected at most 2 times."
169
+ )
170
+ end
171
+
172
+ it "sets return value when block passed in" do
173
+ @definition.with_any_args.at_most(2) {:return_value}
174
+ @object.foobar.should == :return_value
175
+ end
176
+ end
177
+
178
+ describe ScenarioDefinition, "#times" do
179
+ it_should_behave_like "RR::ScenarioDefinition"
180
+
181
+ it "returns ScenarioDefinition" do
182
+ @definition.times(3).should === @definition
183
+ end
184
+
185
+ it "sets up a Times Called Expectation with passed in times" do
186
+ @definition.times(3).with_any_args
187
+ @object.foobar
188
+ @object.foobar
189
+ @object.foobar
190
+ proc {@object.foobar}.should raise_error(Errors::TimesCalledError)
191
+ end
192
+
193
+ it "sets return value when block passed in" do
194
+ @definition.with_any_args.times(3) {:return_value}
195
+ @object.foobar.should == :return_value
196
+ end
197
+ end
198
+
199
+ describe ScenarioDefinition, "#any_number_of_times" do
200
+ it_should_behave_like "RR::ScenarioDefinition"
201
+
202
+ it "returns ScenarioDefinition" do
203
+ @definition.any_number_of_times.should === @definition
204
+ end
205
+
206
+ it "sets up a Times Called Expectation with AnyTimes matcher" do
207
+ @definition.any_number_of_times
208
+ @definition.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
209
+ end
210
+
211
+ it "sets return value when block passed in" do
212
+ @definition.with_any_args.any_number_of_times {:return_value}
213
+ @object.foobar.should == :return_value
214
+ end
215
+ end
216
+
217
+ describe ScenarioDefinition, "#ordered" do
218
+ it_should_behave_like "RR::ScenarioDefinition"
219
+
220
+ it "adds itself to the ordered scenarios list" do
221
+ @definition.ordered
222
+ @space.ordered_scenarios.should include(@scenario)
223
+ end
224
+
225
+ it "does not double add itself" do
226
+ @definition.ordered
227
+ @definition.ordered
228
+ @space.ordered_scenarios.should == [@scenario]
229
+ end
230
+
231
+ it "sets ordered? to true" do
232
+ @definition.ordered
233
+ @definition.should be_ordered
234
+ end
235
+
236
+ it "sets return value when block passed in" do
237
+ @definition.with_any_args.once.ordered {:return_value}
238
+ @object.foobar.should == :return_value
239
+ end
240
+
241
+ it "raises error when there is no Scenario" do
242
+ @definition.scenario = nil
243
+ proc do
244
+ @definition.ordered
245
+ end.should raise_error(
246
+ Errors::ScenarioDefinitionError,
247
+ "Scenario Definitions must have a dedicated Scenario to be ordered. " <<
248
+ "For example, using instance_of does not allow ordered to be used. " <<
249
+ "probe the class's #new method instead."
250
+ )
251
+ end
252
+ end
253
+
254
+ describe ScenarioDefinition, "#ordered?" do
255
+ it_should_behave_like "RR::ScenarioDefinition"
256
+
257
+ it "defaults to false" do
258
+ @definition.should_not be_ordered
259
+ end
260
+ end
261
+
262
+ describe ScenarioDefinition, "#yields" do
263
+ it_should_behave_like "RR::ScenarioDefinition"
264
+
265
+ it "returns ScenarioDefinition" do
266
+ @definition.yields(:baz).should === @definition
267
+ end
268
+
269
+ it "yields the passed in argument to the call block when there is no returns value set" do
270
+ @definition.with_any_args.yields(:baz)
271
+ passed_in_block_arg = nil
272
+ @object.foobar {|arg| passed_in_block_arg = arg}.should == nil
273
+ passed_in_block_arg.should == :baz
274
+ end
275
+
276
+ it "yields the passed in argument to the call block when there is a no returns value set" do
277
+ @definition.with_any_args.yields(:baz).returns(:return_value)
278
+
279
+ passed_in_block_arg = nil
280
+ @object.foobar {|arg| passed_in_block_arg = arg}.should == :return_value
281
+ passed_in_block_arg.should == :baz
282
+ end
283
+
284
+ it "sets return value when block passed in" do
285
+ @definition.with_any_args.yields {:return_value}
286
+ @object.foobar {}.should == :return_value
287
+ end
288
+ end
289
+
290
+ describe ScenarioDefinition, "#after_call" do
291
+ it_should_behave_like "RR::ScenarioDefinition"
292
+
293
+ it "returns ScenarioDefinition" do
294
+ @definition.after_call {}.should === @definition
295
+ end
296
+
297
+ it "sends return value of Scenario implementation to after_call" do
298
+ return_value = {}
299
+ @definition.with_any_args.returns(return_value).after_call do |value|
300
+ value[:foo] = :bar
301
+ value
302
+ end
303
+
304
+ actual_value = @object.foobar
305
+ actual_value.should === return_value
306
+ actual_value.should == {:foo => :bar}
307
+ end
308
+
309
+ it "receives the return value in the after_call callback" do
310
+ return_value = :returns_value
311
+ @definition.with_any_args.returns(return_value).after_call do |value|
312
+ :after_call_value
313
+ end
314
+
315
+ actual_value = @object.foobar
316
+ actual_value.should == :after_call_value
317
+ end
318
+
319
+ it "allows after_call to mock the return value" do
320
+ return_value = Object.new
321
+ @definition.with_any_args.returns(return_value).after_call do |value|
322
+ mock(value).inner_method(1) {:baz}
323
+ value
324
+ end
325
+
326
+ @object.foobar.inner_method(1).should == :baz
327
+ end
328
+
329
+ it "raises an error when not passed a block" do
330
+ proc do
331
+ @definition.after_call
332
+ end.should raise_error(ArgumentError, "after_call expects a block")
333
+ end
334
+ end
335
+
336
+ describe ScenarioDefinition, "#returns" do
337
+ it_should_behave_like "RR::ScenarioDefinition"
338
+
339
+ it "returns ScenarioDefinition" do
340
+ @definition.returns {:baz}.should === @definition
341
+ @definition.returns(:baz).should === @definition
342
+ end
343
+
344
+ it "sets the value of the method when passed a block" do
345
+ @definition.with_any_args.returns {:baz}
346
+ @object.foobar.should == :baz
347
+ end
348
+
349
+ it "sets the value of the method when passed an argument" do
350
+ @definition.returns(:baz).with_no_args
351
+ @object.foobar.should == :baz
352
+ end
353
+
354
+ it "returns false when passed false" do
355
+ @definition.returns(false).with_any_args
356
+ @object.foobar.should == false
357
+ end
358
+
359
+ it "raises an error when both argument and block is passed in" do
360
+ proc do
361
+ @definition.returns(:baz) {:another}
362
+ end.should raise_error(ArgumentError, "returns cannot accept both an argument and a block")
363
+ end
364
+ end
365
+
366
+ describe ScenarioDefinition, "#implemented_by" do
367
+ it_should_behave_like "RR::ScenarioDefinition"
368
+
369
+ it "returns the ScenarioDefinition" do
370
+ @definition.implemented_by(proc{:baz}).should === @definition
371
+ end
372
+
373
+ it "sets the implementation to the passed in proc" do
374
+ @definition.implemented_by(proc{:baz}).with_no_args
375
+ @object.foobar.should == :baz
376
+ end
377
+
378
+ it "sets the implementation to the passed in method" do
379
+ def @object.foobar(a, b)
380
+ [b, a]
381
+ end
382
+ @definition.implemented_by(@object.method(:foobar))
383
+ @object.foobar(1, 2).should == [2, 1]
384
+ end
385
+ end
386
+
387
+ describe ScenarioDefinition, "#implemented_by_original_method" do
388
+ it_should_behave_like "RR::ScenarioDefinition"
389
+
390
+ it "returns the ScenarioDefinition object" do
391
+ @definition.implemented_by_original_method.should === @definition
392
+ end
393
+
394
+ it "sets the implementation to the original method" do
395
+ @definition.implemented_by_original_method.with_any_args
396
+ @object.foobar(1, 2).should == [2, 1]
397
+ end
398
+
399
+ it "calls method_missing when original_method does not exist" do
400
+ class << @object
401
+ def method_missing(method_name, *args, &block)
402
+ "method_missing for #{method_name}(#{args.inspect})"
403
+ end
404
+ end
405
+ double = @space.double(@object, :does_not_exist)
406
+ scenario = @space.scenario(double)
407
+ scenario.with_any_args
408
+ scenario.implemented_by_original_method
409
+
410
+ return_value = @object.does_not_exist(1, 2)
411
+ return_value.should == "method_missing for does_not_exist([1, 2])"
412
+ end
413
+ end
414
+
415
+ describe ScenarioDefinition, "#exact_match?" do
416
+ it_should_behave_like "RR::ScenarioDefinition"
417
+
418
+ it "returns false when no expectation set" do
419
+ @definition.should_not be_exact_match()
420
+ @definition.should_not be_exact_match(nil)
421
+ @definition.should_not be_exact_match(Object.new)
422
+ @definition.should_not be_exact_match(1, 2, 3)
423
+ end
424
+
425
+ it "returns false when arguments are not an exact match" do
426
+ @definition.with(1, 2, 3)
427
+ @definition.should_not be_exact_match(1, 2)
428
+ @definition.should_not be_exact_match(1)
429
+ @definition.should_not be_exact_match()
430
+ @definition.should_not be_exact_match("does not match")
431
+ end
432
+
433
+ it "returns true when arguments are an exact match" do
434
+ @definition.with(1, 2, 3)
435
+ @definition.should be_exact_match(1, 2, 3)
436
+ end
437
+ end
438
+
439
+ describe ScenarioDefinition, "#wildcard_match?" do
440
+ it_should_behave_like "RR::ScenarioDefinition"
441
+
442
+ it "returns false when no expectation set" do
443
+ @definition.should_not be_wildcard_match()
444
+ @definition.should_not be_wildcard_match(nil)
445
+ @definition.should_not be_wildcard_match(Object.new)
446
+ @definition.should_not be_wildcard_match(1, 2, 3)
447
+ end
448
+
449
+ it "returns true when arguments are an exact match" do
450
+ @definition.with(1, 2, 3)
451
+ @definition.should be_wildcard_match(1, 2, 3)
452
+ @definition.should_not be_wildcard_match(1, 2)
453
+ @definition.should_not be_wildcard_match(1)
454
+ @definition.should_not be_wildcard_match()
455
+ @definition.should_not be_wildcard_match("does not match")
456
+ end
457
+
458
+ it "returns true when with_any_args" do
459
+ @definition.with_any_args
460
+
461
+ @definition.should be_wildcard_match(1, 2, 3)
462
+ @definition.should be_wildcard_match(1, 2)
463
+ @definition.should be_wildcard_match(1)
464
+ @definition.should be_wildcard_match()
465
+ @definition.should be_wildcard_match("does not match")
466
+ end
467
+ end
468
+
469
+ describe ScenarioDefinition, "#terminal?" do
470
+ it_should_behave_like "RR::ScenarioDefinition"
471
+
472
+ it "returns true when times_matcher's terminal? is true" do
473
+ @definition.once
474
+ @definition.times_matcher.should be_terminal
475
+ @definition.should be_terminal
476
+ end
477
+
478
+ it "returns false when times_matcher's terminal? is false" do
479
+ @definition.any_number_of_times
480
+ @definition.times_matcher.should_not be_terminal
481
+ @definition.should_not be_terminal
482
+ end
483
+
484
+ it "returns false when there is not times_matcher" do
485
+ @definition.times_matcher.should be_nil
486
+ @definition.should_not be_terminal
487
+ end
488
+ end
489
+
490
+ describe ScenarioDefinition, "#expected_arguments" do
491
+ it_should_behave_like "RR::ScenarioDefinition"
492
+
493
+ it "returns argument expectation's expected_arguments when there is a argument expectation" do
494
+ @definition.with(1, 2)
495
+ @definition.expected_arguments.should == [1, 2]
496
+ end
497
+
498
+ it "returns an empty array when there is no argument expectation" do
499
+ @definition.argument_expectation.should be_nil
500
+ @definition.expected_arguments.should == []
501
+ end
502
+ end
503
+ end