minitest 5.20.0 → 5.25.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +130 -3
- data/Manifest.txt +3 -0
- data/README.rdoc +16 -13
- data/Rakefile +6 -0
- data/lib/hoe/minitest.rb +2 -1
- data/lib/minitest/assertions.rb +77 -80
- data/lib/minitest/autorun.rb +0 -7
- data/lib/minitest/benchmark.rb +6 -9
- data/lib/minitest/compress.rb +94 -0
- data/lib/minitest/error_on_warning.rb +11 -0
- data/lib/minitest/manual_plugins.rb +16 -0
- data/lib/minitest/mock.rb +17 -15
- data/lib/minitest/parallel.rb +5 -5
- data/lib/minitest/pride_plugin.rb +16 -23
- data/lib/minitest/spec.rb +5 -5
- data/lib/minitest/test.rb +14 -25
- data/lib/minitest/test_task.rb +17 -12
- data/lib/minitest.rb +257 -144
- data/test/minitest/metametameta.rb +32 -18
- data/test/minitest/test_minitest_assertions.rb +159 -140
- data/test/minitest/test_minitest_benchmark.rb +1 -1
- data/test/minitest/test_minitest_mock.rb +80 -75
- data/test/minitest/test_minitest_reporter.rb +111 -16
- data/test/minitest/test_minitest_spec.rb +54 -55
- data/test/minitest/test_minitest_test.rb +191 -117
- data/test/minitest/test_minitest_test_task.rb +18 -7
- data.tar.gz.sig +0 -0
- metadata +17 -13
- metadata.gz.sig +0 -0
data/lib/minitest/mock.rb
CHANGED
@@ -8,9 +8,9 @@ module Minitest # :nodoc:
|
|
8
8
|
# All mock objects are an instance of Mock
|
9
9
|
|
10
10
|
class Mock
|
11
|
-
alias
|
11
|
+
alias __respond_to? respond_to?
|
12
12
|
|
13
|
-
overridden_methods = %
|
13
|
+
overridden_methods = %i[
|
14
14
|
===
|
15
15
|
class
|
16
16
|
inspect
|
@@ -23,8 +23,10 @@ module Minitest # :nodoc:
|
|
23
23
|
to_s
|
24
24
|
]
|
25
25
|
|
26
|
+
overridden_methods << :singleton_method_added if defined?(::DEBUGGER__)
|
27
|
+
|
26
28
|
instance_methods.each do |m|
|
27
|
-
undef_method m unless overridden_methods.include?(m
|
29
|
+
undef_method m unless overridden_methods.include?(m) || m =~ /^__/
|
28
30
|
end
|
29
31
|
|
30
32
|
overridden_methods.map(&:to_sym).each do |method_id|
|
@@ -91,7 +93,7 @@ module Minitest # :nodoc:
|
|
91
93
|
def expect name, retval, args = [], **kwargs, &blk
|
92
94
|
name = name.to_sym
|
93
95
|
|
94
|
-
if
|
96
|
+
if blk then
|
95
97
|
raise ArgumentError, "args ignored when block given" unless args.empty?
|
96
98
|
raise ArgumentError, "kwargs ignored when block given" unless kwargs.empty?
|
97
99
|
@expected_calls[name] << { :retval => retval, :block => blk }
|
@@ -104,7 +106,7 @@ module Minitest # :nodoc:
|
|
104
106
|
kwargs = args.pop
|
105
107
|
else
|
106
108
|
unless @@KW_WARNED then
|
107
|
-
from = caller.first
|
109
|
+
from = caller(1..1).first
|
108
110
|
warn "Using MT_KWARGS_HAC\K yet passing kwargs. From #{from}"
|
109
111
|
@@KW_WARNED = true
|
110
112
|
end
|
@@ -139,7 +141,7 @@ module Minitest # :nodoc:
|
|
139
141
|
|
140
142
|
def verify
|
141
143
|
@expected_calls.each do |name, expected|
|
142
|
-
actual = @actual_calls.fetch
|
144
|
+
actual = @actual_calls.fetch name, nil # defaults to []
|
143
145
|
raise MockExpectationError, "expected #{__call name, expected[0]}" unless actual
|
144
146
|
raise MockExpectationError, "expected #{__call name, expected[actual.size]}, got [#{__call name, actual}]" if
|
145
147
|
actual.size < expected.size
|
@@ -148,7 +150,7 @@ module Minitest # :nodoc:
|
|
148
150
|
end
|
149
151
|
|
150
152
|
def method_missing sym, *args, **kwargs, &block # :nodoc:
|
151
|
-
unless @expected_calls.key?
|
153
|
+
unless @expected_calls.key? sym then
|
152
154
|
if @delegator && @delegator.respond_to?(sym)
|
153
155
|
if kwargs.empty? then # FIX: drop this after 2.7 dead
|
154
156
|
return @delegator.public_send(sym, *args, &block)
|
@@ -170,9 +172,9 @@ module Minitest # :nodoc:
|
|
170
172
|
end
|
171
173
|
|
172
174
|
expected_args, expected_kwargs, retval, val_block =
|
173
|
-
expected_call.values_at
|
175
|
+
expected_call.values_at :args, :kwargs, :retval, :block
|
174
176
|
|
175
|
-
expected_kwargs = kwargs.
|
177
|
+
expected_kwargs = kwargs.to_h { |ak, av| [ak, Object] } if
|
176
178
|
Hash == expected_kwargs
|
177
179
|
|
178
180
|
if val_block then
|
@@ -195,7 +197,7 @@ module Minitest # :nodoc:
|
|
195
197
|
[sym, expected_kwargs.size, kwargs]
|
196
198
|
end
|
197
199
|
|
198
|
-
zipped_args = expected_args.zip
|
200
|
+
zipped_args = expected_args.zip args
|
199
201
|
fully_matched = zipped_args.all? { |mod, a|
|
200
202
|
mod === a or mod == a
|
201
203
|
}
|
@@ -210,10 +212,10 @@ module Minitest # :nodoc:
|
|
210
212
|
raise MockExpectationError, fmt % [sym, expected_kwargs.keys, kwargs.keys]
|
211
213
|
end
|
212
214
|
|
213
|
-
zipped_kwargs = expected_kwargs.
|
215
|
+
zipped_kwargs = expected_kwargs.to_h { |ek, ev|
|
214
216
|
av = kwargs[ek]
|
215
217
|
[ek, [ev, av]]
|
216
|
-
}
|
218
|
+
}
|
217
219
|
|
218
220
|
fully_matched = zipped_kwargs.all? { |ek, (ev, av)|
|
219
221
|
ev === av or ev == av
|
@@ -226,8 +228,8 @@ module Minitest # :nodoc:
|
|
226
228
|
|
227
229
|
@actual_calls[sym] << {
|
228
230
|
:retval => retval,
|
229
|
-
:args
|
230
|
-
:kwargs => zipped_kwargs.
|
231
|
+
:args => zipped_args.map { |e, a| e === a ? e : a },
|
232
|
+
:kwargs => zipped_kwargs.to_h { |k, (e, a)| [k, e === a ? e : a] },
|
231
233
|
}
|
232
234
|
|
233
235
|
retval
|
@@ -236,7 +238,7 @@ module Minitest # :nodoc:
|
|
236
238
|
def respond_to? sym, include_private = false # :nodoc:
|
237
239
|
return true if @expected_calls.key? sym.to_sym
|
238
240
|
return true if @delegator && @delegator.respond_to?(sym, include_private)
|
239
|
-
__respond_to?
|
241
|
+
__respond_to? sym, include_private
|
240
242
|
end
|
241
243
|
end
|
242
244
|
end
|
data/lib/minitest/parallel.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Minitest
|
2
|
-
module Parallel
|
2
|
+
module Parallel # :nodoc:
|
3
3
|
|
4
4
|
##
|
5
5
|
# The engine used to run multiple tests in parallel.
|
@@ -16,7 +16,7 @@ module Minitest
|
|
16
16
|
|
17
17
|
def initialize size
|
18
18
|
@size = size
|
19
|
-
@queue = Queue.new
|
19
|
+
@queue = Thread::Queue.new
|
20
20
|
@pool = nil
|
21
21
|
end
|
22
22
|
|
@@ -24,10 +24,10 @@ module Minitest
|
|
24
24
|
# Start the executor
|
25
25
|
|
26
26
|
def start
|
27
|
-
@pool = size
|
28
|
-
Thread.new
|
27
|
+
@pool = Array.new(size) {
|
28
|
+
Thread.new @queue do |queue|
|
29
29
|
Thread.current.abort_on_exception = true
|
30
|
-
while
|
30
|
+
while job = queue.pop do
|
31
31
|
klass, method, reporter = job
|
32
32
|
reporter.synchronize { reporter.prerecord klass, method }
|
33
33
|
result = Minitest.run_one_method klass, method
|
@@ -8,13 +8,13 @@ module Minitest
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.plugin_pride_init options # :nodoc:
|
11
|
-
|
12
|
-
klass = ENV["TERM"] =~ /^xterm|-256color$/ ? PrideLOL : PrideIO
|
13
|
-
io = klass.new options[:io]
|
11
|
+
return unless PrideIO.pride?
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
klass = ENV["TERM"] =~ /^xterm|-256color$/ ? PrideLOL : PrideIO
|
14
|
+
io = klass.new options[:io]
|
15
|
+
|
16
|
+
self.reporter.reporters.grep(Minitest::Reporter).each do |rep|
|
17
|
+
rep.io = io if rep.io.tty?
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -59,12 +59,10 @@ module Minitest
|
|
59
59
|
|
60
60
|
def print o
|
61
61
|
case o
|
62
|
-
when "." then
|
62
|
+
when ".", "S" then
|
63
63
|
io.print pride o
|
64
64
|
when "E", "F" then
|
65
65
|
io.print "#{ESC}41m#{ESC}37m#{o}#{NND}"
|
66
|
-
when "S" then
|
67
|
-
io.print pride o
|
68
66
|
else
|
69
67
|
io.print o
|
70
68
|
end
|
@@ -72,11 +70,9 @@ module Minitest
|
|
72
70
|
|
73
71
|
def puts *o # :nodoc:
|
74
72
|
o.map! { |s|
|
75
|
-
s.to_s.sub(
|
73
|
+
s.to_s.sub("Finished") {
|
76
74
|
@index = 0
|
77
|
-
"Fabulous run".
|
78
|
-
pride(c)
|
79
|
-
}.join
|
75
|
+
"Fabulous run".chars.map { |c| pride(c) }.join
|
80
76
|
}
|
81
77
|
}
|
82
78
|
|
@@ -113,19 +109,16 @@ module Minitest
|
|
113
109
|
#
|
114
110
|
# plot (3*sin(x)+3), (3*sin(x+2*pi/3)+3), (3*sin(x+4*pi/3)+3)
|
115
111
|
|
116
|
-
|
117
|
-
|
118
|
-
n *= 1.0 / 6
|
112
|
+
@colors = Array.new(6 * 7) { |n|
|
113
|
+
n *= 1.0 / 3
|
119
114
|
r = (3 * Math.sin(n ) + 3).to_i
|
120
|
-
g = (3 * Math.sin(n +
|
121
|
-
b = (3 * Math.sin(n +
|
122
|
-
|
123
|
-
# Then we take rgb and encode them in a single number using base 6.
|
124
|
-
# For some mysterious reason, we add 16... to clear the bottom 4 bits?
|
125
|
-
# Yes... they're ugly.
|
115
|
+
g = (3 * Math.sin(n + 4 * PI_3) + 3).to_i
|
116
|
+
b = (3 * Math.sin(n + 2 * PI_3) + 3).to_i
|
126
117
|
|
118
|
+
# Then we take rgb and encode them in a single number using
|
119
|
+
# base 6, shifted by 16 for the base 16 ansi colors.
|
127
120
|
36 * r + 6 * g + b + 16
|
128
|
-
}
|
121
|
+
}.rotate(4) # puts "red" first
|
129
122
|
|
130
123
|
super
|
131
124
|
end
|
data/lib/minitest/spec.rb
CHANGED
@@ -4,11 +4,11 @@ class Module # :nodoc:
|
|
4
4
|
def infect_an_assertion meth, new_name, dont_flip = false # :nodoc:
|
5
5
|
block = dont_flip == :block
|
6
6
|
dont_flip = false if block
|
7
|
-
target_obj = block ?
|
7
|
+
target_obj = block ? "_{obj.method}" : "_(obj)"
|
8
8
|
|
9
9
|
# https://eregon.me/blog/2021/02/13/correct-delegation-in-ruby-2-27-3.html
|
10
10
|
# Drop this when we can drop ruby 2.6 (aka after rails 6.1 EOL, ~2024-06)
|
11
|
-
kw_extra = "ruby2_keywords %p" % [new_name] if respond_to?
|
11
|
+
kw_extra = "ruby2_keywords %p" % [new_name] if respond_to? :ruby2_keywords, true
|
12
12
|
|
13
13
|
# warn "%-22p -> %p %p" % [meth, new_name, dont_flip]
|
14
14
|
self.class_eval <<-EOM, __FILE__, __LINE__ + 1
|
@@ -249,7 +249,7 @@ class Minitest::Spec < Minitest::Test
|
|
249
249
|
pre, post = "let '#{name}' cannot ", ". Please use another name."
|
250
250
|
methods = Minitest::Spec.instance_methods.map(&:to_s) - %w[subject]
|
251
251
|
raise ArgumentError, "#{pre}begin with 'test'#{post}" if
|
252
|
-
name
|
252
|
+
name.start_with? "test"
|
253
253
|
raise ArgumentError, "#{pre}override a method in Minitest::Spec#{post}" if
|
254
254
|
methods.include? name
|
255
255
|
|
@@ -268,7 +268,7 @@ class Minitest::Spec < Minitest::Test
|
|
268
268
|
end
|
269
269
|
|
270
270
|
def create name, desc # :nodoc:
|
271
|
-
cls = Class.new
|
271
|
+
cls = Class.new self do
|
272
272
|
@name = name
|
273
273
|
@desc = desc
|
274
274
|
|
@@ -289,7 +289,7 @@ class Minitest::Spec < Minitest::Test
|
|
289
289
|
end
|
290
290
|
|
291
291
|
attr_reader :desc # :nodoc:
|
292
|
-
alias
|
292
|
+
alias specify it
|
293
293
|
|
294
294
|
##
|
295
295
|
# Rdoc... why are you so dumb?
|
data/lib/minitest/test.rb
CHANGED
@@ -52,9 +52,10 @@ module Minitest
|
|
52
52
|
end
|
53
53
|
|
54
54
|
##
|
55
|
-
# Call this at the top of your tests
|
56
|
-
#
|
57
|
-
#
|
55
|
+
# Call this at the top of your tests (inside the +Minitest::Test+
|
56
|
+
# subclass or +describe+ block) when you want to run your tests in
|
57
|
+
# parallel. In doing so, you're admitting that you rule and your
|
58
|
+
# tests are awesome.
|
58
59
|
|
59
60
|
def self.parallelize_me!
|
60
61
|
include Minitest::Parallel::Test
|
@@ -84,20 +85,18 @@ module Minitest
|
|
84
85
|
# Runs a single test with setup/teardown hooks.
|
85
86
|
|
86
87
|
def run
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
self.send hook
|
92
|
-
end
|
93
|
-
|
94
|
-
self.send self.name
|
88
|
+
time_it do
|
89
|
+
capture_exceptions do
|
90
|
+
SETUP_METHODS.each do |hook|
|
91
|
+
self.send hook
|
95
92
|
end
|
96
93
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
94
|
+
self.send self.name
|
95
|
+
end
|
96
|
+
|
97
|
+
TEARDOWN_METHODS.each do |hook|
|
98
|
+
capture_exceptions do
|
99
|
+
self.send hook
|
101
100
|
end
|
102
101
|
end
|
103
102
|
end
|
@@ -229,16 +228,6 @@ module Minitest
|
|
229
228
|
ne
|
230
229
|
end
|
231
230
|
|
232
|
-
def with_info_handler &block # :nodoc:
|
233
|
-
t0 = Minitest.clock_time
|
234
|
-
|
235
|
-
handler = lambda do
|
236
|
-
warn "\nCurrent: %s#%s %.2fs" % [self.class, self.name, Minitest.clock_time - t0]
|
237
|
-
end
|
238
|
-
|
239
|
-
self.class.on_signal ::Minitest.info_signal, handler, &block
|
240
|
-
end
|
241
|
-
|
242
231
|
include LifecycleHooks
|
243
232
|
include Guard
|
244
233
|
extend Guard
|
data/lib/minitest/test_task.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
require "shellwords"
|
2
2
|
require "rbconfig"
|
3
|
-
|
3
|
+
|
4
|
+
begin
|
5
|
+
require "rake/tasklib"
|
6
|
+
rescue LoadError => e
|
7
|
+
warn e.message
|
8
|
+
return
|
9
|
+
end
|
4
10
|
|
5
11
|
module Minitest # :nodoc:
|
6
12
|
|
@@ -114,7 +120,7 @@ module Minitest # :nodoc:
|
|
114
120
|
self.test_globs = ["test/**/test_*.rb",
|
115
121
|
"test/**/*_test.rb"]
|
116
122
|
self.test_prelude = nil
|
117
|
-
self.verbose = Rake.application.options.trace
|
123
|
+
self.verbose = Rake.application.options.trace || Rake.verbose == true
|
118
124
|
self.warning = true
|
119
125
|
end
|
120
126
|
|
@@ -144,7 +150,7 @@ module Minitest # :nodoc:
|
|
144
150
|
ENV["N"] && ENV["N"].to_i > 0
|
145
151
|
|
146
152
|
lib_extras = (ENV["MT_LIB_EXTRAS"] || "").split File::PATH_SEPARATOR
|
147
|
-
self.libs[0,0] = lib_extras
|
153
|
+
self.libs[0, 0] = lib_extras
|
148
154
|
|
149
155
|
extra_args << "-n" << ENV["N"] if ENV["N"]
|
150
156
|
extra_args << "-e" << ENV["X"] if ENV["X"]
|
@@ -163,7 +169,7 @@ module Minitest # :nodoc:
|
|
163
169
|
def define # :nodoc:
|
164
170
|
desc "Run the test suite. Use N, X, A, and TESTOPTS to add flags/args."
|
165
171
|
task name do
|
166
|
-
ruby make_test_cmd, verbose:verbose
|
172
|
+
ruby make_test_cmd, verbose: verbose
|
167
173
|
end
|
168
174
|
|
169
175
|
desc "Print out the test command. Good for profiling and other tools."
|
@@ -177,7 +183,7 @@ module Minitest # :nodoc:
|
|
177
183
|
|
178
184
|
# 3 seems to be the magic number... (tho not by that much)
|
179
185
|
bad, good, n = {}, [], (ENV.delete("K") || 3).to_i
|
180
|
-
file = ENV.delete
|
186
|
+
file = ENV.delete "F"
|
181
187
|
times = {}
|
182
188
|
|
183
189
|
tt0 = Time.now
|
@@ -238,7 +244,7 @@ module Minitest # :nodoc:
|
|
238
244
|
|
239
245
|
task "#{name}:deps" => "#{name}:isolated" # now just an alias
|
240
246
|
|
241
|
-
desc "
|
247
|
+
desc "Run the test suite and report the slowest 25 tests."
|
242
248
|
task "#{name}:slow" do
|
243
249
|
sh ["rake #{name} A=-v",
|
244
250
|
"egrep '#test_.* s = .'",
|
@@ -262,11 +268,11 @@ module Minitest # :nodoc:
|
|
262
268
|
runner = runner.join "; "
|
263
269
|
|
264
270
|
args = []
|
265
|
-
args << "-I#{libs.join
|
271
|
+
args << "-I#{libs.join File::PATH_SEPARATOR}" unless libs.empty?
|
266
272
|
args << "-w" if warning
|
267
|
-
args <<
|
273
|
+
args << "-e"
|
268
274
|
args << "'#{runner}'"
|
269
|
-
args <<
|
275
|
+
args << "--"
|
270
276
|
args << extra_args.map(&:shellescape)
|
271
277
|
|
272
278
|
args.join " "
|
@@ -287,11 +293,10 @@ class Work < Queue # :nodoc:
|
|
287
293
|
end
|
288
294
|
|
289
295
|
class Integer # :nodoc:
|
290
|
-
def threads_do
|
291
|
-
require "thread"
|
296
|
+
def threads_do jobs # :nodoc:
|
292
297
|
q = Work.new jobs
|
293
298
|
|
294
|
-
self
|
299
|
+
Array.new(self) {
|
295
300
|
Thread.new do
|
296
301
|
while job = q.pop # go until quit value
|
297
302
|
yield job
|