Fix the tests of GC collection in ET.Element according to Benjamin's recommendations

This commit is contained in:
Eli Bendersky 2012-03-31 13:55:38 +03:00
parent c6897854f8
commit a5e822045c

View file

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