superfeedr-nokogiri 1.4.0.20091116183308
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.
- data/.autotest +27 -0
- data/CHANGELOG.ja.rdoc +330 -0
- data/CHANGELOG.rdoc +314 -0
- data/Manifest.txt +269 -0
- data/README.ja.rdoc +105 -0
- data/README.rdoc +118 -0
- data/Rakefile +244 -0
- data/bin/nokogiri +49 -0
- data/ext/nokogiri/extconf.rb +145 -0
- data/ext/nokogiri/html_document.c +145 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_element_description.c +272 -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 +92 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/nokogiri.c +89 -0
- data/ext/nokogiri/nokogiri.h +145 -0
- data/ext/nokogiri/xml_attr.c +92 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_attribute_decl.c +67 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +54 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_comment.c +52 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +388 -0
- data/ext/nokogiri/xml_document.h +24 -0
- data/ext/nokogiri/xml_document_fragment.c +46 -0
- data/ext/nokogiri/xml_document_fragment.h +10 -0
- data/ext/nokogiri/xml_dtd.c +192 -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_entity_decl.c +97 -0
- data/ext/nokogiri/xml_entity_decl.h +10 -0
- data/ext/nokogiri/xml_entity_reference.c +50 -0
- data/ext/nokogiri/xml_entity_reference.h +9 -0
- data/ext/nokogiri/xml_io.c +31 -0
- data/ext/nokogiri/xml_io.h +11 -0
- data/ext/nokogiri/xml_namespace.c +74 -0
- data/ext/nokogiri/xml_namespace.h +12 -0
- data/ext/nokogiri/xml_node.c +1060 -0
- data/ext/nokogiri/xml_node.h +13 -0
- data/ext/nokogiri/xml_node_set.c +397 -0
- data/ext/nokogiri/xml_node_set.h +9 -0
- data/ext/nokogiri/xml_processing_instruction.c +54 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +593 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_relax_ng.c +159 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +286 -0
- data/ext/nokogiri/xml_sax_parser.h +43 -0
- data/ext/nokogiri/xml_sax_parser_context.c +155 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +114 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +156 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +261 -0
- data/ext/nokogiri/xml_syntax_error.h +13 -0
- data/ext/nokogiri/xml_text.c +48 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath.c +53 -0
- data/ext/nokogiri/xml_xpath.h +11 -0
- data/ext/nokogiri/xml_xpath_context.c +239 -0
- data/ext/nokogiri/xml_xpath_context.h +9 -0
- data/ext/nokogiri/xslt_stylesheet.c +131 -0
- data/ext/nokogiri/xslt_stylesheet.h +9 -0
- data/lib/nokogiri.rb +116 -0
- data/lib/nokogiri/css.rb +25 -0
- data/lib/nokogiri/css/generated_parser.rb +646 -0
- data/lib/nokogiri/css/generated_tokenizer.rb +142 -0
- data/lib/nokogiri/css/node.rb +99 -0
- data/lib/nokogiri/css/parser.rb +82 -0
- data/lib/nokogiri/css/parser.y +227 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rex +54 -0
- data/lib/nokogiri/css/xpath_visitor.rb +162 -0
- data/lib/nokogiri/decorators/slop.rb +33 -0
- data/lib/nokogiri/ffi/html/document.rb +28 -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_context.rb +38 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
- data/lib/nokogiri/ffi/libxml.rb +356 -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_attribute.rb +27 -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 +28 -0
- data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
- data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
- data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -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_parser_context.rb +19 -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 +15 -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/attribute_decl.rb +27 -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 +135 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +69 -0
- data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
- data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
- data/lib/nokogiri/ffi/xml/entity_decl.rb +27 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
- data/lib/nokogiri/ffi/xml/node.rb +444 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +133 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +227 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +142 -0
- data/lib/nokogiri/ffi/xml/sax/parser_context.rb +67 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +39 -0
- data/lib/nokogiri/ffi/xml/schema.rb +92 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +91 -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/html.rb +35 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +88 -0
- 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 +13 -0
- data/lib/nokogiri/html/sax/parser.rb +48 -0
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +33 -0
- data/lib/nokogiri/version_warning.rb +11 -0
- data/lib/nokogiri/xml.rb +67 -0
- data/lib/nokogiri/xml/attr.rb +14 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +405 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +131 -0
- data/lib/nokogiri/xml/document_fragment.rb +69 -0
- data/lib/nokogiri/xml/dtd.rb +11 -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 +15 -0
- data/lib/nokogiri/xml/fragment_handler.rb +71 -0
- data/lib/nokogiri/xml/namespace.rb +13 -0
- data/lib/nokogiri/xml/node.rb +665 -0
- data/lib/nokogiri/xml/node/save_options.rb +42 -0
- data/lib/nokogiri/xml/node_set.rb +307 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- data/lib/nokogiri/xml/parse_options.rb +85 -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 +74 -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 +160 -0
- data/lib/nokogiri/xml/sax/parser.rb +115 -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 +61 -0
- data/lib/nokogiri/xml/syntax_error.rb +38 -0
- data/lib/nokogiri/xml/xpath.rb +10 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xslt.rb +48 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xsd/xmlparser/nokogiri.rb +71 -0
- data/tasks/test.rb +100 -0
- data/test/css/test_nthiness.rb +159 -0
- data/test/css/test_parser.rb +277 -0
- data/test/css/test_tokenizer.rb +183 -0
- data/test/css/test_xpath_visitor.rb +76 -0
- data/test/ffi/test_document.rb +35 -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/bar/bar.xsd +4 -0
- data/test/files/dont_hurt_em_why.xml +422 -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/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -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/tlm.html +850 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/helper.rb +136 -0
- data/test/html/sax/test_parser.rb +64 -0
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +164 -0
- data/test/html/test_document.rb +390 -0
- data/test/html/test_document_encoding.rb +77 -0
- data/test/html/test_document_fragment.rb +132 -0
- data/test/html/test_element_description.rb +94 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +228 -0
- data/test/html/test_node_encoding.rb +27 -0
- data/test/test_convert_xpath.rb +135 -0
- data/test/test_css_cache.rb +45 -0
- data/test/test_gc.rb +15 -0
- data/test/test_memory_leak.rb +77 -0
- data/test/test_nokogiri.rb +134 -0
- data/test/test_reader.rb +358 -0
- data/test/test_xslt_transforms.rb +131 -0
- data/test/xml/node/test_save_options.rb +20 -0
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +307 -0
- data/test/xml/sax/test_parser_context.rb +56 -0
- data/test/xml/sax/test_push_parser.rb +131 -0
- data/test/xml/test_attr.rb +38 -0
- data/test/xml/test_attribute_decl.rb +82 -0
- data/test/xml/test_builder.rb +167 -0
- data/test/xml/test_cdata.rb +38 -0
- data/test/xml/test_comment.rb +29 -0
- data/test/xml/test_document.rb +607 -0
- data/test/xml/test_document_encoding.rb +26 -0
- data/test/xml/test_document_fragment.rb +138 -0
- data/test/xml/test_dtd.rb +82 -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 +83 -0
- data/test/xml/test_entity_reference.rb +21 -0
- data/test/xml/test_namespace.rb +68 -0
- data/test/xml/test_node.rb +889 -0
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +107 -0
- data/test/xml/test_node_set.rb +531 -0
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +30 -0
- data/test/xml/test_reader_encoding.rb +126 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +89 -0
- data/test/xml/test_syntax_error.rb +27 -0
- data/test/xml/test_text.rb +30 -0
- data/test/xml/test_unparented_node.rb +381 -0
- data/test/xml/test_xpath.rb +106 -0
- metadata +430 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "helper"
|
3
|
+
|
4
|
+
module Nokogiri
|
5
|
+
module HTML
|
6
|
+
if RUBY_VERSION =~ /^1\.9/
|
7
|
+
class TestNodeEncoding < Nokogiri::TestCase
|
8
|
+
def test_inner_html
|
9
|
+
doc = Nokogiri::HTML File.open(SHIFT_JIS_HTML, 'rb')
|
10
|
+
|
11
|
+
hello = "こんにちは"
|
12
|
+
|
13
|
+
contents = doc.at('h2').inner_html
|
14
|
+
assert_equal doc.encoding, contents.encoding.name
|
15
|
+
assert_match hello.encode('Shift_JIS'), contents
|
16
|
+
|
17
|
+
contents = doc.at('h2').inner_html(:encoding => 'UTF-8')
|
18
|
+
assert_match hello, contents
|
19
|
+
|
20
|
+
doc.encoding = 'UTF-8'
|
21
|
+
contents = doc.at('h2').inner_html
|
22
|
+
assert_match hello, contents
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestConvertXPath < Nokogiri::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@N = Nokogiri(File.read(HTML_FILE))
|
8
|
+
end
|
9
|
+
|
10
|
+
def assert_syntactical_equivalence(hpath, xpath, match, &blk)
|
11
|
+
blk ||= lambda {|j| j.first}
|
12
|
+
assert_equal match, blk.call(@N.search(xpath)), "xpath result did not match"
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_child_tag
|
16
|
+
assert_syntactical_equivalence("h1[a]", ".//h1[child::a]", "Tender Lovemaking") do |j|
|
17
|
+
j.inner_text
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_child_tag_equals
|
22
|
+
assert_syntactical_equivalence("h1[a='Tender Lovemaking']", ".//h1[child::a = 'Tender Lovemaking']", "Tender Lovemaking") do |j|
|
23
|
+
j.inner_text
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_filter_contains
|
28
|
+
assert_syntactical_equivalence("title:contains('Tender')", ".//title[contains(., 'Tender')]",
|
29
|
+
"Tender Lovemaking ") do |j|
|
30
|
+
j.inner_text
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_filter_comment
|
35
|
+
assert_syntactical_equivalence("div comment()[2]", ".//div//comment()[position() = 2]", "<!-- end of header -->") do |j|
|
36
|
+
j.first.to_s
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_filter_text
|
41
|
+
assert_syntactical_equivalence("a[text()]", ".//a[normalize-space(child::text())]", "<a href=\"http://tenderlovemaking.com\">Tender Lovemaking</a>") do |j|
|
42
|
+
j.first.to_s
|
43
|
+
end
|
44
|
+
assert_syntactical_equivalence("a[text()='Tender Lovemaking']", ".//a[normalize-space(child::text()) = 'Tender Lovemaking']", "<a href=\"http://tenderlovemaking.com\">Tender Lovemaking</a>") do |j|
|
45
|
+
j.first.to_s
|
46
|
+
end
|
47
|
+
assert_syntactical_equivalence("a/text()", ".//a/child::text()", "Tender Lovemaking") do |j|
|
48
|
+
j.first.to_s
|
49
|
+
end
|
50
|
+
assert_syntactical_equivalence("h2//a[text()!='Back Home!']", ".//h2//a[normalize-space(child::text()) != 'Back Home!']", "Meow meow meow meow meow") do |j|
|
51
|
+
j.first.inner_text
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_filter_by_attr
|
56
|
+
assert_syntactical_equivalence("a[@href='http://blog.geminigeek.com/wordpress-theme']",
|
57
|
+
".//a[@href = 'http://blog.geminigeek.com/wordpress-theme']",
|
58
|
+
"http://blog.geminigeek.com/wordpress-theme") do |j|
|
59
|
+
j.first["href"]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_css_id
|
64
|
+
assert_syntactical_equivalence("#linkcat-7", ".//*[@id = 'linkcat-7']", "linkcat-7") do |j|
|
65
|
+
j.first["id"]
|
66
|
+
end
|
67
|
+
assert_syntactical_equivalence("li#linkcat-7", ".//li[@id = 'linkcat-7']", "linkcat-7") do |j|
|
68
|
+
j.first["id"]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_css_class
|
73
|
+
assert_syntactical_equivalence(".cat-item-15", ".//*[contains(concat(' ', @class, ' '), ' cat-item-15 ')]",
|
74
|
+
"cat-item cat-item-15") do |j|
|
75
|
+
j.first["class"]
|
76
|
+
end
|
77
|
+
assert_syntactical_equivalence("li.cat-item-15", ".//li[contains(concat(' ', @class, ' '), ' cat-item-15 ')]",
|
78
|
+
"cat-item cat-item-15") do |j|
|
79
|
+
j.first["class"]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_css_tags
|
84
|
+
assert_syntactical_equivalence("div li a", ".//div//li//a", "http://brobinius.org/") do |j|
|
85
|
+
j.first.inner_text
|
86
|
+
end
|
87
|
+
assert_syntactical_equivalence("div li > a", ".//div//li/a", "http://brobinius.org/") do |j|
|
88
|
+
j.first.inner_text
|
89
|
+
end
|
90
|
+
assert_syntactical_equivalence("h1 ~ small", ".//small[preceding-sibling::h1]", "The act of making love, tenderly.") do |j|
|
91
|
+
j.first.inner_text
|
92
|
+
end
|
93
|
+
assert_syntactical_equivalence("h1 ~ small", ".//small[preceding-sibling::h1]", "The act of making love, tenderly.") do |j|
|
94
|
+
j.first.inner_text
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_positional
|
99
|
+
assert_syntactical_equivalence("div/div:first()", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n".gsub(/[\r\n]/, '')) do |j|
|
100
|
+
j.first.inner_text.gsub(/[\r\n]/, '')
|
101
|
+
end
|
102
|
+
assert_syntactical_equivalence("div/div:first", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n".gsub(/[\r\n]/, '')) do |j|
|
103
|
+
j.first.inner_text.gsub(/[\r\n]/, '')
|
104
|
+
end
|
105
|
+
assert_syntactical_equivalence("div//a:last()", ".//div//a[position() = last()]", "Wordpress") do |j|
|
106
|
+
j.last.inner_text
|
107
|
+
end
|
108
|
+
assert_syntactical_equivalence("div//a:last", ".//div//a[position() = last()]", "Wordpress") do |j|
|
109
|
+
j.last.inner_text
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_multiple_filters
|
114
|
+
assert_syntactical_equivalence("a[@rel='bookmark'][1]", ".//a[@rel = 'bookmark' and position() = 1]", "Back Home!") do |j|
|
115
|
+
j.first.inner_text
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# TODO:
|
120
|
+
# doc/'title ~ link' -> links that are siblings of title
|
121
|
+
# doc/'p[@class~="final"]' -> class includes string (whitespacy)
|
122
|
+
# doc/'p[text()*="final"]' -> class includes string (index) (broken: always returns true?)
|
123
|
+
# doc/'p[text()$="final"]' -> /final$/
|
124
|
+
# doc/'p[text()|="final"]' -> /^final$/
|
125
|
+
# doc/'p[text()^="final"]' -> string starts with 'final
|
126
|
+
# nth_first
|
127
|
+
# nth_last
|
128
|
+
# even
|
129
|
+
# odd
|
130
|
+
# first-child, nth-child, last-child, nth-last-child, nth-last-of-type
|
131
|
+
# only-of-type, only-child
|
132
|
+
# parent
|
133
|
+
# empty
|
134
|
+
# root
|
135
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestCssCache < Nokogiri::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@css = "a1 > b2 > c3"
|
8
|
+
@parse_result = Nokogiri::CSS.parse(@css)
|
9
|
+
@to_xpath_result = @parse_result.map {|ast| ast.to_xpath}
|
10
|
+
Nokogiri::CSS::Parser.class_eval do
|
11
|
+
class << @cache
|
12
|
+
alias :old_bracket :[]
|
13
|
+
attr_reader :count
|
14
|
+
def [](key)
|
15
|
+
@count ||= 0
|
16
|
+
@count += 1
|
17
|
+
old_bracket(key)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
assert Nokogiri::CSS::Parser.cache_on?
|
22
|
+
end
|
23
|
+
|
24
|
+
def teardown
|
25
|
+
Nokogiri::CSS::Parser.clear_cache
|
26
|
+
Nokogiri::CSS::Parser.set_cache true
|
27
|
+
end
|
28
|
+
|
29
|
+
[ false, true ].each do |cache_setting|
|
30
|
+
define_method "test_css_cache_#{cache_setting ? "true" : "false"}" do
|
31
|
+
times = cache_setting ? 4 : nil
|
32
|
+
|
33
|
+
Nokogiri::CSS::Parser.set_cache cache_setting
|
34
|
+
|
35
|
+
Nokogiri::CSS.xpath_for(@css)
|
36
|
+
Nokogiri::CSS.xpath_for(@css)
|
37
|
+
Nokogiri::CSS::Parser.new.xpath_for(@css)
|
38
|
+
Nokogiri::CSS::Parser.new.xpath_for(@css)
|
39
|
+
|
40
|
+
assert_equal(times, Nokogiri::CSS::Parser.class_eval { @cache.count })
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
end
|
data/test/test_gc.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestGc < Nokogiri::TestCase
|
4
|
+
|
5
|
+
def test_dont_hurt_em_why
|
6
|
+
content = File.open("#{File.dirname(__FILE__)}/files/dont_hurt_em_why.xml").read
|
7
|
+
ndoc = Nokogiri::XML(content)
|
8
|
+
2.times do
|
9
|
+
info = ndoc.search('status text').first.inner_text
|
10
|
+
url = ndoc.search('user name').first.inner_text
|
11
|
+
GC.start
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestMemoryLeak < Nokogiri::TestCase
|
4
|
+
|
5
|
+
if ENV['NOKOGIRI_GC'] # turning these off by default for now
|
6
|
+
|
7
|
+
def test_for_memory_leak
|
8
|
+
begin
|
9
|
+
# we don't use Dike in any tests, but requiring it has side effects
|
10
|
+
# that can create memory leaks, and that's what we're testing for.
|
11
|
+
require 'rubygems'
|
12
|
+
require 'dike' # do not remove!
|
13
|
+
|
14
|
+
count_start = count_object_space_documents
|
15
|
+
xml_data = <<-EOS
|
16
|
+
<test>
|
17
|
+
<items>
|
18
|
+
<item>abc</item>
|
19
|
+
<item>1234</item>
|
20
|
+
<item>Zzz</item>
|
21
|
+
<items>
|
22
|
+
</test>
|
23
|
+
EOS
|
24
|
+
20.times do
|
25
|
+
doc = Nokogiri::XML(xml_data)
|
26
|
+
doc.xpath("//item")
|
27
|
+
end
|
28
|
+
2.times { GC.start }
|
29
|
+
count_end = count_object_space_documents
|
30
|
+
assert((count_end - count_start) <= 2, "memory leak detected")
|
31
|
+
rescue LoadError
|
32
|
+
puts "\ndike is not installed, skipping memory leak test"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
if Nokogiri.ffi?
|
37
|
+
[ ['Node', 'p', nil],
|
38
|
+
['CDATA', nil, 'content'],
|
39
|
+
['Comment', nil, 'content'],
|
40
|
+
['DocumentFragment', nil],
|
41
|
+
['EntityReference', nil, 'p'],
|
42
|
+
['ProcessingInstruction', nil, 'p', 'content'] ].each do |klass, *args|
|
43
|
+
|
44
|
+
define_method "test_for_leaked_#{klass}_nodes" do
|
45
|
+
Nokogiri::LibXML.expects(:xmlAddChild).at_least(1) # more than once shows we're GCing properly
|
46
|
+
10.times {
|
47
|
+
xml = Nokogiri::XML("<root></root>")
|
48
|
+
2.times { Nokogiri::XML.const_get(klass).new(*(args.collect{|arg| arg || xml})) }
|
49
|
+
GC.start
|
50
|
+
}
|
51
|
+
GC.start
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_for_leaked_attr_nodes
|
57
|
+
Nokogiri::LibXML.expects(:xmlFreePropList).at_least(1) # more than once shows we're GCing properly
|
58
|
+
10.times {
|
59
|
+
xml = Nokogiri::XML("<root></root>")
|
60
|
+
2.times { Nokogiri::XML::Attr.new(xml, "p") }
|
61
|
+
GC.start
|
62
|
+
}
|
63
|
+
GC.start
|
64
|
+
end
|
65
|
+
|
66
|
+
end # if ffi
|
67
|
+
|
68
|
+
end # if NOKOGIRI_GC
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def count_object_space_documents
|
73
|
+
count = 0
|
74
|
+
ObjectSpace.each_object {|j| count += 1 if j.is_a?(Nokogiri::XML::Document) }
|
75
|
+
count
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestNokogiri < Nokogiri::TestCase
|
4
|
+
def test_versions
|
5
|
+
version_match = /\d+\.\d+\.\d+/
|
6
|
+
assert_match version_match, Nokogiri::VERSION
|
7
|
+
assert_match version_match, Nokogiri::LIBXML_VERSION
|
8
|
+
|
9
|
+
if defined?(FFI)
|
10
|
+
assert_equal 'ffi', Nokogiri::VERSION_INFO['libxml']['binding']
|
11
|
+
if RUBY_PLATFORM =~ /java/
|
12
|
+
assert_equal 'jruby', Nokogiri::VERSION_INFO['libxml']['platform']
|
13
|
+
else
|
14
|
+
assert_equal 'ruby', Nokogiri::VERSION_INFO['libxml']['platform']
|
15
|
+
end
|
16
|
+
assert Nokogiri.ffi?
|
17
|
+
else
|
18
|
+
assert_equal 'extension', Nokogiri::VERSION_INFO['libxml']['binding']
|
19
|
+
|
20
|
+
assert_match version_match, Nokogiri::VERSION_INFO['libxml']['compiled']
|
21
|
+
assert_equal Nokogiri::LIBXML_VERSION, Nokogiri::VERSION_INFO['libxml']['compiled']
|
22
|
+
assert ! Nokogiri.ffi?
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_match version_match, Nokogiri::VERSION_INFO['libxml']['loaded']
|
26
|
+
Nokogiri::LIBXML_PARSER_VERSION =~ /(\d)(\d{2})(\d{2})/
|
27
|
+
major = $1.to_i
|
28
|
+
minor = $2.to_i
|
29
|
+
bug = $3.to_i
|
30
|
+
assert_equal "#{major}.#{minor}.#{bug}", Nokogiri::VERSION_INFO['libxml']['loaded']
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_parse_with_io
|
34
|
+
doc = Nokogiri.parse(
|
35
|
+
StringIO.new("<html><head><title></title><body></body></html>")
|
36
|
+
)
|
37
|
+
assert_instance_of Nokogiri::HTML::Document, doc
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_xml?
|
41
|
+
doc = Nokogiri.parse(File.read(XML_FILE))
|
42
|
+
assert doc.xml?
|
43
|
+
assert !doc.html?
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_html?
|
47
|
+
doc = Nokogiri.parse(File.read(HTML_FILE))
|
48
|
+
assert !doc.xml?
|
49
|
+
assert doc.html?
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_nokogiri_method_with_html
|
53
|
+
doc1 = Nokogiri(File.read(HTML_FILE))
|
54
|
+
doc2 = Nokogiri.parse(File.read(HTML_FILE))
|
55
|
+
assert_equal doc1.serialize, doc2.serialize
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_nokogiri_method_with_block
|
59
|
+
doc = Nokogiri { b "bold tag" }
|
60
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_make_with_html
|
64
|
+
doc = Nokogiri.make("<b>bold tag</b>")
|
65
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_make_with_block
|
69
|
+
doc = Nokogiri.make { b "bold tag" }
|
70
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
71
|
+
end
|
72
|
+
|
73
|
+
SLOP_HTML = <<-END
|
74
|
+
<html>
|
75
|
+
<body>
|
76
|
+
<ul>
|
77
|
+
<li class='red'>one</li>
|
78
|
+
<li class='blue'>two</li>
|
79
|
+
</ul>
|
80
|
+
<div>
|
81
|
+
one
|
82
|
+
<div>div two</div>
|
83
|
+
</div>
|
84
|
+
</body>
|
85
|
+
</html>
|
86
|
+
END
|
87
|
+
|
88
|
+
def test_slop_css
|
89
|
+
doc = Nokogiri::Slop(<<-eohtml)
|
90
|
+
<html>
|
91
|
+
<body>
|
92
|
+
<div>
|
93
|
+
one
|
94
|
+
<div class='foo'>
|
95
|
+
div two
|
96
|
+
<div class='foo'>
|
97
|
+
div three
|
98
|
+
</div>
|
99
|
+
</div>
|
100
|
+
</div>
|
101
|
+
</body>
|
102
|
+
</html>
|
103
|
+
eohtml
|
104
|
+
assert_equal "div", doc.html.body.div.div('.foo').name
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_slop
|
108
|
+
doc = Nokogiri::Slop(SLOP_HTML)
|
109
|
+
|
110
|
+
assert_equal "one", doc.html.body.ul.li.first.text
|
111
|
+
assert_equal "two", doc.html.body.ul.li(".blue").text
|
112
|
+
assert_equal "div two", doc.html.body.div.div.text
|
113
|
+
|
114
|
+
assert_equal "two", doc.html.body.ul.li(:css => ".blue").text
|
115
|
+
|
116
|
+
assert_equal "two", doc.html.body.ul.li(:xpath => "position()=2").text
|
117
|
+
assert_equal "one", doc.html.body.ul.li(:xpath => ["contains(text(),'o')"]).first.text
|
118
|
+
assert_equal "two", doc.html.body.ul.li(:xpath => ["contains(text(),'o')","contains(text(),'t')"]).text
|
119
|
+
|
120
|
+
assert_raise(NoMethodError) { doc.nonexistent }
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_slop_decorator
|
124
|
+
doc = Nokogiri(SLOP_HTML)
|
125
|
+
assert !doc.decorators(Nokogiri::XML::Node).include?(Nokogiri::Decorators::Slop)
|
126
|
+
|
127
|
+
doc.slop!
|
128
|
+
assert doc.decorators(Nokogiri::XML::Node).include?(Nokogiri::Decorators::Slop)
|
129
|
+
|
130
|
+
doc.slop!
|
131
|
+
assert_equal 1, doc.decorators(Nokogiri::XML::Node).select { |d| d == Nokogiri::Decorators::Slop }.size
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
data/test/test_reader.rb
ADDED
@@ -0,0 +1,358 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "helper"
|
3
|
+
|
4
|
+
class TestReader < Nokogiri::TestCase
|
5
|
+
def test_from_io_sets_io_as_source
|
6
|
+
io = File.open SNUGGLES_FILE
|
7
|
+
reader = Nokogiri::XML::Reader.from_io(io)
|
8
|
+
assert_equal io, reader.source
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_reader_takes_block
|
12
|
+
options = nil
|
13
|
+
Nokogiri::XML::Reader(File.read(XML_FILE), XML_FILE) do |cfg|
|
14
|
+
options = cfg
|
15
|
+
options.nonet.nowarning.dtdattr
|
16
|
+
end
|
17
|
+
assert options.nonet?
|
18
|
+
assert options.nowarning?
|
19
|
+
assert options.dtdattr?
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_nil_raises
|
23
|
+
assert_raises(ArgumentError) {
|
24
|
+
Nokogiri::XML::Reader.from_memory(nil)
|
25
|
+
}
|
26
|
+
assert_raises(ArgumentError) {
|
27
|
+
Nokogiri::XML::Reader.from_io(nil)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_from_io
|
32
|
+
io = File.open SNUGGLES_FILE
|
33
|
+
reader = Nokogiri::XML::Reader.from_io(io)
|
34
|
+
assert_equal false, reader.default?
|
35
|
+
assert_equal [false, false, false, false, false, false, false],
|
36
|
+
reader.map { |x| x.default? }
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_io
|
40
|
+
io = File.open SNUGGLES_FILE
|
41
|
+
reader = Nokogiri::XML::Reader(io)
|
42
|
+
assert_equal false, reader.default?
|
43
|
+
assert_equal [false, false, false, false, false, false, false],
|
44
|
+
reader.map { |x| x.default? }
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_string_io
|
48
|
+
io = StringIO.new(<<-eoxml)
|
49
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
50
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
51
|
+
</x>
|
52
|
+
eoxml
|
53
|
+
reader = Nokogiri::XML::Reader(io)
|
54
|
+
assert_equal false, reader.default?
|
55
|
+
assert_equal [false, false, false, false, false, false, false],
|
56
|
+
reader.map { |x| x.default? }
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_in_memory
|
60
|
+
reader = Nokogiri::XML::Reader(<<-eoxml)
|
61
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
62
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
63
|
+
</x>
|
64
|
+
eoxml
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_reader_holds_on_to_string
|
68
|
+
xml = <<-eoxml
|
69
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
70
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
71
|
+
</x>
|
72
|
+
eoxml
|
73
|
+
reader = Nokogiri::XML::Reader(xml)
|
74
|
+
if Nokogiri.ffi?
|
75
|
+
assert_not_nil reader.source
|
76
|
+
assert reader.source.is_a?(FFI::MemoryPointer)
|
77
|
+
else
|
78
|
+
assert_equal xml, reader.source
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_default?
|
83
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
84
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
85
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
86
|
+
</x>
|
87
|
+
eoxml
|
88
|
+
assert_equal false, reader.default?
|
89
|
+
assert_equal [false, false, false, false, false, false, false],
|
90
|
+
reader.map { |x| x.default? }
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_value?
|
94
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
95
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
96
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
97
|
+
</x>
|
98
|
+
eoxml
|
99
|
+
assert_equal false, reader.value?
|
100
|
+
assert_equal [false, true, false, true, false, true, false],
|
101
|
+
reader.map { |x| x.value? }
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_read_error_document
|
105
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
106
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
107
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
108
|
+
<foo>
|
109
|
+
</x>
|
110
|
+
eoxml
|
111
|
+
error_happened = false
|
112
|
+
begin
|
113
|
+
reader.each { |node| }
|
114
|
+
rescue Nokogiri::XML::SyntaxError => ex
|
115
|
+
error_happened = true
|
116
|
+
end
|
117
|
+
assert error_happened
|
118
|
+
assert 1, reader.errors.length
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_attributes?
|
122
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
123
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
124
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
125
|
+
</x>
|
126
|
+
eoxml
|
127
|
+
assert_equal false, reader.attributes?
|
128
|
+
assert_equal [true, false, true, false, true, false, true],
|
129
|
+
reader.map { |x| x.attributes? }
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_attributes
|
133
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
134
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'
|
135
|
+
xmlns='http://mothership.connection.com/'
|
136
|
+
>
|
137
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
138
|
+
</x>
|
139
|
+
eoxml
|
140
|
+
assert_equal({}, reader.attributes)
|
141
|
+
assert_equal [{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
|
142
|
+
'xmlns'=>'http://mothership.connection.com/'},
|
143
|
+
{}, {"awesome"=>"true"}, {}, {"awesome"=>"true"}, {},
|
144
|
+
{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
|
145
|
+
'xmlns'=>'http://mothership.connection.com/'}],
|
146
|
+
reader.map { |x| x.attributes }
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_attribute_roundtrip
|
150
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
151
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'
|
152
|
+
xmlns='http://mothership.connection.com/'
|
153
|
+
>
|
154
|
+
<tenderlove:foo awesome='true' size='giant'>snuggles!</tenderlove:foo>
|
155
|
+
</x>
|
156
|
+
eoxml
|
157
|
+
reader.each do |node|
|
158
|
+
node.attributes.each do |key, value|
|
159
|
+
assert_equal value, node.attribute(key)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_attribute_at
|
165
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
166
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
167
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
168
|
+
</x>
|
169
|
+
eoxml
|
170
|
+
assert_nil reader.attribute_at(nil)
|
171
|
+
assert_nil reader.attribute_at(0)
|
172
|
+
assert_equal ['http://tenderlovemaking.com/', nil, 'true', nil, 'true', nil, 'http://tenderlovemaking.com/'],
|
173
|
+
reader.map { |x| x.attribute_at(0) }
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_attribute
|
177
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
178
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
179
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
180
|
+
</x>
|
181
|
+
eoxml
|
182
|
+
assert_nil reader.attribute(nil)
|
183
|
+
assert_nil reader.attribute('awesome')
|
184
|
+
assert_equal [nil, nil, 'true', nil, 'true', nil, nil],
|
185
|
+
reader.map { |x| x.attribute('awesome') }
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_attribute_length
|
189
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
190
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
191
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
192
|
+
</x>
|
193
|
+
eoxml
|
194
|
+
assert_equal 0, reader.attribute_count
|
195
|
+
assert_equal [1, 0, 1, 0, 0, 0, 0], reader.map { |x| x.attribute_count }
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_depth
|
199
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
200
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
201
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
202
|
+
</x>
|
203
|
+
eoxml
|
204
|
+
assert_equal 0, reader.depth
|
205
|
+
assert_equal [0, 1, 1, 2, 1, 1, 0], reader.map { |x| x.depth }
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_encoding
|
209
|
+
string = <<-eoxml
|
210
|
+
<awesome>
|
211
|
+
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
|
212
|
+
<p xml:lang="ja">日本語が上手です</p>
|
213
|
+
</awesome>
|
214
|
+
eoxml
|
215
|
+
reader = Nokogiri::XML::Reader.from_memory(string, nil, 'UTF-8')
|
216
|
+
assert_equal ['UTF-8'], reader.map { |x| x.encoding }.uniq
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_xml_version
|
220
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
221
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
222
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
223
|
+
</x>
|
224
|
+
eoxml
|
225
|
+
assert_nil reader.xml_version
|
226
|
+
assert_equal ['1.0'], reader.map { |x| x.xml_version }.uniq
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_lang
|
230
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
231
|
+
<awesome>
|
232
|
+
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
|
233
|
+
<p xml:lang="ja">日本語が上手です</p>
|
234
|
+
</awesome>
|
235
|
+
eoxml
|
236
|
+
assert_nil reader.lang
|
237
|
+
assert_equal [nil, nil, "en", "en", "en", nil, "ja", "ja", "ja", nil, nil],
|
238
|
+
reader.map { |x| x.lang }
|
239
|
+
end
|
240
|
+
|
241
|
+
def test_value
|
242
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
243
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
244
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
245
|
+
</x>
|
246
|
+
eoxml
|
247
|
+
assert_nil reader.value
|
248
|
+
assert_equal [nil, "\n ", nil, "snuggles!", nil, "\n ", nil],
|
249
|
+
reader.map { |x| x.value }
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_prefix
|
253
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
254
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
255
|
+
<edi:foo>hello</edi:foo>
|
256
|
+
</x>
|
257
|
+
eoxml
|
258
|
+
assert_nil reader.prefix
|
259
|
+
assert_equal [nil, nil, "edi", nil, "edi", nil, nil],
|
260
|
+
reader.map { |n| n.prefix }
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_node_type
|
264
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
265
|
+
<x>
|
266
|
+
<y>hello</y>
|
267
|
+
</x>
|
268
|
+
eoxml
|
269
|
+
assert_equal 0, reader.node_type
|
270
|
+
assert_equal [1, 14, 1, 3, 15, 14, 15], reader.map { |n| n.node_type }
|
271
|
+
end
|
272
|
+
|
273
|
+
def test_inner_xml
|
274
|
+
str = "<x><y>hello</y></x>"
|
275
|
+
reader = Nokogiri::XML::Reader.from_memory(str)
|
276
|
+
|
277
|
+
reader.read
|
278
|
+
|
279
|
+
assert_equal "<y>hello</y>", reader.inner_xml
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_outer_xml
|
283
|
+
str = "<x><y>hello</y></x>"
|
284
|
+
reader = Nokogiri::XML::Reader.from_memory(str)
|
285
|
+
|
286
|
+
reader.read
|
287
|
+
|
288
|
+
assert_equal str, reader.outer_xml
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_state
|
292
|
+
reader = Nokogiri::XML::Reader.from_memory('<foo>bar</bar>')
|
293
|
+
assert reader.state
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_ns_uri
|
297
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
298
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
299
|
+
<edi:foo>hello</edi:foo>
|
300
|
+
</x>
|
301
|
+
eoxml
|
302
|
+
assert_nil reader.namespace_uri
|
303
|
+
assert_equal([nil,
|
304
|
+
nil,
|
305
|
+
"http://ecommerce.example.org/schema",
|
306
|
+
nil,
|
307
|
+
"http://ecommerce.example.org/schema",
|
308
|
+
nil,
|
309
|
+
nil],
|
310
|
+
reader.map { |n| n.namespace_uri })
|
311
|
+
end
|
312
|
+
|
313
|
+
def test_local_name
|
314
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
315
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
316
|
+
<edi:foo>hello</edi:foo>
|
317
|
+
</x>
|
318
|
+
eoxml
|
319
|
+
assert_nil reader.local_name
|
320
|
+
assert_equal(["x", "#text", "foo", "#text", "foo", "#text", "x"],
|
321
|
+
reader.map { |n| n.local_name })
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_name
|
325
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
326
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
327
|
+
<edi:foo>hello</edi:foo>
|
328
|
+
</x>
|
329
|
+
eoxml
|
330
|
+
assert_nil reader.name
|
331
|
+
assert_equal(["x", "#text", "edi:foo", "#text", "edi:foo", "#text", "x"],
|
332
|
+
reader.map { |n| n.name })
|
333
|
+
end
|
334
|
+
|
335
|
+
def test_read_from_memory
|
336
|
+
called = false
|
337
|
+
reader = Nokogiri::XML::Reader.from_memory('<foo>bar</foo>')
|
338
|
+
reader.each do |node|
|
339
|
+
called = true
|
340
|
+
assert node
|
341
|
+
end
|
342
|
+
assert called
|
343
|
+
end
|
344
|
+
|
345
|
+
def test_large_document_smoke_test
|
346
|
+
# simply run on a large document to verify that there no GC issues
|
347
|
+
xml = []
|
348
|
+
xml << "<elements>"
|
349
|
+
10000.times { |j| xml << "<element id=\"#{j}\"/>" }
|
350
|
+
xml << "</elements>"
|
351
|
+
xml = xml.join("\n")
|
352
|
+
|
353
|
+
Nokogiri::XML::Reader.from_memory(xml).each do |e|
|
354
|
+
e.attributes
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
end
|