minitest 5.0.8 → 5.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8b0d13fa089e876d7136d72563684a26daf5559c
4
+ data.tar.gz: b3ad3800b28251404ce824efe8bbdcd3219d2c64
5
+ SHA512:
6
+ metadata.gz: 87729f6352a71b2fe091a8822eb0765f139ee10b920c8afce63b5c285d60ae983dabfc7eb8acff8df8ffdac3521815c6ba66ae677767c79f8517554c286e6b96
7
+ data.tar.gz: 86724ca0e04025f5fb697454fd2544db1d68f3d0ece9f2dd86d08e181397dab9c09108d08274c9a8babd6bd7c884afbf4556c7440c72f767befd6d9d6d1e1fb8
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,13 @@
1
+ === 5.1.0 / 2013-12-05
2
+
3
+ * 1 minor enhancement:
4
+
5
+ * Use a Queue for scheduling parallel tests. (tenderlove)
6
+
7
+ * 1 bug fix:
8
+
9
+ * Fixed misspelling in doco. (amatsuda)
10
+
1
11
  === 5.0.8 / 2013-09-20
2
12
 
3
13
  * 1 bug fix:
@@ -12,7 +12,7 @@ lib/minitest/benchmark.rb
12
12
  lib/minitest/expectations.rb
13
13
  lib/minitest/hell.rb
14
14
  lib/minitest/mock.rb
15
- lib/minitest/parallel_each.rb
15
+ lib/minitest/parallel.rb
16
16
  lib/minitest/pride.rb
17
17
  lib/minitest/pride_plugin.rb
18
18
  lib/minitest/spec.rb
data/README.txt CHANGED
@@ -3,6 +3,7 @@
3
3
  home :: https://github.com/seattlerb/minitest
4
4
  rdoc :: http://docs.seattlerb.org/minitest
5
5
  vim :: https://github.com/sunaku/vim-ruby-minitest
6
+ emacs:: https://github.com/arthurnn/minitest-emacs
6
7
 
7
8
  == DESCRIPTION:
8
9
 
@@ -394,6 +395,8 @@ minitest-context :: Defines contexts for code reuse in MiniTest
394
395
  minitest-debugger :: Wraps assert so failed assertions drop into
395
396
  the ruby debugger.
396
397
  minitest-display :: Patches MiniTest to allow for an easily configurable output.
398
+ minitest-doc_reporter :: Detailed output inspired by rspec's documentation
399
+ format.
397
400
  minitest-emoji :: Print out emoji for your test passes, fails, and skips.
398
401
  minitest-english :: Semantically symmetric aliases for assertions and expectations.
399
402
  minitest-excludes :: Clean API for excluding certain tests you
@@ -425,6 +428,7 @@ minitest-spec-context :: Provides rspec-ish context method to MiniTest::Sp
425
428
  minitest-spec-expect :: Expect syntax for MiniTest::Spec - expect(sequences).to_include :celery_man
426
429
  minitest-spec-magic :: Minitest::Spec extensions for Rails and beyond
427
430
  minitest-spec-rails :: Drop in MiniTest::Spec superclass for ActiveSupport::TestCase.
431
+ minitest-stub_any_instance :: Stub any instance of a method on the given class for the duration of a block
428
432
  minitest-stub-const :: Stub constants for the duration of a block
429
433
  minitest-tags :: add tags for minitest
430
434
  minitest-wscolor :: Yet another test colorizer.
data/Rakefile CHANGED
@@ -8,7 +8,8 @@ Hoe.plugin :seattlerb
8
8
  Hoe.spec 'minitest' do
9
9
  developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
10
10
 
11
- self.rubyforge_name = "bfts"
11
+ license "MIT"
12
+
12
13
  self.testlib = :minitest
13
14
  end
14
15
 
@@ -1,10 +1,13 @@
1
1
  require "optparse"
2
+ require "thread"
3
+ require "mutex_m"
4
+ require "minitest/parallel"
2
5
 
3
6
  ##
4
7
  # :include: README.txt
5
8
 
6
9
  module Minitest
7
- VERSION = "5.0.8" # :nodoc:
10
+ VERSION = "5.1.0" # :nodoc:
8
11
 
9
12
  @@installed_at_exit ||= false
10
13
  @@after_run = []
@@ -12,6 +15,12 @@ module Minitest
12
15
 
