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,64 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestParseOptions < Nokogiri::TestCase
6
- def test_new
7
- options = Nokogiri::XML::ParseOptions.new
8
- assert_equal 0, options.options
9
- end
10
-
11
- def test_to_i
12
- options = Nokogiri::XML::ParseOptions.new
13
- assert_equal 0, options.to_i
14
- end
15
-
16
- ParseOptions.constants.each do |constant|
17
- next if constant == 'STRICT'
18
- class_eval %{
19
- def test_predicate_#{constant.downcase}
20
- options = ParseOptions.new(ParseOptions::#{constant})
21
- assert options.#{constant.downcase}?
22
-
23
- assert ParseOptions.new.#{constant.downcase}.#{constant.downcase}?
24
- end
25
- }
26
- end
27
-
28
- def test_strict_noent
29
- options = ParseOptions.new.recover.noent
30
- assert !options.strict?
31
- end
32
-
33
- def test_new_with_argument
34
- options = Nokogiri::XML::ParseOptions.new 1 << 1
35
- assert_equal 1 << 1, options.options
36
- end
37
-
38
- def test_unsetting
39
- options = Nokogiri::XML::ParseOptions.new Nokogiri::XML::ParseOptions::DEFAULT_HTML
40
- assert options.nonet?
41
- assert options.recover?
42
- options.nononet.norecover
43
- assert ! options.nonet?
44
- assert ! options.recover?
45
- options.nonet.recover
46
- assert options.nonet?
47
- assert options.recover?
48
- end
49
-
50
- def test_chaining
51
- options = Nokogiri::XML::ParseOptions.new.recover.noent
52
- assert options.recover?
53
- assert options.noent?
54
- end
55
-
56
- def test_inspect
57
- options = Nokogiri::XML::ParseOptions.new.recover.noent
58
- ins = options.inspect
59
- assert_match(/recover/, ins)
60
- assert_match(/noent/, ins)
61
- end
62
- end
63
- end
64
- end
@@ -1,30 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestProcessingInstruction < Nokogiri::TestCase
6
- def setup
7
- super
8
- @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
9
- end
10
-
11
- def test_type
12
- assert_equal(Node::PI_NODE, @xml.children[0].type)
13
- end
14
-
15
- def test_name
16
- assert_equal 'TEST-STYLE', @xml.children[0].name
17
- end
18
-
19
- def test_new
20
- assert ref = ProcessingInstruction.new(@xml, 'name', 'content')
21
- assert_instance_of ProcessingInstruction, ref
22
- end
23
-
24
- def test_many_new
25
- 100.times { ProcessingInstruction.new(@xml, 'foo', 'bar') }
26
- @xml.root << ProcessingInstruction.new(@xml, 'foo', 'bar')
27
- end
28
- end
29
- end
30
- end
@@ -1,620 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require "helper"
3
-
4
- module Nokogiri
5
- module XML
6
- class TestReader < Nokogiri::TestCase
7
- class NonStringIO
8
- def read(size)
9
- :invalid_object
10
- end
11
- end
12
-
13
- def test_io_non_string
14
- io = NonStringIO.new
15
- reader = Nokogiri::XML::Reader(io)
16
- assert_equal io, reader.source
17
- end
18
-
19
- def test_from_io_sets_io_as_source
20
- io = File.open SNUGGLES_FILE
21
- reader = Nokogiri::XML::Reader.from_io(io)
22
- assert_equal io, reader.source
23
- end
24
-
25
- def test_empty_element?
26
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
27
- <xml><city>Paris</city><state/></xml>
28
- eoxml
29
-
30
- results = reader.map do |node|
31
- if node.node_type == Nokogiri::XML::Node::ELEMENT_NODE
32
- node.empty_element?
33
- end
34
- end
35
- assert_equal [false, false, nil, nil, true, nil], results
36
- end
37
-
38
- def test_self_closing?
39
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
40
- <xml><city>Paris</city><state/></xml>
41
- eoxml
42
-
43
- results = reader.map do |node|
44
- if node.node_type == Nokogiri::XML::Node::ELEMENT_NODE
45
- node.self_closing?
46
- end
47
- end
48
- assert_equal [false, false, nil, nil, true, nil], results
49
- end
50
-
51
- # Issue #831
52
- # Make sure that the reader doesn't block reading the entire input
53
- def test_reader_blocking
54
- rd, wr = IO.pipe()
55
- node_out = nil
56
- t = Thread.start do
57
- reader = Nokogiri::XML::Reader(rd, 'UTF-8')
58
- reader.each do |node|
59
- node_out = node
60
- break
61
- end
62
- rd.close
63
- end
64
- sleep(1) # sleep for one second to make sure the reader will actually block for input
65
- begin
66
- wr.puts "<foo>"
67
- wr.puts "<bar/>" * 10000
68
- wr.flush
69
- rescue Errno::EPIPE
70
- end
71
- res = t.join(5) # wait 5 seconds for the thread to finish
72
- wr.close
73
- refute_nil node_out, "Didn't read any nodes, exclude the trivial case"
74
- refute_nil res, "Reader blocks trying to read the entire stream"
75
- end
76
-
77
- def test_reader_takes_block
78
- options = nil
79
- Nokogiri::XML::Reader(File.read(XML_FILE), XML_FILE) do |cfg|
80
- options = cfg
81
- options.nonet.nowarning.dtdattr
82
- end
83
- assert options.nonet?
84
- assert options.nowarning?
85
- assert options.dtdattr?
86
- end
87
-
88
- def test_nil_raises
89
- assert_raises(ArgumentError) {
90
- Nokogiri::XML::Reader.from_memory(nil)
91
- }
92
- assert_raises(ArgumentError) {
93
- Nokogiri::XML::Reader.from_io(nil)
94
- }
95
- end
96
-
97
- def test_from_io
98
- io = File.open SNUGGLES_FILE
99
- reader = Nokogiri::XML::Reader.from_io(io)
100
- assert_equal false, reader.default?
101
- assert_equal [false, false, false, false, false, false, false],
102
- reader.map(&:default?)
103
- end
104
-
105
- def test_io
106
- io = File.open SNUGGLES_FILE
107
- reader = Nokogiri::XML::Reader(io)
108
- assert_equal false, reader.default?
109
- assert_equal [false, false, false, false, false, false, false],
110
- reader.map(&:default?)
111
- end
112
-
113
- def test_string_io
114
- io = StringIO.new(<<-eoxml)
115
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
116
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
117
- </x>
118
- eoxml
119
- reader = Nokogiri::XML::Reader(io)
120
- assert_equal false, reader.default?
121
- assert_equal [false, false, false, false, false, false, false],
122
- reader.map(&:default?)
123
- end
124
-
125
- class ReallyBadIO
126
- def read(size)
127
- 'a' * size ** 10
128
- end
129
- end
130
-
131
- class ReallyBadIO4Java
132
- def read(size=1)
133
- 'a' * size ** 10
134
- end
135
- end
136
-
137
- def test_io_that_reads_too_much
138
- if Nokogiri.jruby?
139
- io = ReallyBadIO4Java.new
140
- Nokogiri::XML::Reader(io)
141
- else
142
- io = ReallyBadIO.new
143
- Nokogiri::XML::Reader(io)
144
- end
145
- end
146
-
147
- def test_in_memory
148
- assert Nokogiri::XML::Reader(<<-eoxml)
149
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
150
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
151
- </x>
152
- eoxml
153
- end
154
-
155
- def test_reader_holds_on_to_string
156
- xml = <<-eoxml
157
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
158
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
159
- </x>
160
- eoxml
161
- reader = Nokogiri::XML::Reader(xml)
162
- assert_equal xml, reader.source
163
- end
164
-
165
- def test_default?
166
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
167
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
168
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
169
- </x>
170
- eoxml
171
- assert_equal false, reader.default?
172
- assert_equal [false, false, false, false, false, false, false],
173
- reader.map(&:default?)
174
- end
175
-
176
- def test_value?
177
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
178
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
179
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
180
- </x>
181
- eoxml
182
- assert_equal false, reader.value?
183
- assert_equal [false, true, false, true, false, true, false],
184
- reader.map(&:value?)
185
- end
186
-
187
- def test_read_error_document
188
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
189
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
190
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
191
- <foo>
192
- </x>
193
- eoxml
194
- assert_raises(Nokogiri::XML::SyntaxError) do
195
- reader.each { |node| }
196
- end
197
- assert 1, reader.errors.length
198
- end
199
-
200
- def test_errors_is_an_array
201
- reader = Nokogiri::XML::Reader(StringIO.new('&bogus;'))
202
- assert_raises(SyntaxError) {
203
- reader.read
204
- }
205
- assert_equal [SyntaxError], reader.errors.map(&:class)
206
- end
207
-
208
- def test_pushing_to_non_array_raises_TypeError
209
- skip "TODO: JRuby ext does not internally call `errors`" if Nokogiri.jruby?
210
- reader = Nokogiri::XML::Reader(StringIO.new('&bogus;'))
211
- def reader.errors
212
- 1
213
- end
214
- assert_raises(TypeError) {
215
- reader.read
216
- }
217
- end
218
-
219
- def test_attributes?
220
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
221
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
222
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
223
- </x>
224
- eoxml
225
- assert_equal false, reader.attributes?
226
- assert_equal [true, false, true, false, true, false, true],
227
- reader.map(&:attributes?)
228
- end
229
-
230
- def test_attributes
231
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
232
- <x xmlns:tenderlove='http://tenderlovemaking.com/'
233
- xmlns='http://mothership.connection.com/'
234
- >
235
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
236
- </x>
237
- eoxml
238
- assert_equal({}, reader.attributes)
239
- assert_equal [{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
240
- 'xmlns'=>'http://mothership.connection.com/'},
241
- {}, {"awesome"=>"true"}, {}, {"awesome"=>"true"}, {},
242
- {'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
243
- 'xmlns'=>'http://mothership.connection.com/'}],
244
- reader.map(&:attributes)
245
- end
246
-
247
- def test_attribute_roundtrip
248
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
249
- <x xmlns:tenderlove='http://tenderlovemaking.com/'
250
- xmlns='http://mothership.connection.com/'
251
- >
252
- <tenderlove:foo awesome='true' size='giant'>snuggles!</tenderlove:foo>
253
- </x>
254
- eoxml
255
- reader.each do |node|
256
- node.attributes.each do |key, value|
257
- assert_equal value, node.attribute(key)
258
- end
259
- end
260
- end
261
-
262
- def test_attribute_at
263
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
264
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
265
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
266
- </x>
267
- eoxml
268
- assert_nil reader.attribute_at(nil)
269
- assert_nil reader.attribute_at(0)
270
- assert_equal ['http://tenderlovemaking.com/', nil, 'true', nil, 'true', nil, 'http://tenderlovemaking.com/'],
271
- reader.map { |x| x.attribute_at(0) }
272
- end
273
-
274
- def test_attribute
275
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
276
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
277
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
278
- </x>
279
- eoxml
280
- assert_nil reader.attribute(nil)
281
- assert_nil reader.attribute('awesome')
282
- assert_equal [nil, nil, 'true', nil, 'true', nil, nil],
283
- reader.map { |x| x.attribute('awesome') }
284
- end
285
-
286
- def test_attribute_length
287
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
288
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
289
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
290
- </x>
291
- eoxml
292
- assert_equal 0, reader.attribute_count
293
- assert_equal [1, 0, 1, 0, 0, 0, 0], reader.map(&:attribute_count)
294
- end
295
-
296
- def test_depth
297
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
298
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
299
- <tenderlove:foo>snuggles!</tenderlove:foo>
300
- </x>
301
- eoxml
302
- assert_equal 0, reader.depth
303
- assert_equal [0, 1, 1, 2, 1, 1, 0], reader.map(&:depth)
304
- end
305
-
306
- def test_encoding
307
- string = <<-eoxml
308
- <awesome>
309
- <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
310
- <p xml:lang="ja">日本語が上手です</p>
311
- </awesome>
312
- eoxml
313
- reader = Nokogiri::XML::Reader.from_memory(string, nil, 'UTF-8')
314
- assert_equal ['UTF-8'], reader.map(&:encoding).uniq
315
- end
316
-
317
- def test_xml_version
318
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
319
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
320
- <tenderlove:foo>snuggles!</tenderlove:foo>
321
- </x>
322
- eoxml
323
- assert_nil reader.xml_version
324
- assert_equal ['1.0'], reader.map(&:xml_version).uniq
325
- end
326
-
327
- def test_lang
328
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
329
- <awesome>
330
- <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
331
- <p xml:lang="ja">日本語が上手です</p>
332
- </awesome>
333
- eoxml
334
- assert_nil reader.lang
335
- assert_equal [nil, nil, "en", "en", "en", nil, "ja", "ja", "ja", nil, nil],
336
- reader.map(&:lang)
337
- end
338
-
339
- def test_value
340
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
341
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
342
- <tenderlove:foo>snuggles!</tenderlove:foo>
343
- </x>
344
- eoxml
345
- assert_nil reader.value
346
- assert_equal [nil, "\n ", nil, "snuggles!", nil, "\n ", nil],
347
- reader.map(&:value)
348
- end
349
-
350
- def test_prefix
351
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
352
- <x xmlns:edi='http://ecommerce.example.org/schema'>
353
- <edi:foo>hello</edi:foo>
354
- </x>
355
- eoxml
356
- assert_nil reader.prefix
357
- assert_equal [nil, nil, "edi", nil, "edi", nil, nil],
358
- reader.map(&:prefix)
359
- end
360
-
361
- def test_node_type
362
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
363
- <x>
364
- <y>hello</y>
365
- </x>
366
- eoxml
367
- assert_equal 0, reader.node_type
368
- assert_equal [1, 14, 1, 3, 15, 14, 15], reader.map(&:node_type)
369
- end
370
-
371
- def test_inner_xml
372
- str = "<x><y>hello</y></x>"
373
- reader = Nokogiri::XML::Reader.from_memory(str)
374
-
375
- reader.read
376
-
377
- assert_equal "<y>hello</y>", reader.inner_xml
378
- end
379
-
380
- def test_outer_xml
381
- str = ["<x><y>hello</y></x>", "<y>hello</y>", "hello", "<y/>", "<x/>"]
382
- reader = Nokogiri::XML::Reader.from_memory(str.first)
383
-
384
- xml = []
385
- reader.map { |node| xml << node.outer_xml }
386
-
387
- assert_equal str, xml
388
- end
389
-
390
- def test_outer_xml_with_empty_nodes
391
- str = ["<x><y/></x>", "<y/>", "<x/>"]
392
- reader = Nokogiri::XML::Reader.from_memory(str.first)
393
-
394
- xml = []
395
- reader.map { |node| xml << node.outer_xml }
396
-
397
- assert_equal str, xml
398
- end
399
-
400
- def test_state
401
- reader = Nokogiri::XML::Reader.from_memory('<foo>bar</bar>')
402
- assert reader.state
403
- end
404
-
405
- def test_ns_uri
406
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
407
- <x xmlns:edi='http://ecommerce.example.org/schema'>
408
- <edi:foo>hello</edi:foo>
409
- </x>
410
- eoxml
411
- assert_nil reader.namespace_uri
412
- assert_equal([nil,
413
- nil,
414
- "http://ecommerce.example.org/schema",
415
- nil,
416
- "http://ecommerce.example.org/schema",
417
- nil,
418
- nil],
419
- reader.map(&:namespace_uri))
420
- end
421
-
422
- def test_namespaced_attributes
423
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
424
- <x xmlns:edi='http://ecommerce.example.org/schema' xmlns:commons="http://rets.org/xsd/RETSCommons">
425
- <edi:foo commons:street-number="43">hello</edi:foo>
426
- <y edi:name="francis" bacon="87"/>
427
- </x>
428
- eoxml
429
- attr_ns = []
430
- while reader.read
431
- if reader.node_type == Nokogiri::XML::Node::ELEMENT_NODE
432
- reader.attribute_nodes.each {|attr| attr_ns << (attr.namespace.nil? ? nil : attr.namespace.prefix) }
433
- end
434
- end
435
- assert_equal(['commons',
436
- 'edi',
437
- nil],
438
- attr_ns)
439
- end
440
-
441
- def test_local_name
442
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
443
- <x xmlns:edi='http://ecommerce.example.org/schema'>
444
- <edi:foo>hello</edi:foo>
445
- </x>
446
- eoxml
447
- assert_nil reader.local_name
448
- assert_equal(["x", "#text", "foo", "#text", "foo", "#text", "x"],
449
- reader.map(&:local_name))
450
- end
451
-
452
- def test_name
453
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
454
- <x xmlns:edi='http://ecommerce.example.org/schema'>
455
- <edi:foo>hello</edi:foo>
456
- </x>
457
- eoxml
458
- assert_nil reader.name
459
- assert_equal(["x", "#text", "edi:foo", "#text", "edi:foo", "#text", "x"],
460
- reader.map(&:name))
461
- end
462
-
463
- def test_base_uri
464
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
465
- <x xml:base="http://base.example.org/base/">
466
- <link href="link"/>
467
- <other xml:base="http://other.example.org/"/>
468
- <relative xml:base="relative">
469
- <link href="stuff" />
470
- </relative>
471
- </x>
472
- eoxml
473
-
474
- assert_nil reader.base_uri
475
- assert_equal(["http://base.example.org/base/",
476
- "http://base.example.org/base/",
477
- "http://base.example.org/base/",
478
- "http://base.example.org/base/",
479
- "http://other.example.org/",
480
- "http://base.example.org/base/",
481
- "http://base.example.org/base/relative",
482
- "http://base.example.org/base/relative",
483
- "http://base.example.org/base/relative",
484
- "http://base.example.org/base/relative",
485
- "http://base.example.org/base/relative",
486
- "http://base.example.org/base/",
487
- "http://base.example.org/base/"],
488
- reader.map(&:base_uri))
489
- end
490
-
491
- def test_xlink_href_without_base_uri
492
- reader = Nokogiri::XML::Reader(<<-eoxml)
493
- <x xmlns:xlink="http://www.w3.org/1999/xlink">
494
- <link xlink:href="#other">Link</link>
495
- <other id="other">Linked Element</other>
496
- </x>
497
- eoxml
498
-
499
- reader.each do |node|
500
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
501
- if node.name == 'link'
502
- assert_nil node.base_uri
503
- end
504
- end
505
- end
506
- end
507
-
508
- def test_xlink_href_with_base_uri
509
- reader = Nokogiri::XML::Reader(<<-eoxml)
510
- <x xml:base="http://base.example.org/base/"
511
- xmlns:xlink="http://www.w3.org/1999/xlink">
512
- <link xlink:href="#other">Link</link>
513
- <other id="other">Linked Element</other>
514
- </x>
515
- eoxml
516
-
517
- reader.each do |node|
518
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
519
- assert_equal node.base_uri, "http://base.example.org/base/"
520
- end
521
- end
522
- end
523
-
524
- def test_read_from_memory
525
- called = false
526
- reader = Nokogiri::XML::Reader.from_memory('<foo>bar</foo>')
527
- reader.each do |node|
528
- called = true
529
- assert node
530
- end
531
- assert called
532
- end
533
-
534
- def test_large_document_smoke_test
535
- # simply run on a large document to verify that there no GC issues
536
- xml = []
537
- xml << "<elements>"
538
- 10000.times { |j| xml << "<element id=\"#{j}\"/>" }
539
- xml << "</elements>"
540
- xml = xml.join("\n")
541
-
542
- Nokogiri::XML::Reader.from_memory(xml).each do |e|
543
- e.attributes
544
- end
545
- end
546
-
547
- def test_correct_outer_xml_inclusion
548
- xml = Nokogiri::XML::Reader.from_io(StringIO.new(<<-eoxml))
549
- <root-element>
550
- <children>
551
- <child n="1">
552
- <field>child-1</field>
553
- </child>
554
- <child n="2">
555
- <field>child-2</field>
556
- </child>
557
- <child n="3">
558
- <field>child-3</field>
559
- </child>
560
- </children>
561
- </root-element>
562
- eoxml
563
-
564
- nodelengths = []
565
- has_child2 = []
566
-
567
- xml.each do |node|
568
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT and node.name == "child"
569
- nodelengths << node.outer_xml.length
570
- has_child2 << !!(node.outer_xml =~ /child-2/)
571
- end
572
- end
573
-
574
- assert_equal(nodelengths[0], nodelengths[1])
575
- assert(has_child2[1])
576
- assert(!has_child2[0])
577
- end
578
-
579
- def test_correct_inner_xml_inclusion
580
- xml = Nokogiri::XML::Reader.from_io(StringIO.new(<<-eoxml))
581
- <root-element>
582
- <children>
583
- <child n="1">
584
- <field>child-1</field>
585
- </child>
586
- <child n="2">
587
- <field>child-2</field>
588
- </child>
589
- <child n="3">
590
- <field>child-3</field>
591
- </child>
592
- </children>
593
- </root-element>
594
- eoxml
595
-
596
- nodelengths = []
597
- has_child2 = []
598
-
599
- xml.each do |node|
600
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT and node.name == "child"
601
- nodelengths << node.inner_xml.length
602
- has_child2 << !!(node.inner_xml =~ /child-2/)
603
- end
604
- end
605
-
606
- assert_equal(nodelengths[0], nodelengths[1])
607
- assert(has_child2[1])
608
- assert(!has_child2[0])
609
- end
610
-
611
- def test_nonexistent_attribute
612
- require 'nokogiri'
613
- reader = Nokogiri::XML::Reader("<root xmlns='bob'><el attr='fred' /></root>")
614
- reader.read # root
615
- reader.read # el
616
- assert_nil reader.attribute('other')
617
- end
618
- end
619
- end
620
- end