libxml-ruby 4.1.2 → 6.0.0

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 (172) hide show
  1. checksums.yaml +4 -4
  2. data/{HISTORY → CHANGELOG.md} +875 -887
  3. data/LICENSE +20 -20
  4. data/README.md +67 -0
  5. data/Rakefile +77 -98
  6. data/ext/libxml/extconf.rb +39 -20
  7. data/ext/libxml/libxml.c +67 -79
  8. data/ext/libxml/ruby_libxml.h +43 -44
  9. data/ext/libxml/ruby_xml.c +556 -899
  10. data/ext/libxml/ruby_xml.h +9 -10
  11. data/ext/libxml/ruby_xml_attr.c +338 -333
  12. data/ext/libxml/ruby_xml_attr.h +13 -12
  13. data/ext/libxml/ruby_xml_attr_decl.c +19 -12
  14. data/ext/libxml/ruby_xml_attr_decl.h +11 -11
  15. data/ext/libxml/ruby_xml_attributes.c +18 -9
  16. data/ext/libxml/ruby_xml_attributes.h +17 -15
  17. data/ext/libxml/ruby_xml_document.c +1142 -1129
  18. data/ext/libxml/ruby_xml_document.h +12 -11
  19. data/ext/libxml/ruby_xml_dtd.c +287 -248
  20. data/ext/libxml/ruby_xml_dtd.h +10 -9
  21. data/ext/libxml/ruby_xml_encoding.c +250 -250
  22. data/ext/libxml/ruby_xml_encoding.h +20 -18
  23. data/ext/libxml/ruby_xml_error.c +1003 -996
  24. data/ext/libxml/ruby_xml_error.h +14 -14
  25. data/ext/libxml/ruby_xml_html_parser.c +91 -91
  26. data/ext/libxml/ruby_xml_html_parser.h +10 -10
  27. data/ext/libxml/ruby_xml_html_parser_context.c +364 -337
  28. data/ext/libxml/ruby_xml_html_parser_context.h +11 -10
  29. data/ext/libxml/ruby_xml_html_parser_options.c +48 -48
  30. data/ext/libxml/ruby_xml_html_parser_options.h +10 -10
  31. data/ext/libxml/ruby_xml_input_cbg.c +216 -188
  32. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  33. data/ext/libxml/ruby_xml_io.c +49 -47
  34. data/ext/libxml/ruby_xml_io.h +10 -10
  35. data/ext/libxml/ruby_xml_namespace.c +159 -154
  36. data/ext/libxml/ruby_xml_namespace.h +11 -10
  37. data/ext/libxml/ruby_xml_namespaces.c +313 -293
  38. data/ext/libxml/ruby_xml_namespaces.h +9 -9
  39. data/ext/libxml/ruby_xml_node.c +1433 -1398
  40. data/ext/libxml/ruby_xml_node.h +15 -13
  41. data/ext/libxml/ruby_xml_parser.c +91 -91
  42. data/ext/libxml/ruby_xml_parser.h +10 -10
  43. data/ext/libxml/ruby_xml_parser_context.c +1016 -1001
  44. data/ext/libxml/ruby_xml_parser_context.h +11 -10
  45. data/ext/libxml/ruby_xml_parser_options.c +74 -66
  46. data/ext/libxml/ruby_xml_parser_options.h +10 -10
  47. data/ext/libxml/ruby_xml_reader.c +40 -31
  48. data/ext/libxml/ruby_xml_reader.h +14 -14
  49. data/ext/libxml/ruby_xml_registry.c +31 -0
  50. data/ext/libxml/ruby_xml_registry.h +22 -0
  51. data/ext/libxml/ruby_xml_relaxng.c +21 -5
  52. data/ext/libxml/ruby_xml_relaxng.h +9 -8
  53. data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
  54. data/ext/libxml/ruby_xml_sax2_handler.h +10 -10
  55. data/ext/libxml/ruby_xml_sax_parser.c +108 -116
  56. data/ext/libxml/ruby_xml_sax_parser.h +10 -10
  57. data/ext/libxml/ruby_xml_schema.c +22 -15
  58. data/ext/libxml/ruby_xml_schema.h +26 -25
  59. data/ext/libxml/ruby_xml_schema_attribute.c +7 -7
  60. data/ext/libxml/ruby_xml_schema_attribute.h +37 -37
  61. data/ext/libxml/ruby_xml_schema_element.c +8 -8
  62. data/ext/libxml/ruby_xml_schema_element.h +11 -11
  63. data/ext/libxml/ruby_xml_schema_facet.c +50 -50
  64. data/ext/libxml/ruby_xml_schema_facet.h +9 -9
  65. data/ext/libxml/ruby_xml_schema_type.c +12 -19
  66. data/ext/libxml/ruby_xml_schema_type.h +9 -9
  67. data/ext/libxml/ruby_xml_version.h +9 -9
  68. data/ext/libxml/ruby_xml_writer.c +183 -185
  69. data/ext/libxml/ruby_xml_writer.h +6 -6
  70. data/ext/libxml/ruby_xml_xinclude.c +20 -20
  71. data/ext/libxml/ruby_xml_xinclude.h +11 -11
  72. data/ext/libxml/ruby_xml_xpath.c +195 -195
  73. data/ext/libxml/ruby_xml_xpath.h +15 -15
  74. data/ext/libxml/ruby_xml_xpath_context.c +408 -362
  75. data/ext/libxml/ruby_xml_xpath_context.h +9 -9
  76. data/ext/libxml/ruby_xml_xpath_expression.c +12 -6
  77. data/ext/libxml/ruby_xml_xpath_expression.h +11 -10
  78. data/ext/libxml/ruby_xml_xpath_object.c +69 -54
  79. data/ext/libxml/ruby_xml_xpath_object.h +19 -17
  80. data/ext/vc/libxml_ruby/libxml_ruby.vcxproj +271 -0
  81. data/ext/xcode/libxml-ruby.xcodeproj/project.pbxproj +633 -0
  82. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  83. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  84. data/ext/xcode/libxml-ruby.xcodeproj/xcshareddata/xcschemes/libxml-ruby.xcscheme +80 -0
  85. data/lib/libxml/attr.rb +122 -122
  86. data/lib/libxml/attr_decl.rb +80 -80
  87. data/lib/libxml/attributes.rb +13 -13
  88. data/lib/libxml/document.rb +165 -194
  89. data/lib/libxml/error.rb +122 -95
  90. data/lib/libxml/html_parser.rb +80 -96
  91. data/lib/libxml/namespace.rb +61 -61
  92. data/lib/libxml/namespaces.rb +37 -37
  93. data/lib/libxml/node.rb +321 -323
  94. data/lib/libxml/parser.rb +94 -100
  95. data/lib/libxml/sax_callbacks.rb +179 -179
  96. data/lib/libxml/sax_parser.rb +40 -40
  97. data/lib/libxml/schema/attribute.rb +27 -19
  98. data/lib/libxml/schema/element.rb +20 -0
  99. data/lib/libxml/schema/type.rb +44 -21
  100. data/lib/libxml/schema.rb +47 -47
  101. data/lib/libxml/tree.rb +28 -28
  102. data/lib/libxml-ruby.rb +30 -30
  103. data/libxml-ruby.gemspec +46 -48
  104. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  105. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  106. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  107. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  108. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  109. data/test/c14n/result/with-comments/example-1 +5 -5
  110. data/test/c14n/result/with-comments/example-2 +10 -10
  111. data/test/c14n/result/with-comments/example-3 +13 -13
  112. data/test/c14n/result/with-comments/example-4 +8 -8
  113. data/test/c14n/result/with-comments/example-5 +3 -3
  114. data/test/c14n/result/without-comments/example-1 +3 -3
  115. data/test/c14n/result/without-comments/example-2 +10 -10
  116. data/test/c14n/result/without-comments/example-3 +13 -13
  117. data/test/c14n/result/without-comments/example-4 +8 -8
  118. data/test/c14n/result/without-comments/example-5 +2 -2
  119. data/test/test_attr.rb +179 -180
  120. data/test/test_attr_decl.rb +131 -131
  121. data/test/test_attributes.rb +135 -135
  122. data/test/test_canonicalize.rb +122 -120
  123. data/test/test_document.rb +138 -132
  124. data/test/test_document_write.rb +142 -145
  125. data/test/test_dtd.rb +134 -129
  126. data/test/test_encoding.rb +126 -129
  127. data/test/test_encoding_sax.rb +114 -114
  128. data/test/test_error.rb +197 -194
  129. data/test/test_helper.rb +21 -13
  130. data/test/test_html_parser.rb +166 -162
  131. data/test/test_html_parser_context.rb +22 -22
  132. data/test/test_input_callbacks.rb +36 -0
  133. data/test/test_namespace.rb +58 -60
  134. data/test/test_namespaces.rb +200 -200
  135. data/test/test_node.rb +251 -237
  136. data/test/test_node_cdata.rb +50 -50
  137. data/test/test_node_comment.rb +32 -32
  138. data/test/test_node_copy.rb +40 -40
  139. data/test/test_node_edit.rb +176 -158
  140. data/test/test_node_pi.rb +37 -37
  141. data/test/test_node_text.rb +69 -69
  142. data/test/test_node_write.rb +93 -96
  143. data/test/test_node_xlink.rb +28 -28
  144. data/test/test_parser.rb +297 -324
  145. data/test/test_parser_context.rb +198 -198
  146. data/test/test_properties.rb +38 -38
  147. data/test/test_reader.rb +413 -364
  148. data/test/test_relaxng.rb +59 -53
  149. data/test/test_sax_parser.rb +345 -326
  150. data/test/test_schema.rb +28 -0
  151. data/test/test_traversal.rb +152 -152
  152. data/test/test_writer.rb +469 -468
  153. data/test/test_xinclude.rb +20 -20
  154. data/test/test_xml.rb +164 -267
  155. data/test/test_xpath.rb +244 -244
  156. data/test/test_xpath_context.rb +87 -87
  157. data/test/test_xpath_expression.rb +37 -37
  158. metadata +49 -31
  159. data/README.rdoc +0 -217
  160. data/ext/libxml/extconf.h +0 -3
  161. data/ext/libxml/ruby_xml_cbg.c +0 -85
  162. data/lib/libxml/hpricot.rb +0 -78
  163. data/lib/libxml.rb +0 -5
  164. data/lib/xml/libxml.rb +0 -10
  165. data/lib/xml.rb +0 -14
  166. data/script/benchmark/depixelate +0 -634
  167. data/script/benchmark/hamlet.xml +0 -9055
  168. data/script/benchmark/parsecount +0 -170
  169. data/script/benchmark/sock_entries.xml +0 -507
  170. data/script/benchmark/throughput +0 -41
  171. data/script/test +0 -6
  172. data/test/test_deprecated_require.rb +0 -12
