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