require 'listener'
require 'uri'

ROOT = '/home/rubys/cvs/feedvalidator/'

class Listener
  attr_accessor :pass, :desc, :msg, :attrs

  alias :super_init :initialize

  def initialize source
    @pass = false
    @xmlbase = URI.parse(source.sub(ROOT,'http://www.feedvalidator.org/'))
    super_init File.new(source)
  end

  def log msg, args={}
    if msg == @msg
      @pass = @invert.empty?
    elsif msg.to_s[0..4] != 'Valid'
      base = self
      base = self.parent while self.respond_to? :parent
      puts base.xmlbase
      puts [msg,args].inspect
    end
  end

  def comment string
    if string =~ /Description:\s*(.*?)\s*Expect:\s*(!?)(\w*)(?:\{(.*?)\})?/m
      @desc, @invert, @msg, @attrs = $1, $2, $3, $4
      @pass = true unless @invert.empty?
      @msg = @msg.to_sym
    end
  end
end

Dir[ROOT + 'testcases/atom/*/*.xml'].each do |file|
  begin
    results = Listener.new(file)
    if results.pass
      print '.'
    else
      puts
      puts file
      puts "Description: #{results.desc}"
      puts "Expect: #{results.msg}{#{results.attrs}}"
      break
    end
  rescue Exception
    puts
    puts file
    raise
  end
end
