minitest 5.15.0 → 5.16.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d7d16c7decb91ba01a888704bd527d1e5569454b444fe1b4e41a8a3a7db7406
4
- data.tar.gz: 1ee0d2823a94b63b8cd019198fe2ca20a5c3d9d7bf4918148bdfa543fb65945d
3
+ metadata.gz: 9c5a4db9f495b34c86f2c39eef6b6d424b22d8d9e6a86038bf0ff84c1c20c975
4
+ data.tar.gz: b8a1b6cb226d14c6972460bec05ec610d05acdfa0edcffe19bf51e8220486206
5
5
  SHA512:
6
- metadata.gz: 933a300969aa30dc8f254952dd17f9975cb1f3aad9c10c96260394d088b76900273773374b5ed72731356f2b7f1cfeb131583ae943322250a60401e554e11f45
7
- data.tar.gz: 24a356e1d3c06e28d03860b4dca92d17b88979ebad6316fe97298207c58b29b0ae207657d0044a43ede1bf9a27ac43ca8c779e24fc9ca5ed4c920beca2eaf143
6
+ metadata.gz: 6505a8f386da89263a005ba8eef3f81053e7e666a54ec03abd8f71e06c290ebf318df4f7728e420e3f40fab55ffe1a57824ec435286c89864ea830d330d6b028
7
+ data.tar.gz: 5b8bbba7d8565026e64da1d3af31a5aa342c3d063acd75de9661bc09fb142f4a469e9febf44daf2764d4fb33021d993a27bd936200efded501158b23c299989e
checksums.yaml.gz.sig CHANGED
Binary file
data/History.rdoc CHANGED
@@ -1,3 +1,54 @@
1
+ === 5.16.3 / 2022-08-17
2
+
3
+ * 2 bug fixes:
4
+
5
+ * Fixed exception sanitization by removing TypeError restriction on rescue.
6
+ * Use A instead of deprecated TESTOPTS in rake test:slow. (davidstosik)
7
+
8
+ === 5.16.2 / 2022-07-03
9
+
10
+ * 4 bug fixes:
11
+
12
+ * Added MT_KWARGS_HACK kludge for stub to deal with ruby 2.7 kwargs nastiness. (tsugimoto)
13
+ * In #expect, pop Hash class from args if $MT_KWARGS_HACK. (casperisfine)
14
+ * In above scenario, set expected kwargs (as Objects) based on actual kwargs.
15
+ * Nuke ivars if exception fails to marshal twice (eg better_errors). (irphilli)
16
+
17
+ === 5.16.1 / 2022-06-20
18
+
19
+ * 2 bug fixes:
20
+
21
+ * Apparently adding real kwarg support to mocks/stubs broke some code. Fixed.
22
+ * Use `MT_KWARGS_HACK=1` to activate the kludgy kwargs support w/ caveats.
23
+ * Clarified some doco wrt the block on #stub.
24
+
25
+ === 5.16.0 / 2022-06-14
26
+
27
+ * 2 major enhancements:
28
+
29
+ * Added Minitest::TestTask.
30
+ * Dropping ruby 2.2 - 2.5. 2.6 is DTM soon too.
31
+
32
+ * 11 minor enhancements:
33
+
34
+ * Added --show-skips option to show skips at end of run but not require --verbose. (MSP-Greg)
35
+ * Added Minitest.seed, the random seed used by the run.
36
+ * Calling `srand Minitest.seed` before all shuffles to ensure determinism.
37
+ * Extended #stub to handle kwargs for both block and call args. (SampsonCrowley)
38
+ * Extended Mock#__call to display kwargs.
39
+ * Extended Mock#expect to record kwargs.
40
+ * Extended Mock#method_missing to take kwargs & compare them against expected.
41
+ * Mock#method_missing displays better errors on arity mismatch.
42
+ * Removed minor optimization removing empty suites before run.
43
+ * Simplified test randomization (test order will change even with fixed seed).
44
+ * assert_match now returns the MatchData on success. (Nakilon)
45
+
46
+ * 3 bug fixes:
47
+
48
+ * (Re)Fixed marshalling of exceptions, neutering them in 2 passes.
49
+ * Fixed more problems with rdoc.
50
+ * Had to patch up mock and stub to deal with <=2.7 kwargs oddities
51
+
1
52
  === 5.15.0 / 2021-12-14
