blob: 3c5b11ab26567757a005bd612aab81f184725119 [file] [log] [blame]
Martin v. Löwisa729daf2002-08-04 17:28:33 +00001# regression test for SAX 2.0 -*- coding: iso-8859-1 -*-
Lars Gustäbel96753b32000-09-24 12:24:24 +00002# $Id$
3
Martin v. Löwis80670bc2000-10-06 21:13:23 +00004from xml.sax import make_parser, ContentHandler, \
5 SAXException, SAXReaderNotAvailable, SAXParseException
Martin v. Löwis962c9e72000-10-06 17:41:52 +00006try:
7 make_parser()
Martin v. Löwis80670bc2000-10-06 21:13:23 +00008except SAXReaderNotAvailable:
Martin v. Löwis962c9e72000-10-06 17:41:52 +00009 # don't try to test this module if we cannot create a parser
10 raise ImportError("no XML parsers available")
Martin v. Löwis74b51ac2002-10-26 14:50:45 +000011from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \
12 XMLFilterBase
Lars Gustäbel96753b32000-09-24 12:24:24 +000013from xml.sax.expatreader import create_parser
Lars Gustäbelb7536d52000-09-24 18:53:56 +000014from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
Lars Gustäbel96753b32000-09-24 12:24:24 +000015from cStringIO import StringIO
Barry Warsaw04f357c2002-07-23 19:04:11 +000016from test.test_support import verify, verbose, TestFailed, findfile
Guido van Rossume2ae77b2001-10-24 20:42:55 +000017import os
Lars Gustäbel96753b32000-09-24 12:24:24 +000018
19# ===== Utilities
20
21tests = 0
22fails = 0
23
24def confirm(outcome, name):
25 global tests, fails
26
27 tests = tests + 1
28 if outcome:
29 print "Passed", name
30 else:
31 print "Failed", name
32 fails = fails + 1
33
Lars Gustäbel2fc52942000-10-24 15:35:07 +000034def test_make_parser2():
Tim Petersd2bf3b72001-01-18 02:22:22 +000035 try:
Lars Gustäbel2fc52942000-10-24 15:35:07 +000036 # 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
Tim Petersd2bf3b72001-01-18 02:22:22 +000055
56
Lars Gustäbel96753b32000-09-24 12:24:24 +000057# ===========================================================================
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
Martin v. Löwis74b51ac2002-10-26 14:50:45 +000074# ===== 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
Fred Drakeacd32d32001-07-19 16:10:15 +000085# ===== quoteattr
86
87def test_quoteattr_basic():
88 return quoteattr("Donald Duck & Co") == '"Donald Duck &amp; Co"'
89
90def test_single_quoteattr():
91 return (quoteattr('Includes "double" quotes')
92 == '\'Includes "double" quotes\'')
93
94def test_double_quoteattr():
95 return (quoteattr("Includes 'single' quotes")
96 == "\"Includes 'single' quotes\"")
97
98def test_single_double_quoteattr():
99 return (quoteattr("Includes 'single' and \"double\" quotes")
100 == "\"Includes 'single' and &quot;double&quot; quotes\"")
101
102# ===== make_parser
103
Martin v. Löwis962c9e72000-10-06 17:41:52 +0000104def test_make_parser():
105 try:
106 # Creating a parser should succeed - it should fall back
107 # to the expatreader
108 p = make_parser(['xml.parsers.no_such_parser'])
109 except:
110 return 0
111 else:
112 return p
113
114
Lars Gustäbel96753b32000-09-24 12:24:24 +0000115# ===== XMLGenerator
116
117start = '<?xml version="1.0" encoding="iso-8859-1"?>\n'
118
119def test_xmlgen_basic():
120 result = StringIO()
121 gen = XMLGenerator(result)
122 gen.startDocument()
123 gen.startElement("doc", {})
124 gen.endElement("doc")
125 gen.endDocument()
126
127 return result.getvalue() == start + "<doc></doc>"
128
129def test_xmlgen_content():
130 result = StringIO()
131 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000132
Lars Gustäbel96753b32000-09-24 12:24:24 +0000133 gen.startDocument()
134 gen.startElement("doc", {})
135 gen.characters("huhei")
136 gen.endElement("doc")
137 gen.endDocument()
138
139 return result.getvalue() == start + "<doc>huhei</doc>"
140
141def test_xmlgen_pi():
142 result = StringIO()
143 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000144
Lars Gustäbel96753b32000-09-24 12:24:24 +0000145 gen.startDocument()
146 gen.processingInstruction("test", "data")
147 gen.startElement("doc", {})
148 gen.endElement("doc")
149 gen.endDocument()
150
151 return result.getvalue() == start + "<?test data?><doc></doc>"
152
153def test_xmlgen_content_escape():
154 result = StringIO()
155 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000156
Lars Gustäbel96753b32000-09-24 12:24:24 +0000157 gen.startDocument()
158 gen.startElement("doc", {})
159 gen.characters("<huhei&")
160 gen.endElement("doc")
161 gen.endDocument()
162
163 return result.getvalue() == start + "<doc>&lt;huhei&amp;</doc>"
164
Fred Drakec9fadf92001-08-07 19:17:06 +0000165def test_xmlgen_attr_escape():
166 result = StringIO()
167 gen = XMLGenerator(result)
168
169 gen.startDocument()
170 gen.startElement("doc", {"a": '"'})
171 gen.startElement("e", {"a": "'"})
172 gen.endElement("e")
173 gen.startElement("e", {"a": "'\""})
174 gen.endElement("e")
175 gen.endElement("doc")
176 gen.endDocument()
177
178 return result.getvalue() == start \
179 + "<doc a='\"'><e a=\"'\"></e><e a=\"'&quot;\"></e></doc>"
180
Lars Gustäbel96753b32000-09-24 12:24:24 +0000181def test_xmlgen_ignorable():
182 result = StringIO()
183 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000184
Lars Gustäbel96753b32000-09-24 12:24:24 +0000185 gen.startDocument()
186 gen.startElement("doc", {})
187 gen.ignorableWhitespace(" ")
188 gen.endElement("doc")
189 gen.endDocument()
190
191 return result.getvalue() == start + "<doc> </doc>"
192
193ns_uri = "http://www.python.org/xml-ns/saxtest/"
194
195def test_xmlgen_ns():
196 result = StringIO()
197 gen = XMLGenerator(result)
Fred Drake004d5e62000-10-23 17:22:08 +0000198
Lars Gustäbel96753b32000-09-24 12:24:24 +0000199 gen.startDocument()
200 gen.startPrefixMapping("ns1", ns_uri)
Lars Gustäbel6a7768a2000-09-27 08:12:17 +0000201 gen.startElementNS((ns_uri, "doc"), "ns1:doc", {})
Martin v. Löwiscf0a1cc2000-10-03 22:35:29 +0000202 # add an unqualified name
203 gen.startElementNS((None, "udoc"), None, {})
204 gen.endElementNS((None, "udoc"), None)
Lars Gustäbel6a7768a2000-09-27 08:12:17 +0000205 gen.endElementNS((ns_uri, "doc"), "ns1:doc")
Lars Gustäbel96753b32000-09-24 12:24:24 +0000206 gen.endPrefixMapping("ns1")
207 gen.endDocument()
208
Martin v. Löwiscf0a1cc2000-10-03 22:35:29 +0000209 return result.getvalue() == start + \
210 ('<ns1:doc xmlns:ns1="%s"><udoc></udoc></ns1:doc>' %
Lars Gustäbel96753b32000-09-24 12:24:24 +0000211 ns_uri)
212
213# ===== XMLFilterBase
214
215def test_filter_basic():
216 result = StringIO()
217 gen = XMLGenerator(result)
218 filter = XMLFilterBase()
219 filter.setContentHandler(gen)
Fred Drake004d5e62000-10-23 17:22:08 +0000220
Lars Gustäbel96753b32000-09-24 12:24:24 +0000221 filter.startDocument()
222 filter.startElement("doc", {})
223 filter.characters("content")
224 filter.ignorableWhitespace(" ")
225 filter.endElement("doc")
226 filter.endDocument()
227
228 return result.getvalue() == start + "<doc>content </doc>"
229
230# ===========================================================================
231#
232# expatreader tests
233#
234# ===========================================================================
235
Lars Gustäbel07025072000-10-24 16:00:22 +0000236# ===== XMLReader support
237
238def test_expat_file():
239 parser = create_parser()
240 result = StringIO()
241 xmlgen = XMLGenerator(result)
242
243 parser.setContentHandler(xmlgen)
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000244 parser.parse(open(findfile("test"+os.extsep+"xml")))
Lars Gustäbel07025072000-10-24 16:00:22 +0000245
246 return result.getvalue() == xml_test_out
247
Lars Gustäbel96753b32000-09-24 12:24:24 +0000248# ===== DTDHandler support
249
250class TestDTDHandler:
251
252 def __init__(self):
253 self._notations = []
254 self._entities = []
Fred Drake004d5e62000-10-23 17:22:08 +0000255
Lars Gustäbel96753b32000-09-24 12:24:24 +0000256 def notationDecl(self, name, publicId, systemId):
257 self._notations.append((name, publicId, systemId))
258
259 def unparsedEntityDecl(self, name, publicId, systemId, ndata):
260 self._entities.append((name, publicId, systemId, ndata))
261
Lars Gustäbele292a242000-09-24 20:19:45 +0000262def test_expat_dtdhandler():
263 parser = create_parser()
264 handler = TestDTDHandler()
265 parser.setDTDHandler(handler)
Lars Gustäbel96753b32000-09-24 12:24:24 +0000266
Lars Gustäbele292a242000-09-24 20:19:45 +0000267 parser.feed('<!DOCTYPE doc [\n')
268 parser.feed(' <!ENTITY img SYSTEM "expat.gif" NDATA GIF>\n')
269 parser.feed(' <!NOTATION GIF PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN">\n')
270 parser.feed(']>\n')
271 parser.feed('<doc></doc>')
272 parser.close()
Lars Gustäbel96753b32000-09-24 12:24:24 +0000273
Lars Gustäbele292a242000-09-24 20:19:45 +0000274 return handler._notations == [("GIF", "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN", None)] and \
275 handler._entities == [("img", None, "expat.gif", "GIF")]
Lars Gustäbel96753b32000-09-24 12:24:24 +0000276
277# ===== EntityResolver support
278
Lars Gustäbele292a242000-09-24 20:19:45 +0000279class TestEntityResolver:
Lars Gustäbel96753b32000-09-24 12:24:24 +0000280
Lars Gustäbele292a242000-09-24 20:19:45 +0000281 def resolveEntity(self, publicId, systemId):
282 inpsrc = InputSource()
283 inpsrc.setByteStream(StringIO("<entity/>"))
284 return inpsrc
285
286def test_expat_entityresolver():
Lars Gustäbele292a242000-09-24 20:19:45 +0000287 parser = create_parser()
288 parser.setEntityResolver(TestEntityResolver())
289 result = StringIO()
290 parser.setContentHandler(XMLGenerator(result))
291
292 parser.feed('<!DOCTYPE doc [\n')
293 parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
294 parser.feed(']>\n')
295 parser.feed('<doc>&test;</doc>')
296 parser.close()
297
298 return result.getvalue() == start + "<doc><entity></entity></doc>"
Fred Drake004d5e62000-10-23 17:22:08 +0000299
Lars Gustäbelab647872000-09-24 18:40:52 +0000300# ===== Attributes support
301
302class AttrGatherer(ContentHandler):
303
304 def startElement(self, name, attrs):
305 self._attrs = attrs
306
307 def startElementNS(self, name, qname, attrs):
308 self._attrs = attrs
Fred Drake004d5e62000-10-23 17:22:08 +0000309
Lars Gustäbelab647872000-09-24 18:40:52 +0000310def test_expat_attrs_empty():
311 parser = create_parser()
312 gather = AttrGatherer()
313 parser.setContentHandler(gather)
314
315 parser.feed("<doc/>")
316 parser.close()
317
318 return verify_empty_attrs(gather._attrs)
319
320def test_expat_attrs_wattr():
321 parser = create_parser()
322 gather = AttrGatherer()
323 parser.setContentHandler(gather)
324
325 parser.feed("<doc attr='val'/>")
326 parser.close()
327
328 return verify_attrs_wattr(gather._attrs)
329
330def test_expat_nsattrs_empty():
331 parser = create_parser(1)
332 gather = AttrGatherer()
333 parser.setContentHandler(gather)
334
335 parser.feed("<doc/>")
336 parser.close()
337
338 return verify_empty_nsattrs(gather._attrs)
339
340def test_expat_nsattrs_wattr():
341 parser = create_parser(1)
342 gather = AttrGatherer()
343 parser.setContentHandler(gather)
344
345 parser.feed("<doc xmlns:ns='%s' ns:attr='val'/>" % ns_uri)
346 parser.close()
347
348 attrs = gather._attrs
Fred Drake004d5e62000-10-23 17:22:08 +0000349
Lars Gustäbelab647872000-09-24 18:40:52 +0000350 return attrs.getLength() == 1 and \
351 attrs.getNames() == [(ns_uri, "attr")] and \
Fred Draked2909c92002-09-12 17:02:01 +0000352 (attrs.getQNames() == [] or attrs.getQNames() == ["ns:attr"]) and \
Lars Gustäbelab647872000-09-24 18:40:52 +0000353 len(attrs) == 1 and \
354 attrs.has_key((ns_uri, "attr")) and \
355 attrs.keys() == [(ns_uri, "attr")] and \
356 attrs.get((ns_uri, "attr")) == "val" and \
357 attrs.get((ns_uri, "attr"), 25) == "val" and \
358 attrs.items() == [((ns_uri, "attr"), "val")] and \
359 attrs.values() == ["val"] and \
360 attrs.getValue((ns_uri, "attr")) == "val" and \
361 attrs[(ns_uri, "attr")] == "val"
362
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000363# ===== InputSource support
364
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000365xml_test_out = open(findfile("test"+os.extsep+"xml"+os.extsep+"out")).read()
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000366
367def test_expat_inpsource_filename():
368 parser = create_parser()
369 result = StringIO()
370 xmlgen = XMLGenerator(result)
371
372 parser.setContentHandler(xmlgen)
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000373 parser.parse(findfile("test"+os.extsep+"xml"))
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000374
375 return result.getvalue() == xml_test_out
376
377def test_expat_inpsource_sysid():
378 parser = create_parser()
379 result = StringIO()
380 xmlgen = XMLGenerator(result)
381
382 parser.setContentHandler(xmlgen)
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000383 parser.parse(InputSource(findfile("test"+os.extsep+"xml")))
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000384
385 return result.getvalue() == xml_test_out
386
387def test_expat_inpsource_stream():
388 parser = create_parser()
389 result = StringIO()
390 xmlgen = XMLGenerator(result)
391
392 parser.setContentHandler(xmlgen)
393 inpsrc = InputSource()
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000394 inpsrc.setByteStream(open(findfile("test"+os.extsep+"xml")))
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000395 parser.parse(inpsrc)
396
397 return result.getvalue() == xml_test_out
398
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000399# ===== IncrementalParser support
400
401def test_expat_incremental():
402 result = StringIO()
403 xmlgen = XMLGenerator(result)
404 parser = create_parser()
405 parser.setContentHandler(xmlgen)
406
407 parser.feed("<doc>")
408 parser.feed("</doc>")
409 parser.close()
410
411 return result.getvalue() == start + "<doc></doc>"
412
413def test_expat_incremental_reset():
414 result = StringIO()
415 xmlgen = XMLGenerator(result)
416 parser = create_parser()
417 parser.setContentHandler(xmlgen)
418
419 parser.feed("<doc>")
420 parser.feed("text")
421
422 result = StringIO()
423 xmlgen = XMLGenerator(result)
424 parser.setContentHandler(xmlgen)
425 parser.reset()
426
427 parser.feed("<doc>")
428 parser.feed("text")
429 parser.feed("</doc>")
430 parser.close()
431
432 return result.getvalue() == start + "<doc>text</doc>"
433
434# ===== Locator support
435
436def test_expat_locator_noinfo():
437 result = StringIO()
438 xmlgen = XMLGenerator(result)
439 parser = create_parser()
440 parser.setContentHandler(xmlgen)
441
442 parser.feed("<doc>")
443 parser.feed("</doc>")
444 parser.close()
445
Fred Drake132dce22000-12-12 23:11:42 +0000446 return parser.getSystemId() is None and \
447 parser.getPublicId() is None and \
Tim Petersd2bf3b72001-01-18 02:22:22 +0000448 parser.getLineNumber() == 1
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000449
450def test_expat_locator_withinfo():
451 result = StringIO()
452 xmlgen = XMLGenerator(result)
453 parser = create_parser()
454 parser.setContentHandler(xmlgen)
455 parser.parse(findfile("test.xml"))
456
457 return parser.getSystemId() == findfile("test.xml") and \
Fred Drake132dce22000-12-12 23:11:42 +0000458 parser.getPublicId() is None
Lars Gustäbel2fc52942000-10-24 15:35:07 +0000459
Martin v. Löwis80670bc2000-10-06 21:13:23 +0000460
461# ===========================================================================
462#
463# error reporting
464#
465# ===========================================================================
466
467def test_expat_inpsource_location():
468 parser = create_parser()
469 parser.setContentHandler(ContentHandler()) # do nothing
470 source = InputSource()
471 source.setByteStream(StringIO("<foo bar foobar>")) #ill-formed
472 name = "a file name"
473 source.setSystemId(name)
474 try:
475 parser.parse(source)
476 except SAXException, e:
477 return e.getSystemId() == name
478
479def test_expat_incomplete():
480 parser = create_parser()
481 parser.setContentHandler(ContentHandler()) # do nothing
482 try:
483 parser.parse(StringIO("<foo>"))
484 except SAXParseException:
485 return 1 # ok, error found
486 else:
487 return 0
488
489
Lars Gustäbelab647872000-09-24 18:40:52 +0000490# ===========================================================================
491#
492# xmlreader tests
493#
494# ===========================================================================
495
496# ===== AttributesImpl
497
498def verify_empty_attrs(attrs):
499 try:
500 attrs.getValue("attr")
501 gvk = 0
502 except KeyError:
503 gvk = 1
504
505 try:
506 attrs.getValueByQName("attr")
507 gvqk = 0
508 except KeyError:
509 gvqk = 1
510
511 try:
512 attrs.getNameByQName("attr")
513 gnqk = 0
514 except KeyError:
515 gnqk = 1
516
517 try:
518 attrs.getQNameByName("attr")
519 gqnk = 0
520 except KeyError:
521 gqnk = 1
Fred Drake004d5e62000-10-23 17:22:08 +0000522
Lars Gustäbelab647872000-09-24 18:40:52 +0000523 try:
524 attrs["attr"]
525 gik = 0
526 except KeyError:
527 gik = 1
Fred Drake004d5e62000-10-23 17:22:08 +0000528
Lars Gustäbelab647872000-09-24 18:40:52 +0000529 return attrs.getLength() == 0 and \
530 attrs.getNames() == [] and \
531 attrs.getQNames() == [] and \
532 len(attrs) == 0 and \
533 not attrs.has_key("attr") and \
534 attrs.keys() == [] and \
Fred Drake132dce22000-12-12 23:11:42 +0000535 attrs.get("attrs") is None and \
Lars Gustäbelab647872000-09-24 18:40:52 +0000536 attrs.get("attrs", 25) == 25 and \
537 attrs.items() == [] and \
538 attrs.values() == [] and \
539 gvk and gvqk and gnqk and gik and gqnk
540
541def verify_attrs_wattr(attrs):
542 return attrs.getLength() == 1 and \
543 attrs.getNames() == ["attr"] and \
544 attrs.getQNames() == ["attr"] and \
545 len(attrs) == 1 and \
546 attrs.has_key("attr") and \
547 attrs.keys() == ["attr"] and \
548 attrs.get("attr") == "val" and \
549 attrs.get("attr", 25) == "val" and \
550 attrs.items() == [("attr", "val")] and \
551 attrs.values() == ["val"] and \
552 attrs.getValue("attr") == "val" and \
553 attrs.getValueByQName("attr") == "val" and \
554 attrs.getNameByQName("attr") == "attr" and \
555 attrs["attr"] == "val" and \
556 attrs.getQNameByName("attr") == "attr"
557
558def test_attrs_empty():
559 return verify_empty_attrs(AttributesImpl({}))
560
561def test_attrs_wattr():
562 return verify_attrs_wattr(AttributesImpl({"attr" : "val"}))
563
564# ===== AttributesImpl
565
566def verify_empty_nsattrs(attrs):
567 try:
568 attrs.getValue((ns_uri, "attr"))
569 gvk = 0
570 except KeyError:
571 gvk = 1
572
573 try:
574 attrs.getValueByQName("ns:attr")
575 gvqk = 0
576 except KeyError:
577 gvqk = 1
578
579 try:
580 attrs.getNameByQName("ns:attr")
581 gnqk = 0
582 except KeyError:
583 gnqk = 1
584
585 try:
586 attrs.getQNameByName((ns_uri, "attr"))
587 gqnk = 0
588 except KeyError:
589 gqnk = 1
Fred Drake004d5e62000-10-23 17:22:08 +0000590
Lars Gustäbelab647872000-09-24 18:40:52 +0000591 try:
592 attrs[(ns_uri, "attr")]
593 gik = 0
594 except KeyError:
595 gik = 1
Fred Drake004d5e62000-10-23 17:22:08 +0000596
Lars Gustäbelab647872000-09-24 18:40:52 +0000597 return attrs.getLength() == 0 and \
598 attrs.getNames() == [] and \
599 attrs.getQNames() == [] and \
600 len(attrs) == 0 and \
601 not attrs.has_key((ns_uri, "attr")) and \
602 attrs.keys() == [] and \
Fred Drake132dce22000-12-12 23:11:42 +0000603 attrs.get((ns_uri, "attr")) is None and \
Lars Gustäbelab647872000-09-24 18:40:52 +0000604 attrs.get((ns_uri, "attr"), 25) == 25 and \
605 attrs.items() == [] and \
606 attrs.values() == [] and \
607 gvk and gvqk and gnqk and gik and gqnk
608
609def test_nsattrs_empty():
610 return verify_empty_nsattrs(AttributesNSImpl({}, {}))
611
612def test_nsattrs_wattr():
613 attrs = AttributesNSImpl({(ns_uri, "attr") : "val"},
614 {(ns_uri, "attr") : "ns:attr"})
Fred Drake004d5e62000-10-23 17:22:08 +0000615
Lars Gustäbelab647872000-09-24 18:40:52 +0000616 return attrs.getLength() == 1 and \
617 attrs.getNames() == [(ns_uri, "attr")] and \
618 attrs.getQNames() == ["ns:attr"] and \
619 len(attrs) == 1 and \
620 attrs.has_key((ns_uri, "attr")) and \
621 attrs.keys() == [(ns_uri, "attr")] and \
622 attrs.get((ns_uri, "attr")) == "val" and \
623 attrs.get((ns_uri, "attr"), 25) == "val" and \
624 attrs.items() == [((ns_uri, "attr"), "val")] and \
625 attrs.values() == ["val"] and \
626 attrs.getValue((ns_uri, "attr")) == "val" and \
627 attrs.getValueByQName("ns:attr") == "val" and \
628 attrs.getNameByQName("ns:attr") == (ns_uri, "attr") and \
629 attrs[(ns_uri, "attr")] == "val" and \
630 attrs.getQNameByName((ns_uri, "attr")) == "ns:attr"
Fred Drake004d5e62000-10-23 17:22:08 +0000631
Lars Gustäbelab647872000-09-24 18:40:52 +0000632
Lars Gustäbel96753b32000-09-24 12:24:24 +0000633# ===== Main program
634
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000635def make_test_output():
636 parser = create_parser()
637 result = StringIO()
638 xmlgen = XMLGenerator(result)
639
640 parser.setContentHandler(xmlgen)
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000641 parser.parse(findfile("test"+os.extsep+"xml"))
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000642
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000643 outf = open(findfile("test"+os.extsep+"xml"+os.extsep+"out"), "w")
Lars Gustäbelb7536d52000-09-24 18:53:56 +0000644 outf.write(result.getvalue())
645 outf.close()
646
Lars Gustäbel96753b32000-09-24 12:24:24 +0000647items = locals().items()
648items.sort()
649for (name, value) in items:
650 if name[ : 5] == "test_":
651 confirm(value(), name)
652
653print "%d tests, %d failures" % (tests, fails)
654if fails != 0:
655 raise TestFailed, "%d of %d tests failed" % (fails, tests)