1from PyObjCTools.TestSupport import * 2from PyObjCTest.pointersupport import opaque_capsule, object_capsule 3import objc 4import ctypes 5 6OpaqueType = objc.createOpaquePointerType("OpaqueType", b"^{OpaqueType}", None) 7 8 9class TestProxySupport (TestCase): 10 def test_cobject_roundtrip(self): 11 arr = objc.lookUpClass('NSArray').array() 12 13 p = arr.__cobject__() 14 self.assertEqual(type(p).__name__, "PyCapsule") 15 self.assertIn("objc.__object__", repr(p)) 16 # Note: 17 18 v = objc.objc_object(cobject=p) 19 self.assertIs(v, arr) 20 21 def test_voidp_roundtrip(self): 22 arr = objc.lookUpClass('NSArray').array() 23 24 p = arr.__c_void_p__() 25 self.assertIsInstance(p, ctypes.c_void_p) 26 self.assertEqual(p.value, objc.pyobjc_id(arr)) 27 28 v = objc.objc_object(c_void_p=p) 29 self.assertIs(v, arr) 30 31 def test_voidp_using_ctypes(self): 32 lib = ctypes.CDLL('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation') 33 func = lib.CFStringCreateWithCString 34 func.restype = ctypes.c_void_p 35 func.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int] 36 37 kCFStringEncodingISOLatin1 = 0x0201 38 ct_obj = func(None, b"hello world", kCFStringEncodingISOLatin1) 39 40 value = objc.objc_object(c_void_p=ct_obj) 41 self.assertIsInstance(value, objc.pyobjc_unicode) 42 self.assertEqual(objc.pyobjc_id(value.nsstring()), ct_obj) 43 44 def test_opaque_capsule(self): 45 cap = opaque_capsule() 46 47 value = OpaqueType(cobject=cap) 48 self.assertIsInstance(value, OpaqueType) 49 self.assertEqual(value.__pointer__, 1234) 50 51 self.assertRaises(ValueError, OpaqueType, cobject=object_capsule()) 52 self.assertRaises(TypeError, OpaqueType, cobject=42) 53 54 def test_opaque_ctypes(self): 55 ptr = ctypes.c_void_p(0xabcd) 56 57 value = OpaqueType(c_void_p=ptr) 58 self.assertIsInstance(value, OpaqueType) 59 self.assertEqual(value.__pointer__, 0xabcd) 60 61 value = OpaqueType(c_void_p=0xdefa) 62 self.assertIsInstance(value, OpaqueType) 63 self.assertEqual(value.__pointer__, 0xdefa) 64 65 66 def test_object_capsule(self): 67 NSObject = objc.lookUpClass('NSObject') 68 cap = object_capsule() 69 70 value = NSObject(cobject=cap) 71 self.assertIsInstance(value, NSObject) 72 73 self.assertRaises(ValueError, NSObject, cobject=opaque_capsule()) 74 self.assertRaises(TypeError, NSObject, cobject=42) 75 76if __name__ == "__main__": 77 main() 78