2
53
 
3
54
  * 1 major enhancement:
data/Manifest.txt CHANGED
@@ -17,6 +17,7 @@ lib/minitest/pride.rb
17
17
  lib/minitest/pride_plugin.rb
18
18
  lib/minitest/spec.rb
19
19
  lib/minitest/test.rb
20
+ lib/minitest/test_task.rb
20
21
  lib/minitest/unit.rb
21
22
  test/minitest/metametameta.rb
22
23
  test/minitest/test_minitest_assertions.rb
@@ -25,3 +26,4 @@ test/minitest/test_minitest_mock.rb
25
26
  test/minitest/test_minitest_reporter.rb
26
27
  test/minitest/test_minitest_spec.rb
27
28
  test/minitest/test_minitest_test.rb
29
+ test/minitest/test_minitest_test_task.rb
data/README.rdoc CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  home :: https://github.com/seattlerb/minitest
4
4
  bugs :: https://github.com/seattlerb/minitest/issues
5
- rdoc :: http://docs.seattlerb.org/minitest
5
+ rdoc :: https://docs.seattlerb.org/minitest
6
6
  vim :: https://github.com/sunaku/vim-ruby-minitest
7
7
  emacs:: https://github.com/arthurnn/minitest-emacs
8
8
 
@@ -70,6 +70,7 @@ extract-method refactorings still apply.
70
70
  * minitest/mock - a simple and clean mock/stub system.
71
71
  * minitest/benchmark - an awesome way to assert your algorithm's performance.
72
72
  * minitest/pride - show your pride in testing!
73
+ * minitest/test_task - a full-featured and clean rake task generator.
73
74
  * Incredibly small and fast runner, but no bells and whistles.
74
75
  * Written by squishy human beings. Software can never be perfect. We will all eventually die.
75
76
 
@@ -186,7 +187,7 @@ Output is tab-delimited to make it easy to paste into a spreadsheet.
186
187
  === Mocks
187
188
 
188
189
  Mocks and stubs defined using terminology by Fowler & Meszaros at
189
- http://www.martinfowler.com/bliki/TestDouble.html:
190
+ https://www.martinfowler.com/bliki/TestDouble.html:
190
191
 
191
192
  "Mocks are pre-programmed with expectations which form a specification
192
193
  of the calls they are expected to receive. They can throw an exception
@@ -237,7 +238,7 @@ an example of asserting that code inside a thread is run:
237
238
  === Stubs
238
239
 
239
240
  Mocks and stubs are defined using terminology by Fowler & Meszaros at
240
- http://www.martinfowler.com/bliki/TestDouble.html:
241
+ https://www.martinfowler.com/bliki/TestDouble.html:
241
242
 
242
243
  "Stubs provide canned answers to calls made during the test".
243
244
 
@@ -264,9 +265,8 @@ new non-existing method:
264
265
 
265
266
  === Running Your Tests
266
267
 
267
- Ideally, you'll use a rake task to run your tests, either piecemeal or
268
- all at once. Both rake and rails ship with rake tasks for running your
269
- tests. BUT! You don't have to:
268
+ Ideally, you'll use a rake task to run your tests (see below), either
269
+ piecemeal or all at once. BUT! You don't have to:
270
270
 
271
271
  % ruby -Ilib:test test/minitest/test_minitest_test.rb
272
272
  Run options: --seed 37685
@@ -294,18 +294,45 @@ provided via plugins. To see them, simply run with +--help+:
294
294
  -p, --pride Pride. Show your testing pride!
295
295
  -a, --autotest Connect to autotest server.
296
296
 
297
+ === Rake Tasks
298
+
297
299
  You can set up a rake task to run all your tests by adding this to your Rakefile:
