diff options
Diffstat (limited to 'lib/minitest/unit.rb')
-rw-r--r-- | lib/minitest/unit.rb | 281 |
1 files changed, 89 insertions, 192 deletions
diff --git a/lib/minitest/unit.rb b/lib/minitest/unit.rb index 65e84230dd..80c76c45f3 100644 --- a/lib/minitest/unit.rb +++ b/lib/minitest/unit.rb @@ -8,8 +8,6 @@ require 'optparse' ## # Minimal (mostly drop-in) replacement for test-unit. -# -# :include: README.txt module MiniTest @@ -29,8 +27,7 @@ module MiniTest require 'pathname' pwd = Pathname.new Dir.pwd pn = Pathname.new File.expand_path(__FILE__) - relpath = pn.relative_path_from(pwd) rescue pn - pn = File.join ".", relpath unless pn.relative? + pn = File.join(".", pn.relative_path_from(pwd)) unless pn.relative? pn.to_s else # assume both are expanded __FILE__ @@ -43,19 +40,13 @@ module MiniTest return ["No backtrace"] unless bt new_bt = [] - - unless $DEBUG then - bt.each do |line| - break if line.rindex MINI_DIR, 0 - new_bt << line - end - - new_bt = bt.reject { |line| line.rindex MINI_DIR, 0 } if new_bt.empty? - new_bt = bt.dup if new_bt.empty? - else - new_bt = bt.dup + bt.each do |line| + break if line.rindex(MINI_DIR, 0) + new_bt << line end + new_bt = bt.reject { |line| line.rindex(MINI_DIR, 0) } if new_bt.empty? + new_bt = bt.dup if new_bt.empty? new_bt end @@ -71,7 +62,7 @@ module MiniTest def mu_pp obj s = obj.inspect - s = s.force_encoding Encoding.default_external if defined? Encoding + s = s.force_encoding(Encoding.default_external) if defined? Encoding s end @@ -100,14 +91,15 @@ module MiniTest # Fails unless the block returns a true value. def assert_block msg = nil - assert yield, "Expected block to return true value." + msg = message(msg) { "Expected block to return true value" } + assert yield, msg end ## # Fails unless +obj+ is empty. def assert_empty obj, msg = nil - msg = message(msg) { "Expected #{mu_pp(obj)} to be empty" } + msg = message(msg) { "Expected #{obj.inspect} to be empty" } assert_respond_to obj, :empty? assert obj.empty?, msg end @@ -257,8 +249,8 @@ module MiniTest def assert_respond_to obj, meth, msg = nil msg = message(msg) { - "Expected #{mu_pp(obj)} (#{obj.class}) to respond to ##{meth}" - } + "Expected #{mu_pp(obj)} (#{obj.class}) to respond to ##{meth}" + } assert obj.respond_to?(meth), msg end @@ -520,62 +512,28 @@ module MiniTest end class Unit - VERSION = "2.0.0" # :nodoc: + VERSION = "1.7.2" # :nodoc: attr_accessor :report, :failures, :errors, :skips # :nodoc: attr_accessor :test_count, :assertion_count # :nodoc: attr_accessor :start_time # :nodoc: - attr_accessor :help # :nodoc: - attr_accessor :verbose # :nodoc: - attr_writer :options # :nodoc: - - def options - @options ||= {} - end @@installed_at_exit ||= false @@out = $stdout ## - # A simple hook allowing you to run a block of code after the - # tests are done. Eg: - # - # MiniTest::Unit.after_tests { p $debugging_info } - - def self.after_tests - at_exit { at_exit { yield } } - end - - ## # Registers MiniTest::Unit to run tests at process exit def self.autorun at_exit { next if $! # don't run if there was an exception - exit_code = MiniTest::Unit.new.run ARGV + exit_code = MiniTest::Unit.new.run(ARGV) exit false if exit_code && exit_code != 0 } unless @@installed_at_exit @@installed_at_exit = true end ## - # Returns the stream to use for output. - - def self.output - @@out - end - - ## - # Returns the stream to use for output. - # - # DEPRECATED: use ::output instead. - - def self.out - warn "::out deprecated, use ::output instead." if $VERBOSE - output - end - - ## # Sets MiniTest::Unit to write output to +stream+. $stdout is the default # output @@ -583,93 +541,6 @@ module MiniTest @@out = stream end - ## - # Return all plugins' run methods (methods that start with "run_"). - - def self.plugins - @@plugins ||= (["run_tests"] + - public_instance_methods(false). - grep(/^run_/).map { |s| s.to_s }).uniq - end - - def output - self.class.output - end - - def puts *a # :nodoc: - output.puts(*a) - end - - def print *a # :nodoc: - output.print(*a) - end - - def _run_anything type - suites = TestCase.send "#{type}_suites" - return if suites.empty? - - start = Time.now - - puts - puts "# Running #{type}s:" - puts - - @test_count, @assertion_count = 0, 0 - sync = output.respond_to? :"sync=" # stupid emacs - old_sync, output.sync = output.sync, true if sync - - results = _run_suites suites, type - - @test_count = results.inject(0) { |sum, (tc, ac)| sum + tc } - @assertion_count = results.inject(0) { |sum, (tc, ac)| sum + ac } - - output.sync = old_sync if sync - - t = Time.now - start - - puts - puts - puts "Finished #{type}s in %.6fs, %.4f tests/s, %.4f assertions/s." % - [t, test_count / t, assertion_count / t] - - report.each_with_index do |msg, i| - puts "\n%3d) %s" % [i + 1, msg] - end - - puts - - status - end - - def _run_suites suites, type - suites.map { |suite| _run_suite suite, type } - end - - def _run_suite suite, type - header = "#{type}_suite_header" - puts send(header, suite) if respond_to? header - - filter = options[:filter] || '/./' - filter = Regexp.new $1 if filter =~ /\/(.*)\// - - assertions = suite.send("#{type}_methods").grep(filter).map { |method| - inst = suite.new method - inst._assertions = 0 - - start_time = Time.now - result = inst.run self - time = Time.now - start_time - - print "#{suite}##{method} = %.2f s = " % time if @verbose - print result - puts if @verbose - - inst._assertions - } - - return assertions.size, assertions.inject(0) { |sum, n| sum + n } - end - def location e # :nodoc: last_before_assertion = "" e.backtrace.reverse_each do |s| @@ -693,7 +564,7 @@ module MiniTest "Failure:\n#{meth}(#{klass}) [#{location e}]:\n#{e.message}\n" else @errors += 1 - bt = MiniTest::filter_backtrace(e.backtrace).join "\n " + bt = MiniTest::filter_backtrace(e.backtrace).join("\n ") "Error:\n#{meth}(#{klass}):\n#{e.class}: #{e.message}\n #{bt}\n" end @report << e @@ -708,7 +579,6 @@ module MiniTest def process_args args = [] options = {} - orig_args = args.dup OptionParser.new do |opts| opts.banner = 'minitest options:' @@ -731,21 +601,9 @@ module MiniTest options[:filter] = a end - opts.parse! args - orig_args -= args - end - - unless options[:seed] then - srand - options[:seed] = srand % 0xFFFF - orig_args << "--seed" << options[:seed].to_s + opts.parse args end - srand options[:seed] - - self.verbose = options[:verbose] - @help = orig_args.map { |s| s =~ /[\s|&<>$()]/ ? s.inspect : s }.join " " - options end @@ -753,40 +611,89 @@ module MiniTest # Top level driver, controls all output and filtering. def run args = [] - self.options = process_args args + options = process_args args + + @verbose = options[:verbose] - puts "Run options: #{help}" + filter = options[:filter] || '/./' + filter = Regexp.new $1 if filter and filter =~ /\/(.*)\// - self.class.plugins.each do |plugin| - send plugin - break unless report.empty? + seed = options[:seed] + unless seed then + srand + seed = srand % 0xFFFF end + srand seed + + help = ["--seed", seed] + help.push "--verbose" if @verbose + help.push("--name", options[:filter].inspect) if options[:filter] + + @@out.puts "Test run options: #{help.join(" ")}" + @@out.puts + @@out.puts "Loaded suite #{$0.sub(/\.rb$/, '')}\nStarted" + + start = Time.now + run_test_suites filter + + @@out.puts + @@out.puts "Finished in #{'%.6f' % (Time.now - start)} seconds." + + @report.each_with_index do |msg, i| + @@out.puts "\n%3d) %s" % [i + 1, msg] + end + + @@out.puts + + status + + @@out.puts + + @@out.puts "Test run options: #{help.join(" ")}" + return failures + errors if @test_count > 0 # or return nil... rescue Interrupt abort 'Interrupted' end ## - # Runs test suites matching +filter+. + # Writes status to +io+ - def run_tests - _run_anything :test + def status io = @@out + format = "%d tests, %d assertions, %d failures, %d errors, %d skips" + io.puts format % [test_count, assertion_count, failures, errors, skips] end ## - # Writes status to +io+ + # Runs test suites matching +filter+ - def status io = self.output - format = "%d tests, %d assertions, %d failures, %d errors, %d skips" - io.puts format % [test_count, assertion_count, failures, errors, skips] + def run_test_suites filter = /./ + @test_count, @assertion_count = 0, 0 + old_sync, @@out.sync = @@out.sync, true if @@out.respond_to? :sync= + TestCase.test_suites.each do |suite| + suite.test_methods.grep(filter).each do |test| + inst = suite.new test + inst._assertions = 0 + @@out.print "#{suite}##{test}: " if @verbose + + @start_time = Time.now + result = inst.run(self) + + @@out.print "%.2f s: " % (Time.now - @start_time) if @verbose + @@out.print result + @@out.puts if @verbose + @test_count += 1 + @assertion_count += inst._assertions + end + end + @@out.sync = old_sync if @@out.respond_to? :sync= + [@test_count, @assertion_count] end ## - # Subclass TestCase to create your own tests. Typically you'll want a + # Subclass TestCase to create your own tests. Typically you'll want a # TestCase subclass per implementation class. - # - # See MiniTest::Assertions class TestCase attr_reader :__name__ # :nodoc: @@ -800,31 +707,30 @@ module MiniTest # Runs the tests reporting the status to +runner+ def run runner - trap "INFO" do - time = Time.now - runner.start_time - warn "%s#%s %.2fs" % [self.class, self.__name__, time] + trap 'INFO' do + warn '%s#%s %.2fs' % [self.class, self.__name__, + (Time.now - runner.start_time)] runner.status $stderr end if SUPPORTS_INFO_SIGNAL - result = "" + result = '.' begin @passed = nil self.setup self.__send__ self.__name__ - result = "." unless io? @passed = true rescue *PASSTHROUGH_EXCEPTIONS raise rescue Exception => e @passed = false - result = runner.puke self.class, self.__name__, e + result = runner.puke(self.class, self.__name__, e) ensure begin self.teardown rescue *PASSTHROUGH_EXCEPTIONS raise rescue Exception => e - result = runner.puke self.class, self.__name__, e + result = runner.puke(self.class, self.__name__, e) end trap 'INFO', 'DEFAULT' if SUPPORTS_INFO_SIGNAL end @@ -833,19 +739,9 @@ module MiniTest def initialize name # :nodoc: @__name__ = name - @__io__ = nil @passed = nil end - def io - @__io__ = true - MiniTest::Unit.output - end - - def io? - @__io__ - end - def self.reset # :nodoc: @@test_suites = {} end @@ -866,7 +762,7 @@ module MiniTest end def self.test_suites # :nodoc: - @@test_suites.keys.sort_by { |ts| ts.name.to_s } + @@test_suites.keys.sort_by { |ts| ts.name } end def self.test_methods # :nodoc: @@ -875,7 +771,7 @@ module MiniTest case self.test_order when :random then max = methods.size - methods.sort.sort_by { rand max } + methods.sort.sort_by { rand(max) } when :alpha, :sorted then methods.sort else @@ -917,3 +813,4 @@ if $DEBUG then end end end + |