blob: 1e272ee2cf575f627f9bf4e82d1a291706fdb017 [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
Nick Coghlan0b43bcf2012-05-27 18:17:07 +100084 @unittest.expectedFailure
Benjamin Petersonf5ff2232011-06-19 19:42:22 -050085 def test___class___set(self):
86 # See issue #12370
87 class X(A):
88 def f(self):
89 return super().f()
90 __class__ = 413
91 x = X()
92 self.assertEqual(x.f(), 'A')
93 self.assertEqual(x.__class__, 413)
94
Nick Coghlan0b43bcf2012-05-27 18:17:07 +100095 def test___class___instancemethod(self):
96 # See issue #14857
97 class X:
98 def f(self):
99 return __class__
100 self.assertIs(X().f(), X)
101
102 def test___class___classmethod(self):
103 # See issue #14857
104 class X:
105 @classmethod
106 def f(cls):
107 return __class__
108 self.assertIs(X.f(), X)
109
110 def test___class___staticmethod(self):
111 # See issue #14857
112 class X:
113 @staticmethod
114 def f():
115 return __class__
116 self.assertIs(X.f(), X)
117
Benjamin Peterson6a42bd62012-09-01 23:04:38 -0400118 def test_obscure_super_errors(self):
119 def f():
120 super()
121 self.assertRaises(RuntimeError, f)
122 def f(x):
123 del x
124 super()
125 self.assertRaises(RuntimeError, f, None)
126 class X:
127 def f(x):
128 nonlocal __class__
129 del __class__
130 super()
131 self.assertRaises(RuntimeError, X().f)
132
Benjamin Petersone1b4cbc2013-05-14 22:31:26 -0500133 def test_cell_as_self(self):
134 class X:
135 def meth(self):
136 super()
137
138 def f():
139 k = X()
140 def g():
141 return k
142 return g
143 c = f().__closure__[0]
144 self.assertRaises(TypeError, X.meth, c)
145
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000146
147def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000148 support.run_unittest(TestSuper)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000149
150
151if __name__ == "__main__":
152 unittest.main()