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