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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/History.rdoc +95 -0
  4. data/Manifest.txt +13 -4
  5. data/README.rdoc +18 -98
  6. data/Rakefile +7 -1
  7. data/bin/minitest +5 -0
  8. data/design_rationale.rb +21 -19
  9. data/lib/hoe/minitest.rb +2 -1
  10. data/lib/minitest/assertions.rb +34 -66
  11. data/lib/minitest/autorun.rb +3 -4
  12. data/lib/minitest/benchmark.rb +2 -2
  13. data/lib/minitest/bisect.rb +306 -0
  14. data/lib/minitest/complete.rb +56 -0
  15. data/lib/minitest/find_minimal_combination.rb +127 -0
  16. data/lib/minitest/hell.rb +1 -1
  17. data/lib/minitest/manual_plugins.rb +4 -16
  18. data/lib/minitest/parallel.rb +5 -3
  19. data/lib/minitest/path_expander.rb +418 -0
  20. data/lib/minitest/pride.rb +2 -2
  21. data/lib/minitest/pride_plugin.rb +1 -1
  22. data/lib/minitest/server.rb +45 -0
  23. data/lib/minitest/server_plugin.rb +84 -0
  24. data/lib/minitest/spec.rb +5 -33
  25. data/lib/minitest/sprint.rb +104 -0
  26. data/lib/minitest/sprint_plugin.rb +39 -0
  27. data/lib/minitest/test.rb +7 -13
  28. data/lib/minitest/test_task.rb +6 -13
  29. data/lib/minitest.rb +86 -101
  30. data/test/minitest/metametameta.rb +1 -1
  31. data/test/minitest/test_bisect.rb +235 -0
  32. data/test/minitest/test_find_minimal_combination.rb +138 -0
  33. data/test/minitest/test_minitest_assertions.rb +48 -105
  34. data/test/minitest/test_minitest_reporter.rb +6 -5
  35. data/test/minitest/test_minitest_spec.rb +52 -118
  36. data/test/minitest/test_minitest_test.rb +21 -100
  37. data/test/minitest/test_path_expander.rb +229 -0
  38. data/test/minitest/test_server.rb +149 -0
  39. data.tar.gz.sig +1 -2
  40. metadata +50 -17
  41. metadata.gz.sig +2 -2
  42. data/.autotest +0 -34
  43. data/lib/minitest/mock.rb +0 -347
  44. data/lib/minitest/unit.rb +0 -42
  45. 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