1"""
2Check if we manage retainCounts correctly.
3"""
4from PyObjCTools.TestSupport import *
5import objc, gc
6from PyObjCTest.fnd import *
7
8LeaksDel = 0
9
10class LeaksClass (NSObject):
11    def init(self):
12        self = super(LeaksClass, self).init()
13        return self
14
15    def __del__(self):
16        global LeaksDel
17
18        LeaksDel = 1
19
20class SlottedClass (NSObject):
21    __slots__ = ('slot1',)
22
23    def init(self):
24        NSObject.pyobjc_instanceMethods.init(self)
25        self.slot1 = LeaksClass.alloc().init()
26        return self
27
28class MemberClass (NSObject):
29
30    def init(self):
31        self = NSObject.pyobjc_instanceMethods.init(self)
32        self.slot1 = LeaksClass.alloc().init()
33        return self
34
35class TestRetains(TestCase):
36    def testPyClass(self):
37
38        global LeaksDel
39
40        LeaksDel = 0
41        self.assertEquals(LeaksDel, 0)
42
43        o = LeaksClass.alloc().init()
44        self.assertIsNotNone(o)
45        self.assertEquals(LeaksDel, 0)
46        del o
47        self.assertEquals(LeaksDel, 1)
48
49    def testOCClass1(self):
50        global LeaksDel
51
52        LeaksDel = 0
53        self.assertEquals(LeaksDel, 0)
54        pool = NSAutoreleasePool.alloc().init()
55        c = NSMutableArray.arrayWithArray_([ LeaksClass.alloc().init() ])
56        del pool
57
58        pool = NSAutoreleasePool.alloc().init()
59        self.assertIsNotNone(c)
60        self.assertEquals(LeaksDel, 0)
61        del c
62        del pool
63        self.assertEquals(LeaksDel, 1)
64
65    def testOCClass2(self):
66        global LeaksDel
67
68        LeaksDel = 0
69        self.assertEquals(LeaksDel, 0)
70        pool = NSAutoreleasePool.alloc().init()
71        c = NSMutableArray.alloc()
72        c = c.initWithArray_(
73            [ LeaksClass.alloc().init() ])
74        del pool
75
76        pool = NSAutoreleasePool.alloc().init()
77        self.assertIsNotNone(c)
78        self.assertEquals(LeaksDel, 0)
79        del c
80        del pool
81        self.assertEquals(LeaksDel, 1)
82
83    def testSlots(self):
84        global LeaksDel
85
86        LeaksDel = 0
87        pool = NSAutoreleasePool.alloc().init()
88
89        o = SlottedClass.alloc().init()
90        self.assertEquals(LeaksDel, 0)
91        del o
92        del pool
93        self.assertEquals(LeaksDel, 1)
94
95    def testMembers(self):
96        global LeaksDel
97
98        LeaksDel = 0
99        pool = NSAutoreleasePool.alloc().init()
100
101        o = MemberClass.alloc().init()
102        self.assertEquals(LeaksDel, 0)
103        del o
104        del pool
105        gc.collect()
106        self.assertEquals(LeaksDel, 1)
107
108
109
110if __name__ == '__main__':
111    main()
112