minitest 5.11.3 → 5.14.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,10 +9,11 @@
9
9
  #
10
10
  # it "should still work in threads" do
11
11
  # my_threaded_thingy do
12
- # (1+1).must_equal 2 # bad
13
- # assert_equal 2, 1+1 # good
14
- # _(1 + 1).must_equal 2 # good
15
- # value(1 + 1).must_equal 2 # good, also #expect
12
+ # (1+1).must_equal 2 # bad
13
+ # assert_equal 2, 1+1 # good
14
+ # _(1 + 1).must_equal 2 # good
15
+ # value(1 + 1).must_equal 2 # good, also #expect
16
+ # _ { 1 + "1" }.must_raise TypeError # good
16
17
  # end
17
18
  # end
18
19
 
@@ -21,7 +22,7 @@ module Minitest::Expectations
21
22
  ##
22
23
  # See Minitest::Assertions#assert_empty.
23
24
  #
24
- # collection.must_be_empty
25
+ # _(collection).must_be_empty
25
26
  #
26
27
  # :method: must_be_empty
27
28
 
@@ -30,7 +31,7 @@ module Minitest::Expectations
30
31
  ##
31
32
  # See Minitest::Assertions#assert_equal
32
33
  #
33
- # a.must_equal b
34
+ # _(a).must_equal b
34
35
  #
35
36
  # :method: must_equal
36
37
 
@@ -39,18 +40,18 @@ module Minitest::Expectations
39
40
  ##
40
41
  # See Minitest::Assertions#assert_in_delta
41
42
  #
42
- # n.must_be_close_to m [, delta]
43
+ # _(n).must_be_close_to m [, delta]
43
44
  #
44
45
  # :method: must_be_close_to
45
46
 
46
47
  infect_an_assertion :assert_in_delta, :must_be_close_to
47
48
 
48
- alias :must_be_within_delta :must_be_close_to # :nodoc:
49
+ infect_an_assertion :assert_in_delta, :must_be_within_delta # :nodoc:
49
50
 
50
51
  ##
51
52
  # See Minitest::Assertions#assert_in_epsilon
52
53
  #
53
- # n.must_be_within_epsilon m [, epsilon]
54
+ # _(n).must_be_within_epsilon m [, epsilon]
54
55
  #
55
56
  # :method: must_be_within_epsilon
56
57
 
@@ -59,7 +60,7 @@ module Minitest::Expectations
59
60
  ##
60
61
  # See Minitest::Assertions#assert_includes
61
62
  #
62
- # collection.must_include obj
63
+ # _(collection).must_include obj
63
64
  #
64
65
  # :method: must_include
65
66
 
@@ -68,7 +69,7 @@ module Minitest::Expectations
68
69
  ##
69
70
  # See Minitest::Assertions#assert_instance_of
70
71
  #
71
- # obj.must_be_instance_of klass
72
+ # _(obj).must_be_instance_of klass
72
73
  #
73
74
  # :method: must_be_instance_of
74
75
 
@@ -77,7 +78,7 @@ module Minitest::Expectations
77
78
  ##
78
79
  # See Minitest::Assertions#assert_kind_of
79
80
  #
80
- # obj.must_be_kind_of mod
81
+ # _(obj).must_be_kind_of mod
81
82
  #
82
83
  # :method: must_be_kind_of
83
84
 
@@ -86,7 +87,7 @@ module Minitest::Expectations
86
87
  ##
87
88
  # See Minitest::Assertions#assert_match
88
89
  #
89
- # a.must_match b
90
+ # _(a).must_match b
90
91
  #
91
92
  # :method: must_match
92
93
 
@@ -95,7 +96,7 @@ module Minitest::Expectations
95
96
  ##
96
97
  # See Minitest::Assertions#assert_nil
97
98
  #
98
- # obj.must_be_nil
99
+ # _(obj).must_be_nil
99
100
  #
100
101
  # :method: must_be_nil
101
102
 
@@ -104,11 +105,11 @@ module Minitest::Expectations
104
105
  ##
105
106
  # See Minitest::Assertions#assert_operator
106
107
  #
107
- # n.must_be :<=, 42
108
+ # _(n).must_be :<=, 42
108
109
  #
109
110
  # This can also do predicates:
110
111
  #
111
- # str.must_be :empty?
112
+ # _(str).must_be :empty?
112
113
  #
113
114
  # :method: must_be
114
115
 
