1from PyObjCTools.TestSupport import *
2import objc
3
4NSObject = objc.lookUpClass('NSObject')
5
6class TestKVOPropHelper (NSObject):
7    def init(self):
8        self = super(TestKVOPropHelper, self).init()
9        if self is None: return None
10
11        self.__helper = None
12        self.accessing = []
13        return self
14
15    def get_helper(self):
16        self.accessing.append(('get_helper',))
17        return self.__helper
18
19    def set_helper(self, value):
20        self.accessing.append(('set_helper', value))
21        self.__helper = value
22
23    helper = property(get_helper, set_helper)
24
25
26class TestKVOProp (TestCase):
27    def testKVOProperty(self):
28        o = TestKVOPropHelper.alloc().init()
29        self.assertIsInstance(o, TestKVOPropHelper)
30
31        self.assertEqual(len(o.accessing), 0)
32        o.helper = 42
33        self.assertEqual(len(o.accessing), 1)
34        self.assertEqual(o.accessing[-1], ('set_helper', 42))
35
36        self.assertEqual(o.helper, 42)
37        self.assertEqual(len(o.accessing), 2)
38        self.assertEqual(o.accessing[-1], ('get_helper',))
39
40        o.accessing[:] = []
41
42        self.assertEqual(len(o.accessing), 0)
43        o.setValue_forKey_(42, 'helper')
44        self.assertEqual(len(o.accessing), 1)
45        self.assertEqual(o.accessing[-1], ('set_helper', 42))
46
47        self.assertEqual(o.valueForKey_('helper'), 42)
48        self.assertEqual(len(o.accessing), 2)
49        self.assertEqual(o.accessing[-1], ('get_helper',))
50
51    def testKVOWillChange(self):
52        o = TestKVOPropHelper.alloc().init()
53        self.assertIsInstance(o, TestKVOPropHelper)
54
55        self.assertEqual(len(o.accessing), 0)
56        o.willChangeValueForKey_('helper')
57        o.helper = 42
58        o.didChangeValueForKey_('helper')
59        self.assertEqual(len(o.accessing), 1)
60        self.assertEqual(o.accessing[-1], ('set_helper', 42))
61
62if __name__ == "__main__":
63    main()
64