libxml-ruby 4.1.2 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/{HISTORY → CHANGELOG.md} +875 -887
  3. data/LICENSE +20 -20
  4. data/README.md +67 -0
  5. data/Rakefile +77 -98
  6. data/ext/libxml/extconf.rb +39 -20
  7. data/ext/libxml/libxml.c +67 -79
  8. data/ext/libxml/ruby_libxml.h +43 -44
  9. data/ext/libxml/ruby_xml.c +556 -899
  10. data/ext/libxml/ruby_xml.h +9 -10
  11. data/ext/libxml/ruby_xml_attr.c +338 -333
  12. data/ext/libxml/ruby_xml_attr.h +13 -12
  13. data/ext/libxml/ruby_xml_attr_decl.c +19 -12
  14. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  15. data/ext/libxml/ruby_xml_attributes.c +18 -9
  16. data/ext/libxml/ruby_xml_attributes.h +17 -15
  17. data/ext/libxml/ruby_xml_document.c +1142 -1129
  18. data/ext/libxml/ruby_xml_document.h +12 -11
  19. data/ext/libxml/ruby_xml_dtd.c +287 -248
  20. data/ext/libxml/ruby_xml_dtd.h +10 -9
  21. data/ext/libxml/ruby_xml_encoding.c +250 -250
  22. data/ext/libxml/ruby_xml_encoding.h +20 -18
  23. data/ext/libxml/ruby_xml_error.c +1003 -996
  24. data/ext/libxml/ruby_xml_error.h +14 -14
  25. data/ext/libxml/ruby_xml_html_parser.c +91 -91
  26. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  27. data/ext/libxml/ruby_xml_html_parser_context.c +364 -337
  28. data/ext/libxml/ruby_xml_html_parser_context.h +11 -10
  29. data/ext/libxml/ruby_xml_html_parser_options.c +48 -48
  30. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  31. data/ext/libxml/ruby_xml_input_cbg.c +216 -188
  32. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  33. data/ext/libxml/ruby_xml_io.c +49 -47
  34. data/ext/libxml/ruby_xml_io.h +10 -10
  35. data/ext/libxml/ruby_xml_namespace.c +159 -154
  36. data/ext/libxml/ruby_xml_namespace.h +11 -10
  37. data/ext/libxml/ruby_xml_namespaces.c +313 -293
  38. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  39. data/ext/libxml/ruby_xml_node.c +1433 -1398
  40. data/ext/libxml/ruby_xml_node.h +15 -13
  41. data/ext/libxml/ruby_xml_parser.c +91 -91
  42. data/ext/libxml/ruby_xml_parser.h +10 -10
  43. data/ext/libxml/ruby_xml_parser_context.c +1016 -1001
  44. data/ext/libxml/ruby_xml_parser_context.h +11 -10
  45. data/ext/libxml/ruby_xml_parser_options.c +74 -66
  46. data/ext/libxml/ruby_xml_parser_options.h +10 -10
  47. data/ext/libxml/ruby_xml_reader.c +40 -31
  48. data/ext/libxml/ruby_xml_reader.h +14 -14
  49. data/ext/libxml/ruby_xml_registry.c +31 -0
  50. data/ext/libxml/ruby_xml_registry.h +22 -0
  51. data/ext/libxml/ruby_xml_relaxng.c +21 -5
  52. data/ext/libxml/ruby_xml_relaxng.h +9 -8
  53. data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
  54. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  55. data/ext/libxml/ruby_xml_sax_parser.c +108 -116
  56. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  57. data/ext/libxml/ruby_xml_schema.c +22 -15
  58. data/ext/libxml/ruby_xml_schema.h +26 -25
  59. data/ext/libxml/ruby_xml_schema_attribute.c +7 -7
  60. data/ext/libxml/ruby_xml_schema_attribute.h +37 -37
  61. data/ext/libxml/ruby_xml_schema_element.c +8 -8
  62. data/ext/libxml/ruby_xml_schema_element.h +11 -11
  63. data/ext/libxml/ruby_xml_schema_facet.c +50 -50
  64. data/ext/libxml/ruby_xml_schema_facet.h +9 -9
  65. data/ext/libxml/ruby_xml_schema_type.c +12 -19
  66. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  67. data/ext/libxml/ruby_xml_version.h +9 -9
  68. data/ext/libxml/ruby_xml_writer.c +183 -185
  69. data/ext/libxml/ruby_xml_writer.h +6 -6
  70. data/ext/libxml/ruby_xml_xinclude.c +20 -20
  71. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  72. data/ext/libxml/ruby_xml_xpath.c +195 -195
  73. data/ext/libxml/ruby_xml_xpath.h +15 -15
  74. data/ext/libxml/ruby_xml_xpath_context.c +408 -362
  75. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  76. data/ext/libxml/ruby_xml_xpath_expression.c +12 -6
  77. data/ext/libxml/ruby_xml_xpath_expression.h +11 -10
  78. data/ext/libxml/ruby_xml_xpath_object.c +69 -54
  79. data/ext/libxml/ruby_xml_xpath_object.h +19 -17
  80. data/ext/vc/libxml_ruby/libxml_ruby.vcxproj +271 -0
  81. data/ext/xcode/libxml-ruby.xcodeproj/project.pbxproj +633 -0
  82. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  83. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  84. data/ext/xcode/libxml-ruby.xcodeproj/xcshareddata/xcschemes/libxml-ruby.xcscheme +80 -0
  85. data/lib/libxml/attr.rb +122 -122
  86. data/lib/libxml/attr_decl.rb +80 -80
  87. data/lib/libxml/attributes.rb +13 -13
  88. data/lib/libxml/document.rb +165 -194
  89. data/lib/libxml/error.rb +122 -95
  90. data/lib/libxml/html_parser.rb +80 -96
  91. data/lib/libxml/namespace.rb +61 -61
  92. data/lib/libxml/namespaces.rb +37 -37
  93. data/lib/libxml/node.rb +321 -323
  94. data/lib/libxml/parser.rb +94 -100
  95. data/lib/libxml/sax_callbacks.rb +179 -179
  96. data/lib/libxml/sax_parser.rb +40 -40
  97. data/lib/libxml/schema/attribute.rb +27 -19
  98. data/lib/libxml/schema/element.rb +20 -0
  99. data/lib/libxml/schema/type.rb +44 -21
  100. data/lib/libxml/schema.rb +47 -47
  101. data/lib/libxml/tree.rb +28 -28
  102. data/lib/libxml-ruby.rb +30 -30
  103. data/libxml-ruby.gemspec +46 -48
  104. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  105. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  106. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  107. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  108. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  109. data/test/c14n/result/with-comments/example-1 +5 -5
  110. data/test/c14n/result/with-comments/example-2 +10 -10
  111. data/test/c14n/result/with-comments/example-3 +13 -13
  112. data/test/c14n/result/with-comments/example-4 +8 -8
  113. data/test/c14n/result/with-comments/example-5 +3 -3
  114. data/test/c14n/result/without-comments/example-1 +3 -3
  115. data/test/c14n/result/without-comments/example-2 +10 -10
  116. data/test/c14n/result/without-comments/example-3 +13 -13
  117. data/test/c14n/result/without-comments/example-4 +8 -8
  118. data/test/c14n/result/without-comments/example-5 +2 -2
  119. data/test/test_attr.rb +179 -180
  120. data/test/test_attr_decl.rb +131 -131
  121. data/test/test_attributes.rb +135 -135
  122. data/test/test_canonicalize.rb +122 -120
  123. data/test/test_document.rb +138 -132
  124. data/test/test_document_write.rb +142 -145
  125. data/test/test_dtd.rb +134 -129
  126. data/test/test_encoding.rb +126 -129
  127. data/test/test_encoding_sax.rb +114 -114
  128. data/test/test_error.rb +197 -194
  129. data/test/test_helper.rb +21 -13
  130. data/test/test_html_parser.rb +166 -162
  131. data/test/test_html_parser_context.rb +22 -22
  132. data/test/test_input_callbacks.rb +36 -0
  133. data/test/test_namespace.rb +58 -60
  134. data/test/test_namespaces.rb +200 -200
  135. data/test/test_node.rb +251 -237
  136. data/test/test_node_cdata.rb +50 -50
  137. data/test/test_node_comment.rb +32 -32
  138. data/test/test_node_copy.rb +40 -40
  139. data/test/test_node_edit.rb +176 -158
  140. data/test/test_node_pi.rb +37 -37
  141. data/test/test_node_text.rb +69 -69
  142. data/test/test_node_write.rb +93 -96
  143. data/test/test_node_xlink.rb +28 -28
  144. data/test/test_parser.rb +297 -324
  145. data/test/test_parser_context.rb +198 -198
  146. data/test/test_properties.rb +38 -38
  147. data/test/test_reader.rb +413 -364
  148. data/test/test_relaxng.rb +59 -53
  149. data/test/test_sax_parser.rb +345 -326
  150. data/test/test_schema.rb +28 -0
  151. data/test/test_traversal.rb +152 -152
  152. data/test/test_writer.rb +469 -468
  153. data/test/test_xinclude.rb +20 -20
  154. data/test/test_xml.rb +164 -267
  155. data/test/test_xpath.rb +244 -244
  156. data/test/test_xpath_context.rb +87 -87
  157. data/test/test_xpath_expression.rb +37 -37
  158. metadata +49 -31
  159. data/README.rdoc +0 -217
  160. data/ext/libxml/extconf.h +0 -3
  161. data/ext/libxml/ruby_xml_cbg.c +0 -85
  162. data/lib/libxml/hpricot.rb +0 -78
  163. data/lib/libxml.rb +0 -5
  164. data/lib/xml/libxml.rb +0 -10
  165. data/lib/xml.rb +0 -14
  166. data/script/benchmark/depixelate +0 -634
  167. data/script/benchmark/hamlet.xml +0 -9055
  168. data/script/benchmark/parsecount +0 -170
  169. data/script/benchmark/sock_entries.xml +0 -507
  170. data/script/benchmark/throughput +0 -41
  171. data/script/test +0 -6
  172. data/test/test_deprecated_require.rb +0 -12
