blob: 7573bfd9a0f0cf33fa982d37604965f9fd1f5431 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Barry Warsaw04f357c2002-07-23 19:04:11 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
16 if verbose: print "checking", expr
17 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
29 if verbose: print "checking", expr
30 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
32 # XXX Hack so this passes before 2.3 when -Qnew is specified.
33 if meth == "__div__" and 1/2 == 0.5:
34 meth = "__truediv__"
35
Guido van Rossum45704552001-10-08 16:35:45 +000036 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 t = type(a)
38 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000039 while meth not in t.__dict__:
40 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000041 vereq(m, t.__dict__[meth])
42 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045
46def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
47 if verbose: print "checking", expr
48 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000049 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 t = type(a)
51 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000052 while meth not in t.__dict__:
53 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000054 vereq(m, t.__dict__[meth])
55 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000056 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058
59def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
60 if verbose: print "checking", stmt
61 dict = {'a': deepcopy(a), 'b': b}
62 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 t = type(a)
65 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000066 while meth not in t.__dict__:
67 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000068 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000069 dict['a'] = deepcopy(a)
70 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict['a'] = deepcopy(a)
73 bm = getattr(dict['a'], meth)
74 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076
77def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
78 if verbose: print "checking", stmt
79 dict = {'a': deepcopy(a), 'b': b, 'c': c}
80 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000081 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 t = type(a)
83 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000084 while meth not in t.__dict__:
85 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 dict['a'] = deepcopy(a)
88 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict['a'] = deepcopy(a)
91 bm = getattr(dict['a'], meth)
92 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094
95def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
96 if verbose: print "checking", stmt
97 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
98 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000099 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000101 while meth not in t.__dict__:
102 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105 dict['a'] = deepcopy(a)
106 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108 dict['a'] = deepcopy(a)
109 bm = getattr(dict['a'], meth)
110 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000111 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000112
Tim Peters2f93e282001-10-04 05:27:00 +0000113def class_docstrings():
114 class Classic:
115 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000116 vereq(Classic.__doc__, "A classic docstring.")
117 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000118
119 class Classic2:
120 pass
121 verify(Classic2.__doc__ is None)
122
Tim Peters4fb1fe82001-10-04 05:48:13 +0000123 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000124 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000125 vereq(NewStatic.__doc__, "Another docstring.")
126 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 pass
130 verify(NewStatic2.__doc__ is None)
131
Tim Peters4fb1fe82001-10-04 05:48:13 +0000132 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000133 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000134 vereq(NewDynamic.__doc__, "Another docstring.")
135 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000136
Tim Peters4fb1fe82001-10-04 05:48:13 +0000137 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000138 pass
139 verify(NewDynamic2.__doc__ is None)
140
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141def lists():
142 if verbose: print "Testing list operations..."
143 testbinop([1], [2], [1,2], "a+b", "__add__")
144 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
145 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
146 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
147 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
148 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
149 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
150 testunop([1,2,3], 3, "len(a)", "__len__")
151 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
152 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
153 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
154 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
155
156def dicts():
157 if verbose: print "Testing dict operations..."
158 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
159 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
160 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
161 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
162 d = {1:2,3:4}
163 l1 = []
164 for i in d.keys(): l1.append(i)
165 l = []
166 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 l = []
169 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000171 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000172 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000173 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 d = {1:2, 3:4}
175 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(eval(repr(d), {}), d)
177 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
179
Tim Peters25786c02001-09-02 08:22:48 +0000180def dict_constructor():
181 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 print "Testing dict constructor ..."
183 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000186 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000187 d = dict(items={})
Guido van Rossum45704552001-10-08 16:35:45 +0000188 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000189 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000190 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000191 vereq(d, dict(d.items()))
192 vereq(d, dict(items=d.iteritems()))
Tim Peters25786c02001-09-02 08:22:48 +0000193 for badarg in 0, 0L, 0j, "0", [0], (0,):
194 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000195 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000196 except TypeError:
197 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000198 except ValueError:
199 if badarg == "0":
200 # It's a sequence, and its elements are also sequences (gotta
201 # love strings <wink>), but they aren't of length 2, so this
202 # one seemed better as a ValueError than a TypeError.
203 pass
204 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000205 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000206 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000207 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000208 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000209 dict(senseless={})
Tim Peters25786c02001-09-02 08:22:48 +0000210 except TypeError:
211 pass
212 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000213 raise TestFailed("no TypeError from dict(senseless={})")
Tim Peters25786c02001-09-02 08:22:48 +0000214
215 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000216 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000217 except TypeError:
218 pass
219 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000220 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000221
222 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000223 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000224 dict = {1:2, 3:4, 'a':1j}
225
Tim Peters25786c02001-09-02 08:22:48 +0000226 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000227 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000228 except TypeError:
229 pass
230 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000231 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000232
233 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000234 Mapping.__getitem__ = lambda self, i: self.dict[i]
Tim Petersa427a2b2001-10-29 22:25:45 +0000235 d = dict(items=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000236 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000237
Tim Peters1fc240e2001-10-26 05:06:50 +0000238 # Init from sequence of iterable objects, each producing a 2-sequence.
239 class AddressBookEntry:
240 def __init__(self, first, last):
241 self.first = first
242 self.last = last
243 def __iter__(self):
244 return iter([self.first, self.last])
245
Tim Petersa427a2b2001-10-29 22:25:45 +0000246 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000247 AddressBookEntry('Barry', 'Peters'),
248 AddressBookEntry('Tim', 'Peters'),
249 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000250 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
251
Tim Petersa427a2b2001-10-29 22:25:45 +0000252 d = dict(zip(range(4), range(1, 5)))
253 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000254
255 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000256 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000257 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000258 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000259 except ValueError:
260 pass
261 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000262 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000263
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264def test_dir():
265 if verbose:
266 print "Testing dir() ..."
267 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000268 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000269 del junk
270
271 # Just make sure these don't blow up!
272 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
273 dir(arg)
274
Tim Peters37a309d2001-09-04 01:20:04 +0000275 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000276 class C:
277 Cdata = 1
278 def Cmethod(self): pass
279
280 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000281 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000282 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000283
284 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000285 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000286
287 c.cdata = 2
288 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000289 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000290 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291
292 class A(C):
293 Adata = 1
294 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000295
Tim Peters37a309d2001-09-04 01:20:04 +0000296 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000297 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000298 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000299 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000300 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000301 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000302 a.adata = 42
303 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000304 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000305
306 # The same, but with new-style classes. Since these have object as a
307 # base class, a lot more gets sucked in.
308 def interesting(strings):
309 return [s for s in strings if not s.startswith('_')]
310
Tim Peters5d2b77c2001-09-03 05:47:38 +0000311 class C(object):
312 Cdata = 1
313 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000314
315 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000316 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000317
318 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000319 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000320 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000321
322 c.cdata = 2
323 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000324 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000325 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000326
Tim Peters5d2b77c2001-09-03 05:47:38 +0000327 class A(C):
328 Adata = 1
329 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000330
331 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000332 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000333 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000334 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000335 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000336 a.adata = 42
337 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000338 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000339 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000340
Tim Peterscaaff8d2001-09-10 23:12:14 +0000341 # Try a module subclass.
342 import sys
343 class M(type(sys)):
344 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000345 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000346 minstance.b = 2
347 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000348 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
349 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000350
351 class M2(M):
352 def getdict(self):
353 return "Not a dict!"
354 __dict__ = property(getdict)
355
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000356 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000357 m2instance.b = 2
358 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000359 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000360 try:
361 dir(m2instance)
362 except TypeError:
363 pass
364
Tim Peters9e6a3992001-10-30 05:45:26 +0000365 # Two essentially featureless objects, just inheriting stuff from
366 # object.
367 vereq(dir(None), dir(Ellipsis))
368
Guido van Rossum44022412002-05-13 18:29:46 +0000369 # Nasty test case for proxied objects
370 class Wrapper(object):
371 def __init__(self, obj):
372 self.__obj = obj
373 def __repr__(self):
374 return "Wrapper(%s)" % repr(self.__obj)
375 def __getitem__(self, key):
376 return Wrapper(self.__obj[key])
377 def __len__(self):
378 return len(self.__obj)
379 def __getattr__(self, name):
380 return Wrapper(getattr(self.__obj, name))
381
382 class C(object):
383 def __getclass(self):
384 return Wrapper(type(self))
385 __class__ = property(__getclass)
386
387 dir(C()) # This used to segfault
388
Tim Peters6d6c1a32001-08-02 04:15:00 +0000389binops = {
390 'add': '+',
391 'sub': '-',
392 'mul': '*',
393 'div': '/',
394 'mod': '%',
395 'divmod': 'divmod',
396 'pow': '**',
397 'lshift': '<<',
398 'rshift': '>>',
399 'and': '&',
400 'xor': '^',
401 'or': '|',
402 'cmp': 'cmp',
403 'lt': '<',
404 'le': '<=',
405 'eq': '==',
406 'ne': '!=',
407 'gt': '>',
408 'ge': '>=',
409 }
410
411for name, expr in binops.items():
412 if expr.islower():
413 expr = expr + "(a, b)"
414 else:
415 expr = 'a %s b' % expr
416 binops[name] = expr
417
418unops = {
419 'pos': '+',
420 'neg': '-',
421 'abs': 'abs',
422 'invert': '~',
423 'int': 'int',
424 'long': 'long',
425 'float': 'float',
426 'oct': 'oct',
427 'hex': 'hex',
428 }
429
430for name, expr in unops.items():
431 if expr.islower():
432 expr = expr + "(a)"
433 else:
434 expr = '%s a' % expr
435 unops[name] = expr
436
437def numops(a, b, skip=[]):
438 dict = {'a': a, 'b': b}
439 for name, expr in binops.items():
440 if name not in skip:
441 name = "__%s__" % name
442 if hasattr(a, name):
443 res = eval(expr, dict)
444 testbinop(a, b, res, expr, name)
445 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000446 if name not in skip:
447 name = "__%s__" % name
448 if hasattr(a, name):
449 res = eval(expr, dict)
450 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451
452def ints():
453 if verbose: print "Testing int operations..."
454 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000455 # The following crashes in Python 2.2
456 vereq((1).__nonzero__(), 1)
457 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000458 # This returns 'NotImplemented' in Python 2.2
459 class C(int):
460 def __add__(self, other):
461 return NotImplemented
462 try:
463 C() + ""
464 except TypeError:
465 pass
466 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000467 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000468
469def longs():
470 if verbose: print "Testing long operations..."
471 numops(100L, 3L)
472
473def floats():
474 if verbose: print "Testing float operations..."
475 numops(100.0, 3.0)
476
477def complexes():
478 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000479 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000480 class Number(complex):
481 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000482 def __new__(cls, *args, **kwds):
483 result = complex.__new__(cls, *args)
484 result.prec = kwds.get('prec', 12)
485 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000486 def __repr__(self):
487 prec = self.prec
488 if self.imag == 0.0:
489 return "%.*g" % (prec, self.real)
490 if self.real == 0.0:
491 return "%.*gj" % (prec, self.imag)
492 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
493 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000494
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000496 vereq(`a`, "3.14")
497 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000498
Tim Peters3f996e72001-09-13 19:18:27 +0000499 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000500 vereq(`a`, "3.1")
501 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000502
503 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000504 vereq(`a`, "234.5")
505 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000506
Tim Peters6d6c1a32001-08-02 04:15:00 +0000507def spamlists():
508 if verbose: print "Testing spamlist operations..."
509 import copy, xxsubtype as spam
510 def spamlist(l, memo=None):
511 import xxsubtype as spam
512 return spam.spamlist(l)
513 # This is an ugly hack:
514 copy._deepcopy_dispatch[spam.spamlist] = spamlist
515
516 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
517 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
518 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
519 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
520 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
521 "a[b:c]", "__getslice__")
522 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
523 "a+=b", "__iadd__")
524 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
525 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
526 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
527 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
528 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
529 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
530 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
531 # Test subclassing
532 class C(spam.spamlist):
533 def foo(self): return 1
534 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000535 vereq(a, [])
536 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000537 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000538 vereq(a, [100])
539 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000540 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000541 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000542
543def spamdicts():
544 if verbose: print "Testing spamdict operations..."
545 import copy, xxsubtype as spam
546 def spamdict(d, memo=None):
547 import xxsubtype as spam
548 sd = spam.spamdict()
549 for k, v in d.items(): sd[k] = v
550 return sd
551 # This is an ugly hack:
552 copy._deepcopy_dispatch[spam.spamdict] = spamdict
553
554 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
555 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
556 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
557 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
558 d = spamdict({1:2,3:4})
559 l1 = []
560 for i in d.keys(): l1.append(i)
561 l = []
562 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000563 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000564 l = []
565 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000566 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000567 l = []
568 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000569 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000570 straightd = {1:2, 3:4}
571 spamd = spamdict(straightd)
572 testunop(spamd, 2, "len(a)", "__len__")
573 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
574 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
575 "a[b]=c", "__setitem__")
576 # Test subclassing
577 class C(spam.spamdict):
578 def foo(self): return 1
579 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a.items(), [])
581 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.items(), [('foo', 'bar')])
584 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000587
588def pydicts():
589 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000590 verify(issubclass(dict, dict))
591 verify(isinstance({}, dict))
592 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000594 verify(d.__class__ is dict)
595 verify(isinstance(d, dict))
596 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597 state = -1
598 def __init__(self, *a, **kw):
599 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000600 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000601 self.state = a[0]
602 if kw:
603 for k, v in kw.items(): self[v] = k
604 def __getitem__(self, key):
605 return self.get(key, 0)
606 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000607 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000608 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000609 def setstate(self, state):
610 self.state = state
611 def getstate(self):
612 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000613 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000615 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000616 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000617 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000618 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000619 vereq(a.state, -1)
620 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000622 vereq(a.state, 0)
623 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000625 vereq(a.state, 10)
626 vereq(a.getstate(), 10)
627 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 if verbose: print "pydict stress test ..."
631 N = 50
632 for i in range(N):
633 a[i] = C()
634 for j in range(N):
635 a[i][j] = i*j
636 for i in range(N):
637 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000638 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000639
640def pylists():
641 if verbose: print "Testing Python subclass of list..."
642 class C(list):
643 def __getitem__(self, i):
644 return list.__getitem__(self, i) + 100
645 def __getslice__(self, i, j):
646 return (i, j)
647 a = C()
648 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000649 vereq(a[0], 100)
650 vereq(a[1], 101)
651 vereq(a[2], 102)
652 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000653
654def metaclass():
655 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000656 class C:
657 __metaclass__ = type
658 def __init__(self):
659 self.__state = 0
660 def getstate(self):
661 return self.__state
662 def setstate(self, state):
663 self.__state = state
664 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000665 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000666 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000667 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000668 class D:
669 class __metaclass__(type):
670 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000671 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000672 d = D()
673 verify(d.__class__ is D)
674 class M1(type):
675 def __new__(cls, name, bases, dict):
676 dict['__spam__'] = 1
677 return type.__new__(cls, name, bases, dict)
678 class C:
679 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000680 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000681 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000682 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000683
Guido van Rossum309b5662001-08-17 11:43:17 +0000684 class _instance(object):
685 pass
686 class M2(object):
687 def __new__(cls, name, bases, dict):
688 self = object.__new__(cls)
689 self.name = name
690 self.bases = bases
691 self.dict = dict
692 return self
693 __new__ = staticmethod(__new__)
694 def __call__(self):
695 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000696 # Early binding of methods
697 for key in self.dict:
698 if key.startswith("__"):
699 continue
700 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000701 return it
702 class C:
703 __metaclass__ = M2
704 def spam(self):
705 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000706 vereq(C.name, 'C')
707 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000708 verify('spam' in C.dict)
709 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000710 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000711
Guido van Rossum91ee7982001-08-30 20:52:40 +0000712 # More metaclass examples
713
714 class autosuper(type):
715 # Automatically add __super to the class
716 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000718 cls = super(autosuper, metaclass).__new__(metaclass,
719 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000720 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000721 while name[:1] == "_":
722 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000723 if name:
724 name = "_%s__super" % name
725 else:
726 name = "__super"
727 setattr(cls, name, super(cls))
728 return cls
729 class A:
730 __metaclass__ = autosuper
731 def meth(self):
732 return "A"
733 class B(A):
734 def meth(self):
735 return "B" + self.__super.meth()
736 class C(A):
737 def meth(self):
738 return "C" + self.__super.meth()
739 class D(C, B):
740 def meth(self):
741 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000742 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000743 class E(B, C):
744 def meth(self):
745 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000746 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000747
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000748 class autoproperty(type):
749 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000750 # named _get_x and/or _set_x are found
751 def __new__(metaclass, name, bases, dict):
752 hits = {}
753 for key, val in dict.iteritems():
754 if key.startswith("_get_"):
755 key = key[5:]
756 get, set = hits.get(key, (None, None))
757 get = val
758 hits[key] = get, set
759 elif key.startswith("_set_"):
760 key = key[5:]
761 get, set = hits.get(key, (None, None))
762 set = val
763 hits[key] = get, set
764 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000765 dict[key] = property(get, set)
766 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000767 name, bases, dict)
768 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000769 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000770 def _get_x(self):
771 return -self.__x
772 def _set_x(self, x):
773 self.__x = -x
774 a = A()
775 verify(not hasattr(a, "x"))
776 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000777 vereq(a.x, 12)
778 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000779
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000780 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000781 # Merge of multiple cooperating metaclasses
782 pass
783 class A:
784 __metaclass__ = multimetaclass
785 def _get_x(self):
786 return "A"
787 class B(A):
788 def _get_x(self):
789 return "B" + self.__super._get_x()
790 class C(A):
791 def _get_x(self):
792 return "C" + self.__super._get_x()
793 class D(C, B):
794 def _get_x(self):
795 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000796 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000797
Guido van Rossumf76de622001-10-18 15:49:21 +0000798 # Make sure type(x) doesn't call x.__class__.__init__
799 class T(type):
800 counter = 0
801 def __init__(self, *args):
802 T.counter += 1
803 class C:
804 __metaclass__ = T
805 vereq(T.counter, 1)
806 a = C()
807 vereq(type(a), C)
808 vereq(T.counter, 1)
809
Guido van Rossum29d26062001-12-11 04:37:34 +0000810 class C(object): pass
811 c = C()
812 try: c()
813 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000814 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000815
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816def pymods():
817 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000818 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000819 import sys
820 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000821 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000822 def __init__(self, name):
823 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000824 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000826 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827 def __setattr__(self, name, value):
828 log.append(("setattr", name, value))
829 MT.__setattr__(self, name, value)
830 def __delattr__(self, name):
831 log.append(("delattr", name))
832 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000833 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 a.foo = 12
835 x = a.foo
836 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000837 vereq(log, [("setattr", "foo", 12),
838 ("getattr", "foo"),
839 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840
841def multi():
842 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 class C(object):
844 def __init__(self):
845 self.__state = 0
846 def getstate(self):
847 return self.__state
848 def setstate(self, state):
849 self.__state = state
850 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000851 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000852 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000853 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000854 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855 def __init__(self):
856 type({}).__init__(self)
857 C.__init__(self)
858 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000859 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000861 vereq(d.items(), [("hello", "world")])
862 vereq(d["hello"], "world")
863 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000865 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000866 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867
Guido van Rossume45763a2001-08-10 21:28:46 +0000868 # SF bug #442833
869 class Node(object):
870 def __int__(self):
871 return int(self.foo())
872 def foo(self):
873 return "23"
874 class Frag(Node, list):
875 def foo(self):
876 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(Node().__int__(), 23)
878 vereq(int(Node()), 23)
879 vereq(Frag().__int__(), 42)
880 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000881
Tim Petersa91e9642001-11-14 23:32:33 +0000882 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000883
884 class A:
885 x = 1
886
887 class B(A):
888 pass
889
890 class C(A):
891 x = 2
892
893 class D(B, C):
894 pass
895 vereq(D.x, 1)
896
897 # Classic MRO is preserved for a classic base class.
898 class E(D, object):
899 pass
900 vereq(E.__mro__, (E, D, B, A, C, object))
901 vereq(E.x, 1)
902
903 # But with a mix of classic bases, their MROs are combined using
904 # new-style MRO.
905 class F(B, C, object):
906 pass
907 vereq(F.__mro__, (F, B, C, A, object))
908 vereq(F.x, 2)
909
910 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000911 class C:
912 def cmethod(self):
913 return "C a"
914 def all_method(self):
915 return "C b"
916
917 class M1(C, object):
918 def m1method(self):
919 return "M1 a"
920 def all_method(self):
921 return "M1 b"
922
923 vereq(M1.__mro__, (M1, C, object))
924 m = M1()
925 vereq(m.cmethod(), "C a")
926 vereq(m.m1method(), "M1 a")
927 vereq(m.all_method(), "M1 b")
928
929 class D(C):
930 def dmethod(self):
931 return "D a"
932 def all_method(self):
933 return "D b"
934
935 class M2(object, D):
936 def m2method(self):
937 return "M2 a"
938 def all_method(self):
939 return "M2 b"
940
941 vereq(M2.__mro__, (M2, object, D, C))
942 m = M2()
943 vereq(m.cmethod(), "C a")
944 vereq(m.dmethod(), "D a")
945 vereq(m.m2method(), "M2 a")
946 vereq(m.all_method(), "M2 b")
947
948 class M3(M1, object, M2):
949 def m3method(self):
950 return "M3 a"
951 def all_method(self):
952 return "M3 b"
953 # XXX Expected this (the commented-out result):
954 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
955 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000956 m = M3()
957 vereq(m.cmethod(), "C a")
958 vereq(m.dmethod(), "D a")
959 vereq(m.m1method(), "M1 a")
960 vereq(m.m2method(), "M2 a")
961 vereq(m.m3method(), "M3 a")
962 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000963
Guido van Rossume54616c2001-12-14 04:19:56 +0000964 class Classic:
965 pass
966 try:
967 class New(Classic):
968 __metaclass__ = type
969 except TypeError:
970 pass
971 else:
972 raise TestFailed, "new class with only classic bases - shouldn't be"
973
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974def diamond():
975 if verbose: print "Testing multiple inheritance special cases..."
976 class A(object):
977 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000978 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000979 class B(A):
980 def boo(self): return "B"
981 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000982 vereq(B().spam(), "B")
983 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 class C(A):
985 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000986 vereq(C().spam(), "A")
987 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000988 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000989 vereq(D().spam(), "B")
990 vereq(D().boo(), "B")
991 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000992 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000993 vereq(E().spam(), "B")
994 vereq(E().boo(), "C")
995 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000996 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000997 vereq(F().spam(), "B")
998 vereq(F().boo(), "B")
999 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001000 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001001 vereq(G().spam(), "B")
1002 vereq(G().boo(), "C")
1003 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001004
Guido van Rossum37202612001-08-09 19:45:21 +00001005def objects():
1006 if verbose: print "Testing object class..."
1007 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001008 vereq(a.__class__, object)
1009 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001010 b = object()
1011 verify(a is not b)
1012 verify(not hasattr(a, "foo"))
1013 try:
1014 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001015 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001016 pass
1017 else:
1018 verify(0, "object() should not allow setting a foo attribute")
1019 verify(not hasattr(object(), "__dict__"))
1020
1021 class Cdict(object):
1022 pass
1023 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001024 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001025 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001026 vereq(x.foo, 1)
1027 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001028
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029def slots():
1030 if verbose: print "Testing __slots__..."
1031 class C0(object):
1032 __slots__ = []
1033 x = C0()
1034 verify(not hasattr(x, "__dict__"))
1035 verify(not hasattr(x, "foo"))
1036
1037 class C1(object):
1038 __slots__ = ['a']
1039 x = C1()
1040 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001041 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001042 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001043 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001044 x.a = None
1045 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001046 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001047 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001048
1049 class C3(object):
1050 __slots__ = ['a', 'b', 'c']
1051 x = C3()
1052 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001053 verify(not hasattr(x, 'a'))
1054 verify(not hasattr(x, 'b'))
1055 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056 x.a = 1
1057 x.b = 2
1058 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001059 vereq(x.a, 1)
1060 vereq(x.b, 2)
1061 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001062
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001063 class C4(object):
1064 """Validate name mangling"""
1065 __slots__ = ['__a']
1066 def __init__(self, value):
1067 self.__a = value
1068 def get(self):
1069 return self.__a
1070 x = C4(5)
1071 verify(not hasattr(x, '__dict__'))
1072 verify(not hasattr(x, '__a'))
1073 vereq(x.get(), 5)
1074 try:
1075 x.__a = 6
1076 except AttributeError:
1077 pass
1078 else:
1079 raise TestFailed, "Double underscored names not mangled"
1080
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001081 # Make sure slot names are proper identifiers
1082 try:
1083 class C(object):
1084 __slots__ = [None]
1085 except TypeError:
1086 pass
1087 else:
1088 raise TestFailed, "[None] slots not caught"
1089 try:
1090 class C(object):
1091 __slots__ = ["foo bar"]
1092 except TypeError:
1093 pass
1094 else:
1095 raise TestFailed, "['foo bar'] slots not caught"
1096 try:
1097 class C(object):
1098 __slots__ = ["foo\0bar"]
1099 except TypeError:
1100 pass
1101 else:
1102 raise TestFailed, "['foo\\0bar'] slots not caught"
1103 try:
1104 class C(object):
1105 __slots__ = ["1"]
1106 except TypeError:
1107 pass
1108 else:
1109 raise TestFailed, "['1'] slots not caught"
1110 try:
1111 class C(object):
1112 __slots__ = [""]
1113 except TypeError:
1114 pass
1115 else:
1116 raise TestFailed, "[''] slots not caught"
1117 class C(object):
1118 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1119
Guido van Rossum33bab012001-12-05 22:45:48 +00001120 # Test leaks
1121 class Counted(object):
1122 counter = 0 # counts the number of instances alive
1123 def __init__(self):
1124 Counted.counter += 1
1125 def __del__(self):
1126 Counted.counter -= 1
1127 class C(object):
1128 __slots__ = ['a', 'b', 'c']
1129 x = C()
1130 x.a = Counted()
1131 x.b = Counted()
1132 x.c = Counted()
1133 vereq(Counted.counter, 3)
1134 del x
1135 vereq(Counted.counter, 0)
1136 class D(C):
1137 pass
1138 x = D()
1139 x.a = Counted()
1140 x.z = Counted()
1141 vereq(Counted.counter, 2)
1142 del x
1143 vereq(Counted.counter, 0)
1144 class E(D):
1145 __slots__ = ['e']
1146 x = E()
1147 x.a = Counted()
1148 x.z = Counted()
1149 x.e = Counted()
1150 vereq(Counted.counter, 3)
1151 del x
1152 vereq(Counted.counter, 0)
1153
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001154 # Test cyclical leaks [SF bug 519621]
1155 class F(object):
1156 __slots__ = ['a', 'b']
1157 log = []
1158 s = F()
1159 s.a = [Counted(), s]
1160 vereq(Counted.counter, 1)
1161 s = None
1162 import gc
1163 gc.collect()
1164 vereq(Counted.counter, 0)
1165
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001166 # Test lookup leaks [SF bug 572567]
1167 import sys,gc
1168 class G(object):
1169 def __cmp__(self, other):
1170 return 0
1171 g = G()
1172 orig_objects = len(gc.get_objects())
1173 for i in xrange(10):
1174 g==g
1175 new_objects = len(gc.get_objects())
1176 vereq(orig_objects, new_objects)
1177
Guido van Rossum8b056da2002-08-13 18:26:26 +00001178def slotspecials():
1179 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1180
1181 class D(object):
1182 __slots__ = ["__dict__"]
1183 a = D()
1184 verify(hasattr(a, "__dict__"))
1185 verify(not hasattr(a, "__weakref__"))
1186 a.foo = 42
1187 vereq(a.__dict__, {"foo": 42})
1188
1189 class W(object):
1190 __slots__ = ["__weakref__"]
1191 a = W()
1192 verify(hasattr(a, "__weakref__"))
1193 verify(not hasattr(a, "__dict__"))
1194 try:
1195 a.foo = 42
1196 except AttributeError:
1197 pass
1198 else:
1199 raise TestFailed, "shouldn't be allowed to set a.foo"
1200
1201 class C1(W, D):
1202 __slots__ = []
1203 a = C1()
1204 verify(hasattr(a, "__dict__"))
1205 verify(hasattr(a, "__weakref__"))
1206 a.foo = 42
1207 vereq(a.__dict__, {"foo": 42})
1208
1209 class C2(D, W):
1210 __slots__ = []
1211 a = C2()
1212 verify(hasattr(a, "__dict__"))
1213 verify(hasattr(a, "__weakref__"))
1214 a.foo = 42
1215 vereq(a.__dict__, {"foo": 42})
1216
1217 class C3(C1, C2):
1218 __slots__ = []
1219
1220 class C4(C2, C1):
1221 __slots__ = []
1222
Tim Peters6d6c1a32001-08-02 04:15:00 +00001223def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001224 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001225 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001226 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001227 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001228 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001229 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001230 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001231 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001232 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001233 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001234 vereq(E.foo, 1)
1235 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001236 # Test dynamic instances
1237 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001238 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001239 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001240 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001241 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001242 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001243 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001244 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001245 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001246 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001247 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001248 vereq(int(a), 100)
1249 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001250 verify(not hasattr(a, "spam"))
1251 def mygetattr(self, name):
1252 if name == "spam":
1253 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001254 raise AttributeError
1255 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001256 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001257 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001258 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001259 def mysetattr(self, name, value):
1260 if name == "spam":
1261 raise AttributeError
1262 return object.__setattr__(self, name, value)
1263 C.__setattr__ = mysetattr
1264 try:
1265 a.spam = "not spam"
1266 except AttributeError:
1267 pass
1268 else:
1269 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001270 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001271 class D(C):
1272 pass
1273 d = D()
1274 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001275 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001276
Guido van Rossum7e35d572001-09-15 03:14:32 +00001277 # Test handling of int*seq and seq*int
1278 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001279 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001280 vereq("a"*I(2), "aa")
1281 vereq(I(2)*"a", "aa")
1282 vereq(2*I(3), 6)
1283 vereq(I(3)*2, 6)
1284 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001285
1286 # Test handling of long*seq and seq*long
1287 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001288 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001289 vereq("a"*L(2L), "aa")
1290 vereq(L(2L)*"a", "aa")
1291 vereq(2*L(3), 6)
1292 vereq(L(3)*2, 6)
1293 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001294
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001295 # Test comparison of classes with dynamic metaclasses
1296 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001297 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001298 class someclass:
1299 __metaclass__ = dynamicmetaclass
1300 verify(someclass != object)
1301
Tim Peters6d6c1a32001-08-02 04:15:00 +00001302def errors():
1303 if verbose: print "Testing errors..."
1304
1305 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001306 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001307 pass
1308 except TypeError:
1309 pass
1310 else:
1311 verify(0, "inheritance from both list and dict should be illegal")
1312
1313 try:
1314 class C(object, None):
1315 pass
1316 except TypeError:
1317 pass
1318 else:
1319 verify(0, "inheritance from non-type should be illegal")
1320 class Classic:
1321 pass
1322
1323 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001324 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001325 pass
1326 except TypeError:
1327 pass
1328 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001329 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001330
1331 try:
1332 class C(object):
1333 __slots__ = 1
1334 except TypeError:
1335 pass
1336 else:
1337 verify(0, "__slots__ = 1 should be illegal")
1338
1339 try:
1340 class C(object):
1341 __slots__ = [1]
1342 except TypeError:
1343 pass
1344 else:
1345 verify(0, "__slots__ = [1] should be illegal")
1346
1347def classmethods():
1348 if verbose: print "Testing class methods..."
1349 class C(object):
1350 def foo(*a): return a
1351 goo = classmethod(foo)
1352 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001353 vereq(C.goo(1), (C, 1))
1354 vereq(c.goo(1), (C, 1))
1355 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001356 class D(C):
1357 pass
1358 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(D.goo(1), (D, 1))
1360 vereq(d.goo(1), (D, 1))
1361 vereq(d.foo(1), (d, 1))
1362 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001363 # Test for a specific crash (SF bug 528132)
1364 def f(cls, arg): return (cls, arg)
1365 ff = classmethod(f)
1366 vereq(ff.__get__(0, int)(42), (int, 42))
1367 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001368
Guido van Rossum155db9a2002-04-02 17:53:47 +00001369 # Test super() with classmethods (SF bug 535444)
1370 veris(C.goo.im_self, C)
1371 veris(D.goo.im_self, D)
1372 veris(super(D,D).goo.im_self, D)
1373 veris(super(D,d).goo.im_self, D)
1374 vereq(super(D,D).goo(), (D,))
1375 vereq(super(D,d).goo(), (D,))
1376
Fred Drakef841aa62002-03-28 15:49:54 +00001377def classmethods_in_c():
1378 if verbose: print "Testing C-based class methods..."
1379 import xxsubtype as spam
1380 a = (1, 2, 3)
1381 d = {'abc': 123}
1382 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1383 veris(x, None)
1384 vereq((spam.spamlist,) + a, a1)
1385 vereq(d, d1)
1386 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1387 veris(x, None)
1388 vereq((spam.spamlist,) + a, a1)
1389 vereq(d, d1)
1390
Tim Peters6d6c1a32001-08-02 04:15:00 +00001391def staticmethods():
1392 if verbose: print "Testing static methods..."
1393 class C(object):
1394 def foo(*a): return a
1395 goo = staticmethod(foo)
1396 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001397 vereq(C.goo(1), (1,))
1398 vereq(c.goo(1), (1,))
1399 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001400 class D(C):
1401 pass
1402 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001403 vereq(D.goo(1), (1,))
1404 vereq(d.goo(1), (1,))
1405 vereq(d.foo(1), (d, 1))
1406 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001407
Fred Drakef841aa62002-03-28 15:49:54 +00001408def staticmethods_in_c():
1409 if verbose: print "Testing C-based static methods..."
1410 import xxsubtype as spam
1411 a = (1, 2, 3)
1412 d = {"abc": 123}
1413 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1414 veris(x, None)
1415 vereq(a, a1)
1416 vereq(d, d1)
1417 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1418 veris(x, None)
1419 vereq(a, a1)
1420 vereq(d, d1)
1421
Tim Peters6d6c1a32001-08-02 04:15:00 +00001422def classic():
1423 if verbose: print "Testing classic classes..."
1424 class C:
1425 def foo(*a): return a
1426 goo = classmethod(foo)
1427 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001428 vereq(C.goo(1), (C, 1))
1429 vereq(c.goo(1), (C, 1))
1430 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001431 class D(C):
1432 pass
1433 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq(D.goo(1), (D, 1))
1435 vereq(d.goo(1), (D, 1))
1436 vereq(d.foo(1), (d, 1))
1437 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001438 class E: # *not* subclassing from C
1439 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001440 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001441 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001442
1443def compattr():
1444 if verbose: print "Testing computed attributes..."
1445 class C(object):
1446 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001447 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001448 self.__get = get
1449 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001450 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001451 def __get__(self, obj, type=None):
1452 return self.__get(obj)
1453 def __set__(self, obj, value):
1454 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001455 def __delete__(self, obj):
1456 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001457 def __init__(self):
1458 self.__x = 0
1459 def __get_x(self):
1460 x = self.__x
1461 self.__x = x+1
1462 return x
1463 def __set_x(self, x):
1464 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001465 def __delete_x(self):
1466 del self.__x
1467 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001468 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001469 vereq(a.x, 0)
1470 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001471 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001472 vereq(a.x, 10)
1473 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001474 del a.x
1475 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001476
1477def newslot():
1478 if verbose: print "Testing __new__ slot override..."
1479 class C(list):
1480 def __new__(cls):
1481 self = list.__new__(cls)
1482 self.foo = 1
1483 return self
1484 def __init__(self):
1485 self.foo = self.foo + 2
1486 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001487 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001488 verify(a.__class__ is C)
1489 class D(C):
1490 pass
1491 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001492 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001493 verify(b.__class__ is D)
1494
Tim Peters6d6c1a32001-08-02 04:15:00 +00001495def altmro():
1496 if verbose: print "Testing mro() and overriding it..."
1497 class A(object):
1498 def f(self): return "A"
1499 class B(A):
1500 pass
1501 class C(A):
1502 def f(self): return "C"
1503 class D(B, C):
1504 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001505 vereq(D.mro(), [D, B, C, A, object])
1506 vereq(D.__mro__, (D, B, C, A, object))
1507 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001508 class PerverseMetaType(type):
1509 def mro(cls):
1510 L = type.mro(cls)
1511 L.reverse()
1512 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513 class X(A,B,C,D):
1514 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001515 vereq(X.__mro__, (object, A, C, B, D, X))
1516 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001517
1518def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001519 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001520
1521 class B(object):
1522 "Intermediate class because object doesn't have a __setattr__"
1523
1524 class C(B):
1525
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001526 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001527 if name == "foo":
1528 return ("getattr", name)
1529 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001530 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001531 def __setattr__(self, name, value):
1532 if name == "foo":
1533 self.setattr = (name, value)
1534 else:
1535 return B.__setattr__(self, name, value)
1536 def __delattr__(self, name):
1537 if name == "foo":
1538 self.delattr = name
1539 else:
1540 return B.__delattr__(self, name)
1541
1542 def __getitem__(self, key):
1543 return ("getitem", key)
1544 def __setitem__(self, key, value):
1545 self.setitem = (key, value)
1546 def __delitem__(self, key):
1547 self.delitem = key
1548
1549 def __getslice__(self, i, j):
1550 return ("getslice", i, j)
1551 def __setslice__(self, i, j, value):
1552 self.setslice = (i, j, value)
1553 def __delslice__(self, i, j):
1554 self.delslice = (i, j)
1555
1556 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001557 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001558 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001559 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001560 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001561 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001562
Guido van Rossum45704552001-10-08 16:35:45 +00001563 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001564 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001565 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001566 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001567 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001568
Guido van Rossum45704552001-10-08 16:35:45 +00001569 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001570 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001571 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001572 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001573 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001574
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001575def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001576 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001577 class C(object):
1578 def __init__(self, x):
1579 self.x = x
1580 def foo(self):
1581 return self.x
1582 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001584 class D(C):
1585 boo = C.foo
1586 goo = c1.foo
1587 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001588 vereq(d2.foo(), 2)
1589 vereq(d2.boo(), 2)
1590 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001591 class E(object):
1592 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001593 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001594 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001595
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001596def specials():
1597 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001598 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001599 # Test the default behavior for static classes
1600 class C(object):
1601 def __getitem__(self, i):
1602 if 0 <= i < 10: return i
1603 raise IndexError
1604 c1 = C()
1605 c2 = C()
1606 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001607 vereq(hash(c1), id(c1))
1608 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1609 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001610 verify(c1 != c2)
1611 verify(not c1 != c1)
1612 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001613 # Note that the module name appears in str/repr, and that varies
1614 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001615 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001616 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001617 verify(-1 not in c1)
1618 for i in range(10):
1619 verify(i in c1)
1620 verify(10 not in c1)
1621 # Test the default behavior for dynamic classes
1622 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001623 def __getitem__(self, i):
1624 if 0 <= i < 10: return i
1625 raise IndexError
1626 d1 = D()
1627 d2 = D()
1628 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001629 vereq(hash(d1), id(d1))
1630 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1631 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001632 verify(d1 != d2)
1633 verify(not d1 != d1)
1634 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001635 # Note that the module name appears in str/repr, and that varies
1636 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001637 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001638 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001639 verify(-1 not in d1)
1640 for i in range(10):
1641 verify(i in d1)
1642 verify(10 not in d1)
1643 # Test overridden behavior for static classes
1644 class Proxy(object):
1645 def __init__(self, x):
1646 self.x = x
1647 def __nonzero__(self):
1648 return not not self.x
1649 def __hash__(self):
1650 return hash(self.x)
1651 def __eq__(self, other):
1652 return self.x == other
1653 def __ne__(self, other):
1654 return self.x != other
1655 def __cmp__(self, other):
1656 return cmp(self.x, other.x)
1657 def __str__(self):
1658 return "Proxy:%s" % self.x
1659 def __repr__(self):
1660 return "Proxy(%r)" % self.x
1661 def __contains__(self, value):
1662 return value in self.x
1663 p0 = Proxy(0)
1664 p1 = Proxy(1)
1665 p_1 = Proxy(-1)
1666 verify(not p0)
1667 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001668 vereq(hash(p0), hash(0))
1669 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001670 verify(p0 != p1)
1671 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001672 vereq(not p0, p1)
1673 vereq(cmp(p0, p1), -1)
1674 vereq(cmp(p0, p0), 0)
1675 vereq(cmp(p0, p_1), 1)
1676 vereq(str(p0), "Proxy:0")
1677 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001678 p10 = Proxy(range(10))
1679 verify(-1 not in p10)
1680 for i in range(10):
1681 verify(i in p10)
1682 verify(10 not in p10)
1683 # Test overridden behavior for dynamic classes
1684 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001685 def __init__(self, x):
1686 self.x = x
1687 def __nonzero__(self):
1688 return not not self.x
1689 def __hash__(self):
1690 return hash(self.x)
1691 def __eq__(self, other):
1692 return self.x == other
1693 def __ne__(self, other):
1694 return self.x != other
1695 def __cmp__(self, other):
1696 return cmp(self.x, other.x)
1697 def __str__(self):
1698 return "DProxy:%s" % self.x
1699 def __repr__(self):
1700 return "DProxy(%r)" % self.x
1701 def __contains__(self, value):
1702 return value in self.x
1703 p0 = DProxy(0)
1704 p1 = DProxy(1)
1705 p_1 = DProxy(-1)
1706 verify(not p0)
1707 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001708 vereq(hash(p0), hash(0))
1709 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001710 verify(p0 != p1)
1711 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001712 vereq(not p0, p1)
1713 vereq(cmp(p0, p1), -1)
1714 vereq(cmp(p0, p0), 0)
1715 vereq(cmp(p0, p_1), 1)
1716 vereq(str(p0), "DProxy:0")
1717 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001718 p10 = DProxy(range(10))
1719 verify(-1 not in p10)
1720 for i in range(10):
1721 verify(i in p10)
1722 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001723 # Safety test for __cmp__
1724 def unsafecmp(a, b):
1725 try:
1726 a.__class__.__cmp__(a, b)
1727 except TypeError:
1728 pass
1729 else:
1730 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1731 a.__class__, a, b)
1732 unsafecmp(u"123", "123")
1733 unsafecmp("123", u"123")
1734 unsafecmp(1, 1.0)
1735 unsafecmp(1.0, 1)
1736 unsafecmp(1, 1L)
1737 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001738
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001739def weakrefs():
1740 if verbose: print "Testing weak references..."
1741 import weakref
1742 class C(object):
1743 pass
1744 c = C()
1745 r = weakref.ref(c)
1746 verify(r() is c)
1747 del c
1748 verify(r() is None)
1749 del r
1750 class NoWeak(object):
1751 __slots__ = ['foo']
1752 no = NoWeak()
1753 try:
1754 weakref.ref(no)
1755 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001756 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001757 else:
1758 verify(0, "weakref.ref(no) should be illegal")
1759 class Weak(object):
1760 __slots__ = ['foo', '__weakref__']
1761 yes = Weak()
1762 r = weakref.ref(yes)
1763 verify(r() is yes)
1764 del yes
1765 verify(r() is None)
1766 del r
1767
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001768def properties():
1769 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001770 class C(object):
1771 def getx(self):
1772 return self.__x
1773 def setx(self, value):
1774 self.__x = value
1775 def delx(self):
1776 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001777 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001778 a = C()
1779 verify(not hasattr(a, "x"))
1780 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(a._C__x, 42)
1782 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001783 del a.x
1784 verify(not hasattr(a, "x"))
1785 verify(not hasattr(a, "_C__x"))
1786 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001787 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001788 C.x.__delete__(a)
1789 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001790
Tim Peters66c1a522001-09-24 21:17:50 +00001791 raw = C.__dict__['x']
1792 verify(isinstance(raw, property))
1793
1794 attrs = dir(raw)
1795 verify("__doc__" in attrs)
1796 verify("fget" in attrs)
1797 verify("fset" in attrs)
1798 verify("fdel" in attrs)
1799
Guido van Rossum45704552001-10-08 16:35:45 +00001800 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001801 verify(raw.fget is C.__dict__['getx'])
1802 verify(raw.fset is C.__dict__['setx'])
1803 verify(raw.fdel is C.__dict__['delx'])
1804
1805 for attr in "__doc__", "fget", "fset", "fdel":
1806 try:
1807 setattr(raw, attr, 42)
1808 except TypeError, msg:
1809 if str(msg).find('readonly') < 0:
1810 raise TestFailed("when setting readonly attr %r on a "
1811 "property, got unexpected TypeError "
1812 "msg %r" % (attr, str(msg)))
1813 else:
1814 raise TestFailed("expected TypeError from trying to set "
1815 "readonly %r attr on a property" % attr)
1816
Neal Norwitz673cd822002-10-18 16:33:13 +00001817 class D(object):
1818 __getitem__ = property(lambda s: 1/0)
1819
1820 d = D()
1821 try:
1822 for i in d:
1823 str(i)
1824 except ZeroDivisionError:
1825 pass
1826 else:
1827 raise TestFailed, "expected ZeroDivisionError from bad property"
1828
Guido van Rossumc4a18802001-08-24 16:55:27 +00001829def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001830 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001831
1832 class A(object):
1833 def meth(self, a):
1834 return "A(%r)" % a
1835
Guido van Rossum45704552001-10-08 16:35:45 +00001836 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001837
1838 class B(A):
1839 def __init__(self):
1840 self.__super = super(B, self)
1841 def meth(self, a):
1842 return "B(%r)" % a + self.__super.meth(a)
1843
Guido van Rossum45704552001-10-08 16:35:45 +00001844 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001845
1846 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001847 def meth(self, a):
1848 return "C(%r)" % a + self.__super.meth(a)
1849 C._C__super = super(C)
1850
Guido van Rossum45704552001-10-08 16:35:45 +00001851 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001852
1853 class D(C, B):
1854 def meth(self, a):
1855 return "D(%r)" % a + super(D, self).meth(a)
1856
Guido van Rossum5b443c62001-12-03 15:38:28 +00001857 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1858
1859 # Test for subclassing super
1860
1861 class mysuper(super):
1862 def __init__(self, *args):
1863 return super(mysuper, self).__init__(*args)
1864
1865 class E(D):
1866 def meth(self, a):
1867 return "E(%r)" % a + mysuper(E, self).meth(a)
1868
1869 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1870
1871 class F(E):
1872 def meth(self, a):
1873 s = self.__super
1874 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1875 F._F__super = mysuper(F)
1876
1877 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1878
1879 # Make sure certain errors are raised
1880
1881 try:
1882 super(D, 42)
1883 except TypeError:
1884 pass
1885 else:
1886 raise TestFailed, "shouldn't allow super(D, 42)"
1887
1888 try:
1889 super(D, C())
1890 except TypeError:
1891 pass
1892 else:
1893 raise TestFailed, "shouldn't allow super(D, C())"
1894
1895 try:
1896 super(D).__get__(12)
1897 except TypeError:
1898 pass
1899 else:
1900 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1901
1902 try:
1903 super(D).__get__(C())
1904 except TypeError:
1905 pass
1906 else:
1907 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001908
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001909def inherits():
1910 if verbose: print "Testing inheritance from basic types..."
1911
1912 class hexint(int):
1913 def __repr__(self):
1914 return hex(self)
1915 def __add__(self, other):
1916 return hexint(int.__add__(self, other))
1917 # (Note that overriding __radd__ doesn't work,
1918 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001919 vereq(repr(hexint(7) + 9), "0x10")
1920 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001921 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001922 vereq(a, 12345)
1923 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001924 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001925 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001926 verify((+a).__class__ is int)
1927 verify((a >> 0).__class__ is int)
1928 verify((a << 0).__class__ is int)
1929 verify((hexint(0) << 12).__class__ is int)
1930 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001931
1932 class octlong(long):
1933 __slots__ = []
1934 def __str__(self):
1935 s = oct(self)
1936 if s[-1] == 'L':
1937 s = s[:-1]
1938 return s
1939 def __add__(self, other):
1940 return self.__class__(super(octlong, self).__add__(other))
1941 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001942 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001943 # (Note that overriding __radd__ here only seems to work
1944 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001945 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001946 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001947 vereq(a, 12345L)
1948 vereq(long(a), 12345L)
1949 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001950 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001951 verify((+a).__class__ is long)
1952 verify((-a).__class__ is long)
1953 verify((-octlong(0)).__class__ is long)
1954 verify((a >> 0).__class__ is long)
1955 verify((a << 0).__class__ is long)
1956 verify((a - 0).__class__ is long)
1957 verify((a * 1).__class__ is long)
1958 verify((a ** 1).__class__ is long)
1959 verify((a // 1).__class__ is long)
1960 verify((1 * a).__class__ is long)
1961 verify((a | 0).__class__ is long)
1962 verify((a ^ 0).__class__ is long)
1963 verify((a & -1L).__class__ is long)
1964 verify((octlong(0) << 12).__class__ is long)
1965 verify((octlong(0) >> 12).__class__ is long)
1966 verify(abs(octlong(0)).__class__ is long)
1967
1968 # Because octlong overrides __add__, we can't check the absence of +0
1969 # optimizations using octlong.
1970 class longclone(long):
1971 pass
1972 a = longclone(1)
1973 verify((a + 0).__class__ is long)
1974 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001975
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001976 # Check that negative clones don't segfault
1977 a = longclone(-1)
1978 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001979 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001980
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001981 class precfloat(float):
1982 __slots__ = ['prec']
1983 def __init__(self, value=0.0, prec=12):
1984 self.prec = int(prec)
1985 float.__init__(value)
1986 def __repr__(self):
1987 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001988 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001989 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001990 vereq(a, 12345.0)
1991 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001992 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001993 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001994 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001995
Tim Peters2400fa42001-09-12 19:12:49 +00001996 class madcomplex(complex):
1997 def __repr__(self):
1998 return "%.17gj%+.17g" % (self.imag, self.real)
1999 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002000 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002001 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002002 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002003 vereq(a, base)
2004 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002005 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002006 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002007 vereq(repr(a), "4j-3")
2008 vereq(a, base)
2009 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002010 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002011 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002012 veris((+a).__class__, complex)
2013 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002014 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002015 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002016 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002017 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002018 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002019 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002020 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002021
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002022 class madtuple(tuple):
2023 _rev = None
2024 def rev(self):
2025 if self._rev is not None:
2026 return self._rev
2027 L = list(self)
2028 L.reverse()
2029 self._rev = self.__class__(L)
2030 return self._rev
2031 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002032 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2033 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2034 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002035 for i in range(512):
2036 t = madtuple(range(i))
2037 u = t.rev()
2038 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002039 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002040 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002041 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002042 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002043 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002044 verify(a[:].__class__ is tuple)
2045 verify((a * 1).__class__ is tuple)
2046 verify((a * 0).__class__ is tuple)
2047 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002048 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002049 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002050 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002051 verify((a + a).__class__ is tuple)
2052 verify((a * 0).__class__ is tuple)
2053 verify((a * 1).__class__ is tuple)
2054 verify((a * 2).__class__ is tuple)
2055 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002056
2057 class madstring(str):
2058 _rev = None
2059 def rev(self):
2060 if self._rev is not None:
2061 return self._rev
2062 L = list(self)
2063 L.reverse()
2064 self._rev = self.__class__("".join(L))
2065 return self._rev
2066 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002067 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2068 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2069 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002070 for i in range(256):
2071 s = madstring("".join(map(chr, range(i))))
2072 t = s.rev()
2073 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002074 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002075 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002076 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002077 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002078
Tim Peters8fa5dd02001-09-12 02:18:30 +00002079 base = "\x00" * 5
2080 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002081 vereq(s, base)
2082 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002083 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002084 vereq(hash(s), hash(base))
2085 vereq({s: 1}[base], 1)
2086 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002087 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002088 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002089 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002090 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002091 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002092 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002093 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002094 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002095 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002096 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002097 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002098 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002099 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002100 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002101 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002102 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002103 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002104 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002105 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002106 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002107 identitytab = ''.join([chr(i) for i in range(256)])
2108 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002109 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002110 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002111 vereq(s.translate(identitytab, "x"), base)
2112 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002113 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002114 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002115 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002116 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002117 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002118 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002119 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002120 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002121 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002122 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002123
Tim Peters111f6092001-09-12 07:54:51 +00002124 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002125 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002126 verify(intern(s).__class__ is str)
2127 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002128 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002129
2130 i = intern("y x")
2131 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002132 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002133 verify(intern(s).__class__ is str)
2134 verify(intern(s) is i)
2135
2136 s = madstring(i)
2137 verify(intern(s).__class__ is str)
2138 verify(intern(s) is i)
2139
Guido van Rossum91ee7982001-08-30 20:52:40 +00002140 class madunicode(unicode):
2141 _rev = None
2142 def rev(self):
2143 if self._rev is not None:
2144 return self._rev
2145 L = list(self)
2146 L.reverse()
2147 self._rev = self.__class__(u"".join(L))
2148 return self._rev
2149 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002150 vereq(u, u"ABCDEF")
2151 vereq(u.rev(), madunicode(u"FEDCBA"))
2152 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002153 base = u"12345"
2154 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002155 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002156 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002157 vereq(hash(u), hash(base))
2158 vereq({u: 1}[base], 1)
2159 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002160 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002161 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002162 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002163 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002164 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002165 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002166 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002167 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002168 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002169 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002170 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002171 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002172 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002173 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002174 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002176 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002177 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002178 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002179 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002180 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002181 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002182 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002184 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002185 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002186 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002188 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002189 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002190 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002192 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002193 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002194 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002195 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002196 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002197 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002198
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002199 class sublist(list):
2200 pass
2201 a = sublist(range(5))
2202 vereq(a, range(5))
2203 a.append("hello")
2204 vereq(a, range(5) + ["hello"])
2205 a[5] = 5
2206 vereq(a, range(6))
2207 a.extend(range(6, 20))
2208 vereq(a, range(20))
2209 a[-5:] = []
2210 vereq(a, range(15))
2211 del a[10:15]
2212 vereq(len(a), 10)
2213 vereq(a, range(10))
2214 vereq(list(a), range(10))
2215 vereq(a[0], 0)
2216 vereq(a[9], 9)
2217 vereq(a[-10], 0)
2218 vereq(a[-1], 9)
2219 vereq(a[:5], range(5))
2220
Tim Peters59c9a642001-09-13 05:38:56 +00002221 class CountedInput(file):
2222 """Counts lines read by self.readline().
2223
2224 self.lineno is the 0-based ordinal of the last line read, up to
2225 a maximum of one greater than the number of lines in the file.
2226
2227 self.ateof is true if and only if the final "" line has been read,
2228 at which point self.lineno stops incrementing, and further calls
2229 to readline() continue to return "".
2230 """
2231
2232 lineno = 0
2233 ateof = 0
2234 def readline(self):
2235 if self.ateof:
2236 return ""
2237 s = file.readline(self)
2238 # Next line works too.
2239 # s = super(CountedInput, self).readline()
2240 self.lineno += 1
2241 if s == "":
2242 self.ateof = 1
2243 return s
2244
Tim Peters561f8992001-09-13 19:36:36 +00002245 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002246 lines = ['a\n', 'b\n', 'c\n']
2247 try:
2248 f.writelines(lines)
2249 f.close()
2250 f = CountedInput(TESTFN)
2251 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2252 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002253 vereq(expected, got)
2254 vereq(f.lineno, i)
2255 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002256 f.close()
2257 finally:
2258 try:
2259 f.close()
2260 except:
2261 pass
2262 try:
2263 import os
2264 os.unlink(TESTFN)
2265 except:
2266 pass
2267
Tim Peters808b94e2001-09-13 19:33:07 +00002268def keywords():
2269 if verbose:
2270 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(int(x=1), 1)
2272 vereq(float(x=2), 2.0)
2273 vereq(long(x=3), 3L)
2274 vereq(complex(imag=42, real=666), complex(666, 42))
2275 vereq(str(object=500), '500')
2276 vereq(unicode(string='abc', errors='strict'), u'abc')
2277 vereq(tuple(sequence=range(3)), (0, 1, 2))
2278 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002279 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002280
2281 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002282 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002283 try:
2284 constructor(bogus_keyword_arg=1)
2285 except TypeError:
2286 pass
2287 else:
2288 raise TestFailed("expected TypeError from bogus keyword "
2289 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002290
Tim Peters8fa45672001-09-13 21:01:29 +00002291def restricted():
2292 import rexec
2293 if verbose:
2294 print "Testing interaction with restricted execution ..."
2295
2296 sandbox = rexec.RExec()
2297
2298 code1 = """f = open(%r, 'w')""" % TESTFN
2299 code2 = """f = file(%r, 'w')""" % TESTFN
2300 code3 = """\
2301f = open(%r)
2302t = type(f) # a sneaky way to get the file() constructor
2303f.close()
2304f = t(%r, 'w') # rexec can't catch this by itself
2305""" % (TESTFN, TESTFN)
2306
2307 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2308 f.close()
2309
2310 try:
2311 for code in code1, code2, code3:
2312 try:
2313 sandbox.r_exec(code)
2314 except IOError, msg:
2315 if str(msg).find("restricted") >= 0:
2316 outcome = "OK"
2317 else:
2318 outcome = "got an exception, but not an expected one"
2319 else:
2320 outcome = "expected a restricted-execution exception"
2321
2322 if outcome != "OK":
2323 raise TestFailed("%s, in %r" % (outcome, code))
2324
2325 finally:
2326 try:
2327 import os
2328 os.unlink(TESTFN)
2329 except:
2330 pass
2331
Tim Peters0ab085c2001-09-14 00:25:33 +00002332def str_subclass_as_dict_key():
2333 if verbose:
2334 print "Testing a str subclass used as dict key .."
2335
2336 class cistr(str):
2337 """Sublcass of str that computes __eq__ case-insensitively.
2338
2339 Also computes a hash code of the string in canonical form.
2340 """
2341
2342 def __init__(self, value):
2343 self.canonical = value.lower()
2344 self.hashcode = hash(self.canonical)
2345
2346 def __eq__(self, other):
2347 if not isinstance(other, cistr):
2348 other = cistr(other)
2349 return self.canonical == other.canonical
2350
2351 def __hash__(self):
2352 return self.hashcode
2353
Guido van Rossum45704552001-10-08 16:35:45 +00002354 vereq(cistr('ABC'), 'abc')
2355 vereq('aBc', cistr('ABC'))
2356 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002357
2358 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002359 vereq(d[cistr('one')], 1)
2360 vereq(d[cistr('tWo')], 2)
2361 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002362 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002363 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002364
Guido van Rossumab3b0342001-09-18 20:38:53 +00002365def classic_comparisons():
2366 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002367 class classic:
2368 pass
2369 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002370 if verbose: print " (base = %s)" % base
2371 class C(base):
2372 def __init__(self, value):
2373 self.value = int(value)
2374 def __cmp__(self, other):
2375 if isinstance(other, C):
2376 return cmp(self.value, other.value)
2377 if isinstance(other, int) or isinstance(other, long):
2378 return cmp(self.value, other)
2379 return NotImplemented
2380 c1 = C(1)
2381 c2 = C(2)
2382 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002383 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002384 c = {1: c1, 2: c2, 3: c3}
2385 for x in 1, 2, 3:
2386 for y in 1, 2, 3:
2387 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2388 for op in "<", "<=", "==", "!=", ">", ">=":
2389 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2390 "x=%d, y=%d" % (x, y))
2391 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2392 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2393
Guido van Rossum0639f592001-09-18 21:06:04 +00002394def rich_comparisons():
2395 if verbose:
2396 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002397 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002398 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002399 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002400 vereq(z, 1+0j)
2401 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002402 class ZZ(complex):
2403 def __eq__(self, other):
2404 try:
2405 return abs(self - other) <= 1e-6
2406 except:
2407 return NotImplemented
2408 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002409 vereq(zz, 1+0j)
2410 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002411
Guido van Rossum0639f592001-09-18 21:06:04 +00002412 class classic:
2413 pass
2414 for base in (classic, int, object, list):
2415 if verbose: print " (base = %s)" % base
2416 class C(base):
2417 def __init__(self, value):
2418 self.value = int(value)
2419 def __cmp__(self, other):
2420 raise TestFailed, "shouldn't call __cmp__"
2421 def __eq__(self, other):
2422 if isinstance(other, C):
2423 return self.value == other.value
2424 if isinstance(other, int) or isinstance(other, long):
2425 return self.value == other
2426 return NotImplemented
2427 def __ne__(self, other):
2428 if isinstance(other, C):
2429 return self.value != other.value
2430 if isinstance(other, int) or isinstance(other, long):
2431 return self.value != other
2432 return NotImplemented
2433 def __lt__(self, other):
2434 if isinstance(other, C):
2435 return self.value < other.value
2436 if isinstance(other, int) or isinstance(other, long):
2437 return self.value < other
2438 return NotImplemented
2439 def __le__(self, other):
2440 if isinstance(other, C):
2441 return self.value <= other.value
2442 if isinstance(other, int) or isinstance(other, long):
2443 return self.value <= other
2444 return NotImplemented
2445 def __gt__(self, other):
2446 if isinstance(other, C):
2447 return self.value > other.value
2448 if isinstance(other, int) or isinstance(other, long):
2449 return self.value > other
2450 return NotImplemented
2451 def __ge__(self, other):
2452 if isinstance(other, C):
2453 return self.value >= other.value
2454 if isinstance(other, int) or isinstance(other, long):
2455 return self.value >= other
2456 return NotImplemented
2457 c1 = C(1)
2458 c2 = C(2)
2459 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002460 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002461 c = {1: c1, 2: c2, 3: c3}
2462 for x in 1, 2, 3:
2463 for y in 1, 2, 3:
2464 for op in "<", "<=", "==", "!=", ">", ">=":
2465 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2466 "x=%d, y=%d" % (x, y))
2467 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2468 "x=%d, y=%d" % (x, y))
2469 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2470 "x=%d, y=%d" % (x, y))
2471
Guido van Rossum1952e382001-09-19 01:25:16 +00002472def coercions():
2473 if verbose: print "Testing coercions..."
2474 class I(int): pass
2475 coerce(I(0), 0)
2476 coerce(0, I(0))
2477 class L(long): pass
2478 coerce(L(0), 0)
2479 coerce(L(0), 0L)
2480 coerce(0, L(0))
2481 coerce(0L, L(0))
2482 class F(float): pass
2483 coerce(F(0), 0)
2484 coerce(F(0), 0L)
2485 coerce(F(0), 0.)
2486 coerce(0, F(0))
2487 coerce(0L, F(0))
2488 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002489 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002490 coerce(C(0), 0)
2491 coerce(C(0), 0L)
2492 coerce(C(0), 0.)
2493 coerce(C(0), 0j)
2494 coerce(0, C(0))
2495 coerce(0L, C(0))
2496 coerce(0., C(0))
2497 coerce(0j, C(0))
2498
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002499def descrdoc():
2500 if verbose: print "Testing descriptor doc strings..."
2501 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002502 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002503 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002504 check(file.name, "file name") # member descriptor
2505
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002506def setclass():
2507 if verbose: print "Testing __class__ assignment..."
2508 class C(object): pass
2509 class D(object): pass
2510 class E(object): pass
2511 class F(D, E): pass
2512 for cls in C, D, E, F:
2513 for cls2 in C, D, E, F:
2514 x = cls()
2515 x.__class__ = cls2
2516 verify(x.__class__ is cls2)
2517 x.__class__ = cls
2518 verify(x.__class__ is cls)
2519 def cant(x, C):
2520 try:
2521 x.__class__ = C
2522 except TypeError:
2523 pass
2524 else:
2525 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002526 try:
2527 delattr(x, "__class__")
2528 except TypeError:
2529 pass
2530 else:
2531 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002532 cant(C(), list)
2533 cant(list(), C)
2534 cant(C(), 1)
2535 cant(C(), object)
2536 cant(object(), list)
2537 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002538 class Int(int): __slots__ = []
2539 cant(2, Int)
2540 cant(Int(), int)
2541 cant(True, int)
2542 cant(2, bool)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002543
Guido van Rossum6661be32001-10-26 04:26:12 +00002544def setdict():
2545 if verbose: print "Testing __dict__ assignment..."
2546 class C(object): pass
2547 a = C()
2548 a.__dict__ = {'b': 1}
2549 vereq(a.b, 1)
2550 def cant(x, dict):
2551 try:
2552 x.__dict__ = dict
2553 except TypeError:
2554 pass
2555 else:
2556 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2557 cant(a, None)
2558 cant(a, [])
2559 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002560 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002561 # Classes don't allow __dict__ assignment
2562 cant(C, {})
2563
Guido van Rossum3926a632001-09-25 16:25:58 +00002564def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002565 if verbose:
2566 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002567 import pickle, cPickle
2568
2569 def sorteditems(d):
2570 L = d.items()
2571 L.sort()
2572 return L
2573
2574 global C
2575 class C(object):
2576 def __init__(self, a, b):
2577 super(C, self).__init__()
2578 self.a = a
2579 self.b = b
2580 def __repr__(self):
2581 return "C(%r, %r)" % (self.a, self.b)
2582
2583 global C1
2584 class C1(list):
2585 def __new__(cls, a, b):
2586 return super(C1, cls).__new__(cls)
2587 def __init__(self, a, b):
2588 self.a = a
2589 self.b = b
2590 def __repr__(self):
2591 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2592
2593 global C2
2594 class C2(int):
2595 def __new__(cls, a, b, val=0):
2596 return super(C2, cls).__new__(cls, val)
2597 def __init__(self, a, b, val=0):
2598 self.a = a
2599 self.b = b
2600 def __repr__(self):
2601 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2602
Guido van Rossum90c45142001-11-24 21:07:01 +00002603 global C3
2604 class C3(object):
2605 def __init__(self, foo):
2606 self.foo = foo
2607 def __getstate__(self):
2608 return self.foo
2609 def __setstate__(self, foo):
2610 self.foo = foo
2611
2612 global C4classic, C4
2613 class C4classic: # classic
2614 pass
2615 class C4(C4classic, object): # mixed inheritance
2616 pass
2617
Guido van Rossum3926a632001-09-25 16:25:58 +00002618 for p in pickle, cPickle:
2619 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002620 if verbose:
2621 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002622
2623 for cls in C, C1, C2:
2624 s = p.dumps(cls, bin)
2625 cls2 = p.loads(s)
2626 verify(cls2 is cls)
2627
2628 a = C1(1, 2); a.append(42); a.append(24)
2629 b = C2("hello", "world", 42)
2630 s = p.dumps((a, b), bin)
2631 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002632 vereq(x.__class__, a.__class__)
2633 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2634 vereq(y.__class__, b.__class__)
2635 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2636 vereq(`x`, `a`)
2637 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002638 if verbose:
2639 print "a = x =", a
2640 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002641 # Test for __getstate__ and __setstate__ on new style class
2642 u = C3(42)
2643 s = p.dumps(u, bin)
2644 v = p.loads(s)
2645 veris(u.__class__, v.__class__)
2646 vereq(u.foo, v.foo)
2647 # Test for picklability of hybrid class
2648 u = C4()
2649 u.foo = 42
2650 s = p.dumps(u, bin)
2651 v = p.loads(s)
2652 veris(u.__class__, v.__class__)
2653 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002654
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002655 # Testing copy.deepcopy()
2656 if verbose:
2657 print "deepcopy"
2658 import copy
2659 for cls in C, C1, C2:
2660 cls2 = copy.deepcopy(cls)
2661 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002662
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002663 a = C1(1, 2); a.append(42); a.append(24)
2664 b = C2("hello", "world", 42)
2665 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002666 vereq(x.__class__, a.__class__)
2667 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2668 vereq(y.__class__, b.__class__)
2669 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2670 vereq(`x`, `a`)
2671 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002672 if verbose:
2673 print "a = x =", a
2674 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002675
Guido van Rossum8c842552002-03-14 23:05:54 +00002676def pickleslots():
2677 if verbose: print "Testing pickling of classes with __slots__ ..."
2678 import pickle, cPickle
2679 # Pickling of classes with __slots__ but without __getstate__ should fail
2680 global B, C, D, E
2681 class B(object):
2682 pass
2683 for base in [object, B]:
2684 class C(base):
2685 __slots__ = ['a']
2686 class D(C):
2687 pass
2688 try:
2689 pickle.dumps(C())
2690 except TypeError:
2691 pass
2692 else:
2693 raise TestFailed, "should fail: pickle C instance - %s" % base
2694 try:
2695 cPickle.dumps(C())
2696 except TypeError:
2697 pass
2698 else:
2699 raise TestFailed, "should fail: cPickle C instance - %s" % base
2700 try:
2701 pickle.dumps(C())
2702 except TypeError:
2703 pass
2704 else:
2705 raise TestFailed, "should fail: pickle D instance - %s" % base
2706 try:
2707 cPickle.dumps(D())
2708 except TypeError:
2709 pass
2710 else:
2711 raise TestFailed, "should fail: cPickle D instance - %s" % base
2712 # Give C a __getstate__ and __setstate__
2713 class C(base):
2714 __slots__ = ['a']
2715 def __getstate__(self):
2716 try:
2717 d = self.__dict__.copy()
2718 except AttributeError:
2719 d = {}
2720 try:
2721 d['a'] = self.a
2722 except AttributeError:
2723 pass
2724 return d
2725 def __setstate__(self, d):
2726 for k, v in d.items():
2727 setattr(self, k, v)
2728 class D(C):
2729 pass
2730 # Now it should work
2731 x = C()
2732 y = pickle.loads(pickle.dumps(x))
2733 vereq(hasattr(y, 'a'), 0)
2734 y = cPickle.loads(cPickle.dumps(x))
2735 vereq(hasattr(y, 'a'), 0)
2736 x.a = 42
2737 y = pickle.loads(pickle.dumps(x))
2738 vereq(y.a, 42)
2739 y = cPickle.loads(cPickle.dumps(x))
2740 vereq(y.a, 42)
2741 x = D()
2742 x.a = 42
2743 x.b = 100
2744 y = pickle.loads(pickle.dumps(x))
2745 vereq(y.a + y.b, 142)
2746 y = cPickle.loads(cPickle.dumps(x))
2747 vereq(y.a + y.b, 142)
2748 # But a subclass that adds a slot should not work
2749 class E(C):
2750 __slots__ = ['b']
2751 try:
2752 pickle.dumps(E())
2753 except TypeError:
2754 pass
2755 else:
2756 raise TestFailed, "should fail: pickle E instance - %s" % base
2757 try:
2758 cPickle.dumps(E())
2759 except TypeError:
2760 pass
2761 else:
2762 raise TestFailed, "should fail: cPickle E instance - %s" % base
2763
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002764def copies():
2765 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2766 import copy
2767 class C(object):
2768 pass
2769
2770 a = C()
2771 a.foo = 12
2772 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002773 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002774
2775 a.bar = [1,2,3]
2776 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002777 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002778 verify(c.bar is a.bar)
2779
2780 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002781 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002782 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002783 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002784
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002785def binopoverride():
2786 if verbose: print "Testing overrides of binary operations..."
2787 class I(int):
2788 def __repr__(self):
2789 return "I(%r)" % int(self)
2790 def __add__(self, other):
2791 return I(int(self) + int(other))
2792 __radd__ = __add__
2793 def __pow__(self, other, mod=None):
2794 if mod is None:
2795 return I(pow(int(self), int(other)))
2796 else:
2797 return I(pow(int(self), int(other), int(mod)))
2798 def __rpow__(self, other, mod=None):
2799 if mod is None:
2800 return I(pow(int(other), int(self), mod))
2801 else:
2802 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002803
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002804 vereq(`I(1) + I(2)`, "I(3)")
2805 vereq(`I(1) + 2`, "I(3)")
2806 vereq(`1 + I(2)`, "I(3)")
2807 vereq(`I(2) ** I(3)`, "I(8)")
2808 vereq(`2 ** I(3)`, "I(8)")
2809 vereq(`I(2) ** 3`, "I(8)")
2810 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2811 class S(str):
2812 def __eq__(self, other):
2813 return self.lower() == other.lower()
2814
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002815def subclasspropagation():
2816 if verbose: print "Testing propagation of slot functions to subclasses..."
2817 class A(object):
2818 pass
2819 class B(A):
2820 pass
2821 class C(A):
2822 pass
2823 class D(B, C):
2824 pass
2825 d = D()
2826 vereq(hash(d), id(d))
2827 A.__hash__ = lambda self: 42
2828 vereq(hash(d), 42)
2829 C.__hash__ = lambda self: 314
2830 vereq(hash(d), 314)
2831 B.__hash__ = lambda self: 144
2832 vereq(hash(d), 144)
2833 D.__hash__ = lambda self: 100
2834 vereq(hash(d), 100)
2835 del D.__hash__
2836 vereq(hash(d), 144)
2837 del B.__hash__
2838 vereq(hash(d), 314)
2839 del C.__hash__
2840 vereq(hash(d), 42)
2841 del A.__hash__
2842 vereq(hash(d), id(d))
2843 d.foo = 42
2844 d.bar = 42
2845 vereq(d.foo, 42)
2846 vereq(d.bar, 42)
2847 def __getattribute__(self, name):
2848 if name == "foo":
2849 return 24
2850 return object.__getattribute__(self, name)
2851 A.__getattribute__ = __getattribute__
2852 vereq(d.foo, 24)
2853 vereq(d.bar, 42)
2854 def __getattr__(self, name):
2855 if name in ("spam", "foo", "bar"):
2856 return "hello"
2857 raise AttributeError, name
2858 B.__getattr__ = __getattr__
2859 vereq(d.spam, "hello")
2860 vereq(d.foo, 24)
2861 vereq(d.bar, 42)
2862 del A.__getattribute__
2863 vereq(d.foo, 42)
2864 del d.foo
2865 vereq(d.foo, "hello")
2866 vereq(d.bar, 42)
2867 del B.__getattr__
2868 try:
2869 d.foo
2870 except AttributeError:
2871 pass
2872 else:
2873 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002874
Guido van Rossume7f3e242002-06-14 02:35:45 +00002875 # Test a nasty bug in recurse_down_subclasses()
2876 import gc
2877 class A(object):
2878 pass
2879 class B(A):
2880 pass
2881 del B
2882 gc.collect()
2883 A.__setitem__ = lambda *a: None # crash
2884
Tim Petersfc57ccb2001-10-12 02:38:24 +00002885def buffer_inherit():
2886 import binascii
2887 # SF bug [#470040] ParseTuple t# vs subclasses.
2888 if verbose:
2889 print "Testing that buffer interface is inherited ..."
2890
2891 class MyStr(str):
2892 pass
2893 base = 'abc'
2894 m = MyStr(base)
2895 # b2a_hex uses the buffer interface to get its argument's value, via
2896 # PyArg_ParseTuple 't#' code.
2897 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2898
2899 # It's not clear that unicode will continue to support the character
2900 # buffer interface, and this test will fail if that's taken away.
2901 class MyUni(unicode):
2902 pass
2903 base = u'abc'
2904 m = MyUni(base)
2905 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2906
2907 class MyInt(int):
2908 pass
2909 m = MyInt(42)
2910 try:
2911 binascii.b2a_hex(m)
2912 raise TestFailed('subclass of int should not have a buffer interface')
2913 except TypeError:
2914 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002915
Tim Petersc9933152001-10-16 20:18:24 +00002916def str_of_str_subclass():
2917 import binascii
2918 import cStringIO
2919
2920 if verbose:
2921 print "Testing __str__ defined in subclass of str ..."
2922
2923 class octetstring(str):
2924 def __str__(self):
2925 return binascii.b2a_hex(self)
2926 def __repr__(self):
2927 return self + " repr"
2928
2929 o = octetstring('A')
2930 vereq(type(o), octetstring)
2931 vereq(type(str(o)), str)
2932 vereq(type(repr(o)), str)
2933 vereq(ord(o), 0x41)
2934 vereq(str(o), '41')
2935 vereq(repr(o), 'A repr')
2936 vereq(o.__str__(), '41')
2937 vereq(o.__repr__(), 'A repr')
2938
2939 capture = cStringIO.StringIO()
2940 # Calling str() or not exercises different internal paths.
2941 print >> capture, o
2942 print >> capture, str(o)
2943 vereq(capture.getvalue(), '41\n41\n')
2944 capture.close()
2945
Guido van Rossumc8e56452001-10-22 00:43:43 +00002946def kwdargs():
2947 if verbose: print "Testing keyword arguments to __init__, __call__..."
2948 def f(a): return a
2949 vereq(f.__call__(a=42), 42)
2950 a = []
2951 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002952 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002953
Guido van Rossumed87ad82001-10-30 02:33:02 +00002954def delhook():
2955 if verbose: print "Testing __del__ hook..."
2956 log = []
2957 class C(object):
2958 def __del__(self):
2959 log.append(1)
2960 c = C()
2961 vereq(log, [])
2962 del c
2963 vereq(log, [1])
2964
Guido van Rossum29d26062001-12-11 04:37:34 +00002965 class D(object): pass
2966 d = D()
2967 try: del d[0]
2968 except TypeError: pass
2969 else: raise TestFailed, "invalid del() didn't raise TypeError"
2970
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002971def hashinherit():
2972 if verbose: print "Testing hash of mutable subclasses..."
2973
2974 class mydict(dict):
2975 pass
2976 d = mydict()
2977 try:
2978 hash(d)
2979 except TypeError:
2980 pass
2981 else:
2982 raise TestFailed, "hash() of dict subclass should fail"
2983
2984 class mylist(list):
2985 pass
2986 d = mylist()
2987 try:
2988 hash(d)
2989 except TypeError:
2990 pass
2991 else:
2992 raise TestFailed, "hash() of list subclass should fail"
2993
Guido van Rossum29d26062001-12-11 04:37:34 +00002994def strops():
2995 try: 'a' + 5
2996 except TypeError: pass
2997 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2998
2999 try: ''.split('')
3000 except ValueError: pass
3001 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3002
3003 try: ''.join([0])
3004 except TypeError: pass
3005 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3006
3007 try: ''.rindex('5')
3008 except ValueError: pass
3009 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3010
Guido van Rossum29d26062001-12-11 04:37:34 +00003011 try: '%(n)s' % None
3012 except TypeError: pass
3013 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3014
3015 try: '%(n' % {}
3016 except ValueError: pass
3017 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3018
3019 try: '%*s' % ('abc')
3020 except TypeError: pass
3021 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3022
3023 try: '%*.*s' % ('abc', 5)
3024 except TypeError: pass
3025 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3026
3027 try: '%s' % (1, 2)
3028 except TypeError: pass
3029 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3030
3031 try: '%' % None
3032 except ValueError: pass
3033 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3034
3035 vereq('534253'.isdigit(), 1)
3036 vereq('534253x'.isdigit(), 0)
3037 vereq('%c' % 5, '\x05')
3038 vereq('%c' % '5', '5')
3039
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003040def deepcopyrecursive():
3041 if verbose: print "Testing deepcopy of recursive objects..."
3042 class Node:
3043 pass
3044 a = Node()
3045 b = Node()
3046 a.b = b
3047 b.a = a
3048 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003049
Guido van Rossumd7035672002-03-12 20:43:31 +00003050def modules():
3051 if verbose: print "Testing uninitialized module objects..."
3052 from types import ModuleType as M
3053 m = M.__new__(M)
3054 str(m)
3055 vereq(hasattr(m, "__name__"), 0)
3056 vereq(hasattr(m, "__file__"), 0)
3057 vereq(hasattr(m, "foo"), 0)
3058 vereq(m.__dict__, None)
3059 m.foo = 1
3060 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003061
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003062def dictproxyiterkeys():
3063 class C(object):
3064 def meth(self):
3065 pass
3066 if verbose: print "Testing dict-proxy iterkeys..."
3067 keys = [ key for key in C.__dict__.iterkeys() ]
3068 keys.sort()
3069 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3070
3071def dictproxyitervalues():
3072 class C(object):
3073 def meth(self):
3074 pass
3075 if verbose: print "Testing dict-proxy itervalues..."
3076 values = [ values for values in C.__dict__.itervalues() ]
3077 vereq(len(values), 5)
3078
3079def dictproxyiteritems():
3080 class C(object):
3081 def meth(self):
3082 pass
3083 if verbose: print "Testing dict-proxy iteritems..."
3084 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3085 keys.sort()
3086 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3087
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003088def funnynew():
3089 if verbose: print "Testing __new__ returning something unexpected..."
3090 class C(object):
3091 def __new__(cls, arg):
3092 if isinstance(arg, str): return [1, 2, 3]
3093 elif isinstance(arg, int): return object.__new__(D)
3094 else: return object.__new__(cls)
3095 class D(C):
3096 def __init__(self, arg):
3097 self.foo = arg
3098 vereq(C("1"), [1, 2, 3])
3099 vereq(D("1"), [1, 2, 3])
3100 d = D(None)
3101 veris(d.foo, None)
3102 d = C(1)
3103 vereq(isinstance(d, D), True)
3104 vereq(d.foo, 1)
3105 d = D(1)
3106 vereq(isinstance(d, D), True)
3107 vereq(d.foo, 1)
3108
Guido van Rossume8fc6402002-04-16 16:44:51 +00003109def imulbug():
3110 # SF bug 544647
3111 if verbose: print "Testing for __imul__ problems..."
3112 class C(object):
3113 def __imul__(self, other):
3114 return (self, other)
3115 x = C()
3116 y = x
3117 y *= 1.0
3118 vereq(y, (x, 1.0))
3119 y = x
3120 y *= 2
3121 vereq(y, (x, 2))
3122 y = x
3123 y *= 3L
3124 vereq(y, (x, 3L))
3125 y = x
3126 y *= 1L<<100
3127 vereq(y, (x, 1L<<100))
3128 y = x
3129 y *= None
3130 vereq(y, (x, None))
3131 y = x
3132 y *= "foo"
3133 vereq(y, (x, "foo"))
3134
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003135def docdescriptor():
3136 # SF bug 542984
3137 if verbose: print "Testing __doc__ descriptor..."
3138 class DocDescr(object):
3139 def __get__(self, object, otype):
3140 if object:
3141 object = object.__class__.__name__ + ' instance'
3142 if otype:
3143 otype = otype.__name__
3144 return 'object=%s; type=%s' % (object, otype)
3145 class OldClass:
3146 __doc__ = DocDescr()
3147 class NewClass(object):
3148 __doc__ = DocDescr()
3149 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3150 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3151 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3152 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3153
Tim Petersafb2c802002-04-18 18:06:20 +00003154def string_exceptions():
3155 if verbose:
3156 print "Testing string exceptions ..."
3157
3158 # Ensure builtin strings work OK as exceptions.
3159 astring = "An exception string."
3160 try:
3161 raise astring
3162 except astring:
3163 pass
3164 else:
3165 raise TestFailed, "builtin string not usable as exception"
3166
3167 # Ensure string subclass instances do not.
3168 class MyStr(str):
3169 pass
3170
3171 newstring = MyStr("oops -- shouldn't work")
3172 try:
3173 raise newstring
3174 except TypeError:
3175 pass
3176 except:
3177 raise TestFailed, "string subclass allowed as exception"
3178
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003179def copy_setstate():
3180 if verbose:
3181 print "Testing that copy.*copy() correctly uses __setstate__..."
3182 import copy
3183 class C(object):
3184 def __init__(self, foo=None):
3185 self.foo = foo
3186 self.__foo = foo
3187 def setfoo(self, foo=None):
3188 self.foo = foo
3189 def getfoo(self):
3190 return self.__foo
3191 def __getstate__(self):
3192 return [self.foo]
3193 def __setstate__(self, lst):
3194 assert len(lst) == 1
3195 self.__foo = self.foo = lst[0]
3196 a = C(42)
3197 a.setfoo(24)
3198 vereq(a.foo, 24)
3199 vereq(a.getfoo(), 42)
3200 b = copy.copy(a)
3201 vereq(b.foo, 24)
3202 vereq(b.getfoo(), 24)
3203 b = copy.deepcopy(a)
3204 vereq(b.foo, 24)
3205 vereq(b.getfoo(), 24)
3206
Guido van Rossum09638c12002-06-13 19:17:46 +00003207def slices():
3208 if verbose:
3209 print "Testing cases with slices and overridden __getitem__ ..."
3210 # Strings
3211 vereq("hello"[:4], "hell")
3212 vereq("hello"[slice(4)], "hell")
3213 vereq(str.__getitem__("hello", slice(4)), "hell")
3214 class S(str):
3215 def __getitem__(self, x):
3216 return str.__getitem__(self, x)
3217 vereq(S("hello")[:4], "hell")
3218 vereq(S("hello")[slice(4)], "hell")
3219 vereq(S("hello").__getitem__(slice(4)), "hell")
3220 # Tuples
3221 vereq((1,2,3)[:2], (1,2))
3222 vereq((1,2,3)[slice(2)], (1,2))
3223 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3224 class T(tuple):
3225 def __getitem__(self, x):
3226 return tuple.__getitem__(self, x)
3227 vereq(T((1,2,3))[:2], (1,2))
3228 vereq(T((1,2,3))[slice(2)], (1,2))
3229 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3230 # Lists
3231 vereq([1,2,3][:2], [1,2])
3232 vereq([1,2,3][slice(2)], [1,2])
3233 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3234 class L(list):
3235 def __getitem__(self, x):
3236 return list.__getitem__(self, x)
3237 vereq(L([1,2,3])[:2], [1,2])
3238 vereq(L([1,2,3])[slice(2)], [1,2])
3239 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3240 # Now do lists and __setitem__
3241 a = L([1,2,3])
3242 a[slice(1, 3)] = [3,2]
3243 vereq(a, [1,3,2])
3244 a[slice(0, 2, 1)] = [3,1]
3245 vereq(a, [3,1,2])
3246 a.__setitem__(slice(1, 3), [2,1])
3247 vereq(a, [3,2,1])
3248 a.__setitem__(slice(0, 2, 1), [2,3])
3249 vereq(a, [2,3,1])
3250
Tim Peters2484aae2002-07-11 06:56:07 +00003251def subtype_resurrection():
3252 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003253 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003254
3255 class C(object):
3256 container = []
3257
3258 def __del__(self):
3259 # resurrect the instance
3260 C.container.append(self)
3261
3262 c = C()
3263 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003264 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003265 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003266 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003267
3268 # If that didn't blow up, it's also interesting to see whether clearing
3269 # the last container slot works: that will attempt to delete c again,
3270 # which will cause c to get appended back to the container again "during"
3271 # the del.
3272 del C.container[-1]
3273 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003274 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003275
Tim Peters14cb1e12002-07-11 18:26:21 +00003276 # Make c mortal again, so that the test framework with -l doesn't report
3277 # it as a leak.
3278 del C.__del__
3279
Guido van Rossum2d702462002-08-06 21:28:28 +00003280def slottrash():
3281 # Deallocating deeply nested slotted trash caused stack overflows
3282 if verbose:
3283 print "Testing slot trash..."
3284 class trash(object):
3285 __slots__ = ['x']
3286 def __init__(self, x):
3287 self.x = x
3288 o = None
3289 for i in xrange(50000):
3290 o = trash(o)
3291 del o
3292
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003293def slotmultipleinheritance():
3294 # SF bug 575229, multiple inheritance w/ slots dumps core
3295 class A(object):
3296 __slots__=()
3297 class B(object):
3298 pass
3299 class C(A,B) :
3300 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003301 vereq(C.__basicsize__, B.__basicsize__)
3302 verify(hasattr(C, '__dict__'))
3303 verify(hasattr(C, '__weakref__'))
3304 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003305
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003306def testrmul():
3307 # SF patch 592646
3308 if verbose:
3309 print "Testing correct invocation of __rmul__..."
3310 class C(object):
3311 def __mul__(self, other):
3312 return "mul"
3313 def __rmul__(self, other):
3314 return "rmul"
3315 a = C()
3316 vereq(a*2, "mul")
3317 vereq(a*2.2, "mul")
3318 vereq(2*a, "rmul")
3319 vereq(2.2*a, "rmul")
3320
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003321def testipow():
3322 # [SF bug 620179]
3323 if verbose:
3324 print "Testing correct invocation of __ipow__..."
3325 class C(object):
3326 def __ipow__(self, other):
3327 pass
3328 a = C()
3329 a **= 2
3330
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003331def do_this_first():
3332 if verbose:
3333 print "Testing SF bug 551412 ..."
3334 # This dumps core when SF bug 551412 isn't fixed --
3335 # but only when test_descr.py is run separately.
3336 # (That can't be helped -- as soon as PyType_Ready()
3337 # is called for PyLong_Type, the bug is gone.)
3338 class UserLong(object):
3339 def __pow__(self, *args):
3340 pass
3341 try:
3342 pow(0L, UserLong(), 0L)
3343 except:
3344 pass
3345
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003346 if verbose:
3347 print "Testing SF bug 570483..."
3348 # Another segfault only when run early
3349 # (before PyType_Ready(tuple) is called)
3350 type.mro(tuple)
3351
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003352def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003353 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003354 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003355 lists()
3356 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003357 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003358 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003359 ints()
3360 longs()
3361 floats()
3362 complexes()
3363 spamlists()
3364 spamdicts()
3365 pydicts()
3366 pylists()
3367 metaclass()
3368 pymods()
3369 multi()
3370 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00003371 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003372 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003373 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003374 dynamics()
3375 errors()
3376 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003377 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003378 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003379 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003380 classic()
3381 compattr()
3382 newslot()
3383 altmro()
3384 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003385 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003386 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003387 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003388 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003389 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003390 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003391 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003392 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003393 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003394 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003395 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003396 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003397 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003398 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003399 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003400 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003401 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003402 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003403 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003404 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003405 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003406 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003407 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003408 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003409 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003410 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003411 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003412 dictproxyiterkeys()
3413 dictproxyitervalues()
3414 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003415 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003416 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003417 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003418 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003419 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003420 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003421 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003422 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003423 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003424 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003425 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003426 testipow()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003427 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003428
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003429if __name__ == "__main__":
3430 test_main()