libxml-ruby 3.2.2-x64-mingw-ucrt

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.
Files changed (205) hide show
  1. checksums.yaml +7 -0
  2. data/HISTORY +848 -0
  3. data/LICENSE +21 -0
  4. data/MANIFEST +166 -0
  5. data/README.rdoc +217 -0
  6. data/Rakefile +99 -0
  7. data/ext/libxml/extconf.rb +61 -0
  8. data/ext/libxml/libxml.c +80 -0
  9. data/ext/libxml/libxml_ruby.def +35 -0
  10. data/ext/libxml/ruby_libxml.h +67 -0
  11. data/ext/libxml/ruby_xml.c +933 -0
  12. data/ext/libxml/ruby_xml.h +10 -0
  13. data/ext/libxml/ruby_xml_attr.c +333 -0
  14. data/ext/libxml/ruby_xml_attr.h +12 -0
  15. data/ext/libxml/ruby_xml_attr_decl.c +153 -0
  16. data/ext/libxml/ruby_xml_attr_decl.h +11 -0
  17. data/ext/libxml/ruby_xml_attributes.c +275 -0
  18. data/ext/libxml/ruby_xml_attributes.h +15 -0
  19. data/ext/libxml/ruby_xml_cbg.c +85 -0
  20. data/ext/libxml/ruby_xml_document.c +1123 -0
  21. data/ext/libxml/ruby_xml_document.h +11 -0
  22. data/ext/libxml/ruby_xml_dtd.c +248 -0
  23. data/ext/libxml/ruby_xml_dtd.h +9 -0
  24. data/ext/libxml/ruby_xml_encoding.c +250 -0
  25. data/ext/libxml/ruby_xml_encoding.h +16 -0
  26. data/ext/libxml/ruby_xml_error.c +996 -0
  27. data/ext/libxml/ruby_xml_error.h +12 -0
  28. data/ext/libxml/ruby_xml_html_parser.c +89 -0
  29. data/ext/libxml/ruby_xml_html_parser.h +10 -0
  30. data/ext/libxml/ruby_xml_html_parser_context.c +337 -0
  31. data/ext/libxml/ruby_xml_html_parser_context.h +10 -0
  32. data/ext/libxml/ruby_xml_html_parser_options.c +46 -0
  33. data/ext/libxml/ruby_xml_html_parser_options.h +10 -0
  34. data/ext/libxml/ruby_xml_input_cbg.c +191 -0
  35. data/ext/libxml/ruby_xml_input_cbg.h +20 -0
  36. data/ext/libxml/ruby_xml_io.c +47 -0
  37. data/ext/libxml/ruby_xml_io.h +10 -0
  38. data/ext/libxml/ruby_xml_namespace.c +153 -0
  39. data/ext/libxml/ruby_xml_namespace.h +10 -0
  40. data/ext/libxml/ruby_xml_namespaces.c +293 -0
  41. data/ext/libxml/ruby_xml_namespaces.h +9 -0
  42. data/ext/libxml/ruby_xml_node.c +1402 -0
  43. data/ext/libxml/ruby_xml_node.h +13 -0
  44. data/ext/libxml/ruby_xml_parser.c +91 -0
  45. data/ext/libxml/ruby_xml_parser.h +12 -0
  46. data/ext/libxml/ruby_xml_parser_context.c +999 -0
  47. data/ext/libxml/ruby_xml_parser_context.h +10 -0
  48. data/ext/libxml/ruby_xml_parser_options.c +66 -0
  49. data/ext/libxml/ruby_xml_parser_options.h +12 -0
  50. data/ext/libxml/ruby_xml_reader.c +1239 -0
  51. data/ext/libxml/ruby_xml_reader.h +17 -0
  52. data/ext/libxml/ruby_xml_relaxng.c +110 -0
  53. data/ext/libxml/ruby_xml_relaxng.h +10 -0
  54. data/ext/libxml/ruby_xml_sax2_handler.c +326 -0
  55. data/ext/libxml/ruby_xml_sax2_handler.h +10 -0
  56. data/ext/libxml/ruby_xml_sax_parser.c +116 -0
  57. data/ext/libxml/ruby_xml_sax_parser.h +10 -0
  58. data/ext/libxml/ruby_xml_schema.c +278 -0
  59. data/ext/libxml/ruby_xml_schema.h +809 -0
  60. data/ext/libxml/ruby_xml_schema_attribute.c +109 -0
  61. data/ext/libxml/ruby_xml_schema_attribute.h +15 -0
  62. data/ext/libxml/ruby_xml_schema_element.c +95 -0
  63. data/ext/libxml/ruby_xml_schema_element.h +14 -0
  64. data/ext/libxml/ruby_xml_schema_facet.c +52 -0
  65. data/ext/libxml/ruby_xml_schema_facet.h +13 -0
  66. data/ext/libxml/ruby_xml_schema_type.c +232 -0
  67. data/ext/libxml/ruby_xml_schema_type.h +9 -0
  68. data/ext/libxml/ruby_xml_version.h +9 -0
  69. data/ext/libxml/ruby_xml_writer.c +1133 -0
  70. data/ext/libxml/ruby_xml_writer.h +10 -0
  71. data/ext/libxml/ruby_xml_xinclude.c +16 -0
  72. data/ext/libxml/ruby_xml_xinclude.h +11 -0
  73. data/ext/libxml/ruby_xml_xpath.c +194 -0
  74. data/ext/libxml/ruby_xml_xpath.h +13 -0
  75. data/ext/libxml/ruby_xml_xpath_context.c +360 -0
  76. data/ext/libxml/ruby_xml_xpath_context.h +9 -0
  77. data/ext/libxml/ruby_xml_xpath_expression.c +81 -0
  78. data/ext/libxml/ruby_xml_xpath_expression.h +10 -0
  79. data/ext/libxml/ruby_xml_xpath_object.c +338 -0
  80. data/ext/libxml/ruby_xml_xpath_object.h +17 -0
  81. data/ext/libxml/ruby_xml_xpointer.c +99 -0
  82. data/ext/libxml/ruby_xml_xpointer.h +11 -0
  83. data/ext/vc/libxml_ruby.sln +28 -0
  84. data/lib/3.1/libxml_ruby.so +0 -0
  85. data/lib/libxml/attr.rb +123 -0
  86. data/lib/libxml/attr_decl.rb +80 -0
  87. data/lib/libxml/attributes.rb +14 -0
  88. data/lib/libxml/document.rb +194 -0
  89. data/lib/libxml/error.rb +95 -0
  90. data/lib/libxml/hpricot.rb +78 -0
  91. data/lib/libxml/html_parser.rb +96 -0
  92. data/lib/libxml/namespace.rb +62 -0
  93. data/lib/libxml/namespaces.rb +38 -0
  94. data/lib/libxml/node.rb +323 -0
  95. data/lib/libxml/parser.rb +101 -0
  96. data/lib/libxml/sax_callbacks.rb +180 -0
  97. data/lib/libxml/sax_parser.rb +41 -0
  98. data/lib/libxml/schema/attribute.rb +19 -0
  99. data/lib/libxml/schema/element.rb +19 -0
  100. data/lib/libxml/schema/type.rb +21 -0
  101. data/lib/libxml/schema.rb +48 -0
  102. data/lib/libxml/tree.rb +29 -0
  103. data/lib/libxml-ruby.rb +30 -0
  104. data/lib/libxml.rb +5 -0
  105. data/lib/xml/libxml.rb +10 -0
  106. data/lib/xml.rb +14 -0
  107. data/libxml-ruby.gemspec +48 -0
  108. data/script/benchmark/depixelate +634 -0
  109. data/script/benchmark/hamlet.xml +9055 -0
  110. data/script/benchmark/parsecount +170 -0
  111. data/script/benchmark/sock_entries.xml +507 -0
  112. data/script/benchmark/throughput +41 -0
  113. data/script/test +6 -0
  114. data/setup.rb +1584 -0
  115. data/test/c14n/given/doc.dtd +1 -0
  116. data/test/c14n/given/example-1.xml +14 -0
  117. data/test/c14n/given/example-2.xml +11 -0
  118. data/test/c14n/given/example-3.xml +18 -0
  119. data/test/c14n/given/example-4.xml +9 -0
  120. data/test/c14n/given/example-5.xml +12 -0
  121. data/test/c14n/given/example-6.xml +2 -0
  122. data/test/c14n/given/example-7.xml +11 -0
  123. data/test/c14n/given/example-8.xml +11 -0
  124. data/test/c14n/given/example-8.xpath +10 -0
  125. data/test/c14n/given/world.txt +1 -0
  126. data/test/c14n/result/1-1-without-comments/example-1 +4 -0
  127. data/test/c14n/result/1-1-without-comments/example-2 +11 -0
  128. data/test/c14n/result/1-1-without-comments/example-3 +14 -0
  129. data/test/c14n/result/1-1-without-comments/example-4 +9 -0
  130. data/test/c14n/result/1-1-without-comments/example-5 +3 -0
  131. data/test/c14n/result/1-1-without-comments/example-6 +1 -0
  132. data/test/c14n/result/1-1-without-comments/example-7 +1 -0
  133. data/test/c14n/result/1-1-without-comments/example-8 +1 -0
  134. data/test/c14n/result/with-comments/example-1 +6 -0
  135. data/test/c14n/result/with-comments/example-2 +11 -0
  136. data/test/c14n/result/with-comments/example-3 +14 -0
  137. data/test/c14n/result/with-comments/example-4 +9 -0
  138. data/test/c14n/result/with-comments/example-5 +4 -0
  139. data/test/c14n/result/with-comments/example-6 +1 -0
  140. data/test/c14n/result/with-comments/example-7 +1 -0
  141. data/test/c14n/result/without-comments/example-1 +4 -0
  142. data/test/c14n/result/without-comments/example-2 +11 -0
  143. data/test/c14n/result/without-comments/example-3 +14 -0
  144. data/test/c14n/result/without-comments/example-4 +9 -0
  145. data/test/c14n/result/without-comments/example-5 +3 -0
  146. data/test/c14n/result/without-comments/example-6 +1 -0
  147. data/test/c14n/result/without-comments/example-7 +1 -0
  148. data/test/model/atom.xml +13 -0
  149. data/test/model/bands.iso-8859-1.xml +5 -0
  150. data/test/model/bands.utf-8.xml +5 -0
  151. data/test/model/bands.xml +5 -0
  152. data/test/model/books.xml +154 -0
  153. data/test/model/cwm_1_0.xml +11336 -0
  154. data/test/model/merge_bug_data.xml +58 -0
  155. data/test/model/ruby-lang.html +238 -0
  156. data/test/model/rubynet.xml +79 -0
  157. data/test/model/rubynet_project +1 -0
  158. data/test/model/shiporder.rnc +28 -0
  159. data/test/model/shiporder.rng +86 -0
  160. data/test/model/shiporder.xml +23 -0
  161. data/test/model/shiporder.xsd +40 -0
  162. data/test/model/soap.xml +27 -0
  163. data/test/model/xinclude.xml +5 -0
  164. data/test/test_attr.rb +181 -0
  165. data/test/test_attr_decl.rb +132 -0
  166. data/test/test_attributes.rb +136 -0
  167. data/test/test_canonicalize.rb +120 -0
  168. data/test/test_deprecated_require.rb +12 -0
  169. data/test/test_document.rb +132 -0
  170. data/test/test_document_write.rb +146 -0
  171. data/test/test_dtd.rb +129 -0
  172. data/test/test_encoding.rb +129 -0
  173. data/test/test_encoding_sax.rb +115 -0
  174. data/test/test_error.rb +178 -0
  175. data/test/test_helper.rb +9 -0
  176. data/test/test_html_parser.rb +162 -0
  177. data/test/test_html_parser_context.rb +23 -0
  178. data/test/test_namespace.rb +60 -0
  179. data/test/test_namespaces.rb +200 -0
  180. data/test/test_node.rb +237 -0
  181. data/test/test_node_cdata.rb +50 -0
  182. data/test/test_node_comment.rb +32 -0
  183. data/test/test_node_copy.rb +40 -0
  184. data/test/test_node_edit.rb +158 -0
  185. data/test/test_node_pi.rb +37 -0
  186. data/test/test_node_text.rb +69 -0
  187. data/test/test_node_write.rb +97 -0
  188. data/test/test_node_xlink.rb +28 -0
  189. data/test/test_parser.rb +324 -0
  190. data/test/test_parser_context.rb +198 -0
  191. data/test/test_properties.rb +38 -0
  192. data/test/test_reader.rb +364 -0
  193. data/test/test_relaxng.rb +53 -0
  194. data/test/test_sax_parser.rb +326 -0
  195. data/test/test_schema.rb +168 -0
  196. data/test/test_suite.rb +48 -0
  197. data/test/test_traversal.rb +152 -0
  198. data/test/test_writer.rb +468 -0
  199. data/test/test_xinclude.rb +20 -0
  200. data/test/test_xml.rb +263 -0
  201. data/test/test_xpath.rb +244 -0
  202. data/test/test_xpath_context.rb +88 -0
  203. data/test/test_xpath_expression.rb +37 -0
  204. data/test/test_xpointer.rb +72 -0
  205. metadata +325 -0
@@ -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