libxml-ruby 3.0.0-x64-mingw32 → 3.2.2-x64-mingw32
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 +37 -0
- data/MANIFEST +34 -34
- data/README.rdoc +65 -36
- data/Rakefile +21 -3
- data/ext/libxml/extconf.rb +30 -26
- data/ext/libxml/ruby_libxml.h +0 -8
- data/ext/libxml/ruby_xml.c +40 -0
- data/ext/libxml/ruby_xml_document.c +1 -5
- data/ext/libxml/ruby_xml_dtd.c +6 -8
- data/ext/libxml/ruby_xml_encoding.c +1 -13
- data/ext/libxml/ruby_xml_encoding.h +0 -3
- data/ext/libxml/ruby_xml_error.c +1 -1
- data/ext/libxml/ruby_xml_error.h +1 -1
- data/ext/libxml/ruby_xml_io.c +14 -18
- data/ext/libxml/ruby_xml_io.h +1 -1
- data/ext/libxml/ruby_xml_node.c +16 -17
- data/ext/libxml/ruby_xml_parser_context.c +1 -1
- data/ext/libxml/ruby_xml_reader.c +7 -2
- data/ext/libxml/ruby_xml_schema.c +44 -66
- data/ext/libxml/ruby_xml_schema_element.c +15 -14
- data/ext/libxml/ruby_xml_schema_type.c +66 -93
- data/ext/libxml/ruby_xml_version.h +4 -4
- data/ext/libxml/ruby_xml_writer.c +189 -192
- data/lib/3.0/libxml_ruby.so +0 -0
- data/lib/libxml/schema/element.rb +0 -8
- data/lib/libxml/schema/type.rb +0 -8
- data/lib/libxml/schema.rb +0 -19
- data/lib/libxml-ruby.rb +30 -0
- data/lib/libxml.rb +3 -28
- data/libxml-ruby.gemspec +5 -4
- data/setup.rb +0 -1
- data/test/model/cwm_1_0.xml +11336 -0
- data/test/{tc_attr.rb → test_attr.rb} +18 -18
- data/test/{tc_attr_decl.rb → test_attr_decl.rb} +8 -8
- data/test/{tc_attributes.rb → test_attributes.rb} +10 -10
- data/test/{tc_canonicalize.rb → test_canonicalize.rb} +35 -39
- data/test/test_deprecated_require.rb +12 -0
- data/test/{tc_document.rb → test_document.rb} +31 -24
- data/test/test_document_write.rb +146 -0
- data/test/{tc_dtd.rb → test_dtd.rb} +26 -25
- data/test/{tc_encoding.rb → test_encoding.rb} +20 -17
- data/test/{tc_encoding_sax.rb → test_encoding_sax.rb} +3 -3
- data/test/test_error.rb +178 -0
- data/test/test_helper.rb +4 -11
- data/test/{tc_html_parser.rb → test_html_parser.rb} +31 -30
- data/test/test_html_parser_context.rb +23 -0
- data/test/test_namespace.rb +60 -0
- data/test/{tc_namespaces.rb → test_namespaces.rb} +29 -38
- data/test/{tc_node.rb → test_node.rb} +37 -31
- data/test/{tc_node_cdata.rb → test_node_cdata.rb} +10 -10
- data/test/{tc_node_comment.rb → test_node_comment.rb} +6 -6
- data/test/{tc_node_copy.rb → test_node_copy.rb} +3 -4
- data/test/{tc_node_edit.rb → test_node_edit.rb} +20 -21
- data/test/{tc_node_pi.rb → test_node_pi.rb} +8 -10
- data/test/{tc_node_text.rb → test_node_text.rb} +8 -9
- data/test/{tc_node_write.rb → test_node_write.rb} +16 -26
- data/test/test_node_xlink.rb +28 -0
- data/test/{tc_parser.rb → test_parser.rb} +72 -75
- data/test/{tc_parser_context.rb → test_parser_context.rb} +38 -44
- data/test/{tc_properties.rb → test_properties.rb} +5 -5
- data/test/test_reader.rb +364 -0
- data/test/{tc_relaxng.rb → test_relaxng.rb} +11 -11
- data/test/{tc_sax_parser.rb → test_sax_parser.rb} +38 -31
- data/test/{tc_schema.rb → test_schema.rb} +40 -33
- data/test/test_suite.rb +39 -40
- data/test/{tc_traversal.rb → test_traversal.rb} +4 -4
- data/test/{tc_writer.rb → test_writer.rb} +95 -74
- data/test/{tc_xinclude.rb → test_xinclude.rb} +3 -3
- data/test/test_xml.rb +263 -0
- data/test/{tc_xpath.rb → test_xpath.rb} +25 -25
- data/test/{tc_xpath_context.rb → test_xpath_context.rb} +5 -5
- data/test/{tc_xpath_expression.rb → test_xpath_expression.rb} +7 -7
- data/test/{tc_xpointer.rb → test_xpointer.rb} +15 -15
- metadata +92 -106
- data/lib/2.4/libxml_ruby.so +0 -0
- data/lib/libs/libiconv-2.dll +0 -0
- data/lib/libs/libxml2-2.dll +0 -0
- data/lib/libs/zlib1.dll +0 -0
- data/test/tc_deprecated_require.rb +0 -12
- data/test/tc_document_write.rb +0 -195
- data/test/tc_error.rb +0 -178
- data/test/tc_html_parser_context.rb +0 -23
- data/test/tc_namespace.rb +0 -61
- data/test/tc_node_xlink.rb +0 -28
- data/test/tc_reader.rb +0 -358
- data/test/tc_xml.rb +0 -225
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
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
|
3
|
+
require_relative './test_helper'
|
4
4
|
|
5
5
|
|
6
6
|
class TestRelaxNG < Minitest::Test
|
7
7
|
def setup
|
8
8
|
file = File.join(File.dirname(__FILE__), 'model/shiporder.xml')
|
9
|
-
@doc = XML::Document.file(file)
|
9
|
+
@doc = LibXML::XML::Document.file(file)
|
10
10
|
end
|
11
11
|
|
12
12
|
def teardown
|
@@ -14,12 +14,12 @@ class TestRelaxNG < Minitest::Test
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def relaxng
|
17
|
-
document = XML::Document.file(File.join(File.dirname(__FILE__), 'model/shiporder.rng'))
|
18
|
-
|
17
|
+
document = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/shiporder.rng'))
|
18
|
+
LibXML::XML::RelaxNG.document(document)
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_from_doc
|
22
|
-
assert_instance_of(XML::RelaxNG, relaxng)
|
22
|
+
assert_instance_of(LibXML::XML::RelaxNG, relaxng)
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_valid
|
@@ -27,19 +27,19 @@ class TestRelaxNG < Minitest::Test
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_invalid
|
30
|
-
new_node = XML::Node.new('invalid', 'this will mess up validation')
|
30
|
+
new_node = LibXML::XML::Node.new('invalid', 'this will mess up validation')
|
31
31
|
@doc.root << new_node
|
32
32
|
|
33
|
-
error = assert_raises(XML::Error) do
|
33
|
+
error = assert_raises(LibXML::XML::Error) do
|
34
34
|
@doc.validate_relaxng(relaxng)
|
35
35
|
end
|
36
36
|
|
37
37
|
refute_nil(error)
|
38
|
-
assert_kind_of(XML::Error, error)
|
38
|
+
assert_kind_of(LibXML::XML::Error, error)
|
39
39
|
assert(error.message.match(/Error: Did not expect element invalid there/))
|
40
|
-
assert_equal(XML::Error::RELAXNGV, error.domain)
|
41
|
-
assert_equal(XML::Error::LT_IN_ATTRIBUTE, error.code)
|
42
|
-
assert_equal(XML::Error::ERROR, error.level)
|
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
43
|
assert(error.file.match(/shiporder\.xml/))
|
44
44
|
assert_nil(error.line)
|
45
45
|
assert_equal('invalid', error.str1)
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
|
3
|
+
require_relative './test_helper'
|
4
4
|
require 'stringio'
|
5
5
|
|
6
6
|
class DocTypeCallback
|
7
|
-
include XML::SaxParser::Callbacks
|
7
|
+
include LibXML::XML::SaxParser::Callbacks
|
8
8
|
def on_start_element(element, attributes)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
class TestCaseCallbacks
|
13
|
-
include XML::SaxParser::Callbacks
|
13
|
+
include LibXML::XML::SaxParser::Callbacks
|
14
14
|
|
15
15
|
attr_accessor :result
|
16
16
|
|
@@ -119,20 +119,20 @@ class TestSaxParser < Minitest::Test
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def test_file
|
122
|
-
parser = XML::SaxParser.file(saxtest_file)
|
122
|
+
parser = LibXML::XML::SaxParser.file(saxtest_file)
|
123
123
|
parser.callbacks = TestCaseCallbacks.new
|
124
124
|
parser.parse
|
125
125
|
verify(parser)
|
126
126
|
end
|
127
127
|
|
128
128
|
def test_file_no_callbacks
|
129
|
-
parser = XML::SaxParser.file(saxtest_file)
|
129
|
+
parser = LibXML::XML::SaxParser.file(saxtest_file)
|
130
130
|
assert_equal true, parser.parse
|
131
131
|
end
|
132
132
|
|
133
133
|
def test_noexistent_file
|
134
|
-
error = assert_raises(XML::Error) do
|
135
|
-
XML::SaxParser.file('i_dont_exist.xml')
|
134
|
+
error = assert_raises(LibXML::XML::Error) do
|
135
|
+
LibXML::XML::SaxParser.file('i_dont_exist.xml')
|
136
136
|
end
|
137
137
|
|
138
138
|
assert_equal('Warning: failed to load external entity "i_dont_exist.xml".', error.to_s)
|
@@ -140,7 +140,7 @@ class TestSaxParser < Minitest::Test
|
|
140
140
|
|
141
141
|
def test_nil_file
|
142
142
|
error = assert_raises(TypeError) do
|
143
|
-
XML::SaxParser.file(nil)
|
143
|
+
LibXML::XML::SaxParser.file(nil)
|
144
144
|
end
|
145
145
|
|
146
146
|
assert_match(/nil into String/, error.to_s)
|
@@ -148,7 +148,7 @@ class TestSaxParser < Minitest::Test
|
|
148
148
|
|
149
149
|
def test_io
|
150
150
|
File.open(saxtest_file) do |file|
|
151
|
-
parser = XML::SaxParser.io(file)
|
151
|
+
parser = LibXML::XML::SaxParser.io(file)
|
152
152
|
parser.callbacks = TestCaseCallbacks.new
|
153
153
|
parser.parse
|
154
154
|
verify(parser)
|
@@ -157,7 +157,7 @@ class TestSaxParser < Minitest::Test
|
|
157
157
|
|
158
158
|
def test_nil_io
|
159
159
|
error = assert_raises(TypeError) do
|
160
|
-
XML::HTMLParser.io(nil)
|
160
|
+
LibXML::XML::HTMLParser.io(nil)
|
161
161
|
end
|
162
162
|
|
163
163
|
assert_equal("Must pass in an IO object", error.to_s)
|
@@ -165,13 +165,13 @@ class TestSaxParser < Minitest::Test
|
|
165
165
|
|
166
166
|
def test_string_no_callbacks
|
167
167
|
xml = File.read(saxtest_file)
|
168
|
-
parser = XML::SaxParser.string(xml)
|
168
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
169
169
|
assert_equal true, parser.parse
|
170
170
|
end
|
171
171
|
|
172
172
|
def test_string
|
173
173
|
xml = File.read(saxtest_file)
|
174
|
-
parser = XML::SaxParser.string(xml)
|
174
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
175
175
|
parser.callbacks = TestCaseCallbacks.new
|
176
176
|
parser.parse
|
177
177
|
verify(parser)
|
@@ -180,8 +180,8 @@ class TestSaxParser < Minitest::Test
|
|
180
180
|
def test_string_io
|
181
181
|
xml = File.read(saxtest_file)
|
182
182
|
io = StringIO.new(xml)
|
183
|
-
parser = XML::SaxParser.io(io)
|
184
|
-
|
183
|
+
parser = LibXML::XML::SaxParser.io(io)
|
184
|
+
|
185
185
|
parser.callbacks = TestCaseCallbacks.new
|
186
186
|
parser.parse
|
187
187
|
verify(parser)
|
@@ -189,7 +189,7 @@ class TestSaxParser < Minitest::Test
|
|
189
189
|
|
190
190
|
def test_nil_string
|
191
191
|
error = assert_raises(TypeError) do
|
192
|
-
XML::SaxParser.string(nil)
|
192
|
+
LibXML::XML::SaxParser.string(nil)
|
193
193
|
end
|
194
194
|
|
195
195
|
assert_equal("wrong argument type nil (expected String)", error.to_s)
|
@@ -203,7 +203,7 @@ class TestSaxParser < Minitest::Test
|
|
203
203
|
<a>a1</a>
|
204
204
|
</Results>
|
205
205
|
EOS
|
206
|
-
parser = XML::SaxParser.string(xml)
|
206
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
207
207
|
parser.callbacks = DocTypeCallback.new
|
208
208
|
doc = parser.parse
|
209
209
|
refute_nil(doc)
|
@@ -217,7 +217,7 @@ EOS
|
|
217
217
|
<Test/>
|
218
218
|
EOS
|
219
219
|
|
220
|
-
parser = XML::SaxParser.string(xml)
|
220
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
221
221
|
parser.callbacks = TestCaseCallbacks.new
|
222
222
|
|
223
223
|
parser.parse
|
@@ -239,36 +239,43 @@ EOS
|
|
239
239
|
xml = <<-EOS
|
240
240
|
<Results>
|
241
241
|
EOS
|
242
|
-
parser = XML::SaxParser.string(xml)
|
242
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
243
243
|
parser.callbacks = TestCaseCallbacks.new
|
244
244
|
|
245
|
-
error = assert_raises(XML::Error) do
|
246
|
-
|
245
|
+
error = assert_raises(LibXML::XML::Error) do
|
246
|
+
parser.parse
|
247
247
|
end
|
248
248
|
|
249
249
|
# Check callbacks
|
250
250
|
result = parser.callbacks.result
|
251
251
|
|
252
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
|
+
|
253
258
|
assert_equal("startdoc", result[i+=1])
|
254
259
|
assert_equal("start_element: Results, attr: {}", result[i+=1])
|
255
260
|
assert_equal("start_element_ns: Results, attr: {}, prefix: , uri: , ns: {}", result[i+=1])
|
256
261
|
assert_equal("characters: \n", result[i+=1])
|
257
|
-
|
262
|
+
assert_match(re_err_msg1, result[i+=1])
|
258
263
|
assert_equal("end_document", result[i+=1])
|
259
264
|
|
260
265
|
refute_nil(error)
|
261
|
-
assert_kind_of(XML::Error, error)
|
262
|
-
|
263
|
-
assert_equal(XML::Error::PARSER, error.domain)
|
264
|
-
|
265
|
-
|
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)
|
266
272
|
assert_nil(error.file)
|
267
273
|
assert_equal(2, error.line)
|
268
|
-
|
274
|
+
# Sometimes this is nil and sometimes its not depending on OS and libxlm version
|
275
|
+
# assert_nil(error.str1)
|
269
276
|
assert_nil(error.str2)
|
270
277
|
assert_nil(error.str3)
|
271
|
-
|
278
|
+
assert([0, 1].include?(error.int1))
|
272
279
|
assert_equal(1, error.int2)
|
273
280
|
assert_nil(error.node)
|
274
281
|
end
|
@@ -305,15 +312,15 @@ EOS
|
|
305
312
|
</Products>
|
306
313
|
EOS
|
307
314
|
|
308
|
-
parser = XML::SaxParser.string(xml)
|
315
|
+
parser = LibXML::XML::SaxParser.string(xml)
|
309
316
|
parser.callbacks = TestCaseCallbacks.new
|
310
317
|
|
311
|
-
error = assert_raises(XML::Error) do
|
318
|
+
error = assert_raises(LibXML::XML::Error) do
|
312
319
|
parser.parse
|
313
320
|
end
|
314
321
|
assert_equal("Fatal error: xmlParseEntityRef: no name at :5.", error.to_s)
|
315
322
|
|
316
323
|
# Check callbacks
|
317
|
-
|
324
|
+
parser.callbacks.result
|
318
325
|
end
|
319
326
|
end
|