298
300
 
299
- require "rake/testtask"
301
+ require "minitest/test_task"
302
+
303
+ Minitest::TestTask.create # named test, sensible defaults
300
304
 
301
- Rake::TestTask.new(:test) do |t|
305
+ # or more explicitly:
306
+
307
+ Minitest::TestTask.create(:test) do |t|
302
308
  t.libs << "test"
303
309
  t.libs << "lib"
304
- t.test_files = FileList["test/**/test_*.rb"]
310
+ t.warning = false
311
+ t.test_globs = ["test/**/*_test.rb"]
305
312
  end
306
313
 
307
314
  task :default => :test
308
315
 
316
+ Each of these will generate 4 tasks:
317
+
318
+ rake test :: Run the test suite.
319
+ rake test:cmd :: Print out the test command.
320
+ rake test:isolated :: Show which test files fail when run separately.
321
+ rake test:slow :: Show bottom 25 tests sorted by time.
322
+
323
+ === Rake Task Variables
324
+
325
+ There are a bunch of variables you can supply to rake to modify the run.
326
+
327
+ MT_LIB_EXTRAS :: Extra libs to dynamically override/inject for custom runs.
328
+ N :: -n: Tests to run (string or /regexp/).
329
+ X :: -x: Tests to exclude (string or /regexp/).
330
+ A :: Any extra arguments. Honors shell quoting.
331
+ MT_CPU :: How many threads to use for parallel test runs
332
+ SEED :: -s --seed Sets random seed.
333
+ TESTOPTS :: Deprecated, same as A
334
+ FILTER :: Deprecated, same as A
335
+
309
336
  == Writing Extensions
310
337
 
311
338
  To define a plugin, add a file named minitest/XXX_plugin.rb to your
@@ -614,6 +641,7 @@ minitest-capistrano :: Assertions and expectations for testing
614
641
  Capistrano recipes.
615
642
  minitest-capybara :: Capybara matchers support for minitest unit and
616
643
  spec.
644
+ minitest-cc :: It provides minimal information about code coverage.
617
645
  minitest-chef-handler :: Run Minitest suites as Chef report handlers
618
646
  minitest-ci :: CI reporter plugin for Minitest.
619
647
  minitest-context :: Defines contexts for code reuse in Minitest
@@ -712,7 +740,7 @@ minitest-stub-const :: Stub constants for the duration of a block.
712
740
  minitest-tags :: Add tags for minitest.
713
741
  minitest-unordered :: Adds a new assertion to minitest for checking the
714
742
  contents of a collection, ignoring element order.
715
- minitest-vcr :: Automatic cassette managment with Minitest::Spec
743
+ minitest-vcr :: Automatic cassette management with Minitest::Spec
716
744
  and VCR.
717
745
  minitest_log :: Adds structured logging, data explication, and verdicts.
718
746
  minitest_owrapper :: Get tests results as a TestResult object.
@@ -726,6 +754,9 @@ rematch :: Declutter your test files from large hardcoded da
726
754
  and update them automatically when your code changes.
727
755
  rspec2minitest :: Easily translate any RSpec matchers to Minitest
728
756
  assertions and expectations.
757
+ stubberry :: Multiple stubbing 'berries', sweet and useful
758
+ stub helpers and assertions. ( stub_must,
759
+ assert_method_called, stubbing ORM objects by id )
729
760
 
730
761
  == Unknown Extensions:
731
762
 
@@ -751,7 +782,7 @@ Authors... Please send me a pull request with a description of your minitest ext
751
782
 
752
783
  == Minitest related goods
753
784
 
754
- * minitest/pride fabric: http://www.spoonflower.com/fabric/3928730-again-by-katie_allen
785
+ * minitest/pride fabric: https://www.spoonflower.com/fabric/3928730-again-by-katie_allen
755
786
 
756
787
  == REQUIREMENTS:
757
788
 
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ Hoe.spec "minitest" do
11
11
 
12
12
  license "MIT"
13
13
 
