1"""
2Test handling of the private typecodes:  _C_CHAR_AS_INT
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"""
10import weakref
11from PyObjCTest.fnd import NSObject
12from PyObjCTools.TestSupport import *
13
14from PyObjCTest.specialtypecodes import *
15import array
16
17def setupMetaData():
18    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8Value",
19        dict(
20            retval=dict(type=objc._C_CHAR_AS_INT),
21        ))
22
23    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8Array",
24        dict(
25            retval=dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, c_array_of_fixed_length=4),
26        ))
27
28    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8String",
29        dict(
30            retval=dict(type=objc._C_PTR + objc._C_CHAR_AS_INT, c_array_delimited_by_null=True),
31        ))
32
33    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8StringArg:",
34        dict(
35            arguments={
36                2: dict(type=objc._C_PTR + objc._C_CHAR_AS_INT, c_array_delimited_by_null=True, type_modifier=objc._C_IN),
37            }
38        ))
39
40    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8Arg:andint8Arg:",
41        dict(
42            arguments={
43                2: dict(type=objc._C_CHAR_AS_INT),
44                3: dict(type=objc._C_CHAR_AS_INT),
45            }
46        ))
47    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOf4In:",
48        dict(
49            arguments={
50                2: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_IN, c_array_of_fixed_length=4),
51            }
52        ))
53    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOf4Out:",
54        dict(
55            arguments={
56                2: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_OUT, c_array_of_fixed_length=4),
57            }
58        ))
59    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOf4InOut:",
60        dict(
61            arguments={
62                2: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_INOUT, c_array_of_fixed_length=4),
63            }
64        ))
65    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOfCount:In:",
66        dict(
67            arguments={
68                3: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_IN, c_array_of_lenght_in_arg=2),
69            }
70        ))
71    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOfCount:Out:",
72        dict(
73            arguments={
74                3: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_OUT, c_array_of_lenght_in_arg=2),
75            }
76        ))
77    objc.registerMetaDataForSelector(b"OC_TestSpecialTypeCode", b"int8ArrayOfCount:InOut:",
78        dict(
79            arguments={
80                3: dict(type=objc._C_PTR+objc._C_CHAR_AS_INT, type_modifier=objc._C_INOUT, c_array_of_lenght_in_arg=2),
81            }
82        ))
83
84
85setupMetaData()
86
87class TestTypeCode_int8 (TestCase):
88    def testReturnValue(self):
89        o = OC_TestSpecialTypeCode.alloc().init()
90
91        self.assertEqual(o.int8Value(), 1)
92        self.assertEqual(o.int8Value(), 2)
93        self.assertEqual(o.int8Value(), 3)
94        self.assertEqual(o.int8Value(), 4)
95
96    def testReturnValueArray(self):
97        o = OC_TestSpecialTypeCode.alloc().init()
98
99        v = o.int8Array()
100        self.assertEqual(len(v), 4)
101        self.assertEqual(v[0], 100)
102        self.assertEqual(v[1], -56)
103        self.assertEqual(v[2], -106)
104        self.assertEqual(v[3], 99)
105
106    def testReturnValueString(self):
107        o = OC_TestSpecialTypeCode.alloc().init()
108
109        v = o.int8String()
110        self.assertIsInstance(v, (list, tuple))
111        self.assertEqual(len(v), 5)
112        self.assertEqual(v[0], ord("h"))
113        self.assertEqual(v[1], ord("e"))
114        self.assertEqual(v[2], ord("l"))
115        self.assertEqual(v[3], ord("l"))
116        self.assertEqual(v[4], ord("o"))
117
118    def testSimpleArg(self):
119        o = OC_TestSpecialTypeCode.alloc().init()
120
121        v = o.int8Arg_andint8Arg_(44, 127)
122        self.assertEqual(v, (44, 127))
123
124        v = o.int8Arg_andint8Arg_(ord('a'), ord('b'))
125        self.assertEqual(v, (ord('a'), ord('b')))
126
127        self.assertRaises(ValueError, o.int8Arg_andint8Arg_, 'a', 'b')
128
129    def testStringArgument(self):
130        o = OC_TestSpecialTypeCode.alloc().init()
131
132        v = o.int8StringArg_([1, 2, 3, 4])
133        self.assertEqual(v, [1,2,3,4])
134
135        self.assertRaises(ValueError,  o.int8StringArg_, 'abc')
136        self.assertRaises(ValueError,  o.int8StringArg_, ['a', 'b'])
137
138    def testFixedArrayIn(self):
139        o = OC_TestSpecialTypeCode.alloc().init()
140
141        v = o.int8ArrayOf4In_([1,2,3,4])
142        self.assertEqual(v, [1,2,3,4])
143
144        a = array.array('B', [200, 150, 80, 20])
145        v = o.int8ArrayOf4In_(a)
146        self.assertEqual(v, (-56, -106, 80, 20))
147
148    def testFixedArrayOut(self):
149        o = OC_TestSpecialTypeCode.alloc().init()
150
151        v = o.int8ArrayOf4Out_(None)
152        self.assertEqual(v, (ord('b'), ord('o'), ord('a'), ord('t')))
153
154        o = OC_TestSpecialTypeCode.alloc().init()
155        a = array.array('b', [0] * 4)
156        v = o.int8ArrayOf4Out_(a)
157        self.assertIs(v, a)
158        self.assertEqual(v[0], ord('b'))
159        self.assertEqual(v[1], ord('o'))
160        self.assertEqual(v[2], ord('a'))
161        self.assertEqual(v[3], ord('t'))
162
163    def testFixedArrayInOut_(self):
164        o = OC_TestSpecialTypeCode.alloc().init()
165
166        v, w = o.int8ArrayOf4InOut_([1,2,3,4])
167        self.assertEqual(v, [1,2,3,4])
168        self.assertEqual(w, (ord('h'), ord('a'), ord('n'), ord('d')))
169
170if __name__ == "__main__":
171    main()
172