libxml-ruby 2.8.0 → 3.2.1

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.
Files changed (204) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY +842 -775
  3. data/LICENSE +20 -20
  4. data/MANIFEST +166 -166
  5. data/README.rdoc +217 -184
  6. data/Rakefile +90 -78
  7. data/ext/libxml/extconf.h +3 -0
  8. data/ext/libxml/extconf.rb +61 -116
  9. data/ext/libxml/libxml.c +80 -76
  10. data/ext/libxml/ruby_libxml.h +67 -75
  11. data/ext/libxml/ruby_xml.c +933 -893
  12. data/ext/libxml/ruby_xml.h +10 -10
  13. data/ext/libxml/ruby_xml_attr.c +333 -333
  14. data/ext/libxml/ruby_xml_attr.h +12 -12
  15. data/ext/libxml/ruby_xml_attr_decl.c +153 -153
  16. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  17. data/ext/libxml/ruby_xml_attributes.c +275 -275
  18. data/ext/libxml/ruby_xml_attributes.h +15 -15
  19. data/ext/libxml/ruby_xml_cbg.c +85 -85
  20. data/ext/libxml/ruby_xml_document.c +1123 -1147
  21. data/ext/libxml/ruby_xml_document.h +11 -11
  22. data/ext/libxml/ruby_xml_dtd.c +248 -268
  23. data/ext/libxml/ruby_xml_dtd.h +9 -9
  24. data/ext/libxml/ruby_xml_encoding.c +250 -260
  25. data/ext/libxml/ruby_xml_encoding.h +16 -19
  26. data/ext/libxml/ruby_xml_error.c +996 -996
  27. data/ext/libxml/ruby_xml_error.h +12 -12
  28. data/ext/libxml/ruby_xml_html_parser.c +89 -92
  29. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  30. data/ext/libxml/ruby_xml_html_parser_context.c +337 -338
  31. data/ext/libxml/ruby_xml_html_parser_context.h +10 -10
  32. data/ext/libxml/ruby_xml_html_parser_options.c +46 -46
  33. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  34. data/ext/libxml/ruby_xml_input_cbg.c +191 -191
  35. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  36. data/ext/libxml/ruby_xml_io.c +47 -50
  37. data/ext/libxml/ruby_xml_io.h +10 -10
  38. data/ext/libxml/ruby_xml_namespace.c +153 -153
  39. data/ext/libxml/ruby_xml_namespace.h +10 -10
  40. data/ext/libxml/ruby_xml_namespaces.c +293 -293
  41. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  42. data/ext/libxml/ruby_xml_node.c +1402 -1452
  43. data/ext/libxml/ruby_xml_node.h +13 -11
  44. data/ext/libxml/ruby_xml_parser.c +91 -94
  45. data/ext/libxml/ruby_xml_parser.h +12 -12
  46. data/ext/libxml/ruby_xml_parser_context.c +999 -1001
  47. data/ext/libxml/ruby_xml_parser_context.h +10 -10
  48. data/ext/libxml/ruby_xml_parser_options.c +66 -66
  49. data/ext/libxml/ruby_xml_parser_options.h +12 -12
  50. data/ext/libxml/ruby_xml_reader.c +1239 -1228
  51. data/ext/libxml/ruby_xml_reader.h +17 -17
  52. data/ext/libxml/ruby_xml_relaxng.c +110 -111
  53. data/ext/libxml/ruby_xml_relaxng.h +10 -10
  54. data/ext/libxml/ruby_xml_sax2_handler.c +326 -328
  55. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  56. data/ext/libxml/ruby_xml_sax_parser.c +116 -120
  57. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  58. data/ext/libxml/ruby_xml_schema.c +278 -301
  59. data/ext/libxml/ruby_xml_schema.h +809 -809
  60. data/ext/libxml/ruby_xml_schema_attribute.c +109 -109
  61. data/ext/libxml/ruby_xml_schema_attribute.h +15 -15
  62. data/ext/libxml/ruby_xml_schema_element.c +95 -94
  63. data/ext/libxml/ruby_xml_schema_element.h +14 -14
  64. data/ext/libxml/ruby_xml_schema_facet.c +52 -52
  65. data/ext/libxml/ruby_xml_schema_facet.h +13 -13
  66. data/ext/libxml/ruby_xml_schema_type.c +232 -259
  67. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  68. data/ext/libxml/ruby_xml_version.h +9 -9
  69. data/ext/libxml/ruby_xml_writer.c +1133 -1137
  70. data/ext/libxml/ruby_xml_writer.h +10 -10
  71. data/ext/libxml/ruby_xml_xinclude.c +16 -16
  72. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  73. data/ext/libxml/ruby_xml_xpath.c +194 -188
  74. data/ext/libxml/ruby_xml_xpath.h +13 -13
  75. data/ext/libxml/ruby_xml_xpath_context.c +360 -361
  76. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  77. data/ext/libxml/ruby_xml_xpath_expression.c +81 -81
  78. data/ext/libxml/ruby_xml_xpath_expression.h +10 -10
  79. data/ext/libxml/ruby_xml_xpath_object.c +338 -335
  80. data/ext/libxml/ruby_xml_xpath_object.h +17 -17
  81. data/ext/libxml/ruby_xml_xpointer.c +99 -99
  82. data/ext/libxml/ruby_xml_xpointer.h +11 -11
  83. data/ext/vc/libxml_ruby.sln +17 -15
  84. data/lib/libxml-ruby.rb +30 -0
  85. data/lib/libxml.rb +3 -33
  86. data/lib/libxml/node.rb +2 -78
  87. data/lib/libxml/parser.rb +0 -266
  88. data/lib/libxml/sax_parser.rb +0 -17
  89. data/lib/libxml/schema.rb +47 -66
  90. data/lib/libxml/schema/attribute.rb +19 -19
  91. data/lib/libxml/schema/element.rb +19 -27
  92. data/lib/libxml/schema/type.rb +21 -29
  93. data/libxml-ruby.gemspec +48 -44
  94. data/script/benchmark/depixelate +634 -634
  95. data/script/benchmark/hamlet.xml +9054 -9054
  96. data/script/benchmark/parsecount +170 -170
  97. data/script/benchmark/throughput +41 -41
  98. data/script/test +6 -6
  99. data/setup.rb +0 -1
  100. data/test/c14n/given/example-1.xml +14 -14
  101. data/test/c14n/given/example-2.xml +11 -11
  102. data/test/c14n/given/example-3.xml +18 -18
  103. data/test/c14n/given/example-4.xml +9 -9
  104. data/test/c14n/given/example-5.xml +12 -12
  105. data/test/c14n/given/example-6.xml +2 -2
  106. data/test/c14n/given/example-7.xml +11 -11
  107. data/test/c14n/given/example-8.xml +11 -11
  108. data/test/c14n/given/example-8.xpath +9 -9
  109. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  110. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  111. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  112. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  113. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  114. data/test/c14n/result/with-comments/example-1 +5 -5
  115. data/test/c14n/result/with-comments/example-2 +10 -10
  116. data/test/c14n/result/with-comments/example-3 +13 -13
  117. data/test/c14n/result/with-comments/example-4 +8 -8
  118. data/test/c14n/result/with-comments/example-5 +3 -3
  119. data/test/c14n/result/without-comments/example-1 +3 -3
  120. data/test/c14n/result/without-comments/example-2 +10 -10
  121. data/test/c14n/result/without-comments/example-3 +13 -13
  122. data/test/c14n/result/without-comments/example-4 +8 -8
  123. data/test/c14n/result/without-comments/example-5 +2 -2
  124. data/test/model/atom.xml +12 -12
  125. data/test/model/bands.iso-8859-1.xml +4 -4
  126. data/test/model/bands.utf-8.xml +4 -4
  127. data/test/model/bands.xml +4 -4
  128. data/test/model/books.xml +153 -153
  129. data/test/model/cwm_1_0.xml +11336 -0
  130. data/test/model/merge_bug_data.xml +58 -58
  131. data/test/model/ruby-lang.html +238 -238
  132. data/test/model/rubynet.xml +79 -79
  133. data/test/model/shiporder.rnc +28 -28
  134. data/test/model/shiporder.rng +86 -86
  135. data/test/model/shiporder.xml +22 -22
  136. data/test/model/shiporder.xsd +39 -39
  137. data/test/model/soap.xml +27 -27
  138. data/test/model/xinclude.xml +4 -4
  139. data/test/test.xml +2 -0
  140. data/test/{tc_attr.rb → test_attr.rb} +23 -25
  141. data/test/{tc_attr_decl.rb → test_attr_decl.rb} +13 -14
  142. data/test/{tc_attributes.rb → test_attributes.rb} +11 -18
  143. data/test/{tc_canonicalize.rb → test_canonicalize.rb} +36 -41
  144. data/test/test_deprecated_require.rb +12 -0
  145. data/test/{tc_document.rb → test_document.rb} +32 -27
  146. data/test/test_document_write.rb +146 -0
  147. data/test/{tc_dtd.rb → test_dtd.rb} +28 -29
  148. data/test/{tc_encoding.rb → test_encoding.rb} +129 -126
  149. data/test/{tc_encoding_sax.rb → test_encoding_sax.rb} +7 -6
  150. data/test/test_error.rb +178 -0
  151. data/test/test_helper.rb +3 -10
  152. data/test/test_html_parser.rb +162 -0
  153. data/test/test_html_parser_context.rb +23 -0
  154. data/test/test_namespace.rb +60 -0
  155. data/test/{tc_namespaces.rb → test_namespaces.rb} +34 -44
  156. data/test/{tc_node.rb → test_node.rb} +68 -47
  157. data/test/{tc_node_cdata.rb → test_node_cdata.rb} +12 -13
  158. data/test/{tc_node_comment.rb → test_node_comment.rb} +7 -8
  159. data/test/{tc_node_copy.rb → test_node_copy.rb} +4 -6
  160. data/test/{tc_node_edit.rb → test_node_edit.rb} +23 -41
  161. data/test/{tc_node_pi.rb → test_node_pi.rb} +37 -40
  162. data/test/{tc_node_text.rb → test_node_text.rb} +10 -12
  163. data/test/{tc_node_write.rb → test_node_write.rb} +18 -29
  164. data/test/test_node_xlink.rb +28 -0
  165. data/test/test_parser.rb +324 -0
  166. data/test/{tc_parser_context.rb → test_parser_context.rb} +41 -42
  167. data/test/{tc_properties.rb → test_properties.rb} +6 -7
  168. data/test/test_reader.rb +363 -0
  169. data/test/test_relaxng.rb +53 -0
  170. data/test/{tc_sax_parser.rb → test_sax_parser.rb} +36 -37
  171. data/test/{tc_schema.rb → test_schema.rb} +43 -37
  172. data/test/test_suite.rb +38 -40
  173. data/test/{tc_traversal.rb → test_traversal.rb} +5 -6
  174. data/test/{tc_writer.rb → test_writer.rb} +468 -448
  175. data/test/{tc_xinclude.rb → test_xinclude.rb} +4 -5
  176. data/test/test_xml.rb +262 -0
  177. data/test/{tc_xpath.rb → test_xpath.rb} +31 -32
  178. data/test/{tc_xpath_context.rb → test_xpath_context.rb} +8 -9
  179. data/test/test_xpath_expression.rb +37 -0
  180. data/test/{tc_xpointer.rb → test_xpointer.rb} +16 -18
  181. metadata +117 -95
  182. data/lib/libxml/ns.rb +0 -22
  183. data/lib/libxml/properties.rb +0 -23
  184. data/lib/libxml/reader.rb +0 -29
  185. data/lib/libxml/xpath_object.rb +0 -16
  186. data/test/etc_doc_to_s.rb +0 -21
  187. data/test/ets_doc_file.rb +0 -17
  188. data/test/ets_doc_to_s.rb +0 -23
  189. data/test/ets_gpx.rb +0 -28
  190. data/test/ets_node_gc.rb +0 -23
  191. data/test/ets_test.xml +0 -2
  192. data/test/ets_tsr.rb +0 -11
  193. data/test/tc_deprecated_require.rb +0 -13
  194. data/test/tc_document_write.rb +0 -196
  195. data/test/tc_error.rb +0 -180
  196. data/test/tc_html_parser.rb +0 -153
  197. data/test/tc_html_parser_context.rb +0 -24
  198. data/test/tc_namespace.rb +0 -62
  199. data/test/tc_node_xlink.rb +0 -29
  200. data/test/tc_parser.rb +0 -381
  201. data/test/tc_reader.rb +0 -400
  202. data/test/tc_relaxng.rb +0 -54
  203. data/test/tc_xml.rb +0 -226
  204. data/test/tc_xpath_expression.rb +0 -38
