qed 1.0.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/HISTORY +15 -0
- data/LICENSE +344 -0
- data/MANIFEST +56 -0
- data/README.rdoc +97 -0
- data/bin/qed +150 -0
- data/bin/qedoc +52 -0
- data/demo/01_spec.qed +143 -0
- data/demo/01_spec.yaml +4 -0
- data/demo/qed_helper.rb +1 -0
- data/doc/qedoc/index.html +355 -0
- data/doc/qedoc/jquery.js +19 -0
- data/lib/qed.rb +5 -0
- data/lib/qed/assertion.rb +23 -0
- data/lib/qed/document.rb +188 -0
- data/lib/qed/document/jquery.js +19 -0
- data/lib/qed/document/markup.rb +53 -0
- data/lib/qed/document/template.rhtml +190 -0
- data/lib/qed/doubles/mock.rb +94 -0
- data/lib/qed/doubles/spy.rb +191 -0
- data/lib/qed/doubles/stub.rb +94 -0
- data/lib/qed/expectation.rb +60 -0
- data/lib/qed/grammar/assert.rb +104 -0
- data/lib/qed/grammar/expect.rb +121 -0
- data/lib/qed/grammar/legacy/assert.rb +291 -0
- data/lib/qed/grammar/should.rb +52 -0
- data/lib/qed/reporter/base.rb +101 -0
- data/lib/qed/reporter/dotprogress.rb +63 -0
- data/lib/qed/reporter/summary.rb +67 -0
- data/lib/qed/reporter/verbatim.rb +90 -0
- data/lib/qed/runner.rb +148 -0
- data/lib/qed/script.rb +179 -0
- data/lib/qed/utilities/extract.rb +137 -0
- data/lib/qed/utilities/monitor.rb +23 -0
- data/meta/authors +1 -0
- data/meta/created +1 -0
- data/meta/description +2 -0
- data/meta/homepage +1 -0
- data/meta/package +1 -0
- data/meta/project +1 -0
- data/meta/requires +1 -0
- data/meta/ruby +2 -0
- data/meta/summary +1 -0
- data/meta/title +1 -0
- data/meta/version +1 -0
- metadata +115 -0
@@ -0,0 +1,121 @@
|
|
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
|
+
|
@@ -0,0 +1,291 @@
|
|
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
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module QED
|
2
|
+
|
3
|
+
require 'qed/expectation'
|
4
|
+
|
5
|
+
module Grammar
|
6
|
+
|
7
|
+
# = Should Nomenclature
|
8
|
+
#
|
9
|
+
# The term *should* has become the defacto standard for
|
10
|
+
# BDD assertions, so Quarry supports this nomenclature.
|
11
|
+
#
|
12
|
+
module Should
|
13
|
+
|
14
|
+
# Same as #expect but only as a functor.
|
15
|
+
#
|
16
|
+
# 4.should == 3 #=> Expectation Error
|
17
|
+
#
|
18
|
+
def should
|
19
|
+
return Expectation.new(self, :backtrace=>caller)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Designate a negated expectation via a *functor*.
|
23
|
+
# Read this as "should not".
|
24
|
+
#
|
25
|
+
# 4.should! == 4 #=> Expectation Error
|
26
|
+
#
|
27
|
+
# See also #expect!
|
28
|
+
#
|
29
|
+
def should!
|
30
|
+
return Expectation.new(self, :negate=>true, :backtrace=>caller)
|
31
|
+
end
|
32
|
+
|
33
|
+
# See #should! method.
|
34
|
+
#
|
35
|
+
alias_method :should_not, :should!
|
36
|
+
|
37
|
+
#
|
38
|
+
#alias_method :should_raise, :assert_raises
|
39
|
+
|
40
|
+
#
|
41
|
+
#alias_method :should_not_raise, :assert_raises!
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
class ::Object #:nodoc:
|
48
|
+
include Grammar::Should
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|