test-unit 3.6.7 → 3.6.9

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +1 -1
  4. data/bin/test-unit +5 -0
  5. data/doc/text/getting-started.md +24 -150
  6. data/doc/text/how-to.md +4 -4
  7. data/doc/text/news.md +65 -0
  8. data/lib/test/unit/assertions.rb +5 -5
  9. data/lib/test/unit/auto-runner-loader.rb +2 -2
  10. data/lib/test/unit/autorunner.rb +29 -13
  11. data/lib/test/unit/collector/descendant.rb +1 -1
  12. data/lib/test/unit/collector/dir.rb +2 -2
  13. data/lib/test/unit/collector/load.rb +2 -2
  14. data/lib/test/unit/collector/objectspace.rb +1 -1
  15. data/lib/test/unit/collector/xml.rb +1 -1
  16. data/lib/test/unit/color-scheme.rb +1 -1
  17. data/lib/test/unit/data.rb +1 -1
  18. data/lib/test/unit/error.rb +1 -1
  19. data/lib/test/unit/notification.rb +1 -1
  20. data/lib/test/unit/omission.rb +1 -1
  21. data/lib/test/unit/pending.rb +1 -1
  22. data/lib/test/unit/runner/console.rb +3 -3
  23. data/lib/test/unit/runner/emacs.rb +1 -1
  24. data/lib/test/unit/runner/xml.rb +1 -1
  25. data/lib/test/unit/test-run-context.rb +16 -0
  26. data/lib/test/unit/test-suite-creator.rb +1 -1
  27. data/lib/test/unit/test-suite-runner.rb +9 -7
  28. data/lib/test/unit/test-suite-thread-runner.rb +31 -16
  29. data/lib/test/unit/test-thread-run-context.rb +20 -0
  30. data/lib/test/unit/testcase.rb +39 -19
  31. data/lib/test/unit/testresult.rb +7 -7
  32. data/lib/test/unit/testsuite.rb +8 -4
  33. data/lib/test/unit/ui/console/testrunner.rb +7 -7
  34. data/lib/test/unit/ui/emacs/testrunner.rb +1 -1
  35. data/lib/test/unit/ui/testrunner.rb +1 -1
  36. data/lib/test/unit/ui/testrunnermediator.rb +6 -6
  37. data/lib/test/unit/ui/xml/testrunner.rb +3 -2
  38. data/lib/test/unit/util/observable.rb +1 -1
  39. data/lib/test/unit/version.rb +1 -1
  40. data/lib/test/unit.rb +6 -6
  41. data/lib/test-unit.rb +15 -4
  42. metadata +8 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 238d27a3abf3ab70fa38affa00e2fd5944adde841397d1a5307b68eff94362c2
4
- data.tar.gz: 6e6ef248d44e47e83bb45d24b160dfdccb32d167123534445d49c7358bcb3bcb
3
+ metadata.gz: 77117ca73bd85162cdd0b17656df48fe1abc9adaa1aa6f0ab7f0dc8f2eb3ff72
4
+ data.tar.gz: 1696e25b8ef8f4d0e519eddd363117895ad4a1f280b0ce6ef13147ec13b422d2
5
5
  SHA512:
