libxml-ruby 2.9.0 → 3.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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY +811 -790
  3. data/LICENSE +20 -20
  4. data/MANIFEST +166 -166
  5. data/README.rdoc +188 -184
  6. data/Rakefile +1 -1
  7. data/ext/libxml/libxml.c +80 -80
  8. data/ext/libxml/ruby_libxml.h +75 -75
  9. data/ext/libxml/ruby_xml.c +0 -84
  10. data/ext/libxml/ruby_xml.h +0 -10
  11. data/ext/libxml/ruby_xml_attr.h +12 -12
  12. data/ext/libxml/ruby_xml_attr_decl.c +153 -153
  13. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  14. data/ext/libxml/ruby_xml_attributes.c +275 -275
  15. data/ext/libxml/ruby_xml_attributes.h +15 -15
  16. data/ext/libxml/ruby_xml_document.c +21 -27
  17. data/ext/libxml/ruby_xml_document.h +11 -11
  18. data/ext/libxml/ruby_xml_dtd.c +2 -13
  19. data/ext/libxml/ruby_xml_dtd.h +9 -9
  20. data/ext/libxml/ruby_xml_error.c +996 -996
  21. data/ext/libxml/ruby_xml_error.h +12 -12
  22. data/ext/libxml/ruby_xml_html_parser.c +89 -92
  23. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  24. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  25. data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
  26. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  27. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  28. data/ext/libxml/ruby_xml_io.c +0 -1
  29. data/ext/libxml/ruby_xml_io.h +10 -10
  30. data/ext/libxml/ruby_xml_namespace.c +153 -153
  31. data/ext/libxml/ruby_xml_namespace.h +10 -10
  32. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  33. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  34. data/ext/libxml/ruby_xml_node.c +100 -143
  35. data/ext/libxml/ruby_xml_node.h +13 -11
  36. data/ext/libxml/ruby_xml_parser.c +91 -94
  37. data/ext/libxml/ruby_xml_parser.h +12 -12
  38. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  39. data/ext/libxml/ruby_xml_parser_options.c +66 -66
  40. data/ext/libxml/ruby_xml_parser_options.h +12 -12
  41. data/ext/libxml/ruby_xml_reader.c +45 -37
  42. data/ext/libxml/ruby_xml_reader.h +17 -17
  43. data/ext/libxml/ruby_xml_relaxng.h +10 -10
  44. data/ext/libxml/ruby_xml_sax2_handler.c +3 -3
  45. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  46. data/ext/libxml/ruby_xml_sax_parser.c +116 -120
  47. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  48. data/ext/libxml/ruby_xml_schema.h +809 -809
  49. data/ext/libxml/ruby_xml_schema_attribute.c +109 -109
  50. data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
  51. data/ext/libxml/ruby_xml_schema_element.c +94 -94
  52. data/ext/libxml/ruby_xml_schema_element.h +14 -14
  53. data/ext/libxml/ruby_xml_schema_facet.c +52 -52
  54. data/ext/libxml/ruby_xml_schema_facet.h +13 -13
  55. data/ext/libxml/ruby_xml_schema_type.c +259 -259
  56. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  57. data/ext/libxml/ruby_xml_version.h +9 -9
  58. data/ext/libxml/ruby_xml_writer.c +1136 -1136
  59. data/ext/libxml/ruby_xml_writer.h +10 -10
  60. data/ext/libxml/ruby_xml_xinclude.c +16 -16
  61. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  62. data/ext/libxml/ruby_xml_xpath.c +42 -36
  63. data/ext/libxml/ruby_xml_xpath.h +13 -13
  64. data/ext/libxml/ruby_xml_xpath_context.c +1 -1
  65. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  66. data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
  67. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  68. data/ext/libxml/ruby_xml_xpath_object.c +5 -2
  69. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  70. data/ext/libxml/ruby_xml_xpointer.c +99 -99
  71. data/ext/libxml/ruby_xml_xpointer.h +11 -11
  72. data/ext/vc/libxml_ruby.sln +17 -15
  73. data/lib/libxml.rb +1 -6
  74. data/lib/libxml/node.rb +2 -78
  75. data/lib/libxml/parser.rb +0 -266
  76. data/lib/libxml/sax_parser.rb +0 -17
  77. data/lib/libxml/schema.rb +66 -66
  78. data/lib/libxml/schema/attribute.rb +19 -19
  79. data/lib/libxml/schema/element.rb +27 -27
  80. data/lib/libxml/schema/type.rb +29 -29
  81. data/script/benchmark/depixelate +634 -634
  82. data/script/benchmark/hamlet.xml +9054 -9054
  83. data/script/benchmark/parsecount +170 -170
  84. data/script/benchmark/throughput +41 -41
  85. data/script/test +6 -6
  86. data/test/c14n/given/example-1.xml +14 -14
  87. data/test/c14n/given/example-2.xml +11 -11
  88. data/test/c14n/given/example-3.xml +18 -18
  89. data/test/c14n/given/example-4.xml +9 -9
  90. data/test/c14n/given/example-5.xml +12 -12
  91. data/test/c14n/given/example-6.xml +2 -2
  92. data/test/c14n/given/example-7.xml +11 -11
  93. data/test/c14n/given/example-8.xml +11 -11
  94. data/test/c14n/given/example-8.xpath +9 -9
  95. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  96. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  97. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  98. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  99. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  100. data/test/c14n/result/with-comments/example-1 +5 -5
  101. data/test/c14n/result/with-comments/example-2 +10 -10
  102. data/test/c14n/result/with-comments/example-3 +13 -13
  103. data/test/c14n/result/with-comments/example-4 +8 -8
  104. data/test/c14n/result/with-comments/example-5 +3 -3
  105. data/test/c14n/result/without-comments/example-1 +3 -3
  106. data/test/c14n/result/without-comments/example-2 +10 -10
  107. data/test/c14n/result/without-comments/example-3 +13 -13
  108. data/test/c14n/result/without-comments/example-4 +8 -8
  109. data/test/c14n/result/without-comments/example-5 +2 -2
  110. data/test/model/atom.xml +12 -12
  111. data/test/model/bands.iso-8859-1.xml +4 -4
  112. data/test/model/bands.utf-8.xml +4 -4
  113. data/test/model/bands.xml +4 -4
  114. data/test/model/books.xml +153 -153
  115. data/test/model/merge_bug_data.xml +58 -58
  116. data/test/model/ruby-lang.html +238 -238
  117. data/test/model/rubynet.xml +79 -79
  118. data/test/model/shiporder.rnc +28 -28
  119. data/test/model/shiporder.rng +86 -86
  120. data/test/model/shiporder.xml +22 -22
  121. data/test/model/shiporder.xsd +39 -39
  122. data/test/model/soap.xml +27 -27
  123. data/test/model/xinclude.xml +4 -4
  124. data/test/tc_attributes.rb +0 -6
  125. data/test/tc_error.rb +157 -158
  126. data/test/tc_node.rb +33 -17
  127. data/test/tc_node_edit.rb +0 -15
  128. data/test/tc_node_pi.rb +39 -39
  129. data/test/tc_parser.rb +0 -48
  130. data/test/tc_reader.rb +12 -53
  131. data/test/tc_writer.rb +447 -447
  132. data/test/tc_xpath.rb +1 -1
  133. data/test/test_helper.rb +2 -2
  134. metadata +3 -8
  135. data/ext/libxml/extconf.h +0 -4
  136. data/lib/libxml/ns.rb +0 -22
  137. data/lib/libxml/properties.rb +0 -23
  138. data/lib/libxml/reader.rb +0 -29
  139. data/lib/libxml/xpath_object.rb +0 -16