14
- require_ruby_version [">= 2.2", "< 4.0"]
14
+ require_ruby_version [">= 2.6", "< 4.0"]
15
15
  end
16
16
 
17
17
  desc "Find missing expectations"
@@ -293,6 +293,8 @@ module Minitest
293
293
  assert_respond_to matcher, :"=~"
294
294
  matcher = Regexp.new Regexp.escape matcher if String === matcher
295
295
  assert matcher =~ obj, msg
296
+
297
+ Regexp.last_match
296
298
  end
297
299
 
298
300
  ##
@@ -217,7 +217,7 @@ module Minitest
217
217
  ##
218
218
  # Takes an array of x/y pairs and calculates the general R^2 value.
219
219
  #
220
- # See: http://en.wikipedia.org/wiki/Coefficient_of_determination
220
+ # See: https://en.wikipedia.org/wiki/Coefficient_of_determination
221
221
 
222
222
  def fit_error xys
223
223
  y_bar = sigma(xys) { |_, y| y } / xys.size.to_f
@@ -232,7 +232,7 @@ module Minitest
232
232
  #
233
233
  # Takes x and y values and returns [a, b, r^2].
234
234
  #
235
- # See: http://mathworld.wolfram.com/LeastSquaresFittingExponential.html
235
+ # See: https://mathworld.wolfram.com/LeastSquaresFittingExponential.html
236
236
 
237
237
  def fit_exponential xs, ys
238
238
  n = xs.size
@@ -254,7 +254,7 @@ module Minitest
254
254
  #
255
255
  # Takes x and y values and returns [a, b, r^2].
256
256
  #
257
- # See: http://mathworld.wolfram.com/LeastSquaresFittingLogarithmic.html
257
+ # See: https://mathworld.wolfram.com/LeastSquaresFittingLogarithmic.html
258
258
 
259
259
  def fit_logarithmic xs, ys
260
260
  n = xs.size
@@ -276,7 +276,7 @@ module Minitest
276
276
  #
277
277
  # Takes x and y values and returns [a, b, r^2].
278
278
  #
279
- # See: http://mathworld.wolfram.com/LeastSquaresFitting.html
279
+ # See: https://mathworld.wolfram.com/LeastSquaresFitting.html
280
280
 
281
281
  def fit_linear xs, ys
282
282
  n = xs.size
@@ -298,7 +298,7 @@ module Minitest
298
298
  #
299
299
  # Takes x and y values and returns [a, b, r^2].
300
300
  #
301
- # See: http://mathworld.wolfram.com/LeastSquaresFittingPowerLaw.html
301
+ # See: https://mathworld.wolfram.com/LeastSquaresFittingPowerLaw.html
302
302
 
303
303
  def fit_power xs, ys
304
304
  n = xs.size
data/lib/minitest/mock.rb CHANGED
@@ -28,11 +28,19 @@ module Minitest # :nodoc:
28
28
  end
29
29
 
30
30
  overridden_methods.map(&:to_sym).each do |method_id|
31
- define_method method_id do |*args, &b|
31
+ define_method method_id do |*args, **kwargs, &b|
32
32
  if @expected_calls.key? method_id then
33
- method_missing(method_id, *args, &b)
33
+ if kwargs.empty? then # FIX: drop this after 2.7 dead
34
+ method_missing(method_id, *args, &b)
35
+ else
36
+ method_missing(method_id, *args, **kwargs, &b)
37
+ end
34
38
  else
35
- super(*args, &b)
39
+ if kwargs.empty? then # FIX: drop this after 2.7 dead
40
+ super(*args, &b)
41
+ else
42
+ super(*args, **kwargs, &b)
43
+ end
36
44
  end
37
45
  end
38
46
  end
@@ -43,9 +51,11 @@ module Minitest # :nodoc:
43
51
  @actual_calls = Hash.new { |calls, name| calls[name] = [] }
44
52
  end
45
53
 
54
+ @@KW_WARNED = false # :nodoc:
55
+
46
56
  ##