13
16
  mc = (class << self; self; end)
14
17
 
18
+ ##
19
+ # Parallel test executor
20
+
21
+ mc.send :attr_accessor, :parallel_executor
22
+ self.parallel_executor = Parallel::Executor.new((ENV['N'] || 2).to_i)
23
+
15
24
  ##
16
25
  # Filter object for backtraces.
17
26
 
@@ -92,11 +101,13 @@ module Minitest
92
101
  #
93
102
  # Minitest.autorun
94
103
  # Minitest.run(args)
95
- # __run(reporter, options)
104
+ # Minitest.__run(reporter, options)
96
105
  # Runnable.runnables.each
97
106
  # runnable.run(reporter, options)
98
107
  # self.runnable_methods.each
99
- # self.new(runnable_method).run
108
+ # self.run_one_method(self, runnable_method, reporter)
109
+ # Minitest.run_one_method(klass, runnable_method, reporter)
110
+ # klass.new(runnable_method).run
100
111
 
101
112
  def self.run args = []
102
113
  self.load_plugins
@@ -113,6 +124,7 @@ module Minitest
113
124
 
114
125
  reporter.start
115
126
  __run reporter, options
127
+ self.parallel_executor.shutdown
116
128
  reporter.report
117
129
 
118
130
  reporter.passed?
@@ -126,9 +138,16 @@ module Minitest
126
138
  # loaded if a Runnable calls parallelize_me!.
127
139
 
128
140
  def self.__run reporter, options
129
- Runnable.runnables.each do |runnable|
130
- runnable.run reporter, options
131
- end
141
+ suites = Runnable.runnables
142
+ parallel, serial = suites.partition { |s| s.test_order == :parallel }
143
+
144
+ # If we run the parallel tests before the serial tests, the parallel tests
145
+ # could run in parallel with the serial tests. This would be bad because
146
+ # the serial tests won't lock around Reporter#record. Run the serial tests
147
+ # first, so that after they complete, the parallel tests will lock when
148
+ # recording results.
149
+ serial.map { |suite| suite.run reporter, options } +
150
+ parallel.map { |suite| suite.run reporter, options }
132
151
  end
133
152
 
134
153
  def self.process_args args = [] # :nodoc:
@@ -265,13 +284,15 @@ module Minitest
265
284
 
266
285
  with_info_handler reporter do
267
286
  filtered_methods.each do |method_name|
268
- result = self.new(method_name).run
269
- raise "#{self}#run _must_ return self" unless self === result
270
- reporter.record result
287
+ run_one_method self, method_name, reporter
271
288
  end
272
289
  end
273
290
  end
274
291
 
292
+ def self.run_one_method klass, method_name, reporter
293
+ reporter.record Minitest.run_one_method(klass, method_name)
294
+ end
295
+
275
296
  def self.with_info_handler reporter, &block # :nodoc:
276
297
  handler = lambda do
277
298
  unless reporter.passed? then
@@ -369,6 +390,8 @@ module Minitest
369
390
  # you want. Go nuts.
370
391
 
371
392
  class AbstractReporter
393
+ include Mutex_m
394
+
372
395
  ##
373
396
  # Starts reporting on the run.
374
397
 
@@ -408,6 +431,7 @@ module Minitest
408
431
  attr_accessor :options
409
432
 
410
433
  def initialize io = $stdout, options = {} # :nodoc:
434
+ super()
411
435
  self.io = io
412
436
  self.options = options
413
437
  end
@@ -565,6 +589,7 @@ module Minitest
565
589
  attr_accessor :reporters
566
590
 
567
591
  def initialize *reporters # :nodoc:
592
+ super()
568
593
  self.reporters = reporters
569
594
  end
570
595
 
@@ -729,6 +754,12 @@ module Minitest
729
754
  end
730
755
 
731
756
  self.backtrace_filter = BacktraceFilter.new
757
+
758
+ def self.run_one_method klass, method_name # :nodoc:
759
+ result = klass.new(method_name).run
760
+ raise "#{klass}#run _must_ return self" unless klass === result
761
+ result
762
+ end
732
763
  end
733
764
 
734
765
  require "minitest/test"
@@ -131,6 +131,10 @@ module Minitest
131
131
  true
132
132
  end
133
133
 
134
+ def _synchronize # :nodoc:
135
+ yield
136
+ end
137
+
134
138
  ##
