libxml-ruby 2.8.0 → 3.2.1

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 (204) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY +842 -775
  3. data/LICENSE +20 -20
  4. data/MANIFEST +166 -166
  5. data/README.rdoc +217 -184
  6. data/Rakefile +90 -78
  7. data/ext/libxml/extconf.h +3 -0
  8. data/ext/libxml/extconf.rb +61 -116
  9. data/ext/libxml/libxml.c +80 -76
  10. data/ext/libxml/ruby_libxml.h +67 -75
  11. data/ext/libxml/ruby_xml.c +933 -893
  12. data/ext/libxml/ruby_xml.h +10 -10
  13. data/ext/libxml/ruby_xml_attr.c +333 -333
  14. data/ext/libxml/ruby_xml_attr.h +12 -12
  15. data/ext/libxml/ruby_xml_attr_decl.c +153 -153
  16. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  17. data/ext/libxml/ruby_xml_attributes.c +275 -275
  18. data/ext/libxml/ruby_xml_attributes.h +15 -15
  19. data/ext/libxml/ruby_xml_cbg.c +85 -85
  20. data/ext/libxml/ruby_xml_document.c +1123 -1147
  21. data/ext/libxml/ruby_xml_document.h +11 -11
  22. data/ext/libxml/ruby_xml_dtd.c +248 -268
  23. data/ext/libxml/ruby_xml_dtd.h +9 -9
  24. data/ext/libxml/ruby_xml_encoding.c +250 -260
  25. data/ext/libxml/ruby_xml_encoding.h +16 -19
  26. data/ext/libxml/ruby_xml_error.c +996 -996
  27. data/ext/libxml/ruby_xml_error.h +12 -12
  28. data/ext/libxml/ruby_xml_html_parser.c +89 -92
  29. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  30. data/ext/libxml/ruby_xml_html_parser_context.c +337 -338
  31. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  32. data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
  33. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  34. data/ext/libxml/ruby_xml_input_cbg.c +191 -191
  35. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  36. data/ext/libxml/ruby_xml_io.c +47 -50
  37. data/ext/libxml/ruby_xml_io.h +10 -10
  38. data/ext/libxml/ruby_xml_namespace.c +153 -153
  39. data/ext/libxml/ruby_xml_namespace.h +10 -10
  40. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  41. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  42. data/ext/libxml/ruby_xml_node.c +1402 -1452
  43. data/ext/libxml/ruby_xml_node.h +13 -11
  44. data/ext/libxml/ruby_xml_parser.c +91 -94
  45. data/ext/libxml/ruby_xml_parser.h +12 -12
  46. data/ext/libxml/ruby_xml_parser_context.c +999 -1001
  47. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  48. data/ext/libxml/ruby_xml_parser_options.c +66 -66
  49. data/ext/libxml/ruby_xml_parser_options.h +12 -12
  50. data/ext/libxml/ruby_xml_reader.c +1239 -1228
  51. data/ext/libxml/ruby_xml_reader.h +17 -17
  52. data/ext/libxml/ruby_xml_relaxng.c +110 -111
  53. data/ext/libxml/ruby_xml_relaxng.h +10 -10
  54. data/ext/libxml/ruby_xml_sax2_handler.c +326 -328
  55. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  56. data/ext/libxml/ruby_xml_sax_parser.c +116 -120
  57. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  58. data/ext/libxml/ruby_xml_schema.c +278 -301
  59. data/ext/libxml/ruby_xml_schema.h +809 -809
  60. data/ext/libxml/ruby_xml_schema_attribute.c +109 -109
  61. data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
  62. data/ext/libxml/ruby_xml_schema_element.c +95 -94
  63. data/ext/libxml/ruby_xml_schema_element.h +14 -14
  64. data/ext/libxml/ruby_xml_schema_facet.c +52 -52
  65. data/ext/libxml/ruby_xml_schema_facet.h +13 -13
  66. data/ext/libxml/ruby_xml_schema_type.c +232 -259
  67. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  68. data/ext/libxml/ruby_xml_version.h +9 -9
  69. data/ext/libxml/ruby_xml_writer.c +1133 -1137
  70. data/ext/libxml/ruby_xml_writer.h +10 -10
  71. data/ext/libxml/ruby_xml_xinclude.c +16 -16
  72. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  73. data/ext/libxml/ruby_xml_xpath.c +194 -188
  74. data/ext/libxml/ruby_xml_xpath.h +13 -13
  75. data/ext/libxml/ruby_xml_xpath_context.c +360 -361
  76. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  77. data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
  78. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  79. data/ext/libxml/ruby_xml_xpath_object.c +338 -335
  80. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  81. data/ext/libxml/ruby_xml_xpointer.c +99 -99
  82. data/ext/libxml/ruby_xml_xpointer.h +11 -11
  83. data/ext/vc/libxml_ruby.sln +17 -15
  84. data/lib/libxml-ruby.rb +30 -0
  85. data/lib/libxml.rb +3 -33
  86. data/lib/libxml/node.rb +2 -78
  87. data/lib/libxml/parser.rb +0 -266
  88. data/lib/libxml/sax_parser.rb +0 -17
  89. data/lib/libxml/schema.rb +47 -66
  90. data/lib/libxml/schema/attribute.rb +19 -19
  91. data/lib/libxml/schema/element.rb +19 -27
  92. data/lib/libxml/schema/type.rb +21 -29
  93. data/libxml-ruby.gemspec +48 -44
  94. data/script/benchmark/depixelate +634 -634
  95. data/script/benchmark/hamlet.xml +9054 -9054
  96. data/script/benchmark/parsecount +170 -170
  97. data/script/benchmark/throughput +41 -41
  98. data/script/test +6 -6
  99. data/setup.rb +0 -1
  100. data/test/c14n/given/example-1.xml +14 -14
  101. data/test/c14n/given/example-2.xml +11 -11
  102. data/test/c14n/given/example-3.xml +18 -18
  103. data/test/c14n/given/example-4.xml +9 -9
  104. data/test/c14n/given/example-5.xml +12 -12
  105. data/test/c14n/given/example-6.xml +2 -2
  106. data/test/c14n/given/example-7.xml +11 -11
  107. data/test/c14n/given/example-8.xml +11 -11
  108. data/test/c14n/given/example-8.xpath +9 -9
  109. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  110. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  111. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  112. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  113. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  114. data/test/c14n/result/with-comments/example-1 +5 -5
  115. data/test/c14n/result/with-comments/example-2 +10 -10
  116. data/test/c14n/result/with-comments/example-3 +13 -13
  117. data/test/c14n/result/with-comments/example-4 +8 -8
  118. data/test/c14n/result/with-comments/example-5 +3 -3
  119. data/test/c14n/result/without-comments/example-1 +3 -3
  120. data/test/c14n/result/without-comments/example-2 +10 -10
  121. data/test/c14n/result/without-comments/example-3 +13 -13
  122. data/test/c14n/result/without-comments/example-4 +8 -8
  123. data/test/c14n/result/without-comments/example-5 +2 -2
  124. data/test/model/atom.xml +12 -12
  125. data/test/model/bands.iso-8859-1.xml +4 -4
  126. data/test/model/bands.utf-8.xml +4 -4
  127. data/test/model/bands.xml +4 -4
  128. data/test/model/books.xml +153 -153
  129. data/test/model/cwm_1_0.xml +11336 -0
  130. data/test/model/merge_bug_data.xml +58 -58
  131. data/test/model/ruby-lang.html +238 -238
  132. data/test/model/rubynet.xml +79 -79
  133. data/test/model/shiporder.rnc +28 -28
  134. data/test/model/shiporder.rng +86 -86
  135. data/test/model/shiporder.xml +22 -22
  136. data/test/model/shiporder.xsd +39 -39
  137. data/test/model/soap.xml +27 -27
  138. data/test/model/xinclude.xml +4 -4
  139. data/test/test.xml +2 -0
  140. data/test/{tc_attr.rb → test_attr.rb} +23 -25
  141. data/test/{tc_attr_decl.rb → test_attr_decl.rb} +13 -14
  142. data/test/{tc_attributes.rb → test_attributes.rb} +11 -18
  143. data/test/{tc_canonicalize.rb → test_canonicalize.rb} +36 -41
  144. data/test/test_deprecated_require.rb +12 -0
  145. data/test/{tc_document.rb → test_document.rb} +32 -27
  146. data/test/test_document_write.rb +146 -0
  147. data/test/{tc_dtd.rb → test_dtd.rb} +28 -29
  148. data/test/{tc_encoding.rb → test_encoding.rb} +129 -126
  149. data/test/{tc_encoding_sax.rb → test_encoding_sax.rb} +7 -6
  150. data/test/test_error.rb +178 -0
  151. data/test/test_helper.rb +3 -10
  152. data/test/test_html_parser.rb +162 -0
  153. data/test/test_html_parser_context.rb +23 -0
  154. data/test/test_namespace.rb +60 -0
  155. data/test/{tc_namespaces.rb → test_namespaces.rb} +34 -44
  156. data/test/{tc_node.rb → test_node.rb} +68 -47
  157. data/test/{tc_node_cdata.rb → test_node_cdata.rb} +12 -13
  158. data/test/{tc_node_comment.rb → test_node_comment.rb} +7 -8
  159. data/test/{tc_node_copy.rb → test_node_copy.rb} +4 -6
  160. data/test/{tc_node_edit.rb → test_node_edit.rb} +23 -41
  161. data/test/{tc_node_pi.rb → test_node_pi.rb} +37 -40
  162. data/test/{tc_node_text.rb → test_node_text.rb} +10 -12
  163. data/test/{tc_node_write.rb → test_node_write.rb} +18 -29
  164. data/test/test_node_xlink.rb +28 -0
  165. data/test/test_parser.rb +324 -0
  166. data/test/{tc_parser_context.rb → test_parser_context.rb} +41 -42
  167. data/test/{tc_properties.rb → test_properties.rb} +6 -7
  168. data/test/test_reader.rb +363 -0
  169. data/test/test_relaxng.rb +53 -0
  170. data/test/{tc_sax_parser.rb → test_sax_parser.rb} +36 -37
  171. data/test/{tc_schema.rb → test_schema.rb} +43 -37
  172. data/test/test_suite.rb +38 -40
  173. data/test/{tc_traversal.rb → test_traversal.rb} +5 -6
  174. data/test/{tc_writer.rb → test_writer.rb} +468 -448
  175. data/test/{tc_xinclude.rb → test_xinclude.rb} +4 -5
  176. data/test/test_xml.rb +262 -0
  177. data/test/{tc_xpath.rb → test_xpath.rb} +31 -32
  178. data/test/{tc_xpath_context.rb → test_xpath_context.rb} +8 -9
  179. data/test/test_xpath_expression.rb +37 -0
  180. data/test/{tc_xpointer.rb → test_xpointer.rb} +16 -18
  181. metadata +117 -95
  182. data/lib/libxml/ns.rb +0 -22
  183. data/lib/libxml/properties.rb +0 -23
  184. data/lib/libxml/reader.rb +0 -29
  185. data/lib/libxml/xpath_object.rb +0 -16
  186. data/test/etc_doc_to_s.rb +0 -21
  187. data/test/ets_doc_file.rb +0 -17
  188. data/test/ets_doc_to_s.rb +0 -23
  189. data/test/ets_gpx.rb +0 -28
  190. data/test/ets_node_gc.rb +0 -23
  191. data/test/ets_test.xml +0 -2
  192. data/test/ets_tsr.rb +0 -11
  193. data/test/tc_deprecated_require.rb +0 -13
  194. data/test/tc_document_write.rb +0 -196
  195. data/test/tc_error.rb +0 -180
  196. data/test/tc_html_parser.rb +0 -153
  197. data/test/tc_html_parser_context.rb +0 -24
  198. data/test/tc_namespace.rb +0 -62
  199. data/test/tc_node_xlink.rb +0 -29
  200. data/test/tc_parser.rb +0 -381
  201. data/test/tc_reader.rb +0 -400
  202. data/test/tc_relaxng.rb +0 -54
  203. data/test/tc_xml.rb +0 -226
  204. data/test/tc_xpath_expression.rb +0 -38
