libxml-ruby 2.8.0 → 3.2.3

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