qed 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/{LICENSE → COPYING} +2 -2
- data/MANIFEST +2 -16
- data/README.rdoc +58 -21
- data/bin/qed +13 -13
- data/demo/01_spec.qed +6 -3
- data/doc/qedoc/index.html +13 -10
- data/lib/qed.rb +4 -3
- data/lib/qed/document.rb +9 -10
- data/lib/qed/{utilities/extract.rb → extract.rb} +0 -0
- data/lib/qed/script.rb +7 -1
- data/meta/requires +2 -0
- data/meta/version +1 -1
- metadata +25 -15
- data/lib/qed/assertion.rb +0 -23
- data/lib/qed/doubles/mock.rb +0 -94
- data/lib/qed/doubles/spy.rb +0 -191
- data/lib/qed/doubles/stub.rb +0 -94
- data/lib/qed/expectation.rb +0 -60
- data/lib/qed/grammar/assert.rb +0 -104
- data/lib/qed/grammar/expect.rb +0 -121
- data/lib/qed/grammar/legacy/assert.rb +0 -291
- data/lib/qed/grammar/should.rb +0 -52
- data/lib/qed/utilities/monitor.rb +0 -23
data/lib/qed/grammar/assert.rb
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
module QED
|
2
|
-
|
3
|
-
require 'qed/expectation'
|
4
|
-
|
5
|
-
module Grammar
|
6
|
-
|
7
|
-
# = Assert Nomenclature
|
8
|
-
#
|
9
|
-
module Assert
|
10
|
-
|
11
|
-
# Assert a operational relationship.
|
12
|
-
#
|
13
|
-
# 4.assert == 3
|
14
|
-
#
|
15
|
-
# If only a single test argument is given then
|
16
|
-
# #assert simple validates that it evalutate to true.
|
17
|
-
# An optional message argument can be given in this
|
18
|
-
# case which will be used instead of the deafult message.
|
19
|
-
#
|
20
|
-
# assert(4==3, "not the same thing")
|
21
|
-
#
|
22
|
-
# In block form, #assert ensures the block evalutes
|
23
|
-
# truthfully, i.e. not as nil or false.
|
24
|
-
#
|
25
|
-
# assert{ 4==3 }
|
26
|
-
#
|
27
|
-
# If an argument is given with a block, #assert compares
|
28
|
-
# the argument to the result of evaluating the block.
|
29
|
-
#
|
30
|
-
# assert(4){ 3 }
|
31
|
-
#
|
32
|
-
# #assert compares the expected value and the actual
|
33
|
-
# value with regular equality <code>#==</code>.
|
34
|
-
#
|
35
|
-
def assert(test=Exception, msg=nil, &block)
|
36
|
-
if block
|
37
|
-
act = block.call
|
38
|
-
if test == Exception
|
39
|
-
raise Assertion.new(msg, caller) unless act
|
40
|
-
else
|
41
|
-
yes = (test == act)
|
42
|
-
msg = "#{exp}.equate? #{act}" unless msg
|
43
|
-
raise Assertion.new(msg, caller) unless yes
|
44
|
-
end
|
45
|
-
elsif test != Exception
|
46
|
-
msg = "failed assertion (no message given)" unless msg
|
47
|
-
raise Assertion.new(msg, caller) unless test
|
48
|
-
else
|
49
|
-
return Expectation.new(self, :backtrace=>caller)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# Assert not an operational relationship.
|
54
|
-
# Read it as "assert not".
|
55
|
-
#
|
56
|
-
# 4.assert! == 4
|
57
|
-
#
|
58
|
-
# See #assert.
|
59
|
-
#
|
60
|
-
# AUHTOR'S NOTE: This method would not be necessary
|
61
|
-
# if Ruby would allow +!=+ to be define as a method,
|
62
|
-
# or at least +!+ as a unary method.
|
63
|
-
#
|
64
|
-
def assert!(test=Exception, msg=nil, &block)
|
65
|
-
if block
|
66
|
-
act = block.call
|
67
|
-
if test == Exception
|
68
|
-
raise Assertion.new(msg, caller) if act
|
69
|
-
else
|
70
|
-
yes = (test == act)
|
71
|
-
msg = "#{exp}.equate? #{act}" unless msg
|
72
|
-
raise Assertion.new(msg, caller) if yes
|
73
|
-
end
|
74
|
-
elsif test != Exception
|
75
|
-
msg = "failed assertion (no message given)" unless msg
|
76
|
-
raise Assertion.new(msg, caller) if test
|
77
|
-
else
|
78
|
-
return Expectation.new(self, :negate=>true, :backtrace=>caller)
|
79
|
-
end
|
80
|
-
|
81
|
-
if test
|
82
|
-
msg = "failed assertion (no message given)" unless msg
|
83
|
-
raise Assertion.new(msg, caller) if test
|
84
|
-
else
|
85
|
-
return Expectation.new(self, :negate=>true, :backtrace=>caller)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# Same as #assert!.
|
90
|
-
#
|
91
|
-
# 4.refute == 4 #=> Assertion Error
|
92
|
-
#
|
93
|
-
alias_method :refute, :assert!
|
94
|
-
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
class ::Object #:nodoc:
|
100
|
-
include Grammar::Assert
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
|
data/lib/qed/grammar/expect.rb
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
module QED
|
2
|
-
|
3
|
-
require 'qed/expectation'
|
4
|
-
|
5
|
-
module Grammar
|
6
|
-
|
7
|
-
# = Expect Nomenclature
|
8
|
-
#
|
9
|
-
# Provides expect nomenclature. This is Quarry's "standard"
|
10
|
-
# nomenclature.
|
11
|
-
#
|
12
|
-
module Expect
|
13
|
-
|
14
|
-
# The +expect+ method is a powerful tool for defining
|
15
|
-
# expectations in your specifications.
|
16
|
-
#
|
17
|
-
# Like #should it can be used to designate an expectation
|
18
|
-
# via a *functor*.
|
19
|
-
#
|
20
|
-
# 4.expect == 3
|
21
|
-
#
|
22
|
-
# Or it can be used in block form.
|
23
|
-
#
|
24
|
-
# expect(4){ 3 }
|
25
|
-
#
|
26
|
-
# This compares the expected value and the actual
|
27
|
-
# value with <i>broad equality</i>. This is similar to
|
28
|
-
# case equality (#===) but also checks other forms of
|
29
|
-
# equality. See the #equate method.
|
30
|
-
#
|
31
|
-
# Of particluar utility is that #expect allows one to
|
32
|
-
# specify if the block raises the error.
|
33
|
-
#
|
34
|
-
# expect NoMethodError do
|
35
|
-
# not_a_method
|
36
|
-
# end
|
37
|
-
#
|
38
|
-
def expect(exp=Expectation, &block)
|
39
|
-
if exp == Expectation
|
40
|
-
Expectation.new(self, :backtrace=>caller)
|
41
|
-
elsif Exception >= exp
|
42
|
-
begin
|
43
|
-
act = block.call
|
44
|
-
test = exp.equate?(act)
|
45
|
-
msg = "#{exp}.equate? #{act}"
|
46
|
-
rescue exp => error
|
47
|
-
test = true
|
48
|
-
#msg = "#{exp} expected to be raised"
|
49
|
-
rescue Exception => error
|
50
|
-
test = false
|
51
|
-
msg = "#{exp} expected but #{error.class} was raised"
|
52
|
-
end
|
53
|
-
raise Assertion.new(msg, caller) unless test
|
54
|
-
else
|
55
|
-
act = block.call
|
56
|
-
test = exp.equate?(act)
|
57
|
-
msg = "#{exp}.equate? #{act}"
|
58
|
-
raise Assertion.new(msg, caller) unless test
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# Designate a negated expectation. Read this as
|
63
|
-
# "expect not".
|
64
|
-
#
|
65
|
-
# 4.expect! == 4 #=> Expectation Error
|
66
|
-
#
|
67
|
-
# See #expect.
|
68
|
-
#
|
69
|
-
# Note that this method would not be necessary if
|
70
|
-
# Ruby would allow +!=+ to be defined as a method,
|
71
|
-
# or perhaps +!+ as a unary method.
|
72
|
-
#
|
73
|
-
def expect!(exp=Expectation, &block)
|
74
|
-
if exp == Expectation
|
75
|
-
Expectation.new(self, :negate=>true, :backtrace=>caller)
|
76
|
-
elsif Exception >= exp
|
77
|
-
begin
|
78
|
-
act = block.call
|
79
|
-
test = !exp.equate?(act)
|
80
|
-
msg = "! #{exp}.equate? #{act}"
|
81
|
-
rescue exp => error
|
82
|
-
test = false
|
83
|
-
msg = "#{exp} raised"
|
84
|
-
rescue Exception => error
|
85
|
-
test = true
|
86
|
-
#msg = "#{exp} expected but was #{error.class}"
|
87
|
-
end
|
88
|
-
raise Assertion.new(msg, caller) unless test
|
89
|
-
else
|
90
|
-
act = block.call
|
91
|
-
test = !exp.equate?(act)
|
92
|
-
msg = "! #{exp}.equate? #{act}"
|
93
|
-
raise Assertion.new(msg, caller) unless test
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# See #expect! method.
|
98
|
-
#
|
99
|
-
alias_method :expect_not, :expect!
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
class ::Object #:nodoc:
|
106
|
-
include Grammar::Expect
|
107
|
-
end
|
108
|
-
|
109
|
-
module ::Kernel
|
110
|
-
# Broad equality.
|
111
|
-
#
|
112
|
-
def equate?(actual)
|
113
|
-
self.equal?(actual) ||
|
114
|
-
self.eql?(actual) ||
|
115
|
-
self == actual ||
|
116
|
-
self === actual
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
end
|
121
|
-
|
@@ -1,291 +0,0 @@
|
|
1
|
-
module QED
|
2
|
-
|
3
|
-
module Grammar #:nodoc:
|
4
|
-
|
5
|
-
module Legacy #:nodoc:
|
6
|
-
|
7
|
-
# = Test::Unit Legacy Assertions
|
8
|
-
#
|
9
|
-
# This module provides a compatibility layer for Test::Unit.
|
10
|
-
# This is an optional module and is intended for providing
|
11
|
-
# an easier transition from Test::Unit::TestCase to Quarry
|
12
|
-
# Specifications.
|
13
|
-
#
|
14
|
-
# Note that two methods are not provided, +#assert_nothing_raised+,
|
15
|
-
# and +#assert_nothing_thrown+.
|
16
|
-
#
|
17
|
-
module Assertions
|
18
|
-
|
19
|
-
# Private method upon which all of the legacy assertions are based
|
20
|
-
# (except for #assert itself).
|
21
|
-
#
|
22
|
-
def __assert__(test, msg=nil)
|
23
|
-
msg = "failed assertion (no message given)" unless msg
|
24
|
-
raise Assertion.new(msg, caller[1..-1]) unless test
|
25
|
-
end
|
26
|
-
|
27
|
-
private :__assert__
|
28
|
-
|
29
|
-
# The assertion upon which all other assertions are based.
|
30
|
-
#
|
31
|
-
# assert [1, 2].include?(5)
|
32
|
-
#
|
33
|
-
def assert(test=nil, msg=nil)
|
34
|
-
if test
|
35
|
-
msg = "failed assertion (no message given)" unless msg
|
36
|
-
raise Assertion.new(msg, caller) unless test
|
37
|
-
else
|
38
|
-
Expectation.new(self, :backtrace=>caller)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# Passes if the block yields true.
|
43
|
-
#
|
44
|
-
# assert_block "Couldn't do the thing" do
|
45
|
-
# do_the_thing
|
46
|
-
# end
|
47
|
-
#
|
48
|
-
def assert_block(msg=nil) # :yields:
|
49
|
-
test = ! yield
|
50
|
-
msg = "assertion failed" unless msg
|
51
|
-
__assert__(test, msg)
|
52
|
-
end
|
53
|
-
|
54
|
-
# Passes if expected == +actual.
|
55
|
-
#
|
56
|
-
# Note that the ordering of arguments is important,
|
57
|
-
# since a helpful error message is generated when this
|
58
|
-
# one fails that tells you the values of expected and actual.
|
59
|
-
#
|
60
|
-
# assert_equal 'MY STRING', 'my string'.upcase
|
61
|
-
#
|
62
|
-
def assert_equal(exp, act, msg=nil)
|
63
|
-
test = (exp == act)
|
64
|
-
msg = "Expected #{act.inspect} to be equal to #{exp.inspect}" unless msg
|
65
|
-
__assert__(test, msg)
|
66
|
-
end
|
67
|
-
|
68
|
-
# Passes if expected_float and actual_float are equal within delta tolerance.
|
69
|
-
#
|
70
|
-
# assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
|
71
|
-
#
|
72
|
-
def assert_in_delta(exp, act, delta, msg=nil)
|
73
|
-
test = (exp.to_f - act.to_f).abs <= delta.to_f
|
74
|
-
msg = "Expected #{exp} to be within #{delta} of #{act}" unless msg
|
75
|
-
__assert__(test, msg)
|
76
|
-
end
|
77
|
-
|
78
|
-
# Passes if object .instance_of? klass
|
79
|
-
#
|
80
|
-
# assert_instance_of String, 'foo'
|
81
|
-
#
|
82
|
-
def assert_instance_of(cls, obj, msg=nil)
|
83
|
-
test = (cls === obj)
|
84
|
-
msg = "Expected #{obj} to be a #{cls}" unless msg
|
85
|
-
__assert__(test, msg)
|
86
|
-
end
|
87
|
-
|
88
|
-
# Passes if object .kind_of? klass
|
89
|
-
#
|
90
|
-
# assert_kind_of Object, 'foo'
|
91
|
-
#
|
92
|
-
def assert_kind_of(cls, obj, msg=nil)
|
93
|
-
test = obj.kind_of?(cls)
|
94
|
-
msg = "Expected #{obj.inspect} to be a kind of #{cls}" unless msg
|
95
|
-
__assert__(test, msg)
|
96
|
-
end
|
97
|
-
|
98
|
-
# Passes if string =~ pattern.
|
99
|
-
#
|
100
|
-
# assert_match(/\d+/, 'five, 6, seven')
|
101
|
-
#
|
102
|
-
def assert_match(exp, act, msg=nil)
|
103
|
-
test = (act =~ exp)
|
104
|
-
msg = "Expected #{act.inspect} to match #{exp.inspect}" unless msg
|
105
|
-
__assert__(test, msg)
|
106
|
-
end
|
107
|
-
|
108
|
-
# Passes if object is nil.
|
109
|
-
#
|
110
|
-
# assert_nil [1, 2].uniq!
|
111
|
-
#
|
112
|
-
def assert_nil(obj, msg=nil)
|
113
|
-
test = obj.nil?
|
114
|
-
msg = "Expected #{obj.inspect} to be nil" unless msg
|
115
|
-
__assert__(test, msg)
|
116
|
-
end
|
117
|
-
|
118
|
-
# Passes if regexp !~ string
|
119
|
-
#
|
120
|
-
# assert_no_match(/two/, 'one 2 three')
|
121
|
-
#
|
122
|
-
def assert_no_match(exp, act, msg=nil)
|
123
|
-
test = (act !~ exp)
|
124
|
-
msg = "Expected #{act.inspect} to match #{exp.inspect}" unless msg
|
125
|
-
__assert__(test, msg)
|
126
|
-
end
|
127
|
-
|
128
|
-
# Passes if expected != actual
|
129
|
-
#
|
130
|
-
# assert_not_equal 'some string', 5
|
131
|
-
#
|
132
|
-
def assert_not_equal(exp, act, msg=nil)
|
133
|
-
test = (exp != act)
|
134
|
-
msg = "Expected #{act.inspect} to not be equal to #{exp.inspect}" unless msg
|
135
|
-
__assert__(test, msg)
|
136
|
-
end
|
137
|
-
|
138
|
-
# Passes if ! object .nil?
|
139
|
-
#
|
140
|
-
# assert_not_nil '1 two 3'.sub!(/two/, '2')
|
141
|
-
#
|
142
|
-
def assert_not_nil(obj, msg=nil)
|
143
|
-
test = ! obj.nil?
|
144
|
-
msg = "Expected #{obj.inspect} to not be nil" unless msg
|
145
|
-
__assert__(test, msg)
|
146
|
-
end
|
147
|
-
|
148
|
-
# Passes if ! actual .equal? expected
|
149
|
-
#
|
150
|
-
# assert_not_same Object.new, Object.new
|
151
|
-
#
|
152
|
-
def assert_not_same(exp, act, msg=nil)
|
153
|
-
test = ! exp.equal?(act)
|
154
|
-
msg = "Expected #{act.inspect} to not be the same as #{exp.inspect}" unless msg
|
155
|
-
__assert__(test, msg)
|
156
|
-
end
|
157
|
-
|
158
|
-
# Compares the +object1+ with +object2+ using operator.
|
159
|
-
#
|
160
|
-
# Passes if object1.send(operator, object2) is true.
|
161
|
-
#
|
162
|
-
# assert_operator 5, :>=, 4
|
163
|
-
#
|
164
|
-
def assert_operator(o1, op, o2, msg="")
|
165
|
-
test = o1.__send__(op, o2)
|
166
|
-
msg = "Expected #{o1}.#{op}(#{o2}) to be true" unless msg
|
167
|
-
__assert__(test, msg)
|
168
|
-
end
|
169
|
-
|
170
|
-
# Passes if the block raises one of the given exceptions.
|
171
|
-
#
|
172
|
-
# assert_raise RuntimeError, LoadError do
|
173
|
-
# raise 'Boom!!!'
|
174
|
-
# end
|
175
|
-
#
|
176
|
-
def assert_raises(*args)
|
177
|
-
if msg = (Module === args.last ? nil : args.pop)
|
178
|
-
begin
|
179
|
-
yield
|
180
|
-
msg = "Expected #{exp} to be raised" unless msg
|
181
|
-
__assert__(false, msg)
|
182
|
-
rescue Exception => e
|
183
|
-
test = (exp === e)
|
184
|
-
msg = "Expected #{exp} to be raised, but got #{e.class}" unless msg
|
185
|
-
__assert__(test, msg)
|
186
|
-
return e
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
alias_method :assert_raise, :assert_raises
|
191
|
-
|
192
|
-
# Provides a way to assert that a procedure
|
193
|
-
# <i>does not</i> raise an exception.
|
194
|
-
#
|
195
|
-
# refute_raises(StandardError){ raise }
|
196
|
-
#
|
197
|
-
#def assert_raises!(exception, &block)
|
198
|
-
# begin
|
199
|
-
# block.call(*a)
|
200
|
-
# rescue exception
|
201
|
-
# raise Assertion
|
202
|
-
# end
|
203
|
-
#end
|
204
|
-
#alias_method :refute_raises, :assert_raises!
|
205
|
-
|
206
|
-
# Passes if +object+ respond_to? +method+.
|
207
|
-
#
|
208
|
-
# assert_respond_to 'bugbear', :slice
|
209
|
-
#
|
210
|
-
def assert_respond_to(obj, meth, msg=nil)
|
211
|
-
msg = "Expected #{obj} (#{obj.class}) to respond to ##{meth}" unless msg
|
212
|
-
#flip = (Symbol === obj) && ! (Symbol === meth) # HACK for specs
|
213
|
-
#obj, meth = meth, obj if flip
|
214
|
-
test = obj.respond_to?(meth)
|
215
|
-
__assert__(test, msg)
|
216
|
-
end
|
217
|
-
|
218
|
-
# Passes if +actual+ .equal? +expected+ (i.e. they are the same instance).
|
219
|
-
#
|
220
|
-
# o = Object.new
|
221
|
-
# assert_same(o, o)
|
222
|
-
#
|
223
|
-
def assert_same(exp, act, msg=nil)
|
224
|
-
msg = "Expected #{act.inspect} to be the same as #{exp.inspect}" unless msg
|
225
|
-
test = exp.equal?(act)
|
226
|
-
__assert__(test, msg)
|
227
|
-
end
|
228
|
-
|
229
|
-
# Passes if the method send returns a true value.
|
230
|
-
# The parameter +send_array+ is composed of:
|
231
|
-
#
|
232
|
-
# * A receiver
|
233
|
-
# * A method
|
234
|
-
# * Arguments to the method
|
235
|
-
#
|
236
|
-
# Example:
|
237
|
-
#
|
238
|
-
# assert_send [[1, 2], :include?, 4]
|
239
|
-
#
|
240
|
-
def assert_send(send_array, msg=nil)
|
241
|
-
r, m, *args = *send_array
|
242
|
-
test = r.__send__(m, *args)
|
243
|
-
msg = "Expected #{r}.#{m}(*#{args.inspect}) to return true" unless msg
|
244
|
-
__assert__(test, msg)
|
245
|
-
end
|
246
|
-
|
247
|
-
# Passes if the block throws expected_symbol
|
248
|
-
#
|
249
|
-
# assert_throws :done do
|
250
|
-
# throw :done
|
251
|
-
# end
|
252
|
-
#
|
253
|
-
def assert_throws(sym, msg=nil)
|
254
|
-
msg = "Expected #{sym} to have been thrown" unless msg
|
255
|
-
test = true
|
256
|
-
catch(sym) do
|
257
|
-
begin
|
258
|
-
yield
|
259
|
-
rescue ArgumentError => e # 1.9 exception
|
260
|
-
default += ", not #{e.message.split(/ /).last}"
|
261
|
-
rescue NameError => e # 1.8 exception
|
262
|
-
default += ", not #{e.name.inspect}"
|
263
|
-
end
|
264
|
-
test = false
|
265
|
-
end
|
266
|
-
__assert__(test, msg)
|
267
|
-
end
|
268
|
-
|
269
|
-
# Flunk always fails.
|
270
|
-
#
|
271
|
-
# flunk 'Not done testing yet.'
|
272
|
-
#
|
273
|
-
def flunk(msg=nil)
|
274
|
-
__assert__(false, msg)
|
275
|
-
end
|
276
|
-
|
277
|
-
end #module Assertions
|
278
|
-
|
279
|
-
end #module Legacy
|
280
|
-
|
281
|
-
end #module Grammar
|
282
|
-
|
283
|
-
# This could be in Object, but since they will only be needed in
|
284
|
-
# the context of a, well, Context...
|
285
|
-
#
|
286
|
-
class Context #:nodoc:
|
287
|
-
include Grammar::Legacy::Assertions
|
288
|
-
end
|
289
|
-
|
290
|
-
end #module Quarry
|
291
|
-
|