]> granicus.if.org Git - python/commitdiff
bpo-32424: Improve test coverage for xml.etree.ElementTree (GH-12891)
authorGordon P. Hemsley <me@gphemsley.org>
Sun, 28 Apr 2019 04:41:43 +0000 (00:41 -0400)
committerStefan Behnel <stefan_ml@behnel.de>
Sun, 28 Apr 2019 04:41:43 +0000 (06:41 +0200)
* Fix typo in test_cyclic_gc subtest
* Improve test coverage for xml.etree.ElementTree

Lib/test/test_xml_etree.py
Misc/ACKS
Misc/NEWS.d/next/Tests/2019-04-21-17-53-50.bpo-32424.Q4rBmn.rst [new file with mode: 0644]
Misc/NEWS.d/next/Tests/2019-04-21-17-55-18.bpo-32424.yDy49h.rst [new file with mode: 0644]

index 14ce32af802624181741bd9bf376aad5f896ee11..e0d2cb7b9952313cdc7cb6792865f11b69cd0e70 100644 (file)
@@ -9,6 +9,7 @@ import copy
 import functools
 import html
 import io
+import itertools
 import locale
 import operator
 import pickle
@@ -1929,6 +1930,88 @@ class BugsTest(unittest.TestCase):
 
 
 class BasicElementTest(ElementTestCase, unittest.TestCase):
+
+    def test___init__(self):
+        tag = "foo"
+        attrib = { "zix": "wyp" }
+
+        element_foo = ET.Element(tag, attrib)
+
+        # traits of an element
+        self.assertIsInstance(element_foo, ET.Element)
+        self.assertIn("tag", dir(element_foo))
+        self.assertIn("attrib", dir(element_foo))
+        self.assertIn("text", dir(element_foo))
+        self.assertIn("tail", dir(element_foo))
+
+        # string attributes have expected values
+        self.assertEqual(element_foo.tag, tag)
+        self.assertIsNone(element_foo.text)
+        self.assertIsNone(element_foo.tail)
+
+        # attrib is a copy
+        self.assertIsNot(element_foo.attrib, attrib)
+        self.assertEqual(element_foo.attrib, attrib)
+
+        # attrib isn't linked
+        attrib["bar"] = "baz"
+        self.assertIsNot(element_foo.attrib, attrib)
+        self.assertNotEqual(element_foo.attrib, attrib)
+
+    def test___copy__(self):
+        element_foo = ET.Element("foo", { "zix": "wyp" })
+        element_foo.append(ET.Element("bar", { "baz": "qix" }))
+
+        element_foo2 = copy.copy(element_foo)
+
+        # elements are not the same
+        self.assertIsNot(element_foo2, element_foo)
+
+        # string attributes are equal
+        self.assertEqual(element_foo2.tag, element_foo.tag)
+        self.assertEqual(element_foo2.text, element_foo.text)
+        self.assertEqual(element_foo2.tail, element_foo.tail)
+
+        # number of children is the same
+        self.assertEqual(len(element_foo2), len(element_foo))
+
+        # children are the same
+        for (child1, child2) in itertools.zip_longest(element_foo, element_foo2):
+            self.assertIs(child1, child2)
+
+        # attrib is a copy
+        self.assertEqual(element_foo2.attrib, element_foo.attrib)
+
+    def test___deepcopy__(self):
+        element_foo = ET.Element("foo", { "zix": "wyp" })
+        element_foo.append(ET.Element("bar", { "baz": "qix" }))
+
+        element_foo2 = copy.deepcopy(element_foo)
+
+        # elements are not the same
+        self.assertIsNot(element_foo2, element_foo)
+
+        # string attributes are equal
+        self.assertEqual(element_foo2.tag, element_foo.tag)
+        self.assertEqual(element_foo2.text, element_foo.text)
+        self.assertEqual(element_foo2.tail, element_foo.tail)
+
+        # number of children is the same
+        self.assertEqual(len(element_foo2), len(element_foo))
+
+        # children are not the same
+        for (child1, child2) in itertools.zip_longest(element_foo, element_foo2):
+            self.assertIsNot(child1, child2)
+
+        # attrib is a copy
+        self.assertIsNot(element_foo2.attrib, element_foo.attrib)
+        self.assertEqual(element_foo2.attrib, element_foo.attrib)
+
+        # attrib isn't linked
+        element_foo.attrib["bar"] = "baz"
+        self.assertIsNot(element_foo2.attrib, element_foo.attrib)
+        self.assertNotEqual(element_foo2.attrib, element_foo.attrib)
+
     def test_augmentation_type_errors(self):
         e = ET.Element('joe')
         self.assertRaises(TypeError, e.append, 'b')
@@ -1984,9 +2067,9 @@ class BasicElementTest(ElementTestCase, unittest.TestCase):
         e1 = ET.Element('e1')
         e2 = ET.Element('e2')
         e3 = ET.Element('e3')
-        e1.append(e2)
-        e2.append(e2)
         e3.append(e1)
+        e2.append(e3)
+        e1.append(e2)
         wref = weakref.ref(e1)
         del e1, e2, e3
         gc_collect()
index 393ea205ac1d769bbf8376caa7ed33e359a8658c..300e788940787e657a1aab58e9ed53e3e78fbd63 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -647,6 +647,7 @@ Christian Heimes
 Thomas Heller
 Malte Helmert
 Lance Finn Helsten
+Gordon P. Hemsley
 Jonathan Hendry
 Nathan Henrie
 Michael Henry
diff --git a/Misc/NEWS.d/next/Tests/2019-04-21-17-53-50.bpo-32424.Q4rBmn.rst b/Misc/NEWS.d/next/Tests/2019-04-21-17-53-50.bpo-32424.Q4rBmn.rst
new file mode 100644 (file)
index 0000000..f057d7e
--- /dev/null
@@ -0,0 +1,2 @@
+Fix typo in test_cyclic_gc() test for xml.etree.ElementTree. Patch by Gordon
+P. Hemsley.
diff --git a/Misc/NEWS.d/next/Tests/2019-04-21-17-55-18.bpo-32424.yDy49h.rst b/Misc/NEWS.d/next/Tests/2019-04-21-17-55-18.bpo-32424.yDy49h.rst
new file mode 100644 (file)
index 0000000..bb0839f
--- /dev/null
@@ -0,0 +1 @@
+Improve test coverage for xml.etree.ElementTree. Patch by Gordon P. Hemsley.