1from PyObjCTools.TestSupport import * 2import objc 3 4from Foundation import * 5 6import sys 7if sys.version_info[0] == 3: 8 def cmp(a, b): 9 if a < b: 10 return -1 11 elif b < a: 12 return 1 13 return 0 14 15class TestNSArrayInteraction(TestCase): 16 def testRepeatedAllocInit(self): 17 for i in range(1,1000): 18 a = NSArray.alloc().init() 19 20 def testIndices(self): 21 x = NSArray.arrayWithArray_( [u"foo", u"bar", u"baz"] ) 22 23 self.assertEqual( x.indexOfObject_(u"bar"), 1 ) 24 25 self.assertRaises( IndexError, x.objectAtIndex_, 100) 26 27 def testEnumeration(self): 28 x = NSArray.arrayWithArray_([1, 2, u"foo", u"bar", u"", u"baz"]) 29 y = [] 30 31 for o in x: 32 y.append(o) 33 34 self.assertEqual(len(x), len(y)) 35 36 def testContains(self): 37 x = NSArray.arrayWithArray_( [u"foo", u"bar", u"baz"] ) 38 self.assertEqual( x.count(), 3 ) 39 self.assertEqual( len(x), 3 ) 40 41 self.assert_( x.containsObject_(u"foo") ) 42 self.assert_( not x.containsObject_(u"dumbledorf") ) 43 44 self.assert_( u"foo" in x ) 45 self.assert_( not u"dumbledorf" in x ) 46 47 def testIn(self): 48 x = NSMutableArray.array() 49 for i in range(0, 100): 50 x.addObject_(i) 51 52 y = [] 53 for i in x: 54 y.append( i ) 55 56 z = [] 57 for i in range(0, 100): 58 z.append( i ) 59 60 self.assertEqual(x, y) 61 self.assertEqual(x, z) 62 self.assertEqual(y, z) 63 64 for i in range(0, 100): 65 self.assert_( i in x ) 66 67 self.assert_( 101 not in x ) 68 self.assert_( None not in x ) 69 self.assert_( u"foo bar" not in x ) 70 71 def assertSlicesEqual(self, x, y, z): 72 self.assertEqual( x, x[:] ) 73 self.assertEqual( y, y[:] ) 74 self.assertEqual( z, z[:] ) 75 76 self.assertEqual( x[25:75], y[25:75] ) 77 self.assertEqual( x[25:75], z[25:75] ) 78 self.assertEqual( y[25:75], z[25:75] ) 79 80 self.assertEqual( x[:15], y[:15] ) 81 self.assertEqual( x[:15], z[:15] ) 82 self.assertEqual( y[:15], z[:15] ) 83 84 self.assertEqual( x[15:], y[15:] ) 85 self.assertEqual( x[15:], z[15:] ) 86 self.assertEqual( y[15:], z[15:] ) 87 88 self.assertEqual( x[-15:], y[-15:] ) 89 self.assertEqual( x[-15:], z[-15:] ) 90 self.assertEqual( y[-15:], z[-15:] ) 91 92 self.assertEqual( x[-15:30], y[-15:30] ) 93 self.assertEqual( x[-15:30], z[-15:30] ) 94 self.assertEqual( y[-15:30], z[-15:30] ) 95 96 self.assertEqual( x[-15:-5], y[-15:-5] ) 97 self.assertEqual( x[-15:-5], z[-15:-5] ) 98 self.assertEqual( y[-15:-5], z[-15:-5] ) 99 100 def testSlice(self): 101 x = NSMutableArray.array() 102 for i in range(0, 100): 103 x.addObject_(i) 104 105 y = [] 106 for i in x: 107 y.append( i ) 108 109 z = [] 110 for i in range(0, 100): 111 z.append( i ) 112 113 self.assertSlicesEqual(x, y, z) 114 115 k = range(300, 50) 116 x[20:30] = k 117 y[20:30] = k 118 z[20:30] = k 119 120 self.assertSlicesEqual(x, y, z) 121 122 # Note that x[1] = x works in python, but not for a bridged NS*Array*. 123 # Not sure if there is anything we can do about that. 124 x[1] = x[:] 125 y[1] = y[:] 126 z[1] = z[:] 127 128 self.assertSlicesEqual(x, y, z) 129 130 del x[-15:-5] 131 del y[-15:-5] 132 del z[-15:-5] 133 134 self.assertSlicesEqual(x, y, z) 135 136 def test_mixSliceNDice(self): 137 # This test failes on Python 2.2, that is expected. 138 x = range(0, 10) 139 y = NSMutableArray.arrayWithArray_( range(0, 10) ) 140 141 y[2:4] = x[1:5] 142 x[2:8] = y[3:7] 143 y[2:4] = y[1:8] 144 145 def test_subScripts(self): 146 x = range(0, 10) 147 y = NSMutableArray.arrayWithArray_(x) 148 149 self.assertEqual( x[0], y[0] ) 150 self.assertEqual( x[2], y[2] ) 151 152 self.assertEqual( x[-1], y[-1] ) 153 self.assertEqual( x[-5], y[-5] ) 154 155 self.assertRaises( IndexError, x.__getitem__, 100) 156 self.assertRaises( IndexError, x.__getitem__, -100) 157 158 def test_varargConstruction(self): 159 w = NSArray.arrayWithObjects_(1,2,3,4) 160 x = NSArray.alloc().initWithObjects_(1,2,3,4) 161 162 y = NSArray.arrayWithObjects_count_([1,2,3,4,5,6], 4) 163 z = NSArray.alloc().initWithObjects_count_([1,2,3,4,5,6], 4) 164 165 self.assert_(len(w) == 4) 166 self.assert_(len(x) == 4) 167 self.assert_(len(y) == 4) 168 self.assert_(len(z) == 4) 169 170 self.assert_(w[0] == 1) 171 self.assert_(x[1] == 2) 172 self.assert_(y[2] == 3) 173 self.assert_(z[3] == 4) 174 175 def test_varargConstruction2(self): 176 w = NSMutableArray.arrayWithObjects_(1,2,3,4, None) 177 x = NSMutableArray.alloc().initWithObjects_(1,2,3,4, None) 178 y = NSMutableArray.arrayWithObjects_count_([1,2,3,4,5,6], 4) 179 z = NSMutableArray.alloc().initWithObjects_count_([1,2,3,4,5,6], 4) 180 181 self.assert_(len(w) == 4) 182 self.assert_(len(x) == 4) 183 self.assert_(len(y) == 4) 184 self.assert_(len(z) == 4) 185 186 self.assert_(w[0] == 1) 187 self.assert_(x[1] == 2) 188 self.assert_(y[2] == 3) 189 self.assert_(z[3] == 4) 190 191class TestNSArraySpecialMethods(TestCase): 192 #Test calling 'difficult' methods from Python 193 194 def test_initWithObjects_count_(self): 195 a = NSArray.alloc().initWithObjects_count_((u'a',u'b',u'c',u'd'), 3) 196 self.assertEqual(a, [u'a',u'b',u'c']) 197 198 import warnings 199 warnings.filterwarnings('ignore', 200 category=objc.UninitializedDeallocWarning) 201 202 try: 203 self.assertRaises(ValueError, NSArray.alloc().initWithObjects_count_, (u'a',u'b'), 3) 204 205 finally: 206 del warnings.filters[0] 207 208 209 def test_arrayWithObjects_count_(self): 210 a = NSArray.arrayWithObjects_count_((u'a',u'b',u'c',u'd'), 3) 211 self.assertEqual(a, [u'a',u'b',u'c']) 212 213 self.assertRaises(ValueError, NSArray.arrayWithObjects_count_, (u'a',u'b'), 3) 214 215 def test_arrayByAddingObjects_count_(self): 216 return 217 218 a = NSArray.arrayWithArray_((u'a', u'b', u'c')) 219 self.assertEqual(a, (u'a', u'b', u'c')) 220 221 b = a.arrayByAddingObjects_count_((u'd', u'e', u'f'), 3) 222 self.assertEqual(a, (u'a', u'b', u'c')) 223 self.assertEqual(b, (u'a', u'b', u'c', u'd', u'e', u'f')) 224 225 self.assertRaises(ValueError, a.arrayByAddingObjects_count_, (u'a',u'b'), 3) 226 def test_sortedArrayUsingFunction_context_(self): 227 a = NSArray.arrayWithArray_((u'a', u'b', u'c')) 228 self.assertEqual(a, (u'a', u'b', u'c')) 229 230 def cmpfunc(l, r, c): 231 return -cmp(l,r) 232 233 b = a.sortedArrayUsingFunction_context_(cmpfunc, u'hello') 234 self.assertEqual(a, (u'a', u'b', u'c')) 235 self.assertEqual(b, (u'c', u'b', u'a')) 236 237 def test_sortedArrayUsingFunction_context_hint_(self): 238 a = NSArray.arrayWithArray_((u'a', u'b', u'c')) 239 self.assertEqual(a, (u'a', u'b', u'c')) 240 241 def cmpfunc(l, r, c): 242 return -cmp(l,r) 243 244 b = a.sortedArrayUsingFunction_context_hint_(cmpfunc, u'hello', a.sortedArrayHint()) 245 self.assertEqual(a, (u'a', u'b', u'c')) 246 self.assertEqual(b, (u'c', u'b', u'a')) 247 248class TestNSMutableArrayInteraction(TestCase): 249 250 def testRemoveObjects(self): 251 a = NSMutableArray.arrayWithArray_(range(10)) 252 253 self.assertEqual(len(a), 10) 254 self.assertEqual(a[0], 0) 255 self.assertEqual(a[1], 1) 256 self.assertEqual(a[2], 2) 257 258 a.removeObjectsFromIndices_numIndices_([2, 4, 6, 8], 3) 259 260 self.assertEqual(len(a), 7) 261 self.assertEqual(a, (0, 1, 3, 5, 7, 8, 9)) 262 263 264 def testReplaceObjects(self): 265 if objc.platform == 'MACOSX' or hasattr(NSMutableArray, 'replaceObjectsInRange_withObjects_count_'): 266 267 a = NSMutableArray.arrayWithArray_(range(4)) 268 self.assertEqual(a, (0, 1, 2, 3)) 269 270 a.replaceObjectsInRange_withObjects_count_( 271 (1,2), [u"a", u"b", u"c", u"d"], 3) 272 273 self.assertEqual(a, (0, u"a", u"b", u"c", 3)) 274 275 def testSortInvalid(self): 276 # Invalid calls to sortUsingFunction:context: 277 def cmp(a, b): 278 return -1 279 280 a = NSMutableArray.arrayWithArray_(range(4)) 281 self.assertEqual(a, (0, 1, 2, 3)) 282 283 t = objc.getVerbose() 284 objc.setVerbose(0) 285 try: 286 self.assertRaises(TypeError, a.sortUsingFunction_context_, dir) 287 self.assertRaises(TypeError, a.sortUsingFunction_context_, dir, 1, 2) 288 self.assertRaises(TypeError, a.sortUsingFunction_context_, lambda *args: cmp(*args), u'a') 289 finally: 290 objc.setVerbose(t) 291 292 def dont_testSort2(self): 293 # sortUsingFunction:context:range: isn't documented an hence shouldn't be tested 294 a = NSMutableArray.arrayWithArray_(range(10)) 295 self.assertEqual(a, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) 296 297 if objc.platform == 'MACOSX' or hasattr(a, 'sortUsingFunction_context_range_'): 298 def cmpfunc(l, r, c): 299 return -cmp(l,r) 300 301 a.sortUsingFunction_context_range_(cmpfunc, u"a", (4, 4)) 302 303 self.assertEqual(a, (0, 1, 2, 3, 7, 6, 5, 4, 8, 9)) 304 305 def testSort3(self): 306 # check the sort method, list interface compatibility 307 308 a = NSMutableArray.arrayWithArray_(range(4)) 309 self.assertEqual(a, (0, 1, 2, 3)) 310 311 def cmpfunc(l, r): 312 return -cmp(l,r) 313 314 a.sort(cmpfunc) 315 316 self.assertEqual(a, (3, 2, 1, 0)) 317 318 a.sort() 319 self.assertEqual(a, (0, 1, 2, 3)) 320 321 def testSort1(self): 322 a = NSMutableArray.arrayWithArray_(range(4)) 323 self.assertEqual(a, (0, 1, 2, 3)) 324 325 def cmpfunc(l, r, c): 326 return -cmp(l,r) 327 328 a.sortUsingFunction_context_(cmpfunc, u"a") 329 330 self.assertEqual(a, (3, 2, 1, 0)) 331 332 def dont_testSort2(self): 333 a = NSMutableArray.arrayWithArray_(range(10)) 334 self.assertEqual(a, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) 335 336 if objc.platform == 'MACOSX' or hasattr(a, 'sortUsingFunction_context_range_'): 337 def cmpfunc(l, r, c): 338 return -cmp(l,r) 339 340 a.sortUsingFunction_context_range_(cmpfunc, u"a", (4, 4)) 341 342 self.assertEqual(a, (0, 1, 2, 3, 7, 6, 5, 4, 8, 9)) 343 344 def testSort3(self): 345 # check the sort method, list interface compatibility 346 347 a = NSMutableArray.arrayWithArray_(range(4)) 348 self.assertEqual(a, (0, 1, 2, 3)) 349 350 351 def cmpfunc(l, r): 352 return -cmp(l,r) 353 354 a.sort(cmpfunc=cmpfunc) 355 356 self.assertEqual(a, (3, 2, 1, 0)) 357 358 a.sort() 359 360 self.assertEqual(a, (0, 1, 2, 3)) 361 362 map={ 363 0: "nul", 364 1: "een", 365 2: "twee", 366 3: "drie", 367 } 368 369 370 def keyfunc(l): 371 return map[l] 372 373 a.sort(key=keyfunc) 374 self.assertEqual(a, (3, 1, 0, 2)) 375 376 a.sort(key=keyfunc, reverse=True) 377 self.assertEqual(a, (2, 0, 1, 3)) 378 379 a.sort(reverse=True) 380 self.assertEqual(a, (3, 2, 1, 0)) 381 382 def getObjectsRange(self): 383 o = NSArray.arrayWithArray_(range(4, 8)) 384 v = o.getObjects_range_((1,2)) 385 self.assertEqual(v, (5,6)) 386 387 def test_unsupportedMethods(self): 388 # 389 # Check that calling unsupported methods results in a TypeError 390 # 391 # NOTE: Some of these don't even exist on GNUstep 392 o = NSArray.arrayWithArray_(range(4)) 393 self.assertRaises(TypeError, o.getObjects_) 394 395 # 396 #if objc.platform == 'MACOSX' or hasattr(o, 'apply_context_'): 397 # self.assertRaises(TypeError, o.apply_context_, lambda x, y:None, 0) 398 399 400 def testInsert(self): 401 o = NSMutableArray.arrayWithArray_(range(4)) 402 self.assertEqual(list(o), list(range(4))) 403 404 self.assertEqual(o[0], 0) 405 o.insert(0, "foo") 406 self.assertEqual(o[0], "foo") 407 self.assertEqual(o[1], 0) 408 self.assertEqual(len(o), 5) 409 410 # FIXME: test the entire interface of list.insert 411 412class TestVariadic (TestCase): 413 def testArrayWithObjects(self): 414 a = NSArray.arrayWithObjects_(u"foo", u"bar", None) 415 self.assertEqual(a, (u"foo", u"bar")) 416 self.assert_(isinstance(a, NSArray)) 417 418 a = NSMutableArray.arrayWithObjects_(u"foo", u"bar", None) 419 self.assertEqual(a, [u"foo", u"bar"]) 420 self.assert_(isinstance(a, NSMutableArray)) 421 422 def testInitWithObjecs(self): 423 a = NSArray.alloc().initWithObjects_(u"foo", u"bar", None) 424 self.assertEqual(a, (u"foo", u"bar")) 425 self.assert_(isinstance(a, NSArray)) 426 427 a = NSMutableArray.alloc().initWithObjects_(u"foo", u"bar", None) 428 self.assertEqual(a, [u"foo", u"bar"]) 429 self.assert_(isinstance(a, NSMutableArray)) 430 431class TestNSArray (TestCase): 432 def testMethods(self): 433 self.assertResultIsBOOL(NSArray.containsObject_) 434 self.assertResultIsBOOL(NSArray.writeToFile_atomically_) 435 self.assertArgIsBOOL(NSArray.writeToFile_atomically_, 1) 436 self.assertResultIsBOOL(NSArray.writeToURL_atomically_) 437 self.assertArgIsBOOL(NSArray.writeToURL_atomically_, 1) 438 439 self.assertArgIsBOOL(NSArray.initWithArray_copyItems_, 1) 440 441 self.assertArgIsIn(NSArray.arrayWithObjects_count_, 0) 442 self.assertArgSizeInArg(NSArray.arrayWithObjects_count_, 0, 1) 443 self.assertArgIsIn(NSArray.initWithObjects_count_, 0) 444 self.assertArgSizeInArg(NSArray.initWithObjects_count_, 0, 1) 445 446 self.assertArgIsIn(NSMutableArray.removeObjectsFromIndices_numIndices_, 0) 447 self.assertArgSizeInArg(NSMutableArray.removeObjectsFromIndices_numIndices_, 0, 1) 448 449 self.assertArgIsFunction(NSArray.sortedArrayUsingFunction_context_, 0, b'l@@@', False) 450 self.assertArgHasType(NSArray.sortedArrayUsingFunction_context_, 1, b'@') 451 self.assertArgIsFunction(NSArray.sortedArrayUsingFunction_context_hint_, 0, b'l@@@', False) 452 self.assertArgHasType(NSArray.sortedArrayUsingFunction_context_hint_, 1, b'@') 453 454 self.assertArgIsFunction(NSMutableArray.sortUsingFunction_context_, 0, b'l@@@', False) 455 self.assertArgHasType(NSMutableArray.sortUsingFunction_context_, 1, b'@') 456 457 self.assertIsNullTerminated(NSArray.arrayWithObjects_) 458 self.assertIsNullTerminated(NSArray.initWithObjects_) 459 460 @min_os_level('10.6') 461 def testMethods10_6(self): 462 self.assertArgIsBlock(NSArray.enumerateObjectsUsingBlock_, 0, 463 b'v@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 464 self.assertArgIsBlock(NSArray.enumerateObjectsWithOptions_usingBlock_, 1, 465 b'v@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 466 self.assertArgIsBlock(NSArray.enumerateObjectsAtIndexes_options_usingBlock_, 2, 467 b'v@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 468 469 self.assertArgIsBlock(NSArray.indexOfObjectPassingTest_, 0, 470 objc._C_NSBOOL + b'@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 471 self.assertArgIsBlock(NSArray.indexOfObjectWithOptions_passingTest_, 1, 472 objc._C_NSBOOL + b'@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 473 self.assertArgIsBlock(NSArray.indexOfObjectAtIndexes_options_passingTest_, 2, 474 objc._C_NSBOOL + b'@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 475 476 self.assertArgIsBlock(NSArray.indexesOfObjectsPassingTest_, 0, 477 objc._C_NSBOOL + b'@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 478 self.assertArgIsBlock(NSArray.indexesOfObjectsWithOptions_passingTest_, 1, 479 objc._C_NSBOOL + b'@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 480 self.assertArgIsBlock(NSArray.indexesOfObjectsAtIndexes_options_passingTest_, 2, 481 objc._C_NSBOOL + b'@'+objc._C_NSUInteger+b'o^'+objc._C_NSBOOL) 482 483 self.assertArgIsBlock(NSArray.sortedArrayUsingComparator_, 484 0, b'l@@') 485 self.assertArgIsBlock(NSArray.sortedArrayWithOptions_usingComparator_, 486 1, b'l@@') 487 self.assertArgIsBlock(NSArray.indexOfObject_inSortedRange_options_usingComparator_, 488 3, b'l@@') 489 self.assertArgHasType(NSArray.indexOfObject_inSortedRange_options_usingComparator_, 1, NSRange.__typestr__) 490 491 492 493 self.assertArgIsBlock(NSMutableArray.sortUsingComparator_, 494 0, b'l@@') 495 self.assertArgIsBlock(NSMutableArray.sortWithOptions_usingComparator_, 496 1, b'l@@') 497 498 499 500 @min_os_level('10.6') 501 def testConstants10_6(self): 502 self.assertEqual(NSBinarySearchingFirstEqual, 1 << 8) 503 self.assertEqual(NSBinarySearchingLastEqual, 1 << 9) 504 self.assertEqual(NSBinarySearchingInsertionIndex, 1 << 10) 505 506if __name__ == '__main__': 507 main() 508