blob: 298cae001179497c7547502b7628b9ea157a59b2 [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
Benjamin Peterson206cd1c2011-06-19 17:49:13 -050047 def test_basics_working(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000048 self.assertEqual(D().f(), 'ABCD')
49
Benjamin Peterson206cd1c2011-06-19 17:49:13 -050050 def test_class_getattr_working(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000051 self.assertEqual(D.f(D()), 'ABCD')
52
Benjamin Peterson206cd1c2011-06-19 17:49:13 -050053 def test_subclass_no_override_working(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000054 self.assertEqual(E().f(), 'ABCD')
55 self.assertEqual(E.f(E()), 'ABCD')
56
Benjamin Peterson206cd1c2011-06-19 17:49:13 -050057 def test_unbound_method_transfer_working(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000058 self.assertEqual(F().f(), 'ABCD')
59 self.assertEqual(F.f(F()), 'ABCD')
60
Benjamin Peterson206cd1c2011-06-19 17:49:13 -050061 def test_class_methods_still_working(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000062 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
Benjamin Peterson206cd1c2011-06-19 17:49:13 -050067 def test_super_in_class_methods_working(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000068 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
Benjamin Peterson206cd1c2011-06-19 17:49:13 -050073 def test_super_with_closure(self):
Barry Warsaw91cc8fb2008-11-20 20:01:57 +000074 # 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
Benjamin Petersonf5ff2232011-06-19 19:42:22 -050084 def test___class___set(self):
85 # See issue #12370
86 class X(A):
87 def f(self):
88 return super().f()
89 __class__ = 413
90 x = X()
91 self.assertEqual(x.f(), 'A')
92 self.assertEqual(x.__class__, 413)
93
Guido van Rossumcd16bf62007-06-13 18:07:49 +000094
95def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +000096 support.run_unittest(TestSuper)
Guido van Rossumcd16bf62007-06-13 18:07:49 +000097
98
99if __name__ == "__main__":
100 unittest.main()