nokogiri 1.9.0.rc1 → 1.9.0

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 (137) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nokogiri/css/parser.rb +61 -61
  3. data/lib/nokogiri/version.rb +1 -1
  4. metadata +4 -146
  5. data/.autotest +0 -22
  6. data/.cross_rubies +0 -8
  7. data/.editorconfig +0 -17
  8. data/.gemtest +0 -0
  9. data/.travis.yml +0 -63
  10. data/CHANGELOG.md +0 -1402
  11. data/CONTRIBUTING.md +0 -42
  12. data/C_CODING_STYLE.rdoc +0 -33
  13. data/Gemfile +0 -23
  14. data/Gemfile-libxml-ruby +0 -3
  15. data/Manifest.txt +0 -371
  16. data/ROADMAP.md +0 -111
  17. data/Rakefile +0 -358
  18. data/SECURITY.md +0 -19
  19. data/STANDARD_RESPONSES.md +0 -47
  20. data/Y_U_NO_GEMSPEC.md +0 -155
  21. data/appveyor.yml +0 -29
  22. data/build_all +0 -48
  23. data/patches/sort-patches-by-date +0 -25
  24. data/suppressions/README.txt +0 -1
  25. data/suppressions/nokogiri_ruby-2.supp +0 -10
  26. data/tasks/test.rb +0 -100
  27. data/test/css/test_nthiness.rb +0 -226
  28. data/test/css/test_parser.rb +0 -386
  29. data/test/css/test_tokenizer.rb +0 -215
  30. data/test/css/test_xpath_visitor.rb +0 -96
  31. data/test/decorators/test_slop.rb +0 -23
  32. data/test/files/2ch.html +0 -108
  33. data/test/files/GH_1042.html +0 -18
  34. data/test/files/address_book.rlx +0 -12
  35. data/test/files/address_book.xml +0 -10
  36. data/test/files/atom.xml +0 -344
  37. data/test/files/bar/bar.xsd +0 -4
  38. data/test/files/bogus.xml +0 -0
  39. data/test/files/dont_hurt_em_why.xml +0 -422
  40. data/test/files/encoding.html +0 -82
  41. data/test/files/encoding.xhtml +0 -84
  42. data/test/files/exslt.xml +0 -8
  43. data/test/files/exslt.xslt +0 -35
  44. data/test/files/foo/foo.xsd +0 -4
  45. data/test/files/metacharset.html +0 -10
  46. data/test/files/namespace_pressure_test.xml +0 -1684
  47. data/test/files/noencoding.html +0 -47
  48. data/test/files/po.xml +0 -32
  49. data/test/files/po.xsd +0 -66
  50. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  51. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  52. data/test/files/saml/xenc_schema.xsd +0 -146
  53. data/test/files/saml/xmldsig_schema.xsd +0 -318
  54. data/test/files/shift_jis.html +0 -10
  55. data/test/files/shift_jis.xml +0 -5
  56. data/test/files/shift_jis_no_charset.html +0 -9
  57. data/test/files/slow-xpath.xml +0 -25509
  58. data/test/files/snuggles.xml +0 -3
  59. data/test/files/staff.dtd +0 -10
  60. data/test/files/staff.xml +0 -59
  61. data/test/files/staff.xslt +0 -32
  62. data/test/files/test_document_url/bar.xml +0 -2
  63. data/test/files/test_document_url/document.dtd +0 -4
  64. data/test/files/test_document_url/document.xml +0 -6
  65. data/test/files/tlm.html +0 -851
  66. data/test/files/to_be_xincluded.xml +0 -2
  67. data/test/files/valid_bar.xml +0 -2
  68. data/test/files/xinclude.xml +0 -4
  69. data/test/helper.rb +0 -271
  70. data/test/html/sax/test_parser.rb +0 -168
  71. data/test/html/sax/test_parser_context.rb +0 -46
  72. data/test/html/sax/test_parser_text.rb +0 -163
  73. data/test/html/sax/test_push_parser.rb +0 -87
  74. data/test/html/test_attributes.rb +0 -85
  75. data/test/html/test_builder.rb +0 -164
  76. data/test/html/test_document.rb +0 -722
  77. data/test/html/test_document_encoding.rb +0 -143
  78. data/test/html/test_document_fragment.rb +0 -310
  79. data/test/html/test_element_description.rb +0 -105
  80. data/test/html/test_named_characters.rb +0 -14
  81. data/test/html/test_node.rb +0 -212
  82. data/test/html/test_node_encoding.rb +0 -91
  83. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  84. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  85. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  86. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  87. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  88. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  89. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  90. data/test/test_convert_xpath.rb +0 -135
  91. data/test/test_css_cache.rb +0 -47
  92. data/test/test_encoding_handler.rb +0 -48
  93. data/test/test_memory_leak.rb +0 -226
  94. data/test/test_nokogiri.rb +0 -138
  95. data/test/test_soap4r_sax.rb +0 -52
  96. data/test/test_xslt_transforms.rb +0 -314
  97. data/test/xml/node/test_save_options.rb +0 -28
  98. data/test/xml/node/test_subclass.rb +0 -44
  99. data/test/xml/sax/test_parser.rb +0 -402
  100. data/test/xml/sax/test_parser_context.rb +0 -115
  101. data/test/xml/sax/test_parser_text.rb +0 -202
  102. data/test/xml/sax/test_push_parser.rb +0 -265
  103. data/test/xml/test_attr.rb +0 -96
  104. data/test/xml/test_attribute_decl.rb +0 -86
  105. data/test/xml/test_builder.rb +0 -353
  106. data/test/xml/test_c14n.rb +0 -180
  107. data/test/xml/test_cdata.rb +0 -54
  108. data/test/xml/test_comment.rb +0 -40
  109. data/test/xml/test_document.rb +0 -982
  110. data/test/xml/test_document_encoding.rb +0 -31
  111. data/test/xml/test_document_fragment.rb +0 -312
  112. data/test/xml/test_dtd.rb +0 -187
  113. data/test/xml/test_dtd_encoding.rb +0 -31
  114. data/test/xml/test_element_content.rb +0 -56
  115. data/test/xml/test_element_decl.rb +0 -73
  116. data/test/xml/test_entity_decl.rb +0 -122
  117. data/test/xml/test_entity_reference.rb +0 -262
  118. data/test/xml/test_namespace.rb +0 -96
  119. data/test/xml/test_node.rb +0 -1379
  120. data/test/xml/test_node_attributes.rb +0 -115
  121. data/test/xml/test_node_encoding.rb +0 -75
  122. data/test/xml/test_node_inheritance.rb +0 -32
  123. data/test/xml/test_node_reparenting.rb +0 -661
  124. data/test/xml/test_node_set.rb +0 -828
  125. data/test/xml/test_parse_options.rb +0 -64
  126. data/test/xml/test_processing_instruction.rb +0 -30
  127. data/test/xml/test_reader.rb +0 -620
  128. data/test/xml/test_reader_encoding.rb +0 -134
  129. data/test/xml/test_relax_ng.rb +0 -60
  130. data/test/xml/test_schema.rb +0 -142
  131. data/test/xml/test_syntax_error.rb +0 -36
  132. data/test/xml/test_text.rb +0 -69
  133. data/test/xml/test_unparented_node.rb +0 -483
  134. data/test/xml/test_xinclude.rb +0 -83
  135. data/test/xml/test_xpath.rb +0 -470
  136. data/test/xslt/test_custom_functions.rb +0 -133
  137. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,83 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestXInclude < Nokogiri::TestCase