@@ -1,146 +1,143 @@
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
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
+ file = File.join(File.dirname(__FILE__), @file_name)
11
+ @doc = LibXML::XML::Document.file(file, options: LibXML::XML::Parser::Options::NOBLANKS)
12
+ end
13
+
14
+ def teardown
15
+ @doc = nil
16
+ end
17
+
18
+ # --- to_s tests ---
19
+ def test_to_s_default
20
+ # Default to_s has indentation
21
+ 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",
22
+ @doc.to_s)
23
+ end
24
+
25
+ def test_to_s_no_global_indentation
26
+ # No indentation due to global setting
27
+ LibXML::XML.indent_tree_output = false
28
+ value = @doc.to_s
29
+
30
+ assert_equal(Encoding::UTF_8, value.encoding)
31
+ 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",
32
+ value)
33
+ ensure
34
+ LibXML::XML.indent_tree_output = true
35
+ end
36
+
37
+ def test_to_s_no_indentation
38
+ # No indentation due to local setting
39
+ value = @doc.to_s(:indent => false)
40
+ assert_equal(Encoding::UTF_8, value.encoding)
41
+ 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",
42
+ value)
43
+ end
44
+
45
+ def test_to_s_encoding
46
+ # Test encodings
47
+
48
+ # UTF8:
49
+ # ö - c3 b6 in hex, \303\266 in octal
50
+ # ü - c3 bc in hex, \303\274 in octal
51
+ value = @doc.to_s(:encoding => LibXML::XML::Encoding::UTF_8)
52
+ assert_equal(Encoding::UTF_8, value.encoding)
53
+ 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",
54
+ value)
55
+
56
+ # ISO_8859_1:
57
+ # ö - f6 in hex, \366 in octal
58
+ # ü - fc in hex, \374 in octal
59
+ value = @doc.to_s(:encoding => LibXML::XML::Encoding::ISO_8859_1)
60
+ assert_equal(Encoding::ISO8859_1, value.encoding)
61
+ 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),
62
+ @doc.to_s(:encoding => LibXML::XML::Encoding::ISO_8859_1))
63
+
64
+ # Invalid encoding
65
+ error = assert_raises(ArgumentError) do
66
+ @doc.to_s(:encoding => -9999)
67
+ end
68
+ assert_equal('Unknown encoding value: -9999', error.to_s)
69
+ end
70
+
71
+ # --- save tests -----
72
+ def test_save_utf8
73
+ temp_filename = File.join(Dir.tmpdir, "tc_document_write_test_save_utf8.xml")
74
+
75
+ bytes = @doc.save(temp_filename)
76
+ assert_equal(305, bytes)
77
+
78
+ contents = File.read(temp_filename, nil, nil, :encoding => Encoding::UTF_8)
79
+ assert_equal(Encoding::UTF_8, contents.encoding)
80
+ 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",
81
+ contents)
82
+ ensure
83
+ File.delete(temp_filename)
84
+ end
85
+
86
+ def test_save_utf8_no_indents
87
+ temp_filename = File.join(Dir.tmpdir, "tc_document_write_test_save_utf8_no_indents.xml")
88
+
89
+ bytes = @doc.save(temp_filename, :indent => false)
90
+ assert_equal(298, bytes)
91
+
92
+ contents = File.read(temp_filename, nil, nil, :encoding => Encoding::UTF_8)
93
+ 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",
94
+ contents)
95
+ ensure
96
+ File.delete(temp_filename)
97
+ end
98
+
99
+ def test_save_iso_8859_1
100
+ temp_filename = File.join(Dir.tmpdir, "tc_document_write_test_save_iso_8859_1.xml")
101
+ bytes = @doc.save(temp_filename, :encoding => LibXML::XML::Encoding::ISO_8859_1)
102
+ assert_equal(304, bytes)
103
+
104
+ contents = File.read(temp_filename, nil, nil, :encoding => Encoding::ISO8859_1)
105
+ assert_equal(Encoding::ISO8859_1, contents.encoding)
106
+ 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),
107
+ contents)
108
+ ensure
109
+ File.delete(temp_filename)
110
+ end
111
+
112
+ def test_save_iso_8859_1_no_indent
113
+ temp_filename = File.join(Dir.tmpdir, "tc_document_write_test_save_iso_8859_1_no_indent.xml")
114
+ bytes = @doc.save(temp_filename, :indent => false, :encoding => LibXML::XML::Encoding::ISO_8859_1)
115
+ assert_equal(297, bytes)
116
+
117
+ contents = File.read(temp_filename, nil, nil, :encoding => Encoding::ISO8859_1)
118
+ assert_equal(Encoding::ISO8859_1, contents.encoding)
119
+ 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),
120
+ contents)
121
+ ensure
122
+ File.delete(temp_filename)
123
+ end
124
+
125
+ def test_thread_set_root
126
+ # Previously a segmentation fault occurred when running libxml in
127
+ # background threads.
128
+ thread = Thread.new do
129
+ 100000.times do |i|
130
+ document = LibXML::XML::Document.new
131
+ node = LibXML::XML::Node.new('test')
132
+ document.root = node
133
+ end
134
+ end
135
+ thread.join
136
+ assert(true)
137
+ end
138
+
139
+ # --- Debug ---
140
+ def test_debug
141
+ assert(@doc.debug)
142
+ end
146
143
  end
