task :default => :testAll

desc "run all tests"
task :testAll do
  tests = FileList['builder*.rb'].collect do |f|
    f =~ /builder(.*).rb/
    $1
  end
  run_tests tests.sort_by{|s| s.to_i} 
end

task :temp do
  result = run_test 9
  if result.ok?
    puts "OK"
  else
    puts result.error_report
  end
end

desc "creates an html file with all the rules"
task :summary do
  require 'builder'
  files = Dir['rules*.rb'].sort_by {|f| rule_number(f)}
  File.open('summary.html', 'w') do |out|
    b = Builder::XmlMarkup.new(:target => out, :indent => 2)
    b.html do
      b.pre do
        files.each do |f|
          b.h1 f
          File.readlines(f).each do |line|
            line.gsub! /\t/, "  "  
            case line
            when /^\s*#\s*</
              #skip
            when /^\s*#/ 
              b.i(line)
            else 
              b << line
            end
          end
        end
      end
    end
  end
end

def rule_number filename
  filename =~ /rules(\d*).rb/
  return $1.to_i
end
    

def run_test id 
  cmd = %[ruby -r tester -e 'PluggableTester.run(%s)'] % id
  resultString = `#{cmd}`
  result = TestRunResult.new(id, resultString)
  result
end  

def run_tests tests
  results = tests.collect {|t| run_test(t)}
  if results.all? {|r| r.ok?}
    list = results.collect{|r| r.id}.join(",")
    puts "OK - #{list}"
  else
    puts "\n" * 3, '=' * 30
    results.each{|r| puts r.error_report}
    puts '-' * 30
    broken_list = results.reject{|r| r.ok?}.collect{|r| r.id}
    puts "Broken: #{broken_list}"
  end
end
  


class TestRunResult
  attr_reader :string, :tests, :assertions, :failures, :errors, :id
  def initialize id, string
    @id = id
    @string = string
    parse
  end
  def ok?
    0 == failures + errors
  end
  def parse
    re = /^(\d*) tests, (\d*) assertions, (\d*) failures, (\d*) errors/ 
    md = re.match(string.split("\n").last)
    @tests = md[1].to_i
    @assertions = md[2].to_i
    @failures = md[3].to_i
    @errors = md[4].to_i
  end
  def error_report
    puts "test #{id}"
    puts "  #{summary}"
    return if ok?
    @string
  end
  def summary
    "%d tests, %d assertions, %d failures, %d errors" % [@tests,
      @assertions, @failures, @errors]
  end
end
