* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / lib / rake / testtask.rb
blobf5b77e5957a116c28a7ee837ce92c6c722a32e27
1 #!/usr/bin/env ruby
3 # Define a task library for running unit tests.
5 require 'rake'
6 require 'rake/tasklib'
8 module Rake
10   # Create a task that runs a set of tests.
11   #
12   # Example:
13   #  
14   #   Rake::TestTask.new do |t|
15   #     t.libs << "test"
16   #     t.test_files = FileList['test/test*.rb']
17   #     t.verbose = true
18   #   end
19   #
20   # If rake is invoked with a "TEST=filename" command line option,
21   # then the list of test files will be overridden to include only the
22   # filename specified on the command line.  This provides an easy way
23   # to run just one test.
24   #
25   # If rake is invoked with a "TESTOPTS=options" command line option,
26   # then the given options are passed to the test process after a
27   # '--'.  This allows Test::Unit options to be passed to the test
28   # suite.
29   #
30   # Examples:
31   #
32   #   rake test                           # run tests normally
33   #   rake test TEST=just_one_file.rb     # run just one test file.
34   #   rake test TESTOPTS="-v"             # run in verbose mode
35   #   rake test TESTOPTS="--runner=fox"   # use the fox test runner
36   #
37   class TestTask < TaskLib
39     # Name of test task. (default is :test)
40     attr_accessor :name
42     # List of directories to added to $LOAD_PATH before running the
43     # tests. (default is 'lib')
44     attr_accessor :libs
46     # True if verbose test output desired. (default is false)
47     attr_accessor :verbose
49     # Test options passed to the test suite.  An explicit
50     # TESTOPTS=opts on the command line will override this. (default
51     # is NONE)
52     attr_accessor :options
54     # Request that the tests be run with the warning flag set.
55     # E.g. warning=true implies "ruby -w" used to run the tests.
56     attr_accessor :warning
58     # Glob pattern to match test files. (default is 'test/test*.rb')
59     attr_accessor :pattern
61     # Style of test loader to use.  Options are:
62     #
63     # * :rake -- Rake provided test loading script (default).
64     # * :testrb -- Ruby provided test loading script.
65     # * :direct -- Load tests using command line loader.
66     # 
67     attr_accessor :loader
69     # Array of commandline options to pass to ruby when running test loader.
70     attr_accessor :ruby_opts
72     # Explicitly define the list of test files to be included in a
73     # test.  +list+ is expected to be an array of file names (a
74     # FileList is acceptable).  If both +pattern+ and +test_files+ are
75     # used, then the list of test files is the union of the two.
76     def test_files=(list)
77       @test_files = list
78     end
80     # Create a testing task.
81     def initialize(name=:test)
82       @name = name
83       @libs = ["lib"]
84       @pattern = nil
85       @options = nil
86       @test_files = nil
87       @verbose = false
88       @warning = false
89       @loader = :rake
90       @ruby_opts = []
91       yield self if block_given?
92       @pattern = 'test/test*.rb' if @pattern.nil? && @test_files.nil?
93       define
94     end
96     # Create the tasks defined by this task lib.
97     def define
98       lib_path = @libs.join(File::PATH_SEPARATOR)
99       desc "Run tests" + (@name==:test ? "" : " for #{@name}")
100       task @name do
101         run_code = ''
102         RakeFileUtils.verbose(@verbose) do
103           run_code =
104             case @loader
105             when :direct
106               "-e 'ARGV.each{|f| load f}'"
107             when :testrb
108               "-S testrb #{fix}"
109             when :rake
110               rake_loader
111             end
112           @ruby_opts.unshift( "-I#{lib_path}" )
113           @ruby_opts.unshift( "-w" ) if @warning
114           ruby @ruby_opts.join(" ") +
115             " \"#{run_code}\" " +
116             file_list.collect { |fn| "\"#{fn}\"" }.join(' ') +
117             " #{option_list}"
118         end
119       end
120       self
121     end
123     def option_list # :nodoc:
124       ENV['TESTOPTS'] || @options || ""
125     end
127     def file_list # :nodoc:
128       if ENV['TEST']
129         FileList[ ENV['TEST'] ]
130       else
131         result = []
132         result += @test_files.to_a if @test_files
133         result += FileList[ @pattern ].to_a if @pattern
134         FileList[result]
135       end
136     end
138     def fix # :nodoc:
139       ''
140     end
142     def rake_loader # :nodoc:
143       find_file('rake/rake_test_loader') or
144         fail "unable to find rake test loader"
145     end
147     def find_file(fn) # :nodoc:
148       $LOAD_PATH.each do |path|
149         file_path = File.join(path, "#{fn}.rb")
150         return file_path if File.exist? file_path
151       end
152       nil
153     end
155   end