if ENV['BUNDLE_GEMFILE']
  STDERR.puts <<-HERE
========================================================================

ERROR: Cannot test 'paper_trail_manager' because Bundler is loaded!

Do not use 'bundle exec rake' or otherwise load Bundler into the Rake
environment. This test suite runs across multiple versions of Rails and
needs to be able to setup individual environments for each of these, and
it can't do this if Bundler is already loaded.

========================================================================
  HERE
  raise
end

def run(cmd)
  puts "* running: #{cmd}"
  system cmd
  raise "ERROR running command" unless $? == 0
end

def setup_rails_app dir
  dir =~ /rails-([^-]+)/
  version = $1
  run "./generate_test_directory #{version}"
  bundler_cache = File.expand_path("bundler_cache")
  Dir.chdir dir do
    File.open("Gemfile", "w") do |gemfile|
      gemfile.write <<-GEM
        source :gemcutter
        gem "rails", "=#{version}"
        gem "sqlite3-ruby", :require => "sqlite3"
        gem "rake"
        gem "will_paginate", "~> 3.0.pre2"
        gem "paper_trail_manager", :path => "#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..'))}"
        gem 'factory_girl_rails', '~> 1.7.0'
        gem 'rspec-rails', '~> 2.11.0'
      GEM
    end
    run "bundle install --path=#{bundler_cache}"
  end
end

def test_rails_app dir
  @results ||= {}
  Dir.chdir(dir) do
    ENV['RAILS_ENV'] = "test"
    FileUtils.mkdir_p "log"
    begin
      run "touch db/test.sqlite3" # db:create doesn't exist before rails 2.0
      run "bundle exec rake db:migrate --trace"
      # run "bundle exec rspec --backtrace spec"
      run "bundle exec rake"
    rescue Object
      @results[dir] = "FAIL"
    else
      @results[dir] = "SUCCESS"
    end
  end
end

def print_results
  puts "----- RESULTS -----"
  @results.keys.sort.each do |key|
    puts "* #{key}: #{@results[key]}"
  end
end

Dir["#{File.dirname(__FILE__)}/rails-*"].sort.each do |fqdir|
  dir = File.basename fqdir
  desc "test #{dir}"
  task "test:#{dir}" do
    Dir.chdir(File.dirname(__FILE__)) do
      setup_rails_app dir
      test_rails_app dir
    end
  end
end

namespace :test do
  desc "run tests across various versions of Rails"
  task :rails do
    Dir["#{File.dirname(__FILE__)}/rails-*"].sort.reverse.each do |fqdir|
      dir = File.basename fqdir
      Rake::Task["test:#{dir}"].invoke
    end
    print_results
  end
end