1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/rexml/parser/test_ultra_light.rb
kou a66a9fbb10 * lib/rexml/parsers/ultralightparser.rb
(REXML::Parsers::UltraLightParser#parse): Fix wrong :start_doctype
  position.
  [Bug #9061] [ruby-dev:47778]
  Patch by Ippei Obayashi. Thanks!!!

* test/rexml/parser/test_ultra_light.rb: Add a test for this case.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43693 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-16 09:31:24 +00:00

67 lines
1.7 KiB
Ruby

require "test/unit"
require "rexml/parsers/ultralightparser"
class TestUltraLightParser < Test::Unit::TestCase
class TestDocumentTypeDeclaration < self
def test_entity_declaration
assert_equal([
[
:start_doctype,
:parent,
"root",
"SYSTEM",
"urn:x-test",
nil,
[:entitydecl, "name", "value"]
],
[:text, "\n"],
[:start_element, :parent, "root", {}],
[:text, "\n"],
],
parse(<<-INTERNAL_SUBSET))
<!ENTITY name "value">
INTERNAL_SUBSET
end
private
def xml(internal_subset)
<<-XML
<!DOCTYPE root SYSTEM "urn:x-test" [
#{internal_subset}
]>
<root/>
XML
end
def parse(internal_subset)
parser = REXML::Parsers::UltraLightParser.new(xml(internal_subset))
normalize(parser.parse)
end
def normalize(root)
root.collect do |child|
normalize_child(child)
end
end
def normalize_child(child)
tag = child.first
case tag
when :start_doctype
normalized_parent = :parent
normalized_doctype = child.dup
normalized_doctype[1] = normalized_parent
normalized_doctype
when :start_element
tag, parent, name, attributes, *children = child
normalized_parent = :parent
normalized_children = children.collect do |sub_child|
normalize_child(sub_child)
end
[tag, normalized_parent, name, attributes, *normalized_children]
else
child
end
end
end
end