@@ -117,7 +118,7 @@ module Minitest::Expectations
117
118
  ##
118
119
  # See Minitest::Assertions#assert_output
119
120
  #
120
- # proc { ... }.must_output out_or_nil [, err]
121
+ # _ { ... }.must_output out_or_nil [, err]
121
122
  #
122
123
  # :method: must_output
123
124
 
@@ -126,7 +127,7 @@ module Minitest::Expectations
126
127
  ##
127
128
  # See Minitest::Assertions#assert_raises
128
129
  #
129
- # proc { ... }.must_raise exception
130
+ # _ { ... }.must_raise exception
130
131
  #
131
132
  # :method: must_raise
132
133
 
@@ -135,7 +136,7 @@ module Minitest::Expectations
135
136
  ##
136
137
  # See Minitest::Assertions#assert_respond_to
137
138
  #
138
- # obj.must_respond_to msg
139
+ # _(obj).must_respond_to msg
139
140
  #
140
141
  # :method: must_respond_to
141
142
 
@@ -144,7 +145,7 @@ module Minitest::Expectations
144
145
  ##
145
146
  # See Minitest::Assertions#assert_same
146
147
  #
147
- # a.must_be_same_as b
148
+ # _(a).must_be_same_as b
148
149
  #
149
150
  # :method: must_be_same_as
150
151
 
@@ -153,7 +154,7 @@ module Minitest::Expectations
153
154
  ##
154
155
  # See Minitest::Assertions#assert_silent
155
156
  #
156
- # proc { ... }.must_be_silent
157
+ # _ { ... }.must_be_silent
157
158
  #
158
159
  # :method: must_be_silent
159
160
 
@@ -162,16 +163,34 @@ module Minitest::Expectations
162
163
  ##
163
164
  # See Minitest::Assertions#assert_throws
164
165
  #
165
- # proc { ... }.must_throw sym
166
+ # _ { ... }.must_throw sym
166
167
  #
167
168
  # :method: must_throw
168
169
 
169
170
  infect_an_assertion :assert_throws, :must_throw, :block
170
171
 
172
+ ##
173
+ # See Minitest::Assertions#assert_path_exists
174
+ #
175
+ # _(some_path).path_must_exist
176
+ #
177
+ # :method: path_must_exist
178
+
179
+ infect_an_assertion :assert_path_exists, :path_must_exist, :unary
180
+
181
+ ##
182
+ # See Minitest::Assertions#refute_path_exists
183
+ #
184
+ # _(some_path).path_wont_exist
185
+ #
186
+ # :method: path_wont_exist
187
+
188
+ infect_an_assertion :refute_path_exists, :path_wont_exist, :unary
189
+
171
190
  ##
172
191
  # See Minitest::Assertions#refute_empty
173
192
  #
174
- # collection.wont_be_empty
193
+ # _(collection).wont_be_empty
175
194
  #
176
195
  # :method: wont_be_empty
177
196
 
@@ -180,7 +199,7 @@ module Minitest::Expectations
180
199
  ##
181
200
  # See Minitest::Assertions#refute_equal
182
201
  #
183
- # a.wont_equal b
202
+ # _(a).wont_equal b
184
203
  #
185
204
  # :method: wont_equal
186
205
 
@@ -189,18 +208,18 @@ module Minitest::Expectations
189
208
  ##
190
209
  # See Minitest::Assertions#refute_in_delta
191
210
  #
192
- # n.wont_be_close_to m [, delta]
211
+ # _(n).wont_be_close_to m [, delta]
193
212
  #
194
213
  # :method: wont_be_close_to
195
214
 
196
215
  infect_an_assertion :refute_in_delta, :wont_be_close_to
197
216
 
198
- alias :wont_be_within_delta :wont_be_close_to # :nodoc:
217
+ infect_an_assertion :refute_in_delta, :wont_be_within_delta # :nodoc:
199
218
 
200
219
  ##
201
220
  # See Minitest::Assertions#refute_in_epsilon
202
221
  #
203
- # n.wont_be_within_epsilon m [, epsilon]
222
+ # _(n).wont_be_within_epsilon m [, epsilon]
204
223
  #
205
224
  # :method: wont_be_within_epsilon
206
225
 
@@ -209,7 +228,7 @@ module Minitest::Expectations
209
228
  ##
210
229
  # See Minitest::Assertions#refute_includes
211
230
  #
