lib/turn/command.rb in turn-0.7.0 vs lib/turn/command.rb in turn-0.8.0
- old
+ new
@@ -1,165 +1,210 @@
-# Turn - Pretty Unit Test Runner for Ruby
-#
-# SYNOPSIS
-# turn [OPTIONS] [RUN MODE] [OUTPUT MODE] [test globs...]
-#
-# OPTIONS
-# -h --help display this help information
-# --live don't use loadpath
-# --log log results to a file
-# -n --name=PATTERN only run tests that match regexp PATTERN
-# -I --loadpath=PATHS add given paths to the $LOAD_PATH
-# -r --requires=PATHS require given paths before running tests
-#
-# RUN MODES
-# --normal run all tests in a single process [default]
-# --solo run each test in a separate process
-# --cross run each pair of test files in a separate process
-#
-# OUTPUT MODES
-# -O --outline turn's original case/test outline mode [default]
-# -P --progress indicates progress with progress bar
-# -D --dotted test/unit's traditonal dot-progress mode
-# -M --marshal dump output as YAML (normal run mode only)
-
-require 'getoptlong'
+require 'optparse'
require 'turn/controller'
-#RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
+module Turn
-original_argv = ARGV.dup
+ # Turn - Pretty Unit Test Runner for Ruby
+ #
+ # SYNOPSIS
+ # turn [OPTIONS] [RUN MODE] [OUTPUT MODE] [test globs...]
+ #
+ # OPTIONS
+ # -h --help display this help information
+ # --live don't use loadpath
+ # --log log results to a file
+ # -n --name=PATTERN only run tests that match regexp PATTERN
+ # -I --loadpath=PATHS add given PATHS to the $LOAD_PATH
+ # -r --requires=LIBS require given LIBS before running tests
+ # -m --minitest Force use of MiniTest framework.
+ #
+ # RUN MODES
+ # --normal run all tests in a single process [default]
+ # --solo run each test in a separate process
+ # --cross run each pair of test files in a separate process
+ #
+ # OUTPUT MODES
+ # -O --outline turn's original case/test outline mode [default]
+ # -P --progress indicates progress with progress bar
+ # -D --dotted test/unit's traditonal dot-progress mode
+ # --pretty new pretty reporter
+ # -M --marshal dump output as YAML (normal run mode only)
+ # -Q --queued interactive testing
+ #
+ class Command
-opts = GetoptLong.new(
- [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
- [ '--live', GetoptLong::NO_ARGUMENT ],
- [ '--log', GetoptLong::OPTIONAL_ARGUMENT ],
- [ '--name', '-n', GetoptLong::REQUIRED_ARGUMENT ],
- [ '--loadpath', '-I', GetoptLong::REQUIRED_ARGUMENT ],
- [ '--requires', '-r', GetoptLong::REQUIRED_ARGUMENT ],
+ # Shortcut for new.main(*argv)
+ def self.main(*argv)
+ new.main(*argv)
+ end
- # RUN MODES
- [ '--normal', GetoptLong::NO_ARGUMENT ],
- [ '--solo', GetoptLong::NO_ARGUMENT ],
- [ '--cross', GetoptLong::NO_ARGUMENT ],
- #[ '--load', GetoptLong::NO_ARGUMENT ],
+ # Log output.
+ attr :log
- # OUTPUT MODES
- [ '--outline', '-O', GetoptLong::NO_ARGUMENT ],
- [ '--progress', '-P', GetoptLong::NO_ARGUMENT ],
- [ '--dotted', '-D', GetoptLong::NO_ARGUMENT ],
- [ '--marshal', '-M', GetoptLong::NO_ARGUMENT ]
-)
+ # Do not use local loadpath.
+ attr :live
-live = nil
-log = nil
-pattern = nil
-loadpath = []
-requires = []
+ # Only run tests matching this pattern.
+ attr :pattern
-runmode = nil
-outmode = nil
+ # List of paths to add to $LOAD_PATH
+ attr :loadpath
-opts.each do |opt, arg|
- case opt
- when '--help'
- help, rest = File.read(__FILE__).split(/^\s*$/)
- puts help.gsub(/^\#[ ]{0,1}/,'')
- exit
+ # Libraries to require before running tests.
+ attr :requires
- when '--live'
- live = true
- when '--log'
- log = true
- when '--name'
- pattern = Regexp.new(arg, Regexp::IGNORECASE)
- when '--loadpath'
- loadpath << arg
- when '--requires'
- requires << arg
+ # Framework to use, :minitest or :testunit.
+ attr :framework
- when '--solo'
- runmode = :solo
- when '--cross'
- runmode = :cross
- when '--marshal'
- runmode = :marshal
- outmode = :marshal
- when '--progress'
- outmode = :progress
- when '--outline'
- outmode = :outline
- when '--dotted'
- outmode = :dotted
- end
-end
+ # Run mode.
+ attr :runmode
-loadpath = ['lib'] if loadpath.empty?
+ # Output mode.
+ attr :outmode
-tests = ARGV.empty? ? nil : ARGV.dup
+ #
+ def initialize
+ @live = nil
+ @log = nil
+ @pattern = nil
+ @loadpath = []
+ @requires = []
+ @runmode = nil
+ @outmode = nil
+ @framework = RUBY_VERSION >= "1.9" ? :minitest : :testunit
+ end
-case outmode
-when :marshal
- reporter = Turn::MarshalReporter.new($stdout)
-when :progress
- reporter = Turn::ProgressReporter.new($stdout)
-when :dotted
- reporter = Turn::DotReporter.new($stdout)
-else
- reporter = Turn::OutlineReporter.new($stdout)
-end
+ #
+ def option_parser
+ OptionParser.new do |opts|
-case runmode
-when :marshal
- require 'turn/runners/testrunner'
- runner = Turn::TestRunner
-when :solo
- require 'turn/runners/solorunner'
- runner = Turn::SoloRunner
-when :cross
- require 'turn/runners/crossrunner'
- runner = Turn::CrossRunner
-else
- require 'turn/runners/testrunner'
- runner = Turn::TestRunner
-end
+ opts.banner = "Turn - Pretty Unit Test Runner for Ruby"
-controller = Turn::Controller.new do |c|
- c.live = live
- c.log = log
- c.loadpath = loadpath
- c.requires = requires
- c.tests = tests
- c.runner = runner
- c.reporter = reporter
- c.pattern = pattern
-end
+ opts.separator " "
+ opts.separator "SYNOPSIS"
+ opts.separator " turn [OPTIONS] [RUN MODE] [OUTPUT MODE] [TEST GLOBS ...]"
-controller.start
+ opts.separator " "
+ opts.separator "GENERAL OPTIONS"
-=begin
-else
+ opts.on('-I', '--loadpath=PATHS', "add paths to $LOAD_PATH") do |path|
+ @loadpath.concat(path.split(':'))
+ end
- begin
- require 'turn/adapters/testunit' # 'turn'
- rescue LoadError
- require 'rubygems'
- require 'turn/adapters/testunit' # 'turn'
- end
+ opts.on('-r', '--require=LIBS', "require libraries") do |lib|
+ @requires.concat(lib.split(':'))
+ end
- ARGV.each{ |a| Dir[a].each{ |f| require f }}
- Turn::TestRunner.run(TS_MyTests)
+ opts.on('-n', '--name=PATTERN', "only run tests that match PATTERN") do |pattern|
+ @pattern = Regexp.new(pattern, Regexp::IGNORECASE)
+ end
- #RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
- #
- #begin
- # require 'turn'
- # Kernel.exec(RUBY, '-r', 'turn', *ARGV)
- #rescue LoadError
- # require 'rubygems'
- # require 'turn'
- # Kernel.exec(RUBY, '-rubygems', '-r', 'turn', *ARGV)
- #end
+ opts.on('-m', '--minitest', "Force use of MiniTest framework") do
+ @framework = :minitest
+ end
-end
-=end
+ # Turn does not support Test::Unit 2.0+
+ #opts.on('-u', '--testunit', "Force use of TestUnit framework") do
+ # @framework = :testunit
+ #end
+ opts.on('--log', "log results to a file") do #|path|
+ @log = true # TODO: support path/file
+ end
+
+ opts.on('--live', "do not use local load path") do
+ @live = true
+ end
+
+ opts.separator " "
+ opts.separator "RUN MODES"
+
+ opts.on('--normal', "run all tests in a single process [default]") do
+ @runmode = nil
+ end
+
+ opts.on('--solo', "run each test in a separate process") do
+ @runmode = :solo
+ end
+
+ opts.on('--cross', "run each pair of test files in a separate process") do
+ @runmode = :cross
+ end
+
+ #opts.on('--load', "") do
+ #end
+
+ opts.separator " "
+ opts.separator "OUTPUT MODES"
+
+ opts.on('--outline', '-O', "turn's original case/test outline mode [default]") do
+ @outmode = :outline
+ end
+
+ opts.on('--progress', '-P', "indicates progress with progress bar") do
+ @outmode = :progress
+ end
+
+ opts.on('--dotted', '-D', "test-unit's traditonal dot-progress mode") do
+ @outmode = :dotted
+ end
+
+ opts.on('--pretty', '-T', "new pretty output mode") do
+ @outmode = :pretty
+ end
+
+ opts.on('--cue', '-C', "cue for action on each failure/error") do
+ @outmode = :cue
+ end
+
+ opts.on('--marshal', '-M', "dump output as YAML (normal run mode only)") do
+ @runmode = :marshal
+ @outmode = :marshal
+ end
+
+ opts.separator " "
+ opts.separator "COMMAND OPTIONS"
+
+ opts.on('--debug', "turn debug mode on") do
+ $VERBOSE = true
+ $DEBUG = true
+ end
+
+ opts.on_tail('--help', '-h', "display this help information") do
+ puts opts
+ exit
+ end
+ end
+ end
+
+ # Run command.
+ def main(*argv)
+ option_parser.parse!(argv)
+
+ @loadpath = ['lib'] if loadpath.empty?
+
+ tests = ARGV.empty? ? nil : ARGV.dup
+
+ controller = Turn::Controller.new do |c|
+ c.live = live
+ c.log = log
+ c.loadpath = loadpath
+ c.requires = requires
+ c.tests = tests
+ c.runmode = runmode
+ c.format = outmode
+ c.pattern = pattern
+ c.framework = framework
+ end
+
+ result = controller.start
+
+ if result
+ exit result.passed?
+ else # no tests
+ exit
+ end
+ end
+
+ end
+
+end