blob: fc303eac73cf83a7b8054df3e004b3949fc6582a [file] [log] [blame]
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001"""Unit tests for new super() implementation."""
2
3import sys
4import unittest
5from test import test_support
6
7
8class A:
9 def f(self):
10 return 'A'
11 @classmethod
12 def cm(cls):
13 return (cls, 'A')
14
15class B(A):
16 def f(self):
17 return super().f() + 'B'
18 @classmethod
19 def cm(cls):
20 return (cls, super().cm(), 'B')
21
22class C(A):
23 def f(self):
24 return super().f() + 'C'
25 @classmethod
26 def cm(cls):
27 return (cls, super().cm(), 'C')
28
29class D(C, B):
30 def f(self):
31 return super().f() + 'D'
32 def cm(cls):
33 return (cls, super().cm(), 'D')
34
35class E(D):
36 pass
37
38class F(E):
39 f = E.f
40
41class G(A):
42 pass
43
44
45class TestSuper(unittest.TestCase):
46
47 def testBasicsWorking(self):
48 self.assertEqual(D().f(), 'ABCD')
49
50 def testClassGetattrWorking(self):
51 self.assertEqual(D.f(D()), 'ABCD')
52
53 def testSubclassNoOverrideWorking(self):
54 self.assertEqual(E().f(), 'ABCD')
55 self.assertEqual(E.f(E()), 'ABCD')
56
57 def testUnboundMethodTransferWorking(self):
58 self.assertEqual(F().f(), 'ABCD')
59 self.assertEqual(F.f(F()), 'ABCD')
60
61 def testClassMethodsStillWorking(self):
62 self.assertEqual(A.cm(), (A, 'A'))
63 self.assertEqual(A().cm(), (A, 'A'))
64 self.assertEqual(G.cm(), (G, 'A'))
65 self.assertEqual(G().cm(), (G, 'A'))
66
67 def testSuperInClassMethodsWorking(self):
68 d = D()
69 self.assertEqual(d.cm(), (d, (D, (D, (D, 'A'), 'B'), 'C'), 'D'))
70 e = E()
71 self.assertEqual(e.cm(), (e, (E, (E, (E, 'A'), 'B'), 'C'), 'D'))
72
73
74def test_main():
75 test_support.run_unittest(TestSuper)
76
77
78if __name__ == "__main__":
79 unittest.main()