rspec-expectations 2.8.0 → 2.9.0.rc2
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/.document +5 -0
- data/.yardopts +3 -0
- data/Changelog.md +176 -0
- data/README.md +2 -13
- data/features/custom_matchers/access_running_example.feature +1 -1
- data/features/step_definitions/additional_cli_steps.rb +4 -4
- data/lib/rspec/expectations/fail_with.rb +3 -3
- data/lib/rspec/expectations/handler.rb +3 -5
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers.rb +387 -21
- data/lib/rspec/matchers/built_in.rb +33 -0
- data/lib/rspec/matchers/built_in/base_matcher.rb +58 -0
- data/lib/rspec/matchers/built_in/be.rb +183 -0
- data/lib/rspec/matchers/built_in/be_instance_of.rb +13 -0
- data/lib/rspec/matchers/built_in/be_kind_of.rb +13 -0
- data/lib/rspec/matchers/built_in/be_within.rb +39 -0
- data/lib/rspec/matchers/built_in/change.rb +132 -0
- data/lib/rspec/matchers/built_in/cover.rb +22 -0
- data/lib/rspec/matchers/built_in/eq.rb +26 -0
- data/lib/rspec/matchers/built_in/eql.rb +25 -0
- data/lib/rspec/matchers/built_in/equal.rb +48 -0
- data/lib/rspec/matchers/built_in/exist.rb +28 -0
- data/lib/rspec/matchers/built_in/has.rb +47 -0
- data/lib/rspec/matchers/built_in/have.rb +107 -0
- data/lib/rspec/matchers/built_in/include.rb +52 -0
- data/lib/rspec/matchers/built_in/match.rb +13 -0
- data/lib/rspec/matchers/built_in/match_array.rb +52 -0
- data/lib/rspec/matchers/built_in/raise_error.rb +96 -0
- data/lib/rspec/matchers/built_in/respond_to.rb +73 -0
- data/lib/rspec/matchers/built_in/satisfy.rb +29 -0
- data/lib/rspec/matchers/built_in/throw_symbol.rb +93 -0
- data/lib/rspec/matchers/dsl.rb +1 -1
- data/lib/rspec/matchers/matcher.rb +263 -233
- data/lib/rspec/matchers/method_missing.rb +2 -2
- data/lib/rspec/matchers/operator_matcher.rb +19 -20
- data/spec/rspec/expectations/handler_spec.rb +1 -1
- data/spec/rspec/matchers/base_matcher_spec.rb +1 -2
- data/spec/rspec/matchers/change_spec.rb +3 -3
- data/spec/rspec/matchers/cover_spec.rb +46 -46
- data/spec/rspec/matchers/dsl_spec.rb +36 -3
- data/spec/rspec/matchers/have_spec.rb +2 -2
- data/spec/rspec/matchers/include_spec.rb +1 -1
- data/spec/rspec/matchers/matcher_spec.rb +319 -305
- data/spec/rspec/matchers/method_missing_spec.rb +1 -0
- data/spec/rspec/matchers/operator_matcher_spec.rb +2 -2
- data/spec/rspec/matchers/throw_symbol_spec.rb +103 -105
- metadata +93 -39
- data/lib/rspec/matchers/base_matcher.rb +0 -56
- data/lib/rspec/matchers/be.rb +0 -232
- data/lib/rspec/matchers/be_instance_of.rb +0 -24
- data/lib/rspec/matchers/be_kind_of.rb +0 -24
- data/lib/rspec/matchers/be_within.rb +0 -47
- data/lib/rspec/matchers/change.rb +0 -197
- data/lib/rspec/matchers/cover.rb +0 -36
- data/lib/rspec/matchers/eq.rb +0 -36
- data/lib/rspec/matchers/eql.rb +0 -35
- data/lib/rspec/matchers/equal.rb +0 -58
- data/lib/rspec/matchers/errors.rb +0 -5
- data/lib/rspec/matchers/exist.rb +0 -34
- data/lib/rspec/matchers/has.rb +0 -44
- data/lib/rspec/matchers/have.rb +0 -162
- data/lib/rspec/matchers/include.rb +0 -66
- data/lib/rspec/matchers/match.rb +0 -21
- data/lib/rspec/matchers/match_array.rb +0 -65
- data/lib/rspec/matchers/raise_error.rb +0 -116
- data/lib/rspec/matchers/respond_to.rb +0 -80
- data/lib/rspec/matchers/satisfy.rb +0 -46
- data/lib/rspec/matchers/throw_symbol.rb +0 -112
data/.document
ADDED
data/.yardopts
ADDED
data/Changelog.md
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
### 2.9.0.rc2 / 2012-03-12
|
2
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0...v2.9.0.rc2)
|
3
|
+
|
4
|
+
Enhancements
|
5
|
+
|
6
|
+
* Move built-in matcher classes to RSpec::Matchers::BuiltIn to reduce pollution
|
7
|
+
of RSpec::Matchers (which is included in every example).
|
8
|
+
* Autoload files with matcher classes to improve load time.
|
9
|
+
|
10
|
+
Bug fixes
|
11
|
+
|
12
|
+
* Align respond_to? and method_missing in DSL-defined matchers.
|
13
|
+
* Clear out user-defined instance variables between invocations of DSL-defined
|
14
|
+
matchers.
|
15
|
+
* Dup the instance of a DSL generated matcher so its state is not changed by
|
16
|
+
subsequent invocations.
|
17
|
+
* Treat expected args consistently across positive and negative expectations
|
18
|
+
(thanks to Ralf Kistner for the heads up)
|
19
|
+
|
20
|
+
### 2.8.0 / 2012-01-04
|
21
|
+
|
22
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0.rc2...v2.8.0)
|
23
|
+
|
24
|
+
Enhancements
|
25
|
+
|
26
|
+
* Better diff output for Hash (Philippe Creux)
|
27
|
+
* Eliminate Ruby warnings (Olek Janiszewski)
|
28
|
+
|
29
|
+
### 2.8.0.rc2 / 2011-12-19
|
30
|
+
|
31
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0.rc1...v2.8.0.rc2)
|
32
|
+
|
33
|
+
No changes for this release. Just releasing with the other rspec gems.
|
34
|
+
|
35
|
+
### 2.8.0.rc1 / 2011-11-06
|
36
|
+
|
37
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.7.0...v2.8.0.rc1)
|
38
|
+
|
39
|
+
Enhancements
|
40
|
+
|
41
|
+
* Use classes for the built-in matchers (they're faster).
|
42
|
+
* Eliminate Ruby warnings (Matijs van Zuijlen)
|
43
|
+
|
44
|
+
### 2.7.0 / 2011-10-16
|
45
|
+
|
46
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.6.0...v2.7.0)
|
47
|
+
|
48
|
+
Enhancements
|
49
|
+
|
50
|
+
* `HaveMatcher` converts argument using `to_i` (Alex Bepple & Pat Maddox)
|
51
|
+
* Improved failure message for the `have_xxx` matcher (Myron Marston)
|
52
|
+
* `HaveMatcher` supports `count` (Matthew Bellantoni)
|
53
|
+
* Change matcher dups `Enumerable` before the action, supporting custom
|
54
|
+
`Enumerable` types like `CollectionProxy` in Rails (David Chelimsky)
|
55
|
+
|
56
|
+
Bug fixes
|
57
|
+
|
58
|
+
* Fix typo in `have(n).xyz` documentation (Jean Boussier)
|
59
|
+
* fix `safe_sort` for ruby 1.9.2 (`Kernel` now defines `<=>` for Object) (Peter
|
60
|
+
van Hardenberg)
|
61
|
+
|
62
|
+
### 2.6.0 / 2011-05-12
|
63
|
+
|
64
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.5.0...v2.6.0)
|
65
|
+
|
66
|
+
Enhancements
|
67
|
+
|
68
|
+
* `change` matcher accepts regexps (Robert Davis)
|
69
|
+
* better descriptions for `have_xxx` matchers (Magnus Bergmark)
|
70
|
+
* `range.should cover(*values)` (Anders Furseth)
|
71
|
+
|
72
|
+
Bug fixes
|
73
|
+
|
74
|
+
* Removed non-ascii characters that were choking rcov (Geoffrey Byers)
|
75
|
+
* change matcher dups arrays and hashes so their before/after states can be
|
76
|
+
compared correctly.
|
77
|
+
* Fix the order of inclusion of RSpec::Matchers in Test::Unit::TestCase and
|
78
|
+
MiniTest::Unit::TestCase to prevent a SystemStackError (Myron Marston)
|
79
|
+
|
80
|
+
### 2.5.0 / 2011-02-05
|
81
|
+
|
82
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.4.0...v2.5.0)
|
83
|
+
|
84
|
+
Enhancements
|
85
|
+
|
86
|
+
* `should exist` works with `exist?` or `exists?` (Myron Marston)
|
87
|
+
* `expect { ... }.not_to do_something` (in addition to `to_not`)
|
88
|
+
|
89
|
+
Documentation
|
90
|
+
|
91
|
+
* improved docs for raise_error matcher (James Almond)
|
92
|
+
|
93
|
+
### 2.4.0 / 2011-01-02
|
94
|
+
|
95
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.3.0...v2.4.0)
|
96
|
+
|
97
|
+
No functional changes in this release, which was made to align with the
|
98
|
+
rspec-core-2.4.0 release.
|
99
|
+
|
100
|
+
Enhancements
|
101
|
+
|
102
|
+
* improved RDoc for change matcher (Jo Liss)
|
103
|
+
|
104
|
+
### 2.3.0 / 2010-12-12
|
105
|
+
|
106
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.2.1...v2.3.0)
|
107
|
+
|
108
|
+
Enhancements
|
109
|
+
|
110
|
+
* diff strings when include matcher fails (Mike Sassak)
|
111
|
+
|
112
|
+
### 2.2.0 / 2010-11-28
|
113
|
+
|
114
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.1.0...v2.2.0)
|
115
|
+
|
116
|
+
### 2.1.0 / 2010-11-07
|
117
|
+
|
118
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.1...v2.1.0)
|
119
|
+
|
120
|
+
Enhancements
|
121
|
+
|
122
|
+
* `be_within(delta).of(expected)` matcher (Myron Marston)
|
123
|
+
* Lots of new Cucumber features (Myron Marston)
|
124
|
+
* Raise error if you try `should != expected` on Ruby-1.9 (Myron Marston)
|
125
|
+
* Improved failure messages from `throw_symbol` (Myron Marston)
|
126
|
+
|
127
|
+
Bug fixes
|
128
|
+
|
129
|
+
* Eliminate hard dependency on `RSpec::Core` (Myron Marston)
|
130
|
+
* `have_matcher` - use pluralize only when ActiveSupport inflections are indeed
|
131
|
+
defined (Josep M Bach)
|
132
|
+
* throw_symbol matcher no longer swallows exceptions (Myron Marston)
|
133
|
+
* fix matcher chaining to avoid name collisions (Myron Marston)
|
134
|
+
|
135
|
+
### 2.0.0 / 2010-10-10
|
136
|
+
|
137
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.rc...v2.0.0)
|
138
|
+
|
139
|
+
Enhancements
|
140
|
+
|
141
|
+
* Add match_for_should_not method to matcher DSL (Myron Marston)
|
142
|
+
|
143
|
+
Bug fixes
|
144
|
+
|
145
|
+
* `respond_to` matcher works correctly with `should_not` with multiple methods
|
146
|
+
(Myron Marston)
|
147
|
+
* `include` matcher works correctly with `should_not` with multiple values
|
148
|
+
(Myron Marston)
|
149
|
+
|
150
|
+
### 2.0.0.rc / 2010-10-05
|
151
|
+
|
152
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.22...v2.0.0.rc)
|
153
|
+
|
154
|
+
Enhancements
|
155
|
+
|
156
|
+
* `require 'rspec/expectations'` in a T::U or MiniUnit suite (Josep M. Bach)
|
157
|
+
|
158
|
+
Bug fixes
|
159
|
+
|
160
|
+
* change by 0 passes/fails correctly (Len Smith)
|
161
|
+
* Add description to satisfy matcher
|
162
|
+
|
163
|
+
### 2.0.0.beta.22 / 2010-09-12
|
164
|
+
|
165
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.20...v2.0.0.beta.22)
|
166
|
+
|
167
|
+
Enhancements
|
168
|
+
|
169
|
+
* diffing improvements
|
170
|
+
* diff multiline strings
|
171
|
+
* don't diff single line strings
|
172
|
+
* don't diff numbers (silly)
|
173
|
+
* diff regexp + multiline string
|
174
|
+
|
175
|
+
Bug fixes
|
176
|
+
* `should[_not]` change now handles boolean values correctly
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# RSpec Expectations
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
RSpec::Expectations lets you express expected outcomes on an object in an
|
4
|
+
example.
|
5
5
|
|
6
6
|
account.balance.should eq(Money.new(37.42, :USD))
|
7
7
|
|
@@ -119,8 +119,6 @@ actual.should be_xxx # passes if actual.xxx?
|
|
119
119
|
actual.should have_xxx(:arg) # passes if actual.has_xxx?(:arg)
|
120
120
|
```
|
121
121
|
|
122
|
-
See [RSpec::Matchers](../RSpec/Matchers) for more about predicate matchers.
|
123
|
-
|
124
122
|
### Ranges (Ruby >= 1.9 only)
|
125
123
|
|
126
124
|
```ruby
|
@@ -142,15 +140,6 @@ actual.should include(expected)
|
|
142
140
|
"this string".should include("is str")
|
143
141
|
```
|
144
142
|
|
145
|
-
## Learn more
|
146
|
-
|
147
|
-
See [RSpec::Expectations](../RSpec/Expectations) for more information about
|
148
|
-
`should` and `should_not` and how they work.
|
149
|
-
|
150
|
-
See [RSpec::Matchers](../RSpec/Matchers) for more information about the
|
151
|
-
built-in matchers that ship with rspec-expectations, and how to write your own
|
152
|
-
custom matchers.
|
153
|
-
|
154
143
|
## Also see
|
155
144
|
|
156
145
|
* [http://github.com/rspec/rspec](http://github.com/rspec/rspec)
|
@@ -49,5 +49,5 @@ Feature: access running example
|
|
49
49
|
When I run `rspec ./example_spec.rb`
|
50
50
|
Then the output should contain "1 example, 1 failure"
|
51
51
|
And the output should contain "undefined local variable"
|
52
|
-
And the output should contain "RSpec::Matchers::Matcher"
|
52
|
+
And the output should contain "RSpec::Matchers::DSL::Matcher"
|
53
53
|
And the output should not contain "ExampleGroup"
|
@@ -12,11 +12,11 @@ Then /^the output should contain all of these:$/ do |table|
|
|
12
12
|
end
|
13
13
|
|
14
14
|
Then /^the example(?:s)? should(?: all)? pass$/ do
|
15
|
-
|
16
|
-
|
15
|
+
step %q{the output should contain "0 failures"}
|
16
|
+
step %q{the exit status should be 0}
|
17
17
|
end
|
18
18
|
|
19
19
|
Then /^the example should fail$/ do
|
20
|
-
|
21
|
-
|
20
|
+
step %q{the output should contain "1 failure"}
|
21
|
+
step %q{the exit status should not be 0}
|
22
22
|
end
|
@@ -35,11 +35,11 @@ module RSpec
|
|
35
35
|
private
|
36
36
|
|
37
37
|
def no_procs?(*args)
|
38
|
-
args.none? {|a| Proc === a}
|
38
|
+
args.flatten.none? {|a| Proc === a}
|
39
39
|
end
|
40
40
|
|
41
41
|
def all_strings?(*args)
|
42
|
-
args.all? {|a| String === a}
|
42
|
+
args.flatten.all? {|a| String === a}
|
43
43
|
end
|
44
44
|
|
45
45
|
def any_multiline_strings?(*args)
|
@@ -47,7 +47,7 @@ module RSpec
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def no_numbers?(*args)
|
50
|
-
args.none? {|a| Numeric === a}
|
50
|
+
args.flatten.none? {|a| Numeric === a}
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Expectations
|
3
|
-
class InvalidMatcherError < ArgumentError; end
|
4
|
-
|
5
3
|
class PositiveExpectationHandler
|
6
4
|
def self.handle_matcher(actual, matcher, message=nil, &block)
|
7
5
|
::RSpec::Matchers.last_should = :should
|
8
6
|
::RSpec::Matchers.last_matcher = matcher
|
9
|
-
return ::RSpec::Matchers::PositiveOperatorMatcher.new(actual) if matcher.nil?
|
7
|
+
return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) if matcher.nil?
|
10
8
|
|
11
9
|
match = matcher.matches?(actual, &block)
|
12
10
|
return match if match
|
@@ -27,7 +25,7 @@ module RSpec
|
|
27
25
|
def self.handle_matcher(actual, matcher, message=nil, &block)
|
28
26
|
::RSpec::Matchers.last_should = :should_not
|
29
27
|
::RSpec::Matchers.last_matcher = matcher
|
30
|
-
return ::RSpec::Matchers::NegativeOperatorMatcher.new(actual) if matcher.nil?
|
28
|
+
return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) if matcher.nil?
|
31
29
|
|
32
30
|
match = matcher.respond_to?(:does_not_match?) ?
|
33
31
|
!matcher.does_not_match?(actual, &block) :
|
@@ -39,7 +37,7 @@ module RSpec
|
|
39
37
|
matcher.negative_failure_message
|
40
38
|
|
41
39
|
if matcher.respond_to?(:diffable?) && matcher.diffable?
|
42
|
-
::RSpec::Expectations.fail_with message, matcher.expected
|
40
|
+
::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual
|
43
41
|
else
|
44
42
|
::RSpec::Expectations.fail_with message
|
45
43
|
end
|
data/lib/rspec/matchers.rb
CHANGED
@@ -175,32 +175,398 @@ end
|
|
175
175
|
|
176
176
|
require 'rspec/matchers/extensions/instance_eval_with_args'
|
177
177
|
require 'rspec/matchers/pretty'
|
178
|
-
|
178
|
+
|
179
|
+
require 'rspec/matchers/built_in'
|
179
180
|
require 'rspec/matchers/matcher'
|
180
181
|
require 'rspec/matchers/operator_matcher'
|
181
|
-
require 'rspec/matchers/be'
|
182
182
|
require 'rspec/matchers/be_close'
|
183
|
-
|
184
|
-
require 'rspec/matchers/be_kind_of'
|
185
|
-
require 'rspec/matchers/be_within'
|
183
|
+
|
186
184
|
require 'rspec/matchers/block_aliases'
|
187
|
-
require 'rspec/matchers/change'
|
188
|
-
require 'rspec/matchers/cover' if (1..2).respond_to? :cover?
|
189
|
-
require 'rspec/matchers/eq'
|
190
|
-
require 'rspec/matchers/eql'
|
191
|
-
require 'rspec/matchers/equal'
|
192
|
-
require 'rspec/matchers/errors'
|
193
|
-
require 'rspec/matchers/exist'
|
194
185
|
require 'rspec/matchers/generated_descriptions'
|
195
|
-
require 'rspec/matchers/has'
|
196
|
-
require 'rspec/matchers/have'
|
197
|
-
require 'rspec/matchers/include'
|
198
|
-
require 'rspec/matchers/match'
|
199
|
-
require 'rspec/matchers/match_array'
|
200
186
|
require 'rspec/matchers/method_missing'
|
201
|
-
require 'rspec/matchers/raise_error'
|
202
|
-
require 'rspec/matchers/respond_to'
|
203
|
-
require 'rspec/matchers/satisfy'
|
204
|
-
require 'rspec/matchers/throw_symbol'
|
205
187
|
require 'rspec/matchers/compatibility'
|
206
188
|
require 'rspec/matchers/dsl'
|
189
|
+
|
190
|
+
module RSpec
|
191
|
+
module Matchers
|
192
|
+
|
193
|
+
# Passes if actual is truthy (anything but false or nil)
|
194
|
+
def be_true
|
195
|
+
BuiltIn::BeTrue.new
|
196
|
+
end
|
197
|
+
|
198
|
+
# Passes if actual is falsy (false or nil)
|
199
|
+
def be_false
|
200
|
+
BuiltIn::BeFalse.new
|
201
|
+
end
|
202
|
+
|
203
|
+
# Passes if actual is nil
|
204
|
+
def be_nil
|
205
|
+
BuiltIn::BeNil.new
|
206
|
+
end
|
207
|
+
|
208
|
+
# @example
|
209
|
+
# actual.should be_true
|
210
|
+
# actual.should be_false
|
211
|
+
# actual.should be_nil
|
212
|
+
# actual.should be_[arbitrary_predicate](*args)
|
213
|
+
# actual.should_not be_nil
|
214
|
+
# actual.should_not be_[arbitrary_predicate](*args)
|
215
|
+
#
|
216
|
+
# Given true, false, or nil, will pass if actual value is true, false or
|
217
|
+
# nil (respectively). Given no args means the caller should satisfy an if
|
218
|
+
# condition (to be or not to be).
|
219
|
+
#
|
220
|
+
# Predicates are any Ruby method that ends in a "?" and returns true or
|
221
|
+
# false. Given be_ followed by arbitrary_predicate (without the "?"),
|
222
|
+
# RSpec will match convert that into a query against the target object.
|
223
|
+
#
|
224
|
+
# The arbitrary_predicate feature will handle any predicate prefixed with
|
225
|
+
# "be_an_" (e.g. be_an_instance_of), "be_a_" (e.g. be_a_kind_of) or "be_"
|
226
|
+
# (e.g. be_empty), letting you choose the prefix that best suits the
|
227
|
+
# predicate.
|
228
|
+
def be(*args)
|
229
|
+
args.empty? ?
|
230
|
+
Matchers::BuiltIn::Be.new : equal(*args)
|
231
|
+
end
|
232
|
+
|
233
|
+
# passes if target.kind_of?(klass)
|
234
|
+
def be_a(klass)
|
235
|
+
be_a_kind_of(klass)
|
236
|
+
end
|
237
|
+
|
238
|
+
alias_method :be_an, :be_a
|
239
|
+
|
240
|
+
# Passes if actual.instance_of?(expected)
|
241
|
+
#
|
242
|
+
# @example
|
243
|
+
#
|
244
|
+
# 5.should be_instance_of(Fixnum)
|
245
|
+
# 5.should_not be_instance_of(Numeric)
|
246
|
+
# 5.should_not be_instance_of(Float)
|
247
|
+
def be_an_instance_of(expected)
|
248
|
+
BuiltIn::BeAnInstanceOf.new(expected)
|
249
|
+
end
|
250
|
+
|
251
|
+
alias_method :be_instance_of, :be_an_instance_of
|
252
|
+
|
253
|
+
# Passes if actual.kind_of?(expected)
|
254
|
+
#
|
255
|
+
# @example
|
256
|
+
#
|
257
|
+
# 5.should be_kind_of(Fixnum)
|
258
|
+
# 5.should be_kind_of(Numeric)
|
259
|
+
# 5.should_not be_kind_of(Float)
|
260
|
+
def be_a_kind_of(expected)
|
261
|
+
BuiltIn::BeAKindOf.new(expected)
|
262
|
+
end
|
263
|
+
|
264
|
+
alias_method :be_kind_of, :be_a_kind_of
|
265
|
+
|
266
|
+
# Passes if actual == expected +/- delta
|
267
|
+
#
|
268
|
+
# @example
|
269
|
+
#
|
270
|
+
# result.should be_within(0.5).of(3.0)
|
271
|
+
# result.should_not be_within(0.5).of(3.0)
|
272
|
+
def be_within(delta)
|
273
|
+
BuiltIn::BeWithin.new(delta)
|
274
|
+
end
|
275
|
+
|
276
|
+
# Applied to a proc, specifies that its execution will cause some value to
|
277
|
+
# change.
|
278
|
+
#
|
279
|
+
# @param [Object] receiver
|
280
|
+
# @param [Symbol] message the message to send the receiver
|
281
|
+
#
|
282
|
+
# You can either pass <tt>receiver</tt> and <tt>message</tt>, or a block,
|
283
|
+
# but not both.
|
284
|
+
#
|
285
|
+
# When passing a block, it must use the <tt>{ ... }</tt> format, not
|
286
|
+
# do/end, as <tt>{ ... }</tt> binds to the +change+ method, whereas do/end
|
287
|
+
# would errantly bind to the +should+ or +should_not+ method.
|
288
|
+
#
|
289
|
+
# @example
|
290
|
+
#
|
291
|
+
# lambda {
|
292
|
+
# team.add_player(player)
|
293
|
+
# }.should change(roster, :count)
|
294
|
+
#
|
295
|
+
# lambda {
|
296
|
+
# team.add_player(player)
|
297
|
+
# }.should change(roster, :count).by(1)
|
298
|
+
#
|
299
|
+
# lambda {
|
300
|
+
# team.add_player(player)
|
301
|
+
# }.should change(roster, :count).by_at_least(1)
|
302
|
+
#
|
303
|
+
# lambda {
|
304
|
+
# team.add_player(player)
|
305
|
+
# }.should change(roster, :count).by_at_most(1)
|
306
|
+
#
|
307
|
+
# string = "string"
|
308
|
+
# lambda {
|
309
|
+
# string.reverse!
|
310
|
+
# }.should change { string }.from("string").to("gnirts")
|
311
|
+
#
|
312
|
+
# lambda {
|
313
|
+
# person.happy_birthday
|
314
|
+
# }.should change(person, :birthday).from(32).to(33)
|
315
|
+
#
|
316
|
+
# lambda {
|
317
|
+
# employee.develop_great_new_social_networking_app
|
318
|
+
# }.should change(employee, :title).from("Mail Clerk").to("CEO")
|
319
|
+
#
|
320
|
+
# lambda {
|
321
|
+
# doctor.leave_office
|
322
|
+
# }.should change(doctor, :sign).from(/is in/).to(/is out/)
|
323
|
+
#
|
324
|
+
# user = User.new(:type => "admin")
|
325
|
+
# lambda {
|
326
|
+
# user.symbolize_type
|
327
|
+
# }.should change(user, :type).from(String).to(Symbol)
|
328
|
+
#
|
329
|
+
# == Notes
|
330
|
+
#
|
331
|
+
# Evaluates <tt>receiver.message</tt> or <tt>block</tt> before and after it
|
332
|
+
# evaluates the proc object (generated by the lambdas in the examples
|
333
|
+
# above).
|
334
|
+
#
|
335
|
+
# <tt>should_not change</tt> only supports the form with no subsequent
|
336
|
+
# calls to <tt>by</tt>, <tt>by_at_least</tt>, <tt>by_at_most</tt>,
|
337
|
+
# <tt>to</tt> or <tt>from</tt>.
|
338
|
+
def change(receiver=nil, message=nil, &block)
|
339
|
+
BuiltIn::Change.new(receiver, message, &block)
|
340
|
+
end
|
341
|
+
|
342
|
+
# Passes if actual covers expected. This works for
|
343
|
+
# Ranges. You can also pass in multiple args
|
344
|
+
# and it will only pass if all args are found in Range.
|
345
|
+
#
|
346
|
+
# @example
|
347
|
+
# (1..10).should cover(5)
|
348
|
+
# (1..10).should cover(4, 6)
|
349
|
+
# (1..10).should cover(4, 6, 11) # will fail
|
350
|
+
# (1..10).should_not cover(11)
|
351
|
+
# (1..10).should_not cover(5) # will fail
|
352
|
+
#
|
353
|
+
# ### Warning:: Ruby >= 1.9 only
|
354
|
+
def cover(*values)
|
355
|
+
BuiltIn::Cover.new(*values)
|
356
|
+
end if (1..2).respond_to?(:cover?)
|
357
|
+
|
358
|
+
# Passes if <tt>actual == expected</tt>.
|
359
|
+
#
|
360
|
+
# See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
|
361
|
+
#
|
362
|
+
# @example
|
363
|
+
#
|
364
|
+
# 5.should eq(5)
|
365
|
+
# 5.should_not eq(3)
|
366
|
+
def eq(expected)
|
367
|
+
BuiltIn::Eq.new(expected)
|
368
|
+
end
|
369
|
+
|
370
|
+
# Passes if +actual.eql?(expected)+
|
371
|
+
#
|
372
|
+
# See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
|
373
|
+
#
|
374
|
+
# @example
|
375
|
+
#
|
376
|
+
# 5.should eql(5)
|
377
|
+
# 5.should_not eql(3)
|
378
|
+
def eql(expected)
|
379
|
+
BuiltIn::Eql.new(expected)
|
380
|
+
end
|
381
|
+
|
382
|
+
# Passes if <tt>actual.equal?(expected)</tt> (object identity).
|
383
|
+
#
|
384
|
+
# See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
|
385
|
+
#
|
386
|
+
# @example
|
387
|
+
#
|
388
|
+
# 5.should equal(5) # Fixnums are equal
|
389
|
+
# "5".should_not equal("5") # Strings that look the same are not the same object
|
390
|
+
def equal(expected)
|
391
|
+
BuiltIn::Equal.new(expected)
|
392
|
+
end
|
393
|
+
|
394
|
+
# Passes if `actual.exist?` or `actual.exists?`
|
395
|
+
#
|
396
|
+
# @example
|
397
|
+
# File.should exist("path/to/file")
|
398
|
+
def exist(*args)
|
399
|
+
BuiltIn::Exist.new(*args)
|
400
|
+
end
|
401
|
+
|
402
|
+
# Passes if receiver is a collection with the submitted number of items OR
|
403
|
+
# if the receiver OWNS a collection with the submitted number of items.
|
404
|
+
#
|
405
|
+
# If the receiver OWNS the collection, you must use the name of the
|
406
|
+
# collection. So if a `Team` instance has a collection named `#players`,
|
407
|
+
# you must use that name to set the expectation.
|
408
|
+
#
|
409
|
+
# If the receiver IS the collection, you can use any name you like for
|
410
|
+
# `named_collection`. We'd recommend using either "elements", "members", or
|
411
|
+
# "items" as these are all standard ways of describing the things IN a
|
412
|
+
# collection.
|
413
|
+
#
|
414
|
+
# This also works for Strings, letting you set expectations about their
|
415
|
+
# lengths.
|
416
|
+
#
|
417
|
+
# @example
|
418
|
+
#
|
419
|
+
# # Passes if team.players.size == 11
|
420
|
+
# team.should have(11).players
|
421
|
+
#
|
422
|
+
# # Passes if [1,2,3].length == 3
|
423
|
+
# [1,2,3].should have(3).items #"items" is pure sugar
|
424
|
+
#
|
425
|
+
# # Passes if ['a', 'b', 'c'].count == 3
|
426
|
+
# [1,2,3].should have(3).items #"items" is pure sugar
|
427
|
+
#
|
428
|
+
# # Passes if "this string".length == 11
|
429
|
+
# "this string".should have(11).characters #"characters" is pure sugar
|
430
|
+
def have(n)
|
431
|
+
BuiltIn::Have.new(n)
|
432
|
+
end
|
433
|
+
alias :have_exactly :have
|
434
|
+
|
435
|
+
# Exactly like have() with >=.
|
436
|
+
#
|
437
|
+
# @example
|
438
|
+
# "this".should have_at_least(3).letters
|
439
|
+
#
|
440
|
+
# ### Warning:
|
441
|
+
#
|
442
|
+
# `should_not have_at_least` is not supported
|
443
|
+
def have_at_least(n)
|
444
|
+
BuiltIn::Have.new(n, :at_least)
|
445
|
+
end
|
446
|
+
|
447
|
+
# Exactly like have() with <=.
|
448
|
+
#
|
449
|
+
# @example
|
450
|
+
# should have_at_most(number).items
|
451
|
+
#
|
452
|
+
# ### Warning:
|
453
|
+
#
|
454
|
+
# `should_not have_at_most` is not supported
|
455
|
+
def have_at_most(n)
|
456
|
+
BuiltIn::Have.new(n, :at_most)
|
457
|
+
end
|
458
|
+
|
459
|
+
# Passes if actual includes expected. This works for
|
460
|
+
# collections and Strings. You can also pass in multiple args
|
461
|
+
# and it will only pass if all args are found in collection.
|
462
|
+
#
|
463
|
+
# @example
|
464
|
+
#
|
465
|
+
# [1,2,3].should include(3)
|
466
|
+
# [1,2,3].should include(2,3) #would pass
|
467
|
+
# [1,2,3].should include(2,3,4) #would fail
|
468
|
+
# [1,2,3].should_not include(4)
|
469
|
+
# "spread".should include("read")
|
470
|
+
# "spread".should_not include("red")
|
471
|
+
def include(*expected)
|
472
|
+
BuiltIn::Include.new(*expected)
|
473
|
+
end
|
474
|
+
|
475
|
+
# Given a Regexp or String, passes if actual.match(pattern)
|
476
|
+
#
|
477
|
+
# @example
|
478
|
+
#
|
479
|
+
# email.should match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
|
480
|
+
# email.should match("@example.com")
|
481
|
+
def match(expected)
|
482
|
+
BuiltIn::Match.new(expected)
|
483
|
+
end
|
484
|
+
|
485
|
+
# With no args, matches if any error is raised.
|
486
|
+
# With a named error, matches only if that specific error is raised.
|
487
|
+
# With a named error and messsage specified as a String, matches only if both match.
|
488
|
+
# With a named error and messsage specified as a Regexp, matches only if both match.
|
489
|
+
# Pass an optional block to perform extra verifications on the exception matched
|
490
|
+
#
|
491
|
+
# @example
|
492
|
+
#
|
493
|
+
# lambda { do_something_risky }.should raise_error
|
494
|
+
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError)
|
495
|
+
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError) { |error| error.data.should == 42 }
|
496
|
+
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, "that was too risky")
|
497
|
+
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, /oo ri/)
|
498
|
+
#
|
499
|
+
# lambda { do_something_risky }.should_not raise_error
|
500
|
+
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError)
|
501
|
+
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, "that was too risky")
|
502
|
+
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, /oo ri/)
|
503
|
+
def raise_error(error=Exception, message=nil, &block)
|
504
|
+
BuiltIn::RaiseError.new(error, message, &block)
|
505
|
+
end
|
506
|
+
|
507
|
+
alias_method :raise_exception, :raise_error
|
508
|
+
|
509
|
+
# Matches if the target object responds to all of the names
|
510
|
+
# provided. Names can be Strings or Symbols.
|
511
|
+
#
|
512
|
+
# @example
|
513
|
+
#
|
514
|
+
def respond_to(*names)
|
515
|
+
BuiltIn::RespondTo.new(*names)
|
516
|
+
end
|
517
|
+
|
518
|
+
# Passes if the submitted block returns true. Yields target to the
|
519
|
+
# block.
|
520
|
+
#
|
521
|
+
# Generally speaking, this should be thought of as a last resort when
|
522
|
+
# you can't find any other way to specify the behaviour you wish to
|
523
|
+
# specify.
|
524
|
+
#
|
525
|
+
# If you do find yourself in such a situation, you could always write
|
526
|
+
# a custom matcher, which would likely make your specs more expressive.
|
527
|
+
#
|
528
|
+
# @example
|
529
|
+
#
|
530
|
+
# 5.should satisfy { |n|
|
531
|
+
# n > 3
|
532
|
+
# }
|
533
|
+
def satisfy(&block)
|
534
|
+
BuiltIn::Satisfy.new(&block)
|
535
|
+
end
|
536
|
+
|
537
|
+
# Given no argument, matches if a proc throws any Symbol.
|
538
|
+
#
|
539
|
+
# Given a Symbol, matches if the given proc throws the specified Symbol.
|
540
|
+
#
|
541
|
+
# Given a Symbol and an arg, matches if the given proc throws the
|
542
|
+
# specified Symbol with the specified arg.
|
543
|
+
#
|
544
|
+
# @example
|
545
|
+
#
|
546
|
+
# lambda { do_something_risky }.should throw_symbol
|
547
|
+
# lambda { do_something_risky }.should throw_symbol(:that_was_risky)
|
548
|
+
# lambda { do_something_risky }.should throw_symbol(:that_was_risky, culprit)
|
549
|
+
#
|
550
|
+
# lambda { do_something_risky }.should_not throw_symbol
|
551
|
+
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky)
|
552
|
+
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky, culprit)
|
553
|
+
def throw_symbol(expected_symbol=nil, expected_arg=nil)
|
554
|
+
BuiltIn::ThrowSymbol.new(expected_symbol, expected_arg)
|
555
|
+
end
|
556
|
+
|
557
|
+
# Passes if actual contains all of the expected regardless of order.
|
558
|
+
# This works for collections. Pass in multiple args and it will only
|
559
|
+
# pass if all args are found in collection.
|
560
|
+
#
|
561
|
+
# NOTE: there is no should_not version of array.should =~ other_array
|
562
|
+
#
|
563
|
+
# @example
|
564
|
+
#
|
565
|
+
# [1,2,3].should =~ [1,2,3] # => would pass
|
566
|
+
# [1,2,3].should =~ [2,3,1] # => would pass
|
567
|
+
# [1,2,3,4].should =~ [1,2,3] # => would fail
|
568
|
+
# [1,2,2,3].should =~ [1,2,3] # => would fail
|
569
|
+
# [1,2,3].should =~ [1,2,3,4] # => would fail
|
570
|
+
OperatorMatcher.register(Array, '=~', BuiltIn::MatchArray)
|
571
|
+
end
|
572
|
+
end
|