1from PyObjCTools.TestSupport import * 2import objc 3 4NSObject = objc.lookUpClass("NSObject") 5 6class OC_AssocSneakyCopy (NSObject): 7 def copy(self): 8 return "<copy!>" 9 10 def copyWithZone_(self, zone): 11 return "<copy!>" 12 13class TestAssocations (TestCase): 14 15 @min_os_level("10.6") 16 def testKeysAreIdentityBased(self): 17 o = NSObject.alloc().init() 18 19 key1 = "key1" 20 key2 = "key11"[:-1] 21 self.assertIsNot(key1, key2) 22 23 self.assertEqual(objc.getAssociatedObject(o, key1), None) 24 self.assertEqual(objc.getAssociatedObject(o, key2), None) 25 26 objc.setAssociatedObject(o, key1, "foo") 27 28 self.assertEqual(objc.getAssociatedObject(o, key1), "foo") 29 self.assertEqual(objc.getAssociatedObject(o, key2), None) 30 31 @min_os_level("10.6") 32 def testGetSet(self): 33 o = NSObject.alloc().init() 34 35 key1 = "key1" 36 self.assertEqual(objc.getAssociatedObject(o, key1), None) 37 objc.setAssociatedObject(o, key1, "foo") 38 self.assertEqual(objc.getAssociatedObject(o, key1), "foo") 39 objc.setAssociatedObject(o, key1, None) 40 self.assertEqual(objc.getAssociatedObject(o, key1), None) 41 42 @min_os_level("10.6") 43 def testClearing(self): 44 45 o = NSObject.alloc().init() 46 47 key1 = "key1" 48 key2 = "key11"[:-1] 49 self.assertIsNot(key1, key2) 50 51 self.assertEqual(objc.getAssociatedObject(o, key1), None) 52 self.assertEqual(objc.getAssociatedObject(o, key2), None) 53 54 objc.setAssociatedObject(o, key1, "foo") 55 objc.setAssociatedObject(o, key2, "bar") 56 57 self.assertEqual(objc.getAssociatedObject(o, key1), "foo") 58 self.assertEqual(objc.getAssociatedObject(o, key2), "bar") 59 60 objc.removeAssociatedObjects(o) 61 62 self.assertEqual(objc.getAssociatedObject(o, key1), None) 63 self.assertEqual(objc.getAssociatedObject(o, key2), None) 64 65 @min_os_level("10.6") 66 def testPolicy(self): 67 o = NSObject.alloc().init() 68 key1 = "key1" 69 key2 = "key11"[:-1] 70 self.assertIsNot(key1, key2) 71 72 value = OC_AssocSneakyCopy.alloc().init() 73 74 self.assertEqual(objc.getAssociatedObject(o, key1), None) 75 self.assertEqual(objc.getAssociatedObject(o, key2), None) 76 77 objc.setAssociatedObject(o, key1, value, objc.OBJC_ASSOCIATION_RETAIN) 78 objc.setAssociatedObject(o, key2, value, objc.OBJC_ASSOCIATION_COPY) 79 80 self.assertEqual(objc.getAssociatedObject(o, key1), value) 81 self.assertEqual(objc.getAssociatedObject(o, key2), "<copy!>") 82 83 84if __name__ == "__main__": 85 main() 86