lib/turn/runners/minirunner.rb in turn-0.8.1 vs lib/turn/runners/minirunner.rb in turn-0.8.2
- old
+ new
@@ -1,6 +1,6 @@
-#
+require 'stringio'
# Becuase of some wierdness in MiniTest
debug, $DEBUG = $DEBUG, false
require 'minitest/unit'
$DEBUG = debug
@@ -11,12 +11,13 @@
# = MiniTest TestRunner
#
class MiniRunner < ::MiniTest::Unit
- #
+ # Override initialize to take controller argument.
def initialize(controller)
+ @turn_controller = controller
controller.loadpath.each{ |path| $: << path } unless controller.live?
controller.requires.each{ |path| require(path) }
[controller.files].flatten.each{ |path| require(path) }
@@ -42,148 +43,123 @@
#end
@turn_logger = controller.reporter
super()
+
+ # route minitests traditional output to nowhere
+ # (instead of overriding #puts and #print)
+ @@out = ::StringIO.new
end
- #
+ # Turn calls this method to start the test run.
def start(args=[])
run(args)
return @turn_suite
end
- #
- def run(args = [])
- @verbose = true
+ # Override #_run_suite to setup Turn.
+ def _run_suites suites, type
+ @turn_suite = Turn::TestSuite.new(@turn_suite_name)
+ @turn_suite.size = ::MiniTest::Unit::TestCase.test_suites.size
- filter = if args.first =~ /^(-n|--name)$/ then
- args.shift
- arg = args.shift
- arg =~ /\/(.*)\// ? Regexp.new($1) : arg
- else
- /./ # anything - ^test_ already filtered by #tests
- end
+ @turn_logger.start_suite(@turn_suite)
- #@@out.puts "Loaded suite #{$0.sub(/\.rb$/, '')}\nStarted"
+ if @turn_controller.matchcase
+ suites = suites.select{ |suite| @turn_controller.matchcase =~ suite.name }
+ end
- start = Time.now
+ result = suites.map { |suite| _run_suite(suite, type) }
- run_test_suites(filter)
+ @turn_logger.finish_suite(@turn_suite)
- return failures + errors if @test_count > 0 # or return nil...
+ return result
end
- #
- def run_test_suites(filter = /./)
- @test_count, @assertion_count = 0, 0
- old_sync, @@out.sync = @@out.sync, true if @@out.respond_to? :sync=
+ # Override #_run_suite to iterate tests via Turn.
+ def _run_suite suite, type
+ # suites are cases in minitest
+ @turn_case = @turn_suite.new_case(suite.name)
- @turn_suite = Turn::TestSuite.new(@turn_suite_name)
- @turn_suite.size = ::MiniTest::Unit::TestCase.test_suites.size
- @turn_logger.start_suite(@turn_suite)
+ filter = @turn_controller.pattern || /./
- ::MiniTest::Unit::TestCase.test_suites.each do |kase|
+ suite.send("#{type}_methods").grep(filter).each do |test|
+ @turn_case.new_test(test)
+ end
- test_cases = kase.test_methods.grep(filter)
+ @turn_logger.start_case(@turn_case)
- @turn_case = @turn_suite.new_case(kase.name)
+ header = "#{type}_suite_header"
+ puts send(header, suite) if respond_to? header
- turn_cases = test_cases.map do |test|
- @turn_case.new_test(test)
- end
+ assertions = @turn_case.tests.map do |test|
+ @turn_test = test
+ @turn_logger.start_test(@turn_test)
- @turn_logger.start_case(@turn_case)
+ inst = suite.new(test.name) #method
+ inst._assertions = 0
- turn_cases.each do |test|
- #methname, tcase = name.scan(%r/^([^\(]+)\(([^\)]+)\)/o).flatten!
- @turn_test = test #@turn_case.new_test(test)
- @turn_logger.start_test(@turn_test)
+ result = inst.run self
- inst = kase.new(test.name)
- inst._assertions = 0
+ if result == "."
+ @turn_logger.pass
+ end
- result = inst.run(self)
- report = @report.last
+ @turn_logger.finish_test(@turn_test)
- case result
- when :pass
- @turn_logger.pass
- when :error
- #trace = ::MiniTest::filter_backtrace(report[:exception].backtrace).first
- @turn_test.error!(report)
- @turn_logger.error(report)
- when :fail
- #trace = ::MiniTest::filter_backtrace(report[:exception].backtrace).first
- @turn_test.fail!(report)
- @turn_logger.fail(report)
- when :skip
- @turn_test.skip! #(report)
- @turn_logger.skip #(report)
- end
+ inst._assertions
+ end
- @turn_logger.finish_test(@turn_test)
+ @turn_case.count_assertions = assertions.inject(0) { |sum, n| sum + n }
- @test_count += 1
- @assertion_count += inst._assertions
- end
- @turn_case.count_assertions = @assertion_count # for lack of a better appraoch
- @turn_logger.finish_case(@turn_case)
+ @turn_logger.finish_case(@turn_case)
+
+ return assertions.size, assertions.inject(0) { |sum, n| sum + n }
+ end
+
+ # Override #puke to update Turn's internals and reporter.
+ def puke(klass, meth, err)
+ case err
+ when MiniTest::Skip
+ @turn_test.skip!
+ @turn_logger.skip #(e)
+ when MiniTest::Assertion
+ @turn_test.fail!(err)
+ @turn_logger.fail(err)
+ else
+ @turn_test.error!(err)
+ @turn_logger.error(err)
end
- @turn_logger.finish_suite(@turn_suite)
- @@out.sync = old_sync if @@out.respond_to? :sync=
- [@test_count, @assertion_count]
+ super(klass, meth, err)
end
- # Overwrite #puke method so that is stores a hash
- # with :message and :exception keys.
- def puke(klass, meth, e)
- result = nil
- msg = case e
- when ::MiniTest::Skip
- @skips += 1
- result = :skip
- e.message
- when ::MiniTest::Assertion
- @failures += 1
- result = :fail
- e.message
- else
- @errors += 1
- result = :error
- "#{e.class}: #{e.message}\n"
- end
+ # To maintain compatibility with old versions of MiniTest.
+ if ::MiniTest::Unit::VERSION < '2.0'
- @report << e #{:message => msg, :exception => e}
- result
- end
+ #attr_accessor :options
- end
+ #
+ def run(args=[])
+ suites = ::MiniTest::Unit::TestCase.test_suites
+ return if suites.empty?
-end
+ @test_count, @assertion_count = 0, 0
+ sync = @@out.respond_to? :"sync=" # stupid emacs
+ old_sync, @@out.sync = @@out.sync, true if sync
-class ::MiniTest::Unit::TestCase
- old_verbose, $VERBOSE = $VERBOSE, false
- # Overwrite #run method so that is uses symbols
- # as return values rather than characters.
- def run(runner)
- result = :pass
- begin
- @passed = nil
- self.setup
- self.__send__(self.__name__.to_s)
- @passed = true
- rescue Exception => e
- @passed = false
- result = runner.puke(self.class, self.__name__.to_s, e)
- ensure
- begin
- self.teardown
- rescue Exception => e
- result = runner.puke(self.class, self.__name__.to_s, e)
+ results = _run_suites suites, :test #type
+
+ @test_count = results.inject(0) { |sum, (tc, _)| sum + tc }
+ @assertion_count = results.inject(0) { |sum, (_, ac)| sum + ac }
+
+ @@out.sync = old_sync if sync
+
+ return failures + errors if @test_count > 0 # or return nil...
+ rescue Interrupt
+ abort 'Interrupted'
end
+
end
- result
+
end
- $VERBOSE = old_verbose
-end
+end