blob: 32f9090d60c7d1603ce6f220728e50985770bfd3 [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 Peterson224205f2009-05-08 03:25:19 +00001598
1599
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001600 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001601 class X(Checker):
1602 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001603 for attr, obj in env.items():
1604 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001605 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001606 runner(X())
1607
1608 record = []
1609 class X(Checker):
1610 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001611 for attr, obj in env.items():
1612 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001613 setattr(X, name, SpecialDescr(meth_impl))
1614 runner(X())
1615 self.assertEqual(record, [1], name)
1616
Georg Brandl479a7e72008-02-05 18:13:15 +00001617 def test_specials(self):
1618 # Testing special operators...
1619 # Test operators like __hash__ for which a built-in default exists
1620
1621 # Test the default behavior for static classes
1622 class C(object):
1623 def __getitem__(self, i):
1624 if 0 <= i < 10: return i
1625 raise IndexError
1626 c1 = C()
1627 c2 = C()
1628 self.assert_(not not c1) # What?
1629 self.assertNotEqual(id(c1), id(c2))
1630 hash(c1)
1631 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001632 self.assertEqual(c1, c1)
1633 self.assert_(c1 != c2)
1634 self.assert_(not c1 != c1)
1635 self.assert_(not c1 == c2)
1636 # Note that the module name appears in str/repr, and that varies
1637 # depending on whether this test is run standalone or from a framework.
1638 self.assert_(str(c1).find('C object at ') >= 0)
1639 self.assertEqual(str(c1), repr(c1))
1640 self.assert_(-1 not in c1)
1641 for i in range(10):
1642 self.assert_(i in c1)
1643 self.assertFalse(10 in c1)
1644 # Test the default behavior for dynamic classes
1645 class D(object):
1646 def __getitem__(self, i):
1647 if 0 <= i < 10: return i
1648 raise IndexError
1649 d1 = D()
1650 d2 = D()
1651 self.assert_(not not d1)
1652 self.assertNotEqual(id(d1), id(d2))
1653 hash(d1)
1654 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001655 self.assertEqual(d1, d1)
1656 self.assertNotEqual(d1, d2)
1657 self.assert_(not d1 != d1)
1658 self.assert_(not d1 == d2)
1659 # Note that the module name appears in str/repr, and that varies
1660 # depending on whether this test is run standalone or from a framework.
1661 self.assert_(str(d1).find('D object at ') >= 0)
1662 self.assertEqual(str(d1), repr(d1))
1663 self.assert_(-1 not in d1)
1664 for i in range(10):
1665 self.assert_(i in d1)
1666 self.assertFalse(10 in d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001667 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001668 class Proxy(object):
1669 def __init__(self, x):
1670 self.x = x
1671 def __bool__(self):
1672 return not not self.x
1673 def __hash__(self):
1674 return hash(self.x)
1675 def __eq__(self, other):
1676 return self.x == other
1677 def __ne__(self, other):
1678 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001679 def __ge__(self, other):
1680 return self.x >= other
1681 def __gt__(self, other):
1682 return self.x > other
1683 def __le__(self, other):
1684 return self.x <= other
1685 def __lt__(self, other):
1686 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001687 def __str__(self):
1688 return "Proxy:%s" % self.x
1689 def __repr__(self):
1690 return "Proxy(%r)" % self.x
1691 def __contains__(self, value):
1692 return value in self.x
1693 p0 = Proxy(0)
1694 p1 = Proxy(1)
1695 p_1 = Proxy(-1)
1696 self.assertFalse(p0)
1697 self.assert_(not not p1)
1698 self.assertEqual(hash(p0), hash(0))
1699 self.assertEqual(p0, p0)
1700 self.assertNotEqual(p0, p1)
1701 self.assert_(not p0 != p0)
1702 self.assertEqual(not p0, p1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001703 self.assert_(p0 < p1)
1704 self.assert_(p0 <= p1)
1705 self.assert_(p1 > p0)
1706 self.assert_(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001707 self.assertEqual(str(p0), "Proxy:0")
1708 self.assertEqual(repr(p0), "Proxy(0)")
1709 p10 = Proxy(range(10))
1710 self.assertFalse(-1 in p10)
1711 for i in range(10):
1712 self.assert_(i in p10)
1713 self.assertFalse(10 in p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001714
Georg Brandl479a7e72008-02-05 18:13:15 +00001715 def test_weakrefs(self):
1716 # Testing weak references...
1717 import weakref
1718 class C(object):
1719 pass
1720 c = C()
1721 r = weakref.ref(c)
1722 self.assertEqual(r(), c)
1723 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001724 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001725 self.assertEqual(r(), None)
1726 del r
1727 class NoWeak(object):
1728 __slots__ = ['foo']
1729 no = NoWeak()
1730 try:
1731 weakref.ref(no)
1732 except TypeError as msg:
1733 self.assert_(str(msg).find("weak reference") >= 0)
1734 else:
1735 self.fail("weakref.ref(no) should be illegal")
1736 class Weak(object):
1737 __slots__ = ['foo', '__weakref__']
1738 yes = Weak()
1739 r = weakref.ref(yes)
1740 self.assertEqual(r(), yes)
1741 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001742 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001743 self.assertEqual(r(), None)
1744 del r
1745
1746 def test_properties(self):
1747 # Testing property...
1748 class C(object):
1749 def getx(self):
1750 return self.__x
1751 def setx(self, value):
1752 self.__x = value
1753 def delx(self):
1754 del self.__x
1755 x = property(getx, setx, delx, doc="I'm the x property.")
1756 a = C()
1757 self.assertFalse(hasattr(a, "x"))
1758 a.x = 42
1759 self.assertEqual(a._C__x, 42)
1760 self.assertEqual(a.x, 42)
1761 del a.x
1762 self.assertFalse(hasattr(a, "x"))
1763 self.assertFalse(hasattr(a, "_C__x"))
1764 C.x.__set__(a, 100)
1765 self.assertEqual(C.x.__get__(a), 100)
1766 C.x.__delete__(a)
1767 self.assertFalse(hasattr(a, "x"))
1768
1769 raw = C.__dict__['x']
1770 self.assert_(isinstance(raw, property))
1771
1772 attrs = dir(raw)
1773 self.assert_("__doc__" in attrs)
1774 self.assert_("fget" in attrs)
1775 self.assert_("fset" in attrs)
1776 self.assert_("fdel" in attrs)
1777
1778 self.assertEqual(raw.__doc__, "I'm the x property.")
1779 self.assert_(raw.fget is C.__dict__['getx'])
1780 self.assert_(raw.fset is C.__dict__['setx'])
1781 self.assert_(raw.fdel is C.__dict__['delx'])
1782
1783 for attr in "__doc__", "fget", "fset", "fdel":
1784 try:
1785 setattr(raw, attr, 42)
1786 except AttributeError as msg:
1787 if str(msg).find('readonly') < 0:
1788 self.fail("when setting readonly attr %r on a property, "
1789 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1790 else:
1791 self.fail("expected AttributeError from trying to set readonly %r "
1792 "attr on a property" % attr)
1793
1794 class D(object):
1795 __getitem__ = property(lambda s: 1/0)
1796
1797 d = D()
1798 try:
1799 for i in d:
1800 str(i)
1801 except ZeroDivisionError:
1802 pass
1803 else:
1804 self.fail("expected ZeroDivisionError from bad property")
1805
1806 class E(object):
1807 def getter(self):
1808 "getter method"
1809 return 0
1810 def setter(self_, value):
1811 "setter method"
1812 pass
1813 prop = property(getter)
1814 self.assertEqual(prop.__doc__, "getter method")
1815 prop2 = property(fset=setter)
1816 self.assertEqual(prop2.__doc__, None)
1817
1818 # this segfaulted in 2.5b2
1819 try:
1820 import _testcapi
1821 except ImportError:
1822 pass
1823 else:
1824 class X(object):
1825 p = property(_testcapi.test_with_docstring)
1826
1827 def test_properties_plus(self):
1828 class C(object):
1829 foo = property(doc="hello")
1830 @foo.getter
1831 def foo(self):
1832 return self._foo
1833 @foo.setter
1834 def foo(self, value):
1835 self._foo = abs(value)
1836 @foo.deleter
1837 def foo(self):
1838 del self._foo
1839 c = C()
1840 self.assertEqual(C.foo.__doc__, "hello")
1841 self.assertFalse(hasattr(c, "foo"))
1842 c.foo = -42
1843 self.assert_(hasattr(c, '_foo'))
1844 self.assertEqual(c._foo, 42)
1845 self.assertEqual(c.foo, 42)
1846 del c.foo
1847 self.assertFalse(hasattr(c, '_foo'))
1848 self.assertFalse(hasattr(c, "foo"))
1849
1850 class D(C):
1851 @C.foo.deleter
1852 def foo(self):
1853 try:
1854 del self._foo
1855 except AttributeError:
1856 pass
1857 d = D()
1858 d.foo = 24
1859 self.assertEqual(d.foo, 24)
1860 del d.foo
1861 del d.foo
1862
1863 class E(object):
1864 @property
1865 def foo(self):
1866 return self._foo
1867 @foo.setter
1868 def foo(self, value):
1869 raise RuntimeError
1870 @foo.setter
1871 def foo(self, value):
1872 self._foo = abs(value)
1873 @foo.deleter
1874 def foo(self, value=None):
1875 del self._foo
1876
1877 e = E()
1878 e.foo = -42
1879 self.assertEqual(e.foo, 42)
1880 del e.foo
1881
1882 class F(E):
1883 @E.foo.deleter
1884 def foo(self):
1885 del self._foo
1886 @foo.setter
1887 def foo(self, value):
1888 self._foo = max(0, value)
1889 f = F()
1890 f.foo = -10
1891 self.assertEqual(f.foo, 0)
1892 del f.foo
1893
1894 def test_dict_constructors(self):
1895 # Testing dict constructor ...
1896 d = dict()
1897 self.assertEqual(d, {})
1898 d = dict({})
1899 self.assertEqual(d, {})
1900 d = dict({1: 2, 'a': 'b'})
1901 self.assertEqual(d, {1: 2, 'a': 'b'})
1902 self.assertEqual(d, dict(list(d.items())))
1903 self.assertEqual(d, dict(iter(d.items())))
1904 d = dict({'one':1, 'two':2})
1905 self.assertEqual(d, dict(one=1, two=2))
1906 self.assertEqual(d, dict(**d))
1907 self.assertEqual(d, dict({"one": 1}, two=2))
1908 self.assertEqual(d, dict([("two", 2)], one=1))
1909 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1910 self.assertEqual(d, dict(**d))
1911
1912 for badarg in 0, 0, 0j, "0", [0], (0,):
1913 try:
1914 dict(badarg)
1915 except TypeError:
1916 pass
1917 except ValueError:
1918 if badarg == "0":
1919 # It's a sequence, and its elements are also sequences (gotta
1920 # love strings <wink>), but they aren't of length 2, so this
1921 # one seemed better as a ValueError than a TypeError.
1922 pass
1923 else:
1924 self.fail("no TypeError from dict(%r)" % badarg)
1925 else:
1926 self.fail("no TypeError from dict(%r)" % badarg)
1927
1928 try:
1929 dict({}, {})
1930 except TypeError:
1931 pass
1932 else:
1933 self.fail("no TypeError from dict({}, {})")
1934
1935 class Mapping:
1936 # Lacks a .keys() method; will be added later.
1937 dict = {1:2, 3:4, 'a':1j}
1938
1939 try:
1940 dict(Mapping())
1941 except TypeError:
1942 pass
1943 else:
1944 self.fail("no TypeError from dict(incomplete mapping)")
1945
1946 Mapping.keys = lambda self: list(self.dict.keys())
1947 Mapping.__getitem__ = lambda self, i: self.dict[i]
1948 d = dict(Mapping())
1949 self.assertEqual(d, Mapping.dict)
1950
1951 # Init from sequence of iterable objects, each producing a 2-sequence.
1952 class AddressBookEntry:
1953 def __init__(self, first, last):
1954 self.first = first
1955 self.last = last
1956 def __iter__(self):
1957 return iter([self.first, self.last])
1958
1959 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1960 AddressBookEntry('Barry', 'Peters'),
1961 AddressBookEntry('Tim', 'Peters'),
1962 AddressBookEntry('Barry', 'Warsaw')])
1963 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1964
1965 d = dict(zip(range(4), range(1, 5)))
1966 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1967
1968 # Bad sequence lengths.
1969 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1970 try:
1971 dict(bad)
1972 except ValueError:
1973 pass
1974 else:
1975 self.fail("no ValueError from dict(%r)" % bad)
1976
1977 def test_dir(self):
1978 # Testing dir() ...
1979 junk = 12
1980 self.assertEqual(dir(), ['junk', 'self'])
1981 del junk
1982
1983 # Just make sure these don't blow up!
1984 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
1985 dir(arg)
1986
1987 # Test dir on new-style classes. Since these have object as a
1988 # base class, a lot more gets sucked in.
1989 def interesting(strings):
1990 return [s for s in strings if not s.startswith('_')]
1991
1992 class C(object):
1993 Cdata = 1
1994 def Cmethod(self): pass
1995
1996 cstuff = ['Cdata', 'Cmethod']
1997 self.assertEqual(interesting(dir(C)), cstuff)
1998
1999 c = C()
2000 self.assertEqual(interesting(dir(c)), cstuff)
2001 ## self.assert_('__self__' in dir(C.Cmethod))
2002
2003 c.cdata = 2
2004 c.cmethod = lambda self: 0
2005 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
2006 ## self.assert_('__self__' in dir(c.Cmethod))
2007
2008 class A(C):
2009 Adata = 1
2010 def Amethod(self): pass
2011
2012 astuff = ['Adata', 'Amethod'] + cstuff
2013 self.assertEqual(interesting(dir(A)), astuff)
2014 ## self.assert_('__self__' in dir(A.Amethod))
2015 a = A()
2016 self.assertEqual(interesting(dir(a)), astuff)
2017 a.adata = 42
2018 a.amethod = lambda self: 3
2019 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
2020 ## self.assert_('__self__' in dir(a.Amethod))
2021
2022 # Try a module subclass.
2023 import sys
2024 class M(type(sys)):
2025 pass
2026 minstance = M("m")
2027 minstance.b = 2
2028 minstance.a = 1
2029 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2030 self.assertEqual(names, ['a', 'b'])
2031
2032 class M2(M):
2033 def getdict(self):
2034 return "Not a dict!"
2035 __dict__ = property(getdict)
2036
2037 m2instance = M2("m2")
2038 m2instance.b = 2
2039 m2instance.a = 1
2040 self.assertEqual(m2instance.__dict__, "Not a dict!")
2041 try:
2042 dir(m2instance)
2043 except TypeError:
2044 pass
2045
2046 # Two essentially featureless objects, just inheriting stuff from
2047 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002048 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2049 if support.check_impl_detail():
2050 # None differs in PyPy: it has a __nonzero__
2051 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002052
2053 # Nasty test case for proxied objects
2054 class Wrapper(object):
2055 def __init__(self, obj):
2056 self.__obj = obj
2057 def __repr__(self):
2058 return "Wrapper(%s)" % repr(self.__obj)
2059 def __getitem__(self, key):
2060 return Wrapper(self.__obj[key])
2061 def __len__(self):
2062 return len(self.__obj)
2063 def __getattr__(self, name):
2064 return Wrapper(getattr(self.__obj, name))
2065
2066 class C(object):
2067 def __getclass(self):
2068 return Wrapper(type(self))
2069 __class__ = property(__getclass)
2070
2071 dir(C()) # This used to segfault
2072
2073 def test_supers(self):
2074 # Testing super...
2075
2076 class A(object):
2077 def meth(self, a):
2078 return "A(%r)" % a
2079
2080 self.assertEqual(A().meth(1), "A(1)")
2081
2082 class B(A):
2083 def __init__(self):
2084 self.__super = super(B, self)
2085 def meth(self, a):
2086 return "B(%r)" % a + self.__super.meth(a)
2087
2088 self.assertEqual(B().meth(2), "B(2)A(2)")
2089
2090 class C(A):
2091 def meth(self, a):
2092 return "C(%r)" % a + self.__super.meth(a)
2093 C._C__super = super(C)
2094
2095 self.assertEqual(C().meth(3), "C(3)A(3)")
2096
2097 class D(C, B):
2098 def meth(self, a):
2099 return "D(%r)" % a + super(D, self).meth(a)
2100
2101 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2102
2103 # Test for subclassing super
2104
2105 class mysuper(super):
2106 def __init__(self, *args):
2107 return super(mysuper, self).__init__(*args)
2108
2109 class E(D):
2110 def meth(self, a):
2111 return "E(%r)" % a + mysuper(E, self).meth(a)
2112
2113 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2114
2115 class F(E):
2116 def meth(self, a):
2117 s = self.__super # == mysuper(F, self)
2118 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2119 F._F__super = mysuper(F)
2120
2121 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2122
2123 # Make sure certain errors are raised
2124
2125 try:
2126 super(D, 42)
2127 except TypeError:
2128 pass
2129 else:
2130 self.fail("shouldn't allow super(D, 42)")
2131
2132 try:
2133 super(D, C())
2134 except TypeError:
2135 pass
2136 else:
2137 self.fail("shouldn't allow super(D, C())")
2138
2139 try:
2140 super(D).__get__(12)
2141 except TypeError:
2142 pass
2143 else:
2144 self.fail("shouldn't allow super(D).__get__(12)")
2145
2146 try:
2147 super(D).__get__(C())
2148 except TypeError:
2149 pass
2150 else:
2151 self.fail("shouldn't allow super(D).__get__(C())")
2152
2153 # Make sure data descriptors can be overridden and accessed via super
2154 # (new feature in Python 2.3)
2155
2156 class DDbase(object):
2157 def getx(self): return 42
2158 x = property(getx)
2159
2160 class DDsub(DDbase):
2161 def getx(self): return "hello"
2162 x = property(getx)
2163
2164 dd = DDsub()
2165 self.assertEqual(dd.x, "hello")
2166 self.assertEqual(super(DDsub, dd).x, 42)
2167
2168 # Ensure that super() lookup of descriptor from classmethod
2169 # works (SF ID# 743627)
2170
2171 class Base(object):
2172 aProp = property(lambda self: "foo")
2173
2174 class Sub(Base):
2175 @classmethod
2176 def test(klass):
2177 return super(Sub,klass).aProp
2178
2179 self.assertEqual(Sub.test(), Base.aProp)
2180
2181 # Verify that super() doesn't allow keyword args
2182 try:
2183 super(Base, kw=1)
2184 except TypeError:
2185 pass
2186 else:
2187 self.assertEqual("super shouldn't accept keyword args")
2188
2189 def test_basic_inheritance(self):
2190 # Testing inheritance from basic types...
2191
2192 class hexint(int):
2193 def __repr__(self):
2194 return hex(self)
2195 def __add__(self, other):
2196 return hexint(int.__add__(self, other))
2197 # (Note that overriding __radd__ doesn't work,
2198 # because the int type gets first dibs.)
2199 self.assertEqual(repr(hexint(7) + 9), "0x10")
2200 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2201 a = hexint(12345)
2202 self.assertEqual(a, 12345)
2203 self.assertEqual(int(a), 12345)
2204 self.assert_(int(a).__class__ is int)
2205 self.assertEqual(hash(a), hash(12345))
2206 self.assert_((+a).__class__ is int)
2207 self.assert_((a >> 0).__class__ is int)
2208 self.assert_((a << 0).__class__ is int)
2209 self.assert_((hexint(0) << 12).__class__ is int)
2210 self.assert_((hexint(0) >> 12).__class__ is int)
2211
2212 class octlong(int):
2213 __slots__ = []
2214 def __str__(self):
2215 s = oct(self)
2216 if s[-1] == 'L':
2217 s = s[:-1]
2218 return s
2219 def __add__(self, other):
2220 return self.__class__(super(octlong, self).__add__(other))
2221 __radd__ = __add__
2222 self.assertEqual(str(octlong(3) + 5), "0o10")
2223 # (Note that overriding __radd__ here only seems to work
2224 # because the example uses a short int left argument.)
2225 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2226 a = octlong(12345)
2227 self.assertEqual(a, 12345)
2228 self.assertEqual(int(a), 12345)
2229 self.assertEqual(hash(a), hash(12345))
2230 self.assert_(int(a).__class__ is int)
2231 self.assert_((+a).__class__ is int)
2232 self.assert_((-a).__class__ is int)
2233 self.assert_((-octlong(0)).__class__ is int)
2234 self.assert_((a >> 0).__class__ is int)
2235 self.assert_((a << 0).__class__ is int)
2236 self.assert_((a - 0).__class__ is int)
2237 self.assert_((a * 1).__class__ is int)
2238 self.assert_((a ** 1).__class__ is int)
2239 self.assert_((a // 1).__class__ is int)
2240 self.assert_((1 * a).__class__ is int)
2241 self.assert_((a | 0).__class__ is int)
2242 self.assert_((a ^ 0).__class__ is int)
2243 self.assert_((a & -1).__class__ is int)
2244 self.assert_((octlong(0) << 12).__class__ is int)
2245 self.assert_((octlong(0) >> 12).__class__ is int)
2246 self.assert_(abs(octlong(0)).__class__ is int)
2247
2248 # Because octlong overrides __add__, we can't check the absence of +0
2249 # optimizations using octlong.
2250 class longclone(int):
2251 pass
2252 a = longclone(1)
2253 self.assert_((a + 0).__class__ is int)
2254 self.assert_((0 + a).__class__ is int)
2255
2256 # Check that negative clones don't segfault
2257 a = longclone(-1)
2258 self.assertEqual(a.__dict__, {})
2259 self.assertEqual(int(a), -1) # self.assert_ PyNumber_Long() copies the sign bit
2260
2261 class precfloat(float):
2262 __slots__ = ['prec']
2263 def __init__(self, value=0.0, prec=12):
2264 self.prec = int(prec)
2265 def __repr__(self):
2266 return "%.*g" % (self.prec, self)
2267 self.assertEqual(repr(precfloat(1.1)), "1.1")
2268 a = precfloat(12345)
2269 self.assertEqual(a, 12345.0)
2270 self.assertEqual(float(a), 12345.0)
2271 self.assert_(float(a).__class__ is float)
2272 self.assertEqual(hash(a), hash(12345.0))
2273 self.assert_((+a).__class__ is float)
2274
2275 class madcomplex(complex):
2276 def __repr__(self):
2277 return "%.17gj%+.17g" % (self.imag, self.real)
2278 a = madcomplex(-3, 4)
2279 self.assertEqual(repr(a), "4j-3")
2280 base = complex(-3, 4)
2281 self.assertEqual(base.__class__, complex)
2282 self.assertEqual(a, base)
2283 self.assertEqual(complex(a), base)
2284 self.assertEqual(complex(a).__class__, complex)
2285 a = madcomplex(a) # just trying another form of the constructor
2286 self.assertEqual(repr(a), "4j-3")
2287 self.assertEqual(a, base)
2288 self.assertEqual(complex(a), base)
2289 self.assertEqual(complex(a).__class__, complex)
2290 self.assertEqual(hash(a), hash(base))
2291 self.assertEqual((+a).__class__, complex)
2292 self.assertEqual((a + 0).__class__, complex)
2293 self.assertEqual(a + 0, base)
2294 self.assertEqual((a - 0).__class__, complex)
2295 self.assertEqual(a - 0, base)
2296 self.assertEqual((a * 1).__class__, complex)
2297 self.assertEqual(a * 1, base)
2298 self.assertEqual((a / 1).__class__, complex)
2299 self.assertEqual(a / 1, base)
2300
2301 class madtuple(tuple):
2302 _rev = None
2303 def rev(self):
2304 if self._rev is not None:
2305 return self._rev
2306 L = list(self)
2307 L.reverse()
2308 self._rev = self.__class__(L)
2309 return self._rev
2310 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2311 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2312 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2313 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2314 for i in range(512):
2315 t = madtuple(range(i))
2316 u = t.rev()
2317 v = u.rev()
2318 self.assertEqual(v, t)
2319 a = madtuple((1,2,3,4,5))
2320 self.assertEqual(tuple(a), (1,2,3,4,5))
2321 self.assert_(tuple(a).__class__ is tuple)
2322 self.assertEqual(hash(a), hash((1,2,3,4,5)))
2323 self.assert_(a[:].__class__ is tuple)
2324 self.assert_((a * 1).__class__ is tuple)
2325 self.assert_((a * 0).__class__ is tuple)
2326 self.assert_((a + ()).__class__ is tuple)
2327 a = madtuple(())
2328 self.assertEqual(tuple(a), ())
2329 self.assert_(tuple(a).__class__ is tuple)
2330 self.assert_((a + a).__class__ is tuple)
2331 self.assert_((a * 0).__class__ is tuple)
2332 self.assert_((a * 1).__class__ is tuple)
2333 self.assert_((a * 2).__class__ is tuple)
2334 self.assert_(a[:].__class__ is tuple)
2335
2336 class madstring(str):
2337 _rev = None
2338 def rev(self):
2339 if self._rev is not None:
2340 return self._rev
2341 L = list(self)
2342 L.reverse()
2343 self._rev = self.__class__("".join(L))
2344 return self._rev
2345 s = madstring("abcdefghijklmnopqrstuvwxyz")
2346 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2347 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2348 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2349 for i in range(256):
2350 s = madstring("".join(map(chr, range(i))))
2351 t = s.rev()
2352 u = t.rev()
2353 self.assertEqual(u, s)
2354 s = madstring("12345")
2355 self.assertEqual(str(s), "12345")
2356 self.assert_(str(s).__class__ is str)
2357
2358 base = "\x00" * 5
2359 s = madstring(base)
2360 self.assertEqual(s, base)
2361 self.assertEqual(str(s), base)
2362 self.assert_(str(s).__class__ is str)
2363 self.assertEqual(hash(s), hash(base))
2364 self.assertEqual({s: 1}[base], 1)
2365 self.assertEqual({base: 1}[s], 1)
2366 self.assert_((s + "").__class__ is str)
2367 self.assertEqual(s + "", base)
2368 self.assert_(("" + s).__class__ is str)
2369 self.assertEqual("" + s, base)
2370 self.assert_((s * 0).__class__ is str)
2371 self.assertEqual(s * 0, "")
2372 self.assert_((s * 1).__class__ is str)
2373 self.assertEqual(s * 1, base)
2374 self.assert_((s * 2).__class__ is str)
2375 self.assertEqual(s * 2, base + base)
2376 self.assert_(s[:].__class__ is str)
2377 self.assertEqual(s[:], base)
2378 self.assert_(s[0:0].__class__ is str)
2379 self.assertEqual(s[0:0], "")
2380 self.assert_(s.strip().__class__ is str)
2381 self.assertEqual(s.strip(), base)
2382 self.assert_(s.lstrip().__class__ is str)
2383 self.assertEqual(s.lstrip(), base)
2384 self.assert_(s.rstrip().__class__ is str)
2385 self.assertEqual(s.rstrip(), base)
2386 identitytab = {}
2387 self.assert_(s.translate(identitytab).__class__ is str)
2388 self.assertEqual(s.translate(identitytab), base)
2389 self.assert_(s.replace("x", "x").__class__ is str)
2390 self.assertEqual(s.replace("x", "x"), base)
2391 self.assert_(s.ljust(len(s)).__class__ is str)
2392 self.assertEqual(s.ljust(len(s)), base)
2393 self.assert_(s.rjust(len(s)).__class__ is str)
2394 self.assertEqual(s.rjust(len(s)), base)
2395 self.assert_(s.center(len(s)).__class__ is str)
2396 self.assertEqual(s.center(len(s)), base)
2397 self.assert_(s.lower().__class__ is str)
2398 self.assertEqual(s.lower(), base)
2399
2400 class madunicode(str):
2401 _rev = None
2402 def rev(self):
2403 if self._rev is not None:
2404 return self._rev
2405 L = list(self)
2406 L.reverse()
2407 self._rev = self.__class__("".join(L))
2408 return self._rev
2409 u = madunicode("ABCDEF")
2410 self.assertEqual(u, "ABCDEF")
2411 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2412 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2413 base = "12345"
2414 u = madunicode(base)
2415 self.assertEqual(str(u), base)
2416 self.assert_(str(u).__class__ is str)
2417 self.assertEqual(hash(u), hash(base))
2418 self.assertEqual({u: 1}[base], 1)
2419 self.assertEqual({base: 1}[u], 1)
2420 self.assert_(u.strip().__class__ is str)
2421 self.assertEqual(u.strip(), base)
2422 self.assert_(u.lstrip().__class__ is str)
2423 self.assertEqual(u.lstrip(), base)
2424 self.assert_(u.rstrip().__class__ is str)
2425 self.assertEqual(u.rstrip(), base)
2426 self.assert_(u.replace("x", "x").__class__ is str)
2427 self.assertEqual(u.replace("x", "x"), base)
2428 self.assert_(u.replace("xy", "xy").__class__ is str)
2429 self.assertEqual(u.replace("xy", "xy"), base)
2430 self.assert_(u.center(len(u)).__class__ is str)
2431 self.assertEqual(u.center(len(u)), base)
2432 self.assert_(u.ljust(len(u)).__class__ is str)
2433 self.assertEqual(u.ljust(len(u)), base)
2434 self.assert_(u.rjust(len(u)).__class__ is str)
2435 self.assertEqual(u.rjust(len(u)), base)
2436 self.assert_(u.lower().__class__ is str)
2437 self.assertEqual(u.lower(), base)
2438 self.assert_(u.upper().__class__ is str)
2439 self.assertEqual(u.upper(), base)
2440 self.assert_(u.capitalize().__class__ is str)
2441 self.assertEqual(u.capitalize(), base)
2442 self.assert_(u.title().__class__ is str)
2443 self.assertEqual(u.title(), base)
2444 self.assert_((u + "").__class__ is str)
2445 self.assertEqual(u + "", base)
2446 self.assert_(("" + u).__class__ is str)
2447 self.assertEqual("" + u, base)
2448 self.assert_((u * 0).__class__ is str)
2449 self.assertEqual(u * 0, "")
2450 self.assert_((u * 1).__class__ is str)
2451 self.assertEqual(u * 1, base)
2452 self.assert_((u * 2).__class__ is str)
2453 self.assertEqual(u * 2, base + base)
2454 self.assert_(u[:].__class__ is str)
2455 self.assertEqual(u[:], base)
2456 self.assert_(u[0:0].__class__ is str)
2457 self.assertEqual(u[0:0], "")
2458
2459 class sublist(list):
2460 pass
2461 a = sublist(range(5))
2462 self.assertEqual(a, list(range(5)))
2463 a.append("hello")
2464 self.assertEqual(a, list(range(5)) + ["hello"])
2465 a[5] = 5
2466 self.assertEqual(a, list(range(6)))
2467 a.extend(range(6, 20))
2468 self.assertEqual(a, list(range(20)))
2469 a[-5:] = []
2470 self.assertEqual(a, list(range(15)))
2471 del a[10:15]
2472 self.assertEqual(len(a), 10)
2473 self.assertEqual(a, list(range(10)))
2474 self.assertEqual(list(a), list(range(10)))
2475 self.assertEqual(a[0], 0)
2476 self.assertEqual(a[9], 9)
2477 self.assertEqual(a[-10], 0)
2478 self.assertEqual(a[-1], 9)
2479 self.assertEqual(a[:5], list(range(5)))
2480
2481 ## class CountedInput(file):
2482 ## """Counts lines read by self.readline().
2483 ##
2484 ## self.lineno is the 0-based ordinal of the last line read, up to
2485 ## a maximum of one greater than the number of lines in the file.
2486 ##
2487 ## self.ateof is true if and only if the final "" line has been read,
2488 ## at which point self.lineno stops incrementing, and further calls
2489 ## to readline() continue to return "".
2490 ## """
2491 ##
2492 ## lineno = 0
2493 ## ateof = 0
2494 ## def readline(self):
2495 ## if self.ateof:
2496 ## return ""
2497 ## s = file.readline(self)
2498 ## # Next line works too.
2499 ## # s = super(CountedInput, self).readline()
2500 ## self.lineno += 1
2501 ## if s == "":
2502 ## self.ateof = 1
2503 ## return s
2504 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002505 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002506 ## lines = ['a\n', 'b\n', 'c\n']
2507 ## try:
2508 ## f.writelines(lines)
2509 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002510 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002511 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2512 ## got = f.readline()
2513 ## self.assertEqual(expected, got)
2514 ## self.assertEqual(f.lineno, i)
2515 ## self.assertEqual(f.ateof, (i > len(lines)))
2516 ## f.close()
2517 ## finally:
2518 ## try:
2519 ## f.close()
2520 ## except:
2521 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002522 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002523
2524 def test_keywords(self):
2525 # Testing keyword args to basic type constructors ...
2526 self.assertEqual(int(x=1), 1)
2527 self.assertEqual(float(x=2), 2.0)
2528 self.assertEqual(int(x=3), 3)
2529 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2530 self.assertEqual(str(object=500), '500')
2531 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2532 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2533 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2534 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2535
2536 for constructor in (int, float, int, complex, str, str,
2537 tuple, list):
2538 try:
2539 constructor(bogus_keyword_arg=1)
2540 except TypeError:
2541 pass
2542 else:
2543 self.fail("expected TypeError from bogus keyword argument to %r"
2544 % constructor)
2545
2546 def test_str_subclass_as_dict_key(self):
2547 # Testing a str subclass used as dict key ..
2548
2549 class cistr(str):
2550 """Sublcass of str that computes __eq__ case-insensitively.
2551
2552 Also computes a hash code of the string in canonical form.
2553 """
2554
2555 def __init__(self, value):
2556 self.canonical = value.lower()
2557 self.hashcode = hash(self.canonical)
2558
2559 def __eq__(self, other):
2560 if not isinstance(other, cistr):
2561 other = cistr(other)
2562 return self.canonical == other.canonical
2563
2564 def __hash__(self):
2565 return self.hashcode
2566
2567 self.assertEqual(cistr('ABC'), 'abc')
2568 self.assertEqual('aBc', cistr('ABC'))
2569 self.assertEqual(str(cistr('ABC')), 'ABC')
2570
2571 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2572 self.assertEqual(d[cistr('one')], 1)
2573 self.assertEqual(d[cistr('tWo')], 2)
2574 self.assertEqual(d[cistr('THrEE')], 3)
2575 self.assert_(cistr('ONe') in d)
2576 self.assertEqual(d.get(cistr('thrEE')), 3)
2577
2578 def test_classic_comparisons(self):
2579 # Testing classic comparisons...
2580 class classic:
2581 pass
2582
2583 for base in (classic, int, object):
2584 class C(base):
2585 def __init__(self, value):
2586 self.value = int(value)
2587 def __eq__(self, other):
2588 if isinstance(other, C):
2589 return self.value == other.value
2590 if isinstance(other, int) or isinstance(other, int):
2591 return self.value == other
2592 return NotImplemented
2593 def __ne__(self, other):
2594 if isinstance(other, C):
2595 return self.value != other.value
2596 if isinstance(other, int) or isinstance(other, int):
2597 return self.value != other
2598 return NotImplemented
2599 def __lt__(self, other):
2600 if isinstance(other, C):
2601 return self.value < other.value
2602 if isinstance(other, int) or isinstance(other, int):
2603 return self.value < other
2604 return NotImplemented
2605 def __le__(self, other):
2606 if isinstance(other, C):
2607 return self.value <= other.value
2608 if isinstance(other, int) or isinstance(other, int):
2609 return self.value <= other
2610 return NotImplemented
2611 def __gt__(self, other):
2612 if isinstance(other, C):
2613 return self.value > other.value
2614 if isinstance(other, int) or isinstance(other, int):
2615 return self.value > other
2616 return NotImplemented
2617 def __ge__(self, other):
2618 if isinstance(other, C):
2619 return self.value >= other.value
2620 if isinstance(other, int) or isinstance(other, int):
2621 return self.value >= other
2622 return NotImplemented
2623
2624 c1 = C(1)
2625 c2 = C(2)
2626 c3 = C(3)
2627 self.assertEqual(c1, 1)
2628 c = {1: c1, 2: c2, 3: c3}
2629 for x in 1, 2, 3:
2630 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002631 for op in "<", "<=", "==", "!=", ">", ">=":
Mark Dickinsona56c4672009-01-27 18:17:45 +00002632 self.assert_(eval("c[x] %s c[y]" % op) ==
2633 eval("x %s y" % op),
2634 "x=%d, y=%d" % (x, y))
2635 self.assert_(eval("c[x] %s y" % op) ==
2636 eval("x %s y" % op),
2637 "x=%d, y=%d" % (x, y))
2638 self.assert_(eval("x %s c[y]" % op) ==
2639 eval("x %s y" % op),
2640 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002641
2642 def test_rich_comparisons(self):
2643 # Testing rich comparisons...
2644 class Z(complex):
2645 pass
2646 z = Z(1)
2647 self.assertEqual(z, 1+0j)
2648 self.assertEqual(1+0j, z)
2649 class ZZ(complex):
2650 def __eq__(self, other):
2651 try:
2652 return abs(self - other) <= 1e-6
2653 except:
2654 return NotImplemented
2655 zz = ZZ(1.0000003)
2656 self.assertEqual(zz, 1+0j)
2657 self.assertEqual(1+0j, zz)
2658
2659 class classic:
2660 pass
2661 for base in (classic, int, object, list):
2662 class C(base):
2663 def __init__(self, value):
2664 self.value = int(value)
2665 def __cmp__(self_, other):
2666 self.fail("shouldn't call __cmp__")
2667 def __eq__(self, other):
2668 if isinstance(other, C):
2669 return self.value == other.value
2670 if isinstance(other, int) or isinstance(other, int):
2671 return self.value == other
2672 return NotImplemented
2673 def __ne__(self, other):
2674 if isinstance(other, C):
2675 return self.value != other.value
2676 if isinstance(other, int) or isinstance(other, int):
2677 return self.value != other
2678 return NotImplemented
2679 def __lt__(self, other):
2680 if isinstance(other, C):
2681 return self.value < other.value
2682 if isinstance(other, int) or isinstance(other, int):
2683 return self.value < other
2684 return NotImplemented
2685 def __le__(self, other):
2686 if isinstance(other, C):
2687 return self.value <= other.value
2688 if isinstance(other, int) or isinstance(other, int):
2689 return self.value <= other
2690 return NotImplemented
2691 def __gt__(self, other):
2692 if isinstance(other, C):
2693 return self.value > other.value
2694 if isinstance(other, int) or isinstance(other, int):
2695 return self.value > other
2696 return NotImplemented
2697 def __ge__(self, other):
2698 if isinstance(other, C):
2699 return self.value >= other.value
2700 if isinstance(other, int) or isinstance(other, int):
2701 return self.value >= other
2702 return NotImplemented
2703 c1 = C(1)
2704 c2 = C(2)
2705 c3 = C(3)
2706 self.assertEqual(c1, 1)
2707 c = {1: c1, 2: c2, 3: c3}
2708 for x in 1, 2, 3:
2709 for y in 1, 2, 3:
2710 for op in "<", "<=", "==", "!=", ">", ">=":
2711 self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2712 "x=%d, y=%d" % (x, y))
2713 self.assert_(eval("c[x] %s y" % op) == eval("x %s y" % op),
2714 "x=%d, y=%d" % (x, y))
2715 self.assert_(eval("x %s c[y]" % op) == eval("x %s y" % op),
2716 "x=%d, y=%d" % (x, y))
2717
2718 def test_descrdoc(self):
2719 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002720 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002721 def check(descr, what):
2722 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002723 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002724 check(complex.real, "the real part of a complex number") # member descriptor
2725
2726 def test_doc_descriptor(self):
2727 # Testing __doc__ descriptor...
2728 # SF bug 542984
2729 class DocDescr(object):
2730 def __get__(self, object, otype):
2731 if object:
2732 object = object.__class__.__name__ + ' instance'
2733 if otype:
2734 otype = otype.__name__
2735 return 'object=%s; type=%s' % (object, otype)
2736 class OldClass:
2737 __doc__ = DocDescr()
2738 class NewClass(object):
2739 __doc__ = DocDescr()
2740 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2741 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2742 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2743 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2744
2745 def test_set_class(self):
2746 # Testing __class__ assignment...
2747 class C(object): pass
2748 class D(object): pass
2749 class E(object): pass
2750 class F(D, E): pass
2751 for cls in C, D, E, F:
2752 for cls2 in C, D, E, F:
2753 x = cls()
2754 x.__class__ = cls2
2755 self.assert_(x.__class__ is cls2)
2756 x.__class__ = cls
2757 self.assert_(x.__class__ is cls)
2758 def cant(x, C):
2759 try:
2760 x.__class__ = C
2761 except TypeError:
2762 pass
2763 else:
2764 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2765 try:
2766 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002767 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002768 pass
2769 else:
2770 self.fail("shouldn't allow del %r.__class__" % x)
2771 cant(C(), list)
2772 cant(list(), C)
2773 cant(C(), 1)
2774 cant(C(), object)
2775 cant(object(), list)
2776 cant(list(), object)
2777 class Int(int): __slots__ = []
2778 cant(2, Int)
2779 cant(Int(), int)
2780 cant(True, int)
2781 cant(2, bool)
2782 o = object()
2783 cant(o, type(1))
2784 cant(o, type(None))
2785 del o
2786 class G(object):
2787 __slots__ = ["a", "b"]
2788 class H(object):
2789 __slots__ = ["b", "a"]
2790 class I(object):
2791 __slots__ = ["a", "b"]
2792 class J(object):
2793 __slots__ = ["c", "b"]
2794 class K(object):
2795 __slots__ = ["a", "b", "d"]
2796 class L(H):
2797 __slots__ = ["e"]
2798 class M(I):
2799 __slots__ = ["e"]
2800 class N(J):
2801 __slots__ = ["__weakref__"]
2802 class P(J):
2803 __slots__ = ["__dict__"]
2804 class Q(J):
2805 pass
2806 class R(J):
2807 __slots__ = ["__dict__", "__weakref__"]
2808
2809 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2810 x = cls()
2811 x.a = 1
2812 x.__class__ = cls2
2813 self.assert_(x.__class__ is cls2,
2814 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2815 self.assertEqual(x.a, 1)
2816 x.__class__ = cls
2817 self.assert_(x.__class__ is cls,
2818 "assigning %r as __class__ for %r silently failed" % (cls, x))
2819 self.assertEqual(x.a, 1)
2820 for cls in G, J, K, L, M, N, P, R, list, Int:
2821 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2822 if cls is cls2:
2823 continue
2824 cant(cls(), cls2)
2825
Benjamin Peterson193152c2009-04-25 01:08:45 +00002826 # Issue5283: when __class__ changes in __del__, the wrong
2827 # type gets DECREF'd.
2828 class O(object):
2829 pass
2830 class A(object):
2831 def __del__(self):
2832 self.__class__ = O
2833 l = [A() for x in range(100)]
2834 del l
2835
Georg Brandl479a7e72008-02-05 18:13:15 +00002836 def test_set_dict(self):
2837 # Testing __dict__ assignment...
2838 class C(object): pass
2839 a = C()
2840 a.__dict__ = {'b': 1}
2841 self.assertEqual(a.b, 1)
2842 def cant(x, dict):
2843 try:
2844 x.__dict__ = dict
2845 except (AttributeError, TypeError):
2846 pass
2847 else:
2848 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2849 cant(a, None)
2850 cant(a, [])
2851 cant(a, 1)
2852 del a.__dict__ # Deleting __dict__ is allowed
2853
2854 class Base(object):
2855 pass
2856 def verify_dict_readonly(x):
2857 """
2858 x has to be an instance of a class inheriting from Base.
2859 """
2860 cant(x, {})
2861 try:
2862 del x.__dict__
2863 except (AttributeError, TypeError):
2864 pass
2865 else:
2866 self.fail("shouldn't allow del %r.__dict__" % x)
2867 dict_descr = Base.__dict__["__dict__"]
2868 try:
2869 dict_descr.__set__(x, {})
2870 except (AttributeError, TypeError):
2871 pass
2872 else:
2873 self.fail("dict_descr allowed access to %r's dict" % x)
2874
2875 # Classes don't allow __dict__ assignment and have readonly dicts
2876 class Meta1(type, Base):
2877 pass
2878 class Meta2(Base, type):
2879 pass
2880 class D(object, metaclass=Meta1):
2881 pass
2882 class E(object, metaclass=Meta2):
2883 pass
2884 for cls in C, D, E:
2885 verify_dict_readonly(cls)
2886 class_dict = cls.__dict__
2887 try:
2888 class_dict["spam"] = "eggs"
2889 except TypeError:
2890 pass
2891 else:
2892 self.fail("%r's __dict__ can be modified" % cls)
2893
2894 # Modules also disallow __dict__ assignment
2895 class Module1(types.ModuleType, Base):
2896 pass
2897 class Module2(Base, types.ModuleType):
2898 pass
2899 for ModuleType in Module1, Module2:
2900 mod = ModuleType("spam")
2901 verify_dict_readonly(mod)
2902 mod.__dict__["spam"] = "eggs"
2903
2904 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002905 # (at least not any more than regular exception's __dict__ can
2906 # be deleted; on CPython it is not the case, whereas on PyPy they
2907 # can, just like any other new-style instance's __dict__.)
2908 def can_delete_dict(e):
2909 try:
2910 del e.__dict__
2911 except (TypeError, AttributeError):
2912 return False
2913 else:
2914 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002915 class Exception1(Exception, Base):
2916 pass
2917 class Exception2(Base, Exception):
2918 pass
2919 for ExceptionType in Exception, Exception1, Exception2:
2920 e = ExceptionType()
2921 e.__dict__ = {"a": 1}
2922 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002923 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002924
2925 def test_pickles(self):
2926 # Testing pickling and copying new-style classes and objects...
2927 import pickle
2928
2929 def sorteditems(d):
2930 L = list(d.items())
2931 L.sort()
2932 return L
2933
2934 global C
2935 class C(object):
2936 def __init__(self, a, b):
2937 super(C, self).__init__()
2938 self.a = a
2939 self.b = b
2940 def __repr__(self):
2941 return "C(%r, %r)" % (self.a, self.b)
2942
2943 global C1
2944 class C1(list):
2945 def __new__(cls, a, b):
2946 return super(C1, cls).__new__(cls)
2947 def __getnewargs__(self):
2948 return (self.a, self.b)
2949 def __init__(self, a, b):
2950 self.a = a
2951 self.b = b
2952 def __repr__(self):
2953 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2954
2955 global C2
2956 class C2(int):
2957 def __new__(cls, a, b, val=0):
2958 return super(C2, cls).__new__(cls, val)
2959 def __getnewargs__(self):
2960 return (self.a, self.b, int(self))
2961 def __init__(self, a, b, val=0):
2962 self.a = a
2963 self.b = b
2964 def __repr__(self):
2965 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2966
2967 global C3
2968 class C3(object):
2969 def __init__(self, foo):
2970 self.foo = foo
2971 def __getstate__(self):
2972 return self.foo
2973 def __setstate__(self, foo):
2974 self.foo = foo
2975
2976 global C4classic, C4
2977 class C4classic: # classic
2978 pass
2979 class C4(C4classic, object): # mixed inheritance
2980 pass
2981
Guido van Rossum3926a632001-09-25 16:25:58 +00002982 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00002983 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00002984 s = pickle.dumps(cls, bin)
2985 cls2 = pickle.loads(s)
2986 self.assert_(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00002987
2988 a = C1(1, 2); a.append(42); a.append(24)
2989 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00002990 s = pickle.dumps((a, b), bin)
2991 x, y = pickle.loads(s)
2992 self.assertEqual(x.__class__, a.__class__)
2993 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
2994 self.assertEqual(y.__class__, b.__class__)
2995 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
2996 self.assertEqual(repr(x), repr(a))
2997 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002998 # Test for __getstate__ and __setstate__ on new style class
2999 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003000 s = pickle.dumps(u, bin)
3001 v = pickle.loads(s)
3002 self.assertEqual(u.__class__, v.__class__)
3003 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003004 # Test for picklability of hybrid class
3005 u = C4()
3006 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003007 s = pickle.dumps(u, bin)
3008 v = pickle.loads(s)
3009 self.assertEqual(u.__class__, v.__class__)
3010 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003011
Georg Brandl479a7e72008-02-05 18:13:15 +00003012 # Testing copy.deepcopy()
3013 import copy
3014 for cls in C, C1, C2:
3015 cls2 = copy.deepcopy(cls)
3016 self.assert_(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003017
Georg Brandl479a7e72008-02-05 18:13:15 +00003018 a = C1(1, 2); a.append(42); a.append(24)
3019 b = C2("hello", "world", 42)
3020 x, y = copy.deepcopy((a, b))
3021 self.assertEqual(x.__class__, a.__class__)
3022 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3023 self.assertEqual(y.__class__, b.__class__)
3024 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3025 self.assertEqual(repr(x), repr(a))
3026 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003027
Georg Brandl479a7e72008-02-05 18:13:15 +00003028 def test_pickle_slots(self):
3029 # Testing pickling of classes with __slots__ ...
3030 import pickle
3031 # Pickling of classes with __slots__ but without __getstate__ should fail
3032 # (if using protocol 0 or 1)
3033 global B, C, D, E
3034 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003035 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003036 for base in [object, B]:
3037 class C(base):
3038 __slots__ = ['a']
3039 class D(C):
3040 pass
3041 try:
3042 pickle.dumps(C(), 0)
3043 except TypeError:
3044 pass
3045 else:
3046 self.fail("should fail: pickle C instance - %s" % base)
3047 try:
3048 pickle.dumps(C(), 0)
3049 except TypeError:
3050 pass
3051 else:
3052 self.fail("should fail: pickle D instance - %s" % base)
3053 # Give C a nice generic __getstate__ and __setstate__
3054 class C(base):
3055 __slots__ = ['a']
3056 def __getstate__(self):
3057 try:
3058 d = self.__dict__.copy()
3059 except AttributeError:
3060 d = {}
3061 for cls in self.__class__.__mro__:
3062 for sn in cls.__dict__.get('__slots__', ()):
3063 try:
3064 d[sn] = getattr(self, sn)
3065 except AttributeError:
3066 pass
3067 return d
3068 def __setstate__(self, d):
3069 for k, v in list(d.items()):
3070 setattr(self, k, v)
3071 class D(C):
3072 pass
3073 # Now it should work
3074 x = C()
3075 y = pickle.loads(pickle.dumps(x))
3076 self.assertEqual(hasattr(y, 'a'), 0)
3077 x.a = 42
3078 y = pickle.loads(pickle.dumps(x))
3079 self.assertEqual(y.a, 42)
3080 x = D()
3081 x.a = 42
3082 x.b = 100
3083 y = pickle.loads(pickle.dumps(x))
3084 self.assertEqual(y.a + y.b, 142)
3085 # A subclass that adds a slot should also work
3086 class E(C):
3087 __slots__ = ['b']
3088 x = E()
3089 x.a = 42
3090 x.b = "foo"
3091 y = pickle.loads(pickle.dumps(x))
3092 self.assertEqual(y.a, x.a)
3093 self.assertEqual(y.b, x.b)
3094
3095 def test_binary_operator_override(self):
3096 # Testing overrides of binary operations...
3097 class I(int):
3098 def __repr__(self):
3099 return "I(%r)" % int(self)
3100 def __add__(self, other):
3101 return I(int(self) + int(other))
3102 __radd__ = __add__
3103 def __pow__(self, other, mod=None):
3104 if mod is None:
3105 return I(pow(int(self), int(other)))
3106 else:
3107 return I(pow(int(self), int(other), int(mod)))
3108 def __rpow__(self, other, mod=None):
3109 if mod is None:
3110 return I(pow(int(other), int(self), mod))
3111 else:
3112 return I(pow(int(other), int(self), int(mod)))
3113
3114 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3115 self.assertEqual(repr(I(1) + 2), "I(3)")
3116 self.assertEqual(repr(1 + I(2)), "I(3)")
3117 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3118 self.assertEqual(repr(2 ** I(3)), "I(8)")
3119 self.assertEqual(repr(I(2) ** 3), "I(8)")
3120 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3121 class S(str):
3122 def __eq__(self, other):
3123 return self.lower() == other.lower()
3124
3125 def test_subclass_propagation(self):
3126 # Testing propagation of slot functions to subclasses...
3127 class A(object):
3128 pass
3129 class B(A):
3130 pass
3131 class C(A):
3132 pass
3133 class D(B, C):
3134 pass
3135 d = D()
3136 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3137 A.__hash__ = lambda self: 42
3138 self.assertEqual(hash(d), 42)
3139 C.__hash__ = lambda self: 314
3140 self.assertEqual(hash(d), 314)
3141 B.__hash__ = lambda self: 144
3142 self.assertEqual(hash(d), 144)
3143 D.__hash__ = lambda self: 100
3144 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003145 D.__hash__ = None
3146 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003147 del D.__hash__
3148 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003149 B.__hash__ = None
3150 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003151 del B.__hash__
3152 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003153 C.__hash__ = None
3154 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003155 del C.__hash__
3156 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003157 A.__hash__ = None
3158 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003159 del A.__hash__
3160 self.assertEqual(hash(d), orig_hash)
3161 d.foo = 42
3162 d.bar = 42
3163 self.assertEqual(d.foo, 42)
3164 self.assertEqual(d.bar, 42)
3165 def __getattribute__(self, name):
3166 if name == "foo":
3167 return 24
3168 return object.__getattribute__(self, name)
3169 A.__getattribute__ = __getattribute__
3170 self.assertEqual(d.foo, 24)
3171 self.assertEqual(d.bar, 42)
3172 def __getattr__(self, name):
3173 if name in ("spam", "foo", "bar"):
3174 return "hello"
3175 raise AttributeError(name)
3176 B.__getattr__ = __getattr__
3177 self.assertEqual(d.spam, "hello")
3178 self.assertEqual(d.foo, 24)
3179 self.assertEqual(d.bar, 42)
3180 del A.__getattribute__
3181 self.assertEqual(d.foo, 42)
3182 del d.foo
3183 self.assertEqual(d.foo, "hello")
3184 self.assertEqual(d.bar, 42)
3185 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003186 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003187 d.foo
3188 except AttributeError:
3189 pass
3190 else:
3191 self.fail("d.foo should be undefined now")
3192
3193 # Test a nasty bug in recurse_down_subclasses()
3194 import gc
3195 class A(object):
3196 pass
3197 class B(A):
3198 pass
3199 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003200 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003201 A.__setitem__ = lambda *a: None # crash
3202
3203 def test_buffer_inheritance(self):
3204 # Testing that buffer interface is inherited ...
3205
3206 import binascii
3207 # SF bug [#470040] ParseTuple t# vs subclasses.
3208
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003209 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003210 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003211 base = b'abc'
3212 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003213 # b2a_hex uses the buffer interface to get its argument's value, via
3214 # PyArg_ParseTuple 't#' code.
3215 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3216
Georg Brandl479a7e72008-02-05 18:13:15 +00003217 class MyInt(int):
3218 pass
3219 m = MyInt(42)
3220 try:
3221 binascii.b2a_hex(m)
3222 self.fail('subclass of int should not have a buffer interface')
3223 except TypeError:
3224 pass
3225
3226 def test_str_of_str_subclass(self):
3227 # Testing __str__ defined in subclass of str ...
3228 import binascii
3229 import io
3230
3231 class octetstring(str):
3232 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003233 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003234 def __repr__(self):
3235 return self + " repr"
3236
3237 o = octetstring('A')
3238 self.assertEqual(type(o), octetstring)
3239 self.assertEqual(type(str(o)), str)
3240 self.assertEqual(type(repr(o)), str)
3241 self.assertEqual(ord(o), 0x41)
3242 self.assertEqual(str(o), '41')
3243 self.assertEqual(repr(o), 'A repr')
3244 self.assertEqual(o.__str__(), '41')
3245 self.assertEqual(o.__repr__(), 'A repr')
3246
3247 capture = io.StringIO()
3248 # Calling str() or not exercises different internal paths.
3249 print(o, file=capture)
3250 print(str(o), file=capture)
3251 self.assertEqual(capture.getvalue(), '41\n41\n')
3252 capture.close()
3253
3254 def test_keyword_arguments(self):
3255 # Testing keyword arguments to __init__, __call__...
3256 def f(a): return a
3257 self.assertEqual(f.__call__(a=42), 42)
3258 a = []
3259 list.__init__(a, sequence=[0, 1, 2])
3260 self.assertEqual(a, [0, 1, 2])
3261
3262 def test_recursive_call(self):
3263 # Testing recursive __call__() by setting to instance of class...
3264 class A(object):
3265 pass
3266
3267 A.__call__ = A()
3268 try:
3269 A()()
3270 except RuntimeError:
3271 pass
3272 else:
3273 self.fail("Recursion limit should have been reached for __call__()")
3274
3275 def test_delete_hook(self):
3276 # Testing __del__ hook...
3277 log = []
3278 class C(object):
3279 def __del__(self):
3280 log.append(1)
3281 c = C()
3282 self.assertEqual(log, [])
3283 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003284 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003285 self.assertEqual(log, [1])
3286
3287 class D(object): pass
3288 d = D()
3289 try: del d[0]
3290 except TypeError: pass
3291 else: self.fail("invalid del() didn't raise TypeError")
3292
3293 def test_hash_inheritance(self):
3294 # Testing hash of mutable subclasses...
3295
3296 class mydict(dict):
3297 pass
3298 d = mydict()
3299 try:
3300 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003301 except TypeError:
3302 pass
3303 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003304 self.fail("hash() of dict subclass should fail")
3305
3306 class mylist(list):
3307 pass
3308 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003309 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003310 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003311 except TypeError:
3312 pass
3313 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003314 self.fail("hash() of list subclass should fail")
3315
3316 def test_str_operations(self):
3317 try: 'a' + 5
3318 except TypeError: pass
3319 else: self.fail("'' + 5 doesn't raise TypeError")
3320
3321 try: ''.split('')
3322 except ValueError: pass
3323 else: self.fail("''.split('') doesn't raise ValueError")
3324
3325 try: ''.join([0])
3326 except TypeError: pass
3327 else: self.fail("''.join([0]) doesn't raise TypeError")
3328
3329 try: ''.rindex('5')
3330 except ValueError: pass
3331 else: self.fail("''.rindex('5') doesn't raise ValueError")
3332
3333 try: '%(n)s' % None
3334 except TypeError: pass
3335 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3336
3337 try: '%(n' % {}
3338 except ValueError: pass
3339 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3340
3341 try: '%*s' % ('abc')
3342 except TypeError: pass
3343 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3344
3345 try: '%*.*s' % ('abc', 5)
3346 except TypeError: pass
3347 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3348
3349 try: '%s' % (1, 2)
3350 except TypeError: pass
3351 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3352
3353 try: '%' % None
3354 except ValueError: pass
3355 else: self.fail("'%' % None doesn't raise ValueError")
3356
3357 self.assertEqual('534253'.isdigit(), 1)
3358 self.assertEqual('534253x'.isdigit(), 0)
3359 self.assertEqual('%c' % 5, '\x05')
3360 self.assertEqual('%c' % '5', '5')
3361
3362 def test_deepcopy_recursive(self):
3363 # Testing deepcopy of recursive objects...
3364 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003365 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003366 a = Node()
3367 b = Node()
3368 a.b = b
3369 b.a = a
3370 z = deepcopy(a) # This blew up before
3371
3372 def test_unintialized_modules(self):
3373 # Testing uninitialized module objects...
3374 from types import ModuleType as M
3375 m = M.__new__(M)
3376 str(m)
3377 self.assertEqual(hasattr(m, "__name__"), 0)
3378 self.assertEqual(hasattr(m, "__file__"), 0)
3379 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003380 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003381 m.foo = 1
3382 self.assertEqual(m.__dict__, {"foo": 1})
3383
3384 def test_funny_new(self):
3385 # Testing __new__ returning something unexpected...
3386 class C(object):
3387 def __new__(cls, arg):
3388 if isinstance(arg, str): return [1, 2, 3]
3389 elif isinstance(arg, int): return object.__new__(D)
3390 else: return object.__new__(cls)
3391 class D(C):
3392 def __init__(self, arg):
3393 self.foo = arg
3394 self.assertEqual(C("1"), [1, 2, 3])
3395 self.assertEqual(D("1"), [1, 2, 3])
3396 d = D(None)
3397 self.assertEqual(d.foo, None)
3398 d = C(1)
3399 self.assertEqual(isinstance(d, D), True)
3400 self.assertEqual(d.foo, 1)
3401 d = D(1)
3402 self.assertEqual(isinstance(d, D), True)
3403 self.assertEqual(d.foo, 1)
3404
3405 def test_imul_bug(self):
3406 # Testing for __imul__ problems...
3407 # SF bug 544647
3408 class C(object):
3409 def __imul__(self, other):
3410 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003411 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003412 y = x
3413 y *= 1.0
3414 self.assertEqual(y, (x, 1.0))
3415 y = x
3416 y *= 2
3417 self.assertEqual(y, (x, 2))
3418 y = x
3419 y *= 3
3420 self.assertEqual(y, (x, 3))
3421 y = x
3422 y *= 1<<100
3423 self.assertEqual(y, (x, 1<<100))
3424 y = x
3425 y *= None
3426 self.assertEqual(y, (x, None))
3427 y = x
3428 y *= "foo"
3429 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003430
Georg Brandl479a7e72008-02-05 18:13:15 +00003431 def test_copy_setstate(self):
3432 # Testing that copy.*copy() correctly uses __setstate__...
3433 import copy
3434 class C(object):
3435 def __init__(self, foo=None):
3436 self.foo = foo
3437 self.__foo = foo
3438 def setfoo(self, foo=None):
3439 self.foo = foo
3440 def getfoo(self):
3441 return self.__foo
3442 def __getstate__(self):
3443 return [self.foo]
3444 def __setstate__(self_, lst):
3445 self.assertEqual(len(lst), 1)
3446 self_.__foo = self_.foo = lst[0]
3447 a = C(42)
3448 a.setfoo(24)
3449 self.assertEqual(a.foo, 24)
3450 self.assertEqual(a.getfoo(), 42)
3451 b = copy.copy(a)
3452 self.assertEqual(b.foo, 24)
3453 self.assertEqual(b.getfoo(), 24)
3454 b = copy.deepcopy(a)
3455 self.assertEqual(b.foo, 24)
3456 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003457
Georg Brandl479a7e72008-02-05 18:13:15 +00003458 def test_slices(self):
3459 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003460
Georg Brandl479a7e72008-02-05 18:13:15 +00003461 # Strings
3462 self.assertEqual("hello"[:4], "hell")
3463 self.assertEqual("hello"[slice(4)], "hell")
3464 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3465 class S(str):
3466 def __getitem__(self, x):
3467 return str.__getitem__(self, x)
3468 self.assertEqual(S("hello")[:4], "hell")
3469 self.assertEqual(S("hello")[slice(4)], "hell")
3470 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3471 # Tuples
3472 self.assertEqual((1,2,3)[:2], (1,2))
3473 self.assertEqual((1,2,3)[slice(2)], (1,2))
3474 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3475 class T(tuple):
3476 def __getitem__(self, x):
3477 return tuple.__getitem__(self, x)
3478 self.assertEqual(T((1,2,3))[:2], (1,2))
3479 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3480 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3481 # Lists
3482 self.assertEqual([1,2,3][:2], [1,2])
3483 self.assertEqual([1,2,3][slice(2)], [1,2])
3484 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3485 class L(list):
3486 def __getitem__(self, x):
3487 return list.__getitem__(self, x)
3488 self.assertEqual(L([1,2,3])[:2], [1,2])
3489 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3490 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3491 # Now do lists and __setitem__
3492 a = L([1,2,3])
3493 a[slice(1, 3)] = [3,2]
3494 self.assertEqual(a, [1,3,2])
3495 a[slice(0, 2, 1)] = [3,1]
3496 self.assertEqual(a, [3,1,2])
3497 a.__setitem__(slice(1, 3), [2,1])
3498 self.assertEqual(a, [3,2,1])
3499 a.__setitem__(slice(0, 2, 1), [2,3])
3500 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003501
Georg Brandl479a7e72008-02-05 18:13:15 +00003502 def test_subtype_resurrection(self):
3503 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003504
Georg Brandl479a7e72008-02-05 18:13:15 +00003505 class C(object):
3506 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003507
Georg Brandl479a7e72008-02-05 18:13:15 +00003508 def __del__(self):
3509 # resurrect the instance
3510 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003511
Georg Brandl479a7e72008-02-05 18:13:15 +00003512 c = C()
3513 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003514
Benjamin Petersone549ead2009-03-28 21:42:05 +00003515 # The most interesting thing here is whether this blows up, due to
3516 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3517 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003518 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003519
Georg Brandl479a7e72008-02-05 18:13:15 +00003520 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003521 # the last container slot works: that will attempt to delete c again,
3522 # which will cause c to get appended back to the container again
3523 # "during" the del. (On non-CPython implementations, however, __del__
3524 # is typically not called again.)
3525 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003526 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003527 del C.container[-1]
3528 if support.check_impl_detail():
3529 support.gc_collect()
3530 self.assertEqual(len(C.container), 1)
3531 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003532
Georg Brandl479a7e72008-02-05 18:13:15 +00003533 # Make c mortal again, so that the test framework with -l doesn't report
3534 # it as a leak.
3535 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003536
Georg Brandl479a7e72008-02-05 18:13:15 +00003537 def test_slots_trash(self):
3538 # Testing slot trash...
3539 # Deallocating deeply nested slotted trash caused stack overflows
3540 class trash(object):
3541 __slots__ = ['x']
3542 def __init__(self, x):
3543 self.x = x
3544 o = None
3545 for i in range(50000):
3546 o = trash(o)
3547 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003548
Georg Brandl479a7e72008-02-05 18:13:15 +00003549 def test_slots_multiple_inheritance(self):
3550 # SF bug 575229, multiple inheritance w/ slots dumps core
3551 class A(object):
3552 __slots__=()
3553 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003554 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003555 class C(A,B) :
3556 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003557 if support.check_impl_detail():
3558 self.assertEqual(C.__basicsize__, B.__basicsize__)
Georg Brandl479a7e72008-02-05 18:13:15 +00003559 self.assert_(hasattr(C, '__dict__'))
3560 self.assert_(hasattr(C, '__weakref__'))
3561 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003562
Georg Brandl479a7e72008-02-05 18:13:15 +00003563 def test_rmul(self):
3564 # Testing correct invocation of __rmul__...
3565 # SF patch 592646
3566 class C(object):
3567 def __mul__(self, other):
3568 return "mul"
3569 def __rmul__(self, other):
3570 return "rmul"
3571 a = C()
3572 self.assertEqual(a*2, "mul")
3573 self.assertEqual(a*2.2, "mul")
3574 self.assertEqual(2*a, "rmul")
3575 self.assertEqual(2.2*a, "rmul")
3576
3577 def test_ipow(self):
3578 # Testing correct invocation of __ipow__...
3579 # [SF bug 620179]
3580 class C(object):
3581 def __ipow__(self, other):
3582 pass
3583 a = C()
3584 a **= 2
3585
3586 def test_mutable_bases(self):
3587 # Testing mutable bases...
3588
3589 # stuff that should work:
3590 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003591 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003592 class C2(object):
3593 def __getattribute__(self, attr):
3594 if attr == 'a':
3595 return 2
3596 else:
3597 return super(C2, self).__getattribute__(attr)
3598 def meth(self):
3599 return 1
3600 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003601 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003602 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003603 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003604 d = D()
3605 e = E()
3606 D.__bases__ = (C,)
3607 D.__bases__ = (C2,)
3608 self.assertEqual(d.meth(), 1)
3609 self.assertEqual(e.meth(), 1)
3610 self.assertEqual(d.a, 2)
3611 self.assertEqual(e.a, 2)
3612 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003613
Georg Brandl479a7e72008-02-05 18:13:15 +00003614 try:
3615 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003616 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003617 pass
3618 else:
3619 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003620
Georg Brandl479a7e72008-02-05 18:13:15 +00003621 try:
3622 D.__bases__ = ()
3623 except TypeError as msg:
3624 if str(msg) == "a new-style class can't have only classic bases":
3625 self.fail("wrong error message for .__bases__ = ()")
3626 else:
3627 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003628
Georg Brandl479a7e72008-02-05 18:13:15 +00003629 try:
3630 D.__bases__ = (D,)
3631 except TypeError:
3632 pass
3633 else:
3634 # actually, we'll have crashed by here...
3635 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003636
Georg Brandl479a7e72008-02-05 18:13:15 +00003637 try:
3638 D.__bases__ = (C, C)
3639 except TypeError:
3640 pass
3641 else:
3642 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003643
Georg Brandl479a7e72008-02-05 18:13:15 +00003644 try:
3645 D.__bases__ = (E,)
3646 except TypeError:
3647 pass
3648 else:
3649 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003650
Benjamin Petersonae937c02009-04-18 20:54:08 +00003651 def test_builtin_bases(self):
3652 # Make sure all the builtin types can have their base queried without
3653 # segfaulting. See issue #5787.
3654 builtin_types = [tp for tp in builtins.__dict__.values()
3655 if isinstance(tp, type)]
3656 for tp in builtin_types:
3657 object.__getattribute__(tp, "__bases__")
3658 if tp is not object:
3659 self.assertEqual(len(tp.__bases__), 1, tp)
3660
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003661 class L(list):
3662 pass
3663
3664 class C(object):
3665 pass
3666
3667 class D(C):
3668 pass
3669
3670 try:
3671 L.__bases__ = (dict,)
3672 except TypeError:
3673 pass
3674 else:
3675 self.fail("shouldn't turn list subclass into dict subclass")
3676
3677 try:
3678 list.__bases__ = (dict,)
3679 except TypeError:
3680 pass
3681 else:
3682 self.fail("shouldn't be able to assign to list.__bases__")
3683
3684 try:
3685 D.__bases__ = (C, list)
3686 except TypeError:
3687 pass
3688 else:
3689 assert 0, "best_base calculation found wanting"
3690
Benjamin Petersonae937c02009-04-18 20:54:08 +00003691
Georg Brandl479a7e72008-02-05 18:13:15 +00003692 def test_mutable_bases_with_failing_mro(self):
3693 # Testing mutable bases with failing mro...
3694 class WorkOnce(type):
3695 def __new__(self, name, bases, ns):
3696 self.flag = 0
3697 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3698 def mro(self):
3699 if self.flag > 0:
3700 raise RuntimeError("bozo")
3701 else:
3702 self.flag += 1
3703 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003704
Georg Brandl479a7e72008-02-05 18:13:15 +00003705 class WorkAlways(type):
3706 def mro(self):
3707 # this is here to make sure that .mro()s aren't called
3708 # with an exception set (which was possible at one point).
3709 # An error message will be printed in a debug build.
3710 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003711 return type.mro(self)
3712
Georg Brandl479a7e72008-02-05 18:13:15 +00003713 class C(object):
3714 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003715
Georg Brandl479a7e72008-02-05 18:13:15 +00003716 class C2(object):
3717 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003718
Georg Brandl479a7e72008-02-05 18:13:15 +00003719 class D(C):
3720 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003721
Georg Brandl479a7e72008-02-05 18:13:15 +00003722 class E(D):
3723 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003724
Georg Brandl479a7e72008-02-05 18:13:15 +00003725 class F(D, metaclass=WorkOnce):
3726 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003727
Georg Brandl479a7e72008-02-05 18:13:15 +00003728 class G(D, metaclass=WorkAlways):
3729 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003730
Georg Brandl479a7e72008-02-05 18:13:15 +00003731 # Immediate subclasses have their mro's adjusted in alphabetical
3732 # order, so E's will get adjusted before adjusting F's fails. We
3733 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003734
Georg Brandl479a7e72008-02-05 18:13:15 +00003735 E_mro_before = E.__mro__
3736 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003737
Armin Rigofd163f92005-12-29 15:59:19 +00003738 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003739 D.__bases__ = (C2,)
3740 except RuntimeError:
3741 self.assertEqual(E.__mro__, E_mro_before)
3742 self.assertEqual(D.__mro__, D_mro_before)
3743 else:
3744 self.fail("exception not propagated")
3745
3746 def test_mutable_bases_catch_mro_conflict(self):
3747 # Testing mutable bases catch mro conflict...
3748 class A(object):
3749 pass
3750
3751 class B(object):
3752 pass
3753
3754 class C(A, B):
3755 pass
3756
3757 class D(A, B):
3758 pass
3759
3760 class E(C, D):
3761 pass
3762
3763 try:
3764 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003765 except TypeError:
3766 pass
3767 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003768 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003769
Georg Brandl479a7e72008-02-05 18:13:15 +00003770 def test_mutable_names(self):
3771 # Testing mutable names...
3772 class C(object):
3773 pass
3774
3775 # C.__module__ could be 'test_descr' or '__main__'
3776 mod = C.__module__
3777
3778 C.__name__ = 'D'
3779 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3780
3781 C.__name__ = 'D.E'
3782 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3783
3784 def test_subclass_right_op(self):
3785 # Testing correct dispatch of subclass overloading __r<op>__...
3786
3787 # This code tests various cases where right-dispatch of a subclass
3788 # should be preferred over left-dispatch of a base class.
3789
3790 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3791
3792 class B(int):
3793 def __floordiv__(self, other):
3794 return "B.__floordiv__"
3795 def __rfloordiv__(self, other):
3796 return "B.__rfloordiv__"
3797
3798 self.assertEqual(B(1) // 1, "B.__floordiv__")
3799 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3800
3801 # Case 2: subclass of object; this is just the baseline for case 3
3802
3803 class C(object):
3804 def __floordiv__(self, other):
3805 return "C.__floordiv__"
3806 def __rfloordiv__(self, other):
3807 return "C.__rfloordiv__"
3808
3809 self.assertEqual(C() // 1, "C.__floordiv__")
3810 self.assertEqual(1 // C(), "C.__rfloordiv__")
3811
3812 # Case 3: subclass of new-style class; here it gets interesting
3813
3814 class D(C):
3815 def __floordiv__(self, other):
3816 return "D.__floordiv__"
3817 def __rfloordiv__(self, other):
3818 return "D.__rfloordiv__"
3819
3820 self.assertEqual(D() // C(), "D.__floordiv__")
3821 self.assertEqual(C() // D(), "D.__rfloordiv__")
3822
3823 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3824
3825 class E(C):
3826 pass
3827
3828 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3829
3830 self.assertEqual(E() // 1, "C.__floordiv__")
3831 self.assertEqual(1 // E(), "C.__rfloordiv__")
3832 self.assertEqual(E() // C(), "C.__floordiv__")
3833 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3834
Benjamin Petersone549ead2009-03-28 21:42:05 +00003835 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003836 def test_meth_class_get(self):
3837 # Testing __get__ method of METH_CLASS C methods...
3838 # Full coverage of descrobject.c::classmethod_get()
3839
3840 # Baseline
3841 arg = [1, 2, 3]
3842 res = {1: None, 2: None, 3: None}
3843 self.assertEqual(dict.fromkeys(arg), res)
3844 self.assertEqual({}.fromkeys(arg), res)
3845
3846 # Now get the descriptor
3847 descr = dict.__dict__["fromkeys"]
3848
3849 # More baseline using the descriptor directly
3850 self.assertEqual(descr.__get__(None, dict)(arg), res)
3851 self.assertEqual(descr.__get__({})(arg), res)
3852
3853 # Now check various error cases
3854 try:
3855 descr.__get__(None, None)
3856 except TypeError:
3857 pass
3858 else:
3859 self.fail("shouldn't have allowed descr.__get__(None, None)")
3860 try:
3861 descr.__get__(42)
3862 except TypeError:
3863 pass
3864 else:
3865 self.fail("shouldn't have allowed descr.__get__(42)")
3866 try:
3867 descr.__get__(None, 42)
3868 except TypeError:
3869 pass
3870 else:
3871 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3872 try:
3873 descr.__get__(None, int)
3874 except TypeError:
3875 pass
3876 else:
3877 self.fail("shouldn't have allowed descr.__get__(None, int)")
3878
3879 def test_isinst_isclass(self):
3880 # Testing proxy isinstance() and isclass()...
3881 class Proxy(object):
3882 def __init__(self, obj):
3883 self.__obj = obj
3884 def __getattribute__(self, name):
3885 if name.startswith("_Proxy__"):
3886 return object.__getattribute__(self, name)
3887 else:
3888 return getattr(self.__obj, name)
3889 # Test with a classic class
3890 class C:
3891 pass
3892 a = C()
3893 pa = Proxy(a)
3894 self.assert_(isinstance(a, C)) # Baseline
3895 self.assert_(isinstance(pa, C)) # Test
3896 # Test with a classic subclass
3897 class D(C):
3898 pass
3899 a = D()
3900 pa = Proxy(a)
3901 self.assert_(isinstance(a, C)) # Baseline
3902 self.assert_(isinstance(pa, C)) # Test
3903 # Test with a new-style class
3904 class C(object):
3905 pass
3906 a = C()
3907 pa = Proxy(a)
3908 self.assert_(isinstance(a, C)) # Baseline
3909 self.assert_(isinstance(pa, C)) # Test
3910 # Test with a new-style subclass
3911 class D(C):
3912 pass
3913 a = D()
3914 pa = Proxy(a)
3915 self.assert_(isinstance(a, C)) # Baseline
3916 self.assert_(isinstance(pa, C)) # Test
3917
3918 def test_proxy_super(self):
3919 # Testing super() for a proxy object...
3920 class Proxy(object):
3921 def __init__(self, obj):
3922 self.__obj = obj
3923 def __getattribute__(self, name):
3924 if name.startswith("_Proxy__"):
3925 return object.__getattribute__(self, name)
3926 else:
3927 return getattr(self.__obj, name)
3928
3929 class B(object):
3930 def f(self):
3931 return "B.f"
3932
3933 class C(B):
3934 def f(self):
3935 return super(C, self).f() + "->C.f"
3936
3937 obj = C()
3938 p = Proxy(obj)
3939 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3940
3941 def test_carloverre(self):
3942 # Testing prohibition of Carlo Verre's hack...
3943 try:
3944 object.__setattr__(str, "foo", 42)
3945 except TypeError:
3946 pass
3947 else:
3948 self.fail("Carlo Verre __setattr__ suceeded!")
3949 try:
3950 object.__delattr__(str, "lower")
3951 except TypeError:
3952 pass
3953 else:
3954 self.fail("Carlo Verre __delattr__ succeeded!")
3955
3956 def test_weakref_segfault(self):
3957 # Testing weakref segfault...
3958 # SF 742911
3959 import weakref
3960
3961 class Provoker:
3962 def __init__(self, referrent):
3963 self.ref = weakref.ref(referrent)
3964
3965 def __del__(self):
3966 x = self.ref()
3967
3968 class Oops(object):
3969 pass
3970
3971 o = Oops()
3972 o.whatever = Provoker(o)
3973 del o
3974
3975 def test_wrapper_segfault(self):
3976 # SF 927248: deeply nested wrappers could cause stack overflow
3977 f = lambda:None
3978 for i in range(1000000):
3979 f = f.__call__
3980 f = None
3981
3982 def test_file_fault(self):
3983 # Testing sys.stdout is changed in getattr...
3984 import sys
3985 class StdoutGuard:
3986 def __getattr__(self, attr):
3987 sys.stdout = sys.__stdout__
3988 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3989 sys.stdout = StdoutGuard()
3990 try:
3991 print("Oops!")
3992 except RuntimeError:
3993 pass
3994
3995 def test_vicious_descriptor_nonsense(self):
3996 # Testing vicious_descriptor_nonsense...
3997
3998 # A potential segfault spotted by Thomas Wouters in mail to
3999 # python-dev 2003-04-17, turned into an example & fixed by Michael
4000 # Hudson just less than four months later...
4001
4002 class Evil(object):
4003 def __hash__(self):
4004 return hash('attr')
4005 def __eq__(self, other):
4006 del C.attr
4007 return 0
4008
4009 class Descr(object):
4010 def __get__(self, ob, type=None):
4011 return 1
4012
4013 class C(object):
4014 attr = Descr()
4015
4016 c = C()
4017 c.__dict__[Evil()] = 0
4018
4019 self.assertEqual(c.attr, 1)
4020 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004021 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004022 self.assertEqual(hasattr(c, 'attr'), False)
4023
4024 def test_init(self):
4025 # SF 1155938
4026 class Foo(object):
4027 def __init__(self):
4028 return 10
4029 try:
4030 Foo()
4031 except TypeError:
4032 pass
4033 else:
4034 self.fail("did not test __init__() for None return")
4035
4036 def test_method_wrapper(self):
4037 # Testing method-wrapper objects...
4038 # <type 'method-wrapper'> did not support any reflection before 2.5
4039
Mark Dickinson211c6252009-02-01 10:28:51 +00004040 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004041
4042 l = []
4043 self.assertEqual(l.__add__, l.__add__)
4044 self.assertEqual(l.__add__, [].__add__)
4045 self.assert_(l.__add__ != [5].__add__)
4046 self.assert_(l.__add__ != l.__mul__)
4047 self.assert_(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004048 if hasattr(l.__add__, '__self__'):
4049 # CPython
4050 self.assert_(l.__add__.__self__ is l)
4051 self.assert_(l.__add__.__objclass__ is list)
4052 else:
4053 # Python implementations where [].__add__ is a normal bound method
4054 self.assert_(l.__add__.im_self is l)
4055 self.assert_(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004056 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4057 try:
4058 hash(l.__add__)
4059 except TypeError:
4060 pass
4061 else:
4062 self.fail("no TypeError from hash([].__add__)")
4063
4064 t = ()
4065 t += (7,)
4066 self.assertEqual(t.__add__, (7,).__add__)
4067 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4068
4069 def test_not_implemented(self):
4070 # Testing NotImplemented...
4071 # all binary methods should be able to return a NotImplemented
4072 import sys
4073 import types
4074 import operator
4075
4076 def specialmethod(self, other):
4077 return NotImplemented
4078
4079 def check(expr, x, y):
4080 try:
4081 exec(expr, {'x': x, 'y': y, 'operator': operator})
4082 except TypeError:
4083 pass
4084 else:
4085 self.fail("no TypeError from %r" % (expr,))
4086
4087 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4088 # TypeErrors
4089 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4090 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004091 for name, expr, iexpr in [
4092 ('__add__', 'x + y', 'x += y'),
4093 ('__sub__', 'x - y', 'x -= y'),
4094 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004095 ('__truediv__', 'operator.truediv(x, y)', None),
4096 ('__floordiv__', 'operator.floordiv(x, y)', None),
4097 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004098 ('__mod__', 'x % y', 'x %= y'),
4099 ('__divmod__', 'divmod(x, y)', None),
4100 ('__pow__', 'x ** y', 'x **= y'),
4101 ('__lshift__', 'x << y', 'x <<= y'),
4102 ('__rshift__', 'x >> y', 'x >>= y'),
4103 ('__and__', 'x & y', 'x &= y'),
4104 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004105 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004106 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004107 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004108 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004109 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004110 check(expr, a, N1)
4111 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004112 if iexpr:
4113 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004114 check(iexpr, a, N1)
4115 check(iexpr, a, N2)
4116 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004117 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004118 c = C()
4119 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004120 check(iexpr, c, N1)
4121 check(iexpr, c, N2)
4122
Georg Brandl479a7e72008-02-05 18:13:15 +00004123 def test_assign_slice(self):
4124 # ceval.c's assign_slice used to check for
4125 # tp->tp_as_sequence->sq_slice instead of
4126 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004127
Georg Brandl479a7e72008-02-05 18:13:15 +00004128 class C(object):
4129 def __setitem__(self, idx, value):
4130 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004131
Georg Brandl479a7e72008-02-05 18:13:15 +00004132 c = C()
4133 c[1:2] = 3
4134 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004135
Benjamin Peterson9262b842008-11-17 22:45:50 +00004136 def test_getattr_hooks(self):
4137 # issue 4230
4138
4139 class Descriptor(object):
4140 counter = 0
4141 def __get__(self, obj, objtype=None):
4142 def getter(name):
4143 self.counter += 1
4144 raise AttributeError(name)
4145 return getter
4146
4147 descr = Descriptor()
4148 class A(object):
4149 __getattribute__ = descr
4150 class B(object):
4151 __getattr__ = descr
4152 class C(object):
4153 __getattribute__ = descr
4154 __getattr__ = descr
4155
4156 self.assertRaises(AttributeError, getattr, A(), "attr")
4157 self.assertEquals(descr.counter, 1)
4158 self.assertRaises(AttributeError, getattr, B(), "attr")
4159 self.assertEquals(descr.counter, 2)
4160 self.assertRaises(AttributeError, getattr, C(), "attr")
4161 self.assertEquals(descr.counter, 4)
4162
4163 import gc
4164 class EvilGetattribute(object):
4165 # This used to segfault
4166 def __getattr__(self, name):
4167 raise AttributeError(name)
4168 def __getattribute__(self, name):
4169 del EvilGetattribute.__getattr__
4170 for i in range(5):
4171 gc.collect()
4172 raise AttributeError(name)
4173
4174 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4175
Christian Heimesbbffeb62008-01-24 09:42:52 +00004176
Georg Brandl479a7e72008-02-05 18:13:15 +00004177class DictProxyTests(unittest.TestCase):
4178 def setUp(self):
4179 class C(object):
4180 def meth(self):
4181 pass
4182 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004183
Georg Brandl479a7e72008-02-05 18:13:15 +00004184 def test_iter_keys(self):
4185 # Testing dict-proxy iterkeys...
4186 keys = [ key for key in self.C.__dict__.keys() ]
4187 keys.sort()
4188 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4189 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004190
Georg Brandl479a7e72008-02-05 18:13:15 +00004191 def test_iter_values(self):
4192 # Testing dict-proxy itervalues...
4193 values = [ values for values in self.C.__dict__.values() ]
4194 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004195
Georg Brandl479a7e72008-02-05 18:13:15 +00004196 def test_iter_items(self):
4197 # Testing dict-proxy iteritems...
4198 keys = [ key for (key, value) in self.C.__dict__.items() ]
4199 keys.sort()
4200 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4201 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004202
Georg Brandl479a7e72008-02-05 18:13:15 +00004203 def test_dict_type_with_metaclass(self):
4204 # Testing type of __dict__ when metaclass set...
4205 class B(object):
4206 pass
4207 class M(type):
4208 pass
4209 class C(metaclass=M):
4210 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4211 pass
4212 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004213
Christian Heimesbbffeb62008-01-24 09:42:52 +00004214
Georg Brandl479a7e72008-02-05 18:13:15 +00004215class PTypesLongInitTest(unittest.TestCase):
4216 # This is in its own TestCase so that it can be run before any other tests.
4217 def test_pytype_long_ready(self):
4218 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004219
Georg Brandl479a7e72008-02-05 18:13:15 +00004220 # This dumps core when SF bug 551412 isn't fixed --
4221 # but only when test_descr.py is run separately.
4222 # (That can't be helped -- as soon as PyType_Ready()
4223 # is called for PyLong_Type, the bug is gone.)
4224 class UserLong(object):
4225 def __pow__(self, *args):
4226 pass
4227 try:
4228 pow(0, UserLong(), 0)
4229 except:
4230 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004231
Georg Brandl479a7e72008-02-05 18:13:15 +00004232 # Another segfault only when run early
4233 # (before PyType_Ready(tuple) is called)
4234 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004235
4236
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004237def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004238 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004239 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004240 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004241
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004242if __name__ == "__main__":
4243 test_main()