1"""
2Some tests for arrays in method arguments (the 'int foo[4]' type of array).
3
4This tests both calling such methods, as well as implementing methods with such arguments.
5"""
6from PyObjCTools.TestSupport import *
7import objc
8import array
9from PyObjCTest.arrays import *
10from PyObjCTest.fnd import NSObject
11
12
13class TestArrayCalling (TestCase):
14    def testArrayOfInts(self):
15        o = OC_ArrayTest.alloc().init()
16
17        v = o.arrayOf4Ints_([0, 1, 2, 3])
18        self.assertEquals(v, [0, 1, 2, 3])
19
20        a = array.array('i', [9, 10, 11, 12])
21        v = o.arrayOf4Ints_(a)
22        self.assertEquals(v, [9, 10, 11, 12])
23
24    def testArrayOfIntsIn(self):
25        o = OC_ArrayTest.alloc().init()
26
27        v = o.arrayOf4IntsIn_([0, 1, 2, 3])
28        self.assertEquals(v, [0, 1, 2, 3])
29
30        a = array.array('i', [9, 10, 11, 12])
31        v = o.arrayOf4IntsIn_(a)
32        self.assertEquals(v, [9, 10, 11, 12])
33
34    def testArrayOfIntsInOut(self):
35        o = OC_ArrayTest.alloc().init()
36
37        v, r = o.arrayOf4IntsInOut_([0, 1, 2, 3])
38        self.assertEquals(v, (0, 1, 2, 3))
39        self.assertEquals(r, (0+42, 1+42, 2+42, 3+42))
40
41        a = array.array('i', [9, 10, 11, 12])
42        v, r = o.arrayOf4IntsInOut_(a)
43        self.assertEquals(v, [9, 10, 11, 12])
44        self.assertIs(r, a)
45        self.assertEquals(a[0], 9 + 42)
46        self.assertEquals(a[1], 10 + 42)
47        self.assertEquals(a[2], 11 + 42)
48        self.assertEquals(a[3], 12 + 42)
49
50    def testArrayOfIntsOut(self):
51        o = OC_ArrayTest.alloc().init()
52
53        v = o.arrayOf4IntsOut_(None)
54        self.assertEquals(v, (99, 100, 102, 110))
55
56        a = array.array('i', [9, 10, 11, 12])
57        v = o.arrayOf4IntsOut_(a)
58        self.assertIs(a, v)
59        self.assertEquals(a[0], 99)
60        self.assertEquals(a[1], 100)
61        self.assertEquals(a[2], 102)
62        self.assertEquals(a[3], 110)
63
64    def testArrayOfStructs(self):
65        o = OC_ArrayTest.alloc().init()
66
67        v = o.arrayOf4Structs_([(0, 1), (10, 20), (-10, -20), (7, 8)])
68        self.assertEquals(v, [(0, 1), (10, 20), (-10, -20), (7, 8)])
69
70        a = array.array('i', [9, 10, 11, 12, -1, -2, -3, -4])
71        v = o.arrayOf4Structs_(a)
72        self.assertEquals(v, [(9, 10), (11, 12), (-1, -2), (-3, -4)])
73
74    def testArrayOfStructsIn(self):
75        o = OC_ArrayTest.alloc().init()
76
77        v = o.arrayOf4StructsIn_([(0, 1), (2, 3), (-1, -2), (-3, -4)])
78        self.assertEquals(v, [(0, 1), (2, 3), (-1, -2), (-3, -4)])
79
80        a = array.array('i', [9, 10, 11, 12, -1, -2, -3, -4])
81        v = o.arrayOf4StructsIn_(a)
82        self.assertEquals(v, [(9, 10), (11, 12), (-1, -2), (-3, -4)])
83
84    def testArrayOfStructsInOut(self):
85        o = OC_ArrayTest.alloc().init()
86
87        v, r = o.arrayOf4StructsInOut_([(0, 1), (2, 3), (4, 5), (6,7)])
88        self.assertEquals(v, ((0,1), (2,3), (4,5), (6,7)))
89        self.assertEquals(r, ((0+42, 1-42), (2+42,3-42), (4+42, 5-42), (6+42, 7-42)))
90
91        a = array.array('i', [9, 10, 11, 12, 14, 15, 16, 17])
92        v, r = o.arrayOf4StructsInOut_(a)
93        self.assertEquals(v, [(9, 10), (11, 12), (14, 15), (16, 17)])
94        self.assertIs(r, a)
95        self.assertEquals(a[0], 9 + 42)
96        self.assertEquals(a[1], 10 - 42)
97        self.assertEquals(a[2], 11 + 42)
98        self.assertEquals(a[3], 12 - 42)
99        self.assertEquals(a[4], 14 + 42)
100        self.assertEquals(a[5], 15 - 42)
101        self.assertEquals(a[6], 16 + 42)
102        self.assertEquals(a[7], 17 - 42)
103
104    def testArrayOfStructsOut(self):
105        o = OC_ArrayTest.alloc().init()
106
107        v = o.arrayOf4StructsOut_(None)
108        self.assertEquals(list(v), [ (1+i*i, -4 - i*i*i) for i in range(4) ])
109
110        a = array.array('i', [0]*8)
111        v = o.arrayOf4StructsOut_(a)
112        self.assertIs(a, v)
113        l = []
114        for i in range(4):
115            l.append(1 + i * i)
116            l.append(-4 - i * i * i)
117        self.assertEquals(a[0], l[0])
118        self.assertEquals(a[1], l[1])
119        self.assertEquals(a[2], l[2])
120        self.assertEquals(a[3], l[3])
121        self.assertEquals(a[4], l[4])
122        self.assertEquals(a[5], l[5])
123        self.assertEquals(a[6], l[6])
124        self.assertEquals(a[7], l[7])
125
126StructArrayDelegate = objc.informal_protocol(
127    "ArrayDelegate",
128    [
129        objc.selector(None, b"arrayOf4Ints:", signature=b"@@:[4i]", isRequired=0),
130        objc.selector(None, b"arrayOf4IntsOut:", signature=b"v@:o[4i]", isRequired=False),
131        objc.selector(None, b"arrayOf4Structs:", signature=b"@@:[4{FooStruct=ii}]", isRequired=False),
132        objc.selector(None, b"arrayOf4StructsOut:", signature=b"v@:o[4{FooStruct=ii}]", isRequired=False),
133    ]
134)
135
136class OC_TestArrayInt_In (NSObject):
137    def arrayOf4Ints_(self, array):
138        return array
139
140class OC_TestArrayInt_Out (NSObject):
141    def arrayOf4IntsOut_(self, array):
142        if array is None:
143            return [ 99, 100, 98, 101 ]
144
145class OC_TestArrayStruct_Out (NSObject):
146    def arrayOf4StructsOut_(self, array):
147        if array is None:
148            return [ (44, 45), (46, 47), (48, 49), (50, 51) ]
149
150class OC_TestArrayStruct_In (NSObject):
151    def arrayOf4Structs_(self, array):
152        return array
153
154class TestArrayCallbacks (TestCase):
155    def testCallArrayInt(self):
156
157        obj = OC_TestArrayInt_In.alloc().init()
158
159        v = OC_ArrayTest.callArrayOf4Ints_(obj)
160        self.assertEquals(v, (1, 2, 3, 4))
161
162    def testCallArrayIntsOut(self):
163
164        obj = OC_TestArrayInt_Out.alloc().init()
165
166        v = OC_ArrayTest.callArrayOf4IntsOut_(obj)
167        self.assertEquals(v, [99, 100, 98, 101])
168
169    def testCallArrayStruct(self):
170
171        obj = OC_TestArrayStruct_In.alloc().init()
172
173        v = OC_ArrayTest.callArrayOf4Structs_(obj)
174        self.assertEquals(v, ((1,2), (3,4), (5,6), (7,8)))
175
176    def testCallArrayStructsOut(self):
177
178        obj = OC_TestArrayStruct_Out.alloc().init()
179
180        v = OC_ArrayTest.callArrayOf4StructsOut_(obj)
181        self.assertEquals(v, [ (44, 45), (46, 47), (48, 49), (50, 51) ])
182
183
184if __name__ == "__main__":
185    main()
186