]> granicus.if.org Git - python/commitdiff
Fix the tests of GC collection in ET.Element according to Benjamin's recommendations
authorEli Bendersky <eliben@gmail.com>
Sat, 31 Mar 2012 10:55:38 +0000 (13:55 +0300)
committerEli Bendersky <eliben@gmail.com>
Sat, 31 Mar 2012 10:55:38 +0000 (13:55 +0300)
Lib/test/test_xml_etree.py

index 00eafe1c86c58d9177a3b087aaf060e0882b5970..bd2a826014828ddb86b8485df618cd86dd3ad16b 100644 (file)
 # Don't re-import "xml.etree.ElementTree" module in the docstring,
 # except if the test is specific to the Python implementation.
 
-import gc
 import html
 import io
 import sys
 import unittest
+import weakref
 
 from test import support
-from test.support import findfile, import_fresh_module
+from test.support import findfile, import_fresh_module, gc_collect
 
 pyET = import_fresh_module('xml.etree.ElementTree', blocked=['_elementtree'])
 
@@ -1848,28 +1848,26 @@ class BasicElementTest(unittest.TestCase):
         self.assertRaises(TypeError, e.insert, 0, 'foo')
 
     def test_cyclic_gc(self):
-        class ShowGC:
-            def __init__(self, flaglist):
-                self.flaglist = flaglist
-            def __del__(self):
-                self.flaglist.append(1)
-
-        # Test the shortest cycle: lst->element->lst
-        fl = []
-        lst = [ShowGC(fl)]
-        lst.append(ET.Element('joe', attr=lst))
-        del lst
-        gc.collect()
-        self.assertEqual(fl, [1])
-
-        # A longer cycle: lst->e->e2->lst
-        fl = []
+        class Dummy:
+            pass
+
+        # Test the shortest cycle: d->element->d
+        d = Dummy()
+        d.dummyref = ET.Element('joe', attr=d)
+        wref = weakref.ref(d)
+        del d
+        gc_collect()
+        self.assertIsNone(wref())
+
+        # A longer cycle: d->e->e2->d
         e = ET.Element('joe')
-        lst = [ShowGC(fl), e]
-        e2 = ET.SubElement(e, 'foo', attr=lst)
-        del lst, e, e2
-        gc.collect()
-        self.assertEqual(fl, [1])
+        d = Dummy()
+        d.dummyref = e
+        wref = weakref.ref(d)
+        e2 = ET.SubElement(e, 'foo', attr=d)
+        del d, e, e2
+        gc_collect()
+        self.assertIsNone(wref())
 
 
 class ElementTreeTest(unittest.TestCase):