rr 0.1.13 → 0.1.14
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 +7 -0
- data/Rakefile +1 -1
- data/examples/example_helper.rb +1 -1
- data/examples/rr/{double_bind_example.rb → double/double_bind_example.rb} +0 -0
- data/examples/rr/{double_dispatching_example.rb → double/double_dispatching_example.rb} +72 -37
- data/examples/rr/{double_example.rb → double/double_example.rb} +0 -0
- data/examples/rr/{double_register_scenario_example.rb → double/double_register_scenario_example.rb} +0 -0
- data/examples/rr/{double_reset_example.rb → double/double_reset_example.rb} +0 -0
- data/examples/rr/{double_verify_example.rb → double/double_verify_example.rb} +0 -0
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_any_times_example.rb +8 -0
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_least_example.rb +8 -0
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_most_example.rb +8 -0
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_integer_example.rb +9 -1
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_proc_example.rb +8 -0
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_range_example.rb +9 -1
- data/examples/rr/scenario_example.rb +26 -6
- data/examples/rr/{space_create_example.rb → space/space_create_example.rb} +0 -0
- data/examples/rr/{space_example.rb → space/space_example.rb} +0 -0
- data/examples/rr/{space_helper.rb → space/space_helper.rb} +0 -0
- data/examples/rr/{space_register_example.rb → space/space_register_example.rb} +0 -0
- data/examples/rr/{space_reset_example.rb → space/space_reset_example.rb} +0 -0
- data/examples/rr/{space_verify_example.rb → space/space_verify_example.rb} +24 -6
- data/examples/rr/times_called_matchers/any_times_matcher_example.rb +19 -13
- data/examples/rr/times_called_matchers/at_least_matcher_example.rb +19 -16
- data/examples/rr/times_called_matchers/at_most_matcher_example.rb +19 -16
- data/examples/rr/times_called_matchers/integer_matcher_example.rb +19 -16
- data/examples/rr/times_called_matchers/proc_matcher_example.rb +19 -16
- data/examples/rr/times_called_matchers/range_matcher_example.rb +19 -16
- data/lib/rr.rb +5 -4
- data/lib/rr/double.rb +30 -15
- data/lib/rr/expectations/times_called_expectation.rb +4 -0
- data/lib/rr/scenario.rb +5 -0
- data/lib/rr/scenario_matches.rb +51 -0
- data/lib/rr/space.rb +5 -1
- data/lib/rr/times_called_matchers/any_times_matcher.rb +2 -8
- data/lib/rr/times_called_matchers/at_least_matcher.rb +2 -8
- data/lib/rr/times_called_matchers/at_most_matcher.rb +2 -0
- data/lib/rr/times_called_matchers/integer_matcher.rb +2 -0
- data/lib/rr/times_called_matchers/non_terminal.rb +27 -0
- data/lib/rr/times_called_matchers/proc_matcher.rb +2 -8
- data/lib/rr/times_called_matchers/range_matcher.rb +2 -0
- data/lib/rr/times_called_matchers/terminal.rb +20 -0
- metadata +17 -14
data/CHANGES
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
* 0.1.14
|
2
|
+
- Introduced concept of Terminal and NonTerminal TimesCalledMatchers
|
3
|
+
- Doubles that can be called many times can be replaced
|
4
|
+
- Terminal Scenarios are called before NonTerminal Scenarios
|
5
|
+
- Error message tweaking
|
6
|
+
- Raise error when making a Scenarios with NonDeterministic TimesMatcher Ordered
|
7
|
+
|
1
8
|
* 0.1.13
|
2
9
|
- Fixed [#12290] Scenario#returns with false causes a return value of nil
|
3
10
|
|
data/Rakefile
CHANGED
data/examples/example_helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
dir = File.dirname(__FILE__)
|
2
2
|
require "#{dir}/environment_fixture_setup"
|
3
|
-
require "examples/rr/space_helper"
|
3
|
+
require "examples/rr/space/space_helper"
|
4
4
|
require "examples/rr/expectations/times_called_expectation/times_called_expectation_helper"
|
5
5
|
require "examples/rr/extensions/double_methods_example_helper"
|
6
6
|
|
File without changes
|
@@ -97,52 +97,83 @@ describe Double, " method dispatching where there are scenarios" do
|
|
97
97
|
|
98
98
|
proc {@object.foobar(:arg1, :arg2)}.should raise_error(
|
99
99
|
Errors::ScenarioNotFoundError,
|
100
|
-
"No scenario for foobar(:arg1, :arg2)\n" <<
|
101
|
-
"in\n" <<
|
100
|
+
"No scenario for foobar(:arg1, :arg2) in\n" <<
|
102
101
|
"- foobar(1, 2)\n" <<
|
103
102
|
"- foobar(3)"
|
104
103
|
)
|
105
104
|
end
|
106
105
|
end
|
107
106
|
|
108
|
-
describe Double, " method dispatching where there are
|
107
|
+
describe Double, " method dispatching where there are Scenarios with NonTerminal TimesCalledMatchers" do
|
108
|
+
it_should_behave_like "RR::Double method dispatching"
|
109
|
+
|
110
|
+
it "dispatches to Scenario with exact match" do
|
111
|
+
scenario = create_scenario(1, 2) {:return_value}
|
112
|
+
@object.foobar(1, 2).should == :return_value
|
113
|
+
end
|
114
|
+
|
115
|
+
it "matches to the last Scenario that was registered with an exact match" do
|
116
|
+
scenario_1 = create_scenario(1, 2) {:value_1}
|
117
|
+
scenario_2 = create_scenario(1, 2) {:value_2}
|
118
|
+
|
119
|
+
@object.foobar(1, 2).should == :value_2
|
120
|
+
end
|
121
|
+
|
122
|
+
it "dispatches to Scenario with wildcard match" do
|
123
|
+
scenario = create_scenario(anything) {:return_value}
|
124
|
+
@object.foobar(:dont_care).should == :return_value
|
125
|
+
end
|
126
|
+
|
127
|
+
it "matches to the last Scenario that was registered with a wildcard match" do
|
128
|
+
scenario_1 = create_scenario(anything) {:value_1}
|
129
|
+
scenario_2 = create_scenario(anything) {:value_2}
|
130
|
+
|
131
|
+
@object.foobar(:dont_care).should == :value_2
|
132
|
+
end
|
133
|
+
|
134
|
+
it "matches to Scenario with exact match Scenario even when a Scenario with wildcard match was registered later" do
|
135
|
+
exact_scenario_registered_first = create_scenario(1, 2) {:exact_first}
|
136
|
+
wildcard_scenario_registered_last = create_scenario(anything, anything) {:wildcard_last}
|
137
|
+
|
138
|
+
@object.foobar(1, 2).should == :exact_first
|
139
|
+
end
|
140
|
+
|
141
|
+
def create_scenario(*arguments, &return_value)
|
142
|
+
scenario = @space.create_scenario(@double)
|
143
|
+
scenario.with(*arguments).any_number_of_times.returns(&return_value)
|
144
|
+
scenario.should_not be_terminal
|
145
|
+
scenario
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe Double, " method dispatching where there are Terminal Scenarios with duplicate Exact Match ArgumentExpectations" do
|
109
150
|
it_should_behave_like "RR::Double method dispatching"
|
110
151
|
|
111
152
|
it "dispatches to Scenario that have an exact match" do
|
112
|
-
scenario1_with_exact_match =
|
113
|
-
scenario1_with_exact_match.with(:exact_match).returns {:return_1}
|
153
|
+
scenario1_with_exact_match = create_scenario(:exact_match) {:return_1}
|
114
154
|
|
115
155
|
@object.foobar(:exact_match).should == :return_1
|
116
156
|
end
|
117
157
|
|
118
158
|
it "dispatches to the first Scenario that have an exact match" do
|
119
|
-
scenario1_with_exact_match =
|
120
|
-
|
121
|
-
|
122
|
-
scenario2_with_exact_match = @space.create_scenario(@double)
|
123
|
-
scenario2_with_exact_match.with(:exact_match).returns {:return_2}
|
159
|
+
scenario1_with_exact_match = create_scenario(:exact_match) {:return_1}
|
160
|
+
scenario2_with_exact_match = create_scenario(:exact_match) {:return_2}
|
124
161
|
|
125
162
|
@object.foobar(:exact_match).should == :return_1
|
126
163
|
end
|
127
164
|
|
128
165
|
it "dispatches the second Scenario with an exact match
|
129
166
|
when the first scenario's Times Called expectation is satisfied" do
|
130
|
-
scenario1_with_exact_match =
|
131
|
-
|
132
|
-
|
133
|
-
scenario2_with_exact_match = @space.create_scenario(@double)
|
134
|
-
scenario2_with_exact_match.with(:exact_match).returns {:return_2}.once
|
167
|
+
scenario1_with_exact_match = create_scenario(:exact_match) {:return_1}
|
168
|
+
scenario2_with_exact_match = create_scenario(:exact_match) {:return_2}
|
135
169
|
|
136
170
|
@object.foobar(:exact_match)
|
137
171
|
@object.foobar(:exact_match).should == :return_2
|
138
172
|
end
|
139
173
|
|
140
174
|
it "raises TimesCalledError when all of the scenarios Times Called expectation is satisfied" do
|
141
|
-
scenario1_with_exact_match =
|
142
|
-
|
143
|
-
|
144
|
-
scenario2_with_exact_match = @space.create_scenario(@double)
|
145
|
-
scenario2_with_exact_match.with(:exact_match).returns {:return_2}.once
|
175
|
+
scenario1_with_exact_match = create_scenario(:exact_match) {:return_1}
|
176
|
+
scenario2_with_exact_match = create_scenario(:exact_match) {:return_2}
|
146
177
|
|
147
178
|
@object.foobar(:exact_match)
|
148
179
|
@object.foobar(:exact_match)
|
@@ -150,46 +181,43 @@ describe Double, " method dispatching where there are scenarios with duplicate E
|
|
150
181
|
@object.foobar(:exact_match)
|
151
182
|
end.should raise_error(Errors::TimesCalledError)
|
152
183
|
end
|
184
|
+
|
185
|
+
def create_scenario(*arguments, &return_value)
|
186
|
+
scenario = @space.create_scenario(@double)
|
187
|
+
scenario.with(*arguments).once.returns(&return_value)
|
188
|
+
scenario.should be_terminal
|
189
|
+
scenario
|
190
|
+
end
|
153
191
|
end
|
154
192
|
|
155
193
|
describe Double, " method dispatching where there are scenarios with duplicate Wildcard Match ArgumentExpectations" do
|
156
194
|
it_should_behave_like "RR::Double method dispatching"
|
157
195
|
|
158
196
|
it "dispatches to Scenario that have a wildcard match" do
|
159
|
-
scenario_1 =
|
160
|
-
scenario_1.with_any_args.returns {:return_1}
|
197
|
+
scenario_1 = create_scenario {:return_1}
|
161
198
|
|
162
199
|
@object.foobar(:anything).should == :return_1
|
163
200
|
end
|
164
201
|
|
165
202
|
it "dispatches to the first Scenario that has a wildcard match" do
|
166
|
-
scenario_1 =
|
167
|
-
|
168
|
-
|
169
|
-
scenario_2 = @space.create_scenario(@double)
|
170
|
-
scenario_2.with_any_args.returns {:return_2}
|
203
|
+
scenario_1 = create_scenario {:return_1}
|
204
|
+
scenario_2 = create_scenario {:return_2}
|
171
205
|
|
172
206
|
@object.foobar(:anything).should == :return_1
|
173
207
|
end
|
174
208
|
|
175
209
|
it "dispatches the second Scenario with a wildcard match
|
176
210
|
when the first scenario's Times Called expectation is satisfied" do
|
177
|
-
scenario_1 =
|
178
|
-
|
179
|
-
|
180
|
-
scenario_2 = @space.create_scenario(@double)
|
181
|
-
scenario_2.with_any_args.returns {:return_2}.once
|
211
|
+
scenario_1 = create_scenario {:return_1}
|
212
|
+
scenario_2 = create_scenario {:return_2}
|
182
213
|
|
183
214
|
@object.foobar(:anything)
|
184
215
|
@object.foobar(:anything).should == :return_2
|
185
216
|
end
|
186
217
|
|
187
218
|
it "raises TimesCalledError when all of the scenarios Times Called expectation is satisfied" do
|
188
|
-
scenario_1 =
|
189
|
-
|
190
|
-
|
191
|
-
scenario_2 = @space.create_scenario(@double)
|
192
|
-
scenario_2.with_any_args.returns {:return_2}.once
|
219
|
+
scenario_1 = create_scenario {:return_1}
|
220
|
+
scenario_2 = create_scenario {:return_2}
|
193
221
|
|
194
222
|
@object.foobar(:anything)
|
195
223
|
@object.foobar(:anything)
|
@@ -197,5 +225,12 @@ describe Double, " method dispatching where there are scenarios with duplicate W
|
|
197
225
|
@object.foobar(:anything)
|
198
226
|
end.should raise_error(Errors::TimesCalledError)
|
199
227
|
end
|
228
|
+
|
229
|
+
def create_scenario(&return_value)
|
230
|
+
scenario = @space.create_scenario(@double)
|
231
|
+
scenario.with_any_args.once.returns(&return_value)
|
232
|
+
scenario.should be_terminal
|
233
|
+
scenario
|
234
|
+
end
|
200
235
|
end
|
201
236
|
end
|
File without changes
|
data/examples/rr/{double_register_scenario_example.rb → double/double_register_scenario_example.rb}
RENAMED
File without changes
|
File without changes
|
File without changes
|
data/examples/rr/expectations/times_called_expectation/times_called_expectation_any_times_example.rb
CHANGED
@@ -38,5 +38,13 @@ module Expectations
|
|
38
38
|
10.times {@expectation.attempt!}
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
describe TimesCalledExpectation, "#terminal? with AnyTimesMatcher" do
|
43
|
+
it_should_behave_like "RR::Expectations::TimesCalledExpectation with AnyTimesMatcher"
|
44
|
+
|
45
|
+
it "returns false" do
|
46
|
+
@expectation.should_not be_terminal
|
47
|
+
end
|
48
|
+
end
|
41
49
|
end
|
42
50
|
end
|
data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_least_example.rb
CHANGED
@@ -61,5 +61,13 @@ module Expectations
|
|
61
61
|
@expectation.attempt!
|
62
62
|
end
|
63
63
|
end
|
64
|
+
|
65
|
+
describe TimesCalledExpectation, "#terminal? with AtLeastMatcher" do
|
66
|
+
it_should_behave_like "RR::Expectations::TimesCalledExpectation with AtLeastMatcher"
|
67
|
+
|
68
|
+
it "returns false" do
|
69
|
+
@expectation.should_not be_terminal
|
70
|
+
end
|
71
|
+
end
|
64
72
|
end
|
65
73
|
end
|
data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_most_example.rb
CHANGED
@@ -65,5 +65,13 @@ module Expectations
|
|
65
65
|
@expectation.attempt!
|
66
66
|
end
|
67
67
|
end
|
68
|
+
|
69
|
+
describe TimesCalledExpectation, "#terminal? with AtMostMatcher" do
|
70
|
+
it_should_behave_like "RR::Expectations::TimesCalledExpectation with AtMostMatcher"
|
71
|
+
|
72
|
+
it "returns true" do
|
73
|
+
@expectation.should be_terminal
|
74
|
+
end
|
75
|
+
end
|
68
76
|
end
|
69
77
|
end
|
data/examples/rr/expectations/times_called_expectation/times_called_expectation_integer_example.rb
CHANGED
@@ -97,6 +97,14 @@ module Expectations
|
|
97
97
|
@expectation.attempt!
|
98
98
|
end.should raise_error(Errors::TimesCalledError)
|
99
99
|
end
|
100
|
-
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe TimesCalledExpectation, "#terminal? with IntegerMatcher" do
|
103
|
+
it_should_behave_like "RR::Expectations::TimesCalledExpectation with IntegerMatcher"
|
104
|
+
|
105
|
+
it "returns true" do
|
106
|
+
@expectation.should be_terminal
|
107
|
+
end
|
108
|
+
end
|
101
109
|
end
|
102
110
|
end
|
data/examples/rr/expectations/times_called_expectation/times_called_expectation_proc_example.rb
CHANGED
@@ -76,5 +76,13 @@ module Expectations
|
|
76
76
|
@object.foobar
|
77
77
|
end
|
78
78
|
end
|
79
|
+
|
80
|
+
describe TimesCalledExpectation, "#terminal? with ProcMatcher" do
|
81
|
+
it_should_behave_like "RR::Expectations::TimesCalledExpectation with ProcMatcher"
|
82
|
+
|
83
|
+
it "returns false" do
|
84
|
+
@expectation.should_not be_terminal
|
85
|
+
end
|
86
|
+
end
|
79
87
|
end
|
80
88
|
end
|
data/examples/rr/expectations/times_called_expectation/times_called_expectation_range_example.rb
CHANGED
@@ -76,6 +76,14 @@ module Expectations
|
|
76
76
|
@expectation.attempt!
|
77
77
|
raises_expectation_error {@expectation.attempt!}
|
78
78
|
end
|
79
|
-
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe TimesCalledExpectation, "#terminal? with RangeMatcher" do
|
82
|
+
it_should_behave_like "RR::Expectations::TimesCalledExpectation with RangeMatcher"
|
83
|
+
|
84
|
+
it "returns true" do
|
85
|
+
@expectation.should be_terminal
|
86
|
+
end
|
87
|
+
end
|
80
88
|
end
|
81
89
|
end
|
@@ -214,7 +214,7 @@ describe Scenario, "#ordered" do
|
|
214
214
|
end
|
215
215
|
|
216
216
|
it "sets return value when block passed in" do
|
217
|
-
@scenario.with_any_args.ordered {:return_value}
|
217
|
+
@scenario.with_any_args.once.ordered {:return_value}
|
218
218
|
@object.foobar.should == :return_value
|
219
219
|
end
|
220
220
|
end
|
@@ -369,15 +369,14 @@ describe Scenario, "#call implemented by a proc" do
|
|
369
369
|
scenario1 = @scenario
|
370
370
|
scenario2 = @space.create_scenario(@double)
|
371
371
|
|
372
|
-
scenario1.with(1).returns {:return_1}.ordered
|
373
|
-
scenario2.with(2).returns {:return_2}.ordered
|
372
|
+
scenario1.with(1).returns {:return_1}.ordered.once
|
373
|
+
scenario2.with(2).returns {:return_2}.ordered.once
|
374
374
|
|
375
375
|
proc do
|
376
376
|
@object.foobar(2)
|
377
377
|
end.should raise_error(
|
378
378
|
Errors::ScenarioOrderError,
|
379
|
-
"foobar(2)\n" <<
|
380
|
-
"called out of order in list\n" <<
|
379
|
+
"foobar(2) called out of order in list\n" <<
|
381
380
|
"- foobar(1)\n" <<
|
382
381
|
"- foobar(2)"
|
383
382
|
)
|
@@ -553,6 +552,27 @@ describe Scenario, "#verify" do
|
|
553
552
|
end
|
554
553
|
end
|
555
554
|
|
555
|
+
describe Scenario, "#terminal?" do
|
556
|
+
it_should_behave_like "RR::Scenario"
|
557
|
+
|
558
|
+
it "returns true when times_called_expectation's terminal? is true" do
|
559
|
+
@scenario.once
|
560
|
+
@scenario.times_called_expectation.should be_terminal
|
561
|
+
@scenario.should be_terminal
|
562
|
+
end
|
563
|
+
|
564
|
+
it "returns false when times_called_expectation's terminal? is false" do
|
565
|
+
@scenario.any_number_of_times
|
566
|
+
@scenario.times_called_expectation.should_not be_terminal
|
567
|
+
@scenario.should_not be_terminal
|
568
|
+
end
|
569
|
+
|
570
|
+
it "returns false when there is not times_called_expectation" do
|
571
|
+
@scenario.times_called_expectation.should be_nil
|
572
|
+
@scenario.should_not be_terminal
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
556
576
|
describe Scenario, "#method_name" do
|
557
577
|
it_should_behave_like "RR::Scenario"
|
558
578
|
|
@@ -575,4 +595,4 @@ describe Scenario, "#expected_arguments" do
|
|
575
595
|
@scenario.expected_arguments.should == []
|
576
596
|
end
|
577
597
|
end
|
578
|
-
end
|
598
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -99,6 +99,21 @@ describe Space, "#verify_ordered_scenario", :shared => true do
|
|
99
99
|
@method_name = :foobar
|
100
100
|
@double = @space.create_double(@object, @method_name)
|
101
101
|
end
|
102
|
+
|
103
|
+
it "raises an error when Scenario is NonTerminal" do
|
104
|
+
scenario = @space.create_scenario(@double)
|
105
|
+
@space.register_ordered_scenario(scenario)
|
106
|
+
|
107
|
+
scenario.any_number_of_times
|
108
|
+
scenario.should_not be_terminal
|
109
|
+
|
110
|
+
proc do
|
111
|
+
@space.verify_ordered_scenario(scenario)
|
112
|
+
end.should raise_error(
|
113
|
+
Errors::ScenarioOrderError,
|
114
|
+
"Ordered Scenarios cannot have a NonTerminal TimesCalledExpectation"
|
115
|
+
)
|
116
|
+
end
|
102
117
|
end
|
103
118
|
|
104
119
|
describe Space, "#verify_ordered_scenario where the passed in scenario is at the front of the queue" do
|
@@ -132,20 +147,23 @@ describe Space, "#verify_ordered_scenario where the passed in scenario is not at
|
|
132
147
|
it_should_behave_like "RR::Space#verify_ordered_scenario"
|
133
148
|
|
134
149
|
it "raises error" do
|
135
|
-
first_scenario =
|
136
|
-
|
137
|
-
second_scenario = @space.create_scenario(@double)
|
138
|
-
@space.register_ordered_scenario(second_scenario)
|
150
|
+
first_scenario = create_scenario
|
151
|
+
second_scenario = create_scenario
|
139
152
|
|
140
153
|
proc do
|
141
154
|
@space.verify_ordered_scenario(second_scenario)
|
142
155
|
end.should raise_error(
|
143
156
|
Errors::ScenarioOrderError,
|
144
|
-
"foobar()\n" <<
|
145
|
-
"called out of order in list\n" <<
|
157
|
+
"foobar() called out of order in list\n" <<
|
146
158
|
"- foobar()\n" <<
|
147
159
|
"- foobar()"
|
148
160
|
)
|
149
161
|
end
|
162
|
+
|
163
|
+
def create_scenario
|
164
|
+
scenario = @space.create_scenario(@double).once
|
165
|
+
@space.register_ordered_scenario(scenario)
|
166
|
+
scenario
|
167
|
+
end
|
150
168
|
end
|
151
169
|
end
|
@@ -2,6 +2,12 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module TimesCalledMatchers
|
5
|
+
describe AnyTimesMatcher, :shared => true do
|
6
|
+
before do
|
7
|
+
@matcher = AnyTimesMatcher.new
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
5
11
|
describe TimesCalledMatcher, ".create when passed a AnyTimesMatcher" do
|
6
12
|
it "returns the passed in argument" do
|
7
13
|
matcher = AnyTimesMatcher.new
|
@@ -10,9 +16,7 @@ module TimesCalledMatchers
|
|
10
16
|
end
|
11
17
|
|
12
18
|
describe AnyTimesMatcher, "#possible_match?" do
|
13
|
-
|
14
|
-
@matcher = AnyTimesMatcher.new
|
15
|
-
end
|
19
|
+
it_should_behave_like "RR::TimesCalledMatchers::AnyTimesMatcher"
|
16
20
|
|
17
21
|
it "always returns true" do
|
18
22
|
@matcher.should be_possible_match(0)
|
@@ -21,9 +25,7 @@ module TimesCalledMatchers
|
|
21
25
|
end
|
22
26
|
|
23
27
|
describe AnyTimesMatcher, "#matches?" do
|
24
|
-
|
25
|
-
@matcher = AnyTimesMatcher.new
|
26
|
-
end
|
28
|
+
it_should_behave_like "RR::TimesCalledMatchers::AnyTimesMatcher"
|
27
29
|
|
28
30
|
it "always returns true" do
|
29
31
|
@matcher.should be_matches(0)
|
@@ -32,20 +34,24 @@ module TimesCalledMatchers
|
|
32
34
|
end
|
33
35
|
|
34
36
|
describe AnyTimesMatcher, "#attempt?" do
|
35
|
-
|
36
|
-
@matcher = AnyTimesMatcher.new
|
37
|
-
end
|
37
|
+
it_should_behave_like "RR::TimesCalledMatchers::AnyTimesMatcher"
|
38
38
|
|
39
39
|
it "always returns true" do
|
40
40
|
@matcher.should be_attempt(0)
|
41
41
|
@matcher.should be_attempt(99999)
|
42
42
|
end
|
43
|
-
end
|
43
|
+
end
|
44
44
|
|
45
|
-
describe AnyTimesMatcher, "#
|
46
|
-
|
47
|
-
|
45
|
+
describe AnyTimesMatcher, "#terminal?" do
|
46
|
+
it_should_behave_like "RR::TimesCalledMatchers::AnyTimesMatcher"
|
47
|
+
|
48
|
+
it "returns false" do
|
49
|
+
@matcher.should_not be_terminal
|
48
50
|
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe AnyTimesMatcher, "#error_message" do
|
54
|
+
it_should_behave_like "RR::TimesCalledMatchers::AnyTimesMatcher"
|
49
55
|
|
50
56
|
it "has an error message" do
|
51
57
|
@matcher.error_message(2).should == (
|
@@ -2,6 +2,13 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module TimesCalledMatchers
|
5
|
+
describe AtLeastMatcher, :shared => true do
|
6
|
+
before do
|
7
|
+
@times = 3
|
8
|
+
@matcher = AtLeastMatcher.new(@times)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
describe TimesCalledMatcher, ".create when passed a AtLeastMatcher" do
|
6
13
|
it "returns the passed in argument" do
|
7
14
|
matcher = AtLeastMatcher.new(5)
|
@@ -10,10 +17,7 @@ module TimesCalledMatchers
|
|
10
17
|
end
|
11
18
|
|
12
19
|
describe AtLeastMatcher, "#possible_match?" do
|
13
|
-
|
14
|
-
@times = 3
|
15
|
-
@matcher = AtLeastMatcher.new(@times)
|
16
|
-
end
|
20
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtLeastMatcher"
|
17
21
|
|
18
22
|
it "always returns true" do
|
19
23
|
@matcher.should be_possible_match(99999)
|
@@ -21,10 +25,7 @@ module TimesCalledMatchers
|
|
21
25
|
end
|
22
26
|
|
23
27
|
describe AtLeastMatcher, "#matches?" do
|
24
|
-
|
25
|
-
@times = 3
|
26
|
-
@matcher = AtLeastMatcher.new(@times)
|
27
|
-
end
|
28
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtLeastMatcher"
|
28
29
|
|
29
30
|
it "returns false when times_called less than times" do
|
30
31
|
@matcher.should_not be_matches(2)
|
@@ -40,10 +41,7 @@ module TimesCalledMatchers
|
|
40
41
|
end
|
41
42
|
|
42
43
|
describe AtLeastMatcher, "#attempt?" do
|
43
|
-
|
44
|
-
@times = 3
|
45
|
-
@matcher = AtLeastMatcher.new(@times)
|
46
|
-
end
|
44
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtLeastMatcher"
|
47
45
|
|
48
46
|
it "always returns true" do
|
49
47
|
@matcher.should be_attempt(1)
|
@@ -51,11 +49,16 @@ module TimesCalledMatchers
|
|
51
49
|
end
|
52
50
|
end
|
53
51
|
|
54
|
-
describe
|
55
|
-
|
56
|
-
|
57
|
-
|
52
|
+
describe AnyTimesMatcher, "#terminal?" do
|
53
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtLeastMatcher"
|
54
|
+
|
55
|
+
it "returns false" do
|
56
|
+
@matcher.should_not be_terminal
|
58
57
|
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe AtLeastMatcher, "#error_message" do
|
61
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtLeastMatcher"
|
59
62
|
|
60
63
|
it "has an error message" do
|
61
64
|
@matcher.error_message(2).should == (
|
@@ -2,6 +2,13 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module TimesCalledMatchers
|
5
|
+
describe AtMostMatcher, :shared => true do
|
6
|
+
before do
|
7
|
+
@times = 3
|
8
|
+
@matcher = AtMostMatcher.new(@times)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
describe TimesCalledMatcher, ".create when passed a AtMostMatcher" do
|
6
13
|
it "returns the passed in argument" do
|
7
14
|
matcher = AtMostMatcher.new(5)
|
@@ -10,10 +17,7 @@ module TimesCalledMatchers
|
|
10
17
|
end
|
11
18
|
|
12
19
|
describe AtMostMatcher, "#possible_match?" do
|
13
|
-
|
14
|
-
@times = 3
|
15
|
-
@matcher = AtMostMatcher.new(@times)
|
16
|
-
end
|
20
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtMostMatcher"
|
17
21
|
|
18
22
|
it "returns true when times called < times" do
|
19
23
|
@matcher.should be_possible_match(2)
|
@@ -29,10 +33,7 @@ module TimesCalledMatchers
|
|
29
33
|
end
|
30
34
|
|
31
35
|
describe AtMostMatcher, "#matches?" do
|
32
|
-
|
33
|
-
@times = 3
|
34
|
-
@matcher = AtMostMatcher.new(@times)
|
35
|
-
end
|
36
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtMostMatcher"
|
36
37
|
|
37
38
|
it "returns true when times_called less than times" do
|
38
39
|
@matcher.should be_matches(2)
|
@@ -48,10 +49,7 @@ module TimesCalledMatchers
|
|
48
49
|
end
|
49
50
|
|
50
51
|
describe AtMostMatcher, "#attempt?" do
|
51
|
-
|
52
|
-
@times = 3
|
53
|
-
@matcher = AtMostMatcher.new(@times)
|
54
|
-
end
|
52
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtMostMatcher"
|
55
53
|
|
56
54
|
it "returns true when less than expected times" do
|
57
55
|
@matcher.should be_attempt(2)
|
@@ -66,11 +64,16 @@ module TimesCalledMatchers
|
|
66
64
|
end
|
67
65
|
end
|
68
66
|
|
69
|
-
describe
|
70
|
-
|
71
|
-
|
72
|
-
|
67
|
+
describe AnyTimesMatcher, "#terminal?" do
|
68
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtMostMatcher"
|
69
|
+
|
70
|
+
it "returns true" do
|
71
|
+
@matcher.should be_terminal
|
73
72
|
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe AtMostMatcher, "#error_message" do
|
76
|
+
it_should_behave_like "RR::TimesCalledMatchers::AtMostMatcher"
|
74
77
|
|
75
78
|
it "has an error message" do
|
76
79
|
@matcher.error_message(5).should == (
|
@@ -2,6 +2,13 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module TimesCalledMatchers
|
5
|
+
describe IntegerMatcher, :shared => true do
|
6
|
+
before do
|
7
|
+
@times = 3
|
8
|
+
@matcher = IntegerMatcher.new(@times)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
describe TimesCalledMatcher, ".create when passed a IntegerMatcher" do
|
6
13
|
it "returns the passed in argument" do
|
7
14
|
matcher = IntegerMatcher.new(5)
|
@@ -16,10 +23,7 @@ module TimesCalledMatchers
|
|
16
23
|
end
|
17
24
|
|
18
25
|
describe IntegerMatcher, "#possible_match?" do
|
19
|
-
|
20
|
-
@times = 3
|
21
|
-
@matcher = IntegerMatcher.new(@times)
|
22
|
-
end
|
26
|
+
it_should_behave_like "RR::TimesCalledMatchers::IntegerMatcher"
|
23
27
|
|
24
28
|
it "returns true when times called < times" do
|
25
29
|
@matcher.should be_possible_match(2)
|
@@ -35,10 +39,7 @@ module TimesCalledMatchers
|
|
35
39
|
end
|
36
40
|
|
37
41
|
describe IntegerMatcher, "#matches?" do
|
38
|
-
|
39
|
-
@times = 3
|
40
|
-
@matcher = IntegerMatcher.new(@times)
|
41
|
-
end
|
42
|
+
it_should_behave_like "RR::TimesCalledMatchers::IntegerMatcher"
|
42
43
|
|
43
44
|
it "returns false when times_called less than times" do
|
44
45
|
@matcher.should_not be_matches(2)
|
@@ -54,10 +55,7 @@ module TimesCalledMatchers
|
|
54
55
|
end
|
55
56
|
|
56
57
|
describe IntegerMatcher, "#attempt?" do
|
57
|
-
|
58
|
-
@times = 3
|
59
|
-
@matcher = IntegerMatcher.new(@times)
|
60
|
-
end
|
58
|
+
it_should_behave_like "RR::TimesCalledMatchers::IntegerMatcher"
|
61
59
|
|
62
60
|
it "returns true when less than expected times" do
|
63
61
|
@matcher.should be_attempt(2)
|
@@ -72,11 +70,16 @@ module TimesCalledMatchers
|
|
72
70
|
end
|
73
71
|
end
|
74
72
|
|
75
|
-
describe
|
76
|
-
|
77
|
-
|
78
|
-
|
73
|
+
describe AnyTimesMatcher, "#terminal?" do
|
74
|
+
it_should_behave_like "RR::TimesCalledMatchers::IntegerMatcher"
|
75
|
+
|
76
|
+
it "returns true" do
|
77
|
+
@matcher.should be_terminal
|
79
78
|
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe IntegerMatcher, "#error_message" do
|
82
|
+
it_should_behave_like "RR::TimesCalledMatchers::IntegerMatcher"
|
80
83
|
|
81
84
|
it "has an error message" do
|
82
85
|
@matcher.error_message(2).should == (
|
@@ -2,6 +2,13 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module TimesCalledMatchers
|
5
|
+
describe ProcMatcher, :shared => true do
|
6
|
+
before do
|
7
|
+
@times = proc {|other| other == 3}
|
8
|
+
@matcher = ProcMatcher.new(@times)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
describe TimesCalledMatcher, ".create when passed a ProcMatcher" do
|
6
13
|
it "returns the passed in argument" do
|
7
14
|
matcher = ProcMatcher.new(proc {|other| other == 5})
|
@@ -17,10 +24,7 @@ module TimesCalledMatchers
|
|
17
24
|
end
|
18
25
|
|
19
26
|
describe ProcMatcher, "#possible_match?" do
|
20
|
-
|
21
|
-
@times = proc {|other| other == 3}
|
22
|
-
@matcher = ProcMatcher.new(@times)
|
23
|
-
end
|
27
|
+
it_should_behave_like "RR::TimesCalledMatchers::ProcMatcher"
|
24
28
|
|
25
29
|
it "always returns true" do
|
26
30
|
@matcher.should be_possible_match(2)
|
@@ -30,10 +34,7 @@ module TimesCalledMatchers
|
|
30
34
|
end
|
31
35
|
|
32
36
|
describe ProcMatcher, "#matches?" do
|
33
|
-
|
34
|
-
@times = proc {|other| other == 3}
|
35
|
-
@matcher = ProcMatcher.new(@times)
|
36
|
-
end
|
37
|
+
it_should_behave_like "RR::TimesCalledMatchers::ProcMatcher"
|
37
38
|
|
38
39
|
it "returns false when proc returns false" do
|
39
40
|
@times.call(2).should be_false
|
@@ -47,10 +48,7 @@ module TimesCalledMatchers
|
|
47
48
|
end
|
48
49
|
|
49
50
|
describe ProcMatcher, "#attempt?" do
|
50
|
-
|
51
|
-
@times = proc {|other| other == 3}
|
52
|
-
@matcher = ProcMatcher.new(@times)
|
53
|
-
end
|
51
|
+
it_should_behave_like "RR::TimesCalledMatchers::ProcMatcher"
|
54
52
|
|
55
53
|
it "always returns true" do
|
56
54
|
@matcher.should be_attempt(2)
|
@@ -59,11 +57,16 @@ module TimesCalledMatchers
|
|
59
57
|
end
|
60
58
|
end
|
61
59
|
|
62
|
-
describe ProcMatcher, "#
|
63
|
-
|
64
|
-
|
65
|
-
|
60
|
+
describe ProcMatcher, "#terminal?" do
|
61
|
+
it_should_behave_like "RR::TimesCalledMatchers::ProcMatcher"
|
62
|
+
|
63
|
+
it "returns false" do
|
64
|
+
@matcher.should_not be_terminal
|
66
65
|
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe ProcMatcher, "#error_message" do
|
69
|
+
it_should_behave_like "RR::TimesCalledMatchers::ProcMatcher"
|
67
70
|
|
68
71
|
it "has an error message" do
|
69
72
|
@matcher.error_message(1).should =~
|
@@ -2,6 +2,13 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module TimesCalledMatchers
|
5
|
+
describe RangeMatcher, :shared => true do
|
6
|
+
before do
|
7
|
+
@times = 2..4
|
8
|
+
@matcher = RangeMatcher.new(@times)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
describe TimesCalledMatcher, ".create when passed a IntegerMatcher" do
|
6
13
|
it "returns the passed in argument" do
|
7
14
|
matcher = RangeMatcher.new(2..4)
|
@@ -16,10 +23,7 @@ module TimesCalledMatchers
|
|
16
23
|
end
|
17
24
|
|
18
25
|
describe RangeMatcher, "#possible_match?" do
|
19
|
-
|
20
|
-
@times = 2..4
|
21
|
-
@matcher = RangeMatcher.new(@times)
|
22
|
-
end
|
26
|
+
it_should_behave_like "RR::TimesCalledMatchers::RangeMatcher"
|
23
27
|
|
24
28
|
it "returns true when times called < start of range" do
|
25
29
|
@matcher.should be_possible_match(1)
|
@@ -37,10 +41,7 @@ module TimesCalledMatchers
|
|
37
41
|
end
|
38
42
|
|
39
43
|
describe RangeMatcher, "#matches?" do
|
40
|
-
|
41
|
-
@times = 2..4
|
42
|
-
@matcher = RangeMatcher.new(@times)
|
43
|
-
end
|
44
|
+
it_should_behave_like "RR::TimesCalledMatchers::RangeMatcher"
|
44
45
|
|
45
46
|
it "returns false when times_called less than start of range" do
|
46
47
|
@matcher.should_not be_matches(1)
|
@@ -58,10 +59,7 @@ module TimesCalledMatchers
|
|
58
59
|
end
|
59
60
|
|
60
61
|
describe RangeMatcher, "#attempt?" do
|
61
|
-
|
62
|
-
@times = 2..4
|
63
|
-
@matcher = RangeMatcher.new(@times)
|
64
|
-
end
|
62
|
+
it_should_behave_like "RR::TimesCalledMatchers::RangeMatcher"
|
65
63
|
|
66
64
|
it "returns true when less than start of range" do
|
67
65
|
@matcher.should be_attempt(1)
|
@@ -78,11 +76,16 @@ module TimesCalledMatchers
|
|
78
76
|
end
|
79
77
|
end
|
80
78
|
|
81
|
-
describe RangeMatcher, "#
|
82
|
-
|
83
|
-
|
84
|
-
|
79
|
+
describe RangeMatcher, "#terminal?" do
|
80
|
+
it_should_behave_like "RR::TimesCalledMatchers::RangeMatcher"
|
81
|
+
|
82
|
+
it "returns true" do
|
83
|
+
@matcher.should be_terminal
|
85
84
|
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe RangeMatcher, "#error_message" do
|
88
|
+
it_should_behave_like "RR::TimesCalledMatchers::RangeMatcher"
|
86
89
|
|
87
90
|
it "has an error message" do
|
88
91
|
@matcher.error_message(1).should == (
|
data/lib/rr.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require "rr/space"
|
3
2
|
require "rr/double"
|
4
3
|
|
5
4
|
require "rr/creator"
|
@@ -9,7 +8,7 @@ require "rr/probe_creator"
|
|
9
8
|
require "rr/do_not_allow_creator"
|
10
9
|
|
11
10
|
require "rr/scenario"
|
12
|
-
require "rr/
|
11
|
+
require "rr/scenario_matches"
|
13
12
|
|
14
13
|
require "rr/errors/rr_error"
|
15
14
|
require "rr/errors/scenario_not_found_error"
|
@@ -29,6 +28,8 @@ require "rr/wildcard_matchers/duck_type"
|
|
29
28
|
require "rr/wildcard_matchers/regexp"
|
30
29
|
require "rr/wildcard_matchers/range"
|
31
30
|
|
31
|
+
require "rr/times_called_matchers/terminal"
|
32
|
+
require "rr/times_called_matchers/non_terminal"
|
32
33
|
require "rr/times_called_matchers/times_called_matcher"
|
33
34
|
require "rr/times_called_matchers/any_times_matcher"
|
34
35
|
require "rr/times_called_matchers/integer_matcher"
|
@@ -37,4 +38,4 @@ require "rr/times_called_matchers/proc_matcher"
|
|
37
38
|
require "rr/times_called_matchers/at_least_matcher"
|
38
39
|
require "rr/times_called_matchers/at_most_matcher"
|
39
40
|
|
40
|
-
require "rr/extensions/double_methods"
|
41
|
+
require "rr/extensions/double_methods"
|
data/lib/rr/double.rb
CHANGED
@@ -63,27 +63,42 @@ module RR
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def call_method(args, block)
|
66
|
-
|
67
|
-
|
68
|
-
if scenario.exact_match?(*args)
|
69
|
-
matching_scenarios << scenario
|
70
|
-
return scenario.call(*args, &block) if scenario.attempt?
|
71
|
-
end
|
72
|
-
end
|
73
|
-
@scenarios.each do |scenario|
|
74
|
-
if scenario.wildcard_match?(*args)
|
75
|
-
matching_scenarios << scenario
|
76
|
-
return scenario.call(*args, &block) if scenario.attempt?
|
77
|
-
end
|
66
|
+
if scenario = find_scenario_to_attempt(args)
|
67
|
+
return scenario.call(*args, &block)
|
78
68
|
end
|
79
|
-
matching_scenarios.first.call(*args) unless matching_scenarios.empty?
|
80
69
|
scenario_not_found_error(*args)
|
81
70
|
end
|
82
71
|
|
83
72
|
protected
|
73
|
+
def find_scenario_to_attempt(args)
|
74
|
+
matches = ScenarioMatches.new(@scenarios).find_all_matches!(args)
|
75
|
+
|
76
|
+
unless matches.exact_terminal_scenarios_to_attempt.empty?
|
77
|
+
return matches.exact_terminal_scenarios_to_attempt.first
|
78
|
+
end
|
79
|
+
|
80
|
+
unless matches.exact_non_terminal_scenarios_to_attempt.empty?
|
81
|
+
return matches.exact_non_terminal_scenarios_to_attempt.last
|
82
|
+
end
|
83
|
+
|
84
|
+
unless matches.wildcard_terminal_scenarios_to_attempt.empty?
|
85
|
+
return matches.wildcard_terminal_scenarios_to_attempt.first
|
86
|
+
end
|
87
|
+
|
88
|
+
unless matches.wildcard_non_terminal_scenarios_to_attempt.empty?
|
89
|
+
return matches.wildcard_non_terminal_scenarios_to_attempt.last
|
90
|
+
end
|
91
|
+
|
92
|
+
unless matches.matching_scenarios.empty?
|
93
|
+
# This will raise a TimesCalledError
|
94
|
+
return matches.matching_scenarios.first
|
95
|
+
end
|
96
|
+
|
97
|
+
return nil
|
98
|
+
end
|
99
|
+
|
84
100
|
def scenario_not_found_error(*args)
|
85
|
-
message = "No scenario for #{Scenario.formatted_name(@method_name, args)}\n"
|
86
|
-
message << "in\n"
|
101
|
+
message = "No scenario for #{Scenario.formatted_name(@method_name, args)} in\n"
|
87
102
|
message << Scenario.list_message_part(@scenarios)
|
88
103
|
raise Errors::ScenarioNotFoundError, message
|
89
104
|
end
|
data/lib/rr/scenario.rb
CHANGED
@@ -297,6 +297,11 @@ module RR
|
|
297
297
|
true
|
298
298
|
end
|
299
299
|
|
300
|
+
def terminal?
|
301
|
+
return false unless @times_called_expectation
|
302
|
+
@times_called_expectation.terminal?
|
303
|
+
end
|
304
|
+
|
300
305
|
# The method name that this Scenario is attatched to
|
301
306
|
def method_name
|
302
307
|
double.method_name
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module RR
|
2
|
+
class ScenarioMatches
|
3
|
+
attr_reader :matching_scenarios,
|
4
|
+
:exact_terminal_scenarios_to_attempt,
|
5
|
+
:exact_non_terminal_scenarios_to_attempt,
|
6
|
+
:wildcard_terminal_scenarios_to_attempt,
|
7
|
+
:wildcard_non_terminal_scenarios_to_attempt
|
8
|
+
def initialize(scenarios)
|
9
|
+
@scenarios = scenarios
|
10
|
+
@matching_scenarios = []
|
11
|
+
@exact_terminal_scenarios_to_attempt = []
|
12
|
+
@exact_non_terminal_scenarios_to_attempt = []
|
13
|
+
@wildcard_terminal_scenarios_to_attempt = []
|
14
|
+
@wildcard_non_terminal_scenarios_to_attempt = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def find_all_matches!(args)
|
18
|
+
@scenarios.each do |scenario|
|
19
|
+
if scenario.exact_match?(*args)
|
20
|
+
matching_scenarios << scenario
|
21
|
+
if scenario.attempt?
|
22
|
+
exact_scenario_is_terminal_or_non_terminal scenario
|
23
|
+
end
|
24
|
+
elsif scenario.wildcard_match?(*args)
|
25
|
+
matching_scenarios << scenario
|
26
|
+
if scenario.attempt?
|
27
|
+
wildcard_scenario_is_terminal_or_non_terminal scenario
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
def exact_scenario_is_terminal_or_non_terminal(scenario)
|
36
|
+
if scenario.terminal?
|
37
|
+
exact_terminal_scenarios_to_attempt << scenario
|
38
|
+
else
|
39
|
+
exact_non_terminal_scenarios_to_attempt << scenario
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def wildcard_scenario_is_terminal_or_non_terminal(scenario)
|
44
|
+
if scenario.terminal?
|
45
|
+
wildcard_terminal_scenarios_to_attempt << scenario
|
46
|
+
else
|
47
|
+
wildcard_non_terminal_scenarios_to_attempt << scenario
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/rr/space.rb
CHANGED
@@ -72,9 +72,13 @@ module RR
|
|
72
72
|
# Verifies that the passed in ordered Scenario is being called
|
73
73
|
# in the correct position.
|
74
74
|
def verify_ordered_scenario(scenario)
|
75
|
+
unless scenario.terminal?
|
76
|
+
raise Errors::ScenarioOrderError,
|
77
|
+
"Ordered Scenarios cannot have a NonTerminal TimesCalledExpectation"
|
78
|
+
end
|
75
79
|
unless @ordered_scenarios.first == scenario
|
76
80
|
message = Scenario.formatted_name(scenario.method_name, scenario.expected_arguments)
|
77
|
-
message << "
|
81
|
+
message << " called out of order in list\n"
|
78
82
|
message << Scenario.list_message_part(@ordered_scenarios)
|
79
83
|
raise Errors::ScenarioOrderError, message
|
80
84
|
end
|
@@ -1,21 +1,15 @@
|
|
1
1
|
module RR
|
2
2
|
module TimesCalledMatchers
|
3
3
|
class AnyTimesMatcher < TimesCalledMatcher
|
4
|
+
include NonTerminal
|
5
|
+
|
4
6
|
def initialize
|
5
7
|
end
|
6
8
|
|
7
|
-
def possible_match?(times_called)
|
8
|
-
true
|
9
|
-
end
|
10
|
-
|
11
9
|
def matches?(times_called)
|
12
10
|
true
|
13
11
|
end
|
14
12
|
|
15
|
-
def attempt?(times_called)
|
16
|
-
true
|
17
|
-
end
|
18
|
-
|
19
13
|
protected
|
20
14
|
def expected_message_part
|
21
15
|
"Expected any number of times."
|
@@ -1,18 +1,12 @@
|
|
1
1
|
module RR
|
2
2
|
module TimesCalledMatchers
|
3
3
|
class AtLeastMatcher < TimesCalledMatcher
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
|
4
|
+
include NonTerminal
|
5
|
+
|
8
6
|
def matches?(times_called)
|
9
7
|
times_called >= @times
|
10
8
|
end
|
11
9
|
|
12
|
-
def attempt?(times_called)
|
13
|
-
true
|
14
|
-
end
|
15
|
-
|
16
10
|
protected
|
17
11
|
def expected_message_part
|
18
12
|
"Expected at least #{@times.inspect} times."
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RR
|
2
|
+
module TimesCalledMatchers
|
3
|
+
# Including this module marks the TimesCalledMatcher as NonTerminal.
|
4
|
+
# Being NonTerminal means the Scenario will not "terminate" even when
|
5
|
+
# called infinite times.
|
6
|
+
#
|
7
|
+
# The Scenario that uses a NonTerminal TimesCalledMatcher will
|
8
|
+
# continue using the Scenario when passed the matching arguments.
|
9
|
+
# This is done by the attempt? always returning true.
|
10
|
+
#
|
11
|
+
# This is in opposition to Terminal TimesCalledMatchers, where
|
12
|
+
# attempt? will eventually return false.
|
13
|
+
module NonTerminal
|
14
|
+
def terminal?
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
def possible_match?(times_called)
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def attempt?(times_called)
|
23
|
+
true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,17 +1,11 @@
|
|
1
1
|
module RR
|
2
2
|
module TimesCalledMatchers
|
3
3
|
class ProcMatcher < TimesCalledMatcher
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
|
4
|
+
include NonTerminal
|
5
|
+
|
8
6
|
def matches?(times_called)
|
9
7
|
@times.call(times_called)
|
10
8
|
end
|
11
|
-
|
12
|
-
def attempt?(times_called)
|
13
|
-
possible_match?(times_called)
|
14
|
-
end
|
15
9
|
end
|
16
10
|
end
|
17
11
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RR
|
2
|
+
module TimesCalledMatchers
|
3
|
+
# Including this module marks the TimesCalledMatcher as Terminal.
|
4
|
+
# Being Terminal the Scenario will "terminate" when times called is
|
5
|
+
# finite.
|
6
|
+
#
|
7
|
+
# The Scenario that uses a Terminal TimesCalledMatcher will
|
8
|
+
# eventually be passed over to the next Scenario when passed
|
9
|
+
# the matching arguments enough times. This is done by the attempt?
|
10
|
+
# method returning false when executed a finite number of times.
|
11
|
+
#
|
12
|
+
# This is in opposition to NonTerminal TimesCalledMatchers, where
|
13
|
+
# attempt? will always return true.
|
14
|
+
module Terminal
|
15
|
+
def terminal?
|
16
|
+
true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.3
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rr
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-07-
|
6
|
+
version: 0.1.14
|
7
|
+
date: 2007-07-16 00:00:00 -07:00
|
8
8
|
summary: RR (Double Ruby) is a double framework that features a rich selection of double techniques and a terse syntax. http://xunitpatterns.com/Test%20Double.html
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- lib/rr.rb
|
36
36
|
- lib/rr/scenario.rb
|
37
37
|
- lib/rr/creator.rb
|
38
|
+
- lib/rr/scenario_matches.rb
|
38
39
|
- lib/rr/stub_creator.rb
|
39
40
|
- lib/rr/space.rb
|
40
41
|
- lib/rr/double.rb
|
@@ -47,6 +48,8 @@ files:
|
|
47
48
|
- lib/rr/times_called_matchers/at_least_matcher.rb
|
48
49
|
- lib/rr/times_called_matchers/proc_matcher.rb
|
49
50
|
- lib/rr/times_called_matchers/integer_matcher.rb
|
51
|
+
- lib/rr/times_called_matchers/non_terminal.rb
|
52
|
+
- lib/rr/times_called_matchers/terminal.rb
|
50
53
|
- lib/rr/times_called_matchers/range_matcher.rb
|
51
54
|
- lib/rr/expectations/argument_equality_expectation.rb
|
52
55
|
- lib/rr/expectations/times_called_expectation.rb
|
@@ -72,23 +75,11 @@ files:
|
|
72
75
|
- examples/example_helper.rb
|
73
76
|
- examples/test_unit_example_suite.rb
|
74
77
|
- examples/high_level_example.rb
|
75
|
-
- examples/rr/space_verify_example.rb
|
76
78
|
- examples/rr/probe_creator_example.rb
|
77
|
-
- examples/rr/double_reset_example.rb
|
78
79
|
- examples/rr/mock_creator_example.rb
|
79
80
|
- examples/rr/stub_creator_example.rb
|
80
81
|
- examples/rr/scenario_example.rb
|
81
|
-
- examples/rr/space_reset_example.rb
|
82
|
-
- examples/rr/double_bind_example.rb
|
83
|
-
- examples/rr/double_register_scenario_example.rb
|
84
|
-
- examples/rr/space_create_example.rb
|
85
82
|
- examples/rr/do_not_allow_creator_example.rb
|
86
|
-
- examples/rr/double_example.rb
|
87
|
-
- examples/rr/space_helper.rb
|
88
|
-
- examples/rr/space_example.rb
|
89
|
-
- examples/rr/double_dispatching_example.rb
|
90
|
-
- examples/rr/space_register_example.rb
|
91
|
-
- examples/rr/double_verify_example.rb
|
92
83
|
- examples/rr/rspec/rspec_backtrace_tweaking_example.rb
|
93
84
|
- examples/rr/rspec/rspec_adapter_example.rb
|
94
85
|
- examples/rr/rspec/rspec_usage_example.rb
|
@@ -99,6 +90,12 @@ files:
|
|
99
90
|
- examples/rr/times_called_matchers/proc_matcher_example.rb
|
100
91
|
- examples/rr/times_called_matchers/any_times_matcher_example.rb
|
101
92
|
- examples/rr/times_called_matchers/integer_matcher_example.rb
|
93
|
+
- examples/rr/space/space_verify_example.rb
|
94
|
+
- examples/rr/space/space_reset_example.rb
|
95
|
+
- examples/rr/space/space_create_example.rb
|
96
|
+
- examples/rr/space/space_helper.rb
|
97
|
+
- examples/rr/space/space_example.rb
|
98
|
+
- examples/rr/space/space_register_example.rb
|
102
99
|
- examples/rr/expectations/is_a_argument_equality_expectation_example.rb
|
103
100
|
- examples/rr/expectations/any_argument_expectation_example.rb
|
104
101
|
- examples/rr/expectations/regexp_argument_equality_expectation_example.rb
|
@@ -117,6 +114,12 @@ files:
|
|
117
114
|
- examples/rr/expectations/times_called_expectation/times_called_expectation_at_most_example.rb
|
118
115
|
- examples/rr/expectations/times_called_expectation/times_called_expectation_range_example.rb
|
119
116
|
- examples/rr/errors/rr_error_example.rb
|
117
|
+
- examples/rr/double/double_reset_example.rb
|
118
|
+
- examples/rr/double/double_bind_example.rb
|
119
|
+
- examples/rr/double/double_register_scenario_example.rb
|
120
|
+
- examples/rr/double/double_example.rb
|
121
|
+
- examples/rr/double/double_dispatching_example.rb
|
122
|
+
- examples/rr/double/double_verify_example.rb
|
120
123
|
- examples/rr/test_unit/test_unit_backtrace_test.rb
|
121
124
|
- examples/rr/test_unit/test_helper.rb
|
122
125
|
- examples/rr/test_unit/test_unit_integration_test.rb
|