47
- # Expect that method +name+ is called, optionally with +args+ or a
48
- # +blk+, and returns +retval+.
57
+ # Expect that method +name+ is called, optionally with +args+ (and
58
+ # +kwargs+ or a +blk+, and returns +retval+.
49
59
  #
50
60
  # @mock.expect(:meaning_of_life, 42)
51
61
  # @mock.meaning_of_life # => 42
@@ -78,15 +88,31 @@ module Minitest # :nodoc:
78
88
  # @mock.ordinal_increment # => raises MockExpectationError "No more expects available for :ordinal_increment"
79
89
  #
80
90
 
81
- def expect name, retval, args = [], &blk
91
+ def expect name, retval, args = [], **kwargs, &blk
82
92
  name = name.to_sym
83
93
 
84
94
  if block_given?
85
95
  raise ArgumentError, "args ignored when block given" unless args.empty?
96
+ raise ArgumentError, "kwargs ignored when block given" unless kwargs.empty?
86
97
  @expected_calls[name] << { :retval => retval, :block => blk }
87
98
  else
88
99
  raise ArgumentError, "args must be an array" unless Array === args
89
- @expected_calls[name] << { :retval => retval, :args => args }
100
+
101
+ if ENV["MT_KWARGS_HAC\K"] && (Hash === args.last ||
102
+ Hash == args.last) then
103
+ if kwargs.empty? then
104
+ kwargs = args.pop
105
+ else
106
+ unless @@KW_WARNED then
107
+ from = caller.first
108
+ warn "Using MT_KWARGS_HAC\K yet passing kwargs. From #{from}"
109
+ @@KW_WARNED = true
110
+ end
111
+ end
112
+ end
113
+
114
+ @expected_calls[name] <<
115
+ { :retval => retval, :args => args, :kwargs => kwargs }
90
116
  end
91
117
  self
92
118
  end
@@ -94,7 +120,13 @@ module Minitest # :nodoc:
94
120
  def __call name, data # :nodoc:
95
121
  case data
96
122
  when Hash then
97
- "#{name}(#{data[:args].inspect[1..-2]}) => #{data[:retval].inspect}"
123
+ args = data[:args].inspect[1..-2]
124
+ kwargs = data[:kwargs]
125
+ if kwargs && !kwargs.empty? then
126
+ args << ", " unless args.empty?
127
+ args << kwargs.inspect[1..-2]
128
+ end
129
+ "#{name}(#{args}) => #{data[:retval].inspect}"
98
130
  else
99
131
  data.map { |d| __call name, d }.join ", "
100
132
  end
@@ -115,10 +147,10 @@ module Minitest # :nodoc:
115
147
  true
116
148
  end
117
149
 
118
- def method_missing sym, *args, &block # :nodoc:
150
+ def method_missing sym, *args, **kwargs, &block # :nodoc:
119
151
  unless @expected_calls.key?(sym) then
120
152
  if @delegator && @delegator.respond_to?(sym)
121
- return @delegator.public_send(sym, *args, &block)
153
+ return @delegator.public_send(sym, *args, **kwargs, &block)
122
154
  else
123
155
  raise NoMethodError, "unmocked method %p, expected one of %p" %
124
156
  [sym, @expected_calls.keys.sort_by(&:to_s)]
@@ -129,26 +161,34 @@ module Minitest # :nodoc:
129
161
  expected_call = @expected_calls[sym][index]
130
162
 
131
163
  unless expected_call then
132
- raise MockExpectationError, "No more expects available for %p: %p" %
133
- [sym, args]
164
+ raise MockExpectationError, "No more expects available for %p: %p %p" %
165
+ [sym, args, kwargs]
134
166
  end
135
167
 
136
- expected_args, retval, val_block =
137
- expected_call.values_at(:args, :retval, :block)
168
+ expected_args, expected_kwargs, retval, val_block =
169
+ expected_call.values_at(:args, :kwargs, :retval, :block)
170
+
171
+ expected_kwargs = kwargs.map { |ak, av| [ak, Object] }.to_h if
172
+ Hash == expected_kwargs
138
173
 
