summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_gc.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_gc.py')
-rw-r--r--Lib/test/test_gc.py100
1 files changed, 100 insertions, 0 deletions
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
new file mode 100644
index 0000000..72253f4
--- /dev/null
+++ b/Lib/test/test_gc.py
@@ -0,0 +1,100 @@
+import gc
+
+def test_list():
+ l = []
+ l.append(l)
+ print 'list 0x%x' % id(l)
+ gc.collect()
+ del l
+ assert gc.collect() == 1
+
+def test_dict():
+ d = {}
+ d[1] = d
+ print 'dict 0x%x' % id(d)
+ gc.collect()
+ del d
+ assert gc.collect() == 1
+
+def test_tuple():
+ l = []
+ t = (l,)
+ l.append(t)
+ print 'list 0x%x' % id(l)
+ print 'tuple 0x%x' % id(t)
+ gc.collect()
+ del t
+ del l
+ assert gc.collect() == 2
+
+def test_class():
+ class A:
+ pass
+ A.a = A
+ print 'class 0x%x' % id(A)
+ gc.collect()
+ del A
+ assert gc.collect() > 0
+
+def test_instance():
+ class A:
+ pass
+ a = A()
+ a.a = a
+ print repr(a)
+ gc.collect()
+ del a
+ assert gc.collect() > 0
+
+def test_method():
+ class A:
+ def __init__(self):
+ self.init = self.__init__
+ a = A()
+ gc.collect()
+ del a
+ assert gc.collect() > 0
+
+def test_finalizer():
+ class A:
+ def __del__(self): pass
+ class B:
+ pass
+ a = A()
+ a.a = a
+ id_a = id(a)
+ b = B()
+ b.b = b
+ print 'a', repr(a)
+ print 'b', repr(b)
+ gc.collect()
+ gc.garbage[:] = []
+ del a
+ del b
+ assert gc.collect() > 0
+ assert id(gc.garbage[0]) == id_a
+
+def test_function():
+ d = {}
+ exec("def f(): pass\n") in d
+ print 'dict 0x%x' % id(d)
+ print 'func 0x%x' % id(d['f'])
+ gc.collect()
+ del d
+ assert gc.collect() == 2
+
+
+def test_all():
+ debug = gc.get_debug()
+ gc.set_debug(gc.DEBUG_LEAK | gc.DEBUG_STATS)
+ test_list()
+ test_dict()
+ test_tuple()
+ test_class()
+ test_instance()
+ test_method()
+ test_finalizer()
+ test_function()
+ gc.set_debug(debug)
+
+test_all()