minitest 5.10.3 → 5.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -2
- data/History.rdoc +88 -0
- data/Manifest.txt +1 -0
- data/README.rdoc +40 -10
- data/lib/minitest.rb +144 -13
- data/lib/minitest/assertions.rb +51 -18
- data/lib/minitest/benchmark.rb +32 -1
- data/lib/minitest/mock.rb +6 -9
- data/lib/minitest/parallel.rb +1 -1
- data/lib/minitest/spec.rb +4 -0
- data/lib/minitest/test.rb +6 -70
- data/test/minitest/metametameta.rb +4 -0
- data/test/minitest/test_minitest_assertions.rb +1389 -0
- data/test/minitest/test_minitest_mock.rb +364 -2
- data/test/minitest/test_minitest_reporter.rb +16 -4
- data/test/minitest/test_minitest_spec.rb +167 -131
- data/test/minitest/test_minitest_test.rb +51 -1106
- metadata +24 -19
- metadata.gz.sig +0 -0
@@ -362,7 +362,7 @@ end
|
|
362
362
|
require "minitest/metametameta"
|
363
363
|
|
364
364
|
class TestMinitestStub < Minitest::Test
|
365
|
-
|
365
|
+
# Do not parallelize since we're calling stub on class methods
|
366
366
|
|
367
367
|
def setup
|
368
368
|
super
|
@@ -374,7 +374,7 @@ class TestMinitestStub < Minitest::Test
|
|
374
374
|
|
375
375
|
def teardown
|
376
376
|
super
|
377
|
-
assert_equal @assertion_count, @tc.assertions
|
377
|
+
assert_equal @assertion_count, @tc.assertions if self.passed?
|
378
378
|
end
|
379
379
|
|
380
380
|
class Time
|
@@ -494,6 +494,17 @@ class TestMinitestStub < Minitest::Test
|
|
494
494
|
@tc.assert_equal false, dynamic.found
|
495
495
|
end
|
496
496
|
|
497
|
+
def test_stub_NameError
|
498
|
+
e = @tc.assert_raises NameError do
|
499
|
+
Time.stub :nope_nope_nope, 42 do
|
500
|
+
# do nothing
|
501
|
+
end
|
502
|
+
end
|
503
|
+
|
504
|
+
exp = /undefined method `nope_nope_nope' for( class)? `#{self.class}::Time'/
|
505
|
+
assert_match exp, e.message
|
506
|
+
end
|
507
|
+
|
497
508
|
def test_mock_with_yield
|
498
509
|
mock = Minitest::Mock.new
|
499
510
|
mock.expect(:write, true) do
|
@@ -509,4 +520,355 @@ class TestMinitestStub < Minitest::Test
|
|
509
520
|
@tc.assert_equal true, rs
|
510
521
|
end
|
511
522
|
|
523
|
+
alias test_stub_value__old test_stub_value # TODO: remove/rename
|
524
|
+
|
525
|
+
## Permutation Sets:
|
526
|
+
|
527
|
+
# [:value, :lambda]
|
528
|
+
# [:*, :block, :block_call]
|
529
|
+
# [:**, :block_args]
|
530
|
+
#
|
531
|
+
# Where:
|
532
|
+
#
|
533
|
+
# :value = a normal value
|
534
|
+
# :lambda = callable or lambda
|
535
|
+
# :* = no block
|
536
|
+
# :block = normal block
|
537
|
+
# :block_call = :lambda invokes the block (N/A for :value)
|
538
|
+
# :** = no args
|
539
|
+
# :args = args passed to stub
|
540
|
+
|
541
|
+
## Permutations
|
542
|
+
|
543
|
+
# [:call, :*, :**] =>5 callable+block FIX: CALL BOTH (bug)
|
544
|
+
# [:call, :*, :**] =>6 callable
|
545
|
+
|
546
|
+
# [:lambda, :*, :**] => lambda result
|
547
|
+
|
548
|
+
# [:lambda, :*, :args] => lambda result NO ARGS
|
549
|
+
|
550
|
+
# [:lambda, :block, :**] =>5 lambda result FIX: CALL BOTH (bug)
|
551
|
+
# [:lambda, :block, :**] =>6 lambda result
|
552
|
+
|
553
|
+
# [:lambda, :block, :args] =>5 lambda result FIX: CALL BOTH (bug)
|
554
|
+
# [:lambda, :block, :args] =>6 lambda result
|
555
|
+
# [:lambda, :block, :args] =>7 raise ArgumentError
|
556
|
+
|
557
|
+
# [:lambda, :block_call, :**] =>5 lambda FIX: BUG!-not passed block to lambda
|
558
|
+
# [:lambda, :block_call, :**] =>6 lambda+block result
|
559
|
+
|
560
|
+
# [:lambda, :block_call, :args] =>5 lambda FIX: BUG!-not passed block to lambda
|
561
|
+
# [:lambda, :block_call, :args] =>6 lambda+block result
|
562
|
+
|
563
|
+
# [:value, :*, :**] => value
|
564
|
+
|
565
|
+
# [:value, :*, :args] => value, ignore args
|
566
|
+
|
567
|
+
# [:value, :block, :**] =>5 value, call block
|
568
|
+
# [:value, :block, :**] =>6 value
|
569
|
+
|
570
|
+
# [:value, :block, :args] =>5 value, call block w/ args
|
571
|
+
# [:value, :block, :args] =>6 value, call block w/ args, deprecated
|
572
|
+
# [:value, :block, :args] =>7 raise ArgumentError
|
573
|
+
|
574
|
+
# [:value, :block_call, :**] => N/A
|
575
|
+
|
576
|
+
# [:value, :block_call, :args] => N/A
|
577
|
+
|
578
|
+
class Bar
|
579
|
+
def call
|
580
|
+
puts "hi"
|
581
|
+
end
|
582
|
+
end
|
583
|
+
|
584
|
+
class Foo
|
585
|
+
def self.blocking
|
586
|
+
yield
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
590
|
+
class Thingy
|
591
|
+
def self.identity arg
|
592
|
+
arg
|
593
|
+
end
|
594
|
+
end
|
595
|
+
|
596
|
+
def test_stub_callable_block_5 # from tenderlove
|
597
|
+
@assertion_count += 1
|
598
|
+
Foo.stub5 :blocking, Bar.new do
|
599
|
+
@tc.assert_output "hi\n", "" do
|
600
|
+
Foo.blocking do
|
601
|
+
@tc.flunk "shouldn't ever hit this"
|
602
|
+
end
|
603
|
+
end
|
604
|
+
end
|
605
|
+
end
|
606
|
+
|
607
|
+
def test_stub_callable_block_6 # from tenderlove
|
608
|
+
skip_stub6
|
609
|
+
|
610
|
+
@assertion_count += 1
|
611
|
+
Foo.stub6 :blocking, Bar.new do
|
612
|
+
@tc.assert_output "hi\n", "" do
|
613
|
+
Foo.blocking do
|
614
|
+
@tc.flunk "shouldn't ever hit this"
|
615
|
+
end
|
616
|
+
end
|
617
|
+
end
|
618
|
+
end
|
619
|
+
|
620
|
+
def test_stub_lambda
|
621
|
+
Thread.stub :new, lambda { 21+21 } do
|
622
|
+
@tc.assert_equal 42, Thread.new
|
623
|
+
end
|
624
|
+
end
|
625
|
+
|
626
|
+
def test_stub_lambda_args
|
627
|
+
Thread.stub :new, lambda { 21+21 }, :wtf do
|
628
|
+
@tc.assert_equal 42, Thread.new
|
629
|
+
end
|
630
|
+
end
|
631
|
+
|
632
|
+
def test_stub_lambda_block_5
|
633
|
+
Thread.stub5 :new, lambda { 21+21 } do
|
634
|
+
result = Thread.new do
|
635
|
+
@tc.flunk "shouldn't ever hit this"
|
636
|
+
end
|
637
|
+
@tc.assert_equal 42, result
|
638
|
+
end
|
639
|
+
end
|
640
|
+
|
641
|
+
def test_stub_lambda_block_6
|
642
|
+
skip_stub6
|
643
|
+
|
644
|
+
Thread.stub6 :new, lambda { 21+21 } do
|
645
|
+
result = Thread.new do
|
646
|
+
@tc.flunk "shouldn't ever hit this"
|
647
|
+
end
|
648
|
+
@tc.assert_equal 42, result
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
def test_stub_lambda_block_args_5
|
653
|
+
@assertion_count += 1
|
654
|
+
Thingy.stub5 :identity, lambda { |y| @tc.assert_equal :nope, y; 21+21 }, :WTF? do
|
655
|
+
result = Thingy.identity :nope do |x|
|
656
|
+
@tc.flunk "shouldn't reach this"
|
657
|
+
end
|
658
|
+
@tc.assert_equal 42, result
|
659
|
+
end
|
660
|
+
end
|
661
|
+
|
662
|
+
def test_stub_lambda_block_args_6
|
663
|
+
skip_stub6
|
664
|
+
|
665
|
+
@assertion_count += 1
|
666
|
+
Thingy.stub6 :identity, lambda { |y| @tc.assert_equal :nope, y; 21+21 }, :WTF? do
|
667
|
+
result = Thingy.identity :nope do |x|
|
668
|
+
@tc.flunk "shouldn't reach this"
|
669
|
+
end
|
670
|
+
@tc.assert_equal 42, result
|
671
|
+
end
|
672
|
+
end
|
673
|
+
|
674
|
+
def test_stub_lambda_block_args_6_2
|
675
|
+
skip_stub6
|
676
|
+
|
677
|
+
@tc.assert_raises ArgumentError do
|
678
|
+
Thingy.stub6_2 :identity, lambda { |y| :__not_run__ }, :WTF? do
|
679
|
+
# doesn't matter
|
680
|
+
end
|
681
|
+
end
|
682
|
+
end
|
683
|
+
|
684
|
+
def test_stub_lambda_block_call_5
|
685
|
+
@assertion_count += 1
|
686
|
+
rs = nil
|
687
|
+
io = StringIO.new "", "w"
|
688
|
+
File.stub5 :open, lambda { |p, m, &blk| blk and blk.call io } do
|
689
|
+
File.open "foo.txt", "r" do |f|
|
690
|
+
rs = f && f.write("woot")
|
691
|
+
end
|
692
|
+
end
|
693
|
+
@tc.assert_equal 4, rs
|
694
|
+
@tc.assert_equal "woot", io.string
|
695
|
+
end
|
696
|
+
|
697
|
+
def test_stub_lambda_block_call_6
|
698
|
+
skip_stub6
|
699
|
+
|
700
|
+
@assertion_count += 1
|
701
|
+
rs = nil
|
702
|
+
io = StringIO.new "", "w"
|
703
|
+
File.stub6 :open, lambda { |p, m, &blk| blk.call io } do
|
704
|
+
File.open "foo.txt", "r" do |f|
|
705
|
+
rs = f.write("woot")
|
706
|
+
end
|
707
|
+
end
|
708
|
+
@tc.assert_equal 4, rs
|
709
|
+
@tc.assert_equal "woot", io.string
|
710
|
+
end
|
711
|
+
|
712
|
+
def test_stub_lambda_block_call_args_5
|
713
|
+
@assertion_count += 1
|
714
|
+
rs = nil
|
715
|
+
io = StringIO.new "", "w"
|
716
|
+
File.stub5(:open, lambda { |p, m, &blk| blk and blk.call io }, :WTF?) do
|
717
|
+
File.open "foo.txt", "r" do |f|
|
718
|
+
rs = f.write("woot")
|
719
|
+
end
|
720
|
+
end
|
721
|
+
@tc.assert_equal 4, rs
|
722
|
+
@tc.assert_equal "woot", io.string
|
723
|
+
end
|
724
|
+
|
725
|
+
def test_stub_lambda_block_call_args_6
|
726
|
+
skip_stub6
|
727
|
+
|
728
|
+
@assertion_count += 1
|
729
|
+
rs = nil
|
730
|
+
io = StringIO.new "", "w"
|
731
|
+
File.stub6(:open, lambda { |p, m, &blk| blk.call io }, :WTF?) do
|
732
|
+
File.open "foo.txt", "r" do |f|
|
733
|
+
rs = f.write("woot")
|
734
|
+
end
|
735
|
+
end
|
736
|
+
@tc.assert_equal 4, rs
|
737
|
+
@tc.assert_equal "woot", io.string
|
738
|
+
end
|
739
|
+
|
740
|
+
def test_stub_lambda_block_call_args_6_2
|
741
|
+
skip_stub6
|
742
|
+
|
743
|
+
@assertion_count += 2
|
744
|
+
rs = nil
|
745
|
+
io = StringIO.new "", "w"
|
746
|
+
@tc.assert_raises ArgumentError do
|
747
|
+
File.stub6_2(:open, lambda { |p, m, &blk| blk.call io }, :WTF?) do
|
748
|
+
File.open "foo.txt", "r" do |f|
|
749
|
+
rs = f.write("woot")
|
750
|
+
end
|
751
|
+
end
|
752
|
+
end
|
753
|
+
@tc.assert_nil rs
|
754
|
+
@tc.assert_equal "", io.string
|
755
|
+
end
|
756
|
+
|
757
|
+
def test_stub_value
|
758
|
+
Thread.stub :new, 42 do
|
759
|
+
result = Thread.new
|
760
|
+
@tc.assert_equal 42, result
|
761
|
+
end
|
762
|
+
end
|
763
|
+
|
764
|
+
def test_stub_value_args
|
765
|
+
Thread.stub :new, 42, :WTF? do
|
766
|
+
result = Thread.new
|
767
|
+
@tc.assert_equal 42, result
|
768
|
+
end
|
769
|
+
end
|
770
|
+
|
771
|
+
def test_stub_value_block_5
|
772
|
+
@assertion_count += 1
|
773
|
+
Thread.stub5 :new, 42 do
|
774
|
+
result = Thread.new do
|
775
|
+
@tc.assert true
|
776
|
+
end
|
777
|
+
@tc.assert_equal 42, result
|
778
|
+
end
|
779
|
+
end
|
780
|
+
|
781
|
+
def test_stub_value_block_6
|
782
|
+
skip_stub6
|
783
|
+
|
784
|
+
Thread.stub6 :new, 42 do
|
785
|
+
result = Thread.new do
|
786
|
+
@tc.flunk "shouldn't hit this"
|
787
|
+
end
|
788
|
+
@tc.assert_equal 42, result
|
789
|
+
end
|
790
|
+
end
|
791
|
+
|
792
|
+
def test_stub_value_block_args_5
|
793
|
+
@assertion_count += 2
|
794
|
+
rs = nil
|
795
|
+
io = StringIO.new "", "w"
|
796
|
+
File.stub5 :open, :value, io do
|
797
|
+
result = File.open "foo.txt", "r" do |f|
|
798
|
+
rs = f.write("woot")
|
799
|
+
end
|
800
|
+
@tc.assert_equal :value, result
|
801
|
+
end
|
802
|
+
@tc.assert_equal 4, rs
|
803
|
+
@tc.assert_equal "woot", io.string
|
804
|
+
end
|
805
|
+
|
806
|
+
def test_stub_value_block_args_5__break_if_not_passed
|
807
|
+
e = @tc.assert_raises NoMethodError do
|
808
|
+
File.stub5 :open, :return_value do # intentionally bad setup w/ no args
|
809
|
+
File.open "foo.txt", "r" do |f|
|
810
|
+
f.write "woot"
|
811
|
+
end
|
812
|
+
end
|
813
|
+
end
|
814
|
+
exp = "undefined method `write' for nil:NilClass"
|
815
|
+
assert_equal exp, e.message
|
816
|
+
end
|
817
|
+
|
818
|
+
def test_stub_value_block_args_6
|
819
|
+
skip_stub6
|
820
|
+
|
821
|
+
@assertion_count += 2
|
822
|
+
rs = nil
|
823
|
+
io = StringIO.new "", "w"
|
824
|
+
assert_deprecated do
|
825
|
+
File.stub6 :open, :value, io do
|
826
|
+
result = File.open "foo.txt", "r" do |f|
|
827
|
+
rs = f.write("woot")
|
828
|
+
end
|
829
|
+
@tc.assert_equal :value, result
|
830
|
+
end
|
831
|
+
end
|
832
|
+
@tc.assert_equal 4, rs
|
833
|
+
@tc.assert_equal "woot", io.string
|
834
|
+
end
|
835
|
+
|
836
|
+
def test_stub_value_block_args_6_2
|
837
|
+
skip_stub6
|
838
|
+
|
839
|
+
@assertion_count += 2
|
840
|
+
rs = nil
|
841
|
+
io = StringIO.new "", "w"
|
842
|
+
@tc.assert_raises ArgumentError do
|
843
|
+
File.stub6_2 :open, :value, io do
|
844
|
+
result = File.open "foo.txt", "r" do |f|
|
845
|
+
@tc.flunk "shouldn't hit this"
|
846
|
+
end
|
847
|
+
@tc.assert_equal :value, result
|
848
|
+
end
|
849
|
+
end
|
850
|
+
@tc.assert_nil rs
|
851
|
+
@tc.assert_equal "", io.string
|
852
|
+
end
|
853
|
+
|
854
|
+
def assert_deprecated re = /deprecated/
|
855
|
+
assert_output "", re do
|
856
|
+
yield
|
857
|
+
end
|
858
|
+
end
|
859
|
+
|
860
|
+
def skip_stub6
|
861
|
+
skip "not yet" unless STUB6
|
862
|
+
end
|
863
|
+
end
|
864
|
+
|
865
|
+
STUB6 = ENV["STUB6"]
|
866
|
+
|
867
|
+
if STUB6 then
|
868
|
+
require "minitest/mock6" if STUB6
|
869
|
+
else
|
870
|
+
class Object
|
871
|
+
alias stub5 stub
|
872
|
+
alias stub6 stub
|
873
|
+
end
|
512
874
|
end
|
@@ -1,6 +1,12 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "minitest/metametameta"
|
3
3
|
|
4
|
+
class Runnable
|
5
|
+
def woot
|
6
|
+
assert true
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
4
10
|
class TestMinitestReporter < MetaMetaMetaTestCase
|
5
11
|
|
6
12
|
attr_accessor :r, :io
|
@@ -42,6 +48,7 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
42
48
|
rescue => e
|
43
49
|
e
|
44
50
|
end)
|
51
|
+
@et = Minitest::Result.from @et
|
45
52
|
end
|
46
53
|
@et
|
47
54
|
end
|
@@ -54,12 +61,13 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
54
61
|
rescue Minitest::Assertion => e
|
55
62
|
e
|
56
63
|
end
|
64
|
+
@ft = Minitest::Result.from @ft
|
57
65
|
end
|
58
66
|
@ft
|
59
67
|
end
|
60
68
|
|
61
69
|
def passing_test
|
62
|
-
@pt ||= Minitest::Test.new(:woot)
|
70
|
+
@pt ||= Minitest::Result.from Minitest::Test.new(:woot)
|
63
71
|
end
|
64
72
|
|
65
73
|
def skip_test
|
@@ -70,6 +78,7 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
70
78
|
rescue Minitest::Assertion => e
|
71
79
|
e
|
72
80
|
end
|
81
|
+
@st = Minitest::Result.from @st
|
73
82
|
end
|
74
83
|
@st
|
75
84
|
end
|
@@ -81,13 +90,13 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
81
90
|
end
|
82
91
|
|
83
92
|
def test_passed_eh_empty
|
84
|
-
|
93
|
+
assert_predicate r, :passed?
|
85
94
|
end
|
86
95
|
|
87
96
|
def test_passed_eh_failure
|
88
97
|
r.results << fail_test
|
89
98
|
|
90
|
-
|
99
|
+
refute_predicate r, :passed?
|
91
100
|
end
|
92
101
|
|
93
102
|
SKIP_MSG = "\n\nYou have skipped tests. Run with --verbose for details."
|
@@ -97,7 +106,7 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
97
106
|
|
98
107
|
r.results << error_test
|
99
108
|
|
100
|
-
|
109
|
+
refute_predicate r, :passed?
|
101
110
|
|
102
111
|
r.report
|
103
112
|
|
@@ -145,6 +154,7 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
145
154
|
end
|
146
155
|
|
147
156
|
def test_record_fail
|
157
|
+
fail_test = self.fail_test
|
148
158
|
r.record fail_test
|
149
159
|
|
150
160
|
assert_equal "F", io.string
|
@@ -154,6 +164,7 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
154
164
|
end
|
155
165
|
|
156
166
|
def test_record_error
|
167
|
+
error_test = self.error_test
|
157
168
|
r.record error_test
|
158
169
|
|
159
170
|
assert_equal "E", io.string
|
@@ -163,6 +174,7 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
163
174
|
end
|
164
175
|
|
165
176
|
def test_record_skip
|
177
|
+
skip_test = self.skip_test
|
166
178
|
r.record skip_test
|
167
179
|
|
168
180
|
assert_equal "S", io.string
|