-
Notifications
You must be signed in to change notification settings - Fork 15
/
minitest.cr
108 lines (89 loc) · 2.16 KB
/
minitest.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
require "option_parser"
require "./minitest/result"
require "./minitest/reporter"
require "./minitest/runnable"
require "./minitest/test"
require "./minitest/spec"
module Minitest
class Options
property verbose
property threads
getter pattern : String | Regex | Nil
def initialize
@verbose = false
@threads = 1
end
def pattern=(pattern)
if pattern =~ %r(\A/(.+?)/\Z)
@pattern = Regex.new($1)
else
@pattern = pattern
end
end
end
def self.options
@@options ||= Options.new
end
def self.process_args(args)
OptionParser.parse(args) do |opts|
opts.banner = "minitest options"
opts.on("-h", "--help", "Display this help") do
puts opts
exit
end
opts.on("-v", "--verbose", "Show progress processing files.") do
options.verbose = true
end
opts.on("-p THREADS", "--parallel THREADS", "Parallelize runs.") do |threads|
options.threads = threads.to_i
end
opts.on("-n PATTERN", "--name PATTERN", "Filter run on /pattern/ or string.") do |pattern|
options.pattern = pattern
end
end
end
@@reporter : AbstractReporter?
def self.reporter
@@reporter ||= CompositeReporter.new(options).tap do |reporter|
reporter << SummaryReporter.new(options)
reporter << ProgressReporter.new(options)
end
end
def self.reporter=(reporter)
@@reporter = reporter
end
def self.run(args = nil)
process_args(args) if args
reporter.start
suites = Runnable.runnables.shuffle
count = suites.size < options.threads ? suites.size : options.threads
completed = 0
count.times do
spawn do
loop do
if suite = suites.pop?
suite.run(reporter)
completed += 1
else
break
end
end
end
end
loop do
sleep 0.001
break if completed >= Runnable.runnables.size
end
reporter.report
reporter.passed?
ensure
after_run.each(&.call)
reporter.passed?
end
def self.after_run
@@after_run ||= [] of ->
end
def self.after_run(&block)
after_run << block
end
end