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 &lt;<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