@@ -1784,5 +1784,116 @@ def test_cdata_parsing(self):
17841784 dom2 = parseString (dom1 .toprettyxml ())
17851785 self .checkWholeText (dom2 .getElementsByTagName ('node' )[0 ].firstChild , '</data>' )
17861786
1787+ def testInvalidCharacterErr (self ):
1788+ doc = parseString ("<doc/>" )
1789+ impl = getDOMImplementation ()
1790+ for name in ("" , "bad name" , "1st" , "-x" , ".x" , "a<b" , "a&b" , "a\t b" ):
1791+ with self .subTest (name = name ):
1792+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1793+ doc .createElement , name )
1794+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1795+ doc .createElementNS , None , name )
1796+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1797+ doc .createAttribute , name )
1798+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1799+ doc .createAttributeNS , None , name )
1800+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1801+ doc .createProcessingInstruction , name , "" )
1802+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1803+ doc .createEntityReference , name )
1804+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1805+ impl .createDocumentType , name , None , None )
1806+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1807+ doc .documentElement .setAttribute , name , "v" )
1808+ self .assertRaises (xml .dom .InvalidCharacterErr ,
1809+ doc .documentElement .setAttributeNS ,
1810+ None , name , "v" )
1811+ for name in ("a" , "_x" , ":x" , "a.b-c" , "ns:tag" , "a1" ,
1812+ "\N{GREEK CAPITAL LETTER OMEGA} " , "\N{LINEAR B SYLLABLE B008 A} x" ):
1813+ with self .subTest (name = name ):
1814+ self .assertEqual (doc .createElement (name ).tagName , name )
1815+ self .assertEqual (doc .createAttribute (name ).name , name )
1816+ doc .unlink ()
1817+
1818+ def testWrongDocumentErr (self ):
1819+ doc = parseString ("<doc><child/></doc>" )
1820+ other = parseString ("<other/>" )
1821+ elem = doc .documentElement
1822+ alien = other .createElement ("alien" )
1823+ self .assertRaises (xml .dom .WrongDocumentErr , elem .appendChild , alien )
1824+ self .assertRaises (xml .dom .WrongDocumentErr , elem .insertBefore ,
1825+ alien , elem .firstChild )
1826+ self .assertRaises (xml .dom .WrongDocumentErr , elem .replaceChild ,
1827+ alien , elem .firstChild )
1828+ self .assertRaises (xml .dom .WrongDocumentErr , doc .appendChild , alien )
1829+ # the rejected node is left alone
1830+ self .assertIs (alien .ownerDocument , other )
1831+ self .assertIsNone (alien .parentNode )
1832+ # importNode() is the supported way to do this
1833+ elem .appendChild (doc .importNode (alien , True ))
1834+ self .assertEqual (elem .lastChild .tagName , "alien" )
1835+ doc .unlink ()
1836+ other .unlink ()
1837+
1838+ def testAncestorLoops (self ):
1839+ doc = parseString ("<doc><child><grandchild/></child></doc>" )
1840+ elem = doc .documentElement
1841+ child = elem .firstChild
1842+ grandchild = child .firstChild
1843+ for node in elem , child , grandchild :
1844+ self .assertRaises (xml .dom .HierarchyRequestErr ,
1845+ node .appendChild , node )
1846+ self .assertRaises (xml .dom .HierarchyRequestErr , child .appendChild , elem )
1847+ self .assertRaises (xml .dom .HierarchyRequestErr ,
1848+ grandchild .appendChild , elem )
1849+ self .assertRaises (xml .dom .HierarchyRequestErr ,
1850+ grandchild .insertBefore , child , None )
1851+ self .assertRaises (xml .dom .HierarchyRequestErr ,
1852+ grandchild .replaceChild , elem , None )
1853+ # the tree is unchanged
1854+ self .assertIs (child .parentNode , elem )
1855+ self .assertIs (grandchild .parentNode , child )
1856+ doc .unlink ()
1857+
1858+ def testAttrSpecified (self ):
1859+ doc = parseString ("<!DOCTYPE doc ["
1860+ " <!ELEMENT doc EMPTY>"
1861+ " <!ATTLIST doc a CDATA 'default' b CDATA #IMPLIED>"
1862+ "]><doc b='given'/>" )
1863+ elem = doc .documentElement
1864+ # attributes defaulted from the DTD are reported too
1865+ self .assertEqual (sorted (elem .attributes .keys ()), ["a" , "b" ])
1866+ self .assertEqual (elem .getAttribute ("a" ), "default" )
1867+ self .assertFalse (elem .getAttributeNode ("a" ).specified )
1868+ self .assertEqual (elem .getAttribute ("b" ), "given" )
1869+ self .assertTrue (elem .getAttributeNode ("b" ).specified )
1870+ doc .unlink ()
1871+
1872+ def testEntityReference (self ):
1873+ doc = parseString ("<doc/>" )
1874+ ref = doc .createEntityReference ("ent" )
1875+ self .assertEqual (ref .nodeType , Node .ENTITY_REFERENCE_NODE )
1876+ self .assertEqual (ref .nodeName , "ent" )
1877+ self .assertIsNone (ref .nodeValue )
1878+ self .assertIs (ref .ownerDocument , doc )
1879+ doc .documentElement .appendChild (ref )
1880+ self .assertEqual (doc .documentElement .toxml (), "<doc>&ent;</doc>" )
1881+ # entity reference nodes are read-only
1882+ text = doc .createTextNode ("x" )
1883+ self .assertRaises (xml .dom .NoModificationAllowedErr ,
1884+ ref .appendChild , text )
1885+ self .assertRaises (xml .dom .NoModificationAllowedErr ,
1886+ ref .insertBefore , text , None )
1887+ self .assertRaises (xml .dom .NoModificationAllowedErr ,
1888+ ref .removeChild , text )
1889+ self .assertRaises (xml .dom .NoModificationAllowedErr ,
1890+ ref .replaceChild , text , None )
1891+ self .assertEqual (ref .cloneNode (True ).nodeName , "ent" )
1892+ other = parseString ("<other/>" )
1893+ self .assertEqual (other .importNode (ref , True ).nodeName , "ent" )
1894+ doc .unlink ()
1895+ other .unlink ()
1896+
1897+
17871898if __name__ == "__main__" :
17881899 unittest .main ()
0 commit comments