libxml-ruby 5.0.4 → 5.0.6

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY +17 -6
  3. data/README.rdoc +1 -1
  4. data/Rakefile +98 -98
  5. data/ext/libxml/extconf.h +1 -0
  6. data/ext/libxml/extconf.rb +5 -0
  7. data/ext/libxml/libxml.c +79 -79
  8. data/ext/libxml/ruby_xml.c +556 -556
  9. data/ext/libxml/ruby_xml_attr.c +333 -333
  10. data/ext/libxml/ruby_xml_attr.h +12 -12
  11. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  12. data/ext/libxml/ruby_xml_attributes.h +17 -17
  13. data/ext/libxml/ruby_xml_cbg.c +85 -85
  14. data/ext/libxml/ruby_xml_document.c +1129 -1129
  15. data/ext/libxml/ruby_xml_dtd.c +257 -257
  16. data/ext/libxml/ruby_xml_dtd.h +9 -9
  17. data/ext/libxml/ruby_xml_encoding.c +250 -250
  18. data/ext/libxml/ruby_xml_error.c +1003 -1003
  19. data/ext/libxml/ruby_xml_error.h +14 -14
  20. data/ext/libxml/ruby_xml_html_parser.c +91 -91
  21. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  22. data/ext/libxml/ruby_xml_html_parser_context.c +351 -351
  23. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  24. data/ext/libxml/ruby_xml_html_parser_options.c +48 -48
  25. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  26. data/ext/libxml/ruby_xml_input_cbg.c +188 -188
  27. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  28. data/ext/libxml/ruby_xml_io.c +47 -47
  29. data/ext/libxml/ruby_xml_io.h +10 -10
  30. data/ext/libxml/ruby_xml_namespace.c +151 -151
  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.h +13 -13
  35. data/ext/libxml/ruby_xml_parser.c +91 -91
  36. data/ext/libxml/ruby_xml_parser.h +10 -10
  37. data/ext/libxml/ruby_xml_parser_context.c +1009 -1009
  38. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  39. data/ext/libxml/ruby_xml_parser_options.c +74 -74
  40. data/ext/libxml/ruby_xml_parser_options.h +10 -10
  41. data/ext/libxml/ruby_xml_reader.h +14 -14
  42. data/ext/libxml/ruby_xml_relaxng.h +8 -8
  43. data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
  44. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  45. data/ext/libxml/ruby_xml_sax_parser.c +108 -108
  46. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  47. data/ext/libxml/ruby_xml_schema.h +25 -25
  48. data/ext/libxml/ruby_xml_schema_attribute.h +37 -37
  49. data/ext/libxml/ruby_xml_schema_element.h +11 -11
  50. data/ext/libxml/ruby_xml_schema_facet.c +50 -50
  51. data/ext/libxml/ruby_xml_schema_facet.h +9 -9
  52. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  53. data/ext/libxml/ruby_xml_version.h +9 -9
  54. data/ext/libxml/ruby_xml_writer.c +1124 -1124
  55. data/ext/libxml/ruby_xml_writer.h +6 -6
  56. data/ext/libxml/ruby_xml_xinclude.c +20 -20
  57. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  58. data/ext/libxml/ruby_xml_xpath.c +195 -195
  59. data/ext/libxml/ruby_xml_xpath.h +15 -15
  60. data/ext/libxml/ruby_xml_xpath_context.c +362 -362
  61. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  62. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  63. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  64. data/lib/libxml/attr.rb +122 -122
  65. data/lib/libxml/attr_decl.rb +80 -80
  66. data/lib/libxml/attributes.rb +13 -13
  67. data/lib/libxml/document.rb +194 -194
  68. data/lib/libxml/error.rb +95 -95
  69. data/lib/libxml/hpricot.rb +77 -77
  70. data/lib/libxml/html_parser.rb +96 -96
  71. data/lib/libxml/namespace.rb +61 -61
  72. data/lib/libxml/namespaces.rb +37 -37
  73. data/lib/libxml/node.rb +323 -323
  74. data/lib/libxml/parser.rb +102 -102
  75. data/lib/libxml/sax_callbacks.rb +179 -179
  76. data/lib/libxml/sax_parser.rb +40 -40
  77. data/lib/libxml/tree.rb +28 -28
  78. data/lib/libxml-ruby.rb +2 -2
  79. data/lib/libxml.rb +4 -4
  80. data/lib/xml/libxml.rb +10 -10
  81. data/lib/xml.rb +13 -13
  82. data/libxml-ruby.gemspec +50 -49
  83. data/test/test_document.rb +140 -140
  84. data/test/test_document_write.rb +142 -142
  85. data/test/test_dtd.rb +126 -126
  86. data/test/test_encoding.rb +126 -126
  87. data/test/test_error.rb +197 -194
  88. data/test/test_helper.rb +21 -20
  89. data/test/test_namespace.rb +58 -58
  90. data/test/test_node.rb +235 -235
  91. data/test/test_node_write.rb +93 -93
  92. data/test/test_parser.rb +333 -333
  93. data/test/test_reader.rb +364 -364
  94. data/test/test_writer.rb +500 -468
  95. data/test/test_xml.rb +168 -168
  96. metadata +5 -5
  97. data/test/test.rb +0 -5