@@ -66,21 +66,6 @@ class TestNodeEdit < Minitest::Test
66
66
  @doc.root.to_s.gsub(/\n\s*/,''))
67
67
  end
68
68
 
69
- def test_freed_node
70
- root = XML::Node.new("root")
71
-
72
- a = XML::Node.new("a")
73
- root << a
74
-
75
- a.parent.remove!
76
-
77
- # Node a has now been freed from under us
78
- error = assert_raises(RuntimeError) do
79
- a.to_s
80
- end
81
- assert_equal('This node has already been freed.', error.to_s)
82
- end
83
-
84
69
  def test_remove_node_gc
85
70
  xp = XML::Parser.string('<test><num>one</num><num>two</num><num>three</num></test>')
86
71
  doc = xp.parse
@@ -1,39 +1,39 @@
1
- # encoding: UTF-8
2
-
3
- require './test_helper'
4
-
5
-
6
- class NodeCommentTest < Minitest::Test
7
- def setup
8
- xp = XML::Parser.string('<root></root>')
9
- @doc = xp.parse
10
- assert_instance_of(XML::Document, @doc)
11
- @root = @doc.root
12
- end
13
-
14
- def test_libxml_node_add_pi_01
15
- @root << XML::Node.new_pi('mypi')
16
- assert_equal '<root><?mypi?></root>',
17
- @root.to_s.gsub(/\n\s*/,'')
18
- end
19
-
20
- def test_libxml_node_add_pi_02
21
- @root << XML::Node.new_pi('mypi')
22
- assert_equal 'pi',
23
- @root.child.node_type_name
24
- end
25
-
26
- def test_libxml_node_add_pi_03
27
- @root << el = XML::Node.new_pi('mypi')
28
- el << "_this_is_added"
29
- assert_equal '<root><?mypi _this_is_added?></root>',
30
- @root.to_s.gsub(/\n\s*/,'')
31
- end
32
-
33
- def test_libxml_node_add_pi_04
34
- @root << XML::Node.new_pi('mypi','mycontent')
35
- assert_equal '<root><?mypi mycontent?></root>',
36
- @root.to_s.gsub(/\n\s*/,'')
37
- end
38
-
39
- end
1
+ # encoding: UTF-8
2
+
3
+ require './test_helper'
4
+
5
+
6
+ class NodeCommentTest < Minitest::Test
7
+ def setup
8
+ xp = XML::Parser.string('<root></root>')
9
+ @doc = xp.parse
10
+ assert_instance_of(XML::Document, @doc)
11
+ @root = @doc.root
12
+ end
13
+
14
+ def test_libxml_node_add_pi_01
15
+ @root << XML::Node.new_pi('mypi')
16
+ assert_equal '<root><?mypi?></root>',
17
+ @root.to_s.gsub(/\n\s*/,'')
18
+ end
19
+
20
+ def test_libxml_node_add_pi_02
21
+ @root << XML::Node.new_pi('mypi')
22
+ assert_equal 'pi',
23
+ @root.child.node_type_name
24
+ end
25
+
26
+ def test_libxml_node_add_pi_03
27
+ @root << el = XML::Node.new_pi('mypi')
28
+ el << "_this_is_added"
29
+ assert_equal '<root><?mypi _this_is_added?></root>',
30
+ @root.to_s.gsub(/\n\s*/,'')
31
+ end
32
+
33
+ def test_libxml_node_add_pi_04
34
+ @root << XML::Node.new_pi('mypi','mycontent')
35
+ assert_equal '<root><?mypi mycontent?></root>',
36
+ @root.to_s.gsub(/\n\s*/,'')
37
+ end
38
+
39
+ end
@@ -300,54 +300,6 @@ class TestParser < Minitest::Test
300
300
  assert_nil(error.node)
301
301
  end
302
302
 
303
- # Deprecated methods
304
- def test_document_deprecated
305
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.utf-8.xml'))
306
- parser = XML::Parser.file(file)
307
- doc = parser.parse
308
-
309
- parser = XML::Parser.new
310
- parser.document = doc
311
- doc = parser.parse
312
-
313
- assert_instance_of(XML::Document, doc)
314
- assert_instance_of(XML::Parser::Context, parser.context)
315
- end
316
-
317
- def test_file_deprecated
318
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
319
-
320
- parser = XML::Parser.new
321
- parser.file = file
322
- doc = parser.parse
323
- assert_instance_of(XML::Document, doc)
324
- assert_instance_of(XML::Parser::Context, parser.context)
325
- end
326
-
327
- def test_io_deprecated
328
- File.open(File.join(File.dirname(__FILE__), 'model/rubynet.xml')) do |io|
329
- parser = XML::Parser.new
330
- assert_instance_of(XML::Parser, parser)
331
- parser.io = io
332
-
333
- doc = parser.parse
334
- assert_instance_of(XML::Document, doc)
335
- assert_instance_of(XML::Parser::Context, parser.context)
336
- end
337
- end
338
-
339
- def test_string_deprecated
340
- str = '<ruby_array uga="booga" foo="bar"><fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>'
341
-
342
- parser = XML::Parser.new
343
- parser.string = str
344
- assert_instance_of(XML::Parser, parser)
345
-
346
- doc = parser.parse
347
- assert_instance_of(XML::Document, doc)
348
- assert_instance_of(XML::Parser::Context, parser.context)
349
- end
350
-
351
303
  def test_errors_from_background_thread
