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