data/test/test_helper.rb CHANGED
@@ -1,20 +1,21 @@
1
- # encoding: UTF-8
2
-
3
- # To make testing/debugging easier, test within this source tree versus an installed gem
4
- require 'bundler/setup'
5
-
6
- # Add ext directory to load path to make it easier to test locally built extensions
7
- ext_path = File.expand_path(File.join(__dir__, '..', 'ext', 'libxml'))
8
- $LOAD_PATH.unshift(File.expand_path(ext_path))
9
-
10
- # Now load code
11
- require 'libxml-ruby'
12
-
13
- def windows?
14
- !(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/).nil?
15
- end
16
-
17
- STDOUT.write "\nlibxml2: #{LibXML::XML::LIBXML_VERSION}\n#{RUBY_DESCRIPTION}\n\n"
18
-
19
- require 'minitest/autorun'
20
-
1
+ # encoding: UTF-8
2
+
3
+ # To make testing/debugging easier, test within this source tree versus an installed gem
4
+ require 'bundler/setup'
5
+
6
+ # Add ext directory to load path to make it easier to test locally built extensions
7
+ ext_path = File.expand_path(File.join(__dir__, '..', 'ext', 'libxml'))
8
+ $LOAD_PATH.unshift(File.expand_path(ext_path))
9
+
10
+ # Now load code
11
+ require 'libxml-ruby'
12
+
13
+ def windows?
14
+ !(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/).nil?
15
+ end
16
+
17
+ STDOUT.write "\nlibxml2: #{LibXML::XML::LIBXML_VERSION}\n#{RUBY_DESCRIPTION}\n\n"
18
+
19
+ require 'minitest/autorun'
20
+ Minitest.load_plugins
21
+
@@ -1,58 +1,58 @@
1
- # encoding: UTF-8
2
-
3
- require_relative './test_helper'
4
-
5
-
6
- class TestNS < Minitest::Test
7
- def setup
8
- file = File.join(File.dirname(__FILE__), 'model/soap.xml')
9
- @doc = LibXML::XML::Document.file(file)
10
- end
11
-
12
- def teardown
13
- @doc = nil
14
- end
15
-
16
- def test_create_ns
17
- node = LibXML::XML::Node.new('foo')
18
- ns = LibXML::XML::Namespace.new(node, 'my_namepace', 'http://www.mynamespace.com')
19
- assert_equal(ns.prefix, 'my_namepace')
20
- assert_equal(ns.href, 'http://www.mynamespace.com')
21
- end
22
-
23
- def test_create_default_ns
24
- node = LibXML::XML::Node.new('foo')
25
- ns = LibXML::XML::Namespace.new(node, nil, 'http://www.mynamespace.com')
26
- assert_nil(ns.prefix)
27
- assert_equal(ns.href, 'http://www.mynamespace.com')
28
- end
29
-
30
- def test_create_unbound_ns
31
- error = assert_raises(TypeError) do
32
- LibXML::XML::Namespace.new(nil, 'my_namepace', 'http://www.mynamespace.com')
33
- end
34
- assert_equal('wrong argument type nil (expected Data)', error.to_s)
35
- end
36
-
37
- def test_duplicate_ns
38
- node = LibXML::XML::Node.new('foo')
39
- LibXML::XML::Namespace.new(node, 'myname', 'http://www.mynamespace.com')
40
- LibXML::XML::Namespace.new(node, 'myname', 'http://www.mynamespace.com')
41
- end
42
-
43
- def test_eql
44
- node = LibXML::XML::Node.new('Envelope')
45
-
46
- assert(node.namespaces.namespace.eql?(node.namespaces.namespace))
47
- end
48
-
49
- def test_equal
50
- node1 = LibXML::XML::Node.new('Envelope')
51
- ns1 = LibXML::XML::Namespace.new(node1, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
52
-
53
- node2 = LibXML::XML::Node.new('Envelope')
54
- ns2 = LibXML::XML::Namespace.new(node2, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
55
-
56
- assert(ns1 == ns2)
57
- end
58
- end
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+
5
+
6
+ class TestNS < Minitest::Test
7
+ def setup
8
+ file = File.join(File.dirname(__FILE__), 'model/soap.xml')
9
+ @doc = LibXML::XML::Document.file(file)
10
+ end
11
+
12
+ def teardown
13
+ @doc = nil
14
+ end
15
+
16
+ def test_create_ns
17
+ node = LibXML::XML::Node.new('foo')
18
+ ns = LibXML::XML::Namespace.new(node, 'my_namepace', 'http://www.mynamespace.com')
19
+ assert_equal(ns.prefix, 'my_namepace')
20
+ assert_equal(ns.href, 'http://www.mynamespace.com')
21
+ end
22
+
23
+ def test_create_default_ns
24
+ node = LibXML::XML::Node.new('foo')
25
+ ns = LibXML::XML::Namespace.new(node, nil, 'http://www.mynamespace.com')
26
+ assert_nil(ns.prefix)
27
+ assert_equal(ns.href, 'http://www.mynamespace.com')
28
+ end
29
+
30
+ def test_create_unbound_ns
31
+ error = assert_raises(TypeError) do
32
+ LibXML::XML::Namespace.new(nil, 'my_namepace', 'http://www.mynamespace.com')
33
+ end
34
+ assert_equal('wrong argument type nil (expected Data)', error.to_s)
35
+ end
36
+
37
+ def test_duplicate_ns
38
+ node = LibXML::XML::Node.new('foo')
39
+ LibXML::XML::Namespace.new(node, 'myname', 'http://www.mynamespace.com')
40
+ LibXML::XML::Namespace.new(node, 'myname', 'http://www.mynamespace.com')
41
+ end
42
+
43
+ def test_eql
44
+ node = LibXML::XML::Node.new('Envelope')
45
+
46
+ assert(node.namespaces.namespace.eql?(node.namespaces.namespace))
47
+ end
48
+
49
+ def test_equal
50
+ node1 = LibXML::XML::Node.new('Envelope')
51
+ ns1 = LibXML::XML::Namespace.new(node1, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
52
+
53
+ node2 = LibXML::XML::Node.new('Envelope')
54
+ ns2 = LibXML::XML::Namespace.new(node2, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
55
+
56
+ assert(ns1 == ns2)
57
+ end
58
+ end
data/test/test_node.rb CHANGED
@@ -1,235 +1,235 @@
1
- # encoding: UTF-8
2
-
3
- require_relative './test_helper'
4
-
5
- class TestNode < Minitest::Test
6
- def setup
7
- @file_name = "model/bands.utf-8.xml"
8
-
9
- # Strip spaces to make testing easier
10
- file = File.join(File.dirname(__FILE__), @file_name)
11
- @doc = LibXML::XML::Document.file(file, options: LibXML::XML::Parser::Options::NOBLANKS)
12
- end
13
-
14
- def teardown
15
- @doc = nil
16
- end
17
-
18
- def nodes
19
- # Find all nodes with a country attributes
20
- @doc.find('*[@country]')
21
- end
22
-
23
- def test_doc_class
24
- assert_instance_of(LibXML::XML::Document, @doc)
25
- end
26
-
27
- def test_doc_node_type
28
- assert_equal LibXML::XML::Node::DOCUMENT_NODE, @doc.node_type
29
- end
30
-
31
- def test_root_class
32
- assert_instance_of(LibXML::XML::Node, @doc.root)
33
- end
34
-
35
- def test_root_node_type
36
- assert_equal LibXML::XML::Node::ELEMENT_NODE, @doc.root.node_type
37
- end
38
-
39
- def test_node_class
40
- for n in nodes
41
- assert_instance_of(LibXML::XML::Node, n)
42
- end
43
- end
44
-
45
- def test_context
46
- node = @doc.root
47
- context = node.context
48
- assert_instance_of(LibXML::XML::XPath::Context, context)
49
- end
50
-
51
- def test_find
52
- assert_instance_of(LibXML::XML::XPath::Object, self.nodes)
53
- end
54
-
55
- def test_node_child_get
56
- assert_instance_of(TrueClass, @doc.root.child?)
57
- assert_instance_of(LibXML::XML::Node, @doc.root.child)
58
-
59
- assert_equal(Encoding::UTF_8, @doc.root.child.name.encoding)
60
- assert_equal("m\u00F6tley_cr\u00FCe", @doc.root.child.name)
61
- end
62
-
63
- def test_node_doc
64
- for n in nodes
65
- assert_instance_of(LibXML::XML::Document, n.doc) if n.document?
66
- end
67
- end
68
-
69
- def test_name
70
- node = @doc.root.children.last
71
- assert_equal("iron_maiden", node.name)
72
- end
73
-
74
- def test_node_find
75
- nodes = @doc.root.find('./fixnum')
76
- for node in nodes
77
- assert_instance_of(LibXML::XML::Node, node)
78
- end
79
- end
80
-
81
- def test_equality
82
- node_a = @doc.find_first('*[@country]')
83
- node_b = @doc.root.child
84
-
85
- # On the ruby side these are different objects
86
- refute(node_a.equal?(node_b))
87
-
88
- # But they are the same underlying libxml node so specify they are equal
89
- assert(node_a == node_b)
90
- assert(node_a.eql?(node_b))
91
-
92
- file = File.join(File.dirname(__FILE__), @file_name)
93
- doc2 = LibXML::XML::Document.file(file)
94
-
95
- node_a2 = doc2.find_first('*[@country]')
96
-
97
- refute(node_a == node_a2)
98
- refute(node_a.eql?(node_a2))
99
- assert_equal(node_a.to_s, node_a2.to_s)
100
- refute(node_a.equal?(node_a2))
101
- end
102
-
103
- def test_equality_2
104
- parent = LibXML::XML::Node.new('parent')
105
- child = LibXML::XML::Node.new('child')
106
- parent << child
107
-
108
- node_a = child.parent
109
- node_b = child.parent
110
- # In this case the nodes are equal - the parent being the root
111
- assert(node_a.equal?(node_b))
112
- assert(node_a == node_b)
113
- assert(node_a.eql?(node_b))
114
- end
115
-
116
- def test_equality_nil
117
- node = @doc.root
118
- assert(node != nil)
119
- end
120
-
121
- def test_equality_wrong_type
122
- node = @doc.root
123
-
124
- assert_raises(TypeError) do
125
- assert(node != 'abc')
126
- end
127
- end
128
-
129
- def test_content
130
- node = @doc.root.last
131
- assert_equal("Iron Maiden is a British heavy metal band formed in 1975.",
132
- node.content)
133
- end
134
-
135
- def test_base
136
- doc = LibXML::XML::Parser.string('<person />').parse
137
- assert_nil(doc.root.base_uri)
138
- end
139
-
140
- # We use the same facility that libXSLT does here to disable output escaping.
141
- # This lets you specify that the node's content should be rendered unaltered
142
- # whenever it is being output. This is useful for things like <script> and
143
- # <style> nodes in HTML documents if you don't want to be forced to wrap them
144
- # in CDATA nodes. Or if you are sanitizing existing HTML documents and want
145
- # to preserve the content of any of the text nodes.
146
- #
147
- def test_output_escaping
148
- text = '<bad-script>if (a &lt; b || b &gt; c) { return "text"; }<stop/>return "&gt;&gt;&gt;snip&lt;&lt;&lt;";</bad-script>'
149
- node = LibXML::XML::Parser.string(text).parse.root
150
- assert_equal text, node.to_s
151
-
152
- text_noenc = '<bad-script>if (a < b || b > c) { return "text"; }<stop/>return ">>>snip<<<";</bad-script>'
153
- node.output_escaping = false
154
- assert_equal text_noenc, node.to_s
155
-
156
- node.output_escaping = true
157
- assert_equal text, node.to_s
158
-
159
- node.output_escaping = nil
160
- assert_equal text_noenc, node.to_s
161
-
162
- node.output_escaping = true
163
- assert_equal text, node.to_s
164
- end
165
-
166
- # Just a sanity check for output escaping.
167
- def test_output_escaping_sanity
168
- text = '<bad-script>if (a &lt; b || b &gt; c) { return "text"; }<stop/>return "&gt;&gt;&gt;snip&lt;&lt;&lt;";</bad-script>'
169
- node = LibXML::XML::Parser.string(text).parse.root
170
- affected = node.find('//text()')
171
-
172
- check_escaping = lambda do |flag|
173
- assert_equal('bad-script', node.name)
174
- assert_equal(flag, node.output_escaping?)
175
- affected.each do |x|
176
- assert_equal(flag ? 'text' : 'textnoenc', x.name)
177
- assert_equal(flag, x.output_escaping?)
178
- end
179
- end
180
-
181
- node.output_escaping = false
182
- check_escaping[false]
183
-
184
- node.output_escaping = true
185
- check_escaping[true]
186
-
187
- node.output_escaping = nil
188
- check_escaping[false]
189
-
190
- node.output_escaping = true
191
- check_escaping[true]
192
-
193
- affected.first.output_escaping = true
194
- affected.last.output_escaping = false
195
- assert node.output_escaping?.nil?
196
- end
197
-
198
- def test_space_preserve
199
- node = @doc.root
200
-
201
- node.space_preserve = false
202
- assert_equal LibXML::XML::Node::SPACE_DEFAULT, node.space_preserve
203
-
204
- node.space_preserve = true
205
- assert_equal LibXML::XML::Node::SPACE_PRESERVE, node.space_preserve
206
- end
207
-
208
- def test_empty
209
- text = '<name> </name>'
210
- doc = LibXML::XML::Parser.string(text).parse
211
-
212
- node = doc.root
213
- assert(!node.empty?)
214
-
215
- text_node = node.first
216
- assert(text_node.empty?)
217
- end
218
-
219
- def test_save_no_empty_tags
220
- node = LibXML::XML::Node.new('test')
221
- assert_equal '<test/>', node.to_s
222
-
223
- LibXML::XML.default_save_no_empty_tags = true
224
- assert_equal '<test></test>', node.to_s
225
-
226
- LibXML::XML.default_save_no_empty_tags = false
227
- end
228
-
229
- def test_set_content
230
- node = LibXML::XML::Node.new('test')
231
- node.content = "unescaped & string"
232
- assert_equal("unescaped & string", node.content)
233
- assert_equal("<test>unescaped &amp; string</test>", node.to_s)
234
- end
235
- end
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+
5
+ class TestNode < Minitest::Test
6
+ def setup
7
+ @file_name = "model/bands.utf-8.xml"
8
+
9
+ # Strip spaces to make testing easier
10
+ file = File.join(File.dirname(__FILE__), @file_name)
11
+ @doc = LibXML::XML::Document.file(file, options: LibXML::XML::Parser::Options::NOBLANKS)
12
+ end
13
+
14
+ def teardown
15
+ @doc = nil
16
+ end
17
+
18
+ def nodes
19
+ # Find all nodes with a country attributes
20
+ @doc.find('*[@country]')
21
+ end
22
+
23
+ def test_doc_class
24
+ assert_instance_of(LibXML::XML::Document, @doc)
25
+ end
26
+
27
+ def test_doc_node_type
28
+ assert_equal LibXML::XML::Node::DOCUMENT_NODE, @doc.node_type
29
+ end
30
+
31
+ def test_root_class
32
+ assert_instance_of(LibXML::XML::Node, @doc.root)
33
+ end
34
+
35
+ def test_root_node_type
36
+ assert_equal LibXML::XML::Node::ELEMENT_NODE, @doc.root.node_type
37
+ end
38
+
39
+ def test_node_class
40
+ for n in nodes
41
+ assert_instance_of(LibXML::XML::Node, n)
42
+ end
43
+ end
44
+
45
+ def test_context
46
+ node = @doc.root
47
+ context = node.context
48
+ assert_instance_of(LibXML::XML::XPath::Context, context)
49
+ end
50
+
51
+ def test_find
52
+ assert_instance_of(LibXML::XML::XPath::Object, self.nodes)
53
+ end
54
+
55
+ def test_node_child_get
56
+ assert_instance_of(TrueClass, @doc.root.child?)
57
+ assert_instance_of(LibXML::XML::Node, @doc.root.child)
58
+
59
+ assert_equal(Encoding::UTF_8, @doc.root.child.name.encoding)
60
+ assert_equal("m\u00F6tley_cr\u00FCe", @doc.root.child.name)
61
+ end
62
+
63
+ def test_node_doc
64
+ for n in nodes
65
+ assert_instance_of(LibXML::XML::Document, n.doc) if n.document?
66
+ end
67
+ end
68
+
69
+ def test_name
70
+ node = @doc.root.children.last
71
+ assert_equal("iron_maiden", node.name)
72
+ end
73
+
74
+ def test_node_find
75
+ nodes = @doc.root.find('./fixnum')
76
+ for node in nodes
77
+ assert_instance_of(LibXML::XML::Node, node)
78
+ end
79
+ end
80
+
81
+ def test_equality
82
+ node_a = @doc.find_first('*[@country]')
83
+ node_b = @doc.root.child
84
+
85
+ # On the ruby side these are different objects
86
+ refute(node_a.equal?(node_b))
87
+
88
+ # But they are the same underlying libxml node so specify they are equal
89
+ assert(node_a == node_b)
90
+ assert(node_a.eql?(node_b))
91
+
92
+ file = File.join(File.dirname(__FILE__), @file_name)
93
+ doc2 = LibXML::XML::Document.file(file)
94
+
95
+ node_a2 = doc2.find_first('*[@country]')
96
+
97
+ refute(node_a == node_a2)
98
+ refute(node_a.eql?(node_a2))
99
+ assert_equal(node_a.to_s, node_a2.to_s)
100
+ refute(node_a.equal?(node_a2))
101
+ end
102
+
103
+ def test_equality_2
104
+ parent = LibXML::XML::Node.new('parent')
105
+ child = LibXML::XML::Node.new('child')
106
+ parent << child
107
+
108
+ node_a = child.parent
109
+ node_b = child.parent
110
+ # In this case the nodes are equal - the parent being the root
111
+ assert(node_a.equal?(node_b))
112
+ assert(node_a == node_b)
113
+ assert(node_a.eql?(node_b))
114
+ end
115
+
116
+ def test_equality_nil
117
+ node = @doc.root
118
+ assert(node != nil)
119
+ end
120
+
121
+ def test_equality_wrong_type
122
+ node = @doc.root
123
+
124
+ assert_raises(TypeError) do
125
+ assert(node != 'abc')
126
+ end
127
+ end
128
+
129
+ def test_content
130
+ node = @doc.root.last
131
+ assert_equal("Iron Maiden is a British heavy metal band formed in 1975.",
132
+ node.content)
133
+ end
134
+
135
+ def test_base
136
+ doc = LibXML::XML::Parser.string('<person />').parse
137
+ assert_nil(doc.root.base_uri)
138
+ end
139
+
140
+ # We use the same facility that libXSLT does here to disable output escaping.
141
+ # This lets you specify that the node's content should be rendered unaltered
142
+ # whenever it is being output. This is useful for things like <script> and
143
+ # <style> nodes in HTML documents if you don't want to be forced to wrap them
144
+ # in CDATA nodes. Or if you are sanitizing existing HTML documents and want
145
+ # to preserve the content of any of the text nodes.
146
+ #
147
+ def test_output_escaping
148
+ text = '<bad-script>if (a &lt; b || b &gt; c) { return "text"; }<stop/>return "&gt;&gt;&gt;snip&lt;&lt;&lt;";</bad-script>'
149
+ node = LibXML::XML::Parser.string(text).parse.root
150
+ assert_equal text, node.to_s
151
+
152
+ text_noenc = '<bad-script>if (a < b || b > c) { return "text"; }<stop/>return ">>>snip<<<";</bad-script>'
153
+ node.output_escaping = false
154
+ assert_equal text_noenc, node.to_s
155
+
156
+ node.output_escaping = true
157
+ assert_equal text, node.to_s
158
+
159
+ node.output_escaping = nil
160
+ assert_equal text_noenc, node.to_s
161
+
162
+ node.output_escaping = true
163
+ assert_equal text, node.to_s
164
+ end
165
+
166
+ # Just a sanity check for output escaping.
167
+ def test_output_escaping_sanity
168
+ text = '<bad-script>if (a &lt; b || b &gt; c) { return "text"; }<stop/>return "&gt;&gt;&gt;snip&lt;&lt;&lt;";</bad-script>'
169
+ node = LibXML::XML::Parser.string(text).parse.root
170
+ affected = node.find('//text()')
171
+
172
+ check_escaping = lambda do |flag|
173
+ assert_equal('bad-script', node.name)
174
+ assert_equal(flag, node.output_escaping?)
175
+ affected.each do |x|
176
+ assert_equal(flag ? 'text' : 'textnoenc', x.name)
177
+ assert_equal(flag, x.output_escaping?)
178
+ end
179
+ end
180
+
181
+ node.output_escaping = false
182
+ check_escaping[false]
183
+
184
+ node.output_escaping = true
185
+ check_escaping[true]
186
+
187
+ node.output_escaping = nil
188
+ check_escaping[false]
189
+
190
+ node.output_escaping = true
191
+ check_escaping[true]
192
+
193
+ affected.first.output_escaping = true
194
+ affected.last.output_escaping = false
195
+ assert node.output_escaping?.nil?
196
+ end
197
+
198
+ def test_space_preserve
199
+ node = @doc.root
200
+
201
+ node.space_preserve = false
202
+ assert_equal LibXML::XML::Node::SPACE_DEFAULT, node.space_preserve
203
+
204
+ node.space_preserve = true
205
+ assert_equal LibXML::XML::Node::SPACE_PRESERVE, node.space_preserve
206
+ end
207
+
208
+ def test_empty
209
+ text = '<name> </name>'
210
+ doc = LibXML::XML::Parser.string(text).parse
211
+
212
+ node = doc.root
213
+ assert(!node.empty?)
214
+
215
+ text_node = node.first
216
+ assert(text_node.empty?)
217
+ end
218
+
219
+ def test_save_no_empty_tags
220
+ node = LibXML::XML::Node.new('test')
221
+ assert_equal '<test/>', node.to_s
222
+
223
+ LibXML::XML.default_save_no_empty_tags = true
224
+ assert_equal '<test></test>', node.to_s
225
+
226
+ LibXML::XML.default_save_no_empty_tags = false
227
+ end
228
+
229
+ def test_set_content
230
+ node = LibXML::XML::Node.new('test')
231
+ node.content = "unescaped & string"
232
+ assert_equal("unescaped & string", node.content)
233
+ assert_equal("<test>unescaped &amp; string</test>", node.to_s)
234
+ end
235
+ end