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