blob: 320a7a70f6bbe42a23df7ff5cdefba8e186e47e8 [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
Mark Dickinsona67c70d2010-09-23 20:16:03 +0000292 def test_explicit_reverse_methods(self):
293 # see issue 9930
294 self.assertEqual(complex.__radd__(3j, 4.0), complex(4.0, 3.0))
295 self.assertEqual(float.__rsub__(3.0, 1), -2.0)
296
Benjamin Petersone549ead2009-03-28 21:42:05 +0000297 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000298 def test_spam_lists(self):
299 # Testing spamlist operations...
300 import copy, xxsubtype as spam
301
302 def spamlist(l, memo=None):
303 import xxsubtype as spam
304 return spam.spamlist(l)
305
306 # This is an ugly hack:
307 copy._deepcopy_dispatch[spam.spamlist] = spamlist
308
309 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
310 "__add__")
311 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
312 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
313 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
314 self.sliceop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
315 "__getitem__")
316 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
317 "__iadd__")
318 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
319 "__imul__")
320 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
321 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
322 "__mul__")
323 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
324 "__rmul__")
325 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
326 "__setitem__")
327 self.setsliceop_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
328 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
329 # Test subclassing
330 class C(spam.spamlist):
331 def foo(self): return 1
332 a = C()
333 self.assertEqual(a, [])
334 self.assertEqual(a.foo(), 1)
335 a.append(100)
336 self.assertEqual(a, [100])
337 self.assertEqual(a.getstate(), 0)
338 a.setstate(42)
339 self.assertEqual(a.getstate(), 42)
340
Benjamin Petersone549ead2009-03-28 21:42:05 +0000341 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000342 def test_spam_dicts(self):
343 # Testing spamdict operations...
344 import copy, xxsubtype as spam
345 def spamdict(d, memo=None):
346 import xxsubtype as spam
347 sd = spam.spamdict()
348 for k, v in list(d.items()):
349 sd[k] = v
350 return sd
351 # This is an ugly hack:
352 copy._deepcopy_dispatch[spam.spamdict] = spamdict
353
Georg Brandl479a7e72008-02-05 18:13:15 +0000354 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
355 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
356 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
357 d = spamdict({1:2,3:4})
358 l1 = []
359 for i in list(d.keys()):
360 l1.append(i)
361 l = []
362 for i in iter(d):
363 l.append(i)
364 self.assertEqual(l, l1)
365 l = []
366 for i in d.__iter__():
367 l.append(i)
368 self.assertEqual(l, l1)
369 l = []
370 for i in type(spamdict({})).__iter__(d):
371 l.append(i)
372 self.assertEqual(l, l1)
373 straightd = {1:2, 3:4}
374 spamd = spamdict(straightd)
375 self.unop_test(spamd, 2, "len(a)", "__len__")
376 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
377 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
378 "a[b]=c", "__setitem__")
379 # Test subclassing
380 class C(spam.spamdict):
381 def foo(self): return 1
382 a = C()
383 self.assertEqual(list(a.items()), [])
384 self.assertEqual(a.foo(), 1)
385 a['foo'] = 'bar'
386 self.assertEqual(list(a.items()), [('foo', 'bar')])
387 self.assertEqual(a.getstate(), 0)
388 a.setstate(100)
389 self.assertEqual(a.getstate(), 100)
390
391class ClassPropertiesAndMethods(unittest.TestCase):
392
393 def test_python_dicts(self):
394 # Testing Python subclass of dict...
Georg Brandlab91fde2009-08-13 08:51:18 +0000395 self.assertTrue(issubclass(dict, dict))
396 self.assertTrue(isinstance({}, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000397 d = dict()
398 self.assertEqual(d, {})
Georg Brandlab91fde2009-08-13 08:51:18 +0000399 self.assertTrue(d.__class__ is dict)
400 self.assertTrue(isinstance(d, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000401 class C(dict):
402 state = -1
403 def __init__(self_local, *a, **kw):
404 if a:
405 self.assertEqual(len(a), 1)
406 self_local.state = a[0]
407 if kw:
408 for k, v in list(kw.items()):
409 self_local[v] = k
410 def __getitem__(self, key):
411 return self.get(key, 0)
412 def __setitem__(self_local, key, value):
Georg Brandlab91fde2009-08-13 08:51:18 +0000413 self.assertTrue(isinstance(key, type(0)))
Georg Brandl479a7e72008-02-05 18:13:15 +0000414 dict.__setitem__(self_local, key, value)
415 def setstate(self, state):
416 self.state = state
417 def getstate(self):
418 return self.state
Georg Brandlab91fde2009-08-13 08:51:18 +0000419 self.assertTrue(issubclass(C, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000420 a1 = C(12)
421 self.assertEqual(a1.state, 12)
422 a2 = C(foo=1, bar=2)
423 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
424 a = C()
425 self.assertEqual(a.state, -1)
426 self.assertEqual(a.getstate(), -1)
427 a.setstate(0)
428 self.assertEqual(a.state, 0)
429 self.assertEqual(a.getstate(), 0)
430 a.setstate(10)
431 self.assertEqual(a.state, 10)
432 self.assertEqual(a.getstate(), 10)
433 self.assertEqual(a[42], 0)
434 a[42] = 24
435 self.assertEqual(a[42], 24)
436 N = 50
437 for i in range(N):
438 a[i] = C()
439 for j in range(N):
440 a[i][j] = i*j
441 for i in range(N):
442 for j in range(N):
443 self.assertEqual(a[i][j], i*j)
444
445 def test_python_lists(self):
446 # Testing Python subclass of list...
447 class C(list):
448 def __getitem__(self, i):
449 if isinstance(i, slice):
450 return i.start, i.stop
451 return list.__getitem__(self, i) + 100
452 a = C()
453 a.extend([0,1,2])
454 self.assertEqual(a[0], 100)
455 self.assertEqual(a[1], 101)
456 self.assertEqual(a[2], 102)
457 self.assertEqual(a[100:200], (100,200))
458
459 def test_metaclass(self):
Georg Brandle81f5ef2008-05-27 20:34:09 +0000460 # Testing metaclasses...
Georg Brandl479a7e72008-02-05 18:13:15 +0000461 class C(metaclass=type):
462 def __init__(self):
463 self.__state = 0
464 def getstate(self):
465 return self.__state
466 def setstate(self, state):
467 self.__state = state
468 a = C()
469 self.assertEqual(a.getstate(), 0)
470 a.setstate(10)
471 self.assertEqual(a.getstate(), 10)
472 class _metaclass(type):
473 def myself(cls): return cls
474 class D(metaclass=_metaclass):
475 pass
476 self.assertEqual(D.myself(), D)
477 d = D()
478 self.assertEqual(d.__class__, D)
479 class M1(type):
480 def __new__(cls, name, bases, dict):
481 dict['__spam__'] = 1
482 return type.__new__(cls, name, bases, dict)
483 class C(metaclass=M1):
484 pass
485 self.assertEqual(C.__spam__, 1)
486 c = C()
487 self.assertEqual(c.__spam__, 1)
488
489 class _instance(object):
490 pass
491 class M2(object):
492 @staticmethod
493 def __new__(cls, name, bases, dict):
494 self = object.__new__(cls)
495 self.name = name
496 self.bases = bases
497 self.dict = dict
498 return self
499 def __call__(self):
500 it = _instance()
501 # Early binding of methods
502 for key in self.dict:
503 if key.startswith("__"):
504 continue
505 setattr(it, key, self.dict[key].__get__(it, self))
506 return it
507 class C(metaclass=M2):
508 def spam(self):
509 return 42
510 self.assertEqual(C.name, 'C')
511 self.assertEqual(C.bases, ())
Georg Brandlab91fde2009-08-13 08:51:18 +0000512 self.assertTrue('spam' in C.dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000513 c = C()
514 self.assertEqual(c.spam(), 42)
515
516 # More metaclass examples
517
518 class autosuper(type):
519 # Automatically add __super to the class
520 # This trick only works for dynamic classes
521 def __new__(metaclass, name, bases, dict):
522 cls = super(autosuper, metaclass).__new__(metaclass,
523 name, bases, dict)
524 # Name mangling for __super removes leading underscores
525 while name[:1] == "_":
526 name = name[1:]
527 if name:
528 name = "_%s__super" % name
529 else:
530 name = "__super"
531 setattr(cls, name, super(cls))
532 return cls
533 class A(metaclass=autosuper):
534 def meth(self):
535 return "A"
536 class B(A):
537 def meth(self):
538 return "B" + self.__super.meth()
539 class C(A):
540 def meth(self):
541 return "C" + self.__super.meth()
542 class D(C, B):
543 def meth(self):
544 return "D" + self.__super.meth()
545 self.assertEqual(D().meth(), "DCBA")
546 class E(B, C):
547 def meth(self):
548 return "E" + self.__super.meth()
549 self.assertEqual(E().meth(), "EBCA")
550
551 class autoproperty(type):
552 # Automatically create property attributes when methods
553 # named _get_x and/or _set_x are found
554 def __new__(metaclass, name, bases, dict):
555 hits = {}
556 for key, val in dict.items():
557 if key.startswith("_get_"):
558 key = key[5:]
559 get, set = hits.get(key, (None, None))
560 get = val
561 hits[key] = get, set
562 elif key.startswith("_set_"):
563 key = key[5:]
564 get, set = hits.get(key, (None, None))
565 set = val
566 hits[key] = get, set
567 for key, (get, set) in hits.items():
568 dict[key] = property(get, set)
569 return super(autoproperty, metaclass).__new__(metaclass,
570 name, bases, dict)
571 class A(metaclass=autoproperty):
572 def _get_x(self):
573 return -self.__x
574 def _set_x(self, x):
575 self.__x = -x
576 a = A()
Georg Brandlab91fde2009-08-13 08:51:18 +0000577 self.assertTrue(not hasattr(a, "x"))
Georg Brandl479a7e72008-02-05 18:13:15 +0000578 a.x = 12
579 self.assertEqual(a.x, 12)
580 self.assertEqual(a._A__x, -12)
581
582 class multimetaclass(autoproperty, autosuper):
583 # Merge of multiple cooperating metaclasses
584 pass
585 class A(metaclass=multimetaclass):
586 def _get_x(self):
587 return "A"
588 class B(A):
589 def _get_x(self):
590 return "B" + self.__super._get_x()
591 class C(A):
592 def _get_x(self):
593 return "C" + self.__super._get_x()
594 class D(C, B):
595 def _get_x(self):
596 return "D" + self.__super._get_x()
597 self.assertEqual(D().x, "DCBA")
598
599 # Make sure type(x) doesn't call x.__class__.__init__
600 class T(type):
601 counter = 0
602 def __init__(self, *args):
603 T.counter += 1
604 class C(metaclass=T):
605 pass
606 self.assertEqual(T.counter, 1)
607 a = C()
608 self.assertEqual(type(a), C)
609 self.assertEqual(T.counter, 1)
610
611 class C(object): pass
612 c = C()
613 try: c()
614 except TypeError: pass
615 else: self.fail("calling object w/o call method should raise "
616 "TypeError")
617
618 # Testing code to find most derived baseclass
619 class A(type):
620 def __new__(*args, **kwargs):
621 return type.__new__(*args, **kwargs)
622
623 class B(object):
624 pass
625
626 class C(object, metaclass=A):
627 pass
628
629 # The most derived metaclass of D is A rather than type.
630 class D(B, C):
631 pass
632
633 def test_module_subclasses(self):
634 # Testing Python subclass of module...
635 log = []
636 import types, sys
637 MT = type(sys)
638 class MM(MT):
639 def __init__(self, name):
640 MT.__init__(self, name)
641 def __getattribute__(self, name):
642 log.append(("getattr", name))
643 return MT.__getattribute__(self, name)
644 def __setattr__(self, name, value):
645 log.append(("setattr", name, value))
646 MT.__setattr__(self, name, value)
647 def __delattr__(self, name):
648 log.append(("delattr", name))
649 MT.__delattr__(self, name)
650 a = MM("a")
651 a.foo = 12
652 x = a.foo
653 del a.foo
654 self.assertEqual(log, [("setattr", "foo", 12),
655 ("getattr", "foo"),
656 ("delattr", "foo")])
657
658 # http://python.org/sf/1174712
Tim Peters1fc240e2001-10-26 05:06:50 +0000659 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000660 class Module(types.ModuleType, str):
661 pass
662 except TypeError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000663 pass
664 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000665 self.fail("inheriting from ModuleType and str at the same time "
666 "should fail")
Tim Peters1fc240e2001-10-26 05:06:50 +0000667
Georg Brandl479a7e72008-02-05 18:13:15 +0000668 def test_multiple_inheritance(self):
669 # Testing multiple inheritance...
670 class C(object):
671 def __init__(self):
672 self.__state = 0
673 def getstate(self):
674 return self.__state
675 def setstate(self, state):
676 self.__state = state
677 a = C()
678 self.assertEqual(a.getstate(), 0)
679 a.setstate(10)
680 self.assertEqual(a.getstate(), 10)
681 class D(dict, C):
682 def __init__(self):
683 type({}).__init__(self)
684 C.__init__(self)
685 d = D()
686 self.assertEqual(list(d.keys()), [])
687 d["hello"] = "world"
688 self.assertEqual(list(d.items()), [("hello", "world")])
689 self.assertEqual(d["hello"], "world")
690 self.assertEqual(d.getstate(), 0)
691 d.setstate(10)
692 self.assertEqual(d.getstate(), 10)
693 self.assertEqual(D.__mro__, (D, dict, C, object))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000694
Georg Brandl479a7e72008-02-05 18:13:15 +0000695 # SF bug #442833
696 class Node(object):
697 def __int__(self):
698 return int(self.foo())
699 def foo(self):
700 return "23"
701 class Frag(Node, list):
702 def foo(self):
703 return "42"
704 self.assertEqual(Node().__int__(), 23)
705 self.assertEqual(int(Node()), 23)
706 self.assertEqual(Frag().__int__(), 42)
707 self.assertEqual(int(Frag()), 42)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000708
Georg Brandl479a7e72008-02-05 18:13:15 +0000709 def test_diamond_inheritence(self):
710 # Testing multiple inheritance special cases...
711 class A(object):
712 def spam(self): return "A"
713 self.assertEqual(A().spam(), "A")
714 class B(A):
715 def boo(self): return "B"
716 def spam(self): return "B"
717 self.assertEqual(B().spam(), "B")
718 self.assertEqual(B().boo(), "B")
719 class C(A):
720 def boo(self): return "C"
721 self.assertEqual(C().spam(), "A")
722 self.assertEqual(C().boo(), "C")
723 class D(B, C): pass
724 self.assertEqual(D().spam(), "B")
725 self.assertEqual(D().boo(), "B")
726 self.assertEqual(D.__mro__, (D, B, C, A, object))
727 class E(C, B): pass
728 self.assertEqual(E().spam(), "B")
729 self.assertEqual(E().boo(), "C")
730 self.assertEqual(E.__mro__, (E, C, B, A, object))
731 # MRO order disagreement
732 try:
733 class F(D, E): pass
734 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000735 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000736 else:
737 self.fail("expected MRO order disagreement (F)")
738 try:
739 class G(E, D): pass
740 except TypeError:
741 pass
742 else:
743 self.fail("expected MRO order disagreement (G)")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000744
Georg Brandl479a7e72008-02-05 18:13:15 +0000745 # see thread python-dev/2002-October/029035.html
746 def test_ex5_from_c3_switch(self):
747 # Testing ex5 from C3 switch discussion...
748 class A(object): pass
749 class B(object): pass
750 class C(object): pass
751 class X(A): pass
752 class Y(A): pass
753 class Z(X,B,Y,C): pass
754 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000755
Georg Brandl479a7e72008-02-05 18:13:15 +0000756 # see "A Monotonic Superclass Linearization for Dylan",
757 # by Kim Barrett et al. (OOPSLA 1996)
758 def test_monotonicity(self):
759 # Testing MRO monotonicity...
760 class Boat(object): pass
761 class DayBoat(Boat): pass
762 class WheelBoat(Boat): pass
763 class EngineLess(DayBoat): pass
764 class SmallMultihull(DayBoat): pass
765 class PedalWheelBoat(EngineLess,WheelBoat): pass
766 class SmallCatamaran(SmallMultihull): pass
767 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
Guido van Rossume45763a2001-08-10 21:28:46 +0000768
Georg Brandl479a7e72008-02-05 18:13:15 +0000769 self.assertEqual(PedalWheelBoat.__mro__,
770 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
771 self.assertEqual(SmallCatamaran.__mro__,
772 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
773 self.assertEqual(Pedalo.__mro__,
774 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
775 SmallMultihull, DayBoat, WheelBoat, Boat, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000776
Georg Brandl479a7e72008-02-05 18:13:15 +0000777 # see "A Monotonic Superclass Linearization for Dylan",
778 # by Kim Barrett et al. (OOPSLA 1996)
779 def test_consistency_with_epg(self):
780 # Testing consistentcy with EPG...
781 class Pane(object): pass
782 class ScrollingMixin(object): pass
783 class EditingMixin(object): pass
784 class ScrollablePane(Pane,ScrollingMixin): pass
785 class EditablePane(Pane,EditingMixin): pass
786 class EditableScrollablePane(ScrollablePane,EditablePane): pass
Guido van Rossum9a818922002-11-14 19:50:14 +0000787
Georg Brandl479a7e72008-02-05 18:13:15 +0000788 self.assertEqual(EditableScrollablePane.__mro__,
789 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
790 ScrollingMixin, EditingMixin, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000791
Georg Brandl479a7e72008-02-05 18:13:15 +0000792 def test_mro_disagreement(self):
793 # Testing error messages for MRO disagreement...
794 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000795order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000796
Georg Brandl479a7e72008-02-05 18:13:15 +0000797 def raises(exc, expected, callable, *args):
Guido van Rossum58da9312007-11-10 23:39:45 +0000798 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000799 callable(*args)
800 except exc as msg:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000801 # the exact msg is generally considered an impl detail
802 if support.check_impl_detail():
803 if not str(msg).startswith(expected):
804 self.fail("Message %r, expected %r" %
805 (str(msg), expected))
Georg Brandl479a7e72008-02-05 18:13:15 +0000806 else:
807 self.fail("Expected %s" % exc)
Guido van Rossum58da9312007-11-10 23:39:45 +0000808
Georg Brandl479a7e72008-02-05 18:13:15 +0000809 class A(object): pass
810 class B(A): pass
811 class C(object): pass
Christian Heimes9a371592007-12-28 14:08:13 +0000812
Georg Brandl479a7e72008-02-05 18:13:15 +0000813 # Test some very simple errors
814 raises(TypeError, "duplicate base class A",
815 type, "X", (A, A), {})
816 raises(TypeError, mro_err_msg,
817 type, "X", (A, B), {})
818 raises(TypeError, mro_err_msg,
819 type, "X", (A, C, B), {})
820 # Test a slightly more complex error
821 class GridLayout(object): pass
822 class HorizontalGrid(GridLayout): pass
823 class VerticalGrid(GridLayout): pass
824 class HVGrid(HorizontalGrid, VerticalGrid): pass
825 class VHGrid(VerticalGrid, HorizontalGrid): pass
826 raises(TypeError, mro_err_msg,
827 type, "ConfusedGrid", (HVGrid, VHGrid), {})
Guido van Rossum58da9312007-11-10 23:39:45 +0000828
Georg Brandl479a7e72008-02-05 18:13:15 +0000829 def test_object_class(self):
830 # Testing object class...
831 a = object()
832 self.assertEqual(a.__class__, object)
833 self.assertEqual(type(a), object)
834 b = object()
835 self.assertNotEqual(a, b)
836 self.assertFalse(hasattr(a, "foo"))
Tim Peters808b94e2001-09-13 19:33:07 +0000837 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000838 a.foo = 12
839 except (AttributeError, TypeError):
Tim Peters808b94e2001-09-13 19:33:07 +0000840 pass
841 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000842 self.fail("object() should not allow setting a foo attribute")
843 self.assertFalse(hasattr(object(), "__dict__"))
Tim Peters561f8992001-09-13 19:36:36 +0000844
Georg Brandl479a7e72008-02-05 18:13:15 +0000845 class Cdict(object):
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000846 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000847 x = Cdict()
848 self.assertEqual(x.__dict__, {})
849 x.foo = 1
850 self.assertEqual(x.foo, 1)
851 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossumd8faa362007-04-27 19:54:29 +0000852
Georg Brandl479a7e72008-02-05 18:13:15 +0000853 def test_slots(self):
854 # Testing __slots__...
855 class C0(object):
856 __slots__ = []
857 x = C0()
858 self.assertFalse(hasattr(x, "__dict__"))
859 self.assertFalse(hasattr(x, "foo"))
860
861 class C1(object):
862 __slots__ = ['a']
863 x = C1()
864 self.assertFalse(hasattr(x, "__dict__"))
865 self.assertFalse(hasattr(x, "a"))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000866 x.a = 1
Georg Brandl479a7e72008-02-05 18:13:15 +0000867 self.assertEqual(x.a, 1)
868 x.a = None
869 self.assertEqual(x.a, None)
870 del x.a
871 self.assertFalse(hasattr(x, "a"))
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000872
Georg Brandl479a7e72008-02-05 18:13:15 +0000873 class C3(object):
874 __slots__ = ['a', 'b', 'c']
875 x = C3()
876 self.assertFalse(hasattr(x, "__dict__"))
877 self.assertFalse(hasattr(x, 'a'))
878 self.assertFalse(hasattr(x, 'b'))
879 self.assertFalse(hasattr(x, 'c'))
880 x.a = 1
881 x.b = 2
882 x.c = 3
883 self.assertEqual(x.a, 1)
884 self.assertEqual(x.b, 2)
885 self.assertEqual(x.c, 3)
886
887 class C4(object):
888 """Validate name mangling"""
889 __slots__ = ['__a']
890 def __init__(self, value):
891 self.__a = value
892 def get(self):
893 return self.__a
894 x = C4(5)
895 self.assertFalse(hasattr(x, '__dict__'))
896 self.assertFalse(hasattr(x, '__a'))
897 self.assertEqual(x.get(), 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000898 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000899 x.__a = 6
900 except AttributeError:
Guido van Rossum6661be32001-10-26 04:26:12 +0000901 pass
902 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000903 self.fail("Double underscored names not mangled")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000904
Georg Brandl479a7e72008-02-05 18:13:15 +0000905 # Make sure slot names are proper identifiers
Guido van Rossum360e4b82007-05-14 22:51:27 +0000906 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000907 class C(object):
908 __slots__ = [None]
Guido van Rossum360e4b82007-05-14 22:51:27 +0000909 except TypeError:
910 pass
911 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000912 self.fail("[None] slots not caught")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000913 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000914 class C(object):
915 __slots__ = ["foo bar"]
916 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000917 pass
918 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000919 self.fail("['foo bar'] slots not caught")
920 try:
921 class C(object):
922 __slots__ = ["foo\0bar"]
923 except TypeError:
924 pass
925 else:
926 self.fail("['foo\\0bar'] slots not caught")
927 try:
928 class C(object):
929 __slots__ = ["1"]
930 except TypeError:
931 pass
932 else:
933 self.fail("['1'] slots not caught")
934 try:
935 class C(object):
936 __slots__ = [""]
937 except TypeError:
938 pass
939 else:
940 self.fail("[''] slots not caught")
941 class C(object):
942 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
943 # XXX(nnorwitz): was there supposed to be something tested
944 # from the class above?
Guido van Rossum360e4b82007-05-14 22:51:27 +0000945
Georg Brandl479a7e72008-02-05 18:13:15 +0000946 # Test a single string is not expanded as a sequence.
947 class C(object):
948 __slots__ = "abc"
949 c = C()
950 c.abc = 5
951 self.assertEqual(c.abc, 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000952
Georg Brandl479a7e72008-02-05 18:13:15 +0000953 # Test unicode slot names
954 # Test a single unicode string is not expanded as a sequence.
955 class C(object):
956 __slots__ = "abc"
957 c = C()
958 c.abc = 5
959 self.assertEqual(c.abc, 5)
Guido van Rossum3926a632001-09-25 16:25:58 +0000960
Georg Brandl479a7e72008-02-05 18:13:15 +0000961 # _unicode_to_string used to modify slots in certain circumstances
962 slots = ("foo", "bar")
963 class C(object):
964 __slots__ = slots
965 x = C()
966 x.foo = 5
967 self.assertEqual(x.foo, 5)
Georg Brandlab91fde2009-08-13 08:51:18 +0000968 self.assertTrue(type(slots[0]) is str)
Georg Brandl479a7e72008-02-05 18:13:15 +0000969 # this used to leak references
970 try:
971 class C(object):
972 __slots__ = [chr(128)]
973 except (TypeError, UnicodeEncodeError):
974 pass
975 else:
976 raise TestFailed("[chr(128)] slots not caught")
Guido van Rossum3926a632001-09-25 16:25:58 +0000977
Georg Brandl479a7e72008-02-05 18:13:15 +0000978 # Test leaks
979 class Counted(object):
980 counter = 0 # counts the number of instances alive
981 def __init__(self):
982 Counted.counter += 1
983 def __del__(self):
984 Counted.counter -= 1
985 class C(object):
986 __slots__ = ['a', 'b', 'c']
987 x = C()
988 x.a = Counted()
989 x.b = Counted()
990 x.c = Counted()
991 self.assertEqual(Counted.counter, 3)
992 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000993 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000994 self.assertEqual(Counted.counter, 0)
995 class D(C):
996 pass
997 x = D()
998 x.a = Counted()
999 x.z = Counted()
1000 self.assertEqual(Counted.counter, 2)
1001 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +00001002 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001003 self.assertEqual(Counted.counter, 0)
1004 class E(D):
1005 __slots__ = ['e']
1006 x = E()
1007 x.a = Counted()
1008 x.z = Counted()
1009 x.e = Counted()
1010 self.assertEqual(Counted.counter, 3)
1011 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +00001012 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001013 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001014
Georg Brandl479a7e72008-02-05 18:13:15 +00001015 # Test cyclical leaks [SF bug 519621]
1016 class F(object):
1017 __slots__ = ['a', 'b']
1018 log = []
1019 s = F()
1020 s.a = [Counted(), s]
1021 self.assertEqual(Counted.counter, 1)
1022 s = None
Benjamin Petersone549ead2009-03-28 21:42:05 +00001023 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001024 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001025
Georg Brandl479a7e72008-02-05 18:13:15 +00001026 # Test lookup leaks [SF bug 572567]
1027 import sys,gc
Benjamin Petersone549ead2009-03-28 21:42:05 +00001028 if hasattr(gc, 'get_objects'):
1029 class G(object):
1030 def __cmp__(self, other):
1031 return 0
1032 g = G()
1033 orig_objects = len(gc.get_objects())
1034 for i in range(10):
1035 g==g
1036 new_objects = len(gc.get_objects())
1037 self.assertEqual(orig_objects, new_objects)
1038
Georg Brandl479a7e72008-02-05 18:13:15 +00001039 class H(object):
1040 __slots__ = ['a', 'b']
1041 def __init__(self):
1042 self.a = 1
1043 self.b = 2
1044 def __del__(self_):
1045 self.assertEqual(self_.a, 1)
1046 self.assertEqual(self_.b, 2)
Benjamin Petersonc1de4cc2008-11-03 21:29:09 +00001047 with support.captured_output('stderr') as s:
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001048 h = H()
Georg Brandl479a7e72008-02-05 18:13:15 +00001049 del h
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001050 self.assertEqual(s.getvalue(), '')
Guido van Rossum90c45142001-11-24 21:07:01 +00001051
Benjamin Peterson533849a2009-12-30 19:47:05 +00001052 class X(object):
1053 __slots__ = "a"
1054 with self.assertRaises(AttributeError):
1055 del X().a
1056
Georg Brandl479a7e72008-02-05 18:13:15 +00001057 def test_slots_special(self):
1058 # Testing __dict__ and __weakref__ in __slots__...
1059 class D(object):
1060 __slots__ = ["__dict__"]
1061 a = D()
Georg Brandlab91fde2009-08-13 08:51:18 +00001062 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001063 self.assertFalse(hasattr(a, "__weakref__"))
1064 a.foo = 42
1065 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum90c45142001-11-24 21:07:01 +00001066
Georg Brandl479a7e72008-02-05 18:13:15 +00001067 class W(object):
1068 __slots__ = ["__weakref__"]
1069 a = W()
Georg Brandlab91fde2009-08-13 08:51:18 +00001070 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001071 self.assertFalse(hasattr(a, "__dict__"))
1072 try:
1073 a.foo = 42
1074 except AttributeError:
1075 pass
1076 else:
1077 self.fail("shouldn't be allowed to set a.foo")
1078
1079 class C1(W, D):
1080 __slots__ = []
1081 a = C1()
Georg Brandlab91fde2009-08-13 08:51:18 +00001082 self.assertTrue(hasattr(a, "__dict__"))
1083 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001084 a.foo = 42
1085 self.assertEqual(a.__dict__, {"foo": 42})
1086
1087 class C2(D, W):
1088 __slots__ = []
1089 a = C2()
Georg Brandlab91fde2009-08-13 08:51:18 +00001090 self.assertTrue(hasattr(a, "__dict__"))
1091 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001092 a.foo = 42
1093 self.assertEqual(a.__dict__, {"foo": 42})
1094
Christian Heimesa156e092008-02-16 07:38:31 +00001095 def test_slots_descriptor(self):
1096 # Issue2115: slot descriptors did not correctly check
1097 # the type of the given object
1098 import abc
1099 class MyABC(metaclass=abc.ABCMeta):
1100 __slots__ = "a"
1101
1102 class Unrelated(object):
1103 pass
1104 MyABC.register(Unrelated)
1105
1106 u = Unrelated()
Georg Brandlab91fde2009-08-13 08:51:18 +00001107 self.assertTrue(isinstance(u, MyABC))
Christian Heimesa156e092008-02-16 07:38:31 +00001108
1109 # This used to crash
1110 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1111
Georg Brandl479a7e72008-02-05 18:13:15 +00001112 def test_dynamics(self):
1113 # Testing class attribute propagation...
1114 class D(object):
1115 pass
1116 class E(D):
1117 pass
1118 class F(D):
1119 pass
1120 D.foo = 1
1121 self.assertEqual(D.foo, 1)
1122 # Test that dynamic attributes are inherited
1123 self.assertEqual(E.foo, 1)
1124 self.assertEqual(F.foo, 1)
1125 # Test dynamic instances
1126 class C(object):
1127 pass
1128 a = C()
1129 self.assertFalse(hasattr(a, "foobar"))
1130 C.foobar = 2
1131 self.assertEqual(a.foobar, 2)
1132 C.method = lambda self: 42
1133 self.assertEqual(a.method(), 42)
1134 C.__repr__ = lambda self: "C()"
1135 self.assertEqual(repr(a), "C()")
1136 C.__int__ = lambda self: 100
1137 self.assertEqual(int(a), 100)
1138 self.assertEqual(a.foobar, 2)
1139 self.assertFalse(hasattr(a, "spam"))
1140 def mygetattr(self, name):
1141 if name == "spam":
1142 return "spam"
1143 raise AttributeError
1144 C.__getattr__ = mygetattr
1145 self.assertEqual(a.spam, "spam")
1146 a.new = 12
1147 self.assertEqual(a.new, 12)
1148 def mysetattr(self, name, value):
1149 if name == "spam":
1150 raise AttributeError
1151 return object.__setattr__(self, name, value)
1152 C.__setattr__ = mysetattr
1153 try:
1154 a.spam = "not spam"
1155 except AttributeError:
1156 pass
1157 else:
1158 self.fail("expected AttributeError")
1159 self.assertEqual(a.spam, "spam")
1160 class D(C):
1161 pass
1162 d = D()
1163 d.foo = 1
1164 self.assertEqual(d.foo, 1)
1165
1166 # Test handling of int*seq and seq*int
1167 class I(int):
1168 pass
1169 self.assertEqual("a"*I(2), "aa")
1170 self.assertEqual(I(2)*"a", "aa")
1171 self.assertEqual(2*I(3), 6)
1172 self.assertEqual(I(3)*2, 6)
1173 self.assertEqual(I(3)*I(2), 6)
1174
1175 # Test handling of long*seq and seq*long
1176 class L(int):
1177 pass
1178 self.assertEqual("a"*L(2), "aa")
1179 self.assertEqual(L(2)*"a", "aa")
1180 self.assertEqual(2*L(3), 6)
1181 self.assertEqual(L(3)*2, 6)
1182 self.assertEqual(L(3)*L(2), 6)
1183
1184 # Test comparison of classes with dynamic metaclasses
1185 class dynamicmetaclass(type):
1186 pass
1187 class someclass(metaclass=dynamicmetaclass):
1188 pass
1189 self.assertNotEqual(someclass, object)
1190
1191 def test_errors(self):
1192 # Testing errors...
1193 try:
1194 class C(list, dict):
1195 pass
1196 except TypeError:
1197 pass
1198 else:
1199 self.fail("inheritance from both list and dict should be illegal")
1200
1201 try:
1202 class C(object, None):
1203 pass
1204 except TypeError:
1205 pass
1206 else:
1207 self.fail("inheritance from non-type should be illegal")
1208 class Classic:
1209 pass
1210
1211 try:
1212 class C(type(len)):
1213 pass
1214 except TypeError:
1215 pass
1216 else:
1217 self.fail("inheritance from CFunction should be illegal")
1218
1219 try:
1220 class C(object):
1221 __slots__ = 1
1222 except TypeError:
1223 pass
1224 else:
1225 self.fail("__slots__ = 1 should be illegal")
1226
1227 try:
1228 class C(object):
1229 __slots__ = [1]
1230 except TypeError:
1231 pass
1232 else:
1233 self.fail("__slots__ = [1] should be illegal")
1234
1235 class M1(type):
1236 pass
1237 class M2(type):
1238 pass
1239 class A1(object, metaclass=M1):
1240 pass
1241 class A2(object, metaclass=M2):
1242 pass
1243 try:
1244 class B(A1, A2):
1245 pass
1246 except TypeError:
1247 pass
1248 else:
1249 self.fail("finding the most derived metaclass should have failed")
1250
1251 def test_classmethods(self):
1252 # Testing class methods...
1253 class C(object):
1254 def foo(*a): return a
1255 goo = classmethod(foo)
1256 c = C()
1257 self.assertEqual(C.goo(1), (C, 1))
1258 self.assertEqual(c.goo(1), (C, 1))
1259 self.assertEqual(c.foo(1), (c, 1))
1260 class D(C):
1261 pass
1262 d = D()
1263 self.assertEqual(D.goo(1), (D, 1))
1264 self.assertEqual(d.goo(1), (D, 1))
1265 self.assertEqual(d.foo(1), (d, 1))
1266 self.assertEqual(D.foo(d, 1), (d, 1))
1267 # Test for a specific crash (SF bug 528132)
1268 def f(cls, arg): return (cls, arg)
1269 ff = classmethod(f)
1270 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1271 self.assertEqual(ff.__get__(0)(42), (int, 42))
1272
1273 # Test super() with classmethods (SF bug 535444)
1274 self.assertEqual(C.goo.__self__, C)
1275 self.assertEqual(D.goo.__self__, D)
1276 self.assertEqual(super(D,D).goo.__self__, D)
1277 self.assertEqual(super(D,d).goo.__self__, D)
1278 self.assertEqual(super(D,D).goo(), (D,))
1279 self.assertEqual(super(D,d).goo(), (D,))
1280
Benjamin Petersona8332062009-09-11 22:36:27 +00001281 # Verify that a non-callable will raise
1282 meth = classmethod(1).__get__(1)
1283 self.assertRaises(TypeError, meth)
Georg Brandl479a7e72008-02-05 18:13:15 +00001284
1285 # Verify that classmethod() doesn't allow keyword args
1286 try:
1287 classmethod(f, kw=1)
1288 except TypeError:
1289 pass
1290 else:
1291 self.fail("classmethod shouldn't accept keyword args")
1292
Benjamin Petersone549ead2009-03-28 21:42:05 +00001293 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001294 def test_classmethods_in_c(self):
1295 # Testing C-based class methods...
1296 import xxsubtype as spam
1297 a = (1, 2, 3)
1298 d = {'abc': 123}
1299 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1300 self.assertEqual(x, spam.spamlist)
1301 self.assertEqual(a, a1)
1302 self.assertEqual(d, d1)
1303 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1304 self.assertEqual(x, spam.spamlist)
1305 self.assertEqual(a, a1)
1306 self.assertEqual(d, d1)
1307
1308 def test_staticmethods(self):
1309 # Testing static methods...
1310 class C(object):
1311 def foo(*a): return a
1312 goo = staticmethod(foo)
1313 c = C()
1314 self.assertEqual(C.goo(1), (1,))
1315 self.assertEqual(c.goo(1), (1,))
1316 self.assertEqual(c.foo(1), (c, 1,))
1317 class D(C):
1318 pass
1319 d = D()
1320 self.assertEqual(D.goo(1), (1,))
1321 self.assertEqual(d.goo(1), (1,))
1322 self.assertEqual(d.foo(1), (d, 1))
1323 self.assertEqual(D.foo(d, 1), (d, 1))
1324
Benjamin Petersone549ead2009-03-28 21:42:05 +00001325 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001326 def test_staticmethods_in_c(self):
1327 # Testing C-based static methods...
1328 import xxsubtype as spam
1329 a = (1, 2, 3)
1330 d = {"abc": 123}
1331 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1332 self.assertEqual(x, None)
1333 self.assertEqual(a, a1)
1334 self.assertEqual(d, d1)
1335 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1336 self.assertEqual(x, None)
1337 self.assertEqual(a, a1)
1338 self.assertEqual(d, d1)
1339
1340 def test_classic(self):
1341 # Testing classic classes...
1342 class C:
1343 def foo(*a): return a
1344 goo = classmethod(foo)
1345 c = C()
1346 self.assertEqual(C.goo(1), (C, 1))
1347 self.assertEqual(c.goo(1), (C, 1))
1348 self.assertEqual(c.foo(1), (c, 1))
1349 class D(C):
1350 pass
1351 d = D()
1352 self.assertEqual(D.goo(1), (D, 1))
1353 self.assertEqual(d.goo(1), (D, 1))
1354 self.assertEqual(d.foo(1), (d, 1))
1355 self.assertEqual(D.foo(d, 1), (d, 1))
1356 class E: # *not* subclassing from C
1357 foo = C.foo
1358 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Georg Brandlab91fde2009-08-13 08:51:18 +00001359 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001360
1361 def test_compattr(self):
1362 # Testing computed attributes...
1363 class C(object):
1364 class computed_attribute(object):
1365 def __init__(self, get, set=None, delete=None):
1366 self.__get = get
1367 self.__set = set
1368 self.__delete = delete
1369 def __get__(self, obj, type=None):
1370 return self.__get(obj)
1371 def __set__(self, obj, value):
1372 return self.__set(obj, value)
1373 def __delete__(self, obj):
1374 return self.__delete(obj)
1375 def __init__(self):
1376 self.__x = 0
1377 def __get_x(self):
1378 x = self.__x
1379 self.__x = x+1
1380 return x
1381 def __set_x(self, x):
1382 self.__x = x
1383 def __delete_x(self):
1384 del self.__x
1385 x = computed_attribute(__get_x, __set_x, __delete_x)
1386 a = C()
1387 self.assertEqual(a.x, 0)
1388 self.assertEqual(a.x, 1)
1389 a.x = 10
1390 self.assertEqual(a.x, 10)
1391 self.assertEqual(a.x, 11)
1392 del a.x
1393 self.assertEqual(hasattr(a, 'x'), 0)
1394
1395 def test_newslots(self):
1396 # Testing __new__ slot override...
1397 class C(list):
1398 def __new__(cls):
1399 self = list.__new__(cls)
1400 self.foo = 1
1401 return self
1402 def __init__(self):
1403 self.foo = self.foo + 2
1404 a = C()
1405 self.assertEqual(a.foo, 3)
1406 self.assertEqual(a.__class__, C)
1407 class D(C):
1408 pass
1409 b = D()
1410 self.assertEqual(b.foo, 3)
1411 self.assertEqual(b.__class__, D)
1412
1413 def test_altmro(self):
1414 # Testing mro() and overriding it...
1415 class A(object):
1416 def f(self): return "A"
1417 class B(A):
1418 pass
1419 class C(A):
1420 def f(self): return "C"
1421 class D(B, C):
1422 pass
1423 self.assertEqual(D.mro(), [D, B, C, A, object])
1424 self.assertEqual(D.__mro__, (D, B, C, A, object))
1425 self.assertEqual(D().f(), "C")
1426
1427 class PerverseMetaType(type):
1428 def mro(cls):
1429 L = type.mro(cls)
1430 L.reverse()
1431 return L
1432 class X(D,B,C,A, metaclass=PerverseMetaType):
1433 pass
1434 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1435 self.assertEqual(X().f(), "A")
1436
1437 try:
1438 class _metaclass(type):
1439 def mro(self):
1440 return [self, dict, object]
1441 class X(object, metaclass=_metaclass):
1442 pass
Benjamin Petersone549ead2009-03-28 21:42:05 +00001443 # In CPython, the class creation above already raises
1444 # TypeError, as a protection against the fact that
1445 # instances of X would segfault it. In other Python
1446 # implementations it would be ok to let the class X
1447 # be created, but instead get a clean TypeError on the
1448 # __setitem__ below.
1449 x = object.__new__(X)
1450 x[5] = 6
Georg Brandl479a7e72008-02-05 18:13:15 +00001451 except TypeError:
1452 pass
1453 else:
1454 self.fail("devious mro() return not caught")
1455
1456 try:
1457 class _metaclass(type):
1458 def mro(self):
1459 return [1]
1460 class X(object, metaclass=_metaclass):
1461 pass
1462 except TypeError:
1463 pass
1464 else:
1465 self.fail("non-class mro() return not caught")
1466
1467 try:
1468 class _metaclass(type):
1469 def mro(self):
1470 return 1
1471 class X(object, metaclass=_metaclass):
1472 pass
1473 except TypeError:
1474 pass
1475 else:
1476 self.fail("non-sequence mro() return not caught")
1477
1478 def test_overloading(self):
1479 # Testing operator overloading...
1480
1481 class B(object):
1482 "Intermediate class because object doesn't have a __setattr__"
1483
1484 class C(B):
1485 def __getattr__(self, name):
1486 if name == "foo":
1487 return ("getattr", name)
1488 else:
1489 raise AttributeError
1490 def __setattr__(self, name, value):
1491 if name == "foo":
1492 self.setattr = (name, value)
1493 else:
1494 return B.__setattr__(self, name, value)
1495 def __delattr__(self, name):
1496 if name == "foo":
1497 self.delattr = name
1498 else:
1499 return B.__delattr__(self, name)
1500
1501 def __getitem__(self, key):
1502 return ("getitem", key)
1503 def __setitem__(self, key, value):
1504 self.setitem = (key, value)
1505 def __delitem__(self, key):
1506 self.delitem = key
1507
1508 a = C()
1509 self.assertEqual(a.foo, ("getattr", "foo"))
1510 a.foo = 12
1511 self.assertEqual(a.setattr, ("foo", 12))
1512 del a.foo
1513 self.assertEqual(a.delattr, "foo")
1514
1515 self.assertEqual(a[12], ("getitem", 12))
1516 a[12] = 21
1517 self.assertEqual(a.setitem, (12, 21))
1518 del a[12]
1519 self.assertEqual(a.delitem, 12)
1520
1521 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1522 a[0:10] = "foo"
1523 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1524 del a[0:10]
1525 self.assertEqual(a.delitem, (slice(0, 10)))
1526
1527 def test_methods(self):
1528 # Testing methods...
1529 class C(object):
1530 def __init__(self, x):
1531 self.x = x
1532 def foo(self):
1533 return self.x
1534 c1 = C(1)
1535 self.assertEqual(c1.foo(), 1)
1536 class D(C):
1537 boo = C.foo
1538 goo = c1.foo
1539 d2 = D(2)
1540 self.assertEqual(d2.foo(), 2)
1541 self.assertEqual(d2.boo(), 2)
1542 self.assertEqual(d2.goo(), 1)
1543 class E(object):
1544 foo = C.foo
1545 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Georg Brandlab91fde2009-08-13 08:51:18 +00001546 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001547
Benjamin Peterson224205f2009-05-08 03:25:19 +00001548 def test_special_method_lookup(self):
1549 # The lookup of special methods bypasses __getattr__ and
1550 # __getattribute__, but they still can be descriptors.
1551
1552 def run_context(manager):
1553 with manager:
1554 pass
1555 def iden(self):
1556 return self
1557 def hello(self):
1558 return b"hello"
Benjamin Peterson053c61f2009-05-09 17:21:13 +00001559 def empty_seq(self):
1560 return []
Benjamin Petersona5758c02009-05-09 18:15:04 +00001561 def zero(self):
1562 return 0
1563 def stop(self):
1564 raise StopIteration
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001565 def return_true(self, thing=None):
1566 return True
1567 def do_isinstance(obj):
1568 return isinstance(int, obj)
1569 def do_issubclass(obj):
1570 return issubclass(int, obj)
Benjamin Petersona7205592009-05-27 03:08:59 +00001571 def do_dict_missing(checker):
1572 class DictSub(checker.__class__, dict):
1573 pass
1574 self.assertEqual(DictSub()["hi"], 4)
1575 def some_number(self_, key):
1576 self.assertEqual(key, "hi")
1577 return 4
Benjamin Peterson224205f2009-05-08 03:25:19 +00001578
1579 # It would be nice to have every special method tested here, but I'm
1580 # only listing the ones I can remember outside of typeobject.c, since it
1581 # does it right.
1582 specials = [
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001583 ("__bytes__", bytes, hello, set(), {}),
1584 ("__reversed__", reversed, empty_seq, set(), {}),
1585 ("__length_hint__", list, zero, set(),
Benjamin Petersona5758c02009-05-09 18:15:04 +00001586 {"__iter__" : iden, "__next__" : stop}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001587 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1588 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Petersona7205592009-05-27 03:08:59 +00001589 ("__missing__", do_dict_missing, some_number,
1590 set(("__class__",)), {}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001591 ("__subclasscheck__", do_issubclass, return_true,
1592 set(("__bases__",)), {}),
Benjamin Peterson224205f2009-05-08 03:25:19 +00001593 # These two fail because the compiler generates LOAD_ATTR to look
1594 # them up. We'd have to add a new opcode to fix this, and it's
1595 # probably not worth it.
1596 # ("__enter__", run_context, iden),
1597 # ("__exit__", run_context, iden),
1598 ]
1599
1600 class Checker(object):
1601 def __getattr__(self, attr, test=self):
1602 test.fail("__getattr__ called with {0}".format(attr))
1603 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001604 if attr not in ok:
1605 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Petersona7205592009-05-27 03:08:59 +00001606 return object.__getattribute__(self, attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001607 class SpecialDescr(object):
1608 def __init__(self, impl):
1609 self.impl = impl
1610 def __get__(self, obj, owner):
1611 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001612 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001613 class MyException(Exception):
1614 pass
1615 class ErrDescr(object):
1616 def __get__(self, obj, owner):
1617 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001618
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001619 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001620 class X(Checker):
1621 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001622 for attr, obj in env.items():
1623 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001624 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001625 runner(X())
1626
1627 record = []
1628 class X(Checker):
1629 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001630 for attr, obj in env.items():
1631 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001632 setattr(X, name, SpecialDescr(meth_impl))
1633 runner(X())
1634 self.assertEqual(record, [1], name)
1635
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001636 class X(Checker):
1637 pass
1638 for attr, obj in env.items():
1639 setattr(X, attr, obj)
1640 setattr(X, name, ErrDescr())
1641 try:
1642 runner(X())
1643 except MyException:
1644 pass
1645 else:
1646 self.fail("{0!r} didn't raise".format(name))
1647
Georg Brandl479a7e72008-02-05 18:13:15 +00001648 def test_specials(self):
1649 # Testing special operators...
1650 # Test operators like __hash__ for which a built-in default exists
1651
1652 # Test the default behavior for static classes
1653 class C(object):
1654 def __getitem__(self, i):
1655 if 0 <= i < 10: return i
1656 raise IndexError
1657 c1 = C()
1658 c2 = C()
Georg Brandlab91fde2009-08-13 08:51:18 +00001659 self.assertTrue(not not c1) # What?
Georg Brandl479a7e72008-02-05 18:13:15 +00001660 self.assertNotEqual(id(c1), id(c2))
1661 hash(c1)
1662 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001663 self.assertEqual(c1, c1)
Georg Brandlab91fde2009-08-13 08:51:18 +00001664 self.assertTrue(c1 != c2)
1665 self.assertTrue(not c1 != c1)
1666 self.assertTrue(not c1 == c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001667 # Note that the module name appears in str/repr, and that varies
1668 # depending on whether this test is run standalone or from a framework.
Georg Brandlab91fde2009-08-13 08:51:18 +00001669 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001670 self.assertEqual(str(c1), repr(c1))
Georg Brandlab91fde2009-08-13 08:51:18 +00001671 self.assertTrue(-1 not in c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001672 for i in range(10):
Georg Brandlab91fde2009-08-13 08:51:18 +00001673 self.assertTrue(i in c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001674 self.assertFalse(10 in c1)
1675 # Test the default behavior for dynamic classes
1676 class D(object):
1677 def __getitem__(self, i):
1678 if 0 <= i < 10: return i
1679 raise IndexError
1680 d1 = D()
1681 d2 = D()
Georg Brandlab91fde2009-08-13 08:51:18 +00001682 self.assertTrue(not not d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001683 self.assertNotEqual(id(d1), id(d2))
1684 hash(d1)
1685 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001686 self.assertEqual(d1, d1)
1687 self.assertNotEqual(d1, d2)
Georg Brandlab91fde2009-08-13 08:51:18 +00001688 self.assertTrue(not d1 != d1)
1689 self.assertTrue(not d1 == d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001690 # Note that the module name appears in str/repr, and that varies
1691 # depending on whether this test is run standalone or from a framework.
Georg Brandlab91fde2009-08-13 08:51:18 +00001692 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001693 self.assertEqual(str(d1), repr(d1))
Georg Brandlab91fde2009-08-13 08:51:18 +00001694 self.assertTrue(-1 not in d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001695 for i in range(10):
Georg Brandlab91fde2009-08-13 08:51:18 +00001696 self.assertTrue(i in d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001697 self.assertFalse(10 in d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001698 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001699 class Proxy(object):
1700 def __init__(self, x):
1701 self.x = x
1702 def __bool__(self):
1703 return not not self.x
1704 def __hash__(self):
1705 return hash(self.x)
1706 def __eq__(self, other):
1707 return self.x == other
1708 def __ne__(self, other):
1709 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001710 def __ge__(self, other):
1711 return self.x >= other
1712 def __gt__(self, other):
1713 return self.x > other
1714 def __le__(self, other):
1715 return self.x <= other
1716 def __lt__(self, other):
1717 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001718 def __str__(self):
1719 return "Proxy:%s" % self.x
1720 def __repr__(self):
1721 return "Proxy(%r)" % self.x
1722 def __contains__(self, value):
1723 return value in self.x
1724 p0 = Proxy(0)
1725 p1 = Proxy(1)
1726 p_1 = Proxy(-1)
1727 self.assertFalse(p0)
Georg Brandlab91fde2009-08-13 08:51:18 +00001728 self.assertTrue(not not p1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001729 self.assertEqual(hash(p0), hash(0))
1730 self.assertEqual(p0, p0)
1731 self.assertNotEqual(p0, p1)
Georg Brandlab91fde2009-08-13 08:51:18 +00001732 self.assertTrue(not p0 != p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001733 self.assertEqual(not p0, p1)
Georg Brandlab91fde2009-08-13 08:51:18 +00001734 self.assertTrue(p0 < p1)
1735 self.assertTrue(p0 <= p1)
1736 self.assertTrue(p1 > p0)
1737 self.assertTrue(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001738 self.assertEqual(str(p0), "Proxy:0")
1739 self.assertEqual(repr(p0), "Proxy(0)")
1740 p10 = Proxy(range(10))
1741 self.assertFalse(-1 in p10)
1742 for i in range(10):
Georg Brandlab91fde2009-08-13 08:51:18 +00001743 self.assertTrue(i in p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001744 self.assertFalse(10 in p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001745
Georg Brandl479a7e72008-02-05 18:13:15 +00001746 def test_weakrefs(self):
1747 # Testing weak references...
1748 import weakref
1749 class C(object):
1750 pass
1751 c = C()
1752 r = weakref.ref(c)
1753 self.assertEqual(r(), c)
1754 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001755 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001756 self.assertEqual(r(), None)
1757 del r
1758 class NoWeak(object):
1759 __slots__ = ['foo']
1760 no = NoWeak()
1761 try:
1762 weakref.ref(no)
1763 except TypeError as msg:
Georg Brandlab91fde2009-08-13 08:51:18 +00001764 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001765 else:
1766 self.fail("weakref.ref(no) should be illegal")
1767 class Weak(object):
1768 __slots__ = ['foo', '__weakref__']
1769 yes = Weak()
1770 r = weakref.ref(yes)
1771 self.assertEqual(r(), yes)
1772 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001773 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001774 self.assertEqual(r(), None)
1775 del r
1776
1777 def test_properties(self):
1778 # Testing property...
1779 class C(object):
1780 def getx(self):
1781 return self.__x
1782 def setx(self, value):
1783 self.__x = value
1784 def delx(self):
1785 del self.__x
1786 x = property(getx, setx, delx, doc="I'm the x property.")
1787 a = C()
1788 self.assertFalse(hasattr(a, "x"))
1789 a.x = 42
1790 self.assertEqual(a._C__x, 42)
1791 self.assertEqual(a.x, 42)
1792 del a.x
1793 self.assertFalse(hasattr(a, "x"))
1794 self.assertFalse(hasattr(a, "_C__x"))
1795 C.x.__set__(a, 100)
1796 self.assertEqual(C.x.__get__(a), 100)
1797 C.x.__delete__(a)
1798 self.assertFalse(hasattr(a, "x"))
1799
1800 raw = C.__dict__['x']
Georg Brandlab91fde2009-08-13 08:51:18 +00001801 self.assertTrue(isinstance(raw, property))
Georg Brandl479a7e72008-02-05 18:13:15 +00001802
1803 attrs = dir(raw)
Georg Brandlab91fde2009-08-13 08:51:18 +00001804 self.assertTrue("__doc__" in attrs)
1805 self.assertTrue("fget" in attrs)
1806 self.assertTrue("fset" in attrs)
1807 self.assertTrue("fdel" in attrs)
Georg Brandl479a7e72008-02-05 18:13:15 +00001808
1809 self.assertEqual(raw.__doc__, "I'm the x property.")
Georg Brandlab91fde2009-08-13 08:51:18 +00001810 self.assertTrue(raw.fget is C.__dict__['getx'])
1811 self.assertTrue(raw.fset is C.__dict__['setx'])
1812 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl479a7e72008-02-05 18:13:15 +00001813
1814 for attr in "__doc__", "fget", "fset", "fdel":
1815 try:
1816 setattr(raw, attr, 42)
1817 except AttributeError as msg:
1818 if str(msg).find('readonly') < 0:
1819 self.fail("when setting readonly attr %r on a property, "
1820 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1821 else:
1822 self.fail("expected AttributeError from trying to set readonly %r "
1823 "attr on a property" % attr)
1824
1825 class D(object):
1826 __getitem__ = property(lambda s: 1/0)
1827
1828 d = D()
1829 try:
1830 for i in d:
1831 str(i)
1832 except ZeroDivisionError:
1833 pass
1834 else:
1835 self.fail("expected ZeroDivisionError from bad property")
1836
1837 class E(object):
1838 def getter(self):
1839 "getter method"
1840 return 0
1841 def setter(self_, value):
1842 "setter method"
1843 pass
1844 prop = property(getter)
1845 self.assertEqual(prop.__doc__, "getter method")
1846 prop2 = property(fset=setter)
1847 self.assertEqual(prop2.__doc__, None)
1848
1849 # this segfaulted in 2.5b2
1850 try:
1851 import _testcapi
1852 except ImportError:
1853 pass
1854 else:
1855 class X(object):
1856 p = property(_testcapi.test_with_docstring)
1857
1858 def test_properties_plus(self):
1859 class C(object):
1860 foo = property(doc="hello")
1861 @foo.getter
1862 def foo(self):
1863 return self._foo
1864 @foo.setter
1865 def foo(self, value):
1866 self._foo = abs(value)
1867 @foo.deleter
1868 def foo(self):
1869 del self._foo
1870 c = C()
1871 self.assertEqual(C.foo.__doc__, "hello")
1872 self.assertFalse(hasattr(c, "foo"))
1873 c.foo = -42
Georg Brandlab91fde2009-08-13 08:51:18 +00001874 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl479a7e72008-02-05 18:13:15 +00001875 self.assertEqual(c._foo, 42)
1876 self.assertEqual(c.foo, 42)
1877 del c.foo
1878 self.assertFalse(hasattr(c, '_foo'))
1879 self.assertFalse(hasattr(c, "foo"))
1880
1881 class D(C):
1882 @C.foo.deleter
1883 def foo(self):
1884 try:
1885 del self._foo
1886 except AttributeError:
1887 pass
1888 d = D()
1889 d.foo = 24
1890 self.assertEqual(d.foo, 24)
1891 del d.foo
1892 del d.foo
1893
1894 class E(object):
1895 @property
1896 def foo(self):
1897 return self._foo
1898 @foo.setter
1899 def foo(self, value):
1900 raise RuntimeError
1901 @foo.setter
1902 def foo(self, value):
1903 self._foo = abs(value)
1904 @foo.deleter
1905 def foo(self, value=None):
1906 del self._foo
1907
1908 e = E()
1909 e.foo = -42
1910 self.assertEqual(e.foo, 42)
1911 del e.foo
1912
1913 class F(E):
1914 @E.foo.deleter
1915 def foo(self):
1916 del self._foo
1917 @foo.setter
1918 def foo(self, value):
1919 self._foo = max(0, value)
1920 f = F()
1921 f.foo = -10
1922 self.assertEqual(f.foo, 0)
1923 del f.foo
1924
1925 def test_dict_constructors(self):
1926 # Testing dict constructor ...
1927 d = dict()
1928 self.assertEqual(d, {})
1929 d = dict({})
1930 self.assertEqual(d, {})
1931 d = dict({1: 2, 'a': 'b'})
1932 self.assertEqual(d, {1: 2, 'a': 'b'})
1933 self.assertEqual(d, dict(list(d.items())))
1934 self.assertEqual(d, dict(iter(d.items())))
1935 d = dict({'one':1, 'two':2})
1936 self.assertEqual(d, dict(one=1, two=2))
1937 self.assertEqual(d, dict(**d))
1938 self.assertEqual(d, dict({"one": 1}, two=2))
1939 self.assertEqual(d, dict([("two", 2)], one=1))
1940 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1941 self.assertEqual(d, dict(**d))
1942
1943 for badarg in 0, 0, 0j, "0", [0], (0,):
1944 try:
1945 dict(badarg)
1946 except TypeError:
1947 pass
1948 except ValueError:
1949 if badarg == "0":
1950 # It's a sequence, and its elements are also sequences (gotta
1951 # love strings <wink>), but they aren't of length 2, so this
1952 # one seemed better as a ValueError than a TypeError.
1953 pass
1954 else:
1955 self.fail("no TypeError from dict(%r)" % badarg)
1956 else:
1957 self.fail("no TypeError from dict(%r)" % badarg)
1958
1959 try:
1960 dict({}, {})
1961 except TypeError:
1962 pass
1963 else:
1964 self.fail("no TypeError from dict({}, {})")
1965
1966 class Mapping:
1967 # Lacks a .keys() method; will be added later.
1968 dict = {1:2, 3:4, 'a':1j}
1969
1970 try:
1971 dict(Mapping())
1972 except TypeError:
1973 pass
1974 else:
1975 self.fail("no TypeError from dict(incomplete mapping)")
1976
1977 Mapping.keys = lambda self: list(self.dict.keys())
1978 Mapping.__getitem__ = lambda self, i: self.dict[i]
1979 d = dict(Mapping())
1980 self.assertEqual(d, Mapping.dict)
1981
1982 # Init from sequence of iterable objects, each producing a 2-sequence.
1983 class AddressBookEntry:
1984 def __init__(self, first, last):
1985 self.first = first
1986 self.last = last
1987 def __iter__(self):
1988 return iter([self.first, self.last])
1989
1990 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1991 AddressBookEntry('Barry', 'Peters'),
1992 AddressBookEntry('Tim', 'Peters'),
1993 AddressBookEntry('Barry', 'Warsaw')])
1994 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1995
1996 d = dict(zip(range(4), range(1, 5)))
1997 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1998
1999 # Bad sequence lengths.
2000 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2001 try:
2002 dict(bad)
2003 except ValueError:
2004 pass
2005 else:
2006 self.fail("no ValueError from dict(%r)" % bad)
2007
2008 def test_dir(self):
2009 # Testing dir() ...
2010 junk = 12
2011 self.assertEqual(dir(), ['junk', 'self'])
2012 del junk
2013
2014 # Just make sure these don't blow up!
2015 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
2016 dir(arg)
2017
2018 # Test dir on new-style classes. Since these have object as a
2019 # base class, a lot more gets sucked in.
2020 def interesting(strings):
2021 return [s for s in strings if not s.startswith('_')]
2022
2023 class C(object):
2024 Cdata = 1
2025 def Cmethod(self): pass
2026
2027 cstuff = ['Cdata', 'Cmethod']
2028 self.assertEqual(interesting(dir(C)), cstuff)
2029
2030 c = C()
2031 self.assertEqual(interesting(dir(c)), cstuff)
Georg Brandlab91fde2009-08-13 08:51:18 +00002032 ## self.assertTrue('__self__' in dir(C.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002033
2034 c.cdata = 2
2035 c.cmethod = lambda self: 0
2036 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Georg Brandlab91fde2009-08-13 08:51:18 +00002037 ## self.assertTrue('__self__' in dir(c.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002038
2039 class A(C):
2040 Adata = 1
2041 def Amethod(self): pass
2042
2043 astuff = ['Adata', 'Amethod'] + cstuff
2044 self.assertEqual(interesting(dir(A)), astuff)
Georg Brandlab91fde2009-08-13 08:51:18 +00002045 ## self.assertTrue('__self__' in dir(A.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002046 a = A()
2047 self.assertEqual(interesting(dir(a)), astuff)
2048 a.adata = 42
2049 a.amethod = lambda self: 3
2050 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Georg Brandlab91fde2009-08-13 08:51:18 +00002051 ## self.assertTrue('__self__' in dir(a.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002052
2053 # Try a module subclass.
2054 import sys
2055 class M(type(sys)):
2056 pass
2057 minstance = M("m")
2058 minstance.b = 2
2059 minstance.a = 1
2060 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2061 self.assertEqual(names, ['a', 'b'])
2062
2063 class M2(M):
2064 def getdict(self):
2065 return "Not a dict!"
2066 __dict__ = property(getdict)
2067
2068 m2instance = M2("m2")
2069 m2instance.b = 2
2070 m2instance.a = 1
2071 self.assertEqual(m2instance.__dict__, "Not a dict!")
2072 try:
2073 dir(m2instance)
2074 except TypeError:
2075 pass
2076
2077 # Two essentially featureless objects, just inheriting stuff from
2078 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002079 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2080 if support.check_impl_detail():
2081 # None differs in PyPy: it has a __nonzero__
2082 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002083
2084 # Nasty test case for proxied objects
2085 class Wrapper(object):
2086 def __init__(self, obj):
2087 self.__obj = obj
2088 def __repr__(self):
2089 return "Wrapper(%s)" % repr(self.__obj)
2090 def __getitem__(self, key):
2091 return Wrapper(self.__obj[key])
2092 def __len__(self):
2093 return len(self.__obj)
2094 def __getattr__(self, name):
2095 return Wrapper(getattr(self.__obj, name))
2096
2097 class C(object):
2098 def __getclass(self):
2099 return Wrapper(type(self))
2100 __class__ = property(__getclass)
2101
2102 dir(C()) # This used to segfault
2103
2104 def test_supers(self):
2105 # Testing super...
2106
2107 class A(object):
2108 def meth(self, a):
2109 return "A(%r)" % a
2110
2111 self.assertEqual(A().meth(1), "A(1)")
2112
2113 class B(A):
2114 def __init__(self):
2115 self.__super = super(B, self)
2116 def meth(self, a):
2117 return "B(%r)" % a + self.__super.meth(a)
2118
2119 self.assertEqual(B().meth(2), "B(2)A(2)")
2120
2121 class C(A):
2122 def meth(self, a):
2123 return "C(%r)" % a + self.__super.meth(a)
2124 C._C__super = super(C)
2125
2126 self.assertEqual(C().meth(3), "C(3)A(3)")
2127
2128 class D(C, B):
2129 def meth(self, a):
2130 return "D(%r)" % a + super(D, self).meth(a)
2131
2132 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2133
2134 # Test for subclassing super
2135
2136 class mysuper(super):
2137 def __init__(self, *args):
2138 return super(mysuper, self).__init__(*args)
2139
2140 class E(D):
2141 def meth(self, a):
2142 return "E(%r)" % a + mysuper(E, self).meth(a)
2143
2144 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2145
2146 class F(E):
2147 def meth(self, a):
2148 s = self.__super # == mysuper(F, self)
2149 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2150 F._F__super = mysuper(F)
2151
2152 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2153
2154 # Make sure certain errors are raised
2155
2156 try:
2157 super(D, 42)
2158 except TypeError:
2159 pass
2160 else:
2161 self.fail("shouldn't allow super(D, 42)")
2162
2163 try:
2164 super(D, C())
2165 except TypeError:
2166 pass
2167 else:
2168 self.fail("shouldn't allow super(D, C())")
2169
2170 try:
2171 super(D).__get__(12)
2172 except TypeError:
2173 pass
2174 else:
2175 self.fail("shouldn't allow super(D).__get__(12)")
2176
2177 try:
2178 super(D).__get__(C())
2179 except TypeError:
2180 pass
2181 else:
2182 self.fail("shouldn't allow super(D).__get__(C())")
2183
2184 # Make sure data descriptors can be overridden and accessed via super
2185 # (new feature in Python 2.3)
2186
2187 class DDbase(object):
2188 def getx(self): return 42
2189 x = property(getx)
2190
2191 class DDsub(DDbase):
2192 def getx(self): return "hello"
2193 x = property(getx)
2194
2195 dd = DDsub()
2196 self.assertEqual(dd.x, "hello")
2197 self.assertEqual(super(DDsub, dd).x, 42)
2198
2199 # Ensure that super() lookup of descriptor from classmethod
2200 # works (SF ID# 743627)
2201
2202 class Base(object):
2203 aProp = property(lambda self: "foo")
2204
2205 class Sub(Base):
2206 @classmethod
2207 def test(klass):
2208 return super(Sub,klass).aProp
2209
2210 self.assertEqual(Sub.test(), Base.aProp)
2211
2212 # Verify that super() doesn't allow keyword args
2213 try:
2214 super(Base, kw=1)
2215 except TypeError:
2216 pass
2217 else:
2218 self.assertEqual("super shouldn't accept keyword args")
2219
2220 def test_basic_inheritance(self):
2221 # Testing inheritance from basic types...
2222
2223 class hexint(int):
2224 def __repr__(self):
2225 return hex(self)
2226 def __add__(self, other):
2227 return hexint(int.__add__(self, other))
2228 # (Note that overriding __radd__ doesn't work,
2229 # because the int type gets first dibs.)
2230 self.assertEqual(repr(hexint(7) + 9), "0x10")
2231 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2232 a = hexint(12345)
2233 self.assertEqual(a, 12345)
2234 self.assertEqual(int(a), 12345)
Georg Brandlab91fde2009-08-13 08:51:18 +00002235 self.assertTrue(int(a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002236 self.assertEqual(hash(a), hash(12345))
Georg Brandlab91fde2009-08-13 08:51:18 +00002237 self.assertTrue((+a).__class__ is int)
2238 self.assertTrue((a >> 0).__class__ is int)
2239 self.assertTrue((a << 0).__class__ is int)
2240 self.assertTrue((hexint(0) << 12).__class__ is int)
2241 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002242
2243 class octlong(int):
2244 __slots__ = []
2245 def __str__(self):
2246 s = oct(self)
2247 if s[-1] == 'L':
2248 s = s[:-1]
2249 return s
2250 def __add__(self, other):
2251 return self.__class__(super(octlong, self).__add__(other))
2252 __radd__ = __add__
2253 self.assertEqual(str(octlong(3) + 5), "0o10")
2254 # (Note that overriding __radd__ here only seems to work
2255 # because the example uses a short int left argument.)
2256 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2257 a = octlong(12345)
2258 self.assertEqual(a, 12345)
2259 self.assertEqual(int(a), 12345)
2260 self.assertEqual(hash(a), hash(12345))
Georg Brandlab91fde2009-08-13 08:51:18 +00002261 self.assertTrue(int(a).__class__ is int)
2262 self.assertTrue((+a).__class__ is int)
2263 self.assertTrue((-a).__class__ is int)
2264 self.assertTrue((-octlong(0)).__class__ is int)
2265 self.assertTrue((a >> 0).__class__ is int)
2266 self.assertTrue((a << 0).__class__ is int)
2267 self.assertTrue((a - 0).__class__ is int)
2268 self.assertTrue((a * 1).__class__ is int)
2269 self.assertTrue((a ** 1).__class__ is int)
2270 self.assertTrue((a // 1).__class__ is int)
2271 self.assertTrue((1 * a).__class__ is int)
2272 self.assertTrue((a | 0).__class__ is int)
2273 self.assertTrue((a ^ 0).__class__ is int)
2274 self.assertTrue((a & -1).__class__ is int)
2275 self.assertTrue((octlong(0) << 12).__class__ is int)
2276 self.assertTrue((octlong(0) >> 12).__class__ is int)
2277 self.assertTrue(abs(octlong(0)).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002278
2279 # Because octlong overrides __add__, we can't check the absence of +0
2280 # optimizations using octlong.
2281 class longclone(int):
2282 pass
2283 a = longclone(1)
Georg Brandlab91fde2009-08-13 08:51:18 +00002284 self.assertTrue((a + 0).__class__ is int)
2285 self.assertTrue((0 + a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002286
2287 # Check that negative clones don't segfault
2288 a = longclone(-1)
2289 self.assertEqual(a.__dict__, {})
Georg Brandlab91fde2009-08-13 08:51:18 +00002290 self.assertEqual(int(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl479a7e72008-02-05 18:13:15 +00002291
2292 class precfloat(float):
2293 __slots__ = ['prec']
2294 def __init__(self, value=0.0, prec=12):
2295 self.prec = int(prec)
2296 def __repr__(self):
2297 return "%.*g" % (self.prec, self)
2298 self.assertEqual(repr(precfloat(1.1)), "1.1")
2299 a = precfloat(12345)
2300 self.assertEqual(a, 12345.0)
2301 self.assertEqual(float(a), 12345.0)
Georg Brandlab91fde2009-08-13 08:51:18 +00002302 self.assertTrue(float(a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002303 self.assertEqual(hash(a), hash(12345.0))
Georg Brandlab91fde2009-08-13 08:51:18 +00002304 self.assertTrue((+a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002305
2306 class madcomplex(complex):
2307 def __repr__(self):
2308 return "%.17gj%+.17g" % (self.imag, self.real)
2309 a = madcomplex(-3, 4)
2310 self.assertEqual(repr(a), "4j-3")
2311 base = complex(-3, 4)
2312 self.assertEqual(base.__class__, complex)
2313 self.assertEqual(a, base)
2314 self.assertEqual(complex(a), base)
2315 self.assertEqual(complex(a).__class__, complex)
2316 a = madcomplex(a) # just trying another form of the constructor
2317 self.assertEqual(repr(a), "4j-3")
2318 self.assertEqual(a, base)
2319 self.assertEqual(complex(a), base)
2320 self.assertEqual(complex(a).__class__, complex)
2321 self.assertEqual(hash(a), hash(base))
2322 self.assertEqual((+a).__class__, complex)
2323 self.assertEqual((a + 0).__class__, complex)
2324 self.assertEqual(a + 0, base)
2325 self.assertEqual((a - 0).__class__, complex)
2326 self.assertEqual(a - 0, base)
2327 self.assertEqual((a * 1).__class__, complex)
2328 self.assertEqual(a * 1, base)
2329 self.assertEqual((a / 1).__class__, complex)
2330 self.assertEqual(a / 1, base)
2331
2332 class madtuple(tuple):
2333 _rev = None
2334 def rev(self):
2335 if self._rev is not None:
2336 return self._rev
2337 L = list(self)
2338 L.reverse()
2339 self._rev = self.__class__(L)
2340 return self._rev
2341 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2342 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2343 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2344 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2345 for i in range(512):
2346 t = madtuple(range(i))
2347 u = t.rev()
2348 v = u.rev()
2349 self.assertEqual(v, t)
2350 a = madtuple((1,2,3,4,5))
2351 self.assertEqual(tuple(a), (1,2,3,4,5))
Georg Brandlab91fde2009-08-13 08:51:18 +00002352 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002353 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Georg Brandlab91fde2009-08-13 08:51:18 +00002354 self.assertTrue(a[:].__class__ is tuple)
2355 self.assertTrue((a * 1).__class__ is tuple)
2356 self.assertTrue((a * 0).__class__ is tuple)
2357 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002358 a = madtuple(())
2359 self.assertEqual(tuple(a), ())
Georg Brandlab91fde2009-08-13 08:51:18 +00002360 self.assertTrue(tuple(a).__class__ is tuple)
2361 self.assertTrue((a + a).__class__ is tuple)
2362 self.assertTrue((a * 0).__class__ is tuple)
2363 self.assertTrue((a * 1).__class__ is tuple)
2364 self.assertTrue((a * 2).__class__ is tuple)
2365 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002366
2367 class madstring(str):
2368 _rev = None
2369 def rev(self):
2370 if self._rev is not None:
2371 return self._rev
2372 L = list(self)
2373 L.reverse()
2374 self._rev = self.__class__("".join(L))
2375 return self._rev
2376 s = madstring("abcdefghijklmnopqrstuvwxyz")
2377 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2378 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2379 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2380 for i in range(256):
2381 s = madstring("".join(map(chr, range(i))))
2382 t = s.rev()
2383 u = t.rev()
2384 self.assertEqual(u, s)
2385 s = madstring("12345")
2386 self.assertEqual(str(s), "12345")
Georg Brandlab91fde2009-08-13 08:51:18 +00002387 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002388
2389 base = "\x00" * 5
2390 s = madstring(base)
2391 self.assertEqual(s, base)
2392 self.assertEqual(str(s), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002393 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002394 self.assertEqual(hash(s), hash(base))
2395 self.assertEqual({s: 1}[base], 1)
2396 self.assertEqual({base: 1}[s], 1)
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).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002400 self.assertEqual("" + s, base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002401 self.assertTrue((s * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002402 self.assertEqual(s * 0, "")
Georg Brandlab91fde2009-08-13 08:51:18 +00002403 self.assertTrue((s * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002404 self.assertEqual(s * 1, base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002405 self.assertTrue((s * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002406 self.assertEqual(s * 2, base + base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002407 self.assertTrue(s[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002408 self.assertEqual(s[:], base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002409 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002410 self.assertEqual(s[0:0], "")
Georg Brandlab91fde2009-08-13 08:51:18 +00002411 self.assertTrue(s.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002412 self.assertEqual(s.strip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002413 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002414 self.assertEqual(s.lstrip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002415 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002416 self.assertEqual(s.rstrip(), base)
2417 identitytab = {}
Georg Brandlab91fde2009-08-13 08:51:18 +00002418 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002419 self.assertEqual(s.translate(identitytab), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002420 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002421 self.assertEqual(s.replace("x", "x"), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002422 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002423 self.assertEqual(s.ljust(len(s)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002424 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002425 self.assertEqual(s.rjust(len(s)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002426 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002427 self.assertEqual(s.center(len(s)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002428 self.assertTrue(s.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002429 self.assertEqual(s.lower(), base)
2430
2431 class madunicode(str):
2432 _rev = None
2433 def rev(self):
2434 if self._rev is not None:
2435 return self._rev
2436 L = list(self)
2437 L.reverse()
2438 self._rev = self.__class__("".join(L))
2439 return self._rev
2440 u = madunicode("ABCDEF")
2441 self.assertEqual(u, "ABCDEF")
2442 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2443 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2444 base = "12345"
2445 u = madunicode(base)
2446 self.assertEqual(str(u), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002447 self.assertTrue(str(u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002448 self.assertEqual(hash(u), hash(base))
2449 self.assertEqual({u: 1}[base], 1)
2450 self.assertEqual({base: 1}[u], 1)
Georg Brandlab91fde2009-08-13 08:51:18 +00002451 self.assertTrue(u.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002452 self.assertEqual(u.strip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002453 self.assertTrue(u.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002454 self.assertEqual(u.lstrip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002455 self.assertTrue(u.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002456 self.assertEqual(u.rstrip(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002457 self.assertTrue(u.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002458 self.assertEqual(u.replace("x", "x"), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002459 self.assertTrue(u.replace("xy", "xy").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002460 self.assertEqual(u.replace("xy", "xy"), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002461 self.assertTrue(u.center(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002462 self.assertEqual(u.center(len(u)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002463 self.assertTrue(u.ljust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002464 self.assertEqual(u.ljust(len(u)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002465 self.assertTrue(u.rjust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002466 self.assertEqual(u.rjust(len(u)), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002467 self.assertTrue(u.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002468 self.assertEqual(u.lower(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002469 self.assertTrue(u.upper().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002470 self.assertEqual(u.upper(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002471 self.assertTrue(u.capitalize().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002472 self.assertEqual(u.capitalize(), base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002473 self.assertTrue(u.title().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002474 self.assertEqual(u.title(), 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).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002478 self.assertEqual("" + u, base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002479 self.assertTrue((u * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002480 self.assertEqual(u * 0, "")
Georg Brandlab91fde2009-08-13 08:51:18 +00002481 self.assertTrue((u * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002482 self.assertEqual(u * 1, base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002483 self.assertTrue((u * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002484 self.assertEqual(u * 2, base + base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002485 self.assertTrue(u[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002486 self.assertEqual(u[:], base)
Georg Brandlab91fde2009-08-13 08:51:18 +00002487 self.assertTrue(u[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002488 self.assertEqual(u[0:0], "")
2489
2490 class sublist(list):
2491 pass
2492 a = sublist(range(5))
2493 self.assertEqual(a, list(range(5)))
2494 a.append("hello")
2495 self.assertEqual(a, list(range(5)) + ["hello"])
2496 a[5] = 5
2497 self.assertEqual(a, list(range(6)))
2498 a.extend(range(6, 20))
2499 self.assertEqual(a, list(range(20)))
2500 a[-5:] = []
2501 self.assertEqual(a, list(range(15)))
2502 del a[10:15]
2503 self.assertEqual(len(a), 10)
2504 self.assertEqual(a, list(range(10)))
2505 self.assertEqual(list(a), list(range(10)))
2506 self.assertEqual(a[0], 0)
2507 self.assertEqual(a[9], 9)
2508 self.assertEqual(a[-10], 0)
2509 self.assertEqual(a[-1], 9)
2510 self.assertEqual(a[:5], list(range(5)))
2511
2512 ## class CountedInput(file):
2513 ## """Counts lines read by self.readline().
2514 ##
2515 ## self.lineno is the 0-based ordinal of the last line read, up to
2516 ## a maximum of one greater than the number of lines in the file.
2517 ##
2518 ## self.ateof is true if and only if the final "" line has been read,
2519 ## at which point self.lineno stops incrementing, and further calls
2520 ## to readline() continue to return "".
2521 ## """
2522 ##
2523 ## lineno = 0
2524 ## ateof = 0
2525 ## def readline(self):
2526 ## if self.ateof:
2527 ## return ""
2528 ## s = file.readline(self)
2529 ## # Next line works too.
2530 ## # s = super(CountedInput, self).readline()
2531 ## self.lineno += 1
2532 ## if s == "":
2533 ## self.ateof = 1
2534 ## return s
2535 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002536 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002537 ## lines = ['a\n', 'b\n', 'c\n']
2538 ## try:
2539 ## f.writelines(lines)
2540 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002541 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002542 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2543 ## got = f.readline()
2544 ## self.assertEqual(expected, got)
2545 ## self.assertEqual(f.lineno, i)
2546 ## self.assertEqual(f.ateof, (i > len(lines)))
2547 ## f.close()
2548 ## finally:
2549 ## try:
2550 ## f.close()
2551 ## except:
2552 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002553 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002554
2555 def test_keywords(self):
2556 # Testing keyword args to basic type constructors ...
2557 self.assertEqual(int(x=1), 1)
2558 self.assertEqual(float(x=2), 2.0)
2559 self.assertEqual(int(x=3), 3)
2560 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2561 self.assertEqual(str(object=500), '500')
2562 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2563 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2564 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2565 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2566
2567 for constructor in (int, float, int, complex, str, str,
2568 tuple, list):
2569 try:
2570 constructor(bogus_keyword_arg=1)
2571 except TypeError:
2572 pass
2573 else:
2574 self.fail("expected TypeError from bogus keyword argument to %r"
2575 % constructor)
2576
2577 def test_str_subclass_as_dict_key(self):
2578 # Testing a str subclass used as dict key ..
2579
2580 class cistr(str):
2581 """Sublcass of str that computes __eq__ case-insensitively.
2582
2583 Also computes a hash code of the string in canonical form.
2584 """
2585
2586 def __init__(self, value):
2587 self.canonical = value.lower()
2588 self.hashcode = hash(self.canonical)
2589
2590 def __eq__(self, other):
2591 if not isinstance(other, cistr):
2592 other = cistr(other)
2593 return self.canonical == other.canonical
2594
2595 def __hash__(self):
2596 return self.hashcode
2597
2598 self.assertEqual(cistr('ABC'), 'abc')
2599 self.assertEqual('aBc', cistr('ABC'))
2600 self.assertEqual(str(cistr('ABC')), 'ABC')
2601
2602 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2603 self.assertEqual(d[cistr('one')], 1)
2604 self.assertEqual(d[cistr('tWo')], 2)
2605 self.assertEqual(d[cistr('THrEE')], 3)
Georg Brandlab91fde2009-08-13 08:51:18 +00002606 self.assertTrue(cistr('ONe') in d)
Georg Brandl479a7e72008-02-05 18:13:15 +00002607 self.assertEqual(d.get(cistr('thrEE')), 3)
2608
2609 def test_classic_comparisons(self):
2610 # Testing classic comparisons...
2611 class classic:
2612 pass
2613
2614 for base in (classic, int, object):
2615 class C(base):
2616 def __init__(self, value):
2617 self.value = int(value)
2618 def __eq__(self, other):
2619 if isinstance(other, C):
2620 return self.value == other.value
2621 if isinstance(other, int) or isinstance(other, int):
2622 return self.value == other
2623 return NotImplemented
2624 def __ne__(self, other):
2625 if isinstance(other, C):
2626 return self.value != other.value
2627 if isinstance(other, int) or isinstance(other, int):
2628 return self.value != other
2629 return NotImplemented
2630 def __lt__(self, other):
2631 if isinstance(other, C):
2632 return self.value < other.value
2633 if isinstance(other, int) or isinstance(other, int):
2634 return self.value < other
2635 return NotImplemented
2636 def __le__(self, other):
2637 if isinstance(other, C):
2638 return self.value <= other.value
2639 if isinstance(other, int) or isinstance(other, int):
2640 return self.value <= other
2641 return NotImplemented
2642 def __gt__(self, other):
2643 if isinstance(other, C):
2644 return self.value > other.value
2645 if isinstance(other, int) or isinstance(other, int):
2646 return self.value > other
2647 return NotImplemented
2648 def __ge__(self, other):
2649 if isinstance(other, C):
2650 return self.value >= other.value
2651 if isinstance(other, int) or isinstance(other, int):
2652 return self.value >= other
2653 return NotImplemented
2654
2655 c1 = C(1)
2656 c2 = C(2)
2657 c3 = C(3)
2658 self.assertEqual(c1, 1)
2659 c = {1: c1, 2: c2, 3: c3}
2660 for x in 1, 2, 3:
2661 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002662 for op in "<", "<=", "==", "!=", ">", ">=":
Georg Brandlab91fde2009-08-13 08:51:18 +00002663 self.assertTrue(eval("c[x] %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002664 eval("x %s y" % op),
2665 "x=%d, y=%d" % (x, y))
Georg Brandlab91fde2009-08-13 08:51:18 +00002666 self.assertTrue(eval("c[x] %s y" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002667 eval("x %s y" % op),
2668 "x=%d, y=%d" % (x, y))
Georg Brandlab91fde2009-08-13 08:51:18 +00002669 self.assertTrue(eval("x %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002670 eval("x %s y" % op),
2671 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002672
2673 def test_rich_comparisons(self):
2674 # Testing rich comparisons...
2675 class Z(complex):
2676 pass
2677 z = Z(1)
2678 self.assertEqual(z, 1+0j)
2679 self.assertEqual(1+0j, z)
2680 class ZZ(complex):
2681 def __eq__(self, other):
2682 try:
2683 return abs(self - other) <= 1e-6
2684 except:
2685 return NotImplemented
2686 zz = ZZ(1.0000003)
2687 self.assertEqual(zz, 1+0j)
2688 self.assertEqual(1+0j, zz)
2689
2690 class classic:
2691 pass
2692 for base in (classic, int, object, list):
2693 class C(base):
2694 def __init__(self, value):
2695 self.value = int(value)
2696 def __cmp__(self_, other):
2697 self.fail("shouldn't call __cmp__")
2698 def __eq__(self, other):
2699 if isinstance(other, C):
2700 return self.value == other.value
2701 if isinstance(other, int) or isinstance(other, int):
2702 return self.value == other
2703 return NotImplemented
2704 def __ne__(self, other):
2705 if isinstance(other, C):
2706 return self.value != other.value
2707 if isinstance(other, int) or isinstance(other, int):
2708 return self.value != other
2709 return NotImplemented
2710 def __lt__(self, other):
2711 if isinstance(other, C):
2712 return self.value < other.value
2713 if isinstance(other, int) or isinstance(other, int):
2714 return self.value < other
2715 return NotImplemented
2716 def __le__(self, other):
2717 if isinstance(other, C):
2718 return self.value <= other.value
2719 if isinstance(other, int) or isinstance(other, int):
2720 return self.value <= other
2721 return NotImplemented
2722 def __gt__(self, other):
2723 if isinstance(other, C):
2724 return self.value > other.value
2725 if isinstance(other, int) or isinstance(other, int):
2726 return self.value > other
2727 return NotImplemented
2728 def __ge__(self, other):
2729 if isinstance(other, C):
2730 return self.value >= other.value
2731 if isinstance(other, int) or isinstance(other, int):
2732 return self.value >= other
2733 return NotImplemented
2734 c1 = C(1)
2735 c2 = C(2)
2736 c3 = C(3)
2737 self.assertEqual(c1, 1)
2738 c = {1: c1, 2: c2, 3: c3}
2739 for x in 1, 2, 3:
2740 for y in 1, 2, 3:
2741 for op in "<", "<=", "==", "!=", ">", ">=":
Georg Brandlab91fde2009-08-13 08:51:18 +00002742 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002743 "x=%d, y=%d" % (x, y))
Georg Brandlab91fde2009-08-13 08:51:18 +00002744 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002745 "x=%d, y=%d" % (x, y))
Georg Brandlab91fde2009-08-13 08:51:18 +00002746 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002747 "x=%d, y=%d" % (x, y))
2748
2749 def test_descrdoc(self):
2750 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002751 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002752 def check(descr, what):
2753 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002754 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002755 check(complex.real, "the real part of a complex number") # member descriptor
2756
2757 def test_doc_descriptor(self):
2758 # Testing __doc__ descriptor...
2759 # SF bug 542984
2760 class DocDescr(object):
2761 def __get__(self, object, otype):
2762 if object:
2763 object = object.__class__.__name__ + ' instance'
2764 if otype:
2765 otype = otype.__name__
2766 return 'object=%s; type=%s' % (object, otype)
2767 class OldClass:
2768 __doc__ = DocDescr()
2769 class NewClass(object):
2770 __doc__ = DocDescr()
2771 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2772 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2773 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2774 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2775
2776 def test_set_class(self):
2777 # Testing __class__ assignment...
2778 class C(object): pass
2779 class D(object): pass
2780 class E(object): pass
2781 class F(D, E): pass
2782 for cls in C, D, E, F:
2783 for cls2 in C, D, E, F:
2784 x = cls()
2785 x.__class__ = cls2
Georg Brandlab91fde2009-08-13 08:51:18 +00002786 self.assertTrue(x.__class__ is cls2)
Georg Brandl479a7e72008-02-05 18:13:15 +00002787 x.__class__ = cls
Georg Brandlab91fde2009-08-13 08:51:18 +00002788 self.assertTrue(x.__class__ is cls)
Georg Brandl479a7e72008-02-05 18:13:15 +00002789 def cant(x, C):
2790 try:
2791 x.__class__ = C
2792 except TypeError:
2793 pass
2794 else:
2795 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2796 try:
2797 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002798 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002799 pass
2800 else:
2801 self.fail("shouldn't allow del %r.__class__" % x)
2802 cant(C(), list)
2803 cant(list(), C)
2804 cant(C(), 1)
2805 cant(C(), object)
2806 cant(object(), list)
2807 cant(list(), object)
2808 class Int(int): __slots__ = []
2809 cant(2, Int)
2810 cant(Int(), int)
2811 cant(True, int)
2812 cant(2, bool)
2813 o = object()
2814 cant(o, type(1))
2815 cant(o, type(None))
2816 del o
2817 class G(object):
2818 __slots__ = ["a", "b"]
2819 class H(object):
2820 __slots__ = ["b", "a"]
2821 class I(object):
2822 __slots__ = ["a", "b"]
2823 class J(object):
2824 __slots__ = ["c", "b"]
2825 class K(object):
2826 __slots__ = ["a", "b", "d"]
2827 class L(H):
2828 __slots__ = ["e"]
2829 class M(I):
2830 __slots__ = ["e"]
2831 class N(J):
2832 __slots__ = ["__weakref__"]
2833 class P(J):
2834 __slots__ = ["__dict__"]
2835 class Q(J):
2836 pass
2837 class R(J):
2838 __slots__ = ["__dict__", "__weakref__"]
2839
2840 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2841 x = cls()
2842 x.a = 1
2843 x.__class__ = cls2
Georg Brandlab91fde2009-08-13 08:51:18 +00002844 self.assertTrue(x.__class__ is cls2,
Georg Brandl479a7e72008-02-05 18:13:15 +00002845 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2846 self.assertEqual(x.a, 1)
2847 x.__class__ = cls
Georg Brandlab91fde2009-08-13 08:51:18 +00002848 self.assertTrue(x.__class__ is cls,
Georg Brandl479a7e72008-02-05 18:13:15 +00002849 "assigning %r as __class__ for %r silently failed" % (cls, x))
2850 self.assertEqual(x.a, 1)
2851 for cls in G, J, K, L, M, N, P, R, list, Int:
2852 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2853 if cls is cls2:
2854 continue
2855 cant(cls(), cls2)
2856
Benjamin Peterson193152c2009-04-25 01:08:45 +00002857 # Issue5283: when __class__ changes in __del__, the wrong
2858 # type gets DECREF'd.
2859 class O(object):
2860 pass
2861 class A(object):
2862 def __del__(self):
2863 self.__class__ = O
2864 l = [A() for x in range(100)]
2865 del l
2866
Georg Brandl479a7e72008-02-05 18:13:15 +00002867 def test_set_dict(self):
2868 # Testing __dict__ assignment...
2869 class C(object): pass
2870 a = C()
2871 a.__dict__ = {'b': 1}
2872 self.assertEqual(a.b, 1)
2873 def cant(x, dict):
2874 try:
2875 x.__dict__ = dict
2876 except (AttributeError, TypeError):
2877 pass
2878 else:
2879 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2880 cant(a, None)
2881 cant(a, [])
2882 cant(a, 1)
2883 del a.__dict__ # Deleting __dict__ is allowed
2884
2885 class Base(object):
2886 pass
2887 def verify_dict_readonly(x):
2888 """
2889 x has to be an instance of a class inheriting from Base.
2890 """
2891 cant(x, {})
2892 try:
2893 del x.__dict__
2894 except (AttributeError, TypeError):
2895 pass
2896 else:
2897 self.fail("shouldn't allow del %r.__dict__" % x)
2898 dict_descr = Base.__dict__["__dict__"]
2899 try:
2900 dict_descr.__set__(x, {})
2901 except (AttributeError, TypeError):
2902 pass
2903 else:
2904 self.fail("dict_descr allowed access to %r's dict" % x)
2905
2906 # Classes don't allow __dict__ assignment and have readonly dicts
2907 class Meta1(type, Base):
2908 pass
2909 class Meta2(Base, type):
2910 pass
2911 class D(object, metaclass=Meta1):
2912 pass
2913 class E(object, metaclass=Meta2):
2914 pass
2915 for cls in C, D, E:
2916 verify_dict_readonly(cls)
2917 class_dict = cls.__dict__
2918 try:
2919 class_dict["spam"] = "eggs"
2920 except TypeError:
2921 pass
2922 else:
2923 self.fail("%r's __dict__ can be modified" % cls)
2924
2925 # Modules also disallow __dict__ assignment
2926 class Module1(types.ModuleType, Base):
2927 pass
2928 class Module2(Base, types.ModuleType):
2929 pass
2930 for ModuleType in Module1, Module2:
2931 mod = ModuleType("spam")
2932 verify_dict_readonly(mod)
2933 mod.__dict__["spam"] = "eggs"
2934
2935 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002936 # (at least not any more than regular exception's __dict__ can
2937 # be deleted; on CPython it is not the case, whereas on PyPy they
2938 # can, just like any other new-style instance's __dict__.)
2939 def can_delete_dict(e):
2940 try:
2941 del e.__dict__
2942 except (TypeError, AttributeError):
2943 return False
2944 else:
2945 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002946 class Exception1(Exception, Base):
2947 pass
2948 class Exception2(Base, Exception):
2949 pass
2950 for ExceptionType in Exception, Exception1, Exception2:
2951 e = ExceptionType()
2952 e.__dict__ = {"a": 1}
2953 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002954 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002955
2956 def test_pickles(self):
2957 # Testing pickling and copying new-style classes and objects...
2958 import pickle
2959
2960 def sorteditems(d):
2961 L = list(d.items())
2962 L.sort()
2963 return L
2964
2965 global C
2966 class C(object):
2967 def __init__(self, a, b):
2968 super(C, self).__init__()
2969 self.a = a
2970 self.b = b
2971 def __repr__(self):
2972 return "C(%r, %r)" % (self.a, self.b)
2973
2974 global C1
2975 class C1(list):
2976 def __new__(cls, a, b):
2977 return super(C1, cls).__new__(cls)
2978 def __getnewargs__(self):
2979 return (self.a, self.b)
2980 def __init__(self, a, b):
2981 self.a = a
2982 self.b = b
2983 def __repr__(self):
2984 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2985
2986 global C2
2987 class C2(int):
2988 def __new__(cls, a, b, val=0):
2989 return super(C2, cls).__new__(cls, val)
2990 def __getnewargs__(self):
2991 return (self.a, self.b, int(self))
2992 def __init__(self, a, b, val=0):
2993 self.a = a
2994 self.b = b
2995 def __repr__(self):
2996 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2997
2998 global C3
2999 class C3(object):
3000 def __init__(self, foo):
3001 self.foo = foo
3002 def __getstate__(self):
3003 return self.foo
3004 def __setstate__(self, foo):
3005 self.foo = foo
3006
3007 global C4classic, C4
3008 class C4classic: # classic
3009 pass
3010 class C4(C4classic, object): # mixed inheritance
3011 pass
3012
Guido van Rossum3926a632001-09-25 16:25:58 +00003013 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00003014 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00003015 s = pickle.dumps(cls, bin)
3016 cls2 = pickle.loads(s)
Georg Brandlab91fde2009-08-13 08:51:18 +00003017 self.assertTrue(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00003018
3019 a = C1(1, 2); a.append(42); a.append(24)
3020 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003021 s = pickle.dumps((a, b), bin)
3022 x, y = pickle.loads(s)
3023 self.assertEqual(x.__class__, a.__class__)
3024 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3025 self.assertEqual(y.__class__, b.__class__)
3026 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3027 self.assertEqual(repr(x), repr(a))
3028 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003029 # Test for __getstate__ and __setstate__ on new style class
3030 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003031 s = pickle.dumps(u, bin)
3032 v = pickle.loads(s)
3033 self.assertEqual(u.__class__, v.__class__)
3034 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003035 # Test for picklability of hybrid class
3036 u = C4()
3037 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003038 s = pickle.dumps(u, bin)
3039 v = pickle.loads(s)
3040 self.assertEqual(u.__class__, v.__class__)
3041 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003042
Georg Brandl479a7e72008-02-05 18:13:15 +00003043 # Testing copy.deepcopy()
3044 import copy
3045 for cls in C, C1, C2:
3046 cls2 = copy.deepcopy(cls)
Georg Brandlab91fde2009-08-13 08:51:18 +00003047 self.assertTrue(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003048
Georg Brandl479a7e72008-02-05 18:13:15 +00003049 a = C1(1, 2); a.append(42); a.append(24)
3050 b = C2("hello", "world", 42)
3051 x, y = copy.deepcopy((a, b))
3052 self.assertEqual(x.__class__, a.__class__)
3053 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3054 self.assertEqual(y.__class__, b.__class__)
3055 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3056 self.assertEqual(repr(x), repr(a))
3057 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003058
Georg Brandl479a7e72008-02-05 18:13:15 +00003059 def test_pickle_slots(self):
3060 # Testing pickling of classes with __slots__ ...
3061 import pickle
3062 # Pickling of classes with __slots__ but without __getstate__ should fail
3063 # (if using protocol 0 or 1)
3064 global B, C, D, E
3065 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003066 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003067 for base in [object, B]:
3068 class C(base):
3069 __slots__ = ['a']
3070 class D(C):
3071 pass
3072 try:
3073 pickle.dumps(C(), 0)
3074 except TypeError:
3075 pass
3076 else:
3077 self.fail("should fail: pickle C instance - %s" % base)
3078 try:
3079 pickle.dumps(C(), 0)
3080 except TypeError:
3081 pass
3082 else:
3083 self.fail("should fail: pickle D instance - %s" % base)
3084 # Give C a nice generic __getstate__ and __setstate__
3085 class C(base):
3086 __slots__ = ['a']
3087 def __getstate__(self):
3088 try:
3089 d = self.__dict__.copy()
3090 except AttributeError:
3091 d = {}
3092 for cls in self.__class__.__mro__:
3093 for sn in cls.__dict__.get('__slots__', ()):
3094 try:
3095 d[sn] = getattr(self, sn)
3096 except AttributeError:
3097 pass
3098 return d
3099 def __setstate__(self, d):
3100 for k, v in list(d.items()):
3101 setattr(self, k, v)
3102 class D(C):
3103 pass
3104 # Now it should work
3105 x = C()
3106 y = pickle.loads(pickle.dumps(x))
3107 self.assertEqual(hasattr(y, 'a'), 0)
3108 x.a = 42
3109 y = pickle.loads(pickle.dumps(x))
3110 self.assertEqual(y.a, 42)
3111 x = D()
3112 x.a = 42
3113 x.b = 100
3114 y = pickle.loads(pickle.dumps(x))
3115 self.assertEqual(y.a + y.b, 142)
3116 # A subclass that adds a slot should also work
3117 class E(C):
3118 __slots__ = ['b']
3119 x = E()
3120 x.a = 42
3121 x.b = "foo"
3122 y = pickle.loads(pickle.dumps(x))
3123 self.assertEqual(y.a, x.a)
3124 self.assertEqual(y.b, x.b)
3125
3126 def test_binary_operator_override(self):
3127 # Testing overrides of binary operations...
3128 class I(int):
3129 def __repr__(self):
3130 return "I(%r)" % int(self)
3131 def __add__(self, other):
3132 return I(int(self) + int(other))
3133 __radd__ = __add__
3134 def __pow__(self, other, mod=None):
3135 if mod is None:
3136 return I(pow(int(self), int(other)))
3137 else:
3138 return I(pow(int(self), int(other), int(mod)))
3139 def __rpow__(self, other, mod=None):
3140 if mod is None:
3141 return I(pow(int(other), int(self), mod))
3142 else:
3143 return I(pow(int(other), int(self), int(mod)))
3144
3145 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3146 self.assertEqual(repr(I(1) + 2), "I(3)")
3147 self.assertEqual(repr(1 + I(2)), "I(3)")
3148 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3149 self.assertEqual(repr(2 ** I(3)), "I(8)")
3150 self.assertEqual(repr(I(2) ** 3), "I(8)")
3151 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3152 class S(str):
3153 def __eq__(self, other):
3154 return self.lower() == other.lower()
3155
3156 def test_subclass_propagation(self):
3157 # Testing propagation of slot functions to subclasses...
3158 class A(object):
3159 pass
3160 class B(A):
3161 pass
3162 class C(A):
3163 pass
3164 class D(B, C):
3165 pass
3166 d = D()
3167 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3168 A.__hash__ = lambda self: 42
3169 self.assertEqual(hash(d), 42)
3170 C.__hash__ = lambda self: 314
3171 self.assertEqual(hash(d), 314)
3172 B.__hash__ = lambda self: 144
3173 self.assertEqual(hash(d), 144)
3174 D.__hash__ = lambda self: 100
3175 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003176 D.__hash__ = None
3177 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003178 del D.__hash__
3179 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003180 B.__hash__ = None
3181 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003182 del B.__hash__
3183 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003184 C.__hash__ = None
3185 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003186 del C.__hash__
3187 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003188 A.__hash__ = None
3189 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003190 del A.__hash__
3191 self.assertEqual(hash(d), orig_hash)
3192 d.foo = 42
3193 d.bar = 42
3194 self.assertEqual(d.foo, 42)
3195 self.assertEqual(d.bar, 42)
3196 def __getattribute__(self, name):
3197 if name == "foo":
3198 return 24
3199 return object.__getattribute__(self, name)
3200 A.__getattribute__ = __getattribute__
3201 self.assertEqual(d.foo, 24)
3202 self.assertEqual(d.bar, 42)
3203 def __getattr__(self, name):
3204 if name in ("spam", "foo", "bar"):
3205 return "hello"
3206 raise AttributeError(name)
3207 B.__getattr__ = __getattr__
3208 self.assertEqual(d.spam, "hello")
3209 self.assertEqual(d.foo, 24)
3210 self.assertEqual(d.bar, 42)
3211 del A.__getattribute__
3212 self.assertEqual(d.foo, 42)
3213 del d.foo
3214 self.assertEqual(d.foo, "hello")
3215 self.assertEqual(d.bar, 42)
3216 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003217 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003218 d.foo
3219 except AttributeError:
3220 pass
3221 else:
3222 self.fail("d.foo should be undefined now")
3223
3224 # Test a nasty bug in recurse_down_subclasses()
3225 import gc
3226 class A(object):
3227 pass
3228 class B(A):
3229 pass
3230 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003231 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003232 A.__setitem__ = lambda *a: None # crash
3233
3234 def test_buffer_inheritance(self):
3235 # Testing that buffer interface is inherited ...
3236
3237 import binascii
3238 # SF bug [#470040] ParseTuple t# vs subclasses.
3239
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003240 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003241 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003242 base = b'abc'
3243 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003244 # b2a_hex uses the buffer interface to get its argument's value, via
3245 # PyArg_ParseTuple 't#' code.
3246 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3247
Georg Brandl479a7e72008-02-05 18:13:15 +00003248 class MyInt(int):
3249 pass
3250 m = MyInt(42)
3251 try:
3252 binascii.b2a_hex(m)
3253 self.fail('subclass of int should not have a buffer interface')
3254 except TypeError:
3255 pass
3256
3257 def test_str_of_str_subclass(self):
3258 # Testing __str__ defined in subclass of str ...
3259 import binascii
3260 import io
3261
3262 class octetstring(str):
3263 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003264 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003265 def __repr__(self):
3266 return self + " repr"
3267
3268 o = octetstring('A')
3269 self.assertEqual(type(o), octetstring)
3270 self.assertEqual(type(str(o)), str)
3271 self.assertEqual(type(repr(o)), str)
3272 self.assertEqual(ord(o), 0x41)
3273 self.assertEqual(str(o), '41')
3274 self.assertEqual(repr(o), 'A repr')
3275 self.assertEqual(o.__str__(), '41')
3276 self.assertEqual(o.__repr__(), 'A repr')
3277
3278 capture = io.StringIO()
3279 # Calling str() or not exercises different internal paths.
3280 print(o, file=capture)
3281 print(str(o), file=capture)
3282 self.assertEqual(capture.getvalue(), '41\n41\n')
3283 capture.close()
3284
3285 def test_keyword_arguments(self):
3286 # Testing keyword arguments to __init__, __call__...
3287 def f(a): return a
3288 self.assertEqual(f.__call__(a=42), 42)
3289 a = []
3290 list.__init__(a, sequence=[0, 1, 2])
3291 self.assertEqual(a, [0, 1, 2])
3292
3293 def test_recursive_call(self):
3294 # Testing recursive __call__() by setting to instance of class...
3295 class A(object):
3296 pass
3297
3298 A.__call__ = A()
3299 try:
3300 A()()
3301 except RuntimeError:
3302 pass
3303 else:
3304 self.fail("Recursion limit should have been reached for __call__()")
3305
3306 def test_delete_hook(self):
3307 # Testing __del__ hook...
3308 log = []
3309 class C(object):
3310 def __del__(self):
3311 log.append(1)
3312 c = C()
3313 self.assertEqual(log, [])
3314 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003315 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003316 self.assertEqual(log, [1])
3317
3318 class D(object): pass
3319 d = D()
3320 try: del d[0]
3321 except TypeError: pass
3322 else: self.fail("invalid del() didn't raise TypeError")
3323
3324 def test_hash_inheritance(self):
3325 # Testing hash of mutable subclasses...
3326
3327 class mydict(dict):
3328 pass
3329 d = mydict()
3330 try:
3331 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 dict subclass should fail")
3336
3337 class mylist(list):
3338 pass
3339 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003340 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003341 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003342 except TypeError:
3343 pass
3344 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003345 self.fail("hash() of list subclass should fail")
3346
3347 def test_str_operations(self):
3348 try: 'a' + 5
3349 except TypeError: pass
3350 else: self.fail("'' + 5 doesn't raise TypeError")
3351
3352 try: ''.split('')
3353 except ValueError: pass
3354 else: self.fail("''.split('') doesn't raise ValueError")
3355
3356 try: ''.join([0])
3357 except TypeError: pass
3358 else: self.fail("''.join([0]) doesn't raise TypeError")
3359
3360 try: ''.rindex('5')
3361 except ValueError: pass
3362 else: self.fail("''.rindex('5') doesn't raise ValueError")
3363
3364 try: '%(n)s' % None
3365 except TypeError: pass
3366 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3367
3368 try: '%(n' % {}
3369 except ValueError: pass
3370 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3371
3372 try: '%*s' % ('abc')
3373 except TypeError: pass
3374 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3375
3376 try: '%*.*s' % ('abc', 5)
3377 except TypeError: pass
3378 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3379
3380 try: '%s' % (1, 2)
3381 except TypeError: pass
3382 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3383
3384 try: '%' % None
3385 except ValueError: pass
3386 else: self.fail("'%' % None doesn't raise ValueError")
3387
3388 self.assertEqual('534253'.isdigit(), 1)
3389 self.assertEqual('534253x'.isdigit(), 0)
3390 self.assertEqual('%c' % 5, '\x05')
3391 self.assertEqual('%c' % '5', '5')
3392
3393 def test_deepcopy_recursive(self):
3394 # Testing deepcopy of recursive objects...
3395 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003396 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003397 a = Node()
3398 b = Node()
3399 a.b = b
3400 b.a = a
3401 z = deepcopy(a) # This blew up before
3402
3403 def test_unintialized_modules(self):
3404 # Testing uninitialized module objects...
3405 from types import ModuleType as M
3406 m = M.__new__(M)
3407 str(m)
3408 self.assertEqual(hasattr(m, "__name__"), 0)
3409 self.assertEqual(hasattr(m, "__file__"), 0)
3410 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003411 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003412 m.foo = 1
3413 self.assertEqual(m.__dict__, {"foo": 1})
3414
3415 def test_funny_new(self):
3416 # Testing __new__ returning something unexpected...
3417 class C(object):
3418 def __new__(cls, arg):
3419 if isinstance(arg, str): return [1, 2, 3]
3420 elif isinstance(arg, int): return object.__new__(D)
3421 else: return object.__new__(cls)
3422 class D(C):
3423 def __init__(self, arg):
3424 self.foo = arg
3425 self.assertEqual(C("1"), [1, 2, 3])
3426 self.assertEqual(D("1"), [1, 2, 3])
3427 d = D(None)
3428 self.assertEqual(d.foo, None)
3429 d = C(1)
3430 self.assertEqual(isinstance(d, D), True)
3431 self.assertEqual(d.foo, 1)
3432 d = D(1)
3433 self.assertEqual(isinstance(d, D), True)
3434 self.assertEqual(d.foo, 1)
3435
3436 def test_imul_bug(self):
3437 # Testing for __imul__ problems...
3438 # SF bug 544647
3439 class C(object):
3440 def __imul__(self, other):
3441 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003442 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003443 y = x
3444 y *= 1.0
3445 self.assertEqual(y, (x, 1.0))
3446 y = x
3447 y *= 2
3448 self.assertEqual(y, (x, 2))
3449 y = x
3450 y *= 3
3451 self.assertEqual(y, (x, 3))
3452 y = x
3453 y *= 1<<100
3454 self.assertEqual(y, (x, 1<<100))
3455 y = x
3456 y *= None
3457 self.assertEqual(y, (x, None))
3458 y = x
3459 y *= "foo"
3460 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003461
Georg Brandl479a7e72008-02-05 18:13:15 +00003462 def test_copy_setstate(self):
3463 # Testing that copy.*copy() correctly uses __setstate__...
3464 import copy
3465 class C(object):
3466 def __init__(self, foo=None):
3467 self.foo = foo
3468 self.__foo = foo
3469 def setfoo(self, foo=None):
3470 self.foo = foo
3471 def getfoo(self):
3472 return self.__foo
3473 def __getstate__(self):
3474 return [self.foo]
3475 def __setstate__(self_, lst):
3476 self.assertEqual(len(lst), 1)
3477 self_.__foo = self_.foo = lst[0]
3478 a = C(42)
3479 a.setfoo(24)
3480 self.assertEqual(a.foo, 24)
3481 self.assertEqual(a.getfoo(), 42)
3482 b = copy.copy(a)
3483 self.assertEqual(b.foo, 24)
3484 self.assertEqual(b.getfoo(), 24)
3485 b = copy.deepcopy(a)
3486 self.assertEqual(b.foo, 24)
3487 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003488
Georg Brandl479a7e72008-02-05 18:13:15 +00003489 def test_slices(self):
3490 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003491
Georg Brandl479a7e72008-02-05 18:13:15 +00003492 # Strings
3493 self.assertEqual("hello"[:4], "hell")
3494 self.assertEqual("hello"[slice(4)], "hell")
3495 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3496 class S(str):
3497 def __getitem__(self, x):
3498 return str.__getitem__(self, x)
3499 self.assertEqual(S("hello")[:4], "hell")
3500 self.assertEqual(S("hello")[slice(4)], "hell")
3501 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3502 # Tuples
3503 self.assertEqual((1,2,3)[:2], (1,2))
3504 self.assertEqual((1,2,3)[slice(2)], (1,2))
3505 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3506 class T(tuple):
3507 def __getitem__(self, x):
3508 return tuple.__getitem__(self, x)
3509 self.assertEqual(T((1,2,3))[:2], (1,2))
3510 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3511 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3512 # Lists
3513 self.assertEqual([1,2,3][:2], [1,2])
3514 self.assertEqual([1,2,3][slice(2)], [1,2])
3515 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3516 class L(list):
3517 def __getitem__(self, x):
3518 return list.__getitem__(self, x)
3519 self.assertEqual(L([1,2,3])[:2], [1,2])
3520 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3521 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3522 # Now do lists and __setitem__
3523 a = L([1,2,3])
3524 a[slice(1, 3)] = [3,2]
3525 self.assertEqual(a, [1,3,2])
3526 a[slice(0, 2, 1)] = [3,1]
3527 self.assertEqual(a, [3,1,2])
3528 a.__setitem__(slice(1, 3), [2,1])
3529 self.assertEqual(a, [3,2,1])
3530 a.__setitem__(slice(0, 2, 1), [2,3])
3531 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003532
Georg Brandl479a7e72008-02-05 18:13:15 +00003533 def test_subtype_resurrection(self):
3534 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003535
Georg Brandl479a7e72008-02-05 18:13:15 +00003536 class C(object):
3537 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003538
Georg Brandl479a7e72008-02-05 18:13:15 +00003539 def __del__(self):
3540 # resurrect the instance
3541 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003542
Georg Brandl479a7e72008-02-05 18:13:15 +00003543 c = C()
3544 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003545
Benjamin Petersone549ead2009-03-28 21:42:05 +00003546 # The most interesting thing here is whether this blows up, due to
3547 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3548 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003549 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003550
Georg Brandl479a7e72008-02-05 18:13:15 +00003551 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003552 # the last container slot works: that will attempt to delete c again,
3553 # which will cause c to get appended back to the container again
3554 # "during" the del. (On non-CPython implementations, however, __del__
3555 # is typically not called again.)
3556 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003557 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003558 del C.container[-1]
3559 if support.check_impl_detail():
3560 support.gc_collect()
3561 self.assertEqual(len(C.container), 1)
3562 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003563
Georg Brandl479a7e72008-02-05 18:13:15 +00003564 # Make c mortal again, so that the test framework with -l doesn't report
3565 # it as a leak.
3566 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003567
Georg Brandl479a7e72008-02-05 18:13:15 +00003568 def test_slots_trash(self):
3569 # Testing slot trash...
3570 # Deallocating deeply nested slotted trash caused stack overflows
3571 class trash(object):
3572 __slots__ = ['x']
3573 def __init__(self, x):
3574 self.x = x
3575 o = None
3576 for i in range(50000):
3577 o = trash(o)
3578 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003579
Georg Brandl479a7e72008-02-05 18:13:15 +00003580 def test_slots_multiple_inheritance(self):
3581 # SF bug 575229, multiple inheritance w/ slots dumps core
3582 class A(object):
3583 __slots__=()
3584 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003585 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003586 class C(A,B) :
3587 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003588 if support.check_impl_detail():
3589 self.assertEqual(C.__basicsize__, B.__basicsize__)
Georg Brandlab91fde2009-08-13 08:51:18 +00003590 self.assertTrue(hasattr(C, '__dict__'))
3591 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl479a7e72008-02-05 18:13:15 +00003592 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003593
Georg Brandl479a7e72008-02-05 18:13:15 +00003594 def test_rmul(self):
3595 # Testing correct invocation of __rmul__...
3596 # SF patch 592646
3597 class C(object):
3598 def __mul__(self, other):
3599 return "mul"
3600 def __rmul__(self, other):
3601 return "rmul"
3602 a = C()
3603 self.assertEqual(a*2, "mul")
3604 self.assertEqual(a*2.2, "mul")
3605 self.assertEqual(2*a, "rmul")
3606 self.assertEqual(2.2*a, "rmul")
3607
3608 def test_ipow(self):
3609 # Testing correct invocation of __ipow__...
3610 # [SF bug 620179]
3611 class C(object):
3612 def __ipow__(self, other):
3613 pass
3614 a = C()
3615 a **= 2
3616
3617 def test_mutable_bases(self):
3618 # Testing mutable bases...
3619
3620 # stuff that should work:
3621 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003622 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003623 class C2(object):
3624 def __getattribute__(self, attr):
3625 if attr == 'a':
3626 return 2
3627 else:
3628 return super(C2, self).__getattribute__(attr)
3629 def meth(self):
3630 return 1
3631 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003632 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003633 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003634 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003635 d = D()
3636 e = E()
3637 D.__bases__ = (C,)
3638 D.__bases__ = (C2,)
3639 self.assertEqual(d.meth(), 1)
3640 self.assertEqual(e.meth(), 1)
3641 self.assertEqual(d.a, 2)
3642 self.assertEqual(e.a, 2)
3643 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003644
Georg Brandl479a7e72008-02-05 18:13:15 +00003645 try:
3646 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003647 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003648 pass
3649 else:
3650 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003651
Georg Brandl479a7e72008-02-05 18:13:15 +00003652 try:
3653 D.__bases__ = ()
3654 except TypeError as msg:
3655 if str(msg) == "a new-style class can't have only classic bases":
3656 self.fail("wrong error message for .__bases__ = ()")
3657 else:
3658 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003659
Georg Brandl479a7e72008-02-05 18:13:15 +00003660 try:
3661 D.__bases__ = (D,)
3662 except TypeError:
3663 pass
3664 else:
3665 # actually, we'll have crashed by here...
3666 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003667
Georg Brandl479a7e72008-02-05 18:13:15 +00003668 try:
3669 D.__bases__ = (C, C)
3670 except TypeError:
3671 pass
3672 else:
3673 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003674
Georg Brandl479a7e72008-02-05 18:13:15 +00003675 try:
3676 D.__bases__ = (E,)
3677 except TypeError:
3678 pass
3679 else:
3680 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003681
Benjamin Petersonae937c02009-04-18 20:54:08 +00003682 def test_builtin_bases(self):
3683 # Make sure all the builtin types can have their base queried without
3684 # segfaulting. See issue #5787.
3685 builtin_types = [tp for tp in builtins.__dict__.values()
3686 if isinstance(tp, type)]
3687 for tp in builtin_types:
3688 object.__getattribute__(tp, "__bases__")
3689 if tp is not object:
3690 self.assertEqual(len(tp.__bases__), 1, tp)
3691
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003692 class L(list):
3693 pass
3694
3695 class C(object):
3696 pass
3697
3698 class D(C):
3699 pass
3700
3701 try:
3702 L.__bases__ = (dict,)
3703 except TypeError:
3704 pass
3705 else:
3706 self.fail("shouldn't turn list subclass into dict subclass")
3707
3708 try:
3709 list.__bases__ = (dict,)
3710 except TypeError:
3711 pass
3712 else:
3713 self.fail("shouldn't be able to assign to list.__bases__")
3714
3715 try:
3716 D.__bases__ = (C, list)
3717 except TypeError:
3718 pass
3719 else:
3720 assert 0, "best_base calculation found wanting"
3721
Benjamin Petersonae937c02009-04-18 20:54:08 +00003722
Georg Brandl479a7e72008-02-05 18:13:15 +00003723 def test_mutable_bases_with_failing_mro(self):
3724 # Testing mutable bases with failing mro...
3725 class WorkOnce(type):
3726 def __new__(self, name, bases, ns):
3727 self.flag = 0
3728 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3729 def mro(self):
3730 if self.flag > 0:
3731 raise RuntimeError("bozo")
3732 else:
3733 self.flag += 1
3734 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003735
Georg Brandl479a7e72008-02-05 18:13:15 +00003736 class WorkAlways(type):
3737 def mro(self):
3738 # this is here to make sure that .mro()s aren't called
3739 # with an exception set (which was possible at one point).
3740 # An error message will be printed in a debug build.
3741 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003742 return type.mro(self)
3743
Georg Brandl479a7e72008-02-05 18:13:15 +00003744 class C(object):
3745 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003746
Georg Brandl479a7e72008-02-05 18:13:15 +00003747 class C2(object):
3748 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003749
Georg Brandl479a7e72008-02-05 18:13:15 +00003750 class D(C):
3751 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003752
Georg Brandl479a7e72008-02-05 18:13:15 +00003753 class E(D):
3754 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003755
Georg Brandl479a7e72008-02-05 18:13:15 +00003756 class F(D, metaclass=WorkOnce):
3757 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003758
Georg Brandl479a7e72008-02-05 18:13:15 +00003759 class G(D, metaclass=WorkAlways):
3760 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003761
Georg Brandl479a7e72008-02-05 18:13:15 +00003762 # Immediate subclasses have their mro's adjusted in alphabetical
3763 # order, so E's will get adjusted before adjusting F's fails. We
3764 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003765
Georg Brandl479a7e72008-02-05 18:13:15 +00003766 E_mro_before = E.__mro__
3767 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003768
Armin Rigofd163f92005-12-29 15:59:19 +00003769 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003770 D.__bases__ = (C2,)
3771 except RuntimeError:
3772 self.assertEqual(E.__mro__, E_mro_before)
3773 self.assertEqual(D.__mro__, D_mro_before)
3774 else:
3775 self.fail("exception not propagated")
3776
3777 def test_mutable_bases_catch_mro_conflict(self):
3778 # Testing mutable bases catch mro conflict...
3779 class A(object):
3780 pass
3781
3782 class B(object):
3783 pass
3784
3785 class C(A, B):
3786 pass
3787
3788 class D(A, B):
3789 pass
3790
3791 class E(C, D):
3792 pass
3793
3794 try:
3795 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003796 except TypeError:
3797 pass
3798 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003799 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003800
Georg Brandl479a7e72008-02-05 18:13:15 +00003801 def test_mutable_names(self):
3802 # Testing mutable names...
3803 class C(object):
3804 pass
3805
3806 # C.__module__ could be 'test_descr' or '__main__'
3807 mod = C.__module__
3808
3809 C.__name__ = 'D'
3810 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3811
3812 C.__name__ = 'D.E'
3813 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3814
3815 def test_subclass_right_op(self):
3816 # Testing correct dispatch of subclass overloading __r<op>__...
3817
3818 # This code tests various cases where right-dispatch of a subclass
3819 # should be preferred over left-dispatch of a base class.
3820
3821 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3822
3823 class B(int):
3824 def __floordiv__(self, other):
3825 return "B.__floordiv__"
3826 def __rfloordiv__(self, other):
3827 return "B.__rfloordiv__"
3828
3829 self.assertEqual(B(1) // 1, "B.__floordiv__")
3830 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3831
3832 # Case 2: subclass of object; this is just the baseline for case 3
3833
3834 class C(object):
3835 def __floordiv__(self, other):
3836 return "C.__floordiv__"
3837 def __rfloordiv__(self, other):
3838 return "C.__rfloordiv__"
3839
3840 self.assertEqual(C() // 1, "C.__floordiv__")
3841 self.assertEqual(1 // C(), "C.__rfloordiv__")
3842
3843 # Case 3: subclass of new-style class; here it gets interesting
3844
3845 class D(C):
3846 def __floordiv__(self, other):
3847 return "D.__floordiv__"
3848 def __rfloordiv__(self, other):
3849 return "D.__rfloordiv__"
3850
3851 self.assertEqual(D() // C(), "D.__floordiv__")
3852 self.assertEqual(C() // D(), "D.__rfloordiv__")
3853
3854 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3855
3856 class E(C):
3857 pass
3858
3859 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3860
3861 self.assertEqual(E() // 1, "C.__floordiv__")
3862 self.assertEqual(1 // E(), "C.__rfloordiv__")
3863 self.assertEqual(E() // C(), "C.__floordiv__")
3864 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3865
Benjamin Petersone549ead2009-03-28 21:42:05 +00003866 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003867 def test_meth_class_get(self):
3868 # Testing __get__ method of METH_CLASS C methods...
3869 # Full coverage of descrobject.c::classmethod_get()
3870
3871 # Baseline
3872 arg = [1, 2, 3]
3873 res = {1: None, 2: None, 3: None}
3874 self.assertEqual(dict.fromkeys(arg), res)
3875 self.assertEqual({}.fromkeys(arg), res)
3876
3877 # Now get the descriptor
3878 descr = dict.__dict__["fromkeys"]
3879
3880 # More baseline using the descriptor directly
3881 self.assertEqual(descr.__get__(None, dict)(arg), res)
3882 self.assertEqual(descr.__get__({})(arg), res)
3883
3884 # Now check various error cases
3885 try:
3886 descr.__get__(None, None)
3887 except TypeError:
3888 pass
3889 else:
3890 self.fail("shouldn't have allowed descr.__get__(None, None)")
3891 try:
3892 descr.__get__(42)
3893 except TypeError:
3894 pass
3895 else:
3896 self.fail("shouldn't have allowed descr.__get__(42)")
3897 try:
3898 descr.__get__(None, 42)
3899 except TypeError:
3900 pass
3901 else:
3902 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3903 try:
3904 descr.__get__(None, int)
3905 except TypeError:
3906 pass
3907 else:
3908 self.fail("shouldn't have allowed descr.__get__(None, int)")
3909
3910 def test_isinst_isclass(self):
3911 # Testing proxy isinstance() and isclass()...
3912 class Proxy(object):
3913 def __init__(self, obj):
3914 self.__obj = obj
3915 def __getattribute__(self, name):
3916 if name.startswith("_Proxy__"):
3917 return object.__getattribute__(self, name)
3918 else:
3919 return getattr(self.__obj, name)
3920 # Test with a classic class
3921 class C:
3922 pass
3923 a = C()
3924 pa = Proxy(a)
Georg Brandlab91fde2009-08-13 08:51:18 +00003925 self.assertTrue(isinstance(a, C)) # Baseline
3926 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003927 # Test with a classic subclass
3928 class D(C):
3929 pass
3930 a = D()
3931 pa = Proxy(a)
Georg Brandlab91fde2009-08-13 08:51:18 +00003932 self.assertTrue(isinstance(a, C)) # Baseline
3933 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003934 # Test with a new-style class
3935 class C(object):
3936 pass
3937 a = C()
3938 pa = Proxy(a)
Georg Brandlab91fde2009-08-13 08:51:18 +00003939 self.assertTrue(isinstance(a, C)) # Baseline
3940 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003941 # Test with a new-style subclass
3942 class D(C):
3943 pass
3944 a = D()
3945 pa = Proxy(a)
Georg Brandlab91fde2009-08-13 08:51:18 +00003946 self.assertTrue(isinstance(a, C)) # Baseline
3947 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003948
3949 def test_proxy_super(self):
3950 # Testing super() for a proxy object...
3951 class Proxy(object):
3952 def __init__(self, obj):
3953 self.__obj = obj
3954 def __getattribute__(self, name):
3955 if name.startswith("_Proxy__"):
3956 return object.__getattribute__(self, name)
3957 else:
3958 return getattr(self.__obj, name)
3959
3960 class B(object):
3961 def f(self):
3962 return "B.f"
3963
3964 class C(B):
3965 def f(self):
3966 return super(C, self).f() + "->C.f"
3967
3968 obj = C()
3969 p = Proxy(obj)
3970 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3971
3972 def test_carloverre(self):
3973 # Testing prohibition of Carlo Verre's hack...
3974 try:
3975 object.__setattr__(str, "foo", 42)
3976 except TypeError:
3977 pass
3978 else:
3979 self.fail("Carlo Verre __setattr__ suceeded!")
3980 try:
3981 object.__delattr__(str, "lower")
3982 except TypeError:
3983 pass
3984 else:
3985 self.fail("Carlo Verre __delattr__ succeeded!")
3986
3987 def test_weakref_segfault(self):
3988 # Testing weakref segfault...
3989 # SF 742911
3990 import weakref
3991
3992 class Provoker:
3993 def __init__(self, referrent):
3994 self.ref = weakref.ref(referrent)
3995
3996 def __del__(self):
3997 x = self.ref()
3998
3999 class Oops(object):
4000 pass
4001
4002 o = Oops()
4003 o.whatever = Provoker(o)
4004 del o
4005
4006 def test_wrapper_segfault(self):
4007 # SF 927248: deeply nested wrappers could cause stack overflow
4008 f = lambda:None
4009 for i in range(1000000):
4010 f = f.__call__
4011 f = None
4012
4013 def test_file_fault(self):
4014 # Testing sys.stdout is changed in getattr...
4015 import sys
4016 class StdoutGuard:
4017 def __getattr__(self, attr):
4018 sys.stdout = sys.__stdout__
4019 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4020 sys.stdout = StdoutGuard()
4021 try:
4022 print("Oops!")
4023 except RuntimeError:
4024 pass
4025
4026 def test_vicious_descriptor_nonsense(self):
4027 # Testing vicious_descriptor_nonsense...
4028
4029 # A potential segfault spotted by Thomas Wouters in mail to
4030 # python-dev 2003-04-17, turned into an example & fixed by Michael
4031 # Hudson just less than four months later...
4032
4033 class Evil(object):
4034 def __hash__(self):
4035 return hash('attr')
4036 def __eq__(self, other):
4037 del C.attr
4038 return 0
4039
4040 class Descr(object):
4041 def __get__(self, ob, type=None):
4042 return 1
4043
4044 class C(object):
4045 attr = Descr()
4046
4047 c = C()
4048 c.__dict__[Evil()] = 0
4049
4050 self.assertEqual(c.attr, 1)
4051 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004052 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004053 self.assertEqual(hasattr(c, 'attr'), False)
4054
4055 def test_init(self):
4056 # SF 1155938
4057 class Foo(object):
4058 def __init__(self):
4059 return 10
4060 try:
4061 Foo()
4062 except TypeError:
4063 pass
4064 else:
4065 self.fail("did not test __init__() for None return")
4066
4067 def test_method_wrapper(self):
4068 # Testing method-wrapper objects...
4069 # <type 'method-wrapper'> did not support any reflection before 2.5
4070
Mark Dickinson211c6252009-02-01 10:28:51 +00004071 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004072
4073 l = []
4074 self.assertEqual(l.__add__, l.__add__)
4075 self.assertEqual(l.__add__, [].__add__)
Georg Brandlab91fde2009-08-13 08:51:18 +00004076 self.assertTrue(l.__add__ != [5].__add__)
4077 self.assertTrue(l.__add__ != l.__mul__)
4078 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004079 if hasattr(l.__add__, '__self__'):
4080 # CPython
Georg Brandlab91fde2009-08-13 08:51:18 +00004081 self.assertTrue(l.__add__.__self__ is l)
4082 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Petersone549ead2009-03-28 21:42:05 +00004083 else:
4084 # Python implementations where [].__add__ is a normal bound method
Georg Brandlab91fde2009-08-13 08:51:18 +00004085 self.assertTrue(l.__add__.im_self is l)
4086 self.assertTrue(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004087 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4088 try:
4089 hash(l.__add__)
4090 except TypeError:
4091 pass
4092 else:
4093 self.fail("no TypeError from hash([].__add__)")
4094
4095 t = ()
4096 t += (7,)
4097 self.assertEqual(t.__add__, (7,).__add__)
4098 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4099
4100 def test_not_implemented(self):
4101 # Testing NotImplemented...
4102 # all binary methods should be able to return a NotImplemented
4103 import sys
4104 import types
4105 import operator
4106
4107 def specialmethod(self, other):
4108 return NotImplemented
4109
4110 def check(expr, x, y):
4111 try:
4112 exec(expr, {'x': x, 'y': y, 'operator': operator})
4113 except TypeError:
4114 pass
4115 else:
4116 self.fail("no TypeError from %r" % (expr,))
4117
4118 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4119 # TypeErrors
4120 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4121 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004122 for name, expr, iexpr in [
4123 ('__add__', 'x + y', 'x += y'),
4124 ('__sub__', 'x - y', 'x -= y'),
4125 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004126 ('__truediv__', 'operator.truediv(x, y)', None),
4127 ('__floordiv__', 'operator.floordiv(x, y)', None),
4128 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004129 ('__mod__', 'x % y', 'x %= y'),
4130 ('__divmod__', 'divmod(x, y)', None),
4131 ('__pow__', 'x ** y', 'x **= y'),
4132 ('__lshift__', 'x << y', 'x <<= y'),
4133 ('__rshift__', 'x >> y', 'x >>= y'),
4134 ('__and__', 'x & y', 'x &= y'),
4135 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004136 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004137 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004138 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004139 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004140 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004141 check(expr, a, N1)
4142 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004143 if iexpr:
4144 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004145 check(iexpr, a, N1)
4146 check(iexpr, a, N2)
4147 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004148 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004149 c = C()
4150 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004151 check(iexpr, c, N1)
4152 check(iexpr, c, N2)
4153
Georg Brandl479a7e72008-02-05 18:13:15 +00004154 def test_assign_slice(self):
4155 # ceval.c's assign_slice used to check for
4156 # tp->tp_as_sequence->sq_slice instead of
4157 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004158
Georg Brandl479a7e72008-02-05 18:13:15 +00004159 class C(object):
4160 def __setitem__(self, idx, value):
4161 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004162
Georg Brandl479a7e72008-02-05 18:13:15 +00004163 c = C()
4164 c[1:2] = 3
4165 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004166
Benjamin Peterson23b9ef72010-02-03 02:43:37 +00004167 def test_set_and_no_get(self):
4168 # See
4169 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4170 class Descr(object):
4171
4172 def __init__(self, name):
4173 self.name = name
4174
4175 def __set__(self, obj, value):
4176 obj.__dict__[self.name] = value
4177 descr = Descr("a")
4178
4179 class X(object):
4180 a = descr
4181
4182 x = X()
4183 self.assertIs(x.a, descr)
4184 x.a = 42
4185 self.assertEqual(x.a, 42)
4186
Benjamin Peterson9262b842008-11-17 22:45:50 +00004187 def test_getattr_hooks(self):
4188 # issue 4230
4189
4190 class Descriptor(object):
4191 counter = 0
4192 def __get__(self, obj, objtype=None):
4193 def getter(name):
4194 self.counter += 1
4195 raise AttributeError(name)
4196 return getter
4197
4198 descr = Descriptor()
4199 class A(object):
4200 __getattribute__ = descr
4201 class B(object):
4202 __getattr__ = descr
4203 class C(object):
4204 __getattribute__ = descr
4205 __getattr__ = descr
4206
4207 self.assertRaises(AttributeError, getattr, A(), "attr")
4208 self.assertEquals(descr.counter, 1)
4209 self.assertRaises(AttributeError, getattr, B(), "attr")
4210 self.assertEquals(descr.counter, 2)
4211 self.assertRaises(AttributeError, getattr, C(), "attr")
4212 self.assertEquals(descr.counter, 4)
4213
4214 import gc
4215 class EvilGetattribute(object):
4216 # This used to segfault
4217 def __getattr__(self, name):
4218 raise AttributeError(name)
4219 def __getattribute__(self, name):
4220 del EvilGetattribute.__getattr__
4221 for i in range(5):
4222 gc.collect()
4223 raise AttributeError(name)
4224
4225 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4226
Christian Heimesbbffeb62008-01-24 09:42:52 +00004227
Georg Brandl479a7e72008-02-05 18:13:15 +00004228class DictProxyTests(unittest.TestCase):
4229 def setUp(self):
4230 class C(object):
4231 def meth(self):
4232 pass
4233 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004234
Georg Brandl479a7e72008-02-05 18:13:15 +00004235 def test_iter_keys(self):
4236 # Testing dict-proxy iterkeys...
4237 keys = [ key for key in self.C.__dict__.keys() ]
4238 keys.sort()
4239 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4240 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004241
Georg Brandl479a7e72008-02-05 18:13:15 +00004242 def test_iter_values(self):
4243 # Testing dict-proxy itervalues...
4244 values = [ values for values in self.C.__dict__.values() ]
4245 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004246
Georg Brandl479a7e72008-02-05 18:13:15 +00004247 def test_iter_items(self):
4248 # Testing dict-proxy iteritems...
4249 keys = [ key for (key, value) in self.C.__dict__.items() ]
4250 keys.sort()
4251 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4252 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004253
Georg Brandl479a7e72008-02-05 18:13:15 +00004254 def test_dict_type_with_metaclass(self):
4255 # Testing type of __dict__ when metaclass set...
4256 class B(object):
4257 pass
4258 class M(type):
4259 pass
4260 class C(metaclass=M):
4261 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4262 pass
4263 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004264
Christian Heimesbbffeb62008-01-24 09:42:52 +00004265
Georg Brandl479a7e72008-02-05 18:13:15 +00004266class PTypesLongInitTest(unittest.TestCase):
4267 # This is in its own TestCase so that it can be run before any other tests.
4268 def test_pytype_long_ready(self):
4269 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004270
Georg Brandl479a7e72008-02-05 18:13:15 +00004271 # This dumps core when SF bug 551412 isn't fixed --
4272 # but only when test_descr.py is run separately.
4273 # (That can't be helped -- as soon as PyType_Ready()
4274 # is called for PyLong_Type, the bug is gone.)
4275 class UserLong(object):
4276 def __pow__(self, *args):
4277 pass
4278 try:
4279 pow(0, UserLong(), 0)
4280 except:
4281 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004282
Georg Brandl479a7e72008-02-05 18:13:15 +00004283 # Another segfault only when run early
4284 # (before PyType_Ready(tuple) is called)
4285 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004286
4287
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004288def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004289 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004290 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004291 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004292
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004293if __name__ == "__main__":
4294 test_main()