libxml-ruby 2.8.0 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/HISTORY +859 -775
- data/LICENSE +20 -20
- data/MANIFEST +166 -166
- data/README.rdoc +217 -184
- data/Rakefile +98 -78
- data/ext/libxml/extconf.rb +61 -116
- data/ext/libxml/libxml.c +80 -76
- data/ext/libxml/ruby_libxml.h +67 -75
- data/ext/libxml/ruby_xml.c +937 -893
- data/ext/libxml/ruby_xml.h +10 -10
- data/ext/libxml/ruby_xml_attr.c +333 -333
- data/ext/libxml/ruby_xml_attr.h +12 -12
- data/ext/libxml/ruby_xml_attr_decl.c +153 -153
- data/ext/libxml/ruby_xml_attr_decl.h +11 -11
- data/ext/libxml/ruby_xml_attributes.c +275 -275
- data/ext/libxml/ruby_xml_attributes.h +15 -15
- data/ext/libxml/ruby_xml_cbg.c +85 -85
- data/ext/libxml/ruby_xml_document.c +1123 -1147
- data/ext/libxml/ruby_xml_document.h +11 -11
- data/ext/libxml/ruby_xml_dtd.c +248 -268
- data/ext/libxml/ruby_xml_dtd.h +9 -9
- data/ext/libxml/ruby_xml_encoding.c +250 -260
- data/ext/libxml/ruby_xml_encoding.h +16 -19
- data/ext/libxml/ruby_xml_error.c +996 -996
- data/ext/libxml/ruby_xml_error.h +12 -12
- data/ext/libxml/ruby_xml_html_parser.c +89 -92
- data/ext/libxml/ruby_xml_html_parser.h +10 -10
- data/ext/libxml/ruby_xml_html_parser_context.c +337 -338
- data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
- data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
- data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
- data/ext/libxml/ruby_xml_input_cbg.c +191 -191
- data/ext/libxml/ruby_xml_input_cbg.h +20 -20
- data/ext/libxml/ruby_xml_io.c +47 -50
- data/ext/libxml/ruby_xml_io.h +10 -10
- data/ext/libxml/ruby_xml_namespace.c +154 -153
- data/ext/libxml/ruby_xml_namespace.h +10 -10
- data/ext/libxml/ruby_xml_namespaces.c +293 -293
- data/ext/libxml/ruby_xml_namespaces.h +9 -9
- data/ext/libxml/ruby_xml_node.c +1406 -1452
- data/ext/libxml/ruby_xml_node.h +13 -11
- data/ext/libxml/ruby_xml_parser.c +91 -94
- data/ext/libxml/ruby_xml_parser.h +12 -12
- data/ext/libxml/ruby_xml_parser_context.c +999 -1001
- data/ext/libxml/ruby_xml_parser_context.h +10 -10
- data/ext/libxml/ruby_xml_parser_options.c +66 -66
- data/ext/libxml/ruby_xml_parser_options.h +12 -12
- data/ext/libxml/ruby_xml_reader.c +1239 -1228
- data/ext/libxml/ruby_xml_reader.h +17 -17
- data/ext/libxml/ruby_xml_relaxng.c +110 -111
- data/ext/libxml/ruby_xml_relaxng.h +10 -10
- data/ext/libxml/ruby_xml_sax2_handler.c +326 -328
- data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
- data/ext/libxml/ruby_xml_sax_parser.c +116 -120
- data/ext/libxml/ruby_xml_sax_parser.h +10 -10
- data/ext/libxml/ruby_xml_schema.c +350 -301
- data/ext/libxml/ruby_xml_schema.h +806 -809
- data/ext/libxml/ruby_xml_schema_attribute.c +61 -109
- data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
- data/ext/libxml/ruby_xml_schema_element.c +69 -94
- data/ext/libxml/ruby_xml_schema_element.h +14 -14
- data/ext/libxml/ruby_xml_schema_facet.c +46 -52
- data/ext/libxml/ruby_xml_schema_facet.h +13 -13
- data/ext/libxml/ruby_xml_schema_type.c +214 -259
- data/ext/libxml/ruby_xml_schema_type.h +9 -9
- data/ext/libxml/ruby_xml_version.h +9 -9
- data/ext/libxml/ruby_xml_writer.c +1133 -1137
- data/ext/libxml/ruby_xml_writer.h +10 -10
- data/ext/libxml/ruby_xml_xinclude.c +16 -16
- data/ext/libxml/ruby_xml_xinclude.h +11 -11
- data/ext/libxml/ruby_xml_xpath.c +194 -188
- data/ext/libxml/ruby_xml_xpath.h +13 -13
- data/ext/libxml/ruby_xml_xpath_context.c +360 -361
- data/ext/libxml/ruby_xml_xpath_context.h +9 -9
- data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
- data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
- data/ext/libxml/ruby_xml_xpath_object.c +338 -335
- data/ext/libxml/ruby_xml_xpath_object.h +17 -17
- data/ext/libxml/ruby_xml_xpointer.c +99 -99
- data/ext/libxml/ruby_xml_xpointer.h +11 -11
- data/ext/vc/libxml_ruby.sln +17 -15
- data/lib/libxml/node.rb +2 -78
- data/lib/libxml/parser.rb +0 -266
- data/lib/libxml/sax_parser.rb +0 -17
- data/lib/libxml/schema/attribute.rb +19 -19
- data/lib/libxml/schema/element.rb +19 -27
- data/lib/libxml/schema/type.rb +21 -29
- data/lib/libxml/schema.rb +47 -66
- data/lib/libxml-ruby.rb +30 -0
- data/lib/libxml.rb +3 -33
- data/libxml-ruby.gemspec +48 -44
- data/script/benchmark/depixelate +634 -634
- data/script/benchmark/hamlet.xml +9054 -9054
- data/script/benchmark/parsecount +170 -170
- data/script/benchmark/throughput +41 -41
- data/script/test +6 -6
- data/setup.rb +0 -1
- data/test/c14n/given/example-1.xml +14 -14
- data/test/c14n/given/example-2.xml +11 -11
- data/test/c14n/given/example-3.xml +18 -18
- data/test/c14n/given/example-4.xml +9 -9
- data/test/c14n/given/example-5.xml +12 -12
- data/test/c14n/given/example-6.xml +2 -2
- data/test/c14n/given/example-7.xml +11 -11
- data/test/c14n/given/example-8.xml +11 -11
- data/test/c14n/given/example-8.xpath +9 -9
- data/test/c14n/result/1-1-without-comments/example-1 +3 -3
- data/test/c14n/result/1-1-without-comments/example-2 +10 -10
- data/test/c14n/result/1-1-without-comments/example-3 +13 -13
- data/test/c14n/result/1-1-without-comments/example-4 +8 -8
- data/test/c14n/result/1-1-without-comments/example-5 +2 -2
- data/test/c14n/result/with-comments/example-1 +5 -5
- data/test/c14n/result/with-comments/example-2 +10 -10
- data/test/c14n/result/with-comments/example-3 +13 -13
- data/test/c14n/result/with-comments/example-4 +8 -8
- data/test/c14n/result/with-comments/example-5 +3 -3
- data/test/c14n/result/without-comments/example-1 +3 -3
- data/test/c14n/result/without-comments/example-2 +10 -10
- data/test/c14n/result/without-comments/example-3 +13 -13
- data/test/c14n/result/without-comments/example-4 +8 -8
- data/test/c14n/result/without-comments/example-5 +2 -2
- data/test/model/atom.xml +12 -12
- data/test/model/bands.iso-8859-1.xml +4 -4
- data/test/model/bands.utf-8.xml +4 -4
- data/test/model/bands.xml +4 -4
- data/test/model/books.xml +153 -153
- data/test/model/cwm_1_0.xml +11336 -0
- data/test/model/merge_bug_data.xml +58 -58
- data/test/model/ruby-lang.html +238 -238
- data/test/model/rubynet.xml +79 -79
- data/test/model/shiporder.rnc +28 -28
- data/test/model/shiporder.rng +86 -86
- data/test/model/shiporder.xml +22 -22
- data/test/model/shiporder.xsd +44 -40
- data/test/model/shiporder_bad.xsd +40 -0
- data/test/model/shiporder_import.xsd +45 -0
- data/test/model/soap.xml +27 -27
- data/test/model/xinclude.xml +4 -4
- data/test/{tc_attr.rb → test_attr.rb} +23 -25
- data/test/{tc_attr_decl.rb → test_attr_decl.rb} +13 -14
- data/test/{tc_attributes.rb → test_attributes.rb} +11 -18
- data/test/{tc_canonicalize.rb → test_canonicalize.rb} +36 -41
- data/test/test_deprecated_require.rb +12 -0
- data/test/{tc_document.rb → test_document.rb} +33 -27
- data/test/test_document_write.rb +146 -0
- data/test/{tc_dtd.rb → test_dtd.rb} +29 -29
- data/test/{tc_encoding.rb → test_encoding.rb} +129 -126
- data/test/{tc_encoding_sax.rb → test_encoding_sax.rb} +7 -6
- data/test/test_error.rb +178 -0
- data/test/test_helper.rb +4 -9
- data/test/test_html_parser.rb +162 -0
- data/test/test_html_parser_context.rb +23 -0
- data/test/test_namespace.rb +60 -0
- data/test/{tc_namespaces.rb → test_namespaces.rb} +34 -44
- data/test/{tc_node.rb → test_node.rb} +68 -47
- data/test/{tc_node_cdata.rb → test_node_cdata.rb} +12 -13
- data/test/{tc_node_comment.rb → test_node_comment.rb} +7 -8
- data/test/{tc_node_copy.rb → test_node_copy.rb} +4 -6
- data/test/{tc_node_edit.rb → test_node_edit.rb} +23 -41
- data/test/{tc_node_pi.rb → test_node_pi.rb} +37 -40
- data/test/{tc_node_text.rb → test_node_text.rb} +10 -12
- data/test/{tc_node_write.rb → test_node_write.rb} +18 -29
- data/test/test_node_xlink.rb +28 -0
- data/test/test_parser.rb +324 -0
- data/test/{tc_parser_context.rb → test_parser_context.rb} +42 -49
- data/test/{tc_properties.rb → test_properties.rb} +6 -7
- data/test/test_reader.rb +364 -0
- data/test/test_relaxng.rb +53 -0
- data/test/{tc_sax_parser.rb → test_sax_parser.rb} +44 -38
- data/test/test_schema.rb +231 -0
- data/test/test_suite.rb +38 -40
- data/test/{tc_traversal.rb → test_traversal.rb} +5 -6
- data/test/{tc_writer.rb → test_writer.rb} +468 -448
- data/test/{tc_xinclude.rb → test_xinclude.rb} +4 -5
- data/test/test_xml.rb +263 -0
- data/test/{tc_xpath.rb → test_xpath.rb} +31 -32
- data/test/{tc_xpath_context.rb → test_xpath_context.rb} +8 -9
- data/test/test_xpath_expression.rb +37 -0
- data/test/{tc_xpointer.rb → test_xpointer.rb} +16 -18
- metadata +122 -100
- data/lib/libxml/ns.rb +0 -22
- data/lib/libxml/properties.rb +0 -23
- data/lib/libxml/reader.rb +0 -29
- data/lib/libxml/xpath_object.rb +0 -16
- data/test/etc_doc_to_s.rb +0 -21
- data/test/ets_doc_file.rb +0 -17
- data/test/ets_doc_to_s.rb +0 -23
- data/test/ets_gpx.rb +0 -28
- data/test/ets_node_gc.rb +0 -23
- data/test/ets_test.xml +0 -2
- data/test/ets_tsr.rb +0 -11
- data/test/tc_deprecated_require.rb +0 -13
- data/test/tc_document_write.rb +0 -196
- data/test/tc_error.rb +0 -180
- data/test/tc_html_parser.rb +0 -153
- data/test/tc_html_parser_context.rb +0 -24
- data/test/tc_namespace.rb +0 -62
- data/test/tc_node_xlink.rb +0 -29
- data/test/tc_parser.rb +0 -381
- data/test/tc_reader.rb +0 -400
- data/test/tc_relaxng.rb +0 -54
- data/test/tc_schema.rb +0 -162
- data/test/tc_xml.rb +0 -226
- data/test/tc_xpath_expression.rb +0 -38
|
@@ -1,126 +1,129 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
#
|
|
20
|
-
# http://en.wikipedia.org/wiki/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Encoding.default_internal = nil
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
doc = XML::Document.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
doc = XML::Document.
|
|
49
|
-
assert_equal(XML::Encoding::
|
|
50
|
-
assert_equal(Encoding::
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
assert_equal(Encoding::
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Encoding.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
assert_equal(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
assert_equal(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
assert_equal(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
assert_equal(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require_relative './test_helper'
|
|
4
|
+
|
|
5
|
+
# Code UTF8 Latin1 Hex
|
|
6
|
+
# m 109 109 6D
|
|
7
|
+
# ö 195 182 246 C3 B6 / F6
|
|
8
|
+
# t 116 116 74
|
|
9
|
+
# l 108 108 6C
|
|
10
|
+
# e 101 101 65
|
|
11
|
+
# y 121 121 79
|
|
12
|
+
# _ 95 95 5F
|
|
13
|
+
# c 99 99 63
|
|
14
|
+
# r 114 114 72
|
|
15
|
+
# ü 195 188 252 C3 BC / FC
|
|
16
|
+
# e 101 101 65
|
|
17
|
+
|
|
18
|
+
# See:
|
|
19
|
+
# http://en.wikipedia.org/wiki/ISO/IEC_8859-1
|
|
20
|
+
# http://en.wikipedia.org/wiki/List_of_Unicode_characters
|
|
21
|
+
|
|
22
|
+
class TestEncoding < Minitest::Test
|
|
23
|
+
def setup
|
|
24
|
+
@original_encoding = Encoding.default_internal
|
|
25
|
+
Encoding.default_internal = nil
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def teardown
|
|
29
|
+
Encoding.default_internal = @original_encoding
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def file_for_encoding(encoding)
|
|
33
|
+
file_name = "model/bands.#{encoding.name.downcase}.xml"
|
|
34
|
+
File.join(File.dirname(__FILE__), file_name)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def load_encoding(encoding)
|
|
38
|
+
@encoding = encoding
|
|
39
|
+
file = file_for_encoding(encoding)
|
|
40
|
+
|
|
41
|
+
# Strip spaces to make testing easier
|
|
42
|
+
LibXML::XML.default_keep_blanks = false
|
|
43
|
+
@doc = LibXML::XML::Document.file(file)
|
|
44
|
+
LibXML::XML.default_keep_blanks = true
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_encoding
|
|
48
|
+
doc = LibXML::XML::Document.new
|
|
49
|
+
assert_equal(LibXML::XML::Encoding::NONE, doc.encoding)
|
|
50
|
+
assert_equal(Encoding::ASCII_8BIT, doc.rb_encoding)
|
|
51
|
+
|
|
52
|
+
file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.xml'))
|
|
53
|
+
doc = LibXML::XML::Document.file(file)
|
|
54
|
+
assert_equal(LibXML::XML::Encoding::UTF_8, doc.encoding)
|
|
55
|
+
assert_equal(Encoding::UTF_8, doc.rb_encoding)
|
|
56
|
+
|
|
57
|
+
doc.encoding = LibXML::XML::Encoding::ISO_8859_1
|
|
58
|
+
assert_equal(LibXML::XML::Encoding::ISO_8859_1, doc.encoding)
|
|
59
|
+
assert_equal(Encoding::ISO8859_1, doc.rb_encoding)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_no_internal_encoding_iso_8859_1
|
|
63
|
+
load_encoding(Encoding::ISO_8859_1)
|
|
64
|
+
node = @doc.root.children.first
|
|
65
|
+
|
|
66
|
+
name = node.name
|
|
67
|
+
assert_equal(Encoding::UTF_8, name.encoding)
|
|
68
|
+
assert_equal("m\u00F6tley_cr\u00FCe", name)
|
|
69
|
+
assert_equal("109 195 182 116 108 101 121 95 99 114 195 188 101",
|
|
70
|
+
name.bytes.to_a.join(" "))
|
|
71
|
+
assert_equal("M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.",
|
|
72
|
+
node.content)
|
|
73
|
+
|
|
74
|
+
name = name.encode(Encoding::ISO_8859_1)
|
|
75
|
+
assert_equal(Encoding::ISO_8859_1, name.encoding)
|
|
76
|
+
assert_equal("m\xF6tley_cr\xFCe".force_encoding(Encoding::ISO_8859_1), name)
|
|
77
|
+
assert_equal("109 246 116 108 101 121 95 99 114 252 101",
|
|
78
|
+
name.bytes.to_a.join(" "))
|
|
79
|
+
assert_equal("M\xF6tley Cr\xFCe is an American heavy metal band formed in Los Angeles, California in 1981.".force_encoding(Encoding::ISO_8859_1),
|
|
80
|
+
node.content.encode(Encoding::ISO_8859_1))
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_internal_encoding_iso_8859_1
|
|
84
|
+
Encoding.default_internal = Encoding::ISO_8859_1
|
|
85
|
+
load_encoding(Encoding::ISO_8859_1)
|
|
86
|
+
node = @doc.root.children.first
|
|
87
|
+
|
|
88
|
+
name = node.name
|
|
89
|
+
assert_equal(Encoding::ISO_8859_1, name.encoding)
|
|
90
|
+
assert_equal("109 246 116 108 101 121 95 99 114 252 101",
|
|
91
|
+
name.bytes.to_a.join(" "))
|
|
92
|
+
assert_equal("m\xF6tley_cr\xFCe".force_encoding(Encoding::ISO_8859_1), name)
|
|
93
|
+
assert_equal("109 246 116 108 101 121 95 99 114 252 101",
|
|
94
|
+
name.bytes.to_a.join(" "))
|
|
95
|
+
assert_equal("M\xF6tley Cr\xFCe is an American heavy metal band formed in Los Angeles, California in 1981.".force_encoding(Encoding::ISO_8859_1),
|
|
96
|
+
node.content.encode(Encoding::ISO_8859_1))
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_no_internal_encoding_utf_8
|
|
100
|
+
load_encoding(Encoding::UTF_8)
|
|
101
|
+
node = @doc.root.children.first
|
|
102
|
+
|
|
103
|
+
name = node.name
|
|
104
|
+
assert_equal(@encoding, name.encoding)
|
|
105
|
+
assert_equal("109 195 182 116 108 101 121 95 99 114 195 188 101",
|
|
106
|
+
name.bytes.to_a.join(" "))
|
|
107
|
+
|
|
108
|
+
name = name.encode(Encoding::ISO_8859_1)
|
|
109
|
+
assert_equal(Encoding::ISO_8859_1, name.encoding)
|
|
110
|
+
assert_equal("109 246 116 108 101 121 95 99 114 252 101",
|
|
111
|
+
name.bytes.to_a.join(" "))
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_internal_encoding_utf_8
|
|
115
|
+
Encoding.default_internal = Encoding::ISO_8859_1
|
|
116
|
+
load_encoding(Encoding::UTF_8)
|
|
117
|
+
node = @doc.root.children.first
|
|
118
|
+
|
|
119
|
+
name = node.name
|
|
120
|
+
assert_equal(Encoding::ISO_8859_1, name.encoding)
|
|
121
|
+
assert_equal("109 246 116 108 101 121 95 99 114 252 101",
|
|
122
|
+
name.bytes.to_a.join(" "))
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_encoding_conversions
|
|
126
|
+
assert_equal("UTF-8", LibXML::XML::Encoding.to_s(LibXML::XML::Encoding::UTF_8))
|
|
127
|
+
assert_equal(LibXML::XML::Encoding::UTF_8, LibXML::XML::Encoding.from_s("UTF-8"))
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
|
-
|
|
3
|
-
require 'test/unit'
|
|
2
|
+
require_relative './test_helper'
|
|
4
3
|
|
|
5
4
|
class SaxEncodingCallbacks
|
|
6
5
|
attr_reader :encoding
|
|
7
|
-
|
|
6
|
+
attr_accessor :assertions
|
|
7
|
+
include Minitest::Assertions
|
|
8
8
|
|
|
9
9
|
def initialize
|
|
10
|
+
@assertions = 0
|
|
10
11
|
@encoding = Encoding::UTF_8
|
|
11
12
|
end
|
|
12
13
|
|
|
@@ -90,7 +91,7 @@ class SaxEncodingCallbacks
|
|
|
90
91
|
end
|
|
91
92
|
end
|
|
92
93
|
|
|
93
|
-
class TestEncodingSax < Test
|
|
94
|
+
class TestEncodingSax < Minitest::Test
|
|
94
95
|
def setup
|
|
95
96
|
Encoding.default_internal = nil
|
|
96
97
|
end
|
|
@@ -101,13 +102,13 @@ class TestEncodingSax < Test::Unit::TestCase
|
|
|
101
102
|
end
|
|
102
103
|
|
|
103
104
|
def test_encoding_iso_8859_1
|
|
104
|
-
parser = XML::SaxParser.file(file_for_encoding(Encoding::ISO_8859_1))
|
|
105
|
+
parser = LibXML::XML::SaxParser.file(file_for_encoding(Encoding::ISO_8859_1))
|
|
105
106
|
parser.callbacks = SaxEncodingCallbacks.new
|
|
106
107
|
parser.parse
|
|
107
108
|
end
|
|
108
109
|
|
|
109
110
|
def test_encoding_utf8
|
|
110
|
-
parser = XML::SaxParser.file(file_for_encoding(Encoding::UTF_8))
|
|
111
|
+
parser = LibXML::XML::SaxParser.file(file_for_encoding(Encoding::UTF_8))
|
|
111
112
|
parser.callbacks = SaxEncodingCallbacks.new
|
|
112
113
|
parser.parse
|
|
113
114
|
end
|
data/test/test_error.rb
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require_relative './test_helper'
|
|
4
|
+
require 'stringio'
|
|
5
|
+
|
|
6
|
+
class TestError < Minitest::Test
|
|
7
|
+
# def test_error_codes
|
|
8
|
+
# assert_equal(4, LibXML::XML::Error::DTD)
|
|
9
|
+
# assert_equal(4, LibXML::XML::Error.const_get('DTD'))
|
|
10
|
+
#
|
|
11
|
+
# assert_equal(4, LibXML::XML::Error::DOCUMENT_EMPTY)
|
|
12
|
+
# assert_equal(4, LibXML::XML::Error.const_get('DOCUMENT_EMPTY'))
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# def test_invalid_handler
|
|
16
|
+
# assert_raises(RuntimeError) do
|
|
17
|
+
# LibXML::XML::Error.set_handler
|
|
18
|
+
# end
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# def test_handler
|
|
22
|
+
# exception = nil
|
|
23
|
+
# LibXML::XML::Error.set_handler do |error|
|
|
24
|
+
# exception = error
|
|
25
|
+
# end
|
|
26
|
+
#
|
|
27
|
+
# # Raise the error
|
|
28
|
+
# error = assert_raises(LibXML::XML::Error) do
|
|
29
|
+
# LibXML::XML::Reader.string('<foo').read
|
|
30
|
+
# end
|
|
31
|
+
# assert_equal(exception, error)
|
|
32
|
+
#
|
|
33
|
+
# # Check the handler worked
|
|
34
|
+
# refute_nil(exception)
|
|
35
|
+
# assert_kind_of(LibXML::XML::Error, exception)
|
|
36
|
+
# assert_equal("Fatal error: Couldn't find end of Start Tag foo at :1.", exception.message)
|
|
37
|
+
# assert_equal(LibXML::XML::Error::PARSER, exception.domain)
|
|
38
|
+
# assert_equal(LibXML::XML::Error::GT_REQUIRED, exception.code)
|
|
39
|
+
# assert_equal(LibXML::XML::Error::FATAL, exception.level)
|
|
40
|
+
# assert_nil(exception.file)
|
|
41
|
+
# assert_equal(1, exception.line)
|
|
42
|
+
# assert_equal('foo', exception.str1)
|
|
43
|
+
# assert_nil(exception.str2)
|
|
44
|
+
# assert_nil(exception.str3)
|
|
45
|
+
# assert_equal(0, exception.int1)
|
|
46
|
+
# assert_equal(5, exception.int2)
|
|
47
|
+
# assert_nil(exception.node)
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# def test_reset_handler
|
|
51
|
+
# exception = nil
|
|
52
|
+
# LibXML::XML::Error.set_handler do |error|
|
|
53
|
+
# exception = error
|
|
54
|
+
# end
|
|
55
|
+
#
|
|
56
|
+
# LibXML::XML::Error.reset_handler
|
|
57
|
+
# LibXML::XML::Reader.string('<foo')
|
|
58
|
+
# assert_nil(exception)
|
|
59
|
+
# end
|
|
60
|
+
#
|
|
61
|
+
# def test_get_handler
|
|
62
|
+
# assert_respond_to(LibXML::XML::Error, :get_handler)
|
|
63
|
+
# assert_equal(0, LibXML::XML::Error.method(:get_handler).arity)
|
|
64
|
+
#
|
|
65
|
+
# saved_handler = LibXML::XML::Error.get_handler
|
|
66
|
+
# LibXML::XML::Error.set_handler{ puts "New handler" }
|
|
67
|
+
# refute_equal(LibXML::XML::Error.get_handler, saved_handler)
|
|
68
|
+
#
|
|
69
|
+
# LibXML::XML::Error.set_handler(&saved_handler)
|
|
70
|
+
# assert_equal(LibXML::XML::Error.get_handler, saved_handler)
|
|
71
|
+
# end
|
|
72
|
+
#
|
|
73
|
+
# def test_verbose_handler
|
|
74
|
+
# LibXML::XML::Error.set_handler(&LibXML::XML::Error::VERBOSE_HANDLER)
|
|
75
|
+
# output = StringIO.new
|
|
76
|
+
# original_stderr = Object::STDERR
|
|
77
|
+
#
|
|
78
|
+
# Object.const_set(:STDERR, output)
|
|
79
|
+
# begin
|
|
80
|
+
# assert_raises(LibXML::XML::Error) do
|
|
81
|
+
# LibXML::XML::Parser.string('<foo><bar/></foz>').parse
|
|
82
|
+
# end
|
|
83
|
+
# ensure
|
|
84
|
+
# Object.const_set(:STDERR, original_stderr)
|
|
85
|
+
# end
|
|
86
|
+
# assert_equal("Fatal error: Opening and ending tag mismatch: foo line 1 and foz at :1.\n", output.string)
|
|
87
|
+
# end
|
|
88
|
+
#
|
|
89
|
+
# def test_no_hanlder
|
|
90
|
+
# LibXML::XML::Error.reset_handler
|
|
91
|
+
# output = StringIO.new
|
|
92
|
+
# original_stderr = Object::STDERR
|
|
93
|
+
#
|
|
94
|
+
# Object.const_set(:STDERR, output)
|
|
95
|
+
# begin
|
|
96
|
+
# assert_raises(LibXML::XML::Error) do
|
|
97
|
+
# LibXML::XML::Parser.string('<foo><bar/></foz>').parse
|
|
98
|
+
# end
|
|
99
|
+
# ensure
|
|
100
|
+
# Object.const_set(:STDERR, original_stderr)
|
|
101
|
+
# end
|
|
102
|
+
# assert_equal('', output.string)
|
|
103
|
+
# end
|
|
104
|
+
#
|
|
105
|
+
# def test_parse_error
|
|
106
|
+
# exception = assert_raises(LibXML::XML::Error) do
|
|
107
|
+
# LibXML::XML::Parser.string('<foo><bar/></foz>').parse
|
|
108
|
+
# end
|
|
109
|
+
#
|
|
110
|
+
# assert_instance_of(LibXML::XML::Error, exception)
|
|
111
|
+
# assert_equal("Fatal error: Opening and ending tag mismatch: foo line 1 and foz at :1.", exception.message)
|
|
112
|
+
# assert_equal(LibXML::XML::Error::PARSER, exception.domain)
|
|
113
|
+
# assert_equal(LibXML::XML::Error::TAG_NAME_MISMATCH, exception.code)
|
|
114
|
+
# assert_equal(LibXML::XML::Error::FATAL, exception.level)
|
|
115
|
+
# assert_nil(exception.file)
|
|
116
|
+
# assert_equal(1, exception.line)
|
|
117
|
+
# end
|
|
118
|
+
#
|
|
119
|
+
# def test_xpath_error
|
|
120
|
+
# doc = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/soap.xml'))
|
|
121
|
+
#
|
|
122
|
+
# exception = assert_raises(LibXML::XML::Error) do
|
|
123
|
+
# doc.find('/foo[bar=test')
|
|
124
|
+
# end
|
|
125
|
+
#
|
|
126
|
+
# assert_instance_of(LibXML::XML::Error, exception)
|
|
127
|
+
# assert_equal("Error: Invalid predicate.", exception.message)
|
|
128
|
+
# assert_equal(LibXML::XML::Error::XPATH, exception.domain)
|
|
129
|
+
# assert_equal(LibXML::XML::Error::XPATH_INVALID_PREDICATE_ERROR, exception.code)
|
|
130
|
+
# assert_equal(LibXML::XML::Error::ERROR, exception.level)
|
|
131
|
+
# assert_nil(exception.file)
|
|
132
|
+
# assert_nil(nil)
|
|
133
|
+
# end
|
|
134
|
+
|
|
135
|
+
def test_double_parse
|
|
136
|
+
LibXML::XML::Parser.register_error_handler(lambda {|msg| nil })
|
|
137
|
+
parser = LibXML::XML::Parser.string("<test>something</test>")
|
|
138
|
+
parser.parse
|
|
139
|
+
|
|
140
|
+
error = assert_raises(LibXML::XML::Error) do
|
|
141
|
+
# Try parsing a second time
|
|
142
|
+
parser.parse
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
assert_equal(" LibXML::XML::Error.", error.to_s)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# def test_libxml_parser_empty_string
|
|
149
|
+
# xp = LibXML::XML::Parser.new
|
|
150
|
+
#
|
|
151
|
+
# error = assert_raises(TypeError) do
|
|
152
|
+
# xp.string = nil
|
|
153
|
+
# end
|
|
154
|
+
# assert_equal('wrong argument type nil (expected String)', error.to_s)
|
|
155
|
+
#
|
|
156
|
+
# error = assert_raises(ArgumentError) do
|
|
157
|
+
# xp.string = ''
|
|
158
|
+
# end
|
|
159
|
+
# assert_equal('Must specify a string with one or more characters', error.to_s)
|
|
160
|
+
# end
|
|
161
|
+
#
|
|
162
|
+
# def test_error_domain_to_s
|
|
163
|
+
# exception = assert_raises(LibXML::XML::Error) do
|
|
164
|
+
# LibXML::XML::Parser.string('<foo href="http://example.org/cgi?k1=v1&k2=v2"></foo>').parse
|
|
165
|
+
# end
|
|
166
|
+
#
|
|
167
|
+
# assert_equal(LibXML::XML::Error::PARSER, exception.domain)
|
|
168
|
+
# assert_equal("PARSER",exception.domain_to_s)
|
|
169
|
+
# end
|
|
170
|
+
#
|
|
171
|
+
# def test_error_code_to_s
|
|
172
|
+
# exception = assert_raises(LibXML::XML::Error) do
|
|
173
|
+
# LibXML::XML::Parser.string('<foo href="http://example.org/cgi?k1=v1&k2=v2"></foo>').parse
|
|
174
|
+
# end
|
|
175
|
+
# assert_equal(LibXML::XML::Error::ENTITYREF_SEMICOL_MISSING, exception.code)
|
|
176
|
+
# assert_equal("ENTITYREF_SEMICOL_MISSING",exception.code_to_s)
|
|
177
|
+
# end
|
|
178
|
+
end
|
data/test/test_helper.rb
CHANGED
|
@@ -2,13 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
# To make testing/debugging easier, test within this source tree versus an installed gem
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
ext = File.expand_path(File.join(root, 'ext', 'libxml'))
|
|
9
|
-
|
|
10
|
-
$LOAD_PATH << lib
|
|
11
|
-
$LOAD_PATH << ext
|
|
12
|
-
|
|
13
|
-
require 'xml'
|
|
5
|
+
require 'bundler/setup'
|
|
6
|
+
require 'minitest/autorun'
|
|
7
|
+
require 'libxml-ruby'
|
|
14
8
|
|
|
9
|
+
STDOUT.write "\nlibxml2: #{LibXML::XML::LIBXML_VERSION}\n#{RUBY_DESCRIPTION}\n\n"
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require_relative './test_helper'
|
|
4
|
+
require 'stringio'
|
|
5
|
+
|
|
6
|
+
class HTMLParserTest < Minitest::Test
|
|
7
|
+
def html_file
|
|
8
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'model/ruby-lang.html'))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# ----- Sources ------
|
|
12
|
+
def test_file
|
|
13
|
+
xp = LibXML::XML::HTMLParser.file(html_file)
|
|
14
|
+
assert_instance_of(LibXML::XML::HTMLParser, xp)
|
|
15
|
+
doc = xp.parse
|
|
16
|
+
refute_nil(doc)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_noexistent_file
|
|
20
|
+
error = assert_raises(LibXML::XML::Error) do
|
|
21
|
+
LibXML::XML::HTMLParser.file('i_dont_exist.xml')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
assert_equal('Warning: failed to load external entity "i_dont_exist.xml".', error.to_s)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_nil_file
|
|
28
|
+
error = assert_raises(TypeError) do
|
|
29
|
+
LibXML::XML::HTMLParser.file(nil)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
assert_match(/nil into String/, error.to_s)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_io
|
|
36
|
+
File.open(html_file) do |io|
|
|
37
|
+
xp = LibXML::XML::HTMLParser.io(io)
|
|
38
|
+
assert_instance_of(LibXML::XML::HTMLParser, xp)
|
|
39
|
+
|
|
40
|
+
doc = xp.parse
|
|
41
|
+
assert_instance_of(LibXML::XML::Document, doc)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def test_io_gc
|
|
46
|
+
# Test that the reader keeps a reference
|
|
47
|
+
# to the io object
|
|
48
|
+
file = File.open(html_file)
|
|
49
|
+
parser = LibXML::XML::HTMLParser.io(file)
|
|
50
|
+
file = nil
|
|
51
|
+
GC.start
|
|
52
|
+
assert(parser.parse)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_nil_io
|
|
56
|
+
error = assert_raises(TypeError) do
|
|
57
|
+
LibXML::XML::HTMLParser.io(nil)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
assert_equal("Must pass in an IO object", error.to_s)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def test_string_io
|
|
64
|
+
data = File.read(html_file)
|
|
65
|
+
io = StringIO.new(data)
|
|
66
|
+
xp = LibXML::XML::HTMLParser.io(io)
|
|
67
|
+
assert_instance_of(LibXML::XML::HTMLParser, xp)
|
|
68
|
+
|
|
69
|
+
doc = xp.parse
|
|
70
|
+
assert_instance_of(LibXML::XML::Document, doc)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_string
|
|
74
|
+
str = '<html><body><p>hi</p></body></html>'
|
|
75
|
+
xp = LibXML::XML::HTMLParser.string(str)
|
|
76
|
+
|
|
77
|
+
assert_instance_of(LibXML::XML::HTMLParser, xp)
|
|
78
|
+
assert_instance_of(LibXML::XML::HTMLParser, xp)
|
|
79
|
+
|
|
80
|
+
doc = xp.parse
|
|
81
|
+
assert_instance_of(LibXML::XML::Document, doc)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_nil_string
|
|
85
|
+
error = assert_raises(TypeError) do
|
|
86
|
+
LibXML::XML::HTMLParser.string(nil)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
assert_equal("wrong argument type nil (expected String)", error.to_s)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_parse
|
|
93
|
+
html = <<-EOS
|
|
94
|
+
<html>
|
|
95
|
+
<head>
|
|
96
|
+
<meta name=keywords content=nasty>
|
|
97
|
+
</head>
|
|
98
|
+
<body>Hello<br>World</html>
|
|
99
|
+
EOS
|
|
100
|
+
|
|
101
|
+
parser = LibXML::XML::HTMLParser.string(html, :options => LibXML::XML::HTMLParser::Options::NOBLANKS)
|
|
102
|
+
doc = parser.parse
|
|
103
|
+
assert_instance_of LibXML::XML::Document, doc
|
|
104
|
+
|
|
105
|
+
root = doc.root
|
|
106
|
+
assert_instance_of LibXML::XML::Node, root
|
|
107
|
+
assert_equal 'html', root.name
|
|
108
|
+
|
|
109
|
+
head = root.child
|
|
110
|
+
assert_instance_of LibXML::XML::Node, head
|
|
111
|
+
assert_equal 'head', head.name
|
|
112
|
+
|
|
113
|
+
meta = head.child
|
|
114
|
+
assert_instance_of LibXML::XML::Node, meta
|
|
115
|
+
assert_equal 'meta', meta.name
|
|
116
|
+
assert_equal 'keywords', meta[:name]
|
|
117
|
+
assert_equal 'nasty', meta[:content]
|
|
118
|
+
|
|
119
|
+
body = head.next
|
|
120
|
+
assert_instance_of LibXML::XML::Node, body
|
|
121
|
+
assert_equal 'body', body.name
|
|
122
|
+
|
|
123
|
+
hello = body.child
|
|
124
|
+
# It appears that some versions of libxml2 add a layer of <p>
|
|
125
|
+
# cant figure our why or how, so this skips it if there
|
|
126
|
+
hello = hello.child if hello.name == "p"
|
|
127
|
+
|
|
128
|
+
assert_instance_of LibXML::XML::Node, hello
|
|
129
|
+
assert_equal 'Hello', hello.content
|
|
130
|
+
|
|
131
|
+
br = hello.next
|
|
132
|
+
assert_instance_of LibXML::XML::Node, br
|
|
133
|
+
assert_equal 'br', br.name
|
|
134
|
+
|
|
135
|
+
world = br.next
|
|
136
|
+
assert_instance_of LibXML::XML::Node, world
|
|
137
|
+
assert_equal 'World', world.content
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def test_no_implied
|
|
141
|
+
html = "hello world"
|
|
142
|
+
parser = LibXML::XML::HTMLParser.string(html, :options => LibXML::XML::HTMLParser::Options::NOIMPLIED)
|
|
143
|
+
doc = parser.parse
|
|
144
|
+
assert_equal("<p>#{html}</p>", doc.root.to_s)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def test_comment
|
|
148
|
+
doc = LibXML::XML::HTMLParser.string('<!-- stuff -->', :options => LibXML::XML::HTMLParser::Options::NOIMPLIED |
|
|
149
|
+
LibXML::XML::HTMLParser::Options::NOERROR |
|
|
150
|
+
LibXML::XML::HTMLParser::Options::NOWARNING |
|
|
151
|
+
LibXML::XML::HTMLParser::Options::RECOVER |
|
|
152
|
+
LibXML::XML::HTMLParser::Options::NONET)
|
|
153
|
+
assert(doc)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_open_many_files
|
|
157
|
+
file = File.expand_path(File.join(File.dirname(__FILE__), 'model/ruby-lang.html'))
|
|
158
|
+
1000.times do
|
|
159
|
+
LibXML::XML::HTMLParser.file(file).parse
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require_relative './test_helper'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestHtmlParserContext < Minitest::Test
|
|
7
|
+
def test_default_options
|
|
8
|
+
context = LibXML::XML::HTMLParser::Context.new
|
|
9
|
+
assert_equal(0, context.options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_no_options
|
|
13
|
+
context = LibXML::XML::HTMLParser::Context.new
|
|
14
|
+
context.options = 0
|
|
15
|
+
assert_equal(0, context.options)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_options
|
|
19
|
+
context = LibXML::XML::HTMLParser::Context.new
|
|
20
|
+
context.options = LibXML::XML::HTMLParser::Options::NOERROR
|
|
21
|
+
assert_equal(LibXML::XML::HTMLParser::Options::NOERROR, context.options)
|
|
22
|
+
end
|
|
23
|
+
end
|