blob: e2e6d0c8be16d872c765ebcf354db81645b05a8e [file] [log] [blame]
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001import gc
2
3def test_list():
4 l = []
5 l.append(l)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00006 gc.collect()
7 del l
8 assert gc.collect() == 1
9
10def test_dict():
11 d = {}
12 d[1] = d
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000013 gc.collect()
14 del d
15 assert gc.collect() == 1
16
17def test_tuple():
Neil Schemenauera53cf792000-09-15 22:32:29 +000018 # since tuples are immutable we close the loop with a list
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000019 l = []
20 t = (l,)
21 l.append(t)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000022 gc.collect()
23 del t
24 del l
25 assert gc.collect() == 2
26
27def test_class():
28 class A:
29 pass
30 A.a = A
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000031 gc.collect()
32 del A
33 assert gc.collect() > 0
34
35def test_instance():
36 class A:
37 pass
38 a = A()
39 a.a = a
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000040 gc.collect()
41 del a
42 assert gc.collect() > 0
43
44def test_method():
Neil Schemenauera53cf792000-09-15 22:32:29 +000045 # Tricky: self.__init__ is a bound method, it references the instance.
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000046 class A:
47 def __init__(self):
48 self.init = self.__init__
49 a = A()
50 gc.collect()
51 del a
52 assert gc.collect() > 0
53
54def test_finalizer():
Neil Schemenauera53cf792000-09-15 22:32:29 +000055 # A() is uncollectable if it is part of a cycle, make sure it shows up
56 # in gc.garbage.
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000057 class A:
58 def __del__(self): pass
59 class B:
60 pass
61 a = A()
62 a.a = a
63 id_a = id(a)
64 b = B()
65 b.b = b
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000066 gc.collect()
67 gc.garbage[:] = []
68 del a
69 del b
70 assert gc.collect() > 0
71 assert id(gc.garbage[0]) == id_a
72
73def test_function():
Neil Schemenauera53cf792000-09-15 22:32:29 +000074 # Tricky: f -> d -> f, code should call d.clear() after the exec to
75 # break the cycle.
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000076 d = {}
77 exec("def f(): pass\n") in d
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000078 gc.collect()
79 del d
80 assert gc.collect() == 2
81
Neil Schemenauera53cf792000-09-15 22:32:29 +000082def test_del():
83 # __del__ methods can trigger collection, make this to happen
84 thresholds = gc.get_threshold()
85 gc.enable()
86 gc.set_threshold(1)
87
88 class A:
89 def __del__(self):
90 dir(self)
91 a = A()
92 del a
93
94 gc.disable()
95 apply(gc.set_threshold, thresholds)
96
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000097
98def test_all():
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +000099
100 enabled = gc.isenabled()
101 gc.disable()
102 assert not gc.isenabled()
103
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000104 test_list()
105 test_dict()
106 test_tuple()
107 test_class()
108 test_instance()
109 test_method()
110 test_finalizer()
111 test_function()
Neil Schemenauera53cf792000-09-15 22:32:29 +0000112 test_del()
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000113
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000114 # test gc.enable() even if GC is disabled by default
115 gc.enable()
116 assert gc.isenabled()
117 if not enabled:
118 gc.disable()
119
120
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000121test_all()