| | 87 | |
| | 88 | |
| | 89 | # used by test_simple_doctype_listener |
| | 90 | # submitted by Jeff Barczewski |
| | 91 | class SimpleDoctypeListener |
| | 92 | include REXML::SAX2Listener |
| | 93 | attr_reader :name, :pub_sys, :long_name, :uri |
| | 94 | |
| | 95 | def initialize |
| | 96 | @name = @pub_sys = @long_name = @uri = nil |
| | 97 | end |
| | 98 | |
| | 99 | def doctype(name, pub_sys, long_name, uri) |
| | 100 | @name = name |
| | 101 | @pub_sys = pub_sys |
| | 102 | @long_name = long_name |
| | 103 | @uri = uri |
| | 104 | end |
| | 105 | end |
| | 106 | |
| | 107 | # test simple non-entity doctype in sax listener |
| | 108 | # submitted by Jeff Barczewski |
| | 109 | def test_simple_doctype_listener |
| | 110 | xml = <<-END |
| | 111 | <?xml version="1.0"?> |
| | 112 | <!DOCTYPE greeting PUBLIC "Hello Greeting DTD" "http://foo/hello.dtd"> |
| | 113 | <greeting>Hello, world!</greeting> |
| | 114 | END |
| | 115 | parser = Parsers::SAX2Parser.new(xml) |
| | 116 | dtl = SimpleDoctypeListener.new |
| | 117 | parser.listen(dtl) |
| | 118 | tname = nil |
| | 119 | tpub_sys = nil |
| | 120 | tlong_name = nil |
| | 121 | turi = nil |
| | 122 | parser.listen(:doctype) do |name, pub_sys, long_name, uri| |
| | 123 | tname = name |
| | 124 | tpub_sys = pub_sys |
| | 125 | tlong_name = long_name |
| | 126 | turi = uri |
| | 127 | end |
| | 128 | parser.parse |
| | 129 | assert_equal 'greeting', tname, 'simple doctype block listener failed - incorrect name' |
| | 130 | assert_equal 'PUBLIC', tpub_sys, 'simple doctype block listener failed - incorrect pub_sys' |
| | 131 | assert_equal 'Hello Greeting DTD', tlong_name, 'simple doctype block listener failed - incorrect long_name' |
| | 132 | assert_equal 'http://foo/hello.dtd', turi, 'simple doctype block listener failed - incorrect uri' |
| | 133 | assert_equal 'greeting', dtl.name, 'simple doctype listener failed - incorrect name' |
| | 134 | assert_equal 'PUBLIC', dtl.pub_sys, 'simple doctype listener failed - incorrect pub_sys' |
| | 135 | assert_equal 'Hello Greeting DTD', dtl.long_name, 'simple doctype listener failed - incorrect long_name' |
| | 136 | assert_equal 'http://foo/hello.dtd', dtl.uri, 'simple doctype listener failed - incorrect uri' |
| | 137 | end |
| | 138 | |
| | 139 | # test doctype with missing name, should throw ParseException |
| | 140 | # submitted by Jeff Barczewseki |
| | 141 | def test_doctype_with_mising_name_throws_exception |
| | 142 | xml = <<-END |
| | 143 | <?xml version="1.0"?> |
| | 144 | <!DOCTYPE > |
| | 145 | <greeting>Hello, world!</greeting> |
| | 146 | END |
| | 147 | parser = Parsers::SAX2Parser.new(xml) |
| | 148 | assert_raise(REXML::ParseException, 'doctype missing name did not throw ParseException') do |
| | 149 | parser.parse |
| | 150 | end |
| | 151 | end |
| | 152 | |
| | 153 | |