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