nokogiri 1.8.5 → 1.9.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/ext/nokogiri/extconf.rb +10 -6
  4. data/ext/nokogiri/xml_attr.c +26 -21
  5. data/ext/nokogiri/xml_document.c +4 -1
  6. data/ext/nokogiri/xml_namespace.c +3 -3
  7. data/ext/nokogiri/xml_namespace.h +1 -2
  8. data/ext/nokogiri/xml_node.c +55 -15
  9. data/lib/nokogiri/css/parser.rb +61 -61
  10. data/lib/nokogiri/version.rb +1 -1
  11. data/lib/nokogiri/xml/document_fragment.rb +11 -0
  12. data/lib/nokogiri/xml/node.rb +12 -0
  13. data/lib/nokogiri/xml/node_set.rb +4 -8
  14. metadata +17 -153
  15. data/.autotest +0 -22
  16. data/.cross_rubies +0 -8
  17. data/.editorconfig +0 -17
  18. data/.gemtest +0 -0
  19. data/.travis.yml +0 -63
  20. data/CHANGELOG.md +0 -1368
  21. data/CONTRIBUTING.md +0 -42
  22. data/C_CODING_STYLE.rdoc +0 -33
  23. data/Gemfile +0 -23
  24. data/Gemfile-libxml-ruby +0 -3
  25. data/Manifest.txt +0 -370
  26. data/ROADMAP.md +0 -111
  27. data/Rakefile +0 -348
  28. data/SECURITY.md +0 -19
  29. data/STANDARD_RESPONSES.md +0 -47
  30. data/Y_U_NO_GEMSPEC.md +0 -155
  31. data/appveyor.yml +0 -29
  32. data/build_all +0 -44
  33. data/patches/sort-patches-by-date +0 -25
  34. data/suppressions/README.txt +0 -1
  35. data/suppressions/nokogiri_ruby-2.supp +0 -10
  36. data/tasks/test.rb +0 -100
  37. data/test/css/test_nthiness.rb +0 -226
  38. data/test/css/test_parser.rb +0 -386
  39. data/test/css/test_tokenizer.rb +0 -215
  40. data/test/css/test_xpath_visitor.rb +0 -96
  41. data/test/decorators/test_slop.rb +0 -23
  42. data/test/files/2ch.html +0 -108
  43. data/test/files/GH_1042.html +0 -18
  44. data/test/files/address_book.rlx +0 -12
  45. data/test/files/address_book.xml +0 -10
  46. data/test/files/atom.xml +0 -344
  47. data/test/files/bar/bar.xsd +0 -4
  48. data/test/files/bogus.xml +0 -0
  49. data/test/files/dont_hurt_em_why.xml +0 -422
  50. data/test/files/encoding.html +0 -82
  51. data/test/files/encoding.xhtml +0 -84
  52. data/test/files/exslt.xml +0 -8
  53. data/test/files/exslt.xslt +0 -35
  54. data/test/files/foo/foo.xsd +0 -4
  55. data/test/files/metacharset.html +0 -10
  56. data/test/files/namespace_pressure_test.xml +0 -1684
  57. data/test/files/noencoding.html +0 -47
  58. data/test/files/po.xml +0 -32
  59. data/test/files/po.xsd +0 -66
  60. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  61. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  62. data/test/files/saml/xenc_schema.xsd +0 -146
  63. data/test/files/saml/xmldsig_schema.xsd +0 -318
  64. data/test/files/shift_jis.html +0 -10
  65. data/test/files/shift_jis.xml +0 -5
  66. data/test/files/shift_jis_no_charset.html +0 -9
  67. data/test/files/slow-xpath.xml +0 -25509
  68. data/test/files/snuggles.xml +0 -3
  69. data/test/files/staff.dtd +0 -10
  70. data/test/files/staff.xml +0 -59
  71. data/test/files/staff.xslt +0 -32
  72. data/test/files/test_document_url/bar.xml +0 -2
  73. data/test/files/test_document_url/document.dtd +0 -4
  74. data/test/files/test_document_url/document.xml +0 -6
  75. data/test/files/tlm.html +0 -851
  76. data/test/files/to_be_xincluded.xml +0 -2
  77. data/test/files/valid_bar.xml +0 -2
  78. data/test/files/xinclude.xml +0 -4
  79. data/test/helper.rb +0 -271
  80. data/test/html/sax/test_parser.rb +0 -168
  81. data/test/html/sax/test_parser_context.rb +0 -46
  82. data/test/html/sax/test_parser_text.rb +0 -163
  83. data/test/html/sax/test_push_parser.rb +0 -87
  84. data/test/html/test_attributes.rb +0 -85
  85. data/test/html/test_builder.rb +0 -164
  86. data/test/html/test_document.rb +0 -712
  87. data/test/html/test_document_encoding.rb +0 -143
  88. data/test/html/test_document_fragment.rb +0 -310
  89. data/test/html/test_element_description.rb +0 -105
  90. data/test/html/test_named_characters.rb +0 -14
  91. data/test/html/test_node.rb +0 -212
  92. data/test/html/test_node_encoding.rb +0 -91
  93. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  94. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  95. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  96. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  97. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  98. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  99. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  100. data/test/test_convert_xpath.rb +0 -135
  101. data/test/test_css_cache.rb +0 -47
  102. data/test/test_encoding_handler.rb +0 -48
  103. data/test/test_memory_leak.rb +0 -156
  104. data/test/test_nokogiri.rb +0 -138
  105. data/test/test_soap4r_sax.rb +0 -52
  106. data/test/test_xslt_transforms.rb +0 -314
  107. data/test/xml/node/test_save_options.rb +0 -28
  108. data/test/xml/node/test_subclass.rb +0 -44
  109. data/test/xml/sax/test_parser.rb +0 -402
  110. data/test/xml/sax/test_parser_context.rb +0 -115
  111. data/test/xml/sax/test_parser_text.rb +0 -202
  112. data/test/xml/sax/test_push_parser.rb +0 -265
  113. data/test/xml/test_attr.rb +0 -74
  114. data/test/xml/test_attribute_decl.rb +0 -86
  115. data/test/xml/test_builder.rb +0 -341
  116. data/test/xml/test_c14n.rb +0 -180
  117. data/test/xml/test_cdata.rb +0 -54
  118. data/test/xml/test_comment.rb +0 -40
  119. data/test/xml/test_document.rb +0 -982
  120. data/test/xml/test_document_encoding.rb +0 -31
  121. data/test/xml/test_document_fragment.rb +0 -298
  122. data/test/xml/test_dtd.rb +0 -187
  123. data/test/xml/test_dtd_encoding.rb +0 -31
  124. data/test/xml/test_element_content.rb +0 -56
  125. data/test/xml/test_element_decl.rb +0 -73
  126. data/test/xml/test_entity_decl.rb +0 -122
  127. data/test/xml/test_entity_reference.rb +0 -262
  128. data/test/xml/test_namespace.rb +0 -96
  129. data/test/xml/test_node.rb +0 -1325
  130. data/test/xml/test_node_attributes.rb +0 -115
  131. data/test/xml/test_node_encoding.rb +0 -75
  132. data/test/xml/test_node_inheritance.rb +0 -32
  133. data/test/xml/test_node_reparenting.rb +0 -592
  134. data/test/xml/test_node_set.rb +0 -809
  135. data/test/xml/test_parse_options.rb +0 -64
  136. data/test/xml/test_processing_instruction.rb +0 -30
  137. data/test/xml/test_reader.rb +0 -620
  138. data/test/xml/test_reader_encoding.rb +0 -134
  139. data/test/xml/test_relax_ng.rb +0 -60
  140. data/test/xml/test_schema.rb +0 -142
  141. data/test/xml/test_syntax_error.rb +0 -36
  142. data/test/xml/test_text.rb +0 -60
  143. data/test/xml/test_unparented_node.rb +0 -483
  144. data/test/xml/test_xinclude.rb +0 -83
  145. data/test/xml/test_xpath.rb +0 -470
  146. data/test/xslt/test_custom_functions.rb +0 -133
  147. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,470 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestXPath < Nokogiri::TestCase