212
- # collection.wont_include obj
231
+ # _(collection).wont_include obj
213
232
  #
214
233
  # :method: wont_include
215
234
 
@@ -218,7 +237,7 @@ module Minitest::Expectations
218
237
  ##
219
238
  # See Minitest::Assertions#refute_instance_of
220
239
  #
221
- # obj.wont_be_instance_of klass
240
+ # _(obj).wont_be_instance_of klass
222
241
  #
223
242
  # :method: wont_be_instance_of
224
243
 
@@ -227,7 +246,7 @@ module Minitest::Expectations
227
246
  ##
228
247
  # See Minitest::Assertions#refute_kind_of
229
248
  #
230
- # obj.wont_be_kind_of mod
249
+ # _(obj).wont_be_kind_of mod
231
250
  #
232
251
  # :method: wont_be_kind_of
233
252
 
@@ -236,7 +255,7 @@ module Minitest::Expectations
236
255
  ##
237
256
  # See Minitest::Assertions#refute_match
238
257
  #
239
- # a.wont_match b
258
+ # _(a).wont_match b
240
259
  #
241
260
  # :method: wont_match
242
261
 
@@ -245,7 +264,7 @@ module Minitest::Expectations
245
264
  ##
246
265
  # See Minitest::Assertions#refute_nil
247
266
  #
248
- # obj.wont_be_nil
267
+ # _(obj).wont_be_nil
249
268
  #
250
269
  # :method: wont_be_nil
251
270
 
@@ -254,7 +273,7 @@ module Minitest::Expectations
254
273
  ##
255
274
  # See Minitest::Assertions#refute_operator
256
275
  #
257
- # n.wont_be :<=, 42
276
+ # _(n).wont_be :<=, 42
258
277
  #
259
278
  # This can also do predicates:
260
279
  #
@@ -267,7 +286,7 @@ module Minitest::Expectations
267
286
  ##
268
287
  # See Minitest::Assertions#refute_respond_to
269
288
  #
270
- # obj.wont_respond_to msg
289
+ # _(obj).wont_respond_to msg
271
290
  #
272
291
  # :method: wont_respond_to
273
292
 
@@ -276,7 +295,7 @@ module Minitest::Expectations
276
295
  ##
277
296
  # See Minitest::Assertions#refute_same
278
297
  #
279
- # a.wont_be_same_as b
298
+ # _(a).wont_be_same_as b
280
299
  #
281
300
  # :method: wont_be_same_as
282
301
 
data/lib/minitest/mock.rb CHANGED
@@ -207,7 +207,9 @@ class Object
207
207
  # assert obj_under_test.stale?
208
208
  # end
209
209
  # end
210
- #
210
+ #--
211
+ # NOTE: keyword args in callables are NOT checked for correctness
212
+ # against the existing method. Too many edge cases to be worth it.
211
213
 
212
214
  def stub name, val_or_callable, *block_args
213
215
  new_name = "__minitest_stub__#{name}"
@@ -231,6 +233,8 @@ class Object
231
233
  end
232
234
  end
233
235
 
236
+ metaclass.send(:ruby2_keywords, name) if metaclass.respond_to?(:ruby2_keywords, true)
237
+
234
238
  yield self
235
239
  ensure
236
240
  metaclass.send :undef_method, name
data/lib/minitest/spec.rb CHANGED
@@ -8,12 +8,16 @@ class Module # :nodoc:
8
8
  # warn "%-22p -> %p %p" % [meth, new_name, dont_flip]
9
9
  self.class_eval <<-EOM, __FILE__, __LINE__ + 1
10
10
  def #{new_name} *args
11
+ where = Minitest.filter_backtrace(caller).first
12
+ where = where.split(/:in /, 2).first # clean up noise
13
+ warn "DEPRECATED: global use of #{new_name} from #\{where}. Use _(obj).#{new_name} instead. This will fail in Minitest 6."
11
14
  Minitest::Expectation.new(self, Minitest::Spec.current).#{new_name}(*args)
12
15
  end
13
16
  EOM
14
17
 
15
18
  Minitest::Expectation.class_eval <<-EOM, __FILE__, __LINE__ + 1
16
19
  def #{new_name} *args
20
+ raise "Calling ##{new_name} outside of test." unless ctx
17
21
  case
18
22
  when #{!!dont_flip} then
19
23
  ctx.#{meth}(target, *args)
