require File.join(File.dirname(__FILE__), 'preamble')

require 'html5lib/html5parser'
require 'html5lib/serializer'
require 'html5lib/treewalkers'

#Run the serialize error checks
checkSerializeErrors = false

class JsonWalker < HTML5lib::TreeWalkers::Base
  def each
    @tree.each do |token|
      case token[0]
      when 'StartTag'
        yield startTag(token[1], token[2])
      when 'EndTag'
        yield endTag(token[1])
      when 'EmptyTag'
        yield emptyTag(token[1], token[2])
      when 'Comment'
        yield comment(token[1])
      when 'Characters', 'SpaceCharacters'
        text(token[1]) {|textToken| yield textToken}
      when 'Doctype'
        yield doctype(token[1])
      else
        raise ValueError("Unknown token type: " + type)
      end
    end
  end
end

class Html5SerializeTestcase < Test::Unit::TestCase
  html5lib_test_files('serializer').each do |filename|
    test_name = File.basename(filename).sub('.test', '')
    tests = JSON::parse(open(filename).read)
    tests['tests'].each_with_index do |test, index|

      define_method "test_#{test_name}_#{index+1}" do
        result = HTML5lib::HTMLSerializer.
          serialize(JsonWalker.new(test["input"]), (test["options"] || {}))
        expected = test["expected"]
        if expected.length == 1
          assert_equal(expected[0], result, test["description"])
        elsif !expected.include?(result)
          flunk("Expected: #{expected.inspect}, Received: #{result.inspect}")
        end
      end

    end
  end
end