require 'xml'
require 'test/unit'
require 'stringio'

class TestXml < Test::Unit::TestCase
  # -----  Constants  ------
  def test_lib_versions
    assert(XML.check_lib_versions)
  end

  def test_debug_entities
    XML.debug_entities = false
    assert(!XML.debug_entities)

    XML.debug_entities = true
    assert(XML.debug_entities)

    XML.debug_entities = false
    assert(!XML.debug_entities)
  end

  def test_default_compression
    return unless XML.default_compression

    0.upto(9) do |i|
      XML.default_compression = i
      assert_equal(i, XML.default_compression)
    end

    9.downto(0) do |i|
      assert_equal(i, XML.default_compression = i)
      assert_equal(i, XML.default_compression)
    end

    0.downto(-10) do |i|
      assert_equal(i, XML.default_compression = i)
      assert_equal(0, XML.default_compression)
    end

    10.upto(20) do |i|
      assert_equal(i, XML.default_compression = i)
      assert_equal(9, XML.default_compression)
    end
  end

  def test_default_keep_blanks
    XML.default_keep_blanks = false
    assert(!XML.default_keep_blanks)

    XML.default_keep_blanks = true
    assert(XML.default_keep_blanks)

    XML.default_keep_blanks = false
    assert(!XML.default_keep_blanks)

    # other tests depend on keeping blanks by default,
    # which is the default default behaviour anyway.
    XML.default_keep_blanks = true
  end

  def test_default_line_numbers
    XML.default_line_numbers = false
    assert(!XML.default_line_numbers)

    XML.default_line_numbers = true
    assert(XML.default_line_numbers)

    XML.default_line_numbers = false
    assert(!XML.default_line_numbers)
  end

  def test_default_substitute_entities
    XML.default_substitute_entities = false
    assert(!XML.default_substitute_entities)

    XML.default_substitute_entities = true
    assert(XML.default_substitute_entities)

    XML.default_substitute_entities = false
    assert(!XML.default_substitute_entities)
  end

  def test_default_tree_indent_string
    s = XML.default_tree_indent_string
    assert_instance_of(String, s)
    assert_equal('  ', s)
    XML.default_tree_indent_string = 'uga'
    s = XML.default_tree_indent_string
    assert_instance_of(String, s)
    assert_equal('uga', s)
    XML.default_tree_indent_string = '  '
    s = XML.default_tree_indent_string
    assert_instance_of(String, s)
    assert_equal('  ', s)
  end

  def test_default_validity_checking
    XML.default_validity_checking = false
    assert(!XML.default_validity_checking)

    XML.default_validity_checking = true
    assert(XML.default_validity_checking)

    XML.default_validity_checking = false
    assert(!XML.default_validity_checking)
  end

  def test_default_warnings
    XML.default_warnings = false
    assert(!XML.default_warnings)

    XML.default_warnings = true
    assert(XML.default_warnings)

    XML.default_warnings = false
    assert(!XML.default_warnings)
  end

  def test_enabled_automata
    assert_equal(true, XML.enabled_automata?)
  end

  def test_enabled_c14n
    assert_equal(true, XML.enabled_c14n?)
  end

  def test_enabled_catalog
    assert_equal(true, XML.enabled_catalog?)
  end

  def test_enabled_debug
    assert_equal(true, XML.enabled_debug?)
  end

  def test_enabled_docbook
    assert_equal(true, XML.enabled_docbook?)
  end

  def test_enabled_ftp
    assert_equal(true, XML.enabled_ftp?)
  end

  def test_enabled_http
    assert_equal(true, XML.enabled_http?)
  end

  def test_enabled_html
    assert_equal(true, XML.enabled_html?)
  end

  def test_enabled_iconv
    assert_equal(true, XML.enabled_iconv?)
  end

  def test_enabled_memory_debug
    assert_equal(false, XML.enabled_memory_debug?)
  end

  def test_enabled_regexp
    assert_equal(true, XML.enabled_regexp?)
  end

  def test_enabled_schemas
    assert_equal(true, XML.enabled_schemas?)
  end

  def test_enabled_thread
    assert_equal(true, XML.enabled_thread?)
  end

  def test_enabled_unicode
    assert_equal(true, XML.enabled_unicode?)
  end

  def test_enabled_xinclude
    assert_equal(true, XML.enabled_xinclude?)
  end

  def test_enabled_xpath
    assert_equal(true, XML.enabled_xpath?)
  end

  def test_enabled_xpointer
    assert_equal(true, XML.enabled_xpointer?)
  end

  def test_enabled_zlib
    assert_equal(true, XML.enabled_zlib?)
  end

  def test_intent_tree_output
    assert(TrueClass, XML.indent_tree_output)

    XML.indent_tree_output = false
    assert(FalseClass, XML.indent_tree_output)

    XML.indent_tree_output = true
    assert(TrueClass, XML.indent_tree_output)
  end

  def test_version
    assert_instance_of(String, XML::VERSION)
  end

  def test_vernum
    assert_instance_of(Fixnum, XML::VERNUM)
  end

  def test_libxml_parser_features
    assert_instance_of(Array, XML.features)
  end
end