test-unit 2.5.1 → 2.5.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +7 -2
- data/Rakefile +1 -1
- data/lib/test-unit.rb +19 -0
- data/lib/test/unit.rb +183 -12
- data/lib/test/unit/assertions.rb +9 -6
- data/lib/test/unit/autorunner.rb +17 -0
- data/lib/test/unit/collector.rb +33 -1
- data/lib/test/unit/collector/descendant.rb +1 -5
- data/lib/test/unit/collector/load.rb +1 -3
- data/lib/test/unit/color-scheme.rb +36 -30
- data/lib/test/unit/color.rb +19 -8
- data/lib/test/unit/error.rb +6 -3
- data/lib/test/unit/exceptionhandler.rb +48 -5
- data/lib/test/unit/failure.rb +39 -6
- data/lib/test/unit/fault-location-detector.rb +95 -0
- data/lib/test/unit/notification.rb +5 -2
- data/lib/test/unit/omission.rb +7 -3
- data/lib/test/unit/pending.rb +7 -3
- data/lib/test/unit/testcase.rb +132 -9
- data/lib/test/unit/testsuite.rb +1 -1
- data/lib/test/unit/ui/console/testrunner.rb +14 -6
- data/lib/test/unit/ui/testrunnermediator.rb +18 -6
- data/lib/test/unit/util/backtracefilter.rb +1 -1
- data/lib/test/unit/version.rb +1 -1
- data/test/test-color-scheme.rb +29 -22
- data/test/test-color.rb +1 -1
- data/test/test-fault-location-detector.rb +125 -0
- data/test/test-testcase.rb +156 -2
- data/test/testunit-test-util.rb +2 -2
- metadata +5 -2
data/README.textile
CHANGED
@@ -50,8 +50,13 @@ h2. License
|
|
50
50
|
|
51
51
|
This software is distributed under the same terms as ruby.
|
52
52
|
|
53
|
-
Exception:
|
54
|
-
|
53
|
+
Exception:
|
54
|
+
|
55
|
+
* lib/test/unit/diff.rb is a double license of the Ruby license and
|
56
|
+
PSF license.
|
57
|
+
|
58
|
+
* lib/test-unit.rb is a dual license of the Ruby license and LGPLv2.1
|
59
|
+
or later.
|
55
60
|
|
56
61
|
h2. Authors
|
57
62
|
|
data/Rakefile
CHANGED
@@ -248,7 +248,7 @@ task :publish => ["html:publish", "reference:publish"]
|
|
248
248
|
|
249
249
|
desc "Tag the current revision."
|
250
250
|
task :tag do
|
251
|
-
sh("git tag -a #{version} -m 'release #{version}!!!'")
|
251
|
+
sh("git tag -a #{spec.version} -m 'release #{spec.version}!!!'")
|
252
252
|
end
|
253
253
|
|
254
254
|
namespace :release do
|
data/lib/test-unit.rb
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
# Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# License: Ruby's or LGPLv2.1 or later
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
18
|
+
# 02110-1301 USA
|
19
|
+
|
1
20
|
module Test
|
2
21
|
module Unit
|
3
22
|
autoload :TestCase, "test/unit/testcase"
|
data/lib/test/unit.rb
CHANGED
@@ -308,19 +308,190 @@ module Test # :nodoc:
|
|
308
308
|
#
|
309
309
|
|
310
310
|
module Unit
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
311
|
+
class << self
|
312
|
+
# Set true when Test::Unit has run. If set to true Test::Unit
|
313
|
+
# will not automatically run at exit.
|
314
|
+
#
|
315
|
+
# @deprecated Use Test::Unit::AutoRunner.need_auto_run= instead.
|
316
|
+
def run=(have_run)
|
317
|
+
AutoRunner.need_auto_run = (not have_run)
|
318
|
+
end
|
319
|
+
|
320
|
+
# Already tests have run?
|
321
|
+
#
|
322
|
+
# @deprecated Use Test::Unit::AutoRunner.need_auto_run? instead.
|
323
|
+
def run?
|
324
|
+
not AutoRunner.need_auto_run?
|
325
|
+
end
|
326
|
+
|
327
|
+
# @api private
|
328
|
+
@@at_start_hooks = []
|
329
|
+
|
330
|
+
# Regsiter a hook that is run before running tests.
|
331
|
+
# To register multiple hooks, call this method multiple times.
|
332
|
+
#
|
333
|
+
# Here is an example test case:
|
334
|
+
# Test::Unit.at_start do
|
335
|
+
# # ...
|
336
|
+
# end
|
337
|
+
#
|
338
|
+
# class TestMyClass1 < Test::Unit::TestCase
|
339
|
+
# class << self
|
340
|
+
# def startup
|
341
|
+
# # ...
|
342
|
+
# end
|
343
|
+
# end
|
344
|
+
#
|
345
|
+
# def setup
|
346
|
+
# # ...
|
347
|
+
# end
|
348
|
+
#
|
349
|
+
# def test_my_class1
|
350
|
+
# # ...
|
351
|
+
# end
|
352
|
+
#
|
353
|
+
# def test_my_class2
|
354
|
+
# # ...
|
355
|
+
# end
|
356
|
+
# end
|
357
|
+
#
|
358
|
+
# class TestMyClass2 < Test::Unit::TestCase
|
359
|
+
# class << self
|
360
|
+
# def startup
|
361
|
+
# # ...
|
362
|
+
# end
|
363
|
+
# end
|
364
|
+
#
|
365
|
+
# def setup
|
366
|
+
# # ...
|
367
|
+
# end
|
368
|
+
#
|
369
|
+
# def test_my_class1
|
370
|
+
# # ...
|
371
|
+
# end
|
372
|
+
#
|
373
|
+
# def test_my_class2
|
374
|
+
# # ...
|
375
|
+
# end
|
376
|
+
# end
|
377
|
+
#
|
378
|
+
# Here is a call order:
|
379
|
+
# * at_start
|
380
|
+
# * TestMyClass1.startup
|
381
|
+
# * TestMyClass1#setup
|
382
|
+
# * TestMyClass1#test_my_class1
|
383
|
+
# * TestMyClass1#setup
|
384
|
+
# * TestMyClass1#test_my_class2
|
385
|
+
# * TestMyClass2#setup
|
386
|
+
# * TestMyClass2#test_my_class1
|
387
|
+
# * TestMyClass2#setup
|
388
|
+
# * TestMyClass2#test_my_class2
|
389
|
+
#
|
390
|
+
# @example
|
391
|
+
# Test::Unit.at_start do
|
392
|
+
# puts "Start!"
|
393
|
+
# end
|
394
|
+
#
|
395
|
+
# @yield A block that is run before running tests.
|
396
|
+
# @yieldreturn [void]
|
397
|
+
# @return [void]
|
398
|
+
#
|
399
|
+
# @since 2.5.2
|
400
|
+
def at_start(&hook)
|
401
|
+
@@at_start_hooks << hook
|
402
|
+
end
|
403
|
+
|
404
|
+
# @api private
|
405
|
+
def run_at_start_hooks
|
406
|
+
@@at_start_hooks.each do |hook|
|
407
|
+
hook.call
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
# @api private
|
412
|
+
@@at_exit_hooks = []
|
413
|
+
|
414
|
+
# Regsiter a hook that is run after running tests.
|
415
|
+
# To register multiple hooks, call this method multiple times.
|
416
|
+
#
|
417
|
+
# Here is an example test case:
|
418
|
+
# Test::Unit.at_exit do
|
419
|
+
# # ...
|
420
|
+
# end
|
421
|
+
#
|
422
|
+
# class TestMyClass1 < Test::Unit::TestCase
|
423
|
+
# class << self
|
424
|
+
# def shutdown
|
425
|
+
# # ...
|
426
|
+
# end
|
427
|
+
# end
|
428
|
+
#
|
429
|
+
# def teardown
|
430
|
+
# # ...
|
431
|
+
# end
|
432
|
+
#
|
433
|
+
# def test_my_class1
|
434
|
+
# # ...
|
435
|
+
# end
|
436
|
+
#
|
437
|
+
# def test_my_class2
|
438
|
+
# # ...
|
439
|
+
# end
|
440
|
+
# end
|
441
|
+
#
|
442
|
+
# class TestMyClass2 < Test::Unit::TestCase
|
443
|
+
# class << self
|
444
|
+
# def shutdown
|
445
|
+
# # ...
|
446
|
+
# end
|
447
|
+
# end
|
448
|
+
#
|
449
|
+
# def teardown
|
450
|
+
# # ...
|
451
|
+
# end
|
452
|
+
#
|
453
|
+
# def test_my_class1
|
454
|
+
# # ...
|
455
|
+
# end
|
456
|
+
#
|
457
|
+
# def test_my_class2
|
458
|
+
# # ...
|
459
|
+
# end
|
460
|
+
# end
|
461
|
+
#
|
462
|
+
# Here is a call order:
|
463
|
+
# * TestMyClass1#test_my_class1
|
464
|
+
# * TestMyClass1#teardown
|
465
|
+
# * TestMyClass1#test_my_class2
|
466
|
+
# * TestMyClass1#teardown
|
467
|
+
# * TestMyClass1.shutdown
|
468
|
+
# * TestMyClass2#test_my_class1
|
469
|
+
# * TestMyClass2#teardown
|
470
|
+
# * TestMyClass2#test_my_class2
|
471
|
+
# * TestMyClass2#teardown
|
472
|
+
# * TestMyClass2.shutdown
|
473
|
+
# * at_exit
|
474
|
+
#
|
475
|
+
# @example
|
476
|
+
# Test::Unit.at_exit do
|
477
|
+
# puts "Exit!"
|
478
|
+
# end
|
479
|
+
#
|
480
|
+
# @yield A block that is run after running tests.
|
481
|
+
# @yieldreturn [void]
|
482
|
+
# @return [void]
|
483
|
+
#
|
484
|
+
# @since 2.5.2
|
485
|
+
def at_exit(&hook)
|
486
|
+
@@at_exit_hooks << hook
|
487
|
+
end
|
318
488
|
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
489
|
+
# @api private
|
490
|
+
def run_at_exit_hooks
|
491
|
+
@@at_exit_hooks.each do |hook|
|
492
|
+
hook.call
|
493
|
+
end
|
494
|
+
end
|
324
495
|
end
|
325
496
|
end
|
326
497
|
end
|
data/lib/test/unit/assertions.rb
CHANGED
@@ -1379,11 +1379,14 @@ EOT
|
|
1379
1379
|
end
|
1380
1380
|
end
|
1381
1381
|
|
1382
|
-
|
1383
|
-
# Called whenever an assertion is made.
|
1384
|
-
# include Test::Unit::Assertions to record assertion
|
1385
|
-
|
1386
|
-
|
1382
|
+
public
|
1383
|
+
# Called whenever an assertion is made. Define this in classes
|
1384
|
+
# that include Test::Unit::Assertions to record assertion
|
1385
|
+
# counts.
|
1386
|
+
#
|
1387
|
+
# This is a public API for developers who extend test-unit.
|
1388
|
+
#
|
1389
|
+
# @return [void]
|
1387
1390
|
def add_assertion
|
1388
1391
|
end
|
1389
1392
|
|
@@ -1615,7 +1618,7 @@ EOT
|
|
1615
1618
|
|
1616
1619
|
class << self
|
1617
1620
|
def target?(object)
|
1618
|
-
object.is_a?(Hash) or object
|
1621
|
+
object.is_a?(Hash) or ENV.equal?(object)
|
1619
1622
|
end
|
1620
1623
|
end
|
1621
1624
|
|
data/lib/test/unit/autorunner.rb
CHANGED
@@ -259,6 +259,23 @@ module Test
|
|
259
259
|
end
|
260
260
|
end
|
261
261
|
|
262
|
+
o.on('--location=LOCATION', String,
|
263
|
+
"Runs tests that defined in LOCATION.",
|
264
|
+
"LOCATION is one of PATH:LINE, PATH or LINE") do |location|
|
265
|
+
if /\A\d+\z/ =~ location
|
266
|
+
path = nil
|
267
|
+
line = location.to_i
|
268
|
+
else
|
269
|
+
path, line, = location.split(/:(\d+)/, 2)
|
270
|
+
line = line.to_i unless line.nil?
|
271
|
+
end
|
272
|
+
@filters << lambda do |test|
|
273
|
+
test.class.test_defined?(:path => path,
|
274
|
+
:line => line,
|
275
|
+
:method_name => test.method_name)
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
262
279
|
priority_filter = Proc.new do |test|
|
263
280
|
if @filters == [priority_filter]
|
264
281
|
Priority::Checker.new(test).need_to_run?
|
data/lib/test/unit/collector.rb
CHANGED
@@ -15,11 +15,27 @@ module Test
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def add_suite(destination, suite)
|
18
|
-
to_delete = suite.tests.find_all
|
18
|
+
to_delete = suite.tests.find_all do |test|
|
19
|
+
test.is_a?(TestCase) and !include?(test)
|
20
|
+
end
|
19
21
|
to_delete.each {|t| suite.delete(t)}
|
20
22
|
destination << suite unless suite.empty?
|
21
23
|
end
|
22
24
|
|
25
|
+
def add_test_cases(suite, test_cases)
|
26
|
+
children_map = {}
|
27
|
+
test_cases.each do |descendant_test_case|
|
28
|
+
parent = descendant_test_case.ancestors[1]
|
29
|
+
children_map[parent] ||= []
|
30
|
+
children_map[parent] << descendant_test_case
|
31
|
+
end
|
32
|
+
|
33
|
+
root_test_cases = children_map.keys - test_cases
|
34
|
+
root_test_cases.each do |root_test_case|
|
35
|
+
add_test_case(suite, root_test_case, children_map)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
23
39
|
def include?(test)
|
24
40
|
return true if(@filters.empty?)
|
25
41
|
@filters.each do |filter|
|
@@ -33,6 +49,22 @@ module Test
|
|
33
49
|
[suite.priority, suite.name || suite.to_s]
|
34
50
|
end
|
35
51
|
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def add_test_case(suite, test_case, children_map)
|
55
|
+
children = children_map[test_case]
|
56
|
+
return if children.nil?
|
57
|
+
|
58
|
+
sub_suites = []
|
59
|
+
children.each do |child|
|
60
|
+
sub_suite = child.suite
|
61
|
+
add_test_case(sub_suite, child, children_map)
|
62
|
+
add_suite(sub_suites, sub_suite)
|
63
|
+
end
|
64
|
+
sort(sub_suites).each do |sub_suite|
|
65
|
+
suite << sub_suite
|
66
|
+
end
|
67
|
+
end
|
36
68
|
end
|
37
69
|
end
|
38
70
|
end
|
@@ -10,11 +10,7 @@ module Test
|
|
10
10
|
|
11
11
|
def collect(name=NAME)
|
12
12
|
suite = TestSuite.new(name)
|
13
|
-
|
14
|
-
TestCase::DESCENDANTS.each do |descendant_test_case|
|
15
|
-
add_suite(sub_suites, descendant_test_case.suite)
|
16
|
-
end
|
17
|
-
sort(sub_suites).each {|s| suite << s}
|
13
|
+
add_test_cases(suite, TestCase::DESCENDANTS)
|
18
14
|
suite
|
19
15
|
end
|
20
16
|
end
|
@@ -106,9 +106,7 @@ module Test
|
|
106
106
|
rescue LoadError
|
107
107
|
@require_failed_infos << {:path => expanded_path, :exception => $!}
|
108
108
|
end
|
109
|
-
find_test_cases(already_gathered)
|
110
|
-
add_suite(test_suites, test_case.suite)
|
111
|
-
end
|
109
|
+
add_test_cases(test_suites, find_test_cases(already_gathered))
|
112
110
|
end
|
113
111
|
end
|
114
112
|
|
@@ -17,56 +17,62 @@ module Test
|
|
17
17
|
@@default_for_8_colors = nil
|
18
18
|
def default_for_8_colors
|
19
19
|
@@default_for_8_colors ||=
|
20
|
-
new("pass" => Color.new("green", :
|
20
|
+
new("pass" => Color.new("green", :background => true) +
|
21
21
|
Color.new("white", :bold => true),
|
22
|
-
"failure" => Color.new("red", :
|
22
|
+
"failure" => Color.new("red", :background => true) +
|
23
23
|
Color.new("white", :bold => true),
|
24
|
-
"pending" => Color.new("magenta", :
|
25
|
-
|
26
|
-
"
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
"
|
35
|
-
|
36
|
-
"diff-inserted" => Color.new("red", :
|
24
|
+
"pending" => Color.new("magenta", :background => true) +
|
25
|
+
Color.new("white", :bold => true),
|
26
|
+
"omission" => Color.new("blue", :background => true) +
|
27
|
+
Color.new("white", :bold => true),
|
28
|
+
"notification" => Color.new("cyan", :background => true) +
|
29
|
+
Color.new("white", :bold => true),
|
30
|
+
"error" => Color.new("black", :background => true) +
|
31
|
+
Color.new("yellow", :bold => true),
|
32
|
+
"case" => Color.new("blue", :background => true) +
|
33
|
+
Color.new("white", :bold => true),
|
34
|
+
"suite" => Color.new("green", :background => true) +
|
35
|
+
Color.new("white", :bold => true),
|
36
|
+
"diff-inserted-tag" => Color.new("red", :background => true) +
|
37
|
+
Color.new("black", :bold => true),
|
38
|
+
"diff-deleted-tag" => Color.new("green", :background => true) +
|
39
|
+
Color.new("black", :bold => true),
|
40
|
+
"diff-difference-tag" => Color.new("cyan", :background => true) +
|
41
|
+
Color.new("white", :bold => true),
|
42
|
+
"diff-inserted" => Color.new("red", :background => true) +
|
37
43
|
Color.new("white", :bold => true),
|
38
|
-
"diff-deleted" => Color.new("green", :
|
44
|
+
"diff-deleted" => Color.new("green", :background => true) +
|
39
45
|
Color.new("white", :bold => true))
|
40
46
|
end
|
41
47
|
|
42
48
|
@@default_for_256_colors = nil
|
43
49
|
def default_for_256_colors
|
44
50
|
@@default_for_256_colors ||=
|
45
|
-
new("pass" => Color.new("030", :
|
51
|
+
new("pass" => Color.new("030", :background => true) +
|
46
52
|
Color.new("555", :bold => true),
|
47
|
-
"failure" => Color.new("300", :
|
53
|
+
"failure" => Color.new("300", :background => true) +
|
48
54
|
Color.new("555", :bold => true),
|
49
|
-
"pending" => Color.new("303", :
|
55
|
+
"pending" => Color.new("303", :background => true) +
|
50
56
|
Color.new("555", :bold => true),
|
51
|
-
"omission" => Color.new("001", :
|
57
|
+
"omission" => Color.new("001", :background => true) +
|
52
58
|
Color.new("555", :bold => true),
|
53
|
-
"notification" => Color.new("011", :
|
59
|
+
"notification" => Color.new("011", :background => true) +
|
54
60
|
Color.new("555", :bold => true),
|
55
|
-
"error" => Color.new("
|
56
|
-
Color.new("
|
57
|
-
"case" => Color.new("220", :
|
61
|
+
"error" => Color.new("000", :background => true) +
|
62
|
+
Color.new("550", :bold => true),
|
63
|
+
"case" => Color.new("220", :background => true) +
|
58
64
|
Color.new("555", :bold => true),
|
59
|
-
"suite" => Color.new("110", :
|
65
|
+
"suite" => Color.new("110", :background => true) +
|
60
66
|
Color.new("555", :bold => true),
|
61
|
-
"diff-inserted-tag" => Color.new("500", :
|
67
|
+
"diff-inserted-tag" => Color.new("500", :background => true) +
|
62
68
|
Color.new("000", :bold => true),
|
63
|
-
"diff-deleted-tag" => Color.new("050", :
|
69
|
+
"diff-deleted-tag" => Color.new("050", :background => true) +
|
64
70
|
Color.new("000", :bold => true),
|
65
|
-
"diff-difference-tag" => Color.new("005", :
|
71
|
+
"diff-difference-tag" => Color.new("005", :background => true) +
|
66
72
|
Color.new("555", :bold => true),
|
67
|
-
"diff-inserted" => Color.new("300", :
|
73
|
+
"diff-inserted" => Color.new("300", :background => true) +
|
68
74
|
Color.new("555", :bold => true),
|
69
|
-
"diff-deleted" => Color.new("030", :
|
75
|
+
"diff-deleted" => Color.new("030", :background => true) +
|
70
76
|
Color.new("555", :bold => true))
|
71
77
|
end
|
72
78
|
|