1""" 2Test handling of the private typecodes: _C_UNICHAR 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""" 10from __future__ import unicode_literals 11import weakref 12from PyObjCTools.TestSupport import * 13from PyObjCTest.fnd import NSObject 14 15from PyObjCTest.specialtypecodes import * 16import array 17 18import sys 19if sys.version_info[0] == 3: 20 unichr = chr 21 unicode = str 22 23def setupMetaData(): 24 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharValue", 25 dict( 26 retval=dict(type=objc._C_UNICHAR), 27 )) 28 29 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharArray", 30 dict( 31 retval=dict(type=objc._C_PTR+objc._C_UNICHAR, c_array_of_fixed_length=4), 32 )) 33 34 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharString", 35 dict( 36 retval=dict(type=objc._C_PTR + objc._C_UNICHAR, c_array_delimited_by_null=True), 37 )) 38 39 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharStringArg:", 40 dict( 41 arguments={ 42 2: dict(type=objc._C_PTR + objc._C_UNICHAR, c_array_delimited_by_null=True, type_modifier=objc._C_IN), 43 } 44 )) 45 46 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharArg:andUniCharArg:", 47 dict( 48 arguments={ 49 2: dict(type=objc._C_UNICHAR), 50 3: dict(type=objc._C_UNICHAR), 51 } 52 )) 53 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharArrayOf4In:", 54 dict( 55 arguments={ 56 2: dict(type=objc._C_PTR+objc._C_UNICHAR, type_modifier=objc._C_IN, c_array_of_fixed_length=4), 57 } 58 )) 59 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharArrayOf4Out:", 60 dict( 61 arguments={ 62 2: dict(type=objc._C_PTR+objc._C_UNICHAR, type_modifier=objc._C_OUT, c_array_of_fixed_length=4), 63 } 64 )) 65 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharArrayOf4InOut:", 66 dict( 67 arguments={ 68 2: dict(type=objc._C_PTR+objc._C_UNICHAR, type_modifier=objc._C_INOUT, c_array_of_fixed_length=4), 69 } 70 )) 71 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharArrayOfCount:In:", 72 dict( 73 arguments={ 74 3: dict(type=objc._C_PTR+objc._C_UNICHAR, type_modifier=objc._C_IN, c_array_of_lenght_in_arg=2), 75 } 76 )) 77 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharArrayOfCount:Out:", 78 dict( 79 arguments={ 80 3: dict(type=objc._C_PTR+objc._C_UNICHAR, type_modifier=objc._C_OUT, c_array_of_lenght_in_arg=2), 81 } 82 )) 83 objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"UniCharArrayOfCount:InOut:", 84 dict( 85 arguments={ 86 3: dict(type=objc._C_PTR+objc._C_UNICHAR, type_modifier=objc._C_INOUT, c_array_of_lenght_in_arg=2), 87 } 88 )) 89 90 91setupMetaData() 92 93class TestTypeCode_UniChar (TestCase): 94 def testReturnValue(self): 95 o = OC_TestSpecialTypeCode.alloc().init() 96 97 self.assertEqual(o.UniCharValue(), 'a') 98 self.assertEqual(o.UniCharValue(), unichr(55)) 99 self.assertEqual(o.UniCharValue(), unichr(9243)) 100 101 def testReturnValueArray(self): 102 o = OC_TestSpecialTypeCode.alloc().init() 103 104 v = o.UniCharArray() 105 self.assertEqual(len(v), 4) 106 self.assertEqual(v[0], unichr(100)) 107 self.assertEqual(v[1], unichr(400)) 108 self.assertEqual(v[2], unichr(955)) 109 self.assertEqual(v[3], unichr(40000)) 110 111 def testReturnValueString(self): 112 o = OC_TestSpecialTypeCode.alloc().init() 113 114 v = o.UniCharString() 115 self.assertIsInstance(v, unicode) 116 self.assertEqual(v, "help"); 117 118 def testSimpleArg(self): 119 o = OC_TestSpecialTypeCode.alloc().init() 120 121 v = o.UniCharArg_andUniCharArg_(unichr(44), unichr(450)) 122 self.assertEqual(v, (unichr(44), unichr(450))) 123 124 v = o.UniCharArg_andUniCharArg_('a', 'b') 125 self.assertEqual(v, ('a', 'b')) 126 127 v = o.UniCharArg_andUniCharArg_('a', 'b') 128 self.assertEqual(v, ('a', 'b')) 129 130 self.assertRaises(ValueError, o.UniCharArg_andUniCharArg_, 400, 401) 131 132 def testStringArgument(self): 133 o = OC_TestSpecialTypeCode.alloc().init() 134 135 v = o.UniCharStringArg_("hello world") 136 self.assertEqual(v, "hello world") 137 self.assertIsInstance(v, unicode) 138 139 v = o.UniCharStringArg_("hello world") 140 self.assertEqual(v, "hello world") 141 self.assertIsInstance(v, unicode) 142 143 v = o.UniCharStringArg_(['a', 'b']) 144 self.assertEqual(v, "ab") 145 self.assertIsInstance(v, unicode) 146 147 self.assertRaises(ValueError, o.UniCharStringArg_, [99, 100, 100, 0]) 148 149 def testFixedArrayIn(self): 150 o = OC_TestSpecialTypeCode.alloc().init() 151 152 v = o.UniCharArrayOf4In_("work") 153 self.assertEqual(v, "work") 154 155 v = o.UniCharArrayOf4In_(['a', 'b', 'c', 'd']) 156 self.assertEqual(v, 'abcd') 157 158 if sys.version_info[0] == 2: 159 a = array.array(b'h', [200, 300, 400, 500]) 160 else: 161 a = array.array('h', [200, 300, 400, 500]) 162 v = o.UniCharArrayOf4In_(a) 163 self.assertEqual(v, ''.join([ 164 unichr(200), unichr(300), unichr(400), unichr(500)])) 165 166 def testFixedArrayOut(self): 167 o = OC_TestSpecialTypeCode.alloc().init() 168 169 v = o.UniCharArrayOf4Out_(None) 170 self.assertEqual(v, "boat") 171 172 o = OC_TestSpecialTypeCode.alloc().init() 173 if sys.version_info[0] == 2: 174 a = array.array(b'h', [0] * 4) 175 else: 176 a = array.array('h', [0] * 4) 177 v = o.UniCharArrayOf4Out_(a) 178 self.assertIs(v, a) 179 self.assertEqual(v[0], ord('b')) 180 self.assertEqual(v[1], ord('o')) 181 self.assertEqual(v[2], ord('a')) 182 self.assertEqual(v[3], ord('t')) 183 184 def testFixedArrayInOut_(self): 185 o = OC_TestSpecialTypeCode.alloc().init() 186 187 v, w = o.UniCharArrayOf4InOut_("foot") 188 self.assertEqual(v, "foot") 189 self.assertEqual(w, "hand") 190 191if __name__ == "__main__": 192 main() 193