test-unit 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +30 -0
- data/Manifest.txt +20 -12
- data/README.txt +28 -12
- data/Rakefile +5 -0
- data/TODO +1 -0
- data/html/classic.html +15 -0
- data/html/index.html +25 -0
- data/html/index.html.ja +27 -0
- data/html/test-unit-classic.png +0 -0
- data/lib/test/unit.rb +62 -0
- data/lib/test/unit/assertions.rb +350 -66
- data/lib/test/unit/autorunner.rb +68 -13
- data/lib/test/unit/collector/load.rb +1 -1
- data/lib/test/unit/color-scheme.rb +85 -0
- data/lib/test/unit/color.rb +40 -5
- data/lib/test/unit/diff.rb +14 -0
- data/lib/test/unit/fixture.rb +2 -2
- data/lib/test/unit/runner/console.rb +8 -2
- data/lib/test/unit/testcase.rb +86 -2
- data/lib/test/unit/ui/console/testrunner.rb +51 -26
- data/lib/test/unit/version.rb +1 -1
- data/sample/test_user.rb +22 -0
- data/test/collector/{test_descendant.rb → test-descendant.rb} +0 -0
- data/test/collector/{test_load.rb → test-load.rb} +1 -1
- data/test/{test_attribute.rb → test-attribute.rb} +0 -0
- data/test/test-color-scheme.rb +55 -0
- data/test/{test_color.rb → test-color.rb} +10 -0
- data/test/{test_diff.rb → test-diff.rb} +0 -0
- data/test/{test_emacs_runner.rb → test-emacs-runner.rb} +0 -0
- data/test/test-fixture.rb +287 -0
- data/test/{test_notification.rb → test-notification.rb} +4 -4
- data/test/{test_omission.rb → test-omission.rb} +6 -6
- data/test/{test_pending.rb → test-pending.rb} +6 -6
- data/test/{test_priority.rb → test-priority.rb} +0 -0
- data/test/test_assertions.rb +366 -63
- data/test/test_testcase.rb +48 -0
- data/test/{testunit_test_util.rb → testunit-test-util.rb} +1 -1
- metadata +27 -29
- data/test/test_fixture.rb +0 -275
data/History.txt
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
=== 2.0.1 / 2008-11-09
|
2
|
+
|
3
|
+
* 19 major enhancements
|
4
|
+
|
5
|
+
* support ruby 1.9.1.
|
6
|
+
* add run_test method to be extensible.
|
7
|
+
* improve priority-mode auto off.
|
8
|
+
* improve startup/shutdown RDoc. [Daniel Berger]
|
9
|
+
* add assert_compare. [#20851] [Designing Patterns]
|
10
|
+
* add assert_fail_assertion. [#20851] [Designing Patterns]
|
11
|
+
* add assert_raise_message. [#20851] [Designing Patterns]
|
12
|
+
* support folded diff.
|
13
|
+
* add assert_raise_kind_of. [Daniel Berger]
|
14
|
+
* ingore inherited test for nested test case.
|
15
|
+
* add assert_const_defined.
|
16
|
+
* add assert_not_const_defined.
|
17
|
+
* support assert_raise with an exception object.
|
18
|
+
* support assert_raise with no arguments that asserts any
|
19
|
+
exception is raised. [#22602] [Daniel Berger]
|
20
|
+
* support folded dot progress.
|
21
|
+
* add --progress-row-max option.
|
22
|
+
* support color scheme customize.
|
23
|
+
* support configuration file. (YAML)
|
24
|
+
* recognize test-XXX.rb files as test files not only test_XXX.rb
|
25
|
+
|
26
|
+
* Thanks
|
27
|
+
|
28
|
+
* Daniel Berger
|
29
|
+
* Designing Patterns
|
30
|
+
|
1
31
|
=== 2.0.0 / 2008-06-18
|
2
32
|
|
3
33
|
* 15 major enhancements
|
data/Manifest.txt
CHANGED
@@ -2,7 +2,12 @@ History.txt
|
|
2
2
|
Manifest.txt
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
|
+
TODO
|
5
6
|
bin/testrb
|
7
|
+
html/classic.html
|
8
|
+
html/index.html
|
9
|
+
html/index.html.ja
|
10
|
+
html/test-unit-classic.png
|
6
11
|
lib/test/unit.rb
|
7
12
|
lib/test/unit/assertionfailederror.rb
|
8
13
|
lib/test/unit/assertions.rb
|
@@ -13,6 +18,7 @@ lib/test/unit/collector/descendant.rb
|
|
13
18
|
lib/test/unit/collector/dir.rb
|
14
19
|
lib/test/unit/collector/load.rb
|
15
20
|
lib/test/unit/collector/objectspace.rb
|
21
|
+
lib/test/unit/color-scheme.rb
|
16
22
|
lib/test/unit/color.rb
|
17
23
|
lib/test/unit/diff.rb
|
18
24
|
lib/test/unit/error.rb
|
@@ -42,28 +48,30 @@ sample/adder.rb
|
|
42
48
|
sample/subtracter.rb
|
43
49
|
sample/tc_adder.rb
|
44
50
|
sample/tc_subtracter.rb
|
51
|
+
sample/test_user.rb
|
45
52
|
sample/ts_examples.rb
|
46
|
-
test/collector/
|
53
|
+
test/collector/test-descendant.rb
|
54
|
+
test/collector/test-load.rb
|
47
55
|
test/collector/test_dir.rb
|
48
|
-
test/collector/test_load.rb
|
49
56
|
test/collector/test_objectspace.rb
|
50
57
|
test/run-test.rb
|
58
|
+
test/test-attribute.rb
|
59
|
+
test/test-color-scheme.rb
|
60
|
+
test/test-color.rb
|
61
|
+
test/test-diff.rb
|
62
|
+
test/test-emacs-runner.rb
|
63
|
+
test/test-fixture.rb
|
64
|
+
test/test-notification.rb
|
65
|
+
test/test-omission.rb
|
66
|
+
test/test-pending.rb
|
67
|
+
test/test-priority.rb
|
51
68
|
test/test_assertions.rb
|
52
|
-
test/test_attribute.rb
|
53
|
-
test/test_color.rb
|
54
|
-
test/test_diff.rb
|
55
|
-
test/test_emacs_runner.rb
|
56
69
|
test/test_error.rb
|
57
70
|
test/test_failure.rb
|
58
|
-
test/test_fixture.rb
|
59
|
-
test/test_notification.rb
|
60
|
-
test/test_omission.rb
|
61
|
-
test/test_pending.rb
|
62
|
-
test/test_priority.rb
|
63
71
|
test/test_testcase.rb
|
64
72
|
test/test_testresult.rb
|
65
73
|
test/test_testsuite.rb
|
66
|
-
test/
|
74
|
+
test/testunit-test-util.rb
|
67
75
|
test/ui/test_testrunmediator.rb
|
68
76
|
test/util/test_backtracefilter.rb
|
69
77
|
test/util/test_observable.rb
|
data/README.txt
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
= Test::Unit
|
1
|
+
= Test::Unit 2.x
|
2
2
|
|
3
3
|
* http://rubyforge.org/projects/test-unit/
|
4
4
|
|
5
|
-
== DESCRIPTION
|
5
|
+
== DESCRIPTION
|
6
6
|
|
7
|
-
Test::Unit
|
8
|
-
|
7
|
+
Test::Unit 2.x - Improved version of Test::Unit bundled in
|
8
|
+
Ruby 1.8.x.
|
9
9
|
|
10
|
-
|
10
|
+
Ruby 1.9.x bundles miniunit not Test::Unit. Test::Unit
|
11
|
+
bundled in Ruby 1.8.x had not been improved but unbundled
|
12
|
+
Test::Unit (Test::Unit 2.x) will be improved actively.
|
13
|
+
|
14
|
+
== FEATURES
|
11
15
|
|
12
16
|
* Test::Unit 1.2.3 is the original Test::Unit, taken
|
13
17
|
straight from the ruby distribution. It is being
|
@@ -15,18 +19,30 @@ externalized from the ruby project as a gem (for tool developers).
|
|
15
19
|
stand-alone package. (The test framework in ruby is going
|
16
20
|
to radically change very soon).
|
17
21
|
|
18
|
-
*
|
19
|
-
|
22
|
+
* Test::Unit 2.x will be improved actively and may break
|
23
|
+
compatiblity with Test::Unit 1.2.3. (We will not hope it
|
24
|
+
if it isn't needed.)
|
25
|
+
|
26
|
+
* Some features exist as separated gems like GUI test
|
27
|
+
runner. (Tk, GTK+ and Fox) test-unit-full gem package
|
28
|
+
provides for installing all Test::Unit related gems
|
29
|
+
easily.
|
30
|
+
|
31
|
+
== INSTALL
|
20
32
|
|
21
|
-
|
22
|
-
original Test::Unit (== Tset::Unit 1.2.3).
|
33
|
+
% sudo gem install test-unit
|
23
34
|
|
24
|
-
|
35
|
+
If you want to use full Test::Unit features:
|
25
36
|
|
26
|
-
|
37
|
+
% sudo gem install test-unit-full
|
27
38
|
|
28
|
-
== LICENSE
|
39
|
+
== LICENSE
|
29
40
|
|
30
41
|
(The Ruby License)
|
31
42
|
|
32
43
|
This software is distributed under the same terms as ruby.
|
44
|
+
|
45
|
+
== Thanks
|
46
|
+
|
47
|
+
* Daniel Berger: suggestions.
|
48
|
+
* Designing Patterns: Suggestions.
|
data/Rakefile
CHANGED
@@ -15,12 +15,17 @@ Hoe.new('test-unit', version) do |p|
|
|
15
15
|
end
|
16
16
|
|
17
17
|
task :check_manifest => :clean_test_result
|
18
|
+
task :check_manifest => :clean_coverage
|
18
19
|
|
19
20
|
task :clean_test_result do
|
20
21
|
test_results = Dir.glob("**/.test-result")
|
21
22
|
sh("rm", "-rf", *test_results) unless test_results.empty?
|
22
23
|
end
|
23
24
|
|
25
|
+
task :clean_coverage do
|
26
|
+
sh("rm", "-rf", "coverage")
|
27
|
+
end
|
28
|
+
|
24
29
|
task :tag do
|
25
30
|
message = "Released Test::Unit #{version}!"
|
26
31
|
base = "svn+ssh://#{ENV['USER']}@rubyforge.org/var/svn/test-unit/"
|
data/html/classic.html
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Test::Unit (Classic)</title>
|
5
|
+
</head>
|
6
|
+
<body bgcolor="red">
|
7
|
+
<p style="text-align: center">
|
8
|
+
<img height="161" width="308" src="test-unit-classic.png">
|
9
|
+
<br>
|
10
|
+
<br>
|
11
|
+
<br>
|
12
|
+
Read the <a href="classic/test-unit/">rdoc</a>
|
13
|
+
</p>
|
14
|
+
</body>
|
15
|
+
</html>
|
data/html/index.html
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
6
|
+
<head>
|
7
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
8
|
+
<title>Test::Unit - a Unit Testing Framework for Ruby</title>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<h1>Test::Unit - a Unit Testing Framework for Ruby</h1>
|
12
|
+
<p>[<a href="index.html.ja">Japanese</a>]</p>
|
13
|
+
<ul>
|
14
|
+
<li><a href="http://rubyforge.org/projects/test-unit/">Project Page</a></li>
|
15
|
+
<li>
|
16
|
+
<a href="test-unit/">RDoc</a>
|
17
|
+
<!--(<a href="ja/test-unit/">ja</a>)-->
|
18
|
+
</li>
|
19
|
+
<li>
|
20
|
+
<a href="classic.html">Classic</a>
|
21
|
+
<!--(<a href="ja/classic.html">ja</a>)-->
|
22
|
+
</li>
|
23
|
+
</ul>
|
24
|
+
</body>
|
25
|
+
</html>
|
data/html/index.html.ja
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
|
6
|
+
<head>
|
7
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
8
|
+
<title>Test::Unit - Ruby用単体テストフレームワーク</title>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<h1>Test::Unit - Ruby用単体テストフレームワーク</h1>
|
12
|
+
<p>[<a href="./">English</a>]</p>
|
13
|
+
<ul>
|
14
|
+
<li>
|
15
|
+
<a href="http://rubyforge.org/projects/test-unit/">プロジェクトページ</a>
|
16
|
+
</li>
|
17
|
+
<li>
|
18
|
+
<!--<a href="ja/test-unit/">RDoc</a>-->
|
19
|
+
RDoc(<a href="test-unit/">en</a>)
|
20
|
+
</li>
|
21
|
+
<li>
|
22
|
+
<!--<a href="classic.html.html">Classic</a>-->
|
23
|
+
Classic(<a href="classic.html">en</a>)
|
24
|
+
</li>
|
25
|
+
</ul>
|
26
|
+
</body>
|
27
|
+
</html>
|
Binary file
|
data/lib/test/unit.rb
CHANGED
@@ -253,6 +253,68 @@ module Test # :nodoc:
|
|
253
253
|
# the dynamic suite using the console TestRunner.
|
254
254
|
#
|
255
255
|
#
|
256
|
+
# == Configuration file
|
257
|
+
#
|
258
|
+
# Test::Unit reads 'test-unit.yml' in the current working
|
259
|
+
# directory as Test::Unit's configuration file. It can
|
260
|
+
# contain the following configurations:
|
261
|
+
#
|
262
|
+
# * color scheme definitions
|
263
|
+
# * test runner to be used
|
264
|
+
# * test runner options
|
265
|
+
# * test collector to be used
|
266
|
+
#
|
267
|
+
# Except color scheme definitions, all of them are
|
268
|
+
# specified by command line option.
|
269
|
+
#
|
270
|
+
# Here are sample color scheme definitions:
|
271
|
+
#
|
272
|
+
# color_schemes:
|
273
|
+
# inverted:
|
274
|
+
# success:
|
275
|
+
# name: red
|
276
|
+
# bold: true
|
277
|
+
# failure:
|
278
|
+
# name: green
|
279
|
+
# bold: true
|
280
|
+
# other_scheme:
|
281
|
+
# ...
|
282
|
+
#
|
283
|
+
# Here are the syntax of color scheme definitions:
|
284
|
+
#
|
285
|
+
# color_schemes:
|
286
|
+
# SCHEME_NAME:
|
287
|
+
# EVENT_NAME:
|
288
|
+
# name: COLOR_NAME
|
289
|
+
# intensity: BOOLEAN
|
290
|
+
# bold: BOOLEAN
|
291
|
+
# italic: BOOLEAN
|
292
|
+
# underline: BOOLEAN
|
293
|
+
# ...
|
294
|
+
# ...
|
295
|
+
#
|
296
|
+
# SCHEME_NAME:: the name of the color scheme
|
297
|
+
# EVENT_NAME:: one of [success, failure, pending,
|
298
|
+
# omission, notification, error]
|
299
|
+
# COLOR_NAME:: one of [black, red, green, yellow, blue,
|
300
|
+
# magenta, cyan, white]
|
301
|
+
# BOOLEAN:: true or false
|
302
|
+
#
|
303
|
+
# You can use the above 'inverted' color scheme with the
|
304
|
+
# following configuration:
|
305
|
+
#
|
306
|
+
# runner: console
|
307
|
+
# console_options:
|
308
|
+
# color_scheme: inverted
|
309
|
+
# color_schemes:
|
310
|
+
# inverted:
|
311
|
+
# success:
|
312
|
+
# name: red
|
313
|
+
# bold: true
|
314
|
+
# failure:
|
315
|
+
# name: green
|
316
|
+
# bold: true
|
317
|
+
#
|
256
318
|
# == Questions?
|
257
319
|
#
|
258
320
|
# I'd really like to get feedback from all levels of Ruby
|
data/lib/test/unit/assertions.rb
CHANGED
@@ -77,21 +77,7 @@ module Test
|
|
77
77
|
|
78
78
|
public
|
79
79
|
def assert_equal(expected, actual, message=nil)
|
80
|
-
diff = AssertionMessage.
|
81
|
-
if !expected.is_a?(String) or !actual.is_a?(String)
|
82
|
-
expected = AssertionMessage.convert(expected)
|
83
|
-
actual = AssertionMessage.convert(actual)
|
84
|
-
end
|
85
|
-
diff = Diff.readable(expected, actual)
|
86
|
-
if /^[-+]/ !~ diff
|
87
|
-
diff = ""
|
88
|
-
elsif /^[ ?]/ =~ diff or /(?:.*\n){2,}/ =~ diff
|
89
|
-
diff = "\n\ndiff:\n#{diff}"
|
90
|
-
else
|
91
|
-
diff = ""
|
92
|
-
end
|
93
|
-
diff
|
94
|
-
end
|
80
|
+
diff = AssertionMessage.delayed_diff(expected, actual)
|
95
81
|
full_message = build_message(message, <<EOT, expected, actual, diff)
|
96
82
|
<?> expected but was
|
97
83
|
<?>.?
|
@@ -99,53 +85,36 @@ EOT
|
|
99
85
|
assert_block(full_message) { expected == actual }
|
100
86
|
end
|
101
87
|
|
102
|
-
private
|
103
|
-
def _check_exception_class(args) # :nodoc:
|
104
|
-
args.partition do |klass|
|
105
|
-
next if klass.instance_of?(Module)
|
106
|
-
assert(Exception >= klass, "Should expect a class of exception, #{klass}")
|
107
|
-
true
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
private
|
112
|
-
def _expected_exception?(actual_exception, exceptions, modules) # :nodoc:
|
113
|
-
exceptions.include?(actual_exception.class) or
|
114
|
-
modules.any? {|mod| actual_exception.is_a?(mod)}
|
115
|
-
end
|
116
|
-
|
117
88
|
##
|
118
|
-
# Passes if the block raises one of the
|
89
|
+
# Passes if the block raises one of the expected
|
90
|
+
# exceptions. When an expected exception is an Exception
|
91
|
+
# object, passes if expected_exception == actual_exception.
|
119
92
|
#
|
120
93
|
# Example:
|
121
|
-
# assert_raise
|
94
|
+
# assert_raise(RuntimeError, LoadError) do
|
122
95
|
# raise 'Boom!!!'
|
123
|
-
# end
|
124
|
-
|
96
|
+
# end # -> pass
|
97
|
+
#
|
98
|
+
# assert_raise do
|
99
|
+
# raise Exception, 'Any exception should be raised!!!'
|
100
|
+
# end # -> pass
|
101
|
+
#
|
102
|
+
# assert_raise(RuntimeError.new("XXX")) {raise "XXX"} # -> pass
|
103
|
+
# assert_raise(MyError.new("XXX")) {raise "XXX"} # -> fail
|
104
|
+
# assert_raise(RuntimeError.new("ZZZ")) {raise "XXX"} # -> fail
|
125
105
|
public
|
126
|
-
def assert_raise(*args)
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
exceptions, modules = _check_exception_class(args)
|
134
|
-
expected = args.size == 1 ? args.first : args
|
135
|
-
actual_exception = nil
|
136
|
-
full_message = build_message(message, "<?> exception expected but none was thrown.", expected)
|
106
|
+
def assert_raise(*args, &block)
|
107
|
+
assert_expected_exception = Proc.new do |*_args|
|
108
|
+
message, assert_exception_helper, actual_exception = _args
|
109
|
+
expected = assert_exception_helper.expected_exceptions
|
110
|
+
full_message = build_message(message,
|
111
|
+
"<?> exception expected but was\n?",
|
112
|
+
expected, actual_exception)
|
137
113
|
assert_block(full_message) do
|
138
|
-
|
139
|
-
yield
|
140
|
-
rescue Exception => actual_exception
|
141
|
-
break
|
142
|
-
end
|
143
|
-
false
|
114
|
+
expected == [] or assert_exception_helper.expected?(actual_exception)
|
144
115
|
end
|
145
|
-
full_message = build_message(message, "<?> exception expected but was\n?", expected, actual_exception)
|
146
|
-
assert_block(full_message) {_expected_exception?(actual_exception, exceptions, modules)}
|
147
|
-
actual_exception
|
148
116
|
end
|
117
|
+
_assert_raise(assert_expected_exception, *args, &block)
|
149
118
|
end
|
150
119
|
|
151
120
|
##
|
@@ -158,6 +127,30 @@ EOT
|
|
158
127
|
assert_raise(*args, &block)
|
159
128
|
end
|
160
129
|
|
130
|
+
##
|
131
|
+
# Passes if the block raises one of the given
|
132
|
+
# exceptions or sub exceptions of the given exceptions.
|
133
|
+
#
|
134
|
+
# Example:
|
135
|
+
# assert_raise_kind_of(SystemCallError) do
|
136
|
+
# raise Errno::EACCES
|
137
|
+
# end
|
138
|
+
def assert_raise_kind_of(*args, &block)
|
139
|
+
assert_expected_exception = Proc.new do |*_args|
|
140
|
+
message, assert_exception_helper, actual_exception = _args
|
141
|
+
expected = assert_exception_helper.expected_exceptions
|
142
|
+
full_message = build_message(message,
|
143
|
+
"<?> family exception expected " +
|
144
|
+
"but was\n?",
|
145
|
+
expected, actual_exception)
|
146
|
+
assert_block(full_message) do
|
147
|
+
assert_exception_helper.expected?(actual_exception, :kind_of?)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
_assert_raise(assert_expected_exception, *args, &block)
|
151
|
+
end
|
152
|
+
|
153
|
+
|
161
154
|
##
|
162
155
|
# Passes if +object+ .instance_of? +klass+
|
163
156
|
#
|
@@ -301,18 +294,20 @@ EOT
|
|
301
294
|
public
|
302
295
|
def assert_nothing_raised(*args)
|
303
296
|
_wrap_assertion do
|
304
|
-
if
|
305
|
-
message = ""
|
306
|
-
else
|
297
|
+
if args.last.is_a?(String)
|
307
298
|
message = args.pop
|
299
|
+
else
|
300
|
+
message = ""
|
308
301
|
end
|
309
|
-
|
302
|
+
|
303
|
+
assert_exception_helper = AssertExceptionHelper.new(self, args)
|
310
304
|
begin
|
311
305
|
yield
|
312
306
|
rescue Exception => e
|
313
307
|
if ((args.empty? && !e.instance_of?(AssertionFailedError)) ||
|
314
|
-
|
315
|
-
|
308
|
+
assert_exception_helper.expected?(e))
|
309
|
+
failure_message = build_message(message, "Exception raised:\n?", e)
|
310
|
+
assert_block(failure_message) {false}
|
316
311
|
else
|
317
312
|
raise
|
318
313
|
end
|
@@ -398,12 +393,12 @@ EOT
|
|
398
393
|
# Passes if the block throws +expected_object+
|
399
394
|
#
|
400
395
|
# Example:
|
401
|
-
#
|
402
|
-
# throw
|
396
|
+
# assert_throw(:done) do
|
397
|
+
# throw(:done)
|
403
398
|
# end
|
404
399
|
|
405
400
|
public
|
406
|
-
def
|
401
|
+
def assert_throw(expected_object, message="", &proc)
|
407
402
|
_wrap_assertion do
|
408
403
|
begin
|
409
404
|
catch([]) {}
|
@@ -411,7 +406,7 @@ EOT
|
|
411
406
|
assert_instance_of(Symbol, expected_object,
|
412
407
|
"assert_throws expects the symbol that should be thrown for its first argument")
|
413
408
|
end
|
414
|
-
assert_block("Should have passed a block to
|
409
|
+
assert_block("Should have passed a block to assert_throw.") do
|
415
410
|
block_given?
|
416
411
|
end
|
417
412
|
caught = true
|
@@ -437,6 +432,14 @@ EOT
|
|
437
432
|
end
|
438
433
|
end
|
439
434
|
|
435
|
+
##
|
436
|
+
# Alias of assert_throw.
|
437
|
+
#
|
438
|
+
# Will be deprecated in 1.9, and removed in 2.0.
|
439
|
+
def assert_throws(*args, &block)
|
440
|
+
assert_throw(*args, &block)
|
441
|
+
end
|
442
|
+
|
440
443
|
##
|
441
444
|
# Passes if block does not throw anything.
|
442
445
|
#
|
@@ -559,6 +562,136 @@ EOT
|
|
559
562
|
end
|
560
563
|
end
|
561
564
|
|
565
|
+
##
|
566
|
+
# Passes if expression "+expected+ +operator+
|
567
|
+
# +actual+" is true.
|
568
|
+
#
|
569
|
+
# Example:
|
570
|
+
# assert_compare(1, "<", 10) # -> pass
|
571
|
+
# assert_compare(1, ">=", 10) # -> fail
|
572
|
+
def assert_compare(expected, operator, actual, message=nil)
|
573
|
+
_wrap_assertion do
|
574
|
+
assert_send([["<", "<=", ">", ">="], :include?, operator.to_s])
|
575
|
+
case operator.to_s
|
576
|
+
when "<"
|
577
|
+
operator_description = "less than"
|
578
|
+
when "<="
|
579
|
+
operator_description = "less than or equal to"
|
580
|
+
when ">"
|
581
|
+
operator_description = "greater than"
|
582
|
+
when ">="
|
583
|
+
operator_description = "greater than or equal to"
|
584
|
+
end
|
585
|
+
template = <<-EOT
|
586
|
+
<?> #{operator} <?> should be true
|
587
|
+
<?> expected #{operator_description}
|
588
|
+
<?>.
|
589
|
+
EOT
|
590
|
+
full_message = build_message(message, template,
|
591
|
+
expected, actual,
|
592
|
+
expected, actual)
|
593
|
+
assert_block(full_message) do
|
594
|
+
expected.send(operator, actual)
|
595
|
+
end
|
596
|
+
end
|
597
|
+
end
|
598
|
+
|
599
|
+
##
|
600
|
+
# Passes if assertion is failed in block.
|
601
|
+
#
|
602
|
+
# Example:
|
603
|
+
# assert_fail_assertion {assert_equal("A", "B")} # -> pass
|
604
|
+
# assert_fail_assertion {assert_equal("A", "A")} # -> fail
|
605
|
+
def assert_fail_assertion(message=nil)
|
606
|
+
_wrap_assertion do
|
607
|
+
full_message = build_message(message,
|
608
|
+
"Failed assertion was expected.")
|
609
|
+
assert_block(full_message) do
|
610
|
+
begin
|
611
|
+
yield
|
612
|
+
false
|
613
|
+
rescue AssertionFailedError
|
614
|
+
true
|
615
|
+
end
|
616
|
+
end
|
617
|
+
end
|
618
|
+
end
|
619
|
+
|
620
|
+
##
|
621
|
+
# Passes if an exception is raised in block and its
|
622
|
+
# message is +expected+.
|
623
|
+
#
|
624
|
+
# Example:
|
625
|
+
# assert_raise_message("exception") {raise "exception"} # -> pass
|
626
|
+
# assert_raise_message(/exc/i) {raise "exception"} # -> pass
|
627
|
+
# assert_raise_message("exception") {raise "EXCEPTION"} # -> fail
|
628
|
+
# assert_raise_message("exception") {} # -> fail
|
629
|
+
def assert_raise_message(expected, message=nil)
|
630
|
+
_wrap_assertion do
|
631
|
+
full_message = build_message(message,
|
632
|
+
"<?> exception message expected " +
|
633
|
+
"but none was thrown.",
|
634
|
+
expected)
|
635
|
+
exception = nil
|
636
|
+
assert_block(full_message) do
|
637
|
+
begin
|
638
|
+
yield
|
639
|
+
false
|
640
|
+
rescue Exception => exception
|
641
|
+
true
|
642
|
+
end
|
643
|
+
end
|
644
|
+
|
645
|
+
actual = exception.message
|
646
|
+
diff = AssertionMessage.delayed_diff(expected, actual)
|
647
|
+
full_message =
|
648
|
+
build_message(message,
|
649
|
+
"<?> exception message expected but was\n" +
|
650
|
+
"<?>.?", expected, actual, diff)
|
651
|
+
assert_block(full_message) do
|
652
|
+
if expected.is_a?(Regexp)
|
653
|
+
expected =~ actual
|
654
|
+
else
|
655
|
+
expected == actual
|
656
|
+
end
|
657
|
+
end
|
658
|
+
end
|
659
|
+
end
|
660
|
+
|
661
|
+
##
|
662
|
+
# Passes if +object+.const_defined?(+constant_name+)
|
663
|
+
#
|
664
|
+
# Example:
|
665
|
+
# assert_const_defined(Test, :Unit) # -> pass
|
666
|
+
# assert_const_defined(Object, :Nonexistent) # -> fail
|
667
|
+
def assert_const_defined(object, constant_name, message=nil)
|
668
|
+
_wrap_assertion do
|
669
|
+
full_message = build_message(message,
|
670
|
+
"<?>.const_defined\\?(<?>) expected.",
|
671
|
+
object, constant_name)
|
672
|
+
assert_block(full_message) do
|
673
|
+
object.const_defined?(constant_name)
|
674
|
+
end
|
675
|
+
end
|
676
|
+
end
|
677
|
+
|
678
|
+
##
|
679
|
+
# Passes if !+object+.const_defined?(+constant_name+)
|
680
|
+
#
|
681
|
+
# Example:
|
682
|
+
# assert_not_const_defined(Object, :Nonexistent) # -> pass
|
683
|
+
# assert_not_const_defined(Test, :Unit) # -> fail
|
684
|
+
def assert_not_const_defined(object, constant_name, message=nil)
|
685
|
+
_wrap_assertion do
|
686
|
+
full_message = build_message(message,
|
687
|
+
"!<?>.const_defined\\?(<?>) expected.",
|
688
|
+
object, constant_name)
|
689
|
+
assert_block(full_message) do
|
690
|
+
!object.const_defined?(constant_name)
|
691
|
+
end
|
692
|
+
end
|
693
|
+
end
|
694
|
+
|
562
695
|
##
|
563
696
|
# Builds a failure message. +head+ is added before the +template+ and
|
564
697
|
# +arguments+ replaces the '?'s positionally in the template.
|
@@ -601,8 +734,37 @@ EOT
|
|
601
734
|
def self.use_pp=(value)
|
602
735
|
AssertionMessage.use_pp = value
|
603
736
|
end
|
604
|
-
|
737
|
+
|
605
738
|
# :stopdoc:
|
739
|
+
private
|
740
|
+
def _assert_raise(assert_expected_exception, *args, &block)
|
741
|
+
_wrap_assertion do
|
742
|
+
if args.last.is_a?(String)
|
743
|
+
message = args.pop
|
744
|
+
else
|
745
|
+
message = ""
|
746
|
+
end
|
747
|
+
|
748
|
+
assert_exception_helper = AssertExceptionHelper.new(self, args)
|
749
|
+
expected = assert_exception_helper.expected_exceptions
|
750
|
+
actual_exception = nil
|
751
|
+
full_message = build_message(message,
|
752
|
+
"<?> exception expected " +
|
753
|
+
"but none was thrown.",
|
754
|
+
expected)
|
755
|
+
assert_block(full_message) do
|
756
|
+
begin
|
757
|
+
yield
|
758
|
+
false
|
759
|
+
rescue Exception => actual_exception
|
760
|
+
true
|
761
|
+
end
|
762
|
+
end
|
763
|
+
assert_expected_exception.call(message, assert_exception_helper,
|
764
|
+
actual_exception)
|
765
|
+
actual_exception
|
766
|
+
end
|
767
|
+
end
|
606
768
|
|
607
769
|
class AssertionMessage
|
608
770
|
@use_pp = true
|
@@ -617,6 +779,31 @@ EOT
|
|
617
779
|
DelayedLiteral.new(block)
|
618
780
|
end
|
619
781
|
|
782
|
+
def delayed_diff(from, to)
|
783
|
+
delayed_literal do
|
784
|
+
if !from.is_a?(String) or !to.is_a?(String)
|
785
|
+
from = convert(from)
|
786
|
+
to = convert(to)
|
787
|
+
end
|
788
|
+
|
789
|
+
diff = Diff.readable(from, to)
|
790
|
+
if /^[-+]/ !~ diff
|
791
|
+
diff = ""
|
792
|
+
elsif /^[ ?]/ =~ diff or /(?:.*\n){2,}/ =~ diff
|
793
|
+
diff = "\n\ndiff:\n#{diff}"
|
794
|
+
else
|
795
|
+
diff = ""
|
796
|
+
end
|
797
|
+
|
798
|
+
if Diff.need_fold?(diff)
|
799
|
+
folded_diff = Diff.folded_readable(from, to)
|
800
|
+
diff << "\n\nfolded diff:\n#{folded_diff}"
|
801
|
+
end
|
802
|
+
|
803
|
+
diff
|
804
|
+
end
|
805
|
+
end
|
806
|
+
|
620
807
|
def convert(object)
|
621
808
|
case object
|
622
809
|
when Exception
|
@@ -715,8 +902,105 @@ EOM
|
|
715
902
|
end
|
716
903
|
end
|
717
904
|
|
718
|
-
|
905
|
+
class AssertExceptionHelper
|
906
|
+
class WrappedException
|
907
|
+
def initialize(exception)
|
908
|
+
@exception = exception
|
909
|
+
end
|
910
|
+
|
911
|
+
def inspect
|
912
|
+
inspect_method = @exception.method(:inspect)
|
913
|
+
if inspect_method.respond_to?(:owner) and
|
914
|
+
inspect_method.owner == Exception
|
915
|
+
"#{@exception.class.inspect}(#{@exception.message.inspect})"
|
916
|
+
else
|
917
|
+
@exception.inspect
|
918
|
+
end
|
919
|
+
end
|
920
|
+
|
921
|
+
def method_missing(name, *args, &block)
|
922
|
+
@exception.send(name, *args, &block)
|
923
|
+
end
|
924
|
+
end
|
925
|
+
|
926
|
+
def initialize(test_case, expected_exceptions)
|
927
|
+
@test_case = test_case
|
928
|
+
@expected_exceptions = expected_exceptions
|
929
|
+
@expected_classes, @expected_modules, @expected_objects =
|
930
|
+
split_expected_exceptions(expected_exceptions)
|
931
|
+
end
|
932
|
+
|
933
|
+
def expected_exceptions
|
934
|
+
exceptions = @expected_exceptions.collect do |exception|
|
935
|
+
if exception.is_a?(Exception)
|
936
|
+
WrappedException.new(exception)
|
937
|
+
else
|
938
|
+
exception
|
939
|
+
end
|
940
|
+
end
|
941
|
+
if exceptions.size == 1
|
942
|
+
exceptions[0]
|
943
|
+
else
|
944
|
+
exceptions
|
945
|
+
end
|
946
|
+
end
|
947
|
+
|
948
|
+
def expected?(actual_exception, equality=nil)
|
949
|
+
equality ||= :instance_of?
|
950
|
+
expected_class?(actual_exception, equality) or
|
951
|
+
expected_module?(actual_exception) or
|
952
|
+
expected_object?(actual_exception)
|
953
|
+
end
|
954
|
+
|
955
|
+
private
|
956
|
+
def split_expected_exceptions(expected_exceptions)
|
957
|
+
exception_modules = []
|
958
|
+
exception_objects = []
|
959
|
+
exception_classes = []
|
960
|
+
expected_exceptions.each do |exception_type|
|
961
|
+
if exception_type.instance_of?(Module)
|
962
|
+
exception_modules << exception_type
|
963
|
+
elsif exception_type.is_a?(Exception)
|
964
|
+
exception_objects << exception_type
|
965
|
+
else
|
966
|
+
@test_case.send(:assert,
|
967
|
+
Exception >= exception_type,
|
968
|
+
"Should expect a class of exception, " +
|
969
|
+
"#{exception_type}")
|
970
|
+
exception_classes << exception_type
|
971
|
+
end
|
972
|
+
end
|
973
|
+
[exception_classes, exception_modules, exception_objects]
|
974
|
+
end
|
975
|
+
|
976
|
+
def expected_class?(actual_exception, equality)
|
977
|
+
@expected_classes.any? do |expected_class|
|
978
|
+
actual_exception.send(equality, expected_class)
|
979
|
+
end
|
980
|
+
end
|
719
981
|
|
982
|
+
def expected_module?(actual_exception)
|
983
|
+
@expected_modules.any? do |expected_module|
|
984
|
+
actual_exception.is_a?(expected_module)
|
985
|
+
end
|
986
|
+
end
|
987
|
+
|
988
|
+
def expected_object?(actual_exception)
|
989
|
+
@expected_objects.any? do |expected_object|
|
990
|
+
equal_method = expected_object.method(:==)
|
991
|
+
if equal_method.respond_to?(:owner) and
|
992
|
+
(equal_method.owner == Kernel or
|
993
|
+
equal_method.owner == Exception)
|
994
|
+
expected_object.class == actual_exception.class and
|
995
|
+
expected_object.message == actual_exception.message
|
996
|
+
else
|
997
|
+
expected_object == actual_exception
|
998
|
+
end
|
999
|
+
end
|
1000
|
+
end
|
1001
|
+
end
|
1002
|
+
|
1003
|
+
# :startdoc:
|
720
1004
|
end
|
721
1005
|
end
|
722
1006
|
end
|