1from PyObjCTools.TestSupport import *
2import objc
3import sys
4
5NSObject = objc.lookUpClass('NSObject')
6#_NSZombie = objc.lookUpClass('_NSZombie')
7NSProxy = objc.lookUpClass('NSProxy')
8
9
10
11class MethodAccessTest (TestCase):
12
13    def testObjCObject(self):
14        # Trying to access the methods of objc.objc_object should not
15        # crash the interpreter.
16        self.assertRaises(AttributeError, getattr, objc.objc_object.pyobjc_classMethods, 'func_code')
17        self.assertRaises(AttributeError, getattr, objc.objc_object.pyobjc_instanceMethods, 'func_code')
18
19    def testNSProxyStuff(self):
20        # NSProxy is incompatitble with pyobjc_{class,instance}Methods, but
21        # this should not crash the interpreter
22        self.assertRaises(AttributeError, getattr, NSProxy.pyobjc_instanceMethods, 'foobar')
23        self.assertRaises(AttributeError, getattr, NSProxy.pyobjc_classMethods, 'foobar')
24        self.assertRaises(AttributeError, getattr, NSProxy, 'foobar')
25#
26#    if sys.platform == 'darwin':
27#        def testNSZombie(self):
28#            self.assertRaises(AttributeError, getattr, _NSZombie.pyobjc_instanceMethods, "foobar")
29#            self.assertRaises(AttributeError, getattr, _NSZombie.pyobjc_classMethods, "foobar")
30#            self.assertRaises(AttributeError, getattr, _NSZombie, "foobar")
31#
32
33    def testDir(self):
34        o = NSObject.new()
35
36        d = dir(o.pyobjc_instanceMethods)
37        self.assert_(len(d) > 10)
38        self.assert_("init" in d)
39
40        #d = dir(o.pyobjc_classMethods)
41        #self.assert_(len(d) > 10)
42        #self.assert_("alloc" in d)
43
44        d = dir(NSObject.pyobjc_classMethods)
45        self.assert_(len(d) > 10)
46        self.assert_("alloc" in d)
47
48    def testDict(self):
49        o = NSObject.new()
50
51        d = o.pyobjc_instanceMethods.__dict__.keys()
52        self.assert_(len(d) > 10)
53        self.assert_("init" in d)
54
55        d = NSObject.pyobjc_classMethods.__dict__.keys()
56        self.assert_(len(d) > 10)
57        self.assert_("alloc" in d)
58
59        #d = o.pyobjc_classMethods.__dict__.keys()
60        #self.assert_(len(d) > 10)
61        #self.assert_("alloc" in d)
62
63    def testAttributes(self):
64        o = NSObject.new()
65
66        self.assert_(hasattr(o.pyobjc_instanceMethods, "init"))
67        #self.assert_(hasattr(o.pyobjc_classMethods, "alloc"))
68
69        self.assert_(hasattr(NSObject.pyobjc_classMethods, "alloc"))
70
71class ClassAndInstanceMethods(TestCase):
72    def testClassThroughInstance(self):
73        # Class methods are not accessible through instances.
74        self.assertRaises(AttributeError, getattr, NSObject.new(), 'alloc')
75
76if __name__ == "__main__":
77    main()
78