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