blob: 4ace1ebea9fc07c92cc1aba001a954f4948179c8 [file] [log] [blame]
Fred Drakefbdeaad2006-07-29 16:56:15 +00001# test for xml.dom.minidom
Paul Prescod7993bcc2000-07-01 14:54:16 +00002
Guido van Rossume2ae77b2001-10-24 20:42:55 +00003import os
Fred Drake17647f52000-07-03 16:37:42 +00004import sys
Martin v. Löwisfd6aaa12003-01-25 22:02:52 +00005import pickle
Fred Drake17647f52000-07-03 16:37:42 +00006import traceback
Martin v. Löwisfd6aaa12003-01-25 22:02:52 +00007from StringIO import StringIO
Barry Warsaw04f357c2002-07-23 19:04:11 +00008from test.test_support import verbose
Fred Drake17647f52000-07-03 16:37:42 +00009
Fred Drakefbdeaad2006-07-29 16:56:15 +000010import xml.dom
11import xml.dom.minidom
12import xml.parsers.expat
Fred Drakec441f7b2002-07-19 22:16:41 +000013
Fred Drakefbdeaad2006-07-29 16:56:15 +000014from xml.dom.minidom import parse, Node, Document, parseString
15from xml.dom.minidom import getDOMImplementation
Martin v. Löwisfd6aaa12003-01-25 22:02:52 +000016
Fred Drakec441f7b2002-07-19 22:16:41 +000017
Fred Drake17647f52000-07-03 16:37:42 +000018if __name__ == "__main__":
19 base = sys.argv[0]
20else:
21 base = __file__
Guido van Rossume2ae77b2001-10-24 20:42:55 +000022tstfile = os.path.join(os.path.dirname(base), "test"+os.extsep+"xml")
Fred Drake17647f52000-07-03 16:37:42 +000023del base
Paul Prescod7993bcc2000-07-01 14:54:16 +000024
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000025def confirm(test, testname = "Test"):
Fred Drakec441f7b2002-07-19 22:16:41 +000026 if not test:
Paul Prescod10d27662000-09-18 19:07:26 +000027 print "Failed " + testname
28 raise Exception
29
Paul Prescod10d27662000-09-18 19:07:26 +000030def testParseFromFile():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000031 dom = parse(StringIO(open(tstfile).read()))
Paul Prescod4c799192000-09-19 19:33:02 +000032 dom.unlink()
Martin v. Löwis89c528b2000-09-19 16:22:10 +000033 confirm(isinstance(dom,Document))
Paul Prescod10d27662000-09-18 19:07:26 +000034
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000035def testGetElementsByTagName():
36 dom = parse(tstfile)
37 confirm(dom.getElementsByTagName("LI") == \
38 dom.documentElement.getElementsByTagName("LI"))
Paul Prescod7993bcc2000-07-01 14:54:16 +000039 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +000040
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000041def testInsertBefore():
Fred Drakea1bde802000-11-21 22:02:43 +000042 dom = parseString("<doc><foo/></doc>")
43 root = dom.documentElement
44 elem = root.childNodes[0]
45 nelem = dom.createElement("element")
46 root.insertBefore(nelem, elem)
47 confirm(len(root.childNodes) == 2
Fred Drake946f7b12001-09-28 20:31:50 +000048 and root.childNodes.length == 2
Fred Drakea1bde802000-11-21 22:02:43 +000049 and root.childNodes[0] is nelem
Fred Drake946f7b12001-09-28 20:31:50 +000050 and root.childNodes.item(0) is nelem
Fred Drakea1bde802000-11-21 22:02:43 +000051 and root.childNodes[1] is elem
Fred Drake946f7b12001-09-28 20:31:50 +000052 and root.childNodes.item(1) is elem
Fred Drakea1bde802000-11-21 22:02:43 +000053 and root.firstChild is nelem
54 and root.lastChild is elem
55 and root.toxml() == "<doc><element/><foo/></doc>"
56 , "testInsertBefore -- node properly placed in tree")
57 nelem = dom.createElement("element")
58 root.insertBefore(nelem, None)
59 confirm(len(root.childNodes) == 3
Fred Drake946f7b12001-09-28 20:31:50 +000060 and root.childNodes.length == 3
Fred Drakea1bde802000-11-21 22:02:43 +000061 and root.childNodes[1] is elem
Fred Drake946f7b12001-09-28 20:31:50 +000062 and root.childNodes.item(1) is elem
Fred Drakea1bde802000-11-21 22:02:43 +000063 and root.childNodes[2] is nelem
Fred Drake946f7b12001-09-28 20:31:50 +000064 and root.childNodes.item(2) is nelem
Fred Drakea1bde802000-11-21 22:02:43 +000065 and root.lastChild is nelem
66 and nelem.previousSibling is elem
67 and root.toxml() == "<doc><element/><foo/><element/></doc>"
68 , "testInsertBefore -- node properly placed in tree")
69 nelem2 = dom.createElement("bar")
70 root.insertBefore(nelem2, nelem)
71 confirm(len(root.childNodes) == 4
Fred Drake946f7b12001-09-28 20:31:50 +000072 and root.childNodes.length == 4
Fred Drakea1bde802000-11-21 22:02:43 +000073 and root.childNodes[2] is nelem2
Fred Drake946f7b12001-09-28 20:31:50 +000074 and root.childNodes.item(2) is nelem2
Fred Drakea1bde802000-11-21 22:02:43 +000075 and root.childNodes[3] is nelem
Fred Drake946f7b12001-09-28 20:31:50 +000076 and root.childNodes.item(3) is nelem
Fred Drakea1bde802000-11-21 22:02:43 +000077 and nelem2.nextSibling is nelem
78 and nelem.previousSibling is nelem2
79 and root.toxml() == "<doc><element/><foo/><bar/><element/></doc>"
80 , "testInsertBefore -- node properly placed in tree")
Paul Prescod7993bcc2000-07-01 14:54:16 +000081 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +000082
Fred Drakee50959a2001-12-06 04:32:18 +000083def _create_fragment_test_nodes():
84 dom = parseString("<doc/>")
85 orig = dom.createTextNode("original")
86 c1 = dom.createTextNode("foo")
87 c2 = dom.createTextNode("bar")
88 c3 = dom.createTextNode("bat")
89 dom.documentElement.appendChild(orig)
90 frag = dom.createDocumentFragment()
91 frag.appendChild(c1)
92 frag.appendChild(c2)
93 frag.appendChild(c3)
94 return dom, orig, c1, c2, c3, frag
95
96def testInsertBeforeFragment():
97 dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
98 dom.documentElement.insertBefore(frag, None)
99 confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3),
100 "insertBefore(<fragment>, None)")
101 frag.unlink()
102 dom.unlink()
103 #
104 dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
105 dom.documentElement.insertBefore(frag, orig)
106 confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3, orig),
107 "insertBefore(<fragment>, orig)")
108 frag.unlink()
109 dom.unlink()
110
Paul Prescod7993bcc2000-07-01 14:54:16 +0000111def testAppendChild():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000112 dom = parse(tstfile)
113 dom.documentElement.appendChild(dom.createComment(u"Hello"))
114 confirm(dom.documentElement.childNodes[-1].nodeName == "#comment")
115 confirm(dom.documentElement.childNodes[-1].data == "Hello")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000116 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000117
Fred Drakee50959a2001-12-06 04:32:18 +0000118def testAppendChildFragment():
119 dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
120 dom.documentElement.appendChild(frag)
121 confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3),
122 "appendChild(<fragment>)")
123 frag.unlink()
124 dom.unlink()
125
126def testReplaceChildFragment():
127 dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
128 dom.documentElement.replaceChild(frag, orig)
129 orig.unlink()
130 confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3),
131 "replaceChild(<fragment>)")
132 frag.unlink()
133 dom.unlink()
134
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000135def testLegalChildren():
136 dom = Document()
137 elem = dom.createElement('element')
138 text = dom.createTextNode('text')
Fredrik Lundhf7850422001-01-17 21:51:36 +0000139
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000140 try: dom.appendChild(text)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000141 except xml.dom.HierarchyRequestErr: pass
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000142 else:
143 print "dom.appendChild didn't raise HierarchyRequestErr"
144
145 dom.appendChild(elem)
146 try: dom.insertBefore(text, elem)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000147 except xml.dom.HierarchyRequestErr: pass
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000148 else:
149 print "dom.appendChild didn't raise HierarchyRequestErr"
150
151 try: dom.replaceChild(text, elem)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000152 except xml.dom.HierarchyRequestErr: pass
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000153 else:
154 print "dom.appendChild didn't raise HierarchyRequestErr"
155
Tim Peters0009c4e2001-02-21 07:29:48 +0000156 nodemap = elem.attributes
Andrew M. Kuchlingbc8f72c2001-02-21 01:30:26 +0000157 try: nodemap.setNamedItem(text)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000158 except xml.dom.HierarchyRequestErr: pass
Andrew M. Kuchlingbc8f72c2001-02-21 01:30:26 +0000159 else:
160 print "NamedNodeMap.setNamedItem didn't raise HierarchyRequestErr"
161
162 try: nodemap.setNamedItemNS(text)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000163 except xml.dom.HierarchyRequestErr: pass
Andrew M. Kuchlingbc8f72c2001-02-21 01:30:26 +0000164 else:
165 print "NamedNodeMap.setNamedItemNS didn't raise HierarchyRequestErr"
166
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000167 elem.appendChild(text)
Fredrik Lundhf7850422001-01-17 21:51:36 +0000168 dom.unlink()
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000169
Fred Drake2998a552001-12-06 18:27:48 +0000170def testNamedNodeMapSetItem():
171 dom = Document()
172 elem = dom.createElement('element')
173 attrs = elem.attributes
174 attrs["foo"] = "bar"
175 a = attrs.item(0)
176 confirm(a.ownerDocument is dom,
177 "NamedNodeMap.__setitem__() sets ownerDocument")
178 confirm(a.ownerElement is elem,
179 "NamedNodeMap.__setitem__() sets ownerElement")
180 confirm(a.value == "bar",
181 "NamedNodeMap.__setitem__() sets value")
182 confirm(a.nodeValue == "bar",
183 "NamedNodeMap.__setitem__() sets nodeValue")
184 elem.unlink()
185 dom.unlink()
186
Paul Prescod7993bcc2000-07-01 14:54:16 +0000187def testNonZero():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000188 dom = parse(tstfile)
189 confirm(dom)# should not be zero
190 dom.appendChild(dom.createComment("foo"))
191 confirm(not dom.childNodes[-1].childNodes)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000192 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000193
194def testUnlink():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000195 dom = parse(tstfile)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000196 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000197
198def testElement():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000199 dom = Document()
200 dom.appendChild(dom.createElement("abc"))
201 confirm(dom.documentElement)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000202 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000203
204def testAAA():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000205 dom = parseString("<abc/>")
206 el = dom.documentElement
207 el.setAttribute("spam", "jam2")
Fred Drakea1bde802000-11-21 22:02:43 +0000208 confirm(el.toxml() == '<abc spam="jam2"/>', "testAAA")
Fred Drake2998a552001-12-06 18:27:48 +0000209 a = el.getAttributeNode("spam")
210 confirm(a.ownerDocument is dom,
211 "setAttribute() sets ownerDocument")
212 confirm(a.ownerElement is dom.documentElement,
213 "setAttribute() sets ownerElement")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000214 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000215
216def testAAB():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000217 dom = parseString("<abc/>")
218 el = dom.documentElement
219 el.setAttribute("spam", "jam")
220 el.setAttribute("spam", "jam2")
Fred Drakea1bde802000-11-21 22:02:43 +0000221 confirm(el.toxml() == '<abc spam="jam2"/>', "testAAB")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000222 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000223
224def testAddAttr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000225 dom = Document()
226 child = dom.appendChild(dom.createElement("abc"))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000227
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000228 child.setAttribute("def", "ghi")
229 confirm(child.getAttribute("def") == "ghi")
230 confirm(child.attributes["def"].value == "ghi")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000231
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000232 child.setAttribute("jkl", "mno")
233 confirm(child.getAttribute("jkl") == "mno")
234 confirm(child.attributes["jkl"].value == "mno")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000235
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000236 confirm(len(child.attributes) == 2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000237
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000238 child.setAttribute("def", "newval")
239 confirm(child.getAttribute("def") == "newval")
240 confirm(child.attributes["def"].value == "newval")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000241
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000242 confirm(len(child.attributes) == 2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000243 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000244
245def testDeleteAttr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000246 dom = Document()
247 child = dom.appendChild(dom.createElement("abc"))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000248
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000249 confirm(len(child.attributes) == 0)
250 child.setAttribute("def", "ghi")
251 confirm(len(child.attributes) == 1)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000252 del child.attributes["def"]
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000253 confirm(len(child.attributes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000254 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000255
256def testRemoveAttr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000257 dom = Document()
258 child = dom.appendChild(dom.createElement("abc"))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000259
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000260 child.setAttribute("def", "ghi")
261 confirm(len(child.attributes) == 1)
262 child.removeAttribute("def")
263 confirm(len(child.attributes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000264
265 dom.unlink()
266
267def testRemoveAttrNS():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000268 dom = Document()
269 child = dom.appendChild(
270 dom.createElementNS("http://www.python.org", "python:abc"))
Fred Drake004d5e62000-10-23 17:22:08 +0000271 child.setAttributeNS("http://www.w3.org", "xmlns:python",
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000272 "http://www.python.org")
273 child.setAttributeNS("http://www.python.org", "python:abcattr", "foo")
274 confirm(len(child.attributes) == 2)
275 child.removeAttributeNS("http://www.python.org", "abcattr")
276 confirm(len(child.attributes) == 1)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000277
278 dom.unlink()
Fred Drake004d5e62000-10-23 17:22:08 +0000279
Paul Prescod7993bcc2000-07-01 14:54:16 +0000280def testRemoveAttributeNode():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000281 dom = Document()
282 child = dom.appendChild(dom.createElement("foo"))
283 child.setAttribute("spam", "jam")
284 confirm(len(child.attributes) == 1)
285 node = child.getAttributeNode("spam")
286 child.removeAttributeNode(node)
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000287 confirm(len(child.attributes) == 0
288 and child.getAttributeNode("spam") is None)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000289
290 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000291
292def testChangeAttr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000293 dom = parseString("<abc/>")
294 el = dom.documentElement
295 el.setAttribute("spam", "jam")
296 confirm(len(el.attributes) == 1)
297 el.setAttribute("spam", "bam")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000298 # Set this attribute to be an ID and make sure that doesn't change
299 # when changing the value:
300 el.setIdAttribute("spam")
301 confirm(len(el.attributes) == 1
302 and el.attributes["spam"].value == "bam"
303 and el.attributes["spam"].nodeValue == "bam"
304 and el.getAttribute("spam") == "bam"
305 and el.getAttributeNode("spam").isId)
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000306 el.attributes["spam"] = "ham"
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000307 confirm(len(el.attributes) == 1
308 and el.attributes["spam"].value == "ham"
309 and el.attributes["spam"].nodeValue == "ham"
310 and el.getAttribute("spam") == "ham"
311 and el.attributes["spam"].isId)
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000312 el.setAttribute("spam2", "bam")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000313 confirm(len(el.attributes) == 2
314 and el.attributes["spam"].value == "ham"
315 and el.attributes["spam"].nodeValue == "ham"
316 and el.getAttribute("spam") == "ham"
317 and el.attributes["spam2"].value == "bam"
318 and el.attributes["spam2"].nodeValue == "bam"
319 and el.getAttribute("spam2") == "bam")
320 el.attributes["spam2"] = "bam2"
321 confirm(len(el.attributes) == 2
322 and el.attributes["spam"].value == "ham"
323 and el.attributes["spam"].nodeValue == "ham"
324 and el.getAttribute("spam") == "ham"
325 and el.attributes["spam2"].value == "bam2"
326 and el.attributes["spam2"].nodeValue == "bam2"
327 and el.getAttribute("spam2") == "bam2")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000328 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000329
330def testGetAttrList():
331 pass
332
333def testGetAttrValues(): pass
334
335def testGetAttrLength(): pass
336
337def testGetAttribute(): pass
338
339def testGetAttributeNS(): pass
340
341def testGetAttributeNode(): pass
342
Martin v. Löwis351c3d02001-06-03 14:27:02 +0000343def testGetElementsByTagNameNS():
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000344 d="""<foo xmlns:minidom='http://pyxml.sf.net/minidom'>
Martin v. Löwis351c3d02001-06-03 14:27:02 +0000345 <minidom:myelem/>
346 </foo>"""
347 dom = parseString(d)
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000348 elems = dom.getElementsByTagNameNS("http://pyxml.sf.net/minidom", "myelem")
349 confirm(len(elems) == 1
350 and elems[0].namespaceURI == "http://pyxml.sf.net/minidom"
351 and elems[0].localName == "myelem"
352 and elems[0].prefix == "minidom"
353 and elems[0].tagName == "minidom:myelem"
354 and elems[0].nodeName == "minidom:myelem")
Martin v. Löwis351c3d02001-06-03 14:27:02 +0000355 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000356
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000357def get_empty_nodelist_from_elements_by_tagName_ns_helper(doc, nsuri, lname):
358 nodelist = doc.getElementsByTagNameNS(nsuri, lname)
359 confirm(len(nodelist) == 0)
360
361def testGetEmptyNodeListFromElementsByTagNameNS():
362 doc = parseString('<doc/>')
363 get_empty_nodelist_from_elements_by_tagName_ns_helper(
364 doc, 'http://xml.python.org/namespaces/a', 'localname')
365 get_empty_nodelist_from_elements_by_tagName_ns_helper(
366 doc, '*', 'splat')
367 get_empty_nodelist_from_elements_by_tagName_ns_helper(
368 doc, 'http://xml.python.org/namespaces/a', '*')
369
370 doc = parseString('<doc xmlns="http://xml.python.org/splat"><e/></doc>')
371 get_empty_nodelist_from_elements_by_tagName_ns_helper(
372 doc, "http://xml.python.org/splat", "not-there")
373 get_empty_nodelist_from_elements_by_tagName_ns_helper(
374 doc, "*", "not-there")
375 get_empty_nodelist_from_elements_by_tagName_ns_helper(
376 doc, "http://somewhere.else.net/not-there", "e")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000377
378def testElementReprAndStr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000379 dom = Document()
380 el = dom.appendChild(dom.createElement("abc"))
381 string1 = repr(el)
382 string2 = str(el)
383 confirm(string1 == string2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000384 dom.unlink()
385
386# commented out until Fredrick's fix is checked in
387def _testElementReprAndStrUnicode():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000388 dom = Document()
389 el = dom.appendChild(dom.createElement(u"abc"))
390 string1 = repr(el)
391 string2 = str(el)
392 confirm(string1 == string2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000393 dom.unlink()
394
395# commented out until Fredrick's fix is checked in
396def _testElementReprAndStrUnicodeNS():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000397 dom = Document()
398 el = dom.appendChild(
399 dom.createElementNS(u"http://www.slashdot.org", u"slash:abc"))
400 string1 = repr(el)
401 string2 = str(el)
402 confirm(string1 == string2)
403 confirm(string1.find("slash:abc") != -1)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000404 dom.unlink()
405
406def testAttributeRepr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000407 dom = Document()
408 el = dom.appendChild(dom.createElement(u"abc"))
409 node = el.setAttribute("abc", "def")
410 confirm(str(node) == repr(node))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000411 dom.unlink()
412
413def testTextNodeRepr(): pass
414
Martin v. Löwis0a84a332000-10-06 22:42:55 +0000415def testWriteXML():
Georg Brandl905a01a2005-08-25 22:14:15 +0000416 str = '<?xml version="1.0" ?><a b="c"/>'
Martin v. Löwis0a84a332000-10-06 22:42:55 +0000417 dom = parseString(str)
418 domstr = dom.toxml()
419 dom.unlink()
420 confirm(str == domstr)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000421
Georg Brandl905a01a2005-08-25 22:14:15 +0000422def testAltNewline():
423 str = '<?xml version="1.0" ?>\n<a b="c"/>\n'
424 dom = parseString(str)
425 domstr = dom.toprettyxml(newl="\r\n")
426 dom.unlink()
427 confirm(domstr == str.replace("\n", "\r\n"))
428
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000429def testProcessingInstruction():
430 dom = parseString('<e><?mypi \t\n data \t\n ?></e>')
431 pi = dom.documentElement.firstChild
432 confirm(pi.target == "mypi"
433 and pi.data == "data \t\n "
434 and pi.nodeName == "mypi"
435 and pi.nodeType == Node.PROCESSING_INSTRUCTION_NODE
436 and pi.attributes is None
437 and not pi.hasChildNodes()
438 and len(pi.childNodes) == 0
439 and pi.firstChild is None
440 and pi.lastChild is None
441 and pi.localName is None
Fred Drakefbdeaad2006-07-29 16:56:15 +0000442 and pi.namespaceURI == xml.dom.EMPTY_NAMESPACE)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000443
444def testProcessingInstructionRepr(): pass
445
446def testTextRepr(): pass
447
448def testWriteText(): pass
449
450def testDocumentElement(): pass
451
Fred Drakea1bde802000-11-21 22:02:43 +0000452def testTooManyDocumentElements():
453 doc = parseString("<doc/>")
454 elem = doc.createElement("extra")
455 try:
456 doc.appendChild(elem)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000457 except xml.dom.HierarchyRequestErr:
Fred Drakec441f7b2002-07-19 22:16:41 +0000458 pass
Fred Drakea1bde802000-11-21 22:02:43 +0000459 else:
460 print "Failed to catch expected exception when" \
461 " adding extra document element."
462 elem.unlink()
463 doc.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000464
465def testCreateElementNS(): pass
466
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000467def testCreateAttributeNS(): pass
Paul Prescod7993bcc2000-07-01 14:54:16 +0000468
469def testParse(): pass
470
471def testParseString(): pass
472
473def testComment(): pass
474
475def testAttrListItem(): pass
476
477def testAttrListItems(): pass
478
479def testAttrListItemNS(): pass
480
481def testAttrListKeys(): pass
482
483def testAttrListKeysNS(): pass
484
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000485def testRemoveNamedItem():
486 doc = parseString("<doc a=''/>")
487 e = doc.documentElement
488 attrs = e.attributes
489 a1 = e.getAttributeNode("a")
490 a2 = attrs.removeNamedItem("a")
491 confirm(a1.isSameNode(a2))
492 try:
493 attrs.removeNamedItem("a")
Fred Drakefbdeaad2006-07-29 16:56:15 +0000494 except xml.dom.NotFoundErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000495 pass
496
497def testRemoveNamedItemNS():
498 doc = parseString("<doc xmlns:a='http://xml.python.org/' a:b=''/>")
499 e = doc.documentElement
500 attrs = e.attributes
501 a1 = e.getAttributeNodeNS("http://xml.python.org/", "b")
502 a2 = attrs.removeNamedItemNS("http://xml.python.org/", "b")
503 confirm(a1.isSameNode(a2))
504 try:
505 attrs.removeNamedItemNS("http://xml.python.org/", "b")
Fred Drakefbdeaad2006-07-29 16:56:15 +0000506 except xml.dom.NotFoundErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000507 pass
508
Paul Prescod7993bcc2000-07-01 14:54:16 +0000509def testAttrListValues(): pass
510
511def testAttrListLength(): pass
512
513def testAttrList__getitem__(): pass
514
515def testAttrList__setitem__(): pass
516
517def testSetAttrValueandNodeValue(): pass
518
519def testParseElement(): pass
520
521def testParseAttributes(): pass
522
523def testParseElementNamespaces(): pass
524
525def testParseAttributeNamespaces(): pass
526
527def testParseProcessingInstructions(): pass
528
529def testChildNodes(): pass
530
531def testFirstChild(): pass
532
533def testHasChildNodes(): pass
534
Fred Drakea1bde802000-11-21 22:02:43 +0000535def testCloneElementShallow():
536 dom, clone = _setupCloneElement(0)
537 confirm(len(clone.childNodes) == 0
Fred Drake946f7b12001-09-28 20:31:50 +0000538 and clone.childNodes.length == 0
Fred Drakea1bde802000-11-21 22:02:43 +0000539 and clone.parentNode is None
540 and clone.toxml() == '<doc attr="value"/>'
541 , "testCloneElementShallow")
542 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000543
Fred Drakea1bde802000-11-21 22:02:43 +0000544def testCloneElementDeep():
545 dom, clone = _setupCloneElement(1)
546 confirm(len(clone.childNodes) == 1
Fred Drake946f7b12001-09-28 20:31:50 +0000547 and clone.childNodes.length == 1
Fred Drakea1bde802000-11-21 22:02:43 +0000548 and clone.parentNode is None
549 and clone.toxml() == '<doc attr="value"><foo/></doc>'
550 , "testCloneElementDeep")
551 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000552
Fred Drakea1bde802000-11-21 22:02:43 +0000553def _setupCloneElement(deep):
554 dom = parseString("<doc attr='value'><foo/></doc>")
555 root = dom.documentElement
556 clone = root.cloneNode(deep)
557 _testCloneElementCopiesAttributes(
558 root, clone, "testCloneElement" + (deep and "Deep" or "Shallow"))
559 # mutilate the original so shared data is detected
560 root.tagName = root.nodeName = "MODIFIED"
561 root.setAttribute("attr", "NEW VALUE")
562 root.setAttribute("added", "VALUE")
563 return dom, clone
564
565def _testCloneElementCopiesAttributes(e1, e2, test):
566 attrs1 = e1.attributes
567 attrs2 = e2.attributes
568 keys1 = attrs1.keys()
569 keys2 = attrs2.keys()
570 keys1.sort()
571 keys2.sort()
572 confirm(keys1 == keys2, "clone of element has same attribute keys")
573 for i in range(len(keys1)):
574 a1 = attrs1.item(i)
575 a2 = attrs2.item(i)
576 confirm(a1 is not a2
577 and a1.value == a2.value
578 and a1.nodeValue == a2.nodeValue
579 and a1.namespaceURI == a2.namespaceURI
580 and a1.localName == a2.localName
581 , "clone of attribute node has proper attribute values")
582 confirm(a2.ownerElement is e2,
583 "clone of attribute node correctly owned")
Fredrik Lundhf7850422001-01-17 21:51:36 +0000584
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000585def testCloneDocumentShallow():
586 doc = parseString("<?xml version='1.0'?>\n"
587 "<!-- comment -->"
588 "<!DOCTYPE doc [\n"
589 "<!NOTATION notation SYSTEM 'http://xml.python.org/'>\n"
590 "]>\n"
591 "<doc attr='value'/>")
592 doc2 = doc.cloneNode(0)
593 confirm(doc2 is None,
594 "testCloneDocumentShallow:"
595 " shallow cloning of documents makes no sense!")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000596
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000597def testCloneDocumentDeep():
598 doc = parseString("<?xml version='1.0'?>\n"
599 "<!-- comment -->"
600 "<!DOCTYPE doc [\n"
601 "<!NOTATION notation SYSTEM 'http://xml.python.org/'>\n"
602 "]>\n"
603 "<doc attr='value'/>")
604 doc2 = doc.cloneNode(1)
605 confirm(not (doc.isSameNode(doc2) or doc2.isSameNode(doc)),
606 "testCloneDocumentDeep: document objects not distinct")
607 confirm(len(doc.childNodes) == len(doc2.childNodes),
608 "testCloneDocumentDeep: wrong number of Document children")
609 confirm(doc2.documentElement.nodeType == Node.ELEMENT_NODE,
610 "testCloneDocumentDeep: documentElement not an ELEMENT_NODE")
611 confirm(doc2.documentElement.ownerDocument.isSameNode(doc2),
612 "testCloneDocumentDeep: documentElement owner is not new document")
613 confirm(not doc.documentElement.isSameNode(doc2.documentElement),
614 "testCloneDocumentDeep: documentElement should not be shared")
615 if doc.doctype is not None:
616 # check the doctype iff the original DOM maintained it
617 confirm(doc2.doctype.nodeType == Node.DOCUMENT_TYPE_NODE,
618 "testCloneDocumentDeep: doctype not a DOCUMENT_TYPE_NODE")
619 confirm(doc2.doctype.ownerDocument.isSameNode(doc2))
620 confirm(not doc.doctype.isSameNode(doc2.doctype))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000621
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000622def testCloneDocumentTypeDeepOk():
623 doctype = create_nonempty_doctype()
624 clone = doctype.cloneNode(1)
625 confirm(clone is not None
626 and clone.nodeName == doctype.nodeName
627 and clone.name == doctype.name
628 and clone.publicId == doctype.publicId
629 and clone.systemId == doctype.systemId
630 and len(clone.entities) == len(doctype.entities)
631 and clone.entities.item(len(clone.entities)) is None
632 and len(clone.notations) == len(doctype.notations)
633 and clone.notations.item(len(clone.notations)) is None
634 and len(clone.childNodes) == 0)
635 for i in range(len(doctype.entities)):
636 se = doctype.entities.item(i)
637 ce = clone.entities.item(i)
638 confirm((not se.isSameNode(ce))
639 and (not ce.isSameNode(se))
640 and ce.nodeName == se.nodeName
641 and ce.notationName == se.notationName
642 and ce.publicId == se.publicId
643 and ce.systemId == se.systemId
644 and ce.encoding == se.encoding
645 and ce.actualEncoding == se.actualEncoding
646 and ce.version == se.version)
647 for i in range(len(doctype.notations)):
648 sn = doctype.notations.item(i)
649 cn = clone.notations.item(i)
650 confirm((not sn.isSameNode(cn))
651 and (not cn.isSameNode(sn))
652 and cn.nodeName == sn.nodeName
653 and cn.publicId == sn.publicId
654 and cn.systemId == sn.systemId)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000655
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000656def testCloneDocumentTypeDeepNotOk():
657 doc = create_doc_with_doctype()
658 clone = doc.doctype.cloneNode(1)
659 confirm(clone is None, "testCloneDocumentTypeDeepNotOk")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000660
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000661def testCloneDocumentTypeShallowOk():
662 doctype = create_nonempty_doctype()
663 clone = doctype.cloneNode(0)
664 confirm(clone is not None
665 and clone.nodeName == doctype.nodeName
666 and clone.name == doctype.name
667 and clone.publicId == doctype.publicId
668 and clone.systemId == doctype.systemId
669 and len(clone.entities) == 0
670 and clone.entities.item(0) is None
671 and len(clone.notations) == 0
672 and clone.notations.item(0) is None
673 and len(clone.childNodes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000674
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000675def testCloneDocumentTypeShallowNotOk():
676 doc = create_doc_with_doctype()
677 clone = doc.doctype.cloneNode(0)
678 confirm(clone is None, "testCloneDocumentTypeShallowNotOk")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000679
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000680def check_import_document(deep, testName):
681 doc1 = parseString("<doc/>")
682 doc2 = parseString("<doc/>")
683 try:
684 doc1.importNode(doc2, deep)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000685 except xml.dom.NotSupportedErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000686 pass
687 else:
688 raise Exception(testName +
689 ": expected NotSupportedErr when importing a document")
690
691def testImportDocumentShallow():
692 check_import_document(0, "testImportDocumentShallow")
693
694def testImportDocumentDeep():
695 check_import_document(1, "testImportDocumentDeep")
696
697# The tests of DocumentType importing use these helpers to construct
698# the documents to work with, since not all DOM builders actually
699# create the DocumentType nodes.
700
701def create_doc_without_doctype(doctype=None):
702 return getDOMImplementation().createDocument(None, "doc", doctype)
703
704def create_nonempty_doctype():
705 doctype = getDOMImplementation().createDocumentType("doc", None, None)
706 doctype.entities._seq = []
707 doctype.notations._seq = []
Fred Drakefbdeaad2006-07-29 16:56:15 +0000708 notation = xml.dom.minidom.Notation("my-notation", None,
709 "http://xml.python.org/notations/my")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000710 doctype.notations._seq.append(notation)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000711 entity = xml.dom.minidom.Entity("my-entity", None,
712 "http://xml.python.org/entities/my",
713 "my-notation")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000714 entity.version = "1.0"
715 entity.encoding = "utf-8"
716 entity.actualEncoding = "us-ascii"
717 doctype.entities._seq.append(entity)
718 return doctype
719
720def create_doc_with_doctype():
721 doctype = create_nonempty_doctype()
722 doc = create_doc_without_doctype(doctype)
723 doctype.entities.item(0).ownerDocument = doc
724 doctype.notations.item(0).ownerDocument = doc
725 return doc
726
727def testImportDocumentTypeShallow():
728 src = create_doc_with_doctype()
729 target = create_doc_without_doctype()
730 try:
731 imported = target.importNode(src.doctype, 0)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000732 except xml.dom.NotSupportedErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000733 pass
734 else:
735 raise Exception(
736 "testImportDocumentTypeShallow: expected NotSupportedErr")
737
738def testImportDocumentTypeDeep():
739 src = create_doc_with_doctype()
740 target = create_doc_without_doctype()
741 try:
742 imported = target.importNode(src.doctype, 1)
Fred Drakefbdeaad2006-07-29 16:56:15 +0000743 except xml.dom.NotSupportedErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000744 pass
745 else:
746 raise Exception(
747 "testImportDocumentTypeDeep: expected NotSupportedErr")
748
749# Testing attribute clones uses a helper, and should always be deep,
750# even if the argument to cloneNode is false.
751def check_clone_attribute(deep, testName):
752 doc = parseString("<doc attr='value'/>")
753 attr = doc.documentElement.getAttributeNode("attr")
754 assert attr is not None
755 clone = attr.cloneNode(deep)
756 confirm(not clone.isSameNode(attr))
757 confirm(not attr.isSameNode(clone))
758 confirm(clone.ownerElement is None,
759 testName + ": ownerElement should be None")
760 confirm(clone.ownerDocument.isSameNode(attr.ownerDocument),
761 testName + ": ownerDocument does not match")
762 confirm(clone.specified,
763 testName + ": cloned attribute must have specified == True")
764
765def testCloneAttributeShallow():
766 check_clone_attribute(0, "testCloneAttributeShallow")
767
768def testCloneAttributeDeep():
769 check_clone_attribute(1, "testCloneAttributeDeep")
770
771def check_clone_pi(deep, testName):
772 doc = parseString("<?target data?><doc/>")
773 pi = doc.firstChild
774 assert pi.nodeType == Node.PROCESSING_INSTRUCTION_NODE
775 clone = pi.cloneNode(deep)
776 confirm(clone.target == pi.target
777 and clone.data == pi.data)
778
779def testClonePIShallow():
780 check_clone_pi(0, "testClonePIShallow")
781
782def testClonePIDeep():
783 check_clone_pi(1, "testClonePIDeep")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000784
Fred Drakea1bde802000-11-21 22:02:43 +0000785def testNormalize():
786 doc = parseString("<doc/>")
787 root = doc.documentElement
788 root.appendChild(doc.createTextNode("first"))
789 root.appendChild(doc.createTextNode("second"))
Fred Drake946f7b12001-09-28 20:31:50 +0000790 confirm(len(root.childNodes) == 2
791 and root.childNodes.length == 2, "testNormalize -- preparation")
Fred Drakea1bde802000-11-21 22:02:43 +0000792 doc.normalize()
793 confirm(len(root.childNodes) == 1
Fred Drake946f7b12001-09-28 20:31:50 +0000794 and root.childNodes.length == 1
Fred Drakea1bde802000-11-21 22:02:43 +0000795 and root.firstChild is root.lastChild
796 and root.firstChild.data == "firstsecond"
797 , "testNormalize -- result")
798 doc.unlink()
799
Fred Drake3277da02000-12-14 18:20:22 +0000800 doc = parseString("<doc/>")
801 root = doc.documentElement
802 root.appendChild(doc.createTextNode(""))
803 doc.normalize()
Fred Drake946f7b12001-09-28 20:31:50 +0000804 confirm(len(root.childNodes) == 0
805 and root.childNodes.length == 0,
Fred Drake3277da02000-12-14 18:20:22 +0000806 "testNormalize -- single empty node removed")
807 doc.unlink()
808
Andrew M. Kuchling05a19a52008-02-23 17:21:44 +0000809def testBug1433694():
810 doc = parseString("<o><i/>t</o>")
811 node = doc.documentElement
812 node.childNodes[1].nodeValue = ""
813 node.normalize()
814 confirm(node.childNodes[-1].nextSibling == None,
815 "Final child's .nextSibling should be None")
816
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000817def testSiblings():
818 doc = parseString("<doc><?pi?>text?<elm/></doc>")
819 root = doc.documentElement
820 (pi, text, elm) = root.childNodes
Paul Prescod7993bcc2000-07-01 14:54:16 +0000821
Fred Drake004d5e62000-10-23 17:22:08 +0000822 confirm(pi.nextSibling is text and
823 pi.previousSibling is None and
824 text.nextSibling is elm and
825 text.previousSibling is pi and
826 elm.nextSibling is None and
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000827 elm.previousSibling is text, "testSiblings")
828
829 doc.unlink()
830
831def testParents():
832 doc = parseString("<doc><elm1><elm2/><elm2><elm3/></elm2></elm1></doc>")
833 root = doc.documentElement
834 elm1 = root.childNodes[0]
835 (elm2a, elm2b) = elm1.childNodes
836 elm3 = elm2b.childNodes[0]
837
838 confirm(root.parentNode is doc and
839 elm1.parentNode is root and
840 elm2a.parentNode is elm1 and
841 elm2b.parentNode is elm1 and
842 elm3.parentNode is elm2b, "testParents")
843
844 doc.unlink()
845
Fred Drake946f7b12001-09-28 20:31:50 +0000846def testNodeListItem():
847 doc = parseString("<doc><e/><e/></doc>")
848 children = doc.childNodes
849 docelem = children[0]
850 confirm(children[0] is children.item(0)
851 and children.item(1) is None
852 and docelem.childNodes.item(0) is docelem.childNodes[0]
853 and docelem.childNodes.item(1) is docelem.childNodes[1]
854 and docelem.childNodes.item(0).childNodes.item(0) is None,
855 "test NodeList.item()")
856 doc.unlink()
857
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000858def testSAX2DOM():
Fred Drakefbdeaad2006-07-29 16:56:15 +0000859 from xml.dom import pulldom
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000860
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000861 sax2dom = pulldom.SAX2DOM()
862 sax2dom.startDocument()
863 sax2dom.startElement("doc", {})
864 sax2dom.characters("text")
865 sax2dom.startElement("subelm", {})
866 sax2dom.characters("text")
867 sax2dom.endElement("subelm")
Fred Drake004d5e62000-10-23 17:22:08 +0000868 sax2dom.characters("text")
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000869 sax2dom.endElement("doc")
870 sax2dom.endDocument()
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000871
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000872 doc = sax2dom.document
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000873 root = doc.documentElement
874 (text1, elm1, text2) = root.childNodes
875 text3 = elm1.childNodes[0]
876
877 confirm(text1.previousSibling is None and
878 text1.nextSibling is elm1 and
879 elm1.previousSibling is text1 and
880 elm1.nextSibling is text2 and
881 text2.previousSibling is elm1 and
882 text2.nextSibling is None and
883 text3.previousSibling is None and
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000884 text3.nextSibling is None, "testSAX2DOM - siblings")
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000885
886 confirm(root.parentNode is doc and
887 text1.parentNode is root and
888 elm1.parentNode is root and
889 text2.parentNode is root and
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000890 text3.parentNode is elm1, "testSAX2DOM - parents")
Fred Drake004d5e62000-10-23 17:22:08 +0000891
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000892 doc.unlink()
893
Martin v. Löwis7d650ca2002-06-30 15:05:00 +0000894def testEncodings():
895 doc = parseString('<foo>&#x20ac;</foo>')
Georg Brandl905a01a2005-08-25 22:14:15 +0000896 confirm(doc.toxml() == u'<?xml version="1.0" ?><foo>\u20ac</foo>'
897 and doc.toxml('utf-8') == '<?xml version="1.0" encoding="utf-8"?><foo>\xe2\x82\xac</foo>'
898 and doc.toxml('iso-8859-15') == '<?xml version="1.0" encoding="iso-8859-15"?><foo>\xa4</foo>',
Martin v. Löwis7d650ca2002-06-30 15:05:00 +0000899 "testEncodings - encoding EURO SIGN")
Neal Norwitz484d9a42005-09-30 04:46:49 +0000900
901 # Verify that character decoding errors throw exceptions instead of crashing
902 try:
903 doc = parseString('<fran\xe7ais>Comment \xe7a va ? Tr\xe8s bien ?</fran\xe7ais>')
904 except UnicodeDecodeError:
905 pass
906 else:
907 print 'parsing with bad encoding should raise a UnicodeDecodeError'
908
Martin v. Löwis7d650ca2002-06-30 15:05:00 +0000909 doc.unlink()
910
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000911class UserDataHandler:
912 called = 0
913 def handle(self, operation, key, data, src, dst):
914 dst.setUserData(key, data + 1, self)
915 src.setUserData(key, None, None)
916 self.called = 1
917
918def testUserData():
919 dom = Document()
920 n = dom.createElement('e')
921 confirm(n.getUserData("foo") is None)
922 n.setUserData("foo", None, None)
923 confirm(n.getUserData("foo") is None)
924 n.setUserData("foo", 12, 12)
925 n.setUserData("bar", 13, 13)
926 confirm(n.getUserData("foo") == 12)
927 confirm(n.getUserData("bar") == 13)
928 n.setUserData("foo", None, None)
929 confirm(n.getUserData("foo") is None)
930 confirm(n.getUserData("bar") == 13)
931
932 handler = UserDataHandler()
933 n.setUserData("bar", 12, handler)
934 c = n.cloneNode(1)
935 confirm(handler.called
936 and n.getUserData("bar") is None
937 and c.getUserData("bar") == 13)
938 n.unlink()
939 c.unlink()
940 dom.unlink()
941
942def testRenameAttribute():
943 doc = parseString("<doc a='v'/>")
944 elem = doc.documentElement
945 attrmap = elem.attributes
946 attr = elem.attributes['a']
947
948 # Simple renaming
Fred Drakefbdeaad2006-07-29 16:56:15 +0000949 attr = doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, "b")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000950 confirm(attr.name == "b"
951 and attr.nodeName == "b"
952 and attr.localName is None
Fred Drakefbdeaad2006-07-29 16:56:15 +0000953 and attr.namespaceURI == xml.dom.EMPTY_NAMESPACE
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000954 and attr.prefix is None
955 and attr.value == "v"
956 and elem.getAttributeNode("a") is None
957 and elem.getAttributeNode("b").isSameNode(attr)
958 and attrmap["b"].isSameNode(attr)
959 and attr.ownerDocument.isSameNode(doc)
960 and attr.ownerElement.isSameNode(elem))
961
962 # Rename to have a namespace, no prefix
963 attr = doc.renameNode(attr, "http://xml.python.org/ns", "c")
964 confirm(attr.name == "c"
965 and attr.nodeName == "c"
966 and attr.localName == "c"
967 and attr.namespaceURI == "http://xml.python.org/ns"
968 and attr.prefix is None
969 and attr.value == "v"
970 and elem.getAttributeNode("a") is None
971 and elem.getAttributeNode("b") is None
972 and elem.getAttributeNode("c").isSameNode(attr)
973 and elem.getAttributeNodeNS(
974 "http://xml.python.org/ns", "c").isSameNode(attr)
975 and attrmap["c"].isSameNode(attr)
976 and attrmap[("http://xml.python.org/ns", "c")].isSameNode(attr))
977
978 # Rename to have a namespace, with prefix
979 attr = doc.renameNode(attr, "http://xml.python.org/ns2", "p:d")
980 confirm(attr.name == "p:d"
981 and attr.nodeName == "p:d"
982 and attr.localName == "d"
983 and attr.namespaceURI == "http://xml.python.org/ns2"
984 and attr.prefix == "p"
985 and attr.value == "v"
986 and elem.getAttributeNode("a") is None
987 and elem.getAttributeNode("b") is None
988 and elem.getAttributeNode("c") is None
989 and elem.getAttributeNodeNS(
990 "http://xml.python.org/ns", "c") is None
991 and elem.getAttributeNode("p:d").isSameNode(attr)
992 and elem.getAttributeNodeNS(
993 "http://xml.python.org/ns2", "d").isSameNode(attr)
994 and attrmap["p:d"].isSameNode(attr)
995 and attrmap[("http://xml.python.org/ns2", "d")].isSameNode(attr))
996
997 # Rename back to a simple non-NS node
Fred Drakefbdeaad2006-07-29 16:56:15 +0000998 attr = doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, "e")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +0000999 confirm(attr.name == "e"
1000 and attr.nodeName == "e"
1001 and attr.localName is None
Fred Drakefbdeaad2006-07-29 16:56:15 +00001002 and attr.namespaceURI == xml.dom.EMPTY_NAMESPACE
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001003 and attr.prefix is None
1004 and attr.value == "v"
1005 and elem.getAttributeNode("a") is None
1006 and elem.getAttributeNode("b") is None
1007 and elem.getAttributeNode("c") is None
1008 and elem.getAttributeNode("p:d") is None
1009 and elem.getAttributeNodeNS(
1010 "http://xml.python.org/ns", "c") is None
1011 and elem.getAttributeNode("e").isSameNode(attr)
1012 and attrmap["e"].isSameNode(attr))
1013
1014 try:
1015 doc.renameNode(attr, "http://xml.python.org/ns", "xmlns")
Fred Drakefbdeaad2006-07-29 16:56:15 +00001016 except xml.dom.NamespaceErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001017 pass
1018 else:
1019 print "expected NamespaceErr"
1020
1021 checkRenameNodeSharedConstraints(doc, attr)
1022 doc.unlink()
1023
1024def testRenameElement():
1025 doc = parseString("<doc/>")
1026 elem = doc.documentElement
1027
1028 # Simple renaming
Fred Drakefbdeaad2006-07-29 16:56:15 +00001029 elem = doc.renameNode(elem, xml.dom.EMPTY_NAMESPACE, "a")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001030 confirm(elem.tagName == "a"
1031 and elem.nodeName == "a"
1032 and elem.localName is None
Fred Drakefbdeaad2006-07-29 16:56:15 +00001033 and elem.namespaceURI == xml.dom.EMPTY_NAMESPACE
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001034 and elem.prefix is None
1035 and elem.ownerDocument.isSameNode(doc))
1036
1037 # Rename to have a namespace, no prefix
1038 elem = doc.renameNode(elem, "http://xml.python.org/ns", "b")
1039 confirm(elem.tagName == "b"
1040 and elem.nodeName == "b"
1041 and elem.localName == "b"
1042 and elem.namespaceURI == "http://xml.python.org/ns"
1043 and elem.prefix is None
1044 and elem.ownerDocument.isSameNode(doc))
1045
1046 # Rename to have a namespace, with prefix
1047 elem = doc.renameNode(elem, "http://xml.python.org/ns2", "p:c")
1048 confirm(elem.tagName == "p:c"
1049 and elem.nodeName == "p:c"
1050 and elem.localName == "c"
1051 and elem.namespaceURI == "http://xml.python.org/ns2"
1052 and elem.prefix == "p"
1053 and elem.ownerDocument.isSameNode(doc))
1054
1055 # Rename back to a simple non-NS node
Fred Drakefbdeaad2006-07-29 16:56:15 +00001056 elem = doc.renameNode(elem, xml.dom.EMPTY_NAMESPACE, "d")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001057 confirm(elem.tagName == "d"
1058 and elem.nodeName == "d"
1059 and elem.localName is None
Fred Drakefbdeaad2006-07-29 16:56:15 +00001060 and elem.namespaceURI == xml.dom.EMPTY_NAMESPACE
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001061 and elem.prefix is None
1062 and elem.ownerDocument.isSameNode(doc))
1063
1064 checkRenameNodeSharedConstraints(doc, elem)
1065 doc.unlink()
1066
1067def checkRenameNodeSharedConstraints(doc, node):
1068 # Make sure illegal NS usage is detected:
1069 try:
1070 doc.renameNode(node, "http://xml.python.org/ns", "xmlns:foo")
Fred Drakefbdeaad2006-07-29 16:56:15 +00001071 except xml.dom.NamespaceErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001072 pass
1073 else:
1074 print "expected NamespaceErr"
1075
1076 doc2 = parseString("<doc/>")
1077 try:
Fred Drakefbdeaad2006-07-29 16:56:15 +00001078 doc2.renameNode(node, xml.dom.EMPTY_NAMESPACE, "foo")
1079 except xml.dom.WrongDocumentErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001080 pass
1081 else:
1082 print "expected WrongDocumentErr"
1083
1084def testRenameOther():
1085 # We have to create a comment node explicitly since not all DOM
1086 # builders used with minidom add comments to the DOM.
Fred Drakefbdeaad2006-07-29 16:56:15 +00001087 doc = xml.dom.minidom.getDOMImplementation().createDocument(
1088 xml.dom.EMPTY_NAMESPACE, "e", None)
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001089 node = doc.createComment("comment")
1090 try:
Fred Drakefbdeaad2006-07-29 16:56:15 +00001091 doc.renameNode(node, xml.dom.EMPTY_NAMESPACE, "foo")
1092 except xml.dom.NotSupportedErr:
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001093 pass
1094 else:
1095 print "expected NotSupportedErr when renaming comment node"
1096 doc.unlink()
1097
1098def checkWholeText(node, s):
1099 t = node.wholeText
1100 confirm(t == s, "looking for %s, found %s" % (repr(s), repr(t)))
1101
1102def testWholeText():
1103 doc = parseString("<doc>a</doc>")
1104 elem = doc.documentElement
1105 text = elem.childNodes[0]
1106 assert text.nodeType == Node.TEXT_NODE
1107
1108 checkWholeText(text, "a")
1109 elem.appendChild(doc.createTextNode("b"))
1110 checkWholeText(text, "ab")
1111 elem.insertBefore(doc.createCDATASection("c"), text)
1112 checkWholeText(text, "cab")
1113
1114 # make sure we don't cross other nodes
1115 splitter = doc.createComment("comment")
1116 elem.appendChild(splitter)
1117 text2 = doc.createTextNode("d")
1118 elem.appendChild(text2)
1119 checkWholeText(text, "cab")
1120 checkWholeText(text2, "d")
1121
1122 x = doc.createElement("x")
1123 elem.replaceChild(x, splitter)
1124 splitter = x
1125 checkWholeText(text, "cab")
1126 checkWholeText(text2, "d")
1127
1128 x = doc.createProcessingInstruction("y", "z")
1129 elem.replaceChild(x, splitter)
1130 splitter = x
1131 checkWholeText(text, "cab")
1132 checkWholeText(text2, "d")
1133
1134 elem.removeChild(splitter)
1135 checkWholeText(text, "cabd")
1136 checkWholeText(text2, "cabd")
1137
Andrew M. Kuchling841d25e2005-11-22 19:03:16 +00001138def testPatch1094164 ():
1139 doc = parseString("<doc><e/></doc>")
1140 elem = doc.documentElement
1141 e = elem.firstChild
1142 confirm(e.parentNode is elem, "Before replaceChild()")
1143 # Check that replacing a child with itself leaves the tree unchanged
1144 elem.replaceChild(e, e)
1145 confirm(e.parentNode is elem, "After replaceChild()")
Tim Peters536cf992005-12-25 23:18:31 +00001146
1147
1148
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001149def testReplaceWholeText():
1150 def setup():
1151 doc = parseString("<doc>a<e/>d</doc>")
1152 elem = doc.documentElement
1153 text1 = elem.firstChild
1154 text2 = elem.lastChild
1155 splitter = text1.nextSibling
1156 elem.insertBefore(doc.createTextNode("b"), splitter)
1157 elem.insertBefore(doc.createCDATASection("c"), text1)
1158 return doc, elem, text1, splitter, text2
1159
1160 doc, elem, text1, splitter, text2 = setup()
1161 text = text1.replaceWholeText("new content")
1162 checkWholeText(text, "new content")
1163 checkWholeText(text2, "d")
1164 confirm(len(elem.childNodes) == 3)
1165
1166 doc, elem, text1, splitter, text2 = setup()
1167 text = text2.replaceWholeText("new content")
1168 checkWholeText(text, "new content")
1169 checkWholeText(text1, "cab")
1170 confirm(len(elem.childNodes) == 5)
1171
1172 doc, elem, text1, splitter, text2 = setup()
1173 text = text1.replaceWholeText("")
1174 checkWholeText(text2, "d")
1175 confirm(text is None
1176 and len(elem.childNodes) == 2)
1177
1178def testSchemaType():
1179 doc = parseString(
1180 "<!DOCTYPE doc [\n"
1181 " <!ENTITY e1 SYSTEM 'http://xml.python.org/e1'>\n"
1182 " <!ENTITY e2 SYSTEM 'http://xml.python.org/e2'>\n"
1183 " <!ATTLIST doc id ID #IMPLIED \n"
1184 " ref IDREF #IMPLIED \n"
1185 " refs IDREFS #IMPLIED \n"
1186 " enum (a|b) #IMPLIED \n"
1187 " ent ENTITY #IMPLIED \n"
1188 " ents ENTITIES #IMPLIED \n"
1189 " nm NMTOKEN #IMPLIED \n"
1190 " nms NMTOKENS #IMPLIED \n"
1191 " text CDATA #IMPLIED \n"
1192 " >\n"
1193 "]><doc id='name' notid='name' text='splat!' enum='b'"
1194 " ref='name' refs='name name' ent='e1' ents='e1 e2'"
1195 " nm='123' nms='123 abc' />")
1196 elem = doc.documentElement
1197 # We don't want to rely on any specific loader at this point, so
1198 # just make sure we can get to all the names, and that the
1199 # DTD-based namespace is right. The names can vary by loader
1200 # since each supports a different level of DTD information.
1201 t = elem.schemaType
1202 confirm(t.name is None
Fred Drakefbdeaad2006-07-29 16:56:15 +00001203 and t.namespace == xml.dom.EMPTY_NAMESPACE)
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001204 names = "id notid text enum ref refs ent ents nm nms".split()
1205 for name in names:
1206 a = elem.getAttributeNode(name)
1207 t = a.schemaType
1208 confirm(hasattr(t, "name")
Fred Drakefbdeaad2006-07-29 16:56:15 +00001209 and t.namespace == xml.dom.EMPTY_NAMESPACE)
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001210
1211def testSetIdAttribute():
1212 doc = parseString("<doc a1='v' a2='w'/>")
1213 e = doc.documentElement
1214 a1 = e.getAttributeNode("a1")
1215 a2 = e.getAttributeNode("a2")
1216 confirm(doc.getElementById("v") is None
1217 and not a1.isId
1218 and not a2.isId)
1219 e.setIdAttribute("a1")
1220 confirm(e.isSameNode(doc.getElementById("v"))
1221 and a1.isId
1222 and not a2.isId)
1223 e.setIdAttribute("a2")
1224 confirm(e.isSameNode(doc.getElementById("v"))
1225 and e.isSameNode(doc.getElementById("w"))
1226 and a1.isId
1227 and a2.isId)
1228 # replace the a1 node; the new node should *not* be an ID
1229 a3 = doc.createAttribute("a1")
1230 a3.value = "v"
1231 e.setAttributeNode(a3)
1232 confirm(doc.getElementById("v") is None
1233 and e.isSameNode(doc.getElementById("w"))
1234 and not a1.isId
1235 and a2.isId
1236 and not a3.isId)
Georg Brandl7eb4b7d2005-07-22 21:49:32 +00001237 # renaming an attribute should not affect its ID-ness:
Fred Drakefbdeaad2006-07-29 16:56:15 +00001238 doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001239 confirm(e.isSameNode(doc.getElementById("w"))
1240 and a2.isId)
1241
1242def testSetIdAttributeNS():
1243 NS1 = "http://xml.python.org/ns1"
1244 NS2 = "http://xml.python.org/ns2"
1245 doc = parseString("<doc"
1246 " xmlns:ns1='" + NS1 + "'"
1247 " xmlns:ns2='" + NS2 + "'"
1248 " ns1:a1='v' ns2:a2='w'/>")
1249 e = doc.documentElement
1250 a1 = e.getAttributeNodeNS(NS1, "a1")
1251 a2 = e.getAttributeNodeNS(NS2, "a2")
1252 confirm(doc.getElementById("v") is None
1253 and not a1.isId
1254 and not a2.isId)
1255 e.setIdAttributeNS(NS1, "a1")
1256 confirm(e.isSameNode(doc.getElementById("v"))
1257 and a1.isId
1258 and not a2.isId)
1259 e.setIdAttributeNS(NS2, "a2")
1260 confirm(e.isSameNode(doc.getElementById("v"))
1261 and e.isSameNode(doc.getElementById("w"))
1262 and a1.isId
1263 and a2.isId)
1264 # replace the a1 node; the new node should *not* be an ID
1265 a3 = doc.createAttributeNS(NS1, "a1")
1266 a3.value = "v"
1267 e.setAttributeNode(a3)
1268 confirm(e.isSameNode(doc.getElementById("w")))
1269 confirm(not a1.isId)
1270 confirm(a2.isId)
1271 confirm(not a3.isId)
1272 confirm(doc.getElementById("v") is None)
Georg Brandl7eb4b7d2005-07-22 21:49:32 +00001273 # renaming an attribute should not affect its ID-ness:
Fred Drakefbdeaad2006-07-29 16:56:15 +00001274 doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001275 confirm(e.isSameNode(doc.getElementById("w"))
1276 and a2.isId)
1277
1278def testSetIdAttributeNode():
1279 NS1 = "http://xml.python.org/ns1"
1280 NS2 = "http://xml.python.org/ns2"
1281 doc = parseString("<doc"
1282 " xmlns:ns1='" + NS1 + "'"
1283 " xmlns:ns2='" + NS2 + "'"
1284 " ns1:a1='v' ns2:a2='w'/>")
1285 e = doc.documentElement
1286 a1 = e.getAttributeNodeNS(NS1, "a1")
1287 a2 = e.getAttributeNodeNS(NS2, "a2")
1288 confirm(doc.getElementById("v") is None
1289 and not a1.isId
1290 and not a2.isId)
1291 e.setIdAttributeNode(a1)
1292 confirm(e.isSameNode(doc.getElementById("v"))
1293 and a1.isId
1294 and not a2.isId)
1295 e.setIdAttributeNode(a2)
1296 confirm(e.isSameNode(doc.getElementById("v"))
1297 and e.isSameNode(doc.getElementById("w"))
1298 and a1.isId
1299 and a2.isId)
1300 # replace the a1 node; the new node should *not* be an ID
1301 a3 = doc.createAttributeNS(NS1, "a1")
1302 a3.value = "v"
1303 e.setAttributeNode(a3)
1304 confirm(e.isSameNode(doc.getElementById("w")))
1305 confirm(not a1.isId)
1306 confirm(a2.isId)
1307 confirm(not a3.isId)
1308 confirm(doc.getElementById("v") is None)
Georg Brandl7eb4b7d2005-07-22 21:49:32 +00001309 # renaming an attribute should not affect its ID-ness:
Fred Drakefbdeaad2006-07-29 16:56:15 +00001310 doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an")
Martin v. Löwisaa5af8d2003-01-25 21:39:09 +00001311 confirm(e.isSameNode(doc.getElementById("w"))
1312 and a2.isId)
1313
1314def testPickledDocument():
1315 doc = parseString("<?xml version='1.0' encoding='us-ascii'?>\n"
1316 "<!DOCTYPE doc PUBLIC 'http://xml.python.org/public'"
1317 " 'http://xml.python.org/system' [\n"
1318 " <!ELEMENT e EMPTY>\n"
1319 " <!ENTITY ent SYSTEM 'http://xml.python.org/entity'>\n"
1320 "]><doc attr='value'> text\n"
1321 "<?pi sample?> <!-- comment --> <e/> </doc>")
1322 s = pickle.dumps(doc)
1323 doc2 = pickle.loads(s)
1324 stack = [(doc, doc2)]
1325 while stack:
1326 n1, n2 = stack.pop()
1327 confirm(n1.nodeType == n2.nodeType
1328 and len(n1.childNodes) == len(n2.childNodes)
1329 and n1.nodeName == n2.nodeName
1330 and not n1.isSameNode(n2)
1331 and not n2.isSameNode(n1))
1332 if n1.nodeType == Node.DOCUMENT_TYPE_NODE:
1333 len(n1.entities)
1334 len(n2.entities)
1335 len(n1.notations)
1336 len(n2.notations)
1337 confirm(len(n1.entities) == len(n2.entities)
1338 and len(n1.notations) == len(n2.notations))
1339 for i in range(len(n1.notations)):
1340 no1 = n1.notations.item(i)
1341 no2 = n1.notations.item(i)
1342 confirm(no1.name == no2.name
1343 and no1.publicId == no2.publicId
1344 and no1.systemId == no2.systemId)
1345 statck.append((no1, no2))
1346 for i in range(len(n1.entities)):
1347 e1 = n1.entities.item(i)
1348 e2 = n2.entities.item(i)
1349 confirm(e1.notationName == e2.notationName
1350 and e1.publicId == e2.publicId
1351 and e1.systemId == e2.systemId)
1352 stack.append((e1, e2))
1353 if n1.nodeType != Node.DOCUMENT_NODE:
1354 confirm(n1.ownerDocument.isSameNode(doc)
1355 and n2.ownerDocument.isSameNode(doc2))
1356 for i in range(len(n1.childNodes)):
1357 stack.append((n1.childNodes[i], n2.childNodes[i]))
1358
1359
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +00001360# --- MAIN PROGRAM
Fred Drake004d5e62000-10-23 17:22:08 +00001361
Jeremy Hylton3b0c6002000-10-12 17:31:36 +00001362names = globals().keys()
Paul Prescod7993bcc2000-07-01 14:54:16 +00001363names.sort()
Paul Prescod10d27662000-09-18 19:07:26 +00001364
Fred Drakeacfb3f62001-02-01 18:11:29 +00001365failed = []
Paul Prescod10d27662000-09-18 19:07:26 +00001366
Fred Drake6dd7d072002-09-12 17:03:02 +00001367try:
1368 Node.allnodes
1369except AttributeError:
Martin v. Löwisfd6aaa12003-01-25 22:02:52 +00001370 # We don't actually have the minidom from the standard library,
Fred Drake6dd7d072002-09-12 17:03:02 +00001371 # but are picking up the PyXML version from site-packages.
1372 def check_allnodes():
1373 pass
1374else:
1375 def check_allnodes():
1376 confirm(len(Node.allnodes) == 0,
1377 "assertion: len(Node.allnodes) == 0")
1378 if len(Node.allnodes):
1379 print "Garbage left over:"
1380 if verbose:
1381 print Node.allnodes.items()[0:10]
1382 else:
1383 # Don't print specific nodes if repeatable results
1384 # are needed
1385 print len(Node.allnodes)
1386 Node.allnodes = {}
1387
Paul Prescod7993bcc2000-07-01 14:54:16 +00001388for name in names:
Jeremy Hylton3b0c6002000-10-12 17:31:36 +00001389 if name.startswith("test"):
1390 func = globals()[name]
Paul Prescod7993bcc2000-07-01 14:54:16 +00001391 try:
1392 func()
Fred Drake6dd7d072002-09-12 17:03:02 +00001393 check_allnodes()
Fred Drakeacfb3f62001-02-01 18:11:29 +00001394 except:
1395 failed.append(name)
Paul Prescod7993bcc2000-07-01 14:54:16 +00001396 print "Test Failed: ", name
Fred Drake1703cf62000-12-15 21:31:59 +00001397 sys.stdout.flush()
Jeremy Hylton3b0c6002000-10-12 17:31:36 +00001398 traceback.print_exception(*sys.exc_info())
Walter Dörwald70a6b492004-02-12 17:35:32 +00001399 print repr(sys.exc_info()[1])
Jeremy Hylton3b0c6002000-10-12 17:31:36 +00001400 Node.allnodes = {}
Paul Prescod10d27662000-09-18 19:07:26 +00001401
Fred Drakeacfb3f62001-02-01 18:11:29 +00001402if failed:
1403 print "\n\n\n**** Check for failures in these tests:"
1404 for name in failed:
1405 print " " + name