minitest 5.11.3 → 5.25.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,26 +1,18 @@
1
- # encoding: UTF-8
2
-
3
- require "pathname"
4
1
  require "minitest/metametameta"
5
2
 
6
- if defined? Encoding then
7
- e = Encoding.default_external
8
- if e != Encoding::UTF_8 then
9
- warn ""
10
- warn ""
11
- warn "NOTE: External encoding #{e} is not UTF-8. Tests WILL fail."
12
- warn " Run tests with `RUBYOPT=-Eutf-8 rake` to avoid errors."
13
- warn ""
14
- warn ""
15
- end
3
+ e = Encoding.default_external
4
+ if e != Encoding::UTF_8 then
5
+ warn ""
6
+ warn ""
7
+ warn "NOTE: External encoding #{e} is not UTF-8. Tests WILL fail."
8
+ warn " Run tests with `RUBYOPT=-Eutf-8 rake` to avoid errors."
9
+ warn ""
10
+ warn ""
16
11
  end
17
12
 
18
- module MyModule; end
19
- class AnError < StandardError; include MyModule; end
20
- class ImmutableString < String; def inspect; super.freeze; end; end
21
- SomeError = Class.new Exception
22
-
23
13
  class Minitest::Runnable
14
+ attr_reader :gc_stats # only needed if running w/ minitest-gcstats
15
+
24
16
  def whatever # faked for testing
25
17
  assert true
26
18
  end
@@ -29,46 +21,45 @@ end
29
21
  class TestMinitestUnit < MetaMetaMetaTestCase
30
22
  parallelize_me!
31
23
 
32
- pwd = Pathname.new File.expand_path Dir.pwd
33
- basedir = Pathname.new(File.expand_path "lib/minitest") + "mini"
34
- basedir = basedir.relative_path_from(pwd).to_s
35
- MINITEST_BASE_DIR = basedir[/\A\./] ? basedir : "./#{basedir}"
36
- BT_MIDDLE = ["#{MINITEST_BASE_DIR}/test.rb:161:in `each'",
37
- "#{MINITEST_BASE_DIR}/test.rb:158:in `each'",
38
- "#{MINITEST_BASE_DIR}/test.rb:139:in `run'",
39
- "#{MINITEST_BASE_DIR}/test.rb:106:in `run'"]
24
+ MINITEST_BASE_DIR = "./lib/minitest/mini"
25
+ BT_MIDDLE = ["#{MINITEST_BASE_DIR}/test.rb:161:in 'each'",
26
+ "#{MINITEST_BASE_DIR}/test.rb:158:in 'each'",
27
+ "#{MINITEST_BASE_DIR}/test.rb:139:in 'run'",
28
+ "#{MINITEST_BASE_DIR}/test.rb:106:in 'run'"]
40
29
 
41
30
  def test_filter_backtrace
42
31
  # this is a semi-lame mix of relative paths.
43
32
  # I cheated by making the autotest parts not have ./
44
- bt = (["lib/autotest.rb:571:in `add_exception'",
45
- "test/test_autotest.rb:62:in `test_add_exception'",
46
- "#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] +
33
+ bt = (["lib/autotest.rb:571:in 'add_exception'",
34
+ "test/test_autotest.rb:62:in 'test_add_exception'",
35
+ "#{MINITEST_BASE_DIR}/test.rb:165:in '__send__'"] +
47
36
  BT_MIDDLE +
48
37
  ["#{MINITEST_BASE_DIR}/test.rb:29",
49
38
  "test/test_autotest.rb:422"])
50
39
  bt = util_expand_bt bt
51
40
 
52
- ex = ["lib/autotest.rb:571:in `add_exception'",
53
- "test/test_autotest.rb:62:in `test_add_exception'"]
41
+ ex = ["lib/autotest.rb:571:in 'add_exception'",
42
+ "test/test_autotest.rb:62:in 'test_add_exception'"]
54
43
  ex = util_expand_bt ex
55
44
 
56
- fu = Minitest.filter_backtrace(bt)
45
+ Minitest::Test.io_lock.synchronize do # try not to trounce in parallel
46
+ fu = Minitest.filter_backtrace bt
57
47
 
58
- assert_equal ex, fu
48
+ assert_equal ex, fu
49
+ end
59
50
  end
60
51
 
61
52
  def test_filter_backtrace_all_unit
62
- bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] +
53
+ bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in '__send__'"] +
63
54
  BT_MIDDLE +
64
55
  ["#{MINITEST_BASE_DIR}/test.rb:29"])
65
56
  ex = bt.clone
66
- fu = Minitest.filter_backtrace(bt)
57
+ fu = Minitest.filter_backtrace bt
67
58
  assert_equal ex, fu
68
59
  end
69
60
 
70
61
  def test_filter_backtrace_unit_starts
71
- bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] +
62
+ bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in '__send__'"] +
72
63
  BT_MIDDLE +
73
64
  ["#{MINITEST_BASE_DIR}/mini/test.rb:29",
74
65
  "-e:1"])
@@ -76,13 +67,19 @@ class TestMinitestUnit < MetaMetaMetaTestCase
76
67
  bt = util_expand_bt bt
77
68
 
78
69
  ex = ["-e:1"]
79
- fu = Minitest.filter_backtrace bt
80
- assert_equal ex, fu
70
+ Minitest::Test.io_lock.synchronize do # try not to trounce in parallel
71
+ fu = Minitest.filter_backtrace bt
72
+ assert_equal ex, fu
73
+ end
81
74
  end
82
75
 
83
- # def test_default_runner_is_minitest_unit
84
- # assert_instance_of Minitest::Unit, Minitest::Unit.runner
85
- # end
76
+ def test_filter_backtrace__empty
77
+ with_empty_backtrace_filter do
78
+ bt = %w[first second third]
79
+ fu = Minitest.filter_backtrace bt.dup
80
+ assert_equal bt, fu
81
+ end
82
+ end
86
83
 
87
84
  def test_infectious_binary_encoding
88
85
  @tu = Class.new FakeNamedTest do
@@ -91,29 +88,31 @@ class TestMinitestUnit < MetaMetaMetaTestCase
91
88
  end
92
89
 
93
90
  def test_this_is_non_ascii_failure_message
94
- fail 'ЁЁЁ'.force_encoding('ASCII-8BIT')
91
+ raise "ЁЁЁ".dup.force_encoding(Encoding::BINARY)
95
92
  end
96
93
  end
97
94
 
98
- expected = clean <<-EOM
99
- EF
95
+ expected = <<~EOM
96
+ FE
100
97
 
101
98
  Finished in 0.00
102
99
 
103
- 1) Error:
100
+ 1) Failure:
101
+ FakeNamedTestXX#test_this_is_not_ascii_assertion [FILE:LINE]:
102
+ Expected: "ЁЁЁ"
103
+ Actual: "ёёё"
104
+
105
+ 2) Error:
104
106
  FakeNamedTestXX#test_this_is_non_ascii_failure_message:
105
107
  RuntimeError: ЁЁЁ
