blob: 52874025466bee679ce490793ad2613dae4055fe [file] [log] [blame]
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001"""Unit tests for new super() implementation."""
2
3import sys
4import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006
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
Barry Warsaw91cc8fb2008-11-20 20:01:57 +000073 def testSuperWithClosure(self):
74 # Issue4360: super() did not work in a function that
75 # contains a closure
76 class E(A):
77 def f(self):
78 def nested():
79 self
80 return super().f() + 'E'
81
82 self.assertEqual(E().f(), 'AE')
83
Guido van Rossumcd16bf62007-06-13 18:07:49 +000084
85def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +000086 support.run_unittest(TestSuper)
Guido van Rossumcd16bf62007-06-13 18:07:49 +000087
88
89if __name__ == "__main__":
90 unittest.main()