diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 3735a6046891ea..8a5db95bb897c4 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -482,7 +482,15 @@ def testGetAttributeNS(self): self.assertEqual(child2.getAttributeNS("http://www.python.org", "missing"), '') - def testGetAttributeNode(self): pass + def testGetAttributeNode(self): + dom = parseString("") + elem = dom.documentElement + attr = elem.getAttributeNode("a") + self.assertEqual(attr.name, "a") + self.assertEqual(attr.value, "1") + self.assertIs(attr.ownerElement, elem) + self.assertIsNone(elem.getAttributeNode("b")) + dom.unlink() def testGetElementsByTagNameNS(self): d=""" @@ -671,9 +679,34 @@ def testTextRepr(self): self.assertEqual(str(el), repr(el)) self.assertEqual('', str(el)) - def testWriteText(self): pass + def testWriteText(self): + dom = parseString("text<&>") + elem = dom.documentElement + writer = io.StringIO() + elem.writexml(writer) + self.assertEqual(writer.getvalue(), + "text<&>") + writer = io.StringIO() + elem.writexml(writer, indent=" ", addindent=" ", newl="\n") + self.assertEqual(writer.getvalue(), + " \n" + " text\n" + " <&>\n" + " \n") + dom.unlink() - def testDocumentElement(self): pass + def testDocumentElement(self): + dom = parseString("") + elem = dom.documentElement + self.assertEqual(elem.tagName, "doc") + self.assertIs(elem, dom.childNodes[1]) + dom.unlink() + + dom = Document() + self.assertIsNone(dom.documentElement) + elem = dom.appendChild(dom.createElement("doc")) + self.assertIs(dom.documentElement, elem) + dom.unlink() def testTooManyDocumentElements(self): doc = parseString("") @@ -683,25 +716,126 @@ def testTooManyDocumentElements(self): elem.unlink() doc.unlink() - def testCreateElementNS(self): pass + def testCreateElementNS(self): + dom = Document() + elem = dom.createElementNS("http://xml.python.org/ns", "p:elem") + self.assertEqual(elem.nodeType, Node.ELEMENT_NODE) + self.assertEqual(elem.tagName, "p:elem") + self.assertEqual(elem.nodeName, "p:elem") + self.assertEqual(elem.namespaceURI, "http://xml.python.org/ns") + self.assertEqual(elem.prefix, "p") + self.assertEqual(elem.localName, "elem") + self.assertIs(elem.ownerDocument, dom) + self.assertIsNone(elem.parentNode) + + elem = dom.createElementNS("http://xml.python.org/ns", "elem") + self.assertEqual(elem.tagName, "elem") + self.assertIsNone(elem.prefix) + self.assertEqual(elem.localName, "elem") + dom.unlink() - def testCreateAttributeNS(self): pass + def testCreateAttributeNS(self): + dom = Document() + attr = dom.createAttributeNS("http://xml.python.org/ns", "p:attr") + self.assertEqual(attr.nodeType, Node.ATTRIBUTE_NODE) + self.assertEqual(attr.name, "p:attr") + self.assertEqual(attr.nodeName, "p:attr") + self.assertEqual(attr.namespaceURI, "http://xml.python.org/ns") + self.assertEqual(attr.prefix, "p") + self.assertEqual(attr.localName, "attr") + self.assertEqual(attr.value, "") + self.assertIs(attr.ownerDocument, dom) + self.assertIsNone(attr.ownerElement) + + elem = dom.appendChild(dom.createElement("doc")) + elem.setAttributeNode(attr) + self.assertIs(attr.ownerElement, elem) + self.assertIs(elem.getAttributeNodeNS("http://xml.python.org/ns", + "attr"), attr) + dom.unlink() - def testParse(self): pass + def testParse(self): + # parsing from a file object is tested in testParseFromBinaryFile + # and testParseFromTextFile + dom = parse(tstfile) + self.assertEqual(dom.nodeType, Node.DOCUMENT_NODE) + self.assertEqual(dom.documentElement.tagName, "HTML") + dom.unlink() - def testParseString(self): pass + self.assertRaises(ExpatError, parseString, "") - def testComment(self): pass + def testParseString(self): + dom = parseString("text") + self.assertEqual(dom.nodeType, Node.DOCUMENT_NODE) + self.assertEqual(dom.documentElement.tagName, "doc") + self.assertEqual(dom.documentElement.firstChild.data, "text") + dom.unlink() + + dom = parseString(b"" + b"\xc3\xa9") + self.assertEqual(dom.documentElement.firstChild.data, "\xe9") + dom.unlink() + + def testComment(self): + dom = Document() + comment = dom.createComment("comment") + self.assertEqual(comment.nodeType, Node.COMMENT_NODE) + self.assertEqual(comment.nodeName, "#comment") + self.assertEqual(comment.data, "comment") + self.assertEqual(comment.nodeValue, "comment") + self.assertIsNone(comment.attributes) + dom.appendChild(comment) + self.assertEqual(dom.toxml(), + '') + dom.unlink() - def testAttrListItem(self): pass + dom = parseString("") + comment = dom.documentElement.firstChild + self.assertEqual(comment.nodeType, Node.COMMENT_NODE) + self.assertEqual(comment.data, "comment") + dom.unlink() - def testAttrListItems(self): pass + def testAttrListItem(self): + dom = parseString("") + attrs = dom.documentElement.attributes + self.assertEqual(attrs.item(0).name, "a") + self.assertEqual(attrs.item(1).name, "b") + self.assertIsNone(attrs.item(2)) + dom.unlink() - def testAttrListItemNS(self): pass + def testAttrListItems(self): + dom = parseString("") + attrs = dom.documentElement.attributes + self.assertEqual(attrs.items(), [("a", "1"), ("b", "2")]) + dom.unlink() - def testAttrListKeys(self): pass + def testAttrListItemNS(self): + dom = parseString("") + attrs = dom.documentElement.attributes + self.assertEqual(attrs.itemsNS(), [ + ((xml.dom.XMLNS_NAMESPACE, "p"), "http://xml.python.org/ns"), + (("http://xml.python.org/ns", "a"), "1"), + ((None, "b"), "2"), + ]) + dom.unlink() - def testAttrListKeysNS(self): pass + def testAttrListKeys(self): + dom = parseString("") + attrs = dom.documentElement.attributes + self.assertEqual(list(attrs.keys()), ["a", "b"]) + dom.unlink() + + def testAttrListKeysNS(self): + dom = parseString("") + attrs = dom.documentElement.attributes + self.assertEqual(list(attrs.keysNS()), [ + (xml.dom.XMLNS_NAMESPACE, "p"), + ("http://xml.python.org/ns", "a"), + (None, "b"), + ]) + dom.unlink() def testRemoveNamedItem(self): doc = parseString("") @@ -722,29 +856,162 @@ def testRemoveNamedItemNS(self): self.assertRaises(xml.dom.NotFoundErr, attrs.removeNamedItemNS, "http://xml.python.org/", "b") - def testAttrListValues(self): pass + def testAttrListValues(self): + dom = parseString("") + attrs = dom.documentElement.attributes + self.assertEqual([attr.name for attr in attrs.values()], ["a", "b"]) + self.assertEqual([attr.value for attr in attrs.values()], ["1", "2"]) + dom.unlink() + + def testAttrListLength(self): + dom = parseString("") + attrs = dom.documentElement.attributes + self.assertEqual(attrs.length, 2) + self.assertEqual(len(attrs), 2) + dom.unlink() + + dom = parseString("") + self.assertEqual(dom.documentElement.attributes.length, 0) + dom.unlink() + + def testAttrList__getitem__(self): + dom = parseString("") + attrs = dom.documentElement.attributes + self.assertEqual(attrs["b"].value, "2") + self.assertEqual(attrs[("http://xml.python.org/ns", "a")].value, "1") + self.assertRaises(KeyError, attrs.__getitem__, "missing") + self.assertRaises(KeyError, attrs.__getitem__, (None, "missing")) + dom.unlink() - def testAttrListLength(self): pass + def testAttrList__setitem__(self): + dom = parseString("") + elem = dom.documentElement + attrs = elem.attributes + attrs["a"] = "2" + self.assertEqual(elem.getAttribute("a"), "2") + attrs["b"] = "3" + self.assertEqual(elem.getAttribute("b"), "3") + self.assertEqual(attrs.length, 2) + + attr = dom.createAttribute("c") + attr.value = "4" + attrs["c"] = attr + self.assertIs(elem.getAttributeNode("c"), attr) + self.assertEqual(elem.getAttribute("c"), "4") + dom.unlink() - def testAttrList__getitem__(self): pass + def testSetAttrValueandNodeValue(self): + dom = parseString("") + attr = dom.documentElement.getAttributeNode("a") + self.assertEqual(attr.value, "1") + self.assertEqual(attr.nodeValue, "1") + attr.value = "2" + self.assertEqual(attr.nodeValue, "2") + attr.nodeValue = "3" + self.assertEqual(attr.value, "3") + self.assertEqual(dom.documentElement.getAttribute("a"), "3") + dom.unlink() - def testAttrList__setitem__(self): pass + def testParseElement(self): + dom = parseString("") + elem = dom.documentElement + self.assertEqual(elem.nodeType, Node.ELEMENT_NODE) + self.assertEqual(elem.tagName, "doc") + self.assertIsNone(elem.namespaceURI) + self.assertIs(elem.parentNode, dom) + self.assertIs(elem.ownerDocument, dom) + self.assertEqual([child.tagName for child in elem.childNodes], + ["child", "child"]) + dom.unlink() - def testSetAttrValueandNodeValue(self): pass + def testParseAttributes(self): + dom = parseString("") + elem = dom.documentElement + self.assertEqual(elem.getAttribute("a"), "1") + self.assertEqual(elem.getAttribute("b"), "&") + self.assertEqual(elem.getAttribute("missing"), "") + self.assertTrue(elem.hasAttribute("a")) + self.assertFalse(elem.hasAttribute("missing")) + attr = elem.getAttributeNode("a") + self.assertTrue(attr.specified) + self.assertIsNone(attr.namespaceURI) + dom.unlink() - def testParseElement(self): pass + def testParseElementNamespaces(self): + dom = parseString("" + "") + elem = dom.documentElement + self.assertEqual(elem.tagName, "p:doc") + self.assertEqual(elem.namespaceURI, "http://xml.python.org/ns") + self.assertEqual(elem.prefix, "p") + self.assertEqual(elem.localName, "doc") + child = elem.getElementsByTagName("child")[0] + self.assertEqual(child.namespaceURI, "http://xml.python.org/default") + self.assertIsNone(child.prefix) + self.assertEqual(child.localName, "child") + dom.unlink() - def testParseAttributes(self): pass + def testParseAttributeNamespaces(self): + dom = parseString("") + elem = dom.documentElement + self.assertEqual(elem.getAttributeNS("http://xml.python.org/ns", "a"), + "1") + self.assertEqual(elem.getAttributeNS(None, "b"), "2") + attr = elem.getAttributeNodeNS("http://xml.python.org/ns", "a") + self.assertEqual(attr.name, "p:a") + self.assertEqual(attr.prefix, "p") + self.assertEqual(attr.localName, "a") + declaration = elem.getAttributeNode("xmlns:p") + self.assertEqual(declaration.namespaceURI, xml.dom.XMLNS_NAMESPACE) + self.assertEqual(declaration.value, "http://xml.python.org/ns") + dom.unlink() - def testParseElementNamespaces(self): pass + def testParseProcessingInstructions(self): + # the content of a processing instruction is tested + # in testProcessingInstruction + dom = parseString("") + pi = dom.childNodes[0] + self.assertEqual(pi.nodeType, Node.PROCESSING_INSTRUCTION_NODE) + self.assertEqual(pi.target, "before") + self.assertEqual(pi.data, "data") + self.assertIs(pi.parentNode, dom) + pi = dom.childNodes[2] + self.assertEqual(pi.target, "after") + self.assertEqual(pi.data, "") + dom.unlink() - def testParseAttributeNamespaces(self): pass + def testChildNodes(self): + dom = parseString("text") + children = dom.documentElement.childNodes + self.assertEqual(len(children), 3) + self.assertEqual([child.nodeType for child in children], + [Node.TEXT_NODE, Node.ELEMENT_NODE, Node.COMMENT_NODE]) + for child in children: + self.assertIs(child.parentNode, dom.documentElement) + dom.unlink() - def testParseProcessingInstructions(self): pass + dom = parseString("") + self.assertEqual(len(dom.documentElement.childNodes), 0) + dom.unlink() - def testChildNodes(self): pass + def testFirstChild(self): + dom = parseString("") + elem = dom.documentElement + self.assertEqual(elem.firstChild.tagName, "a") + self.assertEqual(elem.lastChild.tagName, "b") + self.assertIs(elem.firstChild, elem.childNodes[0]) + self.assertIs(elem.lastChild, elem.childNodes[-1]) + self.assertIsNone(elem.firstChild.previousSibling) + self.assertIs(elem.firstChild.nextSibling, elem.lastChild) + dom.unlink() - def testFirstChild(self): pass + dom = parseString("") + self.assertIsNone(dom.documentElement.firstChild) + self.assertIsNone(dom.documentElement.lastChild) + dom.unlink() def testHasChildNodes(self): dom = parseString("")