test-unit 2.5.5 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|