libxml-ruby 3.2.2-x64-mingw-ucrt

Sign up to get free protection for your applications and to get access to all the features.
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