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,314 +0,0 @@
1
- require "helper"
2
-
3
- class TestXsltTransforms < Nokogiri::TestCase
4
- def setup
5
- @doc = Nokogiri::XML(File.open(XML_FILE))
6
- end
7
-
8
- def test_class_methods
9
- style = Nokogiri::XSLT(File.read(XSLT_FILE))
10
-
11
- assert result = style.apply_to(@doc, ['title', '"Grandma"'])
12
- assert_match %r{<h1>Grandma</h1>}, result
13
- end
14
-
15
- def test_transform
16
- assert style = Nokogiri::XSLT.parse(File.read(XSLT_FILE))
17
-
18
- assert result = style.apply_to(@doc, ['title', '"Booyah"'])
19
- assert_match %r{<h1>Booyah</h1>}, result
20
- assert_match %r{<th.*Employee ID</th>}, result
21
- assert_match %r{<th.*Name</th>}, result
22
- assert_match %r{<th.*Position</th>}, result
23
- assert_match %r{<th.*Salary</th>}, result
24
- assert_match %r{<td>EMP0003</td>}, result
25
- assert_match %r{<td>Margaret Martin</td>}, result
26
- assert_match %r{<td>Computer Specialist</td>}, result
27
- assert_match %r{<td>100,000</td>}, result
28
- assert_no_match %r{Dallas|Texas}, result
29
- assert_no_match %r{Female}, result
30
-
31
- assert result = style.apply_to(@doc, ['title', '"Grandma"'])
32
- assert_match %r{<h1>Grandma</h1>}, result
33
-
34
- assert result = style.apply_to(@doc)
35
- assert_match %r{<h1></h1>|<h1/>}, result
36
- end
37
-
38
- def test_xml_declaration
39
- input_xml = <<-EOS
40
- <?xml version="1.0" encoding="utf-8"?>
41
- <report>
42
- <title>My Report</title>
43
- </report>
44
- EOS
45
-
46
- input_xsl = <<-EOS
47
- <?xml version="1.0" encoding="utf-8"?>
48
- <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
49
- <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
50
- <xsl:template match="/">
51
- <html>
52
- <head>
53
- <title><xsl:value-of select="report/title"/></title>
54
- </head>
55
- <body>
56
- <h1><xsl:value-of select="report/title"/></h1>
57
- </body>
58
- </html>
59
- </xsl:template>
60
- </xsl:stylesheet>
61
- EOS
62
-
63
- require 'nokogiri'
64
-
65
- xml = ::Nokogiri::XML(input_xml)
66
- xsl = ::Nokogiri::XSLT(input_xsl)
67
-
68
- assert_includes xsl.apply_to(xml), '<?xml version="1.0" encoding="utf-8"?>'
69
- end
70
-
71
- def test_transform_with_output_style
72
- xslt = ""
73
- if Nokogiri.jruby?
74
- xslt = Nokogiri::XSLT(<<-eoxslt)
75
- <?xml version="1.0" encoding="ISO-8859-1"?>
76
-
77
- <xsl:stylesheet version="1.0"
78
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
79
- <xsl:output method="text" version="1.0"
80
- encoding="iso-8859-1" indent="yes"/>
81
-
82
- <xsl:param name="title"/>
83
-
84
- <xsl:template match="/">
85
- <html>
86
- <body>
87
- <xsl:for-each select="staff/employee">
88
- <tr>
89
- <td><xsl:value-of select="employeeId"/></td>
90
- <td><xsl:value-of select="name"/></td>
91
- <td><xsl:value-of select="position"/></td>
92
- <td><xsl:value-of select="salary"/></td>
93
- </tr>
94
- </xsl:for-each>
95
- </body>
96
- </html>
97
- </xsl:template>
98
-
99
- </xsl:stylesheet>
100
- eoxslt
101
- else
102
- xslt = Nokogiri::XSLT(<<-eoxslt)
103
- <?xml version="1.0" encoding="ISO-8859-1"?>
104
-
105
- <xsl:stylesheet version="1.0"
106
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
107
- <xsl:output method="text" version="1.0"
108
- encoding="iso-8859-1" indent="yes"/>
109
-
110
- <xsl:param name="title"/>
111
-
112
- <xsl:template match="/">
113
- <html>
114
- <body>
115
- <xsl:for-each select="staff/employee">
116
- <tr>
117
- <td><xsl:value-of select="employeeId"/></td>
118
- <td><xsl:value-of select="name"/></td>
119
- <td><xsl:value-of select="position"/></td>
120
- <td><xsl:value-of select="salary"/></td>
121
- </tr>
122
- </xsl:for-each>
123
- </table>
124
- </body>
125
- </html>
126
- </xsl:template>
127
-
128
- </xsl:stylesheet>
129
- eoxslt
130
- end
131
- result = xslt.apply_to(@doc, ['title', 'foo'])
132
- assert_no_match(/<td>/, result)
133
- assert_match(/This is an adjacent/, result)
134
- end
135
-
136
- def test_transform_arg_error
137
- assert style = Nokogiri::XSLT(File.read(XSLT_FILE))
138
- assert_raises(TypeError) do
139
- style.transform(@doc, :foo)
140
- end
141
- end
142
-
143
- def test_transform_with_hash
144
- assert style = Nokogiri::XSLT(File.read(XSLT_FILE))
145
- result = style.transform(@doc, {'title' => '"Booyah"'})
146
- assert result.html?
147
- assert_equal "Booyah", result.at_css("h1").content
148
- end
149
-
150
- def test_transform2
151
- assert style = Nokogiri::XSLT(File.open(XSLT_FILE))
152
- assert result_doc = style.transform(@doc)
153
- assert result_doc.html?
154
- assert_equal "", result_doc.at_css("h1").content
155
-
156
- assert style = Nokogiri::XSLT(File.read(XSLT_FILE))
157
- assert result_doc = style.transform(@doc, ['title', '"Booyah"'])
158
- assert result_doc.html?
159
- assert_equal "Booyah", result_doc.at_css("h1").content
160
-
161
- assert result_string = style.apply_to(@doc, ['title', '"Booyah"'])
162
- assert_equal result_string, style.serialize(result_doc)
163
- end
164
-
165
- def test_transform_with_quote_params
166
- assert style = Nokogiri::XSLT(File.open(XSLT_FILE))
167
- assert result_doc = style.transform(@doc, Nokogiri::XSLT.quote_params(['title', 'Booyah']))
168
- assert result_doc.html?
169
- assert_equal "Booyah", result_doc.at_css("h1").content
170
-
171
- assert style = Nokogiri::XSLT.parse(File.read(XSLT_FILE))
172
- assert result_doc = style.transform(@doc, Nokogiri::XSLT.quote_params({'title' => 'Booyah'}))
173
- assert result_doc.html?
174
- assert_equal "Booyah", result_doc.at_css("h1").content
175
- end
176
-
177
- def test_quote_params
178
- h = {
179
- :sym => %{xxx},
180
- 'str' => %{"xxx"},
181
- :sym2 => %{'xxx'},
182
- 'str2' => %{x'x'x},
183
- :sym3 => %{x"x"x},
184
- }
185
- hh=h.dup
186
- result_hash = Nokogiri::XSLT.quote_params(h)
187
- assert_equal hh, h # non-destructive
188
-
189
- a=h.to_a.flatten
190
- result_array = Nokogiri::XSLT.quote_params(a)
191
- assert_equal h.to_a.flatten, a #non-destructive
192
-
193
- assert_equal result_array, result_hash
194
- end
195
-
196
- if Nokogiri.uses_libxml?
197
- # By now, cannot get it working on JRuby, see:
198
- # http://yokolet.blogspot.com/2010/10/pure-java-nokogiri-xslt-extension.html
199
- def test_exslt
200
- assert doc = Nokogiri::XML.parse(File.read(EXML_FILE))
201
- assert doc.xml?
202
-
203
- assert style = Nokogiri::XSLT.parse(File.read(EXSLT_FILE))
204
- params = {
205
- :p1 => 'xxx',
206
- :p2 => "x'x'x",
207
- :p3 => 'x"x"x',
208
- :p4 => '"xxx"'
209
- }
210
- result_doc = Nokogiri::XML.parse(style.apply_to(doc,
211
- Nokogiri::XSLT.quote_params(params)))
212
-
213
- assert_equal 'func-result', result_doc.at('/root/function').content
214
- assert_equal 3, result_doc.at('/root/max').content.to_i
215
- assert_match(
216
- /\d{4}-\d\d-\d\d([-|+]\d\d:\d\d)?/,
217
- result_doc.at('/root/date').content
218
- )
219
- result_doc.xpath('/root/params/*').each do |p|
220
- assert_equal p.content, params[p.name.intern]
221
- end
222
- check_params result_doc, params
223
- result_doc = Nokogiri::XML.parse(style.apply_to(doc,
224
- Nokogiri::XSLT.quote_params(params.to_a.flatten)))
225
- check_params result_doc, params
226
- end
227
-
228
- def test_xslt_paramaters
229
- xslt_str = <<-EOX
230
- <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
231
- <xsl:template match="/">
232
- <xsl:value-of select="$foo" />
233
- </xsl:template>
234
- </xsl:stylesheet>
235
- EOX
236
-
237
- xslt = Nokogiri::XSLT(xslt_str)
238
- doc = Nokogiri::XML("<root />")
239
- assert_match %r{bar}, xslt.transform(doc, Nokogiri::XSLT.quote_params('foo' => 'bar')).to_s
240
- end
241
-
242
- def test_xslt_transform_error
243
- xslt_str = <<-EOX
244
- <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
245
- <xsl:template match="/">
246
- <xsl:value-of select="$foo" />
247
- </xsl:template>
248
- </xsl:stylesheet>
249
- EOX
250
-
251
- xslt = Nokogiri::XSLT(xslt_str)
252
- doc = Nokogiri::XML("<root />")
253
- assert_raises(RuntimeError) { xslt.transform(doc) }
254
- end
255
- end
256
-
257
-
258
- def test_xslt_parse_error
259
- xslt_str = <<-EOX
260
- <xsl:stylesheet version="1.0"
261
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
262
- <!-- Not well-formed: -->
263
- <xsl:template match="/"/>
264
- <values>
265
- <xsl:for-each select="//*">
266
- <value>
267
- <xsl:value-of select="@id"/>
268
- </value>
269
- </xsl:for-each>
270
- </values>
271
- </xsl:template>
272
- </xsl:stylesheet>}
273
- EOX
274
- assert_raises(RuntimeError) { Nokogiri::XSLT.parse(xslt_str) }
275
- end
276
-
277
-
278
- def test_passing_a_non_document_to_transform
279
- xsl = Nokogiri::XSLT('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"></xsl:stylesheet>')
280
- assert_raises(ArgumentError) { xsl.transform("<div></div>") }
281
- assert_raises(ArgumentError) { xsl.transform(Nokogiri::HTML("").css("body")) }
282
- end
283
-
284
- def check_params result_doc, params
285
- result_doc.xpath('/root/params/*').each do |p|
286
- assert_equal p.content, params[p.name.intern]
287
- end
288
- end
289
-
290
- def test_non_html_xslt_transform
291
- xml = Nokogiri.XML(<<-EOXML)
292
- <a>
293
- <b>
294
- <c>123</c>
295
- </b>
296
- </a>
297
- EOXML
298
-
299
- xsl = Nokogiri.XSLT(<<-EOXSL)
300
- <xsl:stylesheet version="1.0"
301
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
302
-
303
- <xsl:output encoding="UTF-8" indent="yes" method="xml" />
304
-
305
- <xsl:template match="/">
306
- <a><xsl:value-of select="/a" /></a>
307
- </xsl:template>
308
- </xsl:stylesheet>
309
- EOXSL
310
-
311
- result = xsl.transform xml
312
- assert !result.html?
313
- end
314
- end
@@ -1,28 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class Node
6
- class TestSaveOptions < Nokogiri::TestCase
7
- SaveOptions.constants.each do |constant|
8
- class_eval <<-EOEVAL
9
- def test_predicate_#{constant.downcase}
10
- options = SaveOptions.new(SaveOptions::#{constant})
11
- assert options.#{constant.downcase}?
12
-
13
- assert SaveOptions.new.#{constant.downcase}.#{constant.downcase}?
14
- end
15
- EOEVAL
16
- end
17
-
18
- def test_default_xml_save_options
19
- if Nokogiri.jruby?
20
- assert_equal 0, (SaveOptions::DEFAULT_XML & SaveOptions::FORMAT)
21
- else
22
- assert_equal SaveOptions::FORMAT, (SaveOptions::DEFAULT_XML & SaveOptions::FORMAT)
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,44 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class Node
6
- class TestSubclass < Nokogiri::TestCase
7
- {
8
- Nokogiri::XML::CDATA => 'doc, "foo"',
9
- Nokogiri::XML::Attr => 'doc, "foo"',
10
- Nokogiri::XML::Comment => 'doc, "foo"',
11
- Nokogiri::XML::EntityReference => 'doc, "foo"',
12
- Nokogiri::XML::ProcessingInstruction => 'doc, "foo", "bar"',
13
- Nokogiri::XML::DocumentFragment => 'doc',
14
- Nokogiri::XML::Node => '"foo", doc',
15
- Nokogiri::XML::Text => '"foo", doc',
16
- }.each do |klass, constructor|
17
- class_eval %{
18
- def test_subclass_#{klass.name.gsub('::', '_')}
19
- doc = Nokogiri::XML::Document.new
20
- klass = Class.new(#{klass.name})
21
- node = klass.new(#{constructor})
22
- assert_instance_of klass, node
23
- end
24
- }
25
-
26
- class_eval <<-eocode, __FILE__, __LINE__ + 1
27
- def test_subclass_initialize_#{klass.name.gsub('::', '_')}
28
- doc = Nokogiri::XML::Document.new
29
- klass = Class.new(#{klass.name}) do
30
- attr_accessor :initialized_with
31
-
32
- def initialize *args
33
- @initialized_with = args
34
- end
35
- end
36
- node = klass.new(#{constructor}, 1)
37
- assert_equal [#{constructor}, 1], node.initialized_with
38
- end
39
- eocode
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,402 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- require "helper"
4
-
5
- module Nokogiri
6
- module XML
7
- module SAX
8
- class TestParser < Nokogiri::SAX::TestCase
9
- def setup
10
- super
11
- @parser = XML::SAX::Parser.new(Doc.new)
12
- end
13
-
14
- def test_parser_context_yielded_io
15
- doc = Doc.new
16
- parser = XML::SAX::Parser.new doc
17
- xml = "<foo a='&amp;b'/>"
18
-
19
- block_called = false
20
- parser.parse(StringIO.new(xml)) { |ctx|
21
- block_called = true
22
- ctx.replace_entities = true
23
- }
24
-
25
- assert block_called
26
-
27
- assert_equal [['foo', [['a', '&b']]]], doc.start_elements
28
- end
29
-
30
- def test_parser_context_yielded_in_memory
31
- doc = Doc.new
32
- parser = XML::SAX::Parser.new doc
33
- xml = "<foo a='&amp;b'/>"
34
-
35
- block_called = false
36
- parser.parse(xml) { |ctx|
37
- block_called = true
38
- ctx.replace_entities = true
39
- }
40
-
41
- assert block_called
42
-
43
- assert_equal [['foo', [['a', '&b']]]], doc.start_elements
44
- end
45
-
46
- def test_empty_decl
47
- parser = XML::SAX::Parser.new(Doc.new)
48
-
49
- xml = "<root />"
50
- parser.parse xml
51
- assert parser.document.start_document_called, xml
52
- assert_nil parser.document.xmldecls, xml
53
- end
54
-
55
- def test_xml_decl
56
- [
57
- ['<?xml version="1.0" ?>',
58
- ['1.0']],
59
- ['<?xml version="1.0" encoding="UTF-8" ?>',
60
- ['1.0', 'UTF-8']],
61
- ['<?xml version="1.0" standalone="yes"?>',
62
- ['1.0', 'yes']],
63
- ['<?xml version="1.0" standalone="no"?>',
64
- ['1.0', 'no']],
65
- ['<?xml version="1.0" encoding="UTF-8" standalone="no"?>',
66
- ['1.0', "UTF-8", 'no']],
67
- ['<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>',
68
- ['1.0', "ISO-8859-1", 'yes']]
69
- ].each do |decl, value|
70
- parser = XML::SAX::Parser.new(Doc.new)
71
-
72
- xml = "#{decl}\n<root />"
73
- parser.parse xml
74
- assert parser.document.start_document_called, xml
75
- assert_equal value, parser.document.xmldecls, xml
76
- end
77
- end
78
-
79
- def test_parse_empty
80
- assert_raises RuntimeError do
81
- @parser.parse('')
82
- end
83
- end
84
-
85
- def test_namespace_declaration_order_is_saved
86
- @parser.parse <<-eoxml
87
- <root xmlns:foo='http://foo.example.com/' xmlns='http://example.com/'>
88
- <a foo:bar='hello' />
89
- </root>
90
- eoxml
91
- assert_equal 2, @parser.document.start_elements_namespace.length
92
- el = @parser.document.start_elements_namespace.first
93
- namespaces = el.last
94
- assert_equal ['foo', 'http://foo.example.com/'], namespaces.first
95
- assert_equal [nil, 'http://example.com/'], namespaces.last
96
- end
97
-
98
- def test_bad_document_calls_error_handler
99
- @parser.parse('<foo><bar></foo>')
100
- assert @parser.document.errors
101
- assert @parser.document.errors.length > 0
102
- end
103
-
104
- def test_namespace_are_super_fun_to_parse
105
- @parser.parse <<-eoxml
106
- <root xmlns:foo='http://foo.example.com/'>
107
- <a foo:bar='hello' />
108
- <b xmlns:foo='http://bar.example.com/'>
109
- <a foo:bar='hello' />
110
- </b>
111
- <foo:bar>hello world</foo:bar>
112
- </root>
113
- eoxml
114
-
115
- assert @parser.document.start_elements_namespace.length > 0
116
- el = @parser.document.start_elements_namespace[1]
117
- assert_equal 'a', el.first
118
- assert_equal 1, el[1].length
119
-
120
- attribute = el[1].first
121
- assert_equal 'bar', attribute.localname
122
- assert_equal 'foo', attribute.prefix
123
- assert_equal 'hello', attribute.value
124
- assert_equal 'http://foo.example.com/', attribute.uri
125
- end
126
-
127
- def test_sax_v1_namespace_attribute_declarations
128
- @parser.parse <<-eoxml
129
- <root xmlns:foo='http://foo.example.com/' xmlns='http://example.com/'>
130
- <a foo:bar='hello' />
131
- <b xmlns:foo='http://bar.example.com/'>
132
- <a foo:bar='hello' />
133
- </b>
134
- <foo:bar>hello world</foo:bar>
135
- </root>
136
- eoxml
137
- assert @parser.document.start_elements.length > 0
138
- elm = @parser.document.start_elements.first
139
- assert_equal 'root', elm.first
140
- assert elm[1].include?(['xmlns:foo', 'http://foo.example.com/'])
141
- assert elm[1].include?(['xmlns', 'http://example.com/'])
142
- end
143
-
144
- def test_sax_v1_namespace_nodes
145
- @parser.parse <<-eoxml
146
- <root xmlns:foo='http://foo.example.com/' xmlns='http://example.com/'>
147
- <a foo:bar='hello' />
148
- <b xmlns:foo='http://bar.example.com/'>
149
- <a foo:bar='hello' />
150
- </b>
151
- <foo:bar>hello world</foo:bar>
152
- </root>
153
- eoxml
154
- assert_equal 5, @parser.document.start_elements.length
155
- assert @parser.document.start_elements.map(&:first).include?('foo:bar')
156
- assert @parser.document.end_elements.map(&:first).include?('foo:bar')
157
- end
158
-
159
- def test_start_is_called_without_namespace
160
- @parser.parse(<<-eoxml)
161
- <root xmlns:foo='http://foo.example.com/' xmlns='http://example.com/'>
162
- <foo:f><bar></foo:f>
163
- </root>
164
- eoxml
165
- assert_equal ['root', 'foo:f', 'bar'],
166
- @parser.document.start_elements.map(&:first)
167
- end
168
-
169
- def test_parser_sets_encoding
170
- parser = XML::SAX::Parser.new(Doc.new, 'UTF-8')
171
- assert_equal 'UTF-8', parser.encoding
172
- end
173
-
174
- def test_errors_set_after_parsing_bad_dom
175
- doc = Nokogiri::XML('<foo><bar></foo>')
176
- assert doc.errors
177
-
178
- @parser.parse('<foo><bar></foo>')
179
- assert @parser.document.errors
180
- assert @parser.document.errors.length > 0
181
-
182
- doc.errors.each do |error|
183
- assert_equal 'UTF-8', error.message.encoding.name
184
- end
185
-
186
- # when using JRuby Nokogiri, more errors will be generated as the DOM
187
- # parser continue to parse an ill formed document, while the sax parser
188
- # will stop at the first error
189
- unless Nokogiri.jruby?
190
- assert_equal doc.errors.length, @parser.document.errors.length
191
- end
192
- end
193
-
194
- def test_parse_with_memory_argument
195
- @parser.parse(File.read(XML_FILE))
196
- assert(@parser.document.cdata_blocks.length > 0)
197
- end
198
-
199
- def test_parse_with_io_argument
200
- File.open(XML_FILE, 'rb') { |f|
201
- @parser.parse(f)
202
- }
203
- assert(@parser.document.cdata_blocks.length > 0)
204
- end
205
-
206
- def test_parse_io
207
- call_parse_io_with_encoding 'UTF-8'
208
- end
209
-
210
- # issue #828
211
- def test_parse_io_lower_case_encoding
212
- call_parse_io_with_encoding 'utf-8'
213
- end
214
-
215
- def call_parse_io_with_encoding encoding
216
- File.open(XML_FILE, 'rb') { |f|
217
- @parser.parse_io(f, encoding)
218
- }
219
- assert(@parser.document.cdata_blocks.length > 0)
220
-
221
- called = false
222
- @parser.document.start_elements.flatten.each do |thing|
223
- assert_equal 'UTF-8', thing.encoding.name
224
- called = true
225
- end
226
- assert called
227
-
228
- called = false
229
- @parser.document.end_elements.flatten.each do |thing|
230
- assert_equal 'UTF-8', thing.encoding.name
231
- called = true
232
- end
233
- assert called
234
-
235
- called = false
236
- @parser.document.data.each do |thing|
237
- assert_equal 'UTF-8', thing.encoding.name
238
- called = true
239
- end
240
- assert called
241
-
242
- called = false
243
- @parser.document.comments.flatten.each do |thing|
244
- assert_equal 'UTF-8', thing.encoding.name
245
- called = true
246
- end
247
- assert called
248
-
249
- called = false
250
- @parser.document.cdata_blocks.flatten.each do |thing|
251
- assert_equal 'UTF-8', thing.encoding.name
252
- called = true
253
- end
254
- assert called
255
- end
256
-
257
- def test_parse_file
258
- @parser.parse_file(XML_FILE)
259
-
260
- assert_raises(ArgumentError) {
261
- @parser.parse_file(nil)
262
- }
263
-
264
- assert_raises(Errno::ENOENT) {
265
- @parser.parse_file('')
266
- }
267
- assert_raises(Errno::EISDIR) {
268
- @parser.parse_file(File.expand_path(File.dirname(__FILE__)))
269
- }
270
- end
271
-
272
- def test_render_parse_nil_param
273
- assert_raises(ArgumentError) { @parser.parse_memory(nil) }
274
- end
275
-
276
- def test_bad_encoding_args
277
- assert_raises(ArgumentError) { XML::SAX::Parser.new(Doc.new, 'not an encoding') }
278
- assert_raises(ArgumentError) { @parser.parse_io(StringIO.new('<root/>'), 'not an encoding')}
279
- end
280
-
281
- def test_ctag
282
- @parser.parse_memory(<<-eoxml)
283
- <p id="asdfasdf">
284
- <![CDATA[ This is a comment ]]>
285
- Paragraph 1
286
- </p>
287
- eoxml
288
- assert_equal [' This is a comment '], @parser.document.cdata_blocks
289
- end
290
-
291
- def test_comment
292
- @parser.parse_memory(<<-eoxml)
293
- <p id="asdfasdf">
294
- <!-- This is a comment -->
295
- Paragraph 1
296
- </p>
297
- eoxml
298
- assert_equal [' This is a comment '], @parser.document.comments
299
- end
300
-
301
- def test_characters
302
- @parser.parse_memory(<<-eoxml)
303
- <p id="asdfasdf">Paragraph 1</p>
304
- eoxml
305
- assert_equal ['Paragraph 1'], @parser.document.data
306
- end
307
-
308
- def test_end_document
309
- @parser.parse_memory(<<-eoxml)
310
- <p id="asdfasdf">Paragraph 1</p>
311
- eoxml
312
- assert @parser.document.end_document_called
313
- end
314
-
315
- def test_end_element
316
- @parser.parse_memory(<<-eoxml)
317
- <p id="asdfasdf">Paragraph 1</p>
318
- eoxml
319
- assert_equal [["p"]],
320
- @parser.document.end_elements
321
- end
322
-
323
- def test_start_element_attrs
324
- @parser.parse_memory(<<-eoxml)
325
- <p id="asdfasdf">Paragraph 1</p>
326
- eoxml
327
- assert_equal [["p", [["id", "asdfasdf"]]]],
328
- @parser.document.start_elements
329
- end
330
-
331
- def test_start_element_attrs_include_namespaces
332
- @parser.parse_memory(<<-eoxml)
333
- <p xmlns:foo='http://foo.example.com/'>Paragraph 1</p>
334
- eoxml
335
- assert_equal [["p", [['xmlns:foo', 'http://foo.example.com/']]]],
336
- @parser.document.start_elements
337
- end
338
-
339
- def test_processing_instruction
340
- @parser.parse_memory(<<-eoxml)
341
- <?xml-stylesheet href="a.xsl" type="text/xsl"?>
342
- <?xml version="1.0"?>
343
- eoxml
344
- assert_equal [['xml-stylesheet', 'href="a.xsl" type="text/xsl"']],
345
- @parser.document.processing_instructions
346
- end
347
-
348
- if Nokogiri.uses_libxml? # JRuby SAXParser only parses well-formed XML documents
349
- def test_parse_document
350
- @parser.parse_memory(<<-eoxml)
351
- <p>Paragraph 1</p>
352
- <p>Paragraph 2</p>
353
- eoxml
354
- end
355
- end
356
-
357
- def test_parser_attributes
358
- xml = <<-eoxml
359
- <?xml version="1.0" ?><root><foo a="&amp;b" c="&gt;d" /></root>
360
- eoxml
361
-
362
- block_called = false
363
- @parser.parse(xml) { |ctx|
364
- block_called = true
365
- ctx.replace_entities = true
366
- }
367
-
368
- assert block_called
369
-
370
- assert_equal [['root', []], ['foo', [['a', '&b'], ['c', '>d']]]], @parser.document.start_elements
371
- end
372
-
373
- def test_recovery_from_incorrect_xml
374
- xml = <<-eoxml
375
- <?xml version="1.0" ?><Root><Data><?xml version='1.0'?><Item>hey</Item></Data><Data><Item>hey yourself</Item></Data></Root>
376
- eoxml
377
-
378
- block_called = false
379
- @parser.parse(xml) { |ctx|
380
- block_called = true
381
- ctx.recovery = true
382
- }
383
-
384
- assert block_called
385
-
386
- assert_equal [['Root', []], ['Data', []], ['Item', []], ['Data', []], ['Item', []]], @parser.document.start_elements
387
- end
388
-
389
- def test_square_bracket_in_text # issue 1261
390
- xml = <<-eoxml
391
- <tu tuid="87dea04cf60af103ff09d1dba36ae820" segtype="block">
392
- <prop type="x-smartling-string-variant">en:#:home_page:#:stories:#:[6]:#:name</prop>
393
- <tuv xml:lang="en-US"><seg>Sandy S.</seg></tuv>
394
- </tu>
395
- eoxml
396
- @parser.parse(xml)
397
- assert @parser.document.data.must_include "en:#:home_page:#:stories:#:[6]:#:name"
398
- end
399
- end
400
- end
401
- end
402
- end