nokogiri 1.2.3 → 1.3.0
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.
- data/.autotest +14 -2
- data/CHANGELOG.ja.rdoc +38 -0
- data/CHANGELOG.rdoc +43 -0
- data/Manifest.txt +80 -5
- data/README.ja.rdoc +12 -11
- data/README.rdoc +4 -2
- data/Rakefile +103 -173
- data/bin/nokogiri +47 -0
- data/ext/nokogiri/extconf.rb +19 -13
- data/ext/nokogiri/html_document.c +39 -3
- data/ext/nokogiri/html_document.h +1 -1
- data/ext/nokogiri/html_element_description.c +272 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser.h +1 -1
- data/ext/nokogiri/{native.c → nokogiri.c} +11 -3
- data/ext/nokogiri/{native.h → nokogiri.h} +18 -4
- data/ext/nokogiri/xml_attr.c +14 -5
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_cdata.c +15 -6
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +13 -4
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +50 -41
- data/ext/nokogiri/xml_document.h +1 -1
- data/ext/nokogiri/xml_document_fragment.c +12 -4
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +1 -1
- data/ext/nokogiri/xml_dtd.h +1 -1
- data/ext/nokogiri/xml_entity_reference.c +13 -4
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.h +1 -1
- data/ext/nokogiri/xml_namespace.c +69 -0
- data/ext/nokogiri/xml_namespace.h +12 -0
- data/ext/nokogiri/xml_node.c +232 -124
- data/ext/nokogiri/xml_node.h +3 -4
- data/ext/nokogiri/xml_node_set.c +206 -19
- data/ext/nokogiri/xml_node_set.h +1 -1
- data/ext/nokogiri/xml_processing_instruction.c +14 -4
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +87 -7
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +106 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +122 -2
- data/ext/nokogiri/xml_sax_parser.h +1 -1
- data/ext/nokogiri/xml_sax_push_parser.c +1 -0
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +107 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.h +1 -1
- data/ext/nokogiri/xml_text.c +10 -3
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath.h +1 -1
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +29 -16
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/action-nokogiri.rb +7 -1
- data/lib/nokogiri.rb +21 -5
- data/lib/nokogiri/css/generated_parser.rb +49 -14
- data/lib/nokogiri/css/generated_tokenizer.rb +2 -2
- data/lib/nokogiri/css/node.rb +13 -3
- data/lib/nokogiri/css/parser.rb +8 -0
- data/lib/nokogiri/css/parser.y +7 -7
- data/lib/nokogiri/css/tokenizer.rb +2 -0
- data/lib/nokogiri/css/xpath_visitor.rb +10 -6
- data/lib/nokogiri/decorators/hpricot/node.rb +1 -1
- data/lib/nokogiri/decorators/hpricot/node_set.rb +2 -2
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +2 -0
- data/lib/nokogiri/decorators/slop.rb +3 -1
- data/lib/nokogiri/ffi/html/document.rb +37 -0
- data/lib/nokogiri/ffi/html/element_description.rb +85 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
- data/lib/nokogiri/ffi/libxml.rb +314 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
- data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
- data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
- data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
- data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
- data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
- data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
- data/lib/nokogiri/ffi/xml/comment.rb +18 -0
- data/lib/nokogiri/ffi/xml/document.rb +107 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
- data/lib/nokogiri/ffi/xml/node.rb +380 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +217 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
- data/lib/nokogiri/ffi/xml/schema.rb +55 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
- data/lib/nokogiri/hpricot.rb +14 -3
- data/lib/nokogiri/html.rb +11 -46
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +62 -6
- data/lib/nokogiri/html/document_fragment.rb +15 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +27 -1
- data/lib/nokogiri/version.rb +26 -1
- data/lib/nokogiri/version_warning.rb +11 -0
- data/lib/nokogiri/xml.rb +25 -51
- data/lib/nokogiri/xml/builder.rb +166 -10
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/document.rb +39 -6
- data/lib/nokogiri/xml/document_fragment.rb +41 -1
- data/lib/nokogiri/xml/dtd.rb +3 -1
- data/lib/nokogiri/xml/entity_declaration.rb +3 -1
- data/lib/nokogiri/xml/fragment_handler.rb +24 -3
- data/lib/nokogiri/xml/namespace.rb +7 -0
- data/lib/nokogiri/xml/node.rb +314 -65
- data/lib/nokogiri/xml/node/save_options.rb +12 -2
- data/lib/nokogiri/xml/node_set.rb +58 -8
- data/lib/nokogiri/xml/parse_options.rb +80 -0
- data/lib/nokogiri/xml/processing_instruction.rb +2 -0
- data/lib/nokogiri/xml/reader.rb +42 -3
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +0 -7
- data/lib/nokogiri/xml/sax/document.rb +84 -0
- data/lib/nokogiri/xml/sax/parser.rb +38 -2
- data/lib/nokogiri/xml/sax/push_parser.rb +12 -0
- data/lib/nokogiri/xml/schema.rb +65 -0
- data/lib/nokogiri/xml/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +21 -1
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +12 -2
- data/tasks/test.rb +42 -19
- data/test/css/test_parser.rb +29 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/helper.rb +38 -8
- data/test/html/sax/test_parser.rb +12 -0
- data/test/html/test_builder.rb +25 -2
- data/test/html/test_document.rb +91 -20
- data/test/html/test_document_fragment.rb +97 -0
- data/test/html/test_element_description.rb +95 -0
- data/test/html/test_node.rb +66 -3
- data/test/test_convert_xpath.rb +1 -1
- data/test/test_memory_leak.rb +57 -18
- data/test/test_nokogiri.rb +24 -2
- data/test/test_reader.rb +77 -0
- data/test/test_xslt_transforms.rb +120 -82
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +9 -0
- data/test/xml/sax/test_push_parser.rb +24 -0
- data/test/xml/test_attr.rb +7 -0
- data/test/xml/test_builder.rb +48 -0
- data/test/xml/test_cdata.rb +19 -0
- data/test/xml/test_comment.rb +6 -0
- data/test/xml/test_document.rb +101 -2
- data/test/xml/test_document_fragment.rb +55 -3
- data/test/xml/test_entity_reference.rb +4 -0
- data/test/xml/test_namespace.rb +43 -0
- data/test/xml/test_node.rb +255 -8
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +9 -2
- data/test/xml/test_node_set.rb +197 -1
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +5 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +65 -0
- data/test/xml/test_text.rb +5 -0
- data/test/xml/test_unparented_node.rb +3 -3
- metadata +128 -12
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/text.rb +0 -6
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestNodeAttributes < Nokogiri::TestCase
|
6
|
+
def test_attribute_with_ns
|
7
|
+
doc = Nokogiri::XML <<-eoxml
|
8
|
+
<root xmlns:tlm='http://tenderlovemaking.com/'>
|
9
|
+
<node tlm:foo='bar' foo='baz' />
|
10
|
+
</root>
|
11
|
+
eoxml
|
12
|
+
|
13
|
+
node = doc.at('node')
|
14
|
+
|
15
|
+
assert_equal 'bar',
|
16
|
+
node.attribute_with_ns('foo', 'http://tenderlovemaking.com/').value
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_namespace_key?
|
20
|
+
doc = Nokogiri::XML <<-eoxml
|
21
|
+
<root xmlns:tlm='http://tenderlovemaking.com/'>
|
22
|
+
<node tlm:foo='bar' foo='baz' />
|
23
|
+
</root>
|
24
|
+
eoxml
|
25
|
+
|
26
|
+
node = doc.at('node')
|
27
|
+
|
28
|
+
assert node.namespaced_key?('foo', 'http://tenderlovemaking.com/')
|
29
|
+
assert node.namespaced_key?('foo', nil)
|
30
|
+
assert !node.namespaced_key?('foo', 'foo')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -49,7 +49,8 @@ module Nokogiri
|
|
49
49
|
assert_equal 'UTF-8', doc.encoding
|
50
50
|
n = doc.xpath('//part:tire', { 'part' => 'http://schwinn.com/' }).first
|
51
51
|
assert n
|
52
|
-
assert_equal doc.encoding, n.namespace.encoding.name
|
52
|
+
assert_equal doc.encoding, n.namespace.href.encoding.name
|
53
|
+
assert_equal doc.encoding, n.namespace.prefix.encoding.name
|
53
54
|
end
|
54
55
|
|
55
56
|
def test_namespace_as_hash
|
@@ -66,9 +67,15 @@ module Nokogiri
|
|
66
67
|
doc = Nokogiri::XML(xml, nil, 'UTF-8')
|
67
68
|
assert_equal 'UTF-8', doc.encoding
|
68
69
|
assert n = doc.xpath('//car').first
|
70
|
+
|
71
|
+
n.namespace_definitions.each do |nd|
|
72
|
+
assert_equal doc.encoding, nd.href.encoding.name
|
73
|
+
assert_equal doc.encoding, nd.prefix.encoding.name
|
74
|
+
end
|
75
|
+
|
69
76
|
n.namespaces.each do |k,v|
|
70
|
-
assert_equal doc.encoding, v.encoding.name
|
71
77
|
assert_equal doc.encoding, k.encoding.name
|
78
|
+
assert_equal doc.encoding, v.encoding.name
|
72
79
|
end
|
73
80
|
end
|
74
81
|
end
|
data/test/xml/test_node_set.rb
CHANGED
@@ -5,7 +5,63 @@ module Nokogiri
|
|
5
5
|
class TestNodeSet < Nokogiri::TestCase
|
6
6
|
def setup
|
7
7
|
super
|
8
|
-
@xml = Nokogiri::XML
|
8
|
+
@xml = Nokogiri::XML(File.read(XML_FILE), XML_FILE)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_double_equal
|
12
|
+
assert node_set_one = @xml.xpath('//employee')
|
13
|
+
assert node_set_two = @xml.xpath('//employee')
|
14
|
+
|
15
|
+
assert_not_equal node_set_one.object_id, node_set_two.object_id
|
16
|
+
|
17
|
+
assert_equal node_set_one, node_set_two
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_node_set_not_equal_to_string
|
21
|
+
node_set_one = @xml.xpath('//employee')
|
22
|
+
assert_not_equal node_set_one, "asdfadsf"
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_out_of_order_not_equal
|
26
|
+
one = @xml.xpath('//employee')
|
27
|
+
two = @xml.xpath('//employee')
|
28
|
+
two.push two.shift
|
29
|
+
assert_not_equal one, two
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_shorter_is_not_equal
|
33
|
+
node_set_one = @xml.xpath('//employee')
|
34
|
+
node_set_two = @xml.xpath('//employee')
|
35
|
+
node_set_two.delete(node_set_two.first)
|
36
|
+
|
37
|
+
assert_not_equal node_set_one, node_set_two
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_pop
|
41
|
+
set = @xml.xpath('//employee')
|
42
|
+
last = set.last
|
43
|
+
assert_equal last, set.pop
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_shift
|
47
|
+
set = @xml.xpath('//employee')
|
48
|
+
first = set.first
|
49
|
+
assert_equal first, set.shift
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_shift_empty
|
53
|
+
set = Nokogiri::XML::NodeSet.new(@xml)
|
54
|
+
assert_nil set.shift
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_pop_empty
|
58
|
+
set = Nokogiri::XML::NodeSet.new(@xml)
|
59
|
+
assert_nil set.pop
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_first_takes_arguments
|
63
|
+
assert node_set = @xml.xpath('//employee')
|
64
|
+
assert_equal 2, node_set.first(2).length
|
9
65
|
end
|
10
66
|
|
11
67
|
def test_dup
|
@@ -36,6 +92,12 @@ module Nokogiri
|
|
36
92
|
assert set.at('bar')
|
37
93
|
end
|
38
94
|
|
95
|
+
def test_children_has_document
|
96
|
+
set = @xml.root.children
|
97
|
+
assert_instance_of(NodeSet, set)
|
98
|
+
assert_equal @xml, set.document
|
99
|
+
end
|
100
|
+
|
39
101
|
def test_length_size
|
40
102
|
assert node_set = @xml.search('//employee')
|
41
103
|
assert_equal node_set.length, node_set.size
|
@@ -67,6 +129,11 @@ module Nokogiri
|
|
67
129
|
assert node_set = @xml.search('//employee')
|
68
130
|
assert_equal node_set.first, node_set.at(0)
|
69
131
|
end
|
132
|
+
|
133
|
+
def test_percent
|
134
|
+
assert node_set = @xml.search('//employee')
|
135
|
+
assert_equal node_set.first, node_set % 0
|
136
|
+
end
|
70
137
|
|
71
138
|
def test_to_ary
|
72
139
|
assert node_set = @xml.search('//employee')
|
@@ -85,6 +152,36 @@ module Nokogiri
|
|
85
152
|
assert node_set.include?(node)
|
86
153
|
end
|
87
154
|
|
155
|
+
def test_delete_with_invalid_argument
|
156
|
+
employees = @xml.search("//employee")
|
157
|
+
positions = @xml.search("//position")
|
158
|
+
|
159
|
+
assert_raises(ArgumentError) { employees.delete(positions) }
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_delete_when_present
|
163
|
+
employees = @xml.search("//employee")
|
164
|
+
wally = employees.first
|
165
|
+
assert employees.include?(wally) # testing setup
|
166
|
+
length = employees.length
|
167
|
+
|
168
|
+
result = employees.delete(wally)
|
169
|
+
assert_equal result, wally
|
170
|
+
assert ! employees.include?(wally)
|
171
|
+
assert length-1, employees.length
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_delete_when_not_present
|
175
|
+
employees = @xml.search("//employee")
|
176
|
+
phb = @xml.search("//position").first
|
177
|
+
assert ! employees.include?(phb) # testing setup
|
178
|
+
length = employees.length
|
179
|
+
|
180
|
+
result = employees.delete(phb)
|
181
|
+
assert_nil result
|
182
|
+
assert length, employees.length
|
183
|
+
end
|
184
|
+
|
88
185
|
def test_unlink
|
89
186
|
xml = Nokogiri::XML.parse(<<-eoxml)
|
90
187
|
<root>
|
@@ -167,6 +264,105 @@ module Nokogiri
|
|
167
264
|
assert_equal 'wrapper', employees[0].parent.name
|
168
265
|
assert_equal 'employee', @xml.search("//wrapper").first.children[0].name
|
169
266
|
end
|
267
|
+
|
268
|
+
def test_plus_operator
|
269
|
+
names = @xml.search("name")
|
270
|
+
positions = @xml.search("position")
|
271
|
+
|
272
|
+
names_len = names.length
|
273
|
+
positions_len = positions.length
|
274
|
+
|
275
|
+
assert_raises(ArgumentError) { result = names + positions.first }
|
276
|
+
|
277
|
+
result = names + positions
|
278
|
+
assert_equal names_len, names.length
|
279
|
+
assert_equal positions_len, positions.length
|
280
|
+
assert_equal names.length + positions.length, result.length
|
281
|
+
|
282
|
+
names += positions
|
283
|
+
assert_equal result.length, names.length
|
284
|
+
end
|
285
|
+
|
286
|
+
def test_minus_operator
|
287
|
+
employees = @xml.search("//employee")
|
288
|
+
females = @xml.search("//employee[gender[text()='Female']]")
|
289
|
+
|
290
|
+
employees_len = employees.length
|
291
|
+
females_len = females.length
|
292
|
+
|
293
|
+
assert_raises(ArgumentError) { result = employees - females.first }
|
294
|
+
|
295
|
+
result = employees - females
|
296
|
+
assert_equal employees_len, employees.length
|
297
|
+
assert_equal females_len, females.length
|
298
|
+
assert_equal employees.length - females.length, result.length
|
299
|
+
|
300
|
+
employees -= females
|
301
|
+
assert_equal result.length, employees.length
|
302
|
+
end
|
303
|
+
|
304
|
+
def test_array_index
|
305
|
+
employees = @xml.search("//employee")
|
306
|
+
other = @xml.search("//position").first
|
307
|
+
|
308
|
+
assert_equal 3, employees.index(employees[3])
|
309
|
+
assert_nil employees.index(other)
|
310
|
+
end
|
311
|
+
|
312
|
+
def test_array_slice_with_start_and_end
|
313
|
+
employees = @xml.search("//employee")
|
314
|
+
assert_equal [employees[1], employees[2], employees[3]], employees[1,3].to_a
|
315
|
+
end
|
316
|
+
|
317
|
+
def test_array_index_bracket_equivalence
|
318
|
+
employees = @xml.search("//employee")
|
319
|
+
assert_equal [employees[1], employees[2], employees[3]], employees[1,3].to_a
|
320
|
+
assert_equal [employees[1], employees[2], employees[3]], employees.slice(1,3).to_a
|
321
|
+
end
|
322
|
+
|
323
|
+
def test_array_slice_with_negative_start
|
324
|
+
employees = @xml.search("//employee")
|
325
|
+
assert_equal [employees[2]], employees[-3,1].to_a
|
326
|
+
assert_equal [employees[2], employees[3]], employees[-3,2].to_a
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_array_slice_with_invalid_args
|
330
|
+
employees = @xml.search("//employee")
|
331
|
+
assert_nil employees[99, 1] # large start
|
332
|
+
assert_nil employees[1, -1] # negative len
|
333
|
+
assert_equal [], employees[1, 0].to_a # zero len
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_array_slice_with_range
|
337
|
+
employees = @xml.search("//employee")
|
338
|
+
assert_equal [employees[1], employees[2], employees[3]], employees[1..3].to_a
|
339
|
+
assert_equal [employees[0], employees[1], employees[2], employees[3]], employees[0..3].to_a
|
340
|
+
end
|
341
|
+
|
342
|
+
def test_intersection_with_no_overlap
|
343
|
+
employees = @xml.search("//employee")
|
344
|
+
positions = @xml.search("//position")
|
345
|
+
|
346
|
+
assert_equal [], (employees & positions).to_a
|
347
|
+
end
|
348
|
+
|
349
|
+
def test_intersection
|
350
|
+
employees = @xml.search("//employee")
|
351
|
+
first_set = employees[0..2]
|
352
|
+
second_set = employees[2..4]
|
353
|
+
|
354
|
+
assert_equal [employees[2]], (first_set & second_set).to_a
|
355
|
+
end
|
356
|
+
|
357
|
+
def test_include?
|
358
|
+
employees = @xml.search("//employee")
|
359
|
+
yes = employees.first
|
360
|
+
no = @xml.search("//position").first
|
361
|
+
|
362
|
+
assert employees.include?(yes)
|
363
|
+
assert ! employees.include?(no)
|
364
|
+
end
|
365
|
+
|
170
366
|
end
|
171
367
|
end
|
172
368
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestParseOptions < Nokogiri::TestCase
|
6
|
+
def test_new
|
7
|
+
options = Nokogiri::XML::ParseOptions.new
|
8
|
+
assert_equal 0, options.options
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_to_i
|
12
|
+
options = Nokogiri::XML::ParseOptions.new
|
13
|
+
assert_equal 0, options.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
ParseOptions.constants.each do |constant|
|
17
|
+
next if constant == 'STRICT'
|
18
|
+
class_eval %{
|
19
|
+
def test_predicate_#{constant.downcase}
|
20
|
+
options = ParseOptions.new(ParseOptions::#{constant})
|
21
|
+
assert options.#{constant.downcase}?
|
22
|
+
|
23
|
+
assert ParseOptions.new.#{constant.downcase}.#{constant.downcase}?
|
24
|
+
end
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_strict_noent
|
29
|
+
options = ParseOptions.new.recover.noent
|
30
|
+
assert !options.strict?
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_new_with_argument
|
34
|
+
options = Nokogiri::XML::ParseOptions.new 1 << 1
|
35
|
+
assert_equal 1 << 1, options.options
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_chaining
|
39
|
+
options = Nokogiri::XML::ParseOptions.new.recover.noent
|
40
|
+
assert options.recover?
|
41
|
+
assert options.noent?
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_inspect
|
45
|
+
options = Nokogiri::XML::ParseOptions.new.recover.noent
|
46
|
+
ins = options.inspect
|
47
|
+
assert_match(/recover/, ins)
|
48
|
+
assert_match(/noent/, ins)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -20,6 +20,11 @@ module Nokogiri
|
|
20
20
|
assert ref = ProcessingInstruction.new(@xml, 'name', 'content')
|
21
21
|
assert_instance_of ProcessingInstruction, ref
|
22
22
|
end
|
23
|
+
|
24
|
+
def test_many_new
|
25
|
+
100.times { ProcessingInstruction.new(@xml, 'foo', 'bar') }
|
26
|
+
@xml.root << ProcessingInstruction.new(@xml, 'foo', 'bar')
|
27
|
+
end
|
23
28
|
end
|
24
29
|
end
|
25
30
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestRelaxNG < Nokogiri::TestCase
|
6
|
+
def setup
|
7
|
+
assert @schema = Nokogiri::XML::RelaxNG(File.read(ADDRESS_SCHEMA_FILE))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_parse_with_memory
|
11
|
+
assert_instance_of Nokogiri::XML::RelaxNG, @schema
|
12
|
+
assert_equal 0, @schema.errors.length
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_new
|
16
|
+
assert schema = Nokogiri::XML::RelaxNG.new(
|
17
|
+
File.read(ADDRESS_SCHEMA_FILE))
|
18
|
+
assert_instance_of Nokogiri::XML::RelaxNG, schema
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_parse_with_io
|
22
|
+
xsd = nil
|
23
|
+
File.open(ADDRESS_SCHEMA_FILE, 'rb') { |f|
|
24
|
+
assert xsd = Nokogiri::XML::RelaxNG(f)
|
25
|
+
}
|
26
|
+
assert_equal 0, xsd.errors.length
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_parse_with_errors
|
30
|
+
xml = File.read(ADDRESS_SCHEMA_FILE).sub(/name="/, 'name=')
|
31
|
+
assert_raises(Nokogiri::XML::SyntaxError) {
|
32
|
+
Nokogiri::XML::RelaxNG(xml)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_validate_document
|
37
|
+
doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
|
38
|
+
assert errors = @schema.validate(doc)
|
39
|
+
assert_equal 0, errors.length
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_validate_invalid_document
|
43
|
+
# Empty address book is not allowed
|
44
|
+
read_doc = '<addressBook></addressBook>'
|
45
|
+
|
46
|
+
assert errors = @schema.validate(Nokogiri::XML(read_doc))
|
47
|
+
assert_equal 1, errors.length
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_valid?
|
51
|
+
valid_doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
|
52
|
+
|
53
|
+
invalid_doc = Nokogiri::XML('<addressBook></addressBook>')
|
54
|
+
|
55
|
+
assert(@schema.valid?(valid_doc))
|
56
|
+
assert(!@schema.valid?(invalid_doc))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class TestSchema < Nokogiri::TestCase
|
6
|
+
def setup
|
7
|
+
assert @xsd = Nokogiri::XML::Schema(File.read(PO_SCHEMA_FILE))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_parse_with_memory
|
11
|
+
assert_instance_of Nokogiri::XML::Schema, @xsd
|
12
|
+
assert_equal 0, @xsd.errors.length
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_new
|
16
|
+
assert xsd = Nokogiri::XML::Schema.new(File.read(PO_SCHEMA_FILE))
|
17
|
+
assert_instance_of Nokogiri::XML::Schema, xsd
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_parse_with_io
|
21
|
+
xsd = nil
|
22
|
+
File.open(PO_SCHEMA_FILE, 'rb') { |f|
|
23
|
+
assert xsd = Nokogiri::XML::Schema(f)
|
24
|
+
}
|
25
|
+
assert_equal 0, xsd.errors.length
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_parse_with_errors
|
29
|
+
xml = File.read(PO_SCHEMA_FILE).sub(/name="/, 'name=')
|
30
|
+
assert_raises(Nokogiri::XML::SyntaxError) {
|
31
|
+
Nokogiri::XML::Schema(xml)
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_validate_document
|
36
|
+
doc = Nokogiri::XML(File.read(PO_XML_FILE))
|
37
|
+
assert errors = @xsd.validate(doc)
|
38
|
+
assert_equal 0, errors.length
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_validate_file
|
42
|
+
assert errors = @xsd.validate(PO_XML_FILE)
|
43
|
+
assert_equal 0, errors.length
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_validate_invalid_document
|
47
|
+
read_doc = File.read(PO_XML_FILE).gsub(/<city>[^<]*<\/city>/, '')
|
48
|
+
|
49
|
+
assert errors = @xsd.validate(Nokogiri::XML(read_doc))
|
50
|
+
assert_equal 2, errors.length
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_valid?
|
54
|
+
valid_doc = Nokogiri::XML(File.read(PO_XML_FILE))
|
55
|
+
|
56
|
+
invalid_doc = Nokogiri::XML(
|
57
|
+
File.read(PO_XML_FILE).gsub(/<city>[^<]*<\/city>/, '')
|
58
|
+
)
|
59
|
+
|
60
|
+
assert(@xsd.valid?(valid_doc))
|
61
|
+
assert(!@xsd.valid?(invalid_doc))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|