source: trunk/essentials/dev-lang/python/Lib/test/test_sax.py@ 3317

Last change on this file since 3317 was 3225, checked in by bird, 19 years ago

Python 2.5

File size: 21.1 KB
Line 
1# regression test for SAX 2.0 -*- coding: iso-8859-1 -*-
2# $Id: test_sax.py 50941 2006-07-29 16:56:15Z fred.drake $
3
4from xml.sax import make_parser, ContentHandler, \
5 SAXException, SAXReaderNotAvailable, SAXParseException
6try:
7 make_parser()
8except SAXReaderNotAvailable:
9 # don't try to test this module if we cannot create a parser
10 raise ImportError("no XML parsers available")
11from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \
12 XMLFilterBase
13from xml.sax.expatreader import create_parser
14from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
15from cStringIO import StringIO
16from test.test_support import verify, verbose, TestFailed, findfile
17import os
18
19# ===== Utilities
20
21tests = 0
22failures = []
23
24def confirm(outcome, name):
25 global tests
26
27 tests = tests + 1
28 if outcome:
29 if verbose:
30 print "Passed", name
31 else:
32 failures.append(name)
33
34def test_make_parser2():
35 try:
36 # Creating parsers several times in a row should succeed.
37 # Testing this because there have been failures of this kind
38 # before.
39 from xml.sax import make_parser
40 p = make_parser()
41 from xml.sax import make_parser
42 p = make_parser()
43 from xml.sax import make_parser
44 p = make_parser()
45 from xml.sax import make_parser
46 p = make_parser()
47 from xml.sax import make_parser
48 p = make_parser()
49 from xml.sax import make_parser
50 p = make_parser()
51 except:
52 return 0
53 else:
54 return p
55
56
57# ===========================================================================
58#
59# saxutils tests
60#
61# ===========================================================================
62
63# ===== escape
64
65def test_escape_basic():
66 return escape("Donald Duck & Co") == "Donald Duck & Co"
67
68def test_escape_all():
69 return escape("<Donald Duck & Co>") == "&lt;Donald Duck &amp; Co&gt;"
70
71def test_escape_extra():
72 return escape("Hei på deg", {"å" : "&aring;"}) == "Hei p&aring; deg"
73
74# ===== unescape
75
76def test_unescape_basic():
77 return unescape("Donald Duck &amp; Co") == "Donald Duck & Co"
78
79def test_unescape_all():
80 return unescape("&lt;Donald Duck &amp; Co&gt;") == "<Donald Duck & Co>"
81
82def test_unescape_extra():
83 return unescape("Hei på deg", {"å" : "&aring;"}) == "Hei p&aring; deg"
84
85def test_unescape_amp_extra():
86 return unescape("&amp;foo;", {"&foo;": "splat"}) == "&foo;"
87
88# ===== quoteattr
89
90def test_quoteattr_basic():
91 return quoteattr("Donald Duck & Co") == '"Donald Duck &amp; Co"'
92
93def test_single_quoteattr():
94 return (quoteattr('Includes "double" quotes')
95 == '\'Includes "double" quotes\'')
96
97def test_double_quoteattr():
98 return (quoteattr("Includes 'single' quotes")
99 == "\"Includes 'single' quotes\"")
100
101def test_single_double_quoteattr():
102 return (quoteattr("Includes 'single' and \"double\" quotes")
103 == "\"Includes 'single' and &quot;double&quot; quotes\"")
104
105# ===== make_parser
106
107def test_make_parser():
108 try:
109 # Creating a parser should succeed - it should fall back
110 # to the expatreader
111 p = make_parser(['xml.parsers.no_such_parser'])
112 except:
113 return 0
114 else:
115 return p
116
117
118# ===== XMLGenerator
119
120start = '<?xml version="1.0" encoding="iso-8859-1"?>\n'
121
122def test_xmlgen_basic():
123 result = StringIO()
124 gen = XMLGenerator(result)
125 gen.startDocument()
126 gen.startElement("doc", {})
127 gen.endElement("doc")
128 gen.endDocument()
129
130 return result.getvalue() == start + "<doc></doc>"
131
132def test_xmlgen_content():
133 result = StringIO()
134 gen = XMLGenerator(result)
135
136 gen.startDocument()
137 gen.startElement("doc", {})
138 gen.characters("huhei")
139 gen.endElement("doc")
140 gen.endDocument()
141
142 return result.getvalue() == start + "<doc>huhei</doc>"
143
144def test_xmlgen_pi():
145 result = StringIO()
146 gen = XMLGenerator(result)
147
148 gen.startDocument()
149 gen.processingInstruction("test", "data")
150 gen.startElement("doc", {})
151 gen.endElement("doc")
152 gen.endDocument()
153
154 return result.getvalue() == start + "<?test data?><doc></doc>"
155
156def test_xmlgen_content_escape():
157 result = StringIO()
158 gen = XMLGenerator(result)
159
160 gen.startDocument()
161 gen.startElement("doc", {})
162 gen.characters("<huhei&")
163 gen.endElement("doc")
164 gen.endDocument()
165
166 return result.getvalue() == start + "<doc>&lt;huhei&amp;</doc>"
167
168def test_xmlgen_attr_escape():
169 result = StringIO()
170 gen = XMLGenerator(result)
171
172 gen.startDocument()
173 gen.startElement("doc", {"a": '"'})
174 gen.startElement("e", {"a": "'"})
175 gen.endElement("e")
176 gen.startElement("e", {"a": "'\""})
177 gen.endElement("e")
178 gen.startElement("e", {"a": "\n\r\t"})
179 gen.endElement("e")
180 gen.endElement("doc")
181 gen.endDocument()
182
183 return result.getvalue() == start + ("<doc a='\"'><e a=\"'\"></e>"
184 "<e a=\"'&quot;\"></e>"
185 "<e a=\"&#10;&#13;&#9;\"></e></doc>")
186
187def test_xmlgen_ignorable():
188 result = StringIO()
189 gen = XMLGenerator(result)
190
191 gen.startDocument()
192 gen.startElement("doc", {})
193 gen.ignorableWhitespace(" ")
194 gen.endElement("doc")
195 gen.endDocument()
196
197 return result.getvalue() == start + "<doc> </doc>"
198