blob: d398d7377a5bea3471d181e9008432eddd5bec89 [file] [log] [blame]
Fred Drake17647f52000-07-03 16:37:42 +00001# test for xml.dom.minidom
Paul Prescod7993bcc2000-07-01 14:54:16 +00002
Fred Drake17647f52000-07-03 16:37:42 +00003from xml.dom.minidom import parse, Node, Document, parseString
Andrew M. Kuchling6d0cee12001-01-02 20:56:42 +00004from xml.dom import HierarchyRequestErr
Barry Warsawc79dff62000-09-26 18:00:20 +00005import xml.parsers.expat
Fred Drake17647f52000-07-03 16:37:42 +00006
Guido van Rossume2ae77b2001-10-24 20:42:55 +00007import os
Fred Drake17647f52000-07-03 16:37:42 +00008import sys
9import traceback
Fredrik Lundhf7850422001-01-17 21:51:36 +000010from test_support import verbose
Fred Drake17647f52000-07-03 16:37:42 +000011
12if __name__ == "__main__":
13 base = sys.argv[0]
14else:
15 base = __file__
Guido van Rossume2ae77b2001-10-24 20:42:55 +000016tstfile = os.path.join(os.path.dirname(base), "test"+os.extsep+"xml")
Fred Drake17647f52000-07-03 16:37:42 +000017del base
Paul Prescod7993bcc2000-07-01 14:54:16 +000018
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000019def confirm(test, testname = "Test"):
Fred Drake004d5e62000-10-23 17:22:08 +000020 if test:
Paul Prescod10d27662000-09-18 19:07:26 +000021 print "Passed " + testname
Fred Drake004d5e62000-10-23 17:22:08 +000022 else:
Paul Prescod10d27662000-09-18 19:07:26 +000023 print "Failed " + testname
24 raise Exception
25
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000026Node._debug = 1
Paul Prescod7993bcc2000-07-01 14:54:16 +000027
Paul Prescod10d27662000-09-18 19:07:26 +000028def testParseFromFile():
29 from StringIO import StringIO
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000030 dom = parse(StringIO(open(tstfile).read()))
Paul Prescod4c799192000-09-19 19:33:02 +000031 dom.unlink()
Martin v. Löwis89c528b2000-09-19 16:22:10 +000032 confirm(isinstance(dom,Document))
Paul Prescod10d27662000-09-18 19:07:26 +000033
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000034def testGetElementsByTagName():
35 dom = parse(tstfile)
36 confirm(dom.getElementsByTagName("LI") == \
37 dom.documentElement.getElementsByTagName("LI"))
Paul Prescod7993bcc2000-07-01 14:54:16 +000038 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +000039
Jeremy Hylton3b0c6002000-10-12 17:31:36 +000040def testInsertBefore():
Fred Drakea1bde802000-11-21 22:02:43 +000041 dom = parseString("<doc><foo/></doc>")
42 root = dom.documentElement
43 elem = root.childNodes[0]
44 nelem = dom.createElement("element")
45 root.insertBefore(nelem, elem)
46 confirm(len(root.childNodes) == 2
Fred Drake946f7b12001-09-28 20:31:50 +000047 and root.childNodes.length == 2
Fred Drakea1bde802000-11-21 22:02:43 +000048 and root.childNodes[0] is nelem
Fred Drake946f7b12001-09-28 20:31:50 +000049 and root.childNodes.item(0) is nelem
Fred Drakea1bde802000-11-21 22:02:43 +000050 and root.childNodes[1] is elem
Fred Drake946f7b12001-09-28 20:31:50 +000051 and root.childNodes.item(1) is elem
Fred Drakea1bde802000-11-21 22:02:43 +000052 and root.firstChild is nelem
53 and root.lastChild is elem
54 and root.toxml() == "<doc><element/><foo/></doc>"
55 , "testInsertBefore -- node properly placed in tree")
56 nelem = dom.createElement("element")
57 root.insertBefore(nelem, None)
58 confirm(len(root.childNodes) == 3
Fred Drake946f7b12001-09-28 20:31:50 +000059 and root.childNodes.length == 3
Fred Drakea1bde802000-11-21 22:02:43 +000060 and root.childNodes[1] is elem
Fred Drake946f7b12001-09-28 20:31:50 +000061 and root.childNodes.item(1) is elem
Fred Drakea1bde802000-11-21 22:02:43 +000062 and root.childNodes[2] is nelem
Fred Drake946f7b12001-09-28 20:31:50 +000063 and root.childNodes.item(2) is nelem
Fred Drakea1bde802000-11-21 22:02:43 +000064 and root.lastChild is nelem
65 and nelem.previousSibling is elem
66 and root.toxml() == "<doc><element/><foo/><element/></doc>"
67 , "testInsertBefore -- node properly placed in tree")
68 nelem2 = dom.createElement("bar")
69 root.insertBefore(nelem2, nelem)
70 confirm(len(root.childNodes) == 4
Fred Drake946f7b12001-09-28 20:31:50 +000071 and root.childNodes.length == 4
Fred Drakea1bde802000-11-21 22:02:43 +000072 and root.childNodes[2] is nelem2
Fred Drake946f7b12001-09-28 20:31:50 +000073 and root.childNodes.item(2) is nelem2
Fred Drakea1bde802000-11-21 22:02:43 +000074 and root.childNodes[3] is nelem
Fred Drake946f7b12001-09-28 20:31:50 +000075 and root.childNodes.item(3) is nelem
Fred Drakea1bde802000-11-21 22:02:43 +000076 and nelem2.nextSibling is nelem
77 and nelem.previousSibling is nelem2
78 and root.toxml() == "<doc><element/><foo/><bar/><element/></doc>"
79 , "testInsertBefore -- node properly placed in tree")
Paul Prescod7993bcc2000-07-01 14:54:16 +000080 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +000081
Fred Drakee50959a2001-12-06 04:32:18 +000082def _create_fragment_test_nodes():
83 dom = parseString("<doc/>")
84 orig = dom.createTextNode("original")
85 c1 = dom.createTextNode("foo")
86 c2 = dom.createTextNode("bar")
87 c3 = dom.createTextNode("bat")
88 dom.documentElement.appendChild(orig)
89 frag = dom.createDocumentFragment()
90 frag.appendChild(c1)
91 frag.appendChild(c2)
92 frag.appendChild(c3)
93 return dom, orig, c1, c2, c3, frag
94
95def testInsertBeforeFragment():
96 dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
97 dom.documentElement.insertBefore(frag, None)
98 confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3),
99 "insertBefore(<fragment>, None)")
100 frag.unlink()
101 dom.unlink()
102 #
103 dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
104 dom.documentElement.insertBefore(frag, orig)
105 confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3, orig),
106 "insertBefore(<fragment>, orig)")
107 frag.unlink()
108 dom.unlink()
109
Paul Prescod7993bcc2000-07-01 14:54:16 +0000110def testAppendChild():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000111 dom = parse(tstfile)
112 dom.documentElement.appendChild(dom.createComment(u"Hello"))
113 confirm(dom.documentElement.childNodes[-1].nodeName == "#comment")
114 confirm(dom.documentElement.childNodes[-1].data == "Hello")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000115 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000116
Fred Drakee50959a2001-12-06 04:32:18 +0000117def testAppendChildFragment():
118 dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
119 dom.documentElement.appendChild(frag)
120 confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3),
121 "appendChild(<fragment>)")
122 frag.unlink()
123 dom.unlink()
124
125def testReplaceChildFragment():
126 dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
127 dom.documentElement.replaceChild(frag, orig)
128 orig.unlink()
129 confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3),
130 "replaceChild(<fragment>)")
131 frag.unlink()
132 dom.unlink()
133
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000134def testLegalChildren():
135 dom = Document()
136 elem = dom.createElement('element')
137 text = dom.createTextNode('text')
Fredrik Lundhf7850422001-01-17 21:51:36 +0000138
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000139 try: dom.appendChild(text)
140 except HierarchyRequestErr: pass
141 else:
142 print "dom.appendChild didn't raise HierarchyRequestErr"
143
144 dom.appendChild(elem)
145 try: dom.insertBefore(text, elem)
146 except HierarchyRequestErr: pass
147 else:
148 print "dom.appendChild didn't raise HierarchyRequestErr"
149
150 try: dom.replaceChild(text, elem)
151 except HierarchyRequestErr: pass
152 else:
153 print "dom.appendChild didn't raise HierarchyRequestErr"
154
Tim Peters0009c4e2001-02-21 07:29:48 +0000155 nodemap = elem.attributes
Andrew M. Kuchlingbc8f72c2001-02-21 01:30:26 +0000156 try: nodemap.setNamedItem(text)
157 except HierarchyRequestErr: pass
158 else:
159 print "NamedNodeMap.setNamedItem didn't raise HierarchyRequestErr"
160
161 try: nodemap.setNamedItemNS(text)
162 except HierarchyRequestErr: pass
163 else:
164 print "NamedNodeMap.setNamedItemNS didn't raise HierarchyRequestErr"
165
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000166 elem.appendChild(text)
Fredrik Lundhf7850422001-01-17 21:51:36 +0000167 dom.unlink()
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000168
Fred Drake2998a552001-12-06 18:27:48 +0000169def testNamedNodeMapSetItem():
170 dom = Document()
171 elem = dom.createElement('element')
172 attrs = elem.attributes
173 attrs["foo"] = "bar"
174 a = attrs.item(0)
175 confirm(a.ownerDocument is dom,
176 "NamedNodeMap.__setitem__() sets ownerDocument")
177 confirm(a.ownerElement is elem,
178 "NamedNodeMap.__setitem__() sets ownerElement")
179 confirm(a.value == "bar",
180 "NamedNodeMap.__setitem__() sets value")
181 confirm(a.nodeValue == "bar",
182 "NamedNodeMap.__setitem__() sets nodeValue")
183 elem.unlink()
184 dom.unlink()
185
Paul Prescod7993bcc2000-07-01 14:54:16 +0000186def testNonZero():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000187 dom = parse(tstfile)
188 confirm(dom)# should not be zero
189 dom.appendChild(dom.createComment("foo"))
190 confirm(not dom.childNodes[-1].childNodes)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000191 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000192
193def testUnlink():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000194 dom = parse(tstfile)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000195 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000196
197def testElement():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000198 dom = Document()
199 dom.appendChild(dom.createElement("abc"))
200 confirm(dom.documentElement)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000201 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000202
203def testAAA():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000204 dom = parseString("<abc/>")
205 el = dom.documentElement
206 el.setAttribute("spam", "jam2")
Fred Drakea1bde802000-11-21 22:02:43 +0000207 confirm(el.toxml() == '<abc spam="jam2"/>', "testAAA")
Fred Drake2998a552001-12-06 18:27:48 +0000208 a = el.getAttributeNode("spam")
209 confirm(a.ownerDocument is dom,
210 "setAttribute() sets ownerDocument")
211 confirm(a.ownerElement is dom.documentElement,
212 "setAttribute() sets ownerElement")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000213 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000214
215def testAAB():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000216 dom = parseString("<abc/>")
217 el = dom.documentElement
218 el.setAttribute("spam", "jam")
219 el.setAttribute("spam", "jam2")
Fred Drakea1bde802000-11-21 22:02:43 +0000220 confirm(el.toxml() == '<abc spam="jam2"/>', "testAAB")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000221 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000222
223def testAddAttr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000224 dom = Document()
225 child = dom.appendChild(dom.createElement("abc"))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000226
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000227 child.setAttribute("def", "ghi")
228 confirm(child.getAttribute("def") == "ghi")
229 confirm(child.attributes["def"].value == "ghi")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000230
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000231 child.setAttribute("jkl", "mno")
232 confirm(child.getAttribute("jkl") == "mno")
233 confirm(child.attributes["jkl"].value == "mno")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000234
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000235 confirm(len(child.attributes) == 2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000236
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000237 child.setAttribute("def", "newval")
238 confirm(child.getAttribute("def") == "newval")
239 confirm(child.attributes["def"].value == "newval")
Paul Prescod7993bcc2000-07-01 14:54:16 +0000240
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000241 confirm(len(child.attributes) == 2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000242 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000243
244def testDeleteAttr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000245 dom = Document()
246 child = dom.appendChild(dom.createElement("abc"))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000247
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000248 confirm(len(child.attributes) == 0)
249 child.setAttribute("def", "ghi")
250 confirm(len(child.attributes) == 1)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000251 del child.attributes["def"]
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000252 confirm(len(child.attributes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000253 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000254
255def testRemoveAttr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000256 dom = Document()
257 child = dom.appendChild(dom.createElement("abc"))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000258
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000259 child.setAttribute("def", "ghi")
260 confirm(len(child.attributes) == 1)
261 child.removeAttribute("def")
262 confirm(len(child.attributes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000263
264 dom.unlink()
265
266def testRemoveAttrNS():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000267 dom = Document()
268 child = dom.appendChild(
269 dom.createElementNS("http://www.python.org", "python:abc"))
Fred Drake004d5e62000-10-23 17:22:08 +0000270 child.setAttributeNS("http://www.w3.org", "xmlns:python",
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000271 "http://www.python.org")
272 child.setAttributeNS("http://www.python.org", "python:abcattr", "foo")
273 confirm(len(child.attributes) == 2)
274 child.removeAttributeNS("http://www.python.org", "abcattr")
275 confirm(len(child.attributes) == 1)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000276
277 dom.unlink()
Fred Drake004d5e62000-10-23 17:22:08 +0000278
Paul Prescod7993bcc2000-07-01 14:54:16 +0000279def testRemoveAttributeNode():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000280 dom = Document()
281 child = dom.appendChild(dom.createElement("foo"))
282 child.setAttribute("spam", "jam")
283 confirm(len(child.attributes) == 1)
284 node = child.getAttributeNode("spam")
285 child.removeAttributeNode(node)
286 confirm(len(child.attributes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000287
288 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000289
290def testChangeAttr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000291 dom = parseString("<abc/>")
292 el = dom.documentElement
293 el.setAttribute("spam", "jam")
294 confirm(len(el.attributes) == 1)
295 el.setAttribute("spam", "bam")
296 confirm(len(el.attributes) == 1)
297 el.attributes["spam"] = "ham"
298 confirm(len(el.attributes) == 1)
299 el.setAttribute("spam2", "bam")
300 confirm(len(el.attributes) == 2)
301 el.attributes[ "spam2"] = "bam2"
302 confirm(len(el.attributes) == 2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000303 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000304
305def testGetAttrList():
306 pass
307
308def testGetAttrValues(): pass
309
310def testGetAttrLength(): pass
311
312def testGetAttribute(): pass
313
314def testGetAttributeNS(): pass
315
316def testGetAttributeNode(): pass
317
Martin v. Löwis351c3d02001-06-03 14:27:02 +0000318def testGetElementsByTagNameNS():
319 d="""<foo xmlns:minidom="http://pyxml.sf.net/minidom">
320 <minidom:myelem/>
321 </foo>"""
322 dom = parseString(d)
323 elem = dom.getElementsByTagNameNS("http://pyxml.sf.net/minidom","myelem")
324 confirm(len(elem) == 1)
325 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000326
327def testGetEmptyNodeListFromElementsByTagNameNS(): pass
328
329def testElementReprAndStr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000330 dom = Document()
331 el = dom.appendChild(dom.createElement("abc"))
332 string1 = repr(el)
333 string2 = str(el)
334 confirm(string1 == string2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000335 dom.unlink()
336
337# commented out until Fredrick's fix is checked in
338def _testElementReprAndStrUnicode():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000339 dom = Document()
340 el = dom.appendChild(dom.createElement(u"abc"))
341 string1 = repr(el)
342 string2 = str(el)
343 confirm(string1 == string2)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000344 dom.unlink()
345
346# commented out until Fredrick's fix is checked in
347def _testElementReprAndStrUnicodeNS():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000348 dom = Document()
349 el = dom.appendChild(
350 dom.createElementNS(u"http://www.slashdot.org", u"slash:abc"))
351 string1 = repr(el)
352 string2 = str(el)
353 confirm(string1 == string2)
354 confirm(string1.find("slash:abc") != -1)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000355 dom.unlink()
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000356 confirm(len(Node.allnodes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000357
358def testAttributeRepr():
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000359 dom = Document()
360 el = dom.appendChild(dom.createElement(u"abc"))
361 node = el.setAttribute("abc", "def")
362 confirm(str(node) == repr(node))
Paul Prescod7993bcc2000-07-01 14:54:16 +0000363 dom.unlink()
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000364 confirm(len(Node.allnodes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000365
366def testTextNodeRepr(): pass
367
Martin v. Löwis0a84a332000-10-06 22:42:55 +0000368def testWriteXML():
Martin v. Löwisfe28ca02001-02-06 01:16:48 +0000369 str = '<?xml version="1.0" ?>\n<a b="c"/>'
Martin v. Löwis0a84a332000-10-06 22:42:55 +0000370 dom = parseString(str)
371 domstr = dom.toxml()
372 dom.unlink()
373 confirm(str == domstr)
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000374 confirm(len(Node.allnodes) == 0)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000375
376def testProcessingInstruction(): pass
377
378def testProcessingInstructionRepr(): pass
379
380def testTextRepr(): pass
381
382def testWriteText(): pass
383
384def testDocumentElement(): pass
385
Fred Drakea1bde802000-11-21 22:02:43 +0000386def testTooManyDocumentElements():
387 doc = parseString("<doc/>")
388 elem = doc.createElement("extra")
389 try:
390 doc.appendChild(elem)
Martin v. Löwis2bcb3232001-01-27 09:17:55 +0000391 except HierarchyRequestErr:
Fred Drakea1bde802000-11-21 22:02:43 +0000392 print "Caught expected exception when adding extra document element."
393 else:
394 print "Failed to catch expected exception when" \
395 " adding extra document element."
396 elem.unlink()
397 doc.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000398
399def testCreateElementNS(): pass
400
Andrew M. Kuchlingad4a5582000-12-31 04:03:27 +0000401def testCreateAttributeNS(): pass
Paul Prescod7993bcc2000-07-01 14:54:16 +0000402
403def testParse(): pass
404
405def testParseString(): pass
406
407def testComment(): pass
408
409def testAttrListItem(): pass
410
411def testAttrListItems(): pass
412
413def testAttrListItemNS(): pass
414
415def testAttrListKeys(): pass
416
417def testAttrListKeysNS(): pass
418
419def testAttrListValues(): pass
420
421def testAttrListLength(): pass
422
423def testAttrList__getitem__(): pass
424
425def testAttrList__setitem__(): pass
426
427def testSetAttrValueandNodeValue(): pass
428
429def testParseElement(): pass
430
431def testParseAttributes(): pass
432
433def testParseElementNamespaces(): pass
434
435def testParseAttributeNamespaces(): pass
436
437def testParseProcessingInstructions(): pass
438
439def testChildNodes(): pass
440
441def testFirstChild(): pass
442
443def testHasChildNodes(): pass
444
Fred Drakea1bde802000-11-21 22:02:43 +0000445def testCloneElementShallow():
446 dom, clone = _setupCloneElement(0)
447 confirm(len(clone.childNodes) == 0
Fred Drake946f7b12001-09-28 20:31:50 +0000448 and clone.childNodes.length == 0
Fred Drakea1bde802000-11-21 22:02:43 +0000449 and clone.parentNode is None
450 and clone.toxml() == '<doc attr="value"/>'
451 , "testCloneElementShallow")
452 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000453
Fred Drakea1bde802000-11-21 22:02:43 +0000454def testCloneElementDeep():
455 dom, clone = _setupCloneElement(1)
456 confirm(len(clone.childNodes) == 1
Fred Drake946f7b12001-09-28 20:31:50 +0000457 and clone.childNodes.length == 1
Fred Drakea1bde802000-11-21 22:02:43 +0000458 and clone.parentNode is None
459 and clone.toxml() == '<doc attr="value"><foo/></doc>'
460 , "testCloneElementDeep")
461 dom.unlink()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000462
Fred Drakea1bde802000-11-21 22:02:43 +0000463def _setupCloneElement(deep):
464 dom = parseString("<doc attr='value'><foo/></doc>")
465 root = dom.documentElement
466 clone = root.cloneNode(deep)
467 _testCloneElementCopiesAttributes(
468 root, clone, "testCloneElement" + (deep and "Deep" or "Shallow"))
469 # mutilate the original so shared data is detected
470 root.tagName = root.nodeName = "MODIFIED"
471 root.setAttribute("attr", "NEW VALUE")
472 root.setAttribute("added", "VALUE")
473 return dom, clone
474
475def _testCloneElementCopiesAttributes(e1, e2, test):
476 attrs1 = e1.attributes
477 attrs2 = e2.attributes
478 keys1 = attrs1.keys()
479 keys2 = attrs2.keys()
480 keys1.sort()
481 keys2.sort()
482 confirm(keys1 == keys2, "clone of element has same attribute keys")
483 for i in range(len(keys1)):
484 a1 = attrs1.item(i)
485 a2 = attrs2.item(i)
486 confirm(a1 is not a2
487 and a1.value == a2.value
488 and a1.nodeValue == a2.nodeValue
489 and a1.namespaceURI == a2.namespaceURI
490 and a1.localName == a2.localName
491 , "clone of attribute node has proper attribute values")
492 confirm(a2.ownerElement is e2,
493 "clone of attribute node correctly owned")
Fredrik Lundhf7850422001-01-17 21:51:36 +0000494
Paul Prescod7993bcc2000-07-01 14:54:16 +0000495
496def testCloneDocumentShallow(): pass
497
498def testCloneDocumentDeep(): pass
499
500def testCloneAttributeShallow(): pass
501
502def testCloneAttributeDeep(): pass
503
504def testClonePIShallow(): pass
505
506def testClonePIDeep(): pass
507
Fred Drakea1bde802000-11-21 22:02:43 +0000508def testNormalize():
509 doc = parseString("<doc/>")
510 root = doc.documentElement
511 root.appendChild(doc.createTextNode("first"))
512 root.appendChild(doc.createTextNode("second"))
Fred Drake946f7b12001-09-28 20:31:50 +0000513 confirm(len(root.childNodes) == 2
514 and root.childNodes.length == 2, "testNormalize -- preparation")
Fred Drakea1bde802000-11-21 22:02:43 +0000515 doc.normalize()
516 confirm(len(root.childNodes) == 1
Fred Drake946f7b12001-09-28 20:31:50 +0000517 and root.childNodes.length == 1
Fred Drakea1bde802000-11-21 22:02:43 +0000518 and root.firstChild is root.lastChild
519 and root.firstChild.data == "firstsecond"
520 , "testNormalize -- result")
521 doc.unlink()
522
Fred Drake3277da02000-12-14 18:20:22 +0000523 doc = parseString("<doc/>")
524 root = doc.documentElement
525 root.appendChild(doc.createTextNode(""))
526 doc.normalize()
Fred Drake946f7b12001-09-28 20:31:50 +0000527 confirm(len(root.childNodes) == 0
528 and root.childNodes.length == 0,
Fred Drake3277da02000-12-14 18:20:22 +0000529 "testNormalize -- single empty node removed")
530 doc.unlink()
531
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000532def testSiblings():
533 doc = parseString("<doc><?pi?>text?<elm/></doc>")
534 root = doc.documentElement
535 (pi, text, elm) = root.childNodes
Paul Prescod7993bcc2000-07-01 14:54:16 +0000536
Fred Drake004d5e62000-10-23 17:22:08 +0000537 confirm(pi.nextSibling is text and
538 pi.previousSibling is None and
539 text.nextSibling is elm and
540 text.previousSibling is pi and
541 elm.nextSibling is None and
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000542 elm.previousSibling is text, "testSiblings")
543
544 doc.unlink()
545
546def testParents():
547 doc = parseString("<doc><elm1><elm2/><elm2><elm3/></elm2></elm1></doc>")
548 root = doc.documentElement
549 elm1 = root.childNodes[0]
550 (elm2a, elm2b) = elm1.childNodes
551 elm3 = elm2b.childNodes[0]
552
553 confirm(root.parentNode is doc and
554 elm1.parentNode is root and
555 elm2a.parentNode is elm1 and
556 elm2b.parentNode is elm1 and
557 elm3.parentNode is elm2b, "testParents")
558
559 doc.unlink()
560
Fred Drake946f7b12001-09-28 20:31:50 +0000561def testNodeListItem():
562 doc = parseString("<doc><e/><e/></doc>")
563 children = doc.childNodes
564 docelem = children[0]
565 confirm(children[0] is children.item(0)
566 and children.item(1) is None
567 and docelem.childNodes.item(0) is docelem.childNodes[0]
568 and docelem.childNodes.item(1) is docelem.childNodes[1]
569 and docelem.childNodes.item(0).childNodes.item(0) is None,
570 "test NodeList.item()")
571 doc.unlink()
572
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000573def testSAX2DOM():
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000574 from xml.dom import pulldom
575
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000576 sax2dom = pulldom.SAX2DOM()
577 sax2dom.startDocument()
578 sax2dom.startElement("doc", {})
579 sax2dom.characters("text")
580 sax2dom.startElement("subelm", {})
581 sax2dom.characters("text")
582 sax2dom.endElement("subelm")
Fred Drake004d5e62000-10-23 17:22:08 +0000583 sax2dom.characters("text")
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000584 sax2dom.endElement("doc")
585 sax2dom.endDocument()
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000586
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000587 doc = sax2dom.document
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000588 root = doc.documentElement
589 (text1, elm1, text2) = root.childNodes
590 text3 = elm1.childNodes[0]
591
592 confirm(text1.previousSibling is None and
593 text1.nextSibling is elm1 and
594 elm1.previousSibling is text1 and
595 elm1.nextSibling is text2 and
596 text2.previousSibling is elm1 and
597 text2.nextSibling is None and
598 text3.previousSibling is None and
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000599 text3.nextSibling is None, "testSAX2DOM - siblings")
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000600
601 confirm(root.parentNode is doc and
602 text1.parentNode is root and
603 elm1.parentNode is root and
604 text2.parentNode is root and
Lars Gustäbel5bad5a42000-10-13 20:54:10 +0000605 text3.parentNode is elm1, "testSAX2DOM - parents")
Fred Drake004d5e62000-10-23 17:22:08 +0000606
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000607 doc.unlink()
608
Martin v. Löwis7d650ca2002-06-30 15:05:00 +0000609def testEncodings():
610 doc = parseString('<foo>&#x20ac;</foo>')
611 confirm(doc.toxml() == u'<?xml version="1.0" ?>\n<foo>\u20ac</foo>'
612 and doc.toxml('utf-8') == '<?xml version="1.0" encoding="utf-8"?>\n<foo>\xe2\x82\xac</foo>'
613 and doc.toxml('iso-8859-15') == '<?xml version="1.0" encoding="iso-8859-15"?>\n<foo>\xa4</foo>',
614 "testEncodings - encoding EURO SIGN")
615 doc.unlink()
616
Lars Gustäbelf27f5ab2000-10-11 22:36:00 +0000617# --- MAIN PROGRAM
Fred Drake004d5e62000-10-23 17:22:08 +0000618
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000619names = globals().keys()
Paul Prescod7993bcc2000-07-01 14:54:16 +0000620names.sort()
Paul Prescod10d27662000-09-18 19:07:26 +0000621
Fred Drakeacfb3f62001-02-01 18:11:29 +0000622failed = []
Paul Prescod10d27662000-09-18 19:07:26 +0000623
Paul Prescod7993bcc2000-07-01 14:54:16 +0000624for name in names:
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000625 if name.startswith("test"):
626 func = globals()[name]
Paul Prescod7993bcc2000-07-01 14:54:16 +0000627 try:
628 func()
629 print "Test Succeeded", name
Fred Drakeebe73022000-10-09 19:57:39 +0000630 confirm(len(Node.allnodes) == 0,
631 "assertion: len(Node.allnodes) == 0")
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000632 if len(Node.allnodes):
Paul Prescod7993bcc2000-07-01 14:54:16 +0000633 print "Garbage left over:"
Martin v. Löwis89c528b2000-09-19 16:22:10 +0000634 if verbose:
635 print Node.allnodes.items()[0:10]
636 else:
637 # Don't print specific nodes if repeatable results
638 # are needed
639 print len(Node.allnodes)
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000640 Node.allnodes = {}
Fred Drakeacfb3f62001-02-01 18:11:29 +0000641 except:
642 failed.append(name)
Paul Prescod7993bcc2000-07-01 14:54:16 +0000643 print "Test Failed: ", name
Fred Drake1703cf62000-12-15 21:31:59 +0000644 sys.stdout.flush()
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000645 traceback.print_exception(*sys.exc_info())
Fred Drakeacfb3f62001-02-01 18:11:29 +0000646 print `sys.exc_info()[1]`
Jeremy Hylton3b0c6002000-10-12 17:31:36 +0000647 Node.allnodes = {}
Paul Prescod10d27662000-09-18 19:07:26 +0000648
Fred Drakeacfb3f62001-02-01 18:11:29 +0000649if failed:
650 print "\n\n\n**** Check for failures in these tests:"
651 for name in failed:
652 print " " + name
653 print
Paul Prescod10d27662000-09-18 19:07:26 +0000654else:
Fred Drakeacfb3f62001-02-01 18:11:29 +0000655 print "All tests succeeded"
Paul Prescod7993bcc2000-07-01 14:54:16 +0000656
Guido van Rossum9e79a252000-09-21 20:10:39 +0000657Node.debug = None # Delete debug output collected in a StringIO object
658Node._debug = 0 # And reset debug mode