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.assertEqual(m.__metadata__()['retval']['already_retained'], cls.alloc.__metadata__()['retval']['already_retained'])
22        self.assertEqual(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.assertEqual(m.__metadata__()['retval']['already_retained'], cls.init.__metadata__()['retval']['already_retained'])
33        self.assertEqual(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.assertEqual(m.__metadata__()['retval']['already_retained'], cls.init.__metadata__()['retval']['already_retained'])
46        self.assertEqual(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.assertEqual(o.description(), o.methodForSelector_(b'description')(o))
55
56
57
58
59if __name__ == "__main__":
60    main()
61