1from PyObjCTools.TestSupport import * 2from CoreFoundation import * 3from Foundation import NSArray, NSMutableArray 4 5import sys 6if sys.version_info[0] == 3: 7 def cmp(a, b): 8 if a < b: 9 return -1 10 elif b < a: 11 return 1 12 return 0 13 14 15class TestCFArray (TestCase): 16 def testCFArrayIsNSArray(self): 17 self.assert_(issubclass(CFArrayRef, NSArray)) 18 self.assert_(issubclass(CFMutableArrayRef, NSMutableArray)) 19 20 def testCFArrayCreate(self): 21 array = CFArrayCreate(None, [1,2,3,4], 4, kCFTypeArrayCallBacks) 22 self.assertEqual(array, [1,2,3,4]) 23 self.assert_(isinstance(array, CFArrayRef)) 24 25 array = CFArrayCreateMutable(None, 0, kCFTypeArrayCallBacks) 26 CFArrayAppendValue(array, 42) 27 CFArrayAppendValue(array, 43) 28 CFArrayAppendValue(array, 44) 29 self.assertEqual(array, [42, 43, 44]) 30 self.assert_(isinstance(array, CFMutableArrayRef)) 31 32 def testCFArrayApplyFunction(self): 33 array = CFArrayCreate(None, [1,2,3,4], 4, kCFTypeArrayCallBacks) 34 35 self.assertArgIsFunction(CFArrayApplyFunction, 2, b'v@@', False) 36 self.assertArgHasType(CFArrayApplyFunction, 3, b'@') 37 38 items = [] 39 infos = [] 40 41 def applier(item, info): 42 items.append(item * item) 43 infos.append(info) 44 45 CFArrayApplyFunction(array, (0, 4), applier, 42) 46 self.assertEqual(items, [1,4,9,16]) 47 self.assertEqual(infos, [42,42,42,42]) 48 49 items = [] 50 infos = [] 51 CFArrayApplyFunction(array, (1, 2), applier, 42) 52 self.assertEqual(items, [4,9]) 53 self.assertEqual(infos, [42,42]) 54 55 def testBSearchValues(self): 56 # This method causes a hard crash, reason unclear. 57 array = CFArrayCreate(None, range(20), 20, kCFTypeArrayCallBacks) 58 59 self.assertArgHasType(CFArrayBSearchValues, 2, b'@') 60 self.assertArgIsFunction(CFArrayBSearchValues, 3, b'l@@@', False) 61 self.assertArgHasType(CFArrayBSearchValues, 4, b'@') 62 63 def compare(l, r, context): 64 return cmp(l, r) 65 66 r = CFArrayBSearchValues(array, (0, 20), 10, compare, None) 67 self.assertEqual(r, 10) 68 69 r = CFArrayBSearchValues(array, (0, 20), 9.5, compare, None) 70 self.assertEqual(r, 10) 71 72 r = CFArrayBSearchValues(array, (0, 20), 99, compare, None) 73 self.assert_(r >= 20) 74 75 r = CFArrayBSearchValues(array, (0, 20), -1, compare, None) 76 self.assertEqual(r, 0) 77 78 def testSortValues(self): 79 array = NSMutableArray.arrayWithArray_([4,2,1,3,0,5]) 80 81 self.assertArgIsFunction(CFArraySortValues, 2, b'l@@@', False) 82 self.assertArgHasType(CFArraySortValues, 3, b'@') 83 84 def compare(l, r, context): 85 return cmp(l, r) 86 CFArraySortValues(array, (0, 6), compare, None) 87 88 self.assertEqual(array, [0, 1, 2, 3, 4, 5]) 89 90 def testTypeID(self): 91 v = CFArrayGetTypeID() 92 self.assertIsInstance(v, (int, long)) 93 def testCopy(self): 94 array = CFArrayCreate(None, [1,2,3,4], 4, kCFTypeArrayCallBacks) 95 self.assertEqual(array, [1,2,3,4]) 96 self.assert_(isinstance(array, CFArrayRef)) 97 98 cpy = CFArrayCreateCopy(None, array) 99 self.assertEqual(cpy, [1,2,3,4]) 100 self.assert_(isinstance(cpy, CFArrayRef)) 101 102 cpy = CFArrayCreateMutableCopy(None, 0, array) 103 self.assertEqual(cpy, [1,2,3,4]) 104 self.assert_(isinstance(cpy, CFMutableArrayRef)) 105 self.assertIsNot(cpy, array ) 106 def testCounts(self): 107 array = CFArrayCreate(None, [1,2,3,4,4,2], 6, kCFTypeArrayCallBacks) 108 self.assertEqual(array, [1,2,3,4,4,2]) 109 self.assert_(isinstance(array, CFArrayRef)) 110 111 self.assertEqual(CFArrayGetCount(array) , 6 ) 112 self.assertEqual(CFArrayGetCountOfValue(array, (0,6), 4) , 2 ) 113 self.assertEqual(CFArrayGetCountOfValue(array, (0,6), 2) , 2 ) 114 self.assertEqual(CFArrayGetCountOfValue(array, (0,6), 3) , 1 ) 115 def testContains(self): 116 array = CFArrayCreate(None, [u"a",2,3,4,4,2], 6, kCFTypeArrayCallBacks) 117 self.assertEqual(array, [u"a",2,3,4,4,2]) 118 self.assert_(isinstance(array, CFArrayRef)) 119 120 self.assertFalse( CFArrayContainsValue(array, (0, 6), u"hello") ) 121 self.assertTrue( CFArrayContainsValue(array, (0, 6), 4) ) 122 self.assertFalse( CFArrayContainsValue(array, (0, 2), 4) ) 123 124 self.assertEqual(CFArrayGetFirstIndexOfValue(array, (0, 6), 3) , 2 ) 125 self.assertEqual(CFArrayGetFirstIndexOfValue(array, (0, 6), 2) , 1 ) 126 self.assertEqual(CFArrayGetFirstIndexOfValue(array, (0, 6), u"hello") , kCFNotFound ) 127 self.assertEqual(CFArrayGetLastIndexOfValue(array, (0, 6), 3) , 2 ) 128 self.assertEqual(CFArrayGetLastIndexOfValue(array, (0, 6), 2) , 5 ) 129 self.assertEqual(CFArrayGetLastIndexOfValue(array, (0, 6), u"hello") , kCFNotFound ) 130 self.assertArgHasType(CFArrayGetFirstIndexOfValue, 2, b'@') 131 self.assertArgHasType(CFArrayGetLastIndexOfValue, 2, b'@') 132 133 134 def testGetting(self): 135 array = CFArrayCreate(None, [u"a",2,3,4,4,2], 6, kCFTypeArrayCallBacks) 136 self.assertEqual(array, [u"a",2,3,4,4,2]) 137 self.assert_(isinstance(array, CFArrayRef)) 138 139 self.assertEqual(CFArrayGetValueAtIndex(array, 0) , u"a" ) 140 self.assertEqual(CFArrayGetValueAtIndex(array, 1) , 2 ) 141 self.assertArgHasType(CFArrayGetValues, 2, b'o^@') 142 self.assertArgSizeInArg(CFArrayGetValues, 2, 1) 143 144 vals = CFArrayGetValues(array, (0, 3), None) 145 self.assertIsInstance(vals, tuple) 146 self.assertEqual(vals , (u"a", 2, 3) ) 147 def testUpdating(self): 148 array = CFArrayCreate(None, [u"a",2,3,4,4,2], 6, kCFTypeArrayCallBacks) 149 self.assertEqual(array, [u"a",2,3,4,4,2]) 150 self.assert_(isinstance(array, CFArrayRef)) 151 array = CFArrayCreateMutableCopy(None, 0, array) 152 153 154 self.assertArgHasType(CFArrayAppendValue, 1, b'@') 155 self.assertArgHasType(CFArrayInsertValueAtIndex, 2, b'@') 156 self.assertArgHasType(CFArraySetValueAtIndex, 2, b'@') 157 158 CFArrayAppendValue(array, u"foo") 159 self.assertEqual(array, [u"a",2,3,4,4,2,u"foo"]) 160 161 CFArrayInsertValueAtIndex(array, 1, 4) 162 self.assertEqual(array, [u"a",4, 2,3,4,4,2,u"foo"]) 163 164 CFArrayRemoveValueAtIndex(array, 2) 165 self.assertEqual(array, [u"a",4, 3,4,4,2,u"foo"]) 166 167 CFArraySetValueAtIndex(array, 2, u"two") 168 self.assertEqual(array, [u"a",4, u"two",4,4,2,u"foo"]) 169 170 171 CFArrayExchangeValuesAtIndices(array, 1,2) 172 self.assertEqual(array, [u"a",u"two",4,4,4,2,u"foo"]) 173 174 self.assertArgHasType(CFArrayReplaceValues, 2, b'n^@') 175 self.assertArgSizeInArg(CFArrayReplaceValues, 2, 3) 176 CFArrayReplaceValues(array, (2,3), (u'a', u'b', u'c', u'd', u'e', u'f'), 6) 177 self.assertEqual(array, [u"a",u"two",u'a', u'b', u'c', u'd', u'e', u'f', 2, u'foo']) 178 179 array2 = CFArrayCreate(None, [u'hello', u'earth'], 2, kCFTypeArrayCallBacks) 180 CFArrayAppendArray(array, array2, (0,2)) 181 self.assertEqual(array, [u"a",u"two",u'a', u'b', u'c', u'd', u'e', u'f', 2, u'foo', u'hello', u'earth']) 182 183 CFArrayRemoveAllValues(array) 184 self.assertEqual(array, []) 185 186 187if __name__ == "__main__": 188 main() 189