rspecial 0.3.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/.index +61 -0
- data/.ruby +1 -0
- data/DEMOS.md +269 -0
- data/HISTORY.md +31 -0
- data/LICENSE.txt +22 -0
- data/README.md +76 -0
- data/lib/assay/rspec.rb +1 -0
- data/lib/rspecial.rb +20 -0
- data/lib/rspecial.yml +61 -0
- data/lib/rspecial/expect.rb +151 -0
- data/lib/rspecial/have.rb +201 -0
- data/lib/rspecial/matchers.rb +258 -0
- data/lib/rspecial/operatics.rb +57 -0
- data/lib/rspecial/should.rb +49 -0
- metadata +118 -0
data/.index
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
---
|
2
|
+
type: ruby
|
3
|
+
revision: 2013
|
4
|
+
sources:
|
5
|
+
- var
|
6
|
+
authors:
|
7
|
+
- name: Thomas Sawyer
|
8
|
+
email: transfire@gmail.com
|
9
|
+
organizations: []
|
10
|
+
requirements:
|
11
|
+
- name: assay
|
12
|
+
- groups:
|
13
|
+
- build
|
14
|
+
development: true
|
15
|
+
name: detroit
|
16
|
+
- groups:
|
17
|
+
- test
|
18
|
+
development: true
|
19
|
+
name: qed
|
20
|
+
conflicts: []
|
21
|
+
alternatives: []
|
22
|
+
resources:
|
23
|
+
- type: home
|
24
|
+
uri: http://rubyworks.github.com/rspecial
|
25
|
+
label: Homepage
|
26
|
+
- type: docs
|
27
|
+
uri: http://rubydoc.info/gems/rspecial
|
28
|
+
label: Documentation
|
29
|
+
- type: code
|
30
|
+
uri: http://github.com/rubyworks/rspecial
|
31
|
+
label: Source Code
|
32
|
+
- type: mail
|
33
|
+
uri: http://groups.google.com/groups/rubyworks-mailinglist
|
34
|
+
label: Mailing List
|
35
|
+
- type: chat
|
36
|
+
uri: http://chat.us.feenode.net/rubyworks
|
37
|
+
label: IRC Channel
|
38
|
+
repositories:
|
39
|
+
- name: upstream
|
40
|
+
scm: git
|
41
|
+
uri: git@github.com:rubyworks/rspecial.git
|
42
|
+
categories: []
|
43
|
+
load_path:
|
44
|
+
- lib
|
45
|
+
copyrights:
|
46
|
+
- holder: Rubyworks
|
47
|
+
year: '2012'
|
48
|
+
license: BSD-2-Clause
|
49
|
+
created: '2012-01-18'
|
50
|
+
summary: Brass-balled RSpec Expectations
|
51
|
+
title: RSpecial
|
52
|
+
version: 0.3.0
|
53
|
+
name: rspecial
|
54
|
+
description: ! 'RSpecial defines a set of RSpec-compatible matcher methods which
|
55
|
+
|
56
|
+
are BRASS compliant by using Assay as a backend. This allows developers
|
57
|
+
|
58
|
+
to switch to BRASS compliant test frameworks without having to change
|
59
|
+
|
60
|
+
a slew of previously written RSpec-based specifications.'
|
61
|
+
date: '2012-12-12'
|
data/.ruby
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
|
data/DEMOS.md
ADDED
@@ -0,0 +1,269 @@
|
|
1
|
+
# RSpecish
|
2
|
+
|
3
|
+
## Setup
|
4
|
+
|
5
|
+
First we need to require the library.
|
6
|
+
|
7
|
+
require 'rspecish'
|
8
|
+
|
9
|
+
This will load Assay and the RSpec extension, which will add `#should`
|
10
|
+
and `#should_not` to `BasicObject` class, and create a module called
|
11
|
+
`RSpecish::Matchers`. This moudle is included into `Assay::Matchers`.
|
12
|
+
To make use of it, we simply need to include either of these modules into
|
13
|
+
our test scope.
|
14
|
+
|
15
|
+
include ::Assay::Matchers
|
16
|
+
|
17
|
+
With that in place, we are ready to use the matchers.
|
18
|
+
|
19
|
+
|
20
|
+
## RSpec Should Method
|
21
|
+
|
22
|
+
### should
|
23
|
+
|
24
|
+
Becuase the `#should` method used `=~` as the assertion operator,
|
25
|
+
you can do something a bit unexpected, such as,
|
26
|
+
|
27
|
+
'a'.should /a/
|
28
|
+
|
29
|
+
|
30
|
+
### should=
|
31
|
+
|
32
|
+
10.should = 10
|
33
|
+
|
34
|
+
expect ::EqualAssay do
|
35
|
+
10.should = 20
|
36
|
+
end
|
37
|
+
|
38
|
+
10.should_not = 20
|
39
|
+
|
40
|
+
|
41
|
+
## RSpec Matchers
|
42
|
+
|
43
|
+
### should equal
|
44
|
+
|
45
|
+
1.should = 1
|
46
|
+
|
47
|
+
expect ::EqualAssay do
|
48
|
+
1.should = 2
|
49
|
+
end
|
50
|
+
|
51
|
+
### be_true
|
52
|
+
|
53
|
+
true.should be_true
|
54
|
+
|
55
|
+
expect ::TrueAssay do
|
56
|
+
false.should be_true
|
57
|
+
end
|
58
|
+
|
59
|
+
### be_false
|
60
|
+
|
61
|
+
false.should be_false
|
62
|
+
|
63
|
+
expect ::FalseAssay do
|
64
|
+
true.should be_false
|
65
|
+
end
|
66
|
+
|
67
|
+
### be_nil
|
68
|
+
|
69
|
+
nil.should be_nil
|
70
|
+
|
71
|
+
expect ::NilAssay do
|
72
|
+
true.should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
### be_empty
|
76
|
+
|
77
|
+
[].should be_empty
|
78
|
+
|
79
|
+
expect ::EmptyAssay do
|
80
|
+
[1].should be_empty
|
81
|
+
end
|
82
|
+
|
83
|
+
[1].should_not be_empty
|
84
|
+
|
85
|
+
### be_close
|
86
|
+
|
87
|
+
1.should be_close(1.5, 2)
|
88
|
+
|
89
|
+
expect ::WithinAssay do
|
90
|
+
1.should be_close(0.5, 2)
|
91
|
+
end
|
92
|
+
|
93
|
+
1.should_not be_close(0.5, 2)
|
94
|
+
|
95
|
+
### match
|
96
|
+
|
97
|
+
"abc".should match(/a/)
|
98
|
+
|
99
|
+
expect ::MatchAssay do
|
100
|
+
"abc".should match(/x/)
|
101
|
+
end
|
102
|
+
|
103
|
+
"abc".should_not match(/g/)
|
104
|
+
|
105
|
+
### eql
|
106
|
+
|
107
|
+
1.should eql(1)
|
108
|
+
|
109
|
+
expect ::EqualityAssay do
|
110
|
+
1.should eql(1.0)
|
111
|
+
end
|
112
|
+
|
113
|
+
1.should_not eql(1.0)
|
114
|
+
|
115
|
+
### equal
|
116
|
+
|
117
|
+
:a.should equal(:a)
|
118
|
+
|
119
|
+
expect ::IdentityAssay do
|
120
|
+
"a".should equal("a")
|
121
|
+
end
|
122
|
+
|
123
|
+
:a.should_not equal('a')
|
124
|
+
|
125
|
+
### be_instance_of
|
126
|
+
|
127
|
+
1.should be_instance_of(Fixnum)
|
128
|
+
|
129
|
+
expect ::InstanceAssay do
|
130
|
+
1.should be_instance_of(String)
|
131
|
+
end
|
132
|
+
|
133
|
+
1.should_not be_instance_of(String)
|
134
|
+
|
135
|
+
### be_kind_of
|
136
|
+
|
137
|
+
1.should be_kind_of(Integer)
|
138
|
+
|
139
|
+
expect ::KindAssay do
|
140
|
+
1.should be_kind_of(String)
|
141
|
+
end
|
142
|
+
|
143
|
+
1.should_not be_kind_of(String)
|
144
|
+
|
145
|
+
### raise_error
|
146
|
+
|
147
|
+
procedure = lambda{ raise ::ArgumentError }
|
148
|
+
|
149
|
+
procedure.should raise_error(::ArgumentError)
|
150
|
+
|
151
|
+
expect ::RaiseAssay do
|
152
|
+
procedure.should raise_error(::TypeError)
|
153
|
+
end
|
154
|
+
|
155
|
+
procedure.should_not raise_error(::TypeError)
|
156
|
+
|
157
|
+
### respond_to
|
158
|
+
|
159
|
+
"string".should respond_to(:upcase)
|
160
|
+
|
161
|
+
expect ::RespondAssay do
|
162
|
+
"string".should respond_to(:not_a_method)
|
163
|
+
end
|
164
|
+
|
165
|
+
"string".should_not respond_to(:not_a_method)
|
166
|
+
|
167
|
+
### satisfy
|
168
|
+
|
169
|
+
5.should satisfy{ |x| x > 3 }
|
170
|
+
|
171
|
+
expect ::ExecutionAssay do
|
172
|
+
5.should satisfy{ |x| x < 3 }
|
173
|
+
end
|
174
|
+
|
175
|
+
5.should_not satisfy{ |x| x < 3 }
|
176
|
+
|
177
|
+
### throw_symbol
|
178
|
+
|
179
|
+
procedure = lambda{ throw :foo }
|
180
|
+
|
181
|
+
procedure.should throw_symbol(:foo)
|
182
|
+
|
183
|
+
expect ::ThrowAssay do
|
184
|
+
procedure.should throw_symbol(:bar)
|
185
|
+
end
|
186
|
+
|
187
|
+
procedure.should_not throw_symbol(:bar)
|
188
|
+
|
189
|
+
## Supplemental Matchers
|
190
|
+
|
191
|
+
### equate_to
|
192
|
+
|
193
|
+
This is not strictly an RSpec matcher, but we have thrown it in for good measure.
|
194
|
+
It is equivalent to using the `#should=` method.
|
195
|
+
|
196
|
+
10.should equate_to(10)
|
197
|
+
|
198
|
+
expect ::EqualityAssay do
|
199
|
+
10.should equate_to(10.0)
|
200
|
+
end
|
201
|
+
|
202
|
+
10.should_not equate_to(10.0)
|
203
|
+
|
204
|
+
### be_like
|
205
|
+
|
206
|
+
The `#be_like` matcher is not strictly an RSpec matcher, but we have thrown it
|
207
|
+
in for good measure.
|
208
|
+
|
209
|
+
/a/.should be_like('a')
|
210
|
+
|
211
|
+
expect ::LikeAssay do
|
212
|
+
/a/.should be_like('b')
|
213
|
+
end
|
214
|
+
|
215
|
+
/a/.should_not be_like('b')
|
216
|
+
|
217
|
+
|
218
|
+
### Have
|
219
|
+
|
220
|
+
The `#have` matchers make it easy to set expectations about the size
|
221
|
+
of a collection. In general the term `items` is used if the target
|
222
|
+
object is a collection.
|
223
|
+
|
224
|
+
a = [1, 2, 3]
|
225
|
+
|
226
|
+
a.should have(3).items
|
227
|
+
a.should_not have(2).items
|
228
|
+
a.should_not have(4).items
|
229
|
+
|
230
|
+
a.should have_exactly(3).items
|
231
|
+
a.should_not have_exactly(2).items
|
232
|
+
a.should_not have_exactly(4).items
|
233
|
+
|
234
|
+
a.should have_at_least(2).items
|
235
|
+
a.should have_at_most(4).items
|
236
|
+
|
237
|
+
But a method that returns a collection can be used instead.
|
238
|
+
|
239
|
+
class String
|
240
|
+
def words
|
241
|
+
split(' ')
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
s = "a sentence with some words"
|
246
|
+
|
247
|
+
s.should have(5).words
|
248
|
+
s.should_not have(4).words
|
249
|
+
s.should_not have(6).words
|
250
|
+
|
251
|
+
s.should have_exactly(5).words
|
252
|
+
s.should_not have_exactly(4).words
|
253
|
+
s.should_not have_exactly(6).words
|
254
|
+
|
255
|
+
s.should have_at_least(4).words
|
256
|
+
s.should have_at_most(6).words
|
257
|
+
|
258
|
+
Besides `#have` there is also `#have_at_least` and `#have_at_most`.
|
259
|
+
|
260
|
+
a = [1, 2, 3]
|
261
|
+
|
262
|
+
a.should have_at_least(2).items
|
263
|
+
a.should have_at_most(4).items
|
264
|
+
|
265
|
+
a.should have_at_least(3).items
|
266
|
+
a.should have_at_most(3).items
|
267
|
+
|
268
|
+
|
269
|
+
|
data/HISTORY.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# HISTORY
|
2
|
+
|
3
|
+
## 0.3.0 | 2012-03-16
|
4
|
+
|
5
|
+
Renamed project from *Assay RSpec* to *RSpecial*, and added
|
6
|
+
RSpec's new expect notation.
|
7
|
+
|
8
|
+
Changes:
|
9
|
+
|
10
|
+
* Rename project to respecial.
|
11
|
+
* Add RSpec's new expect notation.
|
12
|
+
|
13
|
+
|
14
|
+
## 0.2.0 | 2012-02-26
|
15
|
+
|
16
|
+
This release adds support for #have matchers.
|
17
|
+
|
18
|
+
Changes:
|
19
|
+
|
20
|
+
* Add support for have matchers.
|
21
|
+
|
22
|
+
|
23
|
+
## 0.1.0 | 2012-01-26
|
24
|
+
|
25
|
+
This is the initial release of Assay RSpec. Currently the library covers
|
26
|
+
every RSpec matcher except the `change` and `have` matchers.
|
27
|
+
|
28
|
+
Changes:
|
29
|
+
|
30
|
+
* Happy Birthday!
|
31
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
BSD-2-Clause License
|
2
|
+
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
4
|
+
modification, are permitted provided that the following conditions are met:
|
5
|
+
|
6
|
+
1. Redistributions of source code must retain the above copyright notice,
|
7
|
+
this list of conditions and the following disclaimer.
|
8
|
+
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright
|
10
|
+
notice, this list of conditions and the following disclaimer in the
|
11
|
+
documentation and/or other materials provided with the distribution.
|
12
|
+
|
13
|
+
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
14
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
16
|
+
COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
17
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
18
|
+
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
19
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
20
|
+
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
21
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
22
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# RSpecial
|
2
|
+
|
3
|
+
[Homepage](http://rubyworks.github.com/rspecial) /
|
4
|
+
[Report Issue](http://github.com/rubyworks/rspecial/issues) /
|
5
|
+
[Source Code](http://github.com/rubyworks/rspecial)
|
6
|
+
( [](http://travis-ci.org/rubyworks/rspecial) )
|
7
|
+
|
8
|
+
_Well, isn't that special._
|
9
|
+
|
10
|
+
<br/>
|
11
|
+
|
12
|
+
RSpecial is an BRASS-compliant *assertions framework*. It defines
|
13
|
+
the RSpec's `expect` and `should` handlers and a set of RSpec-compatible matchers
|
14
|
+
allowing developers to change test frameworks without having to change
|
15
|
+
a slew of previously defined assertions.
|
16
|
+
|
17
|
+
RSpecial utilizes the [Assay](http://rubyworks.github.com/assay)
|
18
|
+
assertions meta-framework on the back-end. Assay defines assertions
|
19
|
+
in the same way that Ruby defines exceptions. An assertion is nothing
|
20
|
+
more that an extended Exception class. Assay provides a complete set
|
21
|
+
of these assertion classes for all common assertion needs.
|
22
|
+
|
23
|
+
|
24
|
+
## Installation
|
25
|
+
|
26
|
+
To install with RubyGems simply open a console and type:
|
27
|
+
|
28
|
+
$ gem install rspecial
|
29
|
+
|
30
|
+
Old-school site installations via a tarball can be done with [Ruby Setup](http://rubyworks.github.com/setup)
|
31
|
+
(`gem install setup`).
|
32
|
+
|
33
|
+
|
34
|
+
## Basic Usage
|
35
|
+
|
36
|
+
To use RSpecial, simply require the `rspecial` script, and include the `RSpecial::Matchers`
|
37
|
+
or `Test::Matchers` mixin module into your test framework wherever it requires
|
38
|
+
it (which may be as simple as the top-level namespace).
|
39
|
+
|
40
|
+
require 'rspecial'
|
41
|
+
|
42
|
+
include RSpecial::Matchers
|
43
|
+
|
44
|
+
Or more generically,
|
45
|
+
|
46
|
+
include Test::Matchers
|
47
|
+
|
48
|
+
Now assertions can be made just as if you were using RSpec.
|
49
|
+
|
50
|
+
expect(10).to be_kind_of(Integer)
|
51
|
+
|
52
|
+
and the traditional way
|
53
|
+
|
54
|
+
10.should be_kind_of(Integer)
|
55
|
+
|
56
|
+
|
57
|
+
## Limitations
|
58
|
+
|
59
|
+
Compatibility with RSpec is not 100%, but it is close. Compatibility will improve
|
60
|
+
with future releases.
|
61
|
+
|
62
|
+
Also error messages aren't always as nice, nor always customizable, as they are in RSpec.
|
63
|
+
This too will improve with future releases.
|
64
|
+
|
65
|
+
Please feel _obligated_ to submit a patch if you need a missing a feature ;-)
|
66
|
+
|
67
|
+
|
68
|
+
## Copyrights
|
69
|
+
|
70
|
+
RSpecial is copyright open source software
|
71
|
+
|
72
|
+
Copyright (c) 2012 Rubyworks
|
73
|
+
|
74
|
+
This program is distributed under the terms of the [BSD-2-Clause](http://spdx.org/licenses/BSD-2-Clause) license.
|
75
|
+
|
76
|
+
See LICENSE.txt file for details.
|
data/lib/assay/rspec.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rspecial'
|
data/lib/rspecial.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# RSpecial (http://rubyworks.github.com/rspecial)
|
2
|
+
# Copyright (c) 2012 Rubyworks.
|
3
|
+
# License (spdx) BSD-2-Clause.
|
4
|
+
|
5
|
+
require 'assay'
|
6
|
+
require 'rspecial/matchers'
|
7
|
+
require 'rspecial/have'
|
8
|
+
require 'rspecial/should'
|
9
|
+
require 'rspecial/expect'
|
10
|
+
require 'rspecial/operatics'
|
11
|
+
|
12
|
+
# This Test::Matchers module holds all matcher methods, which can be mixed into
|
13
|
+
# one's testing scope (e.g. World).
|
14
|
+
#
|
15
|
+
module Test
|
16
|
+
module Matchers
|
17
|
+
include RSpecial::Matchers
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
data/lib/rspecial.yml
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
---
|
2
|
+
type: ruby
|
3
|
+
revision: 2013
|
4
|
+
sources:
|
5
|
+
- var
|
6
|
+
authors:
|
7
|
+
- name: Thomas Sawyer
|
8
|
+
email: transfire@gmail.com
|
9
|
+
organizations: []
|
10
|
+
requirements:
|
11
|
+
- name: assay
|
12
|
+
- groups:
|
13
|
+
- build
|
14
|
+
development: true
|
15
|
+
name: detroit
|
16
|
+
- groups:
|
17
|
+
- test
|
18
|
+
development: true
|
19
|
+
name: qed
|
20
|
+
conflicts: []
|
21
|
+
alternatives: []
|
22
|
+
resources:
|
23
|
+
- type: home
|
24
|
+
uri: http://rubyworks.github.com/rspecial
|
25
|
+
label: Homepage
|
26
|
+
- type: docs
|
27
|
+
uri: http://rubydoc.info/gems/rspecial
|
28
|
+
label: Documentation
|
29
|
+
- type: code
|
30
|
+
uri: http://github.com/rubyworks/rspecial
|
31
|
+
label: Source Code
|
32
|
+
- type: mail
|
33
|
+
uri: http://groups.google.com/groups/rubyworks-mailinglist
|
34
|
+
label: Mailing List
|
35
|
+
- type: chat
|
36
|
+
uri: http://chat.us.feenode.net/rubyworks
|
37
|
+
label: IRC Channel
|
38
|
+
repositories:
|
39
|
+
- name: upstream
|
40
|
+
scm: git
|
41
|
+
uri: git@github.com:rubyworks/rspecial.git
|
42
|
+
categories: []
|
43
|
+
load_path:
|
44
|
+
- lib
|
45
|
+
copyrights:
|
46
|
+
- holder: Rubyworks
|
47
|
+
year: '2012'
|
48
|
+
license: BSD-2-Clause
|
49
|
+
created: '2012-01-18'
|
50
|
+
summary: Brass-balled RSpec Expectations
|
51
|
+
title: RSpecial
|
52
|
+
version: 0.3.0
|
53
|
+
name: rspecial
|
54
|
+
description: ! 'RSpecial defines a set of RSpec-compatible matcher methods which
|
55
|
+
|
56
|
+
are BRASS compliant by using Assay as a backend. This allows developers
|
57
|
+
|
58
|
+
to switch to BRASS compliant test frameworks without having to change
|
59
|
+
|
60
|
+
a slew of previously written RSpec-based specifications.'
|
61
|
+
date: '2012-12-12'
|
@@ -0,0 +1,151 @@
|
|
1
|
+
module RSpecial
|
2
|
+
|
3
|
+
# Wraps the target of an expectation.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# expect(something) # => Expect
|
7
|
+
#
|
8
|
+
# # used with `to`
|
9
|
+
# expect(actual).to eq(3)
|
10
|
+
#
|
11
|
+
# # with `to_not`
|
12
|
+
# expect(actual).to_not eq(3)
|
13
|
+
#
|
14
|
+
class Expect
|
15
|
+
|
16
|
+
# @api private
|
17
|
+
def initialize(target)
|
18
|
+
@target = target
|
19
|
+
end
|
20
|
+
|
21
|
+
# Runs the given expectation, passing if `matcher` returns true.
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
# expect(value).to eq(5)
|
25
|
+
# expect { perform }.to raise_error
|
26
|
+
#
|
27
|
+
# @param [Matcher]
|
28
|
+
# matcher
|
29
|
+
#
|
30
|
+
# @param [String] message optional message to display when the expectation fails
|
31
|
+
#
|
32
|
+
# @return [Boolean] true if the expectation succeeds (else raises)
|
33
|
+
#
|
34
|
+
# @see RSpec::Matchers
|
35
|
+
#
|
36
|
+
def to(matcher=nil, message=nil, &block)
|
37
|
+
#prevent_operator_matchers(:to, matcher)
|
38
|
+
handle_positive_matcher(@target, matcher, message, &block)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Runs the given expectation, passing if `matcher` returns false.
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# expect(value).to_not eq(5)
|
45
|
+
# expect(value).not_to eq(5)
|
46
|
+
#
|
47
|
+
# @param [Matcher]
|
48
|
+
# matcher
|
49
|
+
#
|
50
|
+
# @param [String] message optional message to display when the expectation fails
|
51
|
+
#
|
52
|
+
# @return [Boolean] false if the negative expectation succeeds (else raises)
|
53
|
+
#
|
54
|
+
# @see RSpec::Matchers
|
55
|
+
#
|
56
|
+
def to_not(matcher=nil, message=nil, &block)
|
57
|
+
#prevent_operator_matchers(:to_not, matcher)
|
58
|
+
handle_negative_matcher(@target, matcher, message, &block)
|
59
|
+
end
|
60
|
+
|
61
|
+
alias :not_to :to_not
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
#def prevent_operator_matchers(verb, matcher)
|
66
|
+
# return if matcher
|
67
|
+
#
|
68
|
+
# raise ArgumentError, "The expect syntax does not support operator matchers, " +
|
69
|
+
# "so you must pass a matcher to `##{verb}`."
|
70
|
+
#end
|
71
|
+
|
72
|
+
#
|
73
|
+
# @todo how to customize the message?
|
74
|
+
#
|
75
|
+
def handle_positive_matcher(actual, matcher, message=nil, &block)
|
76
|
+
check_message(message)
|
77
|
+
|
78
|
+
#::RSpec::Matchers.last_should = :should
|
79
|
+
#::RSpec::Matchers.last_matcher = matcher
|
80
|
+
|
81
|
+
if block
|
82
|
+
actual = block.call(actual)
|
83
|
+
end
|
84
|
+
|
85
|
+
#return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) if matcher.nil?
|
86
|
+
|
87
|
+
return Operatics.new(actual) if matcher.nil?
|
88
|
+
|
89
|
+
matcher =~ actual
|
90
|
+
|
91
|
+
#match = matcher.matches?(actual, &block)
|
92
|
+
#return match if match
|
93
|
+
|
94
|
+
#message ||= matcher.respond_to?(:failure_message_for_should) ?
|
95
|
+
# matcher.failure_message_for_should :
|
96
|
+
# matcher.failure_message
|
97
|
+
|
98
|
+
#if matcher.respond_to?(:diffable?) && matcher.diffable?
|
99
|
+
# ::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual
|
100
|
+
#else
|
101
|
+
# ::RSpec::Expectations.fail_with message
|
102
|
+
#end
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# @todo how to customize the message?
|
107
|
+
#
|
108
|
+
def handle_negative_matcher(actual, matcher, message=nil, &block)
|
109
|
+
check_message(message)
|
110
|
+
|
111
|
+
#::RSpec::Matchers.last_should = :should_not
|
112
|
+
#::RSpec::Matchers.last_matcher = matcher
|
113
|
+
|
114
|
+
if block
|
115
|
+
actual = block.call(actual)
|
116
|
+
end
|
117
|
+
|
118
|
+
#return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) if matcher.nil?
|
119
|
+
|
120
|
+
return Operatics.new(actual, true) if matcher.nil?
|
121
|
+
|
122
|
+
matcher !~ actual
|
123
|
+
|
124
|
+
#match = matcher.respond_to?(:does_not_match?) ?
|
125
|
+
# !matcher.does_not_match?(actual, &block) :
|
126
|
+
# matcher.matches?(actual, &block)
|
127
|
+
#return match unless match
|
128
|
+
|
129
|
+
#message ||= matcher.respond_to?(:failure_message_for_should_not) ?
|
130
|
+
# matcher.failure_message_for_should_not :
|
131
|
+
# matcher.negative_failure_message
|
132
|
+
|
133
|
+
#if matcher.respond_to?(:diffable?) && matcher.diffable?
|
134
|
+
# ::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual
|
135
|
+
#else
|
136
|
+
# ::RSpec::Expectations.fail_with message
|
137
|
+
#end
|
138
|
+
end
|
139
|
+
|
140
|
+
def message_must_be_string(msg)
|
141
|
+
"WARNING: ignoring the provided expectation message argument " +
|
142
|
+
"(#{msg.inspect}) since it is not a string."
|
143
|
+
end
|
144
|
+
|
145
|
+
def check_message(msg)
|
146
|
+
::Kernel.warn message_must_be_string(msg) unless msg.nil? || msg.is_a?(String)
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
module RSpecial
|
2
|
+
|
3
|
+
# Delegate to Have Assays.
|
4
|
+
#
|
5
|
+
class Have
|
6
|
+
|
7
|
+
attr :expected
|
8
|
+
|
9
|
+
attr :collection_name
|
10
|
+
|
11
|
+
attr :relation
|
12
|
+
|
13
|
+
#
|
14
|
+
# Initialize new Have delegator.
|
15
|
+
#
|
16
|
+
def initialize(expected, relation=:exactly)
|
17
|
+
@expected = case expected
|
18
|
+
when :no then 0
|
19
|
+
when String then expected.to_i
|
20
|
+
else expected
|
21
|
+
end
|
22
|
+
@relation = relation
|
23
|
+
@collection_name = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# @param [#size,#length,#count] collection_or_owner
|
28
|
+
#
|
29
|
+
def collection(collection_or_owner)
|
30
|
+
if collection_or_owner.respond_to?(@collection_name)
|
31
|
+
collection_or_owner.__send__(@collection_name, *@args, &@block)
|
32
|
+
elsif query_method(collection_or_owner)
|
33
|
+
collection_or_owner
|
34
|
+
else
|
35
|
+
collection_or_owner.__send__(@collection_name, *@args, &@block)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
#
|
41
|
+
#
|
42
|
+
def query_method(collection)
|
43
|
+
[:size, :length, :count].detect {|m| collection.respond_to?(m)}
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
#
|
48
|
+
#
|
49
|
+
def method_missing(method, *args, &block)
|
50
|
+
@collection_name = method
|
51
|
+
@args = args
|
52
|
+
@block = block
|
53
|
+
|
54
|
+
case @relation
|
55
|
+
when :at_least
|
56
|
+
RSpecial::HaveAtLeastAssay.assertor(self)
|
57
|
+
when :at_most
|
58
|
+
RSpecial::HaveAtMostAssay.assertor(self)
|
59
|
+
else
|
60
|
+
RSpecial::HaveExactlyAssay.assertor(self)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
#
|
66
|
+
module Helpers
|
67
|
+
|
68
|
+
#
|
69
|
+
#
|
70
|
+
#
|
71
|
+
def collection_set(collection_or_owner, have)
|
72
|
+
collection = have.collection(collection_or_owner)
|
73
|
+
query_method = query_method(collection)
|
74
|
+
|
75
|
+
raise not_a_collection(have) unless query_method
|
76
|
+
|
77
|
+
actual = collection.__send__(query_method)
|
78
|
+
|
79
|
+
return collection, query_method, actual
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Return the actual size of the collection.
|
84
|
+
#
|
85
|
+
def collection_actual(collection_or_owner, have)
|
86
|
+
collection_set(collection_or_owner, have).last
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Which size method to use: `size`, `length` or `count`.
|
91
|
+
#
|
92
|
+
def query_method(collection)
|
93
|
+
[:size, :length, :count].detect {|m| collection.respond_to?(m)}
|
94
|
+
end
|
95
|
+
|
96
|
+
#
|
97
|
+
# Message to use when collection doesn't respond to `size`, `length` or `count`.
|
98
|
+
#
|
99
|
+
def not_a_collection(have)
|
100
|
+
"expected #{have.collection_name} to be a collection but it does not respond to #length, #size or #count"
|
101
|
+
end
|
102
|
+
|
103
|
+
#
|
104
|
+
# TODO: use when verbose error message mode
|
105
|
+
#
|
106
|
+
def self.assert_description(collection_or_owner, have)
|
107
|
+
collection, method, actual = collection_set(collection_or_owner, have)
|
108
|
+
"expected #{have.relation} #{have.expected} #{have.collection_name}, got #{actual}"
|
109
|
+
end
|
110
|
+
|
111
|
+
#
|
112
|
+
#
|
113
|
+
#
|
114
|
+
def self.refute_descrptipon(collection_or_owner, have)
|
115
|
+
collection, method, actual = collection_set(collection_or_owner, have)
|
116
|
+
"expected not to have #{have.relation} #{have.expected} #{have.collection_name}, got #{actual}"
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
#
|
125
|
+
class HaveExactlyAssay < EqualAssay
|
126
|
+
|
127
|
+
extend Have::Helpers
|
128
|
+
|
129
|
+
register :have
|
130
|
+
|
131
|
+
#
|
132
|
+
#
|
133
|
+
#
|
134
|
+
def self.pass?(collection_or_owner, have)
|
135
|
+
actual = collection_actual(collection_or_owner, have)
|
136
|
+
super(actual, have.expected)
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# Error message for have equal assertion.
|
141
|
+
#
|
142
|
+
def self.assert_message(collection_or_owner, have)
|
143
|
+
actual = collection_actual(collection_or_owner, have)
|
144
|
+
super(actual, have.expected)
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
#
|
150
|
+
#
|
151
|
+
class HaveAtLeastAssay < MoreEqualAssay
|
152
|
+
|
153
|
+
extend Have::Helpers
|
154
|
+
|
155
|
+
register :have_at_least
|
156
|
+
|
157
|
+
#
|
158
|
+
#
|
159
|
+
#
|
160
|
+
def self.pass?(collection_or_owner, have)
|
161
|
+
actual = collection_actual(collection_or_owner, have)
|
162
|
+
super(actual, have.expected)
|
163
|
+
end
|
164
|
+
|
165
|
+
#
|
166
|
+
#
|
167
|
+
#
|
168
|
+
def self.assert_message(collection_or_owner, have)
|
169
|
+
actual = collection_actual(collection_or_owner, have)
|
170
|
+
super(actual, have.expected)
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
#
|
176
|
+
#
|
177
|
+
class HaveAtMostAssay < LessEqualAssay
|
178
|
+
|
179
|
+
extend Have::Helpers
|
180
|
+
|
181
|
+
register :have_at_most
|
182
|
+
|
183
|
+
#
|
184
|
+
#
|
185
|
+
#
|
186
|
+
def self.pass?(collection_or_owner, have)
|
187
|
+
actual = collection_actual(collection_or_owner, have)
|
188
|
+
super(actual, have.expected)
|
189
|
+
end
|
190
|
+
|
191
|
+
#
|
192
|
+
#
|
193
|
+
#
|
194
|
+
def self.assert_message(collection_or_owner, have)
|
195
|
+
actual = collection_actual(collection_or_owner, have)
|
196
|
+
super(actual, have.expected)
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
@@ -0,0 +1,258 @@
|
|
1
|
+
module RSpecial
|
2
|
+
|
3
|
+
# This module provides matchers for RSpec-compatiblity.
|
4
|
+
#
|
5
|
+
# The set is not fully compataible, but provides most RSpec matchers.
|
6
|
+
# The most notable exlusion for the moment is the `have` matchers.
|
7
|
+
#
|
8
|
+
# Compatability will improve with time. Feel _obligated_ to submit a
|
9
|
+
# patch if you really need it. ;)
|
10
|
+
#
|
11
|
+
# @see https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers
|
12
|
+
#
|
13
|
+
module Matchers
|
14
|
+
|
15
|
+
#def self.included(base)
|
16
|
+
# @_once ||= require_relative('should').nil?
|
17
|
+
#end
|
18
|
+
|
19
|
+
#def self.extended(base)
|
20
|
+
# @_once ||= require_relative('should').nil?
|
21
|
+
#end
|
22
|
+
|
23
|
+
# Passes if the expected and actual are alike.
|
24
|
+
#
|
25
|
+
# object.should be_like(criterion)
|
26
|
+
#
|
27
|
+
# There is no equivalant for this in RSpec, we simply add it
|
28
|
+
# here to cover all Assays available.
|
29
|
+
#
|
30
|
+
# @raise LikeAssay
|
31
|
+
#
|
32
|
+
def be_like(criterion)
|
33
|
+
LikeAssay.assertor(criterion)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Passes if expected and actual are nto equal within delta tolerance.
|
37
|
+
#
|
38
|
+
# value.should be_close(delta, criterion)
|
39
|
+
#
|
40
|
+
# @raise WithinAssay
|
41
|
+
#
|
42
|
+
def be_close(delta, criterion)
|
43
|
+
WithinAssay.assertor(criterion, delta)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Passes if object is empty.
|
47
|
+
#
|
48
|
+
# object.should be_empty
|
49
|
+
#
|
50
|
+
# @raise EmptyAssay
|
51
|
+
#
|
52
|
+
def be_empty
|
53
|
+
EmptyAssay.assertor
|
54
|
+
end
|
55
|
+
|
56
|
+
# Passes if +expected+ == +actual+.
|
57
|
+
#
|
58
|
+
# 'MY STRING'.should equate_to('my string'.upcase)
|
59
|
+
# 'MY STRING'.should_not equate_to('another string')
|
60
|
+
#
|
61
|
+
# This matcher is not supported by RSpec, but is added so that the
|
62
|
+
# EqualityAssay has an explict matcher available.
|
63
|
+
#
|
64
|
+
# @raise EqualityAssay
|
65
|
+
#
|
66
|
+
def equate_to(exp)
|
67
|
+
EqualityAssay.assertor(exp)
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Passes if block is satisfied given target object as argument.
|
72
|
+
#
|
73
|
+
# 5.should satisfy{ |n| n > 3}
|
74
|
+
#
|
75
|
+
# @raise ExecutionAssay
|
76
|
+
#
|
77
|
+
def satisfy(&block)
|
78
|
+
ExecutionAssay.assertor(&block)
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Passed if object is +false+.
|
83
|
+
#
|
84
|
+
# value.should be_false
|
85
|
+
#
|
86
|
+
# @raise FalseAssay
|
87
|
+
#
|
88
|
+
def be_false
|
89
|
+
FalseAssay.assertor
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
# Passes if actual is the same exact object as expected.
|
94
|
+
#
|
95
|
+
# object.should be_identical_to(object)
|
96
|
+
#
|
97
|
+
# @raise IdentityAssay
|
98
|
+
#
|
99
|
+
def equal(obj)
|
100
|
+
IdentityAssay.assertor(obj)
|
101
|
+
end
|
102
|
+
|
103
|
+
alias :be_identical_to :equal
|
104
|
+
|
105
|
+
#
|
106
|
+
# Passes if `actual == expected`.
|
107
|
+
#
|
108
|
+
# object.should eq(object)
|
109
|
+
#
|
110
|
+
# @raise EqualAssay
|
111
|
+
#
|
112
|
+
def eq(obj)
|
113
|
+
EqualAssay.assertor(obj)
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# Passes if object is an instance of class.
|
118
|
+
#
|
119
|
+
# object.should be_instance_of(class)
|
120
|
+
#
|
121
|
+
# @raise InstanceAssay
|
122
|
+
#
|
123
|
+
def be_instance_of(cls)
|
124
|
+
InstanceAssay.assertor(cls)
|
125
|
+
end
|
126
|
+
|
127
|
+
alias :be_an_instance_of :be_instance_of
|
128
|
+
|
129
|
+
#
|
130
|
+
# Pass if object is a kind of class.
|
131
|
+
#
|
132
|
+
# object.should be_kind_of(class)
|
133
|
+
#
|
134
|
+
# @raise KindAssay
|
135
|
+
#
|
136
|
+
def be_kind_of(cls)
|
137
|
+
KindAssay.assertor(cls)
|
138
|
+
end
|
139
|
+
|
140
|
+
alias :be_a_kind_of :be_kind_of
|
141
|
+
alias :be_a :be_kind_of
|
142
|
+
alias :be_an :be_kind_of
|
143
|
+
|
144
|
+
#
|
145
|
+
# Pass if object matches pattern using `#=~` method.
|
146
|
+
#
|
147
|
+
# object.should match(regexp)
|
148
|
+
#
|
149
|
+
# @raise MatchAssay
|
150
|
+
#
|
151
|
+
def match(regexp)
|
152
|
+
MatchAssay.assertor(regexp)
|
153
|
+
end
|
154
|
+
|
155
|
+
#
|
156
|
+
# Pass if object is +nil+.
|
157
|
+
#
|
158
|
+
# value.should be_nil
|
159
|
+
#
|
160
|
+
# @raise NilAssay
|
161
|
+
#
|
162
|
+
def be_nil
|
163
|
+
NilAssay.assertor
|
164
|
+
end
|
165
|
+
|
166
|
+
#
|
167
|
+
# Pass if an exception is raised.
|
168
|
+
#
|
169
|
+
# lambda { do_something_risky }.should raise_error
|
170
|
+
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError)
|
171
|
+
#
|
172
|
+
# @raise RaiseAssay
|
173
|
+
#
|
174
|
+
# @todo Support for message matching ?
|
175
|
+
#
|
176
|
+
def raise_error(exception=Exception)
|
177
|
+
RaiseAssay.assertor(exception)
|
178
|
+
end
|
179
|
+
|
180
|
+
#
|
181
|
+
# Pass if object responds to message.
|
182
|
+
#
|
183
|
+
# object.should respond_to(:method_name)
|
184
|
+
#
|
185
|
+
# @raise RespondAssay
|
186
|
+
#
|
187
|
+
def respond_to(method)
|
188
|
+
RespondAssay.assertor(method)
|
189
|
+
end
|
190
|
+
|
191
|
+
#
|
192
|
+
# Pass if two objects are equal using `#eql?` method.
|
193
|
+
#
|
194
|
+
# object1.should eql(object2)
|
195
|
+
#
|
196
|
+
# @raise EqualityAssay
|
197
|
+
#
|
198
|
+
def eql(exp)
|
199
|
+
EqualityAssay.assertor(exp)
|
200
|
+
end
|
201
|
+
|
202
|
+
#
|
203
|
+
# Pass if procedure throws a specified symbol.
|
204
|
+
#
|
205
|
+
# lambda { do_something_risky }.should throw_symbol
|
206
|
+
# lambda { do_something_risky }.should throw_symbol(:that_was_risky)
|
207
|
+
#
|
208
|
+
# @raise ThrowAssay
|
209
|
+
#
|
210
|
+
# @todo Support for throw argument. (Does RSpec even support this?)
|
211
|
+
#
|
212
|
+
def throw_symbol(sym=nil) #, arg=nil)
|
213
|
+
ThrowAssay.assertor(sym)
|
214
|
+
end
|
215
|
+
|
216
|
+
#
|
217
|
+
# Passed if object is +true+.
|
218
|
+
#
|
219
|
+
# object.should be_true
|
220
|
+
#
|
221
|
+
# @raise TrueAssay
|
222
|
+
#
|
223
|
+
def be_true
|
224
|
+
TrueAssay.assertor
|
225
|
+
end
|
226
|
+
|
227
|
+
#
|
228
|
+
#
|
229
|
+
#
|
230
|
+
def have(n)
|
231
|
+
Have.new(n)
|
232
|
+
end
|
233
|
+
|
234
|
+
alias :have_exactly :have
|
235
|
+
|
236
|
+
#
|
237
|
+
#
|
238
|
+
#
|
239
|
+
def have_at_least(n)
|
240
|
+
Have.new(n, :at_least)
|
241
|
+
end
|
242
|
+
|
243
|
+
#
|
244
|
+
#
|
245
|
+
#
|
246
|
+
def have_at_most(n)
|
247
|
+
Have.new(n, :at_most)
|
248
|
+
end
|
249
|
+
|
250
|
+
#
|
251
|
+
#
|
252
|
+
def expect(target)
|
253
|
+
Expect.new(target)
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|
257
|
+
|
258
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module RSpecial
|
2
|
+
|
3
|
+
# Operatics delegates operator based assertions for execpt.rb.
|
4
|
+
#
|
5
|
+
class Operatics < Object
|
6
|
+
instance_methods.each{ |m| undef_method m if m.to_s =~ /^\W/ }
|
7
|
+
|
8
|
+
#
|
9
|
+
def initialize(target, negate=false)
|
10
|
+
@target = target
|
11
|
+
@negate = negate
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
#
|
17
|
+
def method_missing(op, *a, &b)
|
18
|
+
super(op, *a, &b) if op.to_s =~ /^\w/
|
19
|
+
|
20
|
+
if @negate
|
21
|
+
refute!(op, *a, &b)
|
22
|
+
else
|
23
|
+
assert!(op, *a, &b)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
def assert!(op, *a, &b)
|
29
|
+
if assay = Assertion.by_operator(op)
|
30
|
+
return assay.assert!(@target, *a, &b)
|
31
|
+
else
|
32
|
+
assert! @target.send(op, *a, &b)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
def refute!(op, *a, &b)
|
38
|
+
if assay = Assertion.by_operator(op)
|
39
|
+
return assay.refute!(@target, *a, &b)
|
40
|
+
else
|
41
|
+
refute! @target.send(op, *a, &b)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
def generic?(op)
|
47
|
+
@target.method(op).owner == ::Kernel
|
48
|
+
end if ::Method.method_defined?(:owner)
|
49
|
+
|
50
|
+
#
|
51
|
+
def generic?(op)
|
52
|
+
@target.method(op).to_s.include?('(Kernel)')
|
53
|
+
end unless ::Method.method_defined?(:owner)
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module RSpecial
|
2
|
+
|
3
|
+
# The Should module is included into BasicObject to provide
|
4
|
+
# the needed assertion interface that RSpec utilizes. Namely, the
|
5
|
+
# `should` and `should_not` methods.
|
6
|
+
#
|
7
|
+
module Should
|
8
|
+
|
9
|
+
#
|
10
|
+
# Use `should` nomenclature for assertions.
|
11
|
+
#
|
12
|
+
# 10.should be_kind_of(Integer)
|
13
|
+
#
|
14
|
+
def should(matcher)
|
15
|
+
matcher =~ self
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Also, `should_not` nomenclature for assertions.
|
20
|
+
#
|
21
|
+
# 10.should_not be_kind_of?(Integer)
|
22
|
+
#
|
23
|
+
def should_not(matcher)
|
24
|
+
matcher !~ self
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
#
|
29
|
+
#
|
30
|
+
def should=(value)
|
31
|
+
EqualAssay.assert!(self, value)
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
#
|
36
|
+
#
|
37
|
+
def should_not=(value)
|
38
|
+
EqualAssay.refute!(self, value)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
class BasicObject # Object ?
|
47
|
+
include ::RSpecial::Should
|
48
|
+
end
|
49
|
+
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspecial
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Thomas Sawyer
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: assay
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: detroit
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: qed
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: ! 'RSpecial defines a set of RSpec-compatible matcher methods which
|
63
|
+
|
64
|
+
are BRASS compliant by using Assay as a backend. This allows developers
|
65
|
+
|
66
|
+
to switch to BRASS compliant test frameworks without having to change
|
67
|
+
|
68
|
+
a slew of previously written RSpec-based specifications.'
|
69
|
+
email:
|
70
|
+
- transfire@gmail.com
|
71
|
+
executables: []
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files:
|
74
|
+
- LICENSE.txt
|
75
|
+
- HISTORY.md
|
76
|
+
- README.md
|
77
|
+
- DEMOS.md
|
78
|
+
files:
|
79
|
+
- .index
|
80
|
+
- .ruby
|
81
|
+
- lib/assay/rspec.rb
|
82
|
+
- lib/rspecial/expect.rb
|
83
|
+
- lib/rspecial/have.rb
|
84
|
+
- lib/rspecial/matchers.rb
|
85
|
+
- lib/rspecial/operatics.rb
|
86
|
+
- lib/rspecial/should.rb
|
87
|
+
- lib/rspecial.rb
|
88
|
+
- lib/rspecial.yml
|
89
|
+
- HISTORY.md
|
90
|
+
- README.md
|
91
|
+
- DEMOS.md
|
92
|
+
- LICENSE.txt
|
93
|
+
homepage: http://rubyworks.github.com/rspecial
|
94
|
+
licenses:
|
95
|
+
- BSD-2-Clause
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project:
|
114
|
+
rubygems_version: 1.8.23
|
115
|
+
signing_key:
|
116
|
+
specification_version: 3
|
117
|
+
summary: Brass-balled RSpec Expectations
|
118
|
+
test_files: []
|