data/test/test_writer.rb CHANGED
@@ -1,468 +1,469 @@
1
- # encoding: UTF-8
2
-
3
- require_relative './test_helper'
4
- require 'stringio'
5
-
6
- class TestWriter < Minitest::Test
7
- XSL_PREFIX = 'xsl'
8
- XSL_URI = 'http://www.w3.org/1999/XSL/Transform'
9
-
10
- def test_generic_failure
11
- writer = LibXML::XML::Writer.string
12
- writer.start_document
13
- assert(!writer.end_element)
14
- writer.end_document
15
- end
16
-
17
- def test_empty_doc
18
- writer = LibXML::XML::Writer.string
19
- document(writer)
20
- assert_equal(writer.result.strip!, '<?xml version="1.0"?>')
21
-
22
- writer = LibXML::XML::Writer.string
23
- document(writer, :encoding => LibXML::XML::Encoding::ISO_8859_1)
24
- assert_equal(writer.result.strip!, '<?xml version="1.0" encoding="ISO-8859-1"?>')
25
-
26
- writer = LibXML::XML::Writer.string
27
- document(writer, :standalone => 1)
28
- assert_equal(writer.result.strip!, '<?xml version="1.0" standalone="yes"?>')
29
-
30
- writer = LibXML::XML::Writer.string
31
- document(writer, :standalone => 1, :encoding => LibXML::XML::Encoding::ISO_8859_1, :foo => :bar)
32
- assert_equal(writer.result.strip!, '<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>')
33
- end
34
-
35
- def test_file_encoding
36
- value = "François".encode(Encoding::UTF_8)
37
-
38
- File.open('test.xml', 'wb', encoding: 'UTF-8') do |file|
39
- writer = LibXML::XML::Writer::io(file)
40
- document(writer, encoding: LibXML::XML::Encoding::UTF_8) do
41
- writer.write_element('Name', value)
42
- end
43
- end
44
- end
45
-
46
- def test_io_encoding
47
- value = "François".encode(Encoding::UTF_8)
48
- expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Name>François</Name>".encode(Encoding::UTF_8)
49
-
50
- io = StringIO.new
51
- writer = LibXML::XML::Writer::io(io)
52
- document(writer, encoding: LibXML::XML::Encoding::UTF_8) do
53
- writer.write_element('Name', value)
54
- end
55
- assert_equal(expected, io.string.strip)
56
- end
57
-
58
- def test_single_root
59
- writer = LibXML::XML::Writer.string
60
- document(writer) do
61
- element writer, 'root'
62
- end
63
-
64
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root/>")
65
- end
66
-
67
- def test_pi
68
- expected = "<?xml version=\"1.0\"?>\n<?php echo \"foo\";?>"
69
-
70
- writer = LibXML::XML::Writer.string
71
- document(writer) do
72
- assert(writer.start_pi('php'))
73
- assert(writer.write_string('echo "foo";'))
74
- assert(writer.end_pi)
75
- end
76
- assert_equal(writer.result.strip!, expected)
77
-
78
- writer = LibXML::XML::Writer.string
79
- document(writer) do
80
- assert(writer.write_pi('php', 'echo "foo";'))
81
- end
82
- assert_equal(writer.result.strip!, expected)
83
- end
84
-
85
- def test_comment
86
- expected = "<?xml version=\"1.0\"?>\n<!--foo-->"
87
-
88
- writer = LibXML::XML::Writer.string
89
- document(writer) do
90
- assert(writer.start_comment)
91
- assert(writer.write_string 'foo')
92
- assert(writer.end_comment)
93
- end
94
- assert_equal(writer.result.strip!, expected)
95
-
96
- writer = LibXML::XML::Writer.string
97
- document(writer) do
98
- assert(writer.write_comment 'foo')
99
- end
100
- assert_equal(writer.result.strip!, expected)
101
- end
102
-
103
- def test_cdata
104
- expected = "<?xml version=\"1.0\"?>\n<root><![CDATA[<?php echo $foo; ?>]]></root>"
105
-
106
- writer = LibXML::XML::Writer.string
107
- document(writer) do
108
- element writer, 'root' do
109
- assert(writer.start_cdata)
110
- assert(writer.write_string '<?php echo $foo; ?>')
111
- assert(writer.end_cdata)
112
- end
113
- end
114
- assert_equal(writer.result.strip!, expected)
115
-
116
- writer = LibXML::XML::Writer.string
117
- document(writer) do
118
- element writer, 'root' do
119
- assert(writer.write_cdata '<?php echo $foo; ?>')
120
- end
121
- end
122
- assert_equal(writer.result.strip!, expected)
123
- end
124
-
125
- def test_write_empty_elements
126
- writer = LibXML::XML::Writer.string
127
- document(writer) do
128
- assert(writer.write_element 'foo')
129
- end
130
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<foo/>")
131
-
132
- writer = LibXML::XML::Writer.string
133
- document(writer) do
134
- assert(writer.write_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
135
- end
136
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<" + XSL_PREFIX + ":stylesheet xmlns:xsl=\"" + XSL_URI + "\"/>")
137
- end
138
-
139
- def test_valued_element
140
- expected = "<?xml version=\"1.0\"?>\n<abc>123<def>456<ghi>789</ghi>cueillir des cerises</def>nous irons au bois</abc>"
141
-
142
- writer = LibXML::XML::Writer.string
143
- document(writer) do
144
- assert(writer.start_element 'abc')
145
- assert(writer.write_string '123')
146
- assert(writer.start_element 'def')
147
- assert(writer.write_string '456')
148
- assert(writer.start_element 'ghi')
149
- assert(writer.write_string '789')
150
- assert(writer.end_element)
151
- assert(writer.write_string 'cueillir des cerises')
152
- assert(writer.end_element)
153
- assert(writer.write_string 'nous irons au bois')
154
- assert(writer.end_element)
155
- end
156
- assert_equal(writer.result.strip!, expected)
157
-
158
- writer = LibXML::XML::Writer.string
159
- document(writer) do
160
- assert(writer.start_element 'abc')
161
- assert(writer.write_string '123')
162
- assert(writer.start_element 'def')
163
- assert(writer.write_string '456')
164
- assert(writer.write_element 'ghi', '789')
165
- assert(writer.write_string 'cueillir des cerises')
166
- assert(writer.end_element)
167
- assert(writer.write_string 'nous irons au bois')
168
- assert(writer.end_element)
169
- end
170
- assert_equal(writer.result.strip!, expected)
171
- end
172
-
173
- def test_valued_element_ns
174
- expected = "<?xml version=\"1.0\"?>\n" +
175
- "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
176
- "<xsl:attribute-set>" +
177
- "<xsl:attribute>20px</xsl:attribute>" +
178
- "<xsl:attribute>solid</xsl:attribute>" +
179
- "</xsl:attribute-set>" +
180
- "</xsl:stylesheet>"
181
-
182
- writer = LibXML::XML::Writer.string
183
- document(writer) do
184
- assert(writer.start_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
185
- assert(writer.start_element_ns XSL_PREFIX, 'attribute-set')
186
- assert(writer.start_element_ns XSL_PREFIX, 'attribute')
187
- assert(writer.write_string '20px')
188
- assert(writer.end_element)
189
- assert(writer.start_element_ns XSL_PREFIX, 'attribute')
190
- assert(writer.write_string 'solid')
191
- assert(writer.end_element)
192
- assert(writer.end_element)
193
- assert(writer.end_element)
194
- end
195
- assert_equal(writer.result.strip!, expected)
196
-
197
- writer = LibXML::XML::Writer.string
198
- document(writer) do
199
- assert(writer.start_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
200
- assert(writer.start_element_ns XSL_PREFIX, 'attribute-set')
201
- assert(writer.write_element_ns XSL_PREFIX, 'attribute', nil, '20px')
202
- assert(writer.write_element_ns XSL_PREFIX, 'attribute', nil, 'solid')
203
- assert(writer.end_element)
204
- assert(writer.end_element)
205
- end
206
- assert_equal(writer.result.strip!, expected)
207
- end
208
-
209
- def test_attribute
210
- writer = LibXML::XML::Writer.string
211
- document(writer) do
212
- element writer, 'root' do
213
- element writer, 'child' do
214
- assert(writer.start_attribute 'foo')
215
- assert(writer.write_string 'bar')
216
- assert(writer.end_attribute)
217
- end
218
- end
219
- end
220
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root><child foo=\"bar\"/></root>")
221
-
222
- writer = LibXML::XML::Writer.string
223
- document(writer) do
224
- element writer, 'root' do
225
- element writer, 'child' do
226
- assert(writer.write_attribute 'abc', 'def')
227
- assert(writer.write_string 'ghi') # must be done after attributes
228
- end
229
- end
230
- end
231
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root><child abc=\"def\">ghi</child></root>")
232
- end
233
-
234
- def test_attribute_ns
235
- expected = "<?xml version=\"1.0\"?>\n<root><link xlink:href=\"abc\" xhtml:class=\"def\"/></root>"
236
-
237
- writer = LibXML::XML::Writer.string
238
- document(writer) do
239
- element writer, 'root' do
240
- element writer, 'link' do
241
- assert(writer.write_attribute_ns 'xlink', 'href', nil, 'abc')
242
- assert(writer.write_attribute_ns 'xhtml', 'class', nil, 'def')
243
- end
244
- end
245
- end
246
- assert_equal(writer.result.strip!, expected)
247
-
248
- writer = LibXML::XML::Writer.string
249
- document(writer) do
250
- element writer, 'root' do
251
- element writer, 'link' do
252
- assert(writer.start_attribute_ns 'xlink', 'href')
253
- assert(writer.write_string 'abc')
254
- assert(writer.end_attribute)
255
- assert(writer.start_attribute_ns 'xhtml', 'class')
256
- assert(writer.write_string 'def')
257
- assert(writer.end_attribute)
258
- end
259
- end
260
- end
261
- assert_equal(writer.result.strip!, expected)
262
- end
263
-
264
- def test_quote_char
265
- if LibXML::XML::Writer.method_defined? :set_quote_char
266
- writer = LibXML::XML::Writer.string
267
- writer.set_quote_char "'"
268
- document(writer) do
269
- element writer, 'root' do
270
- assert(writer.start_attribute 'abc')
271
- assert(writer.write_string 'def')
272
- assert(writer.end_attribute)
273
- end
274
- end
275
- assert(writer.result.strip!.end_with? "<root abc='def'/>")
276
- end
277
- end
278
-
279
- def test_indentation_on
280
- if LibXML::XML::Writer.method_defined? :set_indent
281
- writer = LibXML::XML::Writer.string
282
- assert(writer.set_indent true)
283
- document(writer) do
284
- element writer, 'root' do
285
- element writer, 'child' do
286
- assert(writer.start_attribute 'abc')
287
- assert(writer.write_string 'def')
288
- assert(writer.end_attribute)
289
- end
290
- end
291
- end
292
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root>\n <child abc=\"def\"/>\n</root>")
293
- end
294
- end
295
-
296
- def test_indentation_string
297
- if LibXML::XML::Writer.method_defined? :set_indent_string
298
- writer = LibXML::XML::Writer.string
299
- assert(writer.set_indent true)
300
- assert(writer.set_indent_string ' ' * 4)
301
- document(writer) do
302
- element writer, 'root' do
303
- element writer, 'child' do
304
- assert(writer.start_attribute 'abc')
305
- assert(writer.write_string 'def')
306
- assert(writer.end_attribute)
307
- end
308
- end
309
- end
310
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root>\n <child abc=\"def\"/>\n</root>")
311
- end
312
- end
313
-
314
- def test_dtd_declaration
315
- writer = LibXML::XML::Writer.string
316
- dtd writer, 'html'
317
- assert_equal(writer.result, '<!DOCTYPE html>')
318
-
319
- writer = LibXML::XML::Writer.string
320
- dtd writer, 'html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
321
- assert_equal(writer.result, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">')
322
- end
323
-
324
- def test_dtd_attlist
325
- expected = '<!DOCTYPE http [<!ATTLIST method (get|post) "get">]>'
326
-
327
- writer = LibXML::XML::Writer.string
328
- dtd writer, 'http' do
329
- assert(writer.start_dtd_attlist 'method')
330
- assert(writer.write_string '(get|post) "get"')
331
- assert(writer.end_dtd_attlist)
332
- end
333
- assert_equal(writer.result, expected)
334
-
335
- writer = LibXML::XML::Writer.string
336
- dtd writer, 'http' do
337
- assert(writer.write_dtd_attlist 'method', '(get|post) "get"')
338
- end
339
- assert_equal(writer.result, expected)
340
- end
341
-
342
- def test_dtd_element
343
- expected = '<!DOCTYPE html [<!ELEMENT dl (dt|dd)+>]>'
344
-
345
- writer = LibXML::XML::Writer.string
346
- dtd writer, 'html' do
347
- assert(writer.start_dtd_element 'dl')
348
- assert(writer.write_string '(dt|dd)+')
349
- assert(writer.end_dtd_element)
350
- end
351
- assert_equal(writer.result, expected)
352
-
353
- writer = LibXML::XML::Writer.string
354
- dtd writer, 'html' do
355
- assert(writer.write_dtd_element 'dl', '(dt|dd)+')
356
- end
357
- assert_equal(writer.result, expected)
358
- end
359
-
360
- def test_dtd_entity
361
- # parameterized entity
362
- expected = '<!DOCTYPE html [<!ENTITY % special.pre "br | span | bdo | map"><!ENTITY % special "%special.pre; | object | img">]>'
363
-
364
- writer = LibXML::XML::Writer.string
365
- dtd writer, 'html' do
366
- assert(writer.start_dtd_entity 'special.pre', true)
367
- assert(writer.write_string 'br | span | bdo | map')
368
- assert(writer.end_dtd_entity)
369
- assert(writer.start_dtd_entity 'special', true)
370
- assert(writer.write_string '%special.pre; | object | img')
371
- assert(writer.end_dtd_entity)
372
- end
373
- assert_equal(writer.result, expected)
374
-
375
- writer = LibXML::XML::Writer.string
376
- dtd writer, 'html' do
377
- assert(writer.write_dtd_internal_entity 'special.pre', 'br | span | bdo | map', true)
378
- assert(writer.write_dtd_internal_entity 'special', '%special.pre; | object | img', true)
379
- end
380
- assert_equal(writer.result, expected)
381
-
382
- # non parameterized entity
383
- expected = '<!DOCTYPE html [<!ENTITY Alpha "&#913;">]>'
384
-
385
- writer = LibXML::XML::Writer.string
386
- dtd writer, 'html' do
387
- assert(writer.start_dtd_entity 'Alpha')
388
- assert(writer.write_string '&#913;')
389
- assert(writer.end_dtd_entity)
390
- end
391
- assert_equal(writer.result, expected)
392
-
393
- writer = LibXML::XML::Writer.string
394
- dtd writer, 'html' do
395
- assert(writer.start_dtd_entity 'Alpha', false)
396
- assert(writer.write_string '&#913;')
397
- assert(writer.end_dtd_entity)
398
- end
399
- assert_equal(writer.result, expected)
400
-
401
- writer = LibXML::XML::Writer.string
402
- dtd writer, 'html' do
403
- assert(writer.write_dtd_internal_entity 'Alpha', '&#913;', false)
404
- end
405
- assert_equal(writer.result, expected)
406
- end
407
-
408
- def test_dtd_notation
409
- writer = LibXML::XML::Writer.string
410
- dtd writer, 'pictures' do
411
- assert(writer.write_dtd_notation 'GIF89a', '-//Compuserve//NOTATION Graphics Interchange Format 89a//EN', nil)
412
- assert(writer.write_dtd_external_entity 'pictures', nil, 'images/plage.gif', 'GIF89a', false)
413
- end
414
- assert_equal(writer.result, '<!DOCTYPE pictures [<!NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics Interchange Format 89a//EN"><!ENTITY pictures SYSTEM "images/plage.gif" NDATA GIF89a>]>')
415
- end
416
-
417
- def test_encoding
418
- iso = 'éloïse'.encode 'ISO-8859-1'
419
-
420
- writer = LibXML::XML::Writer.string
421
- document(writer) do
422
- assert(writer.write_element iso)
423
- end
424
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<éloïse/>")
425
- end
426
-
427
- def test_flush
428
- writer = LibXML::XML::Writer.string
429
- assert(writer.start_document)
430
- assert_equal(writer.flush.strip!, '<?xml version="1.0"?>')
431
- assert(writer.start_element 'foo')
432
- assert(writer.end_element)
433
- assert(writer.end_document)
434
- writer.flush false
435
- assert_equal(writer.result.strip, '<foo/>')
436
- end
437
-
438
- def test_nil_pe_issue
439
- expected = '<!DOCTYPE html [<!ENTITY special.pre "br | span | bdo | map"><!ENTITY special "%special.pre; | object | img">]>'
440
-
441
- writer = LibXML::XML::Writer.string
442
- dtd writer, 'html' do
443
- assert(writer.write_dtd_internal_entity 'special.pre', 'br | span | bdo | map', nil)
444
- assert(writer.write_dtd_internal_entity 'special', '%special.pre; | object | img', nil)
445
- end
446
- assert_equal(writer.result, expected)
447
- end
448
-
449
- private
450
-
451
- def document(writer, options = {})
452
- assert(writer.start_document options)
453
- yield if block_given?
454
- assert(writer.end_document)
455
- end
456
-
457
- def dtd(writer, name, pubid = nil, sysid = nil)
458
- assert(writer.start_dtd name, pubid, sysid)
459
- yield if block_given?
460
- assert(writer.end_dtd)
461
- end
462
-
463
- def element(writer, localname)
464
- assert(writer.start_element localname)
465
- yield if block_given?
466
- assert(writer.end_element)
467
- end
468
- end
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+ require 'stringio'
5
+
6
+ class TestWriter < Minitest::Test
7
+ XSL_PREFIX = 'xsl'
8
+ XSL_URI = 'http://www.w3.org/1999/XSL/Transform'
9
+
10
+ def test_generic_failure
11
+ writer = LibXML::XML::Writer.string
12
+ writer.start_document
13
+ assert(!writer.end_element)
14
+ writer.end_document
15
+ end
16
+
17
+ def test_empty_doc
18
+ writer = LibXML::XML::Writer.string
19
+ document(writer)
20
+ assert_equal(writer.result.strip!, '<?xml version="1.0"?>')
21
+
22
+ writer = LibXML::XML::Writer.string
23
+ document(writer, :encoding => LibXML::XML::Encoding::ISO_8859_1)
24
+ assert_equal(writer.result.strip!, '<?xml version="1.0" encoding="ISO-8859-1"?>')
25
+
26
+ writer = LibXML::XML::Writer.string
27
+ document(writer, :standalone => 1)
28
+ assert_equal(writer.result.strip!, '<?xml version="1.0" standalone="yes"?>')
29
+
30
+ writer = LibXML::XML::Writer.string
31
+ document(writer, :standalone => 1, :encoding => LibXML::XML::Encoding::ISO_8859_1, :foo => :bar)
32
+ assert_equal(writer.result.strip!, '<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>')
33
+ end
34
+
35
+ def test_file_encoding
36
+ value = "François".encode(Encoding::UTF_8)
37
+
38
+ File.open('test.xml', 'wb', encoding: 'UTF-8') do |file|
39
+ writer = LibXML::XML::Writer::io(file)
40
+ document(writer, encoding: LibXML::XML::Encoding::UTF_8) do
41
+ writer.write_element('Name', value)
42
+ end
43
+ end
44
+ end
45
+
46
+ def test_io_encoding
47
+ value = "François".encode(Encoding::UTF_8)
48
+ expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Name>François</Name>".encode(Encoding::UTF_8)
49
+
50
+ io = StringIO.new
51
+ writer = LibXML::XML::Writer::io(io)
52
+ document(writer, encoding: LibXML::XML::Encoding::UTF_8) do
53
+ writer.write_element('Name', value)
54
+ end
55
+ assert_equal(expected, io.string.strip)
56
+ end
57
+
58
+ def test_single_root
59
+ writer = LibXML::XML::Writer.string
60
+ document(writer) do
61
+ element writer, 'root'
62
+ end
63
+
64
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root/>")
65
+ end
66
+
67
+ def test_pi
68
+ expected = "<?xml version=\"1.0\"?>\n<?php echo \"foo\";?>"
69
+
70
+ writer = LibXML::XML::Writer.string
71
+ document(writer) do
72
+ assert(writer.start_pi('php'))
73
+ assert(writer.write_string('echo "foo";'))
74
+ assert(writer.end_pi)
75
+ end
76
+ assert_equal(writer.result.strip!, expected)
77
+
78
+ writer = LibXML::XML::Writer.string
79
+ document(writer) do
80
+ assert(writer.write_pi('php', 'echo "foo";'))
81
+ end
82
+ assert_equal(writer.result.strip!, expected)
83
+ end
84
+
85
+ def test_comment
86
+ expected = "<?xml version=\"1.0\"?>\n<!--foo-->"
87
+
88
+ writer = LibXML::XML::Writer.string
89
+ document(writer) do
90
+ assert(writer.start_comment)
91
+ assert(writer.write_string 'foo')
92
+ assert(writer.end_comment)
93
+ end
94
+ assert_equal(writer.result.strip!, expected)
95
+
96
+ writer = LibXML::XML::Writer.string
97
+ document(writer) do
98
+ assert(writer.write_comment 'foo')
99
+ end
100
+ assert_equal(writer.result.strip!, expected)
101
+ end
102
+
103
+ def test_cdata
104
+ expected = "<?xml version=\"1.0\"?>\n<root><![CDATA[<?php echo $foo; ?>]]></root>"
105
+
106
+ writer = LibXML::XML::Writer.string
107
+ document(writer) do
108
+ element writer, 'root' do
109
+ assert(writer.start_cdata)
110
+ assert(writer.write_string '<?php echo $foo; ?>')
111
+ assert(writer.end_cdata)
112
+ end
113
+ end
114
+ assert_equal(writer.result.strip!, expected)
115
+
116
+ writer = LibXML::XML::Writer.string
117
+ document(writer) do
118
+ element writer, 'root' do
119
+ assert(writer.write_cdata '<?php echo $foo; ?>')
120
+ end
121
+ end
122
+ assert_equal(writer.result.strip!, expected)
123
+ end
124
+
125
+ def test_write_empty_elements
126
+ writer = LibXML::XML::Writer.string
127
+ document(writer) do
128
+ assert(writer.write_element 'foo')
129
+ end
130
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<foo/>")
131
+
132
+ writer = LibXML::XML::Writer.string
133
+ document(writer) do
134
+ assert(writer.write_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
135
+ end
136
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<" + XSL_PREFIX + ":stylesheet xmlns:xsl=\"" + XSL_URI + "\"/>")
137
+ end
138
+
139
+ def test_valued_element
140
+ expected = "<?xml version=\"1.0\"?>\n<abc>123<def>456<ghi>789</ghi>cueillir des cerises</def>nous irons au bois</abc>"
141
+
142
+ writer = LibXML::XML::Writer.string
143
+ document(writer) do
144
+ assert(writer.start_element 'abc')
145
+ assert(writer.write_string '123')
146
+ assert(writer.start_element 'def')
147
+ assert(writer.write_string '456')
148
+ assert(writer.start_element 'ghi')
149
+ assert(writer.write_string '789')
150
+ assert(writer.end_element)
151
+ assert(writer.write_string 'cueillir des cerises')
152
+ assert(writer.end_element)
153
+ assert(writer.write_string 'nous irons au bois')
154
+ assert(writer.end_element)
155
+ end
156
+ assert_equal(writer.result.strip!, expected)
157
+
158
+ writer = LibXML::XML::Writer.string
159
+ document(writer) do
160
+ assert(writer.start_element 'abc')
161
+ assert(writer.write_string '123')
162
+ assert(writer.start_element 'def')
163
+ assert(writer.write_string '456')
164
+ assert(writer.write_element 'ghi', '789')
165
+ assert(writer.write_string 'cueillir des cerises')
166
+ assert(writer.end_element)
167
+ assert(writer.write_string 'nous irons au bois')
168
+ assert(writer.end_element)
169
+ end
170
+ assert_equal(writer.result.strip!, expected)
171
+ end
172
+
173
+ def test_valued_element_ns
174
+ expected = "<?xml version=\"1.0\"?>\n" +
175
+ "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
176
+ "<xsl:attribute-set>" +
177
+ "<xsl:attribute>20px</xsl:attribute>" +
178
+ "<xsl:attribute>solid</xsl:attribute>" +
179
+ "</xsl:attribute-set>" +
180
+ "</xsl:stylesheet>"
181
+
182
+ writer = LibXML::XML::Writer.string
183
+ document(writer) do
184
+ assert(writer.start_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
185
+ assert(writer.start_element_ns XSL_PREFIX, 'attribute-set')
186
+ assert(writer.start_element_ns XSL_PREFIX, 'attribute')
187
+ assert(writer.write_string '20px')
188
+ assert(writer.end_element)
189
+ assert(writer.start_element_ns XSL_PREFIX, 'attribute')
190
+ assert(writer.write_string 'solid')
191
+ assert(writer.end_element)
192
+ assert(writer.end_element)
193
+ assert(writer.end_element)
194
+ end
195
+ assert_equal(writer.result.strip!, expected)
196
+
197
+ writer = LibXML::XML::Writer.string
198
+ document(writer) do
199
+ assert(writer.start_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
200
+ assert(writer.start_element_ns XSL_PREFIX, 'attribute-set')
201
+ assert(writer.write_element_ns XSL_PREFIX, 'attribute', nil, '20px')
202
+ assert(writer.write_element_ns XSL_PREFIX, 'attribute', nil, 'solid')
203
+ assert(writer.end_element)
204
+ assert(writer.end_element)
205
+ end
206
+ assert_equal(writer.result.strip!, expected)
207
+ end
208
+
209
+ def test_attribute
210
+ writer = LibXML::XML::Writer.string
211
+ document(writer) do
212
+ element writer, 'root' do
213
+ element writer, 'child' do
214
+ assert(writer.start_attribute 'foo')
215
+ assert(writer.write_string 'bar')
216
+ assert(writer.end_attribute)
217
+ end
218
+ end
219
+ end
220
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root><child foo=\"bar\"/></root>")
221
+
222
+ writer = LibXML::XML::Writer.string
223
+ document(writer) do
224
+ element writer, 'root' do
225
+ element writer, 'child' do
226
+ assert(writer.write_attribute 'abc', 'def')
227
+ assert(writer.write_string 'ghi') # must be done after attributes
228
+ end
229
+ end
230
+ end
231
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root><child abc=\"def\">ghi</child></root>")
232
+ end
233
+
234
+ def test_attribute_ns
235
+ expected = "<?xml version=\"1.0\"?>\n<root><link xlink:href=\"abc\" xhtml:class=\"def\"/></root>"
236
+
237
+ writer = LibXML::XML::Writer.string
238
+ document(writer) do
239
+ element writer, 'root' do
240
+ element writer, 'link' do
241
+ assert(writer.write_attribute_ns 'xlink', 'href', nil, 'abc')
242
+ assert(writer.write_attribute_ns 'xhtml', 'class', nil, 'def')
243
+ end
244
+ end
245
+ end
246
+ assert_equal(writer.result.strip!, expected)
247
+
248
+ writer = LibXML::XML::Writer.string
249
+ document(writer) do
250
+ element writer, 'root' do
251
+ element writer, 'link' do
252
+ assert(writer.start_attribute_ns 'xlink', 'href')
253
+ assert(writer.write_string 'abc')
254
+ assert(writer.end_attribute)
255
+ assert(writer.start_attribute_ns 'xhtml', 'class')
256
+ assert(writer.write_string 'def')
257
+ assert(writer.end_attribute)
258
+ end
259
+ end
260
+ end
261
+ assert_equal(writer.result.strip!, expected)
262
+ end
263
+
264
+ def test_quote_char
265
+ if LibXML::XML::Writer.method_defined? :set_quote_char
266
+ writer = LibXML::XML::Writer.string
267
+ writer.set_quote_char "'"
268
+ document(writer) do
269
+ element writer, 'root' do
270
+ assert(writer.start_attribute 'abc')
271
+ assert(writer.write_string 'def')
272
+ assert(writer.end_attribute)
273
+ end
274
+ end
275
+ assert(writer.result.strip!.end_with? "<root abc='def'/>")
276
+ end
277
+ end
278
+
279
+ def test_indentation_on
280
+ if LibXML::XML::Writer.method_defined? :set_indent
281
+ writer = LibXML::XML::Writer.string
282
+ assert(writer.set_indent true)
283
+ document(writer) do
284
+ element writer, 'root' do
285
+ element writer, 'child' do
286
+ assert(writer.start_attribute 'abc')
287
+ assert(writer.write_string 'def')
288
+ assert(writer.end_attribute)
289
+ end
290
+ end
291
+ end
292
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root>\n <child abc=\"def\"/>\n</root>")
293
+ end
294
+ end
295
+
296
+ def test_indentation_string
297
+ if LibXML::XML::Writer.method_defined? :set_indent_string
298
+ writer = LibXML::XML::Writer.string
299
+ assert(writer.set_indent true)
300
+ assert(writer.set_indent_string ' ' * 4)
301
+ document(writer) do
302
+ element writer, 'root' do
303
+ element writer, 'child' do
304
+ assert(writer.start_attribute 'abc')
305
+ assert(writer.write_string 'def')
306
+ assert(writer.end_attribute)
307
+ end
308
+ end
309
+ end
310
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root>\n <child abc=\"def\"/>\n</root>")
311
+ end
312
+ end
313
+
314
+ def test_dtd_declaration
315
+ writer = LibXML::XML::Writer.string
316
+ dtd writer, 'html'
317
+ assert_equal(writer.result, '<!DOCTYPE html>')
318
+
319
+ writer = LibXML::XML::Writer.string
320
+ dtd writer, 'html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
321
+ assert_equal(writer.result, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">')
322
+ end
323
+
324
+ def test_dtd_attlist
325
+ expected = '<!DOCTYPE http [<!ATTLIST method (get|post) "get">]>'
326
+
327
+ writer = LibXML::XML::Writer.string
328
+ dtd writer, 'http' do
329
+ assert(writer.start_dtd_attlist 'method')
330
+ assert(writer.write_string '(get|post) "get"')
331
+ assert(writer.end_dtd_attlist)
332
+ end
333
+ assert_equal(writer.result, expected)
334
+
335
+ writer = LibXML::XML::Writer.string
336
+ dtd writer, 'http' do
337
+ assert(writer.write_dtd_attlist 'method', '(get|post) "get"')
338
+ end
339
+ assert_equal(writer.result, expected)
340
+ end
341
+
342
+ def test_dtd_element
343
+ expected = '<!DOCTYPE html [<!ELEMENT dl (dt|dd)+>]>'
344
+
345
+ writer = LibXML::XML::Writer.string
346
+ dtd writer, 'html' do
347
+ assert(writer.start_dtd_element 'dl')
348
+ assert(writer.write_string '(dt|dd)+')
349
+ assert(writer.end_dtd_element)
350
+ end
351
+ assert_equal(writer.result, expected)
352
+
353
+ writer = LibXML::XML::Writer.string
354
+ dtd writer, 'html' do
355
+ assert(writer.write_dtd_element 'dl', '(dt|dd)+')
356
+ end
357
+ assert_equal(writer.result, expected)
358
+ end
359
+
360
+ def test_dtd_entity
361
+ # parameterized entity
362
+ expected = '<!DOCTYPE html [<!ENTITY % special.pre "br | span | bdo | map"><!ENTITY % special "%special.pre; | object | img">]>'
363
+
364
+ writer = LibXML::XML::Writer.string
365
+ dtd writer, 'html' do
366
+ assert(writer.start_dtd_entity 'special.pre', true)
367
+ assert(writer.write_string 'br | span | bdo | map')
368
+ assert(writer.end_dtd_entity)
369
+ assert(writer.start_dtd_entity 'special', true)
370
+ assert(writer.write_string '%special.pre; | object | img')
371
+ assert(writer.end_dtd_entity)
372
+ end
373
+ assert_equal(writer.result, expected)
374
+
375
+ writer = LibXML::XML::Writer.string
376
+ dtd writer, 'html' do
377
+ assert(writer.write_dtd_internal_entity 'special.pre', 'br | span | bdo | map', true)
378
+ assert(writer.write_dtd_internal_entity 'special', '%special.pre; | object | img', true)
379
+ end
380
+ assert_equal(writer.result, expected)
381
+
382
+ # non parameterized entity
383
+ expected = '<!DOCTYPE html [<!ENTITY Alpha "&#913;">]>'
384
+
385
+ writer = LibXML::XML::Writer.string
386
+ dtd writer, 'html' do
387
+ assert(writer.start_dtd_entity 'Alpha')
388
+ assert(writer.write_string '&#913;')
389
+ assert(writer.end_dtd_entity)
390
+ end
391
+ assert_equal(writer.result, expected)
392
+
393
+ writer = LibXML::XML::Writer.string
394
+ dtd writer, 'html' do
395
+ assert(writer.start_dtd_entity 'Alpha', false)
396
+ assert(writer.write_string '&#913;')
397
+ assert(writer.end_dtd_entity)
398
+ end
399
+ assert_equal(writer.result, expected)
400
+
401
+ writer = LibXML::XML::Writer.string
402
+ dtd writer, 'html' do
403
+ assert(writer.write_dtd_internal_entity 'Alpha', '&#913;', false)
404
+ end
405
+ assert_equal(writer.result, expected)
406
+ end
407
+
408
+ def test_dtd_notation
409
+ writer = LibXML::XML::Writer.string
410
+ dtd writer, 'pictures' do
411
+ assert(writer.write_dtd_notation 'GIF89a', '-//Compuserve//NOTATION Graphics Interchange Format 89a//EN', nil)
412
+ assert(writer.write_dtd_external_entity 'pictures', nil, 'images/plage.gif', 'GIF89a', false)
413
+ end
414
+ assert_equal(writer.result, '<!DOCTYPE pictures [<!NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics Interchange Format 89a//EN"><!ENTITY pictures SYSTEM "images/plage.gif" NDATA GIF89a>]>')
415
+ end
416
+
417
+ def test_encoding
418
+ iso = 'éloïse'.encode 'ISO-8859-1'
419
+
420
+ writer = LibXML::XML::Writer.string
421
+ document(writer) do
422
+ assert(writer.write_element iso)
423
+ end
424
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<éloïse/>")
425
+ end
426
+
427
+ def test_flush
428
+ writer = LibXML::XML::Writer.string
429
+ assert(writer.start_document)
430
+ assert_equal(writer.flush.strip!, '<?xml version="1.0"?>')
431
+ assert(writer.start_element 'foo')
432
+ assert(writer.end_element)
433
+ assert(writer.end_document)
434
+ writer.flush false
435
+ assert_equal(writer.result.strip, '<foo/>')
436
+ end
437
+
438
+ def test_nil_pe_issue
439
+ expected = '<!DOCTYPE html [<!ENTITY special.pre "br | span | bdo | map"><!ENTITY special "%special.pre; | object | img">]>'
440
+
441
+ writer = LibXML::XML::Writer.string
442
+ dtd writer, 'html' do
443
+ assert(writer.write_dtd_internal_entity 'special.pre', 'br | span | bdo | map', nil)
444
+ assert(writer.write_dtd_internal_entity 'special', '%special.pre; | object | img', nil)
445
+ end
446
+ assert_equal(writer.result, expected)
447
+ end
448
+
449
+ private
450
+
451
+ def document(writer, options = {})
452
+ assert(writer.start_document options)
453
+ yield if block_given?
454
+ assert(writer.end_document)
455
+ end
456
+
457
+ def dtd(writer, name, pubid = nil, sysid = nil)
458
+ assert(writer.start_dtd name, pubid, sysid)
459
+ yield if block_given?
460
+ assert(writer.end_dtd)
461
+ end
462
+
463
+ def element(writer, localname)
464
+ assert(writer.start_element localname)
465
+ yield if block_given?
466
+ assert(writer.end_element)
467
+ end
468
+
469
+ end