diff options
author | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-09-17 13:14:14 +0000 |
---|---|---|
committer | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-09-17 13:14:14 +0000 |
commit | 91ed484f92040e5c2006a3a00ec77a54d552cf37 (patch) | |
tree | 03fd6677a85aaad516d0c9464b1273ea107231b7 /test/rexml/test_listener.rb | |
parent | 045491d5be06b615d66d3f66cca2b5d2bc3c1929 (diff) | |
download | ruby-91ed484f92040e5c2006a3a00ec77a54d552cf37.tar.gz |
* test/rexml/: import REXML tests from
http://www.germane-software.com/repos/rexml/trunk/test/.
Many tests are failed temporary. I'll fix them quickly. Sorry.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29282 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/rexml/test_listener.rb')
-rw-r--r-- | test/rexml/test_listener.rb | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/test/rexml/test_listener.rb b/test/rexml/test_listener.rb new file mode 100644 index 0000000000..645b857055 --- /dev/null +++ b/test/rexml/test_listener.rb @@ -0,0 +1,207 @@ +# coding: binary +require 'test/unit/testcase' +require 'rexml/document' +require 'rexml/streamlistener' + +class BaseTester < Test::Unit::TestCase + def test_empty + return unless defined? @listener + # Empty. + t1 = %Q{<string></string>} + assert_equal( "", @listener.parse( t1 ), + "Empty" ) + end + + def test_space + return unless defined? @listener + # Space. + t2 = %Q{<string> </string>} + assert_equal( " ", @listener.parse( t2 ), + "Space" ) + end + + def test_whitespace + return unless defined? @listener + # Whitespaces. + t3 = %Q{<string>RE\n \t \n \t XML</string>} + assert_equal( "RE\n \t \n \t XML", @listener.parse( t3 ), + "Whitespaces" ) + end + + def test_leading_trailing_whitespace + return unless defined? @listener + # Leading and trailing whitespaces. + t4 = %Q{<string> REXML </string>} + assert_equal( " REXML ", @listener.parse( t4 ), + "Leading and trailing whitespaces" ) + end + + def test_entity_reference + return unless defined? @listener + # Entity reference. + t5 = %Q{<string><>&lt;&gt;</string>} + assert_equal( "<><>", @listener.parse( t5 ), + "Entity reference" ) + end + + def test_character_reference + return unless defined? @listener + # Character reference. + t6 = %Q{<string>
</string>} + assert_equal( "\r", @listener.parse( t6 ), + "Character reference." ) + end + + def test_cr + return unless defined? @listener + # CR. + t7 = %Q{<string> \r\n \r \n </string>} + assert_equal( " \n \n \n ".unpack("C*").inspect, + @listener.parse( t7 ).unpack("C*").inspect, "CR" ) + end + + # The accent bug, and the code that exibits the bug, was contributed by + # Guilhem Vellut + class AccentListener + def tag_start(name,attributes) + #p name + #p attributes + end + def tag_end(name) + #p "/"+name + end + def xmldecl(a,b,c) + #puts "#{a} #{b} #{c}" + end + def text(tx) + #p tx + end + end + + def test_accents + source = '<?xml version="1.0" encoding="ISO-8859-1"?> +<g> +<f a="é" /> +</g>' + doc = REXML::Document.new( source ) + a = doc.elements['/g/f'].attribute('a') + if a.value.respond_to? :force_encoding + a.value.force_encoding('binary') + end + assert_equal( 'é', a.value) + doc = REXML::Document.parse_stream( + File::new("test/data/stream_accents.xml"), + AccentListener::new + ) + end +end + +######################################################### +# Other parsers commented out because they cause failures +# in the unit tests, which aren't REXMLs problems +# ####################################################### +=begin +begin + require 'xmlparser' + class MyXMLParser + class Listener < XML::Parser + # Dummy handler to get XML::Parser::XML_DECL event. + def xmlDecl; end + end + + def parse( stringOrReadable ) + text = "" + Listener.new.parse( stringOrReadable ) do | type, name, data | + case type + when XML::Parser::CDATA + text << data + end + end + text + end + end + + class XMLParserTester < BaseTester + def setup + @listener = MyXMLParser.new + end + end +rescue LoadError + #puts "XMLParser not available" +end + +begin + require 'nqxml/tokenizer' + class MyNQXMLLightWeightListener + def parse( stringOrReadable ) + text = "" + isText = false + tokenizer = NQXML::Tokenizer.new( stringOrReadable ) + tokenizer.each do | entity | + case entity + when NQXML::Tag + if !entity.isTagEnd + isText = true + else + isText = false + end + when NQXML::Text + if isText + text << entity.text + isText = false + end + end + end + text + end + end + + class NQXMLTester < BaseTester + def setup + @listener = MyNQXMLLightWeightListener.new + end + end +rescue LoadError + #puts "NQXML not available" +end +=end + +class MyREXMLListener + include REXML::StreamListener + + def initialize + @text = nil + end + + def parse( stringOrReadable ) + @text = "" + REXML::Document.parse_stream( stringOrReadable, self ) + @text + end + + def text( text ) + @text << text + end +end + +class REXMLTester < BaseTester + def setup + @listener = MyREXMLListener.new + end + + def test_character_reference_2 + t6 = %Q{<string>
</string>} + assert_equal( t6.strip, REXML::Document.new(t6).to_s ) + end +end + +if __FILE__ == $0 + case ARGV[0] + when 'NQXML' + RUNIT::CUI::TestRunner.run( NQXMLTester.suite ) + when 'XMLParser' + RUNIT::CUI::TestRunner.run( XMLParserTester.suite ) + else + RUNIT::CUI::TestRunner.run( REXMLTester.suite ) + end +end |