redinger-rr 0.10.3

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 (133) hide show
  1. data/CHANGES +221 -0
  2. data/README.rdoc +343 -0
  3. data/Rakefile +88 -0
  4. data/VERSION.yml +4 -0
  5. data/lib/rr.rb +88 -0
  6. data/lib/rr/adapters/rr_methods.rb +122 -0
  7. data/lib/rr/adapters/rspec.rb +59 -0
  8. data/lib/rr/adapters/test_unit.rb +29 -0
  9. data/lib/rr/double.rb +152 -0
  10. data/lib/rr/double_definitions/child_double_definition_creator.rb +27 -0
  11. data/lib/rr/double_definitions/double_definition.rb +348 -0
  12. data/lib/rr/double_definitions/double_definition_creator.rb +167 -0
  13. data/lib/rr/double_definitions/double_definition_creator_proxy.rb +37 -0
  14. data/lib/rr/double_definitions/strategies/implementation/implementation_strategy.rb +15 -0
  15. data/lib/rr/double_definitions/strategies/implementation/proxy.rb +62 -0
  16. data/lib/rr/double_definitions/strategies/implementation/reimplementation.rb +14 -0
  17. data/lib/rr/double_definitions/strategies/implementation/strongly_typed_reimplementation.rb +17 -0
  18. data/lib/rr/double_definitions/strategies/scope/instance.rb +15 -0
  19. data/lib/rr/double_definitions/strategies/scope/instance_of_class.rb +50 -0
  20. data/lib/rr/double_definitions/strategies/scope/scope_strategy.rb +15 -0
  21. data/lib/rr/double_definitions/strategies/strategy.rb +70 -0
  22. data/lib/rr/double_definitions/strategies/verification/dont_allow.rb +34 -0
  23. data/lib/rr/double_definitions/strategies/verification/mock.rb +44 -0
  24. data/lib/rr/double_definitions/strategies/verification/stub.rb +45 -0
  25. data/lib/rr/double_definitions/strategies/verification/verification_strategy.rb +15 -0
  26. data/lib/rr/double_injection.rb +180 -0
  27. data/lib/rr/double_matches.rb +51 -0
  28. data/lib/rr/errors/argument_equality_error.rb +6 -0
  29. data/lib/rr/errors/double_definition_error.rb +6 -0
  30. data/lib/rr/errors/double_not_found_error.rb +6 -0
  31. data/lib/rr/errors/double_order_error.rb +6 -0
  32. data/lib/rr/errors/rr_error.rb +20 -0
  33. data/lib/rr/errors/spy_verification_errors/double_injection_not_found_error.rb +8 -0
  34. data/lib/rr/errors/spy_verification_errors/invocation_count_error.rb +8 -0
  35. data/lib/rr/errors/spy_verification_errors/spy_verification_error.rb +8 -0
  36. data/lib/rr/errors/subject_does_not_implement_method_error.rb +6 -0
  37. data/lib/rr/errors/subject_has_different_arity_error.rb +6 -0
  38. data/lib/rr/errors/times_called_error.rb +6 -0
  39. data/lib/rr/expectations/any_argument_expectation.rb +21 -0
  40. data/lib/rr/expectations/argument_equality_expectation.rb +41 -0
  41. data/lib/rr/expectations/times_called_expectation.rb +57 -0
  42. data/lib/rr/hash_with_object_id_key.rb +44 -0
  43. data/lib/rr/method_dispatches/base_method_dispatch.rb +108 -0
  44. data/lib/rr/method_dispatches/method_dispatch.rb +61 -0
  45. data/lib/rr/method_dispatches/method_missing_dispatch.rb +49 -0
  46. data/lib/rr/proc_from_block.rb +7 -0
  47. data/lib/rr/recorded_calls.rb +103 -0
  48. data/lib/rr/space.rb +123 -0
  49. data/lib/rr/spy_verification.rb +48 -0
  50. data/lib/rr/spy_verification_proxy.rb +18 -0
  51. data/lib/rr/times_called_matchers/any_times_matcher.rb +18 -0
  52. data/lib/rr/times_called_matchers/at_least_matcher.rb +15 -0
  53. data/lib/rr/times_called_matchers/at_most_matcher.rb +23 -0
  54. data/lib/rr/times_called_matchers/integer_matcher.rb +19 -0
  55. data/lib/rr/times_called_matchers/non_terminal.rb +27 -0
  56. data/lib/rr/times_called_matchers/proc_matcher.rb +11 -0
  57. data/lib/rr/times_called_matchers/range_matcher.rb +21 -0
  58. data/lib/rr/times_called_matchers/terminal.rb +20 -0
  59. data/lib/rr/times_called_matchers/times_called_matcher.rb +44 -0
  60. data/lib/rr/wildcard_matchers.rb +158 -0
  61. data/lib/rr/wildcard_matchers/anything.rb +18 -0
  62. data/lib/rr/wildcard_matchers/boolean.rb +23 -0
  63. data/lib/rr/wildcard_matchers/duck_type.rb +32 -0
  64. data/lib/rr/wildcard_matchers/hash_including.rb +29 -0
  65. data/lib/rr/wildcard_matchers/is_a.rb +25 -0
  66. data/lib/rr/wildcard_matchers/numeric.rb +13 -0
  67. data/lib/rr/wildcard_matchers/range.rb +7 -0
  68. data/lib/rr/wildcard_matchers/regexp.rb +7 -0
  69. data/lib/rr/wildcard_matchers/satisfy.rb +26 -0
  70. data/spec/core_spec_suite.rb +19 -0
  71. data/spec/environment_fixture_setup.rb +7 -0
  72. data/spec/high_level_spec.rb +398 -0
  73. data/spec/proc_from_block_spec.rb +14 -0
  74. data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +67 -0
  75. data/spec/rr/adapters/rr_methods_creator_spec.rb +149 -0
  76. data/spec/rr/adapters/rr_methods_space_spec.rb +115 -0
  77. data/spec/rr/adapters/rr_methods_spec_helper.rb +11 -0
  78. data/spec/rr/adapters/rr_methods_times_matcher_spec.rb +17 -0
  79. data/spec/rr/double_definitions/child_double_definition_creator_spec.rb +112 -0
  80. data/spec/rr/double_definitions/double_definition_creator_proxy_spec.rb +155 -0
  81. data/spec/rr/double_definitions/double_definition_creator_spec.rb +502 -0
  82. data/spec/rr/double_definitions/double_definition_spec.rb +1165 -0
  83. data/spec/rr/double_injection/double_injection_spec.rb +339 -0
  84. data/spec/rr/double_injection/double_injection_verify_spec.rb +29 -0
  85. data/spec/rr/double_spec.rb +352 -0
  86. data/spec/rr/errors/rr_error_spec.rb +67 -0
  87. data/spec/rr/expectations/any_argument_expectation_spec.rb +47 -0
  88. data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +14 -0
  89. data/spec/rr/expectations/argument_equality_expectation_spec.rb +135 -0
  90. data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +34 -0
  91. data/spec/rr/expectations/hash_including_argument_equality_expectation_spec.rb +82 -0
  92. data/spec/rr/expectations/hash_including_spec.rb +17 -0
  93. data/spec/rr/expectations/satisfy_argument_equality_expectation_spec.rb +59 -0
  94. data/spec/rr/expectations/satisfy_spec.rb +14 -0
  95. data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +46 -0
  96. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +69 -0
  97. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +71 -0
  98. data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +23 -0
  99. data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +104 -0
  100. data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +81 -0
  101. data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +83 -0
  102. data/spec/rr/expectations/times_called_expectation/times_called_expectation_spec.rb +38 -0
  103. data/spec/rr/rspec/invocation_matcher_spec.rb +279 -0
  104. data/spec/rr/rspec/rspec_adapter_spec.rb +66 -0
  105. data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +31 -0
  106. data/spec/rr/rspec/rspec_backtrace_tweaking_spec_fixture.rb +11 -0
  107. data/spec/rr/rspec/rspec_usage_spec.rb +86 -0
  108. data/spec/rr/space/hash_with_object_id_key_spec.rb +88 -0
  109. data/spec/rr/space/space_spec.rb +550 -0
  110. data/spec/rr/test_unit/test_helper.rb +7 -0
  111. data/spec/rr/test_unit/test_unit_backtrace_test.rb +36 -0
  112. data/spec/rr/test_unit/test_unit_integration_test.rb +57 -0
  113. data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +47 -0
  114. data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +55 -0
  115. data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +70 -0
  116. data/spec/rr/times_called_matchers/integer_matcher_spec.rb +70 -0
  117. data/spec/rr/times_called_matchers/proc_matcher_spec.rb +55 -0
  118. data/spec/rr/times_called_matchers/range_matcher_spec.rb +76 -0
  119. data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +118 -0
  120. data/spec/rr/wildcard_matchers/anything_spec.rb +24 -0
  121. data/spec/rr/wildcard_matchers/boolean_spec.rb +36 -0
  122. data/spec/rr/wildcard_matchers/duck_type_spec.rb +52 -0
  123. data/spec/rr/wildcard_matchers/is_a_spec.rb +32 -0
  124. data/spec/rr/wildcard_matchers/numeric_spec.rb +32 -0
  125. data/spec/rr/wildcard_matchers/range_spec.rb +35 -0
  126. data/spec/rr/wildcard_matchers/regexp_spec.rb +43 -0
  127. data/spec/rr_spec.rb +28 -0
  128. data/spec/rspec_spec_suite.rb +17 -0
  129. data/spec/spec_helper.rb +109 -0
  130. data/spec/spec_suite.rb +31 -0
  131. data/spec/spy_verification_spec.rb +129 -0
  132. data/spec/test_unit_spec_suite.rb +21 -0
  133. metadata +193 -0
