minitest 5.11.3 → 5.25.4

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.
@@ -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