blob: 17d96b2a4bd93c2d31b22f113fb42d824dcbff29 [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...
Georg Brandlab91fde2009-08-13 08:51:18 +0000390 self.assertTrue(issubclass(dict, dict))
391 self.assertTrue(isinstance({}, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000392 d = dict()
393 self.assertEqual(d, {})
Georg Brandlab91fde2009-08-13 08:51:18 +0000394 self.assertTrue(d.__class__ is dict)
395 self.assertTrue(isinstance(d, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000396 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):
Georg Brandlab91fde2009-08-13 08:51:18 +0000408 self.assertTrue(isinstance(key, type(0)))
Georg Brandl479a7e72008-02-05 18:13:15 +0000409 dict.__setitem__(self_local, key, value)
410 def setstate(self, state):
411 self.state = state
412 def getstate(self):
413 return self.state
Georg Brandlab91fde2009-08-13 08:51:18 +0000414 self.assertTrue(issubclass(C, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000415 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, ())
Georg Brandlab91fde2009-08-13 08:51:18 +0000507 self.assertTrue('spam' in C.dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000508 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()
Georg Brandlab91fde2009-08-13 08:51:18 +0000572 self.assertTrue(not hasattr(a, "x"))
Georg Brandl479a7e72008-02-05 18:13:15 +0000573 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)
Georg Brandlab91fde2009-08-13 08:51:18 +0000963 self.assertTrue(type(slots[0]) is str)
Georg Brandl479a7e72008-02-05 18:13:15 +0000964 # 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()
Georg Brandlab91fde2009-08-13 08:51:18 +00001052 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001053 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()
Georg Brandlab91fde2009-08-13 08:51:18 +00001060 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001061 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()
Georg Brandlab91fde2009-08-13 08:51:18 +00001072 self.assertTrue(hasattr(a, "__dict__"))
1073 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001074 a.foo = 42
1075 self.assertEqual(a.__dict__, {"foo": 42})
1076
1077 class C2(D, W):
1078 __slots__ = []
1079 a = C2()
Georg Brandlab91fde2009-08-13 08:51:18 +00001080 self.assertTrue(hasattr(a, "__dict__"))
1081 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001082 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()
Georg Brandlab91fde2009-08-13 08:51:18 +00001097 self.assertTrue(isinstance(u, MyABC))
Christian Heimesa156e092008-02-16 07:38:31 +00001098
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
Benjamin Petersona8332062009-09-11 22:36:27 +00001271 # Verify that a non-callable will raise
1272 meth = classmethod(1).__get__(1)
1273 self.assertRaises(TypeError, meth)
Georg Brandl479a7e72008-02-05 18:13:15 +00001274
1275 # Verify that classmethod() doesn't allow keyword args
1276 try:
1277 classmethod(f, kw=1)
1278 except TypeError:
1279 pass
1280 else:
1281 self.fail("classmethod shouldn't accept keyword args")
1282
Benjamin Petersone549ead2009-03-28 21:42:05 +00001283 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001284 def test_classmethods_in_c(self):
1285 # Testing C-based class methods...
1286 import xxsubtype as spam
1287 a = (1, 2, 3)
1288 d = {'abc': 123}
1289 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1290 self.assertEqual(x, spam.spamlist)
1291 self.assertEqual(a, a1)
1292 self.assertEqual(d, d1)
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
1298 def test_staticmethods(self):
1299 # Testing static methods...
1300 class C(object):
1301 def foo(*a): return a
1302 goo = staticmethod(foo)
1303 c = C()
1304 self.assertEqual(C.goo(1), (1,))
1305 self.assertEqual(c.goo(1), (1,))
1306 self.assertEqual(c.foo(1), (c, 1,))
1307 class D(C):
1308 pass
1309 d = D()
1310 self.assertEqual(D.goo(1), (1,))
1311 self.assertEqual(d.goo(1), (1,))
1312 self.assertEqual(d.foo(1), (d, 1))
1313 self.assertEqual(D.foo(d, 1), (d, 1))
1314
Benjamin Petersone549ead2009-03-28 21:42:05 +00001315 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001316 def test_staticmethods_in_c(self):
1317 # Testing C-based static methods...
1318 import xxsubtype as spam
1319 a = (1, 2, 3)
1320 d = {"abc": 123}
1321 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1322 self.assertEqual(x, None)
1323 self.assertEqual(a, a1)
1324 self.assertEqual(d, d1)
1325 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1326 self.assertEqual(x, None)
1327 self.assertEqual(a, a1)
1328 self.assertEqual(d, d1)
1329
1330 def test_classic(self):
1331 # Testing classic classes...
1332 class C:
1333 def foo(*a): return a
1334 goo = classmethod(foo)
1335 c = C()
1336 self.assertEqual(C.goo(1), (C, 1))
1337 self.assertEqual(c.goo(1), (C, 1))
1338 self.assertEqual(c.foo(1), (c, 1))
1339 class D(C):
1340 pass
1341 d = D()
1342 self.assertEqual(D.goo(1), (D, 1))
1343 self.assertEqual(d.goo(1), (D, 1))
1344 self.assertEqual(d.foo(1), (d, 1))
1345 self.assertEqual(D.foo(d, 1), (d, 1))
1346 class E: # *not* subclassing from C
1347 foo = C.foo
1348 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Georg Brandlab91fde2009-08-13 08:51:18 +00001349 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001350
1351 def test_compattr(self):
1352 # Testing computed attributes...
1353 class C(object):
1354 class computed_attribute(object):
1355 def __init__(self, get, set=None, delete=None):
1356 self.__get = get
1357 self.__set = set
1358 self.__delete = delete
1359 def __get__(self, obj, type=None):
1360 return self.__get(obj)
1361 def __set__(self, obj, value):
1362 return self.__set(obj, value)
1363 def __delete__(self, obj):
1364 return self.__delete(obj)
1365 def __init__(self):
1366 self.__x = 0
1367 def __get_x(self):
1368 x = self.__x
1369 self.__x = x+1
1370 return x
1371 def __set_x(self, x):
1372 self.__x = x
1373 def __delete_x(self):
1374 del self.__x
1375 x = computed_attribute(__get_x, __set_x, __delete_x)
1376 a = C()
1377 self.assertEqual(a.x, 0)
1378 self.assertEqual(a.x, 1)
1379 a.x = 10
1380 self.assertEqual(a.x, 10)
1381 self.assertEqual(a.x, 11)
1382 del a.x
1383 self.assertEqual(hasattr(a, 'x'), 0)
1384
1385 def test_newslots(self):
1386 # Testing __new__ slot override...
1387 class C(list):
1388 def __new__(cls):
1389 self = list.__new__(cls)
1390 self.foo = 1
1391 return self
1392 def __init__(self):
1393 self.foo = self.foo + 2
1394 a = C()
1395 self.assertEqual(a.foo, 3)
1396 self.assertEqual(a.__class__, C)
1397 class D(C):
1398 pass
1399 b = D()
1400 self.assertEqual(b.foo, 3)
1401 self.assertEqual(b.__class__, D)
1402
1403 def test_altmro(self):
1404 # Testing mro() and overriding it...
1405 class A(object):
1406 def f(self): return "A"
1407 class B(A):
1408 pass
1409 class C(A):
1410 def f(self): return "C"
1411 class D(B, C):
1412 pass
1413 self.assertEqual(D.mro(), [D, B, C, A, object])
1414 self.assertEqual(D.__mro__, (D, B, C, A, object))
1415 self.assertEqual(D().f(), "C")
1416
1417 class PerverseMetaType(type):
1418 def mro(cls):
1419 L = type.mro(cls)
1420 L.reverse()
1421 return L
1422 class X(D,B,C,A, metaclass=PerverseMetaType):
1423 pass
1424 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1425 self.assertEqual(X().f(), "A")
1426
1427 try:
1428 class _metaclass(type):
1429 def mro(self):
1430 return [self, dict, object]
1431 class X(object, metaclass=_metaclass):
1432 pass
Benjamin Petersone549ead2009-03-28 21:42:05 +00001433 # In CPython, the class creation above already raises
1434 # TypeError, as a protection against the fact that
1435 # instances of X would segfault it. In other Python
1436 # implementations it would be ok to let the class X
1437 # be created, but instead get a clean TypeError on the
1438 # __setitem__ below.
1439 x = object.__new__(X)
1440 x[5] = 6
Georg Brandl479a7e72008-02-05 18:13:15 +00001441 except TypeError:
1442 pass
1443 else:
1444 self.fail("devious mro() return not caught")
1445
1446 try:
1447 class _metaclass(type):
1448 def mro(self):
1449 return [1]
1450 class X(object, metaclass=_metaclass):
1451 pass
1452 except TypeError:
1453 pass
1454 else:
1455 self.fail("non-class mro() return not caught")
1456
1457 try:
1458 class _metaclass(type):
1459 def mro(self):
1460 return 1
1461 class X(object, metaclass=_metaclass):
1462 pass
1463 except TypeError:
1464 pass
1465 else:
1466 self.fail("non-sequence mro() return not caught")
1467
1468 def test_overloading(self):
1469 # Testing operator overloading...
1470
1471 class B(object):
1472 "Intermediate class because object doesn't have a __setattr__"
1473
1474 class C(B):
1475 def __getattr__(self, name):
1476 if name == "foo":
1477 return ("getattr", name)
1478 else:
1479 raise AttributeError
1480 def __setattr__(self, name, value):
1481 if name == "foo":
1482 self.setattr = (name, value)
1483 else:
1484 return B.__setattr__(self, name, value)
1485 def __delattr__(self, name):
1486 if name == "foo":
1487 self.delattr = name
1488 else:
1489 return B.__delattr__(self, name)
1490
1491 def __getitem__(self, key):
1492 return ("getitem", key)
1493 def __setitem__(self, key, value):
1494 self.setitem = (key, value)
1495 def __delitem__(self, key):
1496 self.delitem = key
1497
1498 a = C()
1499 self.assertEqual(a.foo, ("getattr", "foo"))
1500 a.foo = 12
1501 self.assertEqual(a.setattr, ("foo", 12))
1502 del a.foo
1503 self.assertEqual(a.delattr, "foo")
1504
1505 self.assertEqual(a[12], ("getitem", 12))
1506 a[12] = 21
1507 self.assertEqual(a.setitem, (12, 21))
1508 del a[12]
1509 self.assertEqual(a.delitem, 12)
1510
1511 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1512 a[0:10] = "foo"
1513 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1514 del a[0:10]
1515 self.assertEqual(a.delitem, (slice(0, 10)))
1516
1517 def test_methods(self):
1518 # Testing methods...
1519 class C(object):
1520 def __init__(self, x):
1521 self.x = x
1522 def foo(self):
1523 return self.x
1524 c1 = C(1)
1525 self.assertEqual(c1.foo(), 1)
1526 class D(C):
1527 boo = C.foo
1528 goo = c1.foo
1529 d2 = D(2)
1530 self.assertEqual(d2.foo(), 2)
1531 self.assertEqual(d2.boo(), 2)
1532 self.assertEqual(d2.goo(), 1)
1533 class E(object):
1534 foo = C.foo
1535 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Georg Brandlab91fde2009-08-13 08:51:18 +00001536 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001537
Benjamin Peterson224205f2009-05-08 03:25:19 +00001538 def test_special_method_lookup(self):
1539 # The lookup of special methods bypasses __getattr__ and
1540 # __getattribute__, but they still can be descriptors.
1541
1542 def run_context(manager):
1543 with manager:
1544 pass
1545 def iden(self):
1546 return self
1547 def hello(self):
1548 return b"hello"
Benjamin Peterson053c61f2009-05-09 17:21:13 +00001549 def empty_seq(self):
1550 return []
Benjamin Petersona5758c02009-05-09 18:15:04 +00001551 def zero(self):
1552 return 0
1553 def stop(self):
1554 raise StopIteration
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001555 def return_true(self, thing=None):
1556 return True
1557 def do_isinstance(obj):
1558 return isinstance(int, obj)
1559 def do_issubclass(obj):
1560 return issubclass(int, obj)
Benjamin Petersona7205592009-05-27 03:08:59 +00001561 def do_dict_missing(checker):
1562 class DictSub(checker.__class__, dict):
1563 pass
1564 self.assertEqual(DictSub()["hi"], 4)
1565 def some_number(self_, key):
1566 self.assertEqual(key, "hi")
1567 return 4
Benjamin Peterson224205f2009-05-08 03:25:19 +00001568
1569 # It would be nice to have every special method tested here, but I'm
1570 # only listing the ones I can remember outside of typeobject.c, since it
1571 # does it right.
1572 specials = [
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001573 ("__bytes__", bytes, hello, set(), {}),
1574 ("__reversed__", reversed, empty_seq, set(), {}),
1575 ("__length_hint__", list, zero, set(),
Benjamin Petersona5758c02009-05-09 18:15:04 +00001576 {"__iter__" : iden, "__next__" : stop}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001577 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1578 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Petersona7205592009-05-27 03:08:59 +00001579 ("__missing__", do_dict_missing, some_number,
1580 set(("__class__",)), {}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001581 ("__subclasscheck__", do_issubclass, return_true,
1582 set(("__bases__",)), {}),
Benjamin Peterson224205f2009-05-08 03:25:19 +00001583 # These two fail because the compiler generates LOAD_ATTR to look
1584 # them up. We'd have to add a new opcode to fix this, and it's
1585 # probably not worth it.
1586 # ("__enter__", run_context, iden),
1587 # ("__exit__", run_context, iden),
1588 ]
1589
1590 class Checker(object):
1591 def __getattr__(self, attr, test=self):
1592 test.fail("__getattr__ called with {0}".format(attr))
1593 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001594 if attr not in ok:
1595 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Petersona7205592009-05-27 03:08:59 +00001596 return object.__getattribute__(self, attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001597 class SpecialDescr(object):
1598 def __init__(self, impl):
1599 self.impl = impl
1600 def __get__(self, obj, owner):
1601 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001602 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001603 class MyException(Exception):
1604 pass
1605 class ErrDescr(object):
1606 def __get__(self, obj, owner):
1607 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001608
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001609 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001610 class X(Checker):
1611 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001612 for attr, obj in env.items():
1613 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001614 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001615 runner(X())
1616
1617 record = []
1618 class X(Checker):
1619 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001620 for attr, obj in env.items():
1621 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001622 setattr(X, name, SpecialDescr(meth_impl))
1623 runner(X())
1624 self.assertEqual(record, [1], name)
1625
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001626 class X(Checker):
1627 pass
1628 for attr, obj in env.items():
1629 setattr(X, attr, obj)
1630 setattr(X, name, ErrDescr())
1631 try:
1632 runner(X())
1633 except MyException:
1634 pass
1635 else:
1636 self.fail("{0!r} didn't raise".format(name))
1637
Georg Brandl479a7e72008-02-05 18:13:15 +00001638 def test_specials(self):
1639 # Testing special operators...
1640 # Test operators like __hash__ for which a built-in default exists
1641
1642 # Test the default behavior for static classes
1643 class C(object):
1644 def __getitem__(self, i):
1645 if 0 <= i < 10: return i
1646 raise IndexError
1647 c1 = C()
1648 c2 = C()
Georg Brandlab91fde2009-08-13 08:51:18 +00001649 self.assertTrue(not not c1) # What?
Georg Brandl479a7e72008-02-05 18:13:15 +00001650 self.assertNotEqual(id(c1), id(c2))
1651 hash(c1)
1652 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001653 self.assertEqual(c1, c1)
Georg Brandlab91fde2009-08-13 08:51:18 +00001654 self.assertTrue(c1 != c2)
1655 self.assertTrue(not c1 != c1)
1656 self.assertTrue(not c1 == c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001657 # Note that the module name appears in str/repr, and that varies
1658 # depending on whether this test is run standalone or from a framework.
Georg Brandlab91fde2009-08-13 08:51:18 +00001659 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001660 self.assertEqual(str(c1), repr(c1))
Georg Brandlab91fde2009-08-13 08:51:18 +00001661 self.assertTrue(-1 not in c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001662 for i in range(10):
Georg Brandlab91fde2009-08-13 08:51:18 +00001663 self.assertTrue(i in c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001664 self.assertFalse(10 in c1)
1665 # Test the default behavior for dynamic classes
1666 class D(object):
1667 def __getitem__(self, i):
1668 if 0 <= i < 10: return i
1669 raise IndexError
1670 d1 = D()
1671 d2 = D()
Georg Brandlab91fde2009-08-13 08:51:18 +00001672 self.assertTrue(not not d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001673 self.assertNotEqual(id(d1), id(d2))
1674 hash(d1)
1675 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001676 self.assertEqual(d1, d1)
1677 self.assertNotEqual(d1, d2)
Georg Brandlab91fde2009-08-13 08:51:18 +00001678 self.assertTrue(not d1 != d1)
1679 self.assertTrue(not d1 == d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001680 # Note that the module name appears in str/repr, and that varies
1681 # depending on whether this test is run standalone or from a framework.
Georg Brandlab91fde2009-08-13 08:51:18 +00001682 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001683 self.assertEqual(str(d1), repr(d1))
Georg Brandlab91fde2009-08-13 08:51:18 +00001684 self.assertTrue(-1 not in d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001685 for i in range(10):
Georg Brandlab91fde2009-08-13 08:51:18 +00001686 self.assertTrue(i in d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001687 self.assertFalse(10 in d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001688 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001689 class Proxy(object):
1690 def __init__(self, x):
1691 self.x = x
1692 def __bool__(self):
1693 return not not self.x
1694 def __hash__(self):
1695 return hash(self.x)
1696 def __eq__(self, other):
1697 return self.x == other
1698 def __ne__(self, other):
1699 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001700 def __ge__(self, other):
1701 return self.x >= other
1702 def __gt__(self, other):
1703 return self.x > other
1704 def __le__(self, other):
1705 return self.x <= other
1706 def __lt__(self, other):
1707 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001708 def __str__(self):
1709 return "Proxy:%s" % self.x
1710 def __repr__(self):
1711 return "Proxy(%r)" % self.x
1712 def __contains__(self, value):
1713 return value in self.x
1714 p0 = Proxy(0)
1715 p1 = Proxy(1)
1716 p_1 = Proxy(-1)
1717 self.assertFalse(p0)
Georg Brandlab91fde2009-08-13 08:51:18 +00001718 self.assertTrue(not not p1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001719 self.assertEqual(hash(p0), hash(0))
1720 self.assertEqual(p0, p0)
1721 self.assertNotEqual(p0, p1)
Georg Brandlab91fde2009-08-13 08:51:18 +00001722 self.assertTrue(not p0 != p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001723 self.assertEqual(not p0, p1)
Georg Brandlab91fde2009-08-13 08:51:18 +00001724 self.assertTrue(p0 < p1)
1725 self.assertTrue(p0 <= p1)
1726 self.assertTrue(p1 > p0)
1727 self.assertTrue(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001728 self.assertEqual(str(p0), "Proxy:0")
1729 self.assertEqual(repr(p0), "Proxy(0)")
1730 p10 = Proxy(range(10))
1731 self.assertFalse(-1 in p10)
1732 for i in range(10):
Georg Brandlab91fde2009-08-13 08:51:18 +00001733 self.assertTrue(i in p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001734 self.assertFalse(10 in p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001735
Georg Brandl479a7e72008-02-05 18:13:15 +00001736 def test_weakrefs(self):
1737 # Testing weak references...
1738 import weakref
1739 class C(object):
1740 pass
1741 c = C()
1742 r = weakref.ref(c)
1743 self.assertEqual(r(), c)
1744 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001745 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001746 self.assertEqual(r(), None)
1747 del r
1748 class NoWeak(object):
1749 __slots__ = ['foo']
1750 no = NoWeak()
1751 try:
1752 weakref.ref(no)
1753 except TypeError as msg:
Georg Brandlab91fde2009-08-13 08:51:18 +00001754 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001755 else:
1756 self.fail("weakref.ref(no) should be illegal")
1757 class Weak(object):
1758 __slots__ = ['foo', '__weakref__']
1759 yes = Weak()
1760 r = weakref.ref(yes)
1761 self.assertEqual(r(), yes)
1762 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001763 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001764 self.assertEqual(r(), None)
1765 del r
1766
1767 def test_properties(self):
1768 # Testing property...
1769 class C(object):
1770 def getx(self):
1771 return self.__x
1772 def setx(self, value):
1773 self.__x = value
1774 def delx(self):
1775 del self.__x
1776 x = property(getx, setx, delx, doc="I'm the x property.")
1777 a = C()
1778 self.assertFalse(hasattr(a, "x"))
1779 a.x = 42
1780 self.assertEqual(a._C__x, 42)
1781 self.assertEqual(a.x, 42)
1782 del a.x
1783 self.assertFalse(hasattr(a, "x"))
1784 self.assertFalse(hasattr(a, "_C__x"))
1785 C.x.__set__(a, 100)
1786 self.assertEqual(C.x.__get__(a), 100)
1787 C.x.__delete__(a)
1788 self.assertFalse(hasattr(a, "x"))
1789
1790 raw = C.__dict__['x']
Georg Brandlab91fde2009-08-13 08:51:18 +00001791 self.assertTrue(isinstance(raw, property))
Georg Brandl479a7e72008-02-05 18:13:15 +00001792
1793 attrs = dir(raw)
Georg Brandlab91fde2009-08-13 08:51:18 +00001794 self.assertTrue("__doc__" in attrs)
1795 self.assertTrue("fget" in attrs)
1796 self.assertTrue("fset" in attrs)
1797 self.assertTrue("fdel" in attrs)
Georg Brandl479a7e72008-02-05 18:13:15 +00001798
1799 self.assertEqual(raw.__doc__, "I'm the x property.")
Georg Brandlab91fde2009-08-13 08:51:18 +00001800 self.assertTrue(raw.fget is C.__dict__['getx'])
1801 self.assertTrue(raw.fset is C.__dict__['setx'])
1802 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl479a7e72008-02-05 18:13:15 +00001803
1804 for attr in "__doc__", "fget", "fset", "fdel":
1805 try:
1806 setattr(raw, attr, 42)
1807 except AttributeError as msg:
1808 if str(msg).find('readonly') < 0:
1809 self.fail("when setting readonly attr %r on a property, "
1810 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1811 else:
1812 self.fail("expected AttributeError from trying to set readonly %r "
1813 "attr on a property" % attr)
1814
1815 class D(object):
1816 __getitem__ = property(lambda s: 1/0)
1817
1818 d = D()
1819 try:
1820 for i in d:
1821 str(i)
1822 except ZeroDivisionError:
1823 pass
1824 else:
1825 self.fail("expected ZeroDivisionError from bad property")
1826
1827 class E(object):
1828 def getter(self):
1829 "getter method"
1830 return 0
1831 def setter(self_, value):
1832 "setter method"
1833 pass
1834 prop = property(getter)
1835 self.assertEqual(prop.__doc__, "getter method")
1836 prop2 = property(fset=setter)
1837 self.assertEqual(prop2.__doc__, None)
1838
1839 # this segfaulted in 2.5b2
1840 try:
1841 import _testcapi
1842 except ImportError:
1843 pass
1844 else:
1845 class X(object):
1846 p = property(_testcapi.test_with_docstring)
1847
1848 def test_properties_plus(self):
1849 class C(object):
1850 foo = property(doc="hello")
1851 @foo.getter
1852 def foo(self):
1853 return self._foo
1854 @foo.setter
1855 def foo(self, value):
1856 self._foo = abs(value)
1857 @foo.deleter
1858 def foo(self):
1859 del self._foo
1860 c = C()
1861 self.assertEqual(C.foo.__doc__, "hello")
1862 self.assertFalse(hasattr(c, "foo"))
1863 c.foo = -42
Georg Brandlab91fde2009-08-13 08:51:18 +00001864 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl479a7e72008-02-05 18:13:15 +00001865 self.assertEqual(c._foo, 42)
1866 self.assertEqual(c.foo, 42)
1867 del c.foo
1868 self.assertFalse(hasattr(c, '_foo'))
1869 self.assertFalse(hasattr(c, "foo"))
1870
1871 class D(C):
1872 @C.foo.deleter
1873 def foo(self):
1874 try:
1875 del self._foo
1876 except AttributeError:
1877 pass
1878 d = D()
1879 d.foo = 24
1880 self.assertEqual(d.foo, 24)
1881 del d.foo
1882 del d.foo
1883
1884 class E(object):
1885 @property
1886 def foo(self):
1887 return self._foo
1888 @foo.setter
1889 def foo(self, value):
1890 raise RuntimeError
1891 @foo.setter
1892 def foo(self, value):
1893 self._foo = abs(value)
1894 @foo.deleter
1895 def foo(self, value=None):
1896 del self._foo
1897
1898 e = E()
1899 e.foo = -42
1900 self.assertEqual(e.foo, 42)
1901 del e.foo
1902
1903 class F(E):
1904 @E.foo.deleter
1905 def foo(self):
1906 del self._foo
1907 @foo.setter
1908 def foo(self, value):
1909 self._foo = max(0, value)
1910 f = F()
1911 f.foo = -10
1912 self.assertEqual(f.foo, 0)
1913 del f.foo
1914
1915 def test_dict_constructors(self):
1916 # Testing dict constructor ...
1917 d = dict()
1918 self.assertEqual(d, {})
1919 d = dict({})
1920 self.assertEqual(d, {})
1921 d = dict({1: 2, 'a': 'b'})
1922 self.assertEqual(d, {1: 2, 'a': 'b'})
1923 self.assertEqual(d, dict(list(d.items())))
1924 self.assertEqual(d, dict(iter(d.items())))
1925 d = dict({'one':1, 'two':2})
1926 self.assertEqual(d, dict(one=1, two=2))
1927 self.assertEqual(d, dict(**d))
1928 self.assertEqual(d, dict({"one": 1}, two=2))
1929 self.assertEqual(d, dict([("two", 2)], one=1))
1930 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1931 self.assertEqual(d, dict(**d))
1932
1933 for badarg in 0, 0, 0j, "0", [0], (0,):
1934 try:
1935 dict(badarg)
1936 except TypeError:
1937 pass
1938 except ValueError:
1939 if badarg == "0":
1940 # It's a sequence, and its elements are also sequences (gotta
1941 # love strings <wink>), but they aren't of length 2, so this
1942 # one seemed better as a ValueError than a TypeError.
1943 pass
1944 else:
1945 self.fail("no TypeError from dict(%r)" % badarg)
1946 else:
1947 self.fail("no TypeError from dict(%r)" % badarg)
1948
1949 try:
1950 dict({}, {})
1951 except TypeError:
1952 pass
1953 else:
1954 self.fail("no TypeError from dict({}, {})")
1955
1956 class Mapping:
1957 # Lacks a .keys() method; will be added later.
1958 dict = {1:2, 3:4, 'a':1j}
1959
1960 try:
1961 dict(Mapping())
1962 except TypeError:
1963 pass
1964 else:
1965 self.fail("no TypeError from dict(incomplete mapping)")
1966
1967 Mapping.keys = lambda self: list(self.dict.keys())
1968 Mapping.__getitem__ = lambda self, i: self.dict[i]
1969 d = dict(Mapping())
1970 self.assertEqual(d, Mapping.dict)
1971
1972 # Init from sequence of iterable objects, each producing a 2-sequence.
1973 class AddressBookEntry:
1974 def __init__(self, first, last):
1975 self.first = first
1976 self.last = last
1977 def __iter__(self):
1978 return iter([self.first, self.last])
1979
1980 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1981 AddressBookEntry('Barry', 'Peters'),
1982 AddressBookEntry('Tim', 'Peters'),
1983 AddressBookEntry('Barry', 'Warsaw')])
1984 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1985
1986 d = dict(zip(range(4), range(1, 5)))
1987 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1988
1989 # Bad sequence lengths.
1990 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1991 try:
1992 dict(bad)
1993 except ValueError:
1994 pass
1995 else:
1996 self.fail("no ValueError from dict(%r)" % bad)
1997
1998 def test_dir(self):
1999 # Testing dir() ...
2000 junk = 12
2001 self.assertEqual(dir(), ['junk', 'self'])
2002 del junk
2003
2004 # Just make sure these don't blow up!
2005 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
2006 dir(arg)
2007
2008 # Test dir on new-style classes. Since these have object as a
2009 # base class, a lot more gets sucked in.
2010 def interesting(strings):
2011 return [s for s in strings if not s.startswith('_')]
2012
2013 class C(object):
2014 Cdata = 1
2015 def Cmethod(self): pass
2016
2017 cstuff = ['Cdata', 'Cmethod']
2018 self.assertEqual(interesting(dir(C)), cstuff)
2019
2020 c = C()
2021 self.assertEqual(interesting(dir(c)), cstuff)
Georg Brandlab91fde2009-08-13 08:51:18 +00002022 ## self.assertTrue('__self__' in dir(C.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002023
2024 c.cdata = 2
2025 c.cmethod = lambda self: 0
2026 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Georg Brandlab91fde2009-08-13 08:51:18 +00002027 ## self.assertTrue('__self__' in dir(c.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002028
2029 class A(C):
2030 Adata = 1
2031 def Amethod(self): pass
2032
2033 astuff = ['Adata', 'Amethod'] + cstuff
2034 self.assertEqual(interesting(dir(A)), astuff)
Georg Brandlab91fde2009-08-13 08:51:18 +00002035 ## self.assertTrue('__self__' in dir(A.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002036 a = A()
2037 self.assertEqual(interesting(dir(a)), astuff)
2038 a.adata = 42
2039 a.amethod = lambda self: 3
2040 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Georg Brandlab91fde2009-08-13 08:51:18 +00002041 ## self.assertTrue('__self__' in dir(a.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002042
2043 # Try a module subclass.
2044 import sys
2045 class M(type(sys)):
2046 pass
2047 minstance = M("m")
2048 minstance.b = 2
2049 minstance.a = 1
2050 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2051 self.assertEqual(names, ['a', 'b'])
2052
2053 class M2(M):
2054 def getdict(self):
2055 return "Not a dict!"
2056 __dict__ = property(getdict)
2057
2058 m2instance = M2("m2")
2059 m2instance.b = 2
2060 m2instance.a = 1
2061 self.assertEqual(m2instance.__dict__, "Not a dict!")
2062 try:
2063 dir(m2instance)
2064 except TypeError:
2065 pass
2066
2067 # Two essentially featureless objects, just inheriting stuff from
2068 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002069 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2070 if support.check_impl_detail():
2071 # None differs in PyPy: it has a __nonzero__
2072 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002073
2074 # Nasty test case for proxied objects
2075 class Wrapper(object):
2076 def __init__(self, obj):
2077 self.__obj = obj
2078 def __repr__(self):
2079 return "Wrapper(%s)" % repr(self.__obj)
2080 def __getitem__(self, key):
2081 return Wrapper(self.__obj[key])
2082 def __len__(self):
2083 return len(self.__obj)
2084 def __getattr__(self, name):
2085 return Wrapper(getattr(self.__obj, name))
2086
2087 class C(object):
2088 def __getclass(self):
2089 return Wrapper(type(self))
2090 __class__ = property(__getclass)
2091
2092 dir(C()) # This used to segfault
2093
2094 def test_supers(self):
2095 # Testing super...
2096
2097 class A(object):
2098 def meth(self, a):
2099 return "A(%r)" % a
2100
2101 self.assertEqual(A().meth(1), "A(1)")
2102
2103 class B(A):
2104 def __init__(self):
2105 self.__super = super(B, self)
2106 def meth(self, a):
2107 return "B(%r)" % a + self.__super.meth(a)
2108
2109 self.assertEqual(B().meth(2), "B(2)A(2)")
2110
2111 class C(A):
2112 def meth(self, a):
2113 return "C(%r)" % a + self.__super.meth(a)
2114 C._C__super = super(C)
2115
2116 self.assertEqual(C().meth(3), "C(3)A(3)")
2117
2118 class D(C, B):
2119 def meth(self, a):
2120 return "D(%r)" % a + super(D, self).meth(a)
2121
2122 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2123
2124 # Test for subclassing super
2125
2126 class mysuper(super):
2127 def __init__(self, *args):
2128 return super(mysuper, self).__init__(*args)
2129
2130 class E(D):
2131 def meth(self, a):
2132 return "E(%r)" % a + mysuper(E, self).meth(a)
2133
2134 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2135
2136 class F(E):
2137 def meth(self, a):
2138 s = self.__super # == mysuper(F, self)
2139 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2140 F._F__super = mysuper(F)
2141
2142 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2143
2144 # Make sure certain errors are raised
2145
2146 try:
2147 super(D, 42)
2148 except TypeError:
2149 pass
2150 else:
2151 self.fail("shouldn't allow super(D, 42)")
2152
2153 try:
2154 super(D, C())
2155 except TypeError:
2156 pass
2157 else:
2158 self.fail("shouldn't allow super(D, C())")
2159
2160 try:
2161 super(D).__get__(12)
2162 except TypeError:
2163 pass
2164 else:
2165 self.fail("shouldn't allow super(D).__get__(12)")
2166
2167 try:
2168 super(D).__get__(C())
2169 except TypeError:
2170 pass
2171 else:
2172 self.fail("shouldn't allow super(D).__get__(C())")
2173
2174 # Make sure data descriptors can be overridden and accessed via super
2175 # (new feature in Python 2.3)
2176
2177 class DDbase(object):
2178 def getx(self): return 42
2179 x = property(getx)
2180
2181 class DDsub(DDbase):
2182 def getx(self): return "hello"
2183 x = property(getx)
2184
2185 dd = DDsub()
2186 self.assertEqual(dd.x, "hello")
2187 self.assertEqual(super(DDsub, dd).x, 42)
2188
2189 # Ensure that super() lookup of descriptor from classmethod
2190 # works (SF ID# 743627)
2191
2192 class Base(object):
2193 aProp = property(lambda self: "foo")
2194
2195 class Sub(Base):
2196 @classmethod
2197 def test(klass):
2198 return super(Sub,klass).aProp
2199
2200 self.assertEqual(Sub.test(), Base.aProp)
2201
2202 # Verify that super() doesn't allow keyword args
2203 try:
2204 super(Base, kw=1)
2205 except TypeError:
2206 pass
2207 else:
2208 self.assertEqual("super shouldn't accept keyword args")
2209
2210 def test_basic_inheritance(self):
2211 # Testing inheritance from basic types...
2212
2213 class hexint(int):
2214 def __repr__(self):
2215 return hex(self)
2216 def __add__(self, other):
2217 return hexint(int.__add__(self, other))
2218 # (Note that overriding __radd__ doesn't work,
2219 # because the int type gets first dibs.)
2220 self.assertEqual(repr(hexint(7) + 9), "0x10")
2221 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2222 a = hexint(12345)
2223 self.assertEqual(a, 12345)
2224 self.assertEqual(int(a), 12345)
Georg Brandlab91fde2009-08-13 08:51:18 +00002225 self.assertTrue(int(a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002226 self.assertEqual(hash(a), hash(12345))
Georg Brandlab91fde2009-08-13 08:51:18 +00002227 self.assertTrue((+a).__class__ is int)
2228 self.assertTrue((a >> 0).__class__ is int)
2229 self.assertTrue((a << 0).__class__ is int)
2230 self.assertTrue((hexint(0) << 12).__class__ is int)
2231 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002232
2233 class octlong(int):
2234 __slots__ = []
2235 def __str__(self):
2236 s = oct(self)
2237 if s[-1] == 'L':
2238 s = s[:-1]
2239 return s
2240 def __add__(self, other):
2241 return self.__class__(super(octlong, self).__add__(other))
2242 __radd__ = __add__
2243 self.assertEqual(str(octlong(3) + 5), "0o10")
2244 # (Note that overriding __radd__ here only seems to work
2245 # because the example uses a short int left argument.)
2246 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2247 a = octlong(12345)
2248 self.assertEqual(a, 12345)
2249 self.assertEqual(int(a), 12345)
2250 self.assertEqual(hash(a), hash(12345))
Georg Brandlab91fde2009-08-13 08:51:18 +00002251 self.assertTrue(int(a).__class__ is int)
2252 self.assertTrue((+a).__class__ is int)
2253 self.assertTrue((-a).__class__ is int)
2254 self.assertTrue((-octlong(0)).__class__ is int)
2255 self.assertTrue((a >> 0).__class__ is int)
2256 self.assertTrue((a << 0).__class__ is int)
2257 self.assertTrue((a - 0).__class__ is int)
2258 self.assertTrue((a * 1).__class__ is int)
2259 self.assertTrue((a ** 1).__class__ is int)
2260 self.assertTrue((a // 1).__class__ is int)
2261 self.assertTrue((1 * a).__class__ is int)
2262 self.assertTrue((a | 0).__class__ is int)
2263 self.assertTrue((a ^ 0).__class__ is int)
2264 self.assertTrue((a & -1).__class__ is int)
2265 self.assertTrue((octlong(0) << 12).__class__ is int)
2266 self.assertTrue((octlong(0) >> 12).__class__ is int)
2267 self.assertTrue(abs(octlong(0)).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002268
2269 # Because octlong overrides __add__, we can't check the absence of +0
2270 # optimizations using octlong.
2271 class longclone(int):
2272 pass
2273 a = longclone(1)
Georg Brandlab91fde2009-08-13 08:51:18 +00002274 self.assertTrue((a + 0).__class__ is int)
2275 self.assertTrue((0 + a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002276
2277 # Check that negative clones don't segfault
2278 a = longclone(-1)
2279 self.assertEqual(a.__dict__, {})
Georg Brandlab91fde2009-08-13 08:51:18 +00002280 self.assertEqual(int(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl479a7e72008-02-05 18:13:15 +00002281
2282 class precfloat(float):
2283 __slots__ = ['prec']
2284 def __init__(self, value=0.0, prec=12):
2285 self.prec = int(prec)
2286 def __repr__(self):
2287 return "%.*g" % (self.prec, self)
2288 self.assertEqual(repr(precfloat(1.1)), "1.1")
2289 a = precfloat(12345)
2290 self.assertEqual(a, 12345.0)
2291 self.assertEqual(float(a), 12345.0)
Georg Brandlab91fde2009-08-13 08:51:18 +00002292 self.assertTrue(float(a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002293 self.assertEqual(hash(a), hash(12345.0))
Georg Brandlab91fde2009-08-13 08:51:18 +00002294 self.assertTrue((+a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002295
2296 class madcomplex(complex):
2297 def __repr__(self):
2298 return "%.17gj%+.17g" % (self.imag, self.real)
2299 a = madcomplex(-3, 4)
2300 self.assertEqual(repr(a), "4j-3")
2301 base = complex(-3, 4)
2302 self.assertEqual(base.__class__, complex)
2303 self.assertEqual(a, base)
2304 self.assertEqual(complex(a), base)
2305 self.assertEqual(complex(a).__class__, complex)
2306 a = madcomplex(a) # just trying another form of the constructor
2307 self.assertEqual(repr(a), "4j-3")
2308 self.assertEqual(a, base)
2309 self.assertEqual(complex(a), base)
2310 self.assertEqual(complex(a).__class__, complex)
2311 self.assertEqual(hash(a), hash(base))
2312 self.assertEqual((+a).__class__, complex)
2313 self.assertEqual((a + 0).__class__, complex)
2314 self.assertEqual(a + 0, base)
2315 self.assertEqual((a - 0).__class__, complex)
2316 self.assertEqual(a - 0, base)
2317 self.assertEqual((a * 1).__class__, complex)
2318 self.assertEqual(a * 1, base)
2319 self.assertEqual((a / 1).__class__, complex)
2320 self.assertEqual(a / 1, base)
2321
2322 class madtuple(tuple):
2323 _rev = None
2324 def rev(self):
2325 if self._rev is not None:
2326 return self._rev
2327 L = list(self)
2328 L.reverse()
2329 self._rev = self.__class__(L)
2330 return self._rev
2331 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2332 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2333 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2334 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2335 for i in range(512):
2336 t = madtuple(range(i))
2337 u = t.rev()
2338 v = u.rev()
2339 self.assertEqual(v, t)
2340 a = madtuple((1,2,3,4,5))
2341 self.assertEqual(tuple(a), (1,2,3,4,5))
Georg Brandlab91fde2009-08-13 08:51:18 +00002342 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002343 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Georg Brandlab91fde2009-08-13 08:51:18 +00002344 self.assertTrue(a[:].__class__ is tuple)
2345 self.assertTrue((a * 1).__class__ is tuple)
2346 self.assertTrue((a * 0).__class__ is tuple)
2347 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002348 a = madtuple(())
2349 self.assertEqual(tuple(a), ())
Georg Brandlab91fde2009-08-13 08:51:18 +00002350 self.assertTrue(tuple(a).__class__ is tuple)
2351 self.assertTrue((a + a).__class__ is tuple)
2352 self.assertTrue((a * 0).__class__ is tuple)
2353 self.assertTrue((a * 1).__class__ is tuple)
2354 self.assertTrue((a * 2).__class__ is tuple)
2355 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002356
2357 class madstring(str):
2358 _rev = None
2359 def rev(self):
2360 if self._rev is not None:
2361 return self._rev
2362 L = list(self)
2363 L.reverse()
2364 self._rev = self.__class__("".join(L))
2365 return self._rev
2366 s = madstring("abcdefghijklmnopqrstuvwxyz")
2367 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2368 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2369 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2370 for i in range(256):
2371 s = madstring("".join(map(chr, range(i))))
2372 t = s.rev()
2373 u = t.rev()
2374 self.assertEqual(u, s)
2375 s = madstring("12345")
2376 self.assertEqual(str(s), "12345")
Georg Brandlab91fde2009-08-13 08:51:18 +00002377 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002378
2379 base = "\x00" * 5
2380 s = madstring(base)
2381 self.assertEqual(s, base)
2382 self.assertEqual(str(s), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002383 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002384 self.assertEqual(hash(s), hash(base))
2385 self.assertEqual({s: 1}[base], 1)
2386 self.assertEqual({base: 1}[s], 1)
Georg Brandlab91fde2009-08-13 08:51:18 +00002387 self.assertTrue((s + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002388 self.assertEqual(s + "", base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002389 self.assertTrue(("" + s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002390 self.assertEqual("" + s, base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002391 self.assertTrue((s * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002392 self.assertEqual(s * 0, "")
Georg Brandlab91fde2009-08-13 08:51:18 +00002393 self.assertTrue((s * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002394 self.assertEqual(s * 1, base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002395 self.assertTrue((s * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002396 self.assertEqual(s * 2, base + base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002397 self.assertTrue(s[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002398 self.assertEqual(s[:], base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002399 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002400 self.assertEqual(s[0:0], "")
Georg Brandlab91fde2009-08-13 08:51:18 +00002401 self.assertTrue(s.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002402 self.assertEqual(s.strip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002403 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002404 self.assertEqual(s.lstrip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002405 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002406 self.assertEqual(s.rstrip(), base)
2407 identitytab = {}
Georg Brandlab91fde2009-08-13 08:51:18 +00002408 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002409 self.assertEqual(s.translate(identitytab), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002410 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002411 self.assertEqual(s.replace("x", "x"), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002412 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002413 self.assertEqual(s.ljust(len(s)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002414 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002415 self.assertEqual(s.rjust(len(s)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002416 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002417 self.assertEqual(s.center(len(s)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002418 self.assertTrue(s.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002419 self.assertEqual(s.lower(), base)
2420
2421 class madunicode(str):
2422 _rev = None
2423 def rev(self):
2424 if self._rev is not None:
2425 return self._rev
2426 L = list(self)
2427 L.reverse()
2428 self._rev = self.__class__("".join(L))
2429 return self._rev
2430 u = madunicode("ABCDEF")
2431 self.assertEqual(u, "ABCDEF")
2432 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2433 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2434 base = "12345"
2435 u = madunicode(base)
2436 self.assertEqual(str(u), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002437 self.assertTrue(str(u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002438 self.assertEqual(hash(u), hash(base))
2439 self.assertEqual({u: 1}[base], 1)
2440 self.assertEqual({base: 1}[u], 1)
Georg Brandlab91fde2009-08-13 08:51:18 +00002441 self.assertTrue(u.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002442 self.assertEqual(u.strip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002443 self.assertTrue(u.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002444 self.assertEqual(u.lstrip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002445 self.assertTrue(u.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002446 self.assertEqual(u.rstrip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002447 self.assertTrue(u.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002448 self.assertEqual(u.replace("x", "x"), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002449 self.assertTrue(u.replace("xy", "xy").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002450 self.assertEqual(u.replace("xy", "xy"), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002451 self.assertTrue(u.center(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002452 self.assertEqual(u.center(len(u)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002453 self.assertTrue(u.ljust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002454 self.assertEqual(u.ljust(len(u)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002455 self.assertTrue(u.rjust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002456 self.assertEqual(u.rjust(len(u)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002457 self.assertTrue(u.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002458 self.assertEqual(u.lower(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002459 self.assertTrue(u.upper().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002460 self.assertEqual(u.upper(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002461 self.assertTrue(u.capitalize().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002462 self.assertEqual(u.capitalize(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002463 self.assertTrue(u.title().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002464 self.assertEqual(u.title(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002465 self.assertTrue((u + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002466 self.assertEqual(u + "", base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002467 self.assertTrue(("" + u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002468 self.assertEqual("" + u, base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002469 self.assertTrue((u * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002470 self.assertEqual(u * 0, "")
Georg Brandlab91fde2009-08-13 08:51:18 +00002471 self.assertTrue((u * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002472 self.assertEqual(u * 1, base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002473 self.assertTrue((u * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002474 self.assertEqual(u * 2, base + base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002475 self.assertTrue(u[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002476 self.assertEqual(u[:], base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002477 self.assertTrue(u[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002478 self.assertEqual(u[0:0], "")
2479
2480 class sublist(list):
2481 pass
2482 a = sublist(range(5))
2483 self.assertEqual(a, list(range(5)))
2484 a.append("hello")
2485 self.assertEqual(a, list(range(5)) + ["hello"])
2486 a[5] = 5
2487 self.assertEqual(a, list(range(6)))
2488 a.extend(range(6, 20))
2489 self.assertEqual(a, list(range(20)))
2490 a[-5:] = []
2491 self.assertEqual(a, list(range(15)))
2492 del a[10:15]
2493 self.assertEqual(len(a), 10)
2494 self.assertEqual(a, list(range(10)))
2495 self.assertEqual(list(a), list(range(10)))
2496 self.assertEqual(a[0], 0)
2497 self.assertEqual(a[9], 9)
2498 self.assertEqual(a[-10], 0)
2499 self.assertEqual(a[-1], 9)
2500 self.assertEqual(a[:5], list(range(5)))
2501
2502 ## class CountedInput(file):
2503 ## """Counts lines read by self.readline().
2504 ##
2505 ## self.lineno is the 0-based ordinal of the last line read, up to
2506 ## a maximum of one greater than the number of lines in the file.
2507 ##
2508 ## self.ateof is true if and only if the final "" line has been read,
2509 ## at which point self.lineno stops incrementing, and further calls
2510 ## to readline() continue to return "".
2511 ## """
2512 ##
2513 ## lineno = 0
2514 ## ateof = 0
2515 ## def readline(self):
2516 ## if self.ateof:
2517 ## return ""
2518 ## s = file.readline(self)
2519 ## # Next line works too.
2520 ## # s = super(CountedInput, self).readline()
2521 ## self.lineno += 1
2522 ## if s == "":
2523 ## self.ateof = 1
2524 ## return s
2525 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002526 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002527 ## lines = ['a\n', 'b\n', 'c\n']
2528 ## try:
2529 ## f.writelines(lines)
2530 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002531 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002532 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2533 ## got = f.readline()
2534 ## self.assertEqual(expected, got)
2535 ## self.assertEqual(f.lineno, i)
2536 ## self.assertEqual(f.ateof, (i > len(lines)))
2537 ## f.close()
2538 ## finally:
2539 ## try:
2540 ## f.close()
2541 ## except:
2542 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002543 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002544
2545 def test_keywords(self):
2546 # Testing keyword args to basic type constructors ...
2547 self.assertEqual(int(x=1), 1)
2548 self.assertEqual(float(x=2), 2.0)
2549 self.assertEqual(int(x=3), 3)
2550 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2551 self.assertEqual(str(object=500), '500')
2552 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2553 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2554 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2555 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2556
2557 for constructor in (int, float, int, complex, str, str,
2558 tuple, list):
2559 try:
2560 constructor(bogus_keyword_arg=1)
2561 except TypeError:
2562 pass
2563 else:
2564 self.fail("expected TypeError from bogus keyword argument to %r"
2565 % constructor)
2566
2567 def test_str_subclass_as_dict_key(self):
2568 # Testing a str subclass used as dict key ..
2569
2570 class cistr(str):
2571 """Sublcass of str that computes __eq__ case-insensitively.
2572
2573 Also computes a hash code of the string in canonical form.
2574 """
2575
2576 def __init__(self, value):
2577 self.canonical = value.lower()
2578 self.hashcode = hash(self.canonical)
2579
2580 def __eq__(self, other):
2581 if not isinstance(other, cistr):
2582 other = cistr(other)
2583 return self.canonical == other.canonical
2584
2585 def __hash__(self):
2586 return self.hashcode
2587
2588 self.assertEqual(cistr('ABC'), 'abc')
2589 self.assertEqual('aBc', cistr('ABC'))
2590 self.assertEqual(str(cistr('ABC')), 'ABC')
2591
2592 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2593 self.assertEqual(d[cistr('one')], 1)
2594 self.assertEqual(d[cistr('tWo')], 2)
2595 self.assertEqual(d[cistr('THrEE')], 3)
Georg Brandlab91fde2009-08-13 08:51:18 +00002596 self.assertTrue(cistr('ONe') in d)
Georg Brandl479a7e72008-02-05 18:13:15 +00002597 self.assertEqual(d.get(cistr('thrEE')), 3)
2598
2599 def test_classic_comparisons(self):
2600 # Testing classic comparisons...
2601 class classic:
2602 pass
2603
2604 for base in (classic, int, object):
2605 class C(base):
2606 def __init__(self, value):
2607 self.value = int(value)
2608 def __eq__(self, other):
2609 if isinstance(other, C):
2610 return self.value == other.value
2611 if isinstance(other, int) or isinstance(other, int):
2612 return self.value == other
2613 return NotImplemented
2614 def __ne__(self, other):
2615 if isinstance(other, C):
2616 return self.value != other.value
2617 if isinstance(other, int) or isinstance(other, int):
2618 return self.value != other
2619 return NotImplemented
2620 def __lt__(self, other):
2621 if isinstance(other, C):
2622 return self.value < other.value
2623 if isinstance(other, int) or isinstance(other, int):
2624 return self.value < other
2625 return NotImplemented
2626 def __le__(self, other):
2627 if isinstance(other, C):
2628 return self.value <= other.value
2629 if isinstance(other, int) or isinstance(other, int):
2630 return self.value <= other
2631 return NotImplemented
2632 def __gt__(self, other):
2633 if isinstance(other, C):
2634 return self.value > other.value
2635 if isinstance(other, int) or isinstance(other, int):
2636 return self.value > other
2637 return NotImplemented
2638 def __ge__(self, other):
2639 if isinstance(other, C):
2640 return self.value >= other.value
2641 if isinstance(other, int) or isinstance(other, int):
2642 return self.value >= other
2643 return NotImplemented
2644
2645 c1 = C(1)
2646 c2 = C(2)
2647 c3 = C(3)
2648 self.assertEqual(c1, 1)
2649 c = {1: c1, 2: c2, 3: c3}
2650 for x in 1, 2, 3:
2651 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002652 for op in "<", "<=", "==", "!=", ">", ">=":
Georg Brandlab91fde2009-08-13 08:51:18 +00002653 self.assertTrue(eval("c[x] %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002654 eval("x %s y" % op),
2655 "x=%d, y=%d" % (x, y))
Georg Brandlab91fde2009-08-13 08:51:18 +00002656 self.assertTrue(eval("c[x] %s y" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002657 eval("x %s y" % op),
2658 "x=%d, y=%d" % (x, y))
Georg Brandlab91fde2009-08-13 08:51:18 +00002659 self.assertTrue(eval("x %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002660 eval("x %s y" % op),
2661 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002662
2663 def test_rich_comparisons(self):
2664 # Testing rich comparisons...
2665 class Z(complex):
2666 pass
2667 z = Z(1)
2668 self.assertEqual(z, 1+0j)
2669 self.assertEqual(1+0j, z)
2670 class ZZ(complex):
2671 def __eq__(self, other):
2672 try:
2673 return abs(self - other) <= 1e-6
2674 except:
2675 return NotImplemented
2676 zz = ZZ(1.0000003)
2677 self.assertEqual(zz, 1+0j)
2678 self.assertEqual(1+0j, zz)
2679
2680 class classic:
2681 pass
2682 for base in (classic, int, object, list):
2683 class C(base):
2684 def __init__(self, value):
2685 self.value = int(value)
2686 def __cmp__(self_, other):
2687 self.fail("shouldn't call __cmp__")
2688 def __eq__(self, other):
2689 if isinstance(other, C):
2690 return self.value == other.value
2691 if isinstance(other, int) or isinstance(other, int):
2692 return self.value == other
2693 return NotImplemented
2694 def __ne__(self, other):
2695 if isinstance(other, C):
2696 return self.value != other.value
2697 if isinstance(other, int) or isinstance(other, int):
2698 return self.value != other
2699 return NotImplemented
2700 def __lt__(self, other):
2701 if isinstance(other, C):
2702 return self.value < other.value
2703 if isinstance(other, int) or isinstance(other, int):
2704 return self.value < other
2705 return NotImplemented
2706 def __le__(self, other):
2707 if isinstance(other, C):
2708 return self.value <= other.value
2709 if isinstance(other, int) or isinstance(other, int):
2710 return self.value <= other
2711 return NotImplemented
2712 def __gt__(self, other):
2713 if isinstance(other, C):
2714 return self.value > other.value
2715 if isinstance(other, int) or isinstance(other, int):
2716 return self.value > other
2717 return NotImplemented
2718 def __ge__(self, other):
2719 if isinstance(other, C):
2720 return self.value >= other.value
2721 if isinstance(other, int) or isinstance(other, int):
2722 return self.value >= other
2723 return NotImplemented
2724 c1 = C(1)
2725 c2 = C(2)
2726 c3 = C(3)
2727 self.assertEqual(c1, 1)
2728 c = {1: c1, 2: c2, 3: c3}
2729 for x in 1, 2, 3:
2730 for y in 1, 2, 3:
2731 for op in "<", "<=", "==", "!=", ">", ">=":
Georg Brandlab91fde2009-08-13 08:51:18 +00002732 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002733 "x=%d, y=%d" % (x, y))
Georg Brandlab91fde2009-08-13 08:51:18 +00002734 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002735 "x=%d, y=%d" % (x, y))
Georg Brandlab91fde2009-08-13 08:51:18 +00002736 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002737 "x=%d, y=%d" % (x, y))
2738
2739 def test_descrdoc(self):
2740 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002741 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002742 def check(descr, what):
2743 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002744 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002745 check(complex.real, "the real part of a complex number") # member descriptor
2746
2747 def test_doc_descriptor(self):
2748 # Testing __doc__ descriptor...
2749 # SF bug 542984
2750 class DocDescr(object):
2751 def __get__(self, object, otype):
2752 if object:
2753 object = object.__class__.__name__ + ' instance'
2754 if otype:
2755 otype = otype.__name__
2756 return 'object=%s; type=%s' % (object, otype)
2757 class OldClass:
2758 __doc__ = DocDescr()
2759 class NewClass(object):
2760 __doc__ = DocDescr()
2761 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2762 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2763 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2764 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2765
2766 def test_set_class(self):
2767 # Testing __class__ assignment...
2768 class C(object): pass
2769 class D(object): pass
2770 class E(object): pass
2771 class F(D, E): pass
2772 for cls in C, D, E, F:
2773 for cls2 in C, D, E, F:
2774 x = cls()
2775 x.__class__ = cls2
Georg Brandlab91fde2009-08-13 08:51:18 +00002776 self.assertTrue(x.__class__ is cls2)
Georg Brandl479a7e72008-02-05 18:13:15 +00002777 x.__class__ = cls
Georg Brandlab91fde2009-08-13 08:51:18 +00002778 self.assertTrue(x.__class__ is cls)
Georg Brandl479a7e72008-02-05 18:13:15 +00002779 def cant(x, C):
2780 try:
2781 x.__class__ = C
2782 except TypeError:
2783 pass
2784 else:
2785 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2786 try:
2787 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002788 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002789 pass
2790 else:
2791 self.fail("shouldn't allow del %r.__class__" % x)
2792 cant(C(), list)
2793 cant(list(), C)
2794 cant(C(), 1)
2795 cant(C(), object)
2796 cant(object(), list)
2797 cant(list(), object)
2798 class Int(int): __slots__ = []
2799 cant(2, Int)
2800 cant(Int(), int)
2801 cant(True, int)
2802 cant(2, bool)
2803 o = object()
2804 cant(o, type(1))
2805 cant(o, type(None))
2806 del o
2807 class G(object):
2808 __slots__ = ["a", "b"]
2809 class H(object):
2810 __slots__ = ["b", "a"]
2811 class I(object):
2812 __slots__ = ["a", "b"]
2813 class J(object):
2814 __slots__ = ["c", "b"]
2815 class K(object):
2816 __slots__ = ["a", "b", "d"]
2817 class L(H):
2818 __slots__ = ["e"]
2819 class M(I):
2820 __slots__ = ["e"]
2821 class N(J):
2822 __slots__ = ["__weakref__"]
2823 class P(J):
2824 __slots__ = ["__dict__"]
2825 class Q(J):
2826 pass
2827 class R(J):
2828 __slots__ = ["__dict__", "__weakref__"]
2829
2830 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2831 x = cls()
2832 x.a = 1
2833 x.__class__ = cls2
Georg Brandlab91fde2009-08-13 08:51:18 +00002834 self.assertTrue(x.__class__ is cls2,
Georg Brandl479a7e72008-02-05 18:13:15 +00002835 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2836 self.assertEqual(x.a, 1)
2837 x.__class__ = cls
Georg Brandlab91fde2009-08-13 08:51:18 +00002838 self.assertTrue(x.__class__ is cls,
Georg Brandl479a7e72008-02-05 18:13:15 +00002839 "assigning %r as __class__ for %r silently failed" % (cls, x))
2840 self.assertEqual(x.a, 1)
2841 for cls in G, J, K, L, M, N, P, R, list, Int:
2842 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2843 if cls is cls2:
2844 continue
2845 cant(cls(), cls2)
2846
Benjamin Peterson193152c2009-04-25 01:08:45 +00002847 # Issue5283: when __class__ changes in __del__, the wrong
2848 # type gets DECREF'd.
2849 class O(object):
2850 pass
2851 class A(object):
2852 def __del__(self):
2853 self.__class__ = O
2854 l = [A() for x in range(100)]
2855 del l
2856
Georg Brandl479a7e72008-02-05 18:13:15 +00002857 def test_set_dict(self):
2858 # Testing __dict__ assignment...
2859 class C(object): pass
2860 a = C()
2861 a.__dict__ = {'b': 1}
2862 self.assertEqual(a.b, 1)
2863 def cant(x, dict):
2864 try:
2865 x.__dict__ = dict
2866 except (AttributeError, TypeError):
2867 pass
2868 else:
2869 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2870 cant(a, None)
2871 cant(a, [])
2872 cant(a, 1)
2873 del a.__dict__ # Deleting __dict__ is allowed
2874
2875 class Base(object):
2876 pass
2877 def verify_dict_readonly(x):
2878 """
2879 x has to be an instance of a class inheriting from Base.
2880 """
2881 cant(x, {})
2882 try:
2883 del x.__dict__
2884 except (AttributeError, TypeError):
2885 pass
2886 else:
2887 self.fail("shouldn't allow del %r.__dict__" % x)
2888 dict_descr = Base.__dict__["__dict__"]
2889 try:
2890 dict_descr.__set__(x, {})
2891 except (AttributeError, TypeError):
2892 pass
2893 else:
2894 self.fail("dict_descr allowed access to %r's dict" % x)
2895
2896 # Classes don't allow __dict__ assignment and have readonly dicts
2897 class Meta1(type, Base):
2898 pass
2899 class Meta2(Base, type):
2900 pass
2901 class D(object, metaclass=Meta1):
2902 pass
2903 class E(object, metaclass=Meta2):
2904 pass
2905 for cls in C, D, E:
2906 verify_dict_readonly(cls)
2907 class_dict = cls.__dict__
2908 try:
2909 class_dict["spam"] = "eggs"
2910 except TypeError:
2911 pass
2912 else:
2913 self.fail("%r's __dict__ can be modified" % cls)
2914
2915 # Modules also disallow __dict__ assignment
2916 class Module1(types.ModuleType, Base):
2917 pass
2918 class Module2(Base, types.ModuleType):
2919 pass
2920 for ModuleType in Module1, Module2:
2921 mod = ModuleType("spam")
2922 verify_dict_readonly(mod)
2923 mod.__dict__["spam"] = "eggs"
2924
2925 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002926 # (at least not any more than regular exception's __dict__ can
2927 # be deleted; on CPython it is not the case, whereas on PyPy they
2928 # can, just like any other new-style instance's __dict__.)
2929 def can_delete_dict(e):
2930 try:
2931 del e.__dict__
2932 except (TypeError, AttributeError):
2933 return False
2934 else:
2935 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002936 class Exception1(Exception, Base):
2937 pass
2938 class Exception2(Base, Exception):
2939 pass
2940 for ExceptionType in Exception, Exception1, Exception2:
2941 e = ExceptionType()
2942 e.__dict__ = {"a": 1}
2943 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002944 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002945
2946 def test_pickles(self):
2947 # Testing pickling and copying new-style classes and objects...
2948 import pickle
2949
2950 def sorteditems(d):
2951 L = list(d.items())
2952 L.sort()
2953 return L
2954
2955 global C
2956 class C(object):
2957 def __init__(self, a, b):
2958 super(C, self).__init__()
2959 self.a = a
2960 self.b = b
2961 def __repr__(self):
2962 return "C(%r, %r)" % (self.a, self.b)
2963
2964 global C1
2965 class C1(list):
2966 def __new__(cls, a, b):
2967 return super(C1, cls).__new__(cls)
2968 def __getnewargs__(self):
2969 return (self.a, self.b)
2970 def __init__(self, a, b):
2971 self.a = a
2972 self.b = b
2973 def __repr__(self):
2974 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2975
2976 global C2
2977 class C2(int):
2978 def __new__(cls, a, b, val=0):
2979 return super(C2, cls).__new__(cls, val)
2980 def __getnewargs__(self):
2981 return (self.a, self.b, int(self))
2982 def __init__(self, a, b, val=0):
2983 self.a = a
2984 self.b = b
2985 def __repr__(self):
2986 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2987
2988 global C3
2989 class C3(object):
2990 def __init__(self, foo):
2991 self.foo = foo
2992 def __getstate__(self):
2993 return self.foo
2994 def __setstate__(self, foo):
2995 self.foo = foo
2996
2997 global C4classic, C4
2998 class C4classic: # classic
2999 pass
3000 class C4(C4classic, object): # mixed inheritance
3001 pass
3002
Guido van Rossum3926a632001-09-25 16:25:58 +00003003 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00003004 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00003005 s = pickle.dumps(cls, bin)
3006 cls2 = pickle.loads(s)
Georg Brandlab91fde2009-08-13 08:51:18 +00003007 self.assertTrue(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00003008
3009 a = C1(1, 2); a.append(42); a.append(24)
3010 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003011 s = pickle.dumps((a, b), bin)
3012 x, y = pickle.loads(s)
3013 self.assertEqual(x.__class__, a.__class__)
3014 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3015 self.assertEqual(y.__class__, b.__class__)
3016 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3017 self.assertEqual(repr(x), repr(a))
3018 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003019 # Test for __getstate__ and __setstate__ on new style class
3020 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003021 s = pickle.dumps(u, bin)
3022 v = pickle.loads(s)
3023 self.assertEqual(u.__class__, v.__class__)
3024 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003025 # Test for picklability of hybrid class
3026 u = C4()
3027 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003028 s = pickle.dumps(u, bin)
3029 v = pickle.loads(s)
3030 self.assertEqual(u.__class__, v.__class__)
3031 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003032
Georg Brandl479a7e72008-02-05 18:13:15 +00003033 # Testing copy.deepcopy()
3034 import copy
3035 for cls in C, C1, C2:
3036 cls2 = copy.deepcopy(cls)
Georg Brandlab91fde2009-08-13 08:51:18 +00003037 self.assertTrue(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003038
Georg Brandl479a7e72008-02-05 18:13:15 +00003039 a = C1(1, 2); a.append(42); a.append(24)
3040 b = C2("hello", "world", 42)
3041 x, y = copy.deepcopy((a, b))
3042 self.assertEqual(x.__class__, a.__class__)
3043 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3044 self.assertEqual(y.__class__, b.__class__)
3045 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3046 self.assertEqual(repr(x), repr(a))
3047 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003048
Georg Brandl479a7e72008-02-05 18:13:15 +00003049 def test_pickle_slots(self):
3050 # Testing pickling of classes with __slots__ ...
3051 import pickle
3052 # Pickling of classes with __slots__ but without __getstate__ should fail
3053 # (if using protocol 0 or 1)
3054 global B, C, D, E
3055 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003056 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003057 for base in [object, B]:
3058 class C(base):
3059 __slots__ = ['a']
3060 class D(C):
3061 pass
3062 try:
3063 pickle.dumps(C(), 0)
3064 except TypeError:
3065 pass
3066 else:
3067 self.fail("should fail: pickle C instance - %s" % base)
3068 try:
3069 pickle.dumps(C(), 0)
3070 except TypeError:
3071 pass
3072 else:
3073 self.fail("should fail: pickle D instance - %s" % base)
3074 # Give C a nice generic __getstate__ and __setstate__
3075 class C(base):
3076 __slots__ = ['a']
3077 def __getstate__(self):
3078 try:
3079 d = self.__dict__.copy()
3080 except AttributeError:
3081 d = {}
3082 for cls in self.__class__.__mro__:
3083 for sn in cls.__dict__.get('__slots__', ()):
3084 try:
3085 d[sn] = getattr(self, sn)
3086 except AttributeError:
3087 pass
3088 return d
3089 def __setstate__(self, d):
3090 for k, v in list(d.items()):
3091 setattr(self, k, v)
3092 class D(C):
3093 pass
3094 # Now it should work
3095 x = C()
3096 y = pickle.loads(pickle.dumps(x))
3097 self.assertEqual(hasattr(y, 'a'), 0)
3098 x.a = 42
3099 y = pickle.loads(pickle.dumps(x))
3100 self.assertEqual(y.a, 42)
3101 x = D()
3102 x.a = 42
3103 x.b = 100
3104 y = pickle.loads(pickle.dumps(x))
3105 self.assertEqual(y.a + y.b, 142)
3106 # A subclass that adds a slot should also work
3107 class E(C):
3108 __slots__ = ['b']
3109 x = E()
3110 x.a = 42
3111 x.b = "foo"
3112 y = pickle.loads(pickle.dumps(x))
3113 self.assertEqual(y.a, x.a)
3114 self.assertEqual(y.b, x.b)
3115
3116 def test_binary_operator_override(self):
3117 # Testing overrides of binary operations...
3118 class I(int):
3119 def __repr__(self):
3120 return "I(%r)" % int(self)
3121 def __add__(self, other):
3122 return I(int(self) + int(other))
3123 __radd__ = __add__
3124 def __pow__(self, other, mod=None):
3125 if mod is None:
3126 return I(pow(int(self), int(other)))
3127 else:
3128 return I(pow(int(self), int(other), int(mod)))
3129 def __rpow__(self, other, mod=None):
3130 if mod is None:
3131 return I(pow(int(other), int(self), mod))
3132 else:
3133 return I(pow(int(other), int(self), int(mod)))
3134
3135 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3136 self.assertEqual(repr(I(1) + 2), "I(3)")
3137 self.assertEqual(repr(1 + I(2)), "I(3)")
3138 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3139 self.assertEqual(repr(2 ** I(3)), "I(8)")
3140 self.assertEqual(repr(I(2) ** 3), "I(8)")
3141 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3142 class S(str):
3143 def __eq__(self, other):
3144 return self.lower() == other.lower()
3145
3146 def test_subclass_propagation(self):
3147 # Testing propagation of slot functions to subclasses...
3148 class A(object):
3149 pass
3150 class B(A):
3151 pass
3152 class C(A):
3153 pass
3154 class D(B, C):
3155 pass
3156 d = D()
3157 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3158 A.__hash__ = lambda self: 42
3159 self.assertEqual(hash(d), 42)
3160 C.__hash__ = lambda self: 314
3161 self.assertEqual(hash(d), 314)
3162 B.__hash__ = lambda self: 144
3163 self.assertEqual(hash(d), 144)
3164 D.__hash__ = lambda self: 100
3165 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003166 D.__hash__ = None
3167 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003168 del D.__hash__
3169 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003170 B.__hash__ = None
3171 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003172 del B.__hash__
3173 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003174 C.__hash__ = None
3175 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003176 del C.__hash__
3177 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003178 A.__hash__ = None
3179 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003180 del A.__hash__
3181 self.assertEqual(hash(d), orig_hash)
3182 d.foo = 42
3183 d.bar = 42
3184 self.assertEqual(d.foo, 42)
3185 self.assertEqual(d.bar, 42)
3186 def __getattribute__(self, name):
3187 if name == "foo":
3188 return 24
3189 return object.__getattribute__(self, name)
3190 A.__getattribute__ = __getattribute__
3191 self.assertEqual(d.foo, 24)
3192 self.assertEqual(d.bar, 42)
3193 def __getattr__(self, name):
3194 if name in ("spam", "foo", "bar"):
3195 return "hello"
3196 raise AttributeError(name)
3197 B.__getattr__ = __getattr__
3198 self.assertEqual(d.spam, "hello")
3199 self.assertEqual(d.foo, 24)
3200 self.assertEqual(d.bar, 42)
3201 del A.__getattribute__
3202 self.assertEqual(d.foo, 42)
3203 del d.foo
3204 self.assertEqual(d.foo, "hello")
3205 self.assertEqual(d.bar, 42)
3206 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003207 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003208 d.foo
3209 except AttributeError:
3210 pass
3211 else:
3212 self.fail("d.foo should be undefined now")
3213
3214 # Test a nasty bug in recurse_down_subclasses()
3215 import gc
3216 class A(object):
3217 pass
3218 class B(A):
3219 pass
3220 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003221 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003222 A.__setitem__ = lambda *a: None # crash
3223
3224 def test_buffer_inheritance(self):
3225 # Testing that buffer interface is inherited ...
3226
3227 import binascii
3228 # SF bug [#470040] ParseTuple t# vs subclasses.
3229
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003230 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003231 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003232 base = b'abc'
3233 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003234 # b2a_hex uses the buffer interface to get its argument's value, via
3235 # PyArg_ParseTuple 't#' code.
3236 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3237
Georg Brandl479a7e72008-02-05 18:13:15 +00003238 class MyInt(int):
3239 pass
3240 m = MyInt(42)
3241 try:
3242 binascii.b2a_hex(m)
3243 self.fail('subclass of int should not have a buffer interface')
3244 except TypeError:
3245 pass
3246
3247 def test_str_of_str_subclass(self):
3248 # Testing __str__ defined in subclass of str ...
3249 import binascii
3250 import io
3251
3252 class octetstring(str):
3253 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003254 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003255 def __repr__(self):
3256 return self + " repr"
3257
3258 o = octetstring('A')
3259 self.assertEqual(type(o), octetstring)
3260 self.assertEqual(type(str(o)), str)
3261 self.assertEqual(type(repr(o)), str)
3262 self.assertEqual(ord(o), 0x41)
3263 self.assertEqual(str(o), '41')
3264 self.assertEqual(repr(o), 'A repr')
3265 self.assertEqual(o.__str__(), '41')
3266 self.assertEqual(o.__repr__(), 'A repr')
3267
3268 capture = io.StringIO()
3269 # Calling str() or not exercises different internal paths.
3270 print(o, file=capture)
3271 print(str(o), file=capture)
3272 self.assertEqual(capture.getvalue(), '41\n41\n')
3273 capture.close()
3274
3275 def test_keyword_arguments(self):
3276 # Testing keyword arguments to __init__, __call__...
3277 def f(a): return a
3278 self.assertEqual(f.__call__(a=42), 42)
3279 a = []
3280 list.__init__(a, sequence=[0, 1, 2])
3281 self.assertEqual(a, [0, 1, 2])
3282
3283 def test_recursive_call(self):
3284 # Testing recursive __call__() by setting to instance of class...
3285 class A(object):
3286 pass
3287
3288 A.__call__ = A()
3289 try:
3290 A()()
3291 except RuntimeError:
3292 pass
3293 else:
3294 self.fail("Recursion limit should have been reached for __call__()")
3295
3296 def test_delete_hook(self):
3297 # Testing __del__ hook...
3298 log = []
3299 class C(object):
3300 def __del__(self):
3301 log.append(1)
3302 c = C()
3303 self.assertEqual(log, [])
3304 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003305 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003306 self.assertEqual(log, [1])
3307
3308 class D(object): pass
3309 d = D()
3310 try: del d[0]
3311 except TypeError: pass
3312 else: self.fail("invalid del() didn't raise TypeError")
3313
3314 def test_hash_inheritance(self):
3315 # Testing hash of mutable subclasses...
3316
3317 class mydict(dict):
3318 pass
3319 d = mydict()
3320 try:
3321 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003322 except TypeError:
3323 pass
3324 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003325 self.fail("hash() of dict subclass should fail")
3326
3327 class mylist(list):
3328 pass
3329 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003330 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003331 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003332 except TypeError:
3333 pass
3334 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003335 self.fail("hash() of list subclass should fail")
3336
3337 def test_str_operations(self):
3338 try: 'a' + 5
3339 except TypeError: pass
3340 else: self.fail("'' + 5 doesn't raise TypeError")
3341
3342 try: ''.split('')
3343 except ValueError: pass
3344 else: self.fail("''.split('') doesn't raise ValueError")
3345
3346 try: ''.join([0])
3347 except TypeError: pass
3348 else: self.fail("''.join([0]) doesn't raise TypeError")
3349
3350 try: ''.rindex('5')
3351 except ValueError: pass
3352 else: self.fail("''.rindex('5') doesn't raise ValueError")
3353
3354 try: '%(n)s' % None
3355 except TypeError: pass
3356 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3357
3358 try: '%(n' % {}
3359 except ValueError: pass
3360 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3361
3362 try: '%*s' % ('abc')
3363 except TypeError: pass
3364 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3365
3366 try: '%*.*s' % ('abc', 5)
3367 except TypeError: pass
3368 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3369
3370 try: '%s' % (1, 2)
3371 except TypeError: pass
3372 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3373
3374 try: '%' % None
3375 except ValueError: pass
3376 else: self.fail("'%' % None doesn't raise ValueError")
3377
3378 self.assertEqual('534253'.isdigit(), 1)
3379 self.assertEqual('534253x'.isdigit(), 0)
3380 self.assertEqual('%c' % 5, '\x05')
3381 self.assertEqual('%c' % '5', '5')
3382
3383 def test_deepcopy_recursive(self):
3384 # Testing deepcopy of recursive objects...
3385 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003386 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003387 a = Node()
3388 b = Node()
3389 a.b = b
3390 b.a = a
3391 z = deepcopy(a) # This blew up before
3392
3393 def test_unintialized_modules(self):
3394 # Testing uninitialized module objects...
3395 from types import ModuleType as M
3396 m = M.__new__(M)
3397 str(m)
3398 self.assertEqual(hasattr(m, "__name__"), 0)
3399 self.assertEqual(hasattr(m, "__file__"), 0)
3400 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003401 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003402 m.foo = 1
3403 self.assertEqual(m.__dict__, {"foo": 1})
3404
3405 def test_funny_new(self):
3406 # Testing __new__ returning something unexpected...
3407 class C(object):
3408 def __new__(cls, arg):
3409 if isinstance(arg, str): return [1, 2, 3]
3410 elif isinstance(arg, int): return object.__new__(D)
3411 else: return object.__new__(cls)
3412 class D(C):
3413 def __init__(self, arg):
3414 self.foo = arg
3415 self.assertEqual(C("1"), [1, 2, 3])
3416 self.assertEqual(D("1"), [1, 2, 3])
3417 d = D(None)
3418 self.assertEqual(d.foo, None)
3419 d = C(1)
3420 self.assertEqual(isinstance(d, D), True)
3421 self.assertEqual(d.foo, 1)
3422 d = D(1)
3423 self.assertEqual(isinstance(d, D), True)
3424 self.assertEqual(d.foo, 1)
3425
3426 def test_imul_bug(self):
3427 # Testing for __imul__ problems...
3428 # SF bug 544647
3429 class C(object):
3430 def __imul__(self, other):
3431 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003432 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003433 y = x
3434 y *= 1.0
3435 self.assertEqual(y, (x, 1.0))
3436 y = x
3437 y *= 2
3438 self.assertEqual(y, (x, 2))
3439 y = x
3440 y *= 3
3441 self.assertEqual(y, (x, 3))
3442 y = x
3443 y *= 1<<100
3444 self.assertEqual(y, (x, 1<<100))
3445 y = x
3446 y *= None
3447 self.assertEqual(y, (x, None))
3448 y = x
3449 y *= "foo"
3450 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003451
Georg Brandl479a7e72008-02-05 18:13:15 +00003452 def test_copy_setstate(self):
3453 # Testing that copy.*copy() correctly uses __setstate__...
3454 import copy
3455 class C(object):
3456 def __init__(self, foo=None):
3457 self.foo = foo
3458 self.__foo = foo
3459 def setfoo(self, foo=None):
3460 self.foo = foo
3461 def getfoo(self):
3462 return self.__foo
3463 def __getstate__(self):
3464 return [self.foo]
3465 def __setstate__(self_, lst):
3466 self.assertEqual(len(lst), 1)
3467 self_.__foo = self_.foo = lst[0]
3468 a = C(42)
3469 a.setfoo(24)
3470 self.assertEqual(a.foo, 24)
3471 self.assertEqual(a.getfoo(), 42)
3472 b = copy.copy(a)
3473 self.assertEqual(b.foo, 24)
3474 self.assertEqual(b.getfoo(), 24)
3475 b = copy.deepcopy(a)
3476 self.assertEqual(b.foo, 24)
3477 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003478
Georg Brandl479a7e72008-02-05 18:13:15 +00003479 def test_slices(self):
3480 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003481
Georg Brandl479a7e72008-02-05 18:13:15 +00003482 # Strings
3483 self.assertEqual("hello"[:4], "hell")
3484 self.assertEqual("hello"[slice(4)], "hell")
3485 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3486 class S(str):
3487 def __getitem__(self, x):
3488 return str.__getitem__(self, x)
3489 self.assertEqual(S("hello")[:4], "hell")
3490 self.assertEqual(S("hello")[slice(4)], "hell")
3491 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3492 # Tuples
3493 self.assertEqual((1,2,3)[:2], (1,2))
3494 self.assertEqual((1,2,3)[slice(2)], (1,2))
3495 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3496 class T(tuple):
3497 def __getitem__(self, x):
3498 return tuple.__getitem__(self, x)
3499 self.assertEqual(T((1,2,3))[:2], (1,2))
3500 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3501 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3502 # Lists
3503 self.assertEqual([1,2,3][:2], [1,2])
3504 self.assertEqual([1,2,3][slice(2)], [1,2])
3505 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3506 class L(list):
3507 def __getitem__(self, x):
3508 return list.__getitem__(self, x)
3509 self.assertEqual(L([1,2,3])[:2], [1,2])
3510 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3511 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3512 # Now do lists and __setitem__
3513 a = L([1,2,3])
3514 a[slice(1, 3)] = [3,2]
3515 self.assertEqual(a, [1,3,2])
3516 a[slice(0, 2, 1)] = [3,1]
3517 self.assertEqual(a, [3,1,2])
3518 a.__setitem__(slice(1, 3), [2,1])
3519 self.assertEqual(a, [3,2,1])
3520 a.__setitem__(slice(0, 2, 1), [2,3])
3521 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003522
Georg Brandl479a7e72008-02-05 18:13:15 +00003523 def test_subtype_resurrection(self):
3524 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003525
Georg Brandl479a7e72008-02-05 18:13:15 +00003526 class C(object):
3527 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003528
Georg Brandl479a7e72008-02-05 18:13:15 +00003529 def __del__(self):
3530 # resurrect the instance
3531 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003532
Georg Brandl479a7e72008-02-05 18:13:15 +00003533 c = C()
3534 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003535
Benjamin Petersone549ead2009-03-28 21:42:05 +00003536 # The most interesting thing here is whether this blows up, due to
3537 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3538 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003539 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003540
Georg Brandl479a7e72008-02-05 18:13:15 +00003541 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003542 # the last container slot works: that will attempt to delete c again,
3543 # which will cause c to get appended back to the container again
3544 # "during" the del. (On non-CPython implementations, however, __del__
3545 # is typically not called again.)
3546 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003547 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003548 del C.container[-1]
3549 if support.check_impl_detail():
3550 support.gc_collect()
3551 self.assertEqual(len(C.container), 1)
3552 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003553
Georg Brandl479a7e72008-02-05 18:13:15 +00003554 # Make c mortal again, so that the test framework with -l doesn't report
3555 # it as a leak.
3556 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003557
Georg Brandl479a7e72008-02-05 18:13:15 +00003558 def test_slots_trash(self):
3559 # Testing slot trash...
3560 # Deallocating deeply nested slotted trash caused stack overflows
3561 class trash(object):
3562 __slots__ = ['x']
3563 def __init__(self, x):
3564 self.x = x
3565 o = None
3566 for i in range(50000):
3567 o = trash(o)
3568 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003569
Georg Brandl479a7e72008-02-05 18:13:15 +00003570 def test_slots_multiple_inheritance(self):
3571 # SF bug 575229, multiple inheritance w/ slots dumps core
3572 class A(object):
3573 __slots__=()
3574 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003575 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003576 class C(A,B) :
3577 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003578 if support.check_impl_detail():
3579 self.assertEqual(C.__basicsize__, B.__basicsize__)
Georg Brandlab91fde2009-08-13 08:51:18 +00003580 self.assertTrue(hasattr(C, '__dict__'))
3581 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl479a7e72008-02-05 18:13:15 +00003582 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003583
Georg Brandl479a7e72008-02-05 18:13:15 +00003584 def test_rmul(self):
3585 # Testing correct invocation of __rmul__...
3586 # SF patch 592646
3587 class C(object):
3588 def __mul__(self, other):
3589 return "mul"
3590 def __rmul__(self, other):
3591 return "rmul"
3592 a = C()
3593 self.assertEqual(a*2, "mul")
3594 self.assertEqual(a*2.2, "mul")
3595 self.assertEqual(2*a, "rmul")
3596 self.assertEqual(2.2*a, "rmul")
3597
3598 def test_ipow(self):
3599 # Testing correct invocation of __ipow__...
3600 # [SF bug 620179]
3601 class C(object):
3602 def __ipow__(self, other):
3603 pass
3604 a = C()
3605 a **= 2
3606
3607 def test_mutable_bases(self):
3608 # Testing mutable bases...
3609
3610 # stuff that should work:
3611 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003612 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003613 class C2(object):
3614 def __getattribute__(self, attr):
3615 if attr == 'a':
3616 return 2
3617 else:
3618 return super(C2, self).__getattribute__(attr)
3619 def meth(self):
3620 return 1
3621 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003622 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003623 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003624 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003625 d = D()
3626 e = E()
3627 D.__bases__ = (C,)
3628 D.__bases__ = (C2,)
3629 self.assertEqual(d.meth(), 1)
3630 self.assertEqual(e.meth(), 1)
3631 self.assertEqual(d.a, 2)
3632 self.assertEqual(e.a, 2)
3633 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003634
Georg Brandl479a7e72008-02-05 18:13:15 +00003635 try:
3636 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003637 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003638 pass
3639 else:
3640 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003641
Georg Brandl479a7e72008-02-05 18:13:15 +00003642 try:
3643 D.__bases__ = ()
3644 except TypeError as msg:
3645 if str(msg) == "a new-style class can't have only classic bases":
3646 self.fail("wrong error message for .__bases__ = ()")
3647 else:
3648 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003649
Georg Brandl479a7e72008-02-05 18:13:15 +00003650 try:
3651 D.__bases__ = (D,)
3652 except TypeError:
3653 pass
3654 else:
3655 # actually, we'll have crashed by here...
3656 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003657
Georg Brandl479a7e72008-02-05 18:13:15 +00003658 try:
3659 D.__bases__ = (C, C)
3660 except TypeError:
3661 pass
3662 else:
3663 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003664
Georg Brandl479a7e72008-02-05 18:13:15 +00003665 try:
3666 D.__bases__ = (E,)
3667 except TypeError:
3668 pass
3669 else:
3670 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003671
Benjamin Petersonae937c02009-04-18 20:54:08 +00003672 def test_builtin_bases(self):
3673 # Make sure all the builtin types can have their base queried without
3674 # segfaulting. See issue #5787.
3675 builtin_types = [tp for tp in builtins.__dict__.values()
3676 if isinstance(tp, type)]
3677 for tp in builtin_types:
3678 object.__getattribute__(tp, "__bases__")
3679 if tp is not object:
3680 self.assertEqual(len(tp.__bases__), 1, tp)
3681
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003682 class L(list):
3683 pass
3684
3685 class C(object):
3686 pass
3687
3688 class D(C):
3689 pass
3690
3691 try:
3692 L.__bases__ = (dict,)
3693 except TypeError:
3694 pass
3695 else:
3696 self.fail("shouldn't turn list subclass into dict subclass")
3697
3698 try:
3699 list.__bases__ = (dict,)
3700 except TypeError:
3701 pass
3702 else:
3703 self.fail("shouldn't be able to assign to list.__bases__")
3704
3705 try:
3706 D.__bases__ = (C, list)
3707 except TypeError:
3708 pass
3709 else:
3710 assert 0, "best_base calculation found wanting"
3711
Benjamin Petersonae937c02009-04-18 20:54:08 +00003712
Georg Brandl479a7e72008-02-05 18:13:15 +00003713 def test_mutable_bases_with_failing_mro(self):
3714 # Testing mutable bases with failing mro...
3715 class WorkOnce(type):
3716 def __new__(self, name, bases, ns):
3717 self.flag = 0
3718 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3719 def mro(self):
3720 if self.flag > 0:
3721 raise RuntimeError("bozo")
3722 else:
3723 self.flag += 1
3724 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003725
Georg Brandl479a7e72008-02-05 18:13:15 +00003726 class WorkAlways(type):
3727 def mro(self):
3728 # this is here to make sure that .mro()s aren't called
3729 # with an exception set (which was possible at one point).
3730 # An error message will be printed in a debug build.
3731 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003732 return type.mro(self)
3733
Georg Brandl479a7e72008-02-05 18:13:15 +00003734 class C(object):
3735 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003736
Georg Brandl479a7e72008-02-05 18:13:15 +00003737 class C2(object):
3738 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003739
Georg Brandl479a7e72008-02-05 18:13:15 +00003740 class D(C):
3741 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003742
Georg Brandl479a7e72008-02-05 18:13:15 +00003743 class E(D):
3744 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003745
Georg Brandl479a7e72008-02-05 18:13:15 +00003746 class F(D, metaclass=WorkOnce):
3747 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003748
Georg Brandl479a7e72008-02-05 18:13:15 +00003749 class G(D, metaclass=WorkAlways):
3750 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003751
Georg Brandl479a7e72008-02-05 18:13:15 +00003752 # Immediate subclasses have their mro's adjusted in alphabetical
3753 # order, so E's will get adjusted before adjusting F's fails. We
3754 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003755
Georg Brandl479a7e72008-02-05 18:13:15 +00003756 E_mro_before = E.__mro__
3757 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003758
Armin Rigofd163f92005-12-29 15:59:19 +00003759 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003760 D.__bases__ = (C2,)
3761 except RuntimeError:
3762 self.assertEqual(E.__mro__, E_mro_before)
3763 self.assertEqual(D.__mro__, D_mro_before)
3764 else:
3765 self.fail("exception not propagated")
3766
3767 def test_mutable_bases_catch_mro_conflict(self):
3768 # Testing mutable bases catch mro conflict...
3769 class A(object):
3770 pass
3771
3772 class B(object):
3773 pass
3774
3775 class C(A, B):
3776 pass
3777
3778 class D(A, B):
3779 pass
3780
3781 class E(C, D):
3782 pass
3783
3784 try:
3785 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003786 except TypeError:
3787 pass
3788 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003789 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003790
Georg Brandl479a7e72008-02-05 18:13:15 +00003791 def test_mutable_names(self):
3792 # Testing mutable names...
3793 class C(object):
3794 pass
3795
3796 # C.__module__ could be 'test_descr' or '__main__'
3797 mod = C.__module__
3798
3799 C.__name__ = 'D'
3800 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3801
3802 C.__name__ = 'D.E'
3803 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3804
3805 def test_subclass_right_op(self):
3806 # Testing correct dispatch of subclass overloading __r<op>__...
3807
3808 # This code tests various cases where right-dispatch of a subclass
3809 # should be preferred over left-dispatch of a base class.
3810
3811 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3812
3813 class B(int):
3814 def __floordiv__(self, other):
3815 return "B.__floordiv__"
3816 def __rfloordiv__(self, other):
3817 return "B.__rfloordiv__"
3818
3819 self.assertEqual(B(1) // 1, "B.__floordiv__")
3820 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3821
3822 # Case 2: subclass of object; this is just the baseline for case 3
3823
3824 class C(object):
3825 def __floordiv__(self, other):
3826 return "C.__floordiv__"
3827 def __rfloordiv__(self, other):
3828 return "C.__rfloordiv__"
3829
3830 self.assertEqual(C() // 1, "C.__floordiv__")
3831 self.assertEqual(1 // C(), "C.__rfloordiv__")
3832
3833 # Case 3: subclass of new-style class; here it gets interesting
3834
3835 class D(C):
3836 def __floordiv__(self, other):
3837 return "D.__floordiv__"
3838 def __rfloordiv__(self, other):
3839 return "D.__rfloordiv__"
3840
3841 self.assertEqual(D() // C(), "D.__floordiv__")
3842 self.assertEqual(C() // D(), "D.__rfloordiv__")
3843
3844 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3845
3846 class E(C):
3847 pass
3848
3849 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3850
3851 self.assertEqual(E() // 1, "C.__floordiv__")
3852 self.assertEqual(1 // E(), "C.__rfloordiv__")
3853 self.assertEqual(E() // C(), "C.__floordiv__")
3854 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3855
Benjamin Petersone549ead2009-03-28 21:42:05 +00003856 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003857 def test_meth_class_get(self):
3858 # Testing __get__ method of METH_CLASS C methods...
3859 # Full coverage of descrobject.c::classmethod_get()
3860
3861 # Baseline
3862 arg = [1, 2, 3]
3863 res = {1: None, 2: None, 3: None}
3864 self.assertEqual(dict.fromkeys(arg), res)
3865 self.assertEqual({}.fromkeys(arg), res)
3866
3867 # Now get the descriptor
3868 descr = dict.__dict__["fromkeys"]
3869
3870 # More baseline using the descriptor directly
3871 self.assertEqual(descr.__get__(None, dict)(arg), res)
3872 self.assertEqual(descr.__get__({})(arg), res)
3873
3874 # Now check various error cases
3875 try:
3876 descr.__get__(None, None)
3877 except TypeError:
3878 pass
3879 else:
3880 self.fail("shouldn't have allowed descr.__get__(None, None)")
3881 try:
3882 descr.__get__(42)
3883 except TypeError:
3884 pass
3885 else:
3886 self.fail("shouldn't have allowed descr.__get__(42)")
3887 try:
3888 descr.__get__(None, 42)
3889 except TypeError:
3890 pass
3891 else:
3892 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3893 try:
3894 descr.__get__(None, int)
3895 except TypeError:
3896 pass
3897 else:
3898 self.fail("shouldn't have allowed descr.__get__(None, int)")
3899
3900 def test_isinst_isclass(self):
3901 # Testing proxy isinstance() and isclass()...
3902 class Proxy(object):
3903 def __init__(self, obj):
3904 self.__obj = obj
3905 def __getattribute__(self, name):
3906 if name.startswith("_Proxy__"):
3907 return object.__getattribute__(self, name)
3908 else:
3909 return getattr(self.__obj, name)
3910 # Test with a classic class
3911 class C:
3912 pass
3913 a = C()
3914 pa = Proxy(a)
Georg Brandlab91fde2009-08-13 08:51:18 +00003915 self.assertTrue(isinstance(a, C)) # Baseline
3916 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003917 # Test with a classic subclass
3918 class D(C):
3919 pass
3920 a = D()
3921 pa = Proxy(a)
Georg Brandlab91fde2009-08-13 08:51:18 +00003922 self.assertTrue(isinstance(a, C)) # Baseline
3923 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003924 # Test with a new-style class
3925 class C(object):
3926 pass
3927 a = C()
3928 pa = Proxy(a)
Georg Brandlab91fde2009-08-13 08:51:18 +00003929 self.assertTrue(isinstance(a, C)) # Baseline
3930 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003931 # Test with a new-style subclass
3932 class D(C):
3933 pass
3934 a = D()
3935 pa = Proxy(a)
Georg Brandlab91fde2009-08-13 08:51:18 +00003936 self.assertTrue(isinstance(a, C)) # Baseline
3937 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003938
3939 def test_proxy_super(self):
3940 # Testing super() for a proxy object...
3941 class Proxy(object):
3942 def __init__(self, obj):
3943 self.__obj = obj
3944 def __getattribute__(self, name):
3945 if name.startswith("_Proxy__"):
3946 return object.__getattribute__(self, name)
3947 else:
3948 return getattr(self.__obj, name)
3949
3950 class B(object):
3951 def f(self):
3952 return "B.f"
3953
3954 class C(B):
3955 def f(self):
3956 return super(C, self).f() + "->C.f"
3957
3958 obj = C()
3959 p = Proxy(obj)
3960 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3961
3962 def test_carloverre(self):
3963 # Testing prohibition of Carlo Verre's hack...
3964 try:
3965 object.__setattr__(str, "foo", 42)
3966 except TypeError:
3967 pass
3968 else:
3969 self.fail("Carlo Verre __setattr__ suceeded!")
3970 try:
3971 object.__delattr__(str, "lower")
3972 except TypeError:
3973 pass
3974 else:
3975 self.fail("Carlo Verre __delattr__ succeeded!")
3976
3977 def test_weakref_segfault(self):
3978 # Testing weakref segfault...
3979 # SF 742911
3980 import weakref
3981
3982 class Provoker:
3983 def __init__(self, referrent):
3984 self.ref = weakref.ref(referrent)
3985
3986 def __del__(self):
3987 x = self.ref()
3988
3989 class Oops(object):
3990 pass
3991
3992 o = Oops()
3993 o.whatever = Provoker(o)
3994 del o
3995
3996 def test_wrapper_segfault(self):
3997 # SF 927248: deeply nested wrappers could cause stack overflow
3998 f = lambda:None
3999 for i in range(1000000):
4000 f = f.__call__
4001 f = None
4002
4003 def test_file_fault(self):
4004 # Testing sys.stdout is changed in getattr...
4005 import sys
4006 class StdoutGuard:
4007 def __getattr__(self, attr):
4008 sys.stdout = sys.__stdout__
4009 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4010 sys.stdout = StdoutGuard()
4011 try:
4012 print("Oops!")
4013 except RuntimeError:
4014 pass
4015
4016 def test_vicious_descriptor_nonsense(self):
4017 # Testing vicious_descriptor_nonsense...
4018
4019 # A potential segfault spotted by Thomas Wouters in mail to
4020 # python-dev 2003-04-17, turned into an example & fixed by Michael
4021 # Hudson just less than four months later...
4022
4023 class Evil(object):
4024 def __hash__(self):
4025 return hash('attr')
4026 def __eq__(self, other):
4027 del C.attr
4028 return 0
4029
4030 class Descr(object):
4031 def __get__(self, ob, type=None):
4032 return 1
4033
4034 class C(object):
4035 attr = Descr()
4036
4037 c = C()
4038 c.__dict__[Evil()] = 0
4039
4040 self.assertEqual(c.attr, 1)
4041 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004042 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004043 self.assertEqual(hasattr(c, 'attr'), False)
4044
4045 def test_init(self):
4046 # SF 1155938
4047 class Foo(object):
4048 def __init__(self):
4049 return 10
4050 try:
4051 Foo()
4052 except TypeError:
4053 pass
4054 else:
4055 self.fail("did not test __init__() for None return")
4056
4057 def test_method_wrapper(self):
4058 # Testing method-wrapper objects...
4059 # <type 'method-wrapper'> did not support any reflection before 2.5
4060
Mark Dickinson211c6252009-02-01 10:28:51 +00004061 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004062
4063 l = []
4064 self.assertEqual(l.__add__, l.__add__)
4065 self.assertEqual(l.__add__, [].__add__)
Georg Brandlab91fde2009-08-13 08:51:18 +00004066 self.assertTrue(l.__add__ != [5].__add__)
4067 self.assertTrue(l.__add__ != l.__mul__)
4068 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004069 if hasattr(l.__add__, '__self__'):
4070 # CPython
Georg Brandlab91fde2009-08-13 08:51:18 +00004071 self.assertTrue(l.__add__.__self__ is l)
4072 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Petersone549ead2009-03-28 21:42:05 +00004073 else:
4074 # Python implementations where [].__add__ is a normal bound method
Georg Brandlab91fde2009-08-13 08:51:18 +00004075 self.assertTrue(l.__add__.im_self is l)
4076 self.assertTrue(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004077 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4078 try:
4079 hash(l.__add__)
4080 except TypeError:
4081 pass
4082 else:
4083 self.fail("no TypeError from hash([].__add__)")
4084
4085 t = ()
4086 t += (7,)
4087 self.assertEqual(t.__add__, (7,).__add__)
4088 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4089
4090 def test_not_implemented(self):
4091 # Testing NotImplemented...
4092 # all binary methods should be able to return a NotImplemented
4093 import sys
4094 import types
4095 import operator
4096
4097 def specialmethod(self, other):
4098 return NotImplemented
4099
4100 def check(expr, x, y):
4101 try:
4102 exec(expr, {'x': x, 'y': y, 'operator': operator})
4103 except TypeError:
4104 pass
4105 else:
4106 self.fail("no TypeError from %r" % (expr,))
4107
4108 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4109 # TypeErrors
4110 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4111 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004112 for name, expr, iexpr in [
4113 ('__add__', 'x + y', 'x += y'),
4114 ('__sub__', 'x - y', 'x -= y'),
4115 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004116 ('__truediv__', 'operator.truediv(x, y)', None),
4117 ('__floordiv__', 'operator.floordiv(x, y)', None),
4118 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004119 ('__mod__', 'x % y', 'x %= y'),
4120 ('__divmod__', 'divmod(x, y)', None),
4121 ('__pow__', 'x ** y', 'x **= y'),
4122 ('__lshift__', 'x << y', 'x <<= y'),
4123 ('__rshift__', 'x >> y', 'x >>= y'),
4124 ('__and__', 'x & y', 'x &= y'),
4125 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004126 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004127 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004128 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004129 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004130 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004131 check(expr, a, N1)
4132 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004133 if iexpr:
4134 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004135 check(iexpr, a, N1)
4136 check(iexpr, a, N2)
4137 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004138 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004139 c = C()
4140 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004141 check(iexpr, c, N1)
4142 check(iexpr, c, N2)
4143
Georg Brandl479a7e72008-02-05 18:13:15 +00004144 def test_assign_slice(self):
4145 # ceval.c's assign_slice used to check for
4146 # tp->tp_as_sequence->sq_slice instead of
4147 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004148
Georg Brandl479a7e72008-02-05 18:13:15 +00004149 class C(object):
4150 def __setitem__(self, idx, value):
4151 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004152
Georg Brandl479a7e72008-02-05 18:13:15 +00004153 c = C()
4154 c[1:2] = 3
4155 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004156
Benjamin Peterson9262b842008-11-17 22:45:50 +00004157 def test_getattr_hooks(self):
4158 # issue 4230
4159
4160 class Descriptor(object):
4161 counter = 0
4162 def __get__(self, obj, objtype=None):
4163 def getter(name):
4164 self.counter += 1
4165 raise AttributeError(name)
4166 return getter
4167
4168 descr = Descriptor()
4169 class A(object):
4170 __getattribute__ = descr
4171 class B(object):
4172 __getattr__ = descr
4173 class C(object):
4174 __getattribute__ = descr
4175 __getattr__ = descr
4176
4177 self.assertRaises(AttributeError, getattr, A(), "attr")
4178 self.assertEquals(descr.counter, 1)
4179 self.assertRaises(AttributeError, getattr, B(), "attr")
4180 self.assertEquals(descr.counter, 2)
4181 self.assertRaises(AttributeError, getattr, C(), "attr")
4182 self.assertEquals(descr.counter, 4)
4183
4184 import gc
4185 class EvilGetattribute(object):
4186 # This used to segfault
4187 def __getattr__(self, name):
4188 raise AttributeError(name)
4189 def __getattribute__(self, name):
4190 del EvilGetattribute.__getattr__
4191 for i in range(5):
4192 gc.collect()
4193 raise AttributeError(name)
4194
4195 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4196
Christian Heimesbbffeb62008-01-24 09:42:52 +00004197
Georg Brandl479a7e72008-02-05 18:13:15 +00004198class DictProxyTests(unittest.TestCase):
4199 def setUp(self):
4200 class C(object):
4201 def meth(self):
4202 pass
4203 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004204
Georg Brandl479a7e72008-02-05 18:13:15 +00004205 def test_iter_keys(self):
4206 # Testing dict-proxy iterkeys...
4207 keys = [ key for key in self.C.__dict__.keys() ]
4208 keys.sort()
4209 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4210 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004211
Georg Brandl479a7e72008-02-05 18:13:15 +00004212 def test_iter_values(self):
4213 # Testing dict-proxy itervalues...
4214 values = [ values for values in self.C.__dict__.values() ]
4215 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004216
Georg Brandl479a7e72008-02-05 18:13:15 +00004217 def test_iter_items(self):
4218 # Testing dict-proxy iteritems...
4219 keys = [ key for (key, value) in self.C.__dict__.items() ]
4220 keys.sort()
4221 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4222 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004223
Georg Brandl479a7e72008-02-05 18:13:15 +00004224 def test_dict_type_with_metaclass(self):
4225 # Testing type of __dict__ when metaclass set...
4226 class B(object):
4227 pass
4228 class M(type):
4229 pass
4230 class C(metaclass=M):
4231 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4232 pass
4233 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004234
Christian Heimesbbffeb62008-01-24 09:42:52 +00004235
Georg Brandl479a7e72008-02-05 18:13:15 +00004236class PTypesLongInitTest(unittest.TestCase):
4237 # This is in its own TestCase so that it can be run before any other tests.
4238 def test_pytype_long_ready(self):
4239 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004240
Georg Brandl479a7e72008-02-05 18:13:15 +00004241 # This dumps core when SF bug 551412 isn't fixed --
4242 # but only when test_descr.py is run separately.
4243 # (That can't be helped -- as soon as PyType_Ready()
4244 # is called for PyLong_Type, the bug is gone.)
4245 class UserLong(object):
4246 def __pow__(self, *args):
4247 pass
4248 try:
4249 pow(0, UserLong(), 0)
4250 except:
4251 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004252
Georg Brandl479a7e72008-02-05 18:13:15 +00004253 # Another segfault only when run early
4254 # (before PyType_Ready(tuple) is called)
4255 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004256
4257
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004258def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004259 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004260 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004261 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004262
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004263if __name__ == "__main__":
4264 test_main()