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.assertEqual(v, [0, 1, 2, 3]) 19 20 a = array.array('i', [9, 10, 11, 12]) 21 v = o.arrayOf4Ints_(a) 22 self.assertEqual(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.assertEqual(v, [0, 1, 2, 3]) 29 30 a = array.array('i', [9, 10, 11, 12]) 31 v = o.arrayOf4IntsIn_(a) 32 self.assertEqual(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.assertEqual(v, (0, 1, 2, 3)) 39 self.assertEqual(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.assertEqual(v, [9, 10, 11, 12]) 44 self.assertIs(r, a) 45 self.assertEqual(a[0], 9 + 42) 46 self.assertEqual(a[1], 10 + 42) 47 self.assertEqual(a[2], 11 + 42) 48 self.assertEqual(a[3], 12 + 42) 49 50 def testArrayOfIntsOut(self): 51 o = OC_ArrayTest.alloc().init() 52 53 v = o.arrayOf4IntsOut_(None) 54 self.assertEqual(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.assertEqual(a[0], 99) 60 self.assertEqual(a[1], 100) 61 self.assertEqual(a[2], 102) 62 self.assertEqual(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.assertEqual(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.assertEqual(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.assertEqual(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.assertEqual(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.assertEqual(v, ((0,1), (2,3), (4,5), (6,7))) 89 self.assertEqual(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.assertEqual(v, [(9, 10), (11, 12), (14, 15), (16, 17)]) 94 self.assertIs(r, a) 95 self.assertEqual(a[0], 9 + 42) 96 self.assertEqual(a[1], 10 - 42) 97 self.assertEqual(a[2], 11 + 42) 98 self.assertEqual(a[3], 12 - 42) 99 self.assertEqual(a[4], 14 + 42) 100 self.assertEqual(a[5], 15 - 42) 101 self.assertEqual(a[6], 16 + 42) 102 self.assertEqual(a[7], 17 - 42) 103 104 def testArrayOfStructsOut(self): 105 o = OC_ArrayTest.alloc().init() 106 107 v = o.arrayOf4StructsOut_(None) 108 self.assertEqual(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.assertEqual(a[0], l[0]) 118 self.assertEqual(a[1], l[1]) 119 self.assertEqual(a[2], l[2]) 120 self.assertEqual(a[3], l[3]) 121 self.assertEqual(a[4], l[4]) 122 self.assertEqual(a[5], l[5]) 123 self.assertEqual(a[6], l[6]) 124 self.assertEqual(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.assertEqual(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.assertEqual(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.assertEqual(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.assertEqual(v, [ (44, 45), (46, 47), (48, 49), (50, 51) ]) 182 183 184if __name__ == "__main__": 185 main() 186