1import objc 2from PyObjCTools.TestSupport import * 3 4NSObject = objc.lookUpClass('NSObject') 5 6 7class TestBasicIMP (TestCase): 8 # Test the basic functionality of IMP's. Imp's are basically unbound 9 # selectors if you look at the interface. The implementation refers to 10 # the actual functions that implements the method for calling the IMP 11 # instead of passing through the usual message sending machinery. 12 # 13 def testIMPType(self): 14 self.assertHasAttr(objc, "IMP") 15 16 def testAlloc(self): 17 cls = NSObject 18 m = cls.pyobjc_classMethods.methodForSelector_("alloc") 19 self.assertIsInstance(m, objc.IMP) 20 self.assertTrue(m.__metadata__()['classmethod']) 21 self.assertEquals(m.__metadata__()['retval']['already_retained'], cls.alloc.__metadata__()['retval']['already_retained']) 22 self.assertEquals(m.selector, b'alloc') 23 24 o = m(cls).init() 25 self.assertIsInstance(o, cls) 26 27 def testInit1(self): 28 cls = NSObject 29 m = cls.instanceMethodForSelector_("init") 30 self.assertIsInstance(m, objc.IMP) 31 self.assertFalse(m.__metadata__()['classmethod']) 32 self.assertEquals(m.__metadata__()['retval']['already_retained'], cls.init.__metadata__()['retval']['already_retained']) 33 self.assertEquals(m.selector, b'init') 34 35 o = m(cls.alloc()) 36 self.assertIsInstance(o, cls) 37 38 def testInit2(self): 39 cls = NSObject 40 o = cls.alloc().init() 41 42 m = o.methodForSelector_("init") 43 self.assertIsInstance(m, objc.IMP) 44 self.assertFalse(m.__metadata__()['classmethod']) 45 self.assertEquals(m.__metadata__()['retval']['already_retained'], cls.init.__metadata__()['retval']['already_retained']) 46 self.assertEquals(m.selector, b'init') 47 48 o = m(cls.alloc()) 49 self.assertIsInstance(o, cls) 50 51 def testDescription(self): 52 o = NSObject.alloc().init() 53 54 self.assertEquals(o.description(), o.methodForSelector_(b'description')(o)) 55 56 57 58 59if __name__ == "__main__": 60 main() 61