352
304
  errors = []
353
305
  background_errors = []
@@ -103,35 +103,6 @@ class TestReader < Minitest::Test
103
103
  assert_equal("Fatal error: Couldn't find end of Start Tag foo at :1.", error.to_s)
104
104
  end
105
105
 
106
- def test_deprecated_error_handler
107
- called = false
108
- reader = XML::Reader.string('<foo blah')
109
- reader.set_error_handler do |error|
110
- called = true
111
- end
112
-
113
- assert_raises(XML::Error) do
114
- reader.read
115
- end
116
-
117
- assert(called)
118
- end
119
-
120
- def test_deprecated_reset_error_handler
121
- called = false
122
- reader = XML::Reader.string('<foo blah')
123
- reader.set_error_handler do |error|
124
- called = true
125
- end
126
- reader.reset_error_handler
127
-
128
- assert_raises(XML::Error) do
129
- reader.read
130
- end
131
-
132
- assert(!called)
133
- end
134
-
135
106
  def test_attr
136
107
  parser = XML::Reader.string("<foo x='1' y='2'/>")
137
108
  assert(parser.read)
@@ -140,18 +111,8 @@ class TestReader < Minitest::Test
140
111
  assert_equal('1', parser[0])
141
112
  assert_equal('2', parser['y'])
142
113
  assert_equal('2', parser[1])
143
- assert_equal(nil, parser['z'])
144
- assert_equal(nil, parser[2])
145
- end
146
-
147
- def test_move_to_attribute_depreciation
148
- previous_stderr, $stderr = $stderr, StringIO.new
149
- reader = XML::Reader.string("<foo x='1' y='2'/>")
150
- assert(reader.read)
151
- assert(reader.move_to_attribute 1)
152
- assert($stderr.string =~ /deprecated/)
153
- ensure
154
- $stderr = previous_stderr
114
+ assert_nil(parser['z'])
115
+ assert_nil(parser[2])
155
116
  end
156
117
 
157
118
  def test_move_attr
@@ -235,6 +196,9 @@ class TestReader < Minitest::Test
235
196
  node = reader.expand
236
197
  assert_equal('feed', node.name)
237
198
 
199
+ # We need to create document to use xpath
200
+ reader.doc
201
+
238
202
  # Search for entries
239
203
  entries = node.find('atom:entry', 'atom:http://www.w3.org/2005/Atom')
240
204
 
@@ -245,16 +209,14 @@ class TestReader < Minitest::Test
245
209
  reader = XML::Reader.file(XML_FILE)
246
210
 
247
211
  # Expand a node before one has been read
248
- error = assert_raises(RuntimeError) do
249
- reader.expand
250
- end
251
- assert_equal("The reader does not have a document. Did you forget to call read?", error.to_s)
212
+ node = reader.expand
213
+ assert_nil(node)
252
214
  end
253
215
 
254
- def test_expand_invalid_access
216
+ def test_expand_should_be_invalid
255
217
  reader = XML::Reader.file(XML_FILE)
256
218
 
257
- # Read a node
219
+ # Read a couple of nodes
258
220
  reader.read
259
221
  reader.read
260
222
 
@@ -265,11 +227,8 @@ class TestReader < Minitest::Test
265
227
  # Read another node, this makes the last node invalid
266
228
  reader.next
267
229
 
268
- # The previous node is now invalid
269
- error = assert_raises(RuntimeError) do
270
- assert_equal('feed', node.name)
271
- end
272
- assert_equal("This node has already been freed.", error.to_s)
230
+ # The previous node is now invalid - this should be an error but isn't
231
+ assert_equal('feed', node.name)
273
232
  end
274
233
 
275
234
  def test_mode
@@ -282,7 +241,7 @@ class TestReader < Minitest::Test
282
241
  def test_bytes_consumed
283
242
  reader = XML::Reader.file(XML_FILE)
284
243
  reader.read
285
- assert_equal(416, reader.byte_consumed)
244
+ assert_equal(428, reader.byte_consumed)
286
245
  end
287
246
 
288
247
  def test_node
