"""
Test handling of the private typecodes: _C_CHAR_AS_BYTE
This typecode doesn't actually exists in the ObjC runtime but
are private to PyObjC. We use these to simplify the bridge code
while at the same time getting a higher fidelity bridge.
- Add tests for calling methods from ObjC
"""
import weakref, objc, sys
from PyObjCTools.TestSupport import *
from PyObjCTest.fnd import NSObject
from PyObjCTest.specialtypecodes import *
import array
def setupMetaData():
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteValue",
dict(
retval=dict(type=objc._C_CHAR_AS_TEXT),
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteArray",
dict(
retval=dict(type=objc._C_PTR+objc._C_CHAR_AS_TEXT, c_array_of_fixed_length=4),
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteString",
dict(
retval=dict(type=objc._C_PTR + objc._C_CHAR_AS_TEXT, c_array_delimited_by_null=True),
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteStringArg:",
dict(
arguments={
2: dict(type=objc._C_PTR + objc._C_CHAR_AS_TEXT, c_array_delimited_by_null=True, type_modifier=objc._C_IN),
}
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteArg:andbyteArg:",
dict(
arguments={
2: dict(type=objc._C_CHAR_AS_TEXT),
3: dict(type=objc._C_CHAR_AS_TEXT),
}
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteArrayOf4In:",
dict(
arguments={
2: dict(type=objc._C_PTR+objc._C_CHAR_AS_TEXT, type_modifier=objc._C_IN, c_array_of_fixed_length=4),
}
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteArrayOf4Out:",
dict(
arguments={
2: dict(type=objc._C_PTR+objc._C_CHAR_AS_TEXT, type_modifier=objc._C_OUT, c_array_of_fixed_length=4),
}
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteArrayOf4InOut:",
dict(
arguments={
2: dict(type=objc._C_PTR+objc._C_CHAR_AS_TEXT, type_modifier=objc._C_INOUT, c_array_of_fixed_length=4),
}
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteArrayOfCount:In:",
dict(
arguments={
3: dict(type=objc._C_PTR+objc._C_CHAR_AS_TEXT, type_modifier=objc._C_IN, c_array_of_lenght_in_arg=2),
}
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteArrayOfCount:Out:",
dict(
arguments={
3: dict(type=objc._C_PTR+objc._C_CHAR_AS_TEXT, type_modifier=objc._C_OUT, c_array_of_lenght_in_arg=2),
}
))
objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"byteArrayOfCount:InOut:",
dict(
arguments={
3: dict(type=objc._C_PTR+objc._C_CHAR_AS_TEXT, type_modifier=objc._C_INOUT, c_array_of_lenght_in_arg=2),
}
))
setupMetaData()
class TestTypeCode_byte (TestCase):
def testReturnValue(self):
o = OC_TestSpecialTypeCode.alloc().init()
self.assertEquals(o.byteValue(), b'a')
self.assertEquals(o.byteValue(), b'\x37')
self.assertEquals(o.byteValue(), b'z')
def testReturnValueArray(self):
o = OC_TestSpecialTypeCode.alloc().init()
v = o.byteArray()
self.assertEquals(len(v), 4)
self.assertIsInstance(v, bytes)
if sys.version_info[0] == 2:
self.assertEquals(v[0], b'\x64')
self.assertEquals(v[1], b'\xc8')
self.assertEquals(v[2], b'\x96')
self.assertEquals(v[3], b'\x63')
else:
self.assertEquals(v[0], 0x64)
self.assertEquals(v[1], 0xc8)
self.assertEquals(v[2], 0x96)
self.assertEquals(v[3], 0x63)
def testReturnValueString(self):
o = OC_TestSpecialTypeCode.alloc().init()
v = o.byteString()
self.assertIsInstance(v, bytes)
self.assertEquals(v, b"hello world");
def testSimpleArg(self):
o = OC_TestSpecialTypeCode.alloc().init()
v = o.byteArg_andbyteArg_(b'\x44', b'\x99')
self.assertEquals(v, (unichr(0x44), unichr(0x99)))
v = o.byteArg_andbyteArg_(b'a', b'b')
self.assertEquals(v, ('a', 'b'))
self.assertRaises(ValueError, o.byteArg_andbyteArg_, 200, 100)
def testStringArgument(self):
o = OC_TestSpecialTypeCode.alloc().init()
v = o.byteStringArg_(b"hello world")
self.assertEquals(v, "hello world")
self.assertIsInstance(v, unicode)
v = o.byteStringArg_([b'a', b'b'])
self.assertIsInstance(v, unicode)
self.assertEquals(v, "ab")
self.assertRaises(ValueError, o.byteStringArg_, [99, 100, 100, 0])
def testFixedArrayIn(self):
o = OC_TestSpecialTypeCode.alloc().init()
v = o.byteArrayOf4In_(b"work")
self.assertEquals(v, "work")
v = o.byteArrayOf4In_([b'a', b'b', b'c', b'd'])
self.assertEquals(v, 'abcd')
a = array.array('B', [200, 150, 80, 20])
v = o.byteArrayOf4In_(a)
self.assertEquals(v, u''.join([
unichr(200), unichr(150), unichr(80), unichr(20)]))
def testFixedArrayOut(self):
o = OC_TestSpecialTypeCode.alloc().init()
v = o.byteArrayOf4Out_(None)
self.assertEquals(v, b"boat")
o = OC_TestSpecialTypeCode.alloc().init()
a = array.array('b', [0] * 4)
v = o.byteArrayOf4Out_(a)
self.assertIs(v, a)
self.assertEquals(v[0], ord('b'))
self.assertEquals(v[1], ord('o'))
self.assertEquals(v[2], ord('a'))
self.assertEquals(v[3], ord('t'))
def testFixedArrayInOut_(self):
o = OC_TestSpecialTypeCode.alloc().init()
v, w = o.byteArrayOf4InOut_(b"foot")
self.assertEquals(v, "foot")
self.assertEquals(w, b"hand")
if __name__ == "__main__":
main()
|