| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 | # Define a task library for running unit tests.require 'rake'require 'rake/tasklib'module Rake  # Create a task that runs a set of tests.  #  # Example:  #  #   Rake::TestTask.new do |t|  #     t.libs << "test"  #     t.test_files = FileList['test/test*.rb']  #     t.verbose = true  #   end  #  # If rake is invoked with a "TEST=filename" command line option,  # then the list of test files will be overridden to include only the  # filename specified on the command line.  This provides an easy way  # to run just one test.  #  # If rake is invoked with a "TESTOPTS=options" command line option,  # then the given options are passed to the test process after a  # '--'.  This allows Test::Unit options to be passed to the test  # suite.  #  # Examples:  #  #   rake test                           # run tests normally  #   rake test TEST=just_one_file.rb     # run just one test file.  #   rake test TESTOPTS="-v"             # run in verbose mode  #   rake test TESTOPTS="--runner=fox"   # use the fox test runner  #  class TestTask < TaskLib    # Name of test task. (default is :test)    attr_accessor :name    # List of directories to added to $LOAD_PATH before running the    # tests. (default is 'lib')    attr_accessor :libs    # True if verbose test output desired. (default is false)    attr_accessor :verbose    # Test options passed to the test suite.  An explicit    # TESTOPTS=opts on the command line will override this. (default    # is NONE)    attr_accessor :options    # Request that the tests be run with the warning flag set.    # E.g. warning=true implies "ruby -w" used to run the tests.    attr_accessor :warning    # Glob pattern to match test files. (default is 'test/test*.rb')    attr_accessor :pattern    # Style of test loader to use.  Options are:    #    # * :rake -- Rake provided test loading script (default).    # * :testrb -- Ruby provided test loading script.    # * :direct -- Load tests using command line loader.    #    attr_accessor :loader    # Array of commandline options to pass to ruby when running test loader.    attr_accessor :ruby_opts    # Explicitly define the list of test files to be included in a    # test.  +list+ is expected to be an array of file names (a    # FileList is acceptable).  If both +pattern+ and +test_files+ are    # used, then the list of test files is the union of the two.    def test_files=(list)      @test_files = list    end    # Create a testing task.    def initialize(name=:test)      @name = name      @libs = ["lib"]      @pattern = nil      @options = nil      @test_files = nil      @verbose = false      @warning = false      @loader = :rake      @ruby_opts = []      yield self if block_given?      @pattern = 'test/test*.rb' if @pattern.nil? && @test_files.nil?      define    end    # Create the tasks defined by this task lib.    def define      desc "Run tests" + (@name==:test ? "" : " for #{@name}")      task @name do        FileUtilsExt.verbose(@verbose) do          ruby "#{ruby_opts_string} #{run_code} #{file_list_string} #{option_list}"        end      end      self    end    def option_list # :nodoc:      (ENV['TESTOPTS'] ||        ENV['TESTOPT'] ||        ENV['TEST_OPTS'] ||        ENV['TEST_OPT'] ||        @options ||        "")    end    def ruby_opts_string      opts = @ruby_opts.dup      opts.unshift( "-I\"#{lib_path}\"" ) unless @libs.empty?      opts.unshift( "-w" ) if @warning      opts.join(" ")    end    def lib_path      @libs.join(File::PATH_SEPARATOR)    end    def file_list_string      file_list.collect { |fn| "\"#{fn}\"" }.join(' ')    end    def file_list # :nodoc:      if ENV['TEST']        FileList[ ENV['TEST'] ]      else        result = []        result += @test_files.to_a if @test_files        result << @pattern if @pattern        result      end    end    def fix # :nodoc:      case ruby_version      when '1.8.2'        "\"#{find_file 'rake/ruby182_test_unit_fix'}\""      else        nil      end || ''    end    def ruby_version      RUBY_VERSION    end    def run_code      case @loader      when :direct        "-e \"ARGV.each{|f| require f}\""      when :testrb        "-S testrb #{fix}"      when :rake        "-I\"#{rake_lib_dir}\" \"#{rake_loader}\""      end    end    def rake_loader # :nodoc:      find_file('rake/rake_test_loader') or        fail "unable to find rake test loader"    end    def find_file(fn) # :nodoc:      $LOAD_PATH.each do |path|        file_path = File.join(path, "#{fn}.rb")        return file_path if File.exist? file_path      end      nil    end    def rake_lib_dir # :nodoc:      find_dir('rake') or        fail "unable to find rake lib"    end    def find_dir(fn) # :nodoc:      $LOAD_PATH.each do |path|        file_path = File.join(path, "#{fn}.rb")        return path if File.exist? file_path      end      nil    end  endend
 |