# let Emacs know it's -*- ruby -*- begin require 'rake/testtask' rescue LoadError $stderr.puts "You must have 'rake' installed to use this file" exit(1) end require 'find' include Find include FileTest $exclusions = %W(lib data) $test_library_paths = %W(lib ../lib) $: << File.join(Dir.getwd, "lib") require 'rake/puppet_testtask' filemap = Hash.new { |hash, key| hash[key] = [] } allfiles = [] # First collect the entire file list. find(".") do |f| # Get rid of the leading ./ f = f.sub(/^\.\//, '') file = File.basename(f) dir = File.dirname(f) # Prune . directories and excluded dirs if (file =~ /^\./ and f != ".") or $exclusions.include?(File.basename(file)) prune next end next if f == "." next if dir == "." # If we're a ruby script, then add it to the list of files for that dir if file =~ /\.rb$/ allfiles << f # Add it to all of the parent dirs, not just our own parts = File.split(dir) if parts[0] == "." parts.shift end parts.each_with_index { |part, i| path = File.join(parts[0..i]) filemap[path] << f } end end desc "Run the full test suite" Rake::PuppetTestTask.new :test do |t| t.libs += $test_library_paths # Add every file as a test file to run t.test_files = allfiles t.verbose = true end task :default => :test # Now create a task for every directory filemap.each do |dir, files| ns = dir.gsub "/", ":" # First create a separate task for each file in the namespace. namespace ns do files.each do |file| Rake::PuppetTestTask.new File.basename(file, '.rb').to_sym do |t| t.libs += $test_library_paths + ['..'] t.libs << '..' t.test_files = [ file ] t.verbose = true end end end # Then create a task that matches the directory itself. Rake::PuppetTestTask.new dir do |t| t.libs += $test_library_paths if ENV["TESTFILES"] t.test_files = ENV["TESTFILES"].split(/\s+/) else t.test_files = files.sort end t.verbose = true end # And alias it with a slash on the end task(dir + "/" => dir) end