139
174
  if val_block then
140
175
  # keep "verify" happy
141
176
  @actual_calls[sym] << expected_call
142
177
 
143
- raise MockExpectationError, "mocked method %p failed block w/ %p" %
144
- [sym, args] unless val_block.call(*args, &block)
178
+ raise MockExpectationError, "mocked method %p failed block w/ %p %p" %
179
+ [sym, args, kwargs] unless val_block.call(*args, **kwargs, &block)
145
180
 
146
181
  return retval
147
182
  end
148
183
 
149
184
  if expected_args.size != args.size then
150
- raise ArgumentError, "mocked method %p expects %d arguments, got %d" %
151
- [sym, expected_args.size, args.size]
185
+ raise ArgumentError, "mocked method %p expects %d arguments, got %p" %
186
+ [sym, expected_args.size, args]
187
+ end
188
+
189
+ if expected_kwargs.size != kwargs.size then
190
+ raise ArgumentError, "mocked method %p expects %d keyword arguments, got %p" %
191
+ [sym, expected_kwargs.size, kwargs]
152
192
  end
153
193
 
154
194
  zipped_args = expected_args.zip(args)
@@ -157,13 +197,33 @@ module Minitest # :nodoc:
157
197
  }
158
198
 
159
199
  unless fully_matched then
160
- raise MockExpectationError, "mocked method %p called with unexpected arguments %p" %
161
- [sym, args]
200
+ fmt = "mocked method %p called with unexpected arguments %p"
201
+ raise MockExpectationError, fmt % [sym, args]
202
+ end
203
+
204
+ unless expected_kwargs.keys.sort == kwargs.keys.sort then
205
+ fmt = "mocked method %p called with unexpected keywords %p vs %p"
206
+ raise MockExpectationError, fmt % [sym, expected_kwargs.keys, kwargs.keys]
207
+ end
208
+
209
+ zipped_kwargs = expected_kwargs.map { |ek, ev|
210
+ av = kwargs[ek]
211
+ [ek, [ev, av]]
212
+ }.to_h
213
+
214
+ fully_matched = zipped_kwargs.all? { |ek, (ev, av)|
215
+ ev === av or ev == av
216
+ }
217
+
218
+ unless fully_matched then
219
+ fmt = "mocked method %p called with unexpected keyword arguments %p vs %p"
220
+ raise MockExpectationError, fmt % [sym, expected_kwargs, kwargs]
162
221
  end
163
222
 
164
223
  @actual_calls[sym] << {
165
224
  :retval => retval,
166
- :args => zipped_args.map! { |mod, a| mod === a ? mod : a },
225
+ :args => zipped_args.map { |e, a| e === a ? e : a },
226
+ :kwargs => zipped_kwargs.map { |k, (e, a)| [k, e === a ? e : a] }.to_h,
167
227
  }
168
228
 
169
229
  retval
@@ -211,31 +271,50 @@ class Object
211
271
  # NOTE: keyword args in callables are NOT checked for correctness
212
272
  # against the existing method. Too many edge cases to be worth it.
213
273
 
214
- def stub name, val_or_callable, *block_args
274
+ def stub name, val_or_callable, *block_args, **block_kwargs, &block
215
275
  new_name = "__minitest_stub__#{name}"
216
276
 
217
277
  metaclass = class << self; self; end
218
278
 
219
279
  if respond_to? name and not methods.map(&:to_s).include? name.to_s then
220
- metaclass.send :define_method, name do |*args|
221
- super(*args)
280
+ metaclass.send :define_method, name do |*args, **kwargs|
281
+ super(*args, **kwargs)
222
282
  end
223
283
  end
224
284
 
225
285
  metaclass.send :alias_method, new_name, name
226
286
 
