libxml-ruby 0.9.8-x86-mswin32-60 → 0.9.9-x86-mswin32-60

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 (98) hide show
  1. data/CHANGES +41 -1
  2. data/LICENSE +3 -4
  3. data/README +37 -24
  4. data/Rakefile +2 -2
  5. data/ext/libxml/extconf.rb +31 -12
  6. data/ext/libxml/libxml.c +56 -858
  7. data/ext/libxml/ruby_libxml.h +93 -96
  8. data/ext/libxml/ruby_xml.c +855 -0
  9. data/ext/libxml/ruby_xml.h +9 -0
  10. data/ext/libxml/ruby_xml_attr.c +3 -9
  11. data/ext/libxml/ruby_xml_attr.h +2 -2
  12. data/ext/libxml/ruby_xml_attr_decl.c +2 -8
  13. data/ext/libxml/ruby_xml_attr_decl.h +1 -1
  14. data/ext/libxml/ruby_xml_attributes.c +6 -8
  15. data/ext/libxml/ruby_xml_attributes.h +1 -1
  16. data/ext/libxml/ruby_xml_document.c +915 -895
  17. data/ext/libxml/ruby_xml_document.h +2 -2
  18. data/ext/libxml/ruby_xml_dtd.c +257 -136
  19. data/ext/libxml/ruby_xml_dtd.h +1 -1
  20. data/ext/libxml/ruby_xml_encoding.c +55 -37
  21. data/ext/libxml/ruby_xml_encoding.h +1 -1
  22. data/ext/libxml/ruby_xml_error.c +526 -1058
  23. data/ext/libxml/ruby_xml_error.h +1 -1
  24. data/ext/libxml/ruby_xml_html_parser.c +2 -8
  25. data/ext/libxml/ruby_xml_html_parser.h +2 -2
  26. data/ext/libxml/ruby_xml_html_parser_context.c +175 -145
  27. data/ext/libxml/ruby_xml_html_parser_context.h +1 -1
  28. data/ext/libxml/ruby_xml_html_parser_options.c +12 -20
  29. data/ext/libxml/ruby_xml_html_parser_options.h +1 -1
  30. data/ext/libxml/ruby_xml_input_cbg.c +2 -8
  31. data/ext/libxml/ruby_xml_input_cbg.h +1 -1
  32. data/ext/libxml/ruby_xml_namespace.c +2 -8
  33. data/ext/libxml/ruby_xml_namespace.h +2 -2
  34. data/ext/libxml/ruby_xml_namespaces.c +1 -9
  35. data/ext/libxml/ruby_xml_namespaces.h +1 -1
  36. data/ext/libxml/ruby_xml_node.c +182 -121
  37. data/ext/libxml/ruby_xml_node.h +2 -2
  38. data/ext/libxml/ruby_xml_parser.c +2 -8
  39. data/ext/libxml/ruby_xml_parser.h +2 -2
  40. data/ext/libxml/ruby_xml_parser_context.c +952 -901
  41. data/ext/libxml/ruby_xml_parser_context.h +2 -2
  42. data/ext/libxml/ruby_xml_parser_options.c +2 -9
  43. data/ext/libxml/ruby_xml_parser_options.h +1 -1
  44. data/ext/libxml/ruby_xml_reader.c +1002 -993
  45. data/ext/libxml/ruby_xml_reader.h +1 -1
  46. data/ext/libxml/ruby_xml_relaxng.c +1 -7
  47. data/ext/libxml/ruby_xml_relaxng.h +1 -1
  48. data/ext/libxml/ruby_xml_sax2_handler.c +2 -2
  49. data/ext/libxml/ruby_xml_sax2_handler.h +1 -1
  50. data/ext/libxml/ruby_xml_sax_parser.c +2 -8
  51. data/ext/libxml/ruby_xml_sax_parser.h +2 -2
  52. data/ext/libxml/ruby_xml_schema.c +1 -7
  53. data/ext/libxml/ruby_xml_schema.h +1 -1
  54. data/ext/libxml/{version.h → ruby_xml_version.h} +2 -2
  55. data/ext/libxml/ruby_xml_xinclude.c +2 -8
  56. data/ext/libxml/ruby_xml_xinclude.h +2 -2
  57. data/ext/libxml/ruby_xml_xpath.c +17 -18
  58. data/ext/libxml/ruby_xml_xpath.h +2 -2
  59. data/ext/libxml/ruby_xml_xpath_context.c +387 -389
  60. data/ext/libxml/ruby_xml_xpath_context.h +2 -2
  61. data/ext/libxml/ruby_xml_xpath_expression.c +18 -8
  62. data/ext/libxml/ruby_xml_xpath_expression.h +1 -1
  63. data/ext/libxml/ruby_xml_xpath_object.c +19 -8
  64. data/ext/libxml/ruby_xml_xpath_object.h +1 -1
  65. data/ext/libxml/ruby_xml_xpointer.c +2 -8
  66. data/ext/libxml/ruby_xml_xpointer.h +2 -2
  67. data/ext/mingw/libxml_ruby.dll.a +0 -0
  68. data/ext/mingw/libxml_ruby.so +0 -0
  69. data/ext/vc/libxml_ruby.sln +7 -1
  70. data/lib/libxml.rb +1 -12
  71. data/lib/libxml/attr.rb +0 -3
  72. data/lib/libxml/attr_decl.rb +0 -3
  73. data/lib/libxml/attributes.rb +0 -3
  74. data/lib/libxml/document.rb +31 -5
  75. data/lib/libxml/error.rb +8 -4
  76. data/lib/libxml/properties.rb +0 -5
  77. data/lib/libxml/sax_callbacks.rb +30 -19
  78. data/lib/libxml/tree.rb +0 -1
  79. data/lib/libxml/xpath_object.rb +0 -13
  80. data/test/model/definition.dtd +8 -0
  81. data/test/tc_attributes.rb +4 -1
  82. data/test/tc_document.rb +16 -0
  83. data/test/tc_dtd.rb +30 -2
  84. data/test/tc_html_parser.rb +55 -10
  85. data/test/tc_node.rb +67 -1
  86. data/test/tc_node_edit.rb +26 -6
  87. data/test/tc_node_text.rb +41 -23
  88. data/test/tc_parser.rb +50 -0
  89. data/test/tc_reader.rb +15 -0
  90. data/test/tc_relaxng.rb +1 -1
  91. data/test/tc_sax_parser.rb +37 -5
  92. data/test/tc_schema.rb +1 -1
  93. data/test/tc_xpath.rb +1 -0
  94. data/test/tc_xpath_expression.rb +4 -2
  95. metadata +6 -6
  96. data/ext/libxml/ruby_xml_state.c +0 -51
  97. data/ext/libxml/ruby_xml_state.h +0 -11
  98. data/ext/vc/libxml_ruby.vcproj +0 -460
