test-unit 3.3.1 → 3.3.6
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 +4 -4
- data/doc/text/news.md +67 -0
- data/lib/test/unit.rb +171 -157
- data/lib/test/unit/assertions.rb +52 -52
- data/lib/test/unit/autorunner.rb +55 -23
- data/lib/test/unit/code-snippet-fetcher.rb +4 -2
- data/lib/test/unit/collector/load.rb +1 -3
- data/lib/test/unit/data.rb +2 -2
- data/lib/test/unit/notification.rb +9 -7
- data/lib/test/unit/omission.rb +34 -31
- data/lib/test/unit/pending.rb +12 -11
- data/lib/test/unit/priority.rb +7 -3
- data/lib/test/unit/testcase.rb +138 -123
- data/lib/test/unit/util/observable.rb +2 -2
- data/lib/test/unit/util/output.rb +5 -4
- data/lib/test/unit/version.rb +1 -1
- data/test/collector/test-load.rb +35 -2
- data/test/test-assertions.rb +10 -5
- data/test/test-priority.rb +19 -8
- metadata +33 -34
data/lib/test/unit/assertions.rb
CHANGED
@@ -171,7 +171,7 @@ module Test
|
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
174
|
-
# Asserts that
|
174
|
+
# Asserts that `object` is false or nil.
|
175
175
|
#
|
176
176
|
# @note Just for minitest compatibility. :<
|
177
177
|
#
|
@@ -213,7 +213,7 @@ module Test
|
|
213
213
|
end
|
214
214
|
|
215
215
|
##
|
216
|
-
# Passes if
|
216
|
+
# Passes if `expected` == `actual`.
|
217
217
|
#
|
218
218
|
# Note that the ordering of arguments is important, since a helpful
|
219
219
|
# error message is generated when this one fails that tells you the
|
@@ -314,7 +314,7 @@ EOT
|
|
314
314
|
|
315
315
|
|
316
316
|
##
|
317
|
-
# Passes if
|
317
|
+
# Passes if `object`.instance_of?(`klass`). When `klass` is
|
318
318
|
# an array of classes, it passes if any class
|
319
319
|
# satisfies +object.instance_of?(class).
|
320
320
|
#
|
@@ -348,8 +348,8 @@ EOT
|
|
348
348
|
end
|
349
349
|
|
350
350
|
##
|
351
|
-
# Passes if
|
352
|
-
# When
|
351
|
+
# Passes if `object`.instance_of?(`klass`) does not hold.
|
352
|
+
# When `klass` is an array of classes, it passes if no class
|
353
353
|
# satisfies +object.instance_of?(class).
|
354
354
|
#
|
355
355
|
# @example
|
@@ -389,7 +389,7 @@ EOT
|
|
389
389
|
alias_method :refute_instance_of, :assert_not_instance_of
|
390
390
|
|
391
391
|
##
|
392
|
-
# Passes if
|
392
|
+
# Passes if `object` is nil.
|
393
393
|
#
|
394
394
|
# @example
|
395
395
|
# assert_nil [1, 2].uniq!
|
@@ -401,7 +401,7 @@ EOT
|
|
401
401
|
end
|
402
402
|
|
403
403
|
##
|
404
|
-
# Passes if
|
404
|
+
# Passes if `object`.kind_of?(`klass`). When `klass` is
|
405
405
|
# an array of classes or modules, it passes if any
|
406
406
|
# class or module satisfies +object.kind_of?(class_or_module).
|
407
407
|
#
|
@@ -437,8 +437,8 @@ EOT
|
|
437
437
|
end
|
438
438
|
|
439
439
|
##
|
440
|
-
# Passes if
|
441
|
-
# When
|
440
|
+
# Passes if `object`.kind_of?(`klass`) does not hold.
|
441
|
+
# When `klass` is an array of classes or modules, it passes only if all
|
442
442
|
# classes (and modules) do not satisfy +object.kind_of?(class_or_module).
|
443
443
|
#
|
444
444
|
# @example
|
@@ -478,7 +478,7 @@ EOT
|
|
478
478
|
alias_method :refute_kind_of, :assert_not_kind_of
|
479
479
|
|
480
480
|
##
|
481
|
-
# Passes if
|
481
|
+
# Passes if `object` .respond_to? `method`
|
482
482
|
#
|
483
483
|
# @example
|
484
484
|
# assert_respond_to 'bugbear', :slice
|
@@ -500,7 +500,7 @@ EOT
|
|
500
500
|
end
|
501
501
|
|
502
502
|
##
|
503
|
-
# Passes if
|
503
|
+
# Passes if `object` does not .respond_to? `method`.
|
504
504
|
#
|
505
505
|
# @example
|
506
506
|
# assert_not_respond_to('bugbear', :nonexistence) # -> pass
|
@@ -528,7 +528,7 @@ EOT
|
|
528
528
|
alias_method :refute_respond_to, :assert_not_respond_to
|
529
529
|
|
530
530
|
##
|
531
|
-
# Passes if
|
531
|
+
# Passes if `pattern` =~ `string`.
|
532
532
|
#
|
533
533
|
# @example
|
534
534
|
# assert_match(/\d+/, 'five, 6, seven')
|
@@ -548,7 +548,7 @@ EOT
|
|
548
548
|
end
|
549
549
|
|
550
550
|
##
|
551
|
-
# Passes if
|
551
|
+
# Passes if `actual` .equal? `expected` (i.e. they are the same
|
552
552
|
# instance).
|
553
553
|
#
|
554
554
|
# @example
|
@@ -565,7 +565,7 @@ EOT
|
|
565
565
|
end
|
566
566
|
|
567
567
|
##
|
568
|
-
# Compares the
|
568
|
+
# Compares the `object1` with `object2` using `operator`.
|
569
569
|
#
|
570
570
|
# Passes if object1.__send__(operator, object2) is true.
|
571
571
|
#
|
@@ -585,7 +585,7 @@ EOT
|
|
585
585
|
end
|
586
586
|
|
587
587
|
##
|
588
|
-
# Compares the
|
588
|
+
# Compares the `object1` with `object2` using `operator`.
|
589
589
|
#
|
590
590
|
# Passes if object1.__send__(operator, object2) is not true.
|
591
591
|
#
|
@@ -652,7 +652,7 @@ EOT
|
|
652
652
|
end
|
653
653
|
|
654
654
|
##
|
655
|
-
# Passes if !
|
655
|
+
# Passes if ! `actual` .equal? `expected`
|
656
656
|
#
|
657
657
|
# @example
|
658
658
|
# assert_not_same Object.new, Object.new
|
@@ -672,7 +672,7 @@ EOT
|
|
672
672
|
alias_method :refute_same, :assert_not_same
|
673
673
|
|
674
674
|
##
|
675
|
-
# Passes if
|
675
|
+
# Passes if `expected` != `actual`
|
676
676
|
#
|
677
677
|
# @example
|
678
678
|
# assert_not_equal 'some string', 5
|
@@ -689,7 +689,7 @@ EOT
|
|
689
689
|
alias_method :refute_equal, :assert_not_equal
|
690
690
|
|
691
691
|
##
|
692
|
-
# Passes if !
|
692
|
+
# Passes if ! `object` .nil?
|
693
693
|
#
|
694
694
|
# @example
|
695
695
|
# assert_not_nil '1 two 3'.sub!(/two/, '2')
|
@@ -706,7 +706,7 @@ EOT
|
|
706
706
|
alias_method :refute_nil, :assert_not_nil
|
707
707
|
|
708
708
|
##
|
709
|
-
# Passes if
|
709
|
+
# Passes if `regexp` !~ `string`
|
710
710
|
#
|
711
711
|
# @example
|
712
712
|
# assert_not_match(/two/, 'one 2 three') # -> pass
|
@@ -731,7 +731,7 @@ EOT
|
|
731
731
|
##
|
732
732
|
# Deprecated. Use #assert_not_match instead.
|
733
733
|
#
|
734
|
-
# Passes if
|
734
|
+
# Passes if `regexp` !~ `string`
|
735
735
|
#
|
736
736
|
# @example
|
737
737
|
# assert_no_match(/two/, 'one 2 three') # -> pass
|
@@ -789,7 +789,7 @@ EOT
|
|
789
789
|
end
|
790
790
|
|
791
791
|
##
|
792
|
-
# Passes if the block throws
|
792
|
+
# Passes if the block throws `expected_object`
|
793
793
|
#
|
794
794
|
# @example
|
795
795
|
# assert_throw(:done) do
|
@@ -860,8 +860,8 @@ EOT
|
|
860
860
|
end
|
861
861
|
|
862
862
|
##
|
863
|
-
# Passes if
|
864
|
-
# within
|
863
|
+
# Passes if `expected_float` and `actual_float` are equal
|
864
|
+
# within `delta` tolerance.
|
865
865
|
#
|
866
866
|
# @example
|
867
867
|
# assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
|
@@ -881,8 +881,8 @@ EOT
|
|
881
881
|
end
|
882
882
|
|
883
883
|
##
|
884
|
-
# Passes if
|
885
|
-
# not equal within
|
884
|
+
# Passes if `expected_float` and `actual_float` are
|
885
|
+
# not equal within `delta` tolerance.
|
886
886
|
#
|
887
887
|
# @example
|
888
888
|
# assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00002) # -> pass
|
@@ -981,8 +981,8 @@ EOT
|
|
981
981
|
|
982
982
|
public
|
983
983
|
##
|
984
|
-
# Passes if
|
985
|
-
# within
|
984
|
+
# Passes if `expected_float` and `actual_float` are equal
|
985
|
+
# within `epsilon` relative error of `expected_float`.
|
986
986
|
#
|
987
987
|
# @example
|
988
988
|
# assert_in_epsilon(10000.0, 9900.0, 0.1) # -> pass
|
@@ -1011,9 +1011,9 @@ EOT
|
|
1011
1011
|
end
|
1012
1012
|
|
1013
1013
|
##
|
1014
|
-
# Passes if
|
1015
|
-
# not equal within
|
1016
|
-
#
|
1014
|
+
# Passes if `expected_float` and `actual_float` are
|
1015
|
+
# not equal within `epsilon` relative error of
|
1016
|
+
# `expected_float`.
|
1017
1017
|
#
|
1018
1018
|
# @example
|
1019
1019
|
# assert_not_in_epsilon(10000.0, 9900.0, 0.1) # -> fail
|
@@ -1121,7 +1121,7 @@ EOT
|
|
1121
1121
|
##
|
1122
1122
|
# Passes if the method send returns a true value.
|
1123
1123
|
#
|
1124
|
-
#
|
1124
|
+
# `send_array` is composed of:
|
1125
1125
|
# * A receiver
|
1126
1126
|
# * A method
|
1127
1127
|
# * Arguments to the method
|
@@ -1161,7 +1161,7 @@ EOT
|
|
1161
1161
|
##
|
1162
1162
|
# Passes if the method send doesn't return a true value.
|
1163
1163
|
#
|
1164
|
-
#
|
1164
|
+
# `send_array` is composed of:
|
1165
1165
|
# * A receiver
|
1166
1166
|
# * A method
|
1167
1167
|
# * Arguments to the method
|
@@ -1199,7 +1199,7 @@ EOT
|
|
1199
1199
|
end
|
1200
1200
|
|
1201
1201
|
##
|
1202
|
-
# Passes if
|
1202
|
+
# Passes if `actual` is a boolean value.
|
1203
1203
|
#
|
1204
1204
|
# @example
|
1205
1205
|
# assert_boolean(true) # -> pass
|
@@ -1215,7 +1215,7 @@ EOT
|
|
1215
1215
|
end
|
1216
1216
|
|
1217
1217
|
##
|
1218
|
-
# Passes if
|
1218
|
+
# Passes if `actual` is true.
|
1219
1219
|
#
|
1220
1220
|
# @example
|
1221
1221
|
# assert_true(true) # -> pass
|
@@ -1231,7 +1231,7 @@ EOT
|
|
1231
1231
|
end
|
1232
1232
|
|
1233
1233
|
##
|
1234
|
-
# Passes if
|
1234
|
+
# Passes if `actual` is false.
|
1235
1235
|
#
|
1236
1236
|
# @example
|
1237
1237
|
# assert_false(false) # -> pass
|
@@ -1247,8 +1247,8 @@ EOT
|
|
1247
1247
|
end
|
1248
1248
|
|
1249
1249
|
##
|
1250
|
-
# Passes if expression "
|
1251
|
-
#
|
1250
|
+
# Passes if expression "`expected` `operator`
|
1251
|
+
# `actual`" is true.
|
1252
1252
|
#
|
1253
1253
|
# @example
|
1254
1254
|
# assert_compare(1, "<", 10) # -> pass
|
@@ -1303,7 +1303,7 @@ EOT
|
|
1303
1303
|
|
1304
1304
|
##
|
1305
1305
|
# Passes if an exception is raised in block and its
|
1306
|
-
# message is
|
1306
|
+
# message is `expected`.
|
1307
1307
|
#
|
1308
1308
|
# @example
|
1309
1309
|
# assert_raise_message("exception") {raise "exception"} # -> pass
|
@@ -1343,7 +1343,7 @@ EOT
|
|
1343
1343
|
end
|
1344
1344
|
|
1345
1345
|
##
|
1346
|
-
# Passes if
|
1346
|
+
# Passes if `object`.const_defined?(`constant_name`)
|
1347
1347
|
#
|
1348
1348
|
# @example
|
1349
1349
|
# assert_const_defined(Test, :Unit) # -> pass
|
@@ -1360,7 +1360,7 @@ EOT
|
|
1360
1360
|
end
|
1361
1361
|
|
1362
1362
|
##
|
1363
|
-
# Passes if
|
1363
|
+
# Passes if !`object`.const_defined?(`constant_name`)
|
1364
1364
|
#
|
1365
1365
|
# @example
|
1366
1366
|
# assert_not_const_defined(Object, :Nonexistent) # -> pass
|
@@ -1377,7 +1377,7 @@ EOT
|
|
1377
1377
|
end
|
1378
1378
|
|
1379
1379
|
##
|
1380
|
-
# Passes if
|
1380
|
+
# Passes if `object`.`predicate` is _true_.
|
1381
1381
|
#
|
1382
1382
|
# @example
|
1383
1383
|
# assert_predicate([], :empty?) # -> pass
|
@@ -1399,7 +1399,7 @@ EOT
|
|
1399
1399
|
end
|
1400
1400
|
|
1401
1401
|
##
|
1402
|
-
# Passes if
|
1402
|
+
# Passes if `object`.`predicate` is not _true_.
|
1403
1403
|
#
|
1404
1404
|
# @example
|
1405
1405
|
# assert_not_predicate([1], :empty?) # -> pass
|
@@ -1426,8 +1426,8 @@ EOT
|
|
1426
1426
|
alias_method :refute_predicate, :assert_not_predicate
|
1427
1427
|
|
1428
1428
|
##
|
1429
|
-
# Passes if
|
1430
|
-
#
|
1429
|
+
# Passes if `object`#`alias_name` is an alias method of
|
1430
|
+
# `object`#`original_name`.
|
1431
1431
|
#
|
1432
1432
|
# @example
|
1433
1433
|
# assert_alias_method([], :length, :size) # -> pass
|
@@ -1474,7 +1474,7 @@ EOT
|
|
1474
1474
|
end
|
1475
1475
|
|
1476
1476
|
##
|
1477
|
-
# Passes if
|
1477
|
+
# Passes if `path` exists.
|
1478
1478
|
#
|
1479
1479
|
# @example
|
1480
1480
|
# assert_path_exist("/tmp") # -> pass
|
@@ -1492,7 +1492,7 @@ EOT
|
|
1492
1492
|
end
|
1493
1493
|
|
1494
1494
|
##
|
1495
|
-
# Passes if
|
1495
|
+
# Passes if `path` doesn't exist.
|
1496
1496
|
#
|
1497
1497
|
# @example
|
1498
1498
|
# assert_path_not_exist("/nonexistent") # -> pass
|
@@ -1510,7 +1510,7 @@ EOT
|
|
1510
1510
|
end
|
1511
1511
|
|
1512
1512
|
##
|
1513
|
-
# Passes if
|
1513
|
+
# Passes if `collection` includes `object`.
|
1514
1514
|
#
|
1515
1515
|
# @example
|
1516
1516
|
# assert_include([1, 10], 1) # -> pass
|
@@ -1537,7 +1537,7 @@ EOT
|
|
1537
1537
|
alias_method :assert_includes, :assert_include
|
1538
1538
|
|
1539
1539
|
##
|
1540
|
-
# Passes if
|
1540
|
+
# Passes if `collection` doesn't include `object`.
|
1541
1541
|
#
|
1542
1542
|
# @example
|
1543
1543
|
# assert_not_include([1, 10], 5) # -> pass
|
@@ -1569,7 +1569,7 @@ EOT
|
|
1569
1569
|
alias_method :refute_includes, :assert_not_include
|
1570
1570
|
|
1571
1571
|
##
|
1572
|
-
# Passes if
|
1572
|
+
# Passes if `object` is empty.
|
1573
1573
|
#
|
1574
1574
|
# @example
|
1575
1575
|
# assert_empty("") # -> pass
|
@@ -1592,7 +1592,7 @@ EOT
|
|
1592
1592
|
end
|
1593
1593
|
|
1594
1594
|
##
|
1595
|
-
# Passes if
|
1595
|
+
# Passes if `object` is not empty.
|
1596
1596
|
#
|
1597
1597
|
# @example
|
1598
1598
|
# assert_not_empty(" ") # -> pass
|
@@ -1620,8 +1620,8 @@ EOT
|
|
1620
1620
|
alias_method :refute_empty, :assert_not_empty
|
1621
1621
|
|
1622
1622
|
##
|
1623
|
-
# Builds a failure message.
|
1624
|
-
#
|
1623
|
+
# Builds a failure message. `user_message` is added before the
|
1624
|
+
# `template` and `arguments` replaces the '?'s positionally in
|
1625
1625
|
# the template.
|
1626
1626
|
def build_message(user_message, template=nil, *arguments)
|
1627
1627
|
template &&= template.chomp
|
data/lib/test/unit/autorunner.rb
CHANGED
@@ -246,54 +246,61 @@ module Test
|
|
246
246
|
|
247
247
|
o.on("-n", "--name=NAME", String,
|
248
248
|
"Runs tests matching NAME.",
|
249
|
-
"Use '/PATTERN/' for NAME to use regular expression."
|
250
|
-
|
249
|
+
"Use '/PATTERN/' for NAME to use regular expression.",
|
250
|
+
"Regular expression accepts options.",
|
251
|
+
"Example: '/taRget/i' matches 'target' and 'TARGET'") do |name|
|
252
|
+
name = prepare_name(name)
|
251
253
|
@filters << lambda do |test|
|
252
|
-
|
253
|
-
return true if name === test.local_name
|
254
|
-
false
|
254
|
+
match_test_name(test, name)
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
258
258
|
o.on("--ignore-name=NAME", String,
|
259
259
|
"Ignores tests matching NAME.",
|
260
|
-
"Use '/PATTERN/' for NAME to use regular expression."
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
@filters << proc {|t| n != t.method_name}
|
260
|
+
"Use '/PATTERN/' for NAME to use regular expression.",
|
261
|
+
"Regular expression accepts options.",
|
262
|
+
"Example: '/taRget/i' matches 'target' and 'TARGET'") do |name|
|
263
|
+
name = prepare_name(name)
|
264
|
+
@filters << lambda do |test|
|
265
|
+
not match_test_name(test, name)
|
267
266
|
end
|
268
267
|
end
|
269
268
|
|
270
269
|
o.on("-t", "--testcase=TESTCASE", String,
|
271
270
|
"Runs tests in TestCases matching TESTCASE.",
|
272
|
-
"Use '/PATTERN/' for TESTCASE to use regular expression."
|
273
|
-
|
271
|
+
"Use '/PATTERN/' for TESTCASE to use regular expression.",
|
272
|
+
"Regular expression accepts options.",
|
273
|
+
"Example: '/taRget/i' matches 'target' and 'TARGET'") do |name|
|
274
|
+
name = prepare_name(name)
|
274
275
|
@filters << lambda do |test|
|
275
|
-
match_test_case_name(test,
|
276
|
+
match_test_case_name(test, name)
|
276
277
|
end
|
277
278
|
end
|
278
279
|
|
279
280
|
o.on("--ignore-testcase=TESTCASE", String,
|
280
281
|
"Ignores tests in TestCases matching TESTCASE.",
|
281
|
-
"Use '/PATTERN/' for TESTCASE to use regular expression."
|
282
|
-
|
282
|
+
"Use '/PATTERN/' for TESTCASE to use regular expression.",
|
283
|
+
"Regular expression accepts options.",
|
284
|
+
"Example: '/taRget/i' matches 'target' and 'TARGET'") do |name|
|
285
|
+
name = prepare_name(name)
|
283
286
|
@filters << lambda do |test|
|
284
|
-
not match_test_case_name(test,
|
287
|
+
not match_test_case_name(test, name)
|
285
288
|
end
|
286
289
|
end
|
287
290
|
|
288
291
|
o.on("--location=LOCATION", String,
|
289
292
|
"Runs tests that defined in LOCATION.",
|
290
|
-
"LOCATION is one of PATH:LINE, PATH or LINE") do |location|
|
291
|
-
|
293
|
+
"LOCATION is one of PATH:LINE, PATH or LINE.") do |location|
|
294
|
+
case location
|
295
|
+
when /\A(\d+)\z/
|
292
296
|
path = nil
|
293
|
-
line =
|
297
|
+
line = $1.to_i
|
298
|
+
when /:(\d+)\z/
|
299
|
+
path = $PREMATCH
|
300
|
+
line = $1.to_i
|
294
301
|
else
|
295
|
-
path
|
296
|
-
line =
|
302
|
+
path = location
|
303
|
+
line = nil
|
297
304
|
end
|
298
305
|
add_location_filter(path, line)
|
299
306
|
end
|
@@ -496,6 +503,31 @@ module Test
|
|
496
503
|
end
|
497
504
|
end
|
498
505
|
|
506
|
+
def prepare_name(name)
|
507
|
+
case name
|
508
|
+
when /\A\/(.*)\/([imx]*)\z/
|
509
|
+
pattern = $1
|
510
|
+
options_raw = $2
|
511
|
+
options = 0
|
512
|
+
options |= Regexp::IGNORECASE if options_raw.include?("i")
|
513
|
+
options |= Regexp::MULTILINE if options_raw.include?("m")
|
514
|
+
options |= Regexp::EXTENDED if options_raw.include?("x")
|
515
|
+
Regexp.new(pattern, options)
|
516
|
+
else
|
517
|
+
name
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
def match_test_name(test, pattern)
|
522
|
+
return true if pattern === test.method_name
|
523
|
+
return true if pattern === test.local_name
|
524
|
+
if pattern.is_a?(String)
|
525
|
+
return true if pattern === "#{test.class}##{test.method_name}"
|
526
|
+
return true if pattern === "#{test.class}##{test.local_name}"
|
527
|
+
end
|
528
|
+
false
|
529
|
+
end
|
530
|
+
|
499
531
|
def match_test_case_name(test, pattern)
|
500
532
|
test.class.ancestors.each do |test_class|
|
501
533
|
break if test_class == TestCase
|