data/test/test_dtd.rb CHANGED
@@ -1,129 +1,134 @@
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
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_internal_subset_nil_ids
48
+ doc = LibXML::XML::Document.new
49
+ doc.root = LibXML::XML::Node.new('test')
50
+ dtd = LibXML::XML::Dtd.new(nil, nil, 'test', doc, true)
51
+ assert_equal('test', dtd.name)
52
+ assert_nil(dtd.external_id)
53
+ assert_nil(dtd.uri)
54
+ assert_equal("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE test>\n<test/>\n", doc.to_s)
55
+ end
56
+
57
+ def test_external_subset
58
+ xhtml_dtd = LibXML::XML::Dtd.new("-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", nil)
59
+ assert xhtml_dtd.name.nil?
60
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
61
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
62
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
63
+
64
+ xhtml_dtd = LibXML::XML::Dtd.new("-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", "xhtml1")
65
+ assert_equal "xhtml1", xhtml_dtd.name
66
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
67
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
68
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
69
+ end
70
+
71
+ def test_valid
72
+ assert(@doc.validate(dtd))
73
+ end
74
+
75
+ def test_node_type
76
+ assert_equal(LibXML::XML::Node::DTD_NODE, dtd.node_type)
77
+ end
78
+
79
+ def test_invalid
80
+ new_node = LibXML::XML::Node.new('invalid', 'this will mess up validation')
81
+ @doc.root << new_node
82
+
83
+ error = assert_raises(LibXML::XML::Error) do
84
+ @doc.validate(dtd)
85
+ end
86
+
87
+ # Check the error worked
88
+ refute_nil(error)
89
+ assert_kind_of(LibXML::XML::Error, error)
90
+ assert_equal("Error: No declaration for element invalid.", error.message)
91
+ assert_equal(LibXML::XML::Error::VALID, error.domain)
92
+ assert_equal(LibXML::XML::Error::DTD_UNKNOWN_ELEM, error.code)
93
+ assert_equal(LibXML::XML::Error::ERROR, error.level)
94
+ assert_nil(error.file)
95
+ assert_nil(error.line)
96
+ assert_equal('invalid', error.str1)
97
+ # Different answers across operating systems
98
+ # assert_nil(error.str2)
99
+ assert_nil(error.str3)
100
+ assert_equal(0, error.int1)
101
+ assert_equal(0, error.int2)
102
+ refute_nil(error.node)
103
+ assert_equal('invalid', error.node.name)
104
+ end
105
+
106
+ def test_external_dtd
107
+ xml = <<-EOS
108
+ <!DOCTYPE test PUBLIC "-//TEST" "test.dtd" []>
109
+ <test>
110
+ <title>T1</title>
111
+ </test>
112
+ EOS
113
+
114
+ errors = Array.new
115
+ LibXML::XML::Error.set_handler do |error|
116
+ errors << error
117
+ end
118
+
119
+ LibXML::XML::Parser.string(xml).parse
120
+ assert_equal(0, errors.length)
121
+
122
+ errors.clear
123
+ LibXML::XML::Parser.string(xml, options: LibXML::XML::Parser::Options::DTDLOAD).parse
124
+ assert_equal(1, errors.length)
125
+ assert_match(/Warning: failed to load.*test\.dtd/, errors[0].to_s)
126
+
127
+ errors = Array.new
128
+ LibXML::XML::Parser.string(xml, :options => LibXML::XML::Parser::Options::DTDLOAD).parse
129
+ assert_equal(1, errors.length)
130
+ assert_match(/Warning: failed to load.*test\.dtd/, errors[0].to_s)
131
+ ensure
132
+ LibXML::XML::Error.reset_handler
133
+ end
134
+ end