test-unit 2.5.5 → 3.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.
- checksums.yaml +7 -0
- data/{README.textile → README.md} +15 -12
- data/Rakefile +3 -11
- data/doc/text/how-to.md +88 -0
- data/doc/text/news.md +731 -0
- data/lib/test/unit/{assertionfailederror.rb → assertion-failed-error.rb} +0 -0
- data/lib/test/unit/assertions.rb +354 -167
- data/lib/test/unit/attribute.rb +2 -1
- data/lib/test/unit/autorunner.rb +12 -10
- data/lib/test/unit/collector/dir.rb +8 -8
- data/lib/test/unit/collector/load.rb +10 -4
- data/lib/test/unit/collector/objectspace.rb +3 -3
- data/lib/test/unit/{exceptionhandler.rb → exception-handler.rb} +1 -1
- data/lib/test/unit/{testsuitecreator.rb → test-suite-creator.rb} +4 -3
- data/lib/test/unit/testcase.rb +14 -7
- data/lib/test/unit/util/backtracefilter.rb +8 -2
- data/lib/test/unit/version.rb +1 -1
- data/test/test-assertions.rb +284 -150
- data/test/test-attribute.rb +11 -0
- data/test/{test_error.rb → test-error.rb} +0 -0
- data/test/{test_failure.rb → test-failure.rb} +0 -0
- data/test/{test-testcase.rb → test-test-case.rb} +438 -201
- data/test/{test_testresult.rb → test-test-result.rb} +0 -0
- data/test/test-test-suite-creator.rb +97 -0
- data/test/{test_testsuite.rb → test-test-suite.rb} +0 -0
- metadata +140 -136
File without changes
|
data/lib/test/unit/assertions.rb
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
# Author:: Nathaniel Talbott.
|
2
2
|
# Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
|
3
|
-
# Copyright (c) 2009-
|
3
|
+
# Copyright (c) 2009-2013 Kouhei Sutou. All rights reserved.
|
4
4
|
# License:: Ruby license.
|
5
5
|
|
6
|
-
require 'test/unit/
|
6
|
+
require 'test/unit/assertion-failed-error'
|
7
7
|
require 'test/unit/util/backtracefilter'
|
8
8
|
require 'test/unit/util/method-owner-finder'
|
9
9
|
require 'test/unit/diff'
|
10
10
|
|
11
|
+
begin
|
12
|
+
require 'power_assert'
|
13
|
+
rescue LoadError, SyntaxError
|
14
|
+
end
|
15
|
+
|
11
16
|
module Test
|
12
17
|
module Unit
|
13
18
|
|
@@ -20,11 +25,12 @@ module Test
|
|
20
25
|
# override add_assertion to get notified whenever an assertion is made.
|
21
26
|
#
|
22
27
|
# Notes:
|
28
|
+
#
|
23
29
|
# * The message to each assertion, if given, will be propagated with the
|
24
30
|
# failure.
|
25
31
|
# * It is easy to add your own assertions based on assert_block().
|
26
32
|
#
|
27
|
-
#
|
33
|
+
# @example Example Custom Assertion
|
28
34
|
#
|
29
35
|
# def deny(boolean, message = nil)
|
30
36
|
# message = build_message message, '<?> is not false or nil.', boolean
|
@@ -39,13 +45,11 @@ module Test
|
|
39
45
|
# The assertion upon which all other assertions are based. Passes if the
|
40
46
|
# block yields true.
|
41
47
|
#
|
42
|
-
#
|
48
|
+
# @example
|
43
49
|
# assert_block "Couldn't do the thing" do
|
44
50
|
# do_the_thing
|
45
51
|
# end
|
46
|
-
|
47
|
-
public
|
48
|
-
def assert_block(message="assert_block failed.") # :yields:
|
52
|
+
def assert_block(message="assert_block failed.")
|
49
53
|
_wrap_assertion do
|
50
54
|
if (! yield)
|
51
55
|
raise AssertionFailedError.new(message.to_s)
|
@@ -53,34 +57,112 @@ module Test
|
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
#
|
60
|
-
#
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
# @private
|
61
|
+
NOT_SPECIFIED = Object.new
|
62
|
+
|
63
|
+
# @overload assert(object, message=nil)
|
64
|
+
#
|
65
|
+
# Asserts that `object` is not false nor nil.
|
66
|
+
#
|
67
|
+
# Normally, you don't need to use this assertion. Use more
|
68
|
+
# specific assertions such as #assert_equal and
|
69
|
+
# #assert_include.
|
70
|
+
#
|
71
|
+
# @example Pass patterns
|
72
|
+
# assert(true) # => pass
|
73
|
+
# assert([1, 2].include?(1)) # => pass
|
74
|
+
#
|
75
|
+
# @example Failure patterns
|
76
|
+
# assert(nil) # => failure
|
77
|
+
# assert(false) # => failure
|
78
|
+
# assert([1, 2].include?(5)) # => failure
|
79
|
+
#
|
80
|
+
# @param [Object] object The check target.
|
81
|
+
# @param [String] message The additional user message. It is
|
82
|
+
# showed when the assertion is failed.
|
83
|
+
# @return [void]
|
84
|
+
#
|
85
|
+
# @overload assert(message=nil) {}
|
86
|
+
#
|
87
|
+
# Asserts that the givens block returns not false nor nil.
|
88
|
+
#
|
89
|
+
# This style uses Power Assert. It means that you can see each
|
90
|
+
# object values in method chains on failure. See the following
|
91
|
+
# example about Power Assert.
|
92
|
+
#
|
93
|
+
# @example Power Assert
|
94
|
+
# coins = [1, 5, 50]
|
95
|
+
# target_coin = 10
|
96
|
+
# assert do
|
97
|
+
# coins.include?(target_coin)
|
98
|
+
# end
|
99
|
+
# # =>
|
100
|
+
# # coins.include?(target_coin)
|
101
|
+
# # | | |
|
102
|
+
# # | | 10
|
103
|
+
# # | false
|
104
|
+
# # [1, 5, 50]
|
105
|
+
#
|
106
|
+
# We recommend you to use Power Assert for predicate method
|
107
|
+
# checks rather than existing assertions such as
|
108
|
+
# #assert_include and #assert_predicate. Power Assert shows
|
109
|
+
# useful message for debugging.
|
110
|
+
#
|
111
|
+
# We don't recommend you use Power Assert for equality
|
112
|
+
# check. You should use #assert_equal for the case. Because
|
113
|
+
# #assert_equal shows more useful message for debugging.
|
114
|
+
#
|
115
|
+
# @example Pass patterns
|
116
|
+
# assert {true} # => pass
|
117
|
+
# assert {[1, 2].include?(1)} # => pass
|
118
|
+
#
|
119
|
+
# @example Failure patterns
|
120
|
+
# assert {nil} # => failure
|
121
|
+
# assert {false} # => failure
|
122
|
+
# assert {[1, 2].include?(5)} # => failure
|
123
|
+
#
|
124
|
+
# @param [String] message The additional user message. It is
|
125
|
+
# showed when the assertion is failed.
|
126
|
+
# @yield [] Given no parameters to the block.
|
127
|
+
# @yieldreturn [Object] The checked object.
|
128
|
+
# @return [void]
|
129
|
+
def assert(object=NOT_SPECIFIED, message=nil, &block)
|
64
130
|
_wrap_assertion do
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
131
|
+
have_object = (object != NOT_SPECIFIED)
|
132
|
+
if block
|
133
|
+
message = object if have_object
|
134
|
+
if defined?(PowerAssert)
|
135
|
+
PowerAssert.start(block, assertion_method: __callee__) do |pa|
|
136
|
+
pa_message = AssertionMessage.delayed_literal(&pa.message_proc)
|
137
|
+
assertion_message = build_message(message, "?", pa_message)
|
138
|
+
assert_block(assertion_message) do
|
139
|
+
pa.yield
|
140
|
+
end
|
141
|
+
end
|
142
|
+
else
|
143
|
+
assert(yield, message)
|
144
|
+
end
|
70
145
|
else
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
146
|
+
unless have_object
|
147
|
+
raise ArgumentError, "wrong number of arguments (0 for 1..2)"
|
148
|
+
end
|
149
|
+
assertion_message = nil
|
150
|
+
case message
|
151
|
+
when nil, String, Proc
|
152
|
+
when AssertionMessage
|
153
|
+
assertion_message = message
|
154
|
+
else
|
155
|
+
error_message = "assertion message must be String, Proc or "
|
156
|
+
error_message << "#{AssertionMessage}: "
|
157
|
+
error_message << "<#{message.inspect}>(<#{message.class}>)"
|
158
|
+
raise ArgumentError, error_message, filter_backtrace(caller)
|
159
|
+
end
|
160
|
+
assertion_message ||= build_message(message,
|
161
|
+
"<?> is not true.",
|
162
|
+
object)
|
163
|
+
assert_block(assertion_message) do
|
164
|
+
object
|
165
|
+
end
|
84
166
|
end
|
85
167
|
end
|
86
168
|
end
|
@@ -133,10 +215,8 @@ module Test
|
|
133
215
|
# error message is generated when this one fails that tells you the
|
134
216
|
# values of expected and actual.
|
135
217
|
#
|
136
|
-
#
|
218
|
+
# @example
|
137
219
|
# assert_equal 'MY STRING', 'my string'.upcase
|
138
|
-
|
139
|
-
public
|
140
220
|
def assert_equal(expected, actual, message=nil)
|
141
221
|
diff = AssertionMessage.delayed_diff(expected, actual)
|
142
222
|
if expected.respond_to?(:encoding) and
|
@@ -169,7 +249,7 @@ EOT
|
|
169
249
|
# exceptions. When an expected exception is an Exception
|
170
250
|
# object, passes if expected_exception == actual_exception.
|
171
251
|
#
|
172
|
-
#
|
252
|
+
# @example
|
173
253
|
# assert_raise(RuntimeError, LoadError) do
|
174
254
|
# raise 'Boom!!!'
|
175
255
|
# end # -> pass
|
@@ -181,7 +261,6 @@ EOT
|
|
181
261
|
# assert_raise(RuntimeError.new("XXX")) {raise "XXX"} # -> pass
|
182
262
|
# assert_raise(MyError.new("XXX")) {raise "XXX"} # -> fail
|
183
263
|
# assert_raise(RuntimeError.new("ZZZ")) {raise "XXX"} # -> fail
|
184
|
-
public
|
185
264
|
def assert_raise(*args, &block)
|
186
265
|
assert_expected_exception = Proc.new do |*_args|
|
187
266
|
message, assert_exception_helper, actual_exception = _args
|
@@ -211,7 +290,7 @@ EOT
|
|
211
290
|
# Passes if the block raises one of the given
|
212
291
|
# exceptions or sub exceptions of the given exceptions.
|
213
292
|
#
|
214
|
-
#
|
293
|
+
# @example
|
215
294
|
# assert_raise_kind_of(SystemCallError) do
|
216
295
|
# raise Errno::EACCES
|
217
296
|
# end
|
@@ -236,49 +315,81 @@ EOT
|
|
236
315
|
# an array of classes, it passes if any class
|
237
316
|
# satisfies +object.instance_of?(class).
|
238
317
|
#
|
239
|
-
#
|
318
|
+
# @example
|
240
319
|
# assert_instance_of(String, 'foo') # -> pass
|
241
320
|
# assert_instance_of([Fixnum, NilClass], 100) # -> pass
|
242
321
|
# assert_instance_of([Numeric, NilClass], 100) # -> fail
|
243
|
-
|
244
|
-
public
|
245
322
|
def assert_instance_of(klass, object, message="")
|
246
323
|
_wrap_assertion do
|
247
|
-
|
248
|
-
|
324
|
+
if klass.is_a?(Array)
|
325
|
+
klasses = klass
|
326
|
+
else
|
327
|
+
klasses = [klass]
|
328
|
+
end
|
249
329
|
assert_block("The first parameter to assert_instance_of should be " +
|
250
330
|
"a Class or an Array of Class.") do
|
251
|
-
|
252
|
-
klasses.all? {|k| k.is_a?(Class)}
|
253
|
-
else
|
254
|
-
klass.is_a?(Class)
|
255
|
-
end
|
331
|
+
klasses.all? {|k| k.is_a?(Class)}
|
256
332
|
end
|
257
333
|
klass_message = AssertionMessage.maybe_container(klass) do |value|
|
258
334
|
"<#{value}>"
|
259
335
|
end
|
260
336
|
full_message = build_message(message, <<EOT, object, klass_message, object.class)
|
261
|
-
<?> expected to be
|
337
|
+
<?> expected to be instance_of\\?
|
262
338
|
? but was
|
263
339
|
<?>.
|
264
340
|
EOT
|
265
341
|
assert_block(full_message) do
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
342
|
+
klasses.any? {|k| object.instance_of?(k)}
|
343
|
+
end
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
##
|
348
|
+
# Passes if +object+.instance_of?(+klass+) does not hold.
|
349
|
+
# When +klass+ is an array of classes, it passes if no class
|
350
|
+
# satisfies +object.instance_of?(class).
|
351
|
+
#
|
352
|
+
# @example
|
353
|
+
# assert_not_instance_of(String, 100) # -> pass
|
354
|
+
# assert_not_instance_of([Fixnum, NilClass], '100') # -> pass
|
355
|
+
# assert_not_instance_of([Numeric, NilClass], 100) # -> fail
|
356
|
+
#
|
357
|
+
# @since 3.0.0
|
358
|
+
def assert_not_instance_of(klass, object, message="")
|
359
|
+
_wrap_assertion do
|
360
|
+
if klass.is_a?(Array)
|
361
|
+
klasses = klass
|
362
|
+
else
|
363
|
+
klasses = [klass]
|
364
|
+
end
|
365
|
+
assert_block("The first parameter to assert_not_instance_of should be " <<
|
366
|
+
"a Class or an Array of Class.") do
|
367
|
+
klasses.all? {|k| k.is_a?(Class)}
|
368
|
+
end
|
369
|
+
klass_message = AssertionMessage.maybe_container(klass) do |value|
|
370
|
+
"<#{value}>"
|
371
|
+
end
|
372
|
+
full_message = build_message(message,
|
373
|
+
"<?> expected to not be instance_of\\?\n" +
|
374
|
+
"? but was.",
|
375
|
+
object,
|
376
|
+
klass_message)
|
377
|
+
assert_block(full_message) do
|
378
|
+
klasses.none? {|k| object.instance_of?(k)}
|
271
379
|
end
|
272
380
|
end
|
273
381
|
end
|
274
382
|
|
383
|
+
# Just for minitest compatibility. :<
|
384
|
+
#
|
385
|
+
# @since 3.0.0
|
386
|
+
alias_method :refute_instance_of, :assert_not_instance_of
|
387
|
+
|
275
388
|
##
|
276
389
|
# Passes if +object+ is nil.
|
277
390
|
#
|
278
|
-
#
|
391
|
+
# @example
|
279
392
|
# assert_nil [1, 2].uniq!
|
280
|
-
|
281
|
-
public
|
282
393
|
def assert_nil(object, message="")
|
283
394
|
full_message = build_message(message, <<EOT, object)
|
284
395
|
<?> expected to be nil.
|
@@ -291,23 +402,20 @@ EOT
|
|
291
402
|
# an array of classes or modules, it passes if any
|
292
403
|
# class or module satisfies +object.kind_of?(class_or_module).
|
293
404
|
#
|
294
|
-
#
|
405
|
+
# @example
|
295
406
|
# assert_kind_of(Object, 'foo') # -> pass
|
296
407
|
# assert_kind_of([Fixnum, NilClass], 100) # -> pass
|
297
408
|
# assert_kind_of([Fixnum, NilClass], "string") # -> fail
|
298
|
-
|
299
|
-
public
|
300
409
|
def assert_kind_of(klass, object, message="")
|
301
410
|
_wrap_assertion do
|
302
|
-
|
303
|
-
|
411
|
+
if klass.is_a?(Array)
|
412
|
+
klasses = klass
|
413
|
+
else
|
414
|
+
klasses = [klass]
|
415
|
+
end
|
304
416
|
assert_block("The first parameter to assert_kind_of should be " +
|
305
417
|
"a kind_of Module or an Array of a kind_of Module.") do
|
306
|
-
|
307
|
-
klasses.all? {|k| k.kind_of?(Module)}
|
308
|
-
else
|
309
|
-
klass.kind_of?(Module)
|
310
|
-
end
|
418
|
+
klasses.all? {|k| k.kind_of?(Module)}
|
311
419
|
end
|
312
420
|
klass_message = AssertionMessage.maybe_container(klass) do |value|
|
313
421
|
"<#{value}>"
|
@@ -320,22 +428,57 @@ EOT
|
|
320
428
|
klass_message,
|
321
429
|
object.class)
|
322
430
|
assert_block(full_message) do
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
431
|
+
klasses.any? {|k| object.kind_of?(k)}
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
##
|
437
|
+
# Passes if +object+.kind_of?(+klass+) does not hold.
|
438
|
+
# When +klass+ is an array of classes or modules, it passes only if all
|
439
|
+
# classes (and modules) do not satisfy +object.kind_of?(class_or_module).
|
440
|
+
#
|
441
|
+
# @example
|
442
|
+
# assert_not_kind_of(Fixnum, 'foo') # -> pass
|
443
|
+
# assert_not_kind_of([Fixnum, NilClass], '0') # -> pass
|
444
|
+
# assert_not_kind_of([Fixnum, NilClass], 100) # -> fail
|
445
|
+
#
|
446
|
+
# @since 3.0.0
|
447
|
+
def assert_not_kind_of(klass, object, message="")
|
448
|
+
_wrap_assertion do
|
449
|
+
if klass.is_a?(Array)
|
450
|
+
klasses = klass
|
451
|
+
else
|
452
|
+
klasses = [klass]
|
453
|
+
end
|
454
|
+
assert_block("The first parameter to assert_not_kind_of should be " +
|
455
|
+
"a kind_of Module or an Array of a kind_of Module.") do
|
456
|
+
klasses.all? {|k| k.kind_of?(Module)}
|
457
|
+
end
|
458
|
+
klass_message = AssertionMessage.maybe_container(klass) do |value|
|
459
|
+
"<#{value}>"
|
460
|
+
end
|
461
|
+
full_message = build_message(message,
|
462
|
+
"<?> expected to not be kind_of\\?\n" +
|
463
|
+
"? but was.",
|
464
|
+
object,
|
465
|
+
klass_message)
|
466
|
+
assert_block(full_message) do
|
467
|
+
klasses.none? {|k| object.kind_of?(k)}
|
328
468
|
end
|
329
469
|
end
|
330
470
|
end
|
331
471
|
|
472
|
+
# Just for minitest compatibility. :<
|
473
|
+
#
|
474
|
+
# @since 3.0.0
|
475
|
+
alias_method :refute_kind_of, :assert_not_kind_of
|
476
|
+
|
332
477
|
##
|
333
478
|
# Passes if +object+ .respond_to? +method+
|
334
479
|
#
|
335
|
-
#
|
480
|
+
# @example
|
336
481
|
# assert_respond_to 'bugbear', :slice
|
337
|
-
|
338
|
-
public
|
339
482
|
def assert_respond_to(object, method, message="")
|
340
483
|
_wrap_assertion do
|
341
484
|
full_message = build_message(message,
|
@@ -356,11 +499,9 @@ EOT
|
|
356
499
|
##
|
357
500
|
# Passes if +object+ does not .respond_to? +method+.
|
358
501
|
#
|
359
|
-
#
|
502
|
+
# @example
|
360
503
|
# assert_not_respond_to('bugbear', :nonexistence) # -> pass
|
361
504
|
# assert_not_respond_to('bugbear', :size) # -> fail
|
362
|
-
|
363
|
-
public
|
364
505
|
def assert_not_respond_to(object, method, message="")
|
365
506
|
_wrap_assertion do
|
366
507
|
full_message = build_message(message,
|
@@ -386,10 +527,8 @@ EOT
|
|
386
527
|
##
|
387
528
|
# Passes if +string+ =~ +pattern+.
|
388
529
|
#
|
389
|
-
#
|
530
|
+
# @example
|
390
531
|
# assert_match(/\d+/, 'five, 6, seven')
|
391
|
-
|
392
|
-
public
|
393
532
|
def assert_match(pattern, string, message="")
|
394
533
|
_wrap_assertion do
|
395
534
|
pattern = case(pattern)
|
@@ -407,11 +546,9 @@ EOT
|
|
407
546
|
# Passes if +actual+ .equal? +expected+ (i.e. they are the same
|
408
547
|
# instance).
|
409
548
|
#
|
410
|
-
#
|
549
|
+
# @example
|
411
550
|
# o = Object.new
|
412
551
|
# assert_same o, o
|
413
|
-
|
414
|
-
public
|
415
552
|
def assert_same(expected, actual, message="")
|
416
553
|
full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
|
417
554
|
<?>
|
@@ -427,10 +564,8 @@ EOT
|
|
427
564
|
#
|
428
565
|
# Passes if object1.__send__(operator, object2) is true.
|
429
566
|
#
|
430
|
-
#
|
567
|
+
# @example
|
431
568
|
# assert_operator 5, :>=, 4
|
432
|
-
|
433
|
-
public
|
434
569
|
def assert_operator(object1, operator, object2, message="")
|
435
570
|
_wrap_assertion do
|
436
571
|
full_message = build_message(nil, "<?>\ngiven as the operator for #assert_operator must be a Symbol or #respond_to\\?(:to_str).", operator)
|
@@ -444,15 +579,41 @@ EOT
|
|
444
579
|
end
|
445
580
|
end
|
446
581
|
|
582
|
+
##
|
583
|
+
# Compares the +object1+ with +object2+ using +operator+.
|
584
|
+
#
|
585
|
+
# Passes if object1.__send__(operator, object2) is not true.
|
586
|
+
#
|
587
|
+
# @example
|
588
|
+
# assert_not_operator(5, :<, 4) # => pass
|
589
|
+
# assert_not_operator(5, :>, 4) # => fail
|
590
|
+
#
|
591
|
+
# @since 3.0.0
|
592
|
+
def assert_not_operator(object1, operator, object2, message="")
|
593
|
+
_wrap_assertion do
|
594
|
+
full_message = build_message(nil, "<?>\ngiven as the operator for #assert_not_operator must be a Symbol or #respond_to\\?(:to_str).", operator)
|
595
|
+
assert_block(full_message){operator.kind_of?(Symbol) || operator.respond_to?(:to_str)}
|
596
|
+
full_message = build_message(message, <<EOT, object1, AssertionMessage.literal(operator), object2)
|
597
|
+
<?> expected to not be
|
598
|
+
?
|
599
|
+
<?>.
|
600
|
+
EOT
|
601
|
+
assert_block(full_message) { ! object1.__send__(operator, object2) }
|
602
|
+
end
|
603
|
+
end
|
604
|
+
|
605
|
+
# Just for minitest compatibility. :<
|
606
|
+
#
|
607
|
+
# @since 3.0.0
|
608
|
+
alias_method :refute_operator, :assert_not_operator
|
609
|
+
|
447
610
|
##
|
448
611
|
# Passes if block does not raise an exception.
|
449
612
|
#
|
450
|
-
#
|
613
|
+
# @example
|
451
614
|
# assert_nothing_raised do
|
452
615
|
# [1, 2].uniq
|
453
616
|
# end
|
454
|
-
|
455
|
-
public
|
456
617
|
def assert_nothing_raised(*args)
|
457
618
|
_wrap_assertion do
|
458
619
|
if args.last.is_a?(String)
|
@@ -480,10 +641,8 @@ EOT
|
|
480
641
|
##
|
481
642
|
# Flunk always fails.
|
482
643
|
#
|
483
|
-
#
|
644
|
+
# @example
|
484
645
|
# flunk 'Not done testing yet.'
|
485
|
-
|
486
|
-
public
|
487
646
|
def flunk(message="Flunked")
|
488
647
|
assert_block(build_message(message)){false}
|
489
648
|
end
|
@@ -491,10 +650,8 @@ EOT
|
|
491
650
|
##
|
492
651
|
# Passes if ! +actual+ .equal? +expected+
|
493
652
|
#
|
494
|
-
#
|
653
|
+
# @example
|
495
654
|
# assert_not_same Object.new, Object.new
|
496
|
-
|
497
|
-
public
|
498
655
|
def assert_not_same(expected, actual, message="")
|
499
656
|
full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
|
500
657
|
<?>
|
@@ -513,10 +670,8 @@ EOT
|
|
513
670
|
##
|
514
671
|
# Passes if +expected+ != +actual+
|
515
672
|
#
|
516
|
-
#
|
673
|
+
# @example
|
517
674
|
# assert_not_equal 'some string', 5
|
518
|
-
|
519
|
-
public
|
520
675
|
def assert_not_equal(expected, actual, message="")
|
521
676
|
full_message = build_message(message, "<?> expected to be != to\n<?>.", expected, actual)
|
522
677
|
assert_block(full_message) { expected != actual }
|
@@ -530,10 +685,8 @@ EOT
|
|
530
685
|
##
|
531
686
|
# Passes if ! +object+ .nil?
|
532
687
|
#
|
533
|
-
#
|
688
|
+
# @example
|
534
689
|
# assert_not_nil '1 two 3'.sub!(/two/, '2')
|
535
|
-
|
536
|
-
public
|
537
690
|
def assert_not_nil(object, message="")
|
538
691
|
full_message = build_message(message, "<?> expected to not be nil.", object)
|
539
692
|
assert_block(full_message){!object.nil?}
|
@@ -547,11 +700,9 @@ EOT
|
|
547
700
|
##
|
548
701
|
# Passes if +regexp+ !~ +string+
|
549
702
|
#
|
550
|
-
#
|
703
|
+
# @example
|
551
704
|
# assert_not_match(/two/, 'one 2 three') # -> pass
|
552
705
|
# assert_not_match(/three/, 'one 2 three') # -> fail
|
553
|
-
|
554
|
-
public
|
555
706
|
def assert_not_match(regexp, string, message="")
|
556
707
|
_wrap_assertion do
|
557
708
|
assert_instance_of(Regexp, regexp,
|
@@ -574,11 +725,9 @@ EOT
|
|
574
725
|
#
|
575
726
|
# Passes if +regexp+ !~ +string+
|
576
727
|
#
|
577
|
-
#
|
728
|
+
# @example
|
578
729
|
# assert_no_match(/two/, 'one 2 three') # -> pass
|
579
730
|
# assert_no_match(/three/, 'one 2 three') # -> fail
|
580
|
-
|
581
|
-
public
|
582
731
|
def assert_no_match(regexp, string, message="")
|
583
732
|
_wrap_assertion do
|
584
733
|
assert_instance_of(Regexp, regexp,
|
@@ -588,21 +737,20 @@ EOT
|
|
588
737
|
end
|
589
738
|
end
|
590
739
|
|
740
|
+
# @private
|
591
741
|
UncaughtThrow = {
|
592
|
-
NameError => /^uncaught throw
|
593
|
-
ArgumentError => /^uncaught throw (
|
594
|
-
ThreadError => /^uncaught throw
|
742
|
+
NameError => /^uncaught throw `(.+)'$/,
|
743
|
+
ArgumentError => /^uncaught throw (`.+'|.+)$/,
|
744
|
+
ThreadError => /^uncaught throw `(.+)' in thread /,
|
595
745
|
}
|
596
746
|
|
597
747
|
##
|
598
748
|
# Passes if the block throws +expected_object+
|
599
749
|
#
|
600
|
-
#
|
750
|
+
# @example
|
601
751
|
# assert_throw(:done) do
|
602
752
|
# throw(:done)
|
603
753
|
# end
|
604
|
-
|
605
|
-
public
|
606
754
|
def assert_throw(expected_object, message="", &proc)
|
607
755
|
_wrap_assertion do
|
608
756
|
begin
|
@@ -626,8 +774,7 @@ EOT
|
|
626
774
|
assert_block(full_message) {caught}
|
627
775
|
rescue NameError, ArgumentError, ThreadError => error
|
628
776
|
raise unless UncaughtThrow[error.class] =~ error.message
|
629
|
-
tag = $1
|
630
|
-
tag = tag[1..-1].intern if tag[0, 1] == ":"
|
777
|
+
tag = AssertionMessage.normalize_tag($1)
|
631
778
|
full_message = build_message(message,
|
632
779
|
"<?> expected to be thrown but\n" +
|
633
780
|
"<?> was thrown.",
|
@@ -645,12 +792,10 @@ EOT
|
|
645
792
|
##
|
646
793
|
# Passes if block does not throw anything.
|
647
794
|
#
|
648
|
-
#
|
795
|
+
# @example
|
649
796
|
# assert_nothing_thrown do
|
650
797
|
# [1, 2].uniq
|
651
798
|
# end
|
652
|
-
|
653
|
-
public
|
654
799
|
def assert_nothing_thrown(message="", &proc)
|
655
800
|
_wrap_assertion do
|
656
801
|
assert(block_given?, "Should have passed a block to assert_nothing_thrown")
|
@@ -658,8 +803,7 @@ EOT
|
|
658
803
|
proc.call
|
659
804
|
rescue NameError, ArgumentError, ThreadError => error
|
660
805
|
raise unless UncaughtThrow[error.class] =~ error.message
|
661
|
-
tag = $1
|
662
|
-
tag = tag[1..-1].intern if tag[0, 1] == ":"
|
806
|
+
tag = AssertionMessage.normalize_tag($1)
|
663
807
|
full_message = build_message(message,
|
664
808
|
"<?> was thrown when nothing was expected",
|
665
809
|
tag)
|
@@ -673,10 +817,8 @@ EOT
|
|
673
817
|
# Passes if +expected_float+ and +actual_float+ are equal
|
674
818
|
# within +delta+ tolerance.
|
675
819
|
#
|
676
|
-
#
|
820
|
+
# @example
|
677
821
|
# assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
|
678
|
-
|
679
|
-
public
|
680
822
|
def assert_in_delta(expected_float, actual_float, delta=0.001, message="")
|
681
823
|
_wrap_assertion do
|
682
824
|
_assert_in_delta_validate_arguments(expected_float,
|
@@ -696,11 +838,9 @@ EOT
|
|
696
838
|
# Passes if +expected_float+ and +actual_float+ are
|
697
839
|
# not equal within +delta+ tolerance.
|
698
840
|
#
|
699
|
-
#
|
841
|
+
# @example
|
700
842
|
# assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00002) # -> pass
|
701
843
|
# assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00001) # -> fail
|
702
|
-
|
703
|
-
public
|
704
844
|
def assert_not_in_delta(expected_float, actual_float, delta=0.001, message="")
|
705
845
|
_wrap_assertion do
|
706
846
|
_assert_in_delta_validate_arguments(expected_float,
|
@@ -722,7 +862,6 @@ EOT
|
|
722
862
|
# @since 2.5.3
|
723
863
|
alias_method :refute_in_delta, :assert_not_in_delta
|
724
864
|
|
725
|
-
# :stopdoc:
|
726
865
|
private
|
727
866
|
def _assert_in_delta_validate_arguments(expected_float,
|
728
867
|
actual_float,
|
@@ -795,17 +934,13 @@ EOT
|
|
795
934
|
end
|
796
935
|
|
797
936
|
public
|
798
|
-
# :startdoc:
|
799
|
-
|
800
937
|
##
|
801
938
|
# Passes if +expected_float+ and +actual_float+ are equal
|
802
939
|
# within +epsilon+ relative error of +expected_float+.
|
803
940
|
#
|
804
|
-
#
|
941
|
+
# @example
|
805
942
|
# assert_in_epsilon(10000.0, 9900.0, 0.1) # -> pass
|
806
943
|
# assert_in_epsilon(10000.0, 9899.0, 0.1) # -> fail
|
807
|
-
|
808
|
-
public
|
809
944
|
def assert_in_epsilon(expected_float, actual_float, epsilon=0.001,
|
810
945
|
message="")
|
811
946
|
_wrap_assertion do
|
@@ -834,11 +969,9 @@ EOT
|
|
834
969
|
# not equal within +epsilon+ relative error of
|
835
970
|
# +expected_float+.
|
836
971
|
#
|
837
|
-
#
|
972
|
+
# @example
|
838
973
|
# assert_not_in_epsilon(10000.0, 9900.0, 0.1) # -> fail
|
839
974
|
# assert_not_in_epsilon(10000.0, 9899.0, 0.1) # -> pass
|
840
|
-
|
841
|
-
public
|
842
975
|
def assert_not_in_epsilon(expected_float, actual_float, epsilon=0.001,
|
843
976
|
message="")
|
844
977
|
_wrap_assertion do
|
@@ -858,7 +991,11 @@ EOT
|
|
858
991
|
end
|
859
992
|
end
|
860
993
|
|
861
|
-
#
|
994
|
+
# Just for minitest compatibility. :<
|
995
|
+
#
|
996
|
+
# @since 3.0.0
|
997
|
+
alias_method :refute_in_epsilon, :assert_not_in_epsilon
|
998
|
+
|
862
999
|
private
|
863
1000
|
def _assert_in_epsilon_validate_arguments(expected_float,
|
864
1001
|
actual_float,
|
@@ -935,8 +1072,6 @@ EOT
|
|
935
1072
|
end
|
936
1073
|
|
937
1074
|
public
|
938
|
-
# :startdoc:
|
939
|
-
|
940
1075
|
##
|
941
1076
|
# Passes if the method send returns a true value.
|
942
1077
|
#
|
@@ -945,11 +1080,9 @@ EOT
|
|
945
1080
|
# * A method
|
946
1081
|
# * Arguments to the method
|
947
1082
|
#
|
948
|
-
#
|
1083
|
+
# @example
|
949
1084
|
# assert_send([[1, 2], :member?, 1]) # -> pass
|
950
1085
|
# assert_send([[1, 2], :member?, 4]) # -> fail
|
951
|
-
|
952
|
-
public
|
953
1086
|
def assert_send(send_array, message=nil)
|
954
1087
|
_wrap_assertion do
|
955
1088
|
assert_instance_of(Array, send_array,
|
@@ -987,7 +1120,7 @@ EOT
|
|
987
1120
|
# * A method
|
988
1121
|
# * Arguments to the method
|
989
1122
|
#
|
990
|
-
#
|
1123
|
+
# @example
|
991
1124
|
# assert_not_send([[1, 2], :member?, 1]) # -> fail
|
992
1125
|
# assert_not_send([[1, 2], :member?, 4]) # -> pass
|
993
1126
|
def assert_not_send(send_array, message=nil)
|
@@ -1022,7 +1155,7 @@ EOT
|
|
1022
1155
|
##
|
1023
1156
|
# Passes if +actual+ is a boolean value.
|
1024
1157
|
#
|
1025
|
-
#
|
1158
|
+
# @example
|
1026
1159
|
# assert_boolean(true) # -> pass
|
1027
1160
|
# assert_boolean(nil) # -> fail
|
1028
1161
|
def assert_boolean(actual, message=nil)
|
@@ -1038,7 +1171,7 @@ EOT
|
|
1038
1171
|
##
|
1039
1172
|
# Passes if +actual+ is true.
|
1040
1173
|
#
|
1041
|
-
#
|
1174
|
+
# @example
|
1042
1175
|
# assert_true(true) # -> pass
|
1043
1176
|
# assert_true(:true) # -> fail
|
1044
1177
|
def assert_true(actual, message=nil)
|
@@ -1054,7 +1187,7 @@ EOT
|
|
1054
1187
|
##
|
1055
1188
|
# Passes if +actual+ is false.
|
1056
1189
|
#
|
1057
|
-
#
|
1190
|
+
# @example
|
1058
1191
|
# assert_false(false) # -> pass
|
1059
1192
|
# assert_false(nil) # -> fail
|
1060
1193
|
def assert_false(actual, message=nil)
|
@@ -1071,7 +1204,7 @@ EOT
|
|
1071
1204
|
# Passes if expression "+expected+ +operator+
|
1072
1205
|
# +actual+" is true.
|
1073
1206
|
#
|
1074
|
-
#
|
1207
|
+
# @example
|
1075
1208
|
# assert_compare(1, "<", 10) # -> pass
|
1076
1209
|
# assert_compare(1, ">=", 10) # -> fail
|
1077
1210
|
def assert_compare(expected, operator, actual, message=nil)
|
@@ -1104,7 +1237,7 @@ EOT
|
|
1104
1237
|
##
|
1105
1238
|
# Passes if assertion is failed in block.
|
1106
1239
|
#
|
1107
|
-
#
|
1240
|
+
# @example
|
1108
1241
|
# assert_fail_assertion {assert_equal("A", "B")} # -> pass
|
1109
1242
|
# assert_fail_assertion {assert_equal("A", "A")} # -> fail
|
1110
1243
|
def assert_fail_assertion(message=nil)
|
@@ -1126,7 +1259,7 @@ EOT
|
|
1126
1259
|
# Passes if an exception is raised in block and its
|
1127
1260
|
# message is +expected+.
|
1128
1261
|
#
|
1129
|
-
#
|
1262
|
+
# @example
|
1130
1263
|
# assert_raise_message("exception") {raise "exception"} # -> pass
|
1131
1264
|
# assert_raise_message(/exc/i) {raise "exception"} # -> pass
|
1132
1265
|
# assert_raise_message("exception") {raise "EXCEPTION"} # -> fail
|
@@ -1166,7 +1299,7 @@ EOT
|
|
1166
1299
|
##
|
1167
1300
|
# Passes if +object+.const_defined?(+constant_name+)
|
1168
1301
|
#
|
1169
|
-
#
|
1302
|
+
# @example
|
1170
1303
|
# assert_const_defined(Test, :Unit) # -> pass
|
1171
1304
|
# assert_const_defined(Object, :Nonexistent) # -> fail
|
1172
1305
|
def assert_const_defined(object, constant_name, message=nil)
|
@@ -1183,7 +1316,7 @@ EOT
|
|
1183
1316
|
##
|
1184
1317
|
# Passes if !+object+.const_defined?(+constant_name+)
|
1185
1318
|
#
|
1186
|
-
#
|
1319
|
+
# @example
|
1187
1320
|
# assert_not_const_defined(Object, :Nonexistent) # -> pass
|
1188
1321
|
# assert_not_const_defined(Test, :Unit) # -> fail
|
1189
1322
|
def assert_not_const_defined(object, constant_name, message=nil)
|
@@ -1200,7 +1333,7 @@ EOT
|
|
1200
1333
|
##
|
1201
1334
|
# Passes if +object+.+predicate+ is _true_.
|
1202
1335
|
#
|
1203
|
-
#
|
1336
|
+
# @example
|
1204
1337
|
# assert_predicate([], :empty?) # -> pass
|
1205
1338
|
# assert_predicate([1], :empty?) # -> fail
|
1206
1339
|
def assert_predicate(object, predicate, message=nil)
|
@@ -1222,7 +1355,7 @@ EOT
|
|
1222
1355
|
##
|
1223
1356
|
# Passes if +object+.+predicate+ is not _true_.
|
1224
1357
|
#
|
1225
|
-
#
|
1358
|
+
# @example
|
1226
1359
|
# assert_not_predicate([1], :empty?) # -> pass
|
1227
1360
|
# assert_not_predicate([], :empty?) # -> fail
|
1228
1361
|
def assert_not_predicate(object, predicate, message=nil)
|
@@ -1241,11 +1374,16 @@ EOT
|
|
1241
1374
|
end
|
1242
1375
|
end
|
1243
1376
|
|
1377
|
+
# Just for minitest compatibility. :<
|
1378
|
+
#
|
1379
|
+
# @since 3.0.0
|
1380
|
+
alias_method :refute_predicate, :assert_not_predicate
|
1381
|
+
|
1244
1382
|
##
|
1245
1383
|
# Passes if +object+#+alias_name+ is an alias method of
|
1246
1384
|
# +object+#+original_name+.
|
1247
1385
|
#
|
1248
|
-
#
|
1386
|
+
# @example
|
1249
1387
|
# assert_alias_method([], :length, :size) # -> pass
|
1250
1388
|
# assert_alias_method([], :size, :length) # -> pass
|
1251
1389
|
# assert_alias_method([], :each, :size) # -> fail
|
@@ -1292,7 +1430,7 @@ EOT
|
|
1292
1430
|
##
|
1293
1431
|
# Passes if +path+ exists.
|
1294
1432
|
#
|
1295
|
-
#
|
1433
|
+
# @example
|
1296
1434
|
# assert_path_exist("/tmp") # -> pass
|
1297
1435
|
# assert_path_exist("/bin/sh") # -> pass
|
1298
1436
|
# assert_path_exist("/nonexistent") # -> fail
|
@@ -1310,7 +1448,7 @@ EOT
|
|
1310
1448
|
##
|
1311
1449
|
# Passes if +path+ doesn't exist.
|
1312
1450
|
#
|
1313
|
-
#
|
1451
|
+
# @example
|
1314
1452
|
# assert_path_not_exist("/nonexistent") # -> pass
|
1315
1453
|
# assert_path_not_exist("/tmp") # -> fail
|
1316
1454
|
# assert_path_not_exist("/bin/sh") # -> fail
|
@@ -1328,7 +1466,7 @@ EOT
|
|
1328
1466
|
##
|
1329
1467
|
# Passes if +collection+ includes +object+.
|
1330
1468
|
#
|
1331
|
-
#
|
1469
|
+
# @example
|
1332
1470
|
# assert_include([1, 10], 1) # -> pass
|
1333
1471
|
# assert_include(1..10, 5) # -> pass
|
1334
1472
|
# assert_include([1, 10], 5) # -> fail
|
@@ -1355,7 +1493,7 @@ EOT
|
|
1355
1493
|
##
|
1356
1494
|
# Passes if +collection+ doesn't include +object+.
|
1357
1495
|
#
|
1358
|
-
#
|
1496
|
+
# @example
|
1359
1497
|
# assert_not_include([1, 10], 5) # -> pass
|
1360
1498
|
# assert_not_include(1..10, 20) # -> pass
|
1361
1499
|
# assert_not_include([1, 10], 1) # -> fail
|
@@ -1374,10 +1512,20 @@ EOT
|
|
1374
1512
|
end
|
1375
1513
|
end
|
1376
1514
|
|
1515
|
+
# Just for minitest compatibility. :<
|
1516
|
+
#
|
1517
|
+
# @since 3.0.0
|
1518
|
+
alias_method :assert_not_includes, :assert_not_include
|
1519
|
+
|
1520
|
+
# Just for minitest compatibility. :<
|
1521
|
+
#
|
1522
|
+
# @since 3.0.0
|
1523
|
+
alias_method :refute_includes, :assert_not_include
|
1524
|
+
|
1377
1525
|
##
|
1378
1526
|
# Passes if +object+ is empty.
|
1379
1527
|
#
|
1380
|
-
#
|
1528
|
+
# @example
|
1381
1529
|
# assert_empty("") # -> pass
|
1382
1530
|
# assert_empty([]) # -> pass
|
1383
1531
|
# assert_empty({}) # -> pass
|
@@ -1400,7 +1548,7 @@ EOT
|
|
1400
1548
|
##
|
1401
1549
|
# Passes if +object+ is not empty.
|
1402
1550
|
#
|
1403
|
-
#
|
1551
|
+
# @example
|
1404
1552
|
# assert_not_empty(" ") # -> pass
|
1405
1553
|
# assert_not_empty([nil]) # -> pass
|
1406
1554
|
# assert_not_empty({1 => 2}) # -> pass
|
@@ -1420,11 +1568,14 @@ EOT
|
|
1420
1568
|
end
|
1421
1569
|
end
|
1422
1570
|
|
1571
|
+
# Just for minitest compatibility. :<
|
1572
|
+
#
|
1573
|
+
# @since 3.0.0
|
1574
|
+
alias_method :refute_empty, :assert_not_empty
|
1575
|
+
|
1423
1576
|
##
|
1424
1577
|
# Builds a failure message. +head+ is added before the +template+ and
|
1425
1578
|
# +arguments+ replaces the '?'s positionally in the template.
|
1426
|
-
|
1427
|
-
public
|
1428
1579
|
def build_message(head, template=nil, *arguments)
|
1429
1580
|
template &&= template.chomp
|
1430
1581
|
return AssertionMessage.new(head, template, arguments)
|
@@ -1460,13 +1611,10 @@ EOT
|
|
1460
1611
|
##
|
1461
1612
|
# Select whether or not to use the pretty-printer. If this option is set
|
1462
1613
|
# to false before any assertions are made, pp.rb will not be required.
|
1463
|
-
|
1464
|
-
public
|
1465
1614
|
def self.use_pp=(value)
|
1466
1615
|
AssertionMessage.use_pp = value
|
1467
1616
|
end
|
1468
1617
|
|
1469
|
-
# :stopdoc:
|
1470
1618
|
private
|
1471
1619
|
def _assert_raise(assert_expected_exception, *args, &block)
|
1472
1620
|
_wrap_assertion do
|
@@ -1497,7 +1645,6 @@ EOT
|
|
1497
1645
|
end
|
1498
1646
|
end
|
1499
1647
|
|
1500
|
-
private
|
1501
1648
|
def _set_failed_information(failure, expected, actual, user_message)
|
1502
1649
|
failure.expected = expected
|
1503
1650
|
failure.actual = actual
|
@@ -1523,6 +1670,19 @@ EOT
|
|
1523
1670
|
MaybeContainer.new(value, &formatter)
|
1524
1671
|
end
|
1525
1672
|
|
1673
|
+
def normalize_tag(tag)
|
1674
|
+
case tag
|
1675
|
+
when /\A:/
|
1676
|
+
tag[1..-1].intern
|
1677
|
+
when /\A`(.+)'\z/
|
1678
|
+
$1.intern
|
1679
|
+
when String
|
1680
|
+
tag.intern
|
1681
|
+
else
|
1682
|
+
tag
|
1683
|
+
end
|
1684
|
+
end
|
1685
|
+
|
1526
1686
|
MAX_DIFF_TARGET_STRING_SIZE = 1000
|
1527
1687
|
def max_diff_target_string_size
|
1528
1688
|
return @@max_diff_target_string_size if @@max_diff_target_string_size
|
@@ -1680,6 +1840,33 @@ EOT
|
|
1680
1840
|
end
|
1681
1841
|
end
|
1682
1842
|
|
1843
|
+
class NumericInspector
|
1844
|
+
Inspector.register_inspector_class(self)
|
1845
|
+
|
1846
|
+
class << self
|
1847
|
+
def target?(object)
|
1848
|
+
object.is_a?(Numeric)
|
1849
|
+
end
|
1850
|
+
end
|
1851
|
+
|
1852
|
+
def initialize(numeric, inspected_objects)
|
1853
|
+
@inspected_objects = inspected_objects
|
1854
|
+
@numeric = numeric
|
1855
|
+
end
|
1856
|
+
|
1857
|
+
def inspect
|
1858
|
+
@numeric.to_s
|
1859
|
+
end
|
1860
|
+
|
1861
|
+
def pretty_print(q)
|
1862
|
+
q.text(@numeric.to_s)
|
1863
|
+
end
|
1864
|
+
|
1865
|
+
def pretty_print_cycle(q)
|
1866
|
+
q.text(@numeric.to_s)
|
1867
|
+
end
|
1868
|
+
end
|
1869
|
+
|
1683
1870
|
class HashInspector
|
1684
1871
|
Inspector.register_inspector_class(self)
|
1685
1872
|
|