@@ -285,21 +289,28 @@ class Minitest::Spec < Minitest::Test
285
289
 
286
290
  module InstanceMethods
287
291
  ##
288
- # Returns a value monad that has all of Expectations methods
289
- # available to it.
292
+ # Takes a value or a block and returns a value monad that has
293
+ # all of Expectations methods available to it.
290
294
  #
291
- # Also aliased to #value and #expect for your aesthetic pleasure:
295
+ # _(1 + 1).must_equal 2
292
296
  #
293
- # _(1 + 1).must_equal 2
294
- # value(1 + 1).must_equal 2
295
- # expect(1 + 1).must_equal 2
297
+ # And for blocks:
298
+ #
299
+ # _ { 1 + "1" }.must_raise TypeError
296
300
  #
297
301
  # This method of expectation-based testing is preferable to
298
302
  # straight-expectation methods (on Object) because it stores its
299
303
  # test context, bypassing our hacky use of thread-local variables.
300
304
  #
301
- # At some point, the methods on Object will be deprecated and then
302
- # removed.
305
+ # NOTE: At some point, the methods on Object will be deprecated
306
+ # and then removed.
307
+ #
308
+ # It is also aliased to #value and #expect for your aesthetic
309
+ # pleasure:
310
+ #
311
+ # _(1 + 1).must_equal 2
312
+ # value(1 + 1).must_equal 2
313
+ # expect(1 + 1).must_equal 2
303
314
 
304
315
  def _ value = nil, &block
305
316
  Minitest::Expectation.new block || value, self
data/lib/minitest.rb CHANGED
@@ -8,7 +8,7 @@ require "stringio"
8
8
  # :include: README.rdoc
9
9
 
10
10
  module Minitest
11
- VERSION = "5.11.3" # :nodoc:
11
+ VERSION = "5.14.4" # :nodoc:
12
12
  ENCS = "".respond_to? :encoding # :nodoc:
13
13
 
14
14
  @@installed_at_exit ||= false
@@ -21,7 +21,10 @@ module Minitest
21
21
  # Parallel test executor
22
22
 
23
23
  mc.send :attr_accessor, :parallel_executor
24
- self.parallel_executor = Parallel::Executor.new((ENV["N"] || 2).to_i)
24
+
25
+ warn "DEPRECATED: use MT_CPU instead of N for parallel test runs" if ENV["N"]
26
+ n_threads = (ENV["MT_CPU"] || ENV["N"] || 2).to_i
27
+ self.parallel_executor = Parallel::Executor.new n_threads
25
28
 
26
29
  ##
27
30
  # Filter object for backtraces.
@@ -55,7 +58,9 @@ module Minitest
55
58
 
56
59
  exit_code = nil
57
60
 
61
+ pid = Process.pid
58
62
  at_exit {
63
+ next if Process.pid != pid
59
64
  @@after_run.reverse_each(&:call)
60
65
  exit exit_code || false
61
66
  }
@@ -233,7 +238,9 @@ module Minitest
233
238
  end
234
239
 
235
240
  def self.filter_backtrace bt # :nodoc:
236
- backtrace_filter.filter bt
241
+ result = backtrace_filter.filter bt
242
+ result = bt.dup if result.empty?
243
+ result
237
244
  end
238
245
 
239
246
  ##
@@ -301,7 +308,7 @@ module Minitest
301
308
 
302
309
  def self.run reporter, options = {}
303
310
  filter = options[:filter] || "/./"
304
- filter = Regexp.new $1 if filter =~ %r%/(.*)/%
311
+ filter = Regexp.new $1 if filter.is_a?(String) && filter =~ %r%/(.*)/%
305
312
 
