minitest 5.11.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2142 @@
1
+ # encoding: UTF-8
2
+
3
+ require "pathname"
4
+ require "minitest/metametameta"
5
+
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
16
+ end
17
+
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
+ class Minitest::Runnable
24
+ def whatever # faked for testing
25
+ assert true
26
+ end
27
+ end
28
+
29
+ class TestMinitestUnit < MetaMetaMetaTestCase
30
+ parallelize_me!
31
+
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'"]
40
+
41
+ def test_filter_backtrace
42
+ # this is a semi-lame mix of relative paths.
43
+ # 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__'"] +
47
+ BT_MIDDLE +
48
+ ["#{MINITEST_BASE_DIR}/test.rb:29",
49
+ "test/test_autotest.rb:422"])
50
+ bt = util_expand_bt bt
51
+
52
+ ex = ["lib/autotest.rb:571:in `add_exception'",
53
+ "test/test_autotest.rb:62:in `test_add_exception'"]
54
+ ex = util_expand_bt ex
55
+
56
+ fu = Minitest.filter_backtrace(bt)
57
+
58
+ assert_equal ex, fu
59
+ end
60
+
61
+ def test_filter_backtrace_all_unit
62
+ bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] +
63
+ BT_MIDDLE +
64
+ ["#{MINITEST_BASE_DIR}/test.rb:29"])
65
+ ex = bt.clone
66
+ fu = Minitest.filter_backtrace(bt)
67
+ assert_equal ex, fu
68
+ end
69
+
70
+ def test_filter_backtrace_unit_starts
71
+ bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] +
72
+ BT_MIDDLE +
73
+ ["#{MINITEST_BASE_DIR}/mini/test.rb:29",
74
+ "-e:1"])
75
+
76
+ bt = util_expand_bt bt
77
+
78
+ ex = ["-e:1"]
79
+ fu = Minitest.filter_backtrace bt
80
+ assert_equal ex, fu
81
+ end
82
+
83
+ # def test_default_runner_is_minitest_unit
84
+ # assert_instance_of Minitest::Unit, Minitest::Unit.runner
85
+ # end
86
+
87
+ def test_infectious_binary_encoding
88
+ @tu = Class.new FakeNamedTest do
89
+ def test_this_is_not_ascii_assertion
90
+ assert_equal "ЁЁЁ", "ёёё"
91
+ end
92
+
93
+ def test_this_is_non_ascii_failure_message
94
+ fail 'ЁЁЁ'.force_encoding('ASCII-8BIT')
95
+ end
96
+ end
97
+
98
+ expected = clean <<-EOM
99
+ EF
100
+
101
+ Finished in 0.00
102
+
103
+ 1) Error:
104
+ FakeNamedTestXX#test_this_is_non_ascii_failure_message:
105
+ 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: \"ёёё\"
112
+
113
+ 2 runs, 1 assertions, 1 failures, 1 errors, 0 skips
114
+ EOM
115
+
116
+ assert_report expected
117
+ end
118
+
119
+ def test_passed_eh_teardown_good
120
+ test_class = Class.new FakeNamedTest do
121
+ def teardown; assert true; end
122
+ def test_omg; assert true; end
123
+ end
124
+
125
+ test = test_class.new :test_omg
126
+ test.run
127
+
128
+ refute_predicate test, :error?
129
+ assert_predicate test, :passed?
130
+ refute_predicate test, :skipped?
131
+ end
132
+
133
+ def test_passed_eh_teardown_skipped
134
+ test_class = Class.new FakeNamedTest do
135
+ def teardown; assert true; end
136
+ def test_omg; skip "bork"; end
137
+ end
138
+
139
+ test = test_class.new :test_omg
140
+ test.run
141
+
142
+ refute_predicate test, :error?
143
+ refute_predicate test, :passed?
144
+ assert_predicate test, :skipped?
145
+ end
146
+
147
+ def test_passed_eh_teardown_flunked
148
+ test_class = Class.new FakeNamedTest do
149
+ def teardown; flunk; end
150
+ def test_omg; assert true; end
151
+ end
152
+
153
+ test = test_class.new :test_omg
154
+ test.run
155
+
156
+ refute_predicate test, :error?
157
+ refute_predicate test, :passed?
158
+ refute_predicate test, :skipped?
159
+ end
160
+
161
+ 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
167
+ end
168
+ end
169
+
170
+ class TestMinitestUnitInherited < MetaMetaMetaTestCase
171
+ def with_overridden_include
172
+ Class.class_eval do
173
+ def inherited_with_hacks _klass
174
+ throw :inherited_hook
175
+ end
176
+
177
+ alias inherited_without_hacks inherited
178
+ alias inherited inherited_with_hacks
179
+ alias IGNORE_ME! inherited # 1.8 bug. god I love venture bros
180
+ end
181
+
182
+ yield
183
+ ensure
184
+ Class.class_eval do
185
+ alias inherited inherited_without_hacks
186
+
187
+ undef_method :inherited_with_hacks
188
+ undef_method :inherited_without_hacks
189
+ end
190
+
191
+ refute_respond_to Class, :inherited_with_hacks
192
+ refute_respond_to Class, :inherited_without_hacks
193
+ end
194
+
195
+ def test_inherited_hook_plays_nice_with_others
196
+ with_overridden_include do
197
+ assert_throws :inherited_hook do
198
+ Class.new FakeNamedTest
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ class TestMinitestRunner < MetaMetaMetaTestCase
205
+ # do not parallelize this suite... it just can't handle it.
206
+
207
+ def test_class_runnables
208
+ @assertion_count = 0
209
+
210
+ tc = Class.new(Minitest::Test)
211
+
212
+ assert_equal 1, Minitest::Test.runnables.size
213
+ assert_equal [tc], Minitest::Test.runnables
214
+ end
215
+
216
+ def test_run_test
217
+ @tu =
218
+ Class.new FakeNamedTest do
219
+ attr_reader :foo
220
+
221
+ def run
222
+ @foo = "hi mom!"
223
+ r = super
224
+ @foo = "okay"
225
+
226
+ r
227
+ end
228
+
229
+ def test_something
230
+ assert_equal "hi mom!", foo
231
+ end
232
+ end
233
+
234
+ expected = clean <<-EOM
235
+ .
236
+
237
+ Finished in 0.00
238
+
239
+ 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
240
+ EOM
241
+
242
+ assert_report expected
243
+ end
244
+
245
+ def test_run_error
246
+ @tu =
247
+ Class.new FakeNamedTest do
248
+ def test_something
249
+ assert true
250
+ end
251
+
252
+ def test_error
253
+ raise "unhandled exception"
254
+ end
255
+ end
256
+
257
+ expected = clean <<-EOM
258
+ E.
259
+
260
+ Finished in 0.00
261
+
262
+ 1) Error:
263
+ FakeNamedTestXX#test_error:
264
+ RuntimeError: unhandled exception
265
+ FILE:LINE:in \`test_error\'
266
+
267
+ 2 runs, 1 assertions, 0 failures, 1 errors, 0 skips
268
+ EOM
269
+
270
+ assert_report expected
271
+ end
272
+
273
+ def test_run_error_teardown
274
+ @tu =
275
+ Class.new FakeNamedTest do
276
+ def test_something
277
+ assert true
278
+ end
279
+
280
+ def teardown
281
+ raise "unhandled exception"
282
+ end
283
+ end
284
+
285
+ expected = clean <<-EOM
286
+ E
287
+
288
+ Finished in 0.00
289
+
290
+ 1) Error:
291
+ FakeNamedTestXX#test_something:
292
+ RuntimeError: unhandled exception
293
+ FILE:LINE:in \`teardown\'
294
+
295
+ 1 runs, 1 assertions, 0 failures, 1 errors, 0 skips
296
+ EOM
297
+
298
+ assert_report expected
299
+ end
300
+
301
+ def test_run_failing
302
+ setup_basic_tu
303
+
304
+ expected = clean <<-EOM
305
+ F.
306
+
307
+ Finished in 0.00
308
+
309
+ 1) Failure:
310
+ FakeNamedTestXX#test_failure [FILE:LINE]:
311
+ Expected false to be truthy.
312
+
313
+ 2 runs, 2 assertions, 1 failures, 0 errors, 0 skips
314
+ EOM
315
+
316
+ assert_report expected
317
+ end
318
+
319
+ def setup_basic_tu
320
+ @tu =
321
+ Class.new FakeNamedTest do
322
+ def test_something
323
+ assert true
324
+ end
325
+
326
+ def test_failure
327
+ assert false
328
+ end
329
+ end
330
+ end
331
+
332
+ def test_run_failing_filtered
333
+ setup_basic_tu
334
+
335
+ expected = clean <<-EOM
336
+ .
337
+
338
+ Finished in 0.00
339
+
340
+ 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
341
+ EOM
342
+
343
+ assert_report expected, %w[--name /some|thing/ --seed 42]
344
+ end
345
+
346
+ def assert_filtering filter, name, expected, a = false
347
+ args = %W[--#{filter} #{name} --seed 42]
348
+
349
+ alpha = Class.new FakeNamedTest do
350
+ define_method :test_something do
351
+ assert a
352
+ end
353
+ end
354
+ Object.const_set(:Alpha, alpha)
355
+
356
+ beta = Class.new FakeNamedTest do
357
+ define_method :test_something do
358
+ assert true
359
+ end
360
+ end
361
+ Object.const_set(:Beta, beta)
362
+
363
+ @tus = [alpha, beta]
364
+
365
+ assert_report expected, args
366
+ ensure
367
+ Object.send :remove_const, :Alpha
368
+ Object.send :remove_const, :Beta
369
+ end
370
+
371
+ def test_run_filtered_including_suite_name
372
+ expected = clean <<-EOM
373
+ .
374
+
375
+ Finished in 0.00
376
+
377
+ 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
378
+ EOM
379
+
380
+ assert_filtering "name", "/Beta#test_something/", expected
381
+ end
382
+
383
+ def test_run_filtered_including_suite_name_string
384
+ expected = clean <<-EOM
385
+ .
386
+
387
+ Finished in 0.00
388
+
389
+ 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
390
+ EOM
391
+
392
+ assert_filtering "name", "Beta#test_something", expected
393
+ end
394
+
395
+ def test_run_filtered_string_method_only
396
+ expected = clean <<-EOM
397
+ ..
398
+
399
+ Finished in 0.00
400
+
401
+ 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
402
+ EOM
403
+
404
+ assert_filtering "name", "test_something", expected, :pass
405
+ end
406
+
407
+ def test_run_failing_excluded
408
+ setup_basic_tu
409
+
410
+ expected = clean <<-EOM
411
+ .
412
+
413
+ Finished in 0.00
414
+
415
+ 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
416
+ EOM
417
+
418
+ assert_report expected, %w[--exclude /failure/ --seed 42]
419
+ end
420
+
421
+ def test_run_filtered_excluding_suite_name
422
+ expected = clean <<-EOM
423
+ .
424
+
425
+ Finished in 0.00
426
+
427
+ 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
428
+ EOM
429
+
430
+ assert_filtering "exclude", "/Alpha#test_something/", expected
431
+ end
432
+
433
+ def test_run_filtered_excluding_suite_name_string
434
+ expected = clean <<-EOM
435
+ .
436
+
437
+ Finished in 0.00
438
+
439
+ 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
440
+ EOM
441
+
442
+ assert_filtering "exclude", "Alpha#test_something", expected
443
+ end
444
+
445
+ def test_run_filtered_excluding_string_method_only
446
+ expected = clean <<-EOM
447
+
448
+
449
+ Finished in 0.00
450
+
451
+ 0 runs, 0 assertions, 0 failures, 0 errors, 0 skips
452
+ EOM
453
+
454
+ assert_filtering "exclude", "test_something", expected, :pass
455
+ end
456
+
457
+ def test_run_passing
458
+ @tu =
459
+ Class.new FakeNamedTest do
460
+ def test_something
461
+ assert true
462
+ end
463
+ end
464
+
465
+ expected = clean <<-EOM
466
+ .
467
+
468
+ Finished in 0.00
469
+
470
+ 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
471
+ EOM
472
+
473
+ assert_report expected
474
+ end
475
+
476
+ def test_run_skip
477
+ @tu =
478
+ Class.new FakeNamedTest do
479
+ def test_something
480
+ assert true
481
+ end
482
+
483
+ def test_skip
484
+ skip "not yet"
485
+ end
486
+ end
487
+
488
+ expected = clean <<-EOM
489
+ S.
490
+
491
+ Finished in 0.00
492
+
493
+ 2 runs, 1 assertions, 0 failures, 0 errors, 1 skips
494
+
495
+ You have skipped tests. Run with --verbose for details.
496
+ EOM
497
+
498
+ restore_env do
499
+ assert_report expected
500
+ end
501
+ end
502
+
503
+ def test_run_skip_verbose
504
+ @tu =
505
+ Class.new FakeNamedTest do
506
+ def test_something
507
+ assert true
508
+ end
509
+
510
+ def test_skip
511
+ skip "not yet"
512
+ end
513
+ end
514
+
515
+ expected = clean <<-EOM
516
+ FakeNamedTestXX#test_skip = 0.00 s = S
517
+ FakeNamedTestXX#test_something = 0.00 s = .
518
+
519
+ Finished in 0.00
520
+
521
+ 1) Skipped:
522
+ FakeNamedTestXX#test_skip [FILE:LINE]:
523
+ not yet
524
+
525
+ 2 runs, 1 assertions, 0 failures, 0 errors, 1 skips
526
+ EOM
527
+
528
+ assert_report expected, %w[--seed 42 --verbose]
529
+ end
530
+
531
+ def test_run_with_other_runner
532
+ @tu =
533
+ Class.new FakeNamedTest do
534
+ def self.run reporter, options = {}
535
+ @reporter = reporter
536
+ before_my_suite
537
+ super
538
+ end
539
+
540
+ def self.name; "wacky!" end
541
+
542
+ def self.before_my_suite
543
+ @reporter.io.puts "Running #{self.name} tests"
544
+ @@foo = 1
545
+ end
546
+
547
+ def test_something
548
+ assert_equal 1, @@foo
549
+ end
550
+
551
+ def test_something_else
552
+ assert_equal 1, @@foo
553
+ end
554
+ end
555
+
556
+ expected = clean <<-EOM
557
+ Running wacky! tests
558
+ ..
559
+
560
+ Finished in 0.00
561
+
562
+ 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
563
+ EOM
564
+
565
+ assert_report expected
566
+ end
567
+
568
+ require "monitor"
569
+
570
+ class Latch
571
+ def initialize count = 1
572
+ @count = count
573
+ @lock = Monitor.new
574
+ @cv = @lock.new_cond
575
+ end
576
+
577
+ def release
578
+ @lock.synchronize do
579
+ @count -= 1 if @count > 0
580
+ @cv.broadcast if @count == 0
581
+ end
582
+ end
583
+
584
+ def await
585
+ @lock.synchronize { @cv.wait_while { @count > 0 } }
586
+ end
587
+ end
588
+
589
+ def test_run_parallel
590
+ skip "I don't have ParallelEach debugged yet" if maglev?
591
+
592
+ test_count = 2
593
+ test_latch = Latch.new test_count
594
+ wait_latch = Latch.new test_count
595
+ main_latch = Latch.new
596
+
597
+ thread = Thread.new {
598
+ Thread.current.abort_on_exception = true
599
+
600
+ # This latch waits until both test latches have been released. Both
601
+ # latches can't be released unless done in separate threads because
602
+ # `main_latch` keeps the test method from finishing.
603
+ test_latch.await
604
+ main_latch.release
605
+ }
606
+
607
+ @tu =
608
+ Class.new FakeNamedTest do
609
+ parallelize_me!
610
+
611
+ test_count.times do |i|
612
+ define_method :"test_wait_on_main_thread_#{i}" do
613
+ test_latch.release
614
+
615
+ # This latch blocks until the "main thread" releases it. The main
616
+ # thread can't release this latch until both test latches have
617
+ # been released. This forces the latches to be released in separate
618
+ # threads.
619
+ main_latch.await
620
+ assert true
621
+ end
622
+ end
623
+ end
624
+
625
+ expected = clean <<-EOM
626
+ ..
627
+
628
+ Finished in 0.00
629
+
630
+ 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
631
+ EOM
632
+
633
+ assert_report(expected) do |reporter|
634
+ reporter.extend(Module.new {
635
+ define_method("record") do |result|
636
+ super(result)
637
+ wait_latch.release
638
+ end
639
+
640
+ define_method("report") do
641
+ wait_latch.await
642
+ super()
643
+ end
644
+ })
645
+ end
646
+ assert thread.join
647
+ end
648
+ end
649
+
650
+ class TestMinitestUnitOrder < MetaMetaMetaTestCase
651
+ # do not parallelize this suite... it just can't handle it.
652
+
653
+ def test_before_setup
654
+ call_order = []
655
+ @tu =
656
+ Class.new FakeNamedTest do
657
+ define_method :setup do
658
+ super()
659
+ call_order << :setup
660
+ end
661
+
662
+ define_method :before_setup do
663
+ call_order << :before_setup
664
+ end
665
+
666
+ def test_omg; assert true; end
667
+ end
668
+
669
+ run_tu_with_fresh_reporter
670
+
671
+ expected = [:before_setup, :setup]
672
+ assert_equal expected, call_order
673
+ end
674
+
675
+ def test_after_teardown
676
+ call_order = []
677
+ @tu =
678
+ Class.new FakeNamedTest do
679
+ define_method :teardown do
680
+ super()
681
+ call_order << :teardown
682
+ end
683
+
684
+ define_method :after_teardown do
685
+ call_order << :after_teardown
686
+ end
687
+
688
+ def test_omg; assert true; end
689
+ end
690
+
691
+ run_tu_with_fresh_reporter
692
+
693
+ expected = [:teardown, :after_teardown]
694
+ assert_equal expected, call_order
695
+ end
696
+
697
+ def test_all_teardowns_are_guaranteed_to_run
698
+ call_order = []
699
+ @tu =
700
+ Class.new FakeNamedTest do
701
+ define_method :after_teardown do
702
+ super()
703
+ call_order << :after_teardown
704
+ raise
705
+ end
706
+
707
+ define_method :teardown do
708
+ super()
709
+ call_order << :teardown
710
+ raise
711
+ end
712
+
713
+ define_method :before_teardown do
714
+ super()
715
+ call_order << :before_teardown
716
+ raise
717
+ end
718
+
719
+ def test_omg; assert true; end
720
+ end
721
+
722
+ run_tu_with_fresh_reporter
723
+
724
+ expected = [:before_teardown, :teardown, :after_teardown]
725
+ assert_equal expected, call_order
726
+ end
727
+
728
+ def test_setup_and_teardown_survive_inheritance
729
+ call_order = []
730
+
731
+ @tu = Class.new FakeNamedTest do
732
+ define_method :setup do
733
+ call_order << :setup_method
734
+ end
735
+
736
+ define_method :teardown do
737
+ call_order << :teardown_method
738
+ end
739
+
740
+ define_method :test_something do
741
+ call_order << :test
742
+ end
743
+ end
744
+
745
+ run_tu_with_fresh_reporter
746
+
747
+ @tu = Class.new @tu
748
+ run_tu_with_fresh_reporter
749
+
750
+ # Once for the parent class, once for the child
751
+ expected = [:setup_method, :test, :teardown_method] * 2
752
+
753
+ assert_equal expected, call_order
754
+ end
755
+ end
756
+
757
+ class TestMinitestRunnable < Minitest::Test
758
+ def setup_marshal klass
759
+ tc = klass.new "whatever"
760
+ tc.assertions = 42
761
+ tc.failures << "a failure"
762
+
763
+ yield tc if block_given?
764
+
765
+ def tc.setup
766
+ @blah = "blah"
767
+ end
768
+ tc.setup
769
+
770
+ @tc = Minitest::Result.from tc
771
+ end
772
+
773
+ def assert_marshal expected_ivars
774
+ new_tc = Marshal.load Marshal.dump @tc
775
+
776
+ ivars = new_tc.instance_variables.map(&:to_s).sort
777
+ assert_equal expected_ivars, ivars
778
+ assert_equal "whatever", new_tc.name
779
+ assert_equal 42, new_tc.assertions
780
+ assert_equal ["a failure"], new_tc.failures
781
+
782
+ yield new_tc if block_given?
783
+ end
784
+
785
+ def test_marshal
786
+ setup_marshal Minitest::Runnable
787
+
788
+ assert_marshal %w[@NAME @assertions @failures @klass @source_location @time]
789
+ end
790
+
791
+ def test_spec_marshal
792
+ klass = describe("whatever") { it("passes") { assert true } }
793
+ rm = klass.runnable_methods.first
794
+
795
+ # Run the test
796
+ @tc = klass.new(rm).run
797
+
798
+ assert_kind_of Minitest::Result, @tc
799
+
800
+ # Pass it over the wire
801
+ over_the_wire = Marshal.load Marshal.dump @tc
802
+
803
+ assert_equal @tc.time, over_the_wire.time
804
+ assert_equal @tc.name, over_the_wire.name
805
+ assert_equal @tc.assertions, over_the_wire.assertions
806
+ assert_equal @tc.failures, over_the_wire.failures
807
+ assert_equal @tc.klass, over_the_wire.klass
808
+ end
809
+ end
810
+
811
+ class TestMinitestTest < TestMinitestRunnable
812
+ def test_dup
813
+ setup_marshal Minitest::Test do |tc|
814
+ tc.time = 3.14
815
+ end
816
+
817
+ assert_marshal %w[@NAME @assertions @failures @klass @source_location @time] do |new_tc|
818
+ assert_in_epsilon 3.14, new_tc.time
819
+ end
820
+ end
821
+ end
822
+
823
+ class TestMinitestUnitTestCase < Minitest::Test
824
+ # do not call parallelize_me! - teardown accesses @tc._assertions
825
+ # which is not threadsafe. Nearly every method in here is an
826
+ # assertion test so it isn't worth splitting it out further.
827
+
828
+ RUBY18 = !defined? Encoding
829
+
830
+ def setup
831
+ super
832
+
833
+ Minitest::Test.reset
834
+
835
+ @tc = Minitest::Test.new "fake tc"
836
+ @zomg = "zomg ponies!"
837
+ @assertion_count = 1
838
+ end
839
+
840
+ def teardown
841
+ assert_equal(@assertion_count, @tc.assertions,
842
+ "expected #{@assertion_count} assertions to be fired during the test, not #{@tc.assertions}") if @tc.passed?
843
+ end
844
+
845
+ def non_verbose
846
+ orig_verbose = $VERBOSE
847
+ $VERBOSE = false
848
+
849
+ yield
850
+ ensure
851
+ $VERBOSE = orig_verbose
852
+ end
853
+
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
864
+ end
865
+
866
+ def test_assert__triggered_message
867
+ assert_triggered @zomg do
868
+ @tc.assert false, @zomg
869
+ end
870
+ end
871
+
872
+ def test_assert_empty
873
+ @assertion_count = 2
874
+
875
+ @tc.assert_empty []
876
+ end
877
+
878
+ def test_assert_empty_triggered
879
+ @assertion_count = 2
880
+
881
+ assert_triggered "Expected [1] to be empty." do
882
+ @tc.assert_empty [1]
883
+ end
884
+ end
885
+
886
+ def test_assert_equal
887
+ @tc.assert_equal 1, 1
888
+ end
889
+
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
900
+
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(/^ +/, "")
908
+
909
+ assert_triggered msg do
910
+ @tc.assert_equal h1, h2
911
+ end
912
+ end
913
+
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
922
+
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
946
+
947
+ def test_assert_equal_different_diff_deactivated
948
+ skip "https://github.com/MagLev/maglev/issues/209" if maglev?
949
+
950
+ without_diff do
951
+ assert_triggered util_msg("haha" * 10, "blah" * 10) do
952
+ o1 = "haha" * 10
953
+ o2 = "blah" * 10
954
+
955
+ @tc.assert_equal o1, o2
956
+ end
957
+ end
958
+ end
959
+
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
977
+ end
978
+
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
990
+ end
991
+
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
1006
+ end
1007
+
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(/^ +/, "")
1012
+
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
1021
+ end
1022
+
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
1037
+ end
1038
+
1039
+ def test_assert_equal_different_short
1040
+ assert_triggered util_msg(1, 2) do
1041
+ @tc.assert_equal 1, 2
1042
+ 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"
1048
+ end
1049
+ end
1050
+
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"
1055
+ 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
1073
+ end
1074
+ end
1075
+
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
1080
+ end
1081
+
1082
+ def test_assert_in_delta
1083
+ @tc.assert_in_delta 0.0, 1.0 / 1000, 0.1
1084
+ end
1085
+
1086
+ def test_delta_consistency
1087
+ @assertion_count = 2
1088
+
1089
+ @tc.assert_in_delta 0, 1, 1
1090
+
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
2024
+
2025
+ recorded = first_reporter.results.map(&:failures).flatten.map { |f| f.error.class }
2026
+
2027
+ assert_equal expected, recorded
2028
+ end
2029
+
2030
+ def test_run_with_bogus_reporter
2031
+ # https://github.com/seattlerb/minitest/issues/659
2032
+ # TODO: remove test for minitest 6
2033
+ @tu = Class.new FakeNamedTest do
2034
+ def test_method
2035
+ assert true
2036
+ end
2037
+ end
2038
+
2039
+ bogus_reporter = Class.new do # doesn't subclass AbstractReporter
2040
+ def start; @success = false; end
2041
+ # def prerecord klass, name; end # doesn't define full API
2042
+ def record result; @success = true; end
2043
+ def report; end
2044
+ def passed?; end
2045
+ def results; end
2046
+ def success?; @success; end
2047
+ end.new
2048
+
2049
+ self.reporter = Minitest::CompositeReporter.new
2050
+ reporter << bogus_reporter
2051
+
2052
+ Minitest::Runnable.runnables.delete @tu
2053
+
2054
+ @tu.run reporter, {}
2055
+
2056
+ assert_predicate bogus_reporter, :success?
2057
+ end
2058
+
2059
+ def test_record_passing
2060
+ assert_run_record do
2061
+ def test_method
2062
+ assert true
2063
+ end
2064
+ end
2065
+ end
2066
+
2067
+ def test_record_failing
2068
+ assert_run_record Minitest::Assertion do
2069
+ def test_method
2070
+ assert false
2071
+ end
2072
+ end
2073
+ end
2074
+
2075
+ def test_record_error
2076
+ assert_run_record RuntimeError do
2077
+ def test_method
2078
+ raise "unhandled exception"
2079
+ end
2080
+ end
2081
+ end
2082
+
2083
+ def test_record_error_teardown
2084
+ assert_run_record RuntimeError do
2085
+ def test_method
2086
+ assert true
2087
+ end
2088
+
2089
+ def teardown
2090
+ raise "unhandled exception"
2091
+ end
2092
+ end
2093
+ end
2094
+
2095
+ def test_record_error_in_test_and_teardown
2096
+ assert_run_record AnError, RuntimeError do
2097
+ def test_method
2098
+ raise AnError
2099
+ end
2100
+
2101
+ def teardown
2102
+ raise "unhandled exception"
2103
+ end
2104
+ end
2105
+ end
2106
+
2107
+ def test_to_s_error_in_test_and_teardown
2108
+ @tu = Class.new FakeNamedTest do
2109
+ def test_method
2110
+ raise AnError
2111
+ end
2112
+
2113
+ def teardown
2114
+ raise "unhandled exception"
2115
+ end
2116
+ end
2117
+
2118
+ run_tu_with_fresh_reporter
2119
+
2120
+ exp = clean "
2121
+ Error:
2122
+ FakeNamedTestXX#test_method:
2123
+ AnError: AnError
2124
+ FILE:LINE:in `test_method'
2125
+
2126
+ Error:
2127
+ FakeNamedTestXX#test_method:
2128
+ RuntimeError: unhandled exception
2129
+ FILE:LINE:in `teardown'
2130
+ "
2131
+
2132
+ assert_equal exp.strip, normalize_output(first_reporter.results.first.to_s).strip
2133
+ end
2134
+
2135
+ def test_record_skip
2136
+ assert_run_record Minitest::Skip do
2137
+ def test_method
2138
+ skip "not yet"
2139
+ end
2140
+ end
2141
+ end
2142
+ end