minitest 5.26.0 → 6.0.0
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 +95 -0
- data/Manifest.txt +13 -4
- data/README.rdoc +18 -98
- data/Rakefile +7 -1
- data/bin/minitest +5 -0
- data/design_rationale.rb +21 -19
- data/lib/hoe/minitest.rb +2 -1
- data/lib/minitest/assertions.rb +34 -66
- data/lib/minitest/autorun.rb +3 -4
- data/lib/minitest/benchmark.rb +2 -2
- data/lib/minitest/bisect.rb +306 -0
- data/lib/minitest/complete.rb +56 -0
- data/lib/minitest/find_minimal_combination.rb +127 -0
- data/lib/minitest/hell.rb +1 -1
- data/lib/minitest/manual_plugins.rb +4 -16
- data/lib/minitest/parallel.rb +5 -3
- data/lib/minitest/path_expander.rb +418 -0
- data/lib/minitest/pride.rb +2 -2
- data/lib/minitest/pride_plugin.rb +1 -1
- data/lib/minitest/server.rb +45 -0
- data/lib/minitest/server_plugin.rb +84 -0
- data/lib/minitest/spec.rb +5 -33
- data/lib/minitest/sprint.rb +104 -0
- data/lib/minitest/sprint_plugin.rb +39 -0
- data/lib/minitest/test.rb +7 -13
- data/lib/minitest/test_task.rb +6 -13
- data/lib/minitest.rb +86 -101
- data/test/minitest/metametameta.rb +1 -1
- data/test/minitest/test_bisect.rb +235 -0
- data/test/minitest/test_find_minimal_combination.rb +138 -0
- data/test/minitest/test_minitest_assertions.rb +48 -105
- data/test/minitest/test_minitest_reporter.rb +6 -5
- data/test/minitest/test_minitest_spec.rb +52 -118
- data/test/minitest/test_minitest_test.rb +21 -100
- data/test/minitest/test_path_expander.rb +229 -0
- data/test/minitest/test_server.rb +149 -0
- data.tar.gz.sig +1 -2
- metadata +50 -17
- metadata.gz.sig +2 -2
- data/.autotest +0 -34
- data/lib/minitest/mock.rb +0 -347
- data/lib/minitest/unit.rb +0 -42
- data/test/minitest/test_minitest_mock.rb +0 -1218
data/lib/minitest/mock.rb
DELETED
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
class MockExpectationError < StandardError; end # :nodoc:
|
|
2
|
-
|
|
3
|
-
module Minitest # :nodoc:
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
# A simple and clean mock object framework.
|
|
7
|
-
#
|
|
8
|
-
# All mock objects are an instance of Mock
|
|
9
|
-
|
|
10
|
-
class Mock
|
|
11
|
-
alias __respond_to? respond_to?
|
|
12
|
-
|
|
13
|
-
overridden_methods = %i[
|
|
14
|
-
===
|
|
15
|
-
class
|
|
16
|
-
inspect
|
|
17
|
-
instance_eval
|
|
18
|
-
instance_variables
|
|
19
|
-
object_id
|
|
20
|
-
public_send
|
|
21
|
-
respond_to_missing?
|
|
22
|
-
send
|
|
23
|
-
to_s
|
|
24
|
-
]
|
|
25
|
-
|
|
26
|
-
overridden_methods << :singleton_method_added if defined?(::DEBUGGER__)
|
|
27
|
-
|
|
28
|
-
instance_methods.each do |m|
|
|
29
|
-
undef_method m unless overridden_methods.include?(m) || m =~ /^__/
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
overridden_methods.map(&:to_sym).each do |method_id|
|
|
33
|
-
old_w, $-w = $-w, nil
|
|
34
|
-
define_method method_id do |*args, **kwargs, &b|
|
|
35
|
-
if @expected_calls.key? method_id then
|
|
36
|
-
if kwargs.empty? then # FIX: drop this after 2.7 dead
|
|
37
|
-
method_missing(method_id, *args, &b)
|
|
38
|
-
else
|
|
39
|
-
method_missing(method_id, *args, **kwargs, &b)
|
|
40
|
-
end
|
|
41
|
-
else
|
|
42
|
-
if kwargs.empty? then # FIX: drop this after 2.7 dead
|
|
43
|
-
super(*args, &b)
|
|
44
|
-
else
|
|
45
|
-
super(*args, **kwargs, &b)
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
ensure
|
|
50
|
-
$-w = old_w
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def initialize delegator = nil # :nodoc:
|
|
54
|
-
@delegator = delegator
|
|
55
|
-
@expected_calls = Hash.new { |calls, name| calls[name] = [] }
|
|
56
|
-
@actual_calls = Hash.new { |calls, name| calls[name] = [] }
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
@@KW_WARNED = false # :nodoc:
|
|
60
|
-
|
|
61
|
-
##
|
|
62
|
-
# Expect that method +name+ is called, optionally with +args+ (and
|
|
63
|
-
# +kwargs+ or a +blk+), and returns +retval+.
|
|
64
|
-
#
|
|
65
|
-
# @mock.expect(:meaning_of_life, 42)
|
|
66
|
-
# @mock.meaning_of_life # => 42
|
|
67
|
-
#
|
|
68
|
-
# @mock.expect(:do_something_with, true, [some_obj, true])
|
|
69
|
-
# @mock.do_something_with(some_obj, true) # => true
|
|
70
|
-
#
|
|
71
|
-
# @mock.expect(:do_something_else, true) do |a1, a2|
|
|
72
|
-
# a1 == "buggs" && a2 == :bunny
|
|
73
|
-
# end
|
|
74
|
-
#
|
|
75
|
-
# +args+ is compared to the expected args using case equality (ie, the
|
|
76
|
-
# '===' operator), allowing for less specific expectations.
|
|
77
|
-
#
|
|
78
|
-
# @mock.expect(:uses_any_string, true, [String])
|
|
79
|
-
# @mock.uses_any_string("foo") # => true
|
|
80
|
-
# @mock.verify # => true
|
|
81
|
-
#
|
|
82
|
-
# @mock.expect(:uses_one_string, true, ["foo"])
|
|
83
|
-
# @mock.uses_one_string("bar") # => raises MockExpectationError
|
|
84
|
-
#
|
|
85
|
-
# If a method will be called multiple times, specify a new expect for each one.
|
|
86
|
-
# They will be used in the order you define them.
|
|
87
|
-
#
|
|
88
|
-
# @mock.expect(:ordinal_increment, 'first')
|
|
89
|
-
# @mock.expect(:ordinal_increment, 'second')
|
|
90
|
-
#
|
|
91
|
-
# @mock.ordinal_increment # => 'first'
|
|
92
|
-
# @mock.ordinal_increment # => 'second'
|
|
93
|
-
# @mock.ordinal_increment # => raises MockExpectationError "No more expects available for :ordinal_increment"
|
|
94
|
-
#
|
|
95
|
-
|
|
96
|
-
def expect name, retval, args = [], **kwargs, &blk
|
|
97
|
-
name = name.to_sym
|
|
98
|
-
|
|
99
|
-
if blk then
|
|
100
|
-
raise ArgumentError, "args ignored when block given" unless args.empty?
|
|
101
|
-
raise ArgumentError, "kwargs ignored when block given" unless kwargs.empty?
|
|
102
|
-
@expected_calls[name] << { :retval => retval, :block => blk }
|
|
103
|
-
else
|
|
104
|
-
raise ArgumentError, "args must be an array" unless Array === args
|
|
105
|
-
|
|
106
|
-
if ENV["MT_KWARGS_HAC\K"] && (Hash === args.last ||
|
|
107
|
-
Hash == args.last) then
|
|
108
|
-
if kwargs.empty? then
|
|
109
|
-
kwargs = args.pop
|
|
110
|
-
else
|
|
111
|
-
unless @@KW_WARNED then
|
|
112
|
-
from = caller(1..1).first
|
|
113
|
-
warn "Using MT_KWARGS_HAC\K yet passing kwargs. From #{from}"
|
|
114
|
-
@@KW_WARNED = true
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
@expected_calls[name] <<
|
|
120
|
-
{ :retval => retval, :args => args, :kwargs => kwargs }
|
|
121
|
-
end
|
|
122
|
-
self
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def __call name, data # :nodoc:
|
|
126
|
-
case data
|
|
127
|
-
when Hash then
|
|
128
|
-
args = data[:args].inspect[1..-2]
|
|
129
|
-
kwargs = data[:kwargs]
|
|
130
|
-
if kwargs && !kwargs.empty? then
|
|
131
|
-
args << ", " unless args.empty?
|
|
132
|
-
args << kwargs.inspect[1..-2]
|
|
133
|
-
end
|
|
134
|
-
"#{name}(#{args}) => #{data[:retval].inspect}"
|
|
135
|
-
else
|
|
136
|
-
data.map { |d| __call name, d }.join ", "
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
##
|
|
141
|
-
# Verify that all methods were called as expected. Raises
|
|
142
|
-
# +MockExpectationError+ if the mock object was not called as
|
|
143
|
-
# expected.
|
|
144
|
-
|
|
145
|
-
def verify
|
|
146
|
-
@expected_calls.each do |name, expected|
|
|
147
|
-
actual = @actual_calls.fetch name, nil # defaults to []
|
|
148
|
-
raise MockExpectationError, "Expected #{__call name, expected[0]}" unless actual
|
|
149
|
-
raise MockExpectationError, "Expected #{__call name, expected[actual.size]}, got [#{__call name, actual}]" if
|
|
150
|
-
actual.size < expected.size
|
|
151
|
-
end
|
|
152
|
-
true
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def method_missing sym, *args, **kwargs, &block # :nodoc:
|
|
156
|
-
unless @expected_calls.key? sym then
|
|
157
|
-
if @delegator && @delegator.respond_to?(sym)
|
|
158
|
-
if kwargs.empty? then # FIX: drop this after 2.7 dead
|
|
159
|
-
return @delegator.public_send(sym, *args, &block)
|
|
160
|
-
else
|
|
161
|
-
return @delegator.public_send(sym, *args, **kwargs, &block)
|
|
162
|
-
end
|
|
163
|
-
else
|
|
164
|
-
raise NoMethodError, "unmocked method %p, expected one of %p" %
|
|
165
|
-
[sym, @expected_calls.keys.sort_by(&:to_s)]
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
index = @actual_calls[sym].length
|
|
170
|
-
expected_call = @expected_calls[sym][index]
|
|
171
|
-
|
|
172
|
-
unless expected_call then
|
|
173
|
-
raise MockExpectationError, "No more expects available for %p: %p %p" %
|
|
174
|
-
[sym, args, kwargs]
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
expected_args, expected_kwargs, retval, val_block =
|
|
178
|
-
expected_call.values_at :args, :kwargs, :retval, :block
|
|
179
|
-
|
|
180
|
-
expected_kwargs = kwargs.to_h { |ak, av| [ak, Object] } if
|
|
181
|
-
Hash == expected_kwargs
|
|
182
|
-
|
|
183
|
-
if val_block then
|
|
184
|
-
# keep "verify" happy
|
|
185
|
-
@actual_calls[sym] << expected_call
|
|
186
|
-
|
|
187
|
-
raise MockExpectationError, "mocked method %p failed block w/ %p %p" %
|
|
188
|
-
[sym, args, kwargs] unless val_block.call(*args, **kwargs, &block)
|
|
189
|
-
|
|
190
|
-
return retval
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
if expected_args.size != args.size then
|
|
194
|
-
raise ArgumentError, "mocked method %p expects %d arguments, got %p" %
|
|
195
|
-
[sym, expected_args.size, args]
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
if expected_kwargs.size != kwargs.size then
|
|
199
|
-
raise ArgumentError, "mocked method %p expects %d keyword arguments, got %p" %
|
|
200
|
-
[sym, expected_kwargs.size, kwargs]
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
zipped_args = expected_args.zip args
|
|
204
|
-
fully_matched = zipped_args.all? { |mod, a|
|
|
205
|
-
mod === a or mod == a
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
unless fully_matched then
|
|
209
|
-
fmt = "mocked method %p called with unexpected arguments %p"
|
|
210
|
-
raise MockExpectationError, fmt % [sym, args]
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
unless expected_kwargs.keys.sort == kwargs.keys.sort then
|
|
214
|
-
fmt = "mocked method %p called with unexpected keywords %p vs %p"
|
|
215
|
-
raise MockExpectationError, fmt % [sym, expected_kwargs.keys, kwargs.keys]
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
zipped_kwargs = expected_kwargs.to_h { |ek, ev|
|
|
219
|
-
av = kwargs[ek]
|
|
220
|
-
[ek, [ev, av]]
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
fully_matched = zipped_kwargs.all? { |ek, (ev, av)|
|
|
224
|
-
ev === av or ev == av
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
unless fully_matched then
|
|
228
|
-
fmt = "mocked method %p called with unexpected keyword arguments %p vs %p"
|
|
229
|
-
raise MockExpectationError, fmt % [sym, expected_kwargs, kwargs]
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
@actual_calls[sym] << {
|
|
233
|
-
:retval => retval,
|
|
234
|
-
:args => zipped_args.map { |e, a| e === a ? e : a },
|
|
235
|
-
:kwargs => zipped_kwargs.to_h { |k, (e, a)| [k, e === a ? e : a] },
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
retval
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
def respond_to? sym, include_private = false # :nodoc:
|
|
242
|
-
return true if @expected_calls.key? sym.to_sym
|
|
243
|
-
return true if @delegator && @delegator.respond_to?(sym, include_private)
|
|
244
|
-
__respond_to? sym, include_private
|
|
245
|
-
end
|
|
246
|
-
end
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
module Minitest::Assertions
|
|
250
|
-
##
|
|
251
|
-
# Assert that the mock verifies correctly and fail if not.
|
|
252
|
-
|
|
253
|
-
def assert_mock mock, msg = nil
|
|
254
|
-
assert mock.verify
|
|
255
|
-
rescue MockExpectationError => e
|
|
256
|
-
msg = message(msg) { e.message }
|
|
257
|
-
flunk msg
|
|
258
|
-
end
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
module Minitest::Expectations
|
|
262
|
-
##
|
|
263
|
-
# See Minitest::Assertions#assert_mock.
|
|
264
|
-
#
|
|
265
|
-
# _(collection).must_verify
|
|
266
|
-
#
|
|
267
|
-
# :method: must_verify
|
|
268
|
-
|
|
269
|
-
infect_an_assertion :assert_mock, :must_verify, :unary if
|
|
270
|
-
defined?(infect_an_assertion)
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
##
|
|
274
|
-
# Object extensions for Minitest::Mock.
|
|
275
|
-
|
|
276
|
-
class Object
|
|
277
|
-
|
|
278
|
-
##
|
|
279
|
-
# Add a temporary stubbed method replacing +name+ for the duration
|
|
280
|
-
# of the +block+. If +val_or_callable+ responds to #call, then it
|
|
281
|
-
# returns the result of calling it, otherwise returns the value
|
|
282
|
-
# as-is. If stubbed method yields a block, +block_args+ will be
|
|
283
|
-
# passed along. Cleans up the stub at the end of the +block+. The
|
|
284
|
-
# method +name+ must exist before stubbing.
|
|
285
|
-
#
|
|
286
|
-
# def test_stale_eh
|
|
287
|
-
# obj_under_test = Something.new
|
|
288
|
-
# refute obj_under_test.stale?
|
|
289
|
-
#
|
|
290
|
-
# Time.stub :now, Time.at(0) do
|
|
291
|
-
# assert obj_under_test.stale?
|
|
292
|
-
# end
|
|
293
|
-
# end
|
|
294
|
-
#--
|
|
295
|
-
# NOTE: keyword args in callables are NOT checked for correctness
|
|
296
|
-
# against the existing method. Too many edge cases to be worth it.
|
|
297
|
-
|
|
298
|
-
def stub name, val_or_callable, *block_args, **block_kwargs, &block
|
|
299
|
-
new_name = "__minitest_stub__#{name}"
|
|
300
|
-
|
|
301
|
-
metaclass = class << self; self; end
|
|
302
|
-
|
|
303
|
-
if respond_to? name and not methods.map(&:to_s).include? name.to_s then
|
|
304
|
-
metaclass.send :define_method, name do |*args, **kwargs|
|
|
305
|
-
super(*args, **kwargs)
|
|
306
|
-
end
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
metaclass.send :alias_method, new_name, name
|
|
310
|
-
|
|
311
|
-
if ENV["MT_KWARGS_HAC\K"] then
|
|
312
|
-
metaclass.send :define_method, name do |*args, &blk|
|
|
313
|
-
if val_or_callable.respond_to? :call then
|
|
314
|
-
val_or_callable.call(*args, &blk)
|
|
315
|
-
else
|
|
316
|
-
blk.call(*block_args, **block_kwargs) if blk
|
|
317
|
-
val_or_callable
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
else
|
|
321
|
-
metaclass.send :define_method, name do |*args, **kwargs, &blk|
|
|
322
|
-
if val_or_callable.respond_to? :call then
|
|
323
|
-
if kwargs.empty? then # FIX: drop this after 2.7 dead
|
|
324
|
-
val_or_callable.call(*args, &blk)
|
|
325
|
-
else
|
|
326
|
-
val_or_callable.call(*args, **kwargs, &blk)
|
|
327
|
-
end
|
|
328
|
-
else
|
|
329
|
-
if blk then
|
|
330
|
-
if block_kwargs.empty? then # FIX: drop this after 2.7 dead
|
|
331
|
-
blk.call(*block_args)
|
|
332
|
-
else
|
|
333
|
-
blk.call(*block_args, **block_kwargs)
|
|
334
|
-
end
|
|
335
|
-
end
|
|
336
|
-
val_or_callable
|
|
337
|
-
end
|
|
338
|
-
end
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
block[self]
|
|
342
|
-
ensure
|
|
343
|
-
metaclass.send :undef_method, name
|
|
344
|
-
metaclass.send :alias_method, name, new_name
|
|
345
|
-
metaclass.send :undef_method, new_name
|
|
346
|
-
end
|
|
347
|
-
end
|
data/lib/minitest/unit.rb
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
unless defined?(Minitest) then
|
|
2
|
-
# all of this crap is just to avoid circular requires and is only
|
|
3
|
-
# needed if a user requires "minitest/unit" directly instead of
|
|
4
|
-
# "minitest/autorun", so we also warn
|
|
5
|
-
|
|
6
|
-
from = caller.reject { |s| s =~ /rubygems/ }.join("\n ")
|
|
7
|
-
warn "Warning: you should require 'minitest/autorun' instead."
|
|
8
|
-
warn %(Warning: or add 'gem "minitest"' before 'require "minitest/autorun"')
|
|
9
|
-
warn "From:\n #{from}"
|
|
10
|
-
|
|
11
|
-
module Minitest # :nodoc:
|
|
12
|
-
end
|
|
13
|
-
MiniTest = Minitest # :nodoc: # prevents minitest.rb from requiring back to us
|
|
14
|
-
require "minitest"
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
MiniTest = Minitest unless defined?(MiniTest)
|
|
18
|
-
|
|
19
|
-
module Minitest
|
|
20
|
-
class Unit # :nodoc:
|
|
21
|
-
VERSION = Minitest::VERSION
|
|
22
|
-
class TestCase < Minitest::Test # :nodoc:
|
|
23
|
-
def self.inherited klass # :nodoc:
|
|
24
|
-
from = caller.first
|
|
25
|
-
warn "MiniTest::Unit::TestCase is now Minitest::Test. From #{from}"
|
|
26
|
-
super
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def self.autorun # :nodoc:
|
|
31
|
-
from = caller.first
|
|
32
|
-
warn "MiniTest::Unit.autorun is now Minitest.autorun. From #{from}"
|
|
33
|
-
Minitest.autorun
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def self.after_tests &b # :nodoc:
|
|
37
|
-
from = caller.first
|
|
38
|
-
warn "MiniTest::Unit.after_tests is now Minitest.after_run. From #{from}"
|
|
39
|
-
Minitest.after_run(&b)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|