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
data/test/test_xml.rb ADDED
@@ -0,0 +1,263 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+ require 'stringio'
5
+
6
+ class TestXml < Minitest::Test
7
+ # ----- Constants ------
8
+ def test_lib_versions
9
+ assert(LibXML::XML.check_lib_versions)
10
+ end
11
+
12
+ def test_debug_entities
13
+ original = LibXML::XML.debug_entities
14
+
15
+ LibXML::XML.debug_entities = false
16
+ refute(LibXML::XML.debug_entities)
17
+
18
+ LibXML::XML.debug_entities = true
19
+ assert(LibXML::XML.debug_entities)
20
+
21
+ LibXML::XML.debug_entities = false
22
+ refute(LibXML::XML.debug_entities)
23
+
24
+ LibXML::XML.debug_entities = original
25
+ end
26
+
27
+ def test_default_compression
28
+ return unless LibXML::XML.default_compression
29
+
30
+ original = LibXML::XML.default_compression
31
+
32
+ 0.upto(9) do |i|
33
+ LibXML::XML.default_compression = i
34
+ assert_equal(i, LibXML::XML.default_compression)
35
+ end
36
+
37
+ 9.downto(0) do |i|
38
+ assert_equal(i, LibXML::XML.default_compression = i)
39
+ assert_equal(i, LibXML::XML.default_compression)
40
+ end
41
+
42
+ 0.downto(-10) do |i|
43
+ assert_equal(i, LibXML::XML.default_compression = i)
44
+ assert_equal(0, LibXML::XML.default_compression)
45
+ end
46
+
47
+ 10.upto(20) do |i|
48
+ assert_equal(i, LibXML::XML.default_compression = i)
49
+ assert_equal(9, LibXML::XML.default_compression)
50
+ end
51
+
52
+ LibXML::XML.default_compression = original
53
+ end
54
+
55
+ def test_default_keep_blanks
56
+ original = LibXML::XML.default_keep_blanks
57
+
58
+ LibXML::XML.default_keep_blanks = false
59
+ refute(LibXML::XML.default_keep_blanks)
60
+ assert_equal(LibXML::XML::Parser::Options::NOBLANKS, LibXML::XML.default_options)
61
+
62
+ LibXML::XML.default_keep_blanks = true
63
+ assert(LibXML::XML.default_keep_blanks)
64
+ assert_equal(0, LibXML::XML.default_options)
65
+
66
+ LibXML::XML.default_keep_blanks = original
67
+ end
68
+
69
+ def test_default_line_numbers
70
+ original = LibXML::XML.default_line_numbers
71
+
72
+ LibXML::XML.default_line_numbers = false
73
+ refute(LibXML::XML.default_line_numbers)
74
+
75
+ LibXML::XML.default_line_numbers = true
76
+ assert(LibXML::XML.default_line_numbers)
77
+
78
+ LibXML::XML.default_line_numbers = false
79
+ refute(LibXML::XML.default_line_numbers)
80
+
81
+ LibXML::XML.default_line_numbers = original
82
+ end
83
+
84
+ def test_default_substitute_entities
85
+ original = LibXML::XML.default_substitute_entities
86
+
87
+ LibXML::XML.default_substitute_entities = false
88
+ refute(LibXML::XML.default_substitute_entities)
89
+ assert_equal(0, LibXML::XML.default_options)
90
+
91
+ LibXML::XML.default_substitute_entities = true
92
+ assert(LibXML::XML.default_substitute_entities)
93
+ assert_equal(LibXML::XML::Parser::Options::NOENT, LibXML::XML.default_options)
94
+
95
+ LibXML::XML.default_substitute_entities = false
96
+ refute(LibXML::XML.default_substitute_entities)
97
+
98
+ LibXML::XML.default_substitute_entities = original
99
+ end
100
+
101
+ def test_default_tree_indent_string
102
+ original = LibXML::XML.default_tree_indent_string
103
+
104
+ s = LibXML::XML.default_tree_indent_string
105
+ assert_instance_of(String, s)
106
+ assert_equal(' ', s)
107
+ LibXML::XML.default_tree_indent_string = 'uga'
108
+ s = LibXML::XML.default_tree_indent_string
109
+ assert_instance_of(String, s)
110
+ assert_equal('uga', s)
111
+ LibXML::XML.default_tree_indent_string = ' '
112
+ s = LibXML::XML.default_tree_indent_string
113
+ assert_instance_of(String, s)
114
+ assert_equal(' ', s)
115
+
116
+ LibXML::XML.default_tree_indent_string = original
117
+ end
118
+
119
+ def test_default_validity_checking
120
+ original = LibXML::XML.default_validity_checking
121
+
122
+ LibXML::XML.default_validity_checking = false
123
+ refute(LibXML::XML.default_validity_checking)
124
+ assert_equal(0, LibXML::XML.default_options)
125
+
126
+ LibXML::XML.default_validity_checking = true
127
+ assert(LibXML::XML.default_validity_checking)
128
+ assert_equal(LibXML::XML::Parser::Options::DTDVALID, LibXML::XML.default_options)
129
+
130
+ LibXML::XML.default_validity_checking = false
131
+ refute(LibXML::XML.default_validity_checking)
132
+
133
+ LibXML::XML.default_validity_checking = original
134
+ end
135
+
136
+ def test_default_warnings
137
+ original = LibXML::XML.default_warnings
138
+
139
+ LibXML::XML.default_warnings = false
140
+ refute(LibXML::XML.default_warnings)
141
+ assert_equal(LibXML::XML::Parser::Options::NOWARNING, LibXML::XML.default_options)
142
+
143
+ LibXML::XML.default_warnings = true
144
+ assert(LibXML::XML.default_warnings)
145
+ assert_equal(0, LibXML::XML.default_options)
146
+
147
+ LibXML::XML.default_warnings = false
148
+ refute(LibXML::XML.default_warnings)
149
+
150
+ LibXML::XML.default_warnings = original
151
+ end
152
+
153
+ def test_enabled_automata
154
+ assert(LibXML::XML.enabled_automata?)
155
+ end
156
+
157
+ def test_enabled_c14n
158
+ assert(LibXML::XML.enabled_c14n?)
159
+ end
160
+
161
+ def test_enabled_catalog
162
+ assert(LibXML::XML.enabled_catalog?)
163
+ end
164
+
165
+ def test_enabled_debug
166
+ assert(LibXML::XML.enabled_debug?)
167
+ end
168
+
169
+ def test_enabled_docbook
170
+ assert(LibXML::XML.enabled_docbook?)
171
+ end
172
+
173
+ def test_enabled_ftp
174
+ assert(LibXML::XML.enabled_ftp?)
175
+ end
176
+
177
+ def test_enabled_http
178
+ assert(LibXML::XML.enabled_http?)
179
+ end
180
+
181
+ def test_enabled_html
182
+ assert(LibXML::XML.enabled_html?)
183
+ end
184
+
185
+ def test_enabled_iconv
186
+ iconv_enabled = RUBY_PLATFORM !~ /darwin/
187
+ assert_equal(iconv_enabled, LibXML::XML.enabled_iconv?)
188
+ end
189
+
190
+ def test_enabled_memory_debug
191
+ assert_equal(false, LibXML::XML.enabled_memory_debug?)
192
+ end
193
+
194
+ def test_enabled_regexp
195
+ assert(LibXML::XML.enabled_regexp?)
196
+ end
197
+
198
+ def test_enabled_schemas
199
+ assert(LibXML::XML.enabled_schemas?)
200
+ end
201
+
202
+ def test_enabled_thread
203
+ assert(LibXML::XML.enabled_thread?)
204
+ end
205
+
206
+ def test_enabled_unicode
207
+ assert(LibXML::XML.enabled_unicode?)
208
+ end
209
+
210
+ def test_enabled_xinclude
211
+ assert(LibXML::XML.enabled_xinclude?)
212
+ end
213
+
214
+ def test_enabled_xpath
215
+ assert(LibXML::XML.enabled_xpath?)
216
+ end
217
+
218
+ def test_enabled_xpointer
219
+ assert(LibXML::XML.enabled_xpointer?)
220
+ end
221
+
222
+ def test_enabled_zlib
223
+ assert(LibXML::XML.enabled_zlib?.is_a?(TrueClass) || LibXML::XML.enabled_zlib?.is_a?(FalseClass))
224
+ end
225
+
226
+ def test_intent_tree_output
227
+ assert(TrueClass, LibXML::XML.indent_tree_output)
228
+
229
+ LibXML::XML.indent_tree_output = false
230
+ assert(FalseClass, LibXML::XML.indent_tree_output)
231
+
232
+ LibXML::XML.indent_tree_output = true
233
+ assert(TrueClass, LibXML::XML.indent_tree_output)
234
+ end
235
+
236
+ def test_version
237
+ assert_instance_of(String, LibXML::XML::VERSION)
238
+ end
239
+
240
+ def test_vernum
241
+ assert_instance_of(Integer, LibXML::XML::VERNUM)
242
+ end
243
+
244
+ def test_libxml_parser_features
245
+ assert_instance_of(Array, LibXML::XML.features)
246
+ end
247
+
248
+ def test_default_options
249
+ assert_equal(0, LibXML::XML.default_options)
250
+ end
251
+
252
+ def test_default_save_no_empty_tags
253
+ original = LibXML::XML.default_save_no_empty_tags
254
+
255
+ LibXML::XML.default_save_no_empty_tags = false
256
+ refute(LibXML::XML.default_save_no_empty_tags)
257
+
258
+ LibXML::XML.default_save_no_empty_tags = true
259
+ assert(LibXML::XML.default_save_no_empty_tags)
260
+
261
+ LibXML::XML.default_save_no_empty_tags = original
262
+ end
263
+ end
@@ -0,0 +1,244 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+ require 'tempfile'
5
+
6
+ class TestXPath < Minitest::Test
7
+ def setup
8
+ @doc = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/soap.xml'))
9
+ end
10
+
11
+ def teardown
12
+ @doc = nil
13
+ end
14
+
15
+ def test_doc_find
16
+ nodes = @doc.find('/soap:Envelope')
17
+ assert_instance_of(LibXML::XML::XPath::Object, nodes)
18
+ assert_equal(1, nodes.length)
19
+ assert_equal(nodes.xpath_type, LibXML::XML::XPath::NODESET)
20
+ end
21
+
22
+ def test_doc_find_first
23
+ node = @doc.find_first('/soap:Envelope/soap:Body')
24
+ assert_instance_of(LibXML::XML::Node, node)
25
+ end
26
+
27
+ def test_ns
28
+ nodes = @doc.find('//ns1:IdAndName', 'ns1:http://domain.somewhere.com')
29
+ assert_equal(3, nodes.length)
30
+ end
31
+
32
+ def test_ns_gc
33
+ _stress = GC.stress
34
+ GC.stress = true
35
+
36
+ doc = LibXML::XML::Document.string('<foo xmlns="http://bar.com" />')
37
+ node = doc.root
38
+ # This line segfaults on prior versions of libxml-ruby
39
+ node.find("namespace::*")
40
+
41
+ GC.stress = _stress
42
+ end
43
+
44
+ def test_ns_array
45
+ nodes = @doc.find('//ns1:IdAndName', ['ns1:http://domain.somewhere.com'])
46
+ assert_equal(3, nodes.length)
47
+ end
48
+
49
+ def test_default_ns1
50
+ # Find all nodes with http://services.somewhere.com namespace
51
+ nodes = @doc.find('//*[namespace-uri()="http://services.somewhere.com"]')
52
+ assert_equal(2, nodes.length)
53
+ assert_equal('getManufacturerNamesResponse', nodes[0].name)
54
+ assert_equal('IDAndNameList', nodes[1].name)
55
+ end
56
+
57
+ def test_default_ns2
58
+ # Find all nodes with http://services.somewhere.com namespace
59
+ nodes = @doc.find('//ns:*', 'ns:http://services.somewhere.com')
60
+ assert_equal(2, nodes.length)
61
+ assert_equal('getManufacturerNamesResponse', nodes[0].name)
62
+ assert_equal('IDAndNameList', nodes[1].name)
63
+
64
+ # Get getManufacturerNamesResponse node
65
+ nodes = @doc.find('//ns:getManufacturerNamesResponse', 'ns:http://services.somewhere.com')
66
+ assert_equal(1, nodes.length)
67
+
68
+ # Get IdAndName node
69
+ nodes = @doc.find('/soap:Envelope/soap:Body/ns0:getManufacturerNamesResponse/ns0:IDAndNameList/ns1:IdAndName',
70
+ ['ns0:http://services.somewhere.com', 'ns1:http://domain.somewhere.com'])
71
+ assert_equal(3, nodes.length)
72
+ end
73
+
74
+ def test_default_ns3
75
+ # Find all nodes with http://services.somewhere.com namespace
76
+ nodes = @doc.find('//ns:*', 'ns' => 'http://services.somewhere.com')
77
+ assert_equal(2, nodes.length)
78
+ assert_equal('getManufacturerNamesResponse', nodes[0].name)
79
+ assert_equal('IDAndNameList', nodes[1].name)
80
+ end
81
+
82
+ def test_default_ns4
83
+ # Find all nodes with http://services.somewhere.com namespace
84
+ nodes = @doc.find('//ns:*', :ns => 'http://services.somewhere.com')
85
+ assert_equal(2, nodes.length)
86
+ assert_equal('getManufacturerNamesResponse', nodes[0].name)
87
+ assert_equal('IDAndNameList', nodes[1].name)
88
+ end
89
+
90
+ def test_default_ns5
91
+ # Find all nodes with http://services.somewhere.com namespace
92
+ LibXML::XML::Namespace.new(@doc.root, 'ns', 'http://services.somewhere.com')
93
+ nodes = @doc.find('//ns:*')
94
+ assert_equal(2, nodes.length)
95
+ assert_equal('getManufacturerNamesResponse', nodes[0].name)
96
+ assert_equal('IDAndNameList', nodes[1].name)
97
+ end
98
+
99
+ def test_attribute_ns
100
+ # Pull all nodes with http://services.somewhere.com namespace
101
+ nodes = @doc.find('@soap:encodingStyle')
102
+ assert_equal(1, nodes.length)
103
+ assert_equal('encodingStyle', nodes.first.name)
104
+ assert_equal('http://www.w3.org/2001/12/soap-encoding', nodes.first.value)
105
+ end
106
+
107
+ def test_register_default_ns
108
+ doc = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/atom.xml'))
109
+
110
+ # No namespace has been yet defined
111
+ assert_raises(LibXML::XML::Error) do
112
+ doc.find("atom:title")
113
+ end
114
+
115
+ node = doc.find('atom:title', 'atom:http://www.w3.org/2005/Atom')
116
+ refute_nil(node)
117
+
118
+ # Register namespace
119
+ doc.root.namespaces.default_prefix = 'atom'
120
+ node = doc.find("atom:title")
121
+ refute_nil(node)
122
+ end
123
+
124
+ def test_node_find
125
+ nodes = @doc.find('//ns1:IdAndName', 'ns1:http://domain.somewhere.com')
126
+ node = nodes.first
127
+
128
+ # Since we are searching on the node, don't have to register namespace
129
+ nodes = node.find('ns1:name')
130
+ assert_equal(1, nodes.length)
131
+ refute_equal(nodes.first.object_id, nodes.last.object_id)
132
+ assert_equal('name', nodes.first.name)
133
+ assert_equal('man1', nodes.first.content)
134
+ end
135
+
136
+ def test_node_find_first
137
+ node = @doc.find_first('//ns1:IdAndName', 'ns1:http://domain.somewhere.com')
138
+
139
+ # Since we are searching on the node, don't have to register namespace
140
+ node = node.find_first('ns1:name')
141
+ assert_equal('name', node.name)
142
+ assert_equal('man1', node.content)
143
+ end
144
+
145
+ def test_node_no_doc
146
+ node = LibXML::XML::Node.new('header', 'some content')
147
+ assert_raises(TypeError) do
148
+ node = node.find_first('/header')
149
+ end
150
+ end
151
+
152
+ def test_memory
153
+ # This sometimes causes a segmentation fault because
154
+ # an xml document is sometimes freed before the
155
+ # xpath_object used to query it. When the xpath_object
156
+ # is free, it iterates over its results which are pointers
157
+ # to the document's nodes. A segmentation fault then happens.
158
+
159
+ 1000.times do
160
+ doc = LibXML::XML::Document.new('1.0')
161
+ doc.root = LibXML::XML::Node.new("header")
162
+
163
+ 1000.times do
164
+ doc.root << LibXML::XML::Node.new("footer")
165
+ end
166
+
167
+ doc.find('/header/footer')
168
+ end
169
+ end
170
+
171
+ # Test that document doesn't get freed before nodes
172
+ def test_xpath_free
173
+ doc = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/soap.xml'))
174
+ nodes = doc.find('//*')
175
+ GC.start
176
+ assert_equal('Envelope', nodes.first.name)
177
+ end
178
+
179
+ def test_xpath_namespace_nodes
180
+ doc = LibXML::XML::Document.string('<feed xmlns="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml"><entry/></feed>')
181
+ nodes = doc.find('//atom:entry|namespace::*', :atom => "http://www.w3.org/2005/Atom")
182
+ assert_equal(4, nodes.length)
183
+
184
+ node = nodes[0]
185
+ assert_equal(LibXML::XML::Node::ELEMENT_NODE, node.node_type)
186
+
187
+ node = nodes[1]
188
+ assert_equal(LibXML::XML::Node::NAMESPACE_DECL, node.node_type)
189
+
190
+ node = nodes[2]
191
+ assert_equal(LibXML::XML::Node::NAMESPACE_DECL, node.node_type)
192
+
193
+ node = nodes[3]
194
+ assert_equal(LibXML::XML::Node::NAMESPACE_DECL, node.node_type)
195
+ end
196
+
197
+ # Test to make sure we don't get nil on empty results.
198
+ # This is also to test that we don't segfault due to our C code getting a NULL pointer
199
+ # and not handling it properly.
200
+ def test_xpath_empty_result
201
+ doc = LibXML::XML::Document.string('<html><body><p>Welcome to XHTML land!</p></body></html>')
202
+ nodes = doc.find("//object/param[translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'wmode']")
203
+ refute_nil nodes
204
+ end
205
+
206
+ def test_invalid_expression
207
+ xml = LibXML::XML::Document.string('<a></a>')
208
+
209
+ # Using the expression twice used to cause a Segmentation Fault
210
+ error = assert_raises(LibXML::XML::Error) do
211
+ xml.find('//a/')
212
+ end
213
+ assert_equal("Error: Invalid expression.", error.to_s)
214
+
215
+ # Try again - this used to cause a Segmentation Fault
216
+ error = assert_raises(LibXML::XML::Error) do
217
+ xml.find('//a/')
218
+ end
219
+ assert_equal("Error: Invalid expression.", error.to_s)
220
+ end
221
+
222
+ def test_find_cdata
223
+ doc = LibXML::XML::Document.string('<root>hi there <![CDATA[ mycdata ]]> bye!</root>')
224
+
225
+ nodes = doc.find('/root/text()')
226
+ assert_equal(3, nodes.length)
227
+ assert_equal(nodes[0].node_type, LibXML::XML::Node::TEXT_NODE)
228
+ assert_equal(nodes[0].content, 'hi there ')
229
+
230
+ assert_equal(nodes[1].node_type, LibXML::XML::Node::CDATA_SECTION_NODE)
231
+ assert_equal(nodes[1].content, ' mycdata ')
232
+
233
+ assert_equal(nodes[2].node_type, LibXML::XML::Node::TEXT_NODE)
234
+ assert_equal(nodes[2].content, ' bye!')
235
+ end
236
+
237
+ def test_find_comment
238
+ doc = LibXML::XML::Document.string('<root>hi there <!-- my comment --> bye!</root>')
239
+
240
+ nodes = doc.find('//comment()')
241
+ assert_equal(1, nodes.length)
242
+ assert_equal(nodes[0].content, ' my comment ')
243
+ end
244
+ end
@@ -0,0 +1,88 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+ require "tempfile"
5
+
6
+ class TestXPathContext < Minitest::Test
7
+ SOAP_PREFIX = 'soap'
8
+ SOAP_URI = 'http://schemas.xmlsoap.org/soap/envelope/'
9
+
10
+ NS0_PREFIX = 'ns0'
11
+ NS0_URI = 'http://services.somewhere.com'
12
+
13
+ def setup
14
+ doc = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/soap.xml'))
15
+ @context = LibXML::XML::XPath::Context.new(doc)
16
+ end
17
+
18
+ def teardown()
19
+ @context = nil
20
+ end
21
+
22
+ def test_no_ns
23
+ error = assert_raises(LibXML::XML::Error) do
24
+ @context.find('/soap:Envelope')
25
+ end
26
+ assert_equal("Error: Undefined namespace prefix.", error.to_s)
27
+ end
28
+
29
+ def test_ns_register
30
+ @context.register_namespace(SOAP_PREFIX, SOAP_URI)
31
+ @context.register_namespace(NS0_PREFIX, NS0_URI)
32
+ nodes = @context.find('/soap:Envelope/soap:Body/ns0:getManufacturerNamesResponse')
33
+ assert_equal(1, nodes.length)
34
+ end
35
+
36
+ def test_ns_register_string
37
+ @context.register_namespaces("#{SOAP_PREFIX}:#{SOAP_URI}")
38
+ @context.register_namespaces("#{NS0_PREFIX}:#{NS0_URI}")
39
+ nodes = @context.find('/soap:Envelope/soap:Body/ns0:getManufacturerNamesResponse')
40
+ assert_equal(1, nodes.length)
41
+ end
42
+
43
+ def test_ns_register_array
44
+ @context.register_namespaces(["#{SOAP_PREFIX}:#{SOAP_URI}", "#{NS0_PREFIX}:#{NS0_URI}"])
45
+ nodes = @context.find('/soap:Envelope/soap:Body/ns0:getManufacturerNamesResponse')
46
+ assert_equal(1, nodes.length)
47
+ end
48
+
49
+ def test_ns_register_hash
50
+ @context.register_namespaces(SOAP_PREFIX => SOAP_URI,
51
+ NS0_PREFIX => NS0_URI)
52
+
53
+ nodes = @context.find('/soap:Envelope/soap:Body/ns0:getManufacturerNamesResponse')
54
+ assert_equal(1, nodes.length)
55
+ end
56
+
57
+ def test_ns_register_node
58
+ @context.register_namespaces_from_node(@context.doc.root)
59
+ nodes = @context.find('/soap:Envelope')
60
+ assert_equal(1, nodes.length)
61
+ end
62
+
63
+ def test_node
64
+ @context.register_namespaces_from_node(@context.doc.root)
65
+
66
+ nodes = @context.find('soap:Body')
67
+ assert_equal(0, nodes.length)
68
+
69
+
70
+ @context.node = @context.doc.root.child.next
71
+ nodes = @context.find('soap:Body')
72
+ assert_equal(0, nodes.length)
73
+ end
74
+
75
+ def test_cache
76
+ @context.enable_cache
77
+ @context.enable_cache(10)
78
+ @context.disable_cache
79
+ end
80
+
81
+ def test_require_doc
82
+ doc = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/soap.xml'))
83
+ error = assert_raises(TypeError) do
84
+ @context = LibXML::XML::XPath::Context.new(doc.root)
85
+ end
86
+ assert_equal("Supplied argument must be a document or node.", error.to_s)
87
+ end
88
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+
5
+
6
+ class TestXPathExpression < Minitest::Test
7
+ def setup
8
+ xp = LibXML::XML::Parser.string('<ruby_array uga="booga" foo="bar"><fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>')
9
+ @doc = xp.parse
10
+ end
11
+
12
+ def teardown
13
+ @doc = nil
14
+ end
15
+
16
+ def test_nodes
17
+ expr = LibXML::XML::XPath::Expression.compile('/ruby_array/fixnum')
18
+ set = @doc.find(expr)
19
+ assert_instance_of(LibXML::XML::XPath::Object, set)
20
+ assert_equal(2, set.size)
21
+ end
22
+
23
+ def test_find_class
24
+ expr = LibXML::XML::XPath::Expression.new('/ruby_array/fixnum')
25
+ set = @doc.find(expr)
26
+ assert_instance_of(LibXML::XML::XPath::Object, set)
27
+ assert_equal(2, set.size)
28
+ end
29
+
30
+ def test_find_invalid
31
+ error = assert_raises(TypeError) do
32
+ @doc.find(999)
33
+ end
34
+ assert_equal('Argument should be an instance of a String or XPath::Expression',
35
+ error.to_s)
36
+ end
37
+ end
@@ -0,0 +1,72 @@
1
+ # encoding: UTF-8
2
+ require_relative './test_helper'
3
+
4
+ class TC_XML_XPointer < Minitest::Test
5
+ def setup()
6
+ xp = LibXML::XML::Parser.string('<!DOCTYPE ra [<!ELEMENT ra (foo+)><!ATTLIST ra id ID #IMPLIED><!ELEMENT foo (#PCDATA)><!ATTLIST foo id ID #IMPLIED>]><ra id="start"><foo id="one">one</foo><foo id="two">two</foo><foo id="three">three</foo></ra>')
7
+ @doc = xp.parse
8
+ assert_instance_of(LibXML::XML::Document, @doc)
9
+ @root = @doc.root
10
+ assert_instance_of(LibXML::XML::Node, @root)
11
+ end
12
+
13
+ def teardown()
14
+ @doc = nil
15
+ @root = nil
16
+ @xptr = nil
17
+ end
18
+
19
+ def test_libxml_xpointer_id
20
+ xptr = @root.pointer('xpointer(id("two"))')
21
+ assert_instance_of(LibXML::XML::XPath::Object, xptr)
22
+ xptr.each do |node|
23
+ # It seems from the spec that the pointer should
24
+ # be the whole node, rather than just the ID attr.
25
+ assert_equal('two', node.content)
26
+ assert_instance_of(LibXML::XML::Node, node)
27
+ assert_equal('two', node['id'])
28
+ end
29
+
30
+ # FIXME: Not sure at all about this kind of range
31
+ if ENV['NOTWORKING']
32
+ @xptr = @root.pointer('xpointer(id("two")) xpointer(id("three"))')
33
+ assert_instance_of(LibXML::XML::XPath, @xptr)
34
+ assert_instance_of(LibXML::XML::Node::Set, @xptr.set)
35
+ assert_equal(2, @xptr.set.length)
36
+ for n in @xptr.set
37
+ assert_match(/two|three/, n.to_s)
38
+ end
39
+ end
40
+ end
41
+
42
+ # FIXME: There is a bug in these ranges...
43
+ if ENV['NOTWORKING']
44
+ def test_libxml_xpointer_range()
45
+ nstart = nend = nil
46
+ @xptr = @root.pointer('xpointer(id("one"))').set
47
+ @xptr.each{|n| nstart = n}
48
+ assert_instance_of(LibXML::XML::Node, nstart)
49
+ @xptr = @root.pointer('xpointer(id("three"))').set
50
+ @xptr.each{|n| nend = n}
51
+ assert_instance_of(LibXML::XML::Node, nend)
52
+ range = LibXML::XML::XPointer.range(nstart, nend)
53
+ assert_instance_of(LibXML::XML::XPath, range)
54
+ assert_instance_of(LibXML::XML::Node::Set, range.set)
55
+
56
+ for n in range.set
57
+ assert_match(/one|two|three/, n.to_s)
58
+ end
59
+ assert_equal(3, range.set.length)
60
+ end
61
+ end
62
+
63
+ # def test_libxml_xpointer_start_point()
64
+ # @xptr = @root.pointer('xpointer(start-point("one"))')
65
+ # assert_instance_of(LibXML::XML::XPath, @xptr)
66
+ # set = @xptr.set
67
+ # assert_instance_of(LibXML::XML::Node::Set, set)
68
+ # for n in set
69
+ # assert_match(/one|two|three/, n.to_s)
70
+ # end
71
+ # end
72
+ end