@@ -1,153 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require './test_helper'
4
- require 'stringio'
5
- require 'test/unit'
6
-
7
- class HTMLParserTest < Test::Unit::TestCase
8
- def html_file
9
- File.expand_path(File.join(File.dirname(__FILE__), 'model/ruby-lang.html'))
10
- end
11
-
12
- # ----- Sources ------
13
- def test_file
14
- xp = XML::HTMLParser.file(html_file)
15
- assert_instance_of(XML::HTMLParser, xp)
16
- doc = xp.parse
17
- assert_not_nil(doc)
18
- end
19
-
20
- def test_noexistent_file
21
- error = assert_raise(XML::Error) do
22
- XML::HTMLParser.file('i_dont_exist.xml')
23
- end
24
-
25
- assert_equal('Warning: failed to load external entity "i_dont_exist.xml".', error.to_s)
26
- end
27
-
28
- def test_nil_file
29
- error = assert_raise(TypeError) do
30
- XML::HTMLParser.file(nil)
31
- end
32
-
33
- assert_match(/nil into String/, error.to_s)
34
- end
35
-
36
- def test_io
37
- File.open(html_file) do |io|
38
- xp = XML::HTMLParser.io(io)
39
- assert_instance_of(XML::HTMLParser, xp)
40
-
41
- doc = xp.parse
42
- assert_instance_of(XML::Document, doc)
43
- end
44
- end
45
-
46
- def test_io_gc
47
- # Test that the reader keeps a reference
48
- # to the io object
49
- file = File.open(html_file)
50
- parser = XML::HTMLParser.io(file)
51
- file = nil
52
- GC.start
53
- assert(parser.parse)
54
- end
55
-
56
- def test_nil_io
57
- error = assert_raise(TypeError) do
58
- XML::HTMLParser.io(nil)
59
- end
60
-
61
- assert_equal("Must pass in an IO object", error.to_s)
62
- end
63
-
64
- def test_string_io
65
- data = File.read(html_file)
66
- io = StringIO.new(data)
67
- xp = XML::HTMLParser.io(io)
68
- assert_instance_of(XML::HTMLParser, xp)
69
-
70
- doc = xp.parse
71
- assert_instance_of(XML::Document, doc)
72
- end
73
-
74
- def test_string
75
- str = '<html><body><p>hi</p></body></html>'
76
- xp = XML::HTMLParser.string(str)
77
-
78
- assert_instance_of(XML::HTMLParser, xp)
79
- assert_instance_of(XML::HTMLParser, xp)
80
-
81
- doc = xp.parse
82
- assert_instance_of(XML::Document, doc)
83
- end
84
-
85
- def test_nil_string
86
- error = assert_raise(TypeError) do
87
- XML::HTMLParser.string(nil)
88
- end
89
-
90
- assert_equal("wrong argument type nil (expected String)", error.to_s)
91
- end
92
-
93
- def test_parse
94
- html = <<-EOS
95
- <html>
96
- <head>
97
- <meta name=keywords content=nasty>
98
- </head>
99
- <body>Hello<br>World</html>
100
- EOS
101
-
102
- parser = XML::HTMLParser.string(html, :options => XML::HTMLParser::Options::NOBLANKS)
103
- doc = parser.parse
104
- assert_instance_of XML::Document, doc
105
-
106
- root = doc.root
107
- assert_instance_of XML::Node, root
108
- assert_equal 'html', root.name
109
-
110
- head = root.child
111
- assert_instance_of XML::Node, head
112
- assert_equal 'head', head.name
113
-
114
- meta = head.child
115
- assert_instance_of XML::Node, meta
116
- assert_equal 'meta', meta.name
117
- assert_equal 'keywords', meta[:name]
118
- assert_equal 'nasty', meta[:content]
119
-
120
- body = head.next
121
- assert_instance_of XML::Node, body
122
- assert_equal 'body', body.name
123
-
124
- hello = body.child
125
- # It appears that some versions of libxml2 add a layer of <p>
126
- # cant figure our why or how, so this skips it if there
127
- hello = hello.child if hello.name == "p"
128
-
129
- assert_instance_of XML::Node, hello
130
- assert_equal 'Hello', hello.content
131
-
132
- br = hello.next
133
- assert_instance_of XML::Node, br
134
- assert_equal 'br', br.name
135
-
136
- world = br.next
137
- assert_instance_of XML::Node, world
138
- assert_equal 'World', world.content
139
- end
140
-
141
- def test_no_implied
142
- html = "hello world"
143
- parser = XML::HTMLParser.string(html, :options => XML::HTMLParser::Options::NOIMPLIED)
144
- doc = parser.parse
145
- assert_equal("<p>#{html}</p>", doc.root.to_s)
146
- end
147
-
148
- def test_open_many_files
149
- 1000.times do
150
- doc = XML::HTMLParser.file('model/ruby-lang.html').parse
151
- end
152
- end
153
- end
@@ -1,24 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require './test_helper'
4
-
5
- require 'test/unit'
6
-
7
- class TestHtmlParserContext < Test::Unit::TestCase
8
- def test_default_options
9
- context = XML::HTMLParser::Context.new
10
- assert_equal(0, context.options)
11
- end
12
-
13
- def test_no_options
14
- context = XML::HTMLParser::Context.new
15
- context.options = 0
16
- assert_equal(0, context.options)
17
- end
18
-
19
- def test_options
20
- context = XML::HTMLParser::Context.new
21
- context.options = XML::HTMLParser::Options::NOERROR
22
- assert_equal(XML::HTMLParser::Options::NOERROR, context.options)
23
- end
24
- end
@@ -1,62 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require './test_helper'
4
-
5
- require 'test/unit'
6
-
7
- class TestNS < Test::Unit::TestCase
8
- def setup
9
- file = File.join(File.dirname(__FILE__), 'model/soap.xml')
10
- @doc = XML::Document.file(file)
11
- end
12
-
13
- def teardown
14
- @doc = nil
15
- end
16
-
17
- def test_create_ns
18
- node = XML::Node.new('foo')
19
- ns = XML::Namespace.new(node, 'my_namepace', 'http://www.mynamespace.com')
20
- assert_equal(ns.prefix, 'my_namepace')
21
- assert_equal(ns.href, 'http://www.mynamespace.com')
22
- end
23
-
24
- def test_create_default_ns
25
- node = XML::Node.new('foo')
26
- ns = XML::Namespace.new(node, nil, 'http://www.mynamespace.com')
27
- assert_equal(ns.prefix, nil)
28
- assert_equal(ns.href, 'http://www.mynamespace.com')
29
- end
30
-
31
- def test_create_unbound_ns
32
- error = assert_raise(TypeError) do
33
- XML::Namespace.new(nil, 'my_namepace', 'http://www.mynamespace.com')
34
- end
35
- assert_equal('wrong argument type nil (expected Data)', error.to_s)
36
- end
37
-
38
- def test_duplicate_ns
39
- node = XML::Node.new('foo')
40
- XML::Namespace.new(node, 'myname', 'http://www.mynamespace.com')
41
- assert_raises(XML::Error) do
42
- XML::Namespace.new(node, 'myname', 'http://www.mynamespace.com')
43
- end
44
- end
45
-
46
- def test_eql
47
- node = XML::Node.new('Envelope')
48
- ns = XML::Namespace.new(node, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
49
-
50
- assert(node.namespaces.namespace.eql?(node.namespaces.namespace))
51
- end
52
-
53
- def test_equal
54
- node1 = XML::Node.new('Envelope')
55
- ns1 = XML::Namespace.new(node1, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
56
-
57
- node2 = XML::Node.new('Envelope')
58
- ns2 = XML::Namespace.new(node2, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
59
-
60
- assert(ns1 == ns2)
61
- end
62
- end
@@ -1,29 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # $Id$
4
- require './test_helper'
5
-
6
- require 'test/unit'
7
-
8
- class TC_XML_Node_XLink < Test::Unit::TestCase
9
- def setup()
10
- xp = XML::Parser.string('<ruby_array xmlns:xlink="http://www.w3.org/1999/xlink/namespace/"><fixnum xlink:type="simple">one</fixnum></ruby_array>')
11
- doc = xp.parse
12
- assert_instance_of(XML::Document, doc)
13
- @root = doc.root
14
- assert_instance_of(XML::Node, @root)
15
- end
16
-
17
- def teardown()
18
- @root = nil
19
- end
20
-
21
- def test_xml_node_xlink()
22
- for elem in @root.find('fixnum')
23
- assert_instance_of(XML::Node, elem)
24
- assert_instance_of(TrueClass, elem.xlink?)
25
- assert_equal("simple", elem.xlink_type_name)
26
- assert_equal(XML::Node::XLINK_TYPE_SIMPLE, elem.xlink_type)
27
- end
28
- end
29
- end
@@ -1,381 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require './test_helper'
4
- require 'test/unit'
5
- require 'stringio'
6
-
7
- class TestParser < Test::Unit::TestCase
8
- def setup
9
- XML::Error.set_handler(&XML::Error::QUIET_HANDLER)
10
- end
11
-
12
- def teardown
13
- GC.start
14
- GC.start
15
- GC.start
16
- end
17
-
18
- # ----- Sources -------
19
- def test_document
20
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.utf-8.xml'))
21
- parser = XML::Parser.file(file)
22
- doc = parser.parse
23
-
24
- parser = XML::Parser.document(doc)
25
-
26
- doc = parser.parse
27
-
28
- assert_instance_of(XML::Document, doc)
29
- assert_instance_of(XML::Parser::Context, parser.context)
30
- end
31
-
32
- def test_nil_document
33
- error = assert_raise(TypeError) do
34
- XML::Parser.document(nil)
35
- end
36
-
37
- assert_equal("Must pass an XML::Document object", error.to_s)
38
- end
39
-
40
- def test_file
41
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
42
-
43
- parser = XML::Parser.file(file)
44
- doc = parser.parse
45
- assert_instance_of(XML::Document, doc)
46
- assert_instance_of(XML::Parser::Context, parser.context)
47
- end
48
-
49
- def test_noexistent_file
50
- error = assert_raise(XML::Error) do
51
- XML::Parser.file('i_dont_exist.xml')
52
- end
53
-
54
- assert_equal('Warning: failed to load external entity "i_dont_exist.xml".', error.to_s)
55
- end
56
-
57
- def test_nil_file
58
- error = assert_raise(TypeError) do
59
- XML::Parser.file(nil)
60
- end
61
-
62
- assert_match(/nil into String/, error.to_s)
63
- end
64
-
65
- def test_file_encoding
66
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.utf-8.xml'))
67
- parser = XML::Parser.file(file, :encoding => XML::Encoding::ISO_8859_1)
68
-
69
- error = assert_raise(XML::Error) do
70
- doc = parser.parse
71
- end
72
-
73
- assert(error.to_s.match(/Fatal error: Extra content at the end of the document/))
74
-
75
- parser = XML::Parser.file(file, :encoding => XML::Encoding::UTF_8)
76
- doc = parser.parse
77
- assert_not_nil(doc)
78
- end
79
-
80
- def test_file_base_uri
81
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.utf-8.xml'))
82
-
83
- parser = XML::Parser.file(file)
84
- doc = parser.parse
85
- assert(doc.child.base_uri.match(/test\/model\/bands.utf-8.xml/))
86
-
87
- parser = XML::Parser.file(file, :base_uri => "http://libxml.org")
88
- doc = parser.parse
89
- assert(doc.child.base_uri.match(/test\/model\/bands.utf-8.xml/))
90
- end
91
-
92
- def test_io
93
- File.open(File.join(File.dirname(__FILE__), 'model/rubynet.xml')) do |io|
94
- parser = XML::Parser.io(io)
95
- assert_instance_of(XML::Parser, parser)
96
-
97
- doc = parser.parse
98
- assert_instance_of(XML::Document, doc)
99
- assert_instance_of(XML::Parser::Context, parser.context)
100
- end
101
- end
102
-
103
- def test_io_gc
104
- # Test that the reader keeps a reference
105
- # to the io object
106
- file = File.open(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
107
- parser = XML::Parser.io(file)
108
- file = nil
109
- GC.start
110
- assert(parser.parse)
111
- end
112
-
113
- def test_nil_io
114
- error = assert_raise(TypeError) do
115
- XML::Parser.io(nil)
116
- end
117
-
118
- assert_equal("Must pass in an IO object", error.to_s)
119
- end
120
-
121
- def test_string_io
122
- data = File.read(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
123
- string_io = StringIO.new(data)
124
- parser = XML::Parser.io(string_io)
125
-
126
- doc = parser.parse
127
- assert_instance_of(XML::Document, doc)
128
- assert_instance_of(XML::Parser::Context, parser.context)
129
- end
130
-
131
- def test_string_io_thread
132
- thread = Thread.new do
133
- data = File.read(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
134
- string_io = StringIO.new(data)
135
- parser = XML::Parser.io(string_io)
136
-
137
- doc = parser.parse
138
- assert_instance_of(XML::Document, doc)
139
- assert_instance_of(XML::Parser::Context, parser.context)
140
- end
141
-
142
- thread.join
143
- assert(true)
144
- end
145
-
146
- def test_string
147
- str = '<ruby_array uga="booga" foo="bar"><fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>'
148
-
149
- parser = XML::Parser.string(str)
150
- assert_instance_of(XML::Parser, parser)
151
-
152
- doc = parser.parse
153
- assert_instance_of(XML::Document, doc)
154
- assert_instance_of(XML::Parser::Context, parser.context)
155
- end
156
-
157
- def test_nil_string
158
- error = assert_raise(TypeError) do
159
- XML::Parser.string(nil)
160
- end
161
-
162
- assert_equal("wrong argument type nil (expected String)", error.to_s)
163
- end
164
-
165
- def test_string_options
166
- xml = <<-EOS
167
- <!DOCTYPE foo [<!ENTITY foo 'bar'>]>
168
- <test>
169
- <cdata><![CDATA[something]]></cdata>
170
- <entity>&foo;</entity>
171
- </test>
172
- EOS
173
-
174
- XML::default_substitute_entities = false
175
-
176
- # Parse normally
177
- parser = XML::Parser.string(xml)
178
- doc = parser.parse
179
- assert_nil(doc.child.base_uri)
180
-
181
- # Cdata section should be cdata nodes
182
- node = doc.find_first('/test/cdata').child
183
- assert_equal(XML::Node::CDATA_SECTION_NODE, node.node_type)
184
-
185
- # Entities should not be subtituted
186
- node = doc.find_first('/test/entity')
187
- assert_equal('&foo;', node.child.to_s)
188
-
189
- # Parse with options
190
- parser = XML::Parser.string(xml, :base_uri => 'http://libxml.rubyforge.org',
191
- :options => XML::Parser::Options::NOCDATA | XML::Parser::Options::NOENT)
192
- doc = parser.parse
193
- assert_equal(doc.child.base_uri, 'http://libxml.rubyforge.org')
194
-
195
- # Cdata section should be text nodes
196
- node = doc.find_first('/test/cdata').child
197
- assert_equal(XML::Node::TEXT_NODE, node.node_type)
198
-
199
- # Entities should be subtituted
200
- node = doc.find_first('/test/entity')
201
- assert_equal('bar', node.child.to_s)
202
- end
203
-
204
- def test_string_encoding
205
- # ISO_8859_1:
206
- # ö - f6 in hex, \366 in octal
207
- # ü - fc in hex, \374 in octal
208
-
209
- xml = <<-EOS
210
- <bands>
211
- <metal>m\366tley_cr\374e</metal>
212
- </bands>
213
- EOS
214
-
215
- # Parse as UTF_8
216
- parser = XML::Parser.string(xml, :encoding => XML::Encoding::UTF_8)
217
-
218
- error = assert_raise(XML::Error) do
219
- doc = parser.parse
220
- end
221
-
222
- assert_equal("Fatal error: Input is not proper UTF-8, indicate encoding !\nBytes: 0xF6 0x74 0x6C 0x65 at :2.",
223
- error.to_s)
224
-
225
- # Parse as ISO_8859_1:
226
- parser = XML::Parser.string(xml, :encoding => XML::Encoding::ISO_8859_1)
227
- doc = parser.parse
228
- node = doc.find_first('//metal')
229
- if defined?(Encoding)
230
- assert_equal(Encoding::UTF_8, node.content.encoding)
231
- assert_equal("m\303\266tley_cr\303\274e", node.content)
232
- else
233
- assert_equal("m\303\266tley_cr\303\274e", node.content)
234
- end
235
- end
236
-
237
- def test_fd_gc
238
- # Test opening # of documents up to the file limit for the OS.
239
- # Ideally it should run until libxml emits a warning,
240
- # thereby knowing we've done a GC sweep. For the time being,
241
- # re-open the same doc `limit descriptors` times.
242
- # If we make it to the end, then we've succeeded,
243
- # otherwise an exception will be thrown.
244
- XML::Error.set_handler {|error|}
245
-
246
- max_fd = if RUBY_PLATFORM.match(/mswin32|mingw/i)
247
- 500
248
- else
249
- (`ulimit -n`.chomp.to_i) + 1
250
- end
251
-
252
- file = File.join(File.dirname(__FILE__), 'model/rubynet.xml')
253
- max_fd.times do
254
- XML::Parser.file(file).parse
255
- end
256
- XML::Error.reset_handler {|error|}
257
- end
258
-
259
- def test_open_many_files
260
- 1000.times do
261
- doc = XML::Parser.file('model/atom.xml').parse
262
- end
263
- end
264
-
265
- # ----- Errors ------
266
- def test_error
267
- error = assert_raise(XML::Error) do
268
- XML::Parser.string('<foo><bar/></foz>').parse
269
- end
270
-
271
- assert_not_nil(error)
272
- assert_kind_of(XML::Error, error)
273
- assert_equal("Fatal error: Opening and ending tag mismatch: foo line 1 and foz at :1.", error.message)
274
- assert_equal(XML::Error::PARSER, error.domain)
275
- assert_equal(XML::Error::TAG_NAME_MISMATCH, error.code)
276
- assert_equal(XML::Error::FATAL, error.level)
277
- assert_nil(error.file)
278
- assert_equal(1, error.line)
279
- assert_equal('foo', error.str1)
280
- assert_equal('foz', error.str2)
281
- assert_nil(error.str3)
282
- assert_equal(1, error.int1)
283
- assert_equal(20, error.int2)
284
- assert_nil(error.node)
285
- end
286
-
287
- def test_bad_xml
288
- parser = XML::Parser.string('<ruby_array uga="booga" foo="bar"<fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>')
289
- error = assert_raise(XML::Error) do
290
- assert_not_nil(parser.parse)
291
- end
292
-
293
- assert_not_nil(error)
294
- assert_kind_of(XML::Error, error)
295
- assert_equal("Fatal error: Extra content at the end of the document at :1.", error.message)
296
- assert_equal(XML::Error::PARSER, error.domain)
297
- assert_equal(XML::Error::DOCUMENT_END, error.code)
298
- assert_equal(XML::Error::FATAL, error.level)
299
- assert_nil(error.file)
300
- assert_equal(1, error.line)
301
- assert_nil(error.str1)
302
- assert_nil(error.str2)
303
- assert_nil(error.str3)
304
- assert_equal(0, error.int1)
305
- assert_equal(20, error.int2)
306
- assert_nil(error.node)
307
- end
308
-
309
- # Deprecated methods
310
- def test_document_deprecated
311
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.utf-8.xml'))
312
- parser = XML::Parser.file(file)
313
- doc = parser.parse
314
-
315
- parser = XML::Parser.new
316
- parser.document = doc
317
- doc = parser.parse
318
-
319
- assert_instance_of(XML::Document, doc)
320
- assert_instance_of(XML::Parser::Context, parser.context)
321
- end
322
-
323
- def test_file_deprecated
324
- file = File.expand_path(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
325
-
326
- parser = XML::Parser.new
327
- parser.file = file
328
- doc = parser.parse
329
- assert_instance_of(XML::Document, doc)
330
- assert_instance_of(XML::Parser::Context, parser.context)
331
- end
332
-
333
- def test_io_deprecated
334
- File.open(File.join(File.dirname(__FILE__), 'model/rubynet.xml')) do |io|
335
- parser = XML::Parser.new
336
- assert_instance_of(XML::Parser, parser)
337
- parser.io = io
338
-
339
- doc = parser.parse
340
- assert_instance_of(XML::Document, doc)
341
- assert_instance_of(XML::Parser::Context, parser.context)
342
- end
343
- end
344
-
345
- def test_string_deprecated
346
- str = '<ruby_array uga="booga" foo="bar"><fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>'
347
-
348
- parser = XML::Parser.new
349
- parser.string = str
350
- assert_instance_of(XML::Parser, parser)
351
-
352
- doc = parser.parse
353
- assert_instance_of(XML::Document, doc)
354
- assert_instance_of(XML::Parser::Context, parser.context)
355
- end
356
-
357
- def test_errors_from_background_thread
358
- errors = []
359
- background_errors = []
360
-
361
- begin
362
- XML::Error.set_handler do |error|
363
- errors << error
364
- end
365
- parser = XML::Parser.string("<moo>")
366
-
367
- thread = Thread.new do
368
- XML::Error.set_handler do |error|
369
- background_errors << error
370
- end
371
- parser.parse rescue nil
372
- end
373
- thread.join
374
- ensure
375
- XML::Error.set_handler(&XML::Error::QUIET_HANDLER)
376
- end
377
-
378
- assert_equal(errors.size, 0)
379
- assert_equal(background_errors.size, 1)
380
- end
381
- end