From 9b026ca39b27b1213758699555eb8e6d4874984c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 8 Sep 2021 21:02:08 +0900 Subject: [PATCH] Integrate Minitest to Test --- tool/lib/core_assertions.rb | 14 +++---- tool/lib/minitest/unit.rb | 72 -------------------------------- tool/lib/test/unit.rb | 64 ++++++++++++++++++++++++---- tool/lib/test/unit/assertions.rb | 12 ++---- tool/lib/test/unit/parallel.rb | 10 ++--- tool/lib/test/unit/testcase.rb | 2 +- 6 files changed, 73 insertions(+), 101 deletions(-) delete mode 100644 tool/lib/minitest/unit.rb diff --git a/tool/lib/core_assertions.rb b/tool/lib/core_assertions.rb index 36ff2a08ba..51aeebb78f 100644 --- a/tool/lib/core_assertions.rb +++ b/tool/lib/core_assertions.rb @@ -112,7 +112,7 @@ module Test pend 'assert_no_memory_leak may consider MJIT memory usage as leak' if defined?(RubyVM::JIT) && RubyVM::JIT.enabled? require_relative 'memory_status' - raise MiniTest::Skip, "unsupported platform" unless defined?(Memory::Status) + raise Test::Skip, "unsupported platform" unless defined?(Memory::Status) token = "\e[7;1m#{$$.to_s}:#{Time.now.strftime('%s.%L')}:#{rand(0x10000).to_s(16)}:\e[m" token_dump = token.dump @@ -177,11 +177,11 @@ module Test end begin line = __LINE__; yield - rescue MiniTest::Skip + rescue Test::Skip raise rescue Exception => e bt = e.backtrace - as = e.instance_of?(MiniTest::Assertion) + as = e.instance_of?(Test::Assertion) if as ans = /\A#{Regexp.quote(__FILE__)}:#{line}:in /o bt.reject! {|ln| ans =~ ln} @@ -193,7 +193,7 @@ module Test "Backtrace:\n" + e.backtrace.map{|frame| " #{frame}"}.join("\n") } - raise MiniTest::Assertion, msg.call, bt + raise Test::Assertion, msg.call, bt else raise end @@ -396,8 +396,8 @@ eom begin yield - rescue MiniTest::Skip => e - return e if exp.include? MiniTest::Skip + rescue Test::Skip => e + return e if exp.include? Test::Skip raise e rescue Exception => e expected = exp.any? { |ex| @@ -708,7 +708,7 @@ eom if message msg = "#{message}\n#{msg}" end - raise MiniTest::Assertion, msg + raise Test::Assertion, msg end end diff --git a/tool/lib/minitest/unit.rb b/tool/lib/minitest/unit.rb deleted file mode 100644 index 6c72362c52..0000000000 --- a/tool/lib/minitest/unit.rb +++ /dev/null @@ -1,72 +0,0 @@ -# encoding: utf-8 -# frozen_string_literal: true - -require "optparse" -require "rbconfig" -require "leakchecker" - -## -# Minimal (mostly drop-in) replacement for test-unit. -# -# :include: README.txt - -module MiniTest - - def self.const_missing name # :nodoc: - case name - when :MINI_DIR then - msg = "MiniTest::MINI_DIR was removed. Don't violate other's internals." - warn "WAR\NING: #{msg}" - warn "WAR\NING: Used by #{caller.first}." - const_set :MINI_DIR, "bad value" - else - super - end - end - - ## - # Assertion base class - - class Assertion < Exception; end - - ## - # Assertion raised when skipping a test - - class Skip < Assertion; end - - class << self - ## - # Filter object for backtraces. - - attr_accessor :backtrace_filter - end - - class BacktraceFilter # :nodoc: - def filter bt - return ["No backtrace"] unless bt - - new_bt = [] - - unless $DEBUG then - bt.each do |line| - break if line =~ /lib\/minitest/ - new_bt << line - end - - new_bt = bt.reject { |line| line =~ /lib\/minitest/ } if new_bt.empty? - new_bt = bt.dup if new_bt.empty? - else - new_bt = bt.dup - end - - new_bt - end - end - - self.backtrace_filter = BacktraceFilter.new - - def self.filter_backtrace bt # :nodoc: - backtrace_filter.filter bt - end - -end # module MiniTest diff --git a/tool/lib/test/unit.rb b/tool/lib/test/unit.rb index ed4a376b76..78e706404e 100644 --- a/tool/lib/test/unit.rb +++ b/tool/lib/test/unit.rb @@ -1,14 +1,60 @@ # frozen_string_literal: true -require_relative '../minitest/unit' -require 'test/unit/assertions' require_relative '../envutil' require_relative '../colorize' +require 'test/unit/assertions' require 'test/unit/testcase' require 'optparse' +require "leakchecker" # See Test::Unit module Test + + ## + # Assertion base class + + class Assertion < Exception; end + + ## + # Assertion raised when skipping a test + + class Skip < Assertion; end + + class << self + ## + # Filter object for backtraces. + + attr_accessor :backtrace_filter + end + + class BacktraceFilter # :nodoc: + def filter bt + return ["No backtrace"] unless bt + + new_bt = [] + + unless $DEBUG then + bt.each do |line| + break if line =~ /lib\/minitest/ + new_bt << line + end + + new_bt = bt.reject { |line| line =~ /lib\/minitest/ } if new_bt.empty? + new_bt = bt.dup if new_bt.empty? + else + new_bt = bt.dup + end + + new_bt + end + end + + self.backtrace_filter = BacktraceFilter.new + + def self.filter_backtrace bt # :nodoc: + backtrace_filter.filter bt + end + ## # Test::Unit is an implementation of the xUnit testing framework for Ruby. # @@ -17,6 +63,10 @@ module Test # Test::Unit has been left in the standard library to support legacy test # suites. module Unit + # Compatibility hack for assert_raise + AssertionFailedError = Test::Assertion + PendedError = Test::Skip + TEST_UNIT_IMPLEMENTATION = 'test/unit compatibility layer using minitest' # :nodoc: module RunCount # :nodoc: all @@ -583,7 +633,7 @@ module Test unless @interrupt || !@options[:retry] || @need_quit parallel = @options[:parallel] @options[:parallel] = false - suites, rep = rep.partition {|r| r[:testcase] && r[:file] && r[:report].any? {|e| !e[2].is_a?(MiniTest::Skip)}} + suites, rep = rep.partition {|r| r[:testcase] && r[:file] && r[:report].any? {|e| !e[2].is_a?(Test::Skip)}} suites.map {|r| File.realpath(r[:file])}.uniq.each {|file| require file} suites.map! {|r| eval("::"+r[:testcase])} del_status_line or puts @@ -1488,21 +1538,21 @@ module Test # hidden when not verbose (-v), note this is temporally. n = report.size e = case e - when MiniTest::Skip then + when Test::Skip then @skips += 1 return "S" unless @verbose "Skipped:\n#{klass}##{meth} [#{location e}]:\n#{e.message}\n" - when MiniTest::Assertion then + when Test::Assertion then @failures += 1 "Failure:\n#{klass}##{meth} [#{location e}]:\n#{e.message}\n" else @errors += 1 - bt = MiniTest::filter_backtrace(e.backtrace).join "\n " + bt = Test::filter_backtrace(e.backtrace).join "\n " "Error:\n#{klass}##{meth}:\n#{e.class}: #{e.message.b}\n #{bt}\n" end @report << e rep = e[0, 1] - if MiniTest::Skip === e and /no message given\z/ =~ e.message + if Test::Skip === e and /no message given\z/ =~ e.message report.slice!(n..-1) rep = "." end diff --git a/tool/lib/test/unit/assertions.rb b/tool/lib/test/unit/assertions.rb index 711d8a6bc3..db8128536c 100644 --- a/tool/lib/test/unit/assertions.rb +++ b/tool/lib/test/unit/assertions.rb @@ -1,5 +1,4 @@ # frozen_string_literal: true -require 'minitest/unit' require_relative '../../core_assertions' require 'pp' @@ -119,7 +118,7 @@ module Test self._assertions += 1 unless test then msg = msg.call if Proc === msg - raise MiniTest::Assertion, msg + raise Test::Assertion, msg end true end @@ -410,7 +409,7 @@ module Test "Class: <#{e.class}>", "Message: <#{e.message.inspect}>", "---Backtrace---", - "#{MiniTest::filter_backtrace(e.backtrace).join("\n")}", + "#{Test::filter_backtrace(e.backtrace).join("\n")}", "---------------", ].join "\n" end @@ -580,7 +579,7 @@ module Test def skip msg = nil, bt = caller msg ||= "Skipped, no message given" @skip = true - raise MiniTest::Skip, msg, bt + raise Test::Skip, msg, bt end alias omit skip @@ -883,10 +882,5 @@ EOT template.gsub(/\G((?:[^\\]|\\.)*?)(\\)?\?/) { $1 + ($2 ? "?" : mu_pp(arguments.shift)) } end end - - # Compatibility hack for assert_raise - AssertionFailedError = MiniTest::Assertion - PendedError = MiniTest::Skip - end end diff --git a/tool/lib/test/unit/parallel.rb b/tool/lib/test/unit/parallel.rb index b0d8262bfc..84bf0c3e25 100644 --- a/tool/lib/test/unit/parallel.rb +++ b/tool/lib/test/unit/parallel.rb @@ -160,21 +160,21 @@ module Test end def puke(klass, meth, e) # :nodoc: - if e.is_a?(MiniTest::Skip) - new_e = MiniTest::Skip.new(e.message) + if e.is_a?(Test::Skip) + new_e = Test::Skip.new(e.message) new_e.set_backtrace(e.backtrace) e = new_e end - @partial_report << [klass.name, meth, e.is_a?(MiniTest::Assertion) ? e : ProxyError.new(e)] + @partial_report << [klass.name, meth, e.is_a?(Test::Assertion) ? e : ProxyError.new(e)] super end def record(suite, method, assertions, time, error) # :nodoc: case error when nil - when MiniTest::Assertion, MiniTest::Skip + when Test::Assertion, Test::Skip case error.cause - when nil, MiniTest::Assertion, MiniTest::Skip + when nil, Test::Assertion, Test::Skip else bt = error.backtrace error = error.class.new(error.message) diff --git a/tool/lib/test/unit/testcase.rb b/tool/lib/test/unit/testcase.rb index bbba87f63b..6ce9f5940d 100644 --- a/tool/lib/test/unit/testcase.rb +++ b/tool/lib/test/unit/testcase.rb @@ -191,7 +191,7 @@ module Test rescue *PASSTHROUGH_EXCEPTIONS raise rescue Exception => e - @passed = MiniTest::Skip === e + @passed = Test::Skip === e time = Time.now - start_time runner.record self.class, self.__name__, self._assertions, time, e result = runner.puke self.class, self.__name__, e