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