jferris-rr 0.7.1.0.1239654108

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. data/CHANGES +196 -0
  2. data/README.rdoc +329 -0
  3. data/Rakefile +77 -0
  4. data/lib/rr.rb +84 -0
  5. data/lib/rr/adapters/rr_methods.rb +122 -0
  6. data/lib/rr/adapters/rspec.rb +58 -0
  7. data/lib/rr/adapters/test_unit.rb +29 -0
  8. data/lib/rr/double.rb +212 -0
  9. data/lib/rr/double_definitions/child_double_definition_creator.rb +27 -0
  10. data/lib/rr/double_definitions/double_definition.rb +346 -0
  11. data/lib/rr/double_definitions/double_definition_creator.rb +167 -0
  12. data/lib/rr/double_definitions/double_definition_creator_proxy.rb +37 -0
  13. data/lib/rr/double_definitions/strategies/implementation/implementation_strategy.rb +15 -0
  14. data/lib/rr/double_definitions/strategies/implementation/proxy.rb +62 -0
  15. data/lib/rr/double_definitions/strategies/implementation/reimplementation.rb +14 -0
  16. data/lib/rr/double_definitions/strategies/implementation/strongly_typed_reimplementation.rb +17 -0
  17. data/lib/rr/double_definitions/strategies/scope/instance.rb +15 -0
  18. data/lib/rr/double_definitions/strategies/scope/instance_of_class.rb +46 -0
  19. data/lib/rr/double_definitions/strategies/scope/scope_strategy.rb +15 -0
  20. data/lib/rr/double_definitions/strategies/strategy.rb +70 -0
  21. data/lib/rr/double_definitions/strategies/verification/dont_allow.rb +34 -0
  22. data/lib/rr/double_definitions/strategies/verification/mock.rb +44 -0
  23. data/lib/rr/double_definitions/strategies/verification/stub.rb +45 -0
  24. data/lib/rr/double_definitions/strategies/verification/verification_strategy.rb +15 -0
  25. data/lib/rr/double_injection.rb +143 -0
  26. data/lib/rr/double_matches.rb +51 -0
  27. data/lib/rr/errors/argument_equality_error.rb +6 -0
  28. data/lib/rr/errors/double_definition_error.rb +6 -0
  29. data/lib/rr/errors/double_not_found_error.rb +6 -0
  30. data/lib/rr/errors/double_order_error.rb +6 -0
  31. data/lib/rr/errors/rr_error.rb +20 -0
  32. data/lib/rr/errors/spy_verification_errors/double_injection_not_found_error.rb +8 -0
  33. data/lib/rr/errors/spy_verification_errors/invocation_count_error.rb +8 -0
  34. data/lib/rr/errors/spy_verification_errors/spy_verification_error.rb +8 -0
  35. data/lib/rr/errors/subject_does_not_implement_method_error.rb +6 -0
  36. data/lib/rr/errors/subject_has_different_arity_error.rb +6 -0
  37. data/lib/rr/errors/times_called_error.rb +6 -0
  38. data/lib/rr/expectations/any_argument_expectation.rb +21 -0
  39. data/lib/rr/expectations/argument_equality_expectation.rb +41 -0
  40. data/lib/rr/expectations/times_called_expectation.rb +57 -0
  41. data/lib/rr/hash_with_object_id_key.rb +41 -0
  42. data/lib/rr/recorded_calls.rb +103 -0
  43. data/lib/rr/space.rb +123 -0
  44. data/lib/rr/spy_verification.rb +48 -0
  45. data/lib/rr/spy_verification_proxy.rb +18 -0
  46. data/lib/rr/times_called_matchers/any_times_matcher.rb +18 -0
  47. data/lib/rr/times_called_matchers/at_least_matcher.rb +15 -0
  48. data/lib/rr/times_called_matchers/at_most_matcher.rb +23 -0
  49. data/lib/rr/times_called_matchers/integer_matcher.rb +19 -0
  50. data/lib/rr/times_called_matchers/non_terminal.rb +27 -0
  51. data/lib/rr/times_called_matchers/proc_matcher.rb +11 -0
  52. data/lib/rr/times_called_matchers/range_matcher.rb +21 -0
  53. data/lib/rr/times_called_matchers/terminal.rb +20 -0
  54. data/lib/rr/times_called_matchers/times_called_matcher.rb +44 -0
  55. data/lib/rr/wildcard_matchers/anything.rb +18 -0
  56. data/lib/rr/wildcard_matchers/boolean.rb +23 -0
  57. data/lib/rr/wildcard_matchers/duck_type.rb +32 -0
  58. data/lib/rr/wildcard_matchers/hash_including.rb +29 -0
  59. data/lib/rr/wildcard_matchers/is_a.rb +25 -0
  60. data/lib/rr/wildcard_matchers/numeric.rb +13 -0
  61. data/lib/rr/wildcard_matchers/range.rb +7 -0
  62. data/lib/rr/wildcard_matchers/regexp.rb +7 -0
  63. data/lib/rr/wildcard_matchers/satisfy.rb +26 -0
  64. data/spec/core_spec_suite.rb +19 -0
  65. data/spec/environment_fixture_setup.rb +6 -0
  66. data/spec/high_level_spec.rb +368 -0
  67. data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +67 -0
  68. data/spec/rr/adapters/rr_methods_creator_spec.rb +149 -0
  69. data/spec/rr/adapters/rr_methods_space_spec.rb +115 -0
  70. data/spec/rr/adapters/rr_methods_spec_helper.rb +11 -0
  71. data/spec/rr/adapters/rr_methods_times_matcher_spec.rb +17 -0
  72. data/spec/rr/double_definitions/child_double_definition_creator_spec.rb +112 -0
  73. data/spec/rr/double_definitions/double_definition_creator_proxy_spec.rb +155 -0
  74. data/spec/rr/double_definitions/double_definition_creator_spec.rb +502 -0
  75. data/spec/rr/double_definitions/double_definition_spec.rb +1159 -0
  76. data/spec/rr/double_injection/double_injection_bind_spec.rb +111 -0
  77. data/spec/rr/double_injection/double_injection_dispatching_spec.rb +244 -0
  78. data/spec/rr/double_injection/double_injection_has_original_method_spec.rb +55 -0
  79. data/spec/rr/double_injection/double_injection_reset_spec.rb +90 -0
  80. data/spec/rr/double_injection/double_injection_spec.rb +77 -0
  81. data/spec/rr/double_injection/double_injection_verify_spec.rb +29 -0
  82. data/spec/rr/double_spec.rb +352 -0
  83. data/spec/rr/errors/rr_error_spec.rb +67 -0
  84. data/spec/rr/expectations/any_argument_expectation_spec.rb +47 -0
  85. data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +14 -0
  86. data/spec/rr/expectations/argument_equality_expectation_spec.rb +135 -0
  87. data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +34 -0
  88. data/spec/rr/expectations/hash_including_argument_equality_expectation_spec.rb +82 -0
  89. data/spec/rr/expectations/hash_including_spec.rb +17 -0
  90. data/spec/rr/expectations/satisfy_argument_equality_expectation_spec.rb +59 -0
  91. data/spec/rr/expectations/satisfy_spec.rb +14 -0
  92. data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +46 -0
  93. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +69 -0
  94. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +71 -0
  95. data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +23 -0
  96. data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +104 -0
  97. data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +81 -0
  98. data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +83 -0
  99. data/spec/rr/expectations/times_called_expectation/times_called_expectation_spec.rb +38 -0
  100. data/spec/rr/rspec/invocation_matcher_spec.rb +279 -0
  101. data/spec/rr/rspec/rspec_adapter_spec.rb +66 -0
  102. data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +31 -0
  103. data/spec/rr/rspec/rspec_backtrace_tweaking_spec_fixture.rb +11 -0
  104. data/spec/rr/rspec/rspec_usage_spec.rb +86 -0
  105. data/spec/rr/space/hash_with_object_id_key_spec.rb +88 -0
  106. data/spec/rr/space/space_spec.rb +542 -0
  107. data/spec/rr/test_unit/test_helper.rb +7 -0
  108. data/spec/rr/test_unit/test_unit_backtrace_test.rb +35 -0
  109. data/spec/rr/test_unit/test_unit_integration_test.rb +57 -0
  110. data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +47 -0
  111. data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +55 -0
  112. data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +70 -0
  113. data/spec/rr/times_called_matchers/integer_matcher_spec.rb +70 -0
  114. data/spec/rr/times_called_matchers/proc_matcher_spec.rb +55 -0
  115. data/spec/rr/times_called_matchers/range_matcher_spec.rb +76 -0
  116. data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +118 -0
  117. data/spec/rr/wildcard_matchers/anything_spec.rb +24 -0
  118. data/spec/rr/wildcard_matchers/boolean_spec.rb +36 -0
  119. data/spec/rr/wildcard_matchers/duck_type_spec.rb +52 -0
  120. data/spec/rr/wildcard_matchers/is_a_spec.rb +32 -0
  121. data/spec/rr/wildcard_matchers/numeric_spec.rb +32 -0
  122. data/spec/rr/wildcard_matchers/range_spec.rb +35 -0
  123. data/spec/rr/wildcard_matchers/regexp_spec.rb +43 -0
  124. data/spec/rr_spec.rb +28 -0
  125. data/spec/rspec_spec_suite.rb +16 -0
  126. data/spec/spec_helper.rb +107 -0
  127. data/spec/spec_suite.rb +27 -0
  128. data/spec/spy_verification_spec.rb +129 -0
  129. data/spec/test_unit_spec_suite.rb +21 -0
  130. metadata +187 -0
