Lars Gustäbel | 96753b3 | 2000-09-24 12:24:24 +0000 | [diff] [blame^] | 1 | |
| 2 | # regression test for SAX 2.0 |
| 3 | # $Id$ |
| 4 | |
| 5 | from xml.sax.saxutils import XMLGenerator, escape, XMLFilterBase |
| 6 | from xml.sax.expatreader import create_parser |
| 7 | from cStringIO import StringIO |
| 8 | from test_support import verbose, TestFailed |
| 9 | |
| 10 | # ===== Utilities |
| 11 | |
| 12 | tests = 0 |
| 13 | fails = 0 |
| 14 | |
| 15 | def 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 | |
| 33 | def test_escape_basic(): |
| 34 | return escape("Donald Duck & Co") == "Donald Duck & Co" |
| 35 | |
| 36 | def test_escape_all(): |
| 37 | return escape("<Donald Duck & Co>") == "<Donald Duck & Co>" |
| 38 | |
| 39 | def test_escape_extra(): |
| 40 | return escape("Hei på deg", {"å" : "å"}) == "Hei på deg" |
| 41 | |
| 42 | # ===== XMLGenerator |
| 43 | |
| 44 | start = '<?xml version="1.0" encoding="iso-8859-1"?>\n' |
| 45 | |
| 46 | def 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 | |
| 56 | def 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 | |
| 68 | def 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 | |
| 80 | def 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><huhei&</doc>" |
| 91 | |
| 92 | def 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 | |
| 104 | ns_uri = "http://www.python.org/xml-ns/saxtest/" |
| 105 | |
| 106 | def 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 | |
| 122 | def 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 | |
| 145 | class 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 | |
| 178 | items = locals().items() |
| 179 | items.sort() |
| 180 | for (name, value) in items: |
| 181 | if name[ : 5] == "test_": |
| 182 | confirm(value(), name) |
| 183 | |
| 184 | print "%d tests, %d failures" % (tests, fails) |
| 185 | if fails != 0: |
| 186 | raise TestFailed, "%d of %d tests failed" % (fails, tests) |