6
- metadata.gz: 44cb65959ff5ee6e9673901218b9a29494158a822682d9d12a4b5ba7ce21f965ef87fdf3a697b8d07c91ca7b1fe9f1f0cee7bf6b3da4d74485fd221dcc03fe2c
7
- data.tar.gz: 327924d71d4ec015870afec579d9936a6e0425dada2c3b6185a10ce9a2f11e9b5666f9b41641fe994e4150a513d4dd659517181ab31158881595502a77cac708
6
+ metadata.gz: 5afdc71db023875667be801f4cba2e8b228fade97df6efb1060385a791acd2d790a3d6e83dd503b30043d14752074709e7bdf4ca07e9cb5dac53bf87a2edb06e
7
+ data.tar.gz: ee546e177616594c247235376f75aa79f7a1a048e9643f6cd9f823c3778ca96301cae7fcad93ad5026ce29b65dfdd4475249edea6b092dcb6cc03fc1bfa708e6
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/test-unit.png)](http://badge.fury.io/rb/test-unit)
4
4
  [![Build Status for Ruby 2.1+](https://github.com/test-unit/test-unit/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/test-unit/test-unit/actions/workflows/test.yml?query=branch%3Amaster+)
5
5
 
6
- * http://test-unit.github.io/
6
+ * https://test-unit.github.io/
7
7
  * https://github.com/test-unit/test-unit
8
8
 
9
9
  ## Description
data/Rakefile CHANGED
@@ -49,7 +49,7 @@ Packnga::ReleaseTask.new(spec) do |task|
49
49
  end
50
50
 
51
51
  task :test do
52
- ruby("test/run-test.rb")
52
+ ruby("test/run.rb")
53
53
  end
54
54
 
55
55
  namespace :doc do
data/bin/test-unit ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "test/unit"
4
+
5
+ exit(Test::Unit::AutoRunner.run(true))
@@ -22,178 +22,52 @@ You will find the following lines.
22
22
  !!!plain
23
23
  gem list
24
24
  ...
25
- bundler (1.14.6)
25
+ bundler (2.6.3, default: 2.6.2)
26
26
  ...
27
- test-unit (3.2.3)
27
+ test-unit (3.6.8, 3.6.7)
28
28
  ~~~
29
29
 
30
30
  ## 3. Create gem template.
31
31
 
32
32
  Next, create a gem template using `bundler` command.
33
33
  This command generates package skeleton with a testing framework.
34
- However, this command can't generate test templates for `test-unit`.
35
34
 
36
- So, First create gem template with the `minitest` testing framework.
37
- (It's similar to `unit-test`).
38
- After that, replace some files for `test-unit`.
35
+ The `bundle gem -t test-unit sample` command will generate a gem template with the `test-unit` testing framework.
39
36
 
40
- The `bundle gem -t minitest sample` command will generate the following files.
41
-
42
- ~~~
43
- !!!plain
44
- .
45
- |-- Gemfile
46
- |-- README.md
47
- |-- Rakefile
48
- |-- bin
49
- | |-- console
50
- | `-- setup
51
- |-- lib
52
- | |-- sample
53
- | | `-- version.rb
54
- | `-- sample.rb
55
- |-- sample.gemspec # <- Modify
56
- `-- test
57
- |-- sample_test.rb # <- Modify
58
- `-- test_helper.rb # <- Modify
59
- ~~~
60
-
61
- ## 4. Edit files for `test-unit`
62
-
63
- ### 4.1. Edit gemspec
64
-
65
- Edit `sample.gemspec` like the below.
66
- Replace `minitest` line to `test-unit`.
67
-
68
- Before
69
-
70
- ~~~
71
- !!!ruby
72
- spec.add_development_dependency "minitest", "~> 5.0"
73
- ~~~
74
-
75
- After
76
-
77
- ~~~
78
- !!!ruby
79
- spec.add_development_dependency "test-unit", "~> 3.2.3"
80
- ~~~
81
-
82
- ### 4.2. Edit `test/test_helper.rb`
83
-
84
- Next, edit the `test/test_helper.rb` file.
85
-
86
- Before
87
-
88
- ~~~
89
- !!!ruby
90
- $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
91
- require 'sample'
92
-
93
- require 'minitest/autorun' # <-- Modify this line.
94
- ~~~
95
-
96
- After
97
-
98
- ~~~
99
- !!!ruby
100
- $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
101
- require 'sample'
102
-
103
- require 'test/unit' # <-- After modification.
104
- ~~~
105
-
106
- ### 4.3 Rakefile (No edit)
107
-
108
- This file doesn't need to modify.
109
- The output is the below.
110
-
111
- ~~~
112
- !!!ruby
113
- require "bundler/gem_tasks"
114
- require "rake/testtask"
115
-
116
- Rake::TestTask.new(:test) do |t|
117
- t.libs << "test"
118
- t.libs << "lib"
119
- t.test_files = FileList['test/**/*_test.rb']
120
- end
121
-
122
- task :default => :test
123
- ~~~
124
-
125
- ### 4.4 Edit `test/sample_test.rb`
126
-
127
- The bundler generate the file `test/sample_test.rb`.
128
- This file originally templates for `minitest`.
129
-
130
- Let's modify this file for `test-unit`
131
-
132
- before
133
-
134
- ~~~
135
- !!!ruby
136
- require 'test_helper'
137
-
138
- class SampleTest < Minitest::Test # <- Modify here
139
- def test_that_it_has_a_version_number
140
- refute_nil ::Sample::VERSION
141
- end
142
-
143
- def test_it_does_something_useful
144
- assert false
145
- end
146
- end
147
- ~~~
148
-
149
- After
150
-
151
- ~~~
152
- !!!ruby
153
- require 'test_helper'
154
-
155
- class SampleTest < Test::Unit::TestCase # <- After modification
156
- def test_that_it_has_a_version_number
157
- refute_nil ::Sample::VERSION
158
- end
159
-
160
- def test_it_does_something_useful
161
- assert false
162
- end
163
- end
164
- ~~~
165
-
166
- ## 5. Execute test.
37
+ ## 4. Execute test.
167
38
 
168
39
  The `rake test` command execute test scenarios in the `test` directory.
169
40
  Now it tries to two tests. One will success the other one fails.
170
41
 
171
42
  ~~~
172
43
  !!!plain
173
- rake test
174
- Loaded suite
175
- /path/to/ruby/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/rake_test_loader
44
+ $ rake test
45
+ Loaded suite /path/to/ruby/lib/ruby/gems/3.4.0/gems/rake-13.2.1/lib/rake/rake_test_loader
176
46
  Started
177
47
  F
178
48
  ================================================================================
179
- Failure: <false> is not true.
180
- test_it_does_something_useful(SampleTest)
181
- /path/to/sample/test/sample_test.rb:9:in `test_it_does_something_useful'
182
- 6: end
183
- 7:
184
- 8: def test_it_does_something_useful
185
- => 9: assert false
49
+ Failure: test: something useful(SampleTest)
50
+ /path/to/sample/test/sample_test.rb:13:in 'block in <class:SampleTest>'
186
51
  10: end
187
- 11: end
52
+ 11:
53
+ 12: test "something useful" do
54
+ => 13: assert_equal("expected", "actual")
55
+ 14: end
56
+ 15: end
57
+ <"expected"> expected but was
58
+ <"actual">
59
+
60
+ diff:
61
+ ? expected
62
+ ? a ual
63
+ ? ???? ??
188
64
  ================================================================================
189
- .
190
-
191
- Finished in 0.011521 seconds.
65
+ Finished in 0.013737 seconds.
192
66
  --------------------------------------------------------------------------------
193
67
  2 tests, 2 assertions, 1 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
194
68
  50% passed
195
69
  --------------------------------------------------------------------------------
196
- 173.60 tests/s, 173.60 assertions/s
70
+ 145.59 tests/s, 145.59 assertions/s
197
71
  rake aborted!
198
72
  Command failed with status (1)
199
73
 
@@ -201,7 +75,7 @@ Tasks: TOP => test
201
75
  (See full trace by running task with --trace)
202
76
  ~~~
203
77
 
204
- ## 6. Create original tests.
78
+ ## 5. Create original tests.
205
79
 
206
80
  Let's create your original tests with the following rules.
207
81
 
@@ -239,7 +113,7 @@ module Sub
239
113
  end
240
114
  ~~~
241
115
 
242
- ## 7. For more information
116
+ ## 6. For more information
243
117
 
244
118
  Let's read the official document.
245
119
 
data/doc/text/how-to.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Run all tests
4
4
 
5
- To make it easy to run all your tests, you can add a `run_test.rb` script
5
+ To make it easy to run all your tests, you can add a `run.rb` script
6
6
  to your `test` directory. A simple example might look like:
7
7
 
8
8
  base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
@@ -17,19 +17,19 @@ to your `test` directory. A simple example might look like:
17
17
 
18
18
  Then it's easy to run tests via the command line with,
19
19
 
20
- $ ruby test/run_test.rb
20
+ $ ruby test/run.rb
21
21
 
22
22
  ## Change test runner via the command line
23
23
 
24
24
  The output format can be changed via the command line with
25
25
  the `--runner` option. Simply tack it to the end:
26
26
 
27
- ruby test/run_test.rb --runner tap
27
+ ruby test/run.rb --runner emacs
28
28
 
29
29
 
30
30
  ## Configure test-unit per-project
31
31
 
32
- Test::Unit reads `test-unit.yml` or `.test-unit.yml` in the current working
32
+ Test::Unit reads `~/.test-unit.yml` or `test-unit.yml` in the current working
33
33
  directory as Test::Unit's configuration file. It can contain the following
34
34
  settings:
35
35
 
data/doc/text/news.md CHANGED
@@ -1,5 +1,70 @@
1
1
  # News
2
2
 
3
+ ## 3.6.9 - 2025-06-29 {#version-3-6-9}
4
+
5
+ ### Improvements
6
+
7
+ * doc: test: Added one-line style to declare `Ractor` test.
8
+ * GH-261
9
+ * GH-309
10
+
11
+ * Used `require_relative` instead of `require` for internal library
12
+ files.
13
+ * GH-311
14
+ * GH-312
15
+ * GH-313
16
+ * GH-315
17
+
18
+ * Added the `--version` option.
19
+ * GH-314
20
+ * Patch by MSP-Greg
21
+
22
+ ### Thanks
23
+
24
+ * MSP-Greg
25
+
26
+ ## 3.6.8 - 2025-04-05 {#version-3-6-8}
27
+
28
+ ### Improvements
29
+
30
+ * `test-unit`: Added. You can use this instead of creating a custom
31
+ test run script.
32
+ * GH-288
33
+ * GH-289
34
+ * GH-291
35
+ * Suggested by gemmaro
36
+
37
+ * Updated the "how to" document.
38
+ * GH-292
39
+ * GH-293
40
+ * GH-294
41
+
42
+ * Updated the "getting started" document.
43
+ * GH-295
44
+ * GH-296
45
+
46
+ * Added support for `.test-unit` configuration file. It's useful for
47
+ specifying default options, and is handier than using `.test-unit.yml`.
48
+ * GH-300
49
+ * GH-302
50
+
51
+ ### Fixes
52
+
53
+ * parallel: thread: Fixed shutdown execution order.
54
+ * GH-282
55
+
56
+ * testcase: Fixed a bug that instance variables added during the test
57
+ runs are not garbage collected after each test run.
58
+ * GH-235
59
+ * GH-303
60
+ * Reported by akira yamada
61
+
62
+ ### Thanks
63
+
64
+ * gemmaro
65
+
66
+ * akira yamada
67
+
3
68
  ## 3.6.7 - 2024-12-17 {#version-3-6-7}
4
69
 
5
70
  ### Fixes
@@ -3,11 +3,11 @@
3
3
  # Copyright (c) 2009-2013 Kouhei Sutou. All rights reserved.
4
4
  # License:: Ruby license.
5
5
 
6
- require 'test/unit/assertion-failed-error'
7
- require 'test/unit/util/backtracefilter'
8
- require 'test/unit/util/memory-usage'
9
- require 'test/unit/util/method-owner-finder'
10
- require 'test/unit/diff'
6
+ require_relative 'assertion-failed-error'
7
+ require_relative 'util/backtracefilter'
8
+ require_relative 'util/memory-usage'
9
+ require_relative 'util/method-owner-finder'
10
+ require_relative 'diff'
11
11
 
12
12
  begin
13
13
  require 'power_assert'
@@ -1,4 +1,4 @@
1
- require "test/unit/test-suite-creator"
1
+ require_relative "test-suite-creator"
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -8,7 +8,7 @@ module Test
8
8
  def check(test_case, method_name)
9
9
  return if @loaded
10
10
  return unless TestSuiteCreator.test_method?(test_case, method_name)
11
- require "test/unit"
11
+ require_relative "../unit"
12
12
  @loaded = true
13
13
  end
14
14
  end
@@ -1,11 +1,12 @@
1
1
  require "English"
2
2
  require "optparse"
3
3
 
4
- require "test/unit/color-scheme"
5
- require "test/unit/priority"
6
- require "test/unit/attribute-matcher"
7
- require "test/unit/testcase"
8
- require "test/unit/test-suite-thread-runner"
4
+ require_relative "color-scheme"
5
+ require_relative "priority"
6
+ require_relative "attribute-matcher"
7
+ require_relative "testcase"
8
+ require_relative "test-suite-thread-runner"
9
+ require_relative "version"
9
10
 
10
11
  module Test
11
12
  module Unit
@@ -86,14 +87,14 @@ module Test
86
87
  end
87
88
 
88
89
  register_collector(:descendant) do |auto_runner|
89
- require "test/unit/collector/descendant"
90
+ require_relative "collector/descendant"
90
91
  collector = Collector::Descendant.new
91
92
  collector.filter = auto_runner.filters
92
93
  collector.collect($0.sub(/\.rb\Z/, ""))
93
94
  end
94
95
 
95
96
  register_collector(:load) do |auto_runner|
96
- require "test/unit/collector/load"
97
+ require_relative "collector/load"
97
98
  collector = Collector::Load.new
98
99
  unless auto_runner.pattern.empty?
99
100
  collector.patterns.replace(auto_runner.pattern)
@@ -109,7 +110,7 @@ module Test
109
110
 
110
111
  # JUST TEST!
111
112
  # register_collector(:xml) do |auto_runner|
112
- # require "test/unit/collector/xml"
113
+ # require_relative "collector/xml"
113
114
  # collector = Collector::XML.new
114
115
  # collector.filter = auto_runner.filters
115
116
  # collector.collect(auto_runner.to_run[0])
@@ -117,7 +118,7 @@ module Test
117
118
 
118
119
  # deprecated
119
120
  register_collector(:object_space) do |auto_runner|
120
- require "test/unit/collector/objectspace"
121
+ require_relative "collector/objectspace"
121
122
  c = Collector::ObjectSpace.new
122
123
  c.filter = auto_runner.filters
123
124
  c.collect($0.sub(/\.rb\Z/, ""))
@@ -125,7 +126,7 @@ module Test
125
126
 
126
127
  # deprecated
127
128
  register_collector(:dir) do |auto_runner|
128
- require "test/unit/collector/dir"
129
+ require_relative "collector/dir"
129
130
  c = Collector::Dir.new
130
131
  c.filter = auto_runner.filters
131
132
  unless auto_runner.pattern.empty?
@@ -171,6 +172,10 @@ module Test
171
172
  else
172
173
  load_global_config
173
174
  end
175
+ plain_text_config_file = ".test-unit"
176
+ if File.exist?(plain_text_config_file)
177
+ load_plain_text_config(plain_text_config_file)
178
+ end
174
179
  yield(self) if block_given?
175
180
  end
176
181
 
@@ -202,6 +207,8 @@ module Test
202
207
 
203
208
  def options
204
209
  @options ||= OptionParser.new do |o|
210
+ o.version = VERSION
211
+
205
212
  o.banner = "Test::Unit automatic runner."
206
213
  o.banner += "\nUsage: #{$0} [options] [-- untouched arguments]"
207
214
 
@@ -515,6 +522,15 @@ module Test
515
522
  @runner_options = @runner_options.merge(runner_options)
516
523
  end
517
524
 
525
+ def load_plain_text_config(file)
526
+ require "shellwords"
527
+ File.readlines(file, chomp: true).each do |line|
528
+ next if line.empty?
529
+ args = Shellwords.shellsplit(line)
530
+ @default_arguments.concat(args)
531
+ end
532
+ end
533
+
518
534
  private
519
535
  def default_runner
520
536
  runner = self.class.default_runner
@@ -624,6 +640,6 @@ module Test
624
640
  end
625
641
  end
626
642
 
627
- require "test/unit/runner/console"
628
- require "test/unit/runner/emacs"
629
- require "test/unit/runner/xml"
643
+ require_relative "runner/console"
644
+ require_relative "runner/emacs"
645
+ require_relative "runner/xml"
@@ -1,4 +1,4 @@
1
- require 'test/unit/collector'
1
+ require_relative '../collector'
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -1,5 +1,5 @@
1
- require 'test/unit/testsuite'
2
- require 'test/unit/collector'
1
+ require_relative '../testsuite'
2
+ require_relative '../collector'
3
3
 
4
4
  module Test
5
5
  module Unit
@@ -1,7 +1,7 @@
1
1
  require 'pathname'
2
2
 
3
- require 'test/unit/testsuite'
4
- require 'test/unit/collector'
3
+ require_relative '../testsuite'
4
+ require_relative '../collector'
5
5
 
6
6
  module Test
7
7
  module Unit
@@ -2,7 +2,7 @@
2
2
  # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
3
3
  # License:: Ruby license.
4
4
 
5
- require 'test/unit/collector'
5
+ require_relative '../collector'
6
6
 
7
7
  module Test
8
8
  module Unit
@@ -7,7 +7,7 @@
7
7
 
8
8
  # just test!!! don't use it yet!!!
9
9
 
10
- require 'test/unit/collector'
10
+ require_relative '../collector'
11
11
 
12
12
  require 'rexml/document'
13
13
  require 'rexml/streamlistener'
@@ -1,4 +1,4 @@
1
- require 'test/unit/color'
1
+ require_relative 'color'
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -1,4 +1,4 @@
1
- require "test/unit/data-sets"
1
+ require_relative "data-sets"
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -4,7 +4,7 @@
4
4
  # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
5
5
  # License:: Ruby license.
6
6
 
7
- require 'test/unit/util/backtracefilter'
7
+ require_relative 'util/backtracefilter'
8
8
 
9
9
  module Test
10
10
  module Unit
@@ -1,4 +1,4 @@
1
- require 'test/unit/util/backtracefilter'
1
+ require_relative 'util/backtracefilter'
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -1,4 +1,4 @@
1
- require 'test/unit/util/backtracefilter'
1
+ require_relative 'util/backtracefilter'
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -1,4 +1,4 @@
1
- require 'test/unit/util/backtracefilter'
1
+ require_relative 'util/backtracefilter'
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -3,13 +3,13 @@
3
3
  module Test
4
4
  module Unit
5
5
  AutoRunner.register_runner(:console) do |auto_runner|
6
- require 'test/unit/ui/console/testrunner'
6
+ require_relative '../ui/console/testrunner'
7
7
  Test::Unit::UI::Console::TestRunner
8
8
  end
9
9
 
10
10
  AutoRunner.setup_option do |auto_runner, opts|
11
- require 'test/unit/ui/console/outputlevel'
12
- require 'test/unit/ui/console/testrunner'
11
+ require_relative '../ui/console/outputlevel'
12
+ require_relative '../ui/console/testrunner'
13
13
 
14
14
  output_levels = [
15
15
  ["silent", UI::Console::OutputLevel::SILENT],
@@ -1,7 +1,7 @@
1
1
  module Test
2
2
  module Unit
3
3
  AutoRunner.register_runner(:emacs) do |auto_runner|
4
- require 'test/unit/ui/emacs/testrunner'
4
+ require_relative '../ui/emacs/testrunner'
5
5
  Test::Unit::UI::Emacs::TestRunner
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  module Test
2
2
  module Unit
3
3
  AutoRunner.register_runner(:xml) do |auto_runner|
4
- require 'test/unit/ui/xml/testrunner'
4
+ require_relative '../ui/xml/testrunner'
5
5
  Test::Unit::UI::XML::TestRunner
6
6
  end
7
7
 
@@ -0,0 +1,16 @@
1
+ #--
2
+ #
3
+ # Author:: Tsutomu Katsube.
4
+ # Copyright:: Copyright (c) 2025 Tsutomu Katsube. All rights reserved.
5
+ # License:: Ruby license.
6
+
7
+ module Test
8
+ module Unit
9
+ class TestRunContext
10
+ attr_reader :runner_class
11
+ def initialize(runner_class)
12
+ @runner_class = runner_class
13
+ end
14
+ end
15
+ end
16
+ end
@@ -5,7 +5,7 @@
5
5
  # * Copyright (c) 2011 Kouhei Sutou <tt><kou@clear-code.com></tt>
6
6
  # License:: Ruby license.
7
7
 
8
- require "test/unit/data-sets"
8
+ require_relative "data-sets"
9
9
 
10
10
  module Test
11
11
  module Unit
@@ -8,13 +8,15 @@
8
8
 
9
9
  require "etc"
10
10
 
11
+ require_relative "test-run-context"
12
+
11
13
  module Test
12
14
  module Unit
13
15
  class TestSuiteRunner
14
16
  @n_workers = Etc.respond_to?(:nprocessors) ? Etc.nprocessors : 1
15
17
  class << self
16
18
  def run_all_tests
17
- yield
19
+ yield(TestRunContext.new(self))
18
20
  end
19
21
 
20
22
  def n_workers
@@ -30,11 +32,11 @@ module Test
30
32
  @test_suite = test_suite
31
33
  end
32
34
 
33
- def run(result, &progress_block)
35
+ def run(result, run_context: nil, &progress_block)
34
36
  yield(TestSuite::STARTED, @test_suite.name)
35
37
  yield(TestSuite::STARTED_OBJECT, @test_suite)
36
38
  run_startup(result)
37
- run_tests(result, &progress_block)
39
+ run_tests(result, run_context: run_context, &progress_block)
38
40
  ensure
39
41
  begin
40
42
  run_shutdown(result)
@@ -55,13 +57,13 @@ module Test
55
57
  end
56
58
  end
57
59
 
58
- def run_tests(result, &progress_block)
60
+ def run_tests(result, run_context: nil, &progress_block)
59
61
  @test_suite.tests.each do |test|
60
- run_test(test, result, &progress_block)
62
+ run_test(test, result, run_context: run_context, &progress_block)
61
63
  end
62
64
  end
63
65
 
64
- def run_test(test, result)
66
+ def run_test(test, result, run_context: nil)
65
67
  finished_is_yielded = false
66
68
  finished_object_is_yielded = false
67
69
  previous_event_name = nil
@@ -91,7 +93,7 @@ module Test
91
93
  end
92
94
 
93
95
  if test.method(:run).arity == -2
94
- test.run(result, runner_class: self.class, &event_listener)
96
+ test.run(result, run_context: run_context, &event_listener)
95
97
  else
96
98
  # For backward compatibility. There are scripts that overrides
97
99
  # Test::Unit::TestCase#run without keyword arguments.
@@ -6,26 +6,29 @@
6
6
 
7
7
  require_relative "sub-test-result"
8
8
  require_relative "test-suite-runner"
9
+ require_relative "test-thread-run-context"
9
10
 
10
11
  module Test
11
12
  module Unit
12
13
  class TestSuiteThreadRunner < TestSuiteRunner
13
- @task_queue = Thread::Queue.new
14
14
  class << self
15
- def task_queue
16
- @task_queue
17
- end
18
-
19
15
  def run_all_tests
20
16
  n_workers = TestSuiteRunner.n_workers
21
17
 
18
+ queue = Thread::Queue.new
19
+ shutdowns = []
20
+ yield(TestThreadRunContext.new(self, queue, shutdowns))
21
+ n_workers.times do
22
+ queue << nil
23
+ end
24
+
22
25
  workers = []
23
26
  sub_exceptions = []
24
27
  n_workers.times do |i|
25
28
  workers << Thread.new(i) do |worker_id|
26
29
  begin
27
30
  loop do
28
- task = @task_queue.pop
31
+ task = queue.pop
29
32
  break if task.nil?
30
33
  catch do |stop_tag|
31
34
  task.call(stop_tag)
@@ -36,31 +39,43 @@ module Test
36
39
  end
37
40
  end
38
41
  end
39
-
40
- yield
41
-
42
- n_workers.times do
43
- @task_queue << nil
44
- end
45
42
  workers.each(&:join)
43
+
44
+ shutdowns.each(&:call)
46
45
  sub_exceptions.each do |exception|
47
46
  raise exception
48
47
  end
49
48
  end
50
49
  end
51
50
 
51
+ def run(result, run_context: nil, &progress_block)
52
+ yield(TestSuite::STARTED, @test_suite.name)
53
+ yield(TestSuite::STARTED_OBJECT, @test_suite)
54
+ run_startup(result)
55
+ run_tests(result, run_context: run_context, &progress_block)
56
+ ensure
57
+ run_context.shutdowns << lambda do
58
+ begin
59
+ run_shutdown(result)
60
+ ensure
61
+ yield(TestSuite::FINISHED, @test_suite.name)
62
+ yield(TestSuite::FINISHED_OBJECT, @test_suite)
63
+ end
64
+ end
65
+ end
66
+
52
67
  private
53
- def run_tests(result, &progress_block)
68
+ def run_tests(result, run_context: nil, &progress_block)
54
69
  @test_suite.tests.each do |test|
55
70
  if test.is_a?(TestSuite) or not @test_suite.parallel_safe?
56
- run_test(test, result, &progress_block)
71
+ run_test(test, result, run_context: run_context, &progress_block)
57
72
  else
58
73
  task = lambda do |stop_tag|
59
74
  sub_result = SubTestResult.new(result)
60
75
  sub_result.stop_tag = stop_tag
61
- run_test(test, sub_result, &progress_block)
76
+ run_test(test, sub_result, run_context: run_context, &progress_block)
62
77
  end
63
- self.class.task_queue << task
78
+ run_context.queue << task
64
79
  end
65
80
  end
66
81
  end
@@ -0,0 +1,20 @@
1
+ #--
2
+ #
3
+ # Author:: Tsutomu Katsube.
4
+ # Copyright:: Copyright (c) 2025 Tsutomu Katsube. All rights reserved.
5
+ # License:: Ruby license.
6
+
7
+ require_relative "test-run-context"
8
+
9
+ module Test
10
+ module Unit
11
+ class TestThreadRunContext < TestRunContext
12
+ attr_reader :queue, :shutdowns
13
+ def initialize(runner_class, queue, shutdowns)
14
+ super(runner_class)
15
+ @queue = queue
16
+ @shutdowns = shutdowns
17
+ end
18
+ end
19
+ end
20
+ end
@@ -6,24 +6,24 @@
6
6
  # * Copyright (c) 2008-2012 Kouhei Sutou <tt><kou@clear-code.com></tt>
7
7
  # License:: Ruby license.
8
8
 
9
- require 'test/unit/attribute'
10
- require 'test/unit/fixture'
11
- require 'test/unit/exception-handler'
12
- require 'test/unit/assertions'
13
- require 'test/unit/failure'
14
- require 'test/unit/error'
15
- require 'test/unit/pending'
16
- require 'test/unit/omission'
17
- require 'test/unit/notification'
18
- require 'test/unit/priority'
19
- require 'test/unit/data'
20
- require 'test/unit/testsuite'
21
- require 'test/unit/test-suite-creator'
22
- require 'test/unit/assertion-failed-error'
23
- require 'test/unit/auto-runner-loader'
24
- require 'test/unit/util/backtracefilter'
25
- require 'test/unit/util/output'
26
- require 'test/unit/util/method-owner-finder'
9
+ require_relative 'attribute'
10
+ require_relative 'fixture'
11
+ require_relative 'exception-handler'
12
+ require_relative 'assertions'
13
+ require_relative 'failure'
14
+ require_relative 'error'
15
+ require_relative 'pending'
16
+ require_relative 'omission'
17
+ require_relative 'notification'
18
+ require_relative 'priority'
19
+ require_relative 'data'
20
+ require_relative 'testsuite'
21
+ require_relative 'test-suite-creator'
22
+ require_relative 'assertion-failed-error'
23
+ require_relative 'auto-runner-loader'
24
+ require_relative 'util/backtracefilter'
25
+ require_relative 'util/output'
26
+ require_relative 'util/method-owner-finder'
27
27
 
28
28
  module Test
29
29
  module Unit
@@ -401,6 +401,14 @@ module Test
401
401
  # end
402
402
  # end
403
403
  #
404
+ # @example Declares that test_do_something_with_ractor uses Ractor in one line
405
+ #
406
+ # ractor def test_do_something_with_ractor
407
+ # Ractor.new do
408
+ # # ...
409
+ # end
410
+ # end
411
+ #
404
412
  # @since 3.4.6
405
413
  def ractor(options={})
406
414
  attribute(:ractor, true, options)
@@ -577,9 +585,11 @@ module Test
577
585
  # Runs the individual test method represented by this
578
586
  # instance of the fixture, collecting statistics, failures
579
587
  # and errors in result.
580
- def run(result, runner_class: nil)
588
+ def run(result, run_context: nil)
581
589
  begin
582
590
  @_result = result
591
+ instance_variables_before = instance_variables
592
+ @internal_data.run_context = run_context
583
593
  @internal_data.test_started
584
594
  yield(STARTED, name)
585
595
  yield(STARTED_OBJECT, self)
@@ -621,6 +631,9 @@ module Test
621
631
  yield(FINISHED_OBJECT, self)
622
632
  ensure
623
633
  # @_result = nil # For test-spec's after_all :<
634
+ (instance_variables - instance_variables_before).each do |name|
635
+ remove_instance_variable(name)
636
+ end
624
637
  end
625
638
  end
626
639
 
@@ -856,6 +869,11 @@ module Test
856
869
  @internal_data.problem_occurred
857
870
  end
858
871
 
872
+ # Returns test suite runner class for easy to test.
873
+ def runner_class
874
+ @internal_data.run_context.runner_class
875
+ end
876
+
859
877
  # Notify that the test is passed. Normally, it is not needed
860
878
  # because #run calls it automatically. If you want to override
861
879
  # #run, it is not a good idea. Please contact test-unit
@@ -916,6 +934,7 @@ module Test
916
934
  class InternalData
917
935
  attr_reader :start_time, :elapsed_time
918
936
  attr_reader :test_data_label, :test_data
937
+ attr_accessor :run_context
919
938
  def initialize
920
939
  @start_time = nil
921
940
  @elapsed_time = nil
@@ -923,6 +942,7 @@ module Test
923
942
  @interrupted = false
924
943
  @test_data_label = nil
925
944
  @test_data = nil
945
+ @run_context = nil
926
946
  end
927
947
 
928
948
  def passed?
@@ -3,12 +3,12 @@
3
3
  # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
4
4
  # License:: Ruby license.
5
5
 
6
- require 'test/unit/util/observable'
7
- require 'test/unit/failure'
8
- require 'test/unit/error'
9
- require 'test/unit/omission'
10
- require 'test/unit/pending'
11
- require 'test/unit/notification'
6
+ require_relative 'util/observable'
7
+ require_relative 'failure'
8
+ require_relative 'error'
9
+ require_relative 'omission'
10
+ require_relative 'pending'
11
+ require_relative 'notification'
12
12
 
13
13
  module Test
14
14
  module Unit
@@ -76,7 +76,7 @@ module Test
76
76
  *@summary_generators.collect {|generator| __send__(generator)}].join(", ")
77
77
  end
78
78
 
79
- # Returnes a string that shows result status.
79
+ # Returns a string that shows result status.
80
80
  def status
81
81
  if passed?
82
82
  if pending_count > 0
@@ -5,7 +5,7 @@
5
5
  # Copyright:: Copyright (c) 2008-2011 Kouhei Sutou. All rights reserved.
6
6
  # License:: Ruby license.
7
7
 
8
- require 'test/unit/error'
8
+ require_relative 'error'
9
9
  require_relative 'test-suite-runner'
10
10
 
11
11
  module Test
@@ -47,9 +47,13 @@ module Test
47
47
 
48
48
  # Runs the tests and/or suites contained in this
49
49
  # TestSuite.
50
- def run(result, runner_class: nil, &progress_block)
51
- runner_class ||= TestSuiteRunner
52
- runner_class.new(self).run(result) do |event, *args|
50
+ def run(result, run_context: nil, &progress_block)
51
+ if run_context
52
+ runner_class = run_context.runner_class
53
+ else
54
+ runner_class = TestSuiteRunner
55
+ end
56
+ runner_class.new(self).run(result, run_context: run_context) do |event, *args|
53
57
  case event
54
58
  when STARTED
55
59
  @start_time = Time.now
@@ -12,13 +12,13 @@ rescue LoadError
12
12
  end
13
13
  require "pathname"
14
14
 
15
- require 'test/unit/color-scheme'
16
- require 'test/unit/code-snippet-fetcher'
17
- require 'test/unit/fault-location-detector'
18
- require 'test/unit/diff'
19
- require 'test/unit/ui/testrunner'
20
- require 'test/unit/ui/testrunnermediator'
21
- require 'test/unit/ui/console/outputlevel'
15
+ require_relative '../../color-scheme'
16
+ require_relative '../../code-snippet-fetcher'
17
+ require_relative '../../fault-location-detector'
18
+ require_relative '../../diff'
19
+ require_relative '../testrunner'
20
+ require_relative '../testrunnermediator'
21
+ require_relative 'outputlevel'
22
22
 
23
23
  module Test
24
24
  module Unit
@@ -1,4 +1,4 @@
1
- require 'test/unit/ui/console/testrunner'
1
+ require_relative '../console/testrunner'
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -1,4 +1,4 @@
1
- require 'test/unit/ui/testrunnerutilities'
1
+ require_relative 'testrunnerutilities'
2
2
 
3
3
  module Test
4
4
  module Unit
@@ -4,8 +4,8 @@
4
4
  # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
5
5
  # License:: Ruby license.
6
6
 
7
- require 'test/unit/util/observable'
8
- require 'test/unit/testresult'
7
+ require_relative '../util/observable'
8
+ require_relative '../testresult'
9
9
 
10
10
  module Test
11
11
  module Unit
@@ -40,13 +40,13 @@ module Test
40
40
  start_time = Time.now
41
41
  begin
42
42
  with_listener(result) do
43
- @test_suite_runner_class.run_all_tests do
43
+ @test_suite_runner_class.run_all_tests do |run_context|
44
44
  catch do |stop_tag|
45
45
  result.stop_tag = stop_tag
46
46
  notify_listeners(RESET, @suite.size)
47
47
  notify_listeners(STARTED, result)
48
48
 
49
- run_suite(result)
49
+ run_suite(result, run_context)
50
50
  end
51
51
  end
52
52
  end
@@ -65,11 +65,11 @@ module Test
65
65
  #
66
66
  # See GitHub#38
67
67
  # https://github.com/test-unit/test-unit/issues/38
68
- def run_suite(result=nil)
68
+ def run_suite(result=nil, run_context=nil)
69
69
  if result.nil?
70
70
  run
71
71
  else
72
- @suite.run(result, runner_class: @test_suite_runner_class) do |channel, value|
72
+ @suite.run(result, run_context: run_context) do |channel, value|
73
73
  notify_listeners(channel, value)
74
74
  end
75
75
  end
@@ -7,8 +7,9 @@
7
7
 
8
8
  require 'erb'
9
9
  require 'time'
10
- require 'test/unit/ui/testrunner'
11
- require 'test/unit/ui/testrunnermediator'
10
+
11
+ require_relative '../testrunner'
12
+ require_relative '../testrunnermediator'
12
13
 
13
14
  module Test
14
15
  module Unit
@@ -4,7 +4,7 @@
4
4
  # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
5
5
  # License:: Ruby license.
6
6
 
7
- require 'test/unit/util/procwrapper'
7
+ require_relative 'procwrapper'
8
8
 
9
9
  module Test
10
10
  module Unit
@@ -1,5 +1,5 @@
1
1
  module Test
2
2
  module Unit
3
- VERSION = "3.6.7"
3
+ VERSION = "3.6.9"
4
4
  end
5
5
  end
data/lib/test/unit.rb CHANGED
@@ -1,7 +1,7 @@
1
- require "test/unit/warning"
1
+ require_relative "unit/warning"
2
2
 
3
- require 'test/unit/testcase'
4
- require 'test/unit/autorunner'
3
+ require_relative 'unit/testcase'
4
+ require_relative 'unit/autorunner'
5
5
 
6
6
  module Test # :nodoc:
7
7
  #
@@ -28,7 +28,7 @@ module Test # :nodoc:
28
28
  #
29
29
  # ## Notes
30
30
  #
31
- # Test::Unit has grown out of and superceded Lapidary.
31
+ # Test::Unit has grown out of and superseded Lapidary.
32
32
  #
33
33
  #
34
34
  # ## Feedback
@@ -69,7 +69,7 @@ module Test # :nodoc:
69
69
  # Masaki Suketa, for his work on RubyUnit, which filled a vital need in
70
70
  # the Ruby world for a very long time. I'm also grateful for his help in
71
71
  # polishing Test::Unit and getting the RubyUnit compatibility layer
72
- # right. His graciousness in allowing Test::Unit to supercede RubyUnit
72
+ # right. His graciousness in allowing Test::Unit to supersede RubyUnit
73
73
  # continues to be a challenge to me to be more willing to defer my own
74
74
  # rights.
75
75
  #
@@ -109,7 +109,7 @@ module Test # :nodoc:
109
109
  #
110
110
  # This software is provided "as is" and without any express or
111
111
  # implied warranties, including, without limitation, the implied
112
- # warranties of merchantibility and fitness for a particular
112
+ # warranties of merchantability and fitness for a particular
113
113
  # purpose.
114
114
  #
115
115
  #
data/lib/test-unit.rb CHANGED
@@ -1,11 +1,22 @@
1
1
  # Copyright (C) 2012-2015 Kouhei Sutou <kou@clear-code.com>
2
2
 
3
- require "test/unit/warning"
3
+ require_relative "test/unit/warning"
4
4
 
5
5
  module Test
6
6
  module Unit
7
- autoload :TestCase, "test/unit/testcase"
8
- autoload :AutoRunner, "test/unit/autorunner"
7
+ class << self
8
+ def const_missing(name)
9
+ case name
10
+ when :AutoRunner, :TestCase
11
+ require_relative "test/unit/autorunner"
12
+ require_relative "test/unit/testcase"
13
+ singleton_class.remove_method(:const_missing)
14
+ const_get(name)
15
+ else
16
+ super
17
+ end
18
+ end
19
+ end
9
20
  end
10
21
  end
11
22
 
@@ -14,6 +25,6 @@ unless respond_to?(:run_test, true)
14
25
  # Is this API OK or dirty?
15
26
  def run_test
16
27
  self.class.send(:undef_method, :run_test)
17
- require "test/unit"
28
+ require_relative "test/unit"
18
29
  end
19
30
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-unit
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.7
4
+ version: 3.6.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouhei Sutou
8
8
  - Haruka Yoshihara
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2024-12-17 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: power_assert
@@ -33,7 +32,8 @@ description: |-
33
32
  email:
34
33
  - kou@cozmixng.org
35
34
  - yoshihara@clear-code.com
36
- executables: []
35
+ executables:
36
+ - test-unit
37
37
  extensions: []
38
38
  extra_rdoc_files: []
39
39
  files:
@@ -42,6 +42,7 @@ files:
42
42
  - PSFL
43
43
  - README.md
44
44
  - Rakefile
45
+ - bin/test-unit
45
46
  - doc/text/getting-started.md
46
47
  - doc/text/how-to.md
47
48
  - doc/text/news.md
@@ -78,9 +79,11 @@ files:
78
79
  - lib/test/unit/runner/emacs.rb
79
80
  - lib/test/unit/runner/xml.rb
80
81
  - lib/test/unit/sub-test-result.rb
82
+ - lib/test/unit/test-run-context.rb
81
83
  - lib/test/unit/test-suite-creator.rb
82
84
  - lib/test/unit/test-suite-runner.rb
83
85
  - lib/test/unit/test-suite-thread-runner.rb
86
+ - lib/test/unit/test-thread-run-context.rb
84
87
  - lib/test/unit/testcase.rb
85
88
  - lib/test/unit/testresult.rb
86
89
  - lib/test/unit/testsuite.rb
@@ -113,7 +116,6 @@ metadata:
113
116
  source_code_uri: https://github.com/test-unit/test-unit
114
117
  documentation_uri: https://test-unit.github.io/test-unit/en/
115
118
  bug_tracker_uri: https://github.com/test-unit/test-unit/issues
116
- post_install_message:
117
119
  rdoc_options: []
118
120
  require_paths:
119
121
  - lib
@@ -128,8 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
130
  - !ruby/object:Gem::Version
129
131
  version: '0'
130
132
  requirements: []
131
- rubygems_version: 3.5.22
132
- signing_key:
133
+ rubygems_version: 3.6.7
133
134
  specification_version: 4
134
135
  summary: An xUnit family unit testing framework for Ruby.
135
136
  test_files: []