]>
git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_sax.py
1 # regression test for SAX 2.0 -*- coding: utf-8 -*-
4 from xml
.sax
import make_parser
, ContentHandler
, \
5 SAXException
, SAXReaderNotAvailable
, SAXParseException
8 except SAXReaderNotAvailable
:
9 # don't try to test this module if we cannot create a parser
10 raise ImportError("no XML parsers available")
11 from xml
.sax
.saxutils
import XMLGenerator
, escape
, unescape
, quoteattr
, \
13 from xml
.sax
.expatreader
import create_parser
14 from xml
.sax
.handler
import feature_namespaces
15 from xml
.sax
.xmlreader
import InputSource
, AttributesImpl
, AttributesNSImpl
16 from cStringIO
import StringIO
17 from test
.test_support
import findfile
, run_unittest
20 TEST_XMLFILE
= findfile("test.xml", subdir
="xmltestdata")
21 TEST_XMLFILE_OUT
= findfile("test.xml.out", subdir
="xmltestdata")
23 ns_uri
= "http://www.python.org/xml-ns/saxtest/"
25 class XmlTestBase(unittest
.TestCase
):
26 def verify_empty_attrs(self
, attrs
):
27 self
.assertRaises(KeyError, attrs
.getValue
, "attr")
28 self
.assertRaises(KeyError, attrs
.getValueByQName
, "attr")
29 self
.assertRaises(KeyError, attrs
.getNameByQName
, "attr")
30 self
.assertRaises(KeyError, attrs
.getQNameByName
, "attr")
31 self
.assertRaises(KeyError, attrs
.__getitem
__, "attr")
32 self
.assertEqual(attrs
.getLength(), 0)
33 self
.assertEqual(attrs
.getNames(), [])
34 self
.assertEqual(attrs
.getQNames(), [])
35 self
.assertEqual(len(attrs
), 0)
36 self
.assertFalse(attrs
.has_key("attr"))
37 self
.assertEqual(attrs
.keys(), [])
38 self
.assertEqual(attrs
.get("attrs"), None)
39 self
.assertEqual(attrs
.get("attrs", 25), 25)
40 self
.assertEqual(attrs
.items(), [])
41 self
.assertEqual(attrs
.values(), [])
43 def verify_empty_nsattrs(self
, attrs
):
44 self
.assertRaises(KeyError, attrs
.getValue
, (ns_uri
, "attr"))
45 self
.assertRaises(KeyError, attrs
.getValueByQName
, "ns:attr")
46 self
.assertRaises(KeyError, attrs
.getNameByQName
, "ns:attr")
47 self
.assertRaises(KeyError, attrs
.getQNameByName
, (ns_uri
, "attr"))
48 self
.assertRaises(KeyError, attrs
.__getitem
__, (ns_uri
, "attr"))
49 self
.assertEqual(attrs
.getLength(), 0)
50 self
.assertEqual(attrs
.getNames(), [])
51 self
.assertEqual(attrs
.getQNames(), [])
52 self
.assertEqual(len(attrs
), 0)
53 self
.assertFalse(attrs
.has_key((ns_uri
, "attr")))
54 self
.assertEqual(attrs
.keys(), [])
55 self
.assertEqual(attrs
.get((ns_uri
, "attr")), None)
56 self
.assertEqual(attrs
.get((ns_uri
, "attr"), 25), 25)
57 self
.assertEqual(attrs
.items(), [])
58 self
.assertEqual(attrs
.values(), [])
60 def verify_attrs_wattr(self
, attrs
):
61 self
.assertEqual(attrs
.getLength(), 1)
62 self
.assertEqual(attrs
.getNames(), ["attr"])
63 self
.assertEqual(attrs
.getQNames(), ["attr"])
64 self
.assertEqual(len(attrs
), 1)
65 self
.assertTrue(attrs
.has_key("attr"))
66 self
.assertEqual(attrs
.keys(), ["attr"])
67 self
.assertEqual(attrs
.get("attr"), "val")
68 self
.assertEqual(attrs
.get("attr", 25), "val")
69 self
.assertEqual(attrs
.items(), [("attr", "val")])
70 self
.assertEqual(attrs
.values(), ["val"])
71 self
.assertEqual(attrs
.getValue("attr"), "val")
72 self
.assertEqual(attrs
.getValueByQName("attr"), "val")
73 self
.assertEqual(attrs
.getNameByQName("attr"), "attr")
74 self
.assertEqual(attrs
["attr"], "val")
75 self
.assertEqual(attrs
.getQNameByName("attr"), "attr")
77 class MakeParserTest(unittest
.TestCase
):
78 def test_make_parser2(self
):
79 # Creating parsers several times in a row should succeed.
80 # Testing this because there have been failures of this kind
82 from xml
.sax
import make_parser
84 from xml
.sax
import make_parser
86 from xml
.sax
import make_parser
88 from xml
.sax
import make_parser
90 from xml
.sax
import make_parser
92 from xml
.sax
import make_parser
96 # ===========================================================================
100 # ===========================================================================
102 class SaxutilsTest(unittest
.TestCase
):
104 def test_escape_basic(self
):
105 self
.assertEqual(escape("Donald Duck & Co"), "Donald Duck & Co")
107 def test_escape_all(self
):
108 self
.assertEqual(escape("<Donald Duck & Co>"),
109 "<Donald Duck & Co>")
111 def test_escape_extra(self
):
112 self
.assertEqual(escape("Hei på deg", {"å" : "å"}),
116 def test_unescape_basic(self
):
117 self
.assertEqual(unescape("Donald Duck & Co"), "Donald Duck & Co")
119 def test_unescape_all(self
):
120 self
.assertEqual(unescape("<Donald Duck & Co>"),
121 "<Donald Duck & Co>")
123 def test_unescape_extra(self
):
124 self
.assertEqual(unescape("Hei på deg", {"å" : "å"}),
127 def test_unescape_amp_extra(self
):
128 self
.assertEqual(unescape("&foo;", {"&foo;": "splat"}), "&foo;")
131 def test_quoteattr_basic(self
):
132 self
.assertEqual(quoteattr("Donald Duck & Co"),
133 '"Donald Duck & Co"')
135 def test_single_quoteattr(self
):
136 self
.assertEqual(quoteattr('Includes "double" quotes'),
137 '\'Includes "double" quotes\'')
139 def test_double_quoteattr(self
):
140 self
.assertEqual(quoteattr("Includes 'single' quotes"),
141 "\"Includes 'single' quotes\"")
143 def test_single_double_quoteattr(self
):
144 self
.assertEqual(quoteattr("Includes 'single' and \"double\" quotes"),
145 "\"Includes 'single' and "double" quotes\"")
148 def test_make_parser(self
):
149 # Creating a parser should succeed - it should fall back
151 p
= make_parser(['xml.parsers.no_such_parser'])
156 start
= '<?xml version="1.0" encoding="iso-8859-1"?>\n'
158 class XmlgenTest(unittest
.TestCase
):
159 def test_xmlgen_basic(self
):
161 gen
= XMLGenerator(result
)
163 gen
.startElement("doc", {})
164 gen
.endElement("doc")
167 self
.assertEqual(result
.getvalue(), start
+ "<doc></doc>")
169 def test_xmlgen_content(self
):
171 gen
= XMLGenerator(result
)
174 gen
.startElement("doc", {})
175 gen
.characters("huhei")
176 gen
.endElement("doc")
179 self
.assertEqual(result
.getvalue(), start
+ "<doc>huhei</doc>")
181 def test_xmlgen_pi(self
):
183 gen
= XMLGenerator(result
)
186 gen
.processingInstruction("test", "data")
187 gen
.startElement("doc", {})
188 gen
.endElement("doc")
191 self
.assertEqual(result
.getvalue(), start
+ "<?test data?><doc></doc>")
193 def test_xmlgen_content_escape(self
):
195 gen
= XMLGenerator(result
)
198 gen
.startElement("doc", {})
199 gen
.characters("<huhei&")
200 gen
.endElement("doc")
203 self
.assertEqual(result
.getvalue(),
204 start
+ "<doc><huhei&</doc>")
206 def test_xmlgen_attr_escape(self
):
208 gen
= XMLGenerator(result
)
211 gen
.startElement("doc", {"a": '"'})
212 gen
.startElement("e", {"a": "'"})
214 gen
.startElement("e", {"a": "'\""})
216 gen
.startElement("e", {"a": "\n\r\t"})
218 gen
.endElement("doc")
221 self
.assertEqual(result
.getvalue(), start
+
222 ("<doc a='\"'><e a=\"'\"></e>"
223 "<e a=\"'"\"></e>"
224 "<e a=\" 	\"></e></doc>"))
226 def test_xmlgen_ignorable(self
):
228 gen
= XMLGenerator(result
)
231 gen
.startElement("doc", {})
232 gen
.ignorableWhitespace(" ")
233 gen
.endElement("doc")
236 self
.assertEqual(result
.getvalue(), start
+ "<doc> </doc>")
238 def test_xmlgen_ns(self
):
240 gen
= XMLGenerator(result
)
243 gen
.startPrefixMapping("ns1", ns_uri
)
244 gen
.startElementNS((ns_uri
, "doc"), "ns1:doc", {})
245 # add an unqualified name
246 gen
.startElementNS((None, "udoc"), None, {})
247 gen
.endElementNS((None, "udoc"), None)
248 gen
.endElementNS((ns_uri
, "doc"), "ns1:doc")
249 gen
.endPrefixMapping("ns1")
252 self
.assertEqual(result
.getvalue(), start
+ \
253 ('<ns1:doc xmlns:ns1="%s"><udoc></udoc></ns1:doc>' %
256 def test_1463026_1(self
):
258 gen
= XMLGenerator(result
)
261 gen
.startElementNS((None, 'a'), 'a', {(None, 'b'):'c'})
262 gen
.endElementNS((None, 'a'), 'a')
265 self
.assertEqual(result
.getvalue(), start
+'<a b="c"></a>')
267 def test_1463026_2(self
):
269 gen
= XMLGenerator(result
)
272 gen
.startPrefixMapping(None, 'qux')
273 gen
.startElementNS(('qux', 'a'), 'a', {})
274 gen
.endElementNS(('qux', 'a'), 'a')
275 gen
.endPrefixMapping(None)
278 self
.assertEqual(result
.getvalue(), start
+'<a xmlns="qux"></a>')
280 def test_1463026_3(self
):
282 gen
= XMLGenerator(result
)
285 gen
.startPrefixMapping('my', 'qux')
286 gen
.startElementNS(('qux', 'a'), 'a', {(None, 'b'):'c'})
287 gen
.endElementNS(('qux', 'a'), 'a')
288 gen
.endPrefixMapping('my')
291 self
.assertEqual(result
.getvalue(),
292 start
+'<my:a xmlns:my="qux" b="c"></my:a>')
294 def test_5027_1(self
):
295 # The xml prefix (as in xml:lang below) is reserved and bound by
296 # definition to http://www.w3.org/XML/1998/namespace. XMLGenerator had
297 # a bug whereby a KeyError is thrown because this namespace is missing
300 # This test demonstrates the bug by parsing a document.
302 '<?xml version="1.0"?>'
303 '<a:g1 xmlns:a="http://example.com/ns">'
304 '<a:g2 xml:lang="en">Hello</a:g2>'
307 parser
= make_parser()
308 parser
.setFeature(feature_namespaces
, True)
310 gen
= XMLGenerator(result
)
311 parser
.setContentHandler(gen
)
312 parser
.parse(test_xml
)
314 self
.assertEqual(result
.getvalue(),
316 '<a:g1 xmlns:a="http://example.com/ns">'
317 '<a:g2 xml:lang="en">Hello</a:g2>'
320 def test_5027_2(self
):
321 # The xml prefix (as in xml:lang below) is reserved and bound by
322 # definition to http://www.w3.org/XML/1998/namespace. XMLGenerator had
323 # a bug whereby a KeyError is thrown because this namespace is missing
326 # This test demonstrates the bug by direct manipulation of the
329 gen
= XMLGenerator(result
)
332 gen
.startPrefixMapping('a', 'http://example.com/ns')
333 gen
.startElementNS(('http://example.com/ns', 'g1'), 'g1', {})
334 lang_attr
= {('http://www.w3.org/XML/1998/namespace', 'lang'): 'en'}
335 gen
.startElementNS(('http://example.com/ns', 'g2'), 'g2', lang_attr
)
336 gen
.characters('Hello')
337 gen
.endElementNS(('http://example.com/ns', 'g2'), 'g2')
338 gen
.endElementNS(('http://example.com/ns', 'g1'), 'g1')
339 gen
.endPrefixMapping('a')
342 self
.assertEqual(result
.getvalue(),
344 '<a:g1 xmlns:a="http://example.com/ns">'
345 '<a:g2 xml:lang="en">Hello</a:g2>'
349 class XMLFilterBaseTest(unittest
.TestCase
):
350 def test_filter_basic(self
):
352 gen
= XMLGenerator(result
)
353 filter = XMLFilterBase()
354 filter.setContentHandler(gen
)
356 filter.startDocument()
357 filter.startElement("doc", {})
358 filter.characters("content")
359 filter.ignorableWhitespace(" ")
360 filter.endElement("doc")
363 self
.assertEqual(result
.getvalue(), start
+ "<doc>content </doc>")
365 # ===========================================================================
369 # ===========================================================================
371 xml_test_out
= open(TEST_XMLFILE_OUT
).read()
373 class ExpatReaderTest(XmlTestBase
):
375 # ===== XMLReader support
377 def test_expat_file(self
):
378 parser
= create_parser()
380 xmlgen
= XMLGenerator(result
)
382 parser
.setContentHandler(xmlgen
)
383 parser
.parse(open(TEST_XMLFILE
))
385 self
.assertEqual(result
.getvalue(), xml_test_out
)
387 # ===== DTDHandler support
389 class TestDTDHandler
:
395 def notationDecl(self
, name
, publicId
, systemId
):
396 self
._notations
.append((name
, publicId
, systemId
))
398 def unparsedEntityDecl(self
, name
, publicId
, systemId
, ndata
):
399 self
._entities
.append((name
, publicId
, systemId
, ndata
))
401 def test_expat_dtdhandler(self
):
402 parser
= create_parser()
403 handler
= self
.TestDTDHandler()
404 parser
.setDTDHandler(handler
)
406 parser
.feed('<!DOCTYPE doc [\n')
407 parser
.feed(' <!ENTITY img SYSTEM "expat.gif" NDATA GIF>\n')
408 parser
.feed(' <!NOTATION GIF PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN">\n')
410 parser
.feed('<doc></doc>')
413 self
.assertEqual(handler
._notations
,
414 [("GIF", "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN", None)])
415 self
.assertEqual(handler
._entities
, [("img", None, "expat.gif", "GIF")])
417 # ===== EntityResolver support
419 class TestEntityResolver
:
421 def resolveEntity(self
, publicId
, systemId
):
422 inpsrc
= InputSource()
423 inpsrc
.setByteStream(StringIO("<entity/>"))
426 def test_expat_entityresolver(self
):
427 parser
= create_parser()
428 parser
.setEntityResolver(self
.TestEntityResolver())
430 parser
.setContentHandler(XMLGenerator(result
))
432 parser
.feed('<!DOCTYPE doc [\n')
433 parser
.feed(' <!ENTITY test SYSTEM "whatever">\n')
435 parser
.feed('<doc>&test;</doc>')
438 self
.assertEqual(result
.getvalue(), start
+
439 "<doc><entity></entity></doc>")
441 # ===== Attributes support
443 class AttrGatherer(ContentHandler
):
445 def startElement(self
, name
, attrs
):
448 def startElementNS(self
, name
, qname
, attrs
):
451 def test_expat_attrs_empty(self
):
452 parser
= create_parser()
453 gather
= self
.AttrGatherer()
454 parser
.setContentHandler(gather
)
456 parser
.feed("<doc/>")
459 self
.verify_empty_attrs(gather
._attrs
)
461 def test_expat_attrs_wattr(self
):
462 parser
= create_parser()
463 gather
= self
.AttrGatherer()
464 parser
.setContentHandler(gather
)
466 parser
.feed("<doc attr='val'/>")
469 self
.verify_attrs_wattr(gather
._attrs
)
471 def test_expat_nsattrs_empty(self
):
472 parser
= create_parser(1)
473 gather
= self
.AttrGatherer()
474 parser
.setContentHandler(gather
)
476 parser
.feed("<doc/>")
479 self
.verify_empty_nsattrs(gather
._attrs
)
481 def test_expat_nsattrs_wattr(self
):
482 parser
= create_parser(1)
483 gather
= self
.AttrGatherer()
484 parser
.setContentHandler(gather
)
486 parser
.feed("<doc xmlns:ns='%s' ns:attr='val'/>" % ns_uri
)
489 attrs
= gather
._attrs
491 self
.assertEqual(attrs
.getLength(), 1)
492 self
.assertEqual(attrs
.getNames(), [(ns_uri
, "attr")])
493 self
.assertTrue((attrs
.getQNames() == [] or
494 attrs
.getQNames() == ["ns:attr"]))
495 self
.assertEqual(len(attrs
), 1)
496 self
.assertTrue(attrs
.has_key((ns_uri
, "attr")))
497 self
.assertEqual(attrs
.get((ns_uri
, "attr")), "val")
498 self
.assertEqual(attrs
.get((ns_uri
, "attr"), 25), "val")
499 self
.assertEqual(attrs
.items(), [((ns_uri
, "attr"), "val")])
500 self
.assertEqual(attrs
.values(), ["val"])
501 self
.assertEqual(attrs
.getValue((ns_uri
, "attr")), "val")
502 self
.assertEqual(attrs
[(ns_uri
, "attr")], "val")
504 # ===== InputSource support
506 def test_expat_inpsource_filename(self
):
507 parser
= create_parser()
509 xmlgen
= XMLGenerator(result
)
511 parser
.setContentHandler(xmlgen
)
512 parser
.parse(TEST_XMLFILE
)
514 self
.assertEqual(result
.getvalue(), xml_test_out
)
516 def test_expat_inpsource_sysid(self
):
517 parser
= create_parser()
519 xmlgen
= XMLGenerator(result
)
521 parser
.setContentHandler(xmlgen
)
522 parser
.parse(InputSource(TEST_XMLFILE
))
524 self
.assertEqual(result
.getvalue(), xml_test_out
)
526 def test_expat_inpsource_stream(self
):
527 parser
= create_parser()
529 xmlgen
= XMLGenerator(result
)
531 parser
.setContentHandler(xmlgen
)
532 inpsrc
= InputSource()
533 inpsrc
.setByteStream(open(TEST_XMLFILE
))
536 self
.assertEqual(result
.getvalue(), xml_test_out
)
538 # ===== IncrementalParser support
540 def test_expat_incremental(self
):
542 xmlgen
= XMLGenerator(result
)
543 parser
= create_parser()
544 parser
.setContentHandler(xmlgen
)
547 parser
.feed("</doc>")
550 self
.assertEqual(result
.getvalue(), start
+ "<doc></doc>")
552 def test_expat_incremental_reset(self
):
554 xmlgen
= XMLGenerator(result
)
555 parser
= create_parser()
556 parser
.setContentHandler(xmlgen
)
562 xmlgen
= XMLGenerator(result
)
563 parser
.setContentHandler(xmlgen
)
568 parser
.feed("</doc>")
571 self
.assertEqual(result
.getvalue(), start
+ "<doc>text</doc>")
573 # ===== Locator support
575 def test_expat_locator_noinfo(self
):
577 xmlgen
= XMLGenerator(result
)
578 parser
= create_parser()
579 parser
.setContentHandler(xmlgen
)
582 parser
.feed("</doc>")
585 self
.assertEqual(parser
.getSystemId(), None)
586 self
.assertEqual(parser
.getPublicId(), None)
587 self
.assertEqual(parser
.getLineNumber(), 1)
589 def test_expat_locator_withinfo(self
):
591 xmlgen
= XMLGenerator(result
)
592 parser
= create_parser()
593 parser
.setContentHandler(xmlgen
)
594 parser
.parse(TEST_XMLFILE
)
596 self
.assertEqual(parser
.getSystemId(), TEST_XMLFILE
)
597 self
.assertEqual(parser
.getPublicId(), None)
600 # ===========================================================================
604 # ===========================================================================
606 class ErrorReportingTest(unittest
.TestCase
):
607 def test_expat_inpsource_location(self
):
608 parser
= create_parser()
609 parser
.setContentHandler(ContentHandler()) # do nothing
610 source
= InputSource()
611 source
.setByteStream(StringIO("<foo bar foobar>")) #ill-formed
613 source
.setSystemId(name
)
617 except SAXException
, e
:
618 self
.assertEqual(e
.getSystemId(), name
)
620 def test_expat_incomplete(self
):
621 parser
= create_parser()
622 parser
.setContentHandler(ContentHandler()) # do nothing
623 self
.assertRaises(SAXParseException
, parser
.parse
, StringIO("<foo>"))
625 def test_sax_parse_exception_str(self
):
626 # pass various values from a locator to the SAXParseException to
627 # make sure that the __str__() doesn't fall apart when None is
628 # passed instead of an integer line and column number
630 # use "normal" values for the locator:
631 str(SAXParseException("message", None,
632 self
.DummyLocator(1, 1)))
633 # use None for the line number:
634 str(SAXParseException("message", None,
635 self
.DummyLocator(None, 1)))
636 # use None for the column number:
637 str(SAXParseException("message", None,
638 self
.DummyLocator(1, None)))
640 str(SAXParseException("message", None,
641 self
.DummyLocator(None, None)))
644 def __init__(self
, lineno
, colno
):
645 self
._lineno
= lineno
648 def getPublicId(self
):
651 def getSystemId(self
):
654 def getLineNumber(self
):
657 def getColumnNumber(self
):
660 # ===========================================================================
664 # ===========================================================================
666 class XmlReaderTest(XmlTestBase
):
668 # ===== AttributesImpl
669 def test_attrs_empty(self
):
670 self
.verify_empty_attrs(AttributesImpl({}))
672 def test_attrs_wattr(self
):
673 self
.verify_attrs_wattr(AttributesImpl({"attr" : "val"}))
675 def test_nsattrs_empty(self
):
676 self
.verify_empty_nsattrs(AttributesNSImpl({}, {}))
678 def test_nsattrs_wattr(self
):
679 attrs
= AttributesNSImpl({(ns_uri
, "attr") : "val"},
680 {(ns_uri
, "attr") : "ns:attr"})
682 self
.assertEqual(attrs
.getLength(), 1)
683 self
.assertEqual(attrs
.getNames(), [(ns_uri
, "attr")])
684 self
.assertEqual(attrs
.getQNames(), ["ns:attr"])
685 self
.assertEqual(len(attrs
), 1)
686 self
.assertTrue(attrs
.has_key((ns_uri
, "attr")))
687 self
.assertEqual(attrs
.keys(), [(ns_uri
, "attr")])
688 self
.assertEqual(attrs
.get((ns_uri
, "attr")), "val")
689 self
.assertEqual(attrs
.get((ns_uri
, "attr"), 25), "val")
690 self
.assertEqual(attrs
.items(), [((ns_uri
, "attr"), "val")])
691 self
.assertEqual(attrs
.values(), ["val"])
692 self
.assertEqual(attrs
.getValue((ns_uri
, "attr")), "val")
693 self
.assertEqual(attrs
.getValueByQName("ns:attr"), "val")
694 self
.assertEqual(attrs
.getNameByQName("ns:attr"), (ns_uri
, "attr"))
695 self
.assertEqual(attrs
[(ns_uri
, "attr")], "val")
696 self
.assertEqual(attrs
.getQNameByName((ns_uri
, "attr")), "ns:attr")
699 # During the development of Python 2.5, an attempt to move the "xml"
700 # package implementation to a new package ("xmlcore") proved painful.
701 # The goal of this change was to allow applications to be able to
702 # obtain and rely on behavior in the standard library implementation
703 # of the XML support without needing to be concerned about the
704 # availability of the PyXML implementation.
706 # While the existing import hackery in Lib/xml/__init__.py can cause
707 # PyXML's _xmlpus package to supplant the "xml" package, that only
708 # works because either implementation uses the "xml" package name for
711 # The move resulted in a number of problems related to the fact that
712 # the import machinery's "package context" is based on the name that's
713 # being imported rather than the __name__ of the actual package
714 # containment; it wasn't possible for the "xml" package to be replaced
715 # by a simple module that indirected imports to the "xmlcore" package.
717 # The following two tests exercised bugs that were introduced in that
718 # attempt. Keeping these tests around will help detect problems with
719 # other attempts to provide reliable access to the standard library's
720 # implementation of the XML support.
722 def test_sf_1511497(self
):
723 # Bug report: http://www.python.org/sf/1511497
725 old_modules
= sys
.modules
.copy()
726 for modname
in sys
.modules
.keys():
727 if modname
.startswith("xml."):
728 del sys
.modules
[modname
]
730 import xml
.sax
.expatreader
731 module
= xml
.sax
.expatreader
732 self
.assertEqual(module
.__name
__, "xml.sax.expatreader")
734 sys
.modules
.update(old_modules
)
736 def test_sf_1513611(self
):
737 # Bug report: http://www.python.org/sf/1513611
738 sio
= StringIO("invalid")
739 parser
= make_parser()
740 from xml
.sax
import SAXParseException
741 self
.assertRaises(SAXParseException
, parser
.parse
, sio
)
745 run_unittest(MakeParserTest
,
752 if __name__
== "__main__":