@@ -0,0 +1,1159 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module DoubleDefinitions
5
+ describe DoubleDefinition do
6
+ attr_reader :subject, :double_definition_creator, :double, :definition
7
+
8
+ it_should_behave_like "Swapped Space"
9
+
10
+ before do
11
+ @subject = Object.new
12
+ add_original_method
13
+ @double_definition_creator = DoubleDefinitionCreator.new
14
+ @definition = double_definition_creator.stub(subject).foobar
15
+ @double = definition.double
16
+ end
17
+
18
+ def add_original_method
19
+ def subject.foobar(a, b)
20
+ :original_return_value
21
+ end
22
+ end
23
+
24
+ describe "#root_subject" do
25
+ it "returns #double_definition_creator.root_subject" do
26
+ definition.root_subject.should == definition.double_definition_creator.root_subject
27
+ definition.root_subject.should == subject
28
+ end
29
+ end
30
+
31
+ describe "DefinitionConstructionMethods" do
32
+ macro("DoubleDefinition where #double_definition_creator is a Reimplementation") do
33
+ before do
34
+ definition.double_definition_creator.implementation_strategy.class.should == Strategies::Implementation::Reimplementation
35
+ call_double_injection
36
+ end
37
+ end
38
+
39
+ macro("DoubleDefinition where #double_definition_creator is a Proxy") do
40
+ before do
41
+ definition.double_definition_creator.proxy
42
+ definition.double_definition_creator.implementation_strategy.class.should == Strategies::Implementation::Proxy
43
+ call_double_injection
44
+ end
45
+ end
46
+
47
+ describe "#with" do
48
+ macro("#with") do
49
+ it "returns DoubleDefinition" do
50
+ definition.with(1).should === definition
51
+ end
52
+
53
+ it "sets an ArgumentEqualityExpectation" do
54
+ definition.should be_exact_match(1, 2)
55
+ definition.should_not be_exact_match(2)
56
+ end
57
+ end
58
+
59
+ context "when not passed a block" do
60
+ before do
61
+ definition.with(1, 2)
62
+ subject.foobar(1, 2)
63
+ end
64
+
65
+ send "#with"
66
+ end
67
+
68
+ context "when passed a block" do
69
+ def call_double_injection
70
+ actual_args = nil
71
+ definition.with(1, 2) do |*args|
72
+ actual_args = args
73
+ :new_return_value
74
+ end
75
+ subject.foobar(1, 2)
76
+ @return_value = subject.foobar(1, 2)
77
+ @args = actual_args
78
+ end
79
+
80
+ context "when #double_definition_creator.implementation_strategy is a Reimplementation" do
81
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
82
+ send "#with"
83
+
84
+ describe "#subject.method_name being called" do
85
+ it "returns the return value of the block" do
86
+ @return_value.should == :new_return_value
87
+ @args.should == [1, 2]
88
+ end
89
+ end
90
+ end
91
+
92
+ context "when #double_definition_creator.implementation_strategy is a Proxy" do
93
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
94
+ send "#with"
95
+
96
+ describe "#subject.method_name being called" do
97
+ it "returns the return value of the block" do
98
+ @return_value.should == :new_return_value
99
+ @args.should == [:original_return_value]
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "#with_any_args" do
107
+ macro "#with_any_args" do
108
+ it "returns DoubleDefinition" do
109
+ definition.with_no_args.should === definition
110
+ end
111
+
112
+ it "sets an AnyArgumentExpectation" do
113
+ definition.should_not be_exact_match(1)
114
+ definition.should be_wildcard_match(1)
115
+ end
116
+ end
117
+
118
+ context "when not passed a block" do
119
+ before do
120
+ definition.with_any_args
121
+ end
122
+
123
+ send "#with_any_args"
124
+ end
125
+
126
+ context "when passed a block" do
127
+ def call_double_injection
128
+ actual_args = nil
129
+ definition.with_any_args do |*args|
130
+ actual_args = args
131
+ :new_return_value
132
+ end
133
+ @return_value = subject.foobar(1, 2)
134
+ @args = actual_args
135
+ end
136
+
137
+ context "when #double_definition_creator.implementation_strategy is a Reimplementation" do
138
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
139
+ send "#with_any_args"
140
+
141
+ describe "#subject.method_name being called" do
142
+ it "returns the return value of the block" do
143
+ @return_value.should == :new_return_value
144
+ @args.should == [1, 2]
145
+ end
146
+ end
147
+ end
148
+
149
+ context "when #double_definition_creator.implementation_strategy is a Proxy" do
150
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
151
+ send "#with_any_args"
152
+
153
+ describe "#subject.method_name being called" do
154
+ it "returns the return value of the block" do
155
+ @return_value.should == :new_return_value
156
+ @args.should == [:original_return_value]
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ describe "#with_no_args" do
164
+ macro "#with_no_args" do
165
+ it "returns DoubleDefinition" do
166
+ definition.with_no_args.should === definition
167
+ end
168
+
169
+ it "sets an ArgumentEqualityExpectation with no arguments" do
170
+ definition.argument_expectation.should == Expectations::ArgumentEqualityExpectation.new()
171
+ end
172
+ end
173
+
174
+ def add_original_method
175
+ def subject.foobar()
176
+ :original_return_value
177
+ end
178
+ end
179
+
180
+ context "when not passed a block" do
181
+ before do
182
+ definition.with_no_args
183
+ end
184
+
185
+ send "#with_no_args"
186
+ end
187
+
188
+ context "when passed a block" do
189
+ def call_double_injection
190
+ actual_args = nil
191
+ definition.with_no_args do |*args|
192
+ actual_args = args
193
+ :new_return_value
194
+ end
195
+ @return_value = subject.foobar
196
+ @args = actual_args
197
+ end
198
+
199
+ context "when #double_definition_creator.implementation_strategy is a Reimplementation" do
200
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
201
+ send "#with_no_args"
202
+
203
+ describe "#subject.method_name being called" do
204
+ it "returns the return value of the block" do
205
+ @return_value.should == :new_return_value
206
+ @args.should == []
207
+ end
208
+ end
209
+ end
210
+
211
+ context "when #double_definition_creator.implementation_strategy is a Proxy" do
212
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
213
+ send "#with_no_args"
214
+
215
+ describe "#subject.method_name being called" do
216
+ it "returns the return value of the block" do
217
+ @return_value.should == :new_return_value
218
+ @args.should == [:original_return_value]
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+
225
+ describe "#never" do
226
+ it "returns DoubleDefinition" do
227
+ definition.never.should === definition
228
+ end
229
+
230
+ it "sets up a Times Called Expectation with 0" do
231
+ definition.with_any_args
232
+ definition.never
233
+ lambda {subject.foobar}.should raise_error(Errors::TimesCalledError)
234
+ end
235
+
236
+ describe "#subject.method_name being called" do
237
+ it "raises a TimesCalledError" do
238
+ definition.with_any_args.never
239
+ lambda {subject.foobar}.should raise_error(Errors::TimesCalledError)
240
+ end
241
+ end
242
+ end
243
+
244
+ describe "#once" do
245
+ macro "#once" do
246
+ it "returns DoubleDefinition" do
247
+ definition.once.should === definition
248
+ end
249
+
250
+ it "sets up a Times Called Expectation with 1" do
251
+ lambda {subject.foobar}.should raise_error(Errors::TimesCalledError)
252
+ end
253
+ end
254
+
255
+ context "when not passed a block" do
256
+ before do
257
+ definition.with_any_args.once
258
+ subject.foobar(1, 2)
259
+ end
260
+
261
+ send "#once"
262
+ end
263
+
264
+ context "when passed a block" do
265
+ def call_double_injection
266
+ actual_args = nil
267
+ definition.with_any_args.once do |*args|
268
+ actual_args = args
269
+ :new_return_value
270
+ end
271
+ @return_value = subject.foobar(1, 2)
272
+ @args = actual_args
273
+ end
274
+
275
+ context "with returns block_callback_strategy" do
276
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
277
+ send "#once"
278
+
279
+ describe "#subject.method_name being called with any arguments" do
280
+ it "returns the return value of the block" do
281
+ @return_value.should == :new_return_value
282
+ @args.should == [1, 2]
283
+ end
284
+ end
285
+ end
286
+
287
+ context "with after_call block_callback_strategy" do
288
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
289
+ send "#once"
290
+
291
+ describe "#subject.method_name being called with any arguments" do
292
+ it "returns the return value of the block" do
293
+ @return_value.should == :new_return_value
294
+ @args.should == [:original_return_value]
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end
300
+
301
+ describe "#twice" do
302
+ macro "#twice" do
303
+ it "returns DoubleDefinition" do
304
+ definition.twice.should === definition
305
+ end
306
+
307
+ it "sets up a Times Called Expectation with 2" do
308
+ definition.twice.with_any_args
309
+ lambda {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
310
+ end
311
+ end
312
+
313
+ context "when not passed a block" do
314
+ before do
315
+ definition.with_any_args.twice
316
+ subject.foobar(1, 2)
317
+ subject.foobar(1, 2)
318
+ end
319
+
320
+ send "#twice"
321
+ end
322
+
323
+ context "when passed a block" do
324
+ def call_double_injection
325
+ actual_args = nil
326
+ definition.with_any_args.twice do |*args|
327
+ actual_args = args
328
+ :new_return_value
329
+ end
330
+ subject.foobar(1, 2)
331
+ @return_value = subject.foobar(1, 2)
332
+ @args = actual_args
333
+ end
334
+
335
+ context "with returns block_callback_strategy" do
336
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
337
+ send "#twice"
338
+
339
+ describe "#subject.method_name being called" do
340
+ it "returns the return value of the block" do
341
+ @return_value.should == :new_return_value
342
+ @args.should == [1, 2]
343
+ end
344
+ end
345
+ end
346
+
347
+ context "with after_call block_callback_strategy" do
348
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
349
+ send "#twice"
350
+
351
+ describe "#subject.method_name being called" do
352
+ it "returns the return value of the block" do
353
+ @return_value.should == :new_return_value
354
+ @args.should == [:original_return_value]
355
+ end
356
+ end
357
+ end
358
+ end
359
+ end
360
+
361
+ describe "#at_least" do
362
+ macro "#at_least" do
363
+ it "returns DoubleDefinition" do
364
+ definition.with_any_args.at_least(2).should === definition
365
+ end
366
+
367
+ it "sets up a Times Called Expectation with 1" do
368
+ definition.times_matcher.should == TimesCalledMatchers::AtLeastMatcher.new(2)
369
+ end
370
+ end
371
+
372
+ context "when not passed a block" do
373
+ before do
374
+ definition.with_any_args.at_least(2)
375
+ subject.foobar(1, 2)
376
+ end
377
+
378
+ send "#at_least"
379
+ end
380
+
381
+ context "when passed a block" do
382
+ def call_double_injection
383
+ actual_args = nil
384
+ definition.with_any_args.at_least(2) do |*args|
385
+ actual_args = args
386
+ :new_return_value
387
+ end
388
+ subject.foobar(1, 2)
389
+ @return_value = subject.foobar(1, 2)
390
+ @args = actual_args
391
+ end
392
+
393
+ context "with returns block_callback_strategy" do
394
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
395
+ send "#at_least"
396
+
397
+ describe "#subject.method_name being called" do
398
+ it "returns the return value of the block" do
399
+ @return_value.should == :new_return_value
400
+ @args.should == [1, 2]
401
+ end
402
+ end
403
+ end
404
+
405
+ context "with after_call block_callback_strategy" do
406
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
407
+ send "#at_least"
408
+
409
+ describe "#subject.method_name being called" do
410
+ it "returns the return value of the block" do
411
+ @return_value.should == :new_return_value
412
+ @args.should == [:original_return_value]
413
+ end
414
+ end
415
+ end
416
+ end
417
+ end
418
+
419
+ describe "#at_most" do
420
+ macro "#at_most" do
421
+ it "returns DoubleDefinition" do
422
+ definition.with_any_args.at_most(2).should === definition
423
+ end
424
+
425
+ it "sets up a Times Called Expectation with 1" do
426
+ lambda do
427
+ subject.foobar
428
+ end.should raise_error(Errors::TimesCalledError, "foobar()\nCalled 3 times.\nExpected at most 2 times.")
429
+ end
430
+ end
431
+
432
+ context "when not passed a block" do
433
+ before do
434
+ definition.with_any_args.at_most(2)
435
+ subject.foobar(1, 2)
436
+ subject.foobar(1, 2)
437
+ end
438
+
439
+ send "#at_most"
440
+ end
441
+
442
+ context "when passed a block" do
443
+ def call_double_injection
444
+ actual_args = nil
445
+ definition.with_any_args.at_most(2) do |*args|
446
+ actual_args = args
447
+ :new_return_value
448
+ end
449
+ subject.foobar(1, 2)
450
+ @return_value = subject.foobar(1, 2)
451
+ @args = actual_args
452
+ end
453
+
454
+ context "with returns block_callback_strategy" do
455
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
456
+ send "#at_most"
457
+
458
+ describe "#subject.method_name being called" do
459
+ it "returns the return value of the block" do
460
+ @return_value.should == :new_return_value
461
+ @args.should == [1, 2]
462
+ end
463
+ end
464
+ end
465
+
466
+ context "with after_call block_callback_strategy" do
467
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
468
+ send "#at_most"
469
+
470
+ describe "#subject.method_name being called" do
471
+ it "returns the return value of the block" do
472
+ @return_value.should == :new_return_value
473
+ @args.should == [:original_return_value]
474
+ end
475
+ end
476
+ end
477
+ end
478
+ end
479
+
480
+ describe "#times" do
481
+ macro "#times" do
482
+ it "returns DoubleDefinition" do
483
+ definition.times(3).should === definition
484
+ end
485
+
486
+ it "sets up a Times Called Expectation with passed in times" do
487
+ lambda {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
488
+ end
489
+ end
490
+
491
+ context "when not passed a block" do
492
+ before do
493
+ definition.with(1, 2).times(3)
494
+ subject.foobar(1, 2)
495
+ subject.foobar(1, 2)
496
+ subject.foobar(1, 2)
497
+ end
498
+
499
+ send "#times"
500
+ end
501
+
502
+ context "when passed a block" do
503
+ def call_double_injection
504
+ actual_args = nil
505
+ definition.with(1, 2).times(3) do |*args|
506
+ actual_args = args
507
+ :new_return_value
508
+ end
509
+ subject.foobar(1, 2)
510
+ subject.foobar(1, 2)
511
+ @return_value = subject.foobar(1, 2)
512
+ @args = actual_args
513
+ end
514
+
515
+ context "with returns block_callback_strategy" do
516
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
517
+ send "#times"
518
+
519
+ describe "#subject.method_name being called" do
520
+ it "returns the return value of the block" do
521
+ @return_value.should == :new_return_value
522
+ @args.should == [1, 2]
523
+ end
524
+ end
525
+ end
526
+
527
+ context "with after_call block_callback_strategy" do
528
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
529
+ send "#times"
530
+
531
+ describe "#subject.method_name being called" do
532
+ it "returns the return value of the block" do
533
+ @return_value.should == :new_return_value
534
+ @args.should == [:original_return_value]
535
+ end
536
+ end
537
+ end
538
+ end
539
+ end
540
+
541
+ describe "#any_number_of_times" do
542
+ macro "#any_number_of_times" do
543
+ it "returns DoubleDefinition" do
544
+ definition.any_number_of_times.should === definition
545
+ end
546
+
547
+ it "sets up a Times Called Expectation with AnyTimes matcher" do
548
+ definition.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
549
+ end
550
+ end
551
+
552
+ context "when not passed a block" do
553
+ before do
554
+ definition.with(1, 2).any_number_of_times
555
+ subject.foobar(1, 2)
556
+ end
557
+
558
+ send "#any_number_of_times"
559
+ end
560
+
561
+ context "when passed a block" do
562
+ def call_double_injection
563
+ actual_args = nil
564
+ definition.with(1, 2).any_number_of_times do |*args|
565
+ actual_args = args
566
+ :new_return_value
567
+ end
568
+ subject.foobar(1, 2)
569
+ @return_value = subject.foobar(1, 2)
570
+ @args = actual_args
571
+ end
572
+
573
+ context "with returns block_callback_strategy" do
574
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
575
+ send "#any_number_of_times"
576
+
577
+ describe "#subject.method_name being called" do
578
+ it "returns the return value of the block" do
579
+ @return_value.should == :new_return_value
580
+ @args.should == [1, 2]
581
+ end
582
+ end
583
+ end
584
+
585
+ context "with after_call block_callback_strategy" do
586
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
587
+ send "#any_number_of_times"
588
+
589
+ describe "#subject.method_name being called" do
590
+ it "returns the return value of the block" do
591
+ @return_value.should == :new_return_value
592
+ @args.should == [:original_return_value]
593
+ end
594
+ end
595
+ end
596
+ end
597
+ end
598
+
599
+ describe "#ordered" do
600
+ macro "#ordered" do
601
+ it "adds itself to the ordered doubles list" do
602
+ definition.ordered
603
+ Space.instance.ordered_doubles.should include(double)
604
+ end
605
+
606
+ it "does not double_injection add itself" do
607
+ definition.ordered
608
+ Space.instance.ordered_doubles.should == [double]
609
+ end
610
+
611
+ it "sets ordered? to true" do
612
+ definition.should be_ordered
613
+ end
614
+
615
+ context "when there is no Double" do
616
+ it "raises a DoubleDefinitionError" do
617
+ definition.double = nil
618
+ lambda do
619
+ definition.ordered
620
+ end.should raise_error(
621
+ Errors::DoubleDefinitionError,
622
+ "Double Definitions must have a dedicated Double to be ordered. " <<
623
+ "For example, using instance_of does not allow ordered to be used. " <<
624
+ "proxy the class's #new method instead."
625
+ )
626
+ end
627
+ end
628
+ end
629
+
630
+ context "when not passed a block" do
631
+ before do
632
+ definition.with(1, 2).once.ordered
633
+ subject.foobar(1, 2)
634
+ end
635
+
636
+ send "#ordered"
637
+ end
638
+
639
+ context "when passed a block" do
640
+ def call_double_injection
641
+ actual_args = nil
642
+ definition.with(1, 2).once.ordered do |*args|
643
+ actual_args = args
644
+ :new_return_value
645
+ end
646
+ @return_value = subject.foobar(1, 2)
647
+ @args = actual_args
648
+ end
649
+
650
+ context "with returns block_callback_strategy" do
651
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
652
+ send "#ordered"
653
+
654
+ describe "#subject.method_name being called" do
655
+ it "returns the return value of the block" do
656
+ @return_value.should == :new_return_value
657
+ @args.should == [1, 2]
658
+ end
659
+ end
660
+ end
661
+
662
+ context "with after_call block_callback_strategy" do
663
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
664
+ send "#ordered"
665
+
666
+ describe "#subject.method_name being called" do
667
+ it "returns the return value of the block" do
668
+ @return_value.should == :new_return_value
669
+ @args.should == [:original_return_value]
670
+ end
671
+ end
672
+ end
673
+ end
674
+ end
675
+
676
+ describe "#yields" do
677
+ macro "#yields" do
678
+ it "returns DoubleDefinition" do
679
+ definition.yields(:baz).should === definition
680
+ end
681
+
682
+ context "when there is a no returns value set" do
683
+ it "yields the passed in argument to the call block" do
684
+ @passed_in_block_arg.should == :baz
685
+ end
686
+ end
687
+ end
688
+
689
+ context "when not passed a block" do
690
+ before do
691
+ definition.with(1, 2).once.yields(:baz)
692
+ passed_in_block_arg = nil
693
+ subject.foobar(1, 2) do |arg|
694
+ passed_in_block_arg = arg
695
+ end
696
+ @passed_in_block_arg = passed_in_block_arg
697
+ end
698
+
699
+ send "#yields"
700
+ end
701
+
702
+ context "when passed a block" do
703
+ def call_double_injection
704
+ actual_args = nil
705
+ definition.with(1, 2).once.yields(:baz) do |*args|
706
+ actual_args = args
707
+ :new_return_value
708
+ end
709
+ passed_in_block_arg = nil
710
+ @return_value = subject.foobar(1, 2) do |arg|
711
+ passed_in_block_arg = arg
712
+ end
713
+ @passed_in_block_arg = passed_in_block_arg
714
+
715
+ @args = actual_args
716
+ end
717
+
718
+ context "with returns block_callback_strategy" do
719
+ send "DoubleDefinition where #double_definition_creator is a Reimplementation"
720
+ send "#yields"
721
+
722
+ describe "#subject.method_name being called" do
723
+ it "returns the return value of the block" do
724
+ @return_value.should == :new_return_value
725
+ @args.length.should == 3
726
+ @args[0..1].should == [1, 2]
727
+ @args[2].should be_instance_of(Proc)
728
+ end
729
+ end
730
+ end
731
+
732
+ context "with after_call block_callback_strategy" do
733
+ send "DoubleDefinition where #double_definition_creator is a Proxy"
734
+ send "#yields"
735
+
736
+ describe "#subject.method_name being called" do
737
+ it "returns the return value of the block" do
738
+ @return_value.should == :new_return_value
739
+ @args.should == [:original_return_value]
740
+ end
741
+ end
742
+ end
743
+ end
744
+ end
745
+
746
+ describe "#after_call" do
747
+ context "when passed a block" do
748
+ it "returns DoubleDefinition" do
749
+ definition.after_call {}.should === definition
750
+ end
751
+
752
+ describe "#subject.method_name being called" do
753
+ it "calls the block with the return value of the implementation" do
754
+ return_value = {:original => :value}
755
+ definition.with_any_args.returns(return_value).after_call do |value|
756
+ value[:foo] = :bar
757
+ value
758
+ end
759
+
760
+ actual_value = subject.foobar
761
+ actual_value.should === return_value
762
+ actual_value.should == {:original => :value, :foo => :bar}
763
+ end
764
+
765
+ context "when the return value of the #after_call_proc is a DoubleDefinition" do
766
+ it "returns the #subject of the DoubleDefinition" do
767
+ return_value = Object.new
768
+ inner_double_definition = nil
769
+ definition.with_any_args.returns(return_value).after_call do |value|
770
+ inner_double_definition = mock(value).inner_method(1) {:baz}
771
+ end
772
+
773
+ foobar_return_value = subject.foobar
774
+ foobar_return_value.should == inner_double_definition.subject
775
+ foobar_return_value.inner_method(1).should == :baz
776
+ end
777
+ end
778
+
779
+ context "when the return value of the #after_call_proc is a DoubleDefinitionCreatorProxy" do
780
+ it "returns the #__subject__ of the DoubleDefinitionCreatorProxy" do
781
+ return_value = Object.new
782
+ inner_double_proxy = nil
783
+ definition.with_any_args.returns(return_value).after_call do |value|
784
+ inner_double_proxy = mock(value)
785
+ end
786
+
787
+ foobar_return_value = subject.foobar
788
+ foobar_return_value.should == inner_double_proxy.__creator__.subject
789
+ end
790
+ end
791
+
792
+ context "when the return value of the #after_call_proc is an Object" do
793
+ it "returns the return value of the #after_call_proc" do
794
+ return_value = :returns_value
795
+ definition.with_any_args.returns(return_value).after_call do |value|
796
+ :after_call_proc
797
+ end
798
+
799
+ actual_value = subject.foobar
800
+ actual_value.should == :after_call_proc
801
+ end
802
+ end
803
+ end
804
+ end
805
+
806
+ context "when not passed a block" do
807
+ it "raises an ArgumentError" do
808
+ lambda do
809
+ definition.after_call
810
+ end.should raise_error(ArgumentError, "after_call expects a block")
811
+ end
812
+ end
813
+ end
814
+
815
+ describe "#returns" do
816
+ it "returns DoubleDefinition" do
817
+ definition.returns {:baz}.should === definition
818
+ definition.returns(:baz).should === definition
819
+ end
820
+
821
+ context "when passed neither an argument nor a block" do
822
+ describe "#subject.method_name being called" do
823
+ it "returns nil" do
824
+ definition.with_any_args.returns
825
+ subject.foobar.should be_nil
826
+ end
827
+ end
828
+ end
829
+
830
+ context "when passed a block" do
831
+ describe "#subject.method_name being called" do
832
+ it "returns the return value of the block" do
833
+ definition.with_any_args.returns {:baz}
834
+ subject.foobar.should == :baz
835
+ end
836
+ end
837
+ end
838
+
839
+ context "when passed an argument" do
840
+ describe "#subject.method_name being called" do
841
+ it "returns the passed-in argument" do
842
+ definition.returns(:baz).with_no_args
843
+ subject.foobar.should == :baz
844
+ end
845
+ end
846
+
847
+ context "when the argument is false" do
848
+ describe "#subject.method_name being called" do
849
+ it "returns false" do
850
+ definition.returns(false).with_any_args
851
+ subject.foobar.should == false
852
+ end
853
+ end
854
+ end
855
+ end
856
+
857
+ context "when passed both an argument and a block" do
858
+ it "raises an error" do
859
+ lambda do
860
+ definition.returns(:baz) {:another}
861
+ end.should raise_error(ArgumentError, "returns cannot accept both an argument and a block")
862
+ end
863
+ end
864
+ end
865
+
866
+ describe "#implemented_by" do
867
+ it "returns the DoubleDefinition" do
868
+ definition.implemented_by(lambda{:baz}).should === definition
869
+ end
870
+
871
+ context "when passed a Proc" do
872
+ describe "#subject.method_name being called" do
873
+ it "returns the return value of the passed-in Proc" do
874
+ definition.implemented_by(lambda{:baz}).with_no_args
875
+ subject.foobar.should == :baz
876
+ end
877
+ end
878
+ end
879
+
880
+ context "when passed a Method" do
881
+ it "sets the implementation to the passed in method" do
882
+ def subject.foobar(a, b)
883
+ [b, a]
884
+ end
885
+ definition.implemented_by(subject.method(:foobar))
886
+ subject.foobar(1, 2).should == [2, 1]
887
+ end
888
+ end
889
+ end
890
+
891
+ describe "#verbose" do
892
+ it "sets the verbose? to true" do
893
+ definition.should_not be_verbose
894
+ definition.verbose
895
+ definition.should be_verbose
896
+ end
897
+ end
898
+
899
+ describe "#verify_method_signature" do
900
+ it "sets #verify_method_signature? to true" do
901
+ definition.verify_method_signature?.should be_false
902
+ definition.verify_method_signature
903
+ definition.verify_method_signature?.should be_true
904
+ end
905
+
906
+ it "returns self" do
907
+ definition.verify_method_signature.should == definition
908
+ end
909
+ end
910
+ end
911
+
912
+ describe "NestedDoubleCreationMethods" do
913
+ attr_reader :child_double_definition_creator
914
+ after do
915
+ RR.verify(ChildDoubleDefinitionCreator)
916
+ RR.verify(child_double_definition_creator)
917
+ end
918
+
919
+ describe "#mock" do
920
+ it "instantiates a ChildDoubleDefinitionCreator with self and delegates to its #mock method with the passed-in arguments and block" do
921
+ child_subject = Object.new
922
+ child_double_definition_creator = nil
923
+ mock.proxy(ChildDoubleDefinitionCreator).new(definition) do |child_double_definition_creator|
924
+ mock.proxy(child_double_definition_creator).mock(child_subject, :baz)
925
+ child_double_definition_creator = child_double_definition_creator
926
+ end
927
+
928
+ definition.mock(child_subject, :baz)
929
+ @child_double_definition_creator = child_double_definition_creator
930
+ end
931
+ end
932
+
933
+ describe "#mock!" do
934
+ it "instantiates a ChildDoubleDefinitionCreator with self and delegates to its #mock! method with the passed-in arguments and block" do
935
+ child_double_definition_creator = nil
936
+ mock.proxy(ChildDoubleDefinitionCreator).new(definition) do |child_double_definition_creator|
937
+ mock.proxy(child_double_definition_creator).mock!(:baz)
938
+ child_double_definition_creator = child_double_definition_creator
939
+ end
940
+
941
+ definition.mock!(:baz)
942
+ @child_double_definition_creator = child_double_definition_creator
943
+ end
944
+ end
945
+
946
+ describe "#stub" do
947
+ it "instantiates a ChildDoubleDefinitionCreator with self and delegates to its #stub method with the passed-in arguments and block" do
948
+ child_subject = Object.new
949
+ child_double_definition_creator = nil
950
+ mock.proxy(ChildDoubleDefinitionCreator).new(definition) do |child_double_definition_creator|
951
+ mock.proxy(child_double_definition_creator).stub(child_subject, :baz)
952
+ child_double_definition_creator = child_double_definition_creator
953
+ end
954
+
955
+ definition.stub(child_subject, :baz)
956
+ @child_double_definition_creator = child_double_definition_creator
957
+ end
958
+ end
959
+
960
+ describe "#stub!" do
961
+ it "instantiates a ChildDoubleDefinitionCreator with self and delegates to its #stub! method with the passed-in arguments and block" do
962
+ child_double_definition_creator = nil
963
+ mock.proxy(ChildDoubleDefinitionCreator).new(definition) do |child_double_definition_creator|
964
+ mock.proxy(child_double_definition_creator).stub!(:baz)
965
+ child_double_definition_creator = child_double_definition_creator
966
+ end
967
+
968
+ definition.stub!(:baz)
969
+ @child_double_definition_creator = child_double_definition_creator
970
+ end
971
+ end
972
+
973
+ describe "#dont_allow" do
974
+ it "instantiates a ChildDoubleDefinitionCreator with self and delegates to its #dont_allow method with the passed-in arguments and block" do
975
+ child_subject = Object.new
976
+ child_double_definition_creator = nil
977
+ mock.proxy(ChildDoubleDefinitionCreator).new(definition) do |child_double_definition_creator|
978
+ mock.proxy(child_double_definition_creator).dont_allow(child_subject, :baz)
979
+ child_double_definition_creator = child_double_definition_creator
980
+ end
981
+
982
+ definition.dont_allow(child_subject, :baz)
983
+ @child_double_definition_creator = child_double_definition_creator
984
+ end
985
+ end
986
+
987
+ describe "#dont_allow!" do
988
+ it "instantiates a ChildDoubleDefinitionCreator with self and delegates to its #dont_allow! method with the passed-in arguments and block" do
989
+ child_double_definition_creator = nil
990
+ mock.proxy(ChildDoubleDefinitionCreator).new(definition) do |child_double_definition_creator|
991
+ mock.proxy(child_double_definition_creator).dont_allow!(:baz)
992
+ child_double_definition_creator = child_double_definition_creator
993
+ end
994
+
995
+ definition.dont_allow!(:baz)
996
+ @child_double_definition_creator = child_double_definition_creator
997
+ end
998
+ end
999
+
1000
+ describe "#proxy" do
1001
+ it "instantiates a ChildDoubleDefinitionCreator with self and delegates to its #proxy method with the passed-in arguments and block" do
1002
+ child_subject = Object.new
1003
+ child_double_definition_creator = nil
1004
+ mock.proxy(ChildDoubleDefinitionCreator).new(definition) do |child_double_definition_creator|
1005
+ mock.proxy(child_double_definition_creator).proxy(DoubleDefinitionCreator::NO_SUBJECT, nil)
1006
+ child_double_definition_creator = child_double_definition_creator
1007
+ end
1008
+
1009
+ definition.proxy.mock(child_subject)
1010
+ @child_double_definition_creator = child_double_definition_creator
1011
+ end
1012
+ end
1013
+
1014
+ describe "#proxy!" do
1015
+ it "raises a DoubleDefinitionError" do
1016
+ lambda do
1017
+ definition.proxy!(:baz)
1018
+ end.should raise_error(Errors::DoubleDefinitionError)
1019
+ end
1020
+ end
1021
+
1022
+ describe "#strong" do
1023
+ it "instantiates a ChildDoubleDefinitionCreator with self and delegates to its #strong method with the passed-in arguments and block" do
1024
+ child_subject = Object.new
1025
+ child_double_definition_creator = nil
1026
+ mock.proxy(ChildDoubleDefinitionCreator).new(definition) do |child_double_definition_creator|
1027
+ mock.proxy(child_double_definition_creator).strong(DoubleDefinitionCreator::NO_SUBJECT, nil)
1028
+ child_double_definition_creator = child_double_definition_creator
1029
+ end
1030
+
1031
+ definition.strong.mock(child_subject)
1032
+ @child_double_definition_creator = child_double_definition_creator
1033
+ end
1034
+ end
1035
+
1036
+ describe "#strong!" do
1037
+ it "raises a DoubleDefinitionError" do
1038
+ lambda do
1039
+ definition.strong!(:baz)
1040
+ end.should raise_error(Errors::DoubleDefinitionError)
1041
+ end
1042
+ end
1043
+ end
1044
+
1045
+ describe "StateQueryMethods" do
1046
+ describe "#ordered?" do
1047
+ it "defaults to false" do
1048
+ definition.should_not be_ordered
1049
+ end
1050
+ end
1051
+
1052
+ describe "#exact_match?" do
1053
+ context "when no argument_expectation set" do
1054
+ it "raises a DoubleDefinitionError" do
1055
+ definition.argument_expectation = nil
1056
+ lambda do
1057
+ definition.exact_match?
1058
+ end.should raise_error(Errors::DoubleDefinitionError)
1059
+ end
1060
+ end
1061
+
1062
+ context "when arguments are not an exact match" do
1063
+ it "returns false" do
1064
+ definition.with(1, 2, 3)
1065
+ definition.should_not be_exact_match(1, 2)
1066
+ definition.should_not be_exact_match(1)
1067
+ definition.should_not be_exact_match()
1068
+ definition.should_not be_exact_match("does not match")
1069
+ end
1070
+ end
1071
+
1072
+ context "when arguments are an exact match" do
1073
+ it "returns true" do
1074
+ definition.with(1, 2, 3)
1075
+ definition.should be_exact_match(1, 2, 3)
1076
+ end
1077
+ end
1078
+ end
1079
+
1080
+ describe "#wildcard_match?" do
1081
+ context "when no #argument_expectation is set" do
1082
+ it "raises a DoubleDefinitionError" do
1083
+ definition.argument_expectation = nil
1084
+ lambda do
1085
+ definition.wildcard_match?
1086
+ end.should raise_error(Errors::DoubleDefinitionError)
1087
+ end
1088
+ end
1089
+
1090
+ context "when arguments are an exact match" do
1091
+ it "returns true" do
1092
+ definition.with(1, 2, 3)
1093
+ definition.should be_wildcard_match(1, 2, 3)
1094
+ definition.should_not be_wildcard_match(1, 2)
1095
+ definition.should_not be_wildcard_match(1)
1096
+ definition.should_not be_wildcard_match()
1097
+ definition.should_not be_wildcard_match("does not match")
1098
+ end
1099
+ end
1100
+
1101
+ context "when with_any_args" do
1102
+ it "returns true" do
1103
+ definition.with_any_args
1104
+
1105
+ definition.should be_wildcard_match(1, 2, 3)
1106
+ definition.should be_wildcard_match(1, 2)
1107
+ definition.should be_wildcard_match(1)
1108
+ definition.should be_wildcard_match()
1109
+ definition.should be_wildcard_match("does not match")
1110
+ end
1111
+ end
1112
+ end
1113
+
1114
+ describe "#terminal?" do
1115
+ context "when times_matcher's terminal? is true" do
1116
+ it "returns true" do
1117
+ definition.once
1118
+ definition.times_matcher.should be_terminal
1119
+ definition.should be_terminal
1120
+ end
1121
+ end
1122
+
1123
+ context "when times_matcher's terminal? is false" do
1124
+ it "returns false" do
1125
+ definition.any_number_of_times
1126
+ definition.times_matcher.should_not be_terminal
1127
+ definition.should_not be_terminal
1128
+ end
1129
+ end
1130
+
1131
+ context "when there is not times_matcher" do
1132
+ it "raises a DoubleDefinitionError" do
1133
+ definition.times_matcher = nil
1134
+ lambda do
1135
+ definition.terminal?
1136
+ end.should raise_error(Errors::DoubleDefinitionError)
1137
+ end
1138
+ end
1139
+ end
1140
+
1141
+ describe "#expected_arguments" do
1142
+ context "when there is a argument expectation" do
1143
+ it "returns argument expectation's expected_arguments" do
1144
+ definition.with(1, 2)
1145
+ definition.expected_arguments.should == [1, 2]
1146
+ end
1147
+ end
1148
+
1149
+ context "when there is no argument expectation" do
1150
+ it "returns an empty array" do
1151
+ definition.argument_expectation = nil
1152
+ definition.expected_arguments.should == []
1153
+ end
1154
+ end
1155
+ end
1156
+ end
1157
+ end
1158
+ end
1159
+ end