135
139
  # Fails unless +obj+ is empty.
136
140
 
@@ -393,6 +397,8 @@ module Minitest
393
397
  # that.
394
398
 
395
399
  def capture_io
400
+ _synchronize do
401
+ begin
396
402
  require 'stringio'
397
403
 
398
404
  captured_stdout, captured_stderr = StringIO.new, StringIO.new
@@ -406,6 +412,8 @@ module Minitest
406
412
  ensure
407
413
  $stdout = orig_stdout
408
414
  $stderr = orig_stderr
415
+ end
416
+ end
409
417
  end
410
418
 
411
419
  ##
@@ -424,6 +432,8 @@ module Minitest
424
432
  # only use it when you need to test the output of a subprocess.
425
433
 
426
434
  def capture_subprocess_io
435
+ _synchronize do
436
+ begin
427
437
  require 'tempfile'
428
438
 
429
439
  captured_stdout, captured_stderr = Tempfile.new("out"), Tempfile.new("err")
@@ -443,6 +453,8 @@ module Minitest
443
453
  captured_stderr.unlink
444
454
  $stdout.reopen orig_stdout
445
455
  $stderr.reopen orig_stderr
456
+ end
457
+ end
446
458
  end
447
459
 
448
460
  ##
@@ -0,0 +1,40 @@
1
+ module Minitest
2
+ module Parallel
3
+ class Executor
4
+ attr_reader :size
5
+
6
+ def initialize size
7
+ @size = size
8
+ @queue = Queue.new
9
+ @pool = size.times.map {
10
+ Thread.new(@queue) do |queue|
11
+ Thread.current.abort_on_exception = true
12
+ while job = queue.pop
13
+ klass, method, reporter = job
14
+ result = Minitest.run_one_method klass, method
15
+ reporter.synchronize { reporter.record result }
16
+ end
17
+ end
18
+ }
19
+ end
20
+
21
+ def << work; @queue << work; end
22
+
23
+ def shutdown
24
+ size.times { @queue << nil }
25
+ @pool.each(&:join)
26
+ end
27
+ end
28
+
29
+ module Test
30
+ def _synchronize; Test.io_lock.synchronize { yield }; end
31
+
32
+ module ClassMethods
33
+ def run_one_method klass, method_name, reporter
34
+ MiniTest.parallel_executor << [klass, method_name, reporter]
35
+ end
36
+ def test_order; :parallel; end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -197,7 +197,7 @@ class Minitest::Spec < Minitest::Test
197
197
  #
198
198
  # This is also aliased to #specify and doesn't require a +desc+ arg.
199
199
  #
200
- # Hint: If you _do_ want inheritence, use minitest/test. You can mix
200
+ # Hint: If you _do_ want inheritance, use minitest/test. You can mix
201
201
  # and match between assertions and expectations as much as you want.
202
202
 
203
203
  def it desc = "anonymous", &block
@@ -14,6 +14,9 @@ module Minitest
14
14
  PASSTHROUGH_EXCEPTIONS = [NoMemoryError, SignalException, # :nodoc:
15
15
  Interrupt, SystemExit]
16
16
 
17
+ class << self; attr_accessor :io_lock; end
18
+ self.io_lock = Mutex.new
19
+
17
20
  ##
18
21
  # Call this at the top of your tests when you absolutely
19
22
  # positively need to have ordered tests. In doing so, you're
@@ -46,12 +49,8 @@ module Minitest
46
49
  # and your tests are awesome.
47
50
 
48
51
  def self.parallelize_me!
49
- require "minitest/parallel_each"
50
-
51
- class << self
52
- undef_method :test_order if method_defined? :test_order
53
- define_method :test_order do :parallel end
54
- end
52
+ include Minitest::Parallel::Test
53
+ extend Minitest::Parallel::Test::ClassMethods
55
54
  end
56
55
 
57
56
  ##
@@ -63,10 +62,7 @@ module Minitest
63
62
  methods = methods_matching(/^test_/)
64
63
 
65
64
  case self.test_order
66
- when :parallel
67
- max = methods.size
68
- ParallelEach.new methods.sort.sort_by { rand max }
69
- when :random then
65
+ when :random, :parallel then
70
66
  max = methods.size
71
67
  methods.sort.sort_by { rand max }
72
68
  when :alpha, :sorted then
