1"""
2Tests for accessing methods through classes and instances
3"""
4from PyObjCTools.TestSupport import *
5from PyObjCTest.clinmeth import *
6import objc
7
8class TestClassMethods (TestCase):
9    # Some very basic tests that check that getattr on instances doesn't
10    # return a class method and that getattr on classes prefers classmethods
11    # over instance methods (and v.v. for getattr on instances)
12
13    def testViaClass(self):
14        m = PyObjC_ClsInst1.clsmeth
15        self.assert_( isinstance(m, objc.selector) )
16        self.assert_( m.isClassMethod )
17
18        self.assertEquals(m(), 4)
19
20    def testViaInstance(self):
21        o = PyObjC_ClsInst1.alloc().init()
22        self.assertRaises(AttributeError, getattr, o, "clsmeth")
23
24    def testClassAndInstanceViaClass(self):
25        m = PyObjC_ClsInst1.both
26        self.assert_( isinstance(m, objc.selector) )
27        self.assert_( m.__metadata__()['classmethod'] )
28
29        self.assertEquals(m(), 3)
30
31    def testClassAndInstanceViaInstance(self):
32        o = PyObjC_ClsInst1.alloc().init()
33        m = o.both
34        self.assert_( isinstance(m, objc.selector) )
35        self.assert_( not m.isClassMethod )
36
37        self.assertEquals(m(), 2)
38
39
40class TestInstanceMethods (TestCase):
41    # Check that instance methods can be accessed through the instance, and
42    # also through the class when no class method of the same name is
43    # available.
44
45    def testViaClass(self):
46        m = PyObjC_ClsInst1.instance
47        self.assert_( isinstance(m, objc.selector) )
48        self.assert_( not m.isClassMethod )
49
50        self.assertRaises(TypeError, m)
51
52    def testViaInstance(self):
53        o = PyObjC_ClsInst1.alloc().init()
54        m = o.instance
55
56        self.assert_( isinstance(m, objc.selector) )
57        self.assert_( not m.isClassMethod )
58
59        self.assertEquals(m(), 1)
60
61class TestSuper (TestCase):
62    # Tests that check if super() behaves as expected (which is the most likely
63    # reason for failure).
64
65    def testClassMethod(self):
66        cls = PyObjC_ClsInst2
67
68        self.assertEquals(cls.clsmeth(), 40)
69        self.assertEquals(objc.super(cls, cls).clsmeth(), 4)
70
71    def testInstanceMethod(self):
72        o = PyObjC_ClsInst2.alloc().init()
73
74        self.assertEquals(o.instance(), 10)
75        self.assertEquals(super(PyObjC_ClsInst2, o).instance(), 1)
76
77    def testBoth(self):
78        o = PyObjC_ClsInst2.alloc().init()
79
80        self.assertEquals(o.both(), 20)
81        self.assertEquals(objc.super(PyObjC_ClsInst2, o).both(), 2)
82
83        cls = PyObjC_ClsInst2
84
85        self.assertEquals(cls.both(), 30)
86        self.assertEquals(objc.super(cls, cls).both(), 3)
87
88
89if __name__ == "__main__":
90    main()
91
92