libxml-ruby 3.2.2-x64-mingw-ucrt

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 (205) hide show
  1. checksums.yaml +7 -0
  2. data/HISTORY +848 -0
  3. data/LICENSE +21 -0
  4. data/MANIFEST +166 -0
  5. data/README.rdoc +217 -0
  6. data/Rakefile +99 -0
  7. data/ext/libxml/extconf.rb +61 -0
  8. data/ext/libxml/libxml.c +80 -0
  9. data/ext/libxml/libxml_ruby.def +35 -0
  10. data/ext/libxml/ruby_libxml.h +67 -0
  11. data/ext/libxml/ruby_xml.c +933 -0
  12. data/ext/libxml/ruby_xml.h +10 -0
  13. data/ext/libxml/ruby_xml_attr.c +333 -0
  14. data/ext/libxml/ruby_xml_attr.h +12 -0
  15. data/ext/libxml/ruby_xml_attr_decl.c +153 -0
  16. data/ext/libxml/ruby_xml_attr_decl.h +11 -0
  17. data/ext/libxml/ruby_xml_attributes.c +275 -0
  18. data/ext/libxml/ruby_xml_attributes.h +15 -0
  19. data/ext/libxml/ruby_xml_cbg.c +85 -0
  20. data/ext/libxml/ruby_xml_document.c +1123 -0
  21. data/ext/libxml/ruby_xml_document.h +11 -0
  22. data/ext/libxml/ruby_xml_dtd.c +248 -0
  23. data/ext/libxml/ruby_xml_dtd.h +9 -0
  24. data/ext/libxml/ruby_xml_encoding.c +250 -0
  25. data/ext/libxml/ruby_xml_encoding.h +16 -0
  26. data/ext/libxml/ruby_xml_error.c +996 -0
  27. data/ext/libxml/ruby_xml_error.h +12 -0
  28. data/ext/libxml/ruby_xml_html_parser.c +89 -0
  29. data/ext/libxml/ruby_xml_html_parser.h +10 -0
  30. data/ext/libxml/ruby_xml_html_parser_context.c +337 -0
  31. data/ext/libxml/ruby_xml_html_parser_context.h +10 -0
  32. data/ext/libxml/ruby_xml_html_parser_options.c +46 -0
  33. data/ext/libxml/ruby_xml_html_parser_options.h +10 -0
  34. data/ext/libxml/ruby_xml_input_cbg.c +191 -0
  35. data/ext/libxml/ruby_xml_input_cbg.h +20 -0
  36. data/ext/libxml/ruby_xml_io.c +47 -0
  37. data/ext/libxml/ruby_xml_io.h +10 -0
  38. data/ext/libxml/ruby_xml_namespace.c +153 -0
  39. data/ext/libxml/ruby_xml_namespace.h +10 -0
  40. data/ext/libxml/ruby_xml_namespaces.c +293 -0
  41. data/ext/libxml/ruby_xml_namespaces.h +9 -0
  42. data/ext/libxml/ruby_xml_node.c +1402 -0
  43. data/ext/libxml/ruby_xml_node.h +13 -0
  44. data/ext/libxml/ruby_xml_parser.c +91 -0
  45. data/ext/libxml/ruby_xml_parser.h +12 -0
  46. data/ext/libxml/ruby_xml_parser_context.c +999 -0
  47. data/ext/libxml/ruby_xml_parser_context.h +10 -0
  48. data/ext/libxml/ruby_xml_parser_options.c +66 -0
  49. data/ext/libxml/ruby_xml_parser_options.h +12 -0
  50. data/ext/libxml/ruby_xml_reader.c +1239 -0
  51. data/ext/libxml/ruby_xml_reader.h +17 -0
  52. data/ext/libxml/ruby_xml_relaxng.c +110 -0
  53. data/ext/libxml/ruby_xml_relaxng.h +10 -0
  54. data/ext/libxml/ruby_xml_sax2_handler.c +326 -0
  55. data/ext/libxml/ruby_xml_sax2_handler.h +10 -0
  56. data/ext/libxml/ruby_xml_sax_parser.c +116 -0
  57. data/ext/libxml/ruby_xml_sax_parser.h +10 -0
  58. data/ext/libxml/ruby_xml_schema.c +278 -0
  59. data/ext/libxml/ruby_xml_schema.h +809 -0
  60. data/ext/libxml/ruby_xml_schema_attribute.c +109 -0
  61. data/ext/libxml/ruby_xml_schema_attribute.h +15 -0
  62. data/ext/libxml/ruby_xml_schema_element.c +95 -0
  63. data/ext/libxml/ruby_xml_schema_element.h +14 -0
  64. data/ext/libxml/ruby_xml_schema_facet.c +52 -0
  65. data/ext/libxml/ruby_xml_schema_facet.h +13 -0
  66. data/ext/libxml/ruby_xml_schema_type.c +232 -0
  67. data/ext/libxml/ruby_xml_schema_type.h +9 -0
  68. data/ext/libxml/ruby_xml_version.h +9 -0
  69. data/ext/libxml/ruby_xml_writer.c +1133 -0
  70. data/ext/libxml/ruby_xml_writer.h +10 -0
  71. data/ext/libxml/ruby_xml_xinclude.c +16 -0
  72. data/ext/libxml/ruby_xml_xinclude.h +11 -0
  73. data/ext/libxml/ruby_xml_xpath.c +194 -0
  74. data/ext/libxml/ruby_xml_xpath.h +13 -0
  75. data/ext/libxml/ruby_xml_xpath_context.c +360 -0
  76. data/ext/libxml/ruby_xml_xpath_context.h +9 -0
  77. data/ext/libxml/ruby_xml_xpath_expression.c +81 -0
  78. data/ext/libxml/ruby_xml_xpath_expression.h +10 -0
  79. data/ext/libxml/ruby_xml_xpath_object.c +338 -0
  80. data/ext/libxml/ruby_xml_xpath_object.h +17 -0
  81. data/ext/libxml/ruby_xml_xpointer.c +99 -0
  82. data/ext/libxml/ruby_xml_xpointer.h +11 -0
  83. data/ext/vc/libxml_ruby.sln +28 -0
  84. data/lib/3.1/libxml_ruby.so +0 -0
  85. data/lib/libxml/attr.rb +123 -0
  86. data/lib/libxml/attr_decl.rb +80 -0
  87. data/lib/libxml/attributes.rb +14 -0
  88. data/lib/libxml/document.rb +194 -0
  89. data/lib/libxml/error.rb +95 -0
  90. data/lib/libxml/hpricot.rb +78 -0
  91. data/lib/libxml/html_parser.rb +96 -0
  92. data/lib/libxml/namespace.rb +62 -0
  93. data/lib/libxml/namespaces.rb +38 -0
  94. data/lib/libxml/node.rb +323 -0
  95. data/lib/libxml/parser.rb +101 -0
  96. data/lib/libxml/sax_callbacks.rb +180 -0
  97. data/lib/libxml/sax_parser.rb +41 -0
  98. data/lib/libxml/schema/attribute.rb +19 -0
  99. data/lib/libxml/schema/element.rb +19 -0
  100. data/lib/libxml/schema/type.rb +21 -0
  101. data/lib/libxml/schema.rb +48 -0
  102. data/lib/libxml/tree.rb +29 -0
  103. data/lib/libxml-ruby.rb +30 -0
  104. data/lib/libxml.rb +5 -0
  105. data/lib/xml/libxml.rb +10 -0
  106. data/lib/xml.rb +14 -0
  107. data/libxml-ruby.gemspec +48 -0
  108. data/script/benchmark/depixelate +634 -0
  109. data/script/benchmark/hamlet.xml +9055 -0
  110. data/script/benchmark/parsecount +170 -0
  111. data/script/benchmark/sock_entries.xml +507 -0
  112. data/script/benchmark/throughput +41 -0
  113. data/script/test +6 -0
  114. data/setup.rb +1584 -0
  115. data/test/c14n/given/doc.dtd +1 -0
  116. data/test/c14n/given/example-1.xml +14 -0
  117. data/test/c14n/given/example-2.xml +11 -0
  118. data/test/c14n/given/example-3.xml +18 -0
  119. data/test/c14n/given/example-4.xml +9 -0
  120. data/test/c14n/given/example-5.xml +12 -0
  121. data/test/c14n/given/example-6.xml +2 -0
  122. data/test/c14n/given/example-7.xml +11 -0
  123. data/test/c14n/given/example-8.xml +11 -0
  124. data/test/c14n/given/example-8.xpath +10 -0
  125. data/test/c14n/given/world.txt +1 -0
  126. data/test/c14n/result/1-1-without-comments/example-1 +4 -0
  127. data/test/c14n/result/1-1-without-comments/example-2 +11 -0
  128. data/test/c14n/result/1-1-without-comments/example-3 +14 -0
  129. data/test/c14n/result/1-1-without-comments/example-4 +9 -0
  130. data/test/c14n/result/1-1-without-comments/example-5 +3 -0
  131. data/test/c14n/result/1-1-without-comments/example-6 +1 -0
  132. data/test/c14n/result/1-1-without-comments/example-7 +1 -0
  133. data/test/c14n/result/1-1-without-comments/example-8 +1 -0
  134. data/test/c14n/result/with-comments/example-1 +6 -0
  135. data/test/c14n/result/with-comments/example-2 +11 -0
  136. data/test/c14n/result/with-comments/example-3 +14 -0
  137. data/test/c14n/result/with-comments/example-4 +9 -0
  138. data/test/c14n/result/with-comments/example-5 +4 -0
  139. data/test/c14n/result/with-comments/example-6 +1 -0
  140. data/test/c14n/result/with-comments/example-7 +1 -0
  141. data/test/c14n/result/without-comments/example-1 +4 -0
  142. data/test/c14n/result/without-comments/example-2 +11 -0
  143. data/test/c14n/result/without-comments/example-3 +14 -0
  144. data/test/c14n/result/without-comments/example-4 +9 -0
  145. data/test/c14n/result/without-comments/example-5 +3 -0
  146. data/test/c14n/result/without-comments/example-6 +1 -0
  147. data/test/c14n/result/without-comments/example-7 +1 -0
  148. data/test/model/atom.xml +13 -0
  149. data/test/model/bands.iso-8859-1.xml +5 -0
  150. data/test/model/bands.utf-8.xml +5 -0
  151. data/test/model/bands.xml +5 -0
  152. data/test/model/books.xml +154 -0
  153. data/test/model/cwm_1_0.xml +11336 -0
  154. data/test/model/merge_bug_data.xml +58 -0
  155. data/test/model/ruby-lang.html +238 -0
  156. data/test/model/rubynet.xml +79 -0
  157. data/test/model/rubynet_project +1 -0
  158. data/test/model/shiporder.rnc +28 -0
  159. data/test/model/shiporder.rng +86 -0
  160. data/test/model/shiporder.xml +23 -0
  161. data/test/model/shiporder.xsd +40 -0
  162. data/test/model/soap.xml +27 -0
  163. data/test/model/xinclude.xml +5 -0
  164. data/test/test_attr.rb +181 -0
  165. data/test/test_attr_decl.rb +132 -0
  166. data/test/test_attributes.rb +136 -0
  167. data/test/test_canonicalize.rb +120 -0
  168. data/test/test_deprecated_require.rb +12 -0
  169. data/test/test_document.rb +132 -0
  170. data/test/test_document_write.rb +146 -0
  171. data/test/test_dtd.rb +129 -0
  172. data/test/test_encoding.rb +129 -0
  173. data/test/test_encoding_sax.rb +115 -0
  174. data/test/test_error.rb +178 -0
  175. data/test/test_helper.rb +9 -0
  176. data/test/test_html_parser.rb +162 -0
  177. data/test/test_html_parser_context.rb +23 -0
  178. data/test/test_namespace.rb +60 -0
  179. data/test/test_namespaces.rb +200 -0
  180. data/test/test_node.rb +237 -0
  181. data/test/test_node_cdata.rb +50 -0
  182. data/test/test_node_comment.rb +32 -0
  183. data/test/test_node_copy.rb +40 -0
  184. data/test/test_node_edit.rb +158 -0
  185. data/test/test_node_pi.rb +37 -0
  186. data/test/test_node_text.rb +69 -0
  187. data/test/test_node_write.rb +97 -0
  188. data/test/test_node_xlink.rb +28 -0
  189. data/test/test_parser.rb +324 -0
  190. data/test/test_parser_context.rb +198 -0
  191. data/test/test_properties.rb +38 -0
  192. data/test/test_reader.rb +364 -0
  193. data/test/test_relaxng.rb +53 -0
  194. data/test/test_sax_parser.rb +326 -0
  195. data/test/test_schema.rb +168 -0
  196. data/test/test_suite.rb +48 -0
  197. data/test/test_traversal.rb +152 -0
  198. data/test/test_writer.rb +468 -0
  199. data/test/test_xinclude.rb +20 -0
  200. data/test/test_xml.rb +263 -0
  201. data/test/test_xpath.rb +244 -0
  202. data/test/test_xpath_context.rb +88 -0
  203. data/test/test_xpath_expression.rb +37 -0
  204. data/test/test_xpointer.rb +72 -0
  205. metadata +325 -0
