rr 0.3.11 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +8 -3
- data/README +130 -39
- data/Rakefile +6 -5
- data/lib/rr.rb +8 -8
- data/lib/rr/adapters/rr_methods.rb +228 -0
- data/lib/rr/adapters/rspec.rb +1 -1
- data/lib/rr/adapters/test_unit.rb +1 -1
- data/lib/rr/double.rb +294 -89
- data/lib/rr/{scenario_creator.rb → double_creator.rb} +65 -66
- data/lib/rr/{scenario_definition.rb → double_definition.rb} +36 -36
- data/lib/rr/{scenario_definition_builder.rb → double_definition_builder.rb} +3 -3
- data/lib/rr/double_insertion.rb +132 -0
- data/lib/rr/{scenario_matches.rb → double_matches.rb} +2 -2
- data/lib/rr/{scenario_method_proxy.rb → double_method_proxy.rb} +2 -2
- data/lib/rr/errors/argument_equality_error.rb +3 -3
- data/lib/rr/errors/rr_error.rb +13 -13
- data/lib/rr/errors/scenario_definition_error.rb +3 -3
- data/lib/rr/errors/scenario_not_found_error.rb +3 -3
- data/lib/rr/errors/scenario_order_error.rb +3 -3
- data/lib/rr/errors/times_called_error.rb +3 -3
- data/lib/rr/expectations/any_argument_expectation.rb +1 -1
- data/lib/rr/expectations/argument_equality_expectation.rb +1 -1
- data/lib/rr/expectations/times_called_expectation.rb +1 -1
- data/lib/rr/hash_with_object_id_key.rb +1 -1
- data/lib/rr/space.rb +40 -40
- data/lib/rr/times_called_matchers/any_times_matcher.rb +13 -13
- data/lib/rr/times_called_matchers/at_least_matcher.rb +11 -11
- data/lib/rr/times_called_matchers/at_most_matcher.rb +16 -16
- data/lib/rr/times_called_matchers/integer_matcher.rb +13 -13
- data/lib/rr/times_called_matchers/non_terminal.rb +21 -21
- data/lib/rr/times_called_matchers/proc_matcher.rb +7 -7
- data/lib/rr/times_called_matchers/range_matcher.rb +14 -14
- data/lib/rr/times_called_matchers/terminal.rb +16 -16
- data/lib/rr/times_called_matchers/times_called_matcher.rb +32 -32
- data/spec/core_spec_suite.rb +18 -0
- data/{examples → spec}/environment_fixture_setup.rb +0 -1
- data/{examples/high_level_example.rb → spec/high_level_spec.rb} +11 -11
- data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +67 -0
- data/spec/rr/adapters/rr_methods_creator_spec.rb +365 -0
- data/spec/rr/adapters/rr_methods_space_spec.rb +134 -0
- data/spec/rr/adapters/rr_methods_spec_helper.rb +11 -0
- data/{examples/rr/extensions/instance_methods_times_matcher_example.rb → spec/rr/adapters/rr_methods_times_matcher_spec.rb} +4 -4
- data/spec/rr/double/double_insertion_bind_spec.rb +78 -0
- data/spec/rr/double/double_insertion_dispatching_spec.rb +221 -0
- data/spec/rr/double/double_insertion_has_original_method_spec.rb +56 -0
- data/spec/rr/double/double_insertion_register_scenario_spec.rb +24 -0
- data/spec/rr/double/double_insertion_reset_spec.rb +89 -0
- data/spec/rr/double/double_insertion_spec.rb +66 -0
- data/spec/rr/double/double_insertion_verify_spec.rb +23 -0
- data/spec/rr/double_creator_spec.rb +454 -0
- data/{examples/rr/scenario_definition_example.rb → spec/rr/double_definition_spec.rb} +143 -143
- data/spec/rr/double_method_proxy_spec.rb +71 -0
- data/spec/rr/double_spec.rb +654 -0
- data/spec/rr/errors/rr_error_spec.rb +65 -0
- data/spec/rr/expectations/any_argument_expectation_spec.rb +47 -0
- data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +38 -0
- data/spec/rr/expectations/argument_equality_expectation_spec.rb +58 -0
- data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +53 -0
- data/spec/rr/expectations/duck_type_argument_equality_expectation_spec.rb +71 -0
- data/spec/rr/expectations/is_a_argument_equality_expectation_spec.rb +51 -0
- data/spec/rr/expectations/numeric_argument_equality_expectation_spec.rb +47 -0
- data/spec/rr/expectations/range_argument_equality_expectation_spec.rb +59 -0
- data/spec/rr/expectations/regexp_argument_equality_expectation_spec.rb +72 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +43 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +67 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +71 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +21 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +103 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +79 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +81 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_spec.rb +40 -0
- data/spec/rr/rspec/rspec_adapter_spec.rb +65 -0
- data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +52 -0
- data/spec/rr/rspec/rspec_usage_spec.rb +67 -0
- data/spec/rr/space/hash_with_object_id_key_spec.rb +88 -0
- data/spec/rr/space/space_create_spec.rb +278 -0
- data/spec/rr/space/space_helper.rb +7 -0
- data/spec/rr/space/space_register_spec.rb +32 -0
- data/spec/rr/space/space_reset_spec.rb +131 -0
- data/spec/rr/space/space_spec.rb +32 -0
- data/spec/rr/space/space_verify_spec.rb +181 -0
- data/{examples → spec}/rr/test_unit/test_helper.rb +1 -1
- data/{examples → spec}/rr/test_unit/test_unit_backtrace_test.rb +0 -0
- data/{examples → spec}/rr/test_unit/test_unit_integration_test.rb +4 -4
- data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +47 -0
- data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +55 -0
- data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +70 -0
- data/spec/rr/times_called_matchers/integer_matcher_spec.rb +70 -0
- data/spec/rr/times_called_matchers/proc_matcher_spec.rb +55 -0
- data/spec/rr/times_called_matchers/range_matcher_spec.rb +76 -0
- data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +118 -0
- data/spec/rspec_spec_suite.rb +16 -0
- data/spec/spec_helper.rb +9 -0
- data/{examples/example_suite.rb → spec/spec_suite.rb} +3 -3
- data/{examples/test_unit_example_suite.rb → spec/test_unit_spec_suite.rb} +0 -0
- metadata +93 -93
- data/examples/core_example_suite.rb +0 -31
- data/examples/example_helper.rb +0 -9
- data/examples/rr/double/double_bind_example.rb +0 -70
- data/examples/rr/double/double_dispatching_example.rb +0 -236
- data/examples/rr/double/double_example.rb +0 -66
- data/examples/rr/double/double_has_original_method_example.rb +0 -56
- data/examples/rr/double/double_register_scenario_example.rb +0 -24
- data/examples/rr/double/double_reset_example.rb +0 -89
- data/examples/rr/double/double_verify_example.rb +0 -23
- data/examples/rr/errors/rr_error_example.rb +0 -65
- data/examples/rr/expectations/any_argument_expectation_example.rb +0 -52
- data/examples/rr/expectations/anything_argument_equality_expectation_example.rb +0 -38
- data/examples/rr/expectations/argument_equality_expectation_example.rb +0 -62
- data/examples/rr/expectations/boolean_argument_equality_expectation_example.rb +0 -48
- data/examples/rr/expectations/duck_type_argument_equality_expectation_example.rb +0 -67
- data/examples/rr/expectations/is_a_argument_equality_expectation_example.rb +0 -50
- data/examples/rr/expectations/numeric_argument_equality_expectation_example.rb +0 -46
- data/examples/rr/expectations/range_argument_equality_expectation_example.rb +0 -59
- data/examples/rr/expectations/regexp_argument_equality_expectation_example.rb +0 -67
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_any_times_example.rb +0 -50
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_least_example.rb +0 -73
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_most_example.rb +0 -77
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_example.rb +0 -42
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +0 -20
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_integer_example.rb +0 -111
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_proc_example.rb +0 -88
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_range_example.rb +0 -90
- data/examples/rr/extensions/instance_methods_argument_matcher_example.rb +0 -65
- data/examples/rr/extensions/instance_methods_creator_example.rb +0 -363
- data/examples/rr/extensions/instance_methods_example_helper.rb +0 -11
- data/examples/rr/extensions/instance_methods_space_example.rb +0 -122
- data/examples/rr/rspec/rspec_adapter_example.rb +0 -63
- data/examples/rr/rspec/rspec_backtrace_tweaking_example.rb +0 -36
- data/examples/rr/rspec/rspec_usage_example.rb +0 -65
- data/examples/rr/scenario_creator_example.rb +0 -459
- data/examples/rr/scenario_example.rb +0 -701
- data/examples/rr/scenario_method_proxy_example.rb +0 -71
- data/examples/rr/space/hash_with_object_id_key_example.rb +0 -86
- data/examples/rr/space/space_create_example.rb +0 -278
- data/examples/rr/space/space_example.rb +0 -29
- data/examples/rr/space/space_helper.rb +0 -7
- data/examples/rr/space/space_register_example.rb +0 -32
- data/examples/rr/space/space_reset_example.rb +0 -120
- data/examples/rr/space/space_verify_example.rb +0 -169
- data/examples/rr/times_called_matchers/any_times_matcher_example.rb +0 -63
- data/examples/rr/times_called_matchers/at_least_matcher_example.rb +0 -70
- data/examples/rr/times_called_matchers/at_most_matcher_example.rb +0 -85
- data/examples/rr/times_called_matchers/integer_matcher_example.rb +0 -91
- data/examples/rr/times_called_matchers/proc_matcher_example.rb +0 -77
- data/examples/rr/times_called_matchers/range_matcher_example.rb +0 -97
- data/examples/rr/times_called_matchers/times_called_matcher_example.rb +0 -53
- data/examples/rspec_example_suite.rb +0 -25
- data/lib/rr/extensions/instance_methods.rb +0 -228
- data/lib/rr/scenario.rb +0 -337
@@ -0,0 +1,71 @@
|
|
1
|
+
require "spec/spec_helper"
|
2
|
+
|
3
|
+
module RR
|
4
|
+
describe DoubleMethodProxy, "initializes proxy with passed in creator", :shared => true do
|
5
|
+
it "initializes proxy with passed in creator" do
|
6
|
+
class << the_proxy
|
7
|
+
attr_reader :creator
|
8
|
+
end
|
9
|
+
the_proxy.creator.should === creator
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe DoubleMethodProxy do
|
14
|
+
attr_reader :space, :subject, :creator, :the_proxy
|
15
|
+
before(:each) do
|
16
|
+
@space = Space.new
|
17
|
+
@subject = Object.new
|
18
|
+
@creator = space.scenario_creator
|
19
|
+
creator.mock
|
20
|
+
end
|
21
|
+
|
22
|
+
describe ".new without block" do
|
23
|
+
it_should_behave_like "RR::DoubleMethodProxy initializes proxy with passed in creator"
|
24
|
+
before do
|
25
|
+
@the_proxy = DoubleMethodProxy.new(space, creator, subject)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "clears out all methods from proxy" do
|
29
|
+
proxy_subclass = Class.new(DoubleMethodProxy) do
|
30
|
+
def i_should_be_a_scenario
|
31
|
+
end
|
32
|
+
end
|
33
|
+
proxy_subclass.instance_methods.should include('i_should_be_a_scenario')
|
34
|
+
|
35
|
+
proxy = proxy_subclass.new(space, creator, subject)
|
36
|
+
proxy.i_should_be_a_scenario.should be_instance_of(DoubleDefinition)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe ".new with block" do
|
41
|
+
it_should_behave_like "RR::DoubleMethodProxy initializes proxy with passed in creator"
|
42
|
+
before do
|
43
|
+
@the_proxy = DoubleMethodProxy.new(space, creator, subject) do |b|
|
44
|
+
b.foobar(1, 2) {:one_two}
|
45
|
+
b.foobar(1) {:one}
|
46
|
+
b.foobar.with_any_args {:default}
|
47
|
+
b.baz() {:baz_result}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "creates double_insertions" do
|
52
|
+
subject.foobar(1, 2).should == :one_two
|
53
|
+
subject.foobar(1).should == :one
|
54
|
+
subject.foobar(:something).should == :default
|
55
|
+
subject.baz.should == :baz_result
|
56
|
+
end
|
57
|
+
|
58
|
+
it "clears out all methods from proxy" do
|
59
|
+
proxy_subclass = Class.new(DoubleMethodProxy) do
|
60
|
+
def i_should_be_a_scenario
|
61
|
+
end
|
62
|
+
end
|
63
|
+
proxy_subclass.instance_methods.should include('i_should_be_a_scenario')
|
64
|
+
|
65
|
+
proxy_subclass.new(space, creator, subject) do |m|
|
66
|
+
m.i_should_be_a_scenario.should be_instance_of(DoubleDefinition)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,654 @@
|
|
1
|
+
require "spec/spec_helper"
|
2
|
+
|
3
|
+
module RR
|
4
|
+
describe Double do
|
5
|
+
attr_reader :space, :object, :double_insertion, :scenario
|
6
|
+
before do
|
7
|
+
@space = Space.new
|
8
|
+
@object = Object.new
|
9
|
+
def object.foobar(a, b)
|
10
|
+
[b, a]
|
11
|
+
end
|
12
|
+
@double_insertion = space.double_insertion(object, :foobar)
|
13
|
+
@scenario = space.scenario(double_insertion)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#with" do
|
17
|
+
it "returns DoubleDefinition" do
|
18
|
+
scenario.with(1).should === scenario.definition
|
19
|
+
end
|
20
|
+
|
21
|
+
it "sets an ArgumentEqualityExpectation" do
|
22
|
+
scenario.with(1)
|
23
|
+
scenario.should be_exact_match(1)
|
24
|
+
scenario.should_not be_exact_match(2)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "sets return value when block passed in" do
|
28
|
+
scenario.with(1) {:return_value}
|
29
|
+
object.foobar(1).should == :return_value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#with_any_args" do
|
34
|
+
before do
|
35
|
+
scenario.with_any_args {:return_value}
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns DoubleDefinition" do
|
39
|
+
scenario.with_no_args.should === scenario.definition
|
40
|
+
end
|
41
|
+
|
42
|
+
it "sets an AnyArgumentExpectation" do
|
43
|
+
scenario.should_not be_exact_match(1)
|
44
|
+
scenario.should be_wildcard_match(1)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "sets return value when block passed in" do
|
48
|
+
object.foobar(:anything).should == :return_value
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#with_no_args" do
|
53
|
+
before do
|
54
|
+
scenario.with_no_args {:return_value}
|
55
|
+
end
|
56
|
+
|
57
|
+
it "returns DoubleDefinition" do
|
58
|
+
scenario.with_no_args.should === scenario.definition
|
59
|
+
end
|
60
|
+
|
61
|
+
it "sets an ArgumentEqualityExpectation with no arguments" do
|
62
|
+
scenario.argument_expectation.should == Expectations::ArgumentEqualityExpectation.new()
|
63
|
+
end
|
64
|
+
|
65
|
+
it "sets return value when block passed in" do
|
66
|
+
object.foobar().should == :return_value
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#never" do
|
71
|
+
it "returns DoubleDefinition" do
|
72
|
+
scenario.never.should === scenario.definition
|
73
|
+
end
|
74
|
+
|
75
|
+
it "sets up a Times Called Expectation with 0" do
|
76
|
+
scenario.never
|
77
|
+
proc {scenario.call(double_insertion)}.should raise_error(Errors::TimesCalledError)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "sets return value when block passed in" do
|
81
|
+
scenario.with_any_args.never
|
82
|
+
proc {scenario.call(double_insertion)}.should raise_error(Errors::TimesCalledError)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#once" do
|
87
|
+
it "returns DoubleDefinition" do
|
88
|
+
scenario.once.should === scenario.definition
|
89
|
+
end
|
90
|
+
|
91
|
+
it "sets up a Times Called Expectation with 1" do
|
92
|
+
scenario.once
|
93
|
+
scenario.call(double_insertion)
|
94
|
+
proc {scenario.call(double_insertion)}.should raise_error(Errors::TimesCalledError)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "sets return value when block passed in" do
|
98
|
+
scenario.with_any_args.once {:return_value}
|
99
|
+
object.foobar.should == :return_value
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#twice" do
|
104
|
+
it "returns DoubleDefinition" do
|
105
|
+
scenario.twice.should === scenario.definition
|
106
|
+
end
|
107
|
+
|
108
|
+
it "sets up a Times Called Expectation with 2" do
|
109
|
+
scenario.twice
|
110
|
+
scenario.call(double_insertion)
|
111
|
+
scenario.call(double_insertion)
|
112
|
+
proc {scenario.call(double_insertion)}.should raise_error(Errors::TimesCalledError)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "sets return value when block passed in" do
|
116
|
+
scenario.with_any_args.twice {:return_value}
|
117
|
+
object.foobar.should == :return_value
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "#at_least" do
|
122
|
+
it "returns DoubleDefinition" do
|
123
|
+
scenario.with_any_args.at_least(2).should === scenario.definition
|
124
|
+
end
|
125
|
+
|
126
|
+
it "sets up a AtLeastMatcher with 2" do
|
127
|
+
scenario.at_least(2)
|
128
|
+
scenario.definition.times_matcher.should == TimesCalledMatchers::AtLeastMatcher.new(2)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "sets return value when block passed in" do
|
132
|
+
scenario.with_any_args.at_least(2) {:return_value}
|
133
|
+
object.foobar.should == :return_value
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "#at_most" do
|
138
|
+
it "returns DoubleDefinition" do
|
139
|
+
scenario.with_any_args.at_most(2).should === scenario.definition
|
140
|
+
end
|
141
|
+
|
142
|
+
it "sets up a Times Called Expectation with 1" do
|
143
|
+
scenario.at_most(2)
|
144
|
+
scenario.call(double_insertion)
|
145
|
+
scenario.call(double_insertion)
|
146
|
+
proc do
|
147
|
+
scenario.call(double_insertion)
|
148
|
+
end.should raise_error(
|
149
|
+
Errors::TimesCalledError,
|
150
|
+
"foobar()\nCalled 3 times.\nExpected at most 2 times."
|
151
|
+
)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "sets return value when block passed in" do
|
155
|
+
scenario.with_any_args.at_most(2) {:return_value}
|
156
|
+
object.foobar.should == :return_value
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe "#times" do
|
161
|
+
it "returns DoubleDefinition" do
|
162
|
+
scenario.times(3).should === scenario.definition
|
163
|
+
end
|
164
|
+
|
165
|
+
it "sets up a Times Called Expectation with passed in times" do
|
166
|
+
scenario.times(3)
|
167
|
+
scenario.call(double_insertion)
|
168
|
+
scenario.call(double_insertion)
|
169
|
+
scenario.call(double_insertion)
|
170
|
+
proc {scenario.call(double_insertion)}.should raise_error(Errors::TimesCalledError)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "sets return value when block passed in" do
|
174
|
+
scenario.with_any_args.times(3) {:return_value}
|
175
|
+
object.foobar.should == :return_value
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe "#any_number_of_times" do
|
180
|
+
it "returns DoubleDefinition" do
|
181
|
+
scenario.any_number_of_times.should === scenario.definition
|
182
|
+
end
|
183
|
+
|
184
|
+
it "sets up a Times Called Expectation with AnyTimes matcher" do
|
185
|
+
scenario.any_number_of_times
|
186
|
+
scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
|
187
|
+
end
|
188
|
+
|
189
|
+
it "sets return value when block passed in" do
|
190
|
+
scenario.with_any_args.any_number_of_times {:return_value}
|
191
|
+
object.foobar.should == :return_value
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe "#ordered" do
|
196
|
+
it "adds itself to the ordered scenarios list" do
|
197
|
+
scenario.ordered
|
198
|
+
space.ordered_scenarios.should include(scenario)
|
199
|
+
end
|
200
|
+
|
201
|
+
it "does not double_insertion add itself" do
|
202
|
+
scenario.ordered
|
203
|
+
scenario.ordered
|
204
|
+
space.ordered_scenarios.should == [scenario ]
|
205
|
+
end
|
206
|
+
|
207
|
+
it "sets ordered? to true" do
|
208
|
+
scenario.ordered
|
209
|
+
scenario.should be_ordered
|
210
|
+
end
|
211
|
+
|
212
|
+
it "sets return value when block passed in" do
|
213
|
+
scenario.with_any_args.once.ordered {:return_value}
|
214
|
+
object.foobar.should == :return_value
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe "#ordered?" do
|
219
|
+
it "defaults to false" do
|
220
|
+
scenario.should_not be_ordered
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
describe "#yields" do
|
225
|
+
it "returns DoubleDefinition" do
|
226
|
+
scenario.yields(:baz).should === scenario.definition
|
227
|
+
end
|
228
|
+
|
229
|
+
it "yields the passed in argument to the call block when there is no returns value set" do
|
230
|
+
scenario.with_any_args.yields(:baz)
|
231
|
+
passed_in_block_arg = nil
|
232
|
+
object.foobar {|arg| passed_in_block_arg = arg}.should == nil
|
233
|
+
passed_in_block_arg.should == :baz
|
234
|
+
end
|
235
|
+
|
236
|
+
it "yields the passed in argument to the call block when there is a no returns value set" do
|
237
|
+
scenario.with_any_args.yields(:baz).returns(:return_value)
|
238
|
+
|
239
|
+
passed_in_block_arg = nil
|
240
|
+
object.foobar {|arg| passed_in_block_arg = arg}.should == :return_value
|
241
|
+
passed_in_block_arg.should == :baz
|
242
|
+
end
|
243
|
+
|
244
|
+
it "sets return value when block passed in" do
|
245
|
+
scenario.with_any_args.yields {:return_value}
|
246
|
+
object.foobar {}.should == :return_value
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
describe "#after_call" do
|
251
|
+
it "returns DoubleDefinition" do
|
252
|
+
scenario.after_call {}.should === scenario.definition
|
253
|
+
end
|
254
|
+
|
255
|
+
it "sends return value of Double implementation to after_call" do
|
256
|
+
return_value = {}
|
257
|
+
scenario.returns(return_value).after_call do |value|
|
258
|
+
value[:foo] = :bar
|
259
|
+
value
|
260
|
+
end
|
261
|
+
|
262
|
+
actual_value = scenario.call(double_insertion)
|
263
|
+
actual_value.should === return_value
|
264
|
+
actual_value.should == {:foo => :bar}
|
265
|
+
end
|
266
|
+
|
267
|
+
it "receives the return value in the after_call callback" do
|
268
|
+
return_value = :returns_value
|
269
|
+
scenario.returns(return_value).after_call do |value|
|
270
|
+
:after_call_value
|
271
|
+
end
|
272
|
+
|
273
|
+
actual_value = scenario.call(double_insertion)
|
274
|
+
actual_value.should == :after_call_value
|
275
|
+
end
|
276
|
+
|
277
|
+
it "allows after_call to mock the return value" do
|
278
|
+
return_value = Object.new
|
279
|
+
scenario.with_any_args.returns(return_value).after_call do |value|
|
280
|
+
mock(value).inner_method(1) {:baz}
|
281
|
+
value
|
282
|
+
end
|
283
|
+
|
284
|
+
object.foobar.inner_method(1).should == :baz
|
285
|
+
end
|
286
|
+
|
287
|
+
it "raises an error when not passed a block" do
|
288
|
+
proc do
|
289
|
+
scenario.after_call
|
290
|
+
end.should raise_error(ArgumentError, "after_call expects a block")
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
describe "#returns" do
|
295
|
+
it "returns DoubleDefinition" do
|
296
|
+
scenario.returns {:baz}.should === scenario.definition
|
297
|
+
scenario.returns(:baz).should === scenario.definition
|
298
|
+
end
|
299
|
+
|
300
|
+
it "sets the value of the method when passed a block" do
|
301
|
+
scenario.returns {:baz}
|
302
|
+
scenario.call(double_insertion).should == :baz
|
303
|
+
end
|
304
|
+
|
305
|
+
it "sets the value of the method when passed an argument" do
|
306
|
+
scenario.returns(:baz)
|
307
|
+
scenario.call(double_insertion).should == :baz
|
308
|
+
end
|
309
|
+
|
310
|
+
it "returns false when passed false" do
|
311
|
+
scenario.returns(false)
|
312
|
+
scenario.call(double_insertion).should == false
|
313
|
+
end
|
314
|
+
|
315
|
+
it "raises an error when both argument and block is passed in" do
|
316
|
+
proc do
|
317
|
+
scenario.returns(:baz) {:another}
|
318
|
+
end.should raise_error(ArgumentError, "returns cannot accept both an argument and a block")
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
describe "#implemented_by" do
|
323
|
+
it "returns the DoubleDefinition" do
|
324
|
+
scenario.implemented_by(proc{:baz}).should === scenario.definition
|
325
|
+
end
|
326
|
+
|
327
|
+
it "sets the implementation to the passed in proc" do
|
328
|
+
scenario.implemented_by(proc{:baz})
|
329
|
+
scenario.call(double_insertion).should == :baz
|
330
|
+
end
|
331
|
+
|
332
|
+
it "sets the implementation to the passed in method" do
|
333
|
+
def object.foobar(a, b)
|
334
|
+
[b, a]
|
335
|
+
end
|
336
|
+
scenario.implemented_by(object.method(:foobar))
|
337
|
+
scenario.call(double_insertion, 1, 2).should == [2, 1]
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
describe "#implemented_by_original_method" do
|
342
|
+
it "returns the DoubleDefinition object" do
|
343
|
+
scenario.implemented_by_original_method.should === scenario.definition
|
344
|
+
end
|
345
|
+
|
346
|
+
it "sets the implementation to the original method" do
|
347
|
+
scenario.implemented_by_original_method
|
348
|
+
scenario.call(double_insertion, 1, 2).should == [2, 1]
|
349
|
+
end
|
350
|
+
|
351
|
+
it "calls methods when respond_to? is true and methods does not contain original method" do
|
352
|
+
method_name = nil
|
353
|
+
class << object
|
354
|
+
def methods
|
355
|
+
[]
|
356
|
+
end
|
357
|
+
def method(name)
|
358
|
+
raise "We should not be here"
|
359
|
+
end
|
360
|
+
def respond_to?(name)
|
361
|
+
true
|
362
|
+
end
|
363
|
+
def method_missing(method_name, *args, &block)
|
364
|
+
raise "We should not be here"
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
double_insertion = space.double_insertion(object, :foobar)
|
369
|
+
scenario = space.scenario(double_insertion)
|
370
|
+
scenario.with_any_args
|
371
|
+
scenario.implemented_by_original_method
|
372
|
+
|
373
|
+
object.foobar(1, 2).should == [2, 1]
|
374
|
+
end
|
375
|
+
|
376
|
+
it "calls method when original_method does not exist" do
|
377
|
+
class << object
|
378
|
+
def method_missing(method_name, *args, &block)
|
379
|
+
"method_missing for #{method_name}(#{args.inspect})"
|
380
|
+
end
|
381
|
+
end
|
382
|
+
double_insertion = space.double_insertion(object, :does_not_exist)
|
383
|
+
scenario = space.scenario(double_insertion)
|
384
|
+
scenario.with_any_args
|
385
|
+
scenario.implemented_by_original_method
|
386
|
+
|
387
|
+
return_value = object.does_not_exist(1, 2)
|
388
|
+
return_value.should == "method_missing for does_not_exist([1, 2])"
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
describe "#call implemented by a proc" do
|
393
|
+
it "calls the return proc when implemented by a proc" do
|
394
|
+
scenario.returns {|arg| "returning #{arg}"}
|
395
|
+
scenario.call(double_insertion, :foobar).should == "returning foobar"
|
396
|
+
end
|
397
|
+
|
398
|
+
it "calls and returns the after_call when after_call is set" do
|
399
|
+
scenario.returns {|arg| "returning #{arg}"}.after_call do |value|
|
400
|
+
"#{value} after call"
|
401
|
+
end
|
402
|
+
scenario.call(double_insertion, :foobar).should == "returning foobar after call"
|
403
|
+
end
|
404
|
+
|
405
|
+
it "returns nil when to returns is not set" do
|
406
|
+
scenario.call(double_insertion).should be_nil
|
407
|
+
end
|
408
|
+
|
409
|
+
it "works when times_called is not set" do
|
410
|
+
scenario.returns {:value}
|
411
|
+
scenario.call(double_insertion)
|
412
|
+
end
|
413
|
+
|
414
|
+
it "verifes the times_called does not exceed the TimesCalledExpectation" do
|
415
|
+
scenario.times(2).returns {:value}
|
416
|
+
|
417
|
+
scenario.call(double_insertion, :foobar)
|
418
|
+
scenario.call(double_insertion, :foobar)
|
419
|
+
proc {scenario.call(double_insertion, :foobar)}.should raise_error(Errors::TimesCalledError)
|
420
|
+
end
|
421
|
+
|
422
|
+
it "raises DoubleOrderError when ordered and called out of order" do
|
423
|
+
scenario1 = scenario
|
424
|
+
scenario2 = space.scenario(double_insertion)
|
425
|
+
|
426
|
+
scenario1.with(1).returns {:return_1}.ordered.once
|
427
|
+
scenario2.with(2).returns {:return_2}.ordered.once
|
428
|
+
|
429
|
+
proc do
|
430
|
+
object.foobar(2)
|
431
|
+
end.should raise_error(
|
432
|
+
Errors::DoubleOrderError,
|
433
|
+
"foobar(2) called out of order in list\n" <<
|
434
|
+
"- foobar(1)\n" <<
|
435
|
+
"- foobar(2)"
|
436
|
+
)
|
437
|
+
end
|
438
|
+
|
439
|
+
it "dispatches to Space#verify_ordered_scenario when ordered" do
|
440
|
+
verify_ordered_scenario_called = false
|
441
|
+
passed_in_scenario = nil
|
442
|
+
space.method(:verify_ordered_scenario).arity.should == 1
|
443
|
+
(
|
444
|
+
class << space;
|
445
|
+
self;
|
446
|
+
end).class_eval do
|
447
|
+
define_method :verify_ordered_scenario do |scenario|
|
448
|
+
passed_in_scenario = scenario
|
449
|
+
verify_ordered_scenario_called = true
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
scenario.returns {:value}.ordered
|
454
|
+
scenario.call(double_insertion, :foobar)
|
455
|
+
verify_ordered_scenario_called.should be_true
|
456
|
+
passed_in_scenario.should === scenario
|
457
|
+
end
|
458
|
+
|
459
|
+
it "does not dispatche to Space#verify_ordered_scenario when not ordered" do
|
460
|
+
verify_ordered_scenario_called = false
|
461
|
+
space.method(:verify_ordered_scenario).arity.should == 1
|
462
|
+
(
|
463
|
+
class << space;
|
464
|
+
self;
|
465
|
+
end).class_eval do
|
466
|
+
define_method :verify_ordered_scenario do |scenario|
|
467
|
+
verify_ordered_scenario_called = true
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|
471
|
+
scenario.returns {:value}
|
472
|
+
scenario.call(double_insertion, :foobar)
|
473
|
+
verify_ordered_scenario_called.should be_false
|
474
|
+
end
|
475
|
+
|
476
|
+
it "does not add block argument if no block passed in" do
|
477
|
+
scenario.with(1, 2).returns {|*args| args}
|
478
|
+
|
479
|
+
args = object.foobar(1, 2)
|
480
|
+
args.should == [1, 2]
|
481
|
+
end
|
482
|
+
|
483
|
+
it "makes the block the last argument" do
|
484
|
+
scenario.with(1, 2).returns {|a, b, blk| blk}
|
485
|
+
|
486
|
+
block = object.foobar(1, 2) {|a, b| [b, a]}
|
487
|
+
block.call(3, 4).should == [4, 3]
|
488
|
+
end
|
489
|
+
|
490
|
+
it "raises ArgumentError when yields was called and no block passed in" do
|
491
|
+
scenario.with(1, 2).yields(55)
|
492
|
+
|
493
|
+
proc do
|
494
|
+
object.foobar(1, 2)
|
495
|
+
end.should raise_error(ArgumentError, "A Block must be passed into the method call when using yields")
|
496
|
+
end
|
497
|
+
end
|
498
|
+
|
499
|
+
describe "#call implemented by a method" do
|
500
|
+
it "sends block to the method" do
|
501
|
+
def object.foobar(a, b)
|
502
|
+
yield(a, b)
|
503
|
+
end
|
504
|
+
|
505
|
+
scenario.with(1, 2).implemented_by(object.method(:foobar))
|
506
|
+
|
507
|
+
object.foobar(1, 2) {|a, b| [b, a]}.should == [2, 1]
|
508
|
+
end
|
509
|
+
end
|
510
|
+
|
511
|
+
describe "#exact_match?" do
|
512
|
+
it "returns false when no expectation set" do
|
513
|
+
scenario.should_not be_exact_match()
|
514
|
+
scenario.should_not be_exact_match(nil)
|
515
|
+
scenario.should_not be_exact_match(Object.new)
|
516
|
+
scenario.should_not be_exact_match(1, 2, 3)
|
517
|
+
end
|
518
|
+
|
519
|
+
it "returns false when arguments are not an exact match" do
|
520
|
+
scenario.with(1, 2, 3)
|
521
|
+
scenario.should_not be_exact_match(1, 2)
|
522
|
+
scenario.should_not be_exact_match(1)
|
523
|
+
scenario.should_not be_exact_match()
|
524
|
+
scenario.should_not be_exact_match("does not match")
|
525
|
+
end
|
526
|
+
|
527
|
+
it "returns true when arguments are an exact match" do
|
528
|
+
scenario.with(1, 2, 3)
|
529
|
+
scenario.should be_exact_match(1, 2, 3)
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
describe "#wildcard_match?" do
|
534
|
+
it "returns false when no expectation set" do
|
535
|
+
scenario.should_not be_wildcard_match()
|
536
|
+
scenario.should_not be_wildcard_match(nil)
|
537
|
+
scenario.should_not be_wildcard_match(Object.new)
|
538
|
+
scenario.should_not be_wildcard_match(1, 2, 3)
|
539
|
+
end
|
540
|
+
|
541
|
+
it "returns true when arguments are an exact match" do
|
542
|
+
scenario.with(1, 2, 3)
|
543
|
+
scenario.should be_wildcard_match(1, 2, 3)
|
544
|
+
scenario.should_not be_wildcard_match(1, 2)
|
545
|
+
scenario.should_not be_wildcard_match(1)
|
546
|
+
scenario.should_not be_wildcard_match()
|
547
|
+
scenario.should_not be_wildcard_match("does not match")
|
548
|
+
end
|
549
|
+
|
550
|
+
it "returns true when with_any_args" do
|
551
|
+
scenario.with_any_args
|
552
|
+
|
553
|
+
scenario.should be_wildcard_match(1, 2, 3)
|
554
|
+
scenario.should be_wildcard_match(1, 2)
|
555
|
+
scenario.should be_wildcard_match(1)
|
556
|
+
scenario.should be_wildcard_match()
|
557
|
+
scenario.should be_wildcard_match("does not match")
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
describe "#attempt?" do
|
562
|
+
it "returns true when TimesCalledExpectation#attempt? is true" do
|
563
|
+
scenario.with(1, 2, 3).twice
|
564
|
+
scenario.call(double_insertion, 1, 2, 3)
|
565
|
+
scenario.times_called_expectation.should be_attempt
|
566
|
+
scenario.should be_attempt
|
567
|
+
end
|
568
|
+
|
569
|
+
it "returns false when TimesCalledExpectation#attempt? is true" do
|
570
|
+
scenario.with(1, 2, 3).twice
|
571
|
+
scenario.call(double_insertion, 1, 2, 3)
|
572
|
+
scenario.call(double_insertion, 1, 2, 3)
|
573
|
+
scenario.times_called_expectation.should_not be_attempt
|
574
|
+
scenario.should_not be_attempt
|
575
|
+
end
|
576
|
+
|
577
|
+
it "returns true when there is no Times Called expectation" do
|
578
|
+
scenario.with(1, 2, 3)
|
579
|
+
scenario.definition.times_matcher.should be_nil
|
580
|
+
scenario.should be_attempt
|
581
|
+
end
|
582
|
+
end
|
583
|
+
|
584
|
+
describe "#verify" do
|
585
|
+
it "verifies that times called expectation was met" do
|
586
|
+
scenario.twice.returns {:return_value}
|
587
|
+
|
588
|
+
proc {scenario.verify}.should raise_error(Errors::TimesCalledError)
|
589
|
+
scenario.call(double_insertion)
|
590
|
+
proc {scenario.verify}.should raise_error(Errors::TimesCalledError)
|
591
|
+
scenario.call(double_insertion)
|
592
|
+
|
593
|
+
proc {scenario.verify}.should_not raise_error
|
594
|
+
end
|
595
|
+
|
596
|
+
it "does not raise an error when there is no times called expectation" do
|
597
|
+
proc {scenario.verify}.should_not raise_error
|
598
|
+
scenario.call(double_insertion)
|
599
|
+
proc {scenario.verify}.should_not raise_error
|
600
|
+
scenario.call(double_insertion)
|
601
|
+
proc {scenario.verify}.should_not raise_error
|
602
|
+
end
|
603
|
+
end
|
604
|
+
|
605
|
+
describe "#terminal?" do
|
606
|
+
it "returns true when times_called_expectation's terminal? is true" do
|
607
|
+
scenario.once
|
608
|
+
scenario.times_called_expectation.should be_terminal
|
609
|
+
scenario.should be_terminal
|
610
|
+
end
|
611
|
+
|
612
|
+
it "returns false when times_called_expectation's terminal? is false" do
|
613
|
+
scenario.any_number_of_times
|
614
|
+
scenario.times_called_expectation.should_not be_terminal
|
615
|
+
scenario.should_not be_terminal
|
616
|
+
end
|
617
|
+
|
618
|
+
it "returns false when there is no times_matcher" do
|
619
|
+
scenario.definition.times_matcher.should be_nil
|
620
|
+
scenario.should_not be_terminal
|
621
|
+
end
|
622
|
+
end
|
623
|
+
|
624
|
+
describe "#method_name" do
|
625
|
+
it "returns the DoubleInsertion's method_name" do
|
626
|
+
double_insertion.method_name.should == :foobar
|
627
|
+
scenario.method_name.should == :foobar
|
628
|
+
end
|
629
|
+
end
|
630
|
+
|
631
|
+
describe "#expected_arguments" do
|
632
|
+
it "returns argument expectation's expected_arguments when there is a argument expectation" do
|
633
|
+
scenario.with(1, 2)
|
634
|
+
scenario.expected_arguments.should == [1, 2]
|
635
|
+
end
|
636
|
+
|
637
|
+
it "returns an empty array when there is no argument expectation" do
|
638
|
+
scenario.argument_expectation.should be_nil
|
639
|
+
scenario.expected_arguments.should == []
|
640
|
+
end
|
641
|
+
end
|
642
|
+
|
643
|
+
describe "#formatted_name" do
|
644
|
+
it "renders the formatted name of the Double with no arguments" do
|
645
|
+
scenario.formatted_name.should == "foobar()"
|
646
|
+
end
|
647
|
+
|
648
|
+
it "renders the formatted name of the Double with arguments" do
|
649
|
+
scenario.with(1, 2)
|
650
|
+
scenario.formatted_name.should == "foobar(1, 2)"
|
651
|
+
end
|
652
|
+
end
|
653
|
+
end
|
654
|
+
end
|