306
313
  filtered_methods = self.runnable_methods.find_all { |m|
307
314
  filter === m || filter === "#{self}##{m}"
@@ -422,7 +429,8 @@ module Minitest
422
429
 
423
430
  ##
424
431
  # Returns a single character string to print based on the result
425
- # of the run. Eg ".", "F", or "E".
432
+ # of the run. One of <tt>"."</tt>, <tt>"F"</tt>,
433
+ # <tt>"E"</tt> or <tt>"S"</tt>.
426
434
 
427
435
  def result_code
428
436
  raise NotImplementedError, "subclass responsibility"
@@ -560,8 +568,10 @@ module Minitest
560
568
  end
561
569
 
562
570
  ##
563
- # Record a result and output the Runnable#result_code. Stores the
564
- # result of the run if the run did not pass.
571
+ # Output and record the result of the test. Call
572
+ # {result#result_code}[rdoc-ref:Runnable#result_code] to get the
573
+ # result character string. Stores the result of the run if the run
574
+ # did not pass.
565
575
 
566
576
  def record result
567
577
  end
@@ -628,18 +638,63 @@ module Minitest
628
638
  #
629
639
  # If you want to create an entirely different type of output (eg,
630
640
  # CI, HTML, etc), this is the place to start.
641
+ #
642
+ # Example:
643
+ #
644
+ # class JenkinsCIReporter < StatisticsReporter
645
+ # def report
646
+ # super # Needed to calculate some statistics
647
+ #
648
+ # print "<testsuite "
649
+ # print "tests='#{count}' "
650
+ # print "failures='#{failures}' "
651
+ # # Remaining XML...
652
+ # end
653
+ # end
631
654
 
632
655
  class StatisticsReporter < Reporter
633
- # :stopdoc:
656
+ ##
657
+ # Total number of assertions.
658
+
634
659
  attr_accessor :assertions
660
+
661
+ ##
662
+ # Total number of test cases.
663
+
635
664
  attr_accessor :count
665
+
666
+ ##
667
+ # An +Array+ of test cases that failed or were skipped.
668
+
636
669
  attr_accessor :results
670
+
671
+ ##
672
+ # Time the test run started. If available, the monotonic clock is
673
+ # used and this is a +Float+, otherwise it's an instance of
674
+ # +Time+.
675
+
637
676
  attr_accessor :start_time
677
+
678
+ ##
679
+ # Test run time. If available, the monotonic clock is used and
680
+ # this is a +Float+, otherwise it's an instance of +Time+.
681
+
638
682
  attr_accessor :total_time
683
+
684
+ ##
685
+ # Total number of tests that failed.
686
+
639
687
  attr_accessor :failures
688
+
689
+ ##
690
+ # Total number of tests that erred.
691
+
640
692
  attr_accessor :errors
693
+
694
+ ##
695
+ # Total number of tests that where skipped.
696
+
641
697
  attr_accessor :skips
642
- # :startdoc:
643
698
 
644
699
  def initialize io = $stdout, options = {} # :nodoc:
645
700
  super
@@ -669,7 +724,10 @@ module Minitest
669
724
  results << result if not result.passed? or result.skipped?
670
725
  end
671
726
 
672
- def report # :nodoc:
727
+ ##
728
+ # Report on the tracked statistics.
729
+
730
+ def report
673
731
  aggregate = results.group_by { |r| r.failure.class }
674
732
  aggregate.default = [] # dumb. group_by should provide this
675
733
 
@@ -851,24 +909,21 @@ module Minitest
851
909
  # Assertion wrapping an unexpected error that was raised during a run.
852
910
 
853
911
  class UnexpectedError < Assertion
854
- attr_accessor :exception # :nodoc:
912
+ # TODO: figure out how to use `cause` instead
913
+ attr_accessor :error # :nodoc:
855
914
 
856
- def initialize exception # :nodoc:
915
+ def initialize error # :nodoc:
857
916
  super "Unexpected exception"
858
- self.exception = exception
917
+ self.error = error
859
918
  end
860
919
 
861
920
  def backtrace # :nodoc:
862
- self.exception.backtrace
863
- end
864
-
865
- def error # :nodoc:
866
- self.exception
921
+ self.error.backtrace
867
922
  end
868
923
 
869
924
  def message # :nodoc:
870
925
  bt = Minitest.filter_backtrace(self.backtrace).join "\n "
871
- "#{self.exception.class}: #{self.exception.message}\n #{bt}"
926
+ "#{self.error.class}: #{self.error.message}\n #{bt}"
872
927
  end
873
928
 
874
929
  def result_label # :nodoc:
@@ -904,6 +959,9 @@ module Minitest
904
959
  # Is this running on maglev?
905
960
 
906
961
  def maglev? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE
962
+ where = Minitest.filter_backtrace(caller).first
963
+ where = where.split(/:in /, 2).first # clean up noise
964
+ warn "DEPRECATED: `maglev?` called from #{where}. This will fail in Minitest 6."
907
965
  "maglev" == platform
908
966
  end
909
967
 
@@ -914,10 +972,20 @@ module Minitest
914
972
  /^ruby/ =~ platform
915
973
  end
916
974
 
975
+ ##
976
+ # Is this running on macOS?
977
+
978
+ def osx? platform = RUBY_PLATFORM
979
+ /darwin/ =~ platform
980
+ end
981
+
917
982
  ##
918
983
  # Is this running on rubinius?
919
984
 
920
985
  def rubinius? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE
986
+ where = Minitest.filter_backtrace(caller).first
987
+ where = where.split(/:in /, 2).first # clean up noise
988
+ warn "DEPRECATED: `rubinius?` called from #{where}. This will fail in Minitest 6."
921
989
  "rbx" == platform
922
990
  end
923
991
 
@@ -939,12 +1007,13 @@ module Minitest
939
1007
  MT_RE = %r%lib/minitest% #:nodoc:
940
1008
 
941
1009
  ##
942
- # Filter +bt+ to something useful. Returns the whole thing if $DEBUG.
1010
+ # Filter +bt+ to something useful. Returns the whole thing if
1011
+ # $DEBUG (ruby) or $MT_DEBUG (env).
943
1012
 
944
1013
  def filter bt
945
1014
  return ["No backtrace"] unless bt
946
1015
 
947
- return bt.dup if $DEBUG
1016
+ return bt.dup if $DEBUG || ENV["MT_DEBUG"]
948
1017
 
949
1018
  new_bt = bt.take_while { |line| line !~ MT_RE }
950
1019
  new_bt = bt.select { |line| line !~ MT_RE } if new_bt.empty?
@@ -6,8 +6,27 @@ class Minitest::Test
6
6
  def clean s
7
7
  s.gsub(/^ {6}/, "")
8
8
  end
9
+
10
+ def with_empty_backtrace_filter
11
+ original = Minitest.backtrace_filter
12
+
13
+ obj = Minitest::BacktraceFilter.new
14
+ def obj.filter _bt
15
+ []
16
+ end
17
+
18
+ Minitest::Test.io_lock.synchronize do # try not to trounce in parallel
19
+ begin
20
+ Minitest.backtrace_filter = obj
21
+ yield
22
+ ensure
23
+ Minitest.backtrace_filter = original
24
+ end
25
+ end
26
+ end
9
27
  end
10
28
 
29
+
11
30
  class FakeNamedTest < Minitest::Test
12
31
  @@count = 0
13
32
 
@@ -19,9 +38,20 @@ class FakeNamedTest < Minitest::Test
19
38
  end
20
39
  end
21
40
 
41
+ module MyModule; end
42
+ class AnError < StandardError; include MyModule; end
43
+
22
44
  class MetaMetaMetaTestCase < Minitest::Test
23
45
  attr_accessor :reporter, :output, :tu
24
46
 
47
+ def with_stderr err
48
+ old = $stderr
49
+ $stderr = err
50
+ yield
51
+ ensure
52
+ $stderr = old
53
+ end
54
+
25
55
  def run_tu_with_fresh_reporter flags = %w[--seed 42]
26
56
  options = Minitest.process_args flags
27
57
 
@@ -31,18 +61,20 @@ class MetaMetaMetaTestCase < Minitest::Test
31
61
  reporter << Minitest::SummaryReporter.new(@output, options)
32
62
  reporter << Minitest::ProgressReporter.new(@output, options)
33
63
 
34
- reporter.start
64
+ with_stderr @output do
65
+ reporter.start
35
66
 
36
- yield(reporter) if block_given?
67
+ yield(reporter) if block_given?
37
68
 
38
- @tus ||= [@tu]
39
- @tus.each do |tu|
40
- Minitest::Runnable.runnables.delete tu
69
+ @tus ||= [@tu]
70
+ @tus.each do |tu|
71
+ Minitest::Runnable.runnables.delete tu
41
72
 
42
- tu.run reporter, options
43
- end
73
+ tu.run reporter, options
74
+ end
44
75
 
45
- reporter.report
76
+ reporter.report
77
+ end
46
78
  end
47
79
 
48
80
  def first_reporter
@@ -81,6 +113,8 @@ class MetaMetaMetaTestCase < Minitest::Test
81
113
  output.gsub!(/^(\s+)[^:]+:\d+:in/, '\1FILE:LINE:in')
82
114
  end
83
115
 
116
+ output.gsub!(/( at )[^:]+:\d+/, '\1[FILE:LINE]')
117
+
84
118
  output
85
119
  end
86
120