test-unit 3.1.5 → 3.1.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 +51 -2
- data/lib/test/unit/attribute.rb +6 -2
- data/lib/test/unit/auto-runner-loader.rb +17 -0
- data/lib/test/unit/autorunner.rb +37 -9
- data/lib/test/unit/collector/load.rb +9 -0
- data/lib/test/unit/fixture.rb +68 -27
- data/lib/test/unit/test-suite-creator.rb +10 -3
- data/lib/test/unit/testcase.rb +33 -7
- data/lib/test/unit/util/backtracefilter.rb +17 -5
- data/lib/test/unit/version.rb +1 -1
- data/test/test-data.rb +23 -1
- data/test/test-fixture.rb +54 -0
- data/test/util/test_backtracefilter.rb +12 -1
- metadata +33 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04f5af0a0a28c5c1507effb079f6d5e2553e28fa
|
4
|
+
data.tar.gz: 87bf6b44575b3c787a4c1ebcc270c0519c4f07be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e77c28e8a7f9782348fa037220713bfb678bcf287c88957198fce089aa2950fd00762cf643efd45965888ba64e9c5f78af5cff383b95545cb9f7905f4c01a4c
|
7
|
+
data.tar.gz: 6855489fa3bc8bb219311e7104d1c34e0fb90d6f75f46315971ad10ac1d5073903445ac473e59f3bececae9b25f8e80d0c78c851a4a3a415f6b3f18cb9142199
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,54 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 3.1.6 - 2016-01-17 {#version-3-1-6}
|
4
|
+
|
5
|
+
It's a Ruby on Rails integration improvement release.
|
6
|
+
|
7
|
+
### Improvements
|
8
|
+
|
9
|
+
* Filtered backtrace of power\_assert.
|
10
|
+
[GitHub#114]
|
11
|
+
* Improved performance to retrieve test defined location.
|
12
|
+
* Improved performance to run fixtures in a test.
|
13
|
+
* Supported running a test by `yield` in `setup`:
|
14
|
+
|
15
|
+
Before:
|
16
|
+
|
17
|
+
def setup
|
18
|
+
@file = File.open("x")
|
19
|
+
end
|
20
|
+
|
21
|
+
def teardown
|
22
|
+
@file.close
|
23
|
+
end
|
24
|
+
|
25
|
+
After:
|
26
|
+
|
27
|
+
def setup
|
28
|
+
File.open("x") do |file|
|
29
|
+
@file = file
|
30
|
+
yield
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
* Added `--default-test-path` option that specifies the default path
|
35
|
+
that has tests.
|
36
|
+
* Made auto runner registration more lazily. Auto runner isn't
|
37
|
+
registered automatically until user defines a test. In the
|
38
|
+
previous releases, auto runner is registered automatically when
|
39
|
+
user defines a test case.
|
40
|
+
* Supported specifying a test by location in command line. For
|
41
|
+
example, the following command line runs a test that is defined in
|
42
|
+
/tmp/test_a.rb at line 10:
|
43
|
+
|
44
|
+
% ruby -r test-unit -e run_test /tmp/test_a.rb:10
|
45
|
+
|
46
|
+
### Fixes
|
47
|
+
|
48
|
+
* Fixed a bug that test isn't ran. The test has the same name as
|
49
|
+
data driven test that is defined in parent test case.
|
50
|
+
[GitHub#115]
|
51
|
+
|
3
52
|
## 3.1.5 - 2015-10-09 {#version-3-1-5}
|
4
53
|
|
5
54
|
It's a Rack integration improvement release.
|
@@ -7,8 +56,8 @@ It's a Rack integration improvement release.
|
|
7
56
|
### Improvements
|
8
57
|
|
9
58
|
* Renamed experimental top-level `run` method to `run_test` method
|
10
|
-
|
11
|
-
|
59
|
+
because `run` is conflicted with Rack.
|
60
|
+
[GitHub#32][GitHub:basecamp/pow#303] [Reported by Yevhen Viktorov]
|
12
61
|
|
13
62
|
### Thanks
|
14
63
|
|
data/lib/test/unit/attribute.rb
CHANGED
@@ -111,7 +111,10 @@ module Test
|
|
111
111
|
attributes || StringifyKeyHash.new
|
112
112
|
end
|
113
113
|
|
114
|
-
def find_attribute(method_name, name)
|
114
|
+
def find_attribute(method_name, name, options={})
|
115
|
+
recursive_p = options[:recursive]
|
116
|
+
recursive_p = true if recursive_p.nil?
|
117
|
+
|
115
118
|
@attributes_table ||= StringifyKeyHash.new
|
116
119
|
if @attributes_table.key?(method_name)
|
117
120
|
attributes = @attributes_table[method_name]
|
@@ -120,6 +123,7 @@ module Test
|
|
120
123
|
end
|
121
124
|
end
|
122
125
|
|
126
|
+
return nil unless recursive_p
|
123
127
|
return nil if self == TestCase
|
124
128
|
|
125
129
|
@cached_parent_test_case ||= ancestors.find do |ancestor|
|
@@ -128,7 +132,7 @@ module Test
|
|
128
132
|
ancestor < Test::Unit::Attribute
|
129
133
|
end
|
130
134
|
|
131
|
-
@cached_parent_test_case.find_attribute(method_name, name)
|
135
|
+
@cached_parent_test_case.find_attribute(method_name, name, options)
|
132
136
|
end
|
133
137
|
|
134
138
|
@@attribute_observers = StringifyKeyHash.new
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "test/unit/test-suite-creator"
|
2
|
+
|
3
|
+
module Test
|
4
|
+
module Unit
|
5
|
+
module AutoRunnerLoader
|
6
|
+
@loaded = false
|
7
|
+
class << self
|
8
|
+
def check(test_case, method_name)
|
9
|
+
return if @loaded
|
10
|
+
return unless TestSuiteCreator.test_method?(test_case, method_name)
|
11
|
+
require "test/unit"
|
12
|
+
@loaded = true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/test/unit/autorunner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "English"
|
2
|
+
|
1
3
|
require 'test/unit/color-scheme'
|
2
4
|
require 'test/unit/priority'
|
3
5
|
require 'test/unit/attribute-matcher'
|
@@ -94,6 +96,7 @@ module Test
|
|
94
96
|
collector.excludes.replace(auto_runner.exclude)
|
95
97
|
end
|
96
98
|
collector.base = auto_runner.base
|
99
|
+
collector.default_test_paths = auto_runner.default_test_paths
|
97
100
|
collector.filter = auto_runner.filters
|
98
101
|
collector.collect(*auto_runner.to_run)
|
99
102
|
end
|
@@ -131,7 +134,9 @@ module Test
|
|
131
134
|
end
|
132
135
|
|
133
136
|
attr_reader :suite, :runner_options
|
134
|
-
attr_accessor :filters, :to_run
|
137
|
+
attr_accessor :filters, :to_run
|
138
|
+
attr_accessor :default_test_paths
|
139
|
+
attr_accessor :pattern, :exclude, :base, :workdir
|
135
140
|
attr_accessor :color_scheme, :listeners
|
136
141
|
attr_writer :runner, :collector
|
137
142
|
|
@@ -141,6 +146,7 @@ module Test
|
|
141
146
|
@collector = default_collector
|
142
147
|
@filters = []
|
143
148
|
@to_run = []
|
149
|
+
@default_test_paths = []
|
144
150
|
@color_scheme = ColorScheme.default
|
145
151
|
@runner_options = {}
|
146
152
|
@default_arguments = []
|
@@ -164,7 +170,7 @@ module Test
|
|
164
170
|
def process_args(args=ARGV)
|
165
171
|
begin
|
166
172
|
args.unshift(*@default_arguments)
|
167
|
-
options.order!(args) {|arg|
|
173
|
+
options.order!(args) {|arg| add_test_path(arg)}
|
168
174
|
rescue OptionParser::ParseError => e
|
169
175
|
puts e
|
170
176
|
puts options
|
@@ -199,10 +205,19 @@ module Test
|
|
199
205
|
@workdir = w
|
200
206
|
end
|
201
207
|
|
208
|
+
o.on('--default-test-path=PATH',
|
209
|
+
"Add PATH to the default test paths.",
|
210
|
+
"The PATH is used when user doesn't specify any test path.",
|
211
|
+
"You can specify this option multiple times.") do |path|
|
212
|
+
@default_test_paths << path
|
213
|
+
end
|
214
|
+
|
202
215
|
o.on('-a', '--add=TORUN', Array,
|
203
216
|
"Add TORUN to the list of things to run;",
|
204
|
-
"can be a file or a directory.") do |
|
205
|
-
|
217
|
+
"can be a file or a directory.") do |paths|
|
218
|
+
paths.each do |path|
|
219
|
+
add_test_path(path)
|
220
|
+
end
|
206
221
|
end
|
207
222
|
|
208
223
|
@pattern = []
|
@@ -272,11 +287,7 @@ module Test
|
|
272
287
|
path, line, = location.split(/:(\d+)/, 2)
|
273
288
|
line = line.to_i unless line.nil?
|
274
289
|
end
|
275
|
-
|
276
|
-
test.class.test_defined?(:path => path,
|
277
|
-
:line => line,
|
278
|
-
:method_name => test.method_name)
|
279
|
-
end
|
290
|
+
add_location_filter(path, line)
|
280
291
|
end
|
281
292
|
|
282
293
|
o.on('--attribute=EXPRESSION', String,
|
@@ -475,6 +486,23 @@ module Test
|
|
475
486
|
end
|
476
487
|
false
|
477
488
|
end
|
489
|
+
|
490
|
+
def add_test_path(path)
|
491
|
+
if /:(\d+)\z/ =~ path
|
492
|
+
line = $1.to_i
|
493
|
+
path = $PREMATCH
|
494
|
+
add_location_filter(path, line)
|
495
|
+
end
|
496
|
+
@to_run << path
|
497
|
+
end
|
498
|
+
|
499
|
+
def add_location_filter(path, line)
|
500
|
+
@filters << lambda do |test|
|
501
|
+
test.class.test_defined?(:path => path,
|
502
|
+
:line => line,
|
503
|
+
:method_name => test.method_name)
|
504
|
+
end
|
505
|
+
end
|
478
506
|
end
|
479
507
|
end
|
480
508
|
end
|
@@ -10,6 +10,7 @@ module Test
|
|
10
10
|
include Collector
|
11
11
|
|
12
12
|
attr_reader :patterns, :excludes, :base
|
13
|
+
attr_reader :default_test_paths
|
13
14
|
|
14
15
|
def initialize
|
15
16
|
super
|
@@ -18,6 +19,7 @@ module Test
|
|
18
19
|
@patterns = [/\Atest[_\-].+\.rb\z/m, /[_\-]test\.rb\z/]
|
19
20
|
@excludes = []
|
20
21
|
@base = nil
|
22
|
+
@default_test_paths = []
|
21
23
|
@require_failed_infos = []
|
22
24
|
end
|
23
25
|
|
@@ -26,8 +28,15 @@ module Test
|
|
26
28
|
@base = base
|
27
29
|
end
|
28
30
|
|
31
|
+
def default_test_paths=(paths)
|
32
|
+
@default_test_paths = paths.collect do |path|
|
33
|
+
Pathname(path)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
29
37
|
def collect(*froms)
|
30
38
|
add_load_path(@base) do
|
39
|
+
froms = @default_test_paths if froms.empty?
|
31
40
|
froms = ["."] if froms.empty?
|
32
41
|
test_suites = []
|
33
42
|
already_gathered = find_test_cases
|
data/lib/test/unit/fixture.rb
CHANGED
@@ -24,9 +24,11 @@ module Test
|
|
24
24
|
attr_reader :teardown
|
25
25
|
def initialize(test_case)
|
26
26
|
@test_case = test_case
|
27
|
-
@setup = HookPoint.new(:after => :append)
|
28
|
-
@cleanup = HookPoint.new(:before => :prepend)
|
29
|
-
@teardown = HookPoint.new(:before => :prepend)
|
27
|
+
@setup = HookPoint.new(@test_case, :setup, :after => :append)
|
28
|
+
@cleanup = HookPoint.new(@test_case, :cleanup, :before => :prepend)
|
29
|
+
@teardown = HookPoint.new(@test_case, :teardown, :before => :prepend)
|
30
|
+
@cached_before_callbacks = {}
|
31
|
+
@cached_after_callbacks = {}
|
30
32
|
end
|
31
33
|
|
32
34
|
def [](type)
|
@@ -41,6 +43,19 @@ module Test
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def before_callbacks(type)
|
46
|
+
@cached_before_callbacks[type] ||= collect_before_callbacks(type)
|
47
|
+
end
|
48
|
+
|
49
|
+
def after_callbacks(type)
|
50
|
+
@cached_after_callbacks[type] ||= collect_after_callbacks(type)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def target_test_cases
|
55
|
+
@cached_target_test_cases ||= collect_target_test_cases
|
56
|
+
end
|
57
|
+
|
58
|
+
def collect_before_callbacks(type)
|
44
59
|
prepend_callbacks = []
|
45
60
|
append_callbacks = []
|
46
61
|
target_test_cases.each do |ancestor|
|
@@ -51,7 +66,7 @@ module Test
|
|
51
66
|
merge_callbacks(prepend_callbacks, append_callbacks)
|
52
67
|
end
|
53
68
|
|
54
|
-
def
|
69
|
+
def collect_after_callbacks(type)
|
55
70
|
prepend_callbacks = []
|
56
71
|
append_callbacks = []
|
57
72
|
target_test_cases.each do |ancestor|
|
@@ -62,11 +77,6 @@ module Test
|
|
62
77
|
merge_callbacks(prepend_callbacks, append_callbacks)
|
63
78
|
end
|
64
79
|
|
65
|
-
private
|
66
|
-
def target_test_cases
|
67
|
-
@cached_target_test_cases ||= collect_target_test_cases
|
68
|
-
end
|
69
|
-
|
70
80
|
def collect_target_test_cases
|
71
81
|
ancestors = @test_case.ancestors
|
72
82
|
base_index = ancestors.index(::Test::Unit::Fixture)
|
@@ -89,7 +99,9 @@ module Test
|
|
89
99
|
end
|
90
100
|
|
91
101
|
class HookPoint
|
92
|
-
def initialize(default_options)
|
102
|
+
def initialize(test_case, type, default_options)
|
103
|
+
@test_case = test_case
|
104
|
+
@type = type
|
93
105
|
@default_options = default_options
|
94
106
|
@before_prepend_callbacks = []
|
95
107
|
@before_append_callbacks = []
|
@@ -112,11 +124,24 @@ module Test
|
|
112
124
|
end
|
113
125
|
before_how = options[:before]
|
114
126
|
after_how = options[:after]
|
115
|
-
|
127
|
+
if method_name_or_callback.respond_to?(:call)
|
128
|
+
callback = method_name_or_callback
|
129
|
+
method_name = callback_method_name(callback)
|
130
|
+
@test_case.__send__(:define_method, method_name, &callback)
|
131
|
+
else
|
132
|
+
method_name = method_name_or_callback
|
133
|
+
end
|
134
|
+
add_callback(method_name, before_how, after_how)
|
116
135
|
end
|
117
136
|
|
118
137
|
def unregister(method_name_or_callback)
|
119
|
-
|
138
|
+
if method_name_or_callback.respond_to?(:call)
|
139
|
+
callback = method_name_or_callback
|
140
|
+
method_name = callback_method_name(callback)
|
141
|
+
else
|
142
|
+
method_name = method_name_or_callback
|
143
|
+
end
|
144
|
+
@unregistered_callbacks << method_name
|
120
145
|
end
|
121
146
|
|
122
147
|
def before_prepend_callbacks
|
@@ -145,6 +170,10 @@ module Test
|
|
145
170
|
[:prepend, :append].include?(options[key])
|
146
171
|
end
|
147
172
|
|
173
|
+
def callback_method_name(callback)
|
174
|
+
"#{@type}_#{callback.object_id}"
|
175
|
+
end
|
176
|
+
|
148
177
|
def add_callback(method_name_or_callback, before_how, after_how)
|
149
178
|
case before_how
|
150
179
|
when :prepend
|
@@ -208,38 +237,50 @@ module Test
|
|
208
237
|
end
|
209
238
|
|
210
239
|
private
|
211
|
-
def run_fixture(type, options={})
|
212
|
-
[
|
240
|
+
def run_fixture(type, options={}, &block)
|
241
|
+
fixtures = [
|
213
242
|
self.class.fixture.before_callbacks(type),
|
214
243
|
type,
|
215
244
|
self.class.fixture.after_callbacks(type),
|
216
|
-
].flatten
|
217
|
-
|
245
|
+
].flatten
|
246
|
+
if block
|
247
|
+
runner = create_fixtures_runner(fixtures, options, &block)
|
248
|
+
runner.call
|
249
|
+
else
|
250
|
+
fixtures.each do |method_name|
|
251
|
+
run_fixture_callback(method_name, options)
|
252
|
+
end
|
218
253
|
end
|
219
254
|
end
|
220
255
|
|
221
|
-
def
|
222
|
-
if
|
223
|
-
|
224
|
-
instance_eval(&method_name_or_callback)
|
225
|
-
end
|
256
|
+
def create_fixtures_runner(fixtures, options, &block)
|
257
|
+
if fixtures.empty?
|
258
|
+
block
|
226
259
|
else
|
227
|
-
|
228
|
-
|
229
|
-
|
260
|
+
last_fixture = fixtures.pop
|
261
|
+
create_fixtures_runner(fixtures, options) do
|
262
|
+
block_is_called = false
|
263
|
+
run_fixture_callback(last_fixture, options) do
|
264
|
+
block_is_called = true
|
265
|
+
block.call
|
266
|
+
end
|
267
|
+
block.call unless block_is_called
|
230
268
|
end
|
231
269
|
end
|
270
|
+
end
|
232
271
|
|
272
|
+
def run_fixture_callback(method_name, options, &block)
|
273
|
+
return unless respond_to?(method_name, true)
|
233
274
|
begin
|
234
|
-
|
275
|
+
__send__(method_name, &block)
|
235
276
|
rescue Exception
|
236
277
|
raise unless options[:handle_exception]
|
237
278
|
raise unless handle_exception($!)
|
238
279
|
end
|
239
280
|
end
|
240
281
|
|
241
|
-
def run_setup
|
242
|
-
run_fixture(:setup)
|
282
|
+
def run_setup(&block)
|
283
|
+
run_fixture(:setup, &block)
|
243
284
|
end
|
244
285
|
|
245
286
|
def run_cleanup
|
@@ -8,6 +8,13 @@
|
|
8
8
|
module Test
|
9
9
|
module Unit
|
10
10
|
class TestSuiteCreator # :nodoc:
|
11
|
+
class << self
|
12
|
+
def test_method?(test_case, method_name)
|
13
|
+
/\Atest./ =~ method_name.to_s or
|
14
|
+
test_case.find_attribute(method_name, :test)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
11
18
|
def initialize(test_case)
|
12
19
|
@test_case = test_case
|
13
20
|
end
|
@@ -15,7 +22,8 @@ module Test
|
|
15
22
|
def create
|
16
23
|
suite = TestSuite.new(@test_case.name, @test_case)
|
17
24
|
collect_test_names.each do |test_name|
|
18
|
-
data_sets = @test_case.find_attribute(test_name, :data
|
25
|
+
data_sets = @test_case.find_attribute(test_name, :data,
|
26
|
+
:recursive => false)
|
19
27
|
if data_sets
|
20
28
|
data_sets.each do |data_set|
|
21
29
|
data_set = data_set.call if data_set.respond_to?(:call)
|
@@ -47,8 +55,7 @@ module Test
|
|
47
55
|
methods |= @test_case.public_instance_methods(false)
|
48
56
|
method_names = methods.collect(&:to_s)
|
49
57
|
test_names = method_names.find_all do |method_name|
|
50
|
-
|
51
|
-
@test_case.find_attribute(method_name, :test)
|
58
|
+
self.class.test_method?(@test_case, method_name)
|
52
59
|
end
|
53
60
|
__send__("sort_test_names_in_#{@test_case.test_order}_order", test_names)
|
54
61
|
end
|
data/lib/test/unit/testcase.rb
CHANGED
@@ -20,6 +20,7 @@ require 'test/unit/data'
|
|
20
20
|
require 'test/unit/testsuite'
|
21
21
|
require 'test/unit/test-suite-creator'
|
22
22
|
require 'test/unit/assertion-failed-error'
|
23
|
+
require 'test/unit/auto-runner-loader'
|
23
24
|
require 'test/unit/util/backtracefilter'
|
24
25
|
require 'test/unit/util/output'
|
25
26
|
require 'test/unit/util/method-owner-finder'
|
@@ -104,7 +105,6 @@ module Test
|
|
104
105
|
|
105
106
|
class << self
|
106
107
|
def inherited(sub_class) # :nodoc:
|
107
|
-
require "test/unit"
|
108
108
|
DESCENDANTS << sub_class
|
109
109
|
super
|
110
110
|
end
|
@@ -120,7 +120,12 @@ module Test
|
|
120
120
|
source_location = find_attribute(stringified_name, :source_location)
|
121
121
|
if source_location
|
122
122
|
path, line = source_location
|
123
|
+
elsif respond_to?(:caller_locations, true)
|
124
|
+
location = caller_locations(1, 1)[0]
|
125
|
+
path = location.absolute_path || location.path
|
126
|
+
line = location.lineno
|
123
127
|
else
|
128
|
+
# TODO: Remove me when Ruby 1.9 support is dropped
|
124
129
|
path, line, = caller[0].split(/:(\d+)/, 2)
|
125
130
|
line = line.to_i if line
|
126
131
|
end
|
@@ -130,6 +135,7 @@ module Test
|
|
130
135
|
:line => line,
|
131
136
|
}
|
132
137
|
added_method_names[stringified_name] = true
|
138
|
+
AutoRunnerLoader.check(self, stringified_name)
|
133
139
|
end
|
134
140
|
|
135
141
|
def added_method_names # :nodoc:
|
@@ -281,6 +287,9 @@ module Test
|
|
281
287
|
else
|
282
288
|
targets = test_description_or_targets
|
283
289
|
attribute(:test, true, {}, *targets)
|
290
|
+
targets.each do |target|
|
291
|
+
AutoRunnerLoader.check(self, target)
|
292
|
+
end
|
284
293
|
end
|
285
294
|
end
|
286
295
|
|
@@ -453,14 +462,31 @@ module Test
|
|
453
462
|
@internal_data.test_started
|
454
463
|
yield(STARTED, name)
|
455
464
|
yield(STARTED_OBJECT, self)
|
465
|
+
processed_exception_in_setup = false
|
456
466
|
begin
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
467
|
+
catch do |tag|
|
468
|
+
run_setup do
|
469
|
+
begin
|
470
|
+
run_test
|
471
|
+
run_cleanup
|
472
|
+
add_pass
|
473
|
+
rescue Exception
|
474
|
+
@internal_data.interrupted
|
475
|
+
unless handle_exception($!)
|
476
|
+
processed_exception_in_setup = true
|
477
|
+
raise
|
478
|
+
end
|
479
|
+
throw(tag)
|
480
|
+
end
|
481
|
+
end
|
482
|
+
end
|
461
483
|
rescue Exception
|
462
|
-
|
463
|
-
|
484
|
+
if processed_exception_in_setup
|
485
|
+
raise
|
486
|
+
else
|
487
|
+
@internal_data.interrupted
|
488
|
+
raise unless handle_exception($!)
|
489
|
+
end
|
464
490
|
ensure
|
465
491
|
begin
|
466
492
|
run_teardown
|
@@ -1,3 +1,8 @@
|
|
1
|
+
begin
|
2
|
+
require 'power_assert'
|
3
|
+
rescue LoadError, SyntaxError
|
4
|
+
end
|
5
|
+
|
1
6
|
module Test
|
2
7
|
module Unit
|
3
8
|
module Util
|
@@ -6,21 +11,28 @@ module Test
|
|
6
11
|
TESTUNIT_PREFIX = __FILE__.split(TESTUNIT_FILE_SEPARATORS)[0..-3]
|
7
12
|
TESTUNIT_RB_FILE = /\.rb\Z/
|
8
13
|
|
14
|
+
POWERASSERT_PREFIX =
|
15
|
+
defined?(PowerAssert) ?
|
16
|
+
PowerAssert.method(:start).source_location[0].split(TESTUNIT_FILE_SEPARATORS)[0..-2] :
|
17
|
+
nil
|
18
|
+
|
9
19
|
module_function
|
10
20
|
def filter_backtrace(backtrace, prefix=nil)
|
11
21
|
return ["No backtrace"] unless backtrace
|
12
22
|
return backtrace if ENV["TEST_UNIT_ALL_BACKTRACE"]
|
13
23
|
|
14
24
|
if prefix
|
15
|
-
|
25
|
+
split_prefixes = [prefix.split(TESTUNIT_FILE_SEPARATORS)]
|
16
26
|
else
|
17
|
-
|
27
|
+
split_prefixes = [TESTUNIT_PREFIX, POWERASSERT_PREFIX].compact
|
18
28
|
end
|
19
29
|
test_unit_internal_p = lambda do |entry|
|
20
30
|
components = entry.split(TESTUNIT_FILE_SEPARATORS)
|
21
|
-
|
22
|
-
|
23
|
-
|
31
|
+
split_prefixes.any? do |split_prefix|
|
32
|
+
split_entry = components[0, split_prefix.size]
|
33
|
+
next false unless split_entry[0..-2] == split_prefix[0..-2]
|
34
|
+
split_entry[-1].sub(TESTUNIT_RB_FILE, '') == split_prefix[-1]
|
35
|
+
end
|
24
36
|
end
|
25
37
|
|
26
38
|
in_user_code = false
|
data/lib/test/unit/version.rb
CHANGED
data/test/test-data.rb
CHANGED
@@ -75,6 +75,21 @@ class TestData < Test::Unit::TestCase
|
|
75
75
|
@calc.plus(data["augend"], data["addend"]))
|
76
76
|
end
|
77
77
|
end
|
78
|
+
|
79
|
+
class TestSuperclass < TestCalc
|
80
|
+
data("positive positive" => {:expected => 4, :augend => 3, :addend => 1},
|
81
|
+
"positive negative" => {:expected => -1, :augend => 1, :addend => -2})
|
82
|
+
def test_plus(data)
|
83
|
+
assert_equal(data[:expected],
|
84
|
+
@calc.plus(data[:augend], data[:addend]))
|
85
|
+
end
|
86
|
+
|
87
|
+
class TestNormalTestInSubclass < self
|
88
|
+
def test_plus
|
89
|
+
assert_equal(2, @calc.plus(1, 1))
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
78
93
|
end
|
79
94
|
|
80
95
|
def setup
|
@@ -168,13 +183,20 @@ class TestData < Test::Unit::TestCase
|
|
168
183
|
data("data set" => TestCalc::TestDataSet,
|
169
184
|
"n-data" => TestCalc::TestNData,
|
170
185
|
"dynamic-data-set" => TestCalc::TestDynamicDataSet,
|
171
|
-
"load-data-set" => TestCalc::TestLoadDataSet
|
186
|
+
"load-data-set" => TestCalc::TestLoadDataSet,
|
187
|
+
"superclass" => TestCalc::TestSuperclass)
|
172
188
|
def test_run(test_case)
|
173
189
|
result = _run_test(test_case)
|
174
190
|
assert_equal("2 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, " \
|
175
191
|
"0 omissions, 0 notifications", result.to_s)
|
176
192
|
end
|
177
193
|
|
194
|
+
def test_run_normal_test_in_subclass
|
195
|
+
result = _run_test(TestCalc::TestSuperclass::TestNormalTestInSubclass)
|
196
|
+
assert_equal("1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, " \
|
197
|
+
"0 omissions, 0 notifications", result.to_s)
|
198
|
+
end
|
199
|
+
|
178
200
|
data("data set" => TestCalc::TestDataSet,
|
179
201
|
"n-data" => TestCalc::TestNData,
|
180
202
|
"dynamic-data-set" => TestCalc::TestDynamicDataSet,
|
data/test/test-fixture.rb
CHANGED
@@ -535,6 +535,60 @@ class TestUnitFixture < Test::Unit::TestCase
|
|
535
535
|
called)
|
536
536
|
end
|
537
537
|
|
538
|
+
def test_setup_with_block
|
539
|
+
test_case = Class.new(Test::Unit::TestCase) do
|
540
|
+
def called_ids
|
541
|
+
@called_ids ||= []
|
542
|
+
end
|
543
|
+
|
544
|
+
def called(id)
|
545
|
+
called_ids << id
|
546
|
+
end
|
547
|
+
|
548
|
+
setup
|
549
|
+
def setup1
|
550
|
+
called(:setup1)
|
551
|
+
begin
|
552
|
+
yield
|
553
|
+
called(:setup1_after_yield)
|
554
|
+
ensure
|
555
|
+
called(:setup1_teardown)
|
556
|
+
end
|
557
|
+
end
|
558
|
+
|
559
|
+
setup
|
560
|
+
def setup2
|
561
|
+
called(:setup2)
|
562
|
+
begin
|
563
|
+
yield
|
564
|
+
called(:setup2_after_yield)
|
565
|
+
ensure
|
566
|
+
called(:setup2_teardown)
|
567
|
+
end
|
568
|
+
end
|
569
|
+
|
570
|
+
def teardown
|
571
|
+
called(:teardown)
|
572
|
+
end
|
573
|
+
|
574
|
+
def test_nothing
|
575
|
+
called(:test)
|
576
|
+
flunk
|
577
|
+
called(:test_after_failure)
|
578
|
+
end
|
579
|
+
end
|
580
|
+
|
581
|
+
assert_called_fixtures([
|
582
|
+
:setup1,
|
583
|
+
:setup2,
|
584
|
+
:test,
|
585
|
+
:setup2_teardown,
|
586
|
+
:setup1_teardown,
|
587
|
+
:teardown,
|
588
|
+
],
|
589
|
+
test_case)
|
590
|
+
end
|
591
|
+
|
538
592
|
private
|
539
593
|
def assert_teardown_customizable(expected, parent, options)
|
540
594
|
test_case = Class.new(parent || Test::Unit::TestCase) do
|
@@ -16,7 +16,7 @@ module Test::Unit::Util
|
|
16
16
|
%q{tc_thing.rb:3}]
|
17
17
|
assert_equal(backtrace[1..2], filter_backtrace(backtrace, %q{C:\some\old\path\test\unit}), "Should filter out all TestUnit-specific lines")
|
18
18
|
|
19
|
-
backtrace = [%q{tc_thing.rb:4:in 'a'},
|
19
|
+
backtrace = [%q{tc_thing.rb:4:in 'a'},
|
20
20
|
%q{tc_thing.rb:4:in 'test_stuff'},
|
21
21
|
%q{tc_thing.rb:3}]
|
22
22
|
assert_equal(backtrace, filter_backtrace(backtrace, %q{C:\some\old\path\test\unit}), "Shouldn't filter too much")
|
@@ -37,5 +37,16 @@ backtrace = [%q{tc_thing.rb:4:in 'a'},
|
|
37
37
|
def test_nil_backtrace
|
38
38
|
assert_equal(["No backtrace"], filter_backtrace(nil))
|
39
39
|
end
|
40
|
+
|
41
|
+
def test_power_assert_backtrace
|
42
|
+
omit('test for power_assert') unless defined?(PowerAssert)
|
43
|
+
blk = Proc.new {caller.find {|i| /power_assert.*in \`start\'/ =~ i}}
|
44
|
+
PowerAssert.start(blk) do |pa|
|
45
|
+
backtrace = [pa.yield,
|
46
|
+
%q{tc_thing.rb:4:in 'a'},
|
47
|
+
%q{tc_thing.rb:4:in 'test_stuff'}]
|
48
|
+
assert_equal(backtrace[1..2], filter_backtrace(backtrace))
|
49
|
+
end
|
50
|
+
end
|
40
51
|
end
|
41
52
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test-unit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-01-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: power_assert
|
@@ -121,6 +121,7 @@ files:
|
|
121
121
|
- lib/test/unit/assertions.rb
|
122
122
|
- lib/test/unit/attribute-matcher.rb
|
123
123
|
- lib/test/unit/attribute.rb
|
124
|
+
- lib/test/unit/auto-runner-loader.rb
|
124
125
|
- lib/test/unit/autorunner.rb
|
125
126
|
- lib/test/unit/code-snippet-fetcher.rb
|
126
127
|
- lib/test/unit/collector.rb
|
@@ -228,49 +229,49 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
228
229
|
version: '0'
|
229
230
|
requirements: []
|
230
231
|
rubyforge_project:
|
231
|
-
rubygems_version: 2.
|
232
|
+
rubygems_version: 2.4.5.1
|
232
233
|
signing_key:
|
233
234
|
specification_version: 4
|
234
235
|
summary: An xUnit family unit testing framework for Ruby.
|
235
236
|
test_files:
|
236
|
-
- test/test-assertions.rb
|
237
|
-
- test/test-color.rb
|
238
237
|
- test/test-code-snippet.rb
|
238
|
+
- test/test-fault-location-detector.rb
|
239
|
+
- test/test-attribute.rb
|
240
|
+
- test/test-priority.rb
|
241
|
+
- test/test-color-scheme.rb
|
242
|
+
- test/test-failure.rb
|
243
|
+
- test/test-color.rb
|
244
|
+
- test/ui/test_testrunmediator.rb
|
245
|
+
- test/test-attribute-matcher.rb
|
246
|
+
- test/test-test-suite.rb
|
239
247
|
- test/test-test-suite-creator.rb
|
248
|
+
- test/test-diff.rb
|
249
|
+
- test/test-emacs-runner.rb
|
250
|
+
- test/test-data.rb
|
251
|
+
- test/fixtures/header.csv
|
252
|
+
- test/fixtures/header.tsv
|
253
|
+
- test/fixtures/no-header.tsv
|
254
|
+
- test/fixtures/plus.csv
|
255
|
+
- test/fixtures/no-header.csv
|
256
|
+
- test/fixtures/header-label.tsv
|
257
|
+
- test/fixtures/header-label.csv
|
258
|
+
- test/test-assertions.rb
|
240
259
|
- test/test-test-result.rb
|
260
|
+
- test/testunit-test-util.rb
|
261
|
+
- test/collector/test-load.rb
|
262
|
+
- test/collector/test_dir.rb
|
263
|
+
- test/collector/test_objectspace.rb
|
264
|
+
- test/collector/test-descendant.rb
|
241
265
|
- test/test-error.rb
|
242
|
-
- test/test-failure.rb
|
243
266
|
- test/run-test.rb
|
244
267
|
- test/test-pending.rb
|
245
|
-
- test/test-
|
246
|
-
- test/test-attribute-matcher.rb
|
247
|
-
- test/testunit-test-util.rb
|
248
|
-
- test/test-data.rb
|
249
|
-
- test/ui/test_testrunmediator.rb
|
250
|
-
- test/util/test-method-owner-finder.rb
|
268
|
+
- test/test-fixture.rb
|
251
269
|
- test/util/test-output.rb
|
270
|
+
- test/util/test-method-owner-finder.rb
|
252
271
|
- test/util/test_observable.rb
|
253
|
-
- test/util/test_backtracefilter.rb
|
254
272
|
- test/util/test_procwrapper.rb
|
273
|
+
- test/util/test_backtracefilter.rb
|
274
|
+
- test/test-notification.rb
|
255
275
|
- test/test-omission.rb
|
256
276
|
- test/test-test-case.rb
|
257
|
-
- test/test-fixture.rb
|
258
|
-
- test/fixtures/no-header.csv
|
259
|
-
- test/fixtures/header-label.tsv
|
260
|
-
- test/fixtures/plus.csv
|
261
|
-
- test/fixtures/no-header.tsv
|
262
|
-
- test/fixtures/header-label.csv
|
263
|
-
- test/fixtures/header.csv
|
264
|
-
- test/fixtures/header.tsv
|
265
|
-
- test/collector/test-descendant.rb
|
266
|
-
- test/collector/test_objectspace.rb
|
267
|
-
- test/collector/test-load.rb
|
268
|
-
- test/collector/test_dir.rb
|
269
|
-
- test/test-priority.rb
|
270
|
-
- test/test-test-suite.rb
|
271
|
-
- test/test-diff.rb
|
272
|
-
- test/test-emacs-runner.rb
|
273
|
-
- test/test-attribute.rb
|
274
|
-
- test/test-fault-location-detector.rb
|
275
|
-
- test/test-notification.rb
|
276
277
|
has_rdoc:
|