| 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 |
|
|---|
| 4 | from xml.sax import make_parser, ContentHandler, \
|
|---|
| 5 | SAXException, SAXReaderNotAvailable, SAXParseException
|
|---|
| 6 | try:
|
|---|
| 7 | make_parser()
|
|---|
| 8 | except SAXReaderNotAvailable:
|
|---|
| 9 | # don't try to test this module if we cannot create a parser
|
|---|
| 10 | raise ImportError("no XML parsers available")
|
|---|
| 11 | from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \
|
|---|
| 12 | XMLFilterBase
|
|---|
| 13 | from xml.sax.expatreader import create_parser
|
|---|
| 14 | from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
|
|---|
| 15 | from cStringIO import StringIO
|
|---|
| 16 | from test.test_support import verify, verbose, TestFailed, findfile
|
|---|
| 17 | import os
|
|---|
| 18 |
|
|---|
| 19 | # ===== Utilities
|
|---|
| 20 |
|
|---|
| 21 | tests = 0
|
|---|
| 22 | failures = []
|
|---|
| 23 |
|
|---|
| 24 | def 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 |
|
|---|
| 34 | def 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 |
|
|---|
| 65 | def test_escape_basic():
|
|---|
| 66 | return escape("Donald Duck & Co") == "Donald Duck & Co"
|
|---|
| 67 |
|
|---|
| 68 | def test_escape_all():
|
|---|
| 69 | return escape("<Donald Duck & Co>") == "<Donald Duck & Co>"
|
|---|
| 70 |
|
|---|
| 71 | def test_escape_extra():
|
|---|
| 72 | return escape("Hei på deg", {"å" : "å"}) == "Hei på deg"
|
|---|
| 73 |
|
|---|
| 74 | # ===== unescape
|
|---|
| 75 |
|
|---|
| 76 | def test_unescape_basic():
|
|---|
| 77 | return unescape("Donald Duck & Co") == "Donald Duck & Co"
|
|---|
| 78 |
|
|---|
| 79 | def test_unescape_all():
|
|---|
| 80 | return unescape("<Donald Duck & Co>") == "<Donald Duck & Co>"
|
|---|
| 81 |
|
|---|
| 82 | def test_unescape_extra():
|
|---|
| 83 | return unescape("Hei på deg", {"å" : "å"}) == "Hei på deg"
|
|---|
| 84 |
|
|---|
| 85 | def test_unescape_amp_extra():
|
|---|
| 86 | return unescape("&foo;", {"&foo;": "splat"}) == "&foo;"
|
|---|
| 87 |
|
|---|
| 88 | # ===== quoteattr
|
|---|
| 89 |
|
|---|
| 90 | def test_quoteattr_basic():
|
|---|
| 91 | return quoteattr("Donald Duck & Co") == '"Donald Duck & Co"'
|
|---|
| 92 |
|
|---|
| 93 | def test_single_quoteattr():
|
|---|
| 94 | return (quoteattr('Includes "double" quotes')
|
|---|
| 95 | == '\'Includes "double" quotes\'')
|
|---|
| 96 |
|
|---|
| 97 | def test_double_quoteattr():
|
|---|
| 98 | return (quoteattr("Includes 'single' quotes")
|
|---|
| 99 | == "\"Includes 'single' quotes\"")
|
|---|
| 100 |
|
|---|
| 101 | def test_single_double_quoteattr():
|
|---|
| 102 | return (quoteattr("Includes 'single' and \"double\" quotes")
|
|---|
| 103 | == "\"Includes 'single' and "double" quotes\"")
|
|---|
| 104 |
|
|---|
| 105 | # ===== make_parser
|
|---|
| 106 |
|
|---|
| 107 | def 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 |
|
|---|
| 120 | start = '<?xml version="1.0" encoding="iso-8859-1"?>\n'
|
|---|
| 121 |
|
|---|
| 122 | def 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 |
|
|---|
| 132 | def 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 |
|
|---|
| 144 | def 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 |
|
|---|
| 156 | def 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><huhei&</doc>"
|
|---|
| 167 |
|
|---|
| 168 | def 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=\"'"\"></e>"
|
|---|
| 185 | "<e a=\" 	\"></e></doc>")
|
|---|
| 186 |
|
|---|
| 187 | def 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 |
|
|---|
|
|---|