@@ -1,447 +1,447 @@
1
- # encoding: UTF-8
2
-
3
- require './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 = 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 = XML::Writer.string
19
- document writer
20
- assert_equal(writer.result.strip!, '<?xml version="1.0"?>')
21
-
22
- writer = XML::Writer.string
23
- document writer, { :encoding => XML::Encoding::ISO_8859_1 }
24
- assert_equal(writer.result.strip!, '<?xml version="1.0" encoding="ISO-8859-1"?>')
25
-
26
- writer = XML::Writer.string
27
- document writer, { :standalone => 1 }
28
- assert_equal(writer.result.strip!, '<?xml version="1.0" standalone="yes"?>')
29
-
30
- writer = XML::Writer.string
31
- document writer, { :standalone => 1, :encoding => 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_single_root
36
- writer = XML::Writer.string
37
- document writer do
38
- element writer, 'root'
39
- end
40
-
41
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root/>")
42
- end
43
-
44
- def test_pi
45
- expected = "<?xml version=\"1.0\"?>\n<?php echo \"foo\";?>"
46
-
47
- writer = XML::Writer.string
48
- document writer do
49
- assert(writer.start_pi('php'))
50
- assert(writer.write_string('echo "foo";'))
51
- assert(writer.end_pi)
52
- end
53
- assert_equal(writer.result.strip!, expected)
54
-
55
- writer = XML::Writer.string
56
- document writer do
57
- assert(writer.write_pi('php', 'echo "foo";'))
58
- end
59
- assert_equal(writer.result.strip!, expected)
60
- end
61
-
62
- def test_comment
63
- expected = "<?xml version=\"1.0\"?>\n<!--foo-->"
64
-
65
- writer = XML::Writer.string
66
- document writer do
67
- assert(writer.start_comment)
68
- assert(writer.write_string 'foo')
69
- assert(writer.end_comment)
70
- end
71
- assert_equal(writer.result.strip!, expected)
72
-
73
- writer = XML::Writer.string
74
- document writer do
75
- assert(writer.write_comment 'foo')
76
- end
77
- assert_equal(writer.result.strip!, expected)
78
- end
79
-
80
- def test_cdata
81
- expected = "<?xml version=\"1.0\"?>\n<root><![CDATA[<?php echo $foo; ?>]]></root>"
82
-
83
- writer = XML::Writer.string
84
- document writer do
85
- element writer, 'root' do
86
- assert(writer.start_cdata)
87
- assert(writer.write_string '<?php echo $foo; ?>')
88
- assert(writer.end_cdata)
89
- end
90
- end
91
- assert_equal(writer.result.strip!, expected)
92
-
93
- writer = XML::Writer.string
94
- document writer do
95
- element writer, 'root' do
96
- assert(writer.write_cdata '<?php echo $foo; ?>')
97
- end
98
- end
99
- assert_equal(writer.result.strip!, expected)
100
- end
101
-
102
- def test_write_empty_elements
103
- writer = XML::Writer.string
104
- document writer do
105
- assert(writer.write_element 'foo')
106
- end
107
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<foo/>")
108
-
109
- writer = XML::Writer.string
110
- document writer do
111
- assert(writer.write_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
112
- end
113
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<" + XSL_PREFIX + ":stylesheet xmlns:xsl=\"" + XSL_URI + "\"/>")
114
- end
115
-
116
- def test_valued_element
117
- expected = "<?xml version=\"1.0\"?>\n<abc>123<def>456<ghi>789</ghi>cueillir des cerises</def>nous irons au bois</abc>"
118
-
119
- writer = XML::Writer.string
120
- document writer do
121
- assert(writer.start_element 'abc')
122
- assert(writer.write_string '123')
123
- assert(writer.start_element 'def')
124
- assert(writer.write_string '456')
125
- assert(writer.start_element 'ghi')
126
- assert(writer.write_string '789')
127
- assert(writer.end_element)
128
- assert(writer.write_string 'cueillir des cerises')
129
- assert(writer.end_element)
130
- assert(writer.write_string 'nous irons au bois')
131
- assert(writer.end_element)
132
- end
133
- assert_equal(writer.result.strip!, expected)
134
-
135
- writer = XML::Writer.string
136
- document writer do
137
- assert(writer.start_element 'abc')
138
- assert(writer.write_string '123')
139
- assert(writer.start_element 'def')
140
- assert(writer.write_string '456')
141
- assert(writer.write_element 'ghi', '789')
142
- assert(writer.write_string 'cueillir des cerises')
143
- assert(writer.end_element)
144
- assert(writer.write_string 'nous irons au bois')
145
- assert(writer.end_element)
146
- end
147
- assert_equal(writer.result.strip!, expected)
148
- end
149
-
150
- def test_valued_element_ns
151
- expected = "<?xml version=\"1.0\"?>\n" +
152
- "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
153
- "<xsl:attribute-set>" +
154
- "<xsl:attribute>20px</xsl:attribute>" +
155
- "<xsl:attribute>solid</xsl:attribute>" +
156
- "</xsl:attribute-set>" +
157
- "</xsl:stylesheet>"
158
-
159
- writer = XML::Writer.string
160
- document writer do
161
- assert(writer.start_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
162
- assert(writer.start_element_ns XSL_PREFIX, 'attribute-set')
163
- assert(writer.start_element_ns XSL_PREFIX, 'attribute')
164
- assert(writer.write_string '20px')
165
- assert(writer.end_element)
166
- assert(writer.start_element_ns XSL_PREFIX, 'attribute')
167
- assert(writer.write_string 'solid')
168
- assert(writer.end_element)
169
- assert(writer.end_element)
170
- assert(writer.end_element)
171
- end
172
- assert_equal(writer.result.strip!, expected)
173
-
174
- writer = XML::Writer.string
175
- document writer do
176
- assert(writer.start_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
177
- assert(writer.start_element_ns XSL_PREFIX, 'attribute-set')
178
- assert(writer.write_element_ns XSL_PREFIX, 'attribute', nil, '20px')
179
- assert(writer.write_element_ns XSL_PREFIX, 'attribute', nil, 'solid')
180
- assert(writer.end_element)
181
- assert(writer.end_element)
182
- end
183
- assert_equal(writer.result.strip!, expected)
184
- end
185
-
186
- def test_attribute
187
- writer = XML::Writer.string
188
- document writer do
189
- element writer, 'root' do
190
- element writer, 'child' do
191
- assert(writer.start_attribute 'foo')
192
- assert(writer.write_string 'bar')
193
- assert(writer.end_attribute)
194
- end
195
- end
196
- end
197
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root><child foo=\"bar\"/></root>")
198
-
199
- writer = XML::Writer.string
200
- document writer do
201
- element writer, 'root' do
202
- element writer, 'child' do
203
- assert(writer.write_attribute 'abc', 'def')
204
- assert(writer.write_string 'ghi') # must be done after attributes
205
- end
206
- end
207
- end
208
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root><child abc=\"def\">ghi</child></root>")
209
- end
210
-
211
- def test_attribute_ns
212
- expected = "<?xml version=\"1.0\"?>\n<root><link xlink:href=\"abc\" xhtml:class=\"def\"/></root>"
213
-
214
- writer = XML::Writer.string
215
- document writer do
216
- element writer, 'root' do
217
- element writer, 'link' do
218
- assert(writer.write_attribute_ns 'xlink', 'href', nil, 'abc')
219
- assert(writer.write_attribute_ns 'xhtml', 'class', nil, 'def')
220
- end
221
- end
222
- end
223
- assert_equal(writer.result.strip!, expected)
224
-
225
- writer = XML::Writer.string
226
- document writer do
227
- element writer, 'root' do
228
- element writer, 'link' do
229
- assert(writer.start_attribute_ns 'xlink', 'href')
230
- assert(writer.write_string 'abc')
231
- assert(writer.end_attribute)
232
- assert(writer.start_attribute_ns 'xhtml', 'class')
233
- assert(writer.write_string 'def')
234
- assert(writer.end_attribute)
235
- end
236
- end
237
- end
238
- assert_equal(writer.result.strip!, expected)
239
- end
240
-
241
- def test_quote_char
242
- if XML::Writer.method_defined? :set_quote_char
243
- writer = XML::Writer.string
244
- writer.set_quote_char "'"
245
- document writer do
246
- element writer, 'root' do
247
- assert(writer.start_attribute 'abc')
248
- assert(writer.write_string 'def')
249
- assert(writer.end_attribute)
250
- end
251
- end
252
- assert(writer.result.strip!.end_with? "<root abc='def'/>")
253
- end
254
- end
255
-
256
- def test_indentation_on
257
- if XML::Writer.method_defined? :set_indent
258
- writer = XML::Writer.string
259
- assert(writer.set_indent true)
260
- document writer do
261
- element writer, 'root' do
262
- element writer, 'child' do
263
- assert(writer.start_attribute 'abc')
264
- assert(writer.write_string 'def')
265
- assert(writer.end_attribute)
266
- end
267
- end
268
- end
269
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root>\n <child abc=\"def\"/>\n</root>")
270
- end
271
- end
272
-
273
- def test_indentation_string
274
- if XML::Writer.method_defined? :set_indent_string
275
- writer = XML::Writer.string
276
- assert(writer.set_indent true)
277
- assert(writer.set_indent_string ' ' * 4)
278
- document writer do
279
- element writer, 'root' do
280
- element writer, 'child' do
281
- assert(writer.start_attribute 'abc')
282
- assert(writer.write_string 'def')
283
- assert(writer.end_attribute)
284
- end
285
- end
286
- end
287
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root>\n <child abc=\"def\"/>\n</root>")
288
- end
289
- end
290
-
291
- def test_dtd_declaration
292
- writer = XML::Writer.string
293
- dtd writer, 'html'
294
- assert_equal(writer.result, '<!DOCTYPE html>')
295
-
296
- writer = XML::Writer.string
297
- dtd writer, 'html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
298
- assert_equal(writer.result, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">')
299
- end
300
-
301
- def test_dtd_attlist
302
- expected = '<!DOCTYPE http [<!ATTLIST method (get|post) "get">]>'
303
-
304
- writer = XML::Writer.string
305
- dtd writer, 'http' do
306
- assert(writer.start_dtd_attlist 'method')
307
- assert(writer.write_string '(get|post) "get"')
308
- assert(writer.end_dtd_attlist)
309
- end
310
- assert_equal(writer.result, expected)
311
-
312
- writer = XML::Writer.string
313
- dtd writer, 'http' do
314
- assert(writer.write_dtd_attlist 'method', '(get|post) "get"')
315
- end
316
- assert_equal(writer.result, expected)
317
- end
318
-
319
- def test_dtd_element
320
- expected = '<!DOCTYPE html [<!ELEMENT dl (dt|dd)+>]>'
321
-
322
- writer = XML::Writer.string
323
- dtd writer, 'html' do
324
- assert(writer.start_dtd_element 'dl')
325
- assert(writer.write_string '(dt|dd)+')
326
- assert(writer.end_dtd_element)
327
- end
328
- assert_equal(writer.result, expected)
329
-
330
- writer = XML::Writer.string
331
- dtd writer, 'html' do
332
- assert(writer.write_dtd_element 'dl', '(dt|dd)+')
333
- end
334
- assert_equal(writer.result, expected)
335
- end
336
-
337
- def test_dtd_entity
338
- # parameterized entity
339
- expected = '<!DOCTYPE html [<!ENTITY % special.pre "br | span | bdo | map"><!ENTITY % special "%special.pre; | object | img">]>'
340
-
341
- writer = XML::Writer.string
342
- dtd writer, 'html' do
343
- assert(writer.start_dtd_entity 'special.pre', true)
344
- assert(writer.write_string 'br | span | bdo | map')
345
- assert(writer.end_dtd_entity)
346
- assert(writer.start_dtd_entity 'special', true)
347
- assert(writer.write_string '%special.pre; | object | img')
348
- assert(writer.end_dtd_entity)
349
- end
350
- assert_equal(writer.result, expected)
351
-
352
- writer = XML::Writer.string
353
- dtd writer, 'html' do
354
- assert(writer.write_dtd_internal_entity 'special.pre', 'br | span | bdo | map', true)
355
- assert(writer.write_dtd_internal_entity 'special', '%special.pre; | object | img', true)
356
- end
357
- assert_equal(writer.result, expected)
358
-
359
- # non parameterized entity
360
- expected = '<!DOCTYPE html [<!ENTITY Alpha "&#913;">]>'
361
-
362
- writer = XML::Writer.string
363
- dtd writer, 'html' do
364
- assert(writer.start_dtd_entity 'Alpha')
365
- assert(writer.write_string '&#913;')
366
- assert(writer.end_dtd_entity)
367
- end
368
- assert_equal(writer.result, expected)
369
-
370
- writer = XML::Writer.string
371
- dtd writer, 'html' do
372
- assert(writer.start_dtd_entity 'Alpha', false)
373
- assert(writer.write_string '&#913;')
374
- assert(writer.end_dtd_entity)
375
- end
376
- assert_equal(writer.result, expected)
377
-
378
- writer = XML::Writer.string
379
- dtd writer, 'html' do
380
- assert(writer.write_dtd_internal_entity 'Alpha', '&#913;', false)
381
- end
382
- assert_equal(writer.result, expected)
383
- end
384
-
385
- def test_dtd_notation
386
- writer = XML::Writer.string
387
- dtd writer, 'pictures' do
388
- assert(writer.write_dtd_notation 'GIF89a', '-//Compuserve//NOTATION Graphics Interchange Format 89a//EN', nil)
389
- assert(writer.write_dtd_external_entity 'pictures', nil, 'images/plage.gif', 'GIF89a', false)
390
- end
391
- assert_equal(writer.result, '<!DOCTYPE pictures [<!NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics Interchange Format 89a//EN"><!ENTITY pictures SYSTEM "images/plage.gif" NDATA GIF89a>]>')
392
- end
393
-
394
- def test_encoding
395
- if defined?(Encoding)
396
- iso = 'éloïse'.encode 'ISO-8859-1'
397
-
398
- writer = XML::Writer.string
399
- document writer do
400
- assert(writer.write_element iso)
401
- end
402
- assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<éloïse/>")
403
- end
404
- end
405
-
406
- def test_flush
407
- writer = XML::Writer.string
408
- assert(writer.start_document)
409
- assert_equal(writer.flush.strip!, '<?xml version="1.0"?>')
410
- assert(writer.start_element 'foo')
411
- assert(writer.end_element)
412
- assert(writer.end_document)
413
- writer.flush false
414
- assert_equal(writer.result.strip, '<foo/>')
415
- end
416
-
417
- def test_nil_pe_issue
418
- expected = '<!DOCTYPE html [<!ENTITY special.pre "br | span | bdo | map"><!ENTITY special "%special.pre; | object | img">]>'
419
-
420
- writer = XML::Writer.string
421
- dtd writer, 'html' do
422
- assert(writer.write_dtd_internal_entity 'special.pre', 'br | span | bdo | map', nil)
423
- assert(writer.write_dtd_internal_entity 'special', '%special.pre; | object | img', nil)
424
- end
425
- assert_equal(writer.result, expected)
426
- end
427
-
428
- private
429
-
430
- def document(writer, options = {})
431
- assert(writer.start_document options)
432
- yield if block_given?
433
- assert(writer.end_document)
434
- end
435
-
436
- def dtd(writer, name, pubid = nil, sysid = nil)
437
- assert(writer.start_dtd name, pubid, sysid)
438
- yield if block_given?
439
- assert(writer.end_dtd)
440
- end
441
-
442
- def element(writer, localname)
443
- assert(writer.start_element localname)
444
- yield if block_given?
445
- assert(writer.end_element)
446
- end
447
- end
1
+ # encoding: UTF-8
2
+
3
+ require './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 = 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 = XML::Writer.string
19
+ document writer
20
+ assert_equal(writer.result.strip!, '<?xml version="1.0"?>')
21
+
22
+ writer = XML::Writer.string
23
+ document writer, { :encoding => XML::Encoding::ISO_8859_1 }
24
+ assert_equal(writer.result.strip!, '<?xml version="1.0" encoding="ISO-8859-1"?>')
25
+
26
+ writer = XML::Writer.string
27
+ document writer, { :standalone => 1 }
28
+ assert_equal(writer.result.strip!, '<?xml version="1.0" standalone="yes"?>')
29
+
30
+ writer = XML::Writer.string
31
+ document writer, { :standalone => 1, :encoding => 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_single_root
36
+ writer = XML::Writer.string
37
+ document writer do
38
+ element writer, 'root'
39
+ end
40
+
41
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root/>")
42
+ end
43
+
44
+ def test_pi
45
+ expected = "<?xml version=\"1.0\"?>\n<?php echo \"foo\";?>"
46
+
47
+ writer = XML::Writer.string
48
+ document writer do
49
+ assert(writer.start_pi('php'))
50
+ assert(writer.write_string('echo "foo";'))
51
+ assert(writer.end_pi)
52
+ end
53
+ assert_equal(writer.result.strip!, expected)
54
+
55
+ writer = XML::Writer.string
56
+ document writer do
57
+ assert(writer.write_pi('php', 'echo "foo";'))
58
+ end
59
+ assert_equal(writer.result.strip!, expected)
60
+ end
61
+
62
+ def test_comment
63
+ expected = "<?xml version=\"1.0\"?>\n<!--foo-->"
64
+
65
+ writer = XML::Writer.string
66
+ document writer do
67
+ assert(writer.start_comment)
68
+ assert(writer.write_string 'foo')
69
+ assert(writer.end_comment)
70
+ end
71
+ assert_equal(writer.result.strip!, expected)
72
+
73
+ writer = XML::Writer.string
74
+ document writer do
75
+ assert(writer.write_comment 'foo')
76
+ end
77
+ assert_equal(writer.result.strip!, expected)
78
+ end
79
+
80
+ def test_cdata
81
+ expected = "<?xml version=\"1.0\"?>\n<root><![CDATA[<?php echo $foo; ?>]]></root>"
82
+
83
+ writer = XML::Writer.string
84
+ document writer do
85
+ element writer, 'root' do
86
+ assert(writer.start_cdata)
87
+ assert(writer.write_string '<?php echo $foo; ?>')
88
+ assert(writer.end_cdata)
89
+ end
90
+ end
91
+ assert_equal(writer.result.strip!, expected)
92
+
93
+ writer = XML::Writer.string
94
+ document writer do
95
+ element writer, 'root' do
96
+ assert(writer.write_cdata '<?php echo $foo; ?>')
97
+ end
98
+ end
99
+ assert_equal(writer.result.strip!, expected)
100
+ end
101
+
102
+ def test_write_empty_elements
103
+ writer = XML::Writer.string
104
+ document writer do
105
+ assert(writer.write_element 'foo')
106
+ end
107
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<foo/>")
108
+
109
+ writer = XML::Writer.string
110
+ document writer do
111
+ assert(writer.write_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
112
+ end
113
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<" + XSL_PREFIX + ":stylesheet xmlns:xsl=\"" + XSL_URI + "\"/>")
114
+ end
115
+
116
+ def test_valued_element
117
+ expected = "<?xml version=\"1.0\"?>\n<abc>123<def>456<ghi>789</ghi>cueillir des cerises</def>nous irons au bois</abc>"
118
+
119
+ writer = XML::Writer.string
120
+ document writer do
121
+ assert(writer.start_element 'abc')
122
+ assert(writer.write_string '123')
123
+ assert(writer.start_element 'def')
124
+ assert(writer.write_string '456')
125
+ assert(writer.start_element 'ghi')
126
+ assert(writer.write_string '789')
127
+ assert(writer.end_element)
128
+ assert(writer.write_string 'cueillir des cerises')
129
+ assert(writer.end_element)
130
+ assert(writer.write_string 'nous irons au bois')
131
+ assert(writer.end_element)
132
+ end
133
+ assert_equal(writer.result.strip!, expected)
134
+
135
+ writer = XML::Writer.string
136
+ document writer do
137
+ assert(writer.start_element 'abc')
138
+ assert(writer.write_string '123')
139
+ assert(writer.start_element 'def')
140
+ assert(writer.write_string '456')
141
+ assert(writer.write_element 'ghi', '789')
142
+ assert(writer.write_string 'cueillir des cerises')
143
+ assert(writer.end_element)
144
+ assert(writer.write_string 'nous irons au bois')
145
+ assert(writer.end_element)
146
+ end
147
+ assert_equal(writer.result.strip!, expected)
148
+ end
149
+
150
+ def test_valued_element_ns
151
+ expected = "<?xml version=\"1.0\"?>\n" +
152
+ "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
153
+ "<xsl:attribute-set>" +
154
+ "<xsl:attribute>20px</xsl:attribute>" +
155
+ "<xsl:attribute>solid</xsl:attribute>" +
156
+ "</xsl:attribute-set>" +
157
+ "</xsl:stylesheet>"
158
+
159
+ writer = XML::Writer.string
160
+ document writer do
161
+ assert(writer.start_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
162
+ assert(writer.start_element_ns XSL_PREFIX, 'attribute-set')
163
+ assert(writer.start_element_ns XSL_PREFIX, 'attribute')
164
+ assert(writer.write_string '20px')
165
+ assert(writer.end_element)
166
+ assert(writer.start_element_ns XSL_PREFIX, 'attribute')
167
+ assert(writer.write_string 'solid')
168
+ assert(writer.end_element)
169
+ assert(writer.end_element)
170
+ assert(writer.end_element)
171
+ end
172
+ assert_equal(writer.result.strip!, expected)
173
+
174
+ writer = XML::Writer.string
175
+ document writer do
176
+ assert(writer.start_element_ns XSL_PREFIX, 'stylesheet', XSL_URI)
177
+ assert(writer.start_element_ns XSL_PREFIX, 'attribute-set')
178
+ assert(writer.write_element_ns XSL_PREFIX, 'attribute', nil, '20px')
179
+ assert(writer.write_element_ns XSL_PREFIX, 'attribute', nil, 'solid')
180
+ assert(writer.end_element)
181
+ assert(writer.end_element)
182
+ end
183
+ assert_equal(writer.result.strip!, expected)
184
+ end
185
+
186
+ def test_attribute
187
+ writer = XML::Writer.string
188
+ document writer do
189
+ element writer, 'root' do
190
+ element writer, 'child' do
191
+ assert(writer.start_attribute 'foo')
192
+ assert(writer.write_string 'bar')
193
+ assert(writer.end_attribute)
194
+ end
195
+ end
196
+ end
197
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root><child foo=\"bar\"/></root>")
198
+
199
+ writer = XML::Writer.string
200
+ document writer do
201
+ element writer, 'root' do
202
+ element writer, 'child' do
203
+ assert(writer.write_attribute 'abc', 'def')
204
+ assert(writer.write_string 'ghi') # must be done after attributes
205
+ end
206
+ end
207
+ end
208
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root><child abc=\"def\">ghi</child></root>")
209
+ end
210
+
211
+ def test_attribute_ns
212
+ expected = "<?xml version=\"1.0\"?>\n<root><link xlink:href=\"abc\" xhtml:class=\"def\"/></root>"
213
+
214
+ writer = XML::Writer.string
215
+ document writer do
216
+ element writer, 'root' do
217
+ element writer, 'link' do
218
+ assert(writer.write_attribute_ns 'xlink', 'href', nil, 'abc')
219
+ assert(writer.write_attribute_ns 'xhtml', 'class', nil, 'def')
220
+ end
221
+ end
222
+ end
223
+ assert_equal(writer.result.strip!, expected)
224
+
225
+ writer = XML::Writer.string
226
+ document writer do
227
+ element writer, 'root' do
228
+ element writer, 'link' do
229
+ assert(writer.start_attribute_ns 'xlink', 'href')
230
+ assert(writer.write_string 'abc')
231
+ assert(writer.end_attribute)
232
+ assert(writer.start_attribute_ns 'xhtml', 'class')
233
+ assert(writer.write_string 'def')
234
+ assert(writer.end_attribute)
235
+ end
236
+ end
237
+ end
238
+ assert_equal(writer.result.strip!, expected)
239
+ end
240
+
241
+ def test_quote_char
242
+ if XML::Writer.method_defined? :set_quote_char
243
+ writer = XML::Writer.string
244
+ writer.set_quote_char "'"
245
+ document writer do
246
+ element writer, 'root' do
247
+ assert(writer.start_attribute 'abc')
248
+ assert(writer.write_string 'def')
249
+ assert(writer.end_attribute)
250
+ end
251
+ end
252
+ assert(writer.result.strip!.end_with? "<root abc='def'/>")
253
+ end
254
+ end
255
+
256
+ def test_indentation_on
257
+ if XML::Writer.method_defined? :set_indent
258
+ writer = XML::Writer.string
259
+ assert(writer.set_indent true)
260
+ document writer do
261
+ element writer, 'root' do
262
+ element writer, 'child' do
263
+ assert(writer.start_attribute 'abc')
264
+ assert(writer.write_string 'def')
265
+ assert(writer.end_attribute)
266
+ end
267
+ end
268
+ end
269
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root>\n <child abc=\"def\"/>\n</root>")
270
+ end
271
+ end
272
+
273
+ def test_indentation_string
274
+ if XML::Writer.method_defined? :set_indent_string
275
+ writer = XML::Writer.string
276
+ assert(writer.set_indent true)
277
+ assert(writer.set_indent_string ' ' * 4)
278
+ document writer do
279
+ element writer, 'root' do
280
+ element writer, 'child' do
281
+ assert(writer.start_attribute 'abc')
282
+ assert(writer.write_string 'def')
283
+ assert(writer.end_attribute)
284
+ end
285
+ end
286
+ end
287
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<root>\n <child abc=\"def\"/>\n</root>")
288
+ end
289
+ end
290
+
291
+ def test_dtd_declaration
292
+ writer = XML::Writer.string
293
+ dtd writer, 'html'
294
+ assert_equal(writer.result, '<!DOCTYPE html>')
295
+
296
+ writer = XML::Writer.string
297
+ dtd writer, 'html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
298
+ assert_equal(writer.result, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">')
299
+ end
300
+
301
+ def test_dtd_attlist
302
+ expected = '<!DOCTYPE http [<!ATTLIST method (get|post) "get">]>'
303
+
304
+ writer = XML::Writer.string
305
+ dtd writer, 'http' do
306
+ assert(writer.start_dtd_attlist 'method')
307
+ assert(writer.write_string '(get|post) "get"')
308
+ assert(writer.end_dtd_attlist)
309
+ end
310
+ assert_equal(writer.result, expected)
311
+
312
+ writer = XML::Writer.string
313
+ dtd writer, 'http' do
314
+ assert(writer.write_dtd_attlist 'method', '(get|post) "get"')
315
+ end
316
+ assert_equal(writer.result, expected)
317
+ end
318
+
319
+ def test_dtd_element
320
+ expected = '<!DOCTYPE html [<!ELEMENT dl (dt|dd)+>]>'
321
+
322
+ writer = XML::Writer.string
323
+ dtd writer, 'html' do
324
+ assert(writer.start_dtd_element 'dl')
325
+ assert(writer.write_string '(dt|dd)+')
326
+ assert(writer.end_dtd_element)
327
+ end
328
+ assert_equal(writer.result, expected)
329
+
330
+ writer = XML::Writer.string
331
+ dtd writer, 'html' do
332
+ assert(writer.write_dtd_element 'dl', '(dt|dd)+')
333
+ end
334
+ assert_equal(writer.result, expected)
335
+ end
336
+
337
+ def test_dtd_entity
338
+ # parameterized entity
339
+ expected = '<!DOCTYPE html [<!ENTITY % special.pre "br | span | bdo | map"><!ENTITY % special "%special.pre; | object | img">]>'
340
+
341
+ writer = XML::Writer.string
342
+ dtd writer, 'html' do
343
+ assert(writer.start_dtd_entity 'special.pre', true)
344
+ assert(writer.write_string 'br | span | bdo | map')
345
+ assert(writer.end_dtd_entity)
346
+ assert(writer.start_dtd_entity 'special', true)
347
+ assert(writer.write_string '%special.pre; | object | img')
348
+ assert(writer.end_dtd_entity)
349
+ end
350
+ assert_equal(writer.result, expected)
351
+
352
+ writer = XML::Writer.string
353
+ dtd writer, 'html' do
354
+ assert(writer.write_dtd_internal_entity 'special.pre', 'br | span | bdo | map', true)
355
+ assert(writer.write_dtd_internal_entity 'special', '%special.pre; | object | img', true)
356
+ end
357
+ assert_equal(writer.result, expected)
358
+
359
+ # non parameterized entity
360
+ expected = '<!DOCTYPE html [<!ENTITY Alpha "&#913;">]>'
361
+
362
+ writer = XML::Writer.string
363
+ dtd writer, 'html' do
364
+ assert(writer.start_dtd_entity 'Alpha')
365
+ assert(writer.write_string '&#913;')
366
+ assert(writer.end_dtd_entity)
367
+ end
368
+ assert_equal(writer.result, expected)
369
+
370
+ writer = XML::Writer.string
371
+ dtd writer, 'html' do
372
+ assert(writer.start_dtd_entity 'Alpha', false)
373
+ assert(writer.write_string '&#913;')
374
+ assert(writer.end_dtd_entity)
375
+ end
376
+ assert_equal(writer.result, expected)
377
+
378
+ writer = XML::Writer.string
379
+ dtd writer, 'html' do
380
+ assert(writer.write_dtd_internal_entity 'Alpha', '&#913;', false)
381
+ end
382
+ assert_equal(writer.result, expected)
383
+ end
384
+
385
+ def test_dtd_notation
386
+ writer = XML::Writer.string
387
+ dtd writer, 'pictures' do
388
+ assert(writer.write_dtd_notation 'GIF89a', '-//Compuserve//NOTATION Graphics Interchange Format 89a//EN', nil)
389
+ assert(writer.write_dtd_external_entity 'pictures', nil, 'images/plage.gif', 'GIF89a', false)
390
+ end
391
+ assert_equal(writer.result, '<!DOCTYPE pictures [<!NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics Interchange Format 89a//EN"><!ENTITY pictures SYSTEM "images/plage.gif" NDATA GIF89a>]>')
392
+ end
393
+
394
+ def test_encoding
395
+ if defined?(Encoding)
396
+ iso = 'éloïse'.encode 'ISO-8859-1'
397
+
398
+ writer = XML::Writer.string
399
+ document writer do
400
+ assert(writer.write_element iso)
401
+ end
402
+ assert_equal(writer.result.strip!, "<?xml version=\"1.0\"?>\n<éloïse/>")
403
+ end
404
+ end
405
+
406
+ def test_flush
407
+ writer = XML::Writer.string
408
+ assert(writer.start_document)
409
+ assert_equal(writer.flush.strip!, '<?xml version="1.0"?>')
410
+ assert(writer.start_element 'foo')
411
+ assert(writer.end_element)
412
+ assert(writer.end_document)
413
+ writer.flush false
414
+ assert_equal(writer.result.strip, '<foo/>')
415
+ end
416
+
417
+ def test_nil_pe_issue
418
+ expected = '<!DOCTYPE html [<!ENTITY special.pre "br | span | bdo | map"><!ENTITY special "%special.pre; | object | img">]>'
419
+
420
+ writer = XML::Writer.string
421
+ dtd writer, 'html' do
422
+ assert(writer.write_dtd_internal_entity 'special.pre', 'br | span | bdo | map', nil)
423
+ assert(writer.write_dtd_internal_entity 'special', '%special.pre; | object | img', nil)
424
+ end
425
+ assert_equal(writer.result, expected)
426
+ end
427
+
428
+ private
429
+
430
+ def document(writer, options = {})
431
+ assert(writer.start_document options)
432
+ yield if block_given?
433
+ assert(writer.end_document)
434
+ end
435
+
436
+ def dtd(writer, name, pubid = nil, sysid = nil)
437
+ assert(writer.start_dtd name, pubid, sysid)
438
+ yield if block_given?
439
+ assert(writer.end_dtd)
440
+ end
441
+
442
+ def element(writer, localname)
443
+ assert(writer.start_element localname)
444
+ yield if block_given?
445
+ assert(writer.end_element)
446
+ end
447
+ end