227
- metaclass.send :define_method, name do |*args, &blk|
228
- if val_or_callable.respond_to? :call then
229
- val_or_callable.call(*args, &blk)
230
- else
231
- blk.call(*block_args) if blk
232
- val_or_callable
287
+ if ENV["MT_KWARGS_HAC\K"] then
288
+ metaclass.send :define_method, name do |*args, &blk|
289
+ if val_or_callable.respond_to? :call then
290
+ val_or_callable.call(*args, &blk)
291
+ else
292
+ blk.call(*block_args, **block_kwargs) if blk
293
+ val_or_callable
294
+ end
295
+ end
296
+ else
297
+ metaclass.send :define_method, name do |*args, **kwargs, &blk|
298
+ if val_or_callable.respond_to? :call then
299
+ if kwargs.empty? then # FIX: drop this after 2.7 dead
300
+ val_or_callable.call(*args, &blk)
301
+ else
302
+ val_or_callable.call(*args, **kwargs, &blk)
303
+ end
304
+ else
305
+ if blk then
306
+ if block_kwargs.empty? then # FIX: drop this after 2.7 dead
307
+ blk.call(*block_args)
308
+ else
309
+ blk.call(*block_args, **block_kwargs)
310
+ end
311
+ end
312
+ val_or_callable
313
+ end
233
314
  end
234
315
  end
235
316
 
236
- metaclass.send(:ruby2_keywords, name) if metaclass.respond_to?(:ruby2_keywords, true)
237
-
238
- yield self
317
+ block[self]
239
318
  ensure
240
319
  metaclass.send :undef_method, name
241
320
  metaclass.send :alias_method, name, new_name
@@ -48,7 +48,7 @@ module Minitest
48
48
  def initialize io # :nodoc:
49
49
  @io = io
50
50
  # stolen from /System/Library/Perl/5.10.0/Term/ANSIColor.pm
51
- # also reference http://en.wikipedia.org/wiki/ANSI_escape_code
51
+ # also reference https://en.wikipedia.org/wiki/ANSI_escape_code
52
52
  @colors ||= (31..36).to_a
53
53
  @size = @colors.size
54
54
  @index = 0
data/lib/minitest/spec.rb CHANGED
@@ -66,7 +66,7 @@ module Kernel
66
66
  #
67
67
  # For some suggestions on how to improve your specs, try:
68
68
  #
69
- # http://betterspecs.org
69
+ # https://betterspecs.org
70
70
  #
71
71
  # but do note that several items there are debatable or specific to
72
72
  # rspec.
data/lib/minitest/test.rb CHANGED
@@ -67,8 +67,8 @@ module Minitest
67
67
 
68
68
  case self.test_order
69
69
  when :random, :parallel then
70
- max = methods.size
71
- methods.sort.sort_by { rand max }
70
+ srand Minitest.seed
71
+ methods.sort.shuffle
72
72
  when :alpha, :sorted then
73
73
  methods.sort
74
74
  else
@@ -203,12 +203,34 @@ module Minitest
203
203
 
204
204
  def sanitize_exception e # :nodoc:
205
205
  Marshal.dump e
206
- e
207
- rescue TypeError
206
+ e # good: use as-is
207
+ rescue
208
+ neuter_exception e
209
+ end
210
+
211
+ def neuter_exception e
208
212
  bt = e.backtrace
209
- e = RuntimeError.new "Wrapped undumpable exception for: #{e.class}: #{e.message}"
210
- e.set_backtrace bt
211
- e
213
+ msg = e.message.dup
214
+
215
+ new_exception e.class, msg, bt # e.class can be a problem...
216
+ rescue
217
+ msg.prepend "Neutered Exception #{e.class}: "
218
+
219
+ new_exception RuntimeError, msg, bt, true # but if this raises, we die
220
+ end
221
+
222
+ def new_exception klass, msg, bt, kill = false
223
+ ne = klass.new msg
224
+ ne.set_backtrace bt
225
+
226
+ if kill then
227
+ ne.instance_variables.each do |v|
228
+ ne.remove_instance_variable v
229
+ end
230
+ end
231
+
232
+ Marshal.dump ne # can raise TypeError
233
+ ne
212
234
  end
213
235
 
214
236
  def with_info_handler &block # :nodoc: