1"""
2Test handling of the private typecodes:
3    _C_NSBOOL, _C_CHAR_AS_INT, _C_CHAR_AS_TEXT and _C_UNICHAR
4
5These typecodes don't actually exists in the ObjC runtime but
6are private to PyObjC. We use these to simplify the bridge code
7while at the same time getting a higher fidelity bridge.
8
9These tests ensure that private type codes don't leak into the Objective-C runtime.
10"""
11import weakref
12from PyObjCTools.TestSupport import *
13from PyObjCTest.fnd import NSObject
14
15from PyObjCTest.specialtypecodes import *
16
17class TestTypeCodeLeaks (TestCase):
18    def testSimpleTypes(self):
19        class OC_TestTypeCodeLeaks_Result (NSObject):
20
21            def myBOOLResult(self):
22                return True
23            myBOOLResult = objc.selector(myBOOLResult, signature=objc._C_NSBOOL + '@:')
24
25            def myInt8Result(self):
26                return True
27            myInt8Result = objc.selector(myInt8Result, signature=objc._C_CHAR_AS_INT + '@:')
28
29            def myByteResult(self):
30                return True
31            myByteResult = objc.selector(myByteResult, signature=objc._C_CHAR_AS_TEXT + '@:')
32
33            def myUniCharResult(self):
34                return True
35            myUniCharResult = objc.selector(myUniCharResult, signature=objc._C_UNICHAR + '@:')
36
37            def myUniStrResult(self):
38                return True
39            myUniStrResult = objc.selector(myUniStrResult, signature=objc._C_PTR + objc._C_UNICHAR + '@:')
40
41
42        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myBOOLResult.signature)
43        csig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myBOOLResult.native_signature)
44        self.assertEquals(pysig[0], objc._C_NSBOOL)
45        self.assertEquals(csig[0], objc._C_CHR)
46
47        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myInt8Result.signature)
48        csig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myInt8Result.native_signature)
49        self.assertEquals(pysig[0], objc._C_CHAR_AS_INT)
50        self.assertEquals(csig[0], objc._C_CHR)
51
52        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myByteResult.signature)
53        csig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myByteResult.native_signature)
54        self.assertEquals(pysig[0], objc._C_CHAR_AS_TEXT)
55        self.assertEquals(csig[0], objc._C_CHR)
56
57        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myUniCharResult.signature)
58        csig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myUniCharResult.native_signature)
59        self.assertEquals(pysig[0], objc._C_UNICHAR)
60        self.assertEquals(csig[0], objc._C_SHT)
61
62        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myUniStrResult.signature)
63        csig = objc.splitSignature(OC_TestTypeCodeLeaks_Result.myUniStrResult.native_signature)
64        self.assertEquals(pysig[0], objc._C_PTR + objc._C_UNICHAR)
65        self.assertEquals(csig[0], objc._C_PTR + objc._C_SHT)
66
67    def testByRefIn(self):
68        class OC_TestTypeCodeLeaks_RefIn (NSObject):
69
70            def myBOOLArg_(self, arg):
71                pass
72            myBOOLArg_ = objc.selector(myBOOLArg_, signature='v@:' + objc._C_IN + objc._C_PTR + objc._C_NSBOOL)
73
74            def myInt8Arg_(self, arg):
75                pass
76            myInt8Arg_ = objc.selector(myInt8Arg_, signature='v@:' + objc._C_IN + objc._C_PTR + objc._C_CHAR_AS_INT)
77
78            def myByteArg_(self, arg):
79                pass
80            myByteArg_ = objc.selector(myByteArg_, signature='v@:' + objc._C_IN + objc._C_PTR + objc._C_CHAR_AS_TEXT)
81
82            def myUniCharArg_(self, arg):
83                pass
84            myUniCharArg_ = objc.selector(myUniCharArg_, signature='v@:' + objc._C_IN + objc._C_PTR + objc._C_UNICHAR)
85
86
87        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefIn.myBOOLArg_.signature)
88        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefIn.myBOOLArg_.native_signature)
89        self.assertEquals(pysig[3], objc._C_IN + objc._C_PTR + objc._C_NSBOOL)
90        self.assertEquals(csig[3], objc._C_IN + objc._C_PTR + objc._C_CHR)
91
92        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefIn.myInt8Arg_.signature)
93        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefIn.myInt8Arg_.native_signature)
94        self.assertEquals(pysig[3], objc._C_IN + objc._C_PTR + objc._C_CHAR_AS_INT)
95        self.assertEquals(csig[3], objc._C_IN + objc._C_PTR + objc._C_CHR)
96
97        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefIn.myByteArg_.signature)
98        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefIn.myByteArg_.native_signature)
99        self.assertEquals(pysig[3], objc._C_IN + objc._C_PTR + objc._C_CHAR_AS_TEXT)
100        self.assertEquals(csig[3], objc._C_IN + objc._C_PTR + objc._C_CHR)
101
102        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefIn.myUniCharArg_.signature)
103        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefIn.myUniCharArg_.native_signature)
104        self.assertEquals(pysig[3], objc._C_IN + objc._C_PTR + objc._C_UNICHAR)
105        self.assertEquals(csig[3], objc._C_IN + objc._C_PTR + objc._C_SHT)
106
107    def testByRefInOut(self):
108        class OC_TestTypeCodeLeaks_RefInOut (NSObject):
109
110            def myBOOLArg_(self, arg):
111                pass
112            myBOOLArg_ = objc.selector(myBOOLArg_, signature='v@:' + objc._C_INOUT + objc._C_PTR + objc._C_NSBOOL)
113
114            def myInt8Arg_(self, arg):
115                pass
116            myInt8Arg_ = objc.selector(myInt8Arg_, signature='v@:' + objc._C_INOUT + objc._C_PTR + objc._C_CHAR_AS_INT)
117
118            def myByteArg_(self, arg):
119                pass
120            myByteArg_ = objc.selector(myByteArg_, signature='v@:' + objc._C_INOUT + objc._C_PTR + objc._C_CHAR_AS_TEXT)
121
122            def myUniCharArg_(self, arg):
123                pass
124            myUniCharArg_ = objc.selector(myUniCharArg_, signature='v@:' + objc._C_INOUT + objc._C_PTR + objc._C_UNICHAR)
125
126
127        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefInOut.myBOOLArg_.signature)
128        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefInOut.myBOOLArg_.native_signature)
129        self.assertEquals(pysig[3], objc._C_INOUT + objc._C_PTR + objc._C_NSBOOL)
130        self.assertEquals(csig[3], objc._C_INOUT + objc._C_PTR + objc._C_CHR)
131
132        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefInOut.myInt8Arg_.signature)
133        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefInOut.myInt8Arg_.native_signature)
134        self.assertEquals(pysig[3], objc._C_INOUT + objc._C_PTR + objc._C_CHAR_AS_INT)
135        self.assertEquals(csig[3], objc._C_INOUT + objc._C_PTR + objc._C_CHR)
136
137        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefInOut.myByteArg_.signature)
138        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefInOut.myByteArg_.native_signature)
139        self.assertEquals(pysig[3], objc._C_INOUT + objc._C_PTR + objc._C_CHAR_AS_TEXT)
140        self.assertEquals(csig[3], objc._C_INOUT + objc._C_PTR + objc._C_CHR)
141
142        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefInOut.myUniCharArg_.signature)
143        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefInOut.myUniCharArg_.native_signature)
144        self.assertEquals(pysig[3], objc._C_INOUT + objc._C_PTR + objc._C_UNICHAR)
145        self.assertEquals(csig[3], objc._C_INOUT + objc._C_PTR + objc._C_SHT)
146
147    def testByRefOut(self):
148        class OC_TestTypeCodeLeaks_RefOut (NSObject):
149
150            def myBOOLArg_(self, arg):
151                pass
152            myBOOLArg_ = objc.selector(myBOOLArg_, signature='v@:' + objc._C_OUT + objc._C_PTR + objc._C_NSBOOL)
153
154            def myInt8Arg_(self, arg):
155                pass
156            myInt8Arg_ = objc.selector(myInt8Arg_, signature='v@:' + objc._C_OUT + objc._C_PTR + objc._C_CHAR_AS_INT)
157
158            def myByteArg_(self, arg):
159                pass
160            myByteArg_ = objc.selector(myByteArg_, signature='v@:' + objc._C_OUT + objc._C_PTR + objc._C_CHAR_AS_TEXT)
161
162            def myUniCharArg_(self, arg):
163                pass
164            myUniCharArg_ = objc.selector(myUniCharArg_, signature='v@:' + objc._C_OUT + objc._C_PTR + objc._C_UNICHAR)
165
166
167        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefOut.myBOOLArg_.signature)
168        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefOut.myBOOLArg_.native_signature)
169        self.assertEquals(pysig[3], objc._C_OUT + objc._C_PTR + objc._C_NSBOOL)
170        self.assertEquals(csig[3], objc._C_OUT + objc._C_PTR + objc._C_CHR)
171
172        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefOut.myInt8Arg_.signature)
173        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefOut.myInt8Arg_.native_signature)
174        self.assertEquals(pysig[3], objc._C_OUT + objc._C_PTR + objc._C_CHAR_AS_INT)
175        self.assertEquals(csig[3], objc._C_OUT + objc._C_PTR + objc._C_CHR)
176
177        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefOut.myByteArg_.signature)
178        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefOut.myByteArg_.native_signature)
179        self.assertEquals(pysig[3], objc._C_OUT + objc._C_PTR + objc._C_CHAR_AS_TEXT)
180        self.assertEquals(csig[3], objc._C_OUT + objc._C_PTR + objc._C_CHR)
181
182        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefOut.myUniCharArg_.signature)
183        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefOut.myUniCharArg_.native_signature)
184        self.assertEquals(pysig[3], objc._C_OUT + objc._C_PTR + objc._C_UNICHAR)
185        self.assertEquals(csig[3], objc._C_OUT + objc._C_PTR + objc._C_SHT)
186
187    def testByRefConst(self):
188        class OC_TestTypeCodeLeaks_RefConst (NSObject):
189
190            def myBOOLArg_(self, arg):
191                pass
192            myBOOLArg_ = objc.selector(myBOOLArg_, signature='v@:' + objc._C_CONST + objc._C_PTR + objc._C_NSBOOL)
193
194            def myInt8Arg_(self, arg):
195                pass
196            myInt8Arg_ = objc.selector(myInt8Arg_, signature='v@:' + objc._C_CONST + objc._C_PTR + objc._C_CHAR_AS_INT)
197
198            def myByteArg_(self, arg):
199                pass
200            myByteArg_ = objc.selector(myByteArg_, signature='v@:' + objc._C_CONST + objc._C_PTR + objc._C_CHAR_AS_TEXT)
201
202            def myUniCharArg_(self, arg):
203                pass
204            myUniCharArg_ = objc.selector(myUniCharArg_, signature='v@:' + objc._C_CONST + objc._C_PTR + objc._C_UNICHAR)
205
206
207        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefConst.myBOOLArg_.signature)
208        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefConst.myBOOLArg_.native_signature)
209        self.assertEquals(pysig[3], objc._C_CONST + objc._C_PTR + objc._C_NSBOOL)
210        self.assertEquals(csig[3], objc._C_CONST + objc._C_PTR + objc._C_CHR)
211
212        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefConst.myInt8Arg_.signature)
213        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefConst.myInt8Arg_.native_signature)
214        self.assertEquals(pysig[3], objc._C_CONST + objc._C_PTR + objc._C_CHAR_AS_INT)
215        self.assertEquals(csig[3], objc._C_CONST + objc._C_PTR + objc._C_CHR)
216
217        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefConst.myByteArg_.signature)
218        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefConst.myByteArg_.native_signature)
219        self.assertEquals(pysig[3], objc._C_CONST + objc._C_PTR + objc._C_CHAR_AS_TEXT)
220        self.assertEquals(csig[3], objc._C_CONST + objc._C_PTR + objc._C_CHR)
221
222        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_RefConst.myUniCharArg_.signature)
223        csig = objc.splitSignature(OC_TestTypeCodeLeaks_RefConst.myUniCharArg_.native_signature)
224        self.assertEquals(pysig[3], objc._C_CONST + objc._C_PTR + objc._C_UNICHAR)
225        self.assertEquals(csig[3], objc._C_CONST + objc._C_PTR + objc._C_SHT)
226
227    def testInArrayDef(self):
228        class OC_TestTypeCodeLeaks_ArrayDef (NSObject):
229
230            def myBOOLArg_(self, arg):
231                pass
232            myBOOLArg_ = objc.selector(myBOOLArg_, signature='v@:' + objc._C_ARY_B + '4' + objc._C_NSBOOL + objc._C_ARY_E)
233
234            def myInt8Arg_(self, arg):
235                pass
236            myInt8Arg_ = objc.selector(myInt8Arg_, signature='v@:' + objc._C_ARY_B + '4' + objc._C_CHAR_AS_INT + objc._C_ARY_E)
237
238            def myByteArg_(self, arg):
239                pass
240            myByteArg_ = objc.selector(myByteArg_, signature='v@:' + objc._C_ARY_B + '4' + objc._C_CHAR_AS_TEXT + objc._C_ARY_E)
241
242            def myUniCharArg_(self, arg):
243                pass
244            myUniCharArg_ = objc.selector(myUniCharArg_, signature='v@:' + objc._C_ARY_B + '4' + objc._C_UNICHAR + objc._C_ARY_E)
245
246
247        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_ArrayDef.myBOOLArg_.signature)
248        csig = objc.splitSignature(OC_TestTypeCodeLeaks_ArrayDef.myBOOLArg_.native_signature)
249        self.assertEquals(pysig[3], objc._C_ARY_B + '4' + objc._C_NSBOOL + objc._C_ARY_E)
250        self.assertEquals(csig[3], objc._C_ARY_B + '4' + objc._C_CHR + objc._C_ARY_E)
251
252        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_ArrayDef.myInt8Arg_.signature)
253        csig = objc.splitSignature(OC_TestTypeCodeLeaks_ArrayDef.myInt8Arg_.native_signature)
254        self.assertEquals(pysig[3], objc._C_ARY_B + '4' + objc._C_CHAR_AS_INT + objc._C_ARY_E)
255        self.assertEquals(csig[3], objc._C_ARY_B + '4' + objc._C_CHR + objc._C_ARY_E)
256
257        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_ArrayDef.myByteArg_.signature)
258        csig = objc.splitSignature(OC_TestTypeCodeLeaks_ArrayDef.myByteArg_.native_signature)
259        self.assertEquals(pysig[3], objc._C_ARY_B + '4' + objc._C_CHAR_AS_TEXT + objc._C_ARY_E)
260        self.assertEquals(csig[3], objc._C_ARY_B + '4' + objc._C_CHR + objc._C_ARY_E)
261
262        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_ArrayDef.myUniCharArg_.signature)
263        csig = objc.splitSignature(OC_TestTypeCodeLeaks_ArrayDef.myUniCharArg_.native_signature)
264        self.assertEquals(pysig[3], objc._C_ARY_B + '4' + objc._C_UNICHAR + objc._C_ARY_E)
265        self.assertEquals(csig[3], objc._C_ARY_B + '4' + objc._C_SHT + objc._C_ARY_E)
266
267    def testInStructDef(self):
268        class OC_TestTypeCodeLeaks_StructDef (NSObject):
269
270            def myBOOLArg_(self, arg):
271                pass
272            myBOOLArg_ = objc.selector(myBOOLArg_, signature='v@:' + objc._C_STRUCT_B + 'test=' + objc._C_NSBOOL + objc._C_STRUCT_E)
273
274            def myInt8Arg_(self, arg):
275                pass
276            myInt8Arg_ = objc.selector(myInt8Arg_, signature='v@:' + objc._C_STRUCT_B + 'test=' + objc._C_CHAR_AS_INT + objc._C_STRUCT_E)
277
278            def myByteArg_(self, arg):
279                pass
280            myByteArg_ = objc.selector(myByteArg_, signature='v@:' + objc._C_STRUCT_B + 'test=' + objc._C_CHAR_AS_TEXT + objc._C_STRUCT_E)
281
282            def myUniCharArg_(self, arg):
283                pass
284            myUniCharArg_ = objc.selector(myUniCharArg_, signature='v@:' + objc._C_STRUCT_B + 'test=' + objc._C_UNICHAR + objc._C_STRUCT_E)
285
286
287        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_StructDef.myBOOLArg_.signature)
288        csig = objc.splitSignature(OC_TestTypeCodeLeaks_StructDef.myBOOLArg_.native_signature)
289        self.assertEquals(pysig[3], objc._C_STRUCT_B + 'test=' + objc._C_NSBOOL + objc._C_STRUCT_E)
290        self.assertEquals(csig[3], objc._C_STRUCT_B + 'test=' + objc._C_CHR + objc._C_STRUCT_E)
291
292        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_StructDef.myInt8Arg_.signature)
293        csig = objc.splitSignature(OC_TestTypeCodeLeaks_StructDef.myInt8Arg_.native_signature)
294        self.assertEquals(pysig[3], objc._C_STRUCT_B + 'test=' + objc._C_CHAR_AS_INT + objc._C_STRUCT_E)
295        self.assertEquals(csig[3], objc._C_STRUCT_B + 'test=' + objc._C_CHR + objc._C_STRUCT_E)
296
297        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_StructDef.myByteArg_.signature)
298        csig = objc.splitSignature(OC_TestTypeCodeLeaks_StructDef.myByteArg_.native_signature)
299        self.assertEquals(pysig[3], objc._C_STRUCT_B + 'test=' + objc._C_CHAR_AS_TEXT + objc._C_STRUCT_E)
300        self.assertEquals(csig[3], objc._C_STRUCT_B + 'test=' + objc._C_CHR + objc._C_STRUCT_E)
301
302        pysig = objc.splitSignature(OC_TestTypeCodeLeaks_StructDef.myUniCharArg_.signature)
303        csig = objc.splitSignature(OC_TestTypeCodeLeaks_StructDef.myUniCharArg_.native_signature)
304        self.assertEquals(pysig[3], objc._C_STRUCT_B + 'test=' + objc._C_UNICHAR + objc._C_STRUCT_E)
305        self.assertEquals(csig[3], objc._C_STRUCT_B + 'test=' + objc._C_SHT + objc._C_STRUCT_E)
306
307if __name__ == "__main__":
308    main()
309