test/unit.rb: reorder Test::Unit

* test/lib/test/unit.rb (Test::Unit): reorder modules and merge
  each modules.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49142 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2015-01-04 13:32:44 +00:00
Родитель 42bb2c712e
Коммит 54bfb33366
2 изменённых файлов: 301 добавлений и 343 удалений

Просмотреть файл

@ -1,4 +1,7 @@
Sun Jan 4 22:32:09 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
Sun Jan 4 22:32:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* test/lib/test/unit.rb (Test::Unit): reorder modules and merge
each modules.
* test/lib/test/unit.rb (Test::Unit): split the large class into
each modules.

Просмотреть файл

@ -65,20 +65,7 @@ module Test
@help = orig_args.map { |s| s =~ /[\s|&<>$()]/ ? s.inspect : s }.join " "
@options = options
end
end
module Parallel # :nodoc: all
def process_args(args = [])
return @options if @options
options = super
if @options[:parallel]
@files = args
end
options
end
end
module Options # :nodoc: all
private
def setup_options(opts, options)
opts.separator 'minitest options:'
@ -108,31 +95,22 @@ module Test
end
end
module Skipping # :nodoc: all
end
module Colorize # :nodoc: all
end
module StatusLine # :nodoc: all
prepend Colorize
private
def setup_options(opts, options)
super
opts.separator "status line options:"
options[:job_status] = nil
opts.on '--jobs-status [TYPE]', [:normal, :replace],
"Show status of jobs every file; Disabled when --jobs isn't specified." do |type|
options[:job_status] = type || :normal
end
end
end
module Parallel # :nodoc: all
def process_args(args = [])
return @options if @options
options = super
if @options[:parallel]
@files = args
end
options
end
def status(*args)
result = super
raise @interrupt if @interrupt
result
end
private
def setup_options(opts, options)
super
@ -167,180 +145,7 @@ module Test
options[:ruby] = a.split(/ /).reject(&:empty?)
end
end
end
module Skipping # :nodoc: all
private
def setup_options(opts, options)
super
opts.separator "skipping options:"
options[:hide_skip] = true
opts.on '-q', '--hide-skip', 'Hide skipped tests' do
options[:hide_skip] = true
end
opts.on '--show-skip', 'Show skipped tests' do
options[:hide_skip] = false
end
end
end
module Colorize # :nodoc: all
private
def setup_options(opts, options)
super
opts.on '--color[=WHEN]',
[:always, :never, :auto],
"colorize the output. WHEN defaults to 'always'", "or can be 'never' or 'auto'." do |c|
options[:color] = c || :always
end
opts.on '--tty[=WHEN]',
[:yes, :no],
"force to output tty control. WHEN defaults to 'yes'", "or can be 'no'." do |c|
@tty = c != :no
end
end
end
module LoadPathOption # :nodoc: all
def non_options(files, options)
begin
require "rbconfig"
rescue LoadError
warn "#{caller(1)[0]}: warning: Parallel running disabled because can't get path to ruby; run specify with --ruby argument"
options[:parallel] = nil
else
options[:ruby] ||= [RbConfig.ruby]
end
super
end
end
module GlobOption # :nodoc: all
@@testfile_prefix = "test"
def setup_options(parser, options)
super
parser.separator "globbing options:"
parser.on '-b', '--basedir=DIR', 'Base directory of test suites.' do |dir|
options[:base_directory] = dir
end
parser.on '-x', '--exclude REGEXP', 'Exclude test files on pattern.' do |pattern|
(options[:reject] ||= []) << pattern
end
end
def non_options(files, options)
paths = [options.delete(:base_directory), nil].uniq
if reject = options.delete(:reject)
reject_pat = Regexp.union(reject.map {|r| %r"#{r}"})
end
files.map! {|f|
f = f.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
((paths if /\A\.\.?(?:\z|\/)/ !~ f) || [nil]).any? do |prefix|
if prefix
path = f.empty? ? prefix : "#{prefix}/#{f}"
else
next if f.empty?
path = f
end
if !(match = Dir["#{path}/**/#{@@testfile_prefix}_*.rb"]).empty?
if reject
match.reject! {|n|
n[(prefix.length+1)..-1] if prefix
reject_pat =~ n
}
end
break match
elsif !reject or reject_pat !~ f and File.exist? path
break path
end
end or
raise ArgumentError, "file not found: #{f}"
}
files.flatten!
super(files, options)
end
end
module LoadPathOption # :nodoc: all
def setup_options(parser, options)
super
parser.separator "load path options:"
parser.on '-Idirectory', 'Add library load path' do |dirs|
dirs.split(':').each { |d| $LOAD_PATH.unshift d }
end
end
end
module GCStressOption # :nodoc: all
def setup_options(parser, options)
super
parser.separator "GC options:"
parser.on '--[no-]gc-stress', 'Set GC.stress as true' do |flag|
options[:gc_stress] = flag
end
end
def non_options(files, options)
if options.delete(:gc_stress)
MiniTest::Unit::TestCase.class_eval do
oldrun = instance_method(:run)
define_method(:run) do |runner|
begin
gc_stress, GC.stress = GC.stress, true
oldrun.bind(self).call(runner)
ensure
GC.stress = gc_stress
end
end
end
end
super
end
end
module RequireFiles # :nodoc: all
def non_options(files, options)
return false if !super
errors = {}
result = false
files.each {|f|
d = File.dirname(path = File.realpath(f))
unless $:.include? d
$: << d
end
begin
require path unless options[:parallel]
result = true
rescue LoadError
next if errors[$!.message]
errors[$!.message] = true
puts "#{f}: #{$!}"
end
}
result
end
end
class Runner < MiniTest::Unit # :nodoc: all
include Test::Unit::Options
include Test::Unit::StatusLine
include Test::Unit::Parallel
include Test::Unit::Skipping
include Test::Unit::GlobOption
include Test::Unit::LoadPathOption
include Test::Unit::GCStressOption
include Test::Unit::RunCount
end
module Parallel # :nodoc: all
class Worker
def self.launch(ruby,args=[])
io = IO.popen([*ruby,
@ -438,23 +243,7 @@ module Test
end
end
end
class Runner < MiniTest::Unit # :nodoc: all
class << self; undef autorun; end
@@stop_auto_run = false
def self.autorun
at_exit {
Test::Unit::RunCount.run_once {
exit(Test::Unit::Runner.new.run(ARGV) || true)
} unless @@stop_auto_run
} unless @@installed_at_exit
@@installed_at_exit = true
end
end
module Parallel # :nodoc: all
def after_worker_down(worker, e=nil, c=false)
return unless @options[:parallel]
return if @interrupt
@ -468,74 +257,7 @@ module Test
STDERR.flush
exit c
end
end
module StatusLine # :nodoc: all
def terminal_width
unless @terminal_width ||= nil
begin
require 'io/console'
width = $stdout.winsize[1]
rescue LoadError, NoMethodError, Errno::ENOTTY, Errno::EBADF, Errno::EINVAL
width = ENV["COLUMNS"].to_i.nonzero? || 80
end
width -= 1 if /mswin|mingw/ =~ RUBY_PLATFORM
@terminal_width = width
end
@terminal_width
end
def del_status_line
@status_line_size ||= 0
unless @options[:job_status] == :replace
$stdout.puts
return
end
print "\r"+" "*@status_line_size+"\r"
$stdout.flush
@status_line_size = 0
end
def put_status(line)
unless @options[:job_status] == :replace
print(line)
return
end
@status_line_size ||= 0
del_status_line
$stdout.flush
line = line[0...terminal_width]
print line
$stdout.flush
@status_line_size = line.size
end
def add_status(line)
unless @options[:job_status] == :replace
print(line)
return
end
@status_line_size ||= 0
line = line[0...(terminal_width-@status_line_size)]
print line
$stdout.flush
@status_line_size += line.size
end
def jobs_status
return unless @options[:job_status]
puts "" unless @options[:verbose] or @options[:job_status] == :replace
status_line = @workers.map(&:to_s).join(" ")
update_status(status_line) or (puts; nil)
end
def del_jobs_status
return unless @options[:job_status] == :replace && @status_line_size.nonzero?
del_status_line
end
end
module Parallel # :nodoc: all
def after_worker_quit(worker)
return unless @options[:parallel]
return if @interrupt
@ -767,6 +489,23 @@ module Test
end
module Skipping # :nodoc: all
private
def setup_options(opts, options)
super
opts.separator "skipping options:"
options[:hide_skip] = true
opts.on '-q', '--hide-skip', 'Hide skipped tests' do
options[:hide_skip] = true
end
opts.on '--show-skip', 'Show skipped tests' do
options[:hide_skip] = false
end
end
private
def _run_suites(suites, type)
result = super
@ -777,11 +516,70 @@ module Test
end
end
class Runner < MiniTest::Unit # :nodoc: all
alias mini_run_suite _run_suite
end
module StatusLine # :nodoc: all
def terminal_width
unless @terminal_width ||= nil
begin
require 'io/console'
width = $stdout.winsize[1]
rescue LoadError, NoMethodError, Errno::ENOTTY, Errno::EBADF, Errno::EINVAL
width = ENV["COLUMNS"].to_i.nonzero? || 80
end
width -= 1 if /mswin|mingw/ =~ RUBY_PLATFORM
@terminal_width = width
end
@terminal_width
end
def del_status_line
@status_line_size ||= 0
unless @options[:job_status] == :replace
$stdout.puts
return
end
print "\r"+" "*@status_line_size+"\r"
$stdout.flush
@status_line_size = 0
end
def put_status(line)
unless @options[:job_status] == :replace
print(line)
return
end
@status_line_size ||= 0
del_status_line
$stdout.flush
line = line[0...terminal_width]
print line
$stdout.flush
@status_line_size = line.size
end
def add_status(line)
unless @options[:job_status] == :replace
print(line)
return
end
@status_line_size ||= 0
line = line[0...(terminal_width-@status_line_size)]
print line
$stdout.flush
@status_line_size += line.size
end
def jobs_status
return unless @options[:job_status]
puts "" unless @options[:verbose] or @options[:job_status] == :replace
status_line = @workers.map(&:to_s).join(" ")
update_status(status_line) or (puts; nil)
end
def del_jobs_status
return unless @options[:job_status] == :replace && @status_line_size.nonzero?
del_status_line
end
def output
(@output ||= nil) || super
end
@ -808,7 +606,7 @@ module Test
end
if color or @options[:job_status] == :replace
@verbose = !options[:parallel]
@output = StatusLineOutput.new(self)
@output = Output.new(self)
end
if /\A\/(.*)\/\z/ =~ (filter = options[:filter])
filter = Regexp.new($1)
@ -857,9 +655,210 @@ module Test
end
report.clear
end
def initialize
super
@tty = $stdout.tty?
end
def run(*args)
result = super
puts "\nruby -v: #{RUBY_DESCRIPTION}"
result
end
private
def setup_options(opts, options)
super
opts.separator "status line options:"
options[:job_status] = nil
opts.on '--jobs-status [TYPE]', [:normal, :replace],
"Show status of jobs every file; Disabled when --jobs isn't specified." do |type|
options[:job_status] = type || :normal
end
opts.on '--color[=WHEN]',
[:always, :never, :auto],
"colorize the output. WHEN defaults to 'always'", "or can be 'never' or 'auto'." do |c|
options[:color] = c || :always
end
opts.on '--tty[=WHEN]',
[:yes, :no],
"force to output tty control. WHEN defaults to 'yes'", "or can be 'no'." do |c|
@tty = c != :no
end
end
class Output < Struct.new(:runner) # :nodoc: all
def puts(*a) $stdout.puts(*a) unless a.empty? end
def respond_to_missing?(*a) $stdout.respond_to?(*a) end
def method_missing(*a, &b) $stdout.__send__(*a, &b) end
def print(s)
case s
when /\A(.*\#.*) = \z/
runner.new_test($1)
when /\A(.* s) = \z/
runner.add_status(" = "+$1.chomp)
when /\A\.+\z/
runner.succeed
when /\A[EFS]\z/
runner.failed(s)
else
$stdout.print(s)
end
end
end
end
module LoadPathOption # :nodoc: all
def non_options(files, options)
begin
require "rbconfig"
rescue LoadError
warn "#{caller(1)[0]}: warning: Parallel running disabled because can't get path to ruby; run specify with --ruby argument"
options[:parallel] = nil
else
options[:ruby] ||= [RbConfig.ruby]
end
super
end
def setup_options(parser, options)
super
parser.separator "load path options:"
parser.on '-Idirectory', 'Add library load path' do |dirs|
dirs.split(':').each { |d| $LOAD_PATH.unshift d }
end
end
end
module GlobOption # :nodoc: all
@@testfile_prefix = "test"
def setup_options(parser, options)
super
parser.separator "globbing options:"
parser.on '-b', '--basedir=DIR', 'Base directory of test suites.' do |dir|
options[:base_directory] = dir
end
parser.on '-x', '--exclude REGEXP', 'Exclude test files on pattern.' do |pattern|
(options[:reject] ||= []) << pattern
end
end
def non_options(files, options)
paths = [options.delete(:base_directory), nil].uniq
if reject = options.delete(:reject)
reject_pat = Regexp.union(reject.map {|r| %r"#{r}"})
end
files.map! {|f|
f = f.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
((paths if /\A\.\.?(?:\z|\/)/ !~ f) || [nil]).any? do |prefix|
if prefix
path = f.empty? ? prefix : "#{prefix}/#{f}"
else
next if f.empty?
path = f
end
if !(match = Dir["#{path}/**/#{@@testfile_prefix}_*.rb"]).empty?
if reject
match.reject! {|n|
n[(prefix.length+1)..-1] if prefix
reject_pat =~ n
}
end
break match
elsif !reject or reject_pat !~ f and File.exist? path
break path
end
end or
raise ArgumentError, "file not found: #{f}"
}
files.flatten!
super(files, options)
end
end
module GCStressOption # :nodoc: all
def setup_options(parser, options)
super
parser.separator "GC options:"
parser.on '--[no-]gc-stress', 'Set GC.stress as true' do |flag|
options[:gc_stress] = flag
end
end
def non_options(files, options)
if options.delete(:gc_stress)
MiniTest::Unit::TestCase.class_eval do
oldrun = instance_method(:run)
define_method(:run) do |runner|
begin
gc_stress, GC.stress = GC.stress, true
oldrun.bind(self).call(runner)
ensure
GC.stress = gc_stress
end
end
end
end
super
end
end
module RequireFiles # :nodoc: all
def non_options(files, options)
return false if !super
errors = {}
result = false
files.each {|f|
d = File.dirname(path = File.realpath(f))
unless $:.include? d
$: << d
end
begin
require path unless options[:parallel]
result = true
rescue LoadError
next if errors[$!.message]
errors[$!.message] = true
puts "#{f}: #{$!}"
end
}
result
end
end
class Runner < MiniTest::Unit # :nodoc: all
include Test::Unit::Options
include Test::Unit::StatusLine
include Test::Unit::Parallel
include Test::Unit::Skipping
include Test::Unit::GlobOption
include Test::Unit::LoadPathOption
include Test::Unit::GCStressOption
include Test::Unit::RunCount
class << self; undef autorun; end
@@stop_auto_run = false
def self.autorun
at_exit {
Test::Unit::RunCount.run_once {
exit(Test::Unit::Runner.new.run(ARGV) || true)
} unless @@stop_auto_run
} unless @@installed_at_exit
@@installed_at_exit = true
end
alias mini_run_suite _run_suite
# Overriding of MiniTest::Unit#puke
def puke klass, meth, e
# TODO:
@ -875,50 +874,6 @@ module Test
end
end
module StatusLine # :nodoc: all
def initialize
super
@tty = $stdout.tty?
end
end
module Parallel # :nodoc: all
def status(*args)
result = super
raise @interrupt if @interrupt
result
end
end
module StatusLine # :nodoc: all
def run(*args)
result = super
puts "\nruby -v: #{RUBY_DESCRIPTION}"
result
end
end
class StatusLineOutput < Struct.new(:runner) # :nodoc: all
def puts(*a) $stdout.puts(*a) unless a.empty? end
def respond_to_missing?(*a) $stdout.respond_to?(*a) end
def method_missing(*a, &b) $stdout.__send__(*a, &b) end
def print(s)
case s
when /\A(.*\#.*) = \z/
runner.new_test($1)
when /\A(.* s) = \z/
runner.add_status(" = "+$1.chomp)
when /\A\.+\z/
runner.succeed
when /\A[EFS]\z/
runner.failed(s)
else
$stdout.print(s)
end
end
end
class AutoRunner # :nodoc: all
class Runner < Test::Unit::Runner
include Test::Unit::RequireFiles