106
- FILE:LINE:in `test_this_is_non_ascii_failure_message'
107
-
108
- 2) Failure:
109
- FakeNamedTestXX#test_this_is_not_ascii_assertion [FILE:LINE]:
110
- Expected: \"ЁЁЁ\"
111
- Actual: \"ёёё\"
108
+ FILE:LINE:in 'test_this_is_non_ascii_failure_message'
112
109
 
113
110
  2 runs, 1 assertions, 1 failures, 1 errors, 0 skips
114
111
  EOM
115
112
 
116
- assert_report expected
113
+ Minitest::Test.io_lock.synchronize do # try not to trounce in parallel
114
+ assert_report expected
115
+ end
117
116
  end
118
117
 
119
118
  def test_passed_eh_teardown_good
@@ -159,11 +158,7 @@ class TestMinitestUnit < MetaMetaMetaTestCase
159
158
  end
160
159
 
161
160
  def util_expand_bt bt
162
- if RUBY_VERSION >= "1.9.0" then
163
- bt.map { |f| (f =~ /^\./) ? File.expand_path(f) : f }
164
- else
165
- bt
166
- end
161
+ bt.map { |f| f.start_with?(".") ? File.expand_path(f) : f }
167
162
  end
168
163
  end
169
164
 
@@ -207,15 +202,14 @@ class TestMinitestRunner < MetaMetaMetaTestCase
207
202
  def test_class_runnables
208
203
  @assertion_count = 0
209
204
 
210
- tc = Class.new(Minitest::Test)
205
+ tc = Class.new Minitest::Test
211
206
 
212
207
  assert_equal 1, Minitest::Test.runnables.size
213
208
  assert_equal [tc], Minitest::Test.runnables
214
209
  end
215
210
 
216
211
  def test_run_test
217
- @tu =
218
- Class.new FakeNamedTest do
212
+ @tu = Class.new FakeNamedTest do
219
213
  attr_reader :foo
220
214
 
221
215
  def run
@@ -231,7 +225,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
231
225
  end
232
226
  end
233
227
 
234
- expected = clean <<-EOM
228
+ expected = <<~EOM
235
229
  .
236
230
 
237
231
  Finished in 0.00
@@ -243,8 +237,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
243
237
  end
244
238
 
245
239
  def test_run_error
246
- @tu =
247
- Class.new FakeNamedTest do
240
+ @tu = Class.new FakeNamedTest do
248
241
  def test_something
249
242
  assert true
250
243
  end
@@ -254,15 +247,15 @@ class TestMinitestRunner < MetaMetaMetaTestCase
254
247
  end
255
248
  end
256
249
 
257
- expected = clean <<-EOM
258
- E.
250
+ expected = <<~EOM
251
+ .E
259
252
 
260
253
  Finished in 0.00
261
254
 
262
255
  1) Error:
263
256
  FakeNamedTestXX#test_error:
264
257
  RuntimeError: unhandled exception
265
- FILE:LINE:in \`test_error\'
258
+ FILE:LINE:in 'test_error'
266
259
 
267
260
  2 runs, 1 assertions, 0 failures, 1 errors, 0 skips
268
261
  EOM
@@ -271,8 +264,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
271
264
  end
272
265
 
273
266
  def test_run_error_teardown
274
- @tu =
275
- Class.new FakeNamedTest do
267
+ @tu = Class.new FakeNamedTest do
276
268
  def test_something
277
269
  assert true
278
270
  end
@@ -282,7 +274,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
282
274
  end
283
275
  end
284
276
 
285
- expected = clean <<-EOM
277
+ expected = <<~EOM
286
278
  E
287
279
 
288
280
  Finished in 0.00
@@ -290,7 +282,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
290
282
  1) Error:
291
283
  FakeNamedTestXX#test_something:
292
284
  RuntimeError: unhandled exception
293
- FILE:LINE:in \`teardown\'
285
+ FILE:LINE:in 'teardown'
294
286
 
295
287
  1 runs, 1 assertions, 0 failures, 1 errors, 0 skips
296
288
  EOM
@@ -301,8 +293,8 @@ class TestMinitestRunner < MetaMetaMetaTestCase
301
293
  def test_run_failing
302
294
  setup_basic_tu
303
295
 
304
- expected = clean <<-EOM
305
- F.
296
+ expected = <<~EOM
297
+ .F
306
298
 
307
299
  Finished in 0.00
308
300
 
@@ -317,8 +309,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
317
309
  end
318
310
 
319
311
  def setup_basic_tu
320
- @tu =
321
- Class.new FakeNamedTest do
312
+ @tu = Class.new FakeNamedTest do
322
313
  def test_something
323
314
  assert true
324
315
  end
@@ -329,10 +320,14 @@ class TestMinitestRunner < MetaMetaMetaTestCase
329
320
  end
330
321
  end
331
322
 
323
+ def test_seed # this is set for THIS run, so I'm not testing it's actual value
324
+ assert_instance_of Integer, Minitest.seed
325
+ end
326
+
332
327
  def test_run_failing_filtered
333
328
  setup_basic_tu
334
329
 
335
- expected = clean <<-EOM
330
+ expected = <<~EOM
336
331
  .
337
332
 
338
333
  Finished in 0.00
@@ -351,14 +346,14 @@ class TestMinitestRunner < MetaMetaMetaTestCase
351
346
  assert a
352
347
  end
353
348
  end
354
- Object.const_set(:Alpha, alpha)
349
+ Object.const_set :Alpha, alpha
355
350
 
356
351
  beta = Class.new FakeNamedTest do
357
352
  define_method :test_something do
358
353
  assert true
359
354
  end
360
355
  end
361
- Object.const_set(:Beta, beta)
356
+ Object.const_set :Beta, beta
362
357
 
363
358
  @tus = [alpha, beta]
364
359
 
@@ -369,7 +364,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
369
364
  end
370
365
 
371
366
  def test_run_filtered_including_suite_name
372
- expected = clean <<-EOM
367
+ expected = <<~EOM
373
368
  .
374
369
 
375
370
  Finished in 0.00
@@ -381,7 +376,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
381
376
  end
382
377
 
383
378
  def test_run_filtered_including_suite_name_string
384
- expected = clean <<-EOM
379
+ expected = <<~EOM
385
380
  .
386
381
 
387
382
  Finished in 0.00
@@ -393,7 +388,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
393
388
  end
394
389
 
395
390
  def test_run_filtered_string_method_only
396
- expected = clean <<-EOM
391
+ expected = <<~EOM
397
392
  ..
398
393
 
399
394
  Finished in 0.00
@@ -407,7 +402,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
407
402
  def test_run_failing_excluded
408
403
  setup_basic_tu
409
404
 
410
- expected = clean <<-EOM
405
+ expected = <<~EOM
411
406
  .
412
407
 
413
408
  Finished in 0.00
@@ -419,7 +414,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
419
414
  end
420
415
 
421
416
  def test_run_filtered_excluding_suite_name
422
- expected = clean <<-EOM
417
+ expected = <<~EOM
423
418
  .
424
419
 
425
420
  Finished in 0.00
@@ -431,7 +426,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
431
426
  end
432
427
 
433
428
  def test_run_filtered_excluding_suite_name_string
434
- expected = clean <<-EOM
429
+ expected = <<~EOM
435
430
  .
436
431
 
437
432
  Finished in 0.00
@@ -443,7 +438,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
443
438
  end
444
439
 
445
440
  def test_run_filtered_excluding_string_method_only
446
- expected = clean <<-EOM
441
+ expected = <<~EOM
447
442
 
448
443
 
449
444
  Finished in 0.00
@@ -455,14 +450,13 @@ class TestMinitestRunner < MetaMetaMetaTestCase
455
450
  end
456
451
 
457
452
  def test_run_passing
458
- @tu =
459
- Class.new FakeNamedTest do
453
+ @tu = Class.new FakeNamedTest do
460
454
  def test_something
461
455
  assert true
462
456
  end
463
457
  end
464
458
 
465
- expected = clean <<-EOM
459
+ expected = <<~EOM
466
460
  .
467
461
 
468
462
  Finished in 0.00
@@ -474,8 +468,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
474
468
  end
475
469
 
476
470
  def test_run_skip
477
- @tu =
478
- Class.new FakeNamedTest do
471
+ @tu = Class.new FakeNamedTest do
479
472
  def test_something
480
473
  assert true
481
474
  end
@@ -485,8 +478,8 @@ class TestMinitestRunner < MetaMetaMetaTestCase
485
478
  end
486
479
  end
487
480
 
488
- expected = clean <<-EOM
489
- S.
481
+ expected = <<~EOM
482
+ .S
490
483
 
491
484
  Finished in 0.00
492
485
 
@@ -501,8 +494,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
501
494
  end
502
495
 
503
496
  def test_run_skip_verbose
504
- @tu =
505
- Class.new FakeNamedTest do
497
+ @tu = Class.new FakeNamedTest do
506
498
  def test_something
507
499
  assert true
508
500
  end
@@ -512,9 +504,9 @@ class TestMinitestRunner < MetaMetaMetaTestCase
512
504
  end
513
505
  end
514
506
 
515
- expected = clean <<-EOM
516
- FakeNamedTestXX#test_skip = 0.00 s = S
507
+ expected = <<~EOM
517
508
  FakeNamedTestXX#test_something = 0.00 s = .
509
+ FakeNamedTestXX#test_skip = 0.00 s = S
518
510
 
519
511
  Finished in 0.00
520
512
 
@@ -528,9 +520,34 @@ class TestMinitestRunner < MetaMetaMetaTestCase
528
520
  assert_report expected, %w[--seed 42 --verbose]
529
521
  end
530
522
 
523
+ def test_run_skip_show_skips
524
+ @tu = Class.new FakeNamedTest do
525
+ def test_something
526
+ assert true
527
+ end
528
+
529
+ def test_skip
530
+ skip "not yet"
531
+ end
532
+ end
533
+
534
+ expected = <<~EOM
535
+ .S
536
+
537
+ Finished in 0.00
538
+
539
+ 1) Skipped:
540
+ FakeNamedTestXX#test_skip [FILE:LINE]:
541
+ not yet
542
+
543
+ 2 runs, 1 assertions, 0 failures, 0 errors, 1 skips
544
+ EOM
545
+
546
+ assert_report expected, %w[--seed 42 --show-skips]
547
+ end
548
+
531
549
  def test_run_with_other_runner
532
- @tu =
533
- Class.new FakeNamedTest do
550
+ @tu = Class.new FakeNamedTest do
534
551
  def self.run reporter, options = {}
535
552
  @reporter = reporter
536
553
  before_my_suite
@@ -553,7 +570,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
553
570
  end
554
571
  end
555
572
 
556
- expected = clean <<-EOM
573
+ expected = <<~EOM
557
574
  Running wacky! tests
558
575
  ..
559
576
 
@@ -587,8 +604,6 @@ class TestMinitestRunner < MetaMetaMetaTestCase
587
604
  end
588
605
 
589
606
  def test_run_parallel
590
- skip "I don't have ParallelEach debugged yet" if maglev?
591
-
592
607
  test_count = 2
593
608
  test_latch = Latch.new test_count
594
609
  wait_latch = Latch.new test_count
@@ -604,8 +619,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
604
619
  main_latch.release
605
620
  }
606
621
 
607
- @tu =
608
- Class.new FakeNamedTest do
622
+ @tu = Class.new FakeNamedTest do
609
623
  parallelize_me!
610
624
 
611
625
  test_count.times do |i|
@@ -622,7 +636,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
622
636
  end
623
637
  end
624
638
 
625
- expected = clean <<-EOM
639
+ expected = <<~EOM
626
640
  ..
627
641
 
628
642
  Finished in 0.00
@@ -630,18 +644,20 @@ class TestMinitestRunner < MetaMetaMetaTestCase
630
644
  2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
631
645
  EOM
632
646
 
633
- assert_report(expected) do |reporter|
634
- reporter.extend(Module.new {
635
- define_method("record") do |result|
647
+ skip if Minitest.parallel_executor.size < 2 # locks up test runner if 1 CPU
648
+
649
+ assert_report expected do |reporter|
650
+ reporter.extend Module.new {
651
+ define_method :record do |result|
636
652
  super(result)
637
653
  wait_latch.release
638
654
  end
639
655
 
640
- define_method("report") do
656
+ define_method :report do
641
657
  wait_latch.await
642
658
  super()
643
659
  end
644
- })
660
+ }
645
661
  end
646
662
  assert thread.join
647
663
  end
@@ -652,8 +668,8 @@ class TestMinitestUnitOrder < MetaMetaMetaTestCase
652
668
 
653
669
  def test_before_setup
654
670
  call_order = []
655
- @tu =
656
- Class.new FakeNamedTest do
671
+
672
+ @tu = Class.new FakeNamedTest do
657
673
  define_method :setup do
658
674
  super()
659
675
  call_order << :setup
@@ -668,14 +684,13 @@ class TestMinitestUnitOrder < MetaMetaMetaTestCase
668
684
 
669
685
  run_tu_with_fresh_reporter
670
686
 
671
- expected = [:before_setup, :setup]
687
+ expected = %i[before_setup setup]
672
688
  assert_equal expected, call_order
673
689
  end
674
690
 
675
691
  def test_after_teardown
676
692
  call_order = []
677
- @tu =
678
- Class.new FakeNamedTest do
693
+ @tu = Class.new FakeNamedTest do
679
694
  define_method :teardown do
680
695
  super()
681
696
  call_order << :teardown
@@ -690,14 +705,14 @@ class TestMinitestUnitOrder < MetaMetaMetaTestCase
690
705
 
691
706
  run_tu_with_fresh_reporter
692
707
 
693
- expected = [:teardown, :after_teardown]
708
+ expected = %i[teardown after_teardown]
694
709
  assert_equal expected, call_order
695
710
  end
696
711
 
697
712
  def test_all_teardowns_are_guaranteed_to_run
698
713
  call_order = []
699
- @tu =
700
- Class.new FakeNamedTest do
714
+
715
+ @tu = Class.new FakeNamedTest do
701
716
  define_method :after_teardown do
702
717
  super()
703
718
  call_order << :after_teardown
@@ -721,7 +736,7 @@ class TestMinitestUnitOrder < MetaMetaMetaTestCase
721
736
 
722
737
  run_tu_with_fresh_reporter
723
738
 
724
- expected = [:before_teardown, :teardown, :after_teardown]
739
+ expected = %i[before_teardown teardown after_teardown]
725
740
  assert_equal expected, call_order
726
741
  end
727
742
 
@@ -748,12 +763,19 @@ class TestMinitestUnitOrder < MetaMetaMetaTestCase
748
763
  run_tu_with_fresh_reporter
749
764
 
750
765
  # Once for the parent class, once for the child
751
- expected = [:setup_method, :test, :teardown_method] * 2
766
+ expected = %i[setup_method test teardown_method] * 2
752
767
 
753
768
  assert_equal expected, call_order
754
769
  end
755
770
  end
756
771
 
772
+ class BetterError < RuntimeError # like better_error w/o infecting RuntimeError
773
+ def set_backtrace bt
774
+ super
775
+ @bad_ivar = binding
776
+ end
777
+ end
778
+
757
779
  class TestMinitestRunnable < Minitest::Test
758
780
  def setup_marshal klass
759
781
  tc = klass.new "whatever"
@@ -774,6 +796,7 @@ class TestMinitestRunnable < Minitest::Test
774
796
  new_tc = Marshal.load Marshal.dump @tc
775
797
 
776
798
  ivars = new_tc.instance_variables.map(&:to_s).sort
799
+ ivars.delete "@gc_stats" # only needed if running w/ minitest-gcstats
777
800
  assert_equal expected_ivars, ivars
778
801
  assert_equal "whatever", new_tc.name
779
802
  assert_equal 42, new_tc.assertions
@@ -806,6 +829,145 @@ class TestMinitestRunnable < Minitest::Test
806
829
  assert_equal @tc.failures, over_the_wire.failures
807
830
  assert_equal @tc.klass, over_the_wire.klass
808
831
  end
832
+
833
+ def test_spec_marshal_with_exception
834
+ klass = describe("whatever") {
835
+ it("raises, badly") {
836
+ raise Class.new(StandardError), "this is bad!"
837
+ }
838
+ }
839
+
840
+ rm = klass.runnable_methods.first
841
+
842
+ # Run the test
843
+ @tc = klass.new(rm).run
844
+
845
+ assert_kind_of Minitest::Result, @tc
846
+ assert_instance_of Minitest::UnexpectedError, @tc.failure
847
+
848
+ msg = @tc.failure.error.message
849
+ assert_includes msg, "Neutered Exception #<Class:"
850
+ assert_includes msg, "this is bad!"
851
+
852
+ # Pass it over the wire
853
+ over_the_wire = Marshal.load Marshal.dump @tc
854
+
855
+ assert_equal @tc.time, over_the_wire.time
856
+ assert_equal @tc.name, over_the_wire.name
857
+ assert_equal @tc.assertions, over_the_wire.assertions
858
+ assert_equal @tc.failures, over_the_wire.failures
859
+ assert_equal @tc.klass, over_the_wire.klass
860
+ end
861
+
862
+ def test_spec_marshal_with_exception_nameerror
863
+ klass = describe "whatever" do
864
+ it "raises NameError" do
865
+ NOPE::does_not_exist
866
+ end
867
+ end
868
+
869
+ rm = klass.runnable_methods.first
870
+
871
+ # Run the test
872
+ @tc = klass.new(rm).run
873
+
874
+ assert_kind_of Minitest::Result, @tc
875
+ assert_instance_of Minitest::UnexpectedError, @tc.failure
876
+
877
+ msg = @tc.failure.error.message
878
+ assert_includes msg, "uninitialized constant TestMinitestRunnable::NOPE"
879
+
880
+ # Pass it over the wire
881
+ over_the_wire = Marshal.load Marshal.dump @tc
882
+
883
+ assert_equal @tc.time, over_the_wire.time
884
+ assert_equal @tc.name, over_the_wire.name
885
+ assert_equal @tc.assertions, over_the_wire.assertions
886
+ assert_equal @tc.failures, over_the_wire.failures
887
+ assert_equal @tc.klass, over_the_wire.klass
888
+ end
889
+
890
+ def with_runtime_error klass
891
+ old_runtime = RuntimeError
892
+ Object.send :remove_const, :RuntimeError
893
+ Object.const_set :RuntimeError, klass
894
+ yield
895
+ ensure
896
+ Object.send :remove_const, :RuntimeError
897
+ Object.const_set :RuntimeError, old_runtime
898
+ end
899
+
900
+ def test_spec_marshal_with_exception__better_error_typeerror
901
+ klass = describe("whatever") {
902
+ it("raises with binding") {
903
+ raise BetterError, "boom"
904
+ }
905
+ }
906
+
907
+ rm = klass.runnable_methods.first
908
+
909
+ # Run the test
910
+ @tc = with_runtime_error BetterError do
911
+ klass.new(rm).run
912
+ end
913
+
914
+ assert_kind_of Minitest::Result, @tc
915
+ assert_instance_of Minitest::UnexpectedError, @tc.failure
916
+
917
+ msg = @tc.failure.error.message
918
+ assert_equal "Neutered Exception BetterError: boom", msg
919
+
920
+ # Pass it over the wire
921
+ over_the_wire = Marshal.load Marshal.dump @tc
922
+
923
+ assert_equal @tc.time, over_the_wire.time
924
+ assert_equal @tc.name, over_the_wire.name
925
+ assert_equal @tc.assertions, over_the_wire.assertions
926
+ assert_equal @tc.failures, over_the_wire.failures
927
+ assert_equal @tc.klass, over_the_wire.klass
928
+ end
929
+
930
+ def test_spec_marshal_with_exception__worse_error_typeerror
931
+ worse_error_klass = Class.new StandardError do
932
+ # problem #1: anonymous subclass can't marshal, fails sanitize_exception
933
+ def initialize record = nil
934
+ super(record.first)
935
+ end
936
+ end
937
+
938
+ klass = describe("whatever") {
939
+ it("raises with NoMethodError") {
940
+ # problem #2: instantiated with a NON-string argument
941
+ #
942
+ # problem #3: arg responds to #first, but it becomes message
943
+ # which gets passed back in via new_exception
944
+ # that passes a string to worse_error_klass#initialize
945
+ # which calls first on it, which raises NoMethodError
946
+ raise worse_error_klass.new(["boom"])
947
+ }
948
+ }
949
+
950
+ rm = klass.runnable_methods.first
951
+
952
+ # Run the test
953
+ @tc = klass.new(rm).run
954
+
955
+ assert_kind_of Minitest::Result, @tc
956
+ assert_instance_of Minitest::UnexpectedError, @tc.failure
957
+
958
+ msg = @tc.failure.error.message.gsub(/0x[A-Fa-f0-9]+/, "0xXXX")
959
+
960
+ assert_equal "Neutered Exception #<Class:0xXXX>: boom", msg
961
+
962
+ # Pass it over the wire
963
+ over_the_wire = Marshal.load Marshal.dump @tc
964
+
965
+ assert_equal @tc.time, over_the_wire.time
966
+ assert_equal @tc.name, over_the_wire.name
967
+ assert_equal @tc.assertions, over_the_wire.assertions
968
+ assert_equal @tc.failures, over_the_wire.failures
969
+ assert_equal @tc.klass, over_the_wire.klass
970
+ end
809
971
  end
810
972
 
811
973
  class TestMinitestTest < TestMinitestRunnable
@@ -825,8 +987,6 @@ class TestMinitestUnitTestCase < Minitest::Test
825
987
  # which is not threadsafe. Nearly every method in here is an
826
988
  # assertion test so it isn't worth splitting it out further.
827
989
 
828
- RUBY18 = !defined? Encoding
829
-
830
990
  def setup
831
991
  super
832
992
 
@@ -851,1176 +1011,137 @@ class TestMinitestUnitTestCase < Minitest::Test
851
1011
  $VERBOSE = orig_verbose
852
1012
  end
853
1013
 
854
- def test_assert
855
- @assertion_count = 2
856
-
857
- @tc.assert_equal true, @tc.assert(true), "returns true on success"
858
- end
859
-
860
- def test_assert__triggered
861
- assert_triggered "Expected false to be truthy." do
862
- @tc.assert false
863
- end
1014
+ def sample_test_case rand
1015
+ srand rand
1016
+ Class.new FakeNamedTest do
1017
+ 100.times do |i|
1018
+ define_method("test_#{i}") { assert true }
1019
+ end
1020
+ end.runnable_methods
864
1021
  end
865
1022
 
866
- def test_assert__triggered_message
867
- assert_triggered @zomg do
868
- @tc.assert false, @zomg
869
- end
870
- end
1023
+ # srand varies with OS
1024
+ def test_runnable_methods_random
1025
+ @assertion_count = 0
871
1026
 
872
- def test_assert_empty
873
- @assertion_count = 2
1027
+ random_tests_1 = sample_test_case 42
1028
+ random_tests_2 = sample_test_case 42
1029
+ random_tests_3 = sample_test_case 1_000
874
1030
 
875
- @tc.assert_empty []
1031
+ assert_equal random_tests_1, random_tests_2
1032
+ assert_equal random_tests_1, random_tests_3
876
1033
  end
877
1034
 
878
- def test_assert_empty_triggered
879
- @assertion_count = 2
1035
+ def test_runnable_methods_sorted
1036
+ @assertion_count = 0
880
1037
 
881
- assert_triggered "Expected [1] to be empty." do
882
- @tc.assert_empty [1]
1038
+ sample_test_case = Class.new FakeNamedTest do
1039
+ def self.test_order; :sorted end
1040
+ def test_test3; assert "does not matter" end
1041
+ def test_test2; assert "does not matter" end
1042
+ def test_test1; assert "does not matter" end
883
1043
  end
884
- end
885
1044
 
886
- def test_assert_equal
887
- @tc.assert_equal 1, 1
1045
+ expected = %w[test_test1 test_test2 test_test3]
1046
+ assert_equal expected, sample_test_case.runnable_methods
888
1047
  end
889
1048
 
890
- def test_assert_equal_different_collection_array_hex_invisible
891
- object1 = Object.new
892
- object2 = Object.new
893
- msg = "No visible difference in the Array#inspect output.
894
- You should look at the implementation of #== on Array or its members.
895
- [#<Object:0xXXXXXX>]".gsub(/^ +/, "")
896
- assert_triggered msg do
897
- @tc.assert_equal [object1], [object2]
898
- end
899
- end
1049
+ def test_i_suck_and_my_tests_are_order_dependent_bang_sets_test_order_alpha
1050
+ @assertion_count = 0
900
1051
 
901
- def test_assert_equal_different_collection_hash_hex_invisible
902
- h1, h2 = {}, {}
903
- h1[1] = Object.new
904
- h2[1] = Object.new
905
- msg = "No visible difference in the Hash#inspect output.
906
- You should look at the implementation of #== on Hash or its members.
907
- {1=>#<Object:0xXXXXXX>}".gsub(/^ +/, "")
1052
+ shitty_test_case = Class.new FakeNamedTest
908
1053
 
909
- assert_triggered msg do
910
- @tc.assert_equal h1, h2
911
- end
912
- end
1054
+ shitty_test_case.i_suck_and_my_tests_are_order_dependent!
913
1055
 
914
- def test_assert_equal_string_encodings
915
- msg = <<-EOM.gsub(/^ {10}/, "")
916
- --- expected
917
- +++ actual
918
- @@ -1 +1,2 @@
919
- +# encoding: ASCII-8BIT
920
- "bad-utf8-\\xF1.txt"
921
- EOM
1056
+ assert_equal :alpha, shitty_test_case.test_order
1057
+ end
922
1058
 
923
- assert_triggered msg do
924
- x = "bad-utf8-\xF1.txt"
925
- y = x.dup.force_encoding "binary" # TODO: switch to .b when 1.9 dropped
926
- @tc.assert_equal x, y
927
- end
928
- end unless RUBY18
929
-
930
- def test_assert_equal_string_encodings_both_different
931
- msg = <<-EOM.gsub(/^ {10}/, "")
932
- --- expected
933
- +++ actual
934
- @@ -1,2 +1,2 @@
935
- -# encoding: US-ASCII
936
- +# encoding: ASCII-8BIT
937
- "bad-utf8-\\xF1.txt"
938
- EOM
939
-
940
- assert_triggered msg do
941
- x = "bad-utf8-\xF1.txt".force_encoding "ASCII"
942
- y = x.dup.force_encoding "binary" # TODO: switch to .b when 1.9 dropped
943
- @tc.assert_equal x, y
944
- end
945
- end unless RUBY18
1059
+ def test_i_suck_and_my_tests_are_order_dependent_bang_does_not_warn
1060
+ @assertion_count = 0
946
1061
 
947
- def test_assert_equal_different_diff_deactivated
948
- skip "https://github.com/MagLev/maglev/issues/209" if maglev?
1062
+ shitty_test_case = Class.new FakeNamedTest
949
1063
 
950
- without_diff do
951
- assert_triggered util_msg("haha" * 10, "blah" * 10) do
952
- o1 = "haha" * 10
953
- o2 = "blah" * 10
1064
+ def shitty_test_case.test_order; :lol end
954
1065
 
955
- @tc.assert_equal o1, o2
956
- end
1066
+ assert_silent do
1067
+ shitty_test_case.i_suck_and_my_tests_are_order_dependent!
957
1068
  end
958
1069
  end
959
1070
 
960
- def test_assert_equal_different_hex
961
- c = Class.new do
962
- def initialize s; @name = s; end
963
- end
964
-
965
- o1 = c.new "a"
966
- o2 = c.new "b"
967
- msg = "--- expected
968
- +++ actual
969
- @@ -1 +1 @@
970
- -#<#<Class:0xXXXXXX>:0xXXXXXX @name=\"a\">
971
- +#<#<Class:0xXXXXXX>:0xXXXXXX @name=\"b\">
972
- ".gsub(/^ +/, "")
973
-
974
- assert_triggered msg do
975
- @tc.assert_equal o1, o2
976
- end
1071
+ def test_autorun_does_not_affect_fork_success_status
1072
+ @assertion_count = 0
1073
+ skip "windows doesn't have fork" unless Process.respond_to? :fork
1074
+ Process.waitpid(fork {})
1075
+ assert_equal true, $?.success?
977
1076
  end
978
1077
 
979
- def test_assert_equal_different_hex_invisible
980
- o1 = Object.new
981
- o2 = Object.new
982
-
983
- msg = "No visible difference in the Object#inspect output.
984
- You should look at the implementation of #== on Object or its members.
985
- #<Object:0xXXXXXX>".gsub(/^ +/, "")
986
-
987
- assert_triggered msg do
988
- @tc.assert_equal o1, o2
989
- end
1078
+ def test_autorun_does_not_affect_fork_exit_status
1079
+ @assertion_count = 0
1080
+ skip "windows doesn't have fork" unless Process.respond_to? :fork
1081
+ Process.waitpid(fork { exit 42 })
1082
+ assert_equal 42, $?.exitstatus
990
1083
  end
991
1084
 
992
- def test_assert_equal_different_long
993
- msg = "--- expected
994
- +++ actual
995
- @@ -1 +1 @@
996
- -\"hahahahahahahahahahahahahahahahahahahaha\"
997
- +\"blahblahblahblahblahblahblahblahblahblah\"
998
- ".gsub(/^ +/, "")
999
-
1000
- assert_triggered msg do
1001
- o1 = "haha" * 10
1002
- o2 = "blah" * 10
1003
-
1004
- @tc.assert_equal o1, o2
1005
- end
1085
+ def test_autorun_optionally_can_affect_fork_exit_status
1086
+ @assertion_count = 0
1087
+ skip "windows doesn't have fork" unless Process.respond_to? :fork
1088
+ Minitest.allow_fork = true
1089
+ Process.waitpid(fork { exit 42 })
1090
+ refute_equal 42, $?.exitstatus
1091
+ ensure
1092
+ Minitest.allow_fork = false
1006
1093
  end
1094
+ end
1007
1095
 
1008
- def test_assert_equal_different_long_invisible
1009
- msg = "No visible difference in the String#inspect output.
1010
- You should look at the implementation of #== on String or its members.
1011
- \"blahblahblahblahblahblahblahblahblahblah\"".gsub(/^ +/, "")
1096
+ class TestMinitestGuard < Minitest::Test
1097
+ parallelize_me!
1012
1098
 
1013
- assert_triggered msg do
1014
- o1 = "blah" * 10
1015
- o2 = "blah" * 10
1016
- def o1.== _
1017
- false
1018
- end
1019
- @tc.assert_equal o1, o2
1020
- end
1099
+ def test_mri_eh
1100
+ assert self.class.mri? "ruby blah"
1101
+ assert self.mri? "ruby blah"
1021
1102
  end
1022
1103
 
1023
- def test_assert_equal_different_long_msg
1024
- msg = "message.
1025
- --- expected
1026
- +++ actual
1027
- @@ -1 +1 @@
1028
- -\"hahahahahahahahahahahahahahahahahahahaha\"
1029
- +\"blahblahblahblahblahblahblahblahblahblah\"
1030
- ".gsub(/^ +/, "")
1031
-
1032
- assert_triggered msg do
1033
- o1 = "haha" * 10
1034
- o2 = "blah" * 10
1035
- @tc.assert_equal o1, o2, "message"
1036
- end
1104
+ def test_jruby_eh
1105
+ assert self.class.jruby? "java"
1106
+ assert self.jruby? "java"
1037
1107
  end
1038
1108
 
1039
- def test_assert_equal_different_short
1040
- assert_triggered util_msg(1, 2) do
1041
- @tc.assert_equal 1, 2
1109
+ def test_rubinius_eh
1110
+ assert_deprecation do
1111
+ assert self.class.rubinius? "rbx"
1042
1112
  end
1043
- end
1044
-
1045
- def test_assert_equal_different_short_msg
1046
- assert_triggered util_msg(1, 2, "message") do
1047
- @tc.assert_equal 1, 2, "message"
1113
+ assert_deprecation do
1114
+ assert self.rubinius? "rbx"
1048
1115
  end
1049
1116
  end
1050
1117
 
1051
- def test_assert_equal_different_short_multiline
1052
- msg = "--- expected\n+++ actual\n@@ -1,2 +1,2 @@\n \"a\n-b\"\n+c\"\n"
1053
- assert_triggered msg do
1054
- @tc.assert_equal "a\nb", "a\nc"
1118
+ def test_maglev_eh
1119
+ assert_deprecation do
1120
+ assert self.class.maglev? "maglev"
1055
1121
  end
1056
- end
1057
-
1058
- def test_assert_equal_does_not_allow_lhs_nil
1059
- if Minitest::VERSION =~ /^6/ then
1060
- warn "Time to strip the MT5 test"
1061
-
1062
- @assertion_count += 1
1063
- assert_triggered(/Use assert_nil if expecting nil/) do
1064
- @tc.assert_equal nil, nil
1065
- end
1066
- else
1067
- err_re = /Use assert_nil if expecting nil from .*test_minitest_test.rb/
1068
- err_re = "" if $-w.nil?
1069
-
1070
- assert_output "", err_re do
1071
- @tc.assert_equal nil, nil
1072
- end
1122
+ assert_deprecation do
1123
+ assert self.maglev? "maglev"
1073
1124
  end
1074
1125
  end
1075
1126
 
1076
- def test_assert_equal_does_not_allow_lhs_nil_triggered
1077
- assert_triggered "Expected: nil\n Actual: false" do
1078
- @tc.assert_equal nil, false
1079
- end
1127
+ def test_osx_eh
1128
+ assert self.class.osx? "darwin"
1129
+ assert self.osx? "darwin"
1080
1130
  end
1081
1131
 
1082
- def test_assert_in_delta
1083
- @tc.assert_in_delta 0.0, 1.0 / 1000, 0.1
1132
+ def test_windows_eh
1133
+ assert self.class.windows? "mswin"
1134
+ assert self.windows? "mswin"
1084
1135
  end
1136
+ end
1085
1137
 
1086
- def test_delta_consistency
1087
- @assertion_count = 2
1138
+ class TestMinitestUnitRecording < MetaMetaMetaTestCase
1139
+ # do not parallelize this suite... it just can't handle it.
1088
1140
 
1089
- @tc.assert_in_delta 0, 1, 1
1141
+ def assert_run_record *expected, &block
1142
+ @tu = Class.new FakeNamedTest, &block
1090
1143
 
1091
- assert_triggered "Expected |0 - 1| (1) to not be <= 1." do
1092
- @tc.refute_in_delta 0, 1, 1
1093
- end
1094
- end
1095
-
1096
- def test_assert_in_delta_triggered
1097
- x = maglev? ? "9.999999xxxe-07" : "1.0e-06"
1098
- assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= #{x}." do
1099
- @tc.assert_in_delta 0.0, 1.0 / 1000, 0.000001
1100
- end
1101
- end
1102
-
1103
- def test_assert_in_epsilon
1104
- @assertion_count = 10
1105
-
1106
- @tc.assert_in_epsilon 10_000, 9991
1107
- @tc.assert_in_epsilon 9991, 10_000
1108
- @tc.assert_in_epsilon 1.0, 1.001
1109
- @tc.assert_in_epsilon 1.001, 1.0
1110
-
1111
- @tc.assert_in_epsilon 10_000, 9999.1, 0.0001
1112
- @tc.assert_in_epsilon 9999.1, 10_000, 0.0001
1113
- @tc.assert_in_epsilon 1.0, 1.0001, 0.0001
1114
- @tc.assert_in_epsilon 1.0001, 1.0, 0.0001
1115
-
1116
- @tc.assert_in_epsilon(-1, -1)
1117
- @tc.assert_in_epsilon(-10_000, -9991)
1118
- end
1119
-
1120
- def test_epsilon_consistency
1121
- @assertion_count = 2
1122
-
1123
- @tc.assert_in_epsilon 1.0, 1.001
1124
-
1125
- msg = "Expected |1.0 - 1.001| (0.000999xxx) to not be <= 0.001."
1126
- assert_triggered msg do
1127
- @tc.refute_in_epsilon 1.0, 1.001
1128
- end
1129
- end
1130
-
1131
- def test_assert_in_epsilon_triggered
1132
- assert_triggered "Expected |10000 - 9990| (10) to be <= 9.99." do
1133
- @tc.assert_in_epsilon 10_000, 9990
1134
- end
1135
- end
1136
-
1137
- def test_assert_in_epsilon_triggered_negative_case
1138
- x = (RUBY18 and not maglev?) ? "0.1" : "0.100000xxx"
1139
- y = maglev? ? "0.100000xxx" : "0.1"
1140
- assert_triggered "Expected |-1.1 - -1| (#{x}) to be <= #{y}." do
1141
- @tc.assert_in_epsilon(-1.1, -1, 0.1)
1142
- end
1143
- end
1144
-
1145
- def test_assert_includes
1146
- @assertion_count = 2
1147
-
1148
- @tc.assert_includes [true], true
1149
- end
1150
-
1151
- def test_assert_includes_triggered
1152
- @assertion_count = 3
1153
-
1154
- e = @tc.assert_raises Minitest::Assertion do
1155
- @tc.assert_includes [true], false
1156
- end
1157
-
1158
- expected = "Expected [true] to include false."
1159
- assert_equal expected, e.message
1160
- end
1161
-
1162
- def test_assert_instance_of
1163
- @tc.assert_instance_of String, "blah"
1164
- end
1165
-
1166
- def test_assert_instance_of_triggered
1167
- assert_triggered 'Expected "blah" to be an instance of Array, not String.' do
1168
- @tc.assert_instance_of Array, "blah"
1169
- end
1170
- end
1171
-
1172
- def test_assert_kind_of
1173
- @tc.assert_kind_of String, "blah"
1174
- end
1175
-
1176
- def test_assert_kind_of_triggered
1177
- assert_triggered 'Expected "blah" to be a kind of Array, not String.' do
1178
- @tc.assert_kind_of Array, "blah"
1179
- end
1180
- end
1181
-
1182
- def test_assert_match
1183
- @assertion_count = 2
1184
- @tc.assert_match(/\w+/, "blah blah blah")
1185
- end
1186
-
1187
- def test_assert_match_matcher_object
1188
- @assertion_count = 2
1189
-
1190
- pattern = Object.new
1191
- def pattern.=~ _; true end
1192
-
1193
- @tc.assert_match pattern, 5
1194
- end
1195
-
1196
- def test_assert_match_matchee_to_str
1197
- @assertion_count = 2
1198
-
1199
- obj = Object.new
1200
- def obj.to_str; "blah" end
1201
-
1202
- @tc.assert_match "blah", obj
1203
- end
1204
-
1205
- def test_assert_match_object_triggered
1206
- @assertion_count = 2
1207
-
1208
- pattern = Object.new
1209
- def pattern.=~ _; false end
1210
- def pattern.inspect; "[Object]" end
1211
-
1212
- assert_triggered "Expected [Object] to match 5." do
1213
- @tc.assert_match pattern, 5
1214
- end
1215
- end
1216
-
1217
- def test_assert_match_triggered
1218
- @assertion_count = 2
1219
- assert_triggered 'Expected /\d+/ to match "blah blah blah".' do
1220
- @tc.assert_match(/\d+/, "blah blah blah")
1221
- end
1222
- end
1223
-
1224
- def test_assert_nil
1225
- @tc.assert_nil nil
1226
- end
1227
-
1228
- def test_assert_nil_triggered
1229
- assert_triggered "Expected 42 to be nil." do
1230
- @tc.assert_nil 42
1231
- end
1232
- end
1233
-
1234
- def test_assert_operator
1235
- @tc.assert_operator 2, :>, 1
1236
- end
1237
-
1238
- def test_assert_operator_bad_object
1239
- bad = Object.new
1240
- def bad.== _; true end
1241
-
1242
- @tc.assert_operator bad, :equal?, bad
1243
- end
1244
-
1245
- def test_assert_operator_triggered
1246
- assert_triggered "Expected 2 to be < 1." do
1247
- @tc.assert_operator 2, :<, 1
1248
- end
1249
- end
1250
-
1251
- def test_assert_output_both
1252
- @assertion_count = 2
1253
-
1254
- @tc.assert_output "yay", "blah" do
1255
- print "yay"
1256
- $stderr.print "blah"
1257
- end
1258
- end
1259
-
1260
- def test_assert_output_both_regexps
1261
- @assertion_count = 4
1262
-
1263
- @tc.assert_output(/y.y/, /bl.h/) do
1264
- print "yay"
1265
- $stderr.print "blah"
1266
- end
1267
- end
1268
-
1269
- def test_assert_output_err
1270
- @tc.assert_output nil, "blah" do
1271
- $stderr.print "blah"
1272
- end
1273
- end
1274
-
1275
- def test_assert_output_neither
1276
- @assertion_count = 0
1277
-
1278
- @tc.assert_output do
1279
- # do nothing
1280
- end
1281
- end
1282
-
1283
- def test_assert_output_out
1284
- @tc.assert_output "blah" do
1285
- print "blah"
1286
- end
1287
- end
1288
-
1289
- def test_assert_output_triggered_both
1290
- assert_triggered util_msg("blah", "blah blah", "In stderr") do
1291
- @tc.assert_output "yay", "blah" do
1292
- print "boo"
1293
- $stderr.print "blah blah"
1294
- end
1295
- end
1296
- end
1297
-
1298
- def test_assert_output_triggered_err
1299
- assert_triggered util_msg("blah", "blah blah", "In stderr") do
1300
- @tc.assert_output nil, "blah" do
1301
- $stderr.print "blah blah"
1302
- end
1303
- end
1304
- end
1305
-
1306
- def test_assert_output_triggered_out
1307
- assert_triggered util_msg("blah", "blah blah", "In stdout") do
1308
- @tc.assert_output "blah" do
1309
- print "blah blah"
1310
- end
1311
- end
1312
- end
1313
-
1314
- def test_assert_predicate
1315
- @tc.assert_predicate "", :empty?
1316
- end
1317
-
1318
- def test_assert_predicate_triggered
1319
- assert_triggered 'Expected "blah" to be empty?.' do
1320
- @tc.assert_predicate "blah", :empty?
1321
- end
1322
- end
1323
-
1324
- def test_assert_raises
1325
- @tc.assert_raises RuntimeError do
1326
- raise "blah"
1327
- end
1328
- end
1329
-
1330
- def test_assert_raises_default
1331
- @tc.assert_raises do
1332
- raise StandardError, "blah"
1333
- end
1334
- end
1335
-
1336
- def test_assert_raises_default_triggered
1337
- e = assert_raises Minitest::Assertion do
1338
- @tc.assert_raises do
1339
- raise SomeError, "blah"
1340
- end
1341
- end
1342
-
1343
- expected = clean <<-EOM.chomp
1344
- [StandardError] exception expected, not
1345
- Class: <SomeError>
1346
- Message: <\"blah\">
1347
- ---Backtrace---
1348
- FILE:LINE:in \`test_assert_raises_default_triggered\'
1349
- ---------------
1350
- EOM
1351
-
1352
- actual = e.message.gsub(/^.+:\d+/, "FILE:LINE")
1353
- actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0"
1354
-
1355
- assert_equal expected, actual
1356
- end
1357
-
1358
- def test_assert_raises_module
1359
- @tc.assert_raises MyModule do
1360
- raise AnError
1361
- end
1362
- end
1363
-
1364
- ##
1365
- # *sigh* This is quite an odd scenario, but it is from real (albeit
1366
- # ugly) test code in ruby-core:
1367
- #
1368
- # http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29259
1369
-
1370
- def test_assert_raises_skip
1371
- @assertion_count = 0
1372
-
1373
- assert_triggered "skipped", Minitest::Skip do
1374
- @tc.assert_raises ArgumentError do
1375
- begin
1376
- raise "blah"
1377
- rescue
1378
- skip "skipped"
1379
- end
1380
- end
1381
- end
1382
- end
1383
-
1384
- def test_assert_raises_triggered_different
1385
- e = assert_raises Minitest::Assertion do
1386
- @tc.assert_raises RuntimeError do
1387
- raise SyntaxError, "icky"
1388
- end
1389
- end
1390
-
1391
- expected = clean <<-EOM.chomp
1392
- [RuntimeError] exception expected, not
1393
- Class: <SyntaxError>
1394
- Message: <\"icky\">
1395
- ---Backtrace---
1396
- FILE:LINE:in \`test_assert_raises_triggered_different\'
1397
- ---------------
1398
- EOM
1399
-
1400
- actual = e.message.gsub(/^.+:\d+/, "FILE:LINE")
1401
- actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0"
1402
-
1403
- assert_equal expected, actual
1404
- end
1405
-
1406
- def test_assert_raises_triggered_different_msg
1407
- e = assert_raises Minitest::Assertion do
1408
- @tc.assert_raises RuntimeError, "XXX" do
1409
- raise SyntaxError, "icky"
1410
- end
1411
- end
1412
-
1413
- expected = clean <<-EOM
1414
- XXX.
1415
- [RuntimeError] exception expected, not
1416
- Class: <SyntaxError>
1417
- Message: <\"icky\">
1418
- ---Backtrace---
1419
- FILE:LINE:in \`test_assert_raises_triggered_different_msg\'
1420
- ---------------
1421
- EOM
1422
-
1423
- actual = e.message.gsub(/^.+:\d+/, "FILE:LINE")
1424
- actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0"
1425
-
1426
- assert_equal expected.chomp, actual
1427
- end
1428
-
1429
- def test_assert_raises_triggered_none
1430
- e = assert_raises Minitest::Assertion do
1431
- @tc.assert_raises Minitest::Assertion do
1432
- # do nothing
1433
- end
1434
- end
1435
-
1436
- expected = "Minitest::Assertion expected but nothing was raised."
1437
-
1438
- assert_equal expected, e.message
1439
- end
1440
-
1441
- def test_assert_raises_triggered_none_msg
1442
- e = assert_raises Minitest::Assertion do
1443
- @tc.assert_raises Minitest::Assertion, "XXX" do
1444
- # do nothing
1445
- end
1446
- end
1447
-
1448
- expected = "XXX.\nMinitest::Assertion expected but nothing was raised."
1449
-
1450
- assert_equal expected, e.message
1451
- end
1452
-
1453
- def test_assert_raises_subclass
1454
- @tc.assert_raises StandardError do
1455
- raise AnError
1456
- end
1457
- end
1458
-
1459
- def test_assert_raises_subclass_triggered
1460
- e = assert_raises Minitest::Assertion do
1461
- @tc.assert_raises SomeError do
1462
- raise AnError, "some message"
1463
- end
1464
- end
1465
-
1466
- expected = clean <<-EOM
1467
- [SomeError] exception expected, not
1468
- Class: <AnError>
1469
- Message: <\"some message\">
1470
- ---Backtrace---
1471
- FILE:LINE:in \`test_assert_raises_subclass_triggered\'
1472
- ---------------
1473
- EOM
1474
-
1475
- actual = e.message.gsub(/^.+:\d+/, "FILE:LINE")
1476
- actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0"
1477
-
1478
- assert_equal expected.chomp, actual
1479
- end
1480
-
1481
- def test_assert_raises_exit
1482
- @tc.assert_raises SystemExit do
1483
- exit 1
1484
- end
1485
- end
1486
-
1487
- def test_assert_raises_signals
1488
- @tc.assert_raises SignalException do
1489
- raise SignalException, :INT
1490
- end
1491
- end
1492
-
1493
- def test_assert_respond_to
1494
- @tc.assert_respond_to "blah", :empty?
1495
- end
1496
-
1497
- def test_assert_respond_to_triggered
1498
- assert_triggered 'Expected "blah" (String) to respond to #rawr!.' do
1499
- @tc.assert_respond_to "blah", :rawr!
1500
- end
1501
- end
1502
-
1503
- def test_assert_same
1504
- @assertion_count = 3
1505
-
1506
- o = "blah"
1507
- @tc.assert_same 1, 1
1508
- @tc.assert_same :blah, :blah
1509
- @tc.assert_same o, o
1510
- end
1511
-
1512
- def test_assert_same_triggered
1513
- @assertion_count = 2
1514
-
1515
- assert_triggered "Expected 2 (oid=N) to be the same as 1 (oid=N)." do
1516
- @tc.assert_same 1, 2
1517
- end
1518
-
1519
- s1 = "blah"
1520
- s2 = "blah"
1521
-
1522
- assert_triggered 'Expected "blah" (oid=N) to be the same as "blah" (oid=N).' do
1523
- @tc.assert_same s1, s2
1524
- end
1525
- end
1526
-
1527
- def assert_deprecated name
1528
- dep = /DEPRECATED: #{name}. From #{__FILE__}:\d+(?::.*)?/
1529
- dep = "" if $-w.nil?
1530
-
1531
- assert_output nil, dep do
1532
- yield
1533
- end
1534
- end
1535
-
1536
- def test_assert_send
1537
- assert_deprecated :assert_send do
1538
- @tc.assert_send [1, :<, 2]
1539
- end
1540
- end
1541
-
1542
- def test_assert_send_bad
1543
- assert_deprecated :assert_send do
1544
- assert_triggered "Expected 1.>(*[2]) to return true." do
1545
- @tc.assert_send [1, :>, 2]
1546
- end
1547
- end
1548
- end
1549
-
1550
- def test_assert_silent
1551
- @assertion_count = 2
1552
-
1553
- @tc.assert_silent do
1554
- # do nothing
1555
- end
1556
- end
1557
-
1558
- def test_assert_silent_triggered_err
1559
- assert_triggered util_msg("", "blah blah", "In stderr") do
1560
- @tc.assert_silent do
1561
- $stderr.print "blah blah"
1562
- end
1563
- end
1564
- end
1565
-
1566
- def test_assert_silent_triggered_out
1567
- @assertion_count = 2
1568
-
1569
- assert_triggered util_msg("", "blah blah", "In stdout") do
1570
- @tc.assert_silent do
1571
- print "blah blah"
1572
- end
1573
- end
1574
- end
1575
-
1576
- def test_assert_throws
1577
- @tc.assert_throws :blah do
1578
- throw :blah
1579
- end
1580
- end
1581
-
1582
- def test_assert_throws_name_error
1583
- @tc.assert_raises NameError do
1584
- @tc.assert_throws :blah do
1585
- raise NameError
1586
- end
1587
- end
1588
- end
1589
-
1590
- def test_assert_throws_argument_exception
1591
- @tc.assert_raises ArgumentError do
1592
- @tc.assert_throws :blah do
1593
- raise ArgumentError
1594
- end
1595
- end
1596
- end
1597
-
1598
- def test_assert_throws_different
1599
- assert_triggered "Expected :blah to have been thrown, not :not_blah." do
1600
- @tc.assert_throws :blah do
1601
- throw :not_blah
1602
- end
1603
- end
1604
- end
1605
-
1606
- def test_assert_throws_unthrown
1607
- assert_triggered "Expected :blah to have been thrown." do
1608
- @tc.assert_throws :blah do
1609
- # do nothing
1610
- end
1611
- end
1612
- end
1613
-
1614
- def test_capture_io
1615
- @assertion_count = 0
1616
-
1617
- non_verbose do
1618
- out, err = capture_io do
1619
- puts "hi"
1620
- $stderr.puts "bye!"
1621
- end
1622
-
1623
- assert_equal "hi\n", out
1624
- assert_equal "bye!\n", err
1625
- end
1626
- end
1627
-
1628
- def test_capture_subprocess_io
1629
- @assertion_count = 0
1630
-
1631
- non_verbose do
1632
- out, err = capture_subprocess_io do
1633
- system("echo hi")
1634
- system("echo bye! 1>&2")
1635
- end
1636
-
1637
- assert_equal "hi\n", out
1638
- assert_equal "bye!", err.strip
1639
- end
1640
- end
1641
-
1642
- def test_class_asserts_match_refutes
1643
- @assertion_count = 0
1644
-
1645
- methods = Minitest::Assertions.public_instance_methods
1646
- methods.map!(&:to_s) if Symbol === methods.first
1647
-
1648
- # These don't have corresponding refutes _on purpose_. They're
1649
- # useless and will never be added, so don't bother.
1650
- ignores = %w[assert_output assert_raises assert_send
1651
- assert_silent assert_throws assert_mock]
1652
-
1653
- # These are test/unit methods. I'm not actually sure why they're still here
1654
- ignores += %w[assert_no_match assert_not_equal assert_not_nil
1655
- assert_not_same assert_nothing_raised
1656
- assert_nothing_thrown assert_raise]
1657
-
1658
- asserts = methods.grep(/^assert/).sort - ignores
1659
- refutes = methods.grep(/^refute/).sort - ignores
1660
-
1661
- assert_empty refutes.map { |n| n.sub(/^refute/, "assert") } - asserts
1662
- assert_empty asserts.map { |n| n.sub(/^assert/, "refute") } - refutes
1663
- end
1664
-
1665
- def test_flunk
1666
- assert_triggered "Epic Fail!" do
1667
- @tc.flunk
1668
- end
1669
- end
1670
-
1671
- def test_flunk_message
1672
- assert_triggered @zomg do
1673
- @tc.flunk @zomg
1674
- end
1675
- end
1676
-
1677
- def test_message
1678
- @assertion_count = 0
1679
-
1680
- assert_equal "blah2.", @tc.message { "blah2" }.call
1681
- assert_equal "blah2.", @tc.message("") { "blah2" }.call
1682
- assert_equal "blah1.\nblah2.", @tc.message(:blah1) { "blah2" }.call
1683
- assert_equal "blah1.\nblah2.", @tc.message("blah1") { "blah2" }.call
1684
-
1685
- message = proc { "blah1" }
1686
- assert_equal "blah1.\nblah2.", @tc.message(message) { "blah2" }.call
1687
-
1688
- message = @tc.message { "blah1" }
1689
- assert_equal "blah1.\nblah2.", @tc.message(message) { "blah2" }.call
1690
- end
1691
-
1692
- def test_message_message
1693
- assert_triggered "whoops.\nExpected: 1\n Actual: 2" do
1694
- @tc.assert_equal 1, 2, message { "whoops" }
1695
- end
1696
- end
1697
-
1698
- def test_message_lambda
1699
- assert_triggered "whoops.\nExpected: 1\n Actual: 2" do
1700
- @tc.assert_equal 1, 2, lambda { "whoops" }
1701
- end
1702
- end
1703
-
1704
- def test_message_deferred
1705
- @assertion_count, var = 0, nil
1706
-
1707
- msg = message { var = "blah" }
1708
-
1709
- assert_nil var
1710
-
1711
- msg.call
1712
-
1713
- assert_equal "blah", var
1714
- end
1715
-
1716
- def test_pass
1717
- @tc.pass
1718
- end
1719
-
1720
- def test_prints
1721
- printer = Class.new { extend Minitest::Assertions }
1722
- @tc.assert_equal '"test"', printer.mu_pp(ImmutableString.new "test")
1723
- end
1724
-
1725
- def test_refute
1726
- @assertion_count = 2
1727
-
1728
- @tc.assert_equal false, @tc.refute(false), "returns false on success"
1729
- end
1730
-
1731
- def test_refute_empty
1732
- @assertion_count = 2
1733
-
1734
- @tc.refute_empty [1]
1735
- end
1736
-
1737
- def test_refute_empty_triggered
1738
- @assertion_count = 2
1739
-
1740
- assert_triggered "Expected [] to not be empty." do
1741
- @tc.refute_empty []
1742
- end
1743
- end
1744
-
1745
- def test_refute_equal
1746
- @tc.refute_equal "blah", "yay"
1747
- end
1748
-
1749
- def test_refute_equal_triggered
1750
- assert_triggered 'Expected "blah" to not be equal to "blah".' do
1751
- @tc.refute_equal "blah", "blah"
1752
- end
1753
- end
1754
-
1755
- def test_refute_in_delta
1756
- @tc.refute_in_delta 0.0, 1.0 / 1000, 0.000001
1757
- end
1758
-
1759
- def test_refute_in_delta_triggered
1760
- x = maglev? ? "0.100000xxx" : "0.1"
1761
- assert_triggered "Expected |0.0 - 0.001| (0.001) to not be <= #{x}." do
1762
- @tc.refute_in_delta 0.0, 1.0 / 1000, 0.1
1763
- end
1764
- end
1765
-
1766
- def test_refute_in_epsilon
1767
- @tc.refute_in_epsilon 10_000, 9990-1
1768
- end
1769
-
1770
- def test_refute_in_epsilon_triggered
1771
- assert_triggered "Expected |10000 - 9990| (10) to not be <= 10.0." do
1772
- @tc.refute_in_epsilon 10_000, 9990
1773
- flunk
1774
- end
1775
- end
1776
-
1777
- def test_refute_includes
1778
- @assertion_count = 2
1779
-
1780
- @tc.refute_includes [true], false
1781
- end
1782
-
1783
- def test_refute_includes_triggered
1784
- @assertion_count = 3
1785
-
1786
- e = @tc.assert_raises Minitest::Assertion do
1787
- @tc.refute_includes [true], true
1788
- end
1789
-
1790
- expected = "Expected [true] to not include true."
1791
- assert_equal expected, e.message
1792
- end
1793
-
1794
- def test_refute_instance_of
1795
- @tc.refute_instance_of Array, "blah"
1796
- end
1797
-
1798
- def test_refute_instance_of_triggered
1799
- assert_triggered 'Expected "blah" to not be an instance of String.' do
1800
- @tc.refute_instance_of String, "blah"
1801
- end
1802
- end
1803
-
1804
- def test_refute_kind_of
1805
- @tc.refute_kind_of Array, "blah"
1806
- end
1807
-
1808
- def test_refute_kind_of_triggered
1809
- assert_triggered 'Expected "blah" to not be a kind of String.' do
1810
- @tc.refute_kind_of String, "blah"
1811
- end
1812
- end
1813
-
1814
- def test_refute_match
1815
- @assertion_count = 2
1816
- @tc.refute_match(/\d+/, "blah blah blah")
1817
- end
1818
-
1819
- def test_refute_match_matcher_object
1820
- @assertion_count = 2
1821
- @tc.refute_match Object.new, 5 # default #=~ returns false
1822
- end
1823
-
1824
- def test_refute_match_object_triggered
1825
- @assertion_count = 2
1826
-
1827
- pattern = Object.new
1828
- def pattern.=~ _; true end
1829
- def pattern.inspect; "[Object]" end
1830
-
1831
- assert_triggered "Expected [Object] to not match 5." do
1832
- @tc.refute_match pattern, 5
1833
- end
1834
- end
1835
-
1836
- def test_refute_match_triggered
1837
- @assertion_count = 2
1838
- assert_triggered 'Expected /\w+/ to not match "blah blah blah".' do
1839
- @tc.refute_match(/\w+/, "blah blah blah")
1840
- end
1841
- end
1842
-
1843
- def test_refute_nil
1844
- @tc.refute_nil 42
1845
- end
1846
-
1847
- def test_refute_nil_triggered
1848
- assert_triggered "Expected nil to not be nil." do
1849
- @tc.refute_nil nil
1850
- end
1851
- end
1852
-
1853
- def test_refute_predicate
1854
- @tc.refute_predicate "42", :empty?
1855
- end
1856
-
1857
- def test_refute_predicate_triggered
1858
- assert_triggered 'Expected "" to not be empty?.' do
1859
- @tc.refute_predicate "", :empty?
1860
- end
1861
- end
1862
-
1863
- def test_refute_operator
1864
- @tc.refute_operator 2, :<, 1
1865
- end
1866
-
1867
- def test_refute_operator_bad_object
1868
- bad = Object.new
1869
- def bad.== _; true end
1870
-
1871
- @tc.refute_operator true, :equal?, bad
1872
- end
1873
-
1874
- def test_refute_operator_triggered
1875
- assert_triggered "Expected 2 to not be > 1." do
1876
- @tc.refute_operator 2, :>, 1
1877
- end
1878
- end
1879
-
1880
- def test_refute_respond_to
1881
- @tc.refute_respond_to "blah", :rawr!
1882
- end
1883
-
1884
- def test_refute_respond_to_triggered
1885
- assert_triggered 'Expected "blah" to not respond to empty?.' do
1886
- @tc.refute_respond_to "blah", :empty?
1887
- end
1888
- end
1889
-
1890
- def test_refute_same
1891
- @tc.refute_same 1, 2
1892
- end
1893
-
1894
- def test_refute_same_triggered
1895
- assert_triggered "Expected 1 (oid=N) to not be the same as 1 (oid=N)." do
1896
- @tc.refute_same 1, 1
1897
- end
1898
- end
1899
-
1900
- def test_skip
1901
- @assertion_count = 0
1902
-
1903
- assert_triggered "haha!", Minitest::Skip do
1904
- @tc.skip "haha!"
1905
- end
1906
- end
1907
-
1908
- def test_runnable_methods_random
1909
- @assertion_count = 0
1910
-
1911
- sample_test_case = Class.new FakeNamedTest do
1912
- def self.test_order; :random; end
1913
- def test_test1; assert "does not matter" end
1914
- def test_test2; assert "does not matter" end
1915
- def test_test3; assert "does not matter" end
1916
- end
1917
-
1918
- srand 42
1919
- expected = case
1920
- when maglev? then
1921
- %w[test_test2 test_test3 test_test1]
1922
- else
1923
- %w[test_test2 test_test1 test_test3]
1924
- end
1925
- assert_equal expected, sample_test_case.runnable_methods
1926
- end
1927
-
1928
- def test_runnable_methods_sorted
1929
- @assertion_count = 0
1930
-
1931
- sample_test_case = Class.new FakeNamedTest do
1932
- def self.test_order; :sorted end
1933
- def test_test3; assert "does not matter" end
1934
- def test_test2; assert "does not matter" end
1935
- def test_test1; assert "does not matter" end
1936
- end
1937
-
1938
- expected = %w[test_test1 test_test2 test_test3]
1939
- assert_equal expected, sample_test_case.runnable_methods
1940
- end
1941
-
1942
- def test_i_suck_and_my_tests_are_order_dependent_bang_sets_test_order_alpha
1943
- @assertion_count = 0
1944
-
1945
- shitty_test_case = Class.new FakeNamedTest
1946
-
1947
- shitty_test_case.i_suck_and_my_tests_are_order_dependent!
1948
-
1949
- assert_equal :alpha, shitty_test_case.test_order
1950
- end
1951
-
1952
- def test_i_suck_and_my_tests_are_order_dependent_bang_does_not_warn
1953
- @assertion_count = 0
1954
-
1955
- shitty_test_case = Class.new FakeNamedTest
1956
-
1957
- def shitty_test_case.test_order; :lol end
1958
-
1959
- assert_silent do
1960
- shitty_test_case.i_suck_and_my_tests_are_order_dependent!
1961
- end
1962
- end
1963
-
1964
- def assert_triggered expected, klass = Minitest::Assertion
1965
- e = assert_raises klass do
1966
- yield
1967
- end
1968
-
1969
- msg = e.message.sub(/(---Backtrace---).*/m, '\1')
1970
- msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)")
1971
- msg.gsub!(/(\d\.\d{6})\d+/, '\1xxx') # normalize: ruby version, impl, platform
1972
-
1973
- assert_msg = Regexp === expected ? :assert_match : :assert_equal
1974
- self.send assert_msg, expected, msg
1975
- end
1976
-
1977
- def util_msg exp, act, msg = nil
1978
- s = "Expected: #{exp.inspect}\n Actual: #{act.inspect}"
1979
- s = "#{msg}.\n#{s}" if msg
1980
- s
1981
- end
1982
-
1983
- def without_diff
1984
- old_diff = Minitest::Assertions.diff
1985
- Minitest::Assertions.diff = nil
1986
-
1987
- yield
1988
- ensure
1989
- Minitest::Assertions.diff = old_diff
1990
- end
1991
- end
1992
-
1993
- class TestMinitestGuard < Minitest::Test
1994
- parallelize_me!
1995
-
1996
- def test_mri_eh
1997
- assert self.class.mri? "ruby blah"
1998
- assert self.mri? "ruby blah"
1999
- end
2000
-
2001
- def test_jruby_eh
2002
- assert self.class.jruby? "java"
2003
- assert self.jruby? "java"
2004
- end
2005
-
2006
- def test_rubinius_eh
2007
- assert self.class.rubinius? "rbx"
2008
- assert self.rubinius? "rbx"
2009
- end
2010
-
2011
- def test_windows_eh
2012
- assert self.class.windows? "mswin"
2013
- assert self.windows? "mswin"
2014
- end
2015
- end
2016
-
2017
- class TestMinitestUnitRecording < MetaMetaMetaTestCase
2018
- # do not parallelize this suite... it just can't handle it.
2019
-
2020
- def assert_run_record *expected, &block
2021
- @tu = Class.new FakeNamedTest, &block
2022
-
2023
- run_tu_with_fresh_reporter
1144
+ run_tu_with_fresh_reporter
2024
1145
 
2025
1146
  recorded = first_reporter.results.map(&:failures).flatten.map { |f| f.error.class }
2026
1147
 
@@ -2039,7 +1160,7 @@ class TestMinitestUnitRecording < MetaMetaMetaTestCase
2039
1160
  bogus_reporter = Class.new do # doesn't subclass AbstractReporter
2040
1161
  def start; @success = false; end
2041
1162
  # def prerecord klass, name; end # doesn't define full API
2042
- def record result; @success = true; end
1163
+ def record _result; @success = true; end
2043
1164
  def report; end
2044
1165
  def passed?; end
2045
1166
  def results; end
@@ -2117,17 +1238,17 @@ class TestMinitestUnitRecording < MetaMetaMetaTestCase
2117
1238
 
2118
1239
  run_tu_with_fresh_reporter
2119
1240
 
2120
- exp = clean "
1241
+ exp = <<~EOM
2121
1242
  Error:
2122
1243
  FakeNamedTestXX#test_method:
2123
1244
  AnError: AnError
2124
- FILE:LINE:in `test_method'
1245
+ FILE:LINE:in 'test_method'
2125
1246
 
