jferris-rr 0.7.1.0.1239654108

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.
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