blob: adcb55f053a5fe05d7439919fcd235a167bc1e51 [file] [log] [blame]
Benjamin Petersonae937c02009-04-18 20:54:08 +00001import builtins
Benjamin Petersona5758c02009-05-09 18:15:04 +00002import sys
Guido van Rossum360e4b82007-05-14 22:51:27 +00003import types
Georg Brandl479a7e72008-02-05 18:13:15 +00004import unittest
5import warnings
Tim Peters4d9b4662002-04-16 01:59:17 +00006
Georg Brandl479a7e72008-02-05 18:13:15 +00007from copy import deepcopy
Benjamin Petersonee8712c2008-05-20 21:35:26 +00008from test import support
Guido van Rossum875eeaa2001-10-11 18:33:53 +00009
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Georg Brandl479a7e72008-02-05 18:13:15 +000011class OperatorsTest(unittest.TestCase):
Tim Peters3caca232001-12-06 06:23:26 +000012
Georg Brandl479a7e72008-02-05 18:13:15 +000013 def __init__(self, *args, **kwargs):
14 unittest.TestCase.__init__(self, *args, **kwargs)
15 self.binops = {
16 'add': '+',
17 'sub': '-',
18 'mul': '*',
19 'div': '/',
20 'divmod': 'divmod',
21 'pow': '**',
22 'lshift': '<<',
23 'rshift': '>>',
24 'and': '&',
25 'xor': '^',
26 'or': '|',
27 'cmp': 'cmp',
28 'lt': '<',
29 'le': '<=',
30 'eq': '==',
31 'ne': '!=',
32 'gt': '>',
33 'ge': '>=',
34 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000035
Georg Brandl479a7e72008-02-05 18:13:15 +000036 for name, expr in list(self.binops.items()):
37 if expr.islower():
38 expr = expr + "(a, b)"
39 else:
40 expr = 'a %s b' % expr
41 self.binops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000042
Georg Brandl479a7e72008-02-05 18:13:15 +000043 self.unops = {
44 'pos': '+',
45 'neg': '-',
46 'abs': 'abs',
47 'invert': '~',
48 'int': 'int',
49 'float': 'float',
50 'oct': 'oct',
51 'hex': 'hex',
52 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000053
Georg Brandl479a7e72008-02-05 18:13:15 +000054 for name, expr in list(self.unops.items()):
55 if expr.islower():
56 expr = expr + "(a)"
57 else:
58 expr = '%s a' % expr
59 self.unops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000060
Georg Brandl479a7e72008-02-05 18:13:15 +000061 def unop_test(self, a, res, expr="len(a)", meth="__len__"):
62 d = {'a': a}
63 self.assertEqual(eval(expr, d), res)
64 t = type(a)
65 m = getattr(t, meth)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066
Georg Brandl479a7e72008-02-05 18:13:15 +000067 # Find method in parent class
68 while meth not in t.__dict__:
69 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +000070 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
71 # method object; the getattr() below obtains its underlying function.
72 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +000073 self.assertEqual(m(a), res)
74 bm = getattr(a, meth)
75 self.assertEqual(bm(), res)
Tim Peters2f93e282001-10-04 05:27:00 +000076
Georg Brandl479a7e72008-02-05 18:13:15 +000077 def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
78 d = {'a': a, 'b': b}
Tim Peters2f93e282001-10-04 05:27:00 +000079
Georg Brandl479a7e72008-02-05 18:13:15 +000080 # XXX Hack so this passes before 2.3 when -Qnew is specified.
81 if meth == "__div__" and 1/2 == 0.5:
82 meth = "__truediv__"
Tim Peters2f93e282001-10-04 05:27:00 +000083
Georg Brandl479a7e72008-02-05 18:13:15 +000084 if meth == '__divmod__': pass
Tim Peters2f93e282001-10-04 05:27:00 +000085
Georg Brandl479a7e72008-02-05 18:13:15 +000086 self.assertEqual(eval(expr, d), res)
87 t = type(a)
88 m = getattr(t, meth)
89 while meth not in t.__dict__:
90 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +000091 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
92 # method object; the getattr() below obtains its underlying function.
93 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +000094 self.assertEqual(m(a, b), res)
95 bm = getattr(a, meth)
96 self.assertEqual(bm(b), res)
Tim Peters2f93e282001-10-04 05:27:00 +000097
Georg Brandl479a7e72008-02-05 18:13:15 +000098 def sliceop_test(self, a, b, c, res, expr="a[b:c]", meth="__getitem__"):
99 d = {'a': a, 'b': b, 'c': c}
100 self.assertEqual(eval(expr, d), res)
101 t = type(a)
102 m = getattr(t, meth)
103 while meth not in t.__dict__:
104 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000105 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
106 # method object; the getattr() below obtains its underlying function.
107 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000108 self.assertEqual(m(a, slice(b, c)), res)
109 bm = getattr(a, meth)
110 self.assertEqual(bm(slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000111
Georg Brandl479a7e72008-02-05 18:13:15 +0000112 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
113 d = {'a': deepcopy(a), 'b': b}
114 exec(stmt, d)
115 self.assertEqual(d['a'], res)
116 t = type(a)
117 m = getattr(t, meth)
118 while meth not in t.__dict__:
119 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000120 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
121 # method object; the getattr() below obtains its underlying function.
122 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000123 d['a'] = deepcopy(a)
124 m(d['a'], b)
125 self.assertEqual(d['a'], res)
126 d['a'] = deepcopy(a)
127 bm = getattr(d['a'], meth)
128 bm(b)
129 self.assertEqual(d['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000130
Georg Brandl479a7e72008-02-05 18:13:15 +0000131 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
132 d = {'a': deepcopy(a), 'b': b, 'c': c}
133 exec(stmt, d)
134 self.assertEqual(d['a'], res)
135 t = type(a)
136 m = getattr(t, meth)
137 while meth not in t.__dict__:
138 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000139 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
140 # method object; the getattr() below obtains its underlying function.
141 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000142 d['a'] = deepcopy(a)
143 m(d['a'], b, c)
144 self.assertEqual(d['a'], res)
145 d['a'] = deepcopy(a)
146 bm = getattr(d['a'], meth)
147 bm(b, c)
148 self.assertEqual(d['a'], res)
149
150 def setsliceop_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
151 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
152 exec(stmt, dictionary)
153 self.assertEqual(dictionary['a'], res)
154 t = type(a)
155 while meth not in t.__dict__:
156 t = t.__bases__[0]
157 m = getattr(t, meth)
Benjamin Petersone549ead2009-03-28 21:42:05 +0000158 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
159 # method object; the getattr() below obtains its underlying function.
160 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000161 dictionary['a'] = deepcopy(a)
162 m(dictionary['a'], slice(b, c), d)
163 self.assertEqual(dictionary['a'], res)
164 dictionary['a'] = deepcopy(a)
165 bm = getattr(dictionary['a'], meth)
166 bm(slice(b, c), d)
167 self.assertEqual(dictionary['a'], res)
168
169 def test_lists(self):
170 # Testing list operations...
171 # Asserts are within individual test methods
172 self.binop_test([1], [2], [1,2], "a+b", "__add__")
173 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
174 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
175 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
176 self.sliceop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
177 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
178 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
179 self.unop_test([1,2,3], 3, "len(a)", "__len__")
180 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
181 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
182 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
183 self.setsliceop_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
184 "__setitem__")
185
186 def test_dicts(self):
187 # Testing dict operations...
Georg Brandl479a7e72008-02-05 18:13:15 +0000188 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
189 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
190 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
191
192 d = {1:2, 3:4}
193 l1 = []
194 for i in list(d.keys()):
195 l1.append(i)
196 l = []
197 for i in iter(d):
198 l.append(i)
199 self.assertEqual(l, l1)
200 l = []
201 for i in d.__iter__():
202 l.append(i)
203 self.assertEqual(l, l1)
204 l = []
205 for i in dict.__iter__(d):
206 l.append(i)
207 self.assertEqual(l, l1)
208 d = {1:2, 3:4}
209 self.unop_test(d, 2, "len(a)", "__len__")
210 self.assertEqual(eval(repr(d), {}), d)
211 self.assertEqual(eval(d.__repr__(), {}), d)
212 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
213 "__setitem__")
214
215 # Tests for unary and binary operators
216 def number_operators(self, a, b, skip=[]):
217 dict = {'a': a, 'b': b}
218
219 for name, expr in list(self.binops.items()):
220 if name not in skip:
221 name = "__%s__" % name
222 if hasattr(a, name):
223 res = eval(expr, dict)
224 self.binop_test(a, b, res, expr, name)
225
226 for name, expr in list(self.unops.items()):
227 if name not in skip:
228 name = "__%s__" % name
229 if hasattr(a, name):
230 res = eval(expr, dict)
231 self.unop_test(a, res, expr, name)
232
233 def test_ints(self):
234 # Testing int operations...
235 self.number_operators(100, 3)
236 # The following crashes in Python 2.2
237 self.assertEqual((1).__bool__(), 1)
238 self.assertEqual((0).__bool__(), 0)
239 # This returns 'NotImplemented' in Python 2.2
240 class C(int):
241 def __add__(self, other):
242 return NotImplemented
243 self.assertEqual(C(5), 5)
Tim Peters25786c02001-09-02 08:22:48 +0000244 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000245 C() + ""
Tim Peters25786c02001-09-02 08:22:48 +0000246 except TypeError:
247 pass
248 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000249 self.fail("NotImplemented should have caused TypeError")
Tim Peters25786c02001-09-02 08:22:48 +0000250
Georg Brandl479a7e72008-02-05 18:13:15 +0000251 def test_longs(self):
252 # Testing long operations...
253 self.number_operators(100, 3)
Tim Peters25786c02001-09-02 08:22:48 +0000254
Georg Brandl479a7e72008-02-05 18:13:15 +0000255 def test_floats(self):
256 # Testing float operations...
257 self.number_operators(100.0, 3.0)
Tim Peters25786c02001-09-02 08:22:48 +0000258
Georg Brandl479a7e72008-02-05 18:13:15 +0000259 def test_complexes(self):
260 # Testing complex operations...
261 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
262 'int', 'long', 'float',
263 'divmod', 'mod'])
Tim Peters25786c02001-09-02 08:22:48 +0000264
Georg Brandl479a7e72008-02-05 18:13:15 +0000265 class Number(complex):
266 __slots__ = ['prec']
267 def __new__(cls, *args, **kwds):
268 result = complex.__new__(cls, *args)
269 result.prec = kwds.get('prec', 12)
270 return result
271 def __repr__(self):
272 prec = self.prec
273 if self.imag == 0.0:
274 return "%.*g" % (prec, self.real)
275 if self.real == 0.0:
276 return "%.*gj" % (prec, self.imag)
277 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
278 __str__ = __repr__
Tim Peters25786c02001-09-02 08:22:48 +0000279
Georg Brandl479a7e72008-02-05 18:13:15 +0000280 a = Number(3.14, prec=6)
281 self.assertEqual(repr(a), "3.14")
282 self.assertEqual(a.prec, 6)
Tim Peters1fc240e2001-10-26 05:06:50 +0000283
Georg Brandl479a7e72008-02-05 18:13:15 +0000284 a = Number(a, prec=2)
285 self.assertEqual(repr(a), "3.1")
286 self.assertEqual(a.prec, 2)
Tim Peters1fc240e2001-10-26 05:06:50 +0000287
Georg Brandl479a7e72008-02-05 18:13:15 +0000288 a = Number(234.5)
289 self.assertEqual(repr(a), "234.5")
290 self.assertEqual(a.prec, 12)
Tim Peters1fc240e2001-10-26 05:06:50 +0000291
Benjamin Petersone549ead2009-03-28 21:42:05 +0000292 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000293 def test_spam_lists(self):
294 # Testing spamlist operations...
295 import copy, xxsubtype as spam
296
297 def spamlist(l, memo=None):
298 import xxsubtype as spam
299 return spam.spamlist(l)
300
301 # This is an ugly hack:
302 copy._deepcopy_dispatch[spam.spamlist] = spamlist
303
304 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
305 "__add__")
306 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
307 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
308 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
309 self.sliceop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
310 "__getitem__")
311 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
312 "__iadd__")
313 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
314 "__imul__")
315 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
316 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
317 "__mul__")
318 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
319 "__rmul__")
320 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
321 "__setitem__")
322 self.setsliceop_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
323 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
324 # Test subclassing
325 class C(spam.spamlist):
326 def foo(self): return 1
327 a = C()
328 self.assertEqual(a, [])
329 self.assertEqual(a.foo(), 1)
330 a.append(100)
331 self.assertEqual(a, [100])
332 self.assertEqual(a.getstate(), 0)
333 a.setstate(42)
334 self.assertEqual(a.getstate(), 42)
335
Benjamin Petersone549ead2009-03-28 21:42:05 +0000336 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000337 def test_spam_dicts(self):
338 # Testing spamdict operations...
339 import copy, xxsubtype as spam
340 def spamdict(d, memo=None):
341 import xxsubtype as spam
342 sd = spam.spamdict()
343 for k, v in list(d.items()):
344 sd[k] = v
345 return sd
346 # This is an ugly hack:
347 copy._deepcopy_dispatch[spam.spamdict] = spamdict
348
Georg Brandl479a7e72008-02-05 18:13:15 +0000349 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
350 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
351 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
352 d = spamdict({1:2,3:4})
353 l1 = []
354 for i in list(d.keys()):
355 l1.append(i)
356 l = []
357 for i in iter(d):
358 l.append(i)
359 self.assertEqual(l, l1)
360 l = []
361 for i in d.__iter__():
362 l.append(i)
363 self.assertEqual(l, l1)
364 l = []
365 for i in type(spamdict({})).__iter__(d):
366 l.append(i)
367 self.assertEqual(l, l1)
368 straightd = {1:2, 3:4}
369 spamd = spamdict(straightd)
370 self.unop_test(spamd, 2, "len(a)", "__len__")
371 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
372 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
373 "a[b]=c", "__setitem__")
374 # Test subclassing
375 class C(spam.spamdict):
376 def foo(self): return 1
377 a = C()
378 self.assertEqual(list(a.items()), [])
379 self.assertEqual(a.foo(), 1)
380 a['foo'] = 'bar'
381 self.assertEqual(list(a.items()), [('foo', 'bar')])
382 self.assertEqual(a.getstate(), 0)
383 a.setstate(100)
384 self.assertEqual(a.getstate(), 100)
385
386class ClassPropertiesAndMethods(unittest.TestCase):
387
388 def test_python_dicts(self):
389 # Testing Python subclass of dict...
390 self.assert_(issubclass(dict, dict))
391 self.assert_(isinstance({}, dict))
392 d = dict()
393 self.assertEqual(d, {})
394 self.assert_(d.__class__ is dict)
395 self.assert_(isinstance(d, dict))
396 class C(dict):
397 state = -1
398 def __init__(self_local, *a, **kw):
399 if a:
400 self.assertEqual(len(a), 1)
401 self_local.state = a[0]
402 if kw:
403 for k, v in list(kw.items()):
404 self_local[v] = k
405 def __getitem__(self, key):
406 return self.get(key, 0)
407 def __setitem__(self_local, key, value):
408 self.assert_(isinstance(key, type(0)))
409 dict.__setitem__(self_local, key, value)
410 def setstate(self, state):
411 self.state = state
412 def getstate(self):
413 return self.state
414 self.assert_(issubclass(C, dict))
415 a1 = C(12)
416 self.assertEqual(a1.state, 12)
417 a2 = C(foo=1, bar=2)
418 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
419 a = C()
420 self.assertEqual(a.state, -1)
421 self.assertEqual(a.getstate(), -1)
422 a.setstate(0)
423 self.assertEqual(a.state, 0)
424 self.assertEqual(a.getstate(), 0)
425 a.setstate(10)
426 self.assertEqual(a.state, 10)
427 self.assertEqual(a.getstate(), 10)
428 self.assertEqual(a[42], 0)
429 a[42] = 24
430 self.assertEqual(a[42], 24)
431 N = 50
432 for i in range(N):
433 a[i] = C()
434 for j in range(N):
435 a[i][j] = i*j
436 for i in range(N):
437 for j in range(N):
438 self.assertEqual(a[i][j], i*j)
439
440 def test_python_lists(self):
441 # Testing Python subclass of list...
442 class C(list):
443 def __getitem__(self, i):
444 if isinstance(i, slice):
445 return i.start, i.stop
446 return list.__getitem__(self, i) + 100
447 a = C()
448 a.extend([0,1,2])
449 self.assertEqual(a[0], 100)
450 self.assertEqual(a[1], 101)
451 self.assertEqual(a[2], 102)
452 self.assertEqual(a[100:200], (100,200))
453
454 def test_metaclass(self):
Georg Brandle81f5ef2008-05-27 20:34:09 +0000455 # Testing metaclasses...
Georg Brandl479a7e72008-02-05 18:13:15 +0000456 class C(metaclass=type):
457 def __init__(self):
458 self.__state = 0
459 def getstate(self):
460 return self.__state
461 def setstate(self, state):
462 self.__state = state
463 a = C()
464 self.assertEqual(a.getstate(), 0)
465 a.setstate(10)
466 self.assertEqual(a.getstate(), 10)
467 class _metaclass(type):
468 def myself(cls): return cls
469 class D(metaclass=_metaclass):
470 pass
471 self.assertEqual(D.myself(), D)
472 d = D()
473 self.assertEqual(d.__class__, D)
474 class M1(type):
475 def __new__(cls, name, bases, dict):
476 dict['__spam__'] = 1
477 return type.__new__(cls, name, bases, dict)
478 class C(metaclass=M1):
479 pass
480 self.assertEqual(C.__spam__, 1)
481 c = C()
482 self.assertEqual(c.__spam__, 1)
483
484 class _instance(object):
485 pass
486 class M2(object):
487 @staticmethod
488 def __new__(cls, name, bases, dict):
489 self = object.__new__(cls)
490 self.name = name
491 self.bases = bases
492 self.dict = dict
493 return self
494 def __call__(self):
495 it = _instance()
496 # Early binding of methods
497 for key in self.dict:
498 if key.startswith("__"):
499 continue
500 setattr(it, key, self.dict[key].__get__(it, self))
501 return it
502 class C(metaclass=M2):
503 def spam(self):
504 return 42
505 self.assertEqual(C.name, 'C')
506 self.assertEqual(C.bases, ())
507 self.assert_('spam' in C.dict)
508 c = C()
509 self.assertEqual(c.spam(), 42)
510
511 # More metaclass examples
512
513 class autosuper(type):
514 # Automatically add __super to the class
515 # This trick only works for dynamic classes
516 def __new__(metaclass, name, bases, dict):
517 cls = super(autosuper, metaclass).__new__(metaclass,
518 name, bases, dict)
519 # Name mangling for __super removes leading underscores
520 while name[:1] == "_":
521 name = name[1:]
522 if name:
523 name = "_%s__super" % name
524 else:
525 name = "__super"
526 setattr(cls, name, super(cls))
527 return cls
528 class A(metaclass=autosuper):
529 def meth(self):
530 return "A"
531 class B(A):
532 def meth(self):
533 return "B" + self.__super.meth()
534 class C(A):
535 def meth(self):
536 return "C" + self.__super.meth()
537 class D(C, B):
538 def meth(self):
539 return "D" + self.__super.meth()
540 self.assertEqual(D().meth(), "DCBA")
541 class E(B, C):
542 def meth(self):
543 return "E" + self.__super.meth()
544 self.assertEqual(E().meth(), "EBCA")
545
546 class autoproperty(type):
547 # Automatically create property attributes when methods
548 # named _get_x and/or _set_x are found
549 def __new__(metaclass, name, bases, dict):
550 hits = {}
551 for key, val in dict.items():
552 if key.startswith("_get_"):
553 key = key[5:]
554 get, set = hits.get(key, (None, None))
555 get = val
556 hits[key] = get, set
557 elif key.startswith("_set_"):
558 key = key[5:]
559 get, set = hits.get(key, (None, None))
560 set = val
561 hits[key] = get, set
562 for key, (get, set) in hits.items():
563 dict[key] = property(get, set)
564 return super(autoproperty, metaclass).__new__(metaclass,
565 name, bases, dict)
566 class A(metaclass=autoproperty):
567 def _get_x(self):
568 return -self.__x
569 def _set_x(self, x):
570 self.__x = -x
571 a = A()
572 self.assert_(not hasattr(a, "x"))
573 a.x = 12
574 self.assertEqual(a.x, 12)
575 self.assertEqual(a._A__x, -12)
576
577 class multimetaclass(autoproperty, autosuper):
578 # Merge of multiple cooperating metaclasses
579 pass
580 class A(metaclass=multimetaclass):
581 def _get_x(self):
582 return "A"
583 class B(A):
584 def _get_x(self):
585 return "B" + self.__super._get_x()
586 class C(A):
587 def _get_x(self):
588 return "C" + self.__super._get_x()
589 class D(C, B):
590 def _get_x(self):
591 return "D" + self.__super._get_x()
592 self.assertEqual(D().x, "DCBA")
593
594 # Make sure type(x) doesn't call x.__class__.__init__
595 class T(type):
596 counter = 0
597 def __init__(self, *args):
598 T.counter += 1
599 class C(metaclass=T):
600 pass
601 self.assertEqual(T.counter, 1)
602 a = C()
603 self.assertEqual(type(a), C)
604 self.assertEqual(T.counter, 1)
605
606 class C(object): pass
607 c = C()
608 try: c()
609 except TypeError: pass
610 else: self.fail("calling object w/o call method should raise "
611 "TypeError")
612
613 # Testing code to find most derived baseclass
614 class A(type):
615 def __new__(*args, **kwargs):
616 return type.__new__(*args, **kwargs)
617
618 class B(object):
619 pass
620
621 class C(object, metaclass=A):
622 pass
623
624 # The most derived metaclass of D is A rather than type.
625 class D(B, C):
626 pass
627
628 def test_module_subclasses(self):
629 # Testing Python subclass of module...
630 log = []
631 import types, sys
632 MT = type(sys)
633 class MM(MT):
634 def __init__(self, name):
635 MT.__init__(self, name)
636 def __getattribute__(self, name):
637 log.append(("getattr", name))
638 return MT.__getattribute__(self, name)
639 def __setattr__(self, name, value):
640 log.append(("setattr", name, value))
641 MT.__setattr__(self, name, value)
642 def __delattr__(self, name):
643 log.append(("delattr", name))
644 MT.__delattr__(self, name)
645 a = MM("a")
646 a.foo = 12
647 x = a.foo
648 del a.foo
649 self.assertEqual(log, [("setattr", "foo", 12),
650 ("getattr", "foo"),
651 ("delattr", "foo")])
652
653 # http://python.org/sf/1174712
Tim Peters1fc240e2001-10-26 05:06:50 +0000654 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000655 class Module(types.ModuleType, str):
656 pass
657 except TypeError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000658 pass
659 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000660 self.fail("inheriting from ModuleType and str at the same time "
661 "should fail")
Tim Peters1fc240e2001-10-26 05:06:50 +0000662
Georg Brandl479a7e72008-02-05 18:13:15 +0000663 def test_multiple_inheritance(self):
664 # Testing multiple inheritance...
665 class C(object):
666 def __init__(self):
667 self.__state = 0
668 def getstate(self):
669 return self.__state
670 def setstate(self, state):
671 self.__state = state
672 a = C()
673 self.assertEqual(a.getstate(), 0)
674 a.setstate(10)
675 self.assertEqual(a.getstate(), 10)
676 class D(dict, C):
677 def __init__(self):
678 type({}).__init__(self)
679 C.__init__(self)
680 d = D()
681 self.assertEqual(list(d.keys()), [])
682 d["hello"] = "world"
683 self.assertEqual(list(d.items()), [("hello", "world")])
684 self.assertEqual(d["hello"], "world")
685 self.assertEqual(d.getstate(), 0)
686 d.setstate(10)
687 self.assertEqual(d.getstate(), 10)
688 self.assertEqual(D.__mro__, (D, dict, C, object))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000689
Georg Brandl479a7e72008-02-05 18:13:15 +0000690 # SF bug #442833
691 class Node(object):
692 def __int__(self):
693 return int(self.foo())
694 def foo(self):
695 return "23"
696 class Frag(Node, list):
697 def foo(self):
698 return "42"
699 self.assertEqual(Node().__int__(), 23)
700 self.assertEqual(int(Node()), 23)
701 self.assertEqual(Frag().__int__(), 42)
702 self.assertEqual(int(Frag()), 42)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000703
Georg Brandl479a7e72008-02-05 18:13:15 +0000704 def test_diamond_inheritence(self):
705 # Testing multiple inheritance special cases...
706 class A(object):
707 def spam(self): return "A"
708 self.assertEqual(A().spam(), "A")
709 class B(A):
710 def boo(self): return "B"
711 def spam(self): return "B"
712 self.assertEqual(B().spam(), "B")
713 self.assertEqual(B().boo(), "B")
714 class C(A):
715 def boo(self): return "C"
716 self.assertEqual(C().spam(), "A")
717 self.assertEqual(C().boo(), "C")
718 class D(B, C): pass
719 self.assertEqual(D().spam(), "B")
720 self.assertEqual(D().boo(), "B")
721 self.assertEqual(D.__mro__, (D, B, C, A, object))
722 class E(C, B): pass
723 self.assertEqual(E().spam(), "B")
724 self.assertEqual(E().boo(), "C")
725 self.assertEqual(E.__mro__, (E, C, B, A, object))
726 # MRO order disagreement
727 try:
728 class F(D, E): pass
729 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000730 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000731 else:
732 self.fail("expected MRO order disagreement (F)")
733 try:
734 class G(E, D): pass
735 except TypeError:
736 pass
737 else:
738 self.fail("expected MRO order disagreement (G)")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000739
Georg Brandl479a7e72008-02-05 18:13:15 +0000740 # see thread python-dev/2002-October/029035.html
741 def test_ex5_from_c3_switch(self):
742 # Testing ex5 from C3 switch discussion...
743 class A(object): pass
744 class B(object): pass
745 class C(object): pass
746 class X(A): pass
747 class Y(A): pass
748 class Z(X,B,Y,C): pass
749 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000750
Georg Brandl479a7e72008-02-05 18:13:15 +0000751 # see "A Monotonic Superclass Linearization for Dylan",
752 # by Kim Barrett et al. (OOPSLA 1996)
753 def test_monotonicity(self):
754 # Testing MRO monotonicity...
755 class Boat(object): pass
756 class DayBoat(Boat): pass
757 class WheelBoat(Boat): pass
758 class EngineLess(DayBoat): pass
759 class SmallMultihull(DayBoat): pass
760 class PedalWheelBoat(EngineLess,WheelBoat): pass
761 class SmallCatamaran(SmallMultihull): pass
762 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
Guido van Rossume45763a2001-08-10 21:28:46 +0000763
Georg Brandl479a7e72008-02-05 18:13:15 +0000764 self.assertEqual(PedalWheelBoat.__mro__,
765 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
766 self.assertEqual(SmallCatamaran.__mro__,
767 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
768 self.assertEqual(Pedalo.__mro__,
769 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
770 SmallMultihull, DayBoat, WheelBoat, Boat, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000771
Georg Brandl479a7e72008-02-05 18:13:15 +0000772 # see "A Monotonic Superclass Linearization for Dylan",
773 # by Kim Barrett et al. (OOPSLA 1996)
774 def test_consistency_with_epg(self):
775 # Testing consistentcy with EPG...
776 class Pane(object): pass
777 class ScrollingMixin(object): pass
778 class EditingMixin(object): pass
779 class ScrollablePane(Pane,ScrollingMixin): pass
780 class EditablePane(Pane,EditingMixin): pass
781 class EditableScrollablePane(ScrollablePane,EditablePane): pass
Guido van Rossum9a818922002-11-14 19:50:14 +0000782
Georg Brandl479a7e72008-02-05 18:13:15 +0000783 self.assertEqual(EditableScrollablePane.__mro__,
784 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
785 ScrollingMixin, EditingMixin, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000786
Georg Brandl479a7e72008-02-05 18:13:15 +0000787 def test_mro_disagreement(self):
788 # Testing error messages for MRO disagreement...
789 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000790order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000791
Georg Brandl479a7e72008-02-05 18:13:15 +0000792 def raises(exc, expected, callable, *args):
Guido van Rossum58da9312007-11-10 23:39:45 +0000793 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000794 callable(*args)
795 except exc as msg:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000796 # the exact msg is generally considered an impl detail
797 if support.check_impl_detail():
798 if not str(msg).startswith(expected):
799 self.fail("Message %r, expected %r" %
800 (str(msg), expected))
Georg Brandl479a7e72008-02-05 18:13:15 +0000801 else:
802 self.fail("Expected %s" % exc)
Guido van Rossum58da9312007-11-10 23:39:45 +0000803
Georg Brandl479a7e72008-02-05 18:13:15 +0000804 class A(object): pass
805 class B(A): pass
806 class C(object): pass
Christian Heimes9a371592007-12-28 14:08:13 +0000807
Georg Brandl479a7e72008-02-05 18:13:15 +0000808 # Test some very simple errors
809 raises(TypeError, "duplicate base class A",
810 type, "X", (A, A), {})
811 raises(TypeError, mro_err_msg,
812 type, "X", (A, B), {})
813 raises(TypeError, mro_err_msg,
814 type, "X", (A, C, B), {})
815 # Test a slightly more complex error
816 class GridLayout(object): pass
817 class HorizontalGrid(GridLayout): pass
818 class VerticalGrid(GridLayout): pass
819 class HVGrid(HorizontalGrid, VerticalGrid): pass
820 class VHGrid(VerticalGrid, HorizontalGrid): pass
821 raises(TypeError, mro_err_msg,
822 type, "ConfusedGrid", (HVGrid, VHGrid), {})
Guido van Rossum58da9312007-11-10 23:39:45 +0000823
Georg Brandl479a7e72008-02-05 18:13:15 +0000824 def test_object_class(self):
825 # Testing object class...
826 a = object()
827 self.assertEqual(a.__class__, object)
828 self.assertEqual(type(a), object)
829 b = object()
830 self.assertNotEqual(a, b)
831 self.assertFalse(hasattr(a, "foo"))
Tim Peters808b94e2001-09-13 19:33:07 +0000832 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000833 a.foo = 12
834 except (AttributeError, TypeError):
Tim Peters808b94e2001-09-13 19:33:07 +0000835 pass
836 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000837 self.fail("object() should not allow setting a foo attribute")
838 self.assertFalse(hasattr(object(), "__dict__"))
Tim Peters561f8992001-09-13 19:36:36 +0000839
Georg Brandl479a7e72008-02-05 18:13:15 +0000840 class Cdict(object):
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000841 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000842 x = Cdict()
843 self.assertEqual(x.__dict__, {})
844 x.foo = 1
845 self.assertEqual(x.foo, 1)
846 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossumd8faa362007-04-27 19:54:29 +0000847
Georg Brandl479a7e72008-02-05 18:13:15 +0000848 def test_slots(self):
849 # Testing __slots__...
850 class C0(object):
851 __slots__ = []
852 x = C0()
853 self.assertFalse(hasattr(x, "__dict__"))
854 self.assertFalse(hasattr(x, "foo"))
855
856 class C1(object):
857 __slots__ = ['a']
858 x = C1()
859 self.assertFalse(hasattr(x, "__dict__"))
860 self.assertFalse(hasattr(x, "a"))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000861 x.a = 1
Georg Brandl479a7e72008-02-05 18:13:15 +0000862 self.assertEqual(x.a, 1)
863 x.a = None
864 self.assertEqual(x.a, None)
865 del x.a
866 self.assertFalse(hasattr(x, "a"))
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000867
Georg Brandl479a7e72008-02-05 18:13:15 +0000868 class C3(object):
869 __slots__ = ['a', 'b', 'c']
870 x = C3()
871 self.assertFalse(hasattr(x, "__dict__"))
872 self.assertFalse(hasattr(x, 'a'))
873 self.assertFalse(hasattr(x, 'b'))
874 self.assertFalse(hasattr(x, 'c'))
875 x.a = 1
876 x.b = 2
877 x.c = 3
878 self.assertEqual(x.a, 1)
879 self.assertEqual(x.b, 2)
880 self.assertEqual(x.c, 3)
881
882 class C4(object):
883 """Validate name mangling"""
884 __slots__ = ['__a']
885 def __init__(self, value):
886 self.__a = value
887 def get(self):
888 return self.__a
889 x = C4(5)
890 self.assertFalse(hasattr(x, '__dict__'))
891 self.assertFalse(hasattr(x, '__a'))
892 self.assertEqual(x.get(), 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000893 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000894 x.__a = 6
895 except AttributeError:
Guido van Rossum6661be32001-10-26 04:26:12 +0000896 pass
897 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000898 self.fail("Double underscored names not mangled")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000899
Georg Brandl479a7e72008-02-05 18:13:15 +0000900 # Make sure slot names are proper identifiers
Guido van Rossum360e4b82007-05-14 22:51:27 +0000901 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000902 class C(object):
903 __slots__ = [None]
Guido van Rossum360e4b82007-05-14 22:51:27 +0000904 except TypeError:
905 pass
906 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000907 self.fail("[None] slots not caught")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000908 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000909 class C(object):
910 __slots__ = ["foo bar"]
911 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000912 pass
913 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000914 self.fail("['foo bar'] slots not caught")
915 try:
916 class C(object):
917 __slots__ = ["foo\0bar"]
918 except TypeError:
919 pass
920 else:
921 self.fail("['foo\\0bar'] slots not caught")
922 try:
923 class C(object):
924 __slots__ = ["1"]
925 except TypeError:
926 pass
927 else:
928 self.fail("['1'] slots not caught")
929 try:
930 class C(object):
931 __slots__ = [""]
932 except TypeError:
933 pass
934 else:
935 self.fail("[''] slots not caught")
936 class C(object):
937 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
938 # XXX(nnorwitz): was there supposed to be something tested
939 # from the class above?
Guido van Rossum360e4b82007-05-14 22:51:27 +0000940
Georg Brandl479a7e72008-02-05 18:13:15 +0000941 # Test a single string is not expanded as a sequence.
942 class C(object):
943 __slots__ = "abc"
944 c = C()
945 c.abc = 5
946 self.assertEqual(c.abc, 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000947
Georg Brandl479a7e72008-02-05 18:13:15 +0000948 # Test unicode slot names
949 # Test a single unicode string is not expanded as a sequence.
950 class C(object):
951 __slots__ = "abc"
952 c = C()
953 c.abc = 5
954 self.assertEqual(c.abc, 5)
Guido van Rossum3926a632001-09-25 16:25:58 +0000955
Georg Brandl479a7e72008-02-05 18:13:15 +0000956 # _unicode_to_string used to modify slots in certain circumstances
957 slots = ("foo", "bar")
958 class C(object):
959 __slots__ = slots
960 x = C()
961 x.foo = 5
962 self.assertEqual(x.foo, 5)
963 self.assert_(type(slots[0]) is str)
964 # this used to leak references
965 try:
966 class C(object):
967 __slots__ = [chr(128)]
968 except (TypeError, UnicodeEncodeError):
969 pass
970 else:
971 raise TestFailed("[chr(128)] slots not caught")
Guido van Rossum3926a632001-09-25 16:25:58 +0000972
Georg Brandl479a7e72008-02-05 18:13:15 +0000973 # Test leaks
974 class Counted(object):
975 counter = 0 # counts the number of instances alive
976 def __init__(self):
977 Counted.counter += 1
978 def __del__(self):
979 Counted.counter -= 1
980 class C(object):
981 __slots__ = ['a', 'b', 'c']
982 x = C()
983 x.a = Counted()
984 x.b = Counted()
985 x.c = Counted()
986 self.assertEqual(Counted.counter, 3)
987 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000988 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000989 self.assertEqual(Counted.counter, 0)
990 class D(C):
991 pass
992 x = D()
993 x.a = Counted()
994 x.z = Counted()
995 self.assertEqual(Counted.counter, 2)
996 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000997 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000998 self.assertEqual(Counted.counter, 0)
999 class E(D):
1000 __slots__ = ['e']
1001 x = E()
1002 x.a = Counted()
1003 x.z = Counted()
1004 x.e = Counted()
1005 self.assertEqual(Counted.counter, 3)
1006 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +00001007 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001008 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001009
Georg Brandl479a7e72008-02-05 18:13:15 +00001010 # Test cyclical leaks [SF bug 519621]
1011 class F(object):
1012 __slots__ = ['a', 'b']
1013 log = []
1014 s = F()
1015 s.a = [Counted(), s]
1016 self.assertEqual(Counted.counter, 1)
1017 s = None
Benjamin Petersone549ead2009-03-28 21:42:05 +00001018 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001019 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001020
Georg Brandl479a7e72008-02-05 18:13:15 +00001021 # Test lookup leaks [SF bug 572567]
1022 import sys,gc
Benjamin Petersone549ead2009-03-28 21:42:05 +00001023 if hasattr(gc, 'get_objects'):
1024 class G(object):
1025 def __cmp__(self, other):
1026 return 0
1027 g = G()
1028 orig_objects = len(gc.get_objects())
1029 for i in range(10):
1030 g==g
1031 new_objects = len(gc.get_objects())
1032 self.assertEqual(orig_objects, new_objects)
1033
Georg Brandl479a7e72008-02-05 18:13:15 +00001034 class H(object):
1035 __slots__ = ['a', 'b']
1036 def __init__(self):
1037 self.a = 1
1038 self.b = 2
1039 def __del__(self_):
1040 self.assertEqual(self_.a, 1)
1041 self.assertEqual(self_.b, 2)
Benjamin Petersonc1de4cc2008-11-03 21:29:09 +00001042 with support.captured_output('stderr') as s:
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001043 h = H()
Georg Brandl479a7e72008-02-05 18:13:15 +00001044 del h
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001045 self.assertEqual(s.getvalue(), '')
Guido van Rossum90c45142001-11-24 21:07:01 +00001046
Georg Brandl479a7e72008-02-05 18:13:15 +00001047 def test_slots_special(self):
1048 # Testing __dict__ and __weakref__ in __slots__...
1049 class D(object):
1050 __slots__ = ["__dict__"]
1051 a = D()
1052 self.assert_(hasattr(a, "__dict__"))
1053 self.assertFalse(hasattr(a, "__weakref__"))
1054 a.foo = 42
1055 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum90c45142001-11-24 21:07:01 +00001056
Georg Brandl479a7e72008-02-05 18:13:15 +00001057 class W(object):
1058 __slots__ = ["__weakref__"]
1059 a = W()
1060 self.assert_(hasattr(a, "__weakref__"))
1061 self.assertFalse(hasattr(a, "__dict__"))
1062 try:
1063 a.foo = 42
1064 except AttributeError:
1065 pass
1066 else:
1067 self.fail("shouldn't be allowed to set a.foo")
1068
1069 class C1(W, D):
1070 __slots__ = []
1071 a = C1()
1072 self.assert_(hasattr(a, "__dict__"))
1073 self.assert_(hasattr(a, "__weakref__"))
1074 a.foo = 42
1075 self.assertEqual(a.__dict__, {"foo": 42})
1076
1077 class C2(D, W):
1078 __slots__ = []
1079 a = C2()
1080 self.assert_(hasattr(a, "__dict__"))
1081 self.assert_(hasattr(a, "__weakref__"))
1082 a.foo = 42
1083 self.assertEqual(a.__dict__, {"foo": 42})
1084
Christian Heimesa156e092008-02-16 07:38:31 +00001085 def test_slots_descriptor(self):
1086 # Issue2115: slot descriptors did not correctly check
1087 # the type of the given object
1088 import abc
1089 class MyABC(metaclass=abc.ABCMeta):
1090 __slots__ = "a"
1091
1092 class Unrelated(object):
1093 pass
1094 MyABC.register(Unrelated)
1095
1096 u = Unrelated()
1097 self.assert_(isinstance(u, MyABC))
1098
1099 # This used to crash
1100 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1101
Georg Brandl479a7e72008-02-05 18:13:15 +00001102 def test_dynamics(self):
1103 # Testing class attribute propagation...
1104 class D(object):
1105 pass
1106 class E(D):
1107 pass
1108 class F(D):
1109 pass
1110 D.foo = 1
1111 self.assertEqual(D.foo, 1)
1112 # Test that dynamic attributes are inherited
1113 self.assertEqual(E.foo, 1)
1114 self.assertEqual(F.foo, 1)
1115 # Test dynamic instances
1116 class C(object):
1117 pass
1118 a = C()
1119 self.assertFalse(hasattr(a, "foobar"))
1120 C.foobar = 2
1121 self.assertEqual(a.foobar, 2)
1122 C.method = lambda self: 42
1123 self.assertEqual(a.method(), 42)
1124 C.__repr__ = lambda self: "C()"
1125 self.assertEqual(repr(a), "C()")
1126 C.__int__ = lambda self: 100
1127 self.assertEqual(int(a), 100)
1128 self.assertEqual(a.foobar, 2)
1129 self.assertFalse(hasattr(a, "spam"))
1130 def mygetattr(self, name):
1131 if name == "spam":
1132 return "spam"
1133 raise AttributeError
1134 C.__getattr__ = mygetattr
1135 self.assertEqual(a.spam, "spam")
1136 a.new = 12
1137 self.assertEqual(a.new, 12)
1138 def mysetattr(self, name, value):
1139 if name == "spam":
1140 raise AttributeError
1141 return object.__setattr__(self, name, value)
1142 C.__setattr__ = mysetattr
1143 try:
1144 a.spam = "not spam"
1145 except AttributeError:
1146 pass
1147 else:
1148 self.fail("expected AttributeError")
1149 self.assertEqual(a.spam, "spam")
1150 class D(C):
1151 pass
1152 d = D()
1153 d.foo = 1
1154 self.assertEqual(d.foo, 1)
1155
1156 # Test handling of int*seq and seq*int
1157 class I(int):
1158 pass
1159 self.assertEqual("a"*I(2), "aa")
1160 self.assertEqual(I(2)*"a", "aa")
1161 self.assertEqual(2*I(3), 6)
1162 self.assertEqual(I(3)*2, 6)
1163 self.assertEqual(I(3)*I(2), 6)
1164
1165 # Test handling of long*seq and seq*long
1166 class L(int):
1167 pass
1168 self.assertEqual("a"*L(2), "aa")
1169 self.assertEqual(L(2)*"a", "aa")
1170 self.assertEqual(2*L(3), 6)
1171 self.assertEqual(L(3)*2, 6)
1172 self.assertEqual(L(3)*L(2), 6)
1173
1174 # Test comparison of classes with dynamic metaclasses
1175 class dynamicmetaclass(type):
1176 pass
1177 class someclass(metaclass=dynamicmetaclass):
1178 pass
1179 self.assertNotEqual(someclass, object)
1180
1181 def test_errors(self):
1182 # Testing errors...
1183 try:
1184 class C(list, dict):
1185 pass
1186 except TypeError:
1187 pass
1188 else:
1189 self.fail("inheritance from both list and dict should be illegal")
1190
1191 try:
1192 class C(object, None):
1193 pass
1194 except TypeError:
1195 pass
1196 else:
1197 self.fail("inheritance from non-type should be illegal")
1198 class Classic:
1199 pass
1200
1201 try:
1202 class C(type(len)):
1203 pass
1204 except TypeError:
1205 pass
1206 else:
1207 self.fail("inheritance from CFunction should be illegal")
1208
1209 try:
1210 class C(object):
1211 __slots__ = 1
1212 except TypeError:
1213 pass
1214 else:
1215 self.fail("__slots__ = 1 should be illegal")
1216
1217 try:
1218 class C(object):
1219 __slots__ = [1]
1220 except TypeError:
1221 pass
1222 else:
1223 self.fail("__slots__ = [1] should be illegal")
1224
1225 class M1(type):
1226 pass
1227 class M2(type):
1228 pass
1229 class A1(object, metaclass=M1):
1230 pass
1231 class A2(object, metaclass=M2):
1232 pass
1233 try:
1234 class B(A1, A2):
1235 pass
1236 except TypeError:
1237 pass
1238 else:
1239 self.fail("finding the most derived metaclass should have failed")
1240
1241 def test_classmethods(self):
1242 # Testing class methods...
1243 class C(object):
1244 def foo(*a): return a
1245 goo = classmethod(foo)
1246 c = C()
1247 self.assertEqual(C.goo(1), (C, 1))
1248 self.assertEqual(c.goo(1), (C, 1))
1249 self.assertEqual(c.foo(1), (c, 1))
1250 class D(C):
1251 pass
1252 d = D()
1253 self.assertEqual(D.goo(1), (D, 1))
1254 self.assertEqual(d.goo(1), (D, 1))
1255 self.assertEqual(d.foo(1), (d, 1))
1256 self.assertEqual(D.foo(d, 1), (d, 1))
1257 # Test for a specific crash (SF bug 528132)
1258 def f(cls, arg): return (cls, arg)
1259 ff = classmethod(f)
1260 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1261 self.assertEqual(ff.__get__(0)(42), (int, 42))
1262
1263 # Test super() with classmethods (SF bug 535444)
1264 self.assertEqual(C.goo.__self__, C)
1265 self.assertEqual(D.goo.__self__, D)
1266 self.assertEqual(super(D,D).goo.__self__, D)
1267 self.assertEqual(super(D,d).goo.__self__, D)
1268 self.assertEqual(super(D,D).goo(), (D,))
1269 self.assertEqual(super(D,d).goo(), (D,))
1270
1271 # Verify that argument is checked for callability (SF bug 753451)
1272 try:
1273 classmethod(1).__get__(1)
1274 except TypeError:
1275 pass
1276 else:
1277 self.fail("classmethod should check for callability")
1278
1279 # Verify that classmethod() doesn't allow keyword args
1280 try:
1281 classmethod(f, kw=1)
1282 except TypeError:
1283 pass
1284 else:
1285 self.fail("classmethod shouldn't accept keyword args")
1286
Benjamin Petersone549ead2009-03-28 21:42:05 +00001287 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001288 def test_classmethods_in_c(self):
1289 # Testing C-based class methods...
1290 import xxsubtype as spam
1291 a = (1, 2, 3)
1292 d = {'abc': 123}
1293 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1294 self.assertEqual(x, spam.spamlist)
1295 self.assertEqual(a, a1)
1296 self.assertEqual(d, d1)
1297 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1298 self.assertEqual(x, spam.spamlist)
1299 self.assertEqual(a, a1)
1300 self.assertEqual(d, d1)
1301
1302 def test_staticmethods(self):
1303 # Testing static methods...
1304 class C(object):
1305 def foo(*a): return a
1306 goo = staticmethod(foo)
1307 c = C()
1308 self.assertEqual(C.goo(1), (1,))
1309 self.assertEqual(c.goo(1), (1,))
1310 self.assertEqual(c.foo(1), (c, 1,))
1311 class D(C):
1312 pass
1313 d = D()
1314 self.assertEqual(D.goo(1), (1,))
1315 self.assertEqual(d.goo(1), (1,))
1316 self.assertEqual(d.foo(1), (d, 1))
1317 self.assertEqual(D.foo(d, 1), (d, 1))
1318
Benjamin Petersone549ead2009-03-28 21:42:05 +00001319 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001320 def test_staticmethods_in_c(self):
1321 # Testing C-based static methods...
1322 import xxsubtype as spam
1323 a = (1, 2, 3)
1324 d = {"abc": 123}
1325 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1326 self.assertEqual(x, None)
1327 self.assertEqual(a, a1)
1328 self.assertEqual(d, d1)
1329 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1330 self.assertEqual(x, None)
1331 self.assertEqual(a, a1)
1332 self.assertEqual(d, d1)
1333
1334 def test_classic(self):
1335 # Testing classic classes...
1336 class C:
1337 def foo(*a): return a
1338 goo = classmethod(foo)
1339 c = C()
1340 self.assertEqual(C.goo(1), (C, 1))
1341 self.assertEqual(c.goo(1), (C, 1))
1342 self.assertEqual(c.foo(1), (c, 1))
1343 class D(C):
1344 pass
1345 d = D()
1346 self.assertEqual(D.goo(1), (D, 1))
1347 self.assertEqual(d.goo(1), (D, 1))
1348 self.assertEqual(d.foo(1), (d, 1))
1349 self.assertEqual(D.foo(d, 1), (d, 1))
1350 class E: # *not* subclassing from C
1351 foo = C.foo
1352 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
1353 self.assert_(repr(C.foo.__get__(C())).startswith("<bound method "))
1354
1355 def test_compattr(self):
1356 # Testing computed attributes...
1357 class C(object):
1358 class computed_attribute(object):
1359 def __init__(self, get, set=None, delete=None):
1360 self.__get = get
1361 self.__set = set
1362 self.__delete = delete
1363 def __get__(self, obj, type=None):
1364 return self.__get(obj)
1365 def __set__(self, obj, value):
1366 return self.__set(obj, value)
1367 def __delete__(self, obj):
1368 return self.__delete(obj)
1369 def __init__(self):
1370 self.__x = 0
1371 def __get_x(self):
1372 x = self.__x
1373 self.__x = x+1
1374 return x
1375 def __set_x(self, x):
1376 self.__x = x
1377 def __delete_x(self):
1378 del self.__x
1379 x = computed_attribute(__get_x, __set_x, __delete_x)
1380 a = C()
1381 self.assertEqual(a.x, 0)
1382 self.assertEqual(a.x, 1)
1383 a.x = 10
1384 self.assertEqual(a.x, 10)
1385 self.assertEqual(a.x, 11)
1386 del a.x
1387 self.assertEqual(hasattr(a, 'x'), 0)
1388
1389 def test_newslots(self):
1390 # Testing __new__ slot override...
1391 class C(list):
1392 def __new__(cls):
1393 self = list.__new__(cls)
1394 self.foo = 1
1395 return self
1396 def __init__(self):
1397 self.foo = self.foo + 2
1398 a = C()
1399 self.assertEqual(a.foo, 3)
1400 self.assertEqual(a.__class__, C)
1401 class D(C):
1402 pass
1403 b = D()
1404 self.assertEqual(b.foo, 3)
1405 self.assertEqual(b.__class__, D)
1406
1407 def test_altmro(self):
1408 # Testing mro() and overriding it...
1409 class A(object):
1410 def f(self): return "A"
1411 class B(A):
1412 pass
1413 class C(A):
1414 def f(self): return "C"
1415 class D(B, C):
1416 pass
1417 self.assertEqual(D.mro(), [D, B, C, A, object])
1418 self.assertEqual(D.__mro__, (D, B, C, A, object))
1419 self.assertEqual(D().f(), "C")
1420
1421 class PerverseMetaType(type):
1422 def mro(cls):
1423 L = type.mro(cls)
1424 L.reverse()
1425 return L
1426 class X(D,B,C,A, metaclass=PerverseMetaType):
1427 pass
1428 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1429 self.assertEqual(X().f(), "A")
1430
1431 try:
1432 class _metaclass(type):
1433 def mro(self):
1434 return [self, dict, object]
1435 class X(object, metaclass=_metaclass):
1436 pass
Benjamin Petersone549ead2009-03-28 21:42:05 +00001437 # In CPython, the class creation above already raises
1438 # TypeError, as a protection against the fact that
1439 # instances of X would segfault it. In other Python
1440 # implementations it would be ok to let the class X
1441 # be created, but instead get a clean TypeError on the
1442 # __setitem__ below.
1443 x = object.__new__(X)
1444 x[5] = 6
Georg Brandl479a7e72008-02-05 18:13:15 +00001445 except TypeError:
1446 pass
1447 else:
1448 self.fail("devious mro() return not caught")
1449
1450 try:
1451 class _metaclass(type):
1452 def mro(self):
1453 return [1]
1454 class X(object, metaclass=_metaclass):
1455 pass
1456 except TypeError:
1457 pass
1458 else:
1459 self.fail("non-class mro() return not caught")
1460
1461 try:
1462 class _metaclass(type):
1463 def mro(self):
1464 return 1
1465 class X(object, metaclass=_metaclass):
1466 pass
1467 except TypeError:
1468 pass
1469 else:
1470 self.fail("non-sequence mro() return not caught")
1471
1472 def test_overloading(self):
1473 # Testing operator overloading...
1474
1475 class B(object):
1476 "Intermediate class because object doesn't have a __setattr__"
1477
1478 class C(B):
1479 def __getattr__(self, name):
1480 if name == "foo":
1481 return ("getattr", name)
1482 else:
1483 raise AttributeError
1484 def __setattr__(self, name, value):
1485 if name == "foo":
1486 self.setattr = (name, value)
1487 else:
1488 return B.__setattr__(self, name, value)
1489 def __delattr__(self, name):
1490 if name == "foo":
1491 self.delattr = name
1492 else:
1493 return B.__delattr__(self, name)
1494
1495 def __getitem__(self, key):
1496 return ("getitem", key)
1497 def __setitem__(self, key, value):
1498 self.setitem = (key, value)
1499 def __delitem__(self, key):
1500 self.delitem = key
1501
1502 a = C()
1503 self.assertEqual(a.foo, ("getattr", "foo"))
1504 a.foo = 12
1505 self.assertEqual(a.setattr, ("foo", 12))
1506 del a.foo
1507 self.assertEqual(a.delattr, "foo")
1508
1509 self.assertEqual(a[12], ("getitem", 12))
1510 a[12] = 21
1511 self.assertEqual(a.setitem, (12, 21))
1512 del a[12]
1513 self.assertEqual(a.delitem, 12)
1514
1515 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1516 a[0:10] = "foo"
1517 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1518 del a[0:10]
1519 self.assertEqual(a.delitem, (slice(0, 10)))
1520
1521 def test_methods(self):
1522 # Testing methods...
1523 class C(object):
1524 def __init__(self, x):
1525 self.x = x
1526 def foo(self):
1527 return self.x
1528 c1 = C(1)
1529 self.assertEqual(c1.foo(), 1)
1530 class D(C):
1531 boo = C.foo
1532 goo = c1.foo
1533 d2 = D(2)
1534 self.assertEqual(d2.foo(), 2)
1535 self.assertEqual(d2.boo(), 2)
1536 self.assertEqual(d2.goo(), 1)
1537 class E(object):
1538 foo = C.foo
1539 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
1540 self.assert_(repr(C.foo.__get__(C(1))).startswith("<bound method "))
1541
Benjamin Peterson224205f2009-05-08 03:25:19 +00001542 def test_special_method_lookup(self):
1543 # The lookup of special methods bypasses __getattr__ and
1544 # __getattribute__, but they still can be descriptors.
1545
1546 def run_context(manager):
1547 with manager:
1548 pass
1549 def iden(self):
1550 return self
1551 def hello(self):
1552 return b"hello"
Benjamin Peterson053c61f2009-05-09 17:21:13 +00001553 def empty_seq(self):
1554 return []
Benjamin Petersona5758c02009-05-09 18:15:04 +00001555 def zero(self):
1556 return 0
1557 def stop(self):
1558 raise StopIteration
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001559 def return_true(self, thing=None):
1560 return True
1561 def do_isinstance(obj):
1562 return isinstance(int, obj)
1563 def do_issubclass(obj):
1564 return issubclass(int, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001565
1566 # It would be nice to have every special method tested here, but I'm
1567 # only listing the ones I can remember outside of typeobject.c, since it
1568 # does it right.
1569 specials = [
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001570 ("__bytes__", bytes, hello, set(), {}),
1571 ("__reversed__", reversed, empty_seq, set(), {}),
1572 ("__length_hint__", list, zero, set(),
Benjamin Petersona5758c02009-05-09 18:15:04 +00001573 {"__iter__" : iden, "__next__" : stop}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001574 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1575 ("__instancecheck__", do_isinstance, return_true, set(), {}),
1576 ("__subclasscheck__", do_issubclass, return_true,
1577 set(("__bases__",)), {}),
Benjamin Peterson224205f2009-05-08 03:25:19 +00001578 # These two fail because the compiler generates LOAD_ATTR to look
1579 # them up. We'd have to add a new opcode to fix this, and it's
1580 # probably not worth it.
1581 # ("__enter__", run_context, iden),
1582 # ("__exit__", run_context, iden),
1583 ]
1584
1585 class Checker(object):
1586 def __getattr__(self, attr, test=self):
1587 test.fail("__getattr__ called with {0}".format(attr))
1588 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001589 if attr not in ok:
1590 test.fail("__getattribute__ called with {0}".format(attr))
1591 return object.__getattribute__(attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001592 class SpecialDescr(object):
1593 def __init__(self, impl):
1594 self.impl = impl
1595 def __get__(self, obj, owner):
1596 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001597 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001598 class MyException(Exception):
1599 pass
1600 class ErrDescr(object):
1601 def __get__(self, obj, owner):
1602 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001603
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001604 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001605 class X(Checker):
1606 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001607 for attr, obj in env.items():
1608 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001609 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001610 runner(X())
1611
1612 record = []
1613 class X(Checker):
1614 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001615 for attr, obj in env.items():
1616 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001617 setattr(X, name, SpecialDescr(meth_impl))
1618 runner(X())
1619 self.assertEqual(record, [1], name)
1620
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001621 class X(Checker):
1622 pass
1623 for attr, obj in env.items():
1624 setattr(X, attr, obj)
1625 setattr(X, name, ErrDescr())
1626 try:
1627 runner(X())
1628 except MyException:
1629 pass
1630 else:
1631 self.fail("{0!r} didn't raise".format(name))
1632
Georg Brandl479a7e72008-02-05 18:13:15 +00001633 def test_specials(self):
1634 # Testing special operators...
1635 # Test operators like __hash__ for which a built-in default exists
1636
1637 # Test the default behavior for static classes
1638 class C(object):
1639 def __getitem__(self, i):
1640 if 0 <= i < 10: return i
1641 raise IndexError
1642 c1 = C()
1643 c2 = C()
1644 self.assert_(not not c1) # What?
1645 self.assertNotEqual(id(c1), id(c2))
1646 hash(c1)
1647 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001648 self.assertEqual(c1, c1)
1649 self.assert_(c1 != c2)
1650 self.assert_(not c1 != c1)
1651 self.assert_(not c1 == c2)
1652 # Note that the module name appears in str/repr, and that varies
1653 # depending on whether this test is run standalone or from a framework.
1654 self.assert_(str(c1).find('C object at ') >= 0)
1655 self.assertEqual(str(c1), repr(c1))
1656 self.assert_(-1 not in c1)
1657 for i in range(10):
1658 self.assert_(i in c1)
1659 self.assertFalse(10 in c1)
1660 # Test the default behavior for dynamic classes
1661 class D(object):
1662 def __getitem__(self, i):
1663 if 0 <= i < 10: return i
1664 raise IndexError
1665 d1 = D()
1666 d2 = D()
1667 self.assert_(not not d1)
1668 self.assertNotEqual(id(d1), id(d2))
1669 hash(d1)
1670 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001671 self.assertEqual(d1, d1)
1672 self.assertNotEqual(d1, d2)
1673 self.assert_(not d1 != d1)
1674 self.assert_(not d1 == d2)
1675 # Note that the module name appears in str/repr, and that varies
1676 # depending on whether this test is run standalone or from a framework.
1677 self.assert_(str(d1).find('D object at ') >= 0)
1678 self.assertEqual(str(d1), repr(d1))
1679 self.assert_(-1 not in d1)
1680 for i in range(10):
1681 self.assert_(i in d1)
1682 self.assertFalse(10 in d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001683 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001684 class Proxy(object):
1685 def __init__(self, x):
1686 self.x = x
1687 def __bool__(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
Benjamin Peterson60192082008-10-16 19:34:46 +00001695 def __ge__(self, other):
1696 return self.x >= other
1697 def __gt__(self, other):
1698 return self.x > other
1699 def __le__(self, other):
1700 return self.x <= other
1701 def __lt__(self, other):
1702 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001703 def __str__(self):
1704 return "Proxy:%s" % self.x
1705 def __repr__(self):
1706 return "Proxy(%r)" % self.x
1707 def __contains__(self, value):
1708 return value in self.x
1709 p0 = Proxy(0)
1710 p1 = Proxy(1)
1711 p_1 = Proxy(-1)
1712 self.assertFalse(p0)
1713 self.assert_(not not p1)
1714 self.assertEqual(hash(p0), hash(0))
1715 self.assertEqual(p0, p0)
1716 self.assertNotEqual(p0, p1)
1717 self.assert_(not p0 != p0)
1718 self.assertEqual(not p0, p1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001719 self.assert_(p0 < p1)
1720 self.assert_(p0 <= p1)
1721 self.assert_(p1 > p0)
1722 self.assert_(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001723 self.assertEqual(str(p0), "Proxy:0")
1724 self.assertEqual(repr(p0), "Proxy(0)")
1725 p10 = Proxy(range(10))
1726 self.assertFalse(-1 in p10)
1727 for i in range(10):
1728 self.assert_(i in p10)
1729 self.assertFalse(10 in p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001730
Georg Brandl479a7e72008-02-05 18:13:15 +00001731 def test_weakrefs(self):
1732 # Testing weak references...
1733 import weakref
1734 class C(object):
1735 pass
1736 c = C()
1737 r = weakref.ref(c)
1738 self.assertEqual(r(), c)
1739 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001740 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001741 self.assertEqual(r(), None)
1742 del r
1743 class NoWeak(object):
1744 __slots__ = ['foo']
1745 no = NoWeak()
1746 try:
1747 weakref.ref(no)
1748 except TypeError as msg:
1749 self.assert_(str(msg).find("weak reference") >= 0)
1750 else:
1751 self.fail("weakref.ref(no) should be illegal")
1752 class Weak(object):
1753 __slots__ = ['foo', '__weakref__']
1754 yes = Weak()
1755 r = weakref.ref(yes)
1756 self.assertEqual(r(), yes)
1757 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001758 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001759 self.assertEqual(r(), None)
1760 del r
1761
1762 def test_properties(self):
1763 # Testing property...
1764 class C(object):
1765 def getx(self):
1766 return self.__x
1767 def setx(self, value):
1768 self.__x = value
1769 def delx(self):
1770 del self.__x
1771 x = property(getx, setx, delx, doc="I'm the x property.")
1772 a = C()
1773 self.assertFalse(hasattr(a, "x"))
1774 a.x = 42
1775 self.assertEqual(a._C__x, 42)
1776 self.assertEqual(a.x, 42)
1777 del a.x
1778 self.assertFalse(hasattr(a, "x"))
1779 self.assertFalse(hasattr(a, "_C__x"))
1780 C.x.__set__(a, 100)
1781 self.assertEqual(C.x.__get__(a), 100)
1782 C.x.__delete__(a)
1783 self.assertFalse(hasattr(a, "x"))
1784
1785 raw = C.__dict__['x']
1786 self.assert_(isinstance(raw, property))
1787
1788 attrs = dir(raw)
1789 self.assert_("__doc__" in attrs)
1790 self.assert_("fget" in attrs)
1791 self.assert_("fset" in attrs)
1792 self.assert_("fdel" in attrs)
1793
1794 self.assertEqual(raw.__doc__, "I'm the x property.")
1795 self.assert_(raw.fget is C.__dict__['getx'])
1796 self.assert_(raw.fset is C.__dict__['setx'])
1797 self.assert_(raw.fdel is C.__dict__['delx'])
1798
1799 for attr in "__doc__", "fget", "fset", "fdel":
1800 try:
1801 setattr(raw, attr, 42)
1802 except AttributeError as msg:
1803 if str(msg).find('readonly') < 0:
1804 self.fail("when setting readonly attr %r on a property, "
1805 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1806 else:
1807 self.fail("expected AttributeError from trying to set readonly %r "
1808 "attr on a property" % attr)
1809
1810 class D(object):
1811 __getitem__ = property(lambda s: 1/0)
1812
1813 d = D()
1814 try:
1815 for i in d:
1816 str(i)
1817 except ZeroDivisionError:
1818 pass
1819 else:
1820 self.fail("expected ZeroDivisionError from bad property")
1821
1822 class E(object):
1823 def getter(self):
1824 "getter method"
1825 return 0
1826 def setter(self_, value):
1827 "setter method"
1828 pass
1829 prop = property(getter)
1830 self.assertEqual(prop.__doc__, "getter method")
1831 prop2 = property(fset=setter)
1832 self.assertEqual(prop2.__doc__, None)
1833
1834 # this segfaulted in 2.5b2
1835 try:
1836 import _testcapi
1837 except ImportError:
1838 pass
1839 else:
1840 class X(object):
1841 p = property(_testcapi.test_with_docstring)
1842
1843 def test_properties_plus(self):
1844 class C(object):
1845 foo = property(doc="hello")
1846 @foo.getter
1847 def foo(self):
1848 return self._foo
1849 @foo.setter
1850 def foo(self, value):
1851 self._foo = abs(value)
1852 @foo.deleter
1853 def foo(self):
1854 del self._foo
1855 c = C()
1856 self.assertEqual(C.foo.__doc__, "hello")
1857 self.assertFalse(hasattr(c, "foo"))
1858 c.foo = -42
1859 self.assert_(hasattr(c, '_foo'))
1860 self.assertEqual(c._foo, 42)
1861 self.assertEqual(c.foo, 42)
1862 del c.foo
1863 self.assertFalse(hasattr(c, '_foo'))
1864 self.assertFalse(hasattr(c, "foo"))
1865
1866 class D(C):
1867 @C.foo.deleter
1868 def foo(self):
1869 try:
1870 del self._foo
1871 except AttributeError:
1872 pass
1873 d = D()
1874 d.foo = 24
1875 self.assertEqual(d.foo, 24)
1876 del d.foo
1877 del d.foo
1878
1879 class E(object):
1880 @property
1881 def foo(self):
1882 return self._foo
1883 @foo.setter
1884 def foo(self, value):
1885 raise RuntimeError
1886 @foo.setter
1887 def foo(self, value):
1888 self._foo = abs(value)
1889 @foo.deleter
1890 def foo(self, value=None):
1891 del self._foo
1892
1893 e = E()
1894 e.foo = -42
1895 self.assertEqual(e.foo, 42)
1896 del e.foo
1897
1898 class F(E):
1899 @E.foo.deleter
1900 def foo(self):
1901 del self._foo
1902 @foo.setter
1903 def foo(self, value):
1904 self._foo = max(0, value)
1905 f = F()
1906 f.foo = -10
1907 self.assertEqual(f.foo, 0)
1908 del f.foo
1909
1910 def test_dict_constructors(self):
1911 # Testing dict constructor ...
1912 d = dict()
1913 self.assertEqual(d, {})
1914 d = dict({})
1915 self.assertEqual(d, {})
1916 d = dict({1: 2, 'a': 'b'})
1917 self.assertEqual(d, {1: 2, 'a': 'b'})
1918 self.assertEqual(d, dict(list(d.items())))
1919 self.assertEqual(d, dict(iter(d.items())))
1920 d = dict({'one':1, 'two':2})
1921 self.assertEqual(d, dict(one=1, two=2))
1922 self.assertEqual(d, dict(**d))
1923 self.assertEqual(d, dict({"one": 1}, two=2))
1924 self.assertEqual(d, dict([("two", 2)], one=1))
1925 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1926 self.assertEqual(d, dict(**d))
1927
1928 for badarg in 0, 0, 0j, "0", [0], (0,):
1929 try:
1930 dict(badarg)
1931 except TypeError:
1932 pass
1933 except ValueError:
1934 if badarg == "0":
1935 # It's a sequence, and its elements are also sequences (gotta
1936 # love strings <wink>), but they aren't of length 2, so this
1937 # one seemed better as a ValueError than a TypeError.
1938 pass
1939 else:
1940 self.fail("no TypeError from dict(%r)" % badarg)
1941 else:
1942 self.fail("no TypeError from dict(%r)" % badarg)
1943
1944 try:
1945 dict({}, {})
1946 except TypeError:
1947 pass
1948 else:
1949 self.fail("no TypeError from dict({}, {})")
1950
1951 class Mapping:
1952 # Lacks a .keys() method; will be added later.
1953 dict = {1:2, 3:4, 'a':1j}
1954
1955 try:
1956 dict(Mapping())
1957 except TypeError:
1958 pass
1959 else:
1960 self.fail("no TypeError from dict(incomplete mapping)")
1961
1962 Mapping.keys = lambda self: list(self.dict.keys())
1963 Mapping.__getitem__ = lambda self, i: self.dict[i]
1964 d = dict(Mapping())
1965 self.assertEqual(d, Mapping.dict)
1966
1967 # Init from sequence of iterable objects, each producing a 2-sequence.
1968 class AddressBookEntry:
1969 def __init__(self, first, last):
1970 self.first = first
1971 self.last = last
1972 def __iter__(self):
1973 return iter([self.first, self.last])
1974
1975 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1976 AddressBookEntry('Barry', 'Peters'),
1977 AddressBookEntry('Tim', 'Peters'),
1978 AddressBookEntry('Barry', 'Warsaw')])
1979 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1980
1981 d = dict(zip(range(4), range(1, 5)))
1982 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1983
1984 # Bad sequence lengths.
1985 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1986 try:
1987 dict(bad)
1988 except ValueError:
1989 pass
1990 else:
1991 self.fail("no ValueError from dict(%r)" % bad)
1992
1993 def test_dir(self):
1994 # Testing dir() ...
1995 junk = 12
1996 self.assertEqual(dir(), ['junk', 'self'])
1997 del junk
1998
1999 # Just make sure these don't blow up!
2000 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
2001 dir(arg)
2002
2003 # Test dir on new-style classes. Since these have object as a
2004 # base class, a lot more gets sucked in.
2005 def interesting(strings):
2006 return [s for s in strings if not s.startswith('_')]
2007
2008 class C(object):
2009 Cdata = 1
2010 def Cmethod(self): pass
2011
2012 cstuff = ['Cdata', 'Cmethod']
2013 self.assertEqual(interesting(dir(C)), cstuff)
2014
2015 c = C()
2016 self.assertEqual(interesting(dir(c)), cstuff)
2017 ## self.assert_('__self__' in dir(C.Cmethod))
2018
2019 c.cdata = 2
2020 c.cmethod = lambda self: 0
2021 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
2022 ## self.assert_('__self__' in dir(c.Cmethod))
2023
2024 class A(C):
2025 Adata = 1
2026 def Amethod(self): pass
2027
2028 astuff = ['Adata', 'Amethod'] + cstuff
2029 self.assertEqual(interesting(dir(A)), astuff)
2030 ## self.assert_('__self__' in dir(A.Amethod))
2031 a = A()
2032 self.assertEqual(interesting(dir(a)), astuff)
2033 a.adata = 42
2034 a.amethod = lambda self: 3
2035 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
2036 ## self.assert_('__self__' in dir(a.Amethod))
2037
2038 # Try a module subclass.
2039 import sys
2040 class M(type(sys)):
2041 pass
2042 minstance = M("m")
2043 minstance.b = 2
2044 minstance.a = 1
2045 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2046 self.assertEqual(names, ['a', 'b'])
2047
2048 class M2(M):
2049 def getdict(self):
2050 return "Not a dict!"
2051 __dict__ = property(getdict)
2052
2053 m2instance = M2("m2")
2054 m2instance.b = 2
2055 m2instance.a = 1
2056 self.assertEqual(m2instance.__dict__, "Not a dict!")
2057 try:
2058 dir(m2instance)
2059 except TypeError:
2060 pass
2061
2062 # Two essentially featureless objects, just inheriting stuff from
2063 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002064 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2065 if support.check_impl_detail():
2066 # None differs in PyPy: it has a __nonzero__
2067 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002068
2069 # Nasty test case for proxied objects
2070 class Wrapper(object):
2071 def __init__(self, obj):
2072 self.__obj = obj
2073 def __repr__(self):
2074 return "Wrapper(%s)" % repr(self.__obj)
2075 def __getitem__(self, key):
2076 return Wrapper(self.__obj[key])
2077 def __len__(self):
2078 return len(self.__obj)
2079 def __getattr__(self, name):
2080 return Wrapper(getattr(self.__obj, name))
2081
2082 class C(object):
2083 def __getclass(self):
2084 return Wrapper(type(self))
2085 __class__ = property(__getclass)
2086
2087 dir(C()) # This used to segfault
2088
2089 def test_supers(self):
2090 # Testing super...
2091
2092 class A(object):
2093 def meth(self, a):
2094 return "A(%r)" % a
2095
2096 self.assertEqual(A().meth(1), "A(1)")
2097
2098 class B(A):
2099 def __init__(self):
2100 self.__super = super(B, self)
2101 def meth(self, a):
2102 return "B(%r)" % a + self.__super.meth(a)
2103
2104 self.assertEqual(B().meth(2), "B(2)A(2)")
2105
2106 class C(A):
2107 def meth(self, a):
2108 return "C(%r)" % a + self.__super.meth(a)
2109 C._C__super = super(C)
2110
2111 self.assertEqual(C().meth(3), "C(3)A(3)")
2112
2113 class D(C, B):
2114 def meth(self, a):
2115 return "D(%r)" % a + super(D, self).meth(a)
2116
2117 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2118
2119 # Test for subclassing super
2120
2121 class mysuper(super):
2122 def __init__(self, *args):
2123 return super(mysuper, self).__init__(*args)
2124
2125 class E(D):
2126 def meth(self, a):
2127 return "E(%r)" % a + mysuper(E, self).meth(a)
2128
2129 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2130
2131 class F(E):
2132 def meth(self, a):
2133 s = self.__super # == mysuper(F, self)
2134 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2135 F._F__super = mysuper(F)
2136
2137 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2138
2139 # Make sure certain errors are raised
2140
2141 try:
2142 super(D, 42)
2143 except TypeError:
2144 pass
2145 else:
2146 self.fail("shouldn't allow super(D, 42)")
2147
2148 try:
2149 super(D, C())
2150 except TypeError:
2151 pass
2152 else:
2153 self.fail("shouldn't allow super(D, C())")
2154
2155 try:
2156 super(D).__get__(12)
2157 except TypeError:
2158 pass
2159 else:
2160 self.fail("shouldn't allow super(D).__get__(12)")
2161
2162 try:
2163 super(D).__get__(C())
2164 except TypeError:
2165 pass
2166 else:
2167 self.fail("shouldn't allow super(D).__get__(C())")
2168
2169 # Make sure data descriptors can be overridden and accessed via super
2170 # (new feature in Python 2.3)
2171
2172 class DDbase(object):
2173 def getx(self): return 42
2174 x = property(getx)
2175
2176 class DDsub(DDbase):
2177 def getx(self): return "hello"
2178 x = property(getx)
2179
2180 dd = DDsub()
2181 self.assertEqual(dd.x, "hello")
2182 self.assertEqual(super(DDsub, dd).x, 42)
2183
2184 # Ensure that super() lookup of descriptor from classmethod
2185 # works (SF ID# 743627)
2186
2187 class Base(object):
2188 aProp = property(lambda self: "foo")
2189
2190 class Sub(Base):
2191 @classmethod
2192 def test(klass):
2193 return super(Sub,klass).aProp
2194
2195 self.assertEqual(Sub.test(), Base.aProp)
2196
2197 # Verify that super() doesn't allow keyword args
2198 try:
2199 super(Base, kw=1)
2200 except TypeError:
2201 pass
2202 else:
2203 self.assertEqual("super shouldn't accept keyword args")
2204
2205 def test_basic_inheritance(self):
2206 # Testing inheritance from basic types...
2207
2208 class hexint(int):
2209 def __repr__(self):
2210 return hex(self)
2211 def __add__(self, other):
2212 return hexint(int.__add__(self, other))
2213 # (Note that overriding __radd__ doesn't work,
2214 # because the int type gets first dibs.)
2215 self.assertEqual(repr(hexint(7) + 9), "0x10")
2216 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2217 a = hexint(12345)
2218 self.assertEqual(a, 12345)
2219 self.assertEqual(int(a), 12345)
2220 self.assert_(int(a).__class__ is int)
2221 self.assertEqual(hash(a), hash(12345))
2222 self.assert_((+a).__class__ is int)
2223 self.assert_((a >> 0).__class__ is int)
2224 self.assert_((a << 0).__class__ is int)
2225 self.assert_((hexint(0) << 12).__class__ is int)
2226 self.assert_((hexint(0) >> 12).__class__ is int)
2227
2228 class octlong(int):
2229 __slots__ = []
2230 def __str__(self):
2231 s = oct(self)
2232 if s[-1] == 'L':
2233 s = s[:-1]
2234 return s
2235 def __add__(self, other):
2236 return self.__class__(super(octlong, self).__add__(other))
2237 __radd__ = __add__
2238 self.assertEqual(str(octlong(3) + 5), "0o10")
2239 # (Note that overriding __radd__ here only seems to work
2240 # because the example uses a short int left argument.)
2241 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2242 a = octlong(12345)
2243 self.assertEqual(a, 12345)
2244 self.assertEqual(int(a), 12345)
2245 self.assertEqual(hash(a), hash(12345))
2246 self.assert_(int(a).__class__ is int)
2247 self.assert_((+a).__class__ is int)
2248 self.assert_((-a).__class__ is int)
2249 self.assert_((-octlong(0)).__class__ is int)
2250 self.assert_((a >> 0).__class__ is int)
2251 self.assert_((a << 0).__class__ is int)
2252 self.assert_((a - 0).__class__ is int)
2253 self.assert_((a * 1).__class__ is int)
2254 self.assert_((a ** 1).__class__ is int)
2255 self.assert_((a // 1).__class__ is int)
2256 self.assert_((1 * a).__class__ is int)
2257 self.assert_((a | 0).__class__ is int)
2258 self.assert_((a ^ 0).__class__ is int)
2259 self.assert_((a & -1).__class__ is int)
2260 self.assert_((octlong(0) << 12).__class__ is int)
2261 self.assert_((octlong(0) >> 12).__class__ is int)
2262 self.assert_(abs(octlong(0)).__class__ is int)
2263
2264 # Because octlong overrides __add__, we can't check the absence of +0
2265 # optimizations using octlong.
2266 class longclone(int):
2267 pass
2268 a = longclone(1)
2269 self.assert_((a + 0).__class__ is int)
2270 self.assert_((0 + a).__class__ is int)
2271
2272 # Check that negative clones don't segfault
2273 a = longclone(-1)
2274 self.assertEqual(a.__dict__, {})
2275 self.assertEqual(int(a), -1) # self.assert_ PyNumber_Long() copies the sign bit
2276
2277 class precfloat(float):
2278 __slots__ = ['prec']
2279 def __init__(self, value=0.0, prec=12):
2280 self.prec = int(prec)
2281 def __repr__(self):
2282 return "%.*g" % (self.prec, self)
2283 self.assertEqual(repr(precfloat(1.1)), "1.1")
2284 a = precfloat(12345)
2285 self.assertEqual(a, 12345.0)
2286 self.assertEqual(float(a), 12345.0)
2287 self.assert_(float(a).__class__ is float)
2288 self.assertEqual(hash(a), hash(12345.0))
2289 self.assert_((+a).__class__ is float)
2290
2291 class madcomplex(complex):
2292 def __repr__(self):
2293 return "%.17gj%+.17g" % (self.imag, self.real)
2294 a = madcomplex(-3, 4)
2295 self.assertEqual(repr(a), "4j-3")
2296 base = complex(-3, 4)
2297 self.assertEqual(base.__class__, complex)
2298 self.assertEqual(a, base)
2299 self.assertEqual(complex(a), base)
2300 self.assertEqual(complex(a).__class__, complex)
2301 a = madcomplex(a) # just trying another form of the constructor
2302 self.assertEqual(repr(a), "4j-3")
2303 self.assertEqual(a, base)
2304 self.assertEqual(complex(a), base)
2305 self.assertEqual(complex(a).__class__, complex)
2306 self.assertEqual(hash(a), hash(base))
2307 self.assertEqual((+a).__class__, complex)
2308 self.assertEqual((a + 0).__class__, complex)
2309 self.assertEqual(a + 0, base)
2310 self.assertEqual((a - 0).__class__, complex)
2311 self.assertEqual(a - 0, base)
2312 self.assertEqual((a * 1).__class__, complex)
2313 self.assertEqual(a * 1, base)
2314 self.assertEqual((a / 1).__class__, complex)
2315 self.assertEqual(a / 1, base)
2316
2317 class madtuple(tuple):
2318 _rev = None
2319 def rev(self):
2320 if self._rev is not None:
2321 return self._rev
2322 L = list(self)
2323 L.reverse()
2324 self._rev = self.__class__(L)
2325 return self._rev
2326 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2327 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2328 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2329 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2330 for i in range(512):
2331 t = madtuple(range(i))
2332 u = t.rev()
2333 v = u.rev()
2334 self.assertEqual(v, t)
2335 a = madtuple((1,2,3,4,5))
2336 self.assertEqual(tuple(a), (1,2,3,4,5))
2337 self.assert_(tuple(a).__class__ is tuple)
2338 self.assertEqual(hash(a), hash((1,2,3,4,5)))
2339 self.assert_(a[:].__class__ is tuple)
2340 self.assert_((a * 1).__class__ is tuple)
2341 self.assert_((a * 0).__class__ is tuple)
2342 self.assert_((a + ()).__class__ is tuple)
2343 a = madtuple(())
2344 self.assertEqual(tuple(a), ())
2345 self.assert_(tuple(a).__class__ is tuple)
2346 self.assert_((a + a).__class__ is tuple)
2347 self.assert_((a * 0).__class__ is tuple)
2348 self.assert_((a * 1).__class__ is tuple)
2349 self.assert_((a * 2).__class__ is tuple)
2350 self.assert_(a[:].__class__ is tuple)
2351
2352 class madstring(str):
2353 _rev = None
2354 def rev(self):
2355 if self._rev is not None:
2356 return self._rev
2357 L = list(self)
2358 L.reverse()
2359 self._rev = self.__class__("".join(L))
2360 return self._rev
2361 s = madstring("abcdefghijklmnopqrstuvwxyz")
2362 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2363 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2364 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2365 for i in range(256):
2366 s = madstring("".join(map(chr, range(i))))
2367 t = s.rev()
2368 u = t.rev()
2369 self.assertEqual(u, s)
2370 s = madstring("12345")
2371 self.assertEqual(str(s), "12345")
2372 self.assert_(str(s).__class__ is str)
2373
2374 base = "\x00" * 5
2375 s = madstring(base)
2376 self.assertEqual(s, base)
2377 self.assertEqual(str(s), base)
2378 self.assert_(str(s).__class__ is str)
2379 self.assertEqual(hash(s), hash(base))
2380 self.assertEqual({s: 1}[base], 1)
2381 self.assertEqual({base: 1}[s], 1)
2382 self.assert_((s + "").__class__ is str)
2383 self.assertEqual(s + "", base)
2384 self.assert_(("" + s).__class__ is str)
2385 self.assertEqual("" + s, base)
2386 self.assert_((s * 0).__class__ is str)
2387 self.assertEqual(s * 0, "")
2388 self.assert_((s * 1).__class__ is str)
2389 self.assertEqual(s * 1, base)
2390 self.assert_((s * 2).__class__ is str)
2391 self.assertEqual(s * 2, base + base)
2392 self.assert_(s[:].__class__ is str)
2393 self.assertEqual(s[:], base)
2394 self.assert_(s[0:0].__class__ is str)
2395 self.assertEqual(s[0:0], "")
2396 self.assert_(s.strip().__class__ is str)
2397 self.assertEqual(s.strip(), base)
2398 self.assert_(s.lstrip().__class__ is str)
2399 self.assertEqual(s.lstrip(), base)
2400 self.assert_(s.rstrip().__class__ is str)
2401 self.assertEqual(s.rstrip(), base)
2402 identitytab = {}
2403 self.assert_(s.translate(identitytab).__class__ is str)
2404 self.assertEqual(s.translate(identitytab), base)
2405 self.assert_(s.replace("x", "x").__class__ is str)
2406 self.assertEqual(s.replace("x", "x"), base)
2407 self.assert_(s.ljust(len(s)).__class__ is str)
2408 self.assertEqual(s.ljust(len(s)), base)
2409 self.assert_(s.rjust(len(s)).__class__ is str)
2410 self.assertEqual(s.rjust(len(s)), base)
2411 self.assert_(s.center(len(s)).__class__ is str)
2412 self.assertEqual(s.center(len(s)), base)
2413 self.assert_(s.lower().__class__ is str)
2414 self.assertEqual(s.lower(), base)
2415
2416 class madunicode(str):
2417 _rev = None
2418 def rev(self):
2419 if self._rev is not None:
2420 return self._rev
2421 L = list(self)
2422 L.reverse()
2423 self._rev = self.__class__("".join(L))
2424 return self._rev
2425 u = madunicode("ABCDEF")
2426 self.assertEqual(u, "ABCDEF")
2427 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2428 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2429 base = "12345"
2430 u = madunicode(base)
2431 self.assertEqual(str(u), base)
2432 self.assert_(str(u).__class__ is str)
2433 self.assertEqual(hash(u), hash(base))
2434 self.assertEqual({u: 1}[base], 1)
2435 self.assertEqual({base: 1}[u], 1)
2436 self.assert_(u.strip().__class__ is str)
2437 self.assertEqual(u.strip(), base)
2438 self.assert_(u.lstrip().__class__ is str)
2439 self.assertEqual(u.lstrip(), base)
2440 self.assert_(u.rstrip().__class__ is str)
2441 self.assertEqual(u.rstrip(), base)
2442 self.assert_(u.replace("x", "x").__class__ is str)
2443 self.assertEqual(u.replace("x", "x"), base)
2444 self.assert_(u.replace("xy", "xy").__class__ is str)
2445 self.assertEqual(u.replace("xy", "xy"), base)
2446 self.assert_(u.center(len(u)).__class__ is str)
2447 self.assertEqual(u.center(len(u)), base)
2448 self.assert_(u.ljust(len(u)).__class__ is str)
2449 self.assertEqual(u.ljust(len(u)), base)
2450 self.assert_(u.rjust(len(u)).__class__ is str)
2451 self.assertEqual(u.rjust(len(u)), base)
2452 self.assert_(u.lower().__class__ is str)
2453 self.assertEqual(u.lower(), base)
2454 self.assert_(u.upper().__class__ is str)
2455 self.assertEqual(u.upper(), base)
2456 self.assert_(u.capitalize().__class__ is str)
2457 self.assertEqual(u.capitalize(), base)
2458 self.assert_(u.title().__class__ is str)
2459 self.assertEqual(u.title(), base)
2460 self.assert_((u + "").__class__ is str)
2461 self.assertEqual(u + "", base)
2462 self.assert_(("" + u).__class__ is str)
2463 self.assertEqual("" + u, base)
2464 self.assert_((u * 0).__class__ is str)
2465 self.assertEqual(u * 0, "")
2466 self.assert_((u * 1).__class__ is str)
2467 self.assertEqual(u * 1, base)
2468 self.assert_((u * 2).__class__ is str)
2469 self.assertEqual(u * 2, base + base)
2470 self.assert_(u[:].__class__ is str)
2471 self.assertEqual(u[:], base)
2472 self.assert_(u[0:0].__class__ is str)
2473 self.assertEqual(u[0:0], "")
2474
2475 class sublist(list):
2476 pass
2477 a = sublist(range(5))
2478 self.assertEqual(a, list(range(5)))
2479 a.append("hello")
2480 self.assertEqual(a, list(range(5)) + ["hello"])
2481 a[5] = 5
2482 self.assertEqual(a, list(range(6)))
2483 a.extend(range(6, 20))
2484 self.assertEqual(a, list(range(20)))
2485 a[-5:] = []
2486 self.assertEqual(a, list(range(15)))
2487 del a[10:15]
2488 self.assertEqual(len(a), 10)
2489 self.assertEqual(a, list(range(10)))
2490 self.assertEqual(list(a), list(range(10)))
2491 self.assertEqual(a[0], 0)
2492 self.assertEqual(a[9], 9)
2493 self.assertEqual(a[-10], 0)
2494 self.assertEqual(a[-1], 9)
2495 self.assertEqual(a[:5], list(range(5)))
2496
2497 ## class CountedInput(file):
2498 ## """Counts lines read by self.readline().
2499 ##
2500 ## self.lineno is the 0-based ordinal of the last line read, up to
2501 ## a maximum of one greater than the number of lines in the file.
2502 ##
2503 ## self.ateof is true if and only if the final "" line has been read,
2504 ## at which point self.lineno stops incrementing, and further calls
2505 ## to readline() continue to return "".
2506 ## """
2507 ##
2508 ## lineno = 0
2509 ## ateof = 0
2510 ## def readline(self):
2511 ## if self.ateof:
2512 ## return ""
2513 ## s = file.readline(self)
2514 ## # Next line works too.
2515 ## # s = super(CountedInput, self).readline()
2516 ## self.lineno += 1
2517 ## if s == "":
2518 ## self.ateof = 1
2519 ## return s
2520 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002521 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002522 ## lines = ['a\n', 'b\n', 'c\n']
2523 ## try:
2524 ## f.writelines(lines)
2525 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002526 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002527 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2528 ## got = f.readline()
2529 ## self.assertEqual(expected, got)
2530 ## self.assertEqual(f.lineno, i)
2531 ## self.assertEqual(f.ateof, (i > len(lines)))
2532 ## f.close()
2533 ## finally:
2534 ## try:
2535 ## f.close()
2536 ## except:
2537 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002538 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002539
2540 def test_keywords(self):
2541 # Testing keyword args to basic type constructors ...
2542 self.assertEqual(int(x=1), 1)
2543 self.assertEqual(float(x=2), 2.0)
2544 self.assertEqual(int(x=3), 3)
2545 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2546 self.assertEqual(str(object=500), '500')
2547 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2548 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2549 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2550 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2551
2552 for constructor in (int, float, int, complex, str, str,
2553 tuple, list):
2554 try:
2555 constructor(bogus_keyword_arg=1)
2556 except TypeError:
2557 pass
2558 else:
2559 self.fail("expected TypeError from bogus keyword argument to %r"
2560 % constructor)
2561
2562 def test_str_subclass_as_dict_key(self):
2563 # Testing a str subclass used as dict key ..
2564
2565 class cistr(str):
2566 """Sublcass of str that computes __eq__ case-insensitively.
2567
2568 Also computes a hash code of the string in canonical form.
2569 """
2570
2571 def __init__(self, value):
2572 self.canonical = value.lower()
2573 self.hashcode = hash(self.canonical)
2574
2575 def __eq__(self, other):
2576 if not isinstance(other, cistr):
2577 other = cistr(other)
2578 return self.canonical == other.canonical
2579
2580 def __hash__(self):
2581 return self.hashcode
2582
2583 self.assertEqual(cistr('ABC'), 'abc')
2584 self.assertEqual('aBc', cistr('ABC'))
2585 self.assertEqual(str(cistr('ABC')), 'ABC')
2586
2587 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2588 self.assertEqual(d[cistr('one')], 1)
2589 self.assertEqual(d[cistr('tWo')], 2)
2590 self.assertEqual(d[cistr('THrEE')], 3)
2591 self.assert_(cistr('ONe') in d)
2592 self.assertEqual(d.get(cistr('thrEE')), 3)
2593
2594 def test_classic_comparisons(self):
2595 # Testing classic comparisons...
2596 class classic:
2597 pass
2598
2599 for base in (classic, int, object):
2600 class C(base):
2601 def __init__(self, value):
2602 self.value = int(value)
2603 def __eq__(self, other):
2604 if isinstance(other, C):
2605 return self.value == other.value
2606 if isinstance(other, int) or isinstance(other, int):
2607 return self.value == other
2608 return NotImplemented
2609 def __ne__(self, other):
2610 if isinstance(other, C):
2611 return self.value != other.value
2612 if isinstance(other, int) or isinstance(other, int):
2613 return self.value != other
2614 return NotImplemented
2615 def __lt__(self, other):
2616 if isinstance(other, C):
2617 return self.value < other.value
2618 if isinstance(other, int) or isinstance(other, int):
2619 return self.value < other
2620 return NotImplemented
2621 def __le__(self, other):
2622 if isinstance(other, C):
2623 return self.value <= other.value
2624 if isinstance(other, int) or isinstance(other, int):
2625 return self.value <= other
2626 return NotImplemented
2627 def __gt__(self, other):
2628 if isinstance(other, C):
2629 return self.value > other.value
2630 if isinstance(other, int) or isinstance(other, int):
2631 return self.value > other
2632 return NotImplemented
2633 def __ge__(self, other):
2634 if isinstance(other, C):
2635 return self.value >= other.value
2636 if isinstance(other, int) or isinstance(other, int):
2637 return self.value >= other
2638 return NotImplemented
2639
2640 c1 = C(1)
2641 c2 = C(2)
2642 c3 = C(3)
2643 self.assertEqual(c1, 1)
2644 c = {1: c1, 2: c2, 3: c3}
2645 for x in 1, 2, 3:
2646 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002647 for op in "<", "<=", "==", "!=", ">", ">=":
Mark Dickinsona56c4672009-01-27 18:17:45 +00002648 self.assert_(eval("c[x] %s c[y]" % op) ==
2649 eval("x %s y" % op),
2650 "x=%d, y=%d" % (x, y))
2651 self.assert_(eval("c[x] %s y" % op) ==
2652 eval("x %s y" % op),
2653 "x=%d, y=%d" % (x, y))
2654 self.assert_(eval("x %s c[y]" % op) ==
2655 eval("x %s y" % op),
2656 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002657
2658 def test_rich_comparisons(self):
2659 # Testing rich comparisons...
2660 class Z(complex):
2661 pass
2662 z = Z(1)
2663 self.assertEqual(z, 1+0j)
2664 self.assertEqual(1+0j, z)
2665 class ZZ(complex):
2666 def __eq__(self, other):
2667 try:
2668 return abs(self - other) <= 1e-6
2669 except:
2670 return NotImplemented
2671 zz = ZZ(1.0000003)
2672 self.assertEqual(zz, 1+0j)
2673 self.assertEqual(1+0j, zz)
2674
2675 class classic:
2676 pass
2677 for base in (classic, int, object, list):
2678 class C(base):
2679 def __init__(self, value):
2680 self.value = int(value)
2681 def __cmp__(self_, other):
2682 self.fail("shouldn't call __cmp__")
2683 def __eq__(self, other):
2684 if isinstance(other, C):
2685 return self.value == other.value
2686 if isinstance(other, int) or isinstance(other, int):
2687 return self.value == other
2688 return NotImplemented
2689 def __ne__(self, other):
2690 if isinstance(other, C):
2691 return self.value != other.value
2692 if isinstance(other, int) or isinstance(other, int):
2693 return self.value != other
2694 return NotImplemented
2695 def __lt__(self, other):
2696 if isinstance(other, C):
2697 return self.value < other.value
2698 if isinstance(other, int) or isinstance(other, int):
2699 return self.value < other
2700 return NotImplemented
2701 def __le__(self, other):
2702 if isinstance(other, C):
2703 return self.value <= other.value
2704 if isinstance(other, int) or isinstance(other, int):
2705 return self.value <= other
2706 return NotImplemented
2707 def __gt__(self, other):
2708 if isinstance(other, C):
2709 return self.value > other.value
2710 if isinstance(other, int) or isinstance(other, int):
2711 return self.value > other
2712 return NotImplemented
2713 def __ge__(self, other):
2714 if isinstance(other, C):
2715 return self.value >= other.value
2716 if isinstance(other, int) or isinstance(other, int):
2717 return self.value >= other
2718 return NotImplemented
2719 c1 = C(1)
2720 c2 = C(2)
2721 c3 = C(3)
2722 self.assertEqual(c1, 1)
2723 c = {1: c1, 2: c2, 3: c3}
2724 for x in 1, 2, 3:
2725 for y in 1, 2, 3:
2726 for op in "<", "<=", "==", "!=", ">", ">=":
2727 self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2728 "x=%d, y=%d" % (x, y))
2729 self.assert_(eval("c[x] %s y" % op) == eval("x %s y" % op),
2730 "x=%d, y=%d" % (x, y))
2731 self.assert_(eval("x %s c[y]" % op) == eval("x %s y" % op),
2732 "x=%d, y=%d" % (x, y))
2733
2734 def test_descrdoc(self):
2735 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002736 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002737 def check(descr, what):
2738 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002739 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002740 check(complex.real, "the real part of a complex number") # member descriptor
2741
2742 def test_doc_descriptor(self):
2743 # Testing __doc__ descriptor...
2744 # SF bug 542984
2745 class DocDescr(object):
2746 def __get__(self, object, otype):
2747 if object:
2748 object = object.__class__.__name__ + ' instance'
2749 if otype:
2750 otype = otype.__name__
2751 return 'object=%s; type=%s' % (object, otype)
2752 class OldClass:
2753 __doc__ = DocDescr()
2754 class NewClass(object):
2755 __doc__ = DocDescr()
2756 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2757 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2758 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2759 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2760
2761 def test_set_class(self):
2762 # Testing __class__ assignment...
2763 class C(object): pass
2764 class D(object): pass
2765 class E(object): pass
2766 class F(D, E): pass
2767 for cls in C, D, E, F:
2768 for cls2 in C, D, E, F:
2769 x = cls()
2770 x.__class__ = cls2
2771 self.assert_(x.__class__ is cls2)
2772 x.__class__ = cls
2773 self.assert_(x.__class__ is cls)
2774 def cant(x, C):
2775 try:
2776 x.__class__ = C
2777 except TypeError:
2778 pass
2779 else:
2780 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2781 try:
2782 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002783 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002784 pass
2785 else:
2786 self.fail("shouldn't allow del %r.__class__" % x)
2787 cant(C(), list)
2788 cant(list(), C)
2789 cant(C(), 1)
2790 cant(C(), object)
2791 cant(object(), list)
2792 cant(list(), object)
2793 class Int(int): __slots__ = []
2794 cant(2, Int)
2795 cant(Int(), int)
2796 cant(True, int)
2797 cant(2, bool)
2798 o = object()
2799 cant(o, type(1))
2800 cant(o, type(None))
2801 del o
2802 class G(object):
2803 __slots__ = ["a", "b"]
2804 class H(object):
2805 __slots__ = ["b", "a"]
2806 class I(object):
2807 __slots__ = ["a", "b"]
2808 class J(object):
2809 __slots__ = ["c", "b"]
2810 class K(object):
2811 __slots__ = ["a", "b", "d"]
2812 class L(H):
2813 __slots__ = ["e"]
2814 class M(I):
2815 __slots__ = ["e"]
2816 class N(J):
2817 __slots__ = ["__weakref__"]
2818 class P(J):
2819 __slots__ = ["__dict__"]
2820 class Q(J):
2821 pass
2822 class R(J):
2823 __slots__ = ["__dict__", "__weakref__"]
2824
2825 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2826 x = cls()
2827 x.a = 1
2828 x.__class__ = cls2
2829 self.assert_(x.__class__ is cls2,
2830 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2831 self.assertEqual(x.a, 1)
2832 x.__class__ = cls
2833 self.assert_(x.__class__ is cls,
2834 "assigning %r as __class__ for %r silently failed" % (cls, x))
2835 self.assertEqual(x.a, 1)
2836 for cls in G, J, K, L, M, N, P, R, list, Int:
2837 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2838 if cls is cls2:
2839 continue
2840 cant(cls(), cls2)
2841
Benjamin Peterson193152c2009-04-25 01:08:45 +00002842 # Issue5283: when __class__ changes in __del__, the wrong
2843 # type gets DECREF'd.
2844 class O(object):
2845 pass
2846 class A(object):
2847 def __del__(self):
2848 self.__class__ = O
2849 l = [A() for x in range(100)]
2850 del l
2851
Georg Brandl479a7e72008-02-05 18:13:15 +00002852 def test_set_dict(self):
2853 # Testing __dict__ assignment...
2854 class C(object): pass
2855 a = C()
2856 a.__dict__ = {'b': 1}
2857 self.assertEqual(a.b, 1)
2858 def cant(x, dict):
2859 try:
2860 x.__dict__ = dict
2861 except (AttributeError, TypeError):
2862 pass
2863 else:
2864 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2865 cant(a, None)
2866 cant(a, [])
2867 cant(a, 1)
2868 del a.__dict__ # Deleting __dict__ is allowed
2869
2870 class Base(object):
2871 pass
2872 def verify_dict_readonly(x):
2873 """
2874 x has to be an instance of a class inheriting from Base.
2875 """
2876 cant(x, {})
2877 try:
2878 del x.__dict__
2879 except (AttributeError, TypeError):
2880 pass
2881 else:
2882 self.fail("shouldn't allow del %r.__dict__" % x)
2883 dict_descr = Base.__dict__["__dict__"]
2884 try:
2885 dict_descr.__set__(x, {})
2886 except (AttributeError, TypeError):
2887 pass
2888 else:
2889 self.fail("dict_descr allowed access to %r's dict" % x)
2890
2891 # Classes don't allow __dict__ assignment and have readonly dicts
2892 class Meta1(type, Base):
2893 pass
2894 class Meta2(Base, type):
2895 pass
2896 class D(object, metaclass=Meta1):
2897 pass
2898 class E(object, metaclass=Meta2):
2899 pass
2900 for cls in C, D, E:
2901 verify_dict_readonly(cls)
2902 class_dict = cls.__dict__
2903 try:
2904 class_dict["spam"] = "eggs"
2905 except TypeError:
2906 pass
2907 else:
2908 self.fail("%r's __dict__ can be modified" % cls)
2909
2910 # Modules also disallow __dict__ assignment
2911 class Module1(types.ModuleType, Base):
2912 pass
2913 class Module2(Base, types.ModuleType):
2914 pass
2915 for ModuleType in Module1, Module2:
2916 mod = ModuleType("spam")
2917 verify_dict_readonly(mod)
2918 mod.__dict__["spam"] = "eggs"
2919
2920 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002921 # (at least not any more than regular exception's __dict__ can
2922 # be deleted; on CPython it is not the case, whereas on PyPy they
2923 # can, just like any other new-style instance's __dict__.)
2924 def can_delete_dict(e):
2925 try:
2926 del e.__dict__
2927 except (TypeError, AttributeError):
2928 return False
2929 else:
2930 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002931 class Exception1(Exception, Base):
2932 pass
2933 class Exception2(Base, Exception):
2934 pass
2935 for ExceptionType in Exception, Exception1, Exception2:
2936 e = ExceptionType()
2937 e.__dict__ = {"a": 1}
2938 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002939 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002940
2941 def test_pickles(self):
2942 # Testing pickling and copying new-style classes and objects...
2943 import pickle
2944
2945 def sorteditems(d):
2946 L = list(d.items())
2947 L.sort()
2948 return L
2949
2950 global C
2951 class C(object):
2952 def __init__(self, a, b):
2953 super(C, self).__init__()
2954 self.a = a
2955 self.b = b
2956 def __repr__(self):
2957 return "C(%r, %r)" % (self.a, self.b)
2958
2959 global C1
2960 class C1(list):
2961 def __new__(cls, a, b):
2962 return super(C1, cls).__new__(cls)
2963 def __getnewargs__(self):
2964 return (self.a, self.b)
2965 def __init__(self, a, b):
2966 self.a = a
2967 self.b = b
2968 def __repr__(self):
2969 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2970
2971 global C2
2972 class C2(int):
2973 def __new__(cls, a, b, val=0):
2974 return super(C2, cls).__new__(cls, val)
2975 def __getnewargs__(self):
2976 return (self.a, self.b, int(self))
2977 def __init__(self, a, b, val=0):
2978 self.a = a
2979 self.b = b
2980 def __repr__(self):
2981 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2982
2983 global C3
2984 class C3(object):
2985 def __init__(self, foo):
2986 self.foo = foo
2987 def __getstate__(self):
2988 return self.foo
2989 def __setstate__(self, foo):
2990 self.foo = foo
2991
2992 global C4classic, C4
2993 class C4classic: # classic
2994 pass
2995 class C4(C4classic, object): # mixed inheritance
2996 pass
2997
Guido van Rossum3926a632001-09-25 16:25:58 +00002998 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00002999 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00003000 s = pickle.dumps(cls, bin)
3001 cls2 = pickle.loads(s)
3002 self.assert_(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00003003
3004 a = C1(1, 2); a.append(42); a.append(24)
3005 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003006 s = pickle.dumps((a, b), bin)
3007 x, y = pickle.loads(s)
3008 self.assertEqual(x.__class__, a.__class__)
3009 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3010 self.assertEqual(y.__class__, b.__class__)
3011 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3012 self.assertEqual(repr(x), repr(a))
3013 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003014 # Test for __getstate__ and __setstate__ on new style class
3015 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003016 s = pickle.dumps(u, bin)
3017 v = pickle.loads(s)
3018 self.assertEqual(u.__class__, v.__class__)
3019 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003020 # Test for picklability of hybrid class
3021 u = C4()
3022 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003023 s = pickle.dumps(u, bin)
3024 v = pickle.loads(s)
3025 self.assertEqual(u.__class__, v.__class__)
3026 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003027
Georg Brandl479a7e72008-02-05 18:13:15 +00003028 # Testing copy.deepcopy()
3029 import copy
3030 for cls in C, C1, C2:
3031 cls2 = copy.deepcopy(cls)
3032 self.assert_(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003033
Georg Brandl479a7e72008-02-05 18:13:15 +00003034 a = C1(1, 2); a.append(42); a.append(24)
3035 b = C2("hello", "world", 42)
3036 x, y = copy.deepcopy((a, b))
3037 self.assertEqual(x.__class__, a.__class__)
3038 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3039 self.assertEqual(y.__class__, b.__class__)
3040 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3041 self.assertEqual(repr(x), repr(a))
3042 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003043
Georg Brandl479a7e72008-02-05 18:13:15 +00003044 def test_pickle_slots(self):
3045 # Testing pickling of classes with __slots__ ...
3046 import pickle
3047 # Pickling of classes with __slots__ but without __getstate__ should fail
3048 # (if using protocol 0 or 1)
3049 global B, C, D, E
3050 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003051 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003052 for base in [object, B]:
3053 class C(base):
3054 __slots__ = ['a']
3055 class D(C):
3056 pass
3057 try:
3058 pickle.dumps(C(), 0)
3059 except TypeError:
3060 pass
3061 else:
3062 self.fail("should fail: pickle C instance - %s" % base)
3063 try:
3064 pickle.dumps(C(), 0)
3065 except TypeError:
3066 pass
3067 else:
3068 self.fail("should fail: pickle D instance - %s" % base)
3069 # Give C a nice generic __getstate__ and __setstate__
3070 class C(base):
3071 __slots__ = ['a']
3072 def __getstate__(self):
3073 try:
3074 d = self.__dict__.copy()
3075 except AttributeError:
3076 d = {}
3077 for cls in self.__class__.__mro__:
3078 for sn in cls.__dict__.get('__slots__', ()):
3079 try:
3080 d[sn] = getattr(self, sn)
3081 except AttributeError:
3082 pass
3083 return d
3084 def __setstate__(self, d):
3085 for k, v in list(d.items()):
3086 setattr(self, k, v)
3087 class D(C):
3088 pass
3089 # Now it should work
3090 x = C()
3091 y = pickle.loads(pickle.dumps(x))
3092 self.assertEqual(hasattr(y, 'a'), 0)
3093 x.a = 42
3094 y = pickle.loads(pickle.dumps(x))
3095 self.assertEqual(y.a, 42)
3096 x = D()
3097 x.a = 42
3098 x.b = 100
3099 y = pickle.loads(pickle.dumps(x))
3100 self.assertEqual(y.a + y.b, 142)
3101 # A subclass that adds a slot should also work
3102 class E(C):
3103 __slots__ = ['b']
3104 x = E()
3105 x.a = 42
3106 x.b = "foo"
3107 y = pickle.loads(pickle.dumps(x))
3108 self.assertEqual(y.a, x.a)
3109 self.assertEqual(y.b, x.b)
3110
3111 def test_binary_operator_override(self):
3112 # Testing overrides of binary operations...
3113 class I(int):
3114 def __repr__(self):
3115 return "I(%r)" % int(self)
3116 def __add__(self, other):
3117 return I(int(self) + int(other))
3118 __radd__ = __add__
3119 def __pow__(self, other, mod=None):
3120 if mod is None:
3121 return I(pow(int(self), int(other)))
3122 else:
3123 return I(pow(int(self), int(other), int(mod)))
3124 def __rpow__(self, other, mod=None):
3125 if mod is None:
3126 return I(pow(int(other), int(self), mod))
3127 else:
3128 return I(pow(int(other), int(self), int(mod)))
3129
3130 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3131 self.assertEqual(repr(I(1) + 2), "I(3)")
3132 self.assertEqual(repr(1 + I(2)), "I(3)")
3133 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3134 self.assertEqual(repr(2 ** I(3)), "I(8)")
3135 self.assertEqual(repr(I(2) ** 3), "I(8)")
3136 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3137 class S(str):
3138 def __eq__(self, other):
3139 return self.lower() == other.lower()
3140
3141 def test_subclass_propagation(self):
3142 # Testing propagation of slot functions to subclasses...
3143 class A(object):
3144 pass
3145 class B(A):
3146 pass
3147 class C(A):
3148 pass
3149 class D(B, C):
3150 pass
3151 d = D()
3152 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3153 A.__hash__ = lambda self: 42
3154 self.assertEqual(hash(d), 42)
3155 C.__hash__ = lambda self: 314
3156 self.assertEqual(hash(d), 314)
3157 B.__hash__ = lambda self: 144
3158 self.assertEqual(hash(d), 144)
3159 D.__hash__ = lambda self: 100
3160 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003161 D.__hash__ = None
3162 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003163 del D.__hash__
3164 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003165 B.__hash__ = None
3166 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003167 del B.__hash__
3168 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003169 C.__hash__ = None
3170 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003171 del C.__hash__
3172 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003173 A.__hash__ = None
3174 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003175 del A.__hash__
3176 self.assertEqual(hash(d), orig_hash)
3177 d.foo = 42
3178 d.bar = 42
3179 self.assertEqual(d.foo, 42)
3180 self.assertEqual(d.bar, 42)
3181 def __getattribute__(self, name):
3182 if name == "foo":
3183 return 24
3184 return object.__getattribute__(self, name)
3185 A.__getattribute__ = __getattribute__
3186 self.assertEqual(d.foo, 24)
3187 self.assertEqual(d.bar, 42)
3188 def __getattr__(self, name):
3189 if name in ("spam", "foo", "bar"):
3190 return "hello"
3191 raise AttributeError(name)
3192 B.__getattr__ = __getattr__
3193 self.assertEqual(d.spam, "hello")
3194 self.assertEqual(d.foo, 24)
3195 self.assertEqual(d.bar, 42)
3196 del A.__getattribute__
3197 self.assertEqual(d.foo, 42)
3198 del d.foo
3199 self.assertEqual(d.foo, "hello")
3200 self.assertEqual(d.bar, 42)
3201 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003202 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003203 d.foo
3204 except AttributeError:
3205 pass
3206 else:
3207 self.fail("d.foo should be undefined now")
3208
3209 # Test a nasty bug in recurse_down_subclasses()
3210 import gc
3211 class A(object):
3212 pass
3213 class B(A):
3214 pass
3215 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003216 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003217 A.__setitem__ = lambda *a: None # crash
3218
3219 def test_buffer_inheritance(self):
3220 # Testing that buffer interface is inherited ...
3221
3222 import binascii
3223 # SF bug [#470040] ParseTuple t# vs subclasses.
3224
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003225 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003226 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003227 base = b'abc'
3228 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003229 # b2a_hex uses the buffer interface to get its argument's value, via
3230 # PyArg_ParseTuple 't#' code.
3231 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3232
Georg Brandl479a7e72008-02-05 18:13:15 +00003233 class MyInt(int):
3234 pass
3235 m = MyInt(42)
3236 try:
3237 binascii.b2a_hex(m)
3238 self.fail('subclass of int should not have a buffer interface')
3239 except TypeError:
3240 pass
3241
3242 def test_str_of_str_subclass(self):
3243 # Testing __str__ defined in subclass of str ...
3244 import binascii
3245 import io
3246
3247 class octetstring(str):
3248 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003249 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003250 def __repr__(self):
3251 return self + " repr"
3252
3253 o = octetstring('A')
3254 self.assertEqual(type(o), octetstring)
3255 self.assertEqual(type(str(o)), str)
3256 self.assertEqual(type(repr(o)), str)
3257 self.assertEqual(ord(o), 0x41)
3258 self.assertEqual(str(o), '41')
3259 self.assertEqual(repr(o), 'A repr')
3260 self.assertEqual(o.__str__(), '41')
3261 self.assertEqual(o.__repr__(), 'A repr')
3262
3263 capture = io.StringIO()
3264 # Calling str() or not exercises different internal paths.
3265 print(o, file=capture)
3266 print(str(o), file=capture)
3267 self.assertEqual(capture.getvalue(), '41\n41\n')
3268 capture.close()
3269
3270 def test_keyword_arguments(self):
3271 # Testing keyword arguments to __init__, __call__...
3272 def f(a): return a
3273 self.assertEqual(f.__call__(a=42), 42)
3274 a = []
3275 list.__init__(a, sequence=[0, 1, 2])
3276 self.assertEqual(a, [0, 1, 2])
3277
3278 def test_recursive_call(self):
3279 # Testing recursive __call__() by setting to instance of class...
3280 class A(object):
3281 pass
3282
3283 A.__call__ = A()
3284 try:
3285 A()()
3286 except RuntimeError:
3287 pass
3288 else:
3289 self.fail("Recursion limit should have been reached for __call__()")
3290
3291 def test_delete_hook(self):
3292 # Testing __del__ hook...
3293 log = []
3294 class C(object):
3295 def __del__(self):
3296 log.append(1)
3297 c = C()
3298 self.assertEqual(log, [])
3299 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003300 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003301 self.assertEqual(log, [1])
3302
3303 class D(object): pass
3304 d = D()
3305 try: del d[0]
3306 except TypeError: pass
3307 else: self.fail("invalid del() didn't raise TypeError")
3308
3309 def test_hash_inheritance(self):
3310 # Testing hash of mutable subclasses...
3311
3312 class mydict(dict):
3313 pass
3314 d = mydict()
3315 try:
3316 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003317 except TypeError:
3318 pass
3319 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003320 self.fail("hash() of dict subclass should fail")
3321
3322 class mylist(list):
3323 pass
3324 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003325 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003326 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003327 except TypeError:
3328 pass
3329 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003330 self.fail("hash() of list subclass should fail")
3331
3332 def test_str_operations(self):
3333 try: 'a' + 5
3334 except TypeError: pass
3335 else: self.fail("'' + 5 doesn't raise TypeError")
3336
3337 try: ''.split('')
3338 except ValueError: pass
3339 else: self.fail("''.split('') doesn't raise ValueError")
3340
3341 try: ''.join([0])
3342 except TypeError: pass
3343 else: self.fail("''.join([0]) doesn't raise TypeError")
3344
3345 try: ''.rindex('5')
3346 except ValueError: pass
3347 else: self.fail("''.rindex('5') doesn't raise ValueError")
3348
3349 try: '%(n)s' % None
3350 except TypeError: pass
3351 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3352
3353 try: '%(n' % {}
3354 except ValueError: pass
3355 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3356
3357 try: '%*s' % ('abc')
3358 except TypeError: pass
3359 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3360
3361 try: '%*.*s' % ('abc', 5)
3362 except TypeError: pass
3363 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3364
3365 try: '%s' % (1, 2)
3366 except TypeError: pass
3367 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3368
3369 try: '%' % None
3370 except ValueError: pass
3371 else: self.fail("'%' % None doesn't raise ValueError")
3372
3373 self.assertEqual('534253'.isdigit(), 1)
3374 self.assertEqual('534253x'.isdigit(), 0)
3375 self.assertEqual('%c' % 5, '\x05')
3376 self.assertEqual('%c' % '5', '5')
3377
3378 def test_deepcopy_recursive(self):
3379 # Testing deepcopy of recursive objects...
3380 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003381 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003382 a = Node()
3383 b = Node()
3384 a.b = b
3385 b.a = a
3386 z = deepcopy(a) # This blew up before
3387
3388 def test_unintialized_modules(self):
3389 # Testing uninitialized module objects...
3390 from types import ModuleType as M
3391 m = M.__new__(M)
3392 str(m)
3393 self.assertEqual(hasattr(m, "__name__"), 0)
3394 self.assertEqual(hasattr(m, "__file__"), 0)
3395 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003396 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003397 m.foo = 1
3398 self.assertEqual(m.__dict__, {"foo": 1})
3399
3400 def test_funny_new(self):
3401 # Testing __new__ returning something unexpected...
3402 class C(object):
3403 def __new__(cls, arg):
3404 if isinstance(arg, str): return [1, 2, 3]
3405 elif isinstance(arg, int): return object.__new__(D)
3406 else: return object.__new__(cls)
3407 class D(C):
3408 def __init__(self, arg):
3409 self.foo = arg
3410 self.assertEqual(C("1"), [1, 2, 3])
3411 self.assertEqual(D("1"), [1, 2, 3])
3412 d = D(None)
3413 self.assertEqual(d.foo, None)
3414 d = C(1)
3415 self.assertEqual(isinstance(d, D), True)
3416 self.assertEqual(d.foo, 1)
3417 d = D(1)
3418 self.assertEqual(isinstance(d, D), True)
3419 self.assertEqual(d.foo, 1)
3420
3421 def test_imul_bug(self):
3422 # Testing for __imul__ problems...
3423 # SF bug 544647
3424 class C(object):
3425 def __imul__(self, other):
3426 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003427 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003428 y = x
3429 y *= 1.0
3430 self.assertEqual(y, (x, 1.0))
3431 y = x
3432 y *= 2
3433 self.assertEqual(y, (x, 2))
3434 y = x
3435 y *= 3
3436 self.assertEqual(y, (x, 3))
3437 y = x
3438 y *= 1<<100
3439 self.assertEqual(y, (x, 1<<100))
3440 y = x
3441 y *= None
3442 self.assertEqual(y, (x, None))
3443 y = x
3444 y *= "foo"
3445 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003446
Georg Brandl479a7e72008-02-05 18:13:15 +00003447 def test_copy_setstate(self):
3448 # Testing that copy.*copy() correctly uses __setstate__...
3449 import copy
3450 class C(object):
3451 def __init__(self, foo=None):
3452 self.foo = foo
3453 self.__foo = foo
3454 def setfoo(self, foo=None):
3455 self.foo = foo
3456 def getfoo(self):
3457 return self.__foo
3458 def __getstate__(self):
3459 return [self.foo]
3460 def __setstate__(self_, lst):
3461 self.assertEqual(len(lst), 1)
3462 self_.__foo = self_.foo = lst[0]
3463 a = C(42)
3464 a.setfoo(24)
3465 self.assertEqual(a.foo, 24)
3466 self.assertEqual(a.getfoo(), 42)
3467 b = copy.copy(a)
3468 self.assertEqual(b.foo, 24)
3469 self.assertEqual(b.getfoo(), 24)
3470 b = copy.deepcopy(a)
3471 self.assertEqual(b.foo, 24)
3472 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003473
Georg Brandl479a7e72008-02-05 18:13:15 +00003474 def test_slices(self):
3475 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003476
Georg Brandl479a7e72008-02-05 18:13:15 +00003477 # Strings
3478 self.assertEqual("hello"[:4], "hell")
3479 self.assertEqual("hello"[slice(4)], "hell")
3480 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3481 class S(str):
3482 def __getitem__(self, x):
3483 return str.__getitem__(self, x)
3484 self.assertEqual(S("hello")[:4], "hell")
3485 self.assertEqual(S("hello")[slice(4)], "hell")
3486 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3487 # Tuples
3488 self.assertEqual((1,2,3)[:2], (1,2))
3489 self.assertEqual((1,2,3)[slice(2)], (1,2))
3490 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3491 class T(tuple):
3492 def __getitem__(self, x):
3493 return tuple.__getitem__(self, x)
3494 self.assertEqual(T((1,2,3))[:2], (1,2))
3495 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3496 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3497 # Lists
3498 self.assertEqual([1,2,3][:2], [1,2])
3499 self.assertEqual([1,2,3][slice(2)], [1,2])
3500 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3501 class L(list):
3502 def __getitem__(self, x):
3503 return list.__getitem__(self, x)
3504 self.assertEqual(L([1,2,3])[:2], [1,2])
3505 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3506 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3507 # Now do lists and __setitem__
3508 a = L([1,2,3])
3509 a[slice(1, 3)] = [3,2]
3510 self.assertEqual(a, [1,3,2])
3511 a[slice(0, 2, 1)] = [3,1]
3512 self.assertEqual(a, [3,1,2])
3513 a.__setitem__(slice(1, 3), [2,1])
3514 self.assertEqual(a, [3,2,1])
3515 a.__setitem__(slice(0, 2, 1), [2,3])
3516 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003517
Georg Brandl479a7e72008-02-05 18:13:15 +00003518 def test_subtype_resurrection(self):
3519 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003520
Georg Brandl479a7e72008-02-05 18:13:15 +00003521 class C(object):
3522 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003523
Georg Brandl479a7e72008-02-05 18:13:15 +00003524 def __del__(self):
3525 # resurrect the instance
3526 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003527
Georg Brandl479a7e72008-02-05 18:13:15 +00003528 c = C()
3529 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003530
Benjamin Petersone549ead2009-03-28 21:42:05 +00003531 # The most interesting thing here is whether this blows up, due to
3532 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3533 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003534 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003535
Georg Brandl479a7e72008-02-05 18:13:15 +00003536 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003537 # the last container slot works: that will attempt to delete c again,
3538 # which will cause c to get appended back to the container again
3539 # "during" the del. (On non-CPython implementations, however, __del__
3540 # is typically not called again.)
3541 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003542 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003543 del C.container[-1]
3544 if support.check_impl_detail():
3545 support.gc_collect()
3546 self.assertEqual(len(C.container), 1)
3547 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003548
Georg Brandl479a7e72008-02-05 18:13:15 +00003549 # Make c mortal again, so that the test framework with -l doesn't report
3550 # it as a leak.
3551 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003552
Georg Brandl479a7e72008-02-05 18:13:15 +00003553 def test_slots_trash(self):
3554 # Testing slot trash...
3555 # Deallocating deeply nested slotted trash caused stack overflows
3556 class trash(object):
3557 __slots__ = ['x']
3558 def __init__(self, x):
3559 self.x = x
3560 o = None
3561 for i in range(50000):
3562 o = trash(o)
3563 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003564
Georg Brandl479a7e72008-02-05 18:13:15 +00003565 def test_slots_multiple_inheritance(self):
3566 # SF bug 575229, multiple inheritance w/ slots dumps core
3567 class A(object):
3568 __slots__=()
3569 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003570 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003571 class C(A,B) :
3572 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003573 if support.check_impl_detail():
3574 self.assertEqual(C.__basicsize__, B.__basicsize__)
Georg Brandl479a7e72008-02-05 18:13:15 +00003575 self.assert_(hasattr(C, '__dict__'))
3576 self.assert_(hasattr(C, '__weakref__'))
3577 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003578
Georg Brandl479a7e72008-02-05 18:13:15 +00003579 def test_rmul(self):
3580 # Testing correct invocation of __rmul__...
3581 # SF patch 592646
3582 class C(object):
3583 def __mul__(self, other):
3584 return "mul"
3585 def __rmul__(self, other):
3586 return "rmul"
3587 a = C()
3588 self.assertEqual(a*2, "mul")
3589 self.assertEqual(a*2.2, "mul")
3590 self.assertEqual(2*a, "rmul")
3591 self.assertEqual(2.2*a, "rmul")
3592
3593 def test_ipow(self):
3594 # Testing correct invocation of __ipow__...
3595 # [SF bug 620179]
3596 class C(object):
3597 def __ipow__(self, other):
3598 pass
3599 a = C()
3600 a **= 2
3601
3602 def test_mutable_bases(self):
3603 # Testing mutable bases...
3604
3605 # stuff that should work:
3606 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003607 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003608 class C2(object):
3609 def __getattribute__(self, attr):
3610 if attr == 'a':
3611 return 2
3612 else:
3613 return super(C2, self).__getattribute__(attr)
3614 def meth(self):
3615 return 1
3616 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003617 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003618 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003619 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003620 d = D()
3621 e = E()
3622 D.__bases__ = (C,)
3623 D.__bases__ = (C2,)
3624 self.assertEqual(d.meth(), 1)
3625 self.assertEqual(e.meth(), 1)
3626 self.assertEqual(d.a, 2)
3627 self.assertEqual(e.a, 2)
3628 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003629
Georg Brandl479a7e72008-02-05 18:13:15 +00003630 try:
3631 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003632 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003633 pass
3634 else:
3635 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003636
Georg Brandl479a7e72008-02-05 18:13:15 +00003637 try:
3638 D.__bases__ = ()
3639 except TypeError as msg:
3640 if str(msg) == "a new-style class can't have only classic bases":
3641 self.fail("wrong error message for .__bases__ = ()")
3642 else:
3643 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003644
Georg Brandl479a7e72008-02-05 18:13:15 +00003645 try:
3646 D.__bases__ = (D,)
3647 except TypeError:
3648 pass
3649 else:
3650 # actually, we'll have crashed by here...
3651 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003652
Georg Brandl479a7e72008-02-05 18:13:15 +00003653 try:
3654 D.__bases__ = (C, C)
3655 except TypeError:
3656 pass
3657 else:
3658 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003659
Georg Brandl479a7e72008-02-05 18:13:15 +00003660 try:
3661 D.__bases__ = (E,)
3662 except TypeError:
3663 pass
3664 else:
3665 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003666
Benjamin Petersonae937c02009-04-18 20:54:08 +00003667 def test_builtin_bases(self):
3668 # Make sure all the builtin types can have their base queried without
3669 # segfaulting. See issue #5787.
3670 builtin_types = [tp for tp in builtins.__dict__.values()
3671 if isinstance(tp, type)]
3672 for tp in builtin_types:
3673 object.__getattribute__(tp, "__bases__")
3674 if tp is not object:
3675 self.assertEqual(len(tp.__bases__), 1, tp)
3676
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003677 class L(list):
3678 pass
3679
3680 class C(object):
3681 pass
3682
3683 class D(C):
3684 pass
3685
3686 try:
3687 L.__bases__ = (dict,)
3688 except TypeError:
3689 pass
3690 else:
3691 self.fail("shouldn't turn list subclass into dict subclass")
3692
3693 try:
3694 list.__bases__ = (dict,)
3695 except TypeError:
3696 pass
3697 else:
3698 self.fail("shouldn't be able to assign to list.__bases__")
3699
3700 try:
3701 D.__bases__ = (C, list)
3702 except TypeError:
3703 pass
3704 else:
3705 assert 0, "best_base calculation found wanting"
3706
Benjamin Petersonae937c02009-04-18 20:54:08 +00003707
Georg Brandl479a7e72008-02-05 18:13:15 +00003708 def test_mutable_bases_with_failing_mro(self):
3709 # Testing mutable bases with failing mro...
3710 class WorkOnce(type):
3711 def __new__(self, name, bases, ns):
3712 self.flag = 0
3713 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3714 def mro(self):
3715 if self.flag > 0:
3716 raise RuntimeError("bozo")
3717 else:
3718 self.flag += 1
3719 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003720
Georg Brandl479a7e72008-02-05 18:13:15 +00003721 class WorkAlways(type):
3722 def mro(self):
3723 # this is here to make sure that .mro()s aren't called
3724 # with an exception set (which was possible at one point).
3725 # An error message will be printed in a debug build.
3726 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003727 return type.mro(self)
3728
Georg Brandl479a7e72008-02-05 18:13:15 +00003729 class C(object):
3730 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003731
Georg Brandl479a7e72008-02-05 18:13:15 +00003732 class C2(object):
3733 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003734
Georg Brandl479a7e72008-02-05 18:13:15 +00003735 class D(C):
3736 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003737
Georg Brandl479a7e72008-02-05 18:13:15 +00003738 class E(D):
3739 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003740
Georg Brandl479a7e72008-02-05 18:13:15 +00003741 class F(D, metaclass=WorkOnce):
3742 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003743
Georg Brandl479a7e72008-02-05 18:13:15 +00003744 class G(D, metaclass=WorkAlways):
3745 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003746
Georg Brandl479a7e72008-02-05 18:13:15 +00003747 # Immediate subclasses have their mro's adjusted in alphabetical
3748 # order, so E's will get adjusted before adjusting F's fails. We
3749 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003750
Georg Brandl479a7e72008-02-05 18:13:15 +00003751 E_mro_before = E.__mro__
3752 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003753
Armin Rigofd163f92005-12-29 15:59:19 +00003754 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003755 D.__bases__ = (C2,)
3756 except RuntimeError:
3757 self.assertEqual(E.__mro__, E_mro_before)
3758 self.assertEqual(D.__mro__, D_mro_before)
3759 else:
3760 self.fail("exception not propagated")
3761
3762 def test_mutable_bases_catch_mro_conflict(self):
3763 # Testing mutable bases catch mro conflict...
3764 class A(object):
3765 pass
3766
3767 class B(object):
3768 pass
3769
3770 class C(A, B):
3771 pass
3772
3773 class D(A, B):
3774 pass
3775
3776 class E(C, D):
3777 pass
3778
3779 try:
3780 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003781 except TypeError:
3782 pass
3783 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003784 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003785
Georg Brandl479a7e72008-02-05 18:13:15 +00003786 def test_mutable_names(self):
3787 # Testing mutable names...
3788 class C(object):
3789 pass
3790
3791 # C.__module__ could be 'test_descr' or '__main__'
3792 mod = C.__module__
3793
3794 C.__name__ = 'D'
3795 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3796
3797 C.__name__ = 'D.E'
3798 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3799
3800 def test_subclass_right_op(self):
3801 # Testing correct dispatch of subclass overloading __r<op>__...
3802
3803 # This code tests various cases where right-dispatch of a subclass
3804 # should be preferred over left-dispatch of a base class.
3805
3806 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3807
3808 class B(int):
3809 def __floordiv__(self, other):
3810 return "B.__floordiv__"
3811 def __rfloordiv__(self, other):
3812 return "B.__rfloordiv__"
3813
3814 self.assertEqual(B(1) // 1, "B.__floordiv__")
3815 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3816
3817 # Case 2: subclass of object; this is just the baseline for case 3
3818
3819 class C(object):
3820 def __floordiv__(self, other):
3821 return "C.__floordiv__"
3822 def __rfloordiv__(self, other):
3823 return "C.__rfloordiv__"
3824
3825 self.assertEqual(C() // 1, "C.__floordiv__")
3826 self.assertEqual(1 // C(), "C.__rfloordiv__")
3827
3828 # Case 3: subclass of new-style class; here it gets interesting
3829
3830 class D(C):
3831 def __floordiv__(self, other):
3832 return "D.__floordiv__"
3833 def __rfloordiv__(self, other):
3834 return "D.__rfloordiv__"
3835
3836 self.assertEqual(D() // C(), "D.__floordiv__")
3837 self.assertEqual(C() // D(), "D.__rfloordiv__")
3838
3839 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3840
3841 class E(C):
3842 pass
3843
3844 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3845
3846 self.assertEqual(E() // 1, "C.__floordiv__")
3847 self.assertEqual(1 // E(), "C.__rfloordiv__")
3848 self.assertEqual(E() // C(), "C.__floordiv__")
3849 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3850
Benjamin Petersone549ead2009-03-28 21:42:05 +00003851 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003852 def test_meth_class_get(self):
3853 # Testing __get__ method of METH_CLASS C methods...
3854 # Full coverage of descrobject.c::classmethod_get()
3855
3856 # Baseline
3857 arg = [1, 2, 3]
3858 res = {1: None, 2: None, 3: None}
3859 self.assertEqual(dict.fromkeys(arg), res)
3860 self.assertEqual({}.fromkeys(arg), res)
3861
3862 # Now get the descriptor
3863 descr = dict.__dict__["fromkeys"]
3864
3865 # More baseline using the descriptor directly
3866 self.assertEqual(descr.__get__(None, dict)(arg), res)
3867 self.assertEqual(descr.__get__({})(arg), res)
3868
3869 # Now check various error cases
3870 try:
3871 descr.__get__(None, None)
3872 except TypeError:
3873 pass
3874 else:
3875 self.fail("shouldn't have allowed descr.__get__(None, None)")
3876 try:
3877 descr.__get__(42)
3878 except TypeError:
3879 pass
3880 else:
3881 self.fail("shouldn't have allowed descr.__get__(42)")
3882 try:
3883 descr.__get__(None, 42)
3884 except TypeError:
3885 pass
3886 else:
3887 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3888 try:
3889 descr.__get__(None, int)
3890 except TypeError:
3891 pass
3892 else:
3893 self.fail("shouldn't have allowed descr.__get__(None, int)")
3894
3895 def test_isinst_isclass(self):
3896 # Testing proxy isinstance() and isclass()...
3897 class Proxy(object):
3898 def __init__(self, obj):
3899 self.__obj = obj
3900 def __getattribute__(self, name):
3901 if name.startswith("_Proxy__"):
3902 return object.__getattribute__(self, name)
3903 else:
3904 return getattr(self.__obj, name)
3905 # Test with a classic class
3906 class C:
3907 pass
3908 a = C()
3909 pa = Proxy(a)
3910 self.assert_(isinstance(a, C)) # Baseline
3911 self.assert_(isinstance(pa, C)) # Test
3912 # Test with a classic subclass
3913 class D(C):
3914 pass
3915 a = D()
3916 pa = Proxy(a)
3917 self.assert_(isinstance(a, C)) # Baseline
3918 self.assert_(isinstance(pa, C)) # Test
3919 # Test with a new-style class
3920 class C(object):
3921 pass
3922 a = C()
3923 pa = Proxy(a)
3924 self.assert_(isinstance(a, C)) # Baseline
3925 self.assert_(isinstance(pa, C)) # Test
3926 # Test with a new-style subclass
3927 class D(C):
3928 pass
3929 a = D()
3930 pa = Proxy(a)
3931 self.assert_(isinstance(a, C)) # Baseline
3932 self.assert_(isinstance(pa, C)) # Test
3933
3934 def test_proxy_super(self):
3935 # Testing super() for a proxy object...
3936 class Proxy(object):
3937 def __init__(self, obj):
3938 self.__obj = obj
3939 def __getattribute__(self, name):
3940 if name.startswith("_Proxy__"):
3941 return object.__getattribute__(self, name)
3942 else:
3943 return getattr(self.__obj, name)
3944
3945 class B(object):
3946 def f(self):
3947 return "B.f"
3948
3949 class C(B):
3950 def f(self):
3951 return super(C, self).f() + "->C.f"
3952
3953 obj = C()
3954 p = Proxy(obj)
3955 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3956
3957 def test_carloverre(self):
3958 # Testing prohibition of Carlo Verre's hack...
3959 try:
3960 object.__setattr__(str, "foo", 42)
3961 except TypeError:
3962 pass
3963 else:
3964 self.fail("Carlo Verre __setattr__ suceeded!")
3965 try:
3966 object.__delattr__(str, "lower")
3967 except TypeError:
3968 pass
3969 else:
3970 self.fail("Carlo Verre __delattr__ succeeded!")
3971
3972 def test_weakref_segfault(self):
3973 # Testing weakref segfault...
3974 # SF 742911
3975 import weakref
3976
3977 class Provoker:
3978 def __init__(self, referrent):
3979 self.ref = weakref.ref(referrent)
3980
3981 def __del__(self):
3982 x = self.ref()
3983
3984 class Oops(object):
3985 pass
3986
3987 o = Oops()
3988 o.whatever = Provoker(o)
3989 del o
3990
3991 def test_wrapper_segfault(self):
3992 # SF 927248: deeply nested wrappers could cause stack overflow
3993 f = lambda:None
3994 for i in range(1000000):
3995 f = f.__call__
3996 f = None
3997
3998 def test_file_fault(self):
3999 # Testing sys.stdout is changed in getattr...
4000 import sys
4001 class StdoutGuard:
4002 def __getattr__(self, attr):
4003 sys.stdout = sys.__stdout__
4004 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4005 sys.stdout = StdoutGuard()
4006 try:
4007 print("Oops!")
4008 except RuntimeError:
4009 pass
4010
4011 def test_vicious_descriptor_nonsense(self):
4012 # Testing vicious_descriptor_nonsense...
4013
4014 # A potential segfault spotted by Thomas Wouters in mail to
4015 # python-dev 2003-04-17, turned into an example & fixed by Michael
4016 # Hudson just less than four months later...
4017
4018 class Evil(object):
4019 def __hash__(self):
4020 return hash('attr')
4021 def __eq__(self, other):
4022 del C.attr
4023 return 0
4024
4025 class Descr(object):
4026 def __get__(self, ob, type=None):
4027 return 1
4028
4029 class C(object):
4030 attr = Descr()
4031
4032 c = C()
4033 c.__dict__[Evil()] = 0
4034
4035 self.assertEqual(c.attr, 1)
4036 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004037 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004038 self.assertEqual(hasattr(c, 'attr'), False)
4039
4040 def test_init(self):
4041 # SF 1155938
4042 class Foo(object):
4043 def __init__(self):
4044 return 10
4045 try:
4046 Foo()
4047 except TypeError:
4048 pass
4049 else:
4050 self.fail("did not test __init__() for None return")
4051
4052 def test_method_wrapper(self):
4053 # Testing method-wrapper objects...
4054 # <type 'method-wrapper'> did not support any reflection before 2.5
4055
Mark Dickinson211c6252009-02-01 10:28:51 +00004056 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004057
4058 l = []
4059 self.assertEqual(l.__add__, l.__add__)
4060 self.assertEqual(l.__add__, [].__add__)
4061 self.assert_(l.__add__ != [5].__add__)
4062 self.assert_(l.__add__ != l.__mul__)
4063 self.assert_(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004064 if hasattr(l.__add__, '__self__'):
4065 # CPython
4066 self.assert_(l.__add__.__self__ is l)
4067 self.assert_(l.__add__.__objclass__ is list)
4068 else:
4069 # Python implementations where [].__add__ is a normal bound method
4070 self.assert_(l.__add__.im_self is l)
4071 self.assert_(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004072 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4073 try:
4074 hash(l.__add__)
4075 except TypeError:
4076 pass
4077 else:
4078 self.fail("no TypeError from hash([].__add__)")
4079
4080 t = ()
4081 t += (7,)
4082 self.assertEqual(t.__add__, (7,).__add__)
4083 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4084
4085 def test_not_implemented(self):
4086 # Testing NotImplemented...
4087 # all binary methods should be able to return a NotImplemented
4088 import sys
4089 import types
4090 import operator
4091
4092 def specialmethod(self, other):
4093 return NotImplemented
4094
4095 def check(expr, x, y):
4096 try:
4097 exec(expr, {'x': x, 'y': y, 'operator': operator})
4098 except TypeError:
4099 pass
4100 else:
4101 self.fail("no TypeError from %r" % (expr,))
4102
4103 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4104 # TypeErrors
4105 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4106 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004107 for name, expr, iexpr in [
4108 ('__add__', 'x + y', 'x += y'),
4109 ('__sub__', 'x - y', 'x -= y'),
4110 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004111 ('__truediv__', 'operator.truediv(x, y)', None),
4112 ('__floordiv__', 'operator.floordiv(x, y)', None),
4113 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004114 ('__mod__', 'x % y', 'x %= y'),
4115 ('__divmod__', 'divmod(x, y)', None),
4116 ('__pow__', 'x ** y', 'x **= y'),
4117 ('__lshift__', 'x << y', 'x <<= y'),
4118 ('__rshift__', 'x >> y', 'x >>= y'),
4119 ('__and__', 'x & y', 'x &= y'),
4120 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004121 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004122 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004123 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004124 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004125 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004126 check(expr, a, N1)
4127 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004128 if iexpr:
4129 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004130 check(iexpr, a, N1)
4131 check(iexpr, a, N2)
4132 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004133 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004134 c = C()
4135 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004136 check(iexpr, c, N1)
4137 check(iexpr, c, N2)
4138
Georg Brandl479a7e72008-02-05 18:13:15 +00004139 def test_assign_slice(self):
4140 # ceval.c's assign_slice used to check for
4141 # tp->tp_as_sequence->sq_slice instead of
4142 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004143
Georg Brandl479a7e72008-02-05 18:13:15 +00004144 class C(object):
4145 def __setitem__(self, idx, value):
4146 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004147
Georg Brandl479a7e72008-02-05 18:13:15 +00004148 c = C()
4149 c[1:2] = 3
4150 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004151
Benjamin Peterson9262b842008-11-17 22:45:50 +00004152 def test_getattr_hooks(self):
4153 # issue 4230
4154
4155 class Descriptor(object):
4156 counter = 0
4157 def __get__(self, obj, objtype=None):
4158 def getter(name):
4159 self.counter += 1
4160 raise AttributeError(name)
4161 return getter
4162
4163 descr = Descriptor()
4164 class A(object):
4165 __getattribute__ = descr
4166 class B(object):
4167 __getattr__ = descr
4168 class C(object):
4169 __getattribute__ = descr
4170 __getattr__ = descr
4171
4172 self.assertRaises(AttributeError, getattr, A(), "attr")
4173 self.assertEquals(descr.counter, 1)
4174 self.assertRaises(AttributeError, getattr, B(), "attr")
4175 self.assertEquals(descr.counter, 2)
4176 self.assertRaises(AttributeError, getattr, C(), "attr")
4177 self.assertEquals(descr.counter, 4)
4178
4179 import gc
4180 class EvilGetattribute(object):
4181 # This used to segfault
4182 def __getattr__(self, name):
4183 raise AttributeError(name)
4184 def __getattribute__(self, name):
4185 del EvilGetattribute.__getattr__
4186 for i in range(5):
4187 gc.collect()
4188 raise AttributeError(name)
4189
4190 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4191
Christian Heimesbbffeb62008-01-24 09:42:52 +00004192
Georg Brandl479a7e72008-02-05 18:13:15 +00004193class DictProxyTests(unittest.TestCase):
4194 def setUp(self):
4195 class C(object):
4196 def meth(self):
4197 pass
4198 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004199
Georg Brandl479a7e72008-02-05 18:13:15 +00004200 def test_iter_keys(self):
4201 # Testing dict-proxy iterkeys...
4202 keys = [ key for key in self.C.__dict__.keys() ]
4203 keys.sort()
4204 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4205 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004206
Georg Brandl479a7e72008-02-05 18:13:15 +00004207 def test_iter_values(self):
4208 # Testing dict-proxy itervalues...
4209 values = [ values for values in self.C.__dict__.values() ]
4210 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004211
Georg Brandl479a7e72008-02-05 18:13:15 +00004212 def test_iter_items(self):
4213 # Testing dict-proxy iteritems...
4214 keys = [ key for (key, value) in self.C.__dict__.items() ]
4215 keys.sort()
4216 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4217 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004218
Georg Brandl479a7e72008-02-05 18:13:15 +00004219 def test_dict_type_with_metaclass(self):
4220 # Testing type of __dict__ when metaclass set...
4221 class B(object):
4222 pass
4223 class M(type):
4224 pass
4225 class C(metaclass=M):
4226 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4227 pass
4228 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004229
Christian Heimesbbffeb62008-01-24 09:42:52 +00004230
Georg Brandl479a7e72008-02-05 18:13:15 +00004231class PTypesLongInitTest(unittest.TestCase):
4232 # This is in its own TestCase so that it can be run before any other tests.
4233 def test_pytype_long_ready(self):
4234 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004235
Georg Brandl479a7e72008-02-05 18:13:15 +00004236 # This dumps core when SF bug 551412 isn't fixed --
4237 # but only when test_descr.py is run separately.
4238 # (That can't be helped -- as soon as PyType_Ready()
4239 # is called for PyLong_Type, the bug is gone.)
4240 class UserLong(object):
4241 def __pow__(self, *args):
4242 pass
4243 try:
4244 pow(0, UserLong(), 0)
4245 except:
4246 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004247
Georg Brandl479a7e72008-02-05 18:13:15 +00004248 # Another segfault only when run early
4249 # (before PyType_Ready(tuple) is called)
4250 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004251
4252
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004253def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004254 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004255 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004256 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004257
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004258if __name__ == "__main__":
4259 test_main()