@@ -0,0 +1,132 @@
1
+ # encoding: UTF-8
2
+ require_relative './test_helper'
3
+
4
+ class TestDocument < Minitest::Test
5
+ def setup
6
+ xp = LibXML::XML::Parser.string('<ruby_array uga="booga" foo="bar"><fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>')
7
+ assert_instance_of(LibXML::XML::Parser, xp)
8
+ @doc = xp.parse
9
+ assert_instance_of(LibXML::XML::Document, @doc)
10
+ end
11
+
12
+ def teardown
13
+ @doc = nil
14
+ end
15
+
16
+ def test_klass
17
+ assert_instance_of(LibXML::XML::Document, @doc)
18
+ end
19
+
20
+ def test_context
21
+ context = @doc.context
22
+ assert_instance_of(LibXML::XML::XPath::Context, context)
23
+ end
24
+
25
+ def test_find
26
+ set = @doc.find('/ruby_array/fixnum')
27
+ assert_instance_of(LibXML::XML::XPath::Object, set)
28
+ assert_raises(NoMethodError) {
29
+ set.xpath
30
+ }
31
+ end
32
+
33
+ def test_compression
34
+ if LibXML::XML.enabled_zlib?
35
+ 0.upto(9) do |i|
36
+ assert_equal(i, @doc.compression = i)
37
+ assert_equal(i, @doc.compression)
38
+ end
39
+
40
+ 9.downto(0) do |i|
41
+ assert_equal(i, @doc.compression = i)
42
+ assert_equal(i, @doc.compression)
43
+ end
44
+
45
+ 10.upto(20) do |i|
46
+ # assert_equal(9, @doc.compression = i)
47
+ assert_equal(i, @doc.compression = i) # This works around a bug in Ruby 1.8
48
+ assert_equal(9, @doc.compression)
49
+ end
50
+
51
+ -1.downto(-10) do |i|
52
+ # assert_equal(0, @doc.compression = i)
53
+ assert_equal(i, @doc.compression = i) # FIXME This bug should get fixed ASAP
54
+ assert_equal(0, @doc.compression)
55
+ end
56
+ end
57
+ end
58
+
59
+ def test_version
60
+ assert_equal('1.0', @doc.version)
61
+
62
+ doc = LibXML::XML::Document.new('6.9')
63
+ assert_equal('6.9', doc.version)
64
+ end
65
+
66
+ def test_write_root
67
+ @doc.root = LibXML::XML::Node.new('rubynet')
68
+ assert_instance_of(LibXML::XML::Node, @doc.root)
69
+ assert_instance_of(LibXML::XML::Document, @doc.root.doc)
70
+ assert_equal("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rubynet/>\n",
71
+ @doc.to_s(:indent => false))
72
+ end
73
+
74
+ def test_doc_node_type
75
+ assert_equal(LibXML::XML::Node::DOCUMENT_NODE, LibXML::XML::Document.new.node_type)
76
+ end
77
+
78
+ def test_doc_node_type_name
79
+ assert_equal('document_xml', LibXML::XML::Document.new.node_type_name)
80
+ end
81
+
82
+ def test_xhtml
83
+ doc = LibXML::XML::Document.new
84
+ assert(!doc.xhtml?)
85
+ LibXML::XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", nil, doc, true
86
+ assert(doc.xhtml?)
87
+ end
88
+
89
+ def test_document_root
90
+ doc1 = LibXML::XML::Document.string("<one/>")
91
+ doc2 = LibXML::XML::Document.string("<two/>")
92
+
93
+ error = assert_raises(LibXML::XML::Error) do
94
+ doc1.root = doc2.root
95
+ end
96
+ assert_equal(" Nodes belong to different documents. You must first import the node by calling LibXML::XML::Document.import.",
97
+ error.to_s)
98
+
99
+ doc2.root << doc2.import(doc1.root)
100
+ assert_equal('<one/>', doc1.root.to_s)
101
+ assert_equal('<two><one/></two>', doc2.root.to_s(:indent => false))
102
+
103
+ assert(!doc1.root.equal?(doc2.root))
104
+ assert(doc1.root.doc != doc2.root.doc)
105
+ end
106
+
107
+ def test_import_node
108
+ doc1 = LibXML::XML::Parser.string('<nums><one></one></nums>').parse
109
+ doc2 = LibXML::XML::Parser.string('<nums><two></two></nums>').parse
110
+
111
+ node = doc1.root.child
112
+
113
+ error = assert_raises(LibXML::XML::Error) do
114
+ doc2.root << node
115
+ end
116
+
117
+ assert_equal(" Nodes belong to different documents. You must first import the node by calling LibXML::XML::Document.import.",
118
+ error.to_s)
119
+
120
+ doc2.root << doc2.import(node)
121
+
122
+ assert_equal("<nums><two/><one/></nums>",
123
+ doc2.root.to_s(:indent => false))
124
+ end
125
+
126
+ def test_nonet
127
+ xml_string = '<ruby_array uga="booga" foo="bar"><fixnum>one</fixnum><fixnum>two</fixnum></ruby_array>'
128
+ xml = LibXML::XML::Document.string(xml_string, options: LibXML::XML::Parser::Options::NONET)
129
+ file = File.join(File.dirname(__FILE__), 'model/atom.xml')
130
+ schema_document = LibXML::XML::Document.file(file, options: LibXML::XML::Parser::Options::NONET)
131
+ end
132
+ end
@@ -0,0 +1,146 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+ require 'tmpdir'
5
+
6
+ class TestDocumentWrite < Minitest::Test
7
+ def setup
8
+ @file_name = "model/bands.utf-8.xml"
9
+
10
+ # Strip spaces to make testing easier
11
+ LibXML::XML.default_keep_blanks = false
12
+ file = File.join(File.dirname(__FILE__), @file_name)
13
+ @doc = LibXML::XML::Document.file(file)
14
+ end
15
+
16
+ def teardown
17
+ LibXML::XML.default_keep_blanks = true
18
+ @doc = nil
19
+ end
20
+
21
+ # --- to_s tests ---
22
+ def test_to_s_default
23
+ # Default to_s has indentation
24
+ assert_equal("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bands genre=\"metal\">\n <m\u00F6tley_cr\u00FCe country=\"us\">M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\u00F6tley_cr\u00FCe>\n <iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden>\n</bands>\n",
25
+ @doc.to_s)
26
+ end
27
+
28
+ def test_to_s_no_global_indentation
29
+ # No indentation due to global setting
30
+ LibXML::XML.indent_tree_output = false
31
+ value = @doc.to_s
32
+
33
+ assert_equal(Encoding::UTF_8, value.encoding)
34
+ assert_equal("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bands genre=\"metal\">\n<m\u00F6tley_cr\u00FCe country=\"us\">M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\u00F6tley_cr\u00FCe>\n<iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden>\n</bands>\n",
35
+ value)
36
+ ensure
37
+ LibXML::XML.indent_tree_output = true
38
+ end
39
+
40
+ def test_to_s_no_indentation
41
+ # No indentation due to local setting
42
+ value = @doc.to_s(:indent => false)
43
+ assert_equal(Encoding::UTF_8, value.encoding)
44
+ assert_equal("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bands genre=\"metal\"><m\u00F6tley_cr\u00FCe country=\"us\">M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\u00F6tley_cr\u00FCe><iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden></bands>\n",
45
+ value)
46
+ end
47
+
48
+ def test_to_s_encoding
49
+ # Test encodings
50
+
51
+ # UTF8:
52
+ # ö - c3 b6 in hex, \303\266 in octal
53
+ # ü - c3 bc in hex, \303\274 in octal
54
+ value = @doc.to_s(:encoding => LibXML::XML::Encoding::UTF_8)
55
+ assert_equal(Encoding::UTF_8, value.encoding)
56
+ assert_equal("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bands genre=\"metal\">\n <m\u00F6tley_cr\u00FCe country=\"us\">M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\u00F6tley_cr\u00FCe>\n <iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden>\n</bands>\n",
57
+ value)
58
+
59
+ # ISO_8859_1:
60
+ # ö - f6 in hex, \366 in octal
61
+ # ü - fc in hex, \374 in octal
62
+ value = @doc.to_s(:encoding => LibXML::XML::Encoding::ISO_8859_1)
63
+ assert_equal(Encoding::ISO8859_1, value.encoding)
64
+ assert_equal("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<bands genre=\"metal\">\n <m\xF6tley_cr\xFCe country=\"us\">M\xF6tley Cr\xFCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\xF6tley_cr\xFCe>\n <iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden>\n</bands>\n".force_encoding(Encoding::ISO8859_1),
65
+ @doc.to_s(:encoding => LibXML::XML::Encoding::ISO_8859_1))
66
+
67
+ # Invalid encoding
68
+ error = assert_raises(ArgumentError) do
69
+ @doc.to_s(:encoding => -9999)
70
+ end
71
+ assert_equal('Unknown encoding value: -9999', error.to_s)
72
+ end
73
+
74
+ # --- save tests -----
75
+ def test_save_utf8
76
+ temp_filename = File.join(Dir.tmpdir, "tc_document_write_test_save_utf8.xml")
77
+
78
+ bytes = @doc.save(temp_filename)
79
+ assert_equal(305, bytes)
80
+
81
+ contents = File.read(temp_filename, nil, nil, :encoding => Encoding::UTF_8)
82
+ assert_equal(Encoding::UTF_8, contents.encoding)
83
+ assert_equal("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<bands genre=\"metal\">\n <m\u00F6tley_cr\u00FCe country=\"us\">M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\u00F6tley_cr\u00FCe>\n <iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden>\n</bands>\n",
84
+ contents)
85
+ ensure
86
+ File.delete(temp_filename)
87
+ end
88
+
89
+ def test_save_utf8_no_indents
90
+ temp_filename = File.join(Dir.tmpdir, "tc_document_write_test_save_utf8_no_indents.xml")
91
+
92
+ bytes = @doc.save(temp_filename, :indent => false)
93
+ assert_equal(298, bytes)
94
+
95
+ contents = File.read(temp_filename, nil, nil, :encoding => Encoding::UTF_8)
96
+ assert_equal("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<bands genre=\"metal\"><m\u00F6tley_cr\u00FCe country=\"us\">M\u00F6tley Cr\u00FCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\u00F6tley_cr\u00FCe><iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden></bands>\n",
97
+ contents)
98
+ ensure
99
+ File.delete(temp_filename)
100
+ end
101
+
102
+ def test_save_iso_8859_1
103
+ temp_filename = File.join(Dir.tmpdir, "tc_document_write_test_save_iso_8859_1.xml")
104
+ bytes = @doc.save(temp_filename, :encoding => LibXML::XML::Encoding::ISO_8859_1)
105
+ assert_equal(304, bytes)
106
+
107
+ contents = File.read(temp_filename, nil, nil, :encoding => Encoding::ISO8859_1)
108
+ assert_equal(Encoding::ISO8859_1, contents.encoding)
109
+ assert_equal("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<bands genre=\"metal\">\n <m\xF6tley_cr\xFCe country=\"us\">M\xF6tley Cr\xFCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\xF6tley_cr\xFCe>\n <iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden>\n</bands>\n".force_encoding(Encoding::ISO8859_1),
110
+ contents)
111
+ ensure
112
+ File.delete(temp_filename)
113
+ end
114
+
115
+ def test_save_iso_8859_1_no_indent
116
+ temp_filename = File.join(Dir.tmpdir, "tc_document_write_test_save_iso_8859_1_no_indent.xml")
117
+ bytes = @doc.save(temp_filename, :indent => false, :encoding => LibXML::XML::Encoding::ISO_8859_1)
118
+ assert_equal(297, bytes)
119
+
120
+ contents = File.read(temp_filename, nil, nil, :encoding => Encoding::ISO8859_1)
121
+ assert_equal(Encoding::ISO8859_1, contents.encoding)
122
+ assert_equal("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<bands genre=\"metal\"><m\xF6tley_cr\xFCe country=\"us\">M\xF6tley Cr\xFCe is an American heavy metal band formed in Los Angeles, California in 1981.</m\xF6tley_cr\xFCe><iron_maiden country=\"uk\">Iron Maiden is a British heavy metal band formed in 1975.</iron_maiden></bands>\n".force_encoding(Encoding::ISO8859_1),
123
+ contents)
124
+ ensure
125
+ File.delete(temp_filename)
126
+ end
127
+
128
+ def test_thread_set_root
129
+ # Previously a segmentation fault occurred when running libxml in
130
+ # background threads.
131
+ thread = Thread.new do
132
+ 100000.times do |i|
133
+ document = LibXML::XML::Document.new
134
+ node = LibXML::XML::Node.new('test')
135
+ document.root = node
136
+ end
137
+ end
138
+ thread.join
139
+ assert(true)
140
+ end
141
+
142
+ # --- Debug ---
143
+ def test_debug
144
+ assert(@doc.debug)
145
+ end
146
+ end
data/test/test_dtd.rb ADDED
@@ -0,0 +1,129 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './test_helper'
4
+
5
+
6
+ class TestDtd < Minitest::Test
7
+ def setup
8
+ xp = LibXML::XML::Parser.string(<<-EOS)
9
+ <root>
10
+ <head a="ee" id="1">Colorado</head>
11
+ <descr>Lots of nice mountains</descr>
12
+ </root>
13
+ EOS
14
+ @doc = xp.parse
15
+ end
16
+
17
+ def teardown
18
+ @doc = nil
19
+ end
20
+
21
+ def dtd
22
+ LibXML::XML::Dtd.new(<<-EOS)
23
+ <!ELEMENT root (head, descr)>
24
+ <!ELEMENT head (#PCDATA)>
25
+ <!ATTLIST head
26
+ id NMTOKEN #REQUIRED
27
+ a CDATA #IMPLIED
28
+ >
29
+ <!ELEMENT descr (#PCDATA)>
30
+ EOS
31
+ end
32
+
33
+ def test_internal_subset
34
+ xhtml_dtd = LibXML::XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", nil, nil, true
35
+ assert xhtml_dtd.name.nil?
36
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
37
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
38
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
39
+
40
+ xhtml_dtd = LibXML::XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", "xhtml1", nil, true
41
+ assert_equal "xhtml1", xhtml_dtd.name
42
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
43
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
44
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
45
+ end
46
+
47
+ def test_external_subset
48
+ xhtml_dtd = LibXML::XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", nil
49
+ assert xhtml_dtd.name.nil?
50
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
51
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
52
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
53
+
54
+ xhtml_dtd = LibXML::XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", "xhtml1"
55
+ assert_equal "xhtml1", xhtml_dtd.name
56
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
57
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
58
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
59
+ end
60
+
61
+ def test_valid
62
+ assert(@doc.validate(dtd))
63
+ end
64
+
65
+ def test_node_type
66
+ assert_equal(LibXML::XML::Node::DTD_NODE, dtd.node_type)
67
+ end
68
+
69
+ def test_invalid
70
+ new_node = LibXML::XML::Node.new('invalid', 'this will mess up validation')
71
+ @doc.root << new_node
72
+
73
+ error = assert_raises(LibXML::XML::Error) do
74
+ @doc.validate(dtd)
75
+ end
76
+
77
+ # Check the error worked
78
+ refute_nil(error)
79
+ assert_kind_of(LibXML::XML::Error, error)
80
+ assert_equal("Error: No declaration for element invalid.", error.message)
81
+ assert_equal(LibXML::XML::Error::VALID, error.domain)
82
+ assert_equal(LibXML::XML::Error::DTD_UNKNOWN_ELEM, error.code)
83
+ assert_equal(LibXML::XML::Error::ERROR, error.level)
84
+ assert_nil(error.file)
85
+ assert_nil(error.line)
86
+ assert_equal('invalid', error.str1)
87
+ # Different answers across operating systems
88
+ # assert_nil(error.str2)
89
+ assert_nil(error.str3)
90
+ assert_equal(0, error.int1)
91
+ assert_equal(0, error.int2)
92
+ refute_nil(error.node)
93
+ assert_equal('invalid', error.node.name)
94
+ end
95
+
96
+ def test_external_dtd
97
+ xml = <<-EOS
98
+ <!DOCTYPE test PUBLIC "-//TEST" "test.dtd" []>
99
+ <test>
100
+ <title>T1</title>
101
+ </test>
102
+ EOS
103
+
104
+ errors = Array.new
105
+ LibXML::XML::Error.set_handler do |error|
106
+ errors << error
107
+ end
108
+
109
+ LibXML::XML.default_load_external_dtd = false
110
+ LibXML::XML::Parser.string(xml).parse
111
+ assert_equal(0, errors.length)
112
+
113
+ errors.clear
114
+ LibXML::XML.default_load_external_dtd = true
115
+ LibXML::XML::Parser.string(xml).parse
116
+ assert_equal(1, errors.length)
117
+ assert_equal("Warning: failed to load external entity \"test.dtd\" at :1.",
118
+ errors[0].to_s)
119
+
120
+ errors = Array.new
121
+ LibXML::XML::Parser.string(xml, :options => LibXML::XML::Parser::Options::DTDLOAD).parse
122
+ assert_equal(1, errors.length)
123
+ assert_equal("Warning: failed to load external entity \"test.dtd\" at :1.",
124
+ errors[0].to_s)
125
+ ensure
126
+ LibXML::XML.default_load_external_dtd = false
127
+ LibXML::XML::Error.reset_handler
128
+ end
129
+ end
@@ -0,0 +1,129 @@
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
@@ -0,0 +1,115 @@
1
+ # encoding: UTF-8
2
+ require_relative './test_helper'
3
+
4
+ class SaxEncodingCallbacks
5
+ attr_reader :encoding
6
+ attr_accessor :assertions
7
+ include Minitest::Assertions
8
+
9
+ def initialize
10
+ @assertions = 0
11
+ @encoding = Encoding::UTF_8
12
+ end
13
+
14
+ # Called for a CDATA block event.
15
+ def on_cdata_block(cdata)
16
+ assert_equal(self.encoding, cdata.encoding)
17
+ end
18
+
19
+ # Called for a characters event.
20
+ def on_characters(chars)
21
+ assert_equal(self.encoding, chars.encoding)
22
+ end
23
+
24
+ # Called for a comment event.
25
+ def on_comment(msg)
26
+ assert_equal(self.encoding, msg.encoding)
27
+ end
28
+
29
+ # Called for a end document event.
30
+ def on_end_document
31
+ end
32
+
33
+ # Called for a end element event.
34
+ def on_end_element_ns(name, prefix, uri)
35
+ assert_equal(self.encoding, name.encoding)
36
+ assert_equal(self.encoding, prefix.encoding) if prefix
37
+ assert_equal(self.encoding, uri.encoding) if uri
38
+ end
39
+
40
+ # Called for parser errors.
41
+ def on_error(msg)
42
+ assert_equal(self.encoding, msg.encoding)
43
+ end
44
+
45
+ # Called for an external subset event.
46
+ def on_external_subset(name, external_id, system_id)
47
+ assert_equal(self.encoding, name.encoding)
48
+ assert_equal(self.encoding, external_id.encoding)
49
+ assert_equal(self.encoding, system_id.encoding)
50
+ end
51
+
52
+ # Called for an external subset notification event.
53
+ def on_has_external_subset
54
+ end
55
+
56
+ # Called for an internal subset notification event.
57
+ def on_has_internal_subset
58
+ end
59
+
60
+ # Called for an internal subset event.
61
+ def on_internal_subset(name, external_id, system_id)
62
+ assert_equal(self.encoding, name.encoding)
63
+ assert_equal(self.encoding, external_id.encoding)
64
+ assert_equal(self.encoding, system_id.encoding)
65
+ end
66
+
67
+ # Called for 'is standalone' event.
68
+ def on_is_standalone
69
+ end
70
+
71
+ # Called for an processing instruction event.
72
+ def on_processing_instruction(target, data)
73
+ assert_equal(self.encoding, target.encoding)
74
+ assert_equal(self.encoding, data.encoding)
75
+ end
76
+
77
+ # Called for a reference event.
78
+ def on_reference(name)
79
+ assert_equal(self.encoding, name.encoding)
80
+ end
81
+
82
+ # Called for a start document event.
83
+ def on_start_document
84
+ end
85
+
86
+ # Called for a start element event.
87
+ def on_start_element_ns(name, attributes, prefix, uri, namespaces)
88
+ assert_equal(self.encoding, name.encoding) if name
89
+ assert_equal(self.encoding, prefix.encoding) if prefix
90
+ assert_equal(self.encoding, uri.encoding) if uri
91
+ end
92
+ end
93
+
94
+ class TestEncodingSax < Minitest::Test
95
+ def setup
96
+ Encoding.default_internal = nil
97
+ end
98
+
99
+ def file_for_encoding(encoding)
100
+ file_name = "model/bands.#{encoding.name.downcase}.xml"
101
+ File.join(File.dirname(__FILE__), file_name)
102
+ end
103
+
104
+ def test_encoding_iso_8859_1
105
+ parser = LibXML::XML::SaxParser.file(file_for_encoding(Encoding::ISO_8859_1))
106
+ parser.callbacks = SaxEncodingCallbacks.new
107
+ parser.parse
108
+ end
109
+
110
+ def test_encoding_utf8
111
+ parser = LibXML::XML::SaxParser.file(file_for_encoding(Encoding::UTF_8))
112
+ parser.callbacks = SaxEncodingCallbacks.new
113
+ parser.parse
114
+ end
115
+ end