@@ -22,6 +22,8 @@ class MetaMetaMetaTestCase < Minitest::Test
22
22
 
23
23
  reporter.start
24
24
 
25
+ yield(reporter) if block_given?
26
+
25
27
  @tus ||= [@tu]
26
28
  @tus.each do |tu|
27
29
  Minitest::Runnable.runnables.delete tu
@@ -36,7 +38,7 @@ class MetaMetaMetaTestCase < Minitest::Test
36
38
  reporter.reporters.first
37
39
  end
38
40
 
39
- def assert_report expected, flags = %w[--seed 42]
41
+ def assert_report expected, flags = %w[--seed 42], &block
40
42
  header = clean <<-EOM
41
43
  Run options: #{flags.map { |s| s =~ /\|/ ? s.inspect : s }.join " "}
42
44
 
@@ -44,7 +46,7 @@ class MetaMetaMetaTestCase < Minitest::Test
44
46
 
45
47
  EOM
46
48
 
47
- run_tu_with_fresh_reporter flags
49
+ run_tu_with_fresh_reporter flags, &block
48
50
 
49
51
  output = normalize_output @output.string.dup
50
52
 
@@ -490,15 +490,12 @@ class TestMinitestRunner < MetaMetaMetaTestCase
490
490
  end
491
491
  end
492
492
 
493
- def test_parallel_each_size
494
- assert_equal 0, Minitest::ParallelEach.new([]).size
495
- end
496
-
497
493
  def test_run_parallel
498
494
  skip "I don't have ParallelEach debugged yet" if maglev?
499
495
 
500
496
  test_count = 2
501
497
  test_latch = Latch.new test_count
498
+ wait_latch = Latch.new test_count
502
499
  main_latch = Latch.new
503
500
 
504
501
  thread = Thread.new {
@@ -537,7 +534,19 @@ class TestMinitestRunner < MetaMetaMetaTestCase
537
534
  2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
538
535
  EOM
539
536
 
540
- assert_report expected
537
+ assert_report(expected) do |reporter|
538
+ reporter.extend(Module.new {
539
+ define_method("record") do |result|
540
+ super(result)
541
+ wait_latch.release
542
+ end
543
+
544
+ define_method("report") do
545
+ wait_latch.await
546
+ super()
547
+ end
548
+ })
549
+ end
541
550
  assert thread.join
542
551
  end
543
552
  end
metadata CHANGED
@@ -1,19 +1,13 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: minitest
3
- version: !ruby/object:Gem::Version
4
- hash: 39
5
- prerelease:
6
- segments:
7
- - 5
8
- - 0
9
- - 8
10
- version: 5.0.8
3
+ version: !ruby/object:Gem::Version
4
+ version: 5.1.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Ryan Davis
14
8
  autorequire:
15
9
  bindir: bin
16
- cert_chain:
10
+ cert_chain:
17
11
  - |
18
12
  -----BEGIN CERTIFICATE-----
19
13
  MIIDPjCCAiagAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
@@ -35,104 +29,99 @@ cert_chain:
35
29
  Y4evBVezr3SjXz08vPqRO5YRdO3zfeMT8gBjRqZjWJGMZ2lD4XNfrs7eky74CyZw
36
30
  xx3n58i0lQkBE1EpKE0lFu/y
37
31
  -----END CERTIFICATE-----
38
-
39
- date: 2013-09-21 00:00:00 Z
40
- dependencies:
41
- - !ruby/object:Gem::Dependency
32
+ date: 2013-12-06 00:00:00.000000000 Z
33
+ dependencies:
34
+ - !ruby/object:Gem::Dependency
42
35
  name: rdoc
43
- prerelease: false
44
- requirement: &id001 !ruby/object:Gem::Requirement
45
- none: false
46
- requirements:
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
47
38
  - - ~>
48
- - !ruby/object:Gem::Version
49
- hash: 27
50
- segments:
51
- - 4
52
- - 0
53
- version: "4.0"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
54
41
  type: :development
55
- version_requirements: *id001
56
- - !ruby/object:Gem::Dependency
57
- name: hoe
58
42
  prerelease: false
59
- requirement: &id002 !ruby/object:Gem::Requirement
60
- none: false
61
- requirements:
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
62
45
  - - ~>
63
- - !ruby/object:Gem::Version
64
- hash: 9
65
- segments:
66
- - 3
67
- - 7
68
- version: "3.7"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: hoe
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '3.7'
69
55
  type: :development
70
- version_requirements: *id002
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.7'
71
62
  description: |-
72
63
  minitest provides a complete suite of testing facilities supporting
73
64
  TDD, BDD, mocking, and benchmarking.
74
-
65
+
75
66
  "I had a class with Jim Weirich on testing last week and we were
76
67
  allowed to choose our testing frameworks. Kirk Haines and I were
77
68
  paired up and we cracked open the code for a few test
78
69
  frameworks...
79
-
70
+
80
71
  I MUST say that minitest is *very* readable / understandable
81
72
  compared to the 'other two' options we looked at. Nicely done and
82
73
  thank you for helping us keep our mental sanity."
83
-
74
+
84
75
  -- Wayne E. Seguin
85
-
76
+
86
77
  minitest/unit is a small and incredibly fast unit testing framework.
87
78
  It provides a rich set of assertions to make your tests clean and
88
79
  readable.
89
-
80
+
90
81
  minitest/spec is a functionally complete spec engine. It hooks onto
91
82
  minitest/unit and seamlessly bridges test assertions over to spec
92
83
  expectations.
93
-
84
+
94
85
  minitest/benchmark is an awesome way to assert the performance of your
95
86
  algorithms in a repeatable manner. Now you can assert that your newb
96
87
  co-worker doesn't replace your linear algorithm with an exponential
97
88
  one!
98
-
89
+
99
90
  minitest/mock by Steven Baker, is a beautifully tiny mock (and stub)
100
91
  object framework.
101
-
92
+
102
93
  minitest/pride shows pride in testing and adds coloring to your test
103
94
  output. I guess it is an example of how to write IO pipes too. :P
104
-
95
+
105
96
  minitest/unit is meant to have a clean implementation for language
106
97
  implementors that need a minimal set of methods to bootstrap a working
107
98
  test suite. For example, there is no magic involved for test-case
108
99
  discovery.
109
-
100
+
110
101
  "Again, I can't praise enough the idea of a testing/specing
111
102
  framework that I can actually read in full in one sitting!"
112
-
103
+
113
104
  -- Piotr Szotkowski
114
-
105
+
115
106
  Comparing to rspec:
116
-
107
+
117
108
  rspec is a testing DSL. minitest is ruby.
118
-
109
+
119
110
  -- Adam Hawkins, "Bow Before MiniTest"
120
-
111
+
121
112
  minitest doesn't reinvent anything that ruby already provides, like:
122
113
  classes, modules, inheritance, methods. This means you only have to
123
114
  learn ruby to use minitest and all of your regular OO practices like
124
115
  extract-method refactorings still apply.
125
- email:
116
+ email:
126
117
  - ryand-ruby@zenspider.com
127
118
  executables: []
128
-
129
119
  extensions: []
130
-
131
- extra_rdoc_files:
120
+ extra_rdoc_files:
132
121
  - History.txt
133
122
  - Manifest.txt
134
123
  - README.txt
135
- files:
124
+ files:
136
125
  - .autotest
137
126
  - History.txt
138
127
  - Manifest.txt
@@ -147,7 +136,7 @@ files:
147
136
  - lib/minitest/expectations.rb
148
137
  - lib/minitest/hell.rb
149
138
  - lib/minitest/mock.rb
150
- - lib/minitest/parallel_each.rb
139
+ - lib/minitest/parallel.rb
151
140
  - lib/minitest/pride.rb
152
141
  - lib/minitest/pride_plugin.rb
153
142
  - lib/minitest/spec.rb
@@ -161,40 +150,33 @@ files:
161
150
  - test/minitest/test_minitest_unit.rb
162
151
  - .gemtest
163
152
  homepage: https://github.com/seattlerb/minitest
164
- licenses:
153
+ licenses:
165
154
  - MIT
155
+ metadata: {}
166
156
  post_install_message:
167
- rdoc_options:
157
+ rdoc_options:
168
158
  - --main
169
159
  - README.txt
170
- require_paths:
160
+ require_paths:
171
161
  - lib
172
- required_ruby_version: !ruby/object:Gem::Requirement
173
- none: false
174
- requirements:
175
- - - ">="
176
- - !ruby/object:Gem::Version
177
- hash: 3
178
- segments:
179
- - 0
180
- version: "0"
181
- required_rubygems_version: !ruby/object:Gem::Requirement
182
- none: false
183
- requirements:
184
- - - ">="
185
- - !ruby/object:Gem::Version
186
- hash: 3
187
- segments:
188
- - 0
189
- version: "0"
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
190
172
  requirements: []
191
-
192
- rubyforge_project: bfts
193
- rubygems_version: 1.8.25
173
+ rubyforge_project: minitest
174
+ rubygems_version: 2.1.10
194
175
  signing_key:
195
- specification_version: 3
196
- summary: minitest provides a complete suite of testing facilities supporting TDD, BDD, mocking, and benchmarking
197
- test_files:
176
+ specification_version: 4
177
+ summary: minitest provides a complete suite of testing facilities supporting TDD,
178
+ BDD, mocking, and benchmarking
179
+ test_files:
198
180
  - test/minitest/test_minitest_benchmark.rb
199
181
  - test/minitest/test_minitest_mock.rb
200
182
  - test/minitest/test_minitest_reporter.rb
metadata.gz.sig CHANGED
Binary file
@@ -1,120 +0,0 @@
1
- ##
2
- # Provides a parallel #each that lets you enumerate using N threads.
3
- # Use environment variable N to customize. Defaults to 2. Enumerable,
4
- # so all the goodies come along (tho not all are wrapped yet to
5
- # return another ParallelEach instance).
6
-
7
- class Minitest::ParallelEach
8
- require 'thread'
9
- include Enumerable
10
-
11
- ##
12
- # How many Threads to use for this parallel #each.
13
-
14
- N = (ENV['N'] || 2).to_i
15
-
16
- ##
17
- # Create a new ParallelEach instance over +list+.
18
-
19
- def initialize list
20
- @queue = Queue.new # *sigh*... the Queue api sucks sooo much...
21
-
22
- list.each { |i| @queue << i }
23
- N.times { @queue << nil }
24
- end
25
-
26
- def select(&block) # :nodoc:
27
- self.class.new super
28
- end
29
-
30
- alias find_all select # :nodoc:
31
-
32
- ##
33
- # Starts N threads that yield each element to your block. Joins the
34
- # threads at the end.
35
-
36
- def each
37
- threads = N.times.map {
38
- Thread.new do
39
- Thread.current.abort_on_exception = true
40
- while job = @queue.pop
41
- yield job
42
- end
43
- end
44
- }
45
- threads.map(&:join)
46
- end
47
-
48
- def count # :nodoc:
49
- [@queue.size - N, 0].max
50
- end
51
-
52
- alias_method :size, :count # :nodoc:
53
- end
54
-
55
- module Minitest
56
- class << self
57
- remove_method :__run
58
- end
59
-
60
- class Test
61
- @mutex = Mutex.new
62
-
63
- def self.synchronize # :nodoc:
64
- if @mutex then # see parallel_each.rb
65
- @mutex.synchronize { yield }
66
- else
67
- yield
68
- end
69
- end
70
-
71
- alias :simple_capture_io :capture_io
72
-
73
- def capture_io(&b)
74
- Test.synchronize do
75
- simple_capture_io(&b)
76
- end
77
- end
78
-
79
- alias :simple_capture_subprocess_io :capture_subprocess_io
80
-
81
- def capture_subprocess_io(&b)
82
- Test.synchronize do
83
- simple_capture_subprocess_io(&b)
84
- end
85
- end
86
- end
87
-
88
- class Reporter
89
- @mutex = Mutex.new
90
-
91
- def self.synchronize # :nodoc:
92
- if @mutex then # see parallel_each.rb
93
- @mutex.synchronize { yield }
94
- else
95
- yield
96
- end
97
- end
98
-
99
- alias :simple_record :record
100
-
101
- def record result
102
- Reporter.synchronize do
103
- simple_record result
104
- end
105
- end
106
- end
107
-
108
- ##
109
- # Runs all the +suites+ for a given +type+. Runs suites declaring
110
- # a test_order of +:parallel+ in parallel, and everything else
111
- # serial.
112
-
113
- def self.__run reporter, options
114
- suites = Runnable.runnables
115
- parallel, serial = suites.partition { |s| s.test_order == :parallel }
116
-
117
- ParallelEach.new(parallel).map { |suite| suite.run reporter, options } +
118
- serial.map { |suite| suite.run reporter, options }
119
- end
120
- end