+++ /dev/null
-# regression test for SAX 2.0 -*- coding: utf-8 -*-\r
-# $Id$\r
-\r
-from xml.sax import make_parser, ContentHandler, \\r
- SAXException, SAXReaderNotAvailable, SAXParseException\r
-try:\r
- make_parser()\r
-except SAXReaderNotAvailable:\r
- # don't try to test this module if we cannot create a parser\r
- raise ImportError("no XML parsers available")\r
-from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \\r
- XMLFilterBase\r
-from xml.sax.expatreader import create_parser\r
-from xml.sax.handler import feature_namespaces\r
-from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl\r
-from cStringIO import StringIO\r
-from test.test_support import findfile, run_unittest\r
-import unittest\r
-\r
-TEST_XMLFILE = findfile("test.xml", subdir="xmltestdata")\r
-TEST_XMLFILE_OUT = findfile("test.xml.out", subdir="xmltestdata")\r
-\r
-ns_uri = "http://www.python.org/xml-ns/saxtest/"\r
-\r
-class XmlTestBase(unittest.TestCase):\r
- def verify_empty_attrs(self, attrs):\r
- self.assertRaises(KeyError, attrs.getValue, "attr")\r
- self.assertRaises(KeyError, attrs.getValueByQName, "attr")\r
- self.assertRaises(KeyError, attrs.getNameByQName, "attr")\r
- self.assertRaises(KeyError, attrs.getQNameByName, "attr")\r
- self.assertRaises(KeyError, attrs.__getitem__, "attr")\r
- self.assertEqual(attrs.getLength(), 0)\r
- self.assertEqual(attrs.getNames(), [])\r
- self.assertEqual(attrs.getQNames(), [])\r
- self.assertEqual(len(attrs), 0)\r
- self.assertFalse(attrs.has_key("attr"))\r
- self.assertEqual(attrs.keys(), [])\r
- self.assertEqual(attrs.get("attrs"), None)\r
- self.assertEqual(attrs.get("attrs", 25), 25)\r
- self.assertEqual(attrs.items(), [])\r
- self.assertEqual(attrs.values(), [])\r
-\r
- def verify_empty_nsattrs(self, attrs):\r
- self.assertRaises(KeyError, attrs.getValue, (ns_uri, "attr"))\r
- self.assertRaises(KeyError, attrs.getValueByQName, "ns:attr")\r
- self.assertRaises(KeyError, attrs.getNameByQName, "ns:attr")\r
- self.assertRaises(KeyError, attrs.getQNameByName, (ns_uri, "attr"))\r
- self.assertRaises(KeyError, attrs.__getitem__, (ns_uri, "attr"))\r
- self.assertEqual(attrs.getLength(), 0)\r
- self.assertEqual(attrs.getNames(), [])\r
- self.assertEqual(attrs.getQNames(), [])\r
- self.assertEqual(len(attrs), 0)\r
- self.assertFalse(attrs.has_key((ns_uri, "attr")))\r
- self.assertEqual(attrs.keys(), [])\r
- self.assertEqual(attrs.get((ns_uri, "attr")), None)\r
- self.assertEqual(attrs.get((ns_uri, "attr"), 25), 25)\r
- self.assertEqual(attrs.items(), [])\r
- self.assertEqual(attrs.values(), [])\r
-\r
- def verify_attrs_wattr(self, attrs):\r
- self.assertEqual(attrs.getLength(), 1)\r
- self.assertEqual(attrs.getNames(), ["attr"])\r
- self.assertEqual(attrs.getQNames(), ["attr"])\r
- self.assertEqual(len(attrs), 1)\r
- self.assertTrue(attrs.has_key("attr"))\r
- self.assertEqual(attrs.keys(), ["attr"])\r
- self.assertEqual(attrs.get("attr"), "val")\r
- self.assertEqual(attrs.get("attr", 25), "val")\r
- self.assertEqual(attrs.items(), [("attr", "val")])\r
- self.assertEqual(attrs.values(), ["val"])\r
- self.assertEqual(attrs.getValue("attr"), "val")\r
- self.assertEqual(attrs.getValueByQName("attr"), "val")\r
- self.assertEqual(attrs.getNameByQName("attr"), "attr")\r
- self.assertEqual(attrs["attr"], "val")\r
- self.assertEqual(attrs.getQNameByName("attr"), "attr")\r
-\r
-class MakeParserTest(unittest.TestCase):\r
- def test_make_parser2(self):\r
- # Creating parsers several times in a row should succeed.\r
- # Testing this because there have been failures of this kind\r
- # before.\r
- from xml.sax import make_parser\r
- p = make_parser()\r
- from xml.sax import make_parser\r
- p = make_parser()\r
- from xml.sax import make_parser\r
- p = make_parser()\r
- from xml.sax import make_parser\r
- p = make_parser()\r
- from xml.sax import make_parser\r
- p = make_parser()\r
- from xml.sax import make_parser\r
- p = make_parser()\r
-\r
-\r
-# ===========================================================================\r
-#\r
-# saxutils tests\r
-#\r
-# ===========================================================================\r
-\r
-class SaxutilsTest(unittest.TestCase):\r
- # ===== escape\r
- def test_escape_basic(self):\r
- self.assertEqual(escape("Donald Duck & Co"), "Donald Duck & Co")\r
-\r
- def test_escape_all(self):\r
- self.assertEqual(escape("<Donald Duck & Co>"),\r
- "<Donald Duck & Co>")\r
-\r
- def test_escape_extra(self):\r
- self.assertEqual(escape("Hei på deg", {"å" : "å"}),\r
- "Hei på deg")\r
-\r
- # ===== unescape\r
- def test_unescape_basic(self):\r
- self.assertEqual(unescape("Donald Duck & Co"), "Donald Duck & Co")\r
-\r
- def test_unescape_all(self):\r
- self.assertEqual(unescape("<Donald Duck & Co>"),\r
- "<Donald Duck & Co>")\r
-\r
- def test_unescape_extra(self):\r
- self.assertEqual(unescape("Hei på deg", {"å" : "å"}),\r
- "Hei på deg")\r
-\r
- def test_unescape_amp_extra(self):\r
- self.assertEqual(unescape("&foo;", {"&foo;": "splat"}), "&foo;")\r
-\r
- # ===== quoteattr\r
- def test_quoteattr_basic(self):\r
- self.assertEqual(quoteattr("Donald Duck & Co"),\r
- '"Donald Duck & Co"')\r
-\r
- def test_single_quoteattr(self):\r
- self.assertEqual(quoteattr('Includes "double" quotes'),\r
- '\'Includes "double" quotes\'')\r
-\r
- def test_double_quoteattr(self):\r
- self.assertEqual(quoteattr("Includes 'single' quotes"),\r
- "\"Includes 'single' quotes\"")\r
-\r
- def test_single_double_quoteattr(self):\r
- self.assertEqual(quoteattr("Includes 'single' and \"double\" quotes"),\r
- "\"Includes 'single' and "double" quotes\"")\r
-\r
- # ===== make_parser\r
- def test_make_parser(self):\r
- # Creating a parser should succeed - it should fall back\r
- # to the expatreader\r
- p = make_parser(['xml.parsers.no_such_parser'])\r
-\r
-\r
-# ===== XMLGenerator\r
-\r
-start = '<?xml version="1.0" encoding="iso-8859-1"?>\n'\r
-\r
-class XmlgenTest(unittest.TestCase):\r
- def test_xmlgen_basic(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
- gen.startDocument()\r
- gen.startElement("doc", {})\r
- gen.endElement("doc")\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start + "<doc></doc>")\r
-\r
- def test_xmlgen_content(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startElement("doc", {})\r
- gen.characters("huhei")\r
- gen.endElement("doc")\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start + "<doc>huhei</doc>")\r
-\r
- def test_xmlgen_pi(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.processingInstruction("test", "data")\r
- gen.startElement("doc", {})\r
- gen.endElement("doc")\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start + "<?test data?><doc></doc>")\r
-\r
- def test_xmlgen_content_escape(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startElement("doc", {})\r
- gen.characters("<huhei&")\r
- gen.endElement("doc")\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(),\r
- start + "<doc><huhei&</doc>")\r
-\r
- def test_xmlgen_attr_escape(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startElement("doc", {"a": '"'})\r
- gen.startElement("e", {"a": "'"})\r
- gen.endElement("e")\r
- gen.startElement("e", {"a": "'\""})\r
- gen.endElement("e")\r
- gen.startElement("e", {"a": "\n\r\t"})\r
- gen.endElement("e")\r
- gen.endElement("doc")\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start +\r
- ("<doc a='\"'><e a=\"'\"></e>"\r
- "<e a=\"'"\"></e>"\r
- "<e a=\" 	\"></e></doc>"))\r
-\r
- def test_xmlgen_ignorable(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startElement("doc", {})\r
- gen.ignorableWhitespace(" ")\r
- gen.endElement("doc")\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start + "<doc> </doc>")\r
-\r
- def test_xmlgen_ns(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startPrefixMapping("ns1", ns_uri)\r
- gen.startElementNS((ns_uri, "doc"), "ns1:doc", {})\r
- # add an unqualified name\r
- gen.startElementNS((None, "udoc"), None, {})\r
- gen.endElementNS((None, "udoc"), None)\r
- gen.endElementNS((ns_uri, "doc"), "ns1:doc")\r
- gen.endPrefixMapping("ns1")\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start + \\r
- ('<ns1:doc xmlns:ns1="%s"><udoc></udoc></ns1:doc>' %\r
- ns_uri))\r
-\r
- def test_1463026_1(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startElementNS((None, 'a'), 'a', {(None, 'b'):'c'})\r
- gen.endElementNS((None, 'a'), 'a')\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start+'<a b="c"></a>')\r
-\r
- def test_1463026_2(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startPrefixMapping(None, 'qux')\r
- gen.startElementNS(('qux', 'a'), 'a', {})\r
- gen.endElementNS(('qux', 'a'), 'a')\r
- gen.endPrefixMapping(None)\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start+'<a xmlns="qux"></a>')\r
-\r
- def test_1463026_3(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startPrefixMapping('my', 'qux')\r
- gen.startElementNS(('qux', 'a'), 'a', {(None, 'b'):'c'})\r
- gen.endElementNS(('qux', 'a'), 'a')\r
- gen.endPrefixMapping('my')\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(),\r
- start+'<my:a xmlns:my="qux" b="c"></my:a>')\r
-\r
- def test_5027_1(self):\r
- # The xml prefix (as in xml:lang below) is reserved and bound by\r
- # definition to http://www.w3.org/XML/1998/namespace. XMLGenerator had\r
- # a bug whereby a KeyError is thrown because this namespace is missing\r
- # from a dictionary.\r
- #\r
- # This test demonstrates the bug by parsing a document.\r
- test_xml = StringIO(\r
- '<?xml version="1.0"?>'\r
- '<a:g1 xmlns:a="http://example.com/ns">'\r
- '<a:g2 xml:lang="en">Hello</a:g2>'\r
- '</a:g1>')\r
-\r
- parser = make_parser()\r
- parser.setFeature(feature_namespaces, True)\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
- parser.setContentHandler(gen)\r
- parser.parse(test_xml)\r
-\r
- self.assertEqual(result.getvalue(),\r
- start + (\r
- '<a:g1 xmlns:a="http://example.com/ns">'\r
- '<a:g2 xml:lang="en">Hello</a:g2>'\r
- '</a:g1>'))\r
-\r
- def test_5027_2(self):\r
- # The xml prefix (as in xml:lang below) is reserved and bound by\r
- # definition to http://www.w3.org/XML/1998/namespace. XMLGenerator had\r
- # a bug whereby a KeyError is thrown because this namespace is missing\r
- # from a dictionary.\r
- #\r
- # This test demonstrates the bug by direct manipulation of the\r
- # XMLGenerator.\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
-\r
- gen.startDocument()\r
- gen.startPrefixMapping('a', 'http://example.com/ns')\r
- gen.startElementNS(('http://example.com/ns', 'g1'), 'g1', {})\r
- lang_attr = {('http://www.w3.org/XML/1998/namespace', 'lang'): 'en'}\r
- gen.startElementNS(('http://example.com/ns', 'g2'), 'g2', lang_attr)\r
- gen.characters('Hello')\r
- gen.endElementNS(('http://example.com/ns', 'g2'), 'g2')\r
- gen.endElementNS(('http://example.com/ns', 'g1'), 'g1')\r
- gen.endPrefixMapping('a')\r
- gen.endDocument()\r
-\r
- self.assertEqual(result.getvalue(),\r
- start + (\r
- '<a:g1 xmlns:a="http://example.com/ns">'\r
- '<a:g2 xml:lang="en">Hello</a:g2>'\r
- '</a:g1>'))\r
-\r
-\r
-class XMLFilterBaseTest(unittest.TestCase):\r
- def test_filter_basic(self):\r
- result = StringIO()\r
- gen = XMLGenerator(result)\r
- filter = XMLFilterBase()\r
- filter.setContentHandler(gen)\r
-\r
- filter.startDocument()\r
- filter.startElement("doc", {})\r
- filter.characters("content")\r
- filter.ignorableWhitespace(" ")\r
- filter.endElement("doc")\r
- filter.endDocument()\r
-\r
- self.assertEqual(result.getvalue(), start + "<doc>content </doc>")\r
-\r
-# ===========================================================================\r
-#\r
-# expatreader tests\r
-#\r
-# ===========================================================================\r
-\r
-xml_test_out = open(TEST_XMLFILE_OUT).read()\r
-\r
-class ExpatReaderTest(XmlTestBase):\r
-\r
- # ===== XMLReader support\r
-\r
- def test_expat_file(self):\r
- parser = create_parser()\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
-\r
- parser.setContentHandler(xmlgen)\r
- parser.parse(open(TEST_XMLFILE))\r
-\r
- self.assertEqual(result.getvalue(), xml_test_out)\r
-\r
- # ===== DTDHandler support\r
-\r
- class TestDTDHandler:\r
-\r
- def __init__(self):\r
- self._notations = []\r
- self._entities = []\r
-\r
- def notationDecl(self, name, publicId, systemId):\r
- self._notations.append((name, publicId, systemId))\r
-\r
- def unparsedEntityDecl(self, name, publicId, systemId, ndata):\r
- self._entities.append((name, publicId, systemId, ndata))\r
-\r
- def test_expat_dtdhandler(self):\r
- parser = create_parser()\r
- handler = self.TestDTDHandler()\r
- parser.setDTDHandler(handler)\r
-\r
- parser.feed('<!DOCTYPE doc [\n')\r
- parser.feed(' <!ENTITY img SYSTEM "expat.gif" NDATA GIF>\n')\r
- parser.feed(' <!NOTATION GIF PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN">\n')\r
- parser.feed(']>\n')\r
- parser.feed('<doc></doc>')\r
- parser.close()\r
-\r
- self.assertEqual(handler._notations,\r
- [("GIF", "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN", None)])\r
- self.assertEqual(handler._entities, [("img", None, "expat.gif", "GIF")])\r
-\r
- # ===== EntityResolver support\r
-\r
- class TestEntityResolver:\r
-\r
- def resolveEntity(self, publicId, systemId):\r
- inpsrc = InputSource()\r
- inpsrc.setByteStream(StringIO("<entity/>"))\r
- return inpsrc\r
-\r
- def test_expat_entityresolver(self):\r
- parser = create_parser()\r
- parser.setEntityResolver(self.TestEntityResolver())\r
- result = StringIO()\r
- parser.setContentHandler(XMLGenerator(result))\r
-\r
- parser.feed('<!DOCTYPE doc [\n')\r
- parser.feed(' <!ENTITY test SYSTEM "whatever">\n')\r
- parser.feed(']>\n')\r
- parser.feed('<doc>&test;</doc>')\r
- parser.close()\r
-\r
- self.assertEqual(result.getvalue(), start +\r
- "<doc><entity></entity></doc>")\r
-\r
- # ===== Attributes support\r
-\r
- class AttrGatherer(ContentHandler):\r
-\r
- def startElement(self, name, attrs):\r
- self._attrs = attrs\r
-\r
- def startElementNS(self, name, qname, attrs):\r
- self._attrs = attrs\r
-\r
- def test_expat_attrs_empty(self):\r
- parser = create_parser()\r
- gather = self.AttrGatherer()\r
- parser.setContentHandler(gather)\r
-\r
- parser.feed("<doc/>")\r
- parser.close()\r
-\r
- self.verify_empty_attrs(gather._attrs)\r
-\r
- def test_expat_attrs_wattr(self):\r
- parser = create_parser()\r
- gather = self.AttrGatherer()\r
- parser.setContentHandler(gather)\r
-\r
- parser.feed("<doc attr='val'/>")\r
- parser.close()\r
-\r
- self.verify_attrs_wattr(gather._attrs)\r
-\r
- def test_expat_nsattrs_empty(self):\r
- parser = create_parser(1)\r
- gather = self.AttrGatherer()\r
- parser.setContentHandler(gather)\r
-\r
- parser.feed("<doc/>")\r
- parser.close()\r
-\r
- self.verify_empty_nsattrs(gather._attrs)\r
-\r
- def test_expat_nsattrs_wattr(self):\r
- parser = create_parser(1)\r
- gather = self.AttrGatherer()\r
- parser.setContentHandler(gather)\r
-\r
- parser.feed("<doc xmlns:ns='%s' ns:attr='val'/>" % ns_uri)\r
- parser.close()\r
-\r
- attrs = gather._attrs\r
-\r
- self.assertEqual(attrs.getLength(), 1)\r
- self.assertEqual(attrs.getNames(), [(ns_uri, "attr")])\r
- self.assertTrue((attrs.getQNames() == [] or\r
- attrs.getQNames() == ["ns:attr"]))\r
- self.assertEqual(len(attrs), 1)\r
- self.assertTrue(attrs.has_key((ns_uri, "attr")))\r
- self.assertEqual(attrs.get((ns_uri, "attr")), "val")\r
- self.assertEqual(attrs.get((ns_uri, "attr"), 25), "val")\r
- self.assertEqual(attrs.items(), [((ns_uri, "attr"), "val")])\r
- self.assertEqual(attrs.values(), ["val"])\r
- self.assertEqual(attrs.getValue((ns_uri, "attr")), "val")\r
- self.assertEqual(attrs[(ns_uri, "attr")], "val")\r
-\r
- # ===== InputSource support\r
-\r
- def test_expat_inpsource_filename(self):\r
- parser = create_parser()\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
-\r
- parser.setContentHandler(xmlgen)\r
- parser.parse(TEST_XMLFILE)\r
-\r
- self.assertEqual(result.getvalue(), xml_test_out)\r
-\r
- def test_expat_inpsource_sysid(self):\r
- parser = create_parser()\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
-\r
- parser.setContentHandler(xmlgen)\r
- parser.parse(InputSource(TEST_XMLFILE))\r
-\r
- self.assertEqual(result.getvalue(), xml_test_out)\r
-\r
- def test_expat_inpsource_stream(self):\r
- parser = create_parser()\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
-\r
- parser.setContentHandler(xmlgen)\r
- inpsrc = InputSource()\r
- inpsrc.setByteStream(open(TEST_XMLFILE))\r
- parser.parse(inpsrc)\r
-\r
- self.assertEqual(result.getvalue(), xml_test_out)\r
-\r
- # ===== IncrementalParser support\r
-\r
- def test_expat_incremental(self):\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
- parser = create_parser()\r
- parser.setContentHandler(xmlgen)\r
-\r
- parser.feed("<doc>")\r
- parser.feed("</doc>")\r
- parser.close()\r
-\r
- self.assertEqual(result.getvalue(), start + "<doc></doc>")\r
-\r
- def test_expat_incremental_reset(self):\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
- parser = create_parser()\r
- parser.setContentHandler(xmlgen)\r
-\r
- parser.feed("<doc>")\r
- parser.feed("text")\r
-\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
- parser.setContentHandler(xmlgen)\r
- parser.reset()\r
-\r
- parser.feed("<doc>")\r
- parser.feed("text")\r
- parser.feed("</doc>")\r
- parser.close()\r
-\r
- self.assertEqual(result.getvalue(), start + "<doc>text</doc>")\r
-\r
- # ===== Locator support\r
-\r
- def test_expat_locator_noinfo(self):\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
- parser = create_parser()\r
- parser.setContentHandler(xmlgen)\r
-\r
- parser.feed("<doc>")\r
- parser.feed("</doc>")\r
- parser.close()\r
-\r
- self.assertEqual(parser.getSystemId(), None)\r
- self.assertEqual(parser.getPublicId(), None)\r
- self.assertEqual(parser.getLineNumber(), 1)\r
-\r
- def test_expat_locator_withinfo(self):\r
- result = StringIO()\r
- xmlgen = XMLGenerator(result)\r
- parser = create_parser()\r
- parser.setContentHandler(xmlgen)\r
- parser.parse(TEST_XMLFILE)\r
-\r
- self.assertEqual(parser.getSystemId(), TEST_XMLFILE)\r
- self.assertEqual(parser.getPublicId(), None)\r
-\r
-\r
-# ===========================================================================\r
-#\r
-# error reporting\r
-#\r
-# ===========================================================================\r
-\r
-class ErrorReportingTest(unittest.TestCase):\r
- def test_expat_inpsource_location(self):\r
- parser = create_parser()\r
- parser.setContentHandler(ContentHandler()) # do nothing\r
- source = InputSource()\r
- source.setByteStream(StringIO("<foo bar foobar>")) #ill-formed\r
- name = "a file name"\r
- source.setSystemId(name)\r
- try:\r
- parser.parse(source)\r
- self.fail()\r
- except SAXException, e:\r
- self.assertEqual(e.getSystemId(), name)\r
-\r
- def test_expat_incomplete(self):\r
- parser = create_parser()\r
- parser.setContentHandler(ContentHandler()) # do nothing\r
- self.assertRaises(SAXParseException, parser.parse, StringIO("<foo>"))\r
-\r
- def test_sax_parse_exception_str(self):\r
- # pass various values from a locator to the SAXParseException to\r
- # make sure that the __str__() doesn't fall apart when None is\r
- # passed instead of an integer line and column number\r
- #\r
- # use "normal" values for the locator:\r
- str(SAXParseException("message", None,\r
- self.DummyLocator(1, 1)))\r
- # use None for the line number:\r
- str(SAXParseException("message", None,\r
- self.DummyLocator(None, 1)))\r
- # use None for the column number:\r
- str(SAXParseException("message", None,\r
- self.DummyLocator(1, None)))\r
- # use None for both:\r
- str(SAXParseException("message", None,\r
- self.DummyLocator(None, None)))\r
-\r
- class DummyLocator:\r
- def __init__(self, lineno, colno):\r
- self._lineno = lineno\r
- self._colno = colno\r
-\r
- def getPublicId(self):\r
- return "pubid"\r
-\r
- def getSystemId(self):\r
- return "sysid"\r
-\r
- def getLineNumber(self):\r
- return self._lineno\r
-\r
- def getColumnNumber(self):\r
- return self._colno\r
-\r
-# ===========================================================================\r
-#\r
-# xmlreader tests\r
-#\r
-# ===========================================================================\r
-\r
-class XmlReaderTest(XmlTestBase):\r
-\r
- # ===== AttributesImpl\r
- def test_attrs_empty(self):\r
- self.verify_empty_attrs(AttributesImpl({}))\r
-\r
- def test_attrs_wattr(self):\r
- self.verify_attrs_wattr(AttributesImpl({"attr" : "val"}))\r
-\r
- def test_nsattrs_empty(self):\r
- self.verify_empty_nsattrs(AttributesNSImpl({}, {}))\r
-\r
- def test_nsattrs_wattr(self):\r
- attrs = AttributesNSImpl({(ns_uri, "attr") : "val"},\r
- {(ns_uri, "attr") : "ns:attr"})\r
-\r
- self.assertEqual(attrs.getLength(), 1)\r
- self.assertEqual(attrs.getNames(), [(ns_uri, "attr")])\r
- self.assertEqual(attrs.getQNames(), ["ns:attr"])\r
- self.assertEqual(len(attrs), 1)\r
- self.assertTrue(attrs.has_key((ns_uri, "attr")))\r
- self.assertEqual(attrs.keys(), [(ns_uri, "attr")])\r
- self.assertEqual(attrs.get((ns_uri, "attr")), "val")\r
- self.assertEqual(attrs.get((ns_uri, "attr"), 25), "val")\r
- self.assertEqual(attrs.items(), [((ns_uri, "attr"), "val")])\r
- self.assertEqual(attrs.values(), ["val"])\r
- self.assertEqual(attrs.getValue((ns_uri, "attr")), "val")\r
- self.assertEqual(attrs.getValueByQName("ns:attr"), "val")\r
- self.assertEqual(attrs.getNameByQName("ns:attr"), (ns_uri, "attr"))\r
- self.assertEqual(attrs[(ns_uri, "attr")], "val")\r
- self.assertEqual(attrs.getQNameByName((ns_uri, "attr")), "ns:attr")\r
-\r
-\r
- # During the development of Python 2.5, an attempt to move the "xml"\r
- # package implementation to a new package ("xmlcore") proved painful.\r
- # The goal of this change was to allow applications to be able to\r
- # obtain and rely on behavior in the standard library implementation\r
- # of the XML support without needing to be concerned about the\r
- # availability of the PyXML implementation.\r
- #\r
- # While the existing import hackery in Lib/xml/__init__.py can cause\r
- # PyXML's _xmlpus package to supplant the "xml" package, that only\r
- # works because either implementation uses the "xml" package name for\r
- # imports.\r
- #\r
- # The move resulted in a number of problems related to the fact that\r
- # the import machinery's "package context" is based on the name that's\r
- # being imported rather than the __name__ of the actual package\r
- # containment; it wasn't possible for the "xml" package to be replaced\r
- # by a simple module that indirected imports to the "xmlcore" package.\r
- #\r
- # The following two tests exercised bugs that were introduced in that\r
- # attempt. Keeping these tests around will help detect problems with\r
- # other attempts to provide reliable access to the standard library's\r
- # implementation of the XML support.\r
-\r
- def test_sf_1511497(self):\r
- # Bug report: http://www.python.org/sf/1511497\r
- import sys\r
- old_modules = sys.modules.copy()\r
- for modname in sys.modules.keys():\r
- if modname.startswith("xml."):\r
- del sys.modules[modname]\r
- try:\r
- import xml.sax.expatreader\r
- module = xml.sax.expatreader\r
- self.assertEqual(module.__name__, "xml.sax.expatreader")\r
- finally:\r
- sys.modules.update(old_modules)\r
-\r
- def test_sf_1513611(self):\r
- # Bug report: http://www.python.org/sf/1513611\r
- sio = StringIO("invalid")\r
- parser = make_parser()\r
- from xml.sax import SAXParseException\r
- self.assertRaises(SAXParseException, parser.parse, sio)\r
-\r
-\r
-def test_main():\r
- run_unittest(MakeParserTest,\r
- SaxutilsTest,\r
- XmlgenTest,\r
- ExpatReaderTest,\r
- ErrorReportingTest,\r
- XmlReaderTest)\r
-\r
-if __name__ == "__main__":\r
- test_main()\r