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('