1from PyObjCTools.TestSupport import *
2import objc
3
4class hidden_method (object):
5    def __pyobjc_class_setup__(self, name, class_dict, instance_methods, class_methods):
6        @objc.selector
7        def method(self):
8            return 42
9
10        method.isHidden = True
11
12        def clsmethod(self):
13            return 99
14        clsmethod=objc.selector(clsmethod, isClassMethod=True)
15        clsmethod.isHidden = True
16
17        instance_methods.add(method)
18        class_methods.add(clsmethod)
19
20
21
22class OCTestHidden (objc.lookUpClass('NSObject')):
23    m = hidden_method()
24
25    @objc.selector
26    def body(self):
27        return "BODY"
28    body.isHidden = True
29
30
31    def bodyclass(self):
32        return "BODYCLASS"
33    bodyclass=objc.selector(bodyclass, isClassMethod=True)
34    bodyclass.isHidden=True
35
36    @objc.selector
37    def somebody(self):
38        return "instance"
39    somebody.isHidden = True
40
41    def boolMethod(self):
42        return 1
43    boolMethod = objc.selector(boolMethod, signature=objc._C_NSBOOL + b'@:')
44    boolMethod.isHidden = True
45
46class OCTestSubHidden (OCTestHidden):
47    def body(self):
48        return "BODY2"
49
50    @classmethod
51    def bodyclass(self):
52        return "BODYCLASS2"
53
54    @classmethod
55    def somebody(self):
56        return "class"
57
58    def boolMethod(self):
59        return 0
60
61class TestHiddenSelector (TestCase):
62    def testHiddenInClassDef(self):
63        o = OCTestHidden.alloc().init()
64        self.assertRaises(AttributeError, getattr, o, 'body')
65
66        v = o.performSelector_(b'body')
67        self.assertEqual(v, "BODY")
68
69        v = o.pyobjc_instanceMethods.body()
70        self.assertEqual(v, "BODY")
71
72        self.assertRaises(AttributeError, getattr, OCTestHidden, 'bodyclass')
73        v = OCTestHidden.performSelector_(b'bodyclass')
74        self.assertEqual(v, "BODYCLASS")
75
76        v = OCTestHidden.pyobjc_classMethods.bodyclass()
77        self.assertEqual(v, "BODYCLASS")
78
79        o = OCTestHidden.alloc().init()
80        self.assertRaises(AttributeError, getattr, o, 'boolMethod')
81        v = o.pyobjc_instanceMethods.boolMethod()
82        self.assertIs(v, True)
83
84
85    def testHiddenInSetupHook(self):
86        o = OCTestHidden.alloc().init()
87
88        # Instance method
89        self.assertRaises(AttributeError, getattr, o, 'method')
90
91        v = o.performSelector_(b'method')
92        self.assertEqual(v, 42)
93
94        v = o.pyobjc_instanceMethods.method()
95        self.assertEqual(v, 42)
96
97        # Class method
98        self.assertRaises(AttributeError, getattr, OCTestHidden, 'clsmethod')
99
100        v = OCTestHidden.performSelector_(b'clsmethod')
101        self.assertEqual(v, 99)
102
103        v = OCTestHidden.pyobjc_classMethods.clsmethod()
104        self.assertEqual(v, 99)
105
106
107    def testHiddenAddMethods(self):
108
109        @objc.selector
110        def addedmethod(self):
111            return "NEW"
112        addedmethod.isHidden = True
113
114        def addedclass(self):
115            return "NEWCLASS"
116        addedclass=objc.selector(addedclass, isClassMethod=True)
117        addedclass.isHidden=True
118
119        objc.classAddMethods(OCTestHidden, [addedmethod, addedclass])
120
121        o = OCTestHidden.alloc().init()
122
123        # Instance method
124        self.assertRaises(AttributeError, getattr, o, 'addedmethod')
125
126        v = o.performSelector_(b'addedmethod')
127        self.assertEqual(v, "NEW")
128
129        v = o.pyobjc_instanceMethods.addedmethod()
130        self.assertEqual(v, "NEW")
131
132        # Class method
133        self.assertRaises(AttributeError, getattr, OCTestHidden, 'addedclass')
134
135        v = OCTestHidden.performSelector_(b'addedclass')
136        self.assertEqual(v, "NEWCLASS")
137
138        v = OCTestHidden.pyobjc_classMethods.addedclass()
139        self.assertEqual(v, "NEWCLASS")
140
141    def testClassVsInstance(self):
142        o = OCTestHidden.alloc().init()
143        self.assertRaises(AttributeError, getattr, o, "sombody")
144        v = o.performSelector_(b'somebody')
145        self.assertEqual(v, "instance")
146
147        v = OCTestSubHidden.somebody()
148        self.assertEqual(v, "class")
149
150    def testHiddenInSubClass(self):
151
152        # Instance
153        o = OCTestSubHidden.alloc().init()
154        self.assertRaises(AttributeError, getattr, o, "body")
155        v = o.performSelector_(b'body')
156        self.assertEqual(v, "BODY2")
157
158        @objc.selector
159        def subclassbody(self):
160            return "base"
161        subclassbody.isHidden = True
162
163        @objc.selector
164        def subclassbody2(self):
165            return "base2"
166        subclassbody.isHidden = True
167
168        objc.classAddMethods(OCTestHidden, [subclassbody, subclassbody2])
169
170
171        @objc.selector
172        def subclassbody(self):
173            return "sub"
174
175        @objc.selector
176        def subclassbody2(self):
177            return "sub2"
178
179        objc.classAddMethods(OCTestSubHidden, [subclassbody])
180        self.assertRaises(AttributeError, getattr, o, "subclassbody")
181        v = o.performSelector_(b'subclassbody')
182        self.assertEqual(v, "sub")
183
184        OCTestSubHidden.subclassbody2 = subclassbody2
185        #self.assertRaises(AttributeError, getattr, o, "subclassbody2")
186        v = o.performSelector_(b'subclassbody2')
187        self.assertEqual(v, "sub2")
188
189        self.assertRaises(AttributeError, getattr, o, 'boolMethod')
190        v = o.pyobjc_instanceMethods.boolMethod()
191        self.assertIs(v, False)
192
193        # Class
194        self.assertRaises(AttributeError, getattr, OCTestSubHidden, 'bodyclass')
195        v = OCTestSubHidden.performSelector_(b'bodyclass')
196        self.assertEqual(v, "BODYCLASS2")
197
198if __name__ == "__main__":
199    main()
200