@@ -0,0 +1,118 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module TimesCalledMatchers
5
+ describe TimesCalledMatcher do
6
+ describe ".create" do
7
+ describe "when passed a AnyTimesMatcher" do
8
+ it "returns the passed in argument" do
9
+ matcher = AnyTimesMatcher.new
10
+ TimesCalledMatcher.create(matcher).should === matcher
11
+ end
12
+ end
13
+
14
+ describe "when passed a AtLeastMatcher" do
15
+ it "returns the passed in argument" do
16
+ matcher = AtLeastMatcher.new(5)
17
+ TimesCalledMatcher.create(matcher).should === matcher
18
+ end
19
+ end
20
+
21
+ describe "when passed a AtMostMatcher" do
22
+ it "returns the passed in argument" do
23
+ matcher = AtMostMatcher.new(5)
24
+ TimesCalledMatcher.create(matcher).should === matcher
25
+ end
26
+ end
27
+
28
+ describe "when passed a IntegerMatcher" do
29
+ it "returns the passed in argument" do
30
+ matcher = IntegerMatcher.new(5)
31
+ TimesCalledMatcher.create(matcher).should === matcher
32
+ end
33
+ end
34
+
35
+ describe "when passed a Integer" do
36
+ it "returns IntegerMatcher" do
37
+ TimesCalledMatcher.create(5).should == IntegerMatcher.new(5)
38
+ end
39
+ end
40
+
41
+ describe "when passed a ProcMatcher" do
42
+ it "returns the passed in argument" do
43
+ matcher = ProcMatcher.new(lambda {|other| other == 5})
44
+ TimesCalledMatcher.create(matcher).should === matcher
45
+ end
46
+ end
47
+
48
+ describe "when passed a Lambda" do
49
+ it "returns ProcMatcher" do
50
+ value = lambda {|other| other == 5}
51
+ TimesCalledMatcher.create(value).should == ProcMatcher.new(value)
52
+ end
53
+ end
54
+
55
+ describe "when passed a IntegerMatcher" do
56
+ it "returns the passed in argument" do
57
+ matcher = RangeMatcher.new(2..4)
58
+ TimesCalledMatcher.create(matcher).should === matcher
59
+ end
60
+ end
61
+
62
+ describe "when passed a Integer" do
63
+ it "returns RangeMatcher" do
64
+ TimesCalledMatcher.create(2..4).should == RangeMatcher.new(2..4)
65
+ end
66
+ end
67
+
68
+ describe "when passed a TimesCalledMatcher" do
69
+ it "returns the passed in argument" do
70
+ matcher = TimesCalledMatcher.new(5)
71
+ TimesCalledMatcher.create(matcher).should === matcher
72
+ end
73
+ end
74
+
75
+ describe "when passed an unsupported type" do
76
+ it "raises an ArgumentError" do
77
+ matcher = Object.new
78
+ lambda do
79
+ TimesCalledMatcher.create(matcher)
80
+ end.should raise_error(ArgumentError, "There is no TimesCalledMatcher for #{matcher.inspect}.")
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "#error_message" do
86
+ before do
87
+ @times = 3
88
+ @matcher = TimesCalledMatcher.new(@times)
89
+ end
90
+
91
+ it "has an error message" do
92
+ @matcher.error_message(5).should == (
93
+ "Called 5 times.\nExpected 3 times."
94
+ )
95
+ end
96
+ end
97
+
98
+ describe "#==" do
99
+ before do
100
+ @times = 3
101
+ @matcher = TimesCalledMatcher.new(@times)
102
+ end
103
+
104
+ it "returns true when other is the same class and times are ==" do
105
+ @matcher.should == TimesCalledMatcher.new(@times)
106
+ end
107
+
108
+ it "returns false when other is a different class and times are ==" do
109
+ @matcher.should_not == IntegerMatcher.new(@times)
110
+ end
111
+
112
+ it "returns false when is the same class and times are not ==" do
113
+ @matcher.should_not == TimesCalledMatcher.new(1)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module WildcardMatchers
5
+ describe Anything do
6
+ attr_reader :matcher
7
+ before do
8
+ @matcher = Anything.new
9
+ end
10
+
11
+ describe "#wildcard_match?" do
12
+ it "returns true" do
13
+ matcher.should be_wildcard_match(Object.new)
14
+ end
15
+ end
16
+
17
+ describe "#inspect" do
18
+ it "returns anything" do
19
+ matcher.inspect.should == "anything"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module WildcardMatchers
5
+ describe Boolean do
6
+ attr_reader :matcher
7
+
8
+ before do
9
+ @matcher = Boolean.new
10
+ end
11
+
12
+ describe "#wildcard_match?" do
13
+ context "when passed a Boolean" do
14
+ it "returns true" do
15
+ matcher.should be_wildcard_match(true)
16
+ matcher.should be_wildcard_match(false)
17
+ end
18
+ end
19
+
20
+ context "when not passed a Boolean" do
21
+ it "returns false" do
22
+ matcher.should_not be_wildcard_match(:not_a_boolean)
23
+ end
24
+ end
25
+ end
26
+
27
+ describe Boolean do
28
+ describe "#inspect" do
29
+ it "returns boolean" do
30
+ matcher.inspect.should == "boolean"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,52 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module WildcardMatchers
5
+ describe DuckType do
6
+ attr_reader :matcher
7
+ before do
8
+ @matcher = DuckType.new(:quack, :waddle)
9
+ end
10
+
11
+ describe "#wildcard_match?" do
12
+ before do
13
+ @matching_object = Object.new
14
+ def @matching_object.quack
15
+ end
16
+ def @matching_object.waddle
17
+ end
18
+
19
+ @partial_matching_object = Object.new
20
+ def @partial_matching_object.quack
21
+ end
22
+
23
+ @not_match_object = Object.new
24
+ end
25
+
26
+ context "when passed-in object matches all required methods" do
27
+ it "returns true" do
28
+ matcher.should be_wildcard_match(@matching_object)
29
+ end
30
+ end
31
+
32
+ context "when passed-in object matches some required methods" do
33
+ it "returns false" do
34
+ matcher.should_not be_wildcard_match(@partial_matching_object)
35
+ end
36
+ end
37
+
38
+ context "when passed-in object matches no required methods" do
39
+ it "returns false" do
40
+ matcher.should_not be_wildcard_match(@not_match_object)
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#inspect" do
46
+ it "returns duck_type with methods" do
47
+ matcher.inspect.should == "duck_type(:quack, :waddle)"
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module WildcardMatchers
5
+ describe IsA do
6
+ attr_reader :matcher
7
+ before do
8
+ @matcher = IsA.new(Symbol)
9
+ end
10
+
11
+ describe "#wildcard_match?" do
12
+ context "when passed an instance of the expected Module" do
13
+ it "returns true" do
14
+ matcher.should be_wildcard_match(:a_symbol)
15
+ end
16
+ end
17
+
18
+ context "when not passed an instance of the expected Module" do
19
+ it "returns false" do
20
+ matcher.should_not be_wildcard_match("not a symbol")
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "#inspect" do
26
+ it "returns the is_a(ClassName)" do
27
+ matcher.inspect.should == "is_a(Symbol)"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module WildcardMatchers
5
+ describe Numeric do
6
+ attr_reader :matcher
7
+ before do
8
+ @matcher = Numeric.new
9
+ end
10
+
11
+ describe "#wildcard_match?" do
12
+ context "when passed a Numeric" do
13
+ it "returns true" do
14
+ matcher.should be_wildcard_match(99)
15
+ end
16
+ end
17
+
18
+ context "when not passed a Numeric" do
19
+ it "returns false" do
20
+ matcher.should_not be_wildcard_match(:not_a_numeric)
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "#inspect" do
26
+ it "returns numeric" do
27
+ matcher.inspect.should == "numeric"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ describe Range do
4
+ attr_reader :matcher
5
+
6
+ before do
7
+ @matcher = 2..3
8
+ end
9
+
10
+ describe "#wildcard_match?" do
11
+ context "when passed-in number falls within the Range" do
12
+ it "returns true" do
13
+ matcher.should be_wildcard_match(3)
14
+ end
15
+ end
16
+
17
+ context "when passed-in number does not fall within the Range" do
18
+ it "returns false" do
19
+ matcher.should_not be_wildcard_match(7)
20
+ end
21
+ end
22
+
23
+ context "when passed-in argument is not a number" do
24
+ it "returns false" do
25
+ matcher.should_not be_wildcard_match("Not a number")
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "#inspect" do
31
+ it "returns the range" do
32
+ matcher.inspect.should == "2..3"
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ describe Regexp do
4
+ attr_reader :matcher
5
+
6
+ before do
7
+ @matcher = /foo/
8
+ end
9
+
10
+ describe "#wildcard_match?" do
11
+ before do
12
+ @matching_object = Object.new
13
+ def @matching_object.quack
14
+ end
15
+ def @matching_object.waddle
16
+ end
17
+
18
+ @partial_matching_object = Object.new
19
+ def @partial_matching_object.quack
20
+ end
21
+
22
+ @not_match_object = Object.new
23
+ end
24
+
25
+ context "when passed-in String matches the Regexp" do
26
+ it "returns true" do
27
+ matcher.should be_wildcard_match("foobarbaz")
28
+ end
29
+ end
30
+
31
+ context "when passed-in String does not match the Regexp" do
32
+ it "returns false" do
33
+ matcher.should_not be_wildcard_match("no match here")
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "#inspect" do
39
+ it "returns the regexp" do
40
+ matcher.inspect.should == "/foo/"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,28 @@
1
+ require "#{File.dirname(__FILE__)}/spec_helper"
2
+
3
+ describe "RR" do
4
+ before do
5
+ Object.class_eval do
6
+ def verify
7
+ raise "Dont call me"
8
+ end
9
+ end
10
+ end
11
+
12
+ after do
13
+ Object.class_eval do
14
+ remove_method :verify
15
+ end
16
+ end
17
+
18
+ it "has proxy methods for each method defined directly on Space" do
19
+ space_instance_methods = RR::Space.instance_methods(false)
20
+ space_instance_methods.should_not be_empty
21
+
22
+ rr_instance_methods = RR.methods(false)
23
+ space_instance_methods.each do |space_instance_method|
24
+ rr_instance_methods.should include(space_instance_method)
25
+ end
26
+ RR.verify
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ require "rubygems"
2
+ require "spec"
3
+
4
+ class RspecExampleSuite
5
+ def run
6
+ puts "Running Rspec Example Suite"
7
+ dir = File.dirname(__FILE__)
8
+ Dir["#{dir}/rr/rspec/**/*_spec.rb"].each do |file|
9
+ # puts "require '#{file}'"
10
+ require file
11
+ end
12
+ end
13
+ end
14
+
15
+ if $0 == __FILE__
16
+ RspecExampleSuite.new.run
17
+ end
@@ -0,0 +1,109 @@
1
+ dir = File.dirname(__FILE__)
2
+ require "#{dir}/environment_fixture_setup"
3
+ require "#{dir}/rr/expectations/times_called_expectation/times_called_expectation_helper"
4
+ require "#{dir}/rr/adapters/rr_methods_spec_helper"
5
+ ARGV.push("--format", "nested") unless ARGV.include?("--format")
6
+ ARGV.push("-b")
7
+
8
+ Spec::Runner.configure do |config|
9
+ config.mock_with RR::Adapters::Rspec
10
+ end
11
+
12
+ describe "Swapped Space", :shared => true do
13
+ attr_reader :space, :original_space
14
+ before do
15
+ @original_space = RR::Space.instance
16
+ RR::Space.instance = RR::Space.new
17
+ @space = RR::Space.instance
18
+ end
19
+
20
+ after(:each) do
21
+ RR::Space.instance = @original_space
22
+ end
23
+ end
24
+
25
+ class Spec::ExampleGroup
26
+ class << self
27
+ def macro(name, &implementation)
28
+ (class << self; self; end).class_eval do
29
+ define_method(name, &implementation)
30
+ end
31
+ end
32
+
33
+ define_method("normal strategy definition") do
34
+ describe "strategy definition" do
35
+ attr_reader :strategy_method_name
36
+
37
+ context "when passed a subject" do
38
+ it "returns a DoubleDefinitionCreatorProxy" do
39
+ double = call_strategy(subject).foobar
40
+ double.should be_instance_of(RR::DoubleDefinitions::DoubleDefinition)
41
+ end
42
+ end
43
+
44
+ context "when passed a method name and a definition_eval_block" do
45
+ it "raises an ArgumentError" do
46
+ lambda do
47
+ call_strategy(subject, :foobar) {}
48
+ end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ define_method("! strategy definition") do
55
+ describe "strategy definition" do
56
+ attr_reader :strategy_method_name
57
+
58
+ context "when not passed a method_name argument" do
59
+ it "returns a DoubleDefinitionCreatorProxy" do
60
+ call_strategy.should respond_to(:__subject__)
61
+ end
62
+
63
+ context "when passed a definition_eval_block argument" do
64
+ it "calls the definition_eval_block and passes in the DoubleDefinitionCreatorProxy" do
65
+ passed_in_proxy = nil
66
+ proxy = call_strategy do |proxy|
67
+ passed_in_proxy = proxy
68
+ end
69
+
70
+ passed_in_proxy.should == proxy
71
+ end
72
+ end
73
+ end
74
+
75
+ context "when passed a method_name argument" do
76
+ it "returns a DoubleDefinition" do
77
+ double_definition = call_strategy(:foobar)
78
+ double_definition.class.should == RR::DoubleDefinitions::DoubleDefinition
79
+ end
80
+
81
+ describe "the returned DoubleDefinition" do
82
+ it "has #subject set to an anonymous Object" do
83
+ double_definition = call_strategy(:foobar)
84
+ double_definition.subject.class.should == Object
85
+ end
86
+ end
87
+ end
88
+
89
+ context "when passed a method name and a definition_eval_block" do
90
+ it "raises an ArgumentError" do
91
+ lambda do
92
+ call_strategy(:foobar) {}
93
+ end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ def new_double(
101
+ double_injection=double_injection,
102
+ double_definition=RR::DoubleDefinitions::DoubleDefinition.new(creator = RR::DoubleDefinitions::DoubleDefinitionCreator.new, subject).with_any_args.any_number_of_times
103
+ )
104
+ RR::Double.new(
105
+ double_injection,
106
+ double_definition
107
+ )
108
+ end
109
+ end