require 'abstract_unit'
class TokenizerTest < Test::Unit::TestCase
  def test_blank
    tokenize ""
    assert_end
  end
  def test_space
    tokenize " "
    assert_next " "
    assert_end
  end
  def test_tag_simple_open
    tokenize ""
    assert_next ""
    assert_end
  end
  def test_tag_simple_self_closing
    tokenize ""
    assert_next ""
    assert_end
  end
  def test_tag_simple_closing
    tokenize ""
    assert_next ""
  end
  
  def test_tag_with_single_quoted_attribute
    tokenize %{x}
    assert_next %{}
  end
  def test_tag_with_single_quoted_attribute_with_escape
    tokenize %{x}
    assert_next %{}
  end
  def test_tag_with_double_quoted_attribute
    tokenize %{x}
    assert_next %{}
  end
  def test_tag_with_double_quoted_attribute_with_escape
    tokenize %{x}
    assert_next %{}
  end
  
  def test_tag_with_unquoted_attribute
    tokenize %{x}
    assert_next %{}
  end
  def test_tag_with_lt_char_in_attribute
    tokenize %{x}
    assert_next %{}
  end
  
  def test_tag_with_gt_char_in_attribute
    tokenize %{x}
    assert_next %{}
  end
  
  def test_doctype_tag
    tokenize %{\n    }
    assert_next %{}
    assert_next %{\n    }
    assert_next %{}
  end
  def test_cdata_tag
    tokenize %{]]>}
    assert_next %{]]>}
    assert_end
  end
  def test_unterminated_cdata_tag
    tokenize %{}
    assert_next %{ world}
    assert_next %{original }
    assert_next %{< hello > world}
  end
  
  def test_less_than_without_matching_greater_than
    tokenize %{hello foo\nbar}
    assert_next %{hello }
    assert_next %{}
    assert_next %{foo}
    assert_next %{}
    assert_next %{\nbar}
    assert_next %{}
    assert_end
  end
  def test_unterminated_comment
    tokenize %{hello