6
- def setup
7
- super
8
- @xml = Nokogiri::XML.parse(File.read(XML_XINCLUDE_FILE), XML_XINCLUDE_FILE)
9
- @included = "this snippet is to be included from xinclude.xml"
10
- end
11
-
12
- def test_xinclude_on_document_parse
13
- skip("Pure Java version XInlcude has a conflict with NekoDTD setting. This will be fixed later.") if Nokogiri.jruby?
14
- # first test that xinclude works when requested
15
- xml_doc = nil
16
-
17
- File.open(XML_XINCLUDE_FILE) do |fp|
18
- xml_doc = Nokogiri::XML(fp) do |conf|
19
- conf.strict.dtdload.noent.nocdata.xinclude
20
- end
21
- end
22
-
23
- assert_not_nil xml_doc
24
- assert_not_nil included = xml_doc.at_xpath('//included')
25
- assert_equal @included, included.content
26
-
27
- # no xinclude should happen when not requested
28
- xml_doc = nil
29
-
30
- File.open(XML_XINCLUDE_FILE) do |fp|
31
- xml_doc = Nokogiri::XML(fp) do |conf|
32
- conf.strict.dtdload.noent.nocdata
33
- end
34
- end
35
-
36
- assert_not_nil xml_doc
37
- assert_nil xml_doc.at_xpath('//included')
38
- end
39
-
40
- def test_xinclude_on_document_node
41
- skip("Pure Java version turns XInlcude on against a parser.") if Nokogiri.jruby?
42
- assert_nil @xml.at_xpath('//included')
43
- @xml.do_xinclude
44
- assert_not_nil included = @xml.at_xpath('//included')
45
- assert_equal @included, included.content
46
- end
47
-
48
- def test_xinclude_on_element_subtree
49
- skip("Pure Java version turns XInlcude on against a parser.") if Nokogiri.jruby?
50
- assert_nil @xml.at_xpath('//included')
51
- @xml.root.do_xinclude
52
- assert_not_nil included = @xml.at_xpath('//included')
53
- assert_equal @included, included.content
54
- end
55
-
56
- def test_do_xinclude_accepts_block
57
- non_default_options = Nokogiri::XML::ParseOptions::NOBLANKS | \
58
- Nokogiri::XML::ParseOptions::XINCLUDE
59
-
60
- @xml.do_xinclude(non_default_options) do |options|
61
- assert_equal non_default_options, options.to_i
62
- end
63
- end
64
-
65
- def test_include_nonexistent_throws_exception
66
- skip("Pure Java version behaves differently") if Nokogiri.jruby?
67
- # break inclusion deliberately
68
- @xml.at_xpath('//xi:include')['href'] = "nonexistent.xml"
69
-
70
- exception_raised = false
71
- begin
72
- @xml.do_xinclude { |opts| opts.nowarning }
73
- rescue Exception => e
74
- assert_equal Nokogiri::XML::SyntaxError, e.class
75
- exception_raised = true
76
- end
77
-
78
- assert exception_raised
79
- end
80
-
81
- end
82
- end
83
- end
@@ -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