diff options
Diffstat (limited to 'jni/ruby/test/rexml/parser')
-rw-r--r-- | jni/ruby/test/rexml/parser/test_sax2.rb | 202 | ||||
-rw-r--r-- | jni/ruby/test/rexml/parser/test_tree.rb | 42 | ||||
-rw-r--r-- | jni/ruby/test/rexml/parser/test_ultra_light.rb | 69 |
3 files changed, 313 insertions, 0 deletions
diff --git a/jni/ruby/test/rexml/parser/test_sax2.rb b/jni/ruby/test/rexml/parser/test_sax2.rb new file mode 100644 index 0000000..dba5eab --- /dev/null +++ b/jni/ruby/test/rexml/parser/test_sax2.rb @@ -0,0 +1,202 @@ +require "test/unit" +require "rexml/parsers/sax2parser" +require "rexml/sax2listener" + +module REXMLTests +class TestSAX2Parser < Test::Unit::TestCase + class TestDocumentTypeDeclaration < self + private + def xml(internal_subset) + <<-XML +<!DOCTYPE r SYSTEM "urn:x-henrikmartensson:test" [ +#{internal_subset} +]> +<r/> + XML + end + + class TestEntityDeclaration < self + class Listener + include REXML::SAX2Listener + attr_reader :entity_declarations + def initialize + @entity_declarations = [] + end + + def entitydecl(declaration) + super + @entity_declarations << declaration + end + end + + private + def parse(internal_subset) + listener = Listener.new + parser = REXML::Parsers::SAX2Parser.new(xml(internal_subset)) + parser.listen(listener) + parser.parse + listener.entity_declarations + end + + class TestGeneralEntity < self + class TestValue < self + def test_double_quote + assert_equal([["name", "value"]], parse(<<-INTERNAL_SUBSET)) +<!ENTITY name "value"> + INTERNAL_SUBSET + end + + def test_single_quote + assert_equal([["name", "value"]], parse(<<-INTERNAL_SUBSET)) +<!ENTITY name 'value'> + INTERNAL_SUBSET + end + end + + class TestExternlID < self + class TestSystem < self + def test_with_ndata + declaration = [ + "name", + "SYSTEM", "system-literal", + "NDATA", "ndata-name", + ] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) +<!ENTITY name SYSTEM "system-literal" NDATA ndata-name> + INTERNAL_SUBSET + end + + def test_without_ndata + declaration = [ + "name", + "SYSTEM", "system-literal", + ] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) +<!ENTITY name SYSTEM "system-literal"> + INTERNAL_SUBSET + end + end + + class TestPublic < self + def test_with_ndata + declaration = [ + "name", + "PUBLIC", "public-literal", "system-literal", + "NDATA", "ndata-name", + ] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) +<!ENTITY name PUBLIC "public-literal" "system-literal" NDATA ndata-name> + INTERNAL_SUBSET + end + + def test_without_ndata + declaration = [ + "name", + "PUBLIC", "public-literal", "system-literal", + ] + assert_equal([declaration], parse(<<-INTERNAL_SUBSET)) +<!ENTITY name PUBLIC "public-literal" "system-literal"> + INTERNAL_SUBSET + end + end + end + end + + class TestParameterEntity < self + class TestValue < self + def test_double_quote + assert_equal([["%", "name", "value"]], parse(<<-INTERNAL_SUBSET)) +<!ENTITY % name "value"> + INTERNAL_SUBSET + end + + def test_single_quote + assert_equal([["%", "name", "value"]], parse(<<-INTERNAL_SUBSET)) +<!ENTITY % name 'value'> + INTERNAL_SUBSET + end + end + + class TestExternlID < self + def test_system + declaration = [ + "%", + "name", + "SYSTEM", "system-literal", + ] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) +<!ENTITY % name SYSTEM "system-literal"> + INTERNAL_SUBSET + end + + def test_public + declaration = [ + "%", + "name", + "PUBLIC", "public-literal", "system-literal", + ] + assert_equal([declaration], parse(<<-INTERNAL_SUBSET)) +<!ENTITY % name PUBLIC "public-literal" "system-literal"> + INTERNAL_SUBSET + end + end + end + end + + class TestNotationDeclaration < self + class Listener + include REXML::SAX2Listener + attr_reader :notation_declarations + def initialize + @notation_declarations = [] + end + + def notationdecl(*declaration) + super + @notation_declarations << declaration + end + end + + private + def parse(internal_subset) + listener = Listener.new + parser = REXML::Parsers::SAX2Parser.new(xml(internal_subset)) + parser.listen(listener) + parser.parse + listener.notation_declarations + end + + class TestExternlID < self + def test_system + declaration = ["name", "SYSTEM", nil, "system-literal"] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) +<!NOTATION name SYSTEM "system-literal"> + INTERNAL_SUBSET + end + + def test_public + declaration = ["name", "PUBLIC", "public-literal", "system-literal"] + assert_equal([declaration], parse(<<-INTERNAL_SUBSET)) +<!NOTATION name PUBLIC "public-literal" "system-literal"> + INTERNAL_SUBSET + end + end + + class TestPublicID < self + def test_literal + declaration = ["name", "PUBLIC", "public-literal", nil] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) +<!NOTATION name PUBLIC "public-literal"> + INTERNAL_SUBSET + end + end + end + end +end +end diff --git a/jni/ruby/test/rexml/parser/test_tree.rb b/jni/ruby/test/rexml/parser/test_tree.rb new file mode 100644 index 0000000..fa010f6 --- /dev/null +++ b/jni/ruby/test/rexml/parser/test_tree.rb @@ -0,0 +1,42 @@ +require "test/unit" +require "rexml/document" +require "rexml/parsers/treeparser" + +module REXMLTests +class TestTreeParser < Test::Unit::TestCase + class TestInvalid < self + def test_unmatched_close_tag + xml = "<root></not-root>" + exception = assert_raise(REXML::ParseException) do + parse(xml) + end + assert_equal(<<-MESSAGE, exception.to_s) +Missing end tag for 'root' (got "not-root") +Line: 1 +Position: #{xml.bytesize} +Last 80 unconsumed characters: + MESSAGE + end + + def test_no_close_tag + xml = "<root>" + exception = assert_raise(REXML::ParseException) do + parse(xml) + end + assert_equal(<<-MESSAGE, exception.to_s) +No close tag for /root +Line: 1 +Position: #{xml.bytesize} +Last 80 unconsumed characters: + MESSAGE + end + + private + def parse(xml) + document = REXML::Document.new + parser = REXML::Parsers::TreeParser.new(xml, document) + parser.parse + end + end +end +end diff --git a/jni/ruby/test/rexml/parser/test_ultra_light.rb b/jni/ruby/test/rexml/parser/test_ultra_light.rb new file mode 100644 index 0000000..4960fc1 --- /dev/null +++ b/jni/ruby/test/rexml/parser/test_ultra_light.rb @@ -0,0 +1,69 @@ +require "test/unit" +require "rexml/parsers/ultralightparser" + +module REXMLTests +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 +end |