import support import StringIO import xml.sax import new import unittest PREFERRED_XML_PARSERS = ["drv_libxml2"] from html5lib.treebuilders import dom from html5lib.liberalxmlparser import * class SAXLogger: def __init__(self): self.log = [] def setDocumentLocator(self, locator): pass def startElement(self, name, attrs): self.log.append(['startElement', name, dict(attrs.items())]) def startElementNS(self, name, qname, attrs): if qname is None: qname = name[1] self.log.append(['startElementNS', name, qname, dict(attrs.items())]) def endElementNS(self, name, qname): if qname is None: qname = name[1] self.log.append(['endElementNS', name, qname]) def __getattr__(self, name): def function(self, *args): self.log.append([name]+list(args)) return new.instancemethod(function, self, SAXLogger) class SAXTest(unittest.TestCase): def DOMParse(self, input): return XMLParser(tree=dom.TreeBuilder).parse(input) def setNS(self, saxparser): import xml.dom saxparser.setFeature(xml.sax.handler.feature_namespaces, 1) return {'xml':xml.dom.XML_NAMESPACE} def saxdiff(self, input): domhandler = SAXLogger() saxhandler = SAXLogger() saxparser = xml.sax.make_parser(PREFERRED_XML_PARSERS) dom.dom2sax(self.DOMParse(input), domhandler, self.setNS(saxparser)) saxparser.setContentHandler(saxhandler) source = xml.sax.xmlreader.InputSource() source.setByteStream(StringIO.StringIO(input)) saxparser.parse(source) for i in range(0,len(saxhandler.log)): if i > len(domhandler.log): self.assertEqual(saxhandler.log[i:], domhandler.log[i:]) elif saxhandler.log[i] != domhandler.log[i]: self.assertEqual(saxhandler.log[i], domhandler.log[i]) else: self.assertEquals(saxhandler.log, domhandler.log) def test_nodes(self): self.saxdiff(''x' + '') def test_xmllang(self): self.saxdiff('' "foo") def test_ns(self): self.saxdiff( '' + 'XLINK' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '') # Repeat tests without namespace support class nonamespaceTest(SAXTest): def setNS(self, saxparser): return None # Redundantly rerun all tests using the "real" minidom parser, just to be # sure that the output is consistent class minidomTest(SAXTest): def DOMParse(self, input): return xml.dom.minidom.parseString(input) def buildTestSuite(): return unittest.defaultTestLoader.loadTestsFromName(__name__) def main(): buildTestSuite() unittest.main() if __name__ == '__main__': main()