1""" 2Test some basic features of signature strings. 3""" 4from PyObjCTools.TestSupport import * 5import objc 6 7class PyOCTestTypeStr(TestCase): 8 def testSelectorSignatures(self): 9 10 self.assertIsInstance( 11 objc.selector(lambda x,y:1, signature=b"ii"), 12 objc.selector 13 ) 14 self.assertIsInstance( 15 objc.selector(lambda x,y:1, argumentTypes="ii"), 16 objc.selector 17 ) 18 self.assertIsInstance( 19 objc.selector(lambda x,y:1, 20 argumentTypes="ii", returnType="s"), 21 objc.selector 22 ) 23 24 self.assertRaises(ValueError, objc.selector, lambda x,y:1, 25 signature=b"FOOBAR") 26 27 self.assertRaises(TypeError, objc.selector, lambda x,y:1, 28 signature=b"@@", returnType="i") 29 self.assertRaises(TypeError, objc.selector, lambda x,y:1, 30 signature=b"@@", argumentTypes="ii") 31 32 self.assertRaises(ValueError, objc.selector, lambda x,y:1, 33 argumentTypes="iX") 34 self.assertRaises(ValueError, objc.selector, lambda x,y:1, 35 returnType="X") 36 37 def testArgumentTypesPythonStyle(self): 38 # Check that argumentTypes + returnType is correctly converted to 39 # a signature 40 41 s = objc.selector(lambda self: None, argumentTypes='ii', returnType='i') 42 self.assertEqual(s.signature, b'i@:ii') 43 44 s = objc.selector(lambda self: None, argumentTypes='Oi', returnType='i') 45 self.assertEqual(s.signature, b'i@:@i') 46 47 s = objc.selector(lambda self: None, argumentTypes='', returnType='l') 48 self.assertEqual(s.signature, objc._C_LNG + b'@:') 49 50 s = objc.selector(lambda self: None, argumentTypes='', returnType='f') 51 self.assertEqual(s.signature, objc._C_FLT + b'@:') 52 53 s = objc.selector(lambda self: None, argumentTypes='', returnType='d') 54 self.assertEqual(s.signature, objc._C_DBL + b'@:') 55 56 s = objc.selector(lambda self: None, argumentTypes='', returnType='i') 57 self.assertEqual(s.signature, objc._C_INT + b'@:') 58 59 s = objc.selector(lambda self: None, argumentTypes='', returnType='s') 60 self.assertEqual(s.signature, b'@@:') 61 62 s = objc.selector(lambda self: None, argumentTypes='', returnType='S') 63 self.assertEqual(s.signature, b'@@:') 64 65 s = objc.selector(lambda self: None, argumentTypes='', returnType='z') 66 self.assertEqual(s.signature, b'@@:') 67 68 s = objc.selector(lambda self: None, argumentTypes='zbhilcfdO', returnType='z') 69 self.assertEqual(s.signature, b'@@:@csilcfd@') 70 71 72 def testAll(self): 73 self.assertEqual(objc._C_BOOL, b"B") 74 self.assertEqual(objc._C_ID, b"@") 75 self.assertEqual(objc._C_CLASS, b"#") 76 self.assertEqual(objc._C_SEL, b":") 77 self.assertEqual(objc._C_CHR, b"c") 78 self.assertEqual(objc._C_UCHR, b"C") 79 self.assertEqual(objc._C_SHT, b"s") 80 self.assertEqual(objc._C_USHT, b"S") 81 self.assertEqual(objc._C_INT, b"i") 82 self.assertEqual(objc._C_UINT, b"I") 83 self.assertEqual(objc._C_LNG, b"l") 84 self.assertEqual(objc._C_ULNG, b"L") 85 self.assertEqual(objc._C_LNG_LNG, b"q") 86 self.assertEqual(objc._C_ULNG_LNG, b"Q") 87 self.assertEqual(objc._C_FLT, b"f") 88 self.assertEqual(objc._C_DBL, b"d") 89 self.assertEqual(objc._C_VOID, b"v") 90 self.assertEqual(objc._C_CHARPTR, b"*") 91 self.assertEqual(objc._C_PTR, b"^") 92 self.assertEqual(objc._C_UNDEF, b"?") 93 self.assertEqual(objc._C_ARY_B, b"[") 94 self.assertEqual(objc._C_ARY_E, b"]") 95 self.assertEqual(objc._C_UNION_B, b"(") 96 self.assertEqual(objc._C_UNION_E, b")") 97 self.assertEqual(objc._C_STRUCT_B, b"{") 98 self.assertEqual(objc._C_STRUCT_E, b"}") 99 self.assertEqual(objc._C_IN, b"n") 100 self.assertEqual(objc._C_OUT, b"o") 101 self.assertEqual(objc._C_INOUT, b"N") 102 103 def testNativeSignature(self): 104 s = objc.selector(lambda x,y:1, signature=b"ii") 105 self.assertEqual(s.native_signature, b"ii") 106 107 self.assertRaises((TypeError, AttributeError), setattr, s, 'native_signature', b'v@:ii') 108 109 s = objc.lookUpClass('NSObject').description 110 self.assertRaises((TypeError, AttributeError), setattr, s, 'native_signature', b'v@:ii') 111 112 # We know that the description signature isn't changed by default 113 self.assertEqual(s.signature, s.native_signature) 114 115 # Check that changing s.signature doesn't affect s.native_signature 116 try: 117 x = s.signature 118 s.signature = b'v@:ii' 119 self.assertEqual(s.native_signature, x) 120 self.assertEqual(s.signature, b'v@:ii') 121 finally: 122 s.signature = x 123 124 125if __name__ == '__main__': 126 main() 127