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