@@ -1,15 +1,14 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require './test_helper'
3
+ require_relative './test_helper'
4
4
 
5
- require 'test/unit'
6
5
 
7
6
  # attributes is deprecated - use attributes instead.
8
7
  # Tests for backwards compatibility
9
8
 
10
- class Testattributes < Test::Unit::TestCase
9
+ class Testattributes < Minitest::Test
11
10
  def setup()
12
- xp = XML::Parser.string('<ruby_array uga="booga" foo="bar"><fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>')
11
+ xp = LibXML::XML::Parser.string('<ruby_array uga="booga" foo="bar"><fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>')
13
12
  @doc = xp.parse
14
13
  end
15
14
 
@@ -20,20 +19,20 @@ class Testattributes < Test::Unit::TestCase
20
19
  def test_traversal
21
20
  attributes = @doc.root.attributes
22
21
 
23
- assert_instance_of(XML::Attributes, attributes)
22
+ assert_instance_of(LibXML::XML::Attributes, attributes)
24
23
  attribute = attributes.first
25
24
  assert_equal('uga', attribute.name)
26
25
  assert_equal('booga', attribute.value)
27
26
 
28
27
  attribute = attribute.next
29
- assert_instance_of(XML::Attr, attribute)
28
+ assert_instance_of(LibXML::XML::Attr, attribute)
30
29
  assert_equal('foo', attribute.name)
