forked from html5lib/html5lib-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_sax.py
More file actions
115 lines (96 loc) · 3.79 KB
/
test_sax.py
File metadata and controls
115 lines (96 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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('<!DOCTYPE foo><foo a="1" b="1">'<bar/>x<!--cmt-->' +
'<![CDATA[data]]></foo>')
def test_xmllang(self):
self.saxdiff('<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">'
"<body xml:lang='en-us'>foo</body></html>")
def test_ns(self):
self.saxdiff(
'<html xmlns="http://www.w3.org/1999/xhtml">' +
'<head><title>XLINK</title></head>' +
'<body>' +
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">' +
'<defs xmlns:l="http://www.w3.org/1999/xlink">' +
'<radialGradient id="s1" fx=".4" fy=".2" r=".7">' +
'<stop stop-color="#FE8"/>' +
'<stop stop-color="#D70" offset="1"/>' +
'</radialGradient>' +
'<radialGradient id="s2" fx=".8" fy=".5" l:href="#s1"/>' +
'<radialGradient id="s3" fx=".5" fy=".9" l:href="#s1"/>' +
'<radialGradient id="s4" fx=".1" fy=".5" l:href="#s1"/>' +
'</defs>' +
'<g stroke="#940">' +
'<path d="M73,29c-37-40-62-24-52,4l6-7c-8-16,7-26,42,9z" fill="url(#s1)"/>' +
'<path d="M47,8c33-16,48,21,9,47l-6-5c38-27,20-44,5-37z" fill="url(#s2)"/>' +
'<path d="M77,32c22,30,10,57-39,51l-1-8c3,3,67,5,36-36z" fill="url(#s3)"/>' +
'<path d="M58,84c-4,20-38-4-8-24l-6-5c-36,43,15,56,23,27z" fill="url(#s4)"/>' +
'<path d="M40,14c-40,37-37,52-9,68l1-8c-16-13-29-21,16-56z" fill="url(#s1)"/>' +
'<path d="M31,33c19,23,20,7,35,41l-9,1.7c-4-19-8-14-31-37z" fill="url(#s2)"/>' +
'</g>' +
'</svg>' +
'</body></html>')
# 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()