nokogiri 1.6.2.rc1-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.autotest +26 -0
- data/.editorconfig +17 -0
- data/.gemtest +0 -0
- data/.travis.yml +25 -0
- data/CHANGELOG.ja.rdoc +857 -0
- data/CHANGELOG.rdoc +880 -0
- data/C_CODING_STYLE.rdoc +33 -0
- data/Gemfile +21 -0
- data/Manifest.txt +371 -0
- data/README.ja.rdoc +112 -0
- data/README.rdoc +180 -0
- data/ROADMAP.md +89 -0
- data/Rakefile +351 -0
- data/STANDARD_RESPONSES.md +47 -0
- data/Y_U_NO_GEMSPEC.md +155 -0
- data/bin/nokogiri +78 -0
- data/build_all +130 -0
- data/dependencies.yml +4 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +453 -0
- data/ext/nokogiri/html_document.c +170 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_element_description.c +279 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +32 -0
- data/ext/nokogiri/html_entity_lookup.h +8 -0
- data/ext/nokogiri/html_sax_parser_context.c +116 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/html_sax_push_parser.c +87 -0
- data/ext/nokogiri/html_sax_push_parser.h +9 -0
- data/ext/nokogiri/nokogiri.c +148 -0
- data/ext/nokogiri/nokogiri.h +164 -0
- data/ext/nokogiri/xml_attr.c +94 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +56 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_comment.c +54 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +577 -0
- data/ext/nokogiri/xml_document.h +23 -0
- data/ext/nokogiri/xml_document_fragment.c +48 -0
- data/ext/nokogiri/xml_document_fragment.h +10 -0
- data/ext/nokogiri/xml_dtd.c +202 -0
- data/ext/nokogiri/xml_dtd.h +10 -0
- data/ext/nokogiri/xml_element_content.c +123 -0
- data/ext/nokogiri/xml_element_content.h +10 -0
- data/ext/nokogiri/xml_element_decl.c +69 -0
- data/ext/nokogiri/xml_element_decl.h +9 -0
- data/ext/nokogiri/xml_encoding_handler.c +79 -0
- data/ext/nokogiri/xml_encoding_handler.h +8 -0
- data/ext/nokogiri/xml_entity_decl.c +110 -0
- data/ext/nokogiri/xml_entity_decl.h +10 -0
- data/ext/nokogiri/xml_entity_reference.c +52 -0
- data/ext/nokogiri/xml_entity_reference.h +9 -0
- data/ext/nokogiri/xml_io.c +56 -0
- data/ext/nokogiri/xml_io.h +11 -0
- data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
- data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
- data/ext/nokogiri/xml_namespace.c +78 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +1541 -0
- data/ext/nokogiri/xml_node.h +13 -0
- data/ext/nokogiri/xml_node_set.c +467 -0
- data/ext/nokogiri/xml_node_set.h +14 -0
- data/ext/nokogiri/xml_processing_instruction.c +56 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +681 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_relax_ng.c +161 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +312 -0
- data/ext/nokogiri/xml_sax_parser.h +39 -0
- data/ext/nokogiri/xml_sax_parser_context.c +262 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +115 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +63 -0
- data/ext/nokogiri/xml_syntax_error.h +13 -0
- data/ext/nokogiri/xml_text.c +52 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath_context.c +307 -0
- data/ext/nokogiri/xml_xpath_context.h +10 -0
- data/ext/nokogiri/xslt_stylesheet.c +270 -0
- data/ext/nokogiri/xslt_stylesheet.h +14 -0
- data/lib/nokogiri.rb +137 -0
- data/lib/nokogiri/2.0/nokogiri.so +0 -0
- data/lib/nokogiri/2.1/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +27 -0
- data/lib/nokogiri/css/node.rb +52 -0
- data/lib/nokogiri/css/parser.rb +715 -0
- data/lib/nokogiri/css/parser.y +249 -0
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +152 -0
- data/lib/nokogiri/css/tokenizer.rex +55 -0
- data/lib/nokogiri/css/xpath_visitor.rb +219 -0
- data/lib/nokogiri/decorators/slop.rb +35 -0
- data/lib/nokogiri/html.rb +37 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +333 -0
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/element_description_defaults.rb +671 -0
- data/lib/nokogiri/html/entity_lookup.rb +13 -0
- data/lib/nokogiri/html/sax/parser.rb +52 -0
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/html/sax/push_parser.rb +16 -0
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +106 -0
- data/lib/nokogiri/xml.rb +73 -0
- data/lib/nokogiri/xml/attr.rb +14 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +443 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +279 -0
- data/lib/nokogiri/xml/document_fragment.rb +112 -0
- data/lib/nokogiri/xml/dtd.rb +32 -0
- data/lib/nokogiri/xml/element_content.rb +36 -0
- data/lib/nokogiri/xml/element_decl.rb +13 -0
- data/lib/nokogiri/xml/entity_decl.rb +19 -0
- data/lib/nokogiri/xml/namespace.rb +13 -0
- data/lib/nokogiri/xml/node.rb +982 -0
- data/lib/nokogiri/xml/node/save_options.rb +61 -0
- data/lib/nokogiri/xml/node_set.rb +355 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- data/lib/nokogiri/xml/parse_options.rb +98 -0
- data/lib/nokogiri/xml/pp.rb +2 -0
- data/lib/nokogiri/xml/pp/character_data.rb +18 -0
- data/lib/nokogiri/xml/pp/node.rb +56 -0
- data/lib/nokogiri/xml/processing_instruction.rb +8 -0
- data/lib/nokogiri/xml/reader.rb +112 -0
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +4 -0
- data/lib/nokogiri/xml/sax/document.rb +171 -0
- data/lib/nokogiri/xml/sax/parser.rb +123 -0
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/syntax_error.rb +47 -0
- data/lib/nokogiri/xml/text.rb +9 -0
- data/lib/nokogiri/xml/xpath.rb +10 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xslt.rb +56 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xsd/xmlparser/nokogiri.rb +102 -0
- data/suppressions/README.txt +1 -0
- data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
- data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
- data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
- data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
- data/tasks/nokogiri.org.rb +24 -0
- data/tasks/test.rb +95 -0
- data/test/css/test_nthiness.rb +222 -0
- data/test/css/test_parser.rb +358 -0
- data/test/css/test_tokenizer.rb +198 -0
- data/test/css/test_xpath_visitor.rb +96 -0
- data/test/decorators/test_slop.rb +16 -0
- data/test/files/2ch.html +108 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/atom.xml +344 -0
- data/test/files/bar/bar.xsd +4 -0
- data/test/files/bogus.xml +0 -0
- data/test/files/dont_hurt_em_why.xml +422 -0
- data/test/files/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/files/exslt.xml +8 -0
- data/test/files/exslt.xslt +35 -0
- data/test/files/foo/foo.xsd +4 -0
- data/test/files/metacharset.html +10 -0
- data/test/files/noencoding.html +47 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/saml/saml20assertion_schema.xsd +283 -0
- data/test/files/saml/saml20protocol_schema.xsd +302 -0
- data/test/files/saml/xenc_schema.xsd +146 -0
- data/test/files/saml/xmldsig_schema.xsd +318 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -0
- data/test/files/shift_jis_no_charset.html +9 -0
- data/test/files/snuggles.xml +3 -0
- data/test/files/staff.dtd +10 -0
- data/test/files/staff.xml +59 -0
- data/test/files/staff.xslt +32 -0
- data/test/files/test_document_url/bar.xml +2 -0
- data/test/files/test_document_url/document.dtd +4 -0
- data/test/files/test_document_url/document.xml +6 -0
- data/test/files/tlm.html +850 -0
- data/test/files/to_be_xincluded.xml +2 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/files/xinclude.xml +4 -0
- data/test/helper.rb +164 -0
- data/test/html/sax/test_parser.rb +141 -0
- data/test/html/sax/test_parser_context.rb +46 -0
- data/test/html/test_builder.rb +164 -0
- data/test/html/test_document.rb +619 -0
- data/test/html/test_document_encoding.rb +148 -0
- data/test/html/test_document_fragment.rb +261 -0
- data/test/html/test_element_description.rb +105 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +196 -0
- data/test/html/test_node_encoding.rb +27 -0
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
- data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
- data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +66 -0
- data/test/test_convert_xpath.rb +135 -0
- data/test/test_css_cache.rb +45 -0
- data/test/test_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +156 -0
- data/test/test_nokogiri.rb +138 -0
- data/test/test_reader.rb +558 -0
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +279 -0
- data/test/xml/node/test_save_options.rb +28 -0
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +382 -0
- data/test/xml/sax/test_parser_context.rb +115 -0
- data/test/xml/sax/test_push_parser.rb +157 -0
- data/test/xml/test_attr.rb +64 -0
- data/test/xml/test_attribute_decl.rb +86 -0
- data/test/xml/test_builder.rb +315 -0
- data/test/xml/test_c14n.rb +161 -0
- data/test/xml/test_cdata.rb +48 -0
- data/test/xml/test_comment.rb +29 -0
- data/test/xml/test_document.rb +934 -0
- data/test/xml/test_document_encoding.rb +28 -0
- data/test/xml/test_document_fragment.rb +228 -0
- data/test/xml/test_dtd.rb +187 -0
- data/test/xml/test_dtd_encoding.rb +33 -0
- data/test/xml/test_element_content.rb +56 -0
- data/test/xml/test_element_decl.rb +73 -0
- data/test/xml/test_entity_decl.rb +122 -0
- data/test/xml/test_entity_reference.rb +245 -0
- data/test/xml/test_namespace.rb +95 -0
- data/test/xml/test_node.rb +1155 -0
- data/test/xml/test_node_attributes.rb +113 -0
- data/test/xml/test_node_encoding.rb +107 -0
- data/test/xml/test_node_inheritance.rb +32 -0
- data/test/xml/test_node_reparenting.rb +374 -0
- data/test/xml/test_node_set.rb +755 -0
- data/test/xml/test_parse_options.rb +64 -0
- data/test/xml/test_processing_instruction.rb +30 -0
- data/test/xml/test_reader_encoding.rb +142 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +129 -0
- data/test/xml/test_syntax_error.rb +12 -0
- data/test/xml/test_text.rb +45 -0
- data/test/xml/test_unparented_node.rb +422 -0
- data/test/xml/test_xinclude.rb +83 -0
- data/test/xml/test_xpath.rb +376 -0
- data/test/xslt/test_custom_functions.rb +133 -0
- data/test/xslt/test_exception_handling.rb +37 -0
- data/test_all +81 -0
- metadata +601 -0
@@ -0,0 +1,422 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
module Nokogiri
|
6
|
+
module XML
|
7
|
+
class TestUnparentedNode < Nokogiri::TestCase
|
8
|
+
def setup
|
9
|
+
begin
|
10
|
+
xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
11
|
+
@node = xml.at('staff')
|
12
|
+
@node.unlink
|
13
|
+
end
|
14
|
+
GC.start # try to GC the document
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_node_still_has_document
|
18
|
+
assert @node.document
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_add_namespace
|
22
|
+
node = @node.at('address')
|
23
|
+
node.unlink
|
24
|
+
node.add_namespace('foo', 'http://tenderlovemaking.com')
|
25
|
+
assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns:foo']
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_write_to
|
29
|
+
io = StringIO.new
|
30
|
+
@node.write_to io
|
31
|
+
io.rewind
|
32
|
+
assert_equal @node.to_xml, io.read
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_attribute_with_symbol
|
36
|
+
assert_equal 'Yes', @node.css('address').first[:domestic]
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_write_to_with_block
|
40
|
+
called = false
|
41
|
+
io = StringIO.new
|
42
|
+
conf = nil
|
43
|
+
@node.write_to io do |config|
|
44
|
+
called = true
|
45
|
+
conf = config
|
46
|
+
config.format.as_html.no_empty_tags
|
47
|
+
end
|
48
|
+
io.rewind
|
49
|
+
assert called
|
50
|
+
assert_equal @node.serialize(:save_with => conf.options), io.read
|
51
|
+
end
|
52
|
+
|
53
|
+
%w{ xml html xhtml }.each do |type|
|
54
|
+
define_method(:"test_write_#{type}_to") do
|
55
|
+
io = StringIO.new
|
56
|
+
assert @node.send(:"write_#{type}_to", io)
|
57
|
+
io.rewind
|
58
|
+
assert_match @node.send(:"to_#{type}"), io.read
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_serialize_with_block
|
63
|
+
called = false
|
64
|
+
conf = nil
|
65
|
+
string = @node.serialize do |config|
|
66
|
+
called = true
|
67
|
+
conf = config
|
68
|
+
config.format.as_html.no_empty_tags
|
69
|
+
end
|
70
|
+
assert called
|
71
|
+
assert_equal @node.serialize(nil, conf.options), string
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_values
|
75
|
+
assert_equal %w{ Yes Yes }, @node.xpath('.//address')[1].values
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_keys
|
79
|
+
assert_equal %w{ domestic street }, @node.xpath('.//address')[1].keys
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_each
|
83
|
+
attributes = []
|
84
|
+
@node.xpath('.//address')[1].each do |key, value|
|
85
|
+
attributes << [key, value]
|
86
|
+
end
|
87
|
+
assert_equal [['domestic', 'Yes'], ['street', 'Yes']], attributes
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_new
|
91
|
+
assert node = Nokogiri::XML::Node.new('input', @node)
|
92
|
+
assert_equal 1, node.node_type
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_to_str
|
96
|
+
assert name = @node.xpath('.//name').first
|
97
|
+
assert_match(/Margaret/, '' + name)
|
98
|
+
assert_equal('Margaret Martin', '' + name.children.first)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_ancestors
|
102
|
+
assert(address = @node.xpath('.//address').first)
|
103
|
+
assert_equal 2, address.ancestors.length
|
104
|
+
assert_equal ['employee', 'staff'],
|
105
|
+
address.ancestors.map { |x| x ? x.name : x }
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_read_only?
|
109
|
+
assert entity_decl = @node.internal_subset.children.find { |x|
|
110
|
+
x.type == Node::ENTITY_DECL
|
111
|
+
}
|
112
|
+
assert entity_decl.read_only?
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_remove_attribute
|
116
|
+
address = @node.xpath('./employee/address').first
|
117
|
+
assert_equal 'Yes', address['domestic']
|
118
|
+
address.remove_attribute 'domestic'
|
119
|
+
assert_nil address['domestic']
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_delete
|
123
|
+
address = @node.xpath('./employee/address').first
|
124
|
+
assert_equal 'Yes', address['domestic']
|
125
|
+
address.delete 'domestic'
|
126
|
+
assert_nil address['domestic']
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_add_child_in_same_document
|
130
|
+
child = @node.css('employee').first
|
131
|
+
|
132
|
+
assert child.children.last
|
133
|
+
assert new_child = child.children.first
|
134
|
+
|
135
|
+
last = child.children.last
|
136
|
+
|
137
|
+
child.add_child(new_child)
|
138
|
+
assert_equal new_child, child.children.last
|
139
|
+
assert_equal last, child.children.last
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_add_child_from_other_document
|
143
|
+
d1 = Nokogiri::XML("<root><item>1</item><item>2</item></root>")
|
144
|
+
d2 = Nokogiri::XML("<root><item>3</item><item>4</item></root>")
|
145
|
+
|
146
|
+
d2.at('root').search('item').each do |i|
|
147
|
+
d1.at('root').add_child i
|
148
|
+
end
|
149
|
+
|
150
|
+
assert_equal 0, d2.search('item').size
|
151
|
+
assert_equal 4, d1.search('item').size
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_add_child
|
155
|
+
xml = Nokogiri::XML(<<-eoxml)
|
156
|
+
<root>
|
157
|
+
<a>Hello world</a>
|
158
|
+
</root>
|
159
|
+
eoxml
|
160
|
+
text_node = Nokogiri::XML::Text.new('hello', xml)
|
161
|
+
assert_equal Nokogiri::XML::Node::TEXT_NODE, text_node.type
|
162
|
+
xml.root.add_child text_node
|
163
|
+
assert_match 'hello', xml.to_s
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_chevron_works_as_add_child
|
167
|
+
xml = Nokogiri::XML(<<-eoxml)
|
168
|
+
<root>
|
169
|
+
<a>Hello world</a>
|
170
|
+
</root>
|
171
|
+
eoxml
|
172
|
+
text_node = Nokogiri::XML::Text.new('hello', xml)
|
173
|
+
xml.root << text_node
|
174
|
+
assert_match 'hello', xml.to_s
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_add_previous_sibling
|
178
|
+
xml = Nokogiri::XML(<<-eoxml)
|
179
|
+
<root>
|
180
|
+
<a>Hello world</a>
|
181
|
+
</root>
|
182
|
+
eoxml
|
183
|
+
b_node = Nokogiri::XML::Node.new('a', xml)
|
184
|
+
assert_equal Nokogiri::XML::Node::ELEMENT_NODE, b_node.type
|
185
|
+
b_node.content = 'first'
|
186
|
+
a_node = xml.xpath('.//a').first
|
187
|
+
a_node.add_previous_sibling(b_node)
|
188
|
+
assert_equal('first', xml.xpath('.//a').first.text)
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_add_previous_sibling_merge
|
192
|
+
xml = Nokogiri::XML(<<-eoxml)
|
193
|
+
<root>
|
194
|
+
<a>Hello world</a>
|
195
|
+
</root>
|
196
|
+
eoxml
|
197
|
+
|
198
|
+
assert a_tag = xml.css('a').first
|
199
|
+
|
200
|
+
left_space = a_tag.previous
|
201
|
+
right_space = a_tag.next
|
202
|
+
assert left_space.text?
|
203
|
+
assert right_space.text?
|
204
|
+
|
205
|
+
left_space.add_previous_sibling(right_space)
|
206
|
+
assert_equal left_space, right_space
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_add_next_sibling_merge
|
210
|
+
xml = Nokogiri::XML(<<-eoxml)
|
211
|
+
<root>
|
212
|
+
<a>Hello world</a>
|
213
|
+
</root>
|
214
|
+
eoxml
|
215
|
+
|
216
|
+
assert a_tag = xml.css('a').first
|
217
|
+
|
218
|
+
left_space = a_tag.previous
|
219
|
+
right_space = a_tag.next
|
220
|
+
assert left_space.text?
|
221
|
+
assert right_space.text?
|
222
|
+
|
223
|
+
right_space.add_next_sibling(left_space)
|
224
|
+
assert_equal left_space, right_space
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_add_next_sibling_to_root_raises_exception
|
228
|
+
xml = Nokogiri::XML(<<-eoxml)
|
229
|
+
<root />
|
230
|
+
eoxml
|
231
|
+
|
232
|
+
node = Nokogiri::XML::Node.new 'child', xml
|
233
|
+
|
234
|
+
assert_raise(ArgumentError) do
|
235
|
+
xml.root.add_next_sibling(node)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_add_previous_sibling_to_root_raises_exception
|
240
|
+
xml = Nokogiri::XML(<<-eoxml)
|
241
|
+
<root />
|
242
|
+
eoxml
|
243
|
+
|
244
|
+
node = Nokogiri::XML::Node.new 'child', xml
|
245
|
+
|
246
|
+
assert_raise(ArgumentError) do
|
247
|
+
xml.root.add_previous_sibling(node)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_add_pi_as_previous_sibling_to_root_is_ok
|
252
|
+
doc = Nokogiri::XML "<root>foo</root>"
|
253
|
+
pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
|
254
|
+
doc.root.add_previous_sibling pi
|
255
|
+
expected_doc = %Q{<?xml version="1.0"?>\n<?xml-stylesheet type="text/xsl" href="foo.xsl"?>\n<root>foo</root>}
|
256
|
+
assert_includes doc.to_xml, expected_doc
|
257
|
+
end
|
258
|
+
|
259
|
+
def test_find_by_css_with_tilde_eql
|
260
|
+
xml = Nokogiri::XML.parse(<<-eoxml)
|
261
|
+
<root>
|
262
|
+
<a>Hello world</a>
|
263
|
+
<a class='foo bar'>Bar</a>
|
264
|
+
<a class='bar foo'>Bar</a>
|
265
|
+
<a class='bar'>Bar</a>
|
266
|
+
<a class='baz bar foo'>Bar</a>
|
267
|
+
<a class='bazbarfoo'>Awesome</a>
|
268
|
+
<a class='bazbar'>Awesome</a>
|
269
|
+
</root>
|
270
|
+
eoxml
|
271
|
+
set = xml.css('a[@class~="bar"]')
|
272
|
+
assert_equal 4, set.length
|
273
|
+
assert_equal ['Bar'], set.map { |node| node.content }.uniq
|
274
|
+
end
|
275
|
+
|
276
|
+
def test_unlink
|
277
|
+
xml = Nokogiri::XML.parse(<<-eoxml)
|
278
|
+
<root>
|
279
|
+
<a class='foo bar'>Bar</a>
|
280
|
+
<a class='bar foo'>Bar</a>
|
281
|
+
<a class='bar'>Bar</a>
|
282
|
+
<a>Hello world</a>
|
283
|
+
<a class='baz bar foo'>Bar</a>
|
284
|
+
<a class='bazbarfoo'>Awesome</a>
|
285
|
+
<a class='bazbar'>Awesome</a>
|
286
|
+
</root>
|
287
|
+
eoxml
|
288
|
+
node = xml.xpath('.//a')[3]
|
289
|
+
assert_equal('Hello world', node.text)
|
290
|
+
assert_match(/Hello world/, xml.to_s)
|
291
|
+
assert node.parent
|
292
|
+
assert node.document
|
293
|
+
assert node.previous_sibling
|
294
|
+
assert node.next_sibling
|
295
|
+
node.unlink
|
296
|
+
assert !node.parent
|
297
|
+
# assert !node.document
|
298
|
+
assert !node.previous_sibling
|
299
|
+
assert !node.next_sibling
|
300
|
+
assert_no_match(/Hello world/, xml.to_s)
|
301
|
+
end
|
302
|
+
|
303
|
+
def test_next_sibling
|
304
|
+
assert sibling = @node.child.next_sibling
|
305
|
+
assert_equal('employee', sibling.name)
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_previous_sibling
|
309
|
+
assert sibling = @node.child.next_sibling
|
310
|
+
assert_equal('employee', sibling.name)
|
311
|
+
assert_equal(sibling.previous_sibling, @node.child)
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_name=
|
315
|
+
@node.name = 'awesome'
|
316
|
+
assert_equal('awesome', @node.name)
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_child
|
320
|
+
assert child = @node.child
|
321
|
+
assert_equal('text', child.name)
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_key?
|
325
|
+
assert node = @node.search('.//address').first
|
326
|
+
assert(!node.key?('asdfasdf'))
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_set_property
|
330
|
+
assert node = @node.search('.//address').first
|
331
|
+
node['foo'] = 'bar'
|
332
|
+
assert_equal('bar', node['foo'])
|
333
|
+
end
|
334
|
+
|
335
|
+
def test_attributes
|
336
|
+
assert node = @node.search('.//address').first
|
337
|
+
assert_nil(node['asdfasdfasdf'])
|
338
|
+
assert_equal('Yes', node['domestic'])
|
339
|
+
|
340
|
+
assert node = @node.search('.//address')[2]
|
341
|
+
attr = node.attributes
|
342
|
+
assert_equal 2, attr.size
|
343
|
+
assert_equal 'Yes', attr['domestic'].value
|
344
|
+
assert_equal 'Yes', attr['domestic'].to_s
|
345
|
+
assert_equal 'No', attr['street'].value
|
346
|
+
end
|
347
|
+
|
348
|
+
def test_path
|
349
|
+
assert set = @node.search('.//employee')
|
350
|
+
assert node = set.first
|
351
|
+
assert_equal('/staff/employee[1]', node.path)
|
352
|
+
end
|
353
|
+
|
354
|
+
def test_search_by_symbol
|
355
|
+
assert set = @node.search(:employee)
|
356
|
+
assert 5, set.length
|
357
|
+
|
358
|
+
assert node = @node.at(:employee)
|
359
|
+
assert node.text =~ /EMP0001/
|
360
|
+
end
|
361
|
+
|
362
|
+
def test_new_node
|
363
|
+
node = Nokogiri::XML::Node.new('form', @node.document)
|
364
|
+
assert_equal('form', node.name)
|
365
|
+
assert(node.document)
|
366
|
+
end
|
367
|
+
|
368
|
+
def test_encode_special_chars
|
369
|
+
foo = @node.css('employee').first.encode_special_chars('&')
|
370
|
+
assert_equal '&', foo
|
371
|
+
end
|
372
|
+
|
373
|
+
def test_content
|
374
|
+
node = Nokogiri::XML::Node.new('form', @node)
|
375
|
+
assert_equal('', node.content)
|
376
|
+
|
377
|
+
node.content = 'hello world!'
|
378
|
+
assert_equal('hello world!', node.content)
|
379
|
+
end
|
380
|
+
|
381
|
+
def test_whitespace_nodes
|
382
|
+
doc = Nokogiri::XML.parse("<root><b>Foo</b>\n<i>Bar</i> <p>Bazz</p></root>")
|
383
|
+
children = doc.at('.//root').children.collect{|j| j.to_s}
|
384
|
+
assert_equal "\n", children[1]
|
385
|
+
assert_equal " ", children[3]
|
386
|
+
end
|
387
|
+
|
388
|
+
def test_replace
|
389
|
+
set = @node.search('.//employee')
|
390
|
+
assert 5, set.length
|
391
|
+
assert 0, @node.search('.//form').length
|
392
|
+
|
393
|
+
first = set[0]
|
394
|
+
second = set[1]
|
395
|
+
|
396
|
+
node = Nokogiri::XML::Node.new('form', @node)
|
397
|
+
first.replace(node)
|
398
|
+
|
399
|
+
assert set = @node.search('.//employee')
|
400
|
+
assert_equal 4, set.length
|
401
|
+
assert 1, @node.search('.//form').length
|
402
|
+
|
403
|
+
assert_equal set[0].to_xml, second.to_xml
|
404
|
+
end
|
405
|
+
|
406
|
+
def test_replace_on_unparented_node
|
407
|
+
foo = Node.new('foo', @node.document)
|
408
|
+
if Nokogiri.jruby? # JRuby Nokogiri doesn't raise an exception
|
409
|
+
@node.replace(foo)
|
410
|
+
else
|
411
|
+
assert_raises(RuntimeError){ @node.replace(foo) }
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_illegal_replace_of_node_with_doc
|
416
|
+
new_node = Nokogiri::XML.parse('<foo>bar</foo>')
|
417
|
+
old_node = @node.at('.//employee')
|
418
|
+
assert_raises(ArgumentError){ old_node.replace new_node }
|
419
|
+
end
|
420
|
+
end
|
421
|
+
end
|
422
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestXInclude < Nokogiri::TestCase
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@xml = Nokogiri::XML.parse(File.read(XML_XINCLUDE_FILE), XML_XINCLUDE_FILE)
|
9
|
+
@included = "this snippet is to be included from xinclude.xml"
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_xinclude_on_document_parse
|
13
|
+
skip("Pure Java version XInlcude has a conflict with NekoDTD setting. This will be fixed later.") if Nokogiri.jruby?
|
14
|
+
# first test that xinclude works when requested
|
15
|
+
xml_doc = nil
|
16
|
+
|
17
|
+
File.open(XML_XINCLUDE_FILE) do |fp|
|
18
|
+
xml_doc = Nokogiri::XML(fp) do |conf|
|
19
|
+
conf.strict.dtdload.noent.nocdata.xinclude
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
assert_not_nil xml_doc
|
24
|
+
assert_not_nil included = xml_doc.at_xpath('//included')
|
25
|
+
assert_equal @included, included.content
|
26
|
+
|
27
|
+
# no xinclude should happen when not requested
|
28
|
+
xml_doc = nil
|
29
|
+
|
30
|
+
File.open(XML_XINCLUDE_FILE) do |fp|
|
31
|
+
xml_doc = Nokogiri::XML(fp) do |conf|
|
32
|
+
conf.strict.dtdload.noent.nocdata
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
assert_not_nil xml_doc
|
37
|
+
assert_nil xml_doc.at_xpath('//included')
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_xinclude_on_document_node
|
41
|
+
skip("Pure Java version turns XInlcude on against a parser.") if Nokogiri.jruby?
|
42
|
+
assert_nil @xml.at_xpath('//included')
|
43
|
+
@xml.do_xinclude
|
44
|
+
assert_not_nil included = @xml.at_xpath('//included')
|
45
|
+
assert_equal @included, included.content
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_xinclude_on_element_subtree
|
49
|
+
skip("Pure Java version turns XInlcude on against a parser.") if Nokogiri.jruby?
|
50
|
+
assert_nil @xml.at_xpath('//included')
|
51
|
+
@xml.root.do_xinclude
|
52
|
+
assert_not_nil included = @xml.at_xpath('//included')
|
53
|
+
assert_equal @included, included.content
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_do_xinclude_accepts_block
|
57
|
+
non_default_options = Nokogiri::XML::ParseOptions::NOBLANKS | \
|
58
|
+
Nokogiri::XML::ParseOptions::XINCLUDE
|
59
|
+
|
60
|
+
@xml.do_xinclude(non_default_options) do |options|
|
61
|
+
assert_equal non_default_options, options.to_i
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_include_nonexistent_throws_exception
|
66
|
+
skip("Pure Java version behaves differently") if Nokogiri.jruby?
|
67
|
+
# break inclusion deliberately
|
68
|
+
@xml.at_xpath('//xi:include')['href'] = "nonexistent.xml"
|
69
|
+
|
70
|
+
exception_raised = false
|
71
|
+
begin
|
72
|
+
@xml.do_xinclude { |opts| opts.nowarning }
|
73
|
+
rescue Exception => e
|
74
|
+
assert_equal Nokogiri::XML::SyntaxError, e.class
|
75
|
+
exception_raised = true
|
76
|
+
end
|
77
|
+
|
78
|
+
assert exception_raised
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|