blob: 6c887ec9a8366e21fac22a994b14fa50a146134c [file] [log] [blame]
Lars Gustäbel96753b32000-09-24 12:24:24 +00001
2# regression test for SAX 2.0
3# $Id$
4
5from xml.sax.saxutils import XMLGenerator, escape, XMLFilterBase
6from xml.sax.expatreader import create_parser
7from cStringIO import StringIO
8from test_support import verbose, TestFailed
9
10# ===== Utilities
11
12tests = 0
13fails = 0
14
15def confirm(outcome, name):
16 global tests, fails
17
18 tests = tests + 1
19 if outcome:
20 print "Passed", name
21 else:
22 print "Failed", name
23 fails = fails + 1
24
25# ===========================================================================
26#
27# saxutils tests
28#
29# ===========================================================================
30
31# ===== escape
32
33def test_escape_basic():
34 return escape("Donald Duck & Co") == "Donald Duck & Co"
35
36def test_escape_all():
37 return escape("<Donald Duck & Co>") == "&lt;Donald Duck &amp; Co&gt;"
38
39def test_escape_extra():
40 return escape("Hei på deg", {"å" : "&aring;"}) == "Hei p&aring; deg"
41
42# ===== XMLGenerator
43
44start = '<?xml version="1.0" encoding="iso-8859-1"?>\n'
45
46def test_xmlgen_basic():
47 result = StringIO()
48 gen = XMLGenerator(result)
49 gen.startDocument()
50 gen.startElement("doc", {})
51 gen.endElement("doc")
52 gen.endDocument()
53
54 return result.getvalue() == start + "<doc></doc>"
55
56def test_xmlgen_content():
57 result = StringIO()
58 gen = XMLGenerator(result)
59
60 gen.startDocument()
61 gen.startElement("doc", {})
62 gen.characters("huhei")
63 gen.endElement("doc")
64 gen.endDocument()
65
66 return result.getvalue() == start + "<doc>huhei</doc>"
67
68def test_xmlgen_pi():
69 result = StringIO()
70 gen = XMLGenerator(result)
71
72 gen.startDocument()
73 gen.processingInstruction("test", "data")
74 gen.startElement("doc", {})
75 gen.endElement("doc")
76 gen.endDocument()
77
78 return result.getvalue() == start + "<?test data?><doc></doc>"
79
80def test_xmlgen_content_escape():
81 result = StringIO()
82 gen = XMLGenerator(result)
83
84 gen.startDocument()
85 gen.startElement("doc", {})
86 gen.characters("<huhei&")
87 gen.endElement("doc")
88 gen.endDocument()
89
90 return result.getvalue() == start + "<doc>&lt;huhei&amp;</doc>"
91
92def test_xmlgen_ignorable():
93 result = StringIO()
94 gen = XMLGenerator(result)
95
96 gen.startDocument()
97 gen.startElement("doc", {})
98 gen.ignorableWhitespace(" ")
99 gen.endElement("doc")
100 gen.endDocument()
101
102 return result.getvalue() == start + "<doc> </doc>"
103
104ns_uri = "http://www.python.org/xml-ns/saxtest/"
105
106def test_xmlgen_ns():
107 result = StringIO()
108 gen = XMLGenerator(result)
109
110 gen.startDocument()
111 gen.startPrefixMapping("ns1", ns_uri)
112 gen.startElementNS((ns_uri, "doc"), "ns:doc", {})
113 gen.endElementNS((ns_uri, "doc"), "ns:doc")
114 gen.endPrefixMapping("ns1")
115 gen.endDocument()
116
117 return result.getvalue() == start + ('<ns1:doc xmlns:ns1="%s"></ns1:doc>' %
118 ns_uri)
119
120# ===== XMLFilterBase
121
122def test_filter_basic():
123 result = StringIO()
124 gen = XMLGenerator(result)
125 filter = XMLFilterBase()
126 filter.setContentHandler(gen)
127
128 filter.startDocument()
129 filter.startElement("doc", {})
130 filter.characters("content")
131 filter.ignorableWhitespace(" ")
132 filter.endElement("doc")
133 filter.endDocument()
134
135 return result.getvalue() == start + "<doc>content </doc>"
136
137# ===========================================================================
138#
139# expatreader tests
140#
141# ===========================================================================
142
143# ===== DTDHandler support
144
145class TestDTDHandler:
146
147 def __init__(self):
148 self._notations = []
149 self._entities = []
150
151 def notationDecl(self, name, publicId, systemId):
152 self._notations.append((name, publicId, systemId))
153
154 def unparsedEntityDecl(self, name, publicId, systemId, ndata):
155 self._entities.append((name, publicId, systemId, ndata))
156
157# def test_expat_dtdhandler():
158# parser = create_parser()
159# handler = TestDTDHandler()
160# parser.setDTDHandler(handler)
161
162# parser.feed('<!DOCTYPE doc [\n')
163# parser.feed(' <!ENTITY img SYSTEM "expat.gif" NDATA GIF>\n')
164# parser.feed(' <!NOTATION GIF PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN">\n')
165# parser.feed(']>\n')
166# parser.feed('<doc></doc>')
167# parser.close()
168
169# return handler._notations == [("GIF", "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN", None)] and \
170# handler._entities == [("img", None, "expat.gif", "GIF")]
171
172# ===== EntityResolver support
173
174# can't test this until InputSource is in place
175
176# ===== Main program
177
178items = locals().items()
179items.sort()
180for (name, value) in items:
181 if name[ : 5] == "test_":
182 confirm(value(), name)
183
184print "%d tests, %d failures" % (tests, fails)
185if fails != 0:
186 raise TestFailed, "%d of %d tests failed" % (fails, tests)