31
30
  assert_equal('bar', attribute.value)
32
31
  end
33
32
 
34
33
  def test_no_attributes
35
34
  attributes = @doc.root.child.attributes
36
- assert_instance_of(XML::Attributes, attributes)
35
+ assert_instance_of(LibXML::XML::Attributes, attributes)
37
36
  assert_equal(0, attributes.length)
38
37
  end
39
38
  end
@@ -0,0 +1,363 @@
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
+ reader = LibXML::XML::Reader.file(XML_FILE)
253
+ reader.read
254
+ assert_equal(428, reader.byte_consumed)
255
+ end
256
+
257
+ def test_node
258
+ LibXML::XML.default_line_numbers = true
259
+ reader = LibXML::XML::Reader.file(XML_FILE)
260
+
261
+ # first try to get a node
262
+ assert_nil(reader.node)
263
+
264
+ reader.read
265
+ assert_instance_of(LibXML::XML::Node, reader.node)
266
+ end
267
+
268
+ def test_base_uri
269
+ # UTF8:
270
+ # ö - c3 b6 in hex, \303\266 in octal
271
+ # ü - c3 bc in hex, \303\274 in octal
272
+ 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>"
273
+ reader = LibXML::XML::Reader.string(xml, :base_uri => "http://libxml.rubyforge.org")
274
+
275
+ reader.read
276
+ assert_equal(reader.base_uri, "http://libxml.rubyforge.org")
277
+ assert_equal(::Encoding::UTF_8, reader.base_uri.encoding) if defined?(::Encoding)
278
+ end
279
+
280
+ def test_options
281
+ xml = <<-EOS
282
+ <!DOCTYPE foo [<!ENTITY foo 'bar'>]>
283
+ <test>
284
+ <cdata><![CDATA[something]]></cdata>
285
+ <entity>&foo;</entity>
286
+ </test>
287
+ EOS
288
+
289
+ # Parse normally
290
+ reader = LibXML::XML::Reader.string(xml)
291
+ reader.read # foo
292
+ reader.read # test
293
+ reader.read # text
294
+ reader.read # cdata
295
+ reader.read # cdata-section
296
+ assert_equal(LibXML::XML::Node::CDATA_SECTION_NODE, reader.node_type)
297
+
298
+ # Convert cdata section to text
299
+ reader = LibXML::XML::Reader.string(xml, :options => LibXML::XML::Parser::Options::NOCDATA)
300
+ reader.read # foo
301
+ reader.read # test
302
+ reader.read # text
303
+ reader.read # cdata
304
+ reader.read # cdata-section
305
+ assert_equal(LibXML::XML::Node::TEXT_NODE, reader.node_type)
306
+ end
307
+
308
+ def test_encoding
309
+ # ISO_8859_1:
310
+ # ö - f6 in hex, \366 in octal
311
+ # ü - fc in hex, \374 in octal
312
+ 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>"
313
+
314
+ reader = LibXML::XML::Reader.string(xml, :encoding => LibXML::XML::Encoding::ISO_8859_1)
315
+ reader.read
316
+
317
+ assert_equal(Encoding::ISO8859_1, reader.read_outer_xml.encoding)
318
+ assert_equal(Encoding::ISO8859_1, reader.read_inner_xml.encoding)
319
+ assert_equal(Encoding::ISO8859_1, reader.read_string.encoding)
320
+
321
+ 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),
322
+ reader.read_outer_xml)
323
+ 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),
324
+ reader.read_inner_xml)
325
+ 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),
326
+ reader.read_string)
327
+ end
328
+
329
+ def test_invalid_encoding
330
+ # ISO_8859_1:
331
+ # ö - f6 in hex, \366 in octal
332
+ # ü - fc in hex, \374 in octal
333
+ 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>"
334
+
335
+ reader = LibXML::XML::Reader.string(xml)
336
+ error = assert_raises(LibXML::XML::Error) do
337
+ reader.read
338
+ end
339
+
340
+ assert_equal("Fatal error: Input is not proper UTF-8, indicate encoding !\nBytes: 0xF6 0x74 0x6C 0x65 at :2.",
341
+ error.to_s)
342
+
343
+ end
344
+
345
+ def test_file_encoding
346
+ reader = LibXML::XML::Reader.file(XML_FILE)
347
+ reader.read
348
+ assert_equal(LibXML::XML::Encoding::UTF_8, reader.encoding)
349
+ assert_equal(Encoding::UTF_8, reader.value.encoding)
350
+ end
351
+
352
+ def test_string_encoding
353
+ # ISO_8859_1:
354
+ # ö - f6 in hex, \366 in octal
355
+ # ü - fc in hex, \374 in octal
356
+ 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>"
357
+ reader = LibXML::XML::Reader.string(xml, :encoding => LibXML::XML::Encoding::ISO_8859_1)
358
+ reader.read
359
+
360
+ # Encoding is always null for strings, very annoying!
361
+ assert_equal(reader.encoding, LibXML::XML::Encoding::NONE)
362
+ end
363
+ 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