mirror of https://github.com/python/cpython
414 lines
11 KiB
Python
414 lines
11 KiB
Python
# test for xml.dom.minidom
|
|
|
|
from xml.dom.minidom import parse, Node, Document, parseString
|
|
import xml.parsers.expat
|
|
|
|
import os.path
|
|
import sys
|
|
import traceback
|
|
from test_support import verbose
|
|
|
|
if __name__ == "__main__":
|
|
base = sys.argv[0]
|
|
else:
|
|
base = __file__
|
|
tstfile = os.path.join(os.path.dirname(base), "test.xml")
|
|
del base
|
|
|
|
def confirm( test, testname="Test" ):
|
|
if test:
|
|
print "Passed " + testname
|
|
else:
|
|
print "Failed " + testname
|
|
raise Exception
|
|
|
|
Node._debug=1
|
|
|
|
def testParseFromFile():
|
|
from StringIO import StringIO
|
|
dom=parse( StringIO( open( tstfile ).read() ) )
|
|
dom.unlink()
|
|
confirm(isinstance(dom,Document))
|
|
|
|
def testGetElementsByTagName( ):
|
|
dom=parse( tstfile )
|
|
confirm( dom.getElementsByTagName( "LI" )==\
|
|
dom.documentElement.getElementsByTagName( "LI" ) )
|
|
dom.unlink()
|
|
|
|
def testInsertBefore( ):
|
|
dom=parse( tstfile )
|
|
docel=dom.documentElement
|
|
#docel.insertBefore( dom.createProcessingInstruction("a", "b"),
|
|
# docel.childNodes[1])
|
|
|
|
#docel.insertBefore( dom.createProcessingInstruction("a", "b"),
|
|
# docel.childNodes[0])
|
|
|
|
#confirm( docel.childNodes[0].tet=="a" )
|
|
#confirm( docel.childNodes[2].tet=="a" )
|
|
dom.unlink()
|
|
|
|
def testAppendChild():
|
|
dom=parse( tstfile )
|
|
dom.documentElement.appendChild( dom.createComment( u"Hello" ))
|
|
confirm( dom.documentElement.childNodes[-1].nodeName=="#comment" )
|
|
confirm( dom.documentElement.childNodes[-1].data=="Hello" )
|
|
dom.unlink()
|
|
|
|
def testNonZero():
|
|
dom=parse( tstfile )
|
|
confirm( dom )# should not be zero
|
|
dom.appendChild( dom.createComment( "foo" ) )
|
|
confirm( not dom.childNodes[-1].childNodes )
|
|
dom.unlink()
|
|
|
|
def testUnlink():
|
|
dom=parse( tstfile )
|
|
dom.unlink()
|
|
|
|
def testElement():
|
|
dom=Document()
|
|
dom.appendChild( dom.createElement( "abc" ) )
|
|
confirm( dom.documentElement )
|
|
dom.unlink()
|
|
|
|
def testAAA():
|
|
dom=parseString( "<abc/>" )
|
|
el=dom.documentElement
|
|
el.setAttribute( "spam", "jam2" )
|
|
dom.unlink()
|
|
|
|
def testAAB():
|
|
dom=parseString( "<abc/>" )
|
|
el=dom.documentElement
|
|
el.setAttribute( "spam", "jam" )
|
|
el.setAttribute( "spam", "jam2" )
|
|
dom.unlink()
|
|
|
|
def testAddAttr():
|
|
dom=Document()
|
|
child=dom.appendChild( dom.createElement( "abc" ) )
|
|
|
|
child.setAttribute( "def", "ghi" )
|
|
confirm( child.getAttribute( "def" )=="ghi" )
|
|
confirm( child.attributes["def"].value=="ghi" )
|
|
|
|
child.setAttribute( "jkl", "mno" )
|
|
confirm( child.getAttribute( "jkl" )=="mno" )
|
|
confirm( child.attributes["jkl"].value=="mno" )
|
|
|
|
confirm( len( child.attributes )==2 )
|
|
|
|
child.setAttribute( "def", "newval" )
|
|
confirm( child.getAttribute( "def" )=="newval" )
|
|
confirm( child.attributes["def"].value=="newval" )
|
|
|
|
confirm( len( child.attributes )==2 )
|
|
dom.unlink()
|
|
|
|
def testDeleteAttr():
|
|
dom=Document()
|
|
child=dom.appendChild( dom.createElement( "abc" ) )
|
|
|
|
confirm( len( child.attributes)==0 )
|
|
child.setAttribute( "def", "ghi" )
|
|
confirm( len( child.attributes)==1 )
|
|
del child.attributes["def"]
|
|
confirm( len( child.attributes)==0 )
|
|
dom.unlink()
|
|
|
|
def testRemoveAttr():
|
|
dom=Document()
|
|
child=dom.appendChild( dom.createElement( "abc" ) )
|
|
|
|
child.setAttribute( "def", "ghi" )
|
|
confirm( len( child.attributes)==1 )
|
|
child.removeAttribute("def" )
|
|
confirm( len( child.attributes)==0 )
|
|
|
|
dom.unlink()
|
|
|
|
def testRemoveAttrNS():
|
|
dom=Document()
|
|
child=dom.appendChild(
|
|
dom.createElementNS( "http://www.python.org", "python:abc" ) )
|
|
child.setAttributeNS( "http://www.w3.org", "xmlns:python",
|
|
"http://www.python.org" )
|
|
child.setAttributeNS( "http://www.python.org", "python:abcattr", "foo" )
|
|
confirm( len( child.attributes )==2 )
|
|
child.removeAttributeNS( "http://www.python.org", "abcattr" )
|
|
confirm( len( child.attributes )==1 )
|
|
|
|
dom.unlink()
|
|
|
|
def testRemoveAttributeNode():
|
|
dom=Document()
|
|
child=dom.appendChild( dom.createElement( "foo" ) )
|
|
child.setAttribute( "spam", "jam" )
|
|
confirm( len( child.attributes )==1 )
|
|
node=child.getAttributeNode( "spam" )
|
|
child.removeAttributeNode( node )
|
|
confirm( len( child.attributes )==0 )
|
|
|
|
dom.unlink()
|
|
|
|
def testChangeAttr():
|
|
dom=parseString( "<abc/>" )
|
|
el=dom.documentElement
|
|
el.setAttribute( "spam", "jam" )
|
|
confirm( len( el.attributes )==1 )
|
|
el.setAttribute( "spam", "bam" )
|
|
confirm( len( el.attributes )==1 )
|
|
el.attributes["spam"]="ham"
|
|
confirm( len( el.attributes )==1 )
|
|
el.setAttribute( "spam2", "bam" )
|
|
confirm( len( el.attributes )==2 )
|
|
el.attributes[ "spam2"]= "bam2"
|
|
confirm( len( el.attributes )==2 )
|
|
dom.unlink()
|
|
|
|
def testGetAttrList():
|
|
pass
|
|
|
|
def testGetAttrValues(): pass
|
|
|
|
def testGetAttrLength(): pass
|
|
|
|
def testGetAttribute(): pass
|
|
|
|
def testGetAttributeNS(): pass
|
|
|
|
def testGetAttributeNode(): pass
|
|
|
|
def testGetElementsByTagNameNS(): pass
|
|
|
|
def testGetEmptyNodeListFromElementsByTagNameNS(): pass
|
|
|
|
def testElementReprAndStr():
|
|
dom=Document()
|
|
el=dom.appendChild( dom.createElement( "abc" ) )
|
|
string1=repr( el )
|
|
string2=str( el )
|
|
confirm( string1==string2 )
|
|
dom.unlink()
|
|
|
|
# commented out until Fredrick's fix is checked in
|
|
def _testElementReprAndStrUnicode():
|
|
dom=Document()
|
|
el=dom.appendChild( dom.createElement( u"abc" ) )
|
|
string1=repr( el )
|
|
string2=str( el )
|
|
confirm( string1==string2 )
|
|
dom.unlink()
|
|
|
|
# commented out until Fredrick's fix is checked in
|
|
def _testElementReprAndStrUnicodeNS():
|
|
dom=Document()
|
|
el=dom.appendChild(
|
|
dom.createElementNS( u"http://www.slashdot.org", u"slash:abc" ))
|
|
string1=repr( el )
|
|
string2=str( el )
|
|
confirm( string1==string2 )
|
|
confirm( string1.find("slash:abc" )!=-1 )
|
|
dom.unlink()
|
|
confirm( len( Node.allnodes )==0 )
|
|
|
|
def testAttributeRepr():
|
|
dom=Document()
|
|
el=dom.appendChild( dom.createElement( u"abc" ) )
|
|
node=el.setAttribute( "abc", "def" )
|
|
confirm( str( node ) == repr( node ) )
|
|
dom.unlink()
|
|
confirm( len( Node.allnodes )==0 )
|
|
|
|
def testTextNodeRepr(): pass
|
|
|
|
def testWriteXML():
|
|
str = '<a b="c"/>'
|
|
dom = parseString(str)
|
|
domstr = dom.toxml()
|
|
dom.unlink()
|
|
confirm(str == domstr)
|
|
confirm( len( Node.allnodes )==0 )
|
|
|
|
def testProcessingInstruction(): pass
|
|
|
|
def testProcessingInstructionRepr(): pass
|
|
|
|
def testTextRepr(): pass
|
|
|
|
def testWriteText(): pass
|
|
|
|
def testDocumentElement(): pass
|
|
|
|
def testTooManyDocumentElements(): pass
|
|
|
|
def testCreateElementNS(): pass
|
|
|
|
def testCreatAttributeNS(): pass
|
|
|
|
def testParse(): pass
|
|
|
|
def testParseString(): pass
|
|
|
|
def testComment(): pass
|
|
|
|
def testAttrListItem(): pass
|
|
|
|
def testAttrListItems(): pass
|
|
|
|
def testAttrListItemNS(): pass
|
|
|
|
def testAttrListKeys(): pass
|
|
|
|
def testAttrListKeysNS(): pass
|
|
|
|
def testAttrListValues(): pass
|
|
|
|
def testAttrListLength(): pass
|
|
|
|
def testAttrList__getitem__(): pass
|
|
|
|
def testAttrList__setitem__(): pass
|
|
|
|
def testSetAttrValueandNodeValue(): pass
|
|
|
|
def testParseElement(): pass
|
|
|
|
def testParseAttributes(): pass
|
|
|
|
def testParseElementNamespaces(): pass
|
|
|
|
def testParseAttributeNamespaces(): pass
|
|
|
|
def testParseProcessingInstructions(): pass
|
|
|
|
def testChildNodes(): pass
|
|
|
|
def testFirstChild(): pass
|
|
|
|
def testHasChildNodes(): pass
|
|
|
|
def testCloneElementShallow(): pass
|
|
|
|
def testCloneElementShallowCopiesAttributes(): pass
|
|
|
|
def testCloneElementDeep(): pass
|
|
|
|
def testCloneDocumentShallow(): pass
|
|
|
|
def testCloneDocumentDeep(): pass
|
|
|
|
def testCloneAttributeShallow(): pass
|
|
|
|
def testCloneAttributeDeep(): pass
|
|
|
|
def testClonePIShallow(): pass
|
|
|
|
def testClonePIDeep(): pass
|
|
|
|
def testSiblings():
|
|
doc = parseString("<doc><?pi?>text?<elm/></doc>")
|
|
root = doc.documentElement
|
|
(pi, text, elm) = root.childNodes
|
|
|
|
confirm(pi.nextSibling is text and
|
|
pi.previousSibling is None and
|
|
text.nextSibling is elm and
|
|
text.previousSibling is pi and
|
|
elm.nextSibling is None and
|
|
elm.previousSibling is text, "testSiblings")
|
|
|
|
doc.unlink()
|
|
|
|
def testParents():
|
|
doc = parseString("<doc><elm1><elm2/><elm2><elm3/></elm2></elm1></doc>")
|
|
root = doc.documentElement
|
|
elm1 = root.childNodes[0]
|
|
(elm2a, elm2b) = elm1.childNodes
|
|
elm3 = elm2b.childNodes[0]
|
|
|
|
confirm(root.parentNode is doc and
|
|
elm1.parentNode is root and
|
|
elm2a.parentNode is elm1 and
|
|
elm2b.parentNode is elm1 and
|
|
elm3.parentNode is elm2b, "testParents")
|
|
|
|
doc.unlink()
|
|
|
|
def testNonNSElements():
|
|
from xml.dom import pulldom
|
|
|
|
pulldom = pulldom.PullDOM()
|
|
pulldom.startDocument()
|
|
pulldom.startElement("doc", {})
|
|
pulldom.characters("text")
|
|
pulldom.startElement("subelm", {})
|
|
pulldom.characters("text")
|
|
pulldom.endElement("subelm")
|
|
pulldom.characters("text")
|
|
pulldom.endElement("doc")
|
|
pulldom.endDocument()
|
|
|
|
doc = pulldom.document
|
|
root = doc.documentElement
|
|
(text1, elm1, text2) = root.childNodes
|
|
text3 = elm1.childNodes[0]
|
|
|
|
confirm(text1.previousSibling is None and
|
|
text1.nextSibling is elm1 and
|
|
elm1.previousSibling is text1 and
|
|
elm1.nextSibling is text2 and
|
|
text2.previousSibling is elm1 and
|
|
text2.nextSibling is None and
|
|
text3.previousSibling is None and
|
|
text3.nextSibling is None, "testNonNSElements - siblings")
|
|
|
|
confirm(root.parentNode is doc and
|
|
text1.parentNode is root and
|
|
elm1.parentNode is root and
|
|
text2.parentNode is root and
|
|
text3.parentNode is elm1, "testNonNSElements - parents")
|
|
|
|
doc.unlink()
|
|
|
|
# --- MAIN PROGRAM
|
|
|
|
names=globals().keys()
|
|
names.sort()
|
|
|
|
works=1
|
|
|
|
for name in names:
|
|
if name.startswith( "test" ):
|
|
func=globals()[name]
|
|
try:
|
|
func()
|
|
print "Test Succeeded", name
|
|
confirm(len(Node.allnodes) == 0,
|
|
"assertion: len(Node.allnodes) == 0")
|
|
if len( Node.allnodes ):
|
|
print "Garbage left over:"
|
|
if verbose:
|
|
print Node.allnodes.items()[0:10]
|
|
else:
|
|
# Don't print specific nodes if repeatable results
|
|
# are needed
|
|
print len(Node.allnodes)
|
|
Node.allnodes={}
|
|
except Exception, e :
|
|
works=0
|
|
print "Test Failed: ", name
|
|
apply( traceback.print_exception, sys.exc_info() )
|
|
print `e`
|
|
Node.allnodes={}
|
|
|
|
if works:
|
|
print "All tests succeeded"
|
|
else:
|
|
print "\n\n\n\n************ Check for failures!"
|
|
|
|
Node.debug = None # Delete debug output collected in a StringIO object
|
|
Node._debug = 0 # And reset debug mode
|