2126
1247
  Error:
2127
1248
  FakeNamedTestXX#test_method:
2128
1249
  RuntimeError: unhandled exception
2129
- FILE:LINE:in `teardown'
2130
- "
1250
+ FILE:LINE:in 'teardown'
1251
+ EOM
2131
1252
 
2132
1253
  assert_equal exp.strip, normalize_output(first_reporter.results.first.to_s).strip
2133
1254
  end
@@ -2140,3 +1261,96 @@ class TestMinitestUnitRecording < MetaMetaMetaTestCase
2140
1261
  end
2141
1262
  end
2142
1263
  end
1264
+
1265
+ class TestUnexpectedError < Minitest::Test
1266
+ def assert_compress exp, input
1267
+ e = Minitest::UnexpectedError.new RuntimeError.new
1268
+
1269
+ exp = exp.lines.map(&:chomp) if String === exp
1270
+ act = e.compress input
1271
+
1272
+ assert_equal exp, act
1273
+ end
1274
+
1275
+ ACT1 = %w[ a b c b c b c b c d ]
1276
+
1277
+ def test_normal
1278
+ assert_compress <<~EXP, %w[ a b c b c b c b c d ]
1279
+ a
1280
+ +->> 4 cycles of 2 lines:
1281
+ | b
1282
+ | c
1283
+ +-<<
1284
+ d
1285
+ EXP
1286
+ end
1287
+
1288
+ def test_normal2
1289
+ assert_compress <<~EXP, %w[ a b c b c b c b c ]
1290
+ a
1291
+ +->> 4 cycles of 2 lines:
1292
+ | b
1293
+ | c
1294
+ +-<<
1295
+ EXP
1296
+ end
1297
+
1298
+ def test_longer_c_than_b
1299
+ # the extra c in the front makes the overall length longer sorting it first
1300
+ assert_compress <<~EXP, %w[ c a b c b c b c b c b d ]
1301
+ c
1302
+ a
1303
+ b
1304
+ +->> 4 cycles of 2 lines:
1305
+ | c
1306
+ | b
1307
+ +-<<
1308
+ d
1309
+ EXP
1310
+ end
1311
+
1312
+ def test_1_line_cycles
1313
+ assert_compress <<~EXP, %w[ c a b c b c b c b c b b b d ]
1314
+ c
1315
+ a
1316
+ +->> 4 cycles of 2 lines:
1317
+ | b
1318
+ | c
1319
+ +-<<
1320
+ +->> 3 cycles of 1 lines:
1321
+ | b
1322
+ +-<<
1323
+ d
1324
+ EXP
1325
+ end
1326
+
1327
+ def test_sanity3
1328
+ pre = ("aa".."am").to_a
1329
+ mid = ("a".."z").to_a * 67
1330
+ post = ("aa".."am").to_a
1331
+ ary = pre + mid + post
1332
+
1333
+ exp = pre +
1334
+ [" +->> 67 cycles of 26 lines:"] +
1335
+ ("a".."z").map { |s| " | #{s}" } +
1336
+ [" +-<<"] +
1337
+ post
1338
+
1339
+ assert_compress exp, ary
1340
+ end
1341
+
1342
+ def test_absurd_patterns
1343
+ assert_compress <<~EXP, %w[ a b c b c a b c b c a b c ]
1344
+ +->> 2 cycles of 5 lines:
1345
+ | a
1346
+ | +->> 2 cycles of 2 lines:
1347
+ | | b
1348
+ | | c
1349
+ | +-<<
1350
+ +-<<
1351
+ a
1352
+ b
1353
+ c
1354
+ EXP
1355
+ end
1356
+ end