1""" 2Test handling of the private typecodes: _C_CHAR_AS_INT 3 4This typecode doesn't actually exists in the ObjC runtime but 5are private to PyObjC. We use these to simplify the bridge code 6while at the same time getting a higher fidelity bridge. 7 8- Add tests for calling methods from ObjC 9""" 10import weakref 11from PyObjCTest.fnd import NSObject 12from PyObjCTools.TestSupport import * 13 14from PyObjCTest.specialtypecodes import * 15import array 16 17def setupMetaData(): 18 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8Value", 19 dict( 20 retval=dict(type=objc._C_CHAR_AS_INT), 21 )) 22 23 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8Array", 24 dict( 25 retval=dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, c_array_of_fixed_length=4), 26 )) 27 28 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8String", 29 dict( 30 retval=dict(type=objc._C_PTR + objc._C_CHAR_AS_INT, c_array_delimited_by_null=True), 31 )) 32 33 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8StringArg:", 34 dict( 35 arguments={ 36 2: dict(type=objc._C_PTR + objc._C_CHAR_AS_INT, c_array_delimited_by_null=True, type_modifier=objc._C_IN), 37 } 38 )) 39 40 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8Arg:andint8Arg:", 41 dict( 42 arguments={ 43 2: dict(type=objc._C_CHAR_AS_INT), 44 3: dict(type=objc._C_CHAR_AS_INT), 45 } 46 )) 47 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOf4In:", 48 dict( 49 arguments={ 50 2: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_IN, c_array_of_fixed_length=4), 51 } 52 )) 53 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOf4Out:", 54 dict( 55 arguments={ 56 2: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_OUT, c_array_of_fixed_length=4), 57 } 58 )) 59 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOf4InOut:", 60 dict( 61 arguments={ 62 2: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_INOUT, c_array_of_fixed_length=4), 63 } 64 )) 65 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOfCount:In:", 66 dict( 67 arguments={ 68 3: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_IN, c_array_of_lenght_in_arg=2), 69 } 70 )) 71 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOfCount:Out:", 72 dict( 73 arguments={ 74 3: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_OUT, c_array_of_lenght_in_arg=2), 75 } 76 )) 77 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOfCount:InOut:", 78 dict( 79 arguments={ 80 3: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_INOUT, c_array_of_lenght_in_arg=2), 81 } 82 )) 83 84 85setupMetaData() 86 87class TestTypeCode_int8 (TestCase): 88 def testReturnValue(self): 89 o = OC_TestSpecialTypeCode.alloc().init() 90 91 self.assertEqual(o.int8Value(), 1) 92 self.assertEqual(o.int8Value(), 2) 93 self.assertEqual(o.int8Value(), 3) 94 self.assertEqual(o.int8Value(), 4) 95 96 def testReturnValueArray(self): 97 o = OC_TestSpecialTypeCode.alloc().init() 98 99 v = o.int8Array() 100 self.assertEqual(len(v), 4) 101 self.assertEqual(v[0], 100) 102 self.assertEqual(v[1], -56) 103 self.assertEqual(v[2], -106) 104 self.assertEqual(v[3], 99) 105 106 def testReturnValueString(self): 107 o = OC_TestSpecialTypeCode.alloc().init() 108 109 v = o.int8String() 110 self.assertIsInstance(v, (list, tuple)) 111 self.assertEqual(len(v), 5) 112 self.assertEqual(v[0], ord("h")) 113 self.assertEqual(v[1], ord("e")) 114 self.assertEqual(v[2], ord("l")) 115 self.assertEqual(v[3], ord("l")) 116 self.assertEqual(v[4], ord("o")) 117 118 def testSimpleArg(self): 119 o = OC_TestSpecialTypeCode.alloc().init() 120 121 v = o.int8Arg_andint8Arg_(44, 127) 122 self.assertEqual(v, (44, 127)) 123 124 v = o.int8Arg_andint8Arg_(ord('a'), ord('b')) 125 self.assertEqual(v, (ord('a'), ord('b'))) 126 127 self.assertRaises(ValueError, o.int8Arg_andint8Arg_, 'a', 'b') 128 129 def testStringArgument(self): 130 o = OC_TestSpecialTypeCode.alloc().init() 131 132 v = o.int8StringArg_([1, 2, 3, 4]) 133 self.assertEqual(v, [1,2,3,4]) 134 135 self.assertRaises(ValueError, o.int8StringArg_, 'abc') 136 self.assertRaises(ValueError, o.int8StringArg_, ['a', 'b']) 137 138 def testFixedArrayIn(self): 139 o = OC_TestSpecialTypeCode.alloc().init() 140 141 v = o.int8ArrayOf4In_([1,2,3,4]) 142 self.assertEqual(v, [1,2,3,4]) 143 144 a = array.array('B', [200, 150, 80, 20]) 145 v = o.int8ArrayOf4In_(a) 146 self.assertEqual(v, (-56, -106, 80, 20)) 147 148 def testFixedArrayOut(self): 149 o = OC_TestSpecialTypeCode.alloc().init() 150 151 v = o.int8ArrayOf4Out_(None) 152 self.assertEqual(v, (ord('b'), ord('o'), ord('a'), ord('t'))) 153 154 o = OC_TestSpecialTypeCode.alloc().init() 155 a = array.array('b', [0] * 4) 156 v = o.int8ArrayOf4Out_(a) 157 self.assertIs(v, a) 158 self.assertEqual(v[0], ord('b')) 159 self.assertEqual(v[1], ord('o')) 160 self.assertEqual(v[2], ord('a')) 161 self.assertEqual(v[3], ord('t')) 162 163 def testFixedArrayInOut_(self): 164 o = OC_TestSpecialTypeCode.alloc().init() 165 166 v, w = o.int8ArrayOf4InOut_([1,2,3,4]) 167 self.assertEqual(v, [1,2,3,4]) 168 self.assertEqual(w, (ord('h'), ord('a'), ord('n'), ord('d'))) 169 170if __name__ == "__main__": 171 main() 172