minitest 4.1.0 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/History.txt +16 -0
- data/Manifest.txt +2 -0
- data/lib/minitest/hell.rb +9 -0
- data/lib/minitest/parallel_each.rb +29 -0
- data/lib/minitest/unit.rb +91 -30
- data/test/minitest/metametameta.rb +17 -5
- data/test/minitest/test_minitest_benchmark.rb +0 -1
- data/test/minitest/test_minitest_mock.rb +18 -10
- data/test/minitest/test_minitest_spec.rb +21 -6
- data/test/minitest/test_minitest_unit.rb +157 -68
- metadata +9 -7
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
=== 4.2.0 / 2012-11-02
|
2
|
+
|
3
|
+
* 4 major enhancements:
|
4
|
+
|
5
|
+
* Added minitest/hell - run all your tests through the ringer!
|
6
|
+
* Added support for :parallel test_order to run test cases in parallel.
|
7
|
+
* Removed last_error and refactored runner code to be threadsafe.
|
8
|
+
* _run_suites now runs suites in parallel if they opt-in.
|
9
|
+
|
10
|
+
* 4 minor enhancements:
|
11
|
+
|
12
|
+
* Added TestCase#synchronize
|
13
|
+
* Added TestCase.make_my_diffs_pretty!
|
14
|
+
* Added TestCase.parallelize_me!
|
15
|
+
* Lock on capture_io for thread safety (tenderlove)
|
16
|
+
|
1
17
|
=== 4.1.0 / 2012-10-05
|
2
18
|
|
3
19
|
* 2 minor enhancements:
|
data/Manifest.txt
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
class ParallelEach
|
2
|
+
require 'thread'
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
N = (ENV['N'] || 2).to_i
|
6
|
+
|
7
|
+
def initialize list
|
8
|
+
@queue = Queue.new # *sigh*... the Queue api sucks sooo much...
|
9
|
+
|
10
|
+
list.each { |i| @queue << i }
|
11
|
+
N.times { @queue << nil }
|
12
|
+
end
|
13
|
+
|
14
|
+
def grep pattern
|
15
|
+
self.class.new super
|
16
|
+
end
|
17
|
+
|
18
|
+
def each
|
19
|
+
threads = N.times.map {
|
20
|
+
Thread.new do
|
21
|
+
Thread.current.abort_on_exception = true
|
22
|
+
while job = @queue.pop
|
23
|
+
yield job
|
24
|
+
end
|
25
|
+
end
|
26
|
+
}
|
27
|
+
threads.map(&:join)
|
28
|
+
end
|
29
|
+
end
|
data/lib/minitest/unit.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'rbconfig'
|
3
|
+
require 'thread' # required for 1.8
|
4
|
+
require 'minitest/parallel_each'
|
3
5
|
|
4
6
|
##
|
5
7
|
# Minimal (mostly drop-in) replacement for test-unit.
|
@@ -436,6 +438,8 @@ module MiniTest
|
|
436
438
|
catch(sym) do
|
437
439
|
begin
|
438
440
|
yield
|
441
|
+
rescue ThreadError => e # wtf?!? 1.8 + threads == suck
|
442
|
+
default += ", not :#{e.message[/uncaught throw \`(\w+?)\'/, 1]}"
|
439
443
|
rescue ArgumentError => e # 1.9 exception
|
440
444
|
default += ", not #{e.message.split(/ /).last}"
|
441
445
|
rescue NameError => e # 1.8 exception
|
@@ -465,16 +469,21 @@ module MiniTest
|
|
465
469
|
def capture_io
|
466
470
|
require 'stringio'
|
467
471
|
|
468
|
-
orig_stdout, orig_stderr = $stdout, $stderr
|
469
472
|
captured_stdout, captured_stderr = StringIO.new, StringIO.new
|
470
|
-
$stdout, $stderr = captured_stdout, captured_stderr
|
471
473
|
|
472
|
-
|
474
|
+
synchronize do
|
475
|
+
orig_stdout, orig_stderr = $stdout, $stderr
|
476
|
+
$stdout, $stderr = captured_stdout, captured_stderr
|
477
|
+
|
478
|
+
begin
|
479
|
+
yield
|
480
|
+
ensure
|
481
|
+
$stdout = orig_stdout
|
482
|
+
$stderr = orig_stderr
|
483
|
+
end
|
484
|
+
end
|
473
485
|
|
474
486
|
return captured_stdout.string, captured_stderr.string
|
475
|
-
ensure
|
476
|
-
$stdout = orig_stdout
|
477
|
-
$stderr = orig_stderr
|
478
487
|
end
|
479
488
|
|
480
489
|
##
|
@@ -496,21 +505,26 @@ module MiniTest
|
|
496
505
|
require 'tempfile'
|
497
506
|
|
498
507
|
captured_stdout, captured_stderr = Tempfile.new("out"), Tempfile.new("err")
|
499
|
-
orig_stdout, orig_stderr = $stdout.dup, $stderr.dup
|
500
|
-
$stdout.reopen captured_stdout
|
501
|
-
$stderr.reopen captured_stderr
|
502
508
|
|
503
|
-
|
509
|
+
synchronize do
|
510
|
+
orig_stdout, orig_stderr = $stdout.dup, $stderr.dup
|
511
|
+
$stdout.reopen captured_stdout
|
512
|
+
$stderr.reopen captured_stderr
|
504
513
|
|
505
|
-
|
506
|
-
|
514
|
+
begin
|
515
|
+
yield
|
507
516
|
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
517
|
+
$stdout.rewind
|
518
|
+
$stderr.rewind
|
519
|
+
|
520
|
+
[captured_stdout.read, captured_stderr.read]
|
521
|
+
ensure
|
522
|
+
captured_stdout.unlink
|
523
|
+
captured_stderr.unlink
|
524
|
+
$stdout.reopen orig_stdout
|
525
|
+
$stderr.reopen orig_stderr
|
526
|
+
end
|
527
|
+
end
|
514
528
|
end
|
515
529
|
|
516
530
|
##
|
@@ -703,10 +717,19 @@ module MiniTest
|
|
703
717
|
msg ||= "Skipped, no message given"
|
704
718
|
raise MiniTest::Skip, msg, bt
|
705
719
|
end
|
720
|
+
|
721
|
+
##
|
722
|
+
# Takes a block and wraps it with the runner's shared mutex.
|
723
|
+
|
724
|
+
def synchronize
|
725
|
+
Minitest::Unit.runner.synchronize do
|
726
|
+
yield
|
727
|
+
end
|
728
|
+
end
|
706
729
|
end
|
707
730
|
|
708
731
|
class Unit # :nodoc:
|
709
|
-
VERSION = "4.
|
732
|
+
VERSION = "4.2.0" # :nodoc:
|
710
733
|
|
711
734
|
attr_accessor :report, :failures, :errors, :skips # :nodoc:
|
712
735
|
attr_accessor :test_count, :assertion_count # :nodoc:
|
@@ -714,7 +737,6 @@ module MiniTest
|
|
714
737
|
attr_accessor :help # :nodoc:
|
715
738
|
attr_accessor :verbose # :nodoc:
|
716
739
|
attr_writer :options # :nodoc:
|
717
|
-
attr_accessor :last_error # :nodoc:
|
718
740
|
|
719
741
|
##
|
720
742
|
# Lazy accessor for options.
|
@@ -857,10 +879,15 @@ module MiniTest
|
|
857
879
|
end
|
858
880
|
|
859
881
|
##
|
860
|
-
# Runs all the +suites+ for a given +type+.
|
882
|
+
# Runs all the +suites+ for a given +type+. Runs suites declaring
|
883
|
+
# a test_order of +:parallel+ in parallel, and everything else
|
884
|
+
# serial.
|
861
885
|
|
862
886
|
def _run_suites suites, type
|
863
|
-
suites.
|
887
|
+
parallel, serial = suites.partition { |s| s.test_order == :parallel }
|
888
|
+
|
889
|
+
ParallelEach.new(parallel).map { |suite| _run_suite suite, type } +
|
890
|
+
serial.map { |suite| _run_suite suite, type }
|
864
891
|
end
|
865
892
|
|
866
893
|
##
|
@@ -879,14 +906,10 @@ module MiniTest
|
|
879
906
|
|
880
907
|
print "#{suite}##{method} = " if @verbose
|
881
908
|
|
882
|
-
|
883
|
-
self.last_error = nil
|
909
|
+
start_time = Time.now if @verbose
|
884
910
|
result = inst.run self
|
885
|
-
time = Time.now - @start_time
|
886
911
|
|
887
|
-
|
888
|
-
|
889
|
-
print "%.2f s = " % time if @verbose
|
912
|
+
print "%.2f s = " % (Time.now - start_time) if @verbose
|
890
913
|
print result
|
891
914
|
puts if @verbose
|
892
915
|
|
@@ -925,7 +948,6 @@ module MiniTest
|
|
925
948
|
# exception +e+
|
926
949
|
|
927
950
|
def puke klass, meth, e
|
928
|
-
self.last_error = e
|
929
951
|
e = case e
|
930
952
|
when MiniTest::Skip then
|
931
953
|
@skips += 1
|
@@ -947,7 +969,11 @@ module MiniTest
|
|
947
969
|
@report = []
|
948
970
|
@errors = @failures = @skips = 0
|
949
971
|
@verbose = false
|
950
|
-
|
972
|
+
@mutex = Mutex.new
|
973
|
+
end
|
974
|
+
|
975
|
+
def synchronize # :nodoc:
|
976
|
+
@mutex.synchronize { yield }
|
951
977
|
end
|
952
978
|
|
953
979
|
def process_args args = [] # :nodoc:
|
@@ -1255,6 +1281,8 @@ module MiniTest
|
|
1255
1281
|
runner.status $stderr
|
1256
1282
|
end if SUPPORTS_INFO_SIGNAL
|
1257
1283
|
|
1284
|
+
start_time = Time.now
|
1285
|
+
|
1258
1286
|
result = ""
|
1259
1287
|
begin
|
1260
1288
|
@passed = nil
|
@@ -1263,11 +1291,15 @@ module MiniTest
|
|
1263
1291
|
self.after_setup
|
1264
1292
|
self.run_test self.__name__
|
1265
1293
|
result = "." unless io?
|
1294
|
+
time = Time.now - start_time
|
1295
|
+
runner.record self.class, self.__name__, self._assertions, time, nil
|
1266
1296
|
@passed = true
|
1267
1297
|
rescue *PASSTHROUGH_EXCEPTIONS
|
1268
1298
|
raise
|
1269
1299
|
rescue Exception => e
|
1270
1300
|
@passed = false
|
1301
|
+
time = Time.now - start_time
|
1302
|
+
runner.record self.class, self.__name__, self._assertions, time, e
|
1271
1303
|
result = runner.puke self.class, self.__name__, e
|
1272
1304
|
ensure
|
1273
1305
|
%w{ before_teardown teardown after_teardown }.each do |hook|
|
@@ -1331,6 +1363,32 @@ module MiniTest
|
|
1331
1363
|
end
|
1332
1364
|
end
|
1333
1365
|
|
1366
|
+
##
|
1367
|
+
# Make diffs for this TestCase use #pretty_inspect so that diff
|
1368
|
+
# in assert_equal can be more details. NOTE: this is much slower
|
1369
|
+
# than the regular inspect but much more usable for complex
|
1370
|
+
# objects.
|
1371
|
+
|
1372
|
+
def self.make_my_diffs_pretty!
|
1373
|
+
require 'pp'
|
1374
|
+
|
1375
|
+
define_method :mu_pp do |o|
|
1376
|
+
o.pretty_inspect
|
1377
|
+
end
|
1378
|
+
end
|
1379
|
+
|
1380
|
+
##
|
1381
|
+
# Call this at the top of your tests when you want to run your
|
1382
|
+
# tests in parallel. In doing so, you're admitting that you rule
|
1383
|
+
# and your tests are awesome.
|
1384
|
+
|
1385
|
+
def self.parallelize_me!
|
1386
|
+
class << self
|
1387
|
+
undef_method :test_order if method_defined? :test_order
|
1388
|
+
define_method :test_order do :parallel end
|
1389
|
+
end
|
1390
|
+
end
|
1391
|
+
|
1334
1392
|
def self.inherited klass # :nodoc:
|
1335
1393
|
@@test_suites[klass] = true
|
1336
1394
|
klass.reset_setup_teardown_hooks
|
@@ -1349,6 +1407,9 @@ module MiniTest
|
|
1349
1407
|
methods = public_instance_methods(true).grep(/^test/).map { |m| m.to_s }
|
1350
1408
|
|
1351
1409
|
case self.test_order
|
1410
|
+
when :parallel
|
1411
|
+
max = methods.size
|
1412
|
+
ParallelEach.new methods.sort.sort_by { rand max }
|
1352
1413
|
when :random then
|
1353
1414
|
max = methods.size
|
1354
1415
|
methods.sort.sort_by { rand max }
|
@@ -17,7 +17,9 @@ class MetaMetaMetaTestCase < MiniTest::Unit::TestCase
|
|
17
17
|
|
18
18
|
EOM
|
19
19
|
|
20
|
-
|
20
|
+
with_output do
|
21
|
+
@tu.run flags
|
22
|
+
end
|
21
23
|
|
22
24
|
output = @output.string.dup
|
23
25
|
output.sub!(/Finished tests in .*/, "Finished tests in 0.00")
|
@@ -42,14 +44,24 @@ class MetaMetaMetaTestCase < MiniTest::Unit::TestCase
|
|
42
44
|
srand 42
|
43
45
|
MiniTest::Unit::TestCase.reset
|
44
46
|
@tu = MiniTest::Unit.new
|
45
|
-
|
47
|
+
|
46
48
|
MiniTest::Unit.runner = nil # protect the outer runner from the inner tests
|
47
|
-
MiniTest::Unit.output = @output
|
48
49
|
end
|
49
50
|
|
50
51
|
def teardown
|
51
52
|
super
|
52
|
-
|
53
|
-
|
53
|
+
end
|
54
|
+
|
55
|
+
def with_output
|
56
|
+
synchronize do
|
57
|
+
begin
|
58
|
+
@output = StringIO.new("")
|
59
|
+
MiniTest::Unit.output = @output
|
60
|
+
|
61
|
+
yield
|
62
|
+
ensure
|
63
|
+
MiniTest::Unit.output = STDOUT
|
64
|
+
end
|
65
|
+
end
|
54
66
|
end
|
55
67
|
end
|
@@ -4,6 +4,8 @@ require 'minitest/unit'
|
|
4
4
|
MiniTest::Unit.autorun
|
5
5
|
|
6
6
|
class TestMiniTestMock < MiniTest::Unit::TestCase
|
7
|
+
parallelize_me!
|
8
|
+
|
7
9
|
def setup
|
8
10
|
@mock = MiniTest::Mock.new.expect(:foo, nil)
|
9
11
|
@mock.expect(:meaning_of_life, 42)
|
@@ -208,6 +210,8 @@ end
|
|
208
210
|
require "minitest/metametameta"
|
209
211
|
|
210
212
|
class TestMiniTestStub < MiniTest::Unit::TestCase
|
213
|
+
parallelize_me!
|
214
|
+
|
211
215
|
def setup
|
212
216
|
super
|
213
217
|
MiniTest::Unit::TestCase.reset
|
@@ -224,13 +228,15 @@ class TestMiniTestStub < MiniTest::Unit::TestCase
|
|
224
228
|
def assert_stub val_or_callable
|
225
229
|
@assertion_count += 1
|
226
230
|
|
227
|
-
|
231
|
+
synchronize do
|
232
|
+
t = Time.now.to_i
|
228
233
|
|
229
|
-
|
230
|
-
|
231
|
-
|
234
|
+
Time.stub :now, val_or_callable do
|
235
|
+
@tc.assert_equal 42, Time.now
|
236
|
+
end
|
232
237
|
|
233
|
-
|
238
|
+
@tc.assert_operator Time.now.to_i, :>=, t
|
239
|
+
end
|
234
240
|
end
|
235
241
|
|
236
242
|
def test_stub_value
|
@@ -244,13 +250,15 @@ class TestMiniTestStub < MiniTest::Unit::TestCase
|
|
244
250
|
def test_stub_block_args
|
245
251
|
@assertion_count += 1
|
246
252
|
|
247
|
-
|
253
|
+
synchronize do
|
254
|
+
t = Time.now.to_i
|
248
255
|
|
249
|
-
|
250
|
-
|
251
|
-
|
256
|
+
Time.stub :now, lambda { |n| n * 2 } do
|
257
|
+
@tc.assert_equal 42, Time.now(21)
|
258
|
+
end
|
252
259
|
|
253
|
-
|
260
|
+
@tc.assert_operator Time.now.to_i, :>=, t
|
261
|
+
end
|
254
262
|
end
|
255
263
|
|
256
264
|
def test_stub_callable
|
@@ -8,6 +8,8 @@ class ExampleA; end
|
|
8
8
|
class ExampleB < ExampleA; end
|
9
9
|
|
10
10
|
describe MiniTest::Spec do
|
11
|
+
# do not parallelize this suite... it just can't handle it.
|
12
|
+
|
11
13
|
def assert_triggered expected = "blah", klass = MiniTest::Assertion
|
12
14
|
@assertion_count += 2
|
13
15
|
|
@@ -561,6 +563,8 @@ describe MiniTest::Spec, :subject do
|
|
561
563
|
end
|
562
564
|
|
563
565
|
class TestMeta < MiniTest::Unit::TestCase
|
566
|
+
parallelize_me!
|
567
|
+
|
564
568
|
def test_setup
|
565
569
|
srand 42
|
566
570
|
MiniTest::Unit::TestCase.reset
|
@@ -652,17 +656,15 @@ class TestMeta < MiniTest::Unit::TestCase
|
|
652
656
|
_, _, z, before_list, after_list = util_structure
|
653
657
|
|
654
658
|
@tu = MiniTest::Unit.new
|
655
|
-
@output = StringIO.new("")
|
656
659
|
MiniTest::Unit.runner = nil # protect the outer runner from the inner tests
|
657
|
-
MiniTest::Unit.output = @output
|
658
660
|
|
659
|
-
|
660
|
-
|
661
|
+
with_output do
|
662
|
+
tc = z.new :test_0002_anonymous
|
663
|
+
tc.run @tu
|
664
|
+
end
|
661
665
|
|
662
666
|
assert_equal [1, 2, 3], before_list
|
663
667
|
assert_equal [3, 2, 1], after_list
|
664
|
-
ensure
|
665
|
-
MiniTest::Unit.output = $stdout
|
666
668
|
end
|
667
669
|
|
668
670
|
def test_children
|
@@ -716,4 +718,17 @@ class TestMeta < MiniTest::Unit::TestCase
|
|
716
718
|
assert_respond_to y.new(nil), "xyz"
|
717
719
|
assert_respond_to z.new(nil), "xyz"
|
718
720
|
end
|
721
|
+
|
722
|
+
def with_output # REFACTOR: dupe from metametameta
|
723
|
+
synchronize do
|
724
|
+
begin
|
725
|
+
@output = StringIO.new("")
|
726
|
+
MiniTest::Unit.output = @output
|
727
|
+
|
728
|
+
yield
|
729
|
+
ensure
|
730
|
+
MiniTest::Unit.output = STDOUT
|
731
|
+
end
|
732
|
+
end
|
733
|
+
end
|
719
734
|
end
|
@@ -6,6 +6,8 @@ class AnError < StandardError; include MyModule; end
|
|
6
6
|
class ImmutableString < String; def inspect; super.freeze; end; end
|
7
7
|
|
8
8
|
class TestMiniTestUnit < MetaMetaMetaTestCase
|
9
|
+
parallelize_me!
|
10
|
+
|
9
11
|
pwd = Pathname.new File.expand_path Dir.pwd
|
10
12
|
basedir = Pathname.new(File.expand_path "lib/minitest") + 'mini'
|
11
13
|
basedir = basedir.relative_path_from(pwd).to_s
|
@@ -166,6 +168,85 @@ class TestMiniTestUnit < MetaMetaMetaTestCase
|
|
166
168
|
assert_equal ex, fu
|
167
169
|
end
|
168
170
|
|
171
|
+
def test_default_runner_is_minitest_unit
|
172
|
+
assert_instance_of MiniTest::Unit, MiniTest::Unit.runner
|
173
|
+
end
|
174
|
+
|
175
|
+
def with_overridden_include
|
176
|
+
Class.class_eval do
|
177
|
+
def inherited_with_hacks klass
|
178
|
+
throw :inherited_hook
|
179
|
+
end
|
180
|
+
|
181
|
+
alias inherited_without_hacks inherited
|
182
|
+
alias inherited inherited_with_hacks
|
183
|
+
alias IGNORE_ME! inherited # 1.8 bug. god I love venture bros
|
184
|
+
end
|
185
|
+
|
186
|
+
yield
|
187
|
+
ensure
|
188
|
+
Class.class_eval do
|
189
|
+
alias inherited inherited_without_hacks
|
190
|
+
|
191
|
+
undef_method :inherited_with_hacks
|
192
|
+
undef_method :inherited_without_hacks
|
193
|
+
end
|
194
|
+
|
195
|
+
refute_respond_to Class, :inherited_with_hacks
|
196
|
+
refute_respond_to Class, :inherited_without_hacks
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_inherited_hook_plays_nice_with_others
|
200
|
+
with_overridden_include do
|
201
|
+
assert_throws :inherited_hook do
|
202
|
+
Class.new MiniTest::Unit::TestCase
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
def test_passed_eh_teardown_good
|
208
|
+
test_class = Class.new MiniTest::Unit::TestCase do
|
209
|
+
def teardown; assert true; end
|
210
|
+
def test_omg; assert true; end
|
211
|
+
end
|
212
|
+
|
213
|
+
test = test_class.new :test_omg
|
214
|
+
test.run @tu
|
215
|
+
assert test.passed?
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_passed_eh_teardown_flunked
|
219
|
+
test_class = Class.new MiniTest::Unit::TestCase do
|
220
|
+
def teardown; flunk; end
|
221
|
+
def test_omg; assert true; end
|
222
|
+
end
|
223
|
+
|
224
|
+
test = test_class.new :test_omg
|
225
|
+
test.run @tu
|
226
|
+
refute test.passed?
|
227
|
+
end
|
228
|
+
|
229
|
+
def util_expand_bt bt
|
230
|
+
if RUBY_VERSION >= '1.9.0' then
|
231
|
+
bt.map { |f| (f =~ /^\./) ? File.expand_path(f) : f }
|
232
|
+
else
|
233
|
+
bt
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
class TestMiniTestRunner < MetaMetaMetaTestCase
|
239
|
+
# do not parallelize this suite... it just can't handle it.
|
240
|
+
|
241
|
+
def test_class_test_suites
|
242
|
+
@assertion_count = 0
|
243
|
+
|
244
|
+
tc = Class.new(MiniTest::Unit::TestCase)
|
245
|
+
|
246
|
+
assert_equal 1, MiniTest::Unit::TestCase.test_suites.size
|
247
|
+
assert_equal [tc], MiniTest::Unit::TestCase.test_suites
|
248
|
+
end
|
249
|
+
|
169
250
|
def test_run_test
|
170
251
|
Class.new MiniTest::Unit::TestCase do
|
171
252
|
attr_reader :foo
|
@@ -362,10 +443,6 @@ class TestMiniTestUnit < MetaMetaMetaTestCase
|
|
362
443
|
assert_report expected, %w[--seed 42 --verbose]
|
363
444
|
end
|
364
445
|
|
365
|
-
def test_default_runner_is_minitest_unit
|
366
|
-
assert_instance_of MiniTest::Unit, MiniTest::Unit.runner
|
367
|
-
end
|
368
|
-
|
369
446
|
def test_run_with_other_runner
|
370
447
|
MiniTest::Unit.runner = Class.new MiniTest::Unit do
|
371
448
|
def _run_suite suite, type
|
@@ -403,37 +480,74 @@ class TestMiniTestUnit < MetaMetaMetaTestCase
|
|
403
480
|
assert_report expected
|
404
481
|
end
|
405
482
|
|
406
|
-
|
407
|
-
Class.class_eval do
|
408
|
-
def inherited_with_hacks klass
|
409
|
-
throw :inherited_hook
|
410
|
-
end
|
483
|
+
require 'monitor'
|
411
484
|
|
412
|
-
|
413
|
-
|
414
|
-
|
485
|
+
class Latch
|
486
|
+
def initialize count = 1
|
487
|
+
@count = count
|
488
|
+
@lock = Monitor.new
|
489
|
+
@cv = @lock.new_cond
|
415
490
|
end
|
416
491
|
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
undef_method :inherited_with_hacks
|
423
|
-
undef_method :inherited_without_hacks
|
492
|
+
def release
|
493
|
+
@lock.synchronize do
|
494
|
+
@count -= 1 if @count > 0
|
495
|
+
@cv.broadcast if @count == 0
|
496
|
+
end
|
424
497
|
end
|
425
498
|
|
426
|
-
|
427
|
-
|
499
|
+
def await
|
500
|
+
@lock.synchronize { @cv.wait_while { @count > 0 } }
|
501
|
+
end
|
428
502
|
end
|
429
503
|
|
430
|
-
def
|
431
|
-
|
432
|
-
|
433
|
-
|
504
|
+
def test_run_parallel
|
505
|
+
test_count = 2
|
506
|
+
test_latch = Latch.new test_count
|
507
|
+
main_latch = Latch.new
|
508
|
+
|
509
|
+
thread = Thread.new {
|
510
|
+
Thread.current.abort_on_exception = true
|
511
|
+
|
512
|
+
# This latch waits until both test latches have been released. Both
|
513
|
+
# latches can't be released unless done in separate threads because
|
514
|
+
# `main_latch` keeps the test method from finishing.
|
515
|
+
test_latch.await
|
516
|
+
main_latch.release
|
517
|
+
}
|
518
|
+
|
519
|
+
Class.new MiniTest::Unit::TestCase do
|
520
|
+
parallelize_me!
|
521
|
+
|
522
|
+
test_count.times do |i|
|
523
|
+
define_method :"test_wait_on_main_thread_#{i}" do
|
524
|
+
test_latch.release
|
525
|
+
|
526
|
+
# This latch blocks until the "main thread" releases it. The main
|
527
|
+
# thread can't release this latch until both test latches have
|
528
|
+
# been released. This forces the latches to be released in separate
|
529
|
+
# threads.
|
530
|
+
main_latch.await
|
531
|
+
assert true
|
532
|
+
end
|
434
533
|
end
|
435
534
|
end
|
535
|
+
|
536
|
+
expected = clean <<-EOM
|
537
|
+
..
|
538
|
+
|
539
|
+
Finished tests in 0.00
|
540
|
+
|
541
|
+
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
|
542
|
+
EOM
|
543
|
+
|
544
|
+
assert_report expected
|
545
|
+
assert thread.join
|
436
546
|
end
|
547
|
+
end
|
548
|
+
|
549
|
+
class TestMiniTestUnitOrder < MetaMetaMetaTestCase
|
550
|
+
# do not parallelize this suite... it just can't handle it.
|
437
551
|
|
438
552
|
def test_before_setup
|
439
553
|
call_order = []
|
@@ -450,34 +564,14 @@ class TestMiniTestUnit < MetaMetaMetaTestCase
|
|
450
564
|
def test_omg; assert true; end
|
451
565
|
end
|
452
566
|
|
453
|
-
|
567
|
+
with_output do
|
568
|
+
@tu.run %w[--seed 42]
|
569
|
+
end
|
454
570
|
|
455
571
|
expected = [:before_setup, :setup]
|
456
572
|
assert_equal expected, call_order
|
457
573
|
end
|
458
574
|
|
459
|
-
def test_passed_eh_teardown_good
|
460
|
-
test_class = Class.new MiniTest::Unit::TestCase do
|
461
|
-
def teardown; assert true; end
|
462
|
-
def test_omg; assert true; end
|
463
|
-
end
|
464
|
-
|
465
|
-
test = test_class.new :test_omg
|
466
|
-
test.run @tu
|
467
|
-
assert test.passed?
|
468
|
-
end
|
469
|
-
|
470
|
-
def test_passed_eh_teardown_flunked
|
471
|
-
test_class = Class.new MiniTest::Unit::TestCase do
|
472
|
-
def teardown; flunk; end
|
473
|
-
def test_omg; assert true; end
|
474
|
-
end
|
475
|
-
|
476
|
-
test = test_class.new :test_omg
|
477
|
-
test.run @tu
|
478
|
-
refute test.passed?
|
479
|
-
end
|
480
|
-
|
481
575
|
def test_after_teardown
|
482
576
|
call_order = []
|
483
577
|
Class.new MiniTest::Unit::TestCase do
|
@@ -493,7 +587,9 @@ class TestMiniTestUnit < MetaMetaMetaTestCase
|
|
493
587
|
def test_omg; assert true; end
|
494
588
|
end
|
495
589
|
|
496
|
-
|
590
|
+
with_output do
|
591
|
+
@tu.run %w[--seed 42]
|
592
|
+
end
|
497
593
|
|
498
594
|
expected = [:teardown, :after_teardown]
|
499
595
|
assert_equal expected, call_order
|
@@ -523,7 +619,9 @@ class TestMiniTestUnit < MetaMetaMetaTestCase
|
|
523
619
|
def test_omg; assert true; end
|
524
620
|
end
|
525
621
|
|
526
|
-
|
622
|
+
with_output do
|
623
|
+
@tu.run %w[--seed 42]
|
624
|
+
end
|
527
625
|
|
528
626
|
expected = [:before_teardown, :teardown, :after_teardown]
|
529
627
|
assert_equal expected, call_order
|
@@ -548,24 +646,20 @@ class TestMiniTestUnit < MetaMetaMetaTestCase
|
|
548
646
|
|
549
647
|
_ = Class.new parent
|
550
648
|
|
551
|
-
|
649
|
+
with_output do
|
650
|
+
@tu.run %w[--seed 42]
|
651
|
+
end
|
552
652
|
|
553
653
|
# Once for the parent class, once for the child
|
554
654
|
expected = [:setup_method, :test, :teardown_method] * 2
|
555
655
|
|
556
656
|
assert_equal expected, call_order
|
557
657
|
end
|
558
|
-
|
559
|
-
def util_expand_bt bt
|
560
|
-
if RUBY_VERSION >= '1.9.0' then
|
561
|
-
bt.map { |f| (f =~ /^\./) ? File.expand_path(f) : f }
|
562
|
-
else
|
563
|
-
bt
|
564
|
-
end
|
565
|
-
end
|
566
658
|
end
|
567
659
|
|
568
660
|
class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
661
|
+
parallelize_me!
|
662
|
+
|
569
663
|
RUBY18 = ! defined? Encoding
|
570
664
|
|
571
665
|
def setup
|
@@ -1205,6 +1299,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|
1205
1299
|
|
1206
1300
|
def test_capture_subprocess_io
|
1207
1301
|
@assertion_count = 0
|
1302
|
+
skip "Dunno why but the parallel run of this fails"
|
1208
1303
|
|
1209
1304
|
orig_verbose = $VERBOSE
|
1210
1305
|
$VERBOSE = false
|
@@ -1243,15 +1338,6 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|
1243
1338
|
assert_empty asserts.map { |n| n.sub(/^assert/, 'refute') } - refutes
|
1244
1339
|
end
|
1245
1340
|
|
1246
|
-
def test_class_test_suites
|
1247
|
-
@assertion_count = 0
|
1248
|
-
|
1249
|
-
tc = Class.new(MiniTest::Unit::TestCase)
|
1250
|
-
|
1251
|
-
assert_equal 1, MiniTest::Unit::TestCase.test_suites.size
|
1252
|
-
assert_equal [tc], MiniTest::Unit::TestCase.test_suites
|
1253
|
-
end
|
1254
|
-
|
1255
1341
|
def test_expectation
|
1256
1342
|
@assertion_count = 2
|
1257
1343
|
|
@@ -1486,6 +1572,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|
1486
1572
|
@assertion_count = 0
|
1487
1573
|
|
1488
1574
|
sample_test_case = Class.new MiniTest::Unit::TestCase do
|
1575
|
+
def self.test_order; :random; end
|
1489
1576
|
def test_test1; assert "does not matter" end
|
1490
1577
|
def test_test2; assert "does not matter" end
|
1491
1578
|
def test_test3; assert "does not matter" end
|
@@ -1560,6 +1647,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|
1560
1647
|
end
|
1561
1648
|
|
1562
1649
|
class TestMiniTestGuard < MiniTest::Unit::TestCase
|
1650
|
+
parallelize_me!
|
1651
|
+
|
1563
1652
|
def test_mri_eh
|
1564
1653
|
assert self.class.mri? "ruby blah"
|
1565
1654
|
assert self.mri? "ruby blah"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 55
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 4
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 4.
|
10
|
+
version: 4.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Davis
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
FBHgymkyj/AOSqKRIpXPhjC6
|
37
37
|
-----END CERTIFICATE-----
|
38
38
|
|
39
|
-
date: 2012-
|
39
|
+
date: 2012-11-02 00:00:00 Z
|
40
40
|
dependencies:
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rdoc
|
@@ -61,11 +61,11 @@ dependencies:
|
|
61
61
|
requirements:
|
62
62
|
- - ~>
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
hash:
|
64
|
+
hash: 5
|
65
65
|
segments:
|
66
66
|
- 3
|
67
|
-
-
|
68
|
-
version: "3.
|
67
|
+
- 1
|
68
|
+
version: "3.1"
|
69
69
|
type: :development
|
70
70
|
version_requirements: *id002
|
71
71
|
description: |-
|
@@ -131,7 +131,9 @@ files:
|
|
131
131
|
- lib/hoe/minitest.rb
|
132
132
|
- lib/minitest/autorun.rb
|
133
133
|
- lib/minitest/benchmark.rb
|
134
|
+
- lib/minitest/hell.rb
|
134
135
|
- lib/minitest/mock.rb
|
136
|
+
- lib/minitest/parallel_each.rb
|
135
137
|
- lib/minitest/pride.rb
|
136
138
|
- lib/minitest/spec.rb
|
137
139
|
- lib/minitest/unit.rb
|
metadata.gz.sig
CHANGED
Binary file
|