require "xml"
require 'test/unit'
require 'test_helper'
class TestParser < Test::Unit::TestCase
def setup
XML::Parser.register_error_handler(nil)
@xp = XML::Parser.new
end
def teardown
@xp = nil
XML::Parser.register_error_handler(nil)
# Clear out all the files we opened up in
# the test_fd_gc test
GC.start
end
# ----- Constants ------
def test_lib_versions
assert(XML::Parser::check_lib_versions)
end
def test_debug_entities
XML::Parser::debug_entities = false
assert(!XML::Parser::debug_entities)
XML::Parser::debug_entities = true
assert(XML::Parser::debug_entities)
XML::Parser::debug_entities = false
assert(!XML::Parser::debug_entities)
end
def test_default_compression
return unless XML::Parser::default_compression
0.upto(9) do |i|
XML::Parser::default_compression = i
assert_equal(i, XML::Parser::default_compression)
end
9.downto(0) do |i|
assert_equal(i, XML::Parser::default_compression = i)
assert_equal(i, XML::Parser::default_compression)
end
0.downto(-10) do |i|
assert_equal(i, XML::Parser::default_compression = i)
assert_equal(0, XML::Parser::default_compression)
end
10.upto(20) do |i|
assert_equal(i, XML::Parser::default_compression = i)
assert_equal(9, XML::Parser::default_compression)
end
end
def test_default_keep_blanks
XML::Parser::default_keep_blanks = false
assert(!XML::Parser::default_keep_blanks)
XML::Parser::default_keep_blanks = true
assert(XML::Parser::default_keep_blanks)
XML::Parser::default_keep_blanks = false
assert(!XML::Parser::default_keep_blanks)
# other tests depend on keeping blanks by default,
# which is the default default behaviour anyway.
XML::Parser::default_keep_blanks = true
end
def test_default_line_numbers
XML::Parser::default_line_numbers = false
assert(!XML::Parser::default_line_numbers)
XML::Parser::default_line_numbers = true
assert(XML::Parser::default_line_numbers)
XML::Parser::default_line_numbers = false
assert(!XML::Parser::default_line_numbers)
end
def test_default_substitute_entities
XML::Parser::default_substitute_entities = false
assert(!XML::Parser::default_substitute_entities)
XML::Parser::default_substitute_entities = true
assert(XML::Parser::default_substitute_entities)
XML::Parser::default_substitute_entities = false
assert(!XML::Parser::default_substitute_entities)
end
def test_default_tree_indent_string
s = XML::Parser::default_tree_indent_string
assert_instance_of(String, s)
assert_equal(' ', s)
XML::Parser::default_tree_indent_string = 'uga'
s = XML::Parser::default_tree_indent_string
assert_instance_of(String, s)
assert_equal('uga', s)
XML::Parser::default_tree_indent_string = ' '
s = XML::Parser::default_tree_indent_string
assert_instance_of(String, s)
assert_equal(' ', s)
end
def test_default_validity_checking
XML::Parser::default_validity_checking = false
assert(!XML::Parser::default_validity_checking)
XML::Parser::default_validity_checking = true
assert(XML::Parser::default_validity_checking)
XML::Parser::default_validity_checking = false
assert(!XML::Parser::default_validity_checking)
end
def test_default_warnings
XML::Parser::default_warnings = false
assert(!XML::Parser::default_warnings)
XML::Parser::default_warnings = true
assert(XML::Parser::default_warnings)
XML::Parser::default_warnings = false
assert(!XML::Parser::default_warnings)
end
def test_intent_tree_output
assert(TrueClass, XML::Parser::indent_tree_output)
XML::Parser::indent_tree_output = false
assert(FalseClass, XML::Parser::indent_tree_output)
XML::Parser::indent_tree_output = true
assert(TrueClass, XML::Parser::indent_tree_output)
end
def test_version
assert_instance_of(String, XML::Parser::VERSION)
end
def test_vernum
assert_instance_of(Fixnum, XML::Parser::VERNUM)
end
# ----- IO ------
def test_string
str = 'onetwo'
assert_equal(str, @xp.string = str)
assert_instance_of(XML::Document, @xp.parse)
end
def test_context
@xp = XML::Parser.string('ugafoo')
doc = @xp.parse
assert_instance_of(XML::Document, doc)
# FIXME Parser#context is not implemented
# assert_instance_of(XML::Parser::Context, @xp.context)
end
def test_file
file = File.expand_path(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
@xp.filename = file
assert_equal(file, @xp.filename)
doc = @xp.parse
assert_instance_of(XML::Document, doc)
end
def test_io
File.open(File.join(File.dirname(__FILE__), 'model/rubynet.xml')) do |f|
assert_kind_of(IO, f)
assert_kind_of(IO, @xp.io = f)
assert_instance_of(XML::Document, @xp.parse)
end
end
def test_string_io
data = File.read(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
string_io = StringIO.new(data)
assert_raises(TypeError) do
assert_kind_of(StringIO, @xp.io = string_io)
end
end
def test_fd_gc
# Test opening # of documents up to the file limit for the OS.
# Ideally it should run until libxml emits a warning,
# thereby knowing we've done a GC sweep. For the time being,
# re-open the same doc `limit descriptors` times.
# If we make it to the end, then we've succeeded,
# otherwise an exception will be thrown.
# FIXME removed test, extremely slow...
# XML::Parser.register_error_handler(lambda {|msg| nil })
#
# max_fd = if RUBY_PLATFORM.match(/mswin32/i)
# 500
# else
# (`ulimit -n`.chomp.to_i) + 1
# end
#
# filename = File.join(File.dirname(__FILE__), 'model/rubynet.xml')
# max_fd.times do
# XML::Document.file(filename)
# end
end
def test_libxml_parser_features
assert_instance_of(Array, XML::Parser::features)
end
# ----- Errors ------
def test_error_handler
assert_raise(XML::Parser::ParseError) do
XML::Parser.string('').parse
end
ary = []
XML::Parser.register_error_handler do |msg|
ary << msg
end
# this will use our error handler
assert_raise(XML::Parser::ParseError) do
XML::Parser.string('').parse
end
# FIXME Errors are not the same across platforms
# assert_equal(["Entity: line 1: ",
# "parser ",
# "error : ",
# "Opening and ending tag mismatch: foo line 1 and foz\n",
# "\n",
# " ^\n"], ary)
# assert_instance_of(Proc, XML::Parser.register_error_handler(nil))
# this will go to stderr again
assert_raise(XML::Parser::ParseError) do
d = XML::Parser.string('').parse
end
end
def test_error_handler_lambda
XML::Parser.register_error_handler(nil)
assert_raise(XML::Parser::ParseError) do
XML::Parser.string('').parse
end
ary = []
assert_nil XML::Parser.register_error_handler(lambda { |msg| ary << msg })
# this will use our error handler
assert_raise(XML::Parser::ParseError) do
XML::Parser.string('').parse
end
# FIXME Errors are not the same across platforms
# assert_equal(["Entity: line 1: ",
# "parser ",
# "error : ",
# "Opening and ending tag mismatch: foo line 1 and foz\n",
# "\n",
# " ^\n"], ary)
# assert_instance_of(Proc, XML::Parser.register_error_handler(nil))
# this will go to stderr again
assert_raise(XML::Parser::ParseError) do
d = XML::Parser.string('').parse
end
end
def test_bad_xml
@xp.string = 'onetwo'
XML::Parser.register_error_handler(lambda {|msg| nil })
assert_raise(XML::Parser::ParseError) do
assert_not_nil(@xp.parse)
end
end
def test_double_parse
XML::Parser.register_error_handler(lambda {|msg| nil })
parser = XML::Parser.string("something")
doc = parser.parse
assert_raise(XML::Parser::ParseError) do
parser.parse
end
end
def test_libxml_parser_empty_string
assert_raise(XML::Parser::ParseError) do
@xp.string = ''
@xp.parse
end
assert_raise(TypeError) do
@xp.string = nil
end
end
end