blob: a96f0a8237fe9880a3177f0cc829f60f318cd099 [file] [log] [blame]
Antoine Pitroud72402e2010-10-27 18:52:48 +00001# regression test for SAX 2.0
Lars Gustäbel96753b32000-09-24 12:24:24 +00002# $Id$
3
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004from xml.sax import make_parser, ContentHandler, \
5 SAXException, SAXReaderNotAvailable, SAXParseException
Martin v. Löwis962c9e72000-10-06 17:41:52 +00006try:
7 make_parser()
Martin v. Löwis80670bc2000-10-06 21:13:23 +00008except SAXReaderNotAvailable:
Martin v. Löwis962c9e72000-10-06 17:41:52 +00009 # don't try to test this module if we cannot create a parser
10 raise ImportError("no XML parsers available")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000011from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \
12 XMLFilterBase
13from xml.sax.expatreader import create_parser
Antoine Pitrou6b03ee62010-10-27 18:33:30 +000014from xml.sax.handler import feature_namespaces
Thomas Wouters0e3f5912006-08-11 14:57:12 +000015from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
Guido van Rossum34d19282007-08-09 01:03:29 +000016from io import StringIO
Serhiy Storchaka1a4ed4c2013-02-02 12:17:05 +020017import os.path
Serhiy Storchakad5202392013-02-02 10:31:17 +020018import shutil
19from test import support
Benjamin Petersonee8712c2008-05-20 21:35:26 +000020from test.support import findfile, run_unittest
Guido van Rossumd8faa362007-04-27 19:54:29 +000021import unittest
Florent Xiclunaf15351d2010-03-13 23:24:31 +000022
23TEST_XMLFILE = findfile("test.xml", subdir="xmltestdata")
24TEST_XMLFILE_OUT = findfile("test.xml.out", subdir="xmltestdata")
Victor Stinner6c6f8512010-08-07 10:09:35 +000025try:
26 TEST_XMLFILE.encode("utf8")
27 TEST_XMLFILE_OUT.encode("utf8")
28except UnicodeEncodeError:
29 raise unittest.SkipTest("filename is not encodable to utf8")
Lars Gustäbel96753b32000-09-24 12:24:24 +000030
Serhiy Storchaka1a4ed4c2013-02-02 12:17:05 +020031supports_nonascii_filenames = True
32if not os.path.supports_unicode_filenames:
33 try:
34 support.TESTFN_UNICODE.encode(support.TESTFN_ENCODING)
35 except (UnicodeError, TypeError):
36 # Either the file system encoding is None, or the file name
37 # cannot be encoded in the file system encoding.
38 supports_nonascii_filenames = False
39requires_nonascii_filenames = unittest.skipUnless(
40 supports_nonascii_filenames,
41 'Requires non-ascii filenames support')
42
Guido van Rossumd8faa362007-04-27 19:54:29 +000043ns_uri = "http://www.python.org/xml-ns/saxtest/"
Lars Gustäbel96753b32000-09-24 12:24:24 +000044
Guido van Rossumd8faa362007-04-27 19:54:29 +000045class XmlTestBase(unittest.TestCase):
46 def verify_empty_attrs(self, attrs):
47 self.assertRaises(KeyError, attrs.getValue, "attr")
48 self.assertRaises(KeyError, attrs.getValueByQName, "attr")
49 self.assertRaises(KeyError, attrs.getNameByQName, "attr")
50 self.assertRaises(KeyError, attrs.getQNameByName, "attr")
51 self.assertRaises(KeyError, attrs.__getitem__, "attr")
Ezio Melottib3aedd42010-11-20 19:04:17 +000052 self.assertEqual(attrs.getLength(), 0)
53 self.assertEqual(attrs.getNames(), [])
54 self.assertEqual(attrs.getQNames(), [])
55 self.assertEqual(len(attrs), 0)
Ezio Melottib58e0bd2010-01-23 15:40:09 +000056 self.assertNotIn("attr", attrs)
Ezio Melottib3aedd42010-11-20 19:04:17 +000057 self.assertEqual(list(attrs.keys()), [])
58 self.assertEqual(attrs.get("attrs"), None)
59 self.assertEqual(attrs.get("attrs", 25), 25)
60 self.assertEqual(list(attrs.items()), [])
61 self.assertEqual(list(attrs.values()), [])
Lars Gustäbel96753b32000-09-24 12:24:24 +000062
Guido van Rossumd8faa362007-04-27 19:54:29 +000063 def verify_empty_nsattrs(self, attrs):
64 self.assertRaises(KeyError, attrs.getValue, (ns_uri, "attr"))
65 self.assertRaises(KeyError, attrs.getValueByQName, "ns:attr")
66 self.assertRaises(KeyError, attrs.getNameByQName, "ns:attr")
67 self.assertRaises(KeyError, attrs.getQNameByName, (ns_uri, "attr"))
68 self.assertRaises(KeyError, attrs.__getitem__, (ns_uri, "attr"))
Ezio Melottib3aedd42010-11-20 19:04:17 +000069 self.assertEqual(attrs.getLength(), 0)
70 self.assertEqual(attrs.getNames(), [])
71 self.assertEqual(attrs.getQNames(), [])
72 self.assertEqual(len(attrs), 0)
Ezio Melottib58e0bd2010-01-23 15:40:09 +000073 self.assertNotIn((ns_uri, "attr"), attrs)
Ezio Melottib3aedd42010-11-20 19:04:17 +000074 self.assertEqual(list(attrs.keys()), [])
75 self.assertEqual(attrs.get((ns_uri, "attr")), None)
76 self.assertEqual(attrs.get((ns_uri, "attr"), 25), 25)
77 self.assertEqual(list(attrs.items()), [])
78 self.assertEqual(list(attrs.values()), [])
Lars Gustäbel96753b32000-09-24 12:24:24 +000079
Guido van Rossumd8faa362007-04-27 19:54:29 +000080 def verify_attrs_wattr(self, attrs):
Ezio Melottib3aedd42010-11-20 19:04:17 +000081 self.assertEqual(attrs.getLength(), 1)
82 self.assertEqual(attrs.getNames(), ["attr"])
83 self.assertEqual(attrs.getQNames(), ["attr"])
84 self.assertEqual(len(attrs), 1)
Benjamin Peterson577473f2010-01-19 00:09:57 +000085 self.assertIn("attr", attrs)
Ezio Melottib3aedd42010-11-20 19:04:17 +000086 self.assertEqual(list(attrs.keys()), ["attr"])
87 self.assertEqual(attrs.get("attr"), "val")
88 self.assertEqual(attrs.get("attr", 25), "val")
89 self.assertEqual(list(attrs.items()), [("attr", "val")])
90 self.assertEqual(list(attrs.values()), ["val"])
91 self.assertEqual(attrs.getValue("attr"), "val")
92 self.assertEqual(attrs.getValueByQName("attr"), "val")
93 self.assertEqual(attrs.getNameByQName("attr"), "attr")
94 self.assertEqual(attrs["attr"], "val")
95 self.assertEqual(attrs.getQNameByName("attr"), "attr")
Lars Gustäbel96753b32000-09-24 12:24:24 +000096
Guido van Rossumd8faa362007-04-27 19:54:29 +000097class MakeParserTest(unittest.TestCase):
98 def test_make_parser2(self):
Lars Gustäbel2fc52942000-10-24 15:35:07 +000099 # Creating parsers several times in a row should succeed.
100 # Testing this because there have been failures of this kind
101 # before.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000102 from xml.sax import make_parser
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000103 p = make_parser()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000104 from xml.sax import make_parser
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000105 p = make_parser()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000106 from xml.sax import make_parser
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000107 p = make_parser()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000108 from xml.sax import make_parser
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000109 p = make_parser()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000110 from xml.sax import make_parser
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000111 p = make_parser()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000112 from xml.sax import make_parser
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000113 p = make_parser()
Tim Petersd2bf3b72001-01-18 02:22:22 +0000114
115
Lars Gustäbel96753b32000-09-24 12:24:24 +0000116# ===========================================================================
117#
118# saxutils tests
119#
120# ===========================================================================
121
Guido van Rossumd8faa362007-04-27 19:54:29 +0000122class SaxutilsTest(unittest.TestCase):
123 # ===== escape
124 def test_escape_basic(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000125 self.assertEqual(escape("Donald Duck & Co"), "Donald Duck & Co")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000126
Guido van Rossumd8faa362007-04-27 19:54:29 +0000127 def test_escape_all(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000128 self.assertEqual(escape("<Donald Duck & Co>"),
129 "&lt;Donald Duck &amp; Co&gt;")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000130
Guido van Rossumd8faa362007-04-27 19:54:29 +0000131 def test_escape_extra(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000132 self.assertEqual(escape("Hei på deg", {"å" : "&aring;"}),
133 "Hei p&aring; deg")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000134
Guido van Rossumd8faa362007-04-27 19:54:29 +0000135 # ===== unescape
136 def test_unescape_basic(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000137 self.assertEqual(unescape("Donald Duck &amp; Co"), "Donald Duck & Co")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000138
Guido van Rossumd8faa362007-04-27 19:54:29 +0000139 def test_unescape_all(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000140 self.assertEqual(unescape("&lt;Donald Duck &amp; Co&gt;"),
141 "<Donald Duck & Co>")
Martin v. Löwis74b51ac2002-10-26 14:50:45 +0000142
Guido van Rossumd8faa362007-04-27 19:54:29 +0000143 def test_unescape_extra(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000144 self.assertEqual(unescape("Hei på deg", {"å" : "&aring;"}),
145 "Hei p&aring; deg")
Martin v. Löwis74b51ac2002-10-26 14:50:45 +0000146
Guido van Rossumd8faa362007-04-27 19:54:29 +0000147 def test_unescape_amp_extra(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000148 self.assertEqual(unescape("&amp;foo;", {"&foo;": "splat"}), "&foo;")
Martin v. Löwis74b51ac2002-10-26 14:50:45 +0000149
Guido van Rossumd8faa362007-04-27 19:54:29 +0000150 # ===== quoteattr
151 def test_quoteattr_basic(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000152 self.assertEqual(quoteattr("Donald Duck & Co"),
153 '"Donald Duck &amp; Co"')
Martin v. Löwis74b51ac2002-10-26 14:50:45 +0000154
Guido van Rossumd8faa362007-04-27 19:54:29 +0000155 def test_single_quoteattr(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000156 self.assertEqual(quoteattr('Includes "double" quotes'),
157 '\'Includes "double" quotes\'')
Fred Drake32f3add2002-10-28 17:58:48 +0000158
Guido van Rossumd8faa362007-04-27 19:54:29 +0000159 def test_double_quoteattr(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000160 self.assertEqual(quoteattr("Includes 'single' quotes"),
161 "\"Includes 'single' quotes\"")
Fred Drakeacd32d32001-07-19 16:10:15 +0000162
Guido van Rossumd8faa362007-04-27 19:54:29 +0000163 def test_single_double_quoteattr(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000164 self.assertEqual(quoteattr("Includes 'single' and \"double\" quotes"),
165 "\"Includes 'single' and &quot;double&quot; quotes\"")
Fred Drakeacd32d32001-07-19 16:10:15 +0000166
Guido van Rossumd8faa362007-04-27 19:54:29 +0000167 # ===== make_parser
168 def test_make_parser(self):
Martin v. Löwis962c9e72000-10-06 17:41:52 +0000169 # Creating a parser should succeed - it should fall back
170 # to the expatreader
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000171 p = make_parser(['xml.parsers.no_such_parser'])
Martin v. Löwis962c9e72000-10-06 17:41:52 +0000172
173
Lars Gustäbel96753b32000-09-24 12:24:24 +0000174# ===== XMLGenerator
175
176start = '<?xml version="1.0" encoding="iso-8859-1"?>\n'
177
Guido van Rossumd8faa362007-04-27 19:54:29 +0000178class XmlgenTest(unittest.TestCase):
179 def test_xmlgen_basic(self):
180 result = StringIO()
181 gen = XMLGenerator(result)
182 gen.startDocument()
183 gen.startElement("doc", {})
184 gen.endElement("doc")
185 gen.endDocument()
Lars Gustäbel96753b32000-09-24 12:24:24 +0000186
Ezio Melottib3aedd42010-11-20 19:04:17 +0000187 self.assertEqual(result.getvalue(), start + "<doc></doc>")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000188
R. David Murraya90032a2010-10-17 22:46:45 +0000189 def test_xmlgen_basic_empty(self):
190 result = StringIO()
191 gen = XMLGenerator(result, short_empty_elements=True)
192 gen.startDocument()
193 gen.startElement("doc", {})
194 gen.endElement("doc")
195 gen.endDocument()
196
Ezio Melottib3aedd42010-11-20 19:04:17 +0000197 self.assertEqual(result.getvalue(), start + "<doc/>")
R. David Murraya90032a2010-10-17 22:46:45 +0000198
Guido van Rossumd8faa362007-04-27 19:54:29 +0000199 def test_xmlgen_content(self):
200 result = StringIO()
201 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000202
Guido van Rossumd8faa362007-04-27 19:54:29 +0000203 gen.startDocument()
204 gen.startElement("doc", {})
205 gen.characters("huhei")
206 gen.endElement("doc")
207 gen.endDocument()
Lars Gustäbel96753b32000-09-24 12:24:24 +0000208
Ezio Melottib3aedd42010-11-20 19:04:17 +0000209 self.assertEqual(result.getvalue(), start + "<doc>huhei</doc>")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000210
R. David Murraya90032a2010-10-17 22:46:45 +0000211 def test_xmlgen_content_empty(self):
212 result = StringIO()
213 gen = XMLGenerator(result, short_empty_elements=True)
214
215 gen.startDocument()
216 gen.startElement("doc", {})
217 gen.characters("huhei")
218 gen.endElement("doc")
219 gen.endDocument()
220
Ezio Melottib3aedd42010-11-20 19:04:17 +0000221 self.assertEqual(result.getvalue(), start + "<doc>huhei</doc>")
R. David Murraya90032a2010-10-17 22:46:45 +0000222
Guido van Rossumd8faa362007-04-27 19:54:29 +0000223 def test_xmlgen_pi(self):
224 result = StringIO()
225 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000226
Guido van Rossumd8faa362007-04-27 19:54:29 +0000227 gen.startDocument()
228 gen.processingInstruction("test", "data")
229 gen.startElement("doc", {})
230 gen.endElement("doc")
231 gen.endDocument()
Lars Gustäbel96753b32000-09-24 12:24:24 +0000232
Ezio Melottib3aedd42010-11-20 19:04:17 +0000233 self.assertEqual(result.getvalue(), start + "<?test data?><doc></doc>")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000234
Guido van Rossumd8faa362007-04-27 19:54:29 +0000235 def test_xmlgen_content_escape(self):
236 result = StringIO()
237 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000238
Guido van Rossumd8faa362007-04-27 19:54:29 +0000239 gen.startDocument()
240 gen.startElement("doc", {})
241 gen.characters("<huhei&")
242 gen.endElement("doc")
243 gen.endDocument()
Lars Gustäbel96753b32000-09-24 12:24:24 +0000244
Ezio Melottib3aedd42010-11-20 19:04:17 +0000245 self.assertEqual(result.getvalue(),
Guido van Rossumd8faa362007-04-27 19:54:29 +0000246 start + "<doc>&lt;huhei&amp;</doc>")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000247
Guido van Rossumd8faa362007-04-27 19:54:29 +0000248 def test_xmlgen_attr_escape(self):
249 result = StringIO()
250 gen = XMLGenerator(result)
Fred Drakec9fadf92001-08-07 19:17:06 +0000251
Guido van Rossumd8faa362007-04-27 19:54:29 +0000252 gen.startDocument()
253 gen.startElement("doc", {"a": '"'})
254 gen.startElement("e", {"a": "'"})
255 gen.endElement("e")
256 gen.startElement("e", {"a": "'\""})
257 gen.endElement("e")
258 gen.startElement("e", {"a": "\n\r\t"})
259 gen.endElement("e")
260 gen.endElement("doc")
261 gen.endDocument()
Fred Drakec9fadf92001-08-07 19:17:06 +0000262
Ezio Melottib3aedd42010-11-20 19:04:17 +0000263 self.assertEqual(result.getvalue(), start +
Guido van Rossumd8faa362007-04-27 19:54:29 +0000264 ("<doc a='\"'><e a=\"'\"></e>"
265 "<e a=\"'&quot;\"></e>"
266 "<e a=\"&#10;&#13;&#9;\"></e></doc>"))
Fred Drakec9fadf92001-08-07 19:17:06 +0000267
Guido van Rossumd8faa362007-04-27 19:54:29 +0000268 def test_xmlgen_ignorable(self):
269 result = StringIO()
270 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000271
Guido van Rossumd8faa362007-04-27 19:54:29 +0000272 gen.startDocument()
273 gen.startElement("doc", {})
274 gen.ignorableWhitespace(" ")
275 gen.endElement("doc")
276 gen.endDocument()
Lars Gustäbel96753b32000-09-24 12:24:24 +0000277
Ezio Melottib3aedd42010-11-20 19:04:17 +0000278 self.assertEqual(result.getvalue(), start + "<doc> </doc>")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000279
R. David Murraya90032a2010-10-17 22:46:45 +0000280 def test_xmlgen_ignorable_empty(self):
281 result = StringIO()
282 gen = XMLGenerator(result, short_empty_elements=True)
283
284 gen.startDocument()
285 gen.startElement("doc", {})
286 gen.ignorableWhitespace(" ")
287 gen.endElement("doc")
288 gen.endDocument()
289
Ezio Melottib3aedd42010-11-20 19:04:17 +0000290 self.assertEqual(result.getvalue(), start + "<doc> </doc>")
R. David Murraya90032a2010-10-17 22:46:45 +0000291
Guido van Rossumd8faa362007-04-27 19:54:29 +0000292 def test_xmlgen_ns(self):
293 result = StringIO()
294 gen = XMLGenerator(result)
Lars Gustäbel96753b32000-09-24 12:24:24 +0000295
Guido van Rossumd8faa362007-04-27 19:54:29 +0000296 gen.startDocument()
297 gen.startPrefixMapping("ns1", ns_uri)
298 gen.startElementNS((ns_uri, "doc"), "ns1:doc", {})
299 # add an unqualified name
300 gen.startElementNS((None, "udoc"), None, {})
301 gen.endElementNS((None, "udoc"), None)
302 gen.endElementNS((ns_uri, "doc"), "ns1:doc")
303 gen.endPrefixMapping("ns1")
304 gen.endDocument()
Fred Drake004d5e62000-10-23 17:22:08 +0000305
Ezio Melottib3aedd42010-11-20 19:04:17 +0000306 self.assertEqual(result.getvalue(), start + \
Martin v. Löwiscf0a1cc2000-10-03 22:35:29 +0000307 ('<ns1:doc xmlns:ns1="%s"><udoc></udoc></ns1:doc>' %
Guido van Rossumd8faa362007-04-27 19:54:29 +0000308 ns_uri))
Lars Gustäbel96753b32000-09-24 12:24:24 +0000309
R. David Murraya90032a2010-10-17 22:46:45 +0000310 def test_xmlgen_ns_empty(self):
311 result = StringIO()
312 gen = XMLGenerator(result, short_empty_elements=True)
313
314 gen.startDocument()
315 gen.startPrefixMapping("ns1", ns_uri)
316 gen.startElementNS((ns_uri, "doc"), "ns1:doc", {})
317 # add an unqualified name
318 gen.startElementNS((None, "udoc"), None, {})
319 gen.endElementNS((None, "udoc"), None)
320 gen.endElementNS((ns_uri, "doc"), "ns1:doc")
321 gen.endPrefixMapping("ns1")
322 gen.endDocument()
323
Ezio Melottib3aedd42010-11-20 19:04:17 +0000324 self.assertEqual(result.getvalue(), start + \
R. David Murraya90032a2010-10-17 22:46:45 +0000325 ('<ns1:doc xmlns:ns1="%s"><udoc/></ns1:doc>' %
326 ns_uri))
327
Guido van Rossumd8faa362007-04-27 19:54:29 +0000328 def test_1463026_1(self):
329 result = StringIO()
330 gen = XMLGenerator(result)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000331
Guido van Rossumd8faa362007-04-27 19:54:29 +0000332 gen.startDocument()
333 gen.startElementNS((None, 'a'), 'a', {(None, 'b'):'c'})
334 gen.endElementNS((None, 'a'), 'a')
335 gen.endDocument()
Thomas Wouterscf297e42007-02-23 15:07:44 +0000336
Ezio Melottib3aedd42010-11-20 19:04:17 +0000337 self.assertEqual(result.getvalue(), start+'<a b="c"></a>')
Thomas Wouterscf297e42007-02-23 15:07:44 +0000338
R. David Murraya90032a2010-10-17 22:46:45 +0000339 def test_1463026_1_empty(self):
340 result = StringIO()
341 gen = XMLGenerator(result, short_empty_elements=True)
342
343 gen.startDocument()
344 gen.startElementNS((None, 'a'), 'a', {(None, 'b'):'c'})
345 gen.endElementNS((None, 'a'), 'a')
346 gen.endDocument()
347
Ezio Melottib3aedd42010-11-20 19:04:17 +0000348 self.assertEqual(result.getvalue(), start+'<a b="c"/>')
R. David Murraya90032a2010-10-17 22:46:45 +0000349
Guido van Rossumd8faa362007-04-27 19:54:29 +0000350 def test_1463026_2(self):
351 result = StringIO()
352 gen = XMLGenerator(result)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000353
Guido van Rossumd8faa362007-04-27 19:54:29 +0000354 gen.startDocument()
355 gen.startPrefixMapping(None, 'qux')
356 gen.startElementNS(('qux', 'a'), 'a', {})
357 gen.endElementNS(('qux', 'a'), 'a')
358 gen.endPrefixMapping(None)
359 gen.endDocument()
Thomas Wouterscf297e42007-02-23 15:07:44 +0000360
Ezio Melottib3aedd42010-11-20 19:04:17 +0000361 self.assertEqual(result.getvalue(), start+'<a xmlns="qux"></a>')
Thomas Wouterscf297e42007-02-23 15:07:44 +0000362
R. David Murraya90032a2010-10-17 22:46:45 +0000363 def test_1463026_2_empty(self):
364 result = StringIO()
365 gen = XMLGenerator(result, short_empty_elements=True)
366
367 gen.startDocument()
368 gen.startPrefixMapping(None, 'qux')
369 gen.startElementNS(('qux', 'a'), 'a', {})
370 gen.endElementNS(('qux', 'a'), 'a')
371 gen.endPrefixMapping(None)
372 gen.endDocument()
373
Ezio Melottib3aedd42010-11-20 19:04:17 +0000374 self.assertEqual(result.getvalue(), start+'<a xmlns="qux"/>')
R. David Murraya90032a2010-10-17 22:46:45 +0000375
Guido van Rossumd8faa362007-04-27 19:54:29 +0000376 def test_1463026_3(self):
377 result = StringIO()
378 gen = XMLGenerator(result)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000379
Guido van Rossumd8faa362007-04-27 19:54:29 +0000380 gen.startDocument()
381 gen.startPrefixMapping('my', 'qux')
382 gen.startElementNS(('qux', 'a'), 'a', {(None, 'b'):'c'})
383 gen.endElementNS(('qux', 'a'), 'a')
384 gen.endPrefixMapping('my')
385 gen.endDocument()
Thomas Wouterscf297e42007-02-23 15:07:44 +0000386
Ezio Melottib3aedd42010-11-20 19:04:17 +0000387 self.assertEqual(result.getvalue(),
Guido van Rossumd8faa362007-04-27 19:54:29 +0000388 start+'<my:a xmlns:my="qux" b="c"></my:a>')
Lars Gustäbel96753b32000-09-24 12:24:24 +0000389
R. David Murraya90032a2010-10-17 22:46:45 +0000390 def test_1463026_3_empty(self):
391 result = StringIO()
392 gen = XMLGenerator(result, short_empty_elements=True)
393
394 gen.startDocument()
395 gen.startPrefixMapping('my', 'qux')
396 gen.startElementNS(('qux', 'a'), 'a', {(None, 'b'):'c'})
397 gen.endElementNS(('qux', 'a'), 'a')
398 gen.endPrefixMapping('my')
399 gen.endDocument()
400
Ezio Melottib3aedd42010-11-20 19:04:17 +0000401 self.assertEqual(result.getvalue(),
R. David Murraya90032a2010-10-17 22:46:45 +0000402 start+'<my:a xmlns:my="qux" b="c"/>')
403
Antoine Pitrou6b03ee62010-10-27 18:33:30 +0000404 def test_5027_1(self):
405 # The xml prefix (as in xml:lang below) is reserved and bound by
406 # definition to http://www.w3.org/XML/1998/namespace. XMLGenerator had
Andrew Svetlov737fb892012-12-18 21:14:22 +0200407 # a bug whereby a KeyError is raised because this namespace is missing
Antoine Pitrou6b03ee62010-10-27 18:33:30 +0000408 # from a dictionary.
409 #
410 # This test demonstrates the bug by parsing a document.
411 test_xml = StringIO(
412 '<?xml version="1.0"?>'
413 '<a:g1 xmlns:a="http://example.com/ns">'
414 '<a:g2 xml:lang="en">Hello</a:g2>'
415 '</a:g1>')
416
417 parser = make_parser()
418 parser.setFeature(feature_namespaces, True)
419 result = StringIO()
420 gen = XMLGenerator(result)
421 parser.setContentHandler(gen)
422 parser.parse(test_xml)
423
Ezio Melottib3aedd42010-11-20 19:04:17 +0000424 self.assertEqual(result.getvalue(),
425 start + (
426 '<a:g1 xmlns:a="http://example.com/ns">'
427 '<a:g2 xml:lang="en">Hello</a:g2>'
428 '</a:g1>'))
Antoine Pitrou6b03ee62010-10-27 18:33:30 +0000429
430 def test_5027_2(self):
431 # The xml prefix (as in xml:lang below) is reserved and bound by
432 # definition to http://www.w3.org/XML/1998/namespace. XMLGenerator had
Andrew Svetlov737fb892012-12-18 21:14:22 +0200433 # a bug whereby a KeyError is raised because this namespace is missing
Antoine Pitrou6b03ee62010-10-27 18:33:30 +0000434 # from a dictionary.
435 #
436 # This test demonstrates the bug by direct manipulation of the
437 # XMLGenerator.
438 result = StringIO()
439 gen = XMLGenerator(result)
440
441 gen.startDocument()
442 gen.startPrefixMapping('a', 'http://example.com/ns')
443 gen.startElementNS(('http://example.com/ns', 'g1'), 'g1', {})
444 lang_attr = {('http://www.w3.org/XML/1998/namespace', 'lang'): 'en'}
445 gen.startElementNS(('http://example.com/ns', 'g2'), 'g2', lang_attr)
446 gen.characters('Hello')
447 gen.endElementNS(('http://example.com/ns', 'g2'), 'g2')
448 gen.endElementNS(('http://example.com/ns', 'g1'), 'g1')
449 gen.endPrefixMapping('a')
450 gen.endDocument()
451
Ezio Melottib3aedd42010-11-20 19:04:17 +0000452 self.assertEqual(result.getvalue(),
453 start + (
454 '<a:g1 xmlns:a="http://example.com/ns">'
455 '<a:g2 xml:lang="en">Hello</a:g2>'
456 '</a:g1>'))
Antoine Pitrou6b03ee62010-10-27 18:33:30 +0000457
Fred Drake004d5e62000-10-23 17:22:08 +0000458
Guido van Rossumd8faa362007-04-27 19:54:29 +0000459class XMLFilterBaseTest(unittest.TestCase):
460 def test_filter_basic(self):
461 result = StringIO()
462 gen = XMLGenerator(result)
463 filter = XMLFilterBase()
464 filter.setContentHandler(gen)
Lars Gustäbel96753b32000-09-24 12:24:24 +0000465
Guido van Rossumd8faa362007-04-27 19:54:29 +0000466 filter.startDocument()
467 filter.startElement("doc", {})
468 filter.characters("content")
469 filter.ignorableWhitespace(" ")
470 filter.endElement("doc")
471 filter.endDocument()
472
Ezio Melottib3aedd42010-11-20 19:04:17 +0000473 self.assertEqual(result.getvalue(), start + "<doc>content </doc>")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000474
475# ===========================================================================
476#
477# expatreader tests
478#
479# ===========================================================================
480
Benjamin Petersond5df36d2010-10-31 18:23:23 +0000481with open(TEST_XMLFILE_OUT) as f:
482 xml_test_out = f.read()
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000483
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484class ExpatReaderTest(XmlTestBase):
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000485
Guido van Rossumd8faa362007-04-27 19:54:29 +0000486 # ===== XMLReader support
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000487
Guido van Rossumd8faa362007-04-27 19:54:29 +0000488 def test_expat_file(self):
489 parser = create_parser()
490 result = StringIO()
491 xmlgen = XMLGenerator(result)
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000492
Guido van Rossumd8faa362007-04-27 19:54:29 +0000493 parser.setContentHandler(xmlgen)
Benjamin Petersond5df36d2010-10-31 18:23:23 +0000494 with open(TEST_XMLFILE) as f:
495 parser.parse(f)
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000496
Ezio Melottib3aedd42010-11-20 19:04:17 +0000497 self.assertEqual(result.getvalue(), xml_test_out)
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000498
Serhiy Storchaka1a4ed4c2013-02-02 12:17:05 +0200499 @requires_nonascii_filenames
Serhiy Storchakad5202392013-02-02 10:31:17 +0200500 def test_expat_file_nonascii(self):
501 fname = support.TESTFN_UNICODE
502 shutil.copyfile(TEST_XMLFILE, fname)
503 self.addCleanup(support.unlink, fname)
504
505 parser = create_parser()
506 result = StringIO()
507 xmlgen = XMLGenerator(result)
508
509 parser.setContentHandler(xmlgen)
510 parser.parse(open(fname))
511
512 self.assertEqual(result.getvalue(), xml_test_out)
513
Guido van Rossumd8faa362007-04-27 19:54:29 +0000514 # ===== DTDHandler support
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000515
Guido van Rossumd8faa362007-04-27 19:54:29 +0000516 class TestDTDHandler:
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000517
Guido van Rossumd8faa362007-04-27 19:54:29 +0000518 def __init__(self):
519 self._notations = []
520 self._entities = []
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000521
Guido van Rossumd8faa362007-04-27 19:54:29 +0000522 def notationDecl(self, name, publicId, systemId):
523 self._notations.append((name, publicId, systemId))
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000524
Guido van Rossumd8faa362007-04-27 19:54:29 +0000525 def unparsedEntityDecl(self, name, publicId, systemId, ndata):
526 self._entities.append((name, publicId, systemId, ndata))
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000527
Guido van Rossumd8faa362007-04-27 19:54:29 +0000528 def test_expat_dtdhandler(self):
529 parser = create_parser()
530 handler = self.TestDTDHandler()
531 parser.setDTDHandler(handler)
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000532
Guido van Rossumd8faa362007-04-27 19:54:29 +0000533 parser.feed('<!DOCTYPE doc [\n')
534 parser.feed(' <!ENTITY img SYSTEM "expat.gif" NDATA GIF>\n')
535 parser.feed(' <!NOTATION GIF PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN">\n')
536 parser.feed(']>\n')
537 parser.feed('<doc></doc>')
538 parser.close()
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000539
Ezio Melottib3aedd42010-11-20 19:04:17 +0000540 self.assertEqual(handler._notations,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000541 [("GIF", "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN", None)])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000542 self.assertEqual(handler._entities, [("img", None, "expat.gif", "GIF")])
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000543
Guido van Rossumd8faa362007-04-27 19:54:29 +0000544 # ===== EntityResolver support
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000545
Guido van Rossumd8faa362007-04-27 19:54:29 +0000546 class TestEntityResolver:
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000547
Guido van Rossumd8faa362007-04-27 19:54:29 +0000548 def resolveEntity(self, publicId, systemId):
549 inpsrc = InputSource()
550 inpsrc.setByteStream(StringIO("<entity/>"))
551 return inpsrc
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000552
Guido van Rossumd8faa362007-04-27 19:54:29 +0000553 def test_expat_entityresolver(self):
554 parser = create_parser()
555 parser.setEntityResolver(self.TestEntityResolver())
556 result = StringIO()
557 parser.setContentHandler(XMLGenerator(result))
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000558
Guido van Rossumd8faa362007-04-27 19:54:29 +0000559 parser.feed('<!DOCTYPE doc [\n')
560 parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
561 parser.feed(']>\n')
562 parser.feed('<doc>&test;</doc>')
563 parser.close()
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000564
Ezio Melottib3aedd42010-11-20 19:04:17 +0000565 self.assertEqual(result.getvalue(), start +
566 "<doc><entity></entity></doc>")
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000567
Guido van Rossumd8faa362007-04-27 19:54:29 +0000568 # ===== Attributes support
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000569
Guido van Rossumd8faa362007-04-27 19:54:29 +0000570 class AttrGatherer(ContentHandler):
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000571
Guido van Rossumd8faa362007-04-27 19:54:29 +0000572 def startElement(self, name, attrs):
573 self._attrs = attrs
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000574
Guido van Rossumd8faa362007-04-27 19:54:29 +0000575 def startElementNS(self, name, qname, attrs):
576 self._attrs = attrs
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000577
Guido van Rossumd8faa362007-04-27 19:54:29 +0000578 def test_expat_attrs_empty(self):
579 parser = create_parser()
580 gather = self.AttrGatherer()
581 parser.setContentHandler(gather)
582
583 parser.feed("<doc/>")
584 parser.close()
585
586 self.verify_empty_attrs(gather._attrs)
587
588 def test_expat_attrs_wattr(self):
589 parser = create_parser()
590 gather = self.AttrGatherer()
591 parser.setContentHandler(gather)
592
593 parser.feed("<doc attr='val'/>")
594 parser.close()
595
596 self.verify_attrs_wattr(gather._attrs)
597
598 def test_expat_nsattrs_empty(self):
599 parser = create_parser(1)
600 gather = self.AttrGatherer()
601 parser.setContentHandler(gather)
602
603 parser.feed("<doc/>")
604 parser.close()
605
606 self.verify_empty_nsattrs(gather._attrs)
607
608 def test_expat_nsattrs_wattr(self):
609 parser = create_parser(1)
610 gather = self.AttrGatherer()
611 parser.setContentHandler(gather)
612
613 parser.feed("<doc xmlns:ns='%s' ns:attr='val'/>" % ns_uri)
614 parser.close()
615
616 attrs = gather._attrs
617
Ezio Melottib3aedd42010-11-20 19:04:17 +0000618 self.assertEqual(attrs.getLength(), 1)
619 self.assertEqual(attrs.getNames(), [(ns_uri, "attr")])
Guido van Rossumd8faa362007-04-27 19:54:29 +0000620 self.assertTrue((attrs.getQNames() == [] or
621 attrs.getQNames() == ["ns:attr"]))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000622 self.assertEqual(len(attrs), 1)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000623 self.assertIn((ns_uri, "attr"), attrs)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000624 self.assertEqual(attrs.get((ns_uri, "attr")), "val")
625 self.assertEqual(attrs.get((ns_uri, "attr"), 25), "val")
626 self.assertEqual(list(attrs.items()), [((ns_uri, "attr"), "val")])
627 self.assertEqual(list(attrs.values()), ["val"])
628 self.assertEqual(attrs.getValue((ns_uri, "attr")), "val")
629 self.assertEqual(attrs[(ns_uri, "attr")], "val")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000630
631 # ===== InputSource support
632
Benjamin Petersona7f4f5a2008-09-04 02:22:52 +0000633 def test_expat_inpsource_filename(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000634 parser = create_parser()
635 result = StringIO()
636 xmlgen = XMLGenerator(result)
637
638 parser.setContentHandler(xmlgen)
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000639 parser.parse(TEST_XMLFILE)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000640
Ezio Melottib3aedd42010-11-20 19:04:17 +0000641 self.assertEqual(result.getvalue(), xml_test_out)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000642
Benjamin Petersona7f4f5a2008-09-04 02:22:52 +0000643 def test_expat_inpsource_sysid(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000644 parser = create_parser()
645 result = StringIO()
646 xmlgen = XMLGenerator(result)
647
648 parser.setContentHandler(xmlgen)
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000649 parser.parse(InputSource(TEST_XMLFILE))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000650
Ezio Melottib3aedd42010-11-20 19:04:17 +0000651 self.assertEqual(result.getvalue(), xml_test_out)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000652
Serhiy Storchaka1a4ed4c2013-02-02 12:17:05 +0200653 @requires_nonascii_filenames
Serhiy Storchakad5202392013-02-02 10:31:17 +0200654 def test_expat_inpsource_sysid_nonascii(self):
655 fname = support.TESTFN_UNICODE
656 shutil.copyfile(TEST_XMLFILE, fname)
657 self.addCleanup(support.unlink, fname)
658
659 parser = create_parser()
660 result = StringIO()
661 xmlgen = XMLGenerator(result)
662
663 parser.setContentHandler(xmlgen)
664 parser.parse(InputSource(fname))
665
666 self.assertEqual(result.getvalue(), xml_test_out)
667
Guido van Rossumd8faa362007-04-27 19:54:29 +0000668 def test_expat_inpsource_stream(self):
669 parser = create_parser()
670 result = StringIO()
671 xmlgen = XMLGenerator(result)
672
673 parser.setContentHandler(xmlgen)
674 inpsrc = InputSource()
Benjamin Petersond5df36d2010-10-31 18:23:23 +0000675 with open(TEST_XMLFILE) as f:
676 inpsrc.setByteStream(f)
677 parser.parse(inpsrc)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000678
Ezio Melottib3aedd42010-11-20 19:04:17 +0000679 self.assertEqual(result.getvalue(), xml_test_out)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000680
681 # ===== IncrementalParser support
682
683 def test_expat_incremental(self):
684 result = StringIO()
685 xmlgen = XMLGenerator(result)
686 parser = create_parser()
687 parser.setContentHandler(xmlgen)
688
689 parser.feed("<doc>")
690 parser.feed("</doc>")
691 parser.close()
692
Ezio Melottib3aedd42010-11-20 19:04:17 +0000693 self.assertEqual(result.getvalue(), start + "<doc></doc>")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000694
695 def test_expat_incremental_reset(self):
696 result = StringIO()
697 xmlgen = XMLGenerator(result)
698 parser = create_parser()
699 parser.setContentHandler(xmlgen)
700
701 parser.feed("<doc>")
702 parser.feed("text")
703
704 result = StringIO()
705 xmlgen = XMLGenerator(result)
706 parser.setContentHandler(xmlgen)
707 parser.reset()
708
709 parser.feed("<doc>")
710 parser.feed("text")
711 parser.feed("</doc>")
712 parser.close()
713
Ezio Melottib3aedd42010-11-20 19:04:17 +0000714 self.assertEqual(result.getvalue(), start + "<doc>text</doc>")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000715
716 # ===== Locator support
717
718 def test_expat_locator_noinfo(self):
719 result = StringIO()
720 xmlgen = XMLGenerator(result)
721 parser = create_parser()
722 parser.setContentHandler(xmlgen)
723
724 parser.feed("<doc>")
725 parser.feed("</doc>")
726 parser.close()
727
Ezio Melottib3aedd42010-11-20 19:04:17 +0000728 self.assertEqual(parser.getSystemId(), None)
729 self.assertEqual(parser.getPublicId(), None)
730 self.assertEqual(parser.getLineNumber(), 1)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000731
Benjamin Petersona7f4f5a2008-09-04 02:22:52 +0000732 def test_expat_locator_withinfo(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000733 result = StringIO()
734 xmlgen = XMLGenerator(result)
735 parser = create_parser()
736 parser.setContentHandler(xmlgen)
Florent Xiclunaf15351d2010-03-13 23:24:31 +0000737 parser.parse(TEST_XMLFILE)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000738
Ezio Melottib3aedd42010-11-20 19:04:17 +0000739 self.assertEqual(parser.getSystemId(), TEST_XMLFILE)
740 self.assertEqual(parser.getPublicId(), None)
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000741
Serhiy Storchaka1a4ed4c2013-02-02 12:17:05 +0200742 @requires_nonascii_filenames
Serhiy Storchakad5202392013-02-02 10:31:17 +0200743 def test_expat_locator_withinfo_nonascii(self):
744 fname = support.TESTFN_UNICODE
745 shutil.copyfile(TEST_XMLFILE, fname)
746 self.addCleanup(support.unlink, fname)
747
748 result = StringIO()
749 xmlgen = XMLGenerator(result)
750 parser = create_parser()
751 parser.setContentHandler(xmlgen)
752 parser.parse(fname)
753
754 self.assertEqual(parser.getSystemId(), fname)
755 self.assertEqual(parser.getPublicId(), None)
756
Martin v. Löwis80670bc2000-10-06 21:13:23 +0000757
758# ===========================================================================
759#
760# error reporting
761#
762# ===========================================================================
763
Guido van Rossumd8faa362007-04-27 19:54:29 +0000764class ErrorReportingTest(unittest.TestCase):
765 def test_expat_inpsource_location(self):
766 parser = create_parser()
767 parser.setContentHandler(ContentHandler()) # do nothing
768 source = InputSource()
769 source.setByteStream(StringIO("<foo bar foobar>")) #ill-formed
770 name = "a file name"
771 source.setSystemId(name)
772 try:
773 parser.parse(source)
774 self.fail()
775 except SAXException as e:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000776 self.assertEqual(e.getSystemId(), name)
Martin v. Löwis80670bc2000-10-06 21:13:23 +0000777
Guido van Rossumd8faa362007-04-27 19:54:29 +0000778 def test_expat_incomplete(self):
779 parser = create_parser()
780 parser.setContentHandler(ContentHandler()) # do nothing
781 self.assertRaises(SAXParseException, parser.parse, StringIO("<foo>"))
Martin v. Löwis80670bc2000-10-06 21:13:23 +0000782
Guido van Rossumd8faa362007-04-27 19:54:29 +0000783 def test_sax_parse_exception_str(self):
784 # pass various values from a locator to the SAXParseException to
785 # make sure that the __str__() doesn't fall apart when None is
786 # passed instead of an integer line and column number
787 #
788 # use "normal" values for the locator:
789 str(SAXParseException("message", None,
790 self.DummyLocator(1, 1)))
791 # use None for the line number:
792 str(SAXParseException("message", None,
793 self.DummyLocator(None, 1)))
794 # use None for the column number:
795 str(SAXParseException("message", None,
796 self.DummyLocator(1, None)))
797 # use None for both:
798 str(SAXParseException("message", None,
799 self.DummyLocator(None, None)))
Fred Drake6fd0b0d2004-03-20 08:15:30 +0000800
Guido van Rossumd8faa362007-04-27 19:54:29 +0000801 class DummyLocator:
802 def __init__(self, lineno, colno):
803 self._lineno = lineno
804 self._colno = colno
Fred Drake6fd0b0d2004-03-20 08:15:30 +0000805
Guido van Rossumd8faa362007-04-27 19:54:29 +0000806 def getPublicId(self):
807 return "pubid"
Fred Drake6fd0b0d2004-03-20 08:15:30 +0000808
Guido van Rossumd8faa362007-04-27 19:54:29 +0000809 def getSystemId(self):
810 return "sysid"
Fred Drake6fd0b0d2004-03-20 08:15:30 +0000811
Guido van Rossumd8faa362007-04-27 19:54:29 +0000812 def getLineNumber(self):
813 return self._lineno
Fred Drake6fd0b0d2004-03-20 08:15:30 +0000814
Guido van Rossumd8faa362007-04-27 19:54:29 +0000815 def getColumnNumber(self):
816 return self._colno
Martin v. Löwis80670bc2000-10-06 21:13:23 +0000817
Lars Gustäbelab647872000-09-24 18:40:52 +0000818# ===========================================================================
819#
820# xmlreader tests
821#
822# ===========================================================================
823
Guido van Rossumd8faa362007-04-27 19:54:29 +0000824class XmlReaderTest(XmlTestBase):
Lars Gustäbelab647872000-09-24 18:40:52 +0000825
Guido van Rossumd8faa362007-04-27 19:54:29 +0000826 # ===== AttributesImpl
827 def test_attrs_empty(self):
828 self.verify_empty_attrs(AttributesImpl({}))
Lars Gustäbelab647872000-09-24 18:40:52 +0000829
Guido van Rossumd8faa362007-04-27 19:54:29 +0000830 def test_attrs_wattr(self):
831 self.verify_attrs_wattr(AttributesImpl({"attr" : "val"}))
Lars Gustäbelab647872000-09-24 18:40:52 +0000832
Guido van Rossumd8faa362007-04-27 19:54:29 +0000833 def test_nsattrs_empty(self):
834 self.verify_empty_nsattrs(AttributesNSImpl({}, {}))
Lars Gustäbelab647872000-09-24 18:40:52 +0000835
Guido van Rossumd8faa362007-04-27 19:54:29 +0000836 def test_nsattrs_wattr(self):
837 attrs = AttributesNSImpl({(ns_uri, "attr") : "val"},
838 {(ns_uri, "attr") : "ns:attr"})
Fred Drake004d5e62000-10-23 17:22:08 +0000839
Ezio Melottib3aedd42010-11-20 19:04:17 +0000840 self.assertEqual(attrs.getLength(), 1)
841 self.assertEqual(attrs.getNames(), [(ns_uri, "attr")])
842 self.assertEqual(attrs.getQNames(), ["ns:attr"])
843 self.assertEqual(len(attrs), 1)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000844 self.assertIn((ns_uri, "attr"), attrs)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000845 self.assertEqual(list(attrs.keys()), [(ns_uri, "attr")])
846 self.assertEqual(attrs.get((ns_uri, "attr")), "val")
847 self.assertEqual(attrs.get((ns_uri, "attr"), 25), "val")
848 self.assertEqual(list(attrs.items()), [((ns_uri, "attr"), "val")])
849 self.assertEqual(list(attrs.values()), ["val"])
850 self.assertEqual(attrs.getValue((ns_uri, "attr")), "val")
851 self.assertEqual(attrs.getValueByQName("ns:attr"), "val")
852 self.assertEqual(attrs.getNameByQName("ns:attr"), (ns_uri, "attr"))
853 self.assertEqual(attrs[(ns_uri, "attr")], "val")
854 self.assertEqual(attrs.getQNameByName((ns_uri, "attr")), "ns:attr")
Fred Drake004d5e62000-10-23 17:22:08 +0000855
Lars Gustäbelab647872000-09-24 18:40:52 +0000856
Christian Heimesbbe741d2008-03-28 10:53:29 +0000857def test_main():
Guido van Rossumd8faa362007-04-27 19:54:29 +0000858 run_unittest(MakeParserTest,
859 SaxutilsTest,
860 XmlgenTest,
861 ExpatReaderTest,
862 ErrorReportingTest,
863 XmlReaderTest)
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000864
Guido van Rossumd8faa362007-04-27 19:54:29 +0000865if __name__ == "__main__":
Christian Heimesbbe741d2008-03-28 10:53:29 +0000866 test_main()