libxml-ruby 5.0.4 → 5.0.5
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.
- checksums.yaml +4 -4
- data/HISTORY +10 -6
- data/README.rdoc +1 -1
- data/ext/libxml/extconf.rb +5 -0
- data/ext/libxml/ruby_xml.c +556 -556
- data/ext/libxml/ruby_xml_attributes.h +17 -17
- data/ext/libxml/ruby_xml_document.c +1129 -1129
- data/ext/libxml/ruby_xml_dtd.c +257 -257
- data/ext/libxml/ruby_xml_encoding.c +250 -250
- data/ext/libxml/ruby_xml_error.c +1003 -1003
- data/ext/libxml/ruby_xml_error.h +14 -14
- data/ext/libxml/ruby_xml_html_parser_context.c +351 -351
- data/ext/libxml/ruby_xml_input_cbg.c +188 -188
- data/ext/libxml/ruby_xml_namespace.c +151 -151
- data/ext/libxml/ruby_xml_parser.h +10 -10
- data/ext/libxml/ruby_xml_parser_context.c +1009 -1009
- data/ext/libxml/ruby_xml_parser_options.c +74 -74
- data/ext/libxml/ruby_xml_parser_options.h +10 -10
- data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
- data/ext/libxml/ruby_xml_sax_parser.c +108 -108
- data/ext/libxml/ruby_xml_version.h +9 -9
- data/lib/libxml/attr.rb +122 -122
- data/lib/libxml/attr_decl.rb +80 -80
- data/lib/libxml/attributes.rb +13 -13
- data/lib/libxml/document.rb +194 -194
- data/lib/libxml/error.rb +95 -95
- data/lib/libxml/hpricot.rb +77 -77
- data/lib/libxml/html_parser.rb +96 -96
- data/lib/libxml/namespace.rb +61 -61
- data/lib/libxml/namespaces.rb +37 -37
- data/lib/libxml/node.rb +323 -323
- data/lib/libxml/parser.rb +102 -102
- data/lib/libxml/sax_callbacks.rb +179 -179
- data/lib/libxml/sax_parser.rb +40 -40
- data/lib/libxml/tree.rb +28 -28
- data/lib/libxml.rb +4 -4
- data/lib/xml/libxml.rb +10 -10
- data/lib/xml.rb +13 -13
- data/libxml-ruby.gemspec +50 -49
- data/test/test_document.rb +140 -140
- data/test/test_document_write.rb +142 -142
- data/test/test_dtd.rb +126 -126
- data/test/test_encoding.rb +126 -126
- data/test/test_error.rb +194 -194
- data/test/test_helper.rb +20 -20
- data/test/test_namespace.rb +58 -58
- data/test/test_node.rb +235 -235
- data/test/test_node_write.rb +93 -93
- data/test/test_parser.rb +333 -333
- data/test/test_reader.rb +364 -364
- data/test/test_xml.rb +168 -168
- metadata +5 -4
data/test/test_helper.rb
CHANGED
@@ -1,20 +1,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
|
-
|
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
|
+
|
data/test/test_namespace.rb
CHANGED
@@ -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 < b || b > c) { return "text"; }<stop/>return ">>>snip<<<";</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 < b || b > c) { return "text"; }<stop/>return ">>>snip<<<";</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 & 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 < b || b > c) { return "text"; }<stop/>return ">>>snip<<<";</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 < b || b > c) { return "text"; }<stop/>return ">>>snip<<<";</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 & string</test>", node.to_s)
|
234
|
+
end
|
235
|
+
end
|