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