spec 5.0.19 → 5.3.3
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 +4 -4
- data/History.txt +106 -0
- data/Manifest.txt +1 -1
- data/README.txt +83 -37
- data/Rakefile +3 -56
- data/lib/minitest.rb +58 -156
- data/lib/minitest/assertions.rb +13 -1
- data/lib/minitest/benchmark.rb +3 -3
- data/lib/minitest/hell.rb +1 -1
- data/lib/minitest/mock.rb +2 -2
- data/lib/minitest/parallel.rb +40 -0
- data/lib/minitest/pride_plugin.rb +1 -2
- data/lib/minitest/spec.rb +23 -22
- data/lib/minitest/test.rb +19 -8
- data/lib/spec.rb +156 -2
- data/readme.md +1 -1
- data/spec.gemspec +2 -2
- data/test/manual/simple.rb +10 -15
- data/test/minitest/metametameta.rb +4 -2
- data/test/minitest/test_minitest_benchmark.rb +7 -1
- data/test/minitest/test_minitest_mock.rb +12 -2
- data/test/minitest/test_minitest_reporter.rb +0 -1
- data/test/minitest/test_minitest_spec.rb +41 -4
- data/test/minitest/test_minitest_unit.rb +38 -20
- metadata +15 -37
- data/lib/minitest/parallel_each.rb +0 -120
- data/release_notes.md +0 -80
- data/test/manual/after_run.rb +0 -17
- data/test/manual/appium.rb +0 -14
- data/test/manual/appium_after_last.rb +0 -24
- data/test/manual/appium_before_first.rb +0 -23
- data/test/manual/assert.rb +0 -61
- data/test/manual/before_first_0.rb +0 -27
- data/test/manual/before_first_1.rb +0 -29
- data/test/manual/ctrl_c.rb +0 -11
- data/test/manual/debug.rb +0 -37
- data/test/manual/do_end.rb +0 -31
- data/test/manual/raise.rb +0 -61
- data/test/manual/run2.rb +0 -74
- data/test/manual/run3.rb +0 -91
- data/test/manual/setup.rb +0 -13
- data/test/manual/simple2.rb +0 -20
- data/test/manual/skip.rb +0 -15
- data/test/manual/t.rb +0 -11
- data/test/manual/trace.rb +0 -19
- data/test/manual/trace2.rb +0 -15
- data/test/minitest/test_helper.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1862a5647d9edb8c300deb03b6bf21cb4d8d85e1
|
4
|
+
data.tar.gz: 8184a4a78143f820d7132ea83f9d0186e332030f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6563324e7b8f500574e347eb5e8abb9a61a08d80d5b986435848af1a3792cd63344d503c6c63ad591433f1d3d478e9be6ca53514199b13b36a3022697677d3e3
|
7
|
+
data.tar.gz: 2389dde6619ec0fd846ba0fe8e17e0f905e7d4be40b6f4f5198e06187b766f613727375aff3839a12472077b9524adf8fad708afd0a24a2a971f07966b396562
|
data/History.txt
CHANGED
@@ -1,3 +1,87 @@
|
|
1
|
+
=== 5.3.3 / 2014-04-14
|
2
|
+
|
3
|
+
* 1 bug fix:
|
4
|
+
|
5
|
+
* Fixed using expectations w/ DSL in Test class w/o describe. (blowmage+others)
|
6
|
+
|
7
|
+
=== 5.3.2 / 2014-04-02
|
8
|
+
|
9
|
+
* 1 bug fix:
|
10
|
+
|
11
|
+
* Fixed doco on Assertions.assertions. (xaviershay)
|
12
|
+
|
13
|
+
=== 5.3.1 / 2014-03-14
|
14
|
+
|
15
|
+
* 1 minor enhancement:
|
16
|
+
|
17
|
+
* Modified verbage on bad 'let' names to be more helpful. (Archytaus)
|
18
|
+
|
19
|
+
* 1 bug fix:
|
20
|
+
|
21
|
+
* Fixed 2 cases still using MiniTest. (mikesea)
|
22
|
+
|
23
|
+
=== 5.3.0 / 2014-02-25
|
24
|
+
|
25
|
+
* 1 minor enhancement:
|
26
|
+
|
27
|
+
* Mocked methods can take a block to verify state. Seattle.rb 12 bday present from ernie! Thanks!!
|
28
|
+
|
29
|
+
=== 5.2.3 / 2014-02-10
|
30
|
+
|
31
|
+
* 1 bug fix:
|
32
|
+
|
33
|
+
* Fixed Spec#let check to allow overriding of other lets. (mvz)
|
34
|
+
|
35
|
+
=== 5.2.2 / 2014-01-22
|
36
|
+
|
37
|
+
* 1 minor enhancement:
|
38
|
+
|
39
|
+
* Spec#let raises ArgumentError if you override _any_ instance method (except subject). (rynr)
|
40
|
+
|
41
|
+
* 1 bug fix:
|
42
|
+
|
43
|
+
* Fixed up benchmark spec doco and added a test to demonstrate. (bhenderson)
|
44
|
+
|
45
|
+
=== 5.2.1 / 2014-01-07
|
46
|
+
|
47
|
+
* 1 bug fix:
|
48
|
+
|
49
|
+
* Properly deal with horrible mix of runtime load errors + other at_exit handlers. (dougo/chqr)
|
50
|
+
|
51
|
+
=== 5.2.0 / 2013-12-13
|
52
|
+
|
53
|
+
* 1 minor enhancement:
|
54
|
+
|
55
|
+
* Change expectations to allow calling most on procs (but not calling the proc). (bhenderson+others)
|
56
|
+
|
57
|
+
=== 5.1.0 / 2013-12-05
|
58
|
+
|
59
|
+
* 1 minor enhancement:
|
60
|
+
|
61
|
+
* Use a Queue for scheduling parallel tests. (tenderlove)
|
62
|
+
|
63
|
+
* 1 bug fix:
|
64
|
+
|
65
|
+
* Fixed misspelling in doco. (amatsuda)
|
66
|
+
|
67
|
+
=== 5.0.8 / 2013-09-20
|
68
|
+
|
69
|
+
* 1 bug fix:
|
70
|
+
|
71
|
+
* Fixed siginfo handler by rearranging reporters and fixing to_s. (tenderlove)
|
72
|
+
|
73
|
+
=== 5.0.7 / 2013-09-05
|
74
|
+
|
75
|
+
* 2 minor enhancements:
|
76
|
+
|
77
|
+
* Added clarification about the use of thread local variables in expectations. (jemc)
|
78
|
+
* Added extra message about skipped tests, if any. Disable globally with $MT_NO_SKIP_MSG.
|
79
|
+
|
80
|
+
* 2 bug fixes:
|
81
|
+
|
82
|
+
* Only require minitest, not minitest/autorun in pride_plugin. (judofyr)
|
83
|
+
* Require rubygems in load_plugins in case you're not using minitest/autorun.
|
84
|
+
|
1
85
|
=== 5.0.6 / 2013-06-28
|
2
86
|
|
3
87
|
* 3 minor enhancements:
|
@@ -10,6 +94,13 @@
|
|
10
94
|
|
11
95
|
* Fixed missing require in minitest/test. (erikh)
|
12
96
|
|
97
|
+
=== 4.7.5 / 2013-06-21
|
98
|
+
|
99
|
+
* 2 bug fixes:
|
100
|
+
|
101
|
+
* Fix Spec#describe_stack to be thread local.
|
102
|
+
* Fix multithreaded test failures by defining Time local to mock test namespace
|
103
|
+
|
13
104
|
=== 5.0.5 / 2013-06-20
|
14
105
|
|
15
106
|
* 6 bug fixes:
|
@@ -128,6 +219,21 @@ Minitest 5:
|
|
128
219
|
* Removed Minitest::Test.synchronize (phiggins)
|
129
220
|
* Upon loading minitest/parallel_each, record, capture_io and capture_subprocess_io are doped with synchronization code. (phiggins)
|
130
221
|
|
222
|
+
=== 4.7.4 / 2013-05-01
|
223
|
+
|
224
|
+
This is probably the last release of the 4.x series. It will be merged
|
225
|
+
to ruby and will be put into maintenance mode there.
|
226
|
+
|
227
|
+
I'm not set in stone on this, but at this point further development of
|
228
|
+
minitest (5+) will be gem-only. It is just too hard to work w/in
|
229
|
+
ruby-core w/ test-unit compatibility holding minitest development
|
230
|
+
back.
|
231
|
+
|
232
|
+
* 2 minor enhancements:
|
233
|
+
|
234
|
+
* Added count/size to ParallelEach to fix use w/in stdlib's test/unit. :( (btaitelb)
|
235
|
+
* Allow disabling of info_signal handler in runner. (erikh)
|
236
|
+
|
131
237
|
=== 4.7.3 / 2013-04-20
|
132
238
|
|
133
239
|
* 1 bug fix:
|
data/Manifest.txt
CHANGED
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
|
|
@@ -90,6 +91,8 @@ Given that you'd like to test the following class:
|
|
90
91
|
|
91
92
|
=== Unit tests
|
92
93
|
|
94
|
+
Define your tests as methods beginning with `test_`.
|
95
|
+
|
93
96
|
require "minitest/autorun"
|
94
97
|
|
95
98
|
class TestMeme < Minitest::Test
|
@@ -366,62 +369,105 @@ you want to extend your test using setup/teardown via a module, just
|
|
366
369
|
make sure you ALWAYS call super. before/after automatically call super
|
367
370
|
for you, so make sure you don't do it twice.
|
368
371
|
|
372
|
+
== Prominent Projects using Minitest:
|
373
|
+
|
374
|
+
* arel
|
375
|
+
* journey
|
376
|
+
* mime-types
|
377
|
+
* nokogiri
|
378
|
+
* rails (active_support et al)
|
379
|
+
* rake
|
380
|
+
* rdoc
|
381
|
+
* ...and of course, everything from seattle.rb...
|
382
|
+
|
369
383
|
== Known Extensions:
|
370
384
|
|
371
|
-
capybara_minitest_spec :: Bridge between Capybara RSpec matchers and
|
385
|
+
capybara_minitest_spec :: Bridge between Capybara RSpec matchers and
|
386
|
+
Minitest::Spec expectations (e.g.
|
387
|
+
page.must_have_content("Title")).
|
372
388
|
minispec-metadata :: Metadata for describe/it blocks
|
373
389
|
(e.g. `it "requires JS driver", js: true do`)
|
374
390
|
minitest-ansi :: Colorize minitest output with ANSI colors.
|
375
|
-
minitest-around :: Around block for minitest. An alternative to
|
376
|
-
|
377
|
-
minitest-
|
391
|
+
minitest-around :: Around block for minitest. An alternative to
|
392
|
+
setup/teardown dance.
|
393
|
+
minitest-capistrano :: Assertions and expectations for testing
|
394
|
+
Capistrano recipes.
|
395
|
+
minitest-capybara :: Capybara matchers support for minitest unit and
|
396
|
+
spec.
|
378
397
|
minitest-chef-handler :: Run Minitest suites as Chef report handlers
|
379
|
-
minitest-ci :: CI reporter plugin for
|
380
|
-
minitest-colorize :: Colorize
|
381
|
-
|
398
|
+
minitest-ci :: CI reporter plugin for Minitest.
|
399
|
+
minitest-colorize :: Colorize Minitest output and show failing tests
|
400
|
+
instantly.
|
401
|
+
minitest-context :: Defines contexts for code reuse in Minitest
|
382
402
|
specs that share common expectations.
|
383
403
|
minitest-debugger :: Wraps assert so failed assertions drop into
|
384
404
|
the ruby debugger.
|
385
|
-
minitest-display :: Patches
|
386
|
-
|
387
|
-
minitest-
|
405
|
+
minitest-display :: Patches Minitest to allow for an easily
|
406
|
+
configurable output.
|
407
|
+
minitest-documentation :: Minimal documentation format inspired by rspec's.
|
408
|
+
minitest-doc_reporter :: Detailed output inspired by rspec's documentation
|
409
|
+
format.
|
410
|
+
minitest-emoji :: Print out emoji for your test passes, fails, and
|
411
|
+
skips.
|
412
|
+
minitest-english :: Semantically symmetric aliases for assertions and
|
413
|
+
expectations.
|
388
414
|
minitest-excludes :: Clean API for excluding certain tests you
|
389
415
|
don't want to run under certain conditions.
|
390
|
-
minitest-filesystem :: Adds assertion and expectation to help testing
|
391
|
-
|
392
|
-
minitest-
|
416
|
+
minitest-filesystem :: Adds assertion and expectation to help testing
|
417
|
+
filesystem contents.
|
418
|
+
minitest-firemock :: Makes your Minitest mocks more resilient.
|
419
|
+
minitest-great_expectations :: Generally useful additions to minitest's
|
420
|
+
assertions and expectations.
|
393
421
|
minitest-growl :: Test notifier for minitest via growl.
|
394
422
|
minitest-implicit-subject :: Implicit declaration of the test subject.
|
395
423
|
minitest-instrument :: Instrument ActiveSupport::Notifications when
|
396
|
-
test method is executed
|
397
|
-
minitest-instrument-db :: Store information about speed of test
|
398
|
-
|
424
|
+
test method is executed.
|
425
|
+
minitest-instrument-db :: Store information about speed of test execution
|
426
|
+
provided by minitest-instrument in database.
|
399
427
|
minitest-libnotify :: Test notifier for minitest via libnotify.
|
400
|
-
minitest-line :: Run test at line number
|
401
|
-
minitest-macruby :: Provides extensions to minitest for macruby UI
|
402
|
-
|
428
|
+
minitest-line :: Run test at line number.
|
429
|
+
minitest-macruby :: Provides extensions to minitest for macruby UI
|
430
|
+
testing.
|
431
|
+
minitest-matchers :: Adds support for RSpec-style matchers to
|
432
|
+
minitest.
|
403
433
|
minitest-metadata :: Annotate tests with metadata (key-value).
|
404
|
-
minitest-mongoid :: Mongoid assertion matchers for
|
405
|
-
minitest-must_not :: Provides must_not as an alias for wont in
|
406
|
-
|
407
|
-
minitest-
|
408
|
-
|
409
|
-
minitest-
|
410
|
-
minitest-
|
411
|
-
minitest-
|
412
|
-
minitest-
|
413
|
-
minitest-
|
414
|
-
minitest-
|
415
|
-
minitest-
|
416
|
-
|
417
|
-
minitest-
|
418
|
-
|
434
|
+
minitest-mongoid :: Mongoid assertion matchers for Minitest.
|
435
|
+
minitest-must_not :: Provides must_not as an alias for wont in
|
436
|
+
Minitest.
|
437
|
+
minitest-nc :: Test notifier for minitest via Mountain Lion's
|
438
|
+
Notification Center.
|
439
|
+
minitest-predicates :: Adds support for .predicate? methods.
|
440
|
+
minitest-rails :: Minitest integration for Rails 3.x.
|
441
|
+
minitest-rails-capybara :: Capybara integration for Minitest::Rails.
|
442
|
+
minitest-reporters :: Create customizable Minitest output formats.
|
443
|
+
minitest-rg :: Colored red/green output for Minitest.
|
444
|
+
minitest-rspec_mocks :: Use RSpec Mocks with Minitest.
|
445
|
+
minitest-should_syntax :: RSpec-style +x.should == y+ assertions for
|
446
|
+
Minitest.
|
447
|
+
minitest-shouldify :: Adding all manner of shoulds to Minitest (bad
|
448
|
+
idea)
|
449
|
+
minitest-spec-context :: Provides rspec-ish context method to
|
450
|
+
Minitest::Spec.
|
451
|
+
minitest-spec-expect :: Expect syntax for Minitest::Spec (e.g.
|
452
|
+
expect(sequences).to_include :celery_man).
|
453
|
+
minitest-spec-magic :: Minitest::Spec extensions for Rails and beyond.
|
454
|
+
minitest-spec-rails :: Drop in Minitest::Spec superclass for
|
455
|
+
ActiveSupport::TestCase.
|
456
|
+
minitest-stub_any_instance :: Stub any instance of a method on the given class
|
457
|
+
for the duration of a block.
|
458
|
+
minitest-stub-const :: Stub constants for the duration of a block.
|
459
|
+
minitest-tags :: Add tags for minitest.
|
460
|
+
minitest-vcr :: Automatic cassette managment with Minitest::Spec
|
461
|
+
and VCR.
|
419
462
|
minitest-wscolor :: Yet another test colorizer.
|
420
463
|
minitest_owrapper :: Get tests results as a TestResult object.
|
421
464
|
minitest_should :: Shoulda style syntax for minitest test::unit.
|
422
|
-
minitest_tu_shim ::
|
423
|
-
mongoid-minitest ::
|
424
|
-
pry-rescue :: A pry plugin w/ minitest support. See
|
465
|
+
minitest_tu_shim :: Bridges between test/unit and minitest.
|
466
|
+
mongoid-minitest :: Minitest matchers for Mongoid.
|
467
|
+
pry-rescue :: A pry plugin w/ minitest support. See
|
468
|
+
pry-rescue/minitest.rb.
|
469
|
+
rspec2minitest :: Easily translate any RSpec matchers to Minitest
|
470
|
+
assertions and expectations.
|
425
471
|
|
426
472
|
== Unknown Extensions:
|
427
473
|
|
data/Rakefile
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
|
3
1
|
require 'rubygems'
|
4
2
|
require 'hoe'
|
5
3
|
|
@@ -8,63 +6,11 @@ Hoe.plugin :seattlerb
|
|
8
6
|
Hoe.spec 'minitest' do
|
9
7
|
developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
|
10
8
|
|
11
|
-
|
12
|
-
self.testlib = :minitest
|
13
|
-
self.licenses = [ 'MIT' ]
|
14
|
-
end
|
9
|
+
license "MIT"
|
15
10
|
|
16
|
-
|
17
|
-
task :specs do
|
18
|
-
$:.unshift "lib"
|
19
|
-
require "minitest/unit"
|
20
|
-
require "minitest/spec"
|
21
|
-
|
22
|
-
pos_prefix, neg_prefix = "must", "wont"
|
23
|
-
skip_re = /^(must|wont)$|wont_(throw)|must_(block|not?_|nothing|raise$)/x
|
24
|
-
dont_flip_re = /(must|wont)_(include|respond_to)/
|
25
|
-
|
26
|
-
map = {
|
27
|
-
/(must_throw)s/ => '\1',
|
28
|
-
/(?!not)_same/ => '_be_same_as',
|
29
|
-
/_in_/ => '_be_within_',
|
30
|
-
/_operator/ => '_be',
|
31
|
-
/_includes/ => '_include',
|
32
|
-
/(must|wont)_(.*_of|nil|silent|empty)/ => '\1_be_\2',
|
33
|
-
/must_raises/ => 'must_raise',
|
34
|
-
}
|
35
|
-
|
36
|
-
expectations = Minitest::Expectations.public_instance_methods.map(&:to_s)
|
37
|
-
assertions = Minitest::Assertions.public_instance_methods.map(&:to_s)
|
38
|
-
|
39
|
-
assertions.sort.each do |assertion|
|
40
|
-
expectation = case assertion
|
41
|
-
when /^assert/ then
|
42
|
-
assertion.sub(/^assert/, pos_prefix.to_s)
|
43
|
-
when /^refute/ then
|
44
|
-
assertion.sub(/^refute/, neg_prefix.to_s)
|
45
|
-
end
|
46
|
-
|
47
|
-
next unless expectation
|
48
|
-
next if expectation =~ skip_re
|
49
|
-
|
50
|
-
regexp, replacement = map.find { |re, _| expectation =~ re }
|
51
|
-
expectation.sub! regexp, replacement if replacement
|
52
|
-
|
53
|
-
next if expectations.include? expectation
|
54
|
-
|
55
|
-
args = [assertion, expectation].map(&:to_sym).map(&:inspect)
|
56
|
-
args << :reverse if expectation =~ dont_flip_re
|
57
|
-
|
58
|
-
puts
|
59
|
-
puts "##"
|
60
|
-
puts "# :method: #{expectation}"
|
61
|
-
puts "# See Minitest::Assertions##{assertion}"
|
62
|
-
puts
|
63
|
-
puts "infect_an_assertion #{args.join ", "}"
|
64
|
-
end
|
11
|
+
self.testlib = :minitest
|
65
12
|
end
|
66
13
|
|
67
|
-
# vim: syntax=Ruby
|
68
14
|
|
69
15
|
# from https://github.com/bootstraponline/gem_template
|
70
16
|
# todo: publish gem_template as a gem
|
@@ -73,6 +19,7 @@ end
|
|
73
19
|
require 'rubygems'
|
74
20
|
require 'rake'
|
75
21
|
require 'date'
|
22
|
+
require_relative 'lib/minitest'
|
76
23
|
|
77
24
|
# Defines gem name.
|
78
25
|
def repo_name; 'spec' end # rubygems.org name
|
data/lib/minitest.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
require "optparse"
|
2
|
-
require
|
2
|
+
require "thread"
|
3
|
+
require "mutex_m"
|
4
|
+
require "minitest/parallel"
|
3
5
|
|
4
6
|
##
|
5
7
|
# :include: README.txt
|
6
8
|
|
7
9
|
module Minitest
|
8
|
-
VERSION = '5.
|
9
|
-
DATE = '
|
10
|
+
VERSION = '5.3.3' # :nodoc:
|
11
|
+
DATE = '2014-04-21' # :nodoc:
|
10
12
|
|
11
13
|
@@installed_at_exit ||= false
|
12
14
|
@@after_run = []
|
@@ -14,6 +16,12 @@ module Minitest
|
|
14
16
|
|
15
17
|
mc = (class << self; self; end)
|
16
18
|
|
19
|
+
##
|
20
|
+
# Parallel test executor
|
21
|
+
|
22
|
+
mc.send :attr_accessor, :parallel_executor
|
23
|
+
self.parallel_executor = Parallel::Executor.new((ENV['N'] || 2).to_i)
|
24
|
+
|
17
25
|
##
|
18
26
|
# Filter object for backtraces.
|
19
27
|
|
@@ -36,7 +44,7 @@ module Minitest
|
|
36
44
|
|
37
45
|
def self.autorun
|
38
46
|
at_exit {
|
39
|
-
next if $! and not $!.kind_of? SystemExit
|
47
|
+
next if $! and not ($!.kind_of? SystemExit and $!.success?)
|
40
48
|
|
41
49
|
exit_code = nil
|
42
50
|
|
@@ -72,6 +80,8 @@ module Minitest
|
|
72
80
|
|
73
81
|
seen = {}
|
74
82
|
|
83
|
+
require "rubygems" unless defined? Gem
|
84
|
+
|
75
85
|
Gem.find_files("minitest/*_plugin.rb").each do |plugin_path|
|
76
86
|
name = File.basename plugin_path, "_plugin.rb"
|
77
87
|
|
@@ -92,11 +102,13 @@ module Minitest
|
|
92
102
|
#
|
93
103
|
# Minitest.autorun
|
94
104
|
# Minitest.run(args)
|
95
|
-
# __run(reporter, options)
|
105
|
+
# Minitest.__run(reporter, options)
|
96
106
|
# Runnable.runnables.each
|
97
107
|
# runnable.run(reporter, options)
|
98
108
|
# self.runnable_methods.each
|
99
|
-
# self.
|
109
|
+
# self.run_one_method(self, runnable_method, reporter)
|
110
|
+
# Minitest.run_one_method(klass, runnable_method, reporter)
|
111
|
+
# klass.new(runnable_method).run
|
100
112
|
|
101
113
|
def self.run args = []
|
102
114
|
self.load_plugins
|
@@ -104,8 +116,8 @@ module Minitest
|
|
104
116
|
options = process_args args
|
105
117
|
|
106
118
|
reporter = CompositeReporter.new
|
107
|
-
reporter << ProgressReporter.new(options[:io], options)
|
108
119
|
reporter << SummaryReporter.new(options[:io], options)
|
120
|
+
reporter << ProgressReporter.new(options[:io], options)
|
109
121
|
|
110
122
|
self.reporter = reporter # this makes it available to plugins
|
111
123
|
self.init_plugins options
|
@@ -113,6 +125,7 @@ module Minitest
|
|
113
125
|
|
114
126
|
reporter.start
|
115
127
|
__run reporter, options
|
128
|
+
self.parallel_executor.shutdown
|
116
129
|
reporter.report
|
117
130
|
|
118
131
|
reporter.passed?
|
@@ -126,88 +139,22 @@ module Minitest
|
|
126
139
|
# loaded if a Runnable calls parallelize_me!.
|
127
140
|
|
128
141
|
def self.__run reporter, options
|
129
|
-
Runnable.runnables
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
# @param :trace [Array<String>] the files to trace
|
140
|
-
# @param :io [IO] io to print to
|
141
|
-
def self.trace_specs spec_opts
|
142
|
-
targets = []
|
143
|
-
files = {}
|
144
|
-
last_file = ''
|
145
|
-
last_line = -1
|
146
|
-
|
147
|
-
files_to_trace = spec_opts.fetch(:trace, []);
|
148
|
-
io = spec_opts.fetch(:io, $stdout)
|
149
|
-
color = spec_opts.fetch(:color, "\e[32m") # ANSI.green default
|
150
|
-
# target only existing readable files
|
151
|
-
files_to_trace.each do |f|
|
152
|
-
targets.push(File.expand_path(f)) if File.exists?(f) && File.readable?(f)
|
153
|
-
end
|
154
|
-
return if targets.empty?
|
155
|
-
|
156
|
-
set_trace_func(lambda do |event, file, line, id, binding, classname|
|
157
|
-
return unless targets.include? file
|
158
|
-
|
159
|
-
# never repeat a line
|
160
|
-
return if file == last_file && line == last_line
|
161
|
-
|
162
|
-
file_sym = file.intern
|
163
|
-
files[file_sym] = IO.readlines(file) if files[file_sym].nil?
|
164
|
-
lines = files[file_sym]
|
165
|
-
|
166
|
-
# arrays are 0 indexed and line numbers start at one.
|
167
|
-
io.print color if color # ANSI code
|
168
|
-
io.puts lines[ line - 1]
|
169
|
-
io.print "\e[0m" if color # ANSI.clear
|
170
|
-
|
171
|
-
last_file = file
|
172
|
-
last_line = line
|
173
|
-
|
174
|
-
end)
|
175
|
-
end
|
176
|
-
|
177
|
-
def self.on_exit exit_code
|
178
|
-
@@after_run.reverse_each(&:call)
|
179
|
-
exit exit_code || false
|
180
|
-
end
|
181
|
-
|
182
|
-
##
|
183
|
-
# Run specs. Does not print dots (ProgressReporter)
|
184
|
-
#
|
185
|
-
# spec_opts
|
186
|
-
# @param :io [Array<String>] defaults to $stdout
|
187
|
-
# @param :trace [Array<String>] files to trace
|
188
|
-
|
189
|
-
def self.run_specs spec_opts={}
|
190
|
-
options = { :io => spec_opts.fetch(:io, $stdout) }
|
191
|
-
reporter = Minitest::CompositeReporter.new
|
192
|
-
reporter << Minitest::SummaryReporter.new(options[:io], options)
|
193
|
-
reporter.start
|
194
|
-
|
195
|
-
at_exit { on_exit reporter.passed? }
|
196
|
-
# exit on ctrl+c to trigger at_exit
|
197
|
-
trap('SIGINT') { exit }
|
198
|
-
|
199
|
-
trace_specs spec_opts
|
200
|
-
|
201
|
-
begin
|
202
|
-
Minitest.__run reporter, options
|
203
|
-
reporter.reporters.each { |r| r.report }
|
204
|
-
rescue Minitest::Runnable::ExitAfterFirstFail
|
205
|
-
# Minitest calls .report on exception
|
206
|
-
end
|
142
|
+
suites = Runnable.runnables
|
143
|
+
parallel, serial = suites.partition { |s| s.test_order == :parallel }
|
144
|
+
|
145
|
+
# If we run the parallel tests before the serial tests, the parallel tests
|
146
|
+
# could run in parallel with the serial tests. This would be bad because
|
147
|
+
# the serial tests won't lock around Reporter#record. Run the serial tests
|
148
|
+
# first, so that after they complete, the parallel tests will lock when
|
149
|
+
# recording results.
|
150
|
+
serial.map { |suite| suite.run reporter, options } +
|
151
|
+
parallel.map { |suite| suite.run reporter, options }
|
207
152
|
end
|
208
153
|
|
209
154
|
def self.process_args args = [] # :nodoc:
|
210
|
-
options = {
|
155
|
+
options = {
|
156
|
+
:io => $stdout,
|
157
|
+
}
|
211
158
|
orig_args = args.dup
|
212
159
|
|
213
160
|
OptionParser.new do |opts|
|
@@ -323,27 +270,12 @@ module Minitest
|
|
323
270
|
|
324
271
|
reset
|
325
272
|
|
326
|
-
class ExitAfterFirstFail < RuntimeError; end
|
327
|
-
|
328
|
-
def self.check_failures result, reporter
|
329
|
-
# skip is not a failure.
|
330
|
-
true_fails = result.failures.reject { |obj| obj.class == Minitest::Skip }
|
331
|
-
if !true_fails.empty?
|
332
|
-
begin
|
333
|
-
reporter.reporters.each { |r| r.report }
|
334
|
-
ensure
|
335
|
-
raise ExitAfterFirstFail
|
336
|
-
end
|
337
|
-
end
|
338
|
-
end
|
339
|
-
|
340
273
|
##
|
341
274
|
# Responsible for running all runnable methods in a given class,
|
342
275
|
# each in its own instance. Each instance is passed to the
|
343
276
|
# reporter to record.
|
344
277
|
|
345
278
|
def self.run reporter, options = {}
|
346
|
-
io = options.fetch :io, $stdout
|
347
279
|
filter = options[:filter] || '/./'
|
348
280
|
filter = Regexp.new $1 if filter =~ /\/(.*)\//
|
349
281
|
|
@@ -351,64 +283,16 @@ module Minitest
|
|
351
283
|
filter === m || filter === "#{self}##{m}"
|
352
284
|
}
|
353
285
|
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
# run method and capture exceptions.
|
358
|
-
method1.capture_exceptions do
|
359
|
-
method1.before_first_method
|
360
|
-
end
|
361
|
-
# save exceptions to reporter and check for failures
|
362
|
-
with_info_handler reporter do
|
363
|
-
# only record if failures not empty, otherwise
|
364
|
-
# the count (runs) are messed up. each call to .record
|
365
|
-
# increases count by one.
|
366
|
-
if !method1.failures.empty?
|
367
|
-
reporter.record method1
|
368
|
-
check_failures method1, reporter
|
369
|
-
end
|
370
|
-
|
371
|
-
# run the other methods
|
372
|
-
filtered_methods.each do |method_name|
|
373
|
-
method = self.new(method_name)
|
374
|
-
matched_name = method_name.match /test_(\d+)_/
|
375
|
-
if matched_name
|
376
|
-
test_number = matched_name[1].to_i
|
377
|
-
test_name = method_name.split(/_\d+_/).last
|
378
|
-
file_path, line_number = method.method(method_name).source_location
|
379
|
-
# /5/4/3/2/1/test.rb => 2/1/test.rb
|
380
|
-
file_path = file_path.split(File::SEPARATOR).reject(&:empty?)
|
381
|
-
file_path = (file_path.length >= 3 ? file_path[-3..-1] :
|
382
|
-
file_path).join(File::SEPARATOR)
|
383
|
-
# 36 = cyan, 0 = clear
|
384
|
-
test_output_title = "\e[36m#{test_name} | #{test_number} |" +
|
385
|
-
"#{file_path}:#{line_number}\e[0m"
|
386
|
-
io.puts test_output_title
|
387
|
-
end
|
388
|
-
result = method.run
|
389
|
-
raise "#{self}#run _must_ return self" unless self === result
|
390
|
-
reporter.record result
|
391
|
-
check_failures result, reporter
|
392
|
-
end
|
393
|
-
end
|
394
|
-
ensure # ensure after last runs
|
395
|
-
# after_last
|
396
|
-
# init method1 again
|
397
|
-
method1 = self.new(filtered_methods.first)
|
398
|
-
method1.capture_exceptions do
|
399
|
-
method1.after_last_method
|
400
|
-
end
|
401
|
-
with_info_handler reporter do
|
402
|
-
if !method1.failures.empty?
|
403
|
-
reporter.record method1
|
404
|
-
check_failures method1, reporter
|
405
|
-
end
|
286
|
+
with_info_handler reporter do
|
287
|
+
filtered_methods.each do |method_name|
|
288
|
+
run_one_method self, method_name, reporter
|
406
289
|
end
|
407
290
|
end
|
408
291
|
end
|
409
292
|
|
410
|
-
def
|
411
|
-
|
293
|
+
def self.run_one_method klass, method_name, reporter
|
294
|
+
reporter.record Minitest.run_one_method(klass, method_name)
|
295
|
+
end
|
412
296
|
|
413
297
|
def self.with_info_handler reporter, &block # :nodoc:
|
414
298
|
handler = lambda do
|
@@ -507,6 +391,8 @@ module Minitest
|
|
507
391
|
# you want. Go nuts.
|
508
392
|
|
509
393
|
class AbstractReporter
|
394
|
+
include Mutex_m
|
395
|
+
|
510
396
|
##
|
511
397
|
# Starts reporting on the run.
|
512
398
|
|
@@ -546,6 +432,7 @@ module Minitest
|
|
546
432
|
attr_accessor :options
|
547
433
|
|
548
434
|
def initialize io = $stdout, options = {} # :nodoc:
|
435
|
+
super()
|
549
436
|
self.io = io
|
550
437
|
self.options = options
|
551
438
|
end
|
@@ -645,6 +532,11 @@ module Minitest
|
|
645
532
|
def start # :nodoc:
|
646
533
|
super
|
647
534
|
|
535
|
+
io.puts "Run options: #{options[:args]}"
|
536
|
+
io.puts
|
537
|
+
io.puts "# Running:"
|
538
|
+
io.puts
|
539
|
+
|
648
540
|
self.sync = io.respond_to? :"sync=" # stupid emacs
|
649
541
|
self.old_sync, io.sync = io.sync, true if self.sync
|
650
542
|
end
|
@@ -662,7 +554,8 @@ module Minitest
|
|
662
554
|
end
|
663
555
|
|
664
556
|
def statistics # :nodoc:
|
665
|
-
"Finished in
|
557
|
+
"Finished in %.6fs, %.4f runs/s, %.4f assertions/s." %
|
558
|
+
[total_time, count / total_time, assertions / total_time]
|
666
559
|
end
|
667
560
|
|
668
561
|
def aggregated_results # :nodoc:
|
@@ -674,6 +567,8 @@ module Minitest
|
|
674
567
|
end.join("\n") + "\n"
|
675
568
|
end
|
676
569
|
|
570
|
+
alias to_s aggregated_results
|
571
|
+
|
677
572
|
def summary # :nodoc:
|
678
573
|
extra = ""
|
679
574
|
|
@@ -695,6 +590,7 @@ module Minitest
|
|
695
590
|
attr_accessor :reporters
|
696
591
|
|
697
592
|
def initialize *reporters # :nodoc:
|
593
|
+
super()
|
698
594
|
self.reporters = reporters
|
699
595
|
end
|
700
596
|
|
@@ -859,6 +755,12 @@ module Minitest
|
|
859
755
|
end
|
860
756
|
|
861
757
|
self.backtrace_filter = BacktraceFilter.new
|
758
|
+
|
759
|
+
def self.run_one_method klass, method_name # :nodoc:
|
760
|
+
result = klass.new(method_name).run
|
761
|
+
raise "#{klass}#run _must_ return self" unless klass === result
|
762
|
+
result
|
763
|
+
end
|
862
764
|
end
|
863
765
|
|
864
766
|
require "minitest/test"
|