libxml-ruby 5.0.4 → 5.0.5

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY +10 -6
  3. data/README.rdoc +1 -1
  4. data/ext/libxml/extconf.rb +5 -0
  5. data/ext/libxml/ruby_xml.c +556 -556
  6. data/ext/libxml/ruby_xml_attributes.h +17 -17
  7. data/ext/libxml/ruby_xml_document.c +1129 -1129
  8. data/ext/libxml/ruby_xml_dtd.c +257 -257
  9. data/ext/libxml/ruby_xml_encoding.c +250 -250
  10. data/ext/libxml/ruby_xml_error.c +1003 -1003
  11. data/ext/libxml/ruby_xml_error.h +14 -14
  12. data/ext/libxml/ruby_xml_html_parser_context.c +351 -351
  13. data/ext/libxml/ruby_xml_input_cbg.c +188 -188
  14. data/ext/libxml/ruby_xml_namespace.c +151 -151
  15. data/ext/libxml/ruby_xml_parser.h +10 -10
  16. data/ext/libxml/ruby_xml_parser_context.c +1009 -1009
  17. data/ext/libxml/ruby_xml_parser_options.c +74 -74
  18. data/ext/libxml/ruby_xml_parser_options.h +10 -10
  19. data/ext/libxml/ruby_xml_sax2_handler.c +326 -326
  20. data/ext/libxml/ruby_xml_sax_parser.c +108 -108
  21. data/ext/libxml/ruby_xml_version.h +9 -9
  22. data/lib/libxml/attr.rb +122 -122
  23. data/lib/libxml/attr_decl.rb +80 -80
  24. data/lib/libxml/attributes.rb +13 -13
  25. data/lib/libxml/document.rb +194 -194
  26. data/lib/libxml/error.rb +95 -95
  27. data/lib/libxml/hpricot.rb +77 -77
  28. data/lib/libxml/html_parser.rb +96 -96
  29. data/lib/libxml/namespace.rb +61 -61
  30. data/lib/libxml/namespaces.rb +37 -37
  31. data/lib/libxml/node.rb +323 -323
  32. data/lib/libxml/parser.rb +102 -102
  33. data/lib/libxml/sax_callbacks.rb +179 -179
  34. data/lib/libxml/sax_parser.rb +40 -40
  35. data/lib/libxml/tree.rb +28 -28
  36. data/lib/libxml.rb +4 -4
  37. data/lib/xml/libxml.rb +10 -10
  38. data/lib/xml.rb +13 -13
  39. data/libxml-ruby.gemspec +50 -49
  40. data/test/test_document.rb +140 -140
  41. data/test/test_document_write.rb +142 -142
  42. data/test/test_dtd.rb +126 -126
  43. data/test/test_encoding.rb +126 -126
  44. data/test/test_error.rb +194 -194
  45. data/test/test_helper.rb +20 -20
  46. data/test/test_namespace.rb +58 -58
  47. data/test/test_node.rb +235 -235
  48. data/test/test_node_write.rb +93 -93
  49. data/test/test_parser.rb +333 -333
  50. data/test/test_reader.rb +364 -364
  51. data/test/test_xml.rb +168 -168
  52. metadata +5 -4
@@ -1,143 +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
- 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
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
143
143
  end
data/test/test_dtd.rb CHANGED
@@ -1,126 +1,126 @@
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::Parser.string(xml).parse
110
- assert_equal(0, errors.length)
111
-
112
- errors.clear
113
- LibXML::XML::Parser.string(xml, options: LibXML::XML::Parser::Options::DTDLOAD).parse
114
- assert_equal(1, errors.length)
115
- assert_equal("Warning: failed to load external entity \"test.dtd\" at :1.",
116
- errors[0].to_s)
117
-
118
- errors = Array.new
119
- LibXML::XML::Parser.string(xml, :options => LibXML::XML::Parser::Options::DTDLOAD).parse
120
- assert_equal(1, errors.length)
121
- assert_equal("Warning: failed to load external entity \"test.dtd\" at :1.",
122
- errors[0].to_s)
123
- ensure
124
- LibXML::XML::Error.reset_handler
125
- end
126
- 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_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::Parser.string(xml).parse
110
+ assert_equal(0, errors.length)
111
+
112
+ errors.clear
113
+ LibXML::XML::Parser.string(xml, options: LibXML::XML::Parser::Options::DTDLOAD).parse
114
+ assert_equal(1, errors.length)
115
+ assert_equal("Warning: failed to load external entity \"test.dtd\" at :1.",
116
+ errors[0].to_s)
117
+
118
+ errors = Array.new
119
+ LibXML::XML::Parser.string(xml, :options => LibXML::XML::Parser::Options::DTDLOAD).parse
120
+ assert_equal(1, errors.length)
121
+ assert_equal("Warning: failed to load external entity \"test.dtd\" at :1.",
122
+ errors[0].to_s)
123
+ ensure
124
+ LibXML::XML::Error.reset_handler
125
+ end
126
+ end