1require "test/unit/testcase" 2 3require 'rexml/parsers/pullparser' 4 5class PullParserTester < Test::Unit::TestCase 6 include REXML 7 def test_basics 8 source = '<?xml version="1.0"?> 9 <!DOCTYPE blah> 10 <a>foo <<b attribute="value">bar</b> nooo</a>' 11 parser = REXML::Parsers::PullParser.new(source) 12 res = { :text=>0 } 13 until parser.empty? 14 results = parser.pull 15 res[ :xmldecl ] = true if results.xmldecl? 16 res[ :doctype ] = true if results.doctype? 17 res[ :a ] = true if results.start_element? and results[0] == 'a' 18 if results.start_element? and results[0] == 'b' 19 res[ :b ] = true 20 assert_equal 'value', results[1]['attribute'] 21 end 22 res[ :text ] += 1 if results.text? 23 end 24 [ :xmldecl, :doctype, :a, :b ].each { |tag| 25 assert res[tag] , "#{tag} wasn't processed" 26 } 27 assert_equal 4, res[ :text ] 28 rescue ParseException 29 puts $! 30 end 31 32 def test_bad_document 33 source = "<a><b></a>" 34 parser = REXML::Parsers::PullParser.new(source) 35 assert_raise(ParseException, "Parsing should have failed") { 36 parser.pull while parser.has_next? 37 } 38 end 39 40 def test_entity_replacement 41 source = '<!DOCTYPE foo [ 42 <!ENTITY la "1234"> 43 <!ENTITY lala "--&la;--"> 44 <!ENTITY lalal "&la;&la;"> 45 ]><a><la>&la;</la><lala>&lala;</lala></a>' 46 pp = REXML::Parsers::PullParser.new( source ) 47 el_name = '' 48 while pp.has_next? 49 event = pp.pull 50 case event.event_type 51 when :start_element 52 el_name = event[0] 53 when :text 54 case el_name 55 when 'la' 56 assert_equal('1234', event[1]) 57 when 'lala' 58 assert_equal('--1234--', event[1]) 59 end 60 end 61 end 62 end 63 64 def test_peek_unshift 65 source = "<a><b/></a>" 66 REXML::Parsers::PullParser.new(source) 67 # FINISH ME! 68 end 69 70 def test_inspect 71 xml = '<a id="1"><b id="2">Hey</b></a>' 72 parser = Parsers::PullParser.new( xml ) 73 while parser.has_next? 74 pull_event = parser.pull 75 if pull_event.start_element? 76 peek = parser.peek() 77 peek.inspect 78 end 79 end 80 end 81 82 def test_peek 83 xml = '<a id="1"><b id="2">Hey</b></a>' 84 parser = Parsers::PullParser.new( xml ) 85 names = %w{ a b } 86 while parser.has_next? 87 pull_event = parser.pull 88 if pull_event.start_element? 89 assert_equal( :start_element, pull_event.event_type ) 90 assert_equal( names.shift, pull_event[0] ) 91 if names[0] == 'b' 92 peek = parser.peek() 93 assert_equal( :start_element, peek.event_type ) 94 assert_equal( names[0], peek[0] ) 95 end 96 end 97 end 98 assert_equal( 0, names.length ) 99 end 100end 101