libxml-ruby 2.8.0 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/HISTORY +859 -775
- data/LICENSE +20 -20
- data/MANIFEST +166 -166
- data/README.rdoc +217 -184
- data/Rakefile +98 -78
- data/ext/libxml/extconf.rb +61 -116
- data/ext/libxml/libxml.c +80 -76
- data/ext/libxml/ruby_libxml.h +67 -75
- data/ext/libxml/ruby_xml.c +937 -893
- data/ext/libxml/ruby_xml.h +10 -10
- data/ext/libxml/ruby_xml_attr.c +333 -333
- data/ext/libxml/ruby_xml_attr.h +12 -12
- data/ext/libxml/ruby_xml_attr_decl.c +153 -153
- data/ext/libxml/ruby_xml_attr_decl.h +11 -11
- data/ext/libxml/ruby_xml_attributes.c +275 -275
- data/ext/libxml/ruby_xml_attributes.h +15 -15
- data/ext/libxml/ruby_xml_cbg.c +85 -85
- data/ext/libxml/ruby_xml_document.c +1123 -1147
- data/ext/libxml/ruby_xml_document.h +11 -11
- data/ext/libxml/ruby_xml_dtd.c +248 -268
- data/ext/libxml/ruby_xml_dtd.h +9 -9
- data/ext/libxml/ruby_xml_encoding.c +250 -260
- data/ext/libxml/ruby_xml_encoding.h +16 -19
- data/ext/libxml/ruby_xml_error.c +996 -996
- data/ext/libxml/ruby_xml_error.h +12 -12
- data/ext/libxml/ruby_xml_html_parser.c +89 -92
- data/ext/libxml/ruby_xml_html_parser.h +10 -10
- data/ext/libxml/ruby_xml_html_parser_context.c +337 -338
- data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
- data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
- data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
- data/ext/libxml/ruby_xml_input_cbg.c +191 -191
- data/ext/libxml/ruby_xml_input_cbg.h +20 -20
- data/ext/libxml/ruby_xml_io.c +47 -50
- data/ext/libxml/ruby_xml_io.h +10 -10
- data/ext/libxml/ruby_xml_namespace.c +154 -153
- data/ext/libxml/ruby_xml_namespace.h +10 -10
- data/ext/libxml/ruby_xml_namespaces.c +293 -293
- data/ext/libxml/ruby_xml_namespaces.h +9 -9
- data/ext/libxml/ruby_xml_node.c +1406 -1452
- data/ext/libxml/ruby_xml_node.h +13 -11
- data/ext/libxml/ruby_xml_parser.c +91 -94
- data/ext/libxml/ruby_xml_parser.h +12 -12
- data/ext/libxml/ruby_xml_parser_context.c +999 -1001
- data/ext/libxml/ruby_xml_parser_context.h +10 -10
- data/ext/libxml/ruby_xml_parser_options.c +66 -66
- data/ext/libxml/ruby_xml_parser_options.h +12 -12
- data/ext/libxml/ruby_xml_reader.c +1239 -1228
- data/ext/libxml/ruby_xml_reader.h +17 -17
- data/ext/libxml/ruby_xml_relaxng.c +110 -111
- data/ext/libxml/ruby_xml_relaxng.h +10 -10
- data/ext/libxml/ruby_xml_sax2_handler.c +326 -328
- data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
- data/ext/libxml/ruby_xml_sax_parser.c +116 -120
- data/ext/libxml/ruby_xml_sax_parser.h +10 -10
- data/ext/libxml/ruby_xml_schema.c +350 -301
- data/ext/libxml/ruby_xml_schema.h +806 -809
- data/ext/libxml/ruby_xml_schema_attribute.c +61 -109
- data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
- data/ext/libxml/ruby_xml_schema_element.c +69 -94
- data/ext/libxml/ruby_xml_schema_element.h +14 -14
- data/ext/libxml/ruby_xml_schema_facet.c +46 -52
- data/ext/libxml/ruby_xml_schema_facet.h +13 -13
- data/ext/libxml/ruby_xml_schema_type.c +214 -259
- data/ext/libxml/ruby_xml_schema_type.h +9 -9
- data/ext/libxml/ruby_xml_version.h +9 -9
- data/ext/libxml/ruby_xml_writer.c +1133 -1137
- data/ext/libxml/ruby_xml_writer.h +10 -10
- data/ext/libxml/ruby_xml_xinclude.c +16 -16
- data/ext/libxml/ruby_xml_xinclude.h +11 -11
- data/ext/libxml/ruby_xml_xpath.c +194 -188
- data/ext/libxml/ruby_xml_xpath.h +13 -13
- data/ext/libxml/ruby_xml_xpath_context.c +360 -361
- data/ext/libxml/ruby_xml_xpath_context.h +9 -9
- data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
- data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
- data/ext/libxml/ruby_xml_xpath_object.c +338 -335
- data/ext/libxml/ruby_xml_xpath_object.h +17 -17
- data/ext/libxml/ruby_xml_xpointer.c +99 -99
- data/ext/libxml/ruby_xml_xpointer.h +11 -11
- data/ext/vc/libxml_ruby.sln +17 -15
- data/lib/libxml/node.rb +2 -78
- data/lib/libxml/parser.rb +0 -266
- data/lib/libxml/sax_parser.rb +0 -17
- data/lib/libxml/schema/attribute.rb +19 -19
- data/lib/libxml/schema/element.rb +19 -27
- data/lib/libxml/schema/type.rb +21 -29
- data/lib/libxml/schema.rb +47 -66
- data/lib/libxml-ruby.rb +30 -0
- data/lib/libxml.rb +3 -33
- data/libxml-ruby.gemspec +48 -44
- data/script/benchmark/depixelate +634 -634
- data/script/benchmark/hamlet.xml +9054 -9054
- data/script/benchmark/parsecount +170 -170
- data/script/benchmark/throughput +41 -41
- data/script/test +6 -6
- data/setup.rb +0 -1
- data/test/c14n/given/example-1.xml +14 -14
- data/test/c14n/given/example-2.xml +11 -11
- data/test/c14n/given/example-3.xml +18 -18
- data/test/c14n/given/example-4.xml +9 -9
- data/test/c14n/given/example-5.xml +12 -12
- data/test/c14n/given/example-6.xml +2 -2
- data/test/c14n/given/example-7.xml +11 -11
- data/test/c14n/given/example-8.xml +11 -11
- data/test/c14n/given/example-8.xpath +9 -9
- data/test/c14n/result/1-1-without-comments/example-1 +3 -3
- data/test/c14n/result/1-1-without-comments/example-2 +10 -10
- data/test/c14n/result/1-1-without-comments/example-3 +13 -13
- data/test/c14n/result/1-1-without-comments/example-4 +8 -8
- data/test/c14n/result/1-1-without-comments/example-5 +2 -2
- data/test/c14n/result/with-comments/example-1 +5 -5
- data/test/c14n/result/with-comments/example-2 +10 -10
- data/test/c14n/result/with-comments/example-3 +13 -13
- data/test/c14n/result/with-comments/example-4 +8 -8
- data/test/c14n/result/with-comments/example-5 +3 -3
- data/test/c14n/result/without-comments/example-1 +3 -3
- data/test/c14n/result/without-comments/example-2 +10 -10
- data/test/c14n/result/without-comments/example-3 +13 -13
- data/test/c14n/result/without-comments/example-4 +8 -8
- data/test/c14n/result/without-comments/example-5 +2 -2
- data/test/model/atom.xml +12 -12
- data/test/model/bands.iso-8859-1.xml +4 -4
- data/test/model/bands.utf-8.xml +4 -4
- data/test/model/bands.xml +4 -4
- data/test/model/books.xml +153 -153
- data/test/model/cwm_1_0.xml +11336 -0
- data/test/model/merge_bug_data.xml +58 -58
- data/test/model/ruby-lang.html +238 -238
- data/test/model/rubynet.xml +79 -79
- data/test/model/shiporder.rnc +28 -28
- data/test/model/shiporder.rng +86 -86
- data/test/model/shiporder.xml +22 -22
- data/test/model/shiporder.xsd +44 -40
- data/test/model/shiporder_bad.xsd +40 -0
- data/test/model/shiporder_import.xsd +45 -0
- data/test/model/soap.xml +27 -27
- data/test/model/xinclude.xml +4 -4
- data/test/{tc_attr.rb → test_attr.rb} +23 -25
- data/test/{tc_attr_decl.rb → test_attr_decl.rb} +13 -14
- data/test/{tc_attributes.rb → test_attributes.rb} +11 -18
- data/test/{tc_canonicalize.rb → test_canonicalize.rb} +36 -41
- data/test/test_deprecated_require.rb +12 -0
- data/test/{tc_document.rb → test_document.rb} +33 -27
- data/test/test_document_write.rb +146 -0
- data/test/{tc_dtd.rb → test_dtd.rb} +29 -29
- data/test/{tc_encoding.rb → test_encoding.rb} +129 -126
- data/test/{tc_encoding_sax.rb → test_encoding_sax.rb} +7 -6
- data/test/test_error.rb +178 -0
- data/test/test_helper.rb +4 -9
- data/test/test_html_parser.rb +162 -0
- data/test/test_html_parser_context.rb +23 -0
- data/test/test_namespace.rb +60 -0
- data/test/{tc_namespaces.rb → test_namespaces.rb} +34 -44
- data/test/{tc_node.rb → test_node.rb} +68 -47
- data/test/{tc_node_cdata.rb → test_node_cdata.rb} +12 -13
- data/test/{tc_node_comment.rb → test_node_comment.rb} +7 -8
- data/test/{tc_node_copy.rb → test_node_copy.rb} +4 -6
- data/test/{tc_node_edit.rb → test_node_edit.rb} +23 -41
- data/test/{tc_node_pi.rb → test_node_pi.rb} +37 -40
- data/test/{tc_node_text.rb → test_node_text.rb} +10 -12
- data/test/{tc_node_write.rb → test_node_write.rb} +18 -29
- data/test/test_node_xlink.rb +28 -0
- data/test/test_parser.rb +324 -0
- data/test/{tc_parser_context.rb → test_parser_context.rb} +42 -49
- data/test/{tc_properties.rb → test_properties.rb} +6 -7
- data/test/test_reader.rb +364 -0
- data/test/test_relaxng.rb +53 -0
- data/test/{tc_sax_parser.rb → test_sax_parser.rb} +44 -38
- data/test/test_schema.rb +231 -0
- data/test/test_suite.rb +38 -40
- data/test/{tc_traversal.rb → test_traversal.rb} +5 -6
- data/test/{tc_writer.rb → test_writer.rb} +468 -448
- data/test/{tc_xinclude.rb → test_xinclude.rb} +4 -5
- data/test/test_xml.rb +263 -0
- data/test/{tc_xpath.rb → test_xpath.rb} +31 -32
- data/test/{tc_xpath_context.rb → test_xpath_context.rb} +8 -9
- data/test/test_xpath_expression.rb +37 -0
- data/test/{tc_xpointer.rb → test_xpointer.rb} +16 -18
- metadata +122 -100
- data/lib/libxml/ns.rb +0 -22
- data/lib/libxml/properties.rb +0 -23
- data/lib/libxml/reader.rb +0 -29
- data/lib/libxml/xpath_object.rb +0 -16
- data/test/etc_doc_to_s.rb +0 -21
- data/test/ets_doc_file.rb +0 -17
- data/test/ets_doc_to_s.rb +0 -23
- data/test/ets_gpx.rb +0 -28
- data/test/ets_node_gc.rb +0 -23
- data/test/ets_test.xml +0 -2
- data/test/ets_tsr.rb +0 -11
- data/test/tc_deprecated_require.rb +0 -13
- data/test/tc_document_write.rb +0 -196
- data/test/tc_error.rb +0 -180
- data/test/tc_html_parser.rb +0 -153
- data/test/tc_html_parser_context.rb +0 -24
- data/test/tc_namespace.rb +0 -62
- data/test/tc_node_xlink.rb +0 -29
- data/test/tc_parser.rb +0 -381
- data/test/tc_reader.rb +0 -400
- data/test/tc_relaxng.rb +0 -54
- data/test/tc_schema.rb +0 -162
- data/test/tc_xml.rb +0 -226
- data/test/tc_xpath_expression.rb +0 -38
data/test/test_reader.rb
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require_relative './test_helper'
|
|
4
|
+
require 'stringio'
|
|
5
|
+
|
|
6
|
+
class TestReader < Minitest::Test
|
|
7
|
+
XML_FILE = File.join(File.dirname(__FILE__), 'model/atom.xml')
|
|
8
|
+
|
|
9
|
+
def verify_simple(reader)
|
|
10
|
+
node_types = []
|
|
11
|
+
|
|
12
|
+
# Read each node
|
|
13
|
+
26.times do
|
|
14
|
+
assert(reader.read)
|
|
15
|
+
node_types << reader.node_type
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# There are no more nodes
|
|
19
|
+
assert(!reader.read)
|
|
20
|
+
|
|
21
|
+
# Check what was read
|
|
22
|
+
expected = [LibXML::XML::Reader::TYPE_PROCESSING_INSTRUCTION,
|
|
23
|
+
LibXML::XML::Reader::TYPE_ELEMENT,
|
|
24
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
25
|
+
LibXML::XML::Reader::TYPE_COMMENT,
|
|
26
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
27
|
+
LibXML::XML::Reader::TYPE_ELEMENT,
|
|
28
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
29
|
+
LibXML::XML::Reader::TYPE_ELEMENT,
|
|
30
|
+
LibXML::XML::Reader::TYPE_CDATA,
|
|
31
|
+
LibXML::XML::Reader::TYPE_END_ELEMENT,
|
|
32
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
33
|
+
LibXML::XML::Reader::TYPE_ELEMENT,
|
|
34
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
35
|
+
LibXML::XML::Reader::TYPE_ELEMENT,
|
|
36
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
37
|
+
LibXML::XML::Reader::TYPE_ELEMENT,
|
|
38
|
+
LibXML::XML::Reader::TYPE_TEXT,
|
|
39
|
+
LibXML::XML::Reader::TYPE_END_ELEMENT,
|
|
40
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
41
|
+
LibXML::XML::Reader::TYPE_END_ELEMENT,
|
|
42
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
43
|
+
LibXML::XML::Reader::TYPE_END_ELEMENT,
|
|
44
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
45
|
+
LibXML::XML::Reader::TYPE_END_ELEMENT,
|
|
46
|
+
LibXML::XML::Reader::TYPE_SIGNIFICANT_WHITESPACE,
|
|
47
|
+
LibXML::XML::Reader::TYPE_END_ELEMENT]
|
|
48
|
+
|
|
49
|
+
assert_equal(expected, node_types)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_document
|
|
53
|
+
reader = LibXML::XML::Reader.document(LibXML::XML::Document.file(XML_FILE))
|
|
54
|
+
verify_simple(reader)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_file
|
|
58
|
+
reader = LibXML::XML::Reader.file(XML_FILE)
|
|
59
|
+
verify_simple(reader)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_invalid_file
|
|
63
|
+
assert_raises(LibXML::XML::Error) do
|
|
64
|
+
LibXML::XML::Reader.file('/does/not/exist')
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_string
|
|
69
|
+
reader = LibXML::XML::Reader.string(File.read(XML_FILE))
|
|
70
|
+
verify_simple(reader)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_io
|
|
74
|
+
File.open(XML_FILE, 'rb') do |io|
|
|
75
|
+
reader = LibXML::XML::Reader.io(io)
|
|
76
|
+
verify_simple(reader)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_io_gc
|
|
81
|
+
# Test that the reader keeps a reference
|
|
82
|
+
# to the io object
|
|
83
|
+
file = File.open(XML_FILE, 'rb')
|
|
84
|
+
reader = LibXML::XML::Reader.io(file)
|
|
85
|
+
file = nil
|
|
86
|
+
GC.start
|
|
87
|
+
assert(reader.read)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_string_io
|
|
91
|
+
data = File.read(XML_FILE)
|
|
92
|
+
string_io = StringIO.new(data)
|
|
93
|
+
reader = LibXML::XML::Reader.io(string_io)
|
|
94
|
+
verify_simple(reader)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_error
|
|
98
|
+
reader = LibXML::XML::Reader.string('<foo blah')
|
|
99
|
+
|
|
100
|
+
error = assert_raises(LibXML::XML::Error) do
|
|
101
|
+
reader.read
|
|
102
|
+
end
|
|
103
|
+
assert_equal("Fatal error: Couldn't find end of Start Tag foo at :1.", error.to_s)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_attr
|
|
107
|
+
parser = LibXML::XML::Reader.string("<foo x='1' y='2'/>")
|
|
108
|
+
assert(parser.read)
|
|
109
|
+
assert_equal('foo', parser.name)
|
|
110
|
+
assert_equal('1', parser['x'])
|
|
111
|
+
assert_equal('1', parser[0])
|
|
112
|
+
assert_equal('2', parser['y'])
|
|
113
|
+
assert_equal('2', parser[1])
|
|
114
|
+
assert_nil(parser['z'])
|
|
115
|
+
assert_nil(parser[2])
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_move_attr
|
|
119
|
+
reader = LibXML::XML::Reader.string('<root xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xhtml="http://www.w3.org/1999/xhtml"><link xml:id="abc" xlink:href="def" xhtml:class="ghi" bar="jkl" /></root>')
|
|
120
|
+
assert(reader.read) # <root/>
|
|
121
|
+
assert(reader.read) # <link/>
|
|
122
|
+
|
|
123
|
+
assert(reader.move_to_attribute_no(1))
|
|
124
|
+
assert_equal(reader.value, 'def')
|
|
125
|
+
assert(reader.move_to_attribute_ns('id', 'http://www.w3.org/XML/1998/namespace'))
|
|
126
|
+
assert_equal(reader.value, 'abc')
|
|
127
|
+
assert(reader.move_to_attribute('bar'))
|
|
128
|
+
assert_equal(reader.value, 'jkl')
|
|
129
|
+
|
|
130
|
+
# 1 in case of success, -1 in case of error, 0 if not found
|
|
131
|
+
assert_equal(reader.move_to_attribute_no(12), 0)
|
|
132
|
+
assert_equal(reader.move_to_attribute('baz'), 0)
|
|
133
|
+
assert_equal(reader.move_to_attribute_ns('baz', 'http://ruby/namespace'), 0)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test_get_attr
|
|
137
|
+
reader = LibXML::XML::Reader.string('<root xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xhtml="http://www.w3.org/1999/xhtml"><link xml:id="abc" xlink:href="def" xhtml:class="ghi" bar="jkl" /></root>')
|
|
138
|
+
assert(reader.read) # <root/>
|
|
139
|
+
assert(reader.read) # <link/>
|
|
140
|
+
|
|
141
|
+
assert_equal(reader.get_attribute_no(1), 'def')
|
|
142
|
+
assert_equal(reader.get_attribute_ns('id', 'http://www.w3.org/XML/1998/namespace'), 'abc')
|
|
143
|
+
assert_equal(reader.get_attribute('bar'), 'jkl')
|
|
144
|
+
|
|
145
|
+
assert_nil(reader.get_attribute_no(12))
|
|
146
|
+
assert_nil(reader.get_attribute('baz'))
|
|
147
|
+
assert_nil(reader.get_attribute_ns('baz', 'http://ruby/namespace'))
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def test_value
|
|
151
|
+
parser = LibXML::XML::Reader.string("<foo><bar>1</bar><bar>2</bar><bar>3</bar></foo>")
|
|
152
|
+
assert(parser.read)
|
|
153
|
+
assert_equal('foo', parser.name)
|
|
154
|
+
assert_nil(parser.value)
|
|
155
|
+
3.times do |i|
|
|
156
|
+
assert(parser.read)
|
|
157
|
+
assert_equal(LibXML::XML::Reader::TYPE_ELEMENT, parser.node_type)
|
|
158
|
+
assert_equal('bar', parser.name)
|
|
159
|
+
assert(parser.read)
|
|
160
|
+
assert_equal(LibXML::XML::Reader::TYPE_TEXT, parser.node_type)
|
|
161
|
+
assert_equal((i + 1).to_s, parser.value)
|
|
162
|
+
assert(parser.read)
|
|
163
|
+
assert_equal(LibXML::XML::Reader::TYPE_END_ELEMENT, parser.node_type)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def test_expand
|
|
168
|
+
reader = LibXML::XML::Reader.file(XML_FILE)
|
|
169
|
+
reader.read.to_s
|
|
170
|
+
reader.read
|
|
171
|
+
|
|
172
|
+
# Read a node
|
|
173
|
+
node = reader.expand
|
|
174
|
+
refute_nil(node.doc)
|
|
175
|
+
assert_equal('feed', node.name)
|
|
176
|
+
assert_equal(::Encoding::UTF_8, node.name.encoding) if defined?(::Encoding)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def test_expand_find
|
|
180
|
+
reader = LibXML::XML::Reader.file(XML_FILE)
|
|
181
|
+
reader.read.to_s
|
|
182
|
+
reader.read
|
|
183
|
+
|
|
184
|
+
# Read first node which
|
|
185
|
+
node = reader.expand
|
|
186
|
+
assert_equal('feed', node.name)
|
|
187
|
+
|
|
188
|
+
# We need to create document to use xpath
|
|
189
|
+
reader.doc
|
|
190
|
+
|
|
191
|
+
# Search for entries
|
|
192
|
+
entries = node.find('atom:entry', 'atom:http://www.w3.org/2005/Atom')
|
|
193
|
+
|
|
194
|
+
assert_equal(1, entries.length)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def test_expand_invalid
|
|
198
|
+
reader = LibXML::XML::Reader.file(XML_FILE)
|
|
199
|
+
|
|
200
|
+
# Expand a node before one has been read
|
|
201
|
+
node = reader.expand
|
|
202
|
+
assert_nil(node)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def test_expand_should_be_invalid
|
|
206
|
+
reader = LibXML::XML::Reader.file(XML_FILE)
|
|
207
|
+
|
|
208
|
+
# Read a couple of nodes
|
|
209
|
+
reader.read
|
|
210
|
+
reader.read
|
|
211
|
+
|
|
212
|
+
# Expand the node
|
|
213
|
+
node = reader.expand
|
|
214
|
+
assert_equal('feed', node.name)
|
|
215
|
+
|
|
216
|
+
# Read another node, this makes the last node invalid
|
|
217
|
+
reader.next
|
|
218
|
+
|
|
219
|
+
# The previous node is now invalid - this should be an error but isn't
|
|
220
|
+
assert_equal('feed', node.name)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def test_expand_incorrectly_use_returned_node
|
|
224
|
+
file = File.join(File.dirname(__FILE__), 'model/cwm_1_0.xml')
|
|
225
|
+
reader = LibXML::XML::Reader.file(file)
|
|
226
|
+
|
|
227
|
+
nodes = Array.new
|
|
228
|
+
while reader.read
|
|
229
|
+
node = reader.expand
|
|
230
|
+
refute_nil(node)
|
|
231
|
+
refute_nil(node.doc)
|
|
232
|
+
|
|
233
|
+
# NOTE - DO NOT do this in real code, these nodes are invalid after the next read. This *will* cause
|
|
234
|
+
# a segmentation fault next time the garbage collector runs. The reason is the parent node will be
|
|
235
|
+
# called in the mark phase, but its underlying xml node will be gone. Same goes for calling children,
|
|
236
|
+
# attributes, etc. You must let go of the expanded node *before* calling xml reader again and
|
|
237
|
+
# call the garbage collector to be safe.
|
|
238
|
+
#refute_nil(node.parent)
|
|
239
|
+
nodes << node
|
|
240
|
+
end
|
|
241
|
+
assert(true)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def test_mode
|
|
245
|
+
reader = LibXML::XML::Reader.string('<xml/>')
|
|
246
|
+
assert_equal(LibXML::XML::Reader::MODE_INITIAL, reader.read_state)
|
|
247
|
+
reader.read
|
|
248
|
+
assert_equal(LibXML::XML::Reader::MODE_EOF, reader.read_state)
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def test_bytes_consumed
|
|
252
|
+
ending_are_rn = File.binread(XML_FILE).include? "\r\n"
|
|
253
|
+
reader = LibXML::XML::Reader.file(XML_FILE)
|
|
254
|
+
reader.read
|
|
255
|
+
assert_equal(ending_are_rn ? 428 : 416, reader.byte_consumed)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def test_node
|
|
259
|
+
LibXML::XML.default_line_numbers = true
|
|
260
|
+
reader = LibXML::XML::Reader.file(XML_FILE)
|
|
261
|
+
|
|
262
|
+
# first try to get a node
|
|
263
|
+
assert_nil(reader.node)
|
|
264
|
+
|
|
265
|
+
reader.read
|
|
266
|
+
assert_instance_of(LibXML::XML::Node, reader.node)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def test_base_uri
|
|
270
|
+
# UTF8:
|
|
271
|
+
# ö - c3 b6 in hex, \303\266 in octal
|
|
272
|
+
# ü - c3 bc in hex, \303\274 in octal
|
|
273
|
+
xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><bands genre=\"metal\">\n <m\303\266tley_cr\303\274e country=\"us\">An American heavy metal band formed in Los Angeles, California in 1981.</m\303\266tley_cr\303\274e>\n <iron_maiden country=\"uk\">British heavy metal band formed in 1975.</iron_maiden>\n</bands>"
|
|
274
|
+
reader = LibXML::XML::Reader.string(xml, :base_uri => "http://libxml.rubyforge.org")
|
|
275
|
+
|
|
276
|
+
reader.read
|
|
277
|
+
assert_equal(reader.base_uri, "http://libxml.rubyforge.org")
|
|
278
|
+
assert_equal(::Encoding::UTF_8, reader.base_uri.encoding) if defined?(::Encoding)
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def test_options
|
|
282
|
+
xml = <<-EOS
|
|
283
|
+
<!DOCTYPE foo [<!ENTITY foo 'bar'>]>
|
|
284
|
+
<test>
|
|
285
|
+
<cdata><![CDATA[something]]></cdata>
|
|
286
|
+
<entity>&foo;</entity>
|
|
287
|
+
</test>
|
|
288
|
+
EOS
|
|
289
|
+
|
|
290
|
+
# Parse normally
|
|
291
|
+
reader = LibXML::XML::Reader.string(xml)
|
|
292
|
+
reader.read # foo
|
|
293
|
+
reader.read # test
|
|
294
|
+
reader.read # text
|
|
295
|
+
reader.read # cdata
|
|
296
|
+
reader.read # cdata-section
|
|
297
|
+
assert_equal(LibXML::XML::Node::CDATA_SECTION_NODE, reader.node_type)
|
|
298
|
+
|
|
299
|
+
# Convert cdata section to text
|
|
300
|
+
reader = LibXML::XML::Reader.string(xml, :options => LibXML::XML::Parser::Options::NOCDATA)
|
|
301
|
+
reader.read # foo
|
|
302
|
+
reader.read # test
|
|
303
|
+
reader.read # text
|
|
304
|
+
reader.read # cdata
|
|
305
|
+
reader.read # cdata-section
|
|
306
|
+
assert_equal(LibXML::XML::Node::TEXT_NODE, reader.node_type)
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def test_encoding
|
|
310
|
+
# ISO_8859_1:
|
|
311
|
+
# ö - f6 in hex, \366 in octal
|
|
312
|
+
# ü - fc in hex, \374 in octal
|
|
313
|
+
xml = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><bands genre=\"metal\">\n <m\366tley_cr\374e country=\"us\">An American heavy metal band formed in Los Angeles, California in 1981.</m\366tley_cr\374e>\n <iron_maiden country=\"uk\">British heavy metal band formed in 1975.</iron_maiden>\n</bands>"
|
|
314
|
+
|
|
315
|
+
reader = LibXML::XML::Reader.string(xml, :encoding => LibXML::XML::Encoding::ISO_8859_1)
|
|
316
|
+
reader.read
|
|
317
|
+
|
|
318
|
+
assert_equal(Encoding::ISO8859_1, reader.read_outer_xml.encoding)
|
|
319
|
+
assert_equal(Encoding::ISO8859_1, reader.read_inner_xml.encoding)
|
|
320
|
+
assert_equal(Encoding::ISO8859_1, reader.read_string.encoding)
|
|
321
|
+
|
|
322
|
+
assert_equal("<bands genre=\"metal\">\n <m\xC3\xB6tley_cr\xC3\xBCe country=\"us\">An American heavy metal band formed in Los Angeles, California in 1981.</m\xC3\xB6tley_cr\xC3\xBCe>\n <iron_maiden country=\"uk\">British heavy metal band formed in 1975.</iron_maiden>\n</bands>".force_encoding(Encoding::ISO8859_1),
|
|
323
|
+
reader.read_outer_xml)
|
|
324
|
+
assert_equal("\n <m\xC3\xB6tley_cr\xC3\xBCe country=\"us\">An American heavy metal band formed in Los Angeles, California in 1981.</m\xC3\xB6tley_cr\xC3\xBCe>\n <iron_maiden country=\"uk\">British heavy metal band formed in 1975.</iron_maiden>\n".force_encoding(Encoding::ISO8859_1),
|
|
325
|
+
reader.read_inner_xml)
|
|
326
|
+
assert_equal("\n An American heavy metal band formed in Los Angeles, California in 1981.\n British heavy metal band formed in 1975.\n".force_encoding(Encoding::ISO8859_1),
|
|
327
|
+
reader.read_string)
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def test_invalid_encoding
|
|
331
|
+
# ISO_8859_1:
|
|
332
|
+
# ö - f6 in hex, \366 in octal
|
|
333
|
+
# ü - fc in hex, \374 in octal
|
|
334
|
+
xml = "<bands genre=\"metal\">\n <m\366tley_cr\374e country=\"us\">An American heavy metal band formed in Los Angeles, California in 1981.</m\366tley_cr\374e>\n <iron_maiden country=\"uk\">British heavy metal band formed in 1975.</iron_maiden>\n</bands>"
|
|
335
|
+
|
|
336
|
+
reader = LibXML::XML::Reader.string(xml)
|
|
337
|
+
error = assert_raises(LibXML::XML::Error) do
|
|
338
|
+
reader.read
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
assert_equal("Fatal error: Input is not proper UTF-8, indicate encoding !\nBytes: 0xF6 0x74 0x6C 0x65 at :2.",
|
|
342
|
+
error.to_s)
|
|
343
|
+
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def test_file_encoding
|
|
347
|
+
reader = LibXML::XML::Reader.file(XML_FILE)
|
|
348
|
+
reader.read
|
|
349
|
+
assert_equal(LibXML::XML::Encoding::UTF_8, reader.encoding)
|
|
350
|
+
assert_equal(Encoding::UTF_8, reader.value.encoding)
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
def test_string_encoding
|
|
354
|
+
# ISO_8859_1:
|
|
355
|
+
# ö - f6 in hex, \366 in octal
|
|
356
|
+
# ü - fc in hex, \374 in octal
|
|
357
|
+
xml = "<bands genre=\"metal\">\n <m\366tley_cr\374e country=\"us\">An American heavy metal band formed in Los Angeles, California in 1981.</m\366tley_cr\374e>\n <iron_maiden country=\"uk\">British heavy metal band formed in 1975.</iron_maiden>\n</bands>"
|
|
358
|
+
reader = LibXML::XML::Reader.string(xml, :encoding => LibXML::XML::Encoding::ISO_8859_1)
|
|
359
|
+
reader.read
|
|
360
|
+
|
|
361
|
+
# Encoding is always null for strings, very annoying!
|
|
362
|
+
assert_equal(reader.encoding, LibXML::XML::Encoding::NONE)
|
|
363
|
+
end
|
|
364
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require_relative './test_helper'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestRelaxNG < Minitest::Test
|
|
7
|
+
def setup
|
|
8
|
+
file = File.join(File.dirname(__FILE__), 'model/shiporder.xml')
|
|
9
|
+
@doc = LibXML::XML::Document.file(file)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
@doc = nil
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def relaxng
|
|
17
|
+
document = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/shiporder.rng'))
|
|
18
|
+
LibXML::XML::RelaxNG.document(document)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_from_doc
|
|
22
|
+
assert_instance_of(LibXML::XML::RelaxNG, relaxng)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_valid
|
|
26
|
+
assert(@doc.validate_relaxng(relaxng))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_invalid
|
|
30
|
+
new_node = LibXML::XML::Node.new('invalid', 'this will mess up validation')
|
|
31
|
+
@doc.root << new_node
|
|
32
|
+
|
|
33
|
+
error = assert_raises(LibXML::XML::Error) do
|
|
34
|
+
@doc.validate_relaxng(relaxng)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
refute_nil(error)
|
|
38
|
+
assert_kind_of(LibXML::XML::Error, error)
|
|
39
|
+
assert(error.message.match(/Error: Did not expect element invalid there/))
|
|
40
|
+
assert_equal(LibXML::XML::Error::RELAXNGV, error.domain)
|
|
41
|
+
assert_equal(LibXML::XML::Error::LT_IN_ATTRIBUTE, error.code)
|
|
42
|
+
assert_equal(LibXML::XML::Error::ERROR, error.level)
|
|
43
|
+
assert(error.file.match(/shiporder\.xml/))
|
|
44
|
+
assert_nil(error.line)
|
|
45
|
+
assert_equal('invalid', error.str1)
|
|
46
|
+
assert_nil(error.str2)
|
|
47
|
+
assert_nil(error.str3)
|
|
48
|
+
assert_equal(0, error.int1)
|
|
49
|
+
assert_equal(0, error.int2)
|
|
50
|
+
refute_nil(error.node)
|
|
51
|
+
assert_equal('invalid', error.node.name)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative './test_helper'
|
|
4
4
|
require 'stringio'
|
|
5
|
-
require 'test/unit'
|
|
6
5
|
|
|
7
6
|
class DocTypeCallback
|
|
8
|
-
include XML::SaxParser::Callbacks
|
|
7
|
+
include LibXML::XML::SaxParser::Callbacks
|
|
9
8
|
def on_start_element(element, attributes)
|
|
10
9
|
end
|
|
11
10
|
end
|
|
12
11
|
|
|
13
12
|
class TestCaseCallbacks
|
|
14
|
-
include XML::SaxParser::Callbacks
|
|
13
|
+
include LibXML::XML::SaxParser::Callbacks
|
|
15
14
|
|
|
16
15
|
attr_accessor :result
|
|
17
16
|
|
|
@@ -68,7 +67,7 @@ class TestCaseCallbacks
|
|
|
68
67
|
end
|
|
69
68
|
end
|
|
70
69
|
|
|
71
|
-
class TestSaxParser < Test
|
|
70
|
+
class TestSaxParser < Minitest::Test
|
|
72
71
|
def saxtest_file
|
|
73
72
|
File.join(File.dirname(__FILE__), 'model/atom.xml')
|
|
74
73
|
end
|
|
@@ -120,28 +119,28 @@ class TestSaxParser < Test::Unit::TestCase
|
|
|
120
119
|
end
|
|
121
120
|
|
|
122
121
|
def test_file
|
|
123
|
-
parser = XML::SaxParser.file(saxtest_file)
|
|
122
|
+
parser = LibXML::XML::SaxParser.file(saxtest_file)
|
|
124
123
|
parser.callbacks = TestCaseCallbacks.new
|
|
125
124
|
parser.parse
|
|
126
125
|
verify(parser)
|
|
127
126
|
end
|
|
128
127
|
|
|
129
128
|
def test_file_no_callbacks
|
|
130
|
-
parser = XML::SaxParser.file(saxtest_file)
|
|
129
|
+
parser = LibXML::XML::SaxParser.file(saxtest_file)
|
|
131
130
|
assert_equal true, parser.parse
|
|
132
131
|
end
|
|
133
132
|
|
|
134
133
|
def test_noexistent_file
|
|
135
|
-
error =
|
|
136
|
-
XML::SaxParser.file('i_dont_exist.xml')
|
|
134
|
+
error = assert_raises(LibXML::XML::Error) do
|
|
135
|
+
LibXML::XML::SaxParser.file('i_dont_exist.xml')
|
|
137
136
|
end
|
|
138
137
|
|
|
139
138
|
assert_equal('Warning: failed to load external entity "i_dont_exist.xml".', error.to_s)
|
|
140
139
|
end
|
|
141
140
|
|
|
142
141
|
def test_nil_file
|
|
143
|
-
error =
|
|
144
|
-
XML::SaxParser.file(nil)
|
|
142
|
+
error = assert_raises(TypeError) do
|
|
143
|
+
LibXML::XML::SaxParser.file(nil)
|
|
145
144
|
end
|
|
146
145
|
|
|
147
146
|
assert_match(/nil into String/, error.to_s)
|
|
@@ -149,7 +148,7 @@ class TestSaxParser < Test::Unit::TestCase
|
|
|
149
148
|
|
|
150
149
|
def test_io
|
|
151
150
|
File.open(saxtest_file) do |file|
|
|
152
|
-
parser = XML::SaxParser.io(file)
|
|
151
|
+
parser = LibXML::XML::SaxParser.io(file)
|
|
153
152
|
parser.callbacks = TestCaseCallbacks.new
|
|
154
153
|
parser.parse
|
|
155
154
|
verify(parser)
|
|
@@ -157,8 +156,8 @@ class TestSaxParser < Test::Unit::TestCase
|
|
|
157
156
|
end
|
|
158
157
|
|
|
159
158
|
def test_nil_io
|
|
160
|
-
error =
|
|
161
|
-
XML::HTMLParser.io(nil)
|
|
159
|
+
error = assert_raises(TypeError) do
|
|
160
|
+
LibXML::XML::HTMLParser.io(nil)
|
|
162
161
|
end
|
|
163
162
|
|
|
164
163
|
assert_equal("Must pass in an IO object", error.to_s)
|
|
@@ -166,13 +165,13 @@ class TestSaxParser < Test::Unit::TestCase
|
|
|
166
165
|
|
|
167
166
|
def test_string_no_callbacks
|
|
168
167
|
xml = File.read(saxtest_file)
|
|
169
|
-
parser = XML::SaxParser.string(xml)
|
|
168
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
|
170
169
|
assert_equal true, parser.parse
|
|
171
170
|
end
|
|
172
171
|
|
|
173
172
|
def test_string
|
|
174
173
|
xml = File.read(saxtest_file)
|
|
175
|
-
parser = XML::SaxParser.string(xml)
|
|
174
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
|
176
175
|
parser.callbacks = TestCaseCallbacks.new
|
|
177
176
|
parser.parse
|
|
178
177
|
verify(parser)
|
|
@@ -181,16 +180,16 @@ class TestSaxParser < Test::Unit::TestCase
|
|
|
181
180
|
def test_string_io
|
|
182
181
|
xml = File.read(saxtest_file)
|
|
183
182
|
io = StringIO.new(xml)
|
|
184
|
-
parser = XML::SaxParser.io(io)
|
|
185
|
-
|
|
183
|
+
parser = LibXML::XML::SaxParser.io(io)
|
|
184
|
+
|
|
186
185
|
parser.callbacks = TestCaseCallbacks.new
|
|
187
186
|
parser.parse
|
|
188
187
|
verify(parser)
|
|
189
188
|
end
|
|
190
189
|
|
|
191
190
|
def test_nil_string
|
|
192
|
-
error =
|
|
193
|
-
XML::SaxParser.string(nil)
|
|
191
|
+
error = assert_raises(TypeError) do
|
|
192
|
+
LibXML::XML::SaxParser.string(nil)
|
|
194
193
|
end
|
|
195
194
|
|
|
196
195
|
assert_equal("wrong argument type nil (expected String)", error.to_s)
|
|
@@ -204,10 +203,10 @@ class TestSaxParser < Test::Unit::TestCase
|
|
|
204
203
|
<a>a1</a>
|
|
205
204
|
</Results>
|
|
206
205
|
EOS
|
|
207
|
-
parser = XML::SaxParser.string(xml)
|
|
206
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
|
208
207
|
parser.callbacks = DocTypeCallback.new
|
|
209
208
|
doc = parser.parse
|
|
210
|
-
|
|
209
|
+
refute_nil(doc)
|
|
211
210
|
end
|
|
212
211
|
|
|
213
212
|
def test_parse_warning
|
|
@@ -218,7 +217,7 @@ EOS
|
|
|
218
217
|
<Test/>
|
|
219
218
|
EOS
|
|
220
219
|
|
|
221
|
-
parser = XML::SaxParser.string(xml)
|
|
220
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
|
222
221
|
parser.callbacks = TestCaseCallbacks.new
|
|
223
222
|
|
|
224
223
|
parser.parse
|
|
@@ -240,36 +239,43 @@ EOS
|
|
|
240
239
|
xml = <<-EOS
|
|
241
240
|
<Results>
|
|
242
241
|
EOS
|
|
243
|
-
parser = XML::SaxParser.string(xml)
|
|
242
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
|
244
243
|
parser.callbacks = TestCaseCallbacks.new
|
|
245
244
|
|
|
246
|
-
error =
|
|
247
|
-
|
|
245
|
+
error = assert_raises(LibXML::XML::Error) do
|
|
246
|
+
parser.parse
|
|
248
247
|
end
|
|
249
248
|
|
|
250
249
|
# Check callbacks
|
|
251
250
|
result = parser.callbacks.result
|
|
252
251
|
|
|
253
252
|
i = -1
|
|
253
|
+
|
|
254
|
+
base_err_msg = "Fatal error: (Premature end of data in tag Results line 1|EndTag: '<\\/' not found) at :2\\."
|
|
255
|
+
re_err_msg1 = /\A(error: )#{base_err_msg}\z/
|
|
256
|
+
re_err_msg2 = /\A#{base_err_msg}\z/
|
|
257
|
+
|
|
254
258
|
assert_equal("startdoc", result[i+=1])
|
|
255
259
|
assert_equal("start_element: Results, attr: {}", result[i+=1])
|
|
256
260
|
assert_equal("start_element_ns: Results, attr: {}, prefix: , uri: , ns: {}", result[i+=1])
|
|
257
261
|
assert_equal("characters: \n", result[i+=1])
|
|
258
|
-
|
|
262
|
+
assert_match(re_err_msg1, result[i+=1])
|
|
259
263
|
assert_equal("end_document", result[i+=1])
|
|
260
264
|
|
|
261
|
-
|
|
262
|
-
assert_kind_of(XML::Error, error)
|
|
263
|
-
|
|
264
|
-
assert_equal(XML::Error::PARSER, error.domain)
|
|
265
|
-
|
|
266
|
-
|
|
265
|
+
refute_nil(error)
|
|
266
|
+
assert_kind_of(LibXML::XML::Error, error)
|
|
267
|
+
assert_match(re_err_msg2, error.message)
|
|
268
|
+
assert_equal(LibXML::XML::Error::PARSER, error.domain)
|
|
269
|
+
|
|
270
|
+
assert([LibXML::XML::Error::TAG_NOT_FINISHED, LibXML::XML::Error::LTSLASH_REQUIRED].include?(error.code))
|
|
271
|
+
assert_equal(LibXML::XML::Error::FATAL, error.level)
|
|
267
272
|
assert_nil(error.file)
|
|
268
273
|
assert_equal(2, error.line)
|
|
269
|
-
|
|
274
|
+
# Sometimes this is nil and sometimes its not depending on OS and libxlm version
|
|
275
|
+
# assert_nil(error.str1)
|
|
270
276
|
assert_nil(error.str2)
|
|
271
277
|
assert_nil(error.str3)
|
|
272
|
-
|
|
278
|
+
assert([0, 1].include?(error.int1))
|
|
273
279
|
assert_equal(1, error.int2)
|
|
274
280
|
assert_nil(error.node)
|
|
275
281
|
end
|
|
@@ -306,15 +312,15 @@ EOS
|
|
|
306
312
|
</Products>
|
|
307
313
|
EOS
|
|
308
314
|
|
|
309
|
-
parser = XML::SaxParser.string(xml)
|
|
315
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
|
310
316
|
parser.callbacks = TestCaseCallbacks.new
|
|
311
317
|
|
|
312
|
-
error =
|
|
318
|
+
error = assert_raises(LibXML::XML::Error) do
|
|
313
319
|
parser.parse
|
|
314
320
|
end
|
|
315
321
|
assert_equal("Fatal error: xmlParseEntityRef: no name at :5.", error.to_s)
|
|
316
322
|
|
|
317
323
|
# Check callbacks
|
|
318
|
-
|
|
324
|
+
parser.callbacks.result
|
|
319
325
|
end
|
|
320
326
|
end
|