@@ -0,0 +1,8 @@
1
+ <!ELEMENT definition (primary_key|body|reasoning|products)* >
2
+ <!ATTLIST definition target_entity CDATA #REQUIRED>
3
+ <!ELEMENT primary_key (#PCDATA)>
4
+ <!ATTLIST primary_key name CDATA #REQUIRED>
5
+ <!ELEMENT body (#PCDATA)>
6
+ <!ELEMENT reasoning (#PCDATA)>
7
+ <!ELEMENT products (product*)>
8
+ <!ENTITY % product SYSTEM "lib/dtds/product.dtd"> %product;
@@ -122,9 +122,12 @@ class AttributesTest < Test::Unit::TestCase
122
122
  node = @doc.find_first('/city:CityModel/city:cityMember')
123
123
  assert_equal(5, node.attributes.length)
124
124
 
125
- node.attributes.entries.each do |attr|
125
+ attrs = Array.new
126
+ node.attributes.each do |attr|
127
+ attrs << attr
126
128
  attr.remove!
127
129
  end
130
+ assert_equal(5, attrs.length)
128
131
  assert_equal(0, node.attributes.length)
129
132
  end
130
133
  end
data/test/tc_document.rb CHANGED
@@ -83,4 +83,20 @@ class TestDocument < Test::Unit::TestCase
83
83
  doc.encoding = XML::Encoding::ISO_8859_1
84
84
  assert_equal(XML::Encoding::ISO_8859_1, doc.encoding)
85
85
  end
86
+
87
+ def test_doc_node_type
88
+ assert_equal XML::Node::DOCUMENT_NODE, XML::Document.new.node_type
89
+ end
90
+
91
+ def test_doc_node_type_name
92
+ assert_equal 'document_xml', XML::Document.new.node_type_name
93
+ end
94
+
95
+ def test_xhtml
96
+ doc = XML::Document.new
97
+ assert ! doc.xhtml?
98
+ xhtml_dtd = XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", nil, doc, true
99
+ assert doc.xhtml?
100
+ end
101
+
86
102
  end
data/test/tc_dtd.rb CHANGED
@@ -28,6 +28,34 @@ class TestDtd < Test::Unit::TestCase
28
28
  EOS
29
29
  end
30
30
 
31
+ def test_internal_subset
32
+ xhtml_dtd = XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", nil, nil, true
33
+ assert xhtml_dtd.name.nil?
34
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
35
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
36
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
37
+
38
+ xhtml_dtd = XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", "xhtml1", nil, true
39
+ assert_equal "xhtml1", xhtml_dtd.name
40
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
41
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
42
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
43
+ end
44
+
45
+ def test_external_subset
46
+ xhtml_dtd = XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", nil
47
+ assert xhtml_dtd.name.nil?
48
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
49
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
50
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
51
+
52
+ xhtml_dtd = XML::Dtd.new "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", "xhtml1"
53
+ assert_equal "xhtml1", xhtml_dtd.name
54
+ assert_equal "-//W3C//DTD XHTML 1.0 Transitional//EN", xhtml_dtd.external_id
55
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.uri
56
+ assert_equal "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", xhtml_dtd.system_id
57
+ end
58
+
31
59
  def test_valid
32
60
  assert(@doc.validate(dtd))
33
61
  end
@@ -44,7 +72,7 @@ class TestDtd < Test::Unit::TestCase
44
72
  # Check the error worked
45
73
  assert_not_nil(error)
46
74
  assert_kind_of(XML::Error, error)
47
- assert_equal("Error: No declaration for element invalid at :0.", error.message)
75
+ assert_equal("Error: No declaration for element invalid.", error.message)
48
76
  assert_equal(XML::Error::VALID, error.domain)
49
77
  assert_equal(XML::Error::DTD_UNKNOWN_ELEM, error.code)
50
78
  assert_equal(XML::Error::ERROR, error.level)
@@ -91,4 +119,4 @@ class TestDtd < Test::Unit::TestCase
91
119
  ensure
92
120
  XML::Error.reset_handler
93
121
  end
94
- end
122
+ end
@@ -1,4 +1,5 @@
1
- require "xml"
1
+ require 'xml'
2
+ require 'stringio'
2
3
  require 'test/unit'
3
4
 
4
5
  class HTMLParserTest < Test::Unit::TestCase
@@ -10,29 +11,54 @@ class HTMLParserTest < Test::Unit::TestCase
10
11
  def test_file
11
12
  xp = XML::HTMLParser.file(html_file)
12
13
  assert_instance_of(XML::HTMLParser, xp)
14
+ doc = xp.parse
15
+ assert_not_nil(doc)
13
16
  end
14
17
 
15
- def test_string
16
- str = '<html><body><p>hi</p></body></html>'
17
- xp = XML::HTMLParser.string(str)
18
+ def test_noexistent_file
19
+ error = assert_raise(XML::Error) do
20
+ XML::HTMLParser.file('i_dont_exist.xml')
21
+ end
18
22
 
19
- assert_instance_of(XML::HTMLParser, xp)
20
- assert_instance_of(XML::HTMLParser, xp)
23
+ assert_equal('Warning: failed to load external entity "i_dont_exist.xml".', error.to_s)
24
+ end
21
25
 
22
- doc = xp.parse
23
- assert_instance_of(XML::Document, doc)
26
+ def test_nil_file
27
+ error = assert_raise(TypeError) do
28
+ XML::HTMLParser.file(nil)
29
+ end
30
+
31
+ assert_equal("can't convert nil into String", error.to_s)
24
32
  end
25
33
 
26
34
  def test_io
27
35
  File.open(html_file) do |io|
28
36
  xp = XML::HTMLParser.io(io)
29
37
  assert_instance_of(XML::HTMLParser, xp)
30
-
38
+
31
39
  doc = xp.parse
32
40
  assert_instance_of(XML::Document, doc)
33
41
  end
34
42
  end
35
43
 
44
+ def test_io_gc
45
+ # Test that the reader keeps a reference
46
+ # to the io object
47
+ file = File.open(html_file)
48
+ parser = XML::HTMLParser.io(file)
49
+ file = nil
50
+ GC.start
51
+ assert(parser.parse)
52
+ end
53
+
54
+ def test_nil_io
55
+ error = assert_raise(TypeError) do
56
+ XML::HTMLParser.io(nil)
57
+ end
58
+
59
+ assert_equal("Must pass in an IO object", error.to_s)
60
+ end
61
+
36
62
  def test_string_io
37
63
  data = File.read(html_file)
38
64
  io = StringIO.new(data)
@@ -43,6 +69,25 @@ class HTMLParserTest < Test::Unit::TestCase
43
69
  assert_instance_of(XML::Document, doc)
44
70
  end
45
71
 
72
+ def test_string
73
+ str = '<html><body><p>hi</p></body></html>'
74
+ xp = XML::HTMLParser.string(str)
75
+
76
+ assert_instance_of(XML::HTMLParser, xp)
77
+ assert_instance_of(XML::HTMLParser, xp)
78
+
79
+ doc = xp.parse
80
+ assert_instance_of(XML::Document, doc)
81
+ end
82
+
83
+ def test_nil_string
84
+ error = assert_raise(TypeError) do
85
+ XML::HTMLParser.string(nil)
86
+ end
87
+
88
+ assert_equal("wrong argument type nil (expected String)", error.to_s)
89
+ end
90
+
46
91
  def test_parse
47
92
  html = <<-EOS
48
93
  <html>
@@ -90,4 +135,4 @@ class HTMLParserTest < Test::Unit::TestCase
90
135
  assert_instance_of XML::Node, world
91
136
  assert_equal 'World', world.content
92
137
  end
93
- end
138
+ end
data/test/tc_node.rb CHANGED
@@ -23,10 +23,18 @@ class TestNode < Test::Unit::TestCase
23
23
  assert_instance_of(XML::Document, @doc)
24
24
  end
25
25
 
26
+ def test_doc_node_type
27
+ assert_equal XML::Node::DOCUMENT_NODE, @doc.node_type
28
+ end
29
+
26
30
  def test_root_class
27
31
  assert_instance_of(XML::Node, @doc.root)
28
32
  end
29
33
 
34
+ def test_root_node_type
35
+ assert_equal XML::Node::ELEMENT_NODE, @doc.root.node_type
36
+ end
37
+
30
38
  def test_node_class
31
39
  for n in nodes
32
40
  assert_instance_of(XML::Node, n)
@@ -112,4 +120,62 @@ class TestNode < Test::Unit::TestCase
112
120
  doc = XML::Parser.string('<person />').parse
113
121
  assert_nil(doc.root.base)
114
122
  end
115
- end
123
+
124
+ # We use the same facility that libXSLT does here to disable output escaping.
125
+ # This lets you specify that the node's content should be rendered unaltered
126
+ # whenever it is being output. This is useful for things like <script> and
127
+ # <style> nodes in HTML documents if you don't want to be forced to wrap them
128
+ # in CDATA nodes. Or if you are sanitizing existing HTML documents and want
129
+ # to preserve the content of any of the text nodes.
130
+ #
131
+ def test_output_escaping
132
+ text = '<bad-script>if (a &lt; b || b &gt; c) { return "text"; }<stop/>return "&gt;&gt;&gt;snip&lt;&lt;&lt;";</bad-script>'
133
+ node = XML::Parser.string(text).parse.root
134
+ assert_equal text, node.to_s
135
+
136
+ text_noenc = '<bad-script>if (a < b || b > c) { return "text"; }<stop/>return ">>>snip<<<";</bad-script>'
137
+ node.output_escaping = false
138
+ assert_equal text_noenc, node.to_s
139
+
140
+ node.output_escaping = true
141
+ assert_equal text, node.to_s
142
+
143
+ node.output_escaping = nil
144
+ assert_equal text_noenc, node.to_s
145
+
146
+ node.output_escaping = true
147
+ assert_equal text, node.to_s
148
+ end
149
+
150
+ # Just a sanity check for output escaping.
151
+ def test_output_escaping_sanity
152
+ text = '<bad-script>if (a &lt; b || b &gt; c) { return "text"; }<stop/>return "&gt;&gt;&gt;snip&lt;&lt;&lt;";</bad-script>'
153
+ node = XML::Parser.string(text).parse.root
154
+ affected = node.find('//text()')
155
+
156
+ check_escaping = lambda do |flag|
157
+ assert_equal('bad-script', node.name)
158
+ assert_equal(flag, node.output_escaping?)
159
+ affected.each do |x|
160
+ assert_equal(flag ? 'text' : 'textnoenc', x.name)
161
+ assert_equal(flag, x.output_escaping?)
162
+ end
163
+ end
164
+
165
+ node.output_escaping = false
166
+ check_escaping[false]
167
+
168
+ node.output_escaping = true
169
+ check_escaping[true]
170
+
171
+ node.output_escaping = nil
172
+ check_escaping[false]
173
+
174
+ node.output_escaping = true
175
+ check_escaping[true]
176
+
177
+ affected.first.output_escaping = true
178
+ affected.last.output_escaping = false
179
+ assert node.output_escaping?.nil?
180
+ end
181
+ end
data/test/tc_node_edit.rb CHANGED
@@ -58,13 +58,33 @@ class TestNodeEdit < Test::Unit::TestCase
58
58
  assert_equal '<test><num>one</num><num>two</num><num>two-and-a-half</num><num>three</num></test>',
59
59
  @doc.root.to_s.gsub(/\n\s*/,'')
60
60
  end
61
-
61
+
62
62
  def test_remove_node
63
63
  first_node.remove!
64
64
  assert_equal('<test><num>two</num><num>three</num></test>',
65
65
  @doc.root.to_s.gsub(/\n\s*/,''))
66
66
  end
67
67
 
68
+ def test_remove_node_gc
69
+ xp = XML::Parser.string('<test><num>one</num><num>two</num><num>three</num></test>')
70
+ doc = xp.parse
71
+ node = doc.root.child.remove!
72
+ node = nil
73
+ GC.start
74
+ assert_not_nil(doc)
75
+ end
76
+
77
+ def test_remove_node_iteration
78
+ nodes = Array.new
79
+ @doc.root.each_element do |node|
80
+ if node.name == 'num'
81
+ nodes << node
82
+ node.remove!
83
+ end
84
+ end
85
+ assert_equal(3, nodes.length)
86
+ end
87
+
68
88
  def test_reuse_removed_node
69
89
  # Remove the node
70
90
  node = @doc.root.first.remove!
@@ -77,7 +97,7 @@ class TestNodeEdit < Test::Unit::TestCase
77
97
  @doc.root.to_s.gsub(/\n\s*/,''))
78
98
  end
79
99
 
80
- # This test is to verify that an earlier reported bug has been fixed
100
+ # This test is to verify that an earlier reported bug has been fixed
81
101
  def test_merge
82
102
  documents = []
83
103
 
@@ -90,16 +110,16 @@ class TestNodeEdit < Test::Unit::TestCase
90
110
  documents.inject(master_doc) do |master_doc, child_doc|
91
111
  master_body = master_doc.find("//body").first
92
112
  child_body = child_doc.find("//body").first
93
-
113
+
94
114
  child_element = child_body.detect do |node|
95
115
  node.element?
96
116
  end
97
-
117
+
98
118
  master_body << child_element.copy(true)
99
119
  master_doc
100
120
  end
101
121
  end
102
-
122
+
103
123
  def test_append_chain
104
124
  node = XML::Node.new('foo') << XML::Node.new('bar') << "bars contents"
105
125
  assert_equal('<foo><bar/>bars contents</foo>',
@@ -111,4 +131,4 @@ class TestNodeEdit < Test::Unit::TestCase
111
131
  assert_equal("<test xml:base=\"http://www.rubynet.org/\">\n <num>one</num>\n <num>two</num>\n <num>three</num>\n</test>",
112
132
  @doc.root.to_s)
113
133
  end
114
- end
134
+ end
data/test/tc_node_text.rb CHANGED
@@ -15,23 +15,6 @@ class TestTextNode < Test::Unit::TestCase
15
15
  assert_equal('wrong argument type nil (expected String)', error.to_s)
16
16
  end
17
17
 
18
- # Disabling output escaping can't work without this test passing.
19
- def test_text_node_name_sanity
20
- node = XML::Node.new_text('testdata')
21
- assert_equal XML::Node::XML_STRING_TEXT.object_id, node.name.object_id
22
- node.name = 'ignore-me'
23
- assert_equal XML::Node::XML_STRING_TEXT.object_id, node.name.object_id
24
- node.name = XML::Node::XML_STRING_TEXT_NOENC
25
- assert_equal XML::Node::XML_STRING_TEXT_NOENC.object_id, node.name.object_id
26
- node.name = 'ignore-me'
27
- assert_equal XML::Node::XML_STRING_TEXT_NOENC.object_id, node.name.object_id
28
- end
29
-
30
- def test_text_node_name_singletons_frozen
31
- assert XML::Node::XML_STRING_TEXT.frozen?
32
- assert XML::Node::XML_STRING_TEXT_NOENC.frozen?
33
- end
34
-
35
18
  # We use the same facility that libXSLT does here to disable output escaping.
36
19
  # This lets you specify that the node's content should be rendered unaltered
37
20
  # whenever it is being output. This is useful for things like <script> and
@@ -40,12 +23,47 @@ class TestTextNode < Test::Unit::TestCase
40
23
  # to preserve the content of any of the text nodes.
41
24
  #
42
25
  def test_output_escaping
43
- node = XML::Node.new_text('<my> "entity"')
44
- assert_equal '&lt;my&gt; "entity"', node.to_s
45
- node.name = XML::Node::XML_STRING_TEXT_NOENC
46
- assert_equal '<my> "entity"', node.to_s
47
- node.name = XML::Node::XML_STRING_TEXT
48
- assert_equal '&lt;my&gt; "entity"', node.to_s
26
+ textnoenc = 'if (a < b || c > d) return "e";'
27
+ text = "if (a &lt; b || c &gt; d) return \"e\";"
28
+
29
+ node = XML::Node.new_text(textnoenc)
30
+ assert node.output_escaping?
31
+ assert_equal text, node.to_s
32
+
33
+ node.output_escaping = false
34
+ assert_equal textnoenc, node.to_s
35
+
36
+ node.output_escaping = true
37
+ assert_equal text, node.to_s
38
+
39
+ node.output_escaping = nil
40
+ assert_equal textnoenc, node.to_s
41
+
42
+ node.output_escaping = true
43
+ assert_equal text, node.to_s
44
+ end
45
+
46
+ # Just a sanity check for output escaping.
47
+ def test_output_escaping_sanity
48
+ node = XML::Node.new_text('testdata')
49
+ assert_equal 'text', node.name
50
+ assert node.output_escaping?
51
+
52
+ node.output_escaping = false
53
+ assert_equal 'textnoenc', node.name
54
+ assert ! node.output_escaping?
55
+
56
+ node.output_escaping = true
57
+ assert_equal 'text', node.name
58
+ assert node.output_escaping?
59
+
60
+ node.output_escaping = nil
61
+ assert_equal 'textnoenc', node.name
62
+ assert ! node.output_escaping?
63
+
64
+ node.output_escaping = true
65
+ assert_equal 'text', node.name
66
+ assert node.output_escaping?
49
67
  end
50
68
 
51
69
  end
data/test/tc_parser.rb CHANGED
@@ -27,6 +27,14 @@ class TestParser < Test::Unit::TestCase
27
27
  assert_instance_of(XML::Parser::Context, parser.context)
28
28
  end
29
29
 
30
+ def test_nil_document
31
+ error = assert_raise(TypeError) do
32
+ XML::Parser.document(nil)
33
+ end
34
+
35
+ assert_equal("Must pass an XML::Document object", error.to_s)
36
+ end
37
+
30
38
  def test_file
31
39
  file = File.expand_path(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
32
40
 
@@ -36,6 +44,22 @@ class TestParser < Test::Unit::TestCase
36
44
  assert_instance_of(XML::Parser::Context, parser.context)
37
45
  end
38
46
 
47
+ def test_noexistent_file
48
+ error = assert_raise(XML::Error) do
49
+ XML::Parser.file('i_dont_exist.xml')
50
+ end
51
+
52
+ assert_equal('Warning: failed to load external entity "i_dont_exist.xml".', error.to_s)
53
+ end
54
+
55
+ def test_nil_file
56
+ error = assert_raise(TypeError) do
57
+ XML::Parser.file(nil)
58
+ end
59
+
60
+ assert_equal("can't convert nil into String", error.to_s)
61
+ end
62
+
39
63
  def test_file_encoding
40
64
  file = File.expand_path(File.join(File.dirname(__FILE__), 'model/bands.xml'))
41
65
  parser = XML::Parser.file(file, :encoding => XML::Encoding::ISO_8859_1)
@@ -74,6 +98,24 @@ class TestParser < Test::Unit::TestCase
74
98
  end
75
99
  end
76
100
 
101
+ def test_io_gc
102
+ # Test that the reader keeps a reference
103
+ # to the io object
104
+ file = File.open(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
105
+ parser = XML::Parser.io(file)
106
+ file = nil
107
+ GC.start
108
+ assert(parser.parse)
109
+ end
110
+
111
+ def test_nil_io
112
+ error = assert_raise(TypeError) do
113
+ XML::Parser.io(nil)
114
+ end
115
+
116
+ assert_equal("Must pass in an IO object", error.to_s)
117
+ end
118
+
77
119
  def test_string_io
78
120
  data = File.read(File.join(File.dirname(__FILE__), 'model/rubynet.xml'))
79
121
  string_io = StringIO.new(data)
@@ -95,6 +137,14 @@ class TestParser < Test::Unit::TestCase
95
137
  assert_instance_of(XML::Parser::Context, parser.context)
96
138
  end
97
139
 
140
+ def test_nil_string
141
+ error = assert_raise(TypeError) do
142
+ XML::Parser.string(nil)
143
+ end
144
+
145
+ assert_equal("wrong argument type nil (expected String)", error.to_s)
146
+ end
147
+
98
148
  def test_string_options
99
149
  xml = <<-EOS
100
150
  <!DOCTYPE foo [<!ENTITY foo 'bar'>]>