6
-
7
- # ** WHY ALL THOSE _if Nokogiri.uses_libxml?_ **
8
- # Hi, my dear readers,
9
- #
10
- # After reading these tests you may be wondering why all those ugly
11
- # if Nokogiri.uses_libxml? sparsed over the whole document. Well, let
12
- # me explain it. While using XPath in Java, you need the extension
13
- # functions to be in a namespace. This is not required by XPath, afaik,
14
- # but it is an usual convention though.
15
- #
16
- # Yours truly,
17
- #
18
- # The guy whose headaches belong to Nokogiri JRuby impl.
19
-
20
-
21
- def setup
22
- super
23
-
24
- @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
25
-
26
- @ns = @xml.root.namespaces
27
-
28
- # TODO: Maybe I should move this to the original code.
29
- @ns["nokogiri"] = "http://www.nokogiri.org/default_ns/ruby/extensions_functions"
30
-
31
- @handler = Class.new {
32
- attr_reader :things
33
-
34
- def initialize
35
- @things = []
36
- end
37
-
38
- def thing thing
39
- @things << thing
40
- thing
41
- end
42
-
43
- def returns_array node_set
44
- @things << node_set.to_a
45
- node_set.to_a
46
- end
47
-
48
- def my_filter set, attribute, value
49
- set.find_all { |x| x[attribute] == value }
50
- end
51
-
52
- def saves_node_set node_set
53
- @things = node_set
54
- end
55
-
56
- def value
57
- 123.456
58
- end
59
-
60
- def anint
61
- 1230456
62
- end
63
- }.new
64
- end
65
-
66
- def test_variable_binding
67
- assert_equal 4, @xml.xpath('//address[@domestic=$value]', nil, :value => 'Yes').length
68
- end
69
-
70
- def test_variable_binding_with_search
71
- assert_equal 4, @xml.search('//address[@domestic=$value]', nil, :value => 'Yes').length
72
- end
73
-
74
- def test_unknown_attribute
75
- assert_equal 0, @xml.xpath('//employee[@id="asdfasdf"]/@fooo').length
76
- assert_nil @xml.xpath('//employee[@id="asdfasdf"]/@fooo')[0]
77
- end
78
-
79
- def test_boolean
80
- assert_equal false, @xml.xpath('1 = 2')
81
- end
82
-
83
- def test_number
84
- assert_equal 2, @xml.xpath('1 + 1')
85
- end
86
-
87
- def test_string
88
- assert_equal 'foo', @xml.xpath('concat("fo", "o")')
89
- end
90
-
91
- def test_node_search_with_multiple_queries
92
- xml = '<document>
93
- <thing>
94
- <div class="title">important thing</div>
95
- </thing>
96
- <thing>
97
- <div class="content">stuff</div>
98
- </thing>
99
- <thing>
100
- <p class="blah">more stuff</div>
101
- </thing>
102
- </document>'
103
- node = Nokogiri::XML(xml).root
104
- assert_kind_of Nokogiri::XML::Node, node
105
-
106
- assert_equal 3, node.xpath('.//div', './/p').length
107
- assert_equal 3, node.css('.title', '.content', 'p').length
108
- assert_equal 3, node.search('.//div', 'p.blah').length
109
- end
110
-
111
- def test_css_search_with_ambiguous_integer_or_string_attributes
112
- # https://github.com/sparklemotion/nokogiri/issues/711
113
- html = "<body><div><img width=200>"
114
- doc = Nokogiri::HTML(html)
115
- assert_not_nil doc.at_css("img[width='200']")
116
- assert_not_nil doc.at_css("img[width=200]")
117
- end
118
-
119
- def test_css_search_uses_custom_selectors_with_arguments
120
- set = @xml.css('employee > address:my_filter("domestic", "Yes")', @handler)
121
- assert set.length > 0
122
- set.each do |node|
123
- assert_equal 'Yes', node['domestic']
124
- end
125
- end
126
-
127
- def test_css_search_uses_custom_selectors
128
- set = @xml.xpath('//employee')
129
- @xml.css('employee:thing()', @handler)
130
- assert_equal(set.length, @handler.things.length)
131
- assert_equal(set.to_a, @handler.things.flatten)
132
- end
133
-
134
- def test_search_with_css_query_uses_custom_selectors_with_arguments
135
- set = @xml.search('employee > address:my_filter("domestic", "Yes")', @handler)
136
- assert set.length > 0
137
- set.each do |node|
138
- assert_equal 'Yes', node['domestic']
139
- end
140
- end
141
-
142
- def test_search_with_xpath_query_uses_custom_selectors_with_arguments
143
- set = if Nokogiri.uses_libxml?
144
- @xml.search('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
145
- else
146
- @xml.search('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
147
- end
148
- assert set.length > 0
149
- set.each do |node|
150
- assert_equal 'Yes', node['domestic']
151
- end
152
- end
153
-
154
- def test_pass_self_to_function
155
- set = if Nokogiri.uses_libxml?
156
- @xml.xpath('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
157
- else
158
- @xml.xpath('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
159
- end
160
- assert set.length > 0
161
- set.each do |node|
162
- assert_equal 'Yes', node['domestic']
163
- end
164
- end
165
-
166
- def test_custom_xpath_function_gets_strings
167
- set = @xml.xpath('//employee')
168
- if Nokogiri.uses_libxml?
169
- @xml.xpath('//employee[thing("asdf")]', @handler)
170
- else
171
- @xml.xpath('//employee[nokogiri:thing("asdf")]', @ns, @handler)
172
- end
173
- assert_equal(set.length, @handler.things.length)
174
- assert_equal(['asdf'] * set.length, @handler.things)
175
- end
176
-
177
- def parse_params node
178
- params={}
179
- node.xpath('./param').each do |p|
180
- subparams = parse_params p
181
- if(subparams.length > 0)
182
- if(not params.has_key? p.attributes['name'].value)
183
- params[p.attributes['name'].value] = subparams
184
- else
185
- if(params[p.attributes['name'].value].is_a? Array)
186
- params[p.attributes['name'].value] << subparams
187
- else
188
- value = params[p.attributes['name'].value]
189
- params[p.attributes['name'].value] = [value,subparams]
190
- end
191
- end
192
- else
193
- params[p.attributes['name'].value]=p.text
194
- end
195
- end
196
- params
197
- end
198
-
199
- # issue #741 (xpath() around 10x slower in JRuby)
200
- def test_slow_jruby_xpath
201
- skip("testing against an absolute time is brittle. help make this better! see https://github.com/sparklemotion/nokogiri/issues/741")
202
-
203
- doc = Nokogiri::XML(File.open(XPATH_FILE))
204
- start = Time.now
205
-
206
- doc.xpath('.//category').each do |c|
207
- c.xpath('programformats/programformat').each do |p|
208
- p.xpath('./modules/module').each do |m|
209
- parse_params m
210
- end
211
- end
212
- end
213
- stop = Time.now
214
- elapsed_time = stop - start
215
- time_limit = 20
216
- assert_send [elapsed_time, :<, time_limit], "XPath is taking too long"
217
- end
218
-
219
- # issue #1109 (jruby impl's xpath() cache not being cleared on attr removal)
220
- def test_xpath_results_cache_should_get_cleared_on_attr_removal
221
- doc = Nokogiri::HTML('<html><div name="foo"></div></html>')
222
- element = doc.at_xpath('//div[@name="foo"]')
223
- element.remove_attribute('name')
224
- assert_nil doc.at_xpath('//div[@name="foo"]')
225
- end
226
-
227
- # issue #1109 (jruby impl's xpath() cache not being cleared on attr update )
228
- def test_xpath_results_cache_should_get_cleared_on_attr_update
229
- doc = Nokogiri::HTML('<html><div name="foo"></div></html>')
230
- element = doc.at_xpath('//div[@name="foo"]')
231
- element['name'] = 'bar'
232
- assert_nil doc.at_xpath('//div[@name="foo"]')
233
- end
234
-
235
- def test_custom_xpath_function_returns_string
236
- if Nokogiri.uses_libxml?
237
- result = @xml.xpath('thing("asdf")', @handler)
238
- else
239
- result = @xml.xpath('nokogiri:thing("asdf")', @ns, @handler)
240
- end
241
- assert_equal 'asdf', result
242
- end
243
-
244
- def test_custom_xpath_gets_true_booleans
245
- set = @xml.xpath('//employee')
246
- if Nokogiri.uses_libxml?
247
- @xml.xpath('//employee[thing(true())]', @handler)
248
- else
249
- @xml.xpath("//employee[nokogiri:thing(true())]", @ns, @handler)
250
- end
251
- assert_equal(set.length, @handler.things.length)
252
- assert_equal([true] * set.length, @handler.things)
253
- end
254
-
255
- def test_custom_xpath_gets_false_booleans
256
- set = @xml.xpath('//employee')
257
- if Nokogiri.uses_libxml?
258
- @xml.xpath('//employee[thing(false())]', @handler)
259
- else
260
- @xml.xpath("//employee[nokogiri:thing(false())]", @ns, @handler)
261
- end
262
- assert_equal(set.length, @handler.things.length)
263
- assert_equal([false] * set.length, @handler.things)
264
- end
265
-
266
- def test_custom_xpath_gets_numbers
267
- set = @xml.xpath('//employee')
268
- if Nokogiri.uses_libxml?
269
- @xml.xpath('//employee[thing(10)]', @handler)
270
- else
271
- @xml.xpath('//employee[nokogiri:thing(10)]', @ns, @handler)
272
- end
273
- assert_equal(set.length, @handler.things.length)
274
- assert_equal([10] * set.length, @handler.things)
275
- end
276
-
277
- def test_custom_xpath_gets_node_sets
278
- set = @xml.xpath('//employee/name')
279
- if Nokogiri.uses_libxml?
280
- @xml.xpath('//employee[thing(name)]', @handler)
281
- else
282
- @xml.xpath('//employee[nokogiri:thing(name)]', @ns, @handler)
283
- end
284
- assert_equal(set.length, @handler.things.length)
285
- assert_equal(set.to_a, @handler.things.flatten)
286
- end
287
-
288
- def test_custom_xpath_gets_node_sets_and_returns_array
289
- set = @xml.xpath('//employee/name')
290
- if Nokogiri.uses_libxml?
291
- @xml.xpath('//employee[returns_array(name)]', @handler)
292
- else
293
- @xml.xpath('//employee[nokogiri:returns_array(name)]', @ns, @handler)
294
- end
295
- assert_equal(set.length, @handler.things.length)
296
- assert_equal(set.to_a, @handler.things.flatten)
297
- end
298
-
299
- def test_custom_xpath_handler_is_passed_a_decorated_node_set
300
- x = Module.new do
301
- def awesome! ; end
302
- end
303
- util_decorate(@xml, x)
304
-
305
- assert @xml.xpath('//employee/name')
306
-
307
- @xml.xpath('//employee[saves_node_set(name)]', @handler)
308
- assert_equal @xml, @handler.things.document
309
- assert @handler.things.respond_to?(:awesome!)
310
- end
311
-
312
- def test_code_that_invokes_OP_RESET_inside_libxml2
313
- doc = "<html><body id='foo'><foo>hi</foo></body></html>"
314
- xpath = 'id("foo")//foo'
315
- nokogiri = Nokogiri::HTML.parse(doc)
316
- assert nokogiri.xpath(xpath)
317
- end
318
-
319
- def test_custom_xpath_handler_with_args_under_gc_pressure
320
- # see http://github.com/sparklemotion/nokogiri/issues/#issue/345
321
- tool_inspector = Class.new do
322
- def name_equals(nodeset, name, *args)
323
- nodeset.all? do |node|
324
- args.each { |thing| thing.inspect }
325
- node["name"] == name
326
- end
327
- end
328
- end.new
329
-
330
- xml = <<-EOXML
331
- <toolbox>
332
- #{"<tool name='hammer'/><tool name='wrench'/>" * 10}
333
- </toolbox>
334
- EOXML
335
- doc = Nokogiri::XML xml
336
-
337
- # long list of long arguments, to apply GC pressure during
338
- # ruby_funcall argument marshalling
339
- xpath = ["//tool[name_equals(.,'hammer'"]
340
- 1000.times { xpath << "'unused argument #{'x' * 1000}'" }
341
- xpath << "'unused argument')]"
342
- xpath = xpath.join(',')
343
-
344
- assert_equal doc.xpath("//tool[@name='hammer']"), doc.xpath(xpath, tool_inspector)
345
- end
346
-
347
- def test_custom_xpath_without_arguments
348
- if Nokogiri.uses_libxml?
349
- value = @xml.xpath('value()', @handler)
350
- else
351
- value = @xml.xpath('nokogiri:value()', @ns, @handler)
352
- end
353
- assert_equal 123.456, value
354
- end
355
-
356
- def test_custom_xpath_without_arguments_returning_int
357
- if Nokogiri.uses_libxml?
358
- value = @xml.xpath('anint()', @handler)
359
- else
360
- value = @xml.xpath('nokogiri:anint()', @ns, @handler)
361
- end
362
- assert_equal 1230456, value
363
- end
364
-
365
- def test_custom_xpath_with_bullshit_arguments
366
- xml = %q{<foo> </foo>}
367
- doc = Nokogiri::XML.parse(xml)
368
- foo = doc.xpath('//foo[bool_function(bar/baz)]', Class.new {
369
- def bool_function(value)
370
- true
371
- end
372
- }.new)
373
- assert_equal foo, doc.xpath("//foo")
374
- end
375
-
376
- def test_node_set_should_be_decorated
377
- # "called decorate on nill" exception in JRuby issue#514
378
- process_output= <<END
379
- <test>
380
- <track type="Image">
381
- <Format>LZ77</Format>
382
- </test>
383
- END
384
- doc = Nokogiri::XML.parse(process_output)
385
- node = doc.xpath(%{//track[@type='Video']})
386
- assert_equal "[]", node.xpath("Format").inspect
387
- end
388
-
389
- def test_very_specific_xml_xpath_making_problems_in_jruby
390
- # manually merges pull request #681
391
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
392
- <ONIXMessage xmlns:elibri="http://elibri.com.pl/ns/extensions" release="3.0" xmlns="http://www.editeur.org/onix/3.0/reference">
393
- <Product>
394
- <RecordReference>a</RecordReference>
395
- </Product>
396
- </ONIXMessage>}
397
-
398
- xml_doc = Nokogiri::XML(xml_string)
399
- onix = xml_doc.children.first
400
- assert_equal 'a', onix.at_xpath('xmlns:Product').at_xpath('xmlns:RecordReference').text
401
- end
402
-
403
- def test_xpath_after_attribute_change
404
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
405
- <mods version="3.0" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
406
- <titleInfo>
407
- <nonSort>THE</nonSort>
408
- <title xml:lang="eng">ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
409
- <subTitle>SUBTITLE</subTitle>
410
- </titleInfo>
411
- <titleInfo lang="finnish">
412
- <title>Artikkelin otsikko Hydrangea artiklan 1</title>
413
- </titleInfo>
414
- </mods>}
415
-
416
- xml_doc = Nokogiri::XML(xml_string)
417
- ns_hash = {'mods'=>'http://www.loc.gov/mods/v3'}
418
- node = xml_doc.at_xpath('//mods:titleInfo[1]',ns_hash)
419
- node['lang'] = 'english'
420
- assert_equal 1, xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).length
421
- assert_equal 'english', xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).first.value
422
- end
423
-
424
- def test_xpath_after_element_removal
425
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
426
- <mods version="3.0" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
427
- <titleInfo>
428
- <nonSort>THE</nonSort>
429
- <title xml:lang="eng">ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
430
- <subTitle>SUBTITLE</subTitle>
431
- </titleInfo>
432
- <titleInfo lang="finnish">
433
- <title>Artikkelin otsikko Hydrangea artiklan 1</title>
434
- </titleInfo>
435
- </mods>}
436
-
437
- xml_doc = Nokogiri::XML(xml_string)
438
- ns_hash = {'mods'=>'http://www.loc.gov/mods/v3'}
439
- node = xml_doc.at_xpath('//mods:titleInfo[1]',ns_hash)
440
- node.remove
441
- assert_equal 1, xml_doc.xpath('//mods:titleInfo',ns_hash).length
442
- assert_equal 'finnish', xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).first.value
443
- end
444
-
445
- def test_xpath_after_reset_doc_via_innerhtml
446
- xml = <<XML
447
- <?xml version="1.0" encoding="UTF-8"?>
448
- <document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
449
- <text:section name="Section1">[TEXT_INSIDE_SECTION]</text:section>
450
- </document>
451
- XML
452
-
453
- doc = Nokogiri::XML(xml)
454
- doc.inner_html = doc.inner_html
455
- sections = doc.xpath(".//text:section[@name='Section1']")
456
- assert_equal 1, sections.size
457
- assert_equal "[TEXT_INSIDE_SECTION]", sections.first.text
458
- end
459
-
460
- def test_xpath_syntax_error
461
- doc = Nokogiri::XML('<ns1:Root></ns1:Root>')
462
- begin
463
- doc.xpath('//ns1:Root')
464
- rescue => e
465
- assert_equal false, e.message.include?('0:0')
466
- end
467
- end
468
- end
469
- end
470
- end
@@ -1,133 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- require "helper"
4
-
5
- module Nokogiri
6
- module XSLT
7
- class TestCustomFunctions < Nokogiri::TestCase
8
- def setup
9
- super
10
- @xml = Nokogiri.XML(<<-EOXML)
11
- <?xml version="1.0" encoding="UTF-8"?>
12
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
13
- "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
14
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
15
- <head>
16
- <meta http-equiv="Content-type" content="application/xhtml+xml"/>
17
- <title>Foo</title>
18
- </head>
19
- <body>
20
- <h1>Foo</h1>
21
- <p>Lorem ipsum.</p>
22
- </body>
23
- </html>
24
- EOXML
25
- end
26
-
27
- def test_function
28
- skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
29
- foo = Class.new do
30
- def capitalize nodes
31
- nodes.first.content.upcase
32
- end
33
- end
34
-
35
- XSLT.register "http://e.org/functions", foo
36
-
37
- xsl = Nokogiri.XSLT(<<-EOXSL)
38
- <?xml version="1.0"?>
39
- <xsl:stylesheet version="1.0"
40
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
41
- xmlns:f="http://e.org/functions"
42
- extension-element-prefixes="f">
43
-
44
- <xsl:template match="text()">
45
- <xsl:copy-of select="f:capitalize(.)"/>
46
- </xsl:template>
47
-
48
- <xsl:template match="@*|node()">
49
- <xsl:copy>
50
- <xsl:apply-templates select="@*|node()"/>
51
- <xsl:apply-imports/>
52
- </xsl:copy>
53
- </xsl:template>
54
-
55
- </xsl:stylesheet>
56
- EOXSL
57
- result = xsl.transform @xml
58
- assert_match(/FOO/, result.css('title').first.text)
59
- end
60
-
61
-
62
- def test_function_arguments
63
- skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
64
- foo = Class.new do
65
- include MiniTest::Assertions
66
- # Minitest 5 uses `self.assertions` in `assert()` which is not
67
- # defined in the Minitest::Assertions module :-(
68
- attr_writer :assertions
69
- def assertions; @assertions ||= 0; end
70
-
71
- def multiarg *args
72
- assert_equal ["abc", "xyz"], args
73
- args.first
74
- end
75
-
76
- def numericarg arg
77
- assert_equal 42, arg
78
- arg
79
- end
80
- end
81
-
82
- xsl = Nokogiri.XSLT(<<-EOXSL, "http://e.org/functions" => foo)
83
- <?xml version="1.0"?>
84
- <xsl:stylesheet version="1.0"
85
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
86
- xmlns:f="http://e.org/functions"
87
- extension-element-prefixes="f">
88
-
89
- <xsl:template match="text()">
90
- <xsl:copy-of select="f:multiarg('abc', 'xyz')"/>
91
- <xsl:copy-of select="f:numericarg(42)"/>
92
- </xsl:template>
93
- </xsl:stylesheet>
94
- EOXSL
95
-
96
- xsl.transform @xml
97
- end
98
-
99
-
100
- def test_function_XSLT
101
- skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
102
- foo = Class.new do
103
- def america nodes
104
- nodes.first.content.upcase
105
- end
106
- end
107
-
108
- xsl = Nokogiri.XSLT(<<-EOXSL, "http://e.org/functions" => foo)
109
- <?xml version="1.0"?>
110
- <xsl:stylesheet version="1.0"
111
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
112
- xmlns:f="http://e.org/functions"
113
- extension-element-prefixes="f">
114
-
115
- <xsl:template match="text()">
116
- <xsl:copy-of select="f:america(.)"/>
117
- </xsl:template>
118
-
119
- <xsl:template match="@*|node()">
120
- <xsl:copy>
121
- <xsl:apply-templates select="@*|node()"/>
122
- <xsl:apply-imports/>
123
- </xsl:copy>
124
- </xsl:template>
125
-
126
- </xsl:stylesheet>
127
- EOXSL
128
- result = xsl.transform @xml
129
- assert_match(/FOO/, result.css('title').first.text)
130
- end
131
- end
132
- end
133
- end
@@ -1,37 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XSLT
5
- class TestExceptionHandling < Nokogiri::TestCase
6
- def test_java_exception_handling
7
- skip('This test is for Java only') if Nokogiri.uses_libxml?
8
-
9
- xml = Nokogiri.XML(<<-EOXML)
10
- <foo>
11
- <bar/>
12
- </foo>
13
- EOXML
14
-
15
- xsl = Nokogiri.XSLT(<<-EOXSL)
16
- <?xml version="1.0"?>
17
- <xsl:stylesheet version="1.0"
18
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
19
-
20
- <xsl:template match="/">
21
- <a/>
22
- <b/>
23
- </xsl:template>
24
- </xsl:stylesheet>
25
- EOXSL
26
-
27
- begin
28
- xsl.transform xml
29
- fail('It should not get here')
30
- rescue RuntimeError => e
31
- assert_match(/Can't have more than one root/, e.to_s, 'The exception message does not contain the expected information')
32
- end
33
- end
34
-
35
- end
36
- end
37
- end