blob: 47fecfe34fa99bbbcb7953590d8fe94df4137938 [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
Benjamin Peterson8bb9cde2010-07-01 15:16:55 +00004import math
Georg Brandl479a7e72008-02-05 18:13:15 +00005import unittest
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_floats(self):
252 # Testing float operations...
253 self.number_operators(100.0, 3.0)
Tim Peters25786c02001-09-02 08:22:48 +0000254
Georg Brandl479a7e72008-02-05 18:13:15 +0000255 def test_complexes(self):
256 # Testing complex operations...
257 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
Mark Dickinson5c2db372009-12-05 20:28:34 +0000258 'int', 'float',
Georg Brandl479a7e72008-02-05 18:13:15 +0000259 'divmod', 'mod'])
Tim Peters25786c02001-09-02 08:22:48 +0000260
Georg Brandl479a7e72008-02-05 18:13:15 +0000261 class Number(complex):
262 __slots__ = ['prec']
263 def __new__(cls, *args, **kwds):
264 result = complex.__new__(cls, *args)
265 result.prec = kwds.get('prec', 12)
266 return result
267 def __repr__(self):
268 prec = self.prec
269 if self.imag == 0.0:
270 return "%.*g" % (prec, self.real)
271 if self.real == 0.0:
272 return "%.*gj" % (prec, self.imag)
273 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
274 __str__ = __repr__
Tim Peters25786c02001-09-02 08:22:48 +0000275
Georg Brandl479a7e72008-02-05 18:13:15 +0000276 a = Number(3.14, prec=6)
277 self.assertEqual(repr(a), "3.14")
278 self.assertEqual(a.prec, 6)
Tim Peters1fc240e2001-10-26 05:06:50 +0000279
Georg Brandl479a7e72008-02-05 18:13:15 +0000280 a = Number(a, prec=2)
281 self.assertEqual(repr(a), "3.1")
282 self.assertEqual(a.prec, 2)
Tim Peters1fc240e2001-10-26 05:06:50 +0000283
Georg Brandl479a7e72008-02-05 18:13:15 +0000284 a = Number(234.5)
285 self.assertEqual(repr(a), "234.5")
286 self.assertEqual(a.prec, 12)
Tim Peters1fc240e2001-10-26 05:06:50 +0000287
Mark Dickinsonb09a3d62010-09-23 20:11:19 +0000288 def test_explicit_reverse_methods(self):
289 # see issue 9930
290 self.assertEqual(complex.__radd__(3j, 4.0), complex(4.0, 3.0))
291 self.assertEqual(float.__rsub__(3.0, 1), -2.0)
292
Benjamin Petersone549ead2009-03-28 21:42:05 +0000293 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000294 def test_spam_lists(self):
295 # Testing spamlist operations...
296 import copy, xxsubtype as spam
297
298 def spamlist(l, memo=None):
299 import xxsubtype as spam
300 return spam.spamlist(l)
301
302 # This is an ugly hack:
303 copy._deepcopy_dispatch[spam.spamlist] = spamlist
304
305 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
306 "__add__")
307 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
308 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
309 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
310 self.sliceop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
311 "__getitem__")
312 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
313 "__iadd__")
314 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
315 "__imul__")
316 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
317 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
318 "__mul__")
319 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
320 "__rmul__")
321 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
322 "__setitem__")
323 self.setsliceop_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
324 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
325 # Test subclassing
326 class C(spam.spamlist):
327 def foo(self): return 1
328 a = C()
329 self.assertEqual(a, [])
330 self.assertEqual(a.foo(), 1)
331 a.append(100)
332 self.assertEqual(a, [100])
333 self.assertEqual(a.getstate(), 0)
334 a.setstate(42)
335 self.assertEqual(a.getstate(), 42)
336
Benjamin Petersone549ead2009-03-28 21:42:05 +0000337 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000338 def test_spam_dicts(self):
339 # Testing spamdict operations...
340 import copy, xxsubtype as spam
341 def spamdict(d, memo=None):
342 import xxsubtype as spam
343 sd = spam.spamdict()
344 for k, v in list(d.items()):
345 sd[k] = v
346 return sd
347 # This is an ugly hack:
348 copy._deepcopy_dispatch[spam.spamdict] = spamdict
349
Georg Brandl479a7e72008-02-05 18:13:15 +0000350 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
351 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
352 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
353 d = spamdict({1:2,3:4})
354 l1 = []
355 for i in list(d.keys()):
356 l1.append(i)
357 l = []
358 for i in iter(d):
359 l.append(i)
360 self.assertEqual(l, l1)
361 l = []
362 for i in d.__iter__():
363 l.append(i)
364 self.assertEqual(l, l1)
365 l = []
366 for i in type(spamdict({})).__iter__(d):
367 l.append(i)
368 self.assertEqual(l, l1)
369 straightd = {1:2, 3:4}
370 spamd = spamdict(straightd)
371 self.unop_test(spamd, 2, "len(a)", "__len__")
372 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
373 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
374 "a[b]=c", "__setitem__")
375 # Test subclassing
376 class C(spam.spamdict):
377 def foo(self): return 1
378 a = C()
379 self.assertEqual(list(a.items()), [])
380 self.assertEqual(a.foo(), 1)
381 a['foo'] = 'bar'
382 self.assertEqual(list(a.items()), [('foo', 'bar')])
383 self.assertEqual(a.getstate(), 0)
384 a.setstate(100)
385 self.assertEqual(a.getstate(), 100)
386
387class ClassPropertiesAndMethods(unittest.TestCase):
388
389 def test_python_dicts(self):
390 # Testing Python subclass of dict...
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000391 self.assertTrue(issubclass(dict, dict))
Ezio Melottie9615932010-01-24 19:26:24 +0000392 self.assertIsInstance({}, dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000393 d = dict()
394 self.assertEqual(d, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000395 self.assertTrue(d.__class__ is dict)
Ezio Melottie9615932010-01-24 19:26:24 +0000396 self.assertIsInstance(d, dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000397 class C(dict):
398 state = -1
399 def __init__(self_local, *a, **kw):
400 if a:
401 self.assertEqual(len(a), 1)
402 self_local.state = a[0]
403 if kw:
404 for k, v in list(kw.items()):
405 self_local[v] = k
406 def __getitem__(self, key):
407 return self.get(key, 0)
408 def __setitem__(self_local, key, value):
Ezio Melottie9615932010-01-24 19:26:24 +0000409 self.assertIsInstance(key, type(0))
Georg Brandl479a7e72008-02-05 18:13:15 +0000410 dict.__setitem__(self_local, key, value)
411 def setstate(self, state):
412 self.state = state
413 def getstate(self):
414 return self.state
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000415 self.assertTrue(issubclass(C, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000416 a1 = C(12)
417 self.assertEqual(a1.state, 12)
418 a2 = C(foo=1, bar=2)
419 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
420 a = C()
421 self.assertEqual(a.state, -1)
422 self.assertEqual(a.getstate(), -1)
423 a.setstate(0)
424 self.assertEqual(a.state, 0)
425 self.assertEqual(a.getstate(), 0)
426 a.setstate(10)
427 self.assertEqual(a.state, 10)
428 self.assertEqual(a.getstate(), 10)
429 self.assertEqual(a[42], 0)
430 a[42] = 24
431 self.assertEqual(a[42], 24)
432 N = 50
433 for i in range(N):
434 a[i] = C()
435 for j in range(N):
436 a[i][j] = i*j
437 for i in range(N):
438 for j in range(N):
439 self.assertEqual(a[i][j], i*j)
440
441 def test_python_lists(self):
442 # Testing Python subclass of list...
443 class C(list):
444 def __getitem__(self, i):
445 if isinstance(i, slice):
446 return i.start, i.stop
447 return list.__getitem__(self, i) + 100
448 a = C()
449 a.extend([0,1,2])
450 self.assertEqual(a[0], 100)
451 self.assertEqual(a[1], 101)
452 self.assertEqual(a[2], 102)
453 self.assertEqual(a[100:200], (100,200))
454
455 def test_metaclass(self):
Georg Brandle81f5ef2008-05-27 20:34:09 +0000456 # Testing metaclasses...
Georg Brandl479a7e72008-02-05 18:13:15 +0000457 class C(metaclass=type):
458 def __init__(self):
459 self.__state = 0
460 def getstate(self):
461 return self.__state
462 def setstate(self, state):
463 self.__state = state
464 a = C()
465 self.assertEqual(a.getstate(), 0)
466 a.setstate(10)
467 self.assertEqual(a.getstate(), 10)
468 class _metaclass(type):
469 def myself(cls): return cls
470 class D(metaclass=_metaclass):
471 pass
472 self.assertEqual(D.myself(), D)
473 d = D()
474 self.assertEqual(d.__class__, D)
475 class M1(type):
476 def __new__(cls, name, bases, dict):
477 dict['__spam__'] = 1
478 return type.__new__(cls, name, bases, dict)
479 class C(metaclass=M1):
480 pass
481 self.assertEqual(C.__spam__, 1)
482 c = C()
483 self.assertEqual(c.__spam__, 1)
484
485 class _instance(object):
486 pass
487 class M2(object):
488 @staticmethod
489 def __new__(cls, name, bases, dict):
490 self = object.__new__(cls)
491 self.name = name
492 self.bases = bases
493 self.dict = dict
494 return self
495 def __call__(self):
496 it = _instance()
497 # Early binding of methods
498 for key in self.dict:
499 if key.startswith("__"):
500 continue
501 setattr(it, key, self.dict[key].__get__(it, self))
502 return it
503 class C(metaclass=M2):
504 def spam(self):
505 return 42
506 self.assertEqual(C.name, 'C')
507 self.assertEqual(C.bases, ())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000508 self.assertIn('spam', C.dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000509 c = C()
510 self.assertEqual(c.spam(), 42)
511
512 # More metaclass examples
513
514 class autosuper(type):
515 # Automatically add __super to the class
516 # This trick only works for dynamic classes
517 def __new__(metaclass, name, bases, dict):
518 cls = super(autosuper, metaclass).__new__(metaclass,
519 name, bases, dict)
520 # Name mangling for __super removes leading underscores
521 while name[:1] == "_":
522 name = name[1:]
523 if name:
524 name = "_%s__super" % name
525 else:
526 name = "__super"
527 setattr(cls, name, super(cls))
528 return cls
529 class A(metaclass=autosuper):
530 def meth(self):
531 return "A"
532 class B(A):
533 def meth(self):
534 return "B" + self.__super.meth()
535 class C(A):
536 def meth(self):
537 return "C" + self.__super.meth()
538 class D(C, B):
539 def meth(self):
540 return "D" + self.__super.meth()
541 self.assertEqual(D().meth(), "DCBA")
542 class E(B, C):
543 def meth(self):
544 return "E" + self.__super.meth()
545 self.assertEqual(E().meth(), "EBCA")
546
547 class autoproperty(type):
548 # Automatically create property attributes when methods
549 # named _get_x and/or _set_x are found
550 def __new__(metaclass, name, bases, dict):
551 hits = {}
552 for key, val in dict.items():
553 if key.startswith("_get_"):
554 key = key[5:]
555 get, set = hits.get(key, (None, None))
556 get = val
557 hits[key] = get, set
558 elif key.startswith("_set_"):
559 key = key[5:]
560 get, set = hits.get(key, (None, None))
561 set = val
562 hits[key] = get, set
563 for key, (get, set) in hits.items():
564 dict[key] = property(get, set)
565 return super(autoproperty, metaclass).__new__(metaclass,
566 name, bases, dict)
567 class A(metaclass=autoproperty):
568 def _get_x(self):
569 return -self.__x
570 def _set_x(self, x):
571 self.__x = -x
572 a = A()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000573 self.assertTrue(not hasattr(a, "x"))
Georg Brandl479a7e72008-02-05 18:13:15 +0000574 a.x = 12
575 self.assertEqual(a.x, 12)
576 self.assertEqual(a._A__x, -12)
577
578 class multimetaclass(autoproperty, autosuper):
579 # Merge of multiple cooperating metaclasses
580 pass
581 class A(metaclass=multimetaclass):
582 def _get_x(self):
583 return "A"
584 class B(A):
585 def _get_x(self):
586 return "B" + self.__super._get_x()
587 class C(A):
588 def _get_x(self):
589 return "C" + self.__super._get_x()
590 class D(C, B):
591 def _get_x(self):
592 return "D" + self.__super._get_x()
593 self.assertEqual(D().x, "DCBA")
594
595 # Make sure type(x) doesn't call x.__class__.__init__
596 class T(type):
597 counter = 0
598 def __init__(self, *args):
599 T.counter += 1
600 class C(metaclass=T):
601 pass
602 self.assertEqual(T.counter, 1)
603 a = C()
604 self.assertEqual(type(a), C)
605 self.assertEqual(T.counter, 1)
606
607 class C(object): pass
608 c = C()
609 try: c()
610 except TypeError: pass
611 else: self.fail("calling object w/o call method should raise "
612 "TypeError")
613
614 # Testing code to find most derived baseclass
615 class A(type):
616 def __new__(*args, **kwargs):
617 return type.__new__(*args, **kwargs)
618
619 class B(object):
620 pass
621
622 class C(object, metaclass=A):
623 pass
624
625 # The most derived metaclass of D is A rather than type.
626 class D(B, C):
627 pass
628
629 def test_module_subclasses(self):
630 # Testing Python subclass of module...
631 log = []
Georg Brandl479a7e72008-02-05 18:13:15 +0000632 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)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +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']
Georg Brandl479a7e72008-02-05 18:13:15 +00001013 s = F()
1014 s.a = [Counted(), s]
1015 self.assertEqual(Counted.counter, 1)
1016 s = None
Benjamin Petersone549ead2009-03-28 21:42:05 +00001017 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001018 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001019
Georg Brandl479a7e72008-02-05 18:13:15 +00001020 # Test lookup leaks [SF bug 572567]
Georg Brandl1b37e872010-03-14 10:45:50 +00001021 import gc
Benjamin Petersone549ead2009-03-28 21:42:05 +00001022 if hasattr(gc, 'get_objects'):
1023 class G(object):
Benjamin Petersona8b976b2009-10-11 18:28:48 +00001024 def __eq__(self, other):
1025 return False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001026 g = G()
1027 orig_objects = len(gc.get_objects())
1028 for i in range(10):
1029 g==g
1030 new_objects = len(gc.get_objects())
1031 self.assertEqual(orig_objects, new_objects)
1032
Georg Brandl479a7e72008-02-05 18:13:15 +00001033 class H(object):
1034 __slots__ = ['a', 'b']
1035 def __init__(self):
1036 self.a = 1
1037 self.b = 2
1038 def __del__(self_):
1039 self.assertEqual(self_.a, 1)
1040 self.assertEqual(self_.b, 2)
Benjamin Petersonc1de4cc2008-11-03 21:29:09 +00001041 with support.captured_output('stderr') as s:
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001042 h = H()
Georg Brandl479a7e72008-02-05 18:13:15 +00001043 del h
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001044 self.assertEqual(s.getvalue(), '')
Guido van Rossum90c45142001-11-24 21:07:01 +00001045
Benjamin Petersond12362a2009-12-30 19:44:54 +00001046 class X(object):
1047 __slots__ = "a"
1048 with self.assertRaises(AttributeError):
1049 del X().a
1050
Georg Brandl479a7e72008-02-05 18:13:15 +00001051 def test_slots_special(self):
1052 # Testing __dict__ and __weakref__ in __slots__...
1053 class D(object):
1054 __slots__ = ["__dict__"]
1055 a = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001056 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001057 self.assertFalse(hasattr(a, "__weakref__"))
1058 a.foo = 42
1059 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum90c45142001-11-24 21:07:01 +00001060
Georg Brandl479a7e72008-02-05 18:13:15 +00001061 class W(object):
1062 __slots__ = ["__weakref__"]
1063 a = W()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001064 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001065 self.assertFalse(hasattr(a, "__dict__"))
1066 try:
1067 a.foo = 42
1068 except AttributeError:
1069 pass
1070 else:
1071 self.fail("shouldn't be allowed to set a.foo")
1072
1073 class C1(W, D):
1074 __slots__ = []
1075 a = C1()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001076 self.assertTrue(hasattr(a, "__dict__"))
1077 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001078 a.foo = 42
1079 self.assertEqual(a.__dict__, {"foo": 42})
1080
1081 class C2(D, W):
1082 __slots__ = []
1083 a = C2()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001084 self.assertTrue(hasattr(a, "__dict__"))
1085 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001086 a.foo = 42
1087 self.assertEqual(a.__dict__, {"foo": 42})
1088
Christian Heimesa156e092008-02-16 07:38:31 +00001089 def test_slots_descriptor(self):
1090 # Issue2115: slot descriptors did not correctly check
1091 # the type of the given object
1092 import abc
1093 class MyABC(metaclass=abc.ABCMeta):
1094 __slots__ = "a"
1095
1096 class Unrelated(object):
1097 pass
1098 MyABC.register(Unrelated)
1099
1100 u = Unrelated()
Ezio Melottie9615932010-01-24 19:26:24 +00001101 self.assertIsInstance(u, MyABC)
Christian Heimesa156e092008-02-16 07:38:31 +00001102
1103 # This used to crash
1104 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1105
Georg Brandl479a7e72008-02-05 18:13:15 +00001106 def test_dynamics(self):
1107 # Testing class attribute propagation...
1108 class D(object):
1109 pass
1110 class E(D):
1111 pass
1112 class F(D):
1113 pass
1114 D.foo = 1
1115 self.assertEqual(D.foo, 1)
1116 # Test that dynamic attributes are inherited
1117 self.assertEqual(E.foo, 1)
1118 self.assertEqual(F.foo, 1)
1119 # Test dynamic instances
1120 class C(object):
1121 pass
1122 a = C()
1123 self.assertFalse(hasattr(a, "foobar"))
1124 C.foobar = 2
1125 self.assertEqual(a.foobar, 2)
1126 C.method = lambda self: 42
1127 self.assertEqual(a.method(), 42)
1128 C.__repr__ = lambda self: "C()"
1129 self.assertEqual(repr(a), "C()")
1130 C.__int__ = lambda self: 100
1131 self.assertEqual(int(a), 100)
1132 self.assertEqual(a.foobar, 2)
1133 self.assertFalse(hasattr(a, "spam"))
1134 def mygetattr(self, name):
1135 if name == "spam":
1136 return "spam"
1137 raise AttributeError
1138 C.__getattr__ = mygetattr
1139 self.assertEqual(a.spam, "spam")
1140 a.new = 12
1141 self.assertEqual(a.new, 12)
1142 def mysetattr(self, name, value):
1143 if name == "spam":
1144 raise AttributeError
1145 return object.__setattr__(self, name, value)
1146 C.__setattr__ = mysetattr
1147 try:
1148 a.spam = "not spam"
1149 except AttributeError:
1150 pass
1151 else:
1152 self.fail("expected AttributeError")
1153 self.assertEqual(a.spam, "spam")
1154 class D(C):
1155 pass
1156 d = D()
1157 d.foo = 1
1158 self.assertEqual(d.foo, 1)
1159
1160 # Test handling of int*seq and seq*int
1161 class I(int):
1162 pass
1163 self.assertEqual("a"*I(2), "aa")
1164 self.assertEqual(I(2)*"a", "aa")
1165 self.assertEqual(2*I(3), 6)
1166 self.assertEqual(I(3)*2, 6)
1167 self.assertEqual(I(3)*I(2), 6)
1168
Georg Brandl479a7e72008-02-05 18:13:15 +00001169 # Test comparison of classes with dynamic metaclasses
1170 class dynamicmetaclass(type):
1171 pass
1172 class someclass(metaclass=dynamicmetaclass):
1173 pass
1174 self.assertNotEqual(someclass, object)
1175
1176 def test_errors(self):
1177 # Testing errors...
1178 try:
1179 class C(list, dict):
1180 pass
1181 except TypeError:
1182 pass
1183 else:
1184 self.fail("inheritance from both list and dict should be illegal")
1185
1186 try:
1187 class C(object, None):
1188 pass
1189 except TypeError:
1190 pass
1191 else:
1192 self.fail("inheritance from non-type should be illegal")
1193 class Classic:
1194 pass
1195
1196 try:
1197 class C(type(len)):
1198 pass
1199 except TypeError:
1200 pass
1201 else:
1202 self.fail("inheritance from CFunction should be illegal")
1203
1204 try:
1205 class C(object):
1206 __slots__ = 1
1207 except TypeError:
1208 pass
1209 else:
1210 self.fail("__slots__ = 1 should be illegal")
1211
1212 try:
1213 class C(object):
1214 __slots__ = [1]
1215 except TypeError:
1216 pass
1217 else:
1218 self.fail("__slots__ = [1] should be illegal")
1219
1220 class M1(type):
1221 pass
1222 class M2(type):
1223 pass
1224 class A1(object, metaclass=M1):
1225 pass
1226 class A2(object, metaclass=M2):
1227 pass
1228 try:
1229 class B(A1, A2):
1230 pass
1231 except TypeError:
1232 pass
1233 else:
1234 self.fail("finding the most derived metaclass should have failed")
1235
1236 def test_classmethods(self):
1237 # Testing class methods...
1238 class C(object):
1239 def foo(*a): return a
1240 goo = classmethod(foo)
1241 c = C()
1242 self.assertEqual(C.goo(1), (C, 1))
1243 self.assertEqual(c.goo(1), (C, 1))
1244 self.assertEqual(c.foo(1), (c, 1))
1245 class D(C):
1246 pass
1247 d = D()
1248 self.assertEqual(D.goo(1), (D, 1))
1249 self.assertEqual(d.goo(1), (D, 1))
1250 self.assertEqual(d.foo(1), (d, 1))
1251 self.assertEqual(D.foo(d, 1), (d, 1))
1252 # Test for a specific crash (SF bug 528132)
1253 def f(cls, arg): return (cls, arg)
1254 ff = classmethod(f)
1255 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1256 self.assertEqual(ff.__get__(0)(42), (int, 42))
1257
1258 # Test super() with classmethods (SF bug 535444)
1259 self.assertEqual(C.goo.__self__, C)
1260 self.assertEqual(D.goo.__self__, D)
1261 self.assertEqual(super(D,D).goo.__self__, D)
1262 self.assertEqual(super(D,d).goo.__self__, D)
1263 self.assertEqual(super(D,D).goo(), (D,))
1264 self.assertEqual(super(D,d).goo(), (D,))
1265
Benjamin Peterson8719ad52009-09-11 22:24:02 +00001266 # Verify that a non-callable will raise
1267 meth = classmethod(1).__get__(1)
1268 self.assertRaises(TypeError, meth)
Georg Brandl479a7e72008-02-05 18:13:15 +00001269
1270 # Verify that classmethod() doesn't allow keyword args
1271 try:
1272 classmethod(f, kw=1)
1273 except TypeError:
1274 pass
1275 else:
1276 self.fail("classmethod shouldn't accept keyword args")
1277
Benjamin Petersone549ead2009-03-28 21:42:05 +00001278 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001279 def test_classmethods_in_c(self):
1280 # Testing C-based class methods...
1281 import xxsubtype as spam
1282 a = (1, 2, 3)
1283 d = {'abc': 123}
1284 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1285 self.assertEqual(x, spam.spamlist)
1286 self.assertEqual(a, a1)
1287 self.assertEqual(d, d1)
1288 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1289 self.assertEqual(x, spam.spamlist)
1290 self.assertEqual(a, a1)
1291 self.assertEqual(d, d1)
1292
1293 def test_staticmethods(self):
1294 # Testing static methods...
1295 class C(object):
1296 def foo(*a): return a
1297 goo = staticmethod(foo)
1298 c = C()
1299 self.assertEqual(C.goo(1), (1,))
1300 self.assertEqual(c.goo(1), (1,))
1301 self.assertEqual(c.foo(1), (c, 1,))
1302 class D(C):
1303 pass
1304 d = D()
1305 self.assertEqual(D.goo(1), (1,))
1306 self.assertEqual(d.goo(1), (1,))
1307 self.assertEqual(d.foo(1), (d, 1))
1308 self.assertEqual(D.foo(d, 1), (d, 1))
1309
Benjamin Petersone549ead2009-03-28 21:42:05 +00001310 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001311 def test_staticmethods_in_c(self):
1312 # Testing C-based static methods...
1313 import xxsubtype as spam
1314 a = (1, 2, 3)
1315 d = {"abc": 123}
1316 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1317 self.assertEqual(x, None)
1318 self.assertEqual(a, a1)
1319 self.assertEqual(d, d1)
1320 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1321 self.assertEqual(x, None)
1322 self.assertEqual(a, a1)
1323 self.assertEqual(d, d1)
1324
1325 def test_classic(self):
1326 # Testing classic classes...
1327 class C:
1328 def foo(*a): return a
1329 goo = classmethod(foo)
1330 c = C()
1331 self.assertEqual(C.goo(1), (C, 1))
1332 self.assertEqual(c.goo(1), (C, 1))
1333 self.assertEqual(c.foo(1), (c, 1))
1334 class D(C):
1335 pass
1336 d = D()
1337 self.assertEqual(D.goo(1), (D, 1))
1338 self.assertEqual(d.goo(1), (D, 1))
1339 self.assertEqual(d.foo(1), (d, 1))
1340 self.assertEqual(D.foo(d, 1), (d, 1))
1341 class E: # *not* subclassing from C
1342 foo = C.foo
1343 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001344 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001345
1346 def test_compattr(self):
1347 # Testing computed attributes...
1348 class C(object):
1349 class computed_attribute(object):
1350 def __init__(self, get, set=None, delete=None):
1351 self.__get = get
1352 self.__set = set
1353 self.__delete = delete
1354 def __get__(self, obj, type=None):
1355 return self.__get(obj)
1356 def __set__(self, obj, value):
1357 return self.__set(obj, value)
1358 def __delete__(self, obj):
1359 return self.__delete(obj)
1360 def __init__(self):
1361 self.__x = 0
1362 def __get_x(self):
1363 x = self.__x
1364 self.__x = x+1
1365 return x
1366 def __set_x(self, x):
1367 self.__x = x
1368 def __delete_x(self):
1369 del self.__x
1370 x = computed_attribute(__get_x, __set_x, __delete_x)
1371 a = C()
1372 self.assertEqual(a.x, 0)
1373 self.assertEqual(a.x, 1)
1374 a.x = 10
1375 self.assertEqual(a.x, 10)
1376 self.assertEqual(a.x, 11)
1377 del a.x
1378 self.assertEqual(hasattr(a, 'x'), 0)
1379
1380 def test_newslots(self):
1381 # Testing __new__ slot override...
1382 class C(list):
1383 def __new__(cls):
1384 self = list.__new__(cls)
1385 self.foo = 1
1386 return self
1387 def __init__(self):
1388 self.foo = self.foo + 2
1389 a = C()
1390 self.assertEqual(a.foo, 3)
1391 self.assertEqual(a.__class__, C)
1392 class D(C):
1393 pass
1394 b = D()
1395 self.assertEqual(b.foo, 3)
1396 self.assertEqual(b.__class__, D)
1397
1398 def test_altmro(self):
1399 # Testing mro() and overriding it...
1400 class A(object):
1401 def f(self): return "A"
1402 class B(A):
1403 pass
1404 class C(A):
1405 def f(self): return "C"
1406 class D(B, C):
1407 pass
1408 self.assertEqual(D.mro(), [D, B, C, A, object])
1409 self.assertEqual(D.__mro__, (D, B, C, A, object))
1410 self.assertEqual(D().f(), "C")
1411
1412 class PerverseMetaType(type):
1413 def mro(cls):
1414 L = type.mro(cls)
1415 L.reverse()
1416 return L
1417 class X(D,B,C,A, metaclass=PerverseMetaType):
1418 pass
1419 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1420 self.assertEqual(X().f(), "A")
1421
1422 try:
1423 class _metaclass(type):
1424 def mro(self):
1425 return [self, dict, object]
1426 class X(object, metaclass=_metaclass):
1427 pass
Benjamin Petersone549ead2009-03-28 21:42:05 +00001428 # In CPython, the class creation above already raises
1429 # TypeError, as a protection against the fact that
1430 # instances of X would segfault it. In other Python
1431 # implementations it would be ok to let the class X
1432 # be created, but instead get a clean TypeError on the
1433 # __setitem__ below.
1434 x = object.__new__(X)
1435 x[5] = 6
Georg Brandl479a7e72008-02-05 18:13:15 +00001436 except TypeError:
1437 pass
1438 else:
1439 self.fail("devious mro() return not caught")
1440
1441 try:
1442 class _metaclass(type):
1443 def mro(self):
1444 return [1]
1445 class X(object, metaclass=_metaclass):
1446 pass
1447 except TypeError:
1448 pass
1449 else:
1450 self.fail("non-class mro() return not caught")
1451
1452 try:
1453 class _metaclass(type):
1454 def mro(self):
1455 return 1
1456 class X(object, metaclass=_metaclass):
1457 pass
1458 except TypeError:
1459 pass
1460 else:
1461 self.fail("non-sequence mro() return not caught")
1462
1463 def test_overloading(self):
1464 # Testing operator overloading...
1465
1466 class B(object):
1467 "Intermediate class because object doesn't have a __setattr__"
1468
1469 class C(B):
1470 def __getattr__(self, name):
1471 if name == "foo":
1472 return ("getattr", name)
1473 else:
1474 raise AttributeError
1475 def __setattr__(self, name, value):
1476 if name == "foo":
1477 self.setattr = (name, value)
1478 else:
1479 return B.__setattr__(self, name, value)
1480 def __delattr__(self, name):
1481 if name == "foo":
1482 self.delattr = name
1483 else:
1484 return B.__delattr__(self, name)
1485
1486 def __getitem__(self, key):
1487 return ("getitem", key)
1488 def __setitem__(self, key, value):
1489 self.setitem = (key, value)
1490 def __delitem__(self, key):
1491 self.delitem = key
1492
1493 a = C()
1494 self.assertEqual(a.foo, ("getattr", "foo"))
1495 a.foo = 12
1496 self.assertEqual(a.setattr, ("foo", 12))
1497 del a.foo
1498 self.assertEqual(a.delattr, "foo")
1499
1500 self.assertEqual(a[12], ("getitem", 12))
1501 a[12] = 21
1502 self.assertEqual(a.setitem, (12, 21))
1503 del a[12]
1504 self.assertEqual(a.delitem, 12)
1505
1506 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1507 a[0:10] = "foo"
1508 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1509 del a[0:10]
1510 self.assertEqual(a.delitem, (slice(0, 10)))
1511
1512 def test_methods(self):
1513 # Testing methods...
1514 class C(object):
1515 def __init__(self, x):
1516 self.x = x
1517 def foo(self):
1518 return self.x
1519 c1 = C(1)
1520 self.assertEqual(c1.foo(), 1)
1521 class D(C):
1522 boo = C.foo
1523 goo = c1.foo
1524 d2 = D(2)
1525 self.assertEqual(d2.foo(), 2)
1526 self.assertEqual(d2.boo(), 2)
1527 self.assertEqual(d2.goo(), 1)
1528 class E(object):
1529 foo = C.foo
1530 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001531 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001532
Benjamin Peterson224205f2009-05-08 03:25:19 +00001533 def test_special_method_lookup(self):
1534 # The lookup of special methods bypasses __getattr__ and
1535 # __getattribute__, but they still can be descriptors.
1536
1537 def run_context(manager):
1538 with manager:
1539 pass
1540 def iden(self):
1541 return self
1542 def hello(self):
1543 return b"hello"
Benjamin Peterson053c61f2009-05-09 17:21:13 +00001544 def empty_seq(self):
1545 return []
Benjamin Petersona5758c02009-05-09 18:15:04 +00001546 def zero(self):
1547 return 0
Benjamin Petersonaea44282010-01-04 01:10:28 +00001548 def complex_num(self):
1549 return 1j
Benjamin Petersona5758c02009-05-09 18:15:04 +00001550 def stop(self):
1551 raise StopIteration
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001552 def return_true(self, thing=None):
1553 return True
1554 def do_isinstance(obj):
1555 return isinstance(int, obj)
1556 def do_issubclass(obj):
1557 return issubclass(int, obj)
Benjamin Petersona7205592009-05-27 03:08:59 +00001558 def do_dict_missing(checker):
1559 class DictSub(checker.__class__, dict):
1560 pass
1561 self.assertEqual(DictSub()["hi"], 4)
1562 def some_number(self_, key):
1563 self.assertEqual(key, "hi")
1564 return 4
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001565 def swallow(*args): pass
Benjamin Petersonda2cf042010-06-05 00:45:37 +00001566 def format_impl(self, spec):
1567 return "hello"
Benjamin Peterson224205f2009-05-08 03:25:19 +00001568
1569 # It would be nice to have every special method tested here, but I'm
1570 # only listing the ones I can remember outside of typeobject.c, since it
1571 # does it right.
1572 specials = [
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001573 ("__bytes__", bytes, hello, set(), {}),
1574 ("__reversed__", reversed, empty_seq, set(), {}),
1575 ("__length_hint__", list, zero, set(),
Benjamin Petersona5758c02009-05-09 18:15:04 +00001576 {"__iter__" : iden, "__next__" : stop}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001577 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1578 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Petersona7205592009-05-27 03:08:59 +00001579 ("__missing__", do_dict_missing, some_number,
1580 set(("__class__",)), {}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001581 ("__subclasscheck__", do_issubclass, return_true,
1582 set(("__bases__",)), {}),
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001583 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1584 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Petersonaea44282010-01-04 01:10:28 +00001585 ("__complex__", complex, complex_num, set(), {}),
Benjamin Petersonda2cf042010-06-05 00:45:37 +00001586 ("__format__", format, format_impl, set(), {}),
Benjamin Peterson8bb9cde2010-07-01 15:16:55 +00001587 ("__floor__", math.floor, zero, set(), {}),
1588 ("__trunc__", math.trunc, zero, set(), {}),
Benjamin Petersonf751bc92010-07-02 13:46:42 +00001589 ("__ceil__", math.ceil, zero, set(), {}),
Benjamin Peterson224205f2009-05-08 03:25:19 +00001590 ]
1591
1592 class Checker(object):
1593 def __getattr__(self, attr, test=self):
1594 test.fail("__getattr__ called with {0}".format(attr))
1595 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001596 if attr not in ok:
1597 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Petersona7205592009-05-27 03:08:59 +00001598 return object.__getattribute__(self, attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001599 class SpecialDescr(object):
1600 def __init__(self, impl):
1601 self.impl = impl
1602 def __get__(self, obj, owner):
1603 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001604 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001605 class MyException(Exception):
1606 pass
1607 class ErrDescr(object):
1608 def __get__(self, obj, owner):
1609 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001610
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001611 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001612 class X(Checker):
1613 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001614 for attr, obj in env.items():
1615 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001616 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001617 runner(X())
1618
1619 record = []
1620 class X(Checker):
1621 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001622 for attr, obj in env.items():
1623 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001624 setattr(X, name, SpecialDescr(meth_impl))
1625 runner(X())
1626 self.assertEqual(record, [1], name)
1627
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001628 class X(Checker):
1629 pass
1630 for attr, obj in env.items():
1631 setattr(X, attr, obj)
1632 setattr(X, name, ErrDescr())
1633 try:
1634 runner(X())
1635 except MyException:
1636 pass
1637 else:
1638 self.fail("{0!r} didn't raise".format(name))
1639
Georg Brandl479a7e72008-02-05 18:13:15 +00001640 def test_specials(self):
1641 # Testing special operators...
1642 # Test operators like __hash__ for which a built-in default exists
1643
1644 # Test the default behavior for static classes
1645 class C(object):
1646 def __getitem__(self, i):
1647 if 0 <= i < 10: return i
1648 raise IndexError
1649 c1 = C()
1650 c2 = C()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001651 self.assertTrue(not not c1) # What?
Georg Brandl479a7e72008-02-05 18:13:15 +00001652 self.assertNotEqual(id(c1), id(c2))
1653 hash(c1)
1654 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001655 self.assertEqual(c1, c1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001656 self.assertTrue(c1 != c2)
1657 self.assertTrue(not c1 != c1)
1658 self.assertTrue(not c1 == c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001659 # Note that the module name appears in str/repr, and that varies
1660 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001661 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001662 self.assertEqual(str(c1), repr(c1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001663 self.assertNotIn(-1, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001664 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001665 self.assertIn(i, c1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001666 self.assertNotIn(10, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001667 # Test the default behavior for dynamic classes
1668 class D(object):
1669 def __getitem__(self, i):
1670 if 0 <= i < 10: return i
1671 raise IndexError
1672 d1 = D()
1673 d2 = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001674 self.assertTrue(not not d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001675 self.assertNotEqual(id(d1), id(d2))
1676 hash(d1)
1677 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001678 self.assertEqual(d1, d1)
1679 self.assertNotEqual(d1, d2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001680 self.assertTrue(not d1 != d1)
1681 self.assertTrue(not d1 == d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001682 # Note that the module name appears in str/repr, and that varies
1683 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001684 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001685 self.assertEqual(str(d1), repr(d1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001686 self.assertNotIn(-1, d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001687 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001688 self.assertIn(i, d1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001689 self.assertNotIn(10, d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001690 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001691 class Proxy(object):
1692 def __init__(self, x):
1693 self.x = x
1694 def __bool__(self):
1695 return not not self.x
1696 def __hash__(self):
1697 return hash(self.x)
1698 def __eq__(self, other):
1699 return self.x == other
1700 def __ne__(self, other):
1701 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001702 def __ge__(self, other):
1703 return self.x >= other
1704 def __gt__(self, other):
1705 return self.x > other
1706 def __le__(self, other):
1707 return self.x <= other
1708 def __lt__(self, other):
1709 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001710 def __str__(self):
1711 return "Proxy:%s" % self.x
1712 def __repr__(self):
1713 return "Proxy(%r)" % self.x
1714 def __contains__(self, value):
1715 return value in self.x
1716 p0 = Proxy(0)
1717 p1 = Proxy(1)
1718 p_1 = Proxy(-1)
1719 self.assertFalse(p0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001720 self.assertTrue(not not p1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001721 self.assertEqual(hash(p0), hash(0))
1722 self.assertEqual(p0, p0)
1723 self.assertNotEqual(p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001724 self.assertTrue(not p0 != p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001725 self.assertEqual(not p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001726 self.assertTrue(p0 < p1)
1727 self.assertTrue(p0 <= p1)
1728 self.assertTrue(p1 > p0)
1729 self.assertTrue(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001730 self.assertEqual(str(p0), "Proxy:0")
1731 self.assertEqual(repr(p0), "Proxy(0)")
1732 p10 = Proxy(range(10))
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001733 self.assertNotIn(-1, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001734 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001735 self.assertIn(i, p10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001736 self.assertNotIn(10, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001737
Georg Brandl479a7e72008-02-05 18:13:15 +00001738 def test_weakrefs(self):
1739 # Testing weak references...
1740 import weakref
1741 class C(object):
1742 pass
1743 c = C()
1744 r = weakref.ref(c)
1745 self.assertEqual(r(), c)
1746 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001747 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001748 self.assertEqual(r(), None)
1749 del r
1750 class NoWeak(object):
1751 __slots__ = ['foo']
1752 no = NoWeak()
1753 try:
1754 weakref.ref(no)
1755 except TypeError as msg:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001756 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001757 else:
1758 self.fail("weakref.ref(no) should be illegal")
1759 class Weak(object):
1760 __slots__ = ['foo', '__weakref__']
1761 yes = Weak()
1762 r = weakref.ref(yes)
1763 self.assertEqual(r(), yes)
1764 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001765 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001766 self.assertEqual(r(), None)
1767 del r
1768
1769 def test_properties(self):
1770 # Testing property...
1771 class C(object):
1772 def getx(self):
1773 return self.__x
1774 def setx(self, value):
1775 self.__x = value
1776 def delx(self):
1777 del self.__x
1778 x = property(getx, setx, delx, doc="I'm the x property.")
1779 a = C()
1780 self.assertFalse(hasattr(a, "x"))
1781 a.x = 42
1782 self.assertEqual(a._C__x, 42)
1783 self.assertEqual(a.x, 42)
1784 del a.x
1785 self.assertFalse(hasattr(a, "x"))
1786 self.assertFalse(hasattr(a, "_C__x"))
1787 C.x.__set__(a, 100)
1788 self.assertEqual(C.x.__get__(a), 100)
1789 C.x.__delete__(a)
1790 self.assertFalse(hasattr(a, "x"))
1791
1792 raw = C.__dict__['x']
Ezio Melottie9615932010-01-24 19:26:24 +00001793 self.assertIsInstance(raw, property)
Georg Brandl479a7e72008-02-05 18:13:15 +00001794
1795 attrs = dir(raw)
Benjamin Peterson577473f2010-01-19 00:09:57 +00001796 self.assertIn("__doc__", attrs)
1797 self.assertIn("fget", attrs)
1798 self.assertIn("fset", attrs)
1799 self.assertIn("fdel", attrs)
Georg Brandl479a7e72008-02-05 18:13:15 +00001800
1801 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001802 self.assertTrue(raw.fget is C.__dict__['getx'])
1803 self.assertTrue(raw.fset is C.__dict__['setx'])
1804 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl479a7e72008-02-05 18:13:15 +00001805
1806 for attr in "__doc__", "fget", "fset", "fdel":
1807 try:
1808 setattr(raw, attr, 42)
1809 except AttributeError as msg:
1810 if str(msg).find('readonly') < 0:
1811 self.fail("when setting readonly attr %r on a property, "
1812 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1813 else:
1814 self.fail("expected AttributeError from trying to set readonly %r "
1815 "attr on a property" % attr)
1816
1817 class D(object):
1818 __getitem__ = property(lambda s: 1/0)
1819
1820 d = D()
1821 try:
1822 for i in d:
1823 str(i)
1824 except ZeroDivisionError:
1825 pass
1826 else:
1827 self.fail("expected ZeroDivisionError from bad property")
1828
R. David Murray378c0cf2010-02-24 01:46:21 +00001829 @unittest.skipIf(sys.flags.optimize >= 2,
1830 "Docstrings are omitted with -O2 and above")
1831 def test_properties_doc_attrib(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001832 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
R. David Murray378c0cf2010-02-24 01:46:21 +00001844 def test_testcapi_no_segfault(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001845 # this segfaulted in 2.5b2
1846 try:
1847 import _testcapi
1848 except ImportError:
1849 pass
1850 else:
1851 class X(object):
1852 p = property(_testcapi.test_with_docstring)
1853
1854 def test_properties_plus(self):
1855 class C(object):
1856 foo = property(doc="hello")
1857 @foo.getter
1858 def foo(self):
1859 return self._foo
1860 @foo.setter
1861 def foo(self, value):
1862 self._foo = abs(value)
1863 @foo.deleter
1864 def foo(self):
1865 del self._foo
1866 c = C()
1867 self.assertEqual(C.foo.__doc__, "hello")
1868 self.assertFalse(hasattr(c, "foo"))
1869 c.foo = -42
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001870 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl479a7e72008-02-05 18:13:15 +00001871 self.assertEqual(c._foo, 42)
1872 self.assertEqual(c.foo, 42)
1873 del c.foo
1874 self.assertFalse(hasattr(c, '_foo'))
1875 self.assertFalse(hasattr(c, "foo"))
1876
1877 class D(C):
1878 @C.foo.deleter
1879 def foo(self):
1880 try:
1881 del self._foo
1882 except AttributeError:
1883 pass
1884 d = D()
1885 d.foo = 24
1886 self.assertEqual(d.foo, 24)
1887 del d.foo
1888 del d.foo
1889
1890 class E(object):
1891 @property
1892 def foo(self):
1893 return self._foo
1894 @foo.setter
1895 def foo(self, value):
1896 raise RuntimeError
1897 @foo.setter
1898 def foo(self, value):
1899 self._foo = abs(value)
1900 @foo.deleter
1901 def foo(self, value=None):
1902 del self._foo
1903
1904 e = E()
1905 e.foo = -42
1906 self.assertEqual(e.foo, 42)
1907 del e.foo
1908
1909 class F(E):
1910 @E.foo.deleter
1911 def foo(self):
1912 del self._foo
1913 @foo.setter
1914 def foo(self, value):
1915 self._foo = max(0, value)
1916 f = F()
1917 f.foo = -10
1918 self.assertEqual(f.foo, 0)
1919 del f.foo
1920
1921 def test_dict_constructors(self):
1922 # Testing dict constructor ...
1923 d = dict()
1924 self.assertEqual(d, {})
1925 d = dict({})
1926 self.assertEqual(d, {})
1927 d = dict({1: 2, 'a': 'b'})
1928 self.assertEqual(d, {1: 2, 'a': 'b'})
1929 self.assertEqual(d, dict(list(d.items())))
1930 self.assertEqual(d, dict(iter(d.items())))
1931 d = dict({'one':1, 'two':2})
1932 self.assertEqual(d, dict(one=1, two=2))
1933 self.assertEqual(d, dict(**d))
1934 self.assertEqual(d, dict({"one": 1}, two=2))
1935 self.assertEqual(d, dict([("two", 2)], one=1))
1936 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1937 self.assertEqual(d, dict(**d))
1938
1939 for badarg in 0, 0, 0j, "0", [0], (0,):
1940 try:
1941 dict(badarg)
1942 except TypeError:
1943 pass
1944 except ValueError:
1945 if badarg == "0":
1946 # It's a sequence, and its elements are also sequences (gotta
1947 # love strings <wink>), but they aren't of length 2, so this
1948 # one seemed better as a ValueError than a TypeError.
1949 pass
1950 else:
1951 self.fail("no TypeError from dict(%r)" % badarg)
1952 else:
1953 self.fail("no TypeError from dict(%r)" % badarg)
1954
1955 try:
1956 dict({}, {})
1957 except TypeError:
1958 pass
1959 else:
1960 self.fail("no TypeError from dict({}, {})")
1961
1962 class Mapping:
1963 # Lacks a .keys() method; will be added later.
1964 dict = {1:2, 3:4, 'a':1j}
1965
1966 try:
1967 dict(Mapping())
1968 except TypeError:
1969 pass
1970 else:
1971 self.fail("no TypeError from dict(incomplete mapping)")
1972
1973 Mapping.keys = lambda self: list(self.dict.keys())
1974 Mapping.__getitem__ = lambda self, i: self.dict[i]
1975 d = dict(Mapping())
1976 self.assertEqual(d, Mapping.dict)
1977
1978 # Init from sequence of iterable objects, each producing a 2-sequence.
1979 class AddressBookEntry:
1980 def __init__(self, first, last):
1981 self.first = first
1982 self.last = last
1983 def __iter__(self):
1984 return iter([self.first, self.last])
1985
1986 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1987 AddressBookEntry('Barry', 'Peters'),
1988 AddressBookEntry('Tim', 'Peters'),
1989 AddressBookEntry('Barry', 'Warsaw')])
1990 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1991
1992 d = dict(zip(range(4), range(1, 5)))
1993 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1994
1995 # Bad sequence lengths.
1996 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1997 try:
1998 dict(bad)
1999 except ValueError:
2000 pass
2001 else:
2002 self.fail("no ValueError from dict(%r)" % bad)
2003
2004 def test_dir(self):
2005 # Testing dir() ...
2006 junk = 12
2007 self.assertEqual(dir(), ['junk', 'self'])
2008 del junk
2009
2010 # Just make sure these don't blow up!
2011 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
2012 dir(arg)
2013
2014 # Test dir on new-style classes. Since these have object as a
2015 # base class, a lot more gets sucked in.
2016 def interesting(strings):
2017 return [s for s in strings if not s.startswith('_')]
2018
2019 class C(object):
2020 Cdata = 1
2021 def Cmethod(self): pass
2022
2023 cstuff = ['Cdata', 'Cmethod']
2024 self.assertEqual(interesting(dir(C)), cstuff)
2025
2026 c = C()
2027 self.assertEqual(interesting(dir(c)), cstuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002028 ## self.assertIn('__self__', dir(C.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002029
2030 c.cdata = 2
2031 c.cmethod = lambda self: 0
2032 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002033 ## self.assertIn('__self__', dir(c.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002034
2035 class A(C):
2036 Adata = 1
2037 def Amethod(self): pass
2038
2039 astuff = ['Adata', 'Amethod'] + cstuff
2040 self.assertEqual(interesting(dir(A)), astuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002041 ## self.assertIn('__self__', dir(A.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002042 a = A()
2043 self.assertEqual(interesting(dir(a)), astuff)
2044 a.adata = 42
2045 a.amethod = lambda self: 3
2046 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002047 ## self.assertIn('__self__', dir(a.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002048
2049 # Try a module subclass.
Georg Brandl479a7e72008-02-05 18:13:15 +00002050 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)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002230 self.assertTrue(int(a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002231 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +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):
Mark Dickinson5c2db372009-12-05 20:28:34 +00002241 return oct(self)
Georg Brandl479a7e72008-02-05 18:13:15 +00002242 def __add__(self, other):
2243 return self.__class__(super(octlong, self).__add__(other))
2244 __radd__ = __add__
2245 self.assertEqual(str(octlong(3) + 5), "0o10")
2246 # (Note that overriding __radd__ here only seems to work
2247 # because the example uses a short int left argument.)
2248 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2249 a = octlong(12345)
2250 self.assertEqual(a, 12345)
2251 self.assertEqual(int(a), 12345)
2252 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002253 self.assertTrue(int(a).__class__ is int)
2254 self.assertTrue((+a).__class__ is int)
2255 self.assertTrue((-a).__class__ is int)
2256 self.assertTrue((-octlong(0)).__class__ is int)
2257 self.assertTrue((a >> 0).__class__ is int)
2258 self.assertTrue((a << 0).__class__ is int)
2259 self.assertTrue((a - 0).__class__ is int)
2260 self.assertTrue((a * 1).__class__ is int)
2261 self.assertTrue((a ** 1).__class__ is int)
2262 self.assertTrue((a // 1).__class__ is int)
2263 self.assertTrue((1 * a).__class__ is int)
2264 self.assertTrue((a | 0).__class__ is int)
2265 self.assertTrue((a ^ 0).__class__ is int)
2266 self.assertTrue((a & -1).__class__ is int)
2267 self.assertTrue((octlong(0) << 12).__class__ is int)
2268 self.assertTrue((octlong(0) >> 12).__class__ is int)
2269 self.assertTrue(abs(octlong(0)).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002270
2271 # Because octlong overrides __add__, we can't check the absence of +0
2272 # optimizations using octlong.
2273 class longclone(int):
2274 pass
2275 a = longclone(1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002276 self.assertTrue((a + 0).__class__ is int)
2277 self.assertTrue((0 + a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002278
2279 # Check that negative clones don't segfault
2280 a = longclone(-1)
2281 self.assertEqual(a.__dict__, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002282 self.assertEqual(int(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl479a7e72008-02-05 18:13:15 +00002283
2284 class precfloat(float):
2285 __slots__ = ['prec']
2286 def __init__(self, value=0.0, prec=12):
2287 self.prec = int(prec)
2288 def __repr__(self):
2289 return "%.*g" % (self.prec, self)
2290 self.assertEqual(repr(precfloat(1.1)), "1.1")
2291 a = precfloat(12345)
2292 self.assertEqual(a, 12345.0)
2293 self.assertEqual(float(a), 12345.0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002294 self.assertTrue(float(a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002295 self.assertEqual(hash(a), hash(12345.0))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002296 self.assertTrue((+a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002297
2298 class madcomplex(complex):
2299 def __repr__(self):
2300 return "%.17gj%+.17g" % (self.imag, self.real)
2301 a = madcomplex(-3, 4)
2302 self.assertEqual(repr(a), "4j-3")
2303 base = complex(-3, 4)
2304 self.assertEqual(base.__class__, complex)
2305 self.assertEqual(a, base)
2306 self.assertEqual(complex(a), base)
2307 self.assertEqual(complex(a).__class__, complex)
2308 a = madcomplex(a) # just trying another form of the constructor
2309 self.assertEqual(repr(a), "4j-3")
2310 self.assertEqual(a, base)
2311 self.assertEqual(complex(a), base)
2312 self.assertEqual(complex(a).__class__, complex)
2313 self.assertEqual(hash(a), hash(base))
2314 self.assertEqual((+a).__class__, complex)
2315 self.assertEqual((a + 0).__class__, complex)
2316 self.assertEqual(a + 0, base)
2317 self.assertEqual((a - 0).__class__, complex)
2318 self.assertEqual(a - 0, base)
2319 self.assertEqual((a * 1).__class__, complex)
2320 self.assertEqual(a * 1, base)
2321 self.assertEqual((a / 1).__class__, complex)
2322 self.assertEqual(a / 1, base)
2323
2324 class madtuple(tuple):
2325 _rev = None
2326 def rev(self):
2327 if self._rev is not None:
2328 return self._rev
2329 L = list(self)
2330 L.reverse()
2331 self._rev = self.__class__(L)
2332 return self._rev
2333 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2334 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2335 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2336 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2337 for i in range(512):
2338 t = madtuple(range(i))
2339 u = t.rev()
2340 v = u.rev()
2341 self.assertEqual(v, t)
2342 a = madtuple((1,2,3,4,5))
2343 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002344 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002345 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002346 self.assertTrue(a[:].__class__ is tuple)
2347 self.assertTrue((a * 1).__class__ is tuple)
2348 self.assertTrue((a * 0).__class__ is tuple)
2349 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002350 a = madtuple(())
2351 self.assertEqual(tuple(a), ())
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002352 self.assertTrue(tuple(a).__class__ is tuple)
2353 self.assertTrue((a + a).__class__ is tuple)
2354 self.assertTrue((a * 0).__class__ is tuple)
2355 self.assertTrue((a * 1).__class__ is tuple)
2356 self.assertTrue((a * 2).__class__ is tuple)
2357 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002358
2359 class madstring(str):
2360 _rev = None
2361 def rev(self):
2362 if self._rev is not None:
2363 return self._rev
2364 L = list(self)
2365 L.reverse()
2366 self._rev = self.__class__("".join(L))
2367 return self._rev
2368 s = madstring("abcdefghijklmnopqrstuvwxyz")
2369 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2370 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2371 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2372 for i in range(256):
2373 s = madstring("".join(map(chr, range(i))))
2374 t = s.rev()
2375 u = t.rev()
2376 self.assertEqual(u, s)
2377 s = madstring("12345")
2378 self.assertEqual(str(s), "12345")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002379 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002380
2381 base = "\x00" * 5
2382 s = madstring(base)
2383 self.assertEqual(s, base)
2384 self.assertEqual(str(s), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002385 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002386 self.assertEqual(hash(s), hash(base))
2387 self.assertEqual({s: 1}[base], 1)
2388 self.assertEqual({base: 1}[s], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002389 self.assertTrue((s + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002390 self.assertEqual(s + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002391 self.assertTrue(("" + s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002392 self.assertEqual("" + s, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002393 self.assertTrue((s * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002394 self.assertEqual(s * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002395 self.assertTrue((s * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002396 self.assertEqual(s * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002397 self.assertTrue((s * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002398 self.assertEqual(s * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002399 self.assertTrue(s[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002400 self.assertEqual(s[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002401 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002402 self.assertEqual(s[0:0], "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002403 self.assertTrue(s.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002404 self.assertEqual(s.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002405 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002406 self.assertEqual(s.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002407 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002408 self.assertEqual(s.rstrip(), base)
2409 identitytab = {}
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002410 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002411 self.assertEqual(s.translate(identitytab), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002412 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002413 self.assertEqual(s.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002414 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002415 self.assertEqual(s.ljust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002416 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002417 self.assertEqual(s.rjust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002418 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002419 self.assertEqual(s.center(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002420 self.assertTrue(s.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002421 self.assertEqual(s.lower(), base)
2422
2423 class madunicode(str):
2424 _rev = None
2425 def rev(self):
2426 if self._rev is not None:
2427 return self._rev
2428 L = list(self)
2429 L.reverse()
2430 self._rev = self.__class__("".join(L))
2431 return self._rev
2432 u = madunicode("ABCDEF")
2433 self.assertEqual(u, "ABCDEF")
2434 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2435 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2436 base = "12345"
2437 u = madunicode(base)
2438 self.assertEqual(str(u), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002439 self.assertTrue(str(u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002440 self.assertEqual(hash(u), hash(base))
2441 self.assertEqual({u: 1}[base], 1)
2442 self.assertEqual({base: 1}[u], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002443 self.assertTrue(u.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002444 self.assertEqual(u.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002445 self.assertTrue(u.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002446 self.assertEqual(u.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002447 self.assertTrue(u.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002448 self.assertEqual(u.rstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002449 self.assertTrue(u.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002450 self.assertEqual(u.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002451 self.assertTrue(u.replace("xy", "xy").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002452 self.assertEqual(u.replace("xy", "xy"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002453 self.assertTrue(u.center(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002454 self.assertEqual(u.center(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002455 self.assertTrue(u.ljust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002456 self.assertEqual(u.ljust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002457 self.assertTrue(u.rjust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002458 self.assertEqual(u.rjust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002459 self.assertTrue(u.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002460 self.assertEqual(u.lower(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002461 self.assertTrue(u.upper().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002462 self.assertEqual(u.upper(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002463 self.assertTrue(u.capitalize().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002464 self.assertEqual(u.capitalize(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002465 self.assertTrue(u.title().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002466 self.assertEqual(u.title(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002467 self.assertTrue((u + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002468 self.assertEqual(u + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002469 self.assertTrue(("" + u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002470 self.assertEqual("" + u, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002471 self.assertTrue((u * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002472 self.assertEqual(u * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002473 self.assertTrue((u * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002474 self.assertEqual(u * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002475 self.assertTrue((u * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002476 self.assertEqual(u * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002477 self.assertTrue(u[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002478 self.assertEqual(u[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002479 self.assertTrue(u[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002480 self.assertEqual(u[0:0], "")
2481
2482 class sublist(list):
2483 pass
2484 a = sublist(range(5))
2485 self.assertEqual(a, list(range(5)))
2486 a.append("hello")
2487 self.assertEqual(a, list(range(5)) + ["hello"])
2488 a[5] = 5
2489 self.assertEqual(a, list(range(6)))
2490 a.extend(range(6, 20))
2491 self.assertEqual(a, list(range(20)))
2492 a[-5:] = []
2493 self.assertEqual(a, list(range(15)))
2494 del a[10:15]
2495 self.assertEqual(len(a), 10)
2496 self.assertEqual(a, list(range(10)))
2497 self.assertEqual(list(a), list(range(10)))
2498 self.assertEqual(a[0], 0)
2499 self.assertEqual(a[9], 9)
2500 self.assertEqual(a[-10], 0)
2501 self.assertEqual(a[-1], 9)
2502 self.assertEqual(a[:5], list(range(5)))
2503
2504 ## class CountedInput(file):
2505 ## """Counts lines read by self.readline().
2506 ##
2507 ## self.lineno is the 0-based ordinal of the last line read, up to
2508 ## a maximum of one greater than the number of lines in the file.
2509 ##
2510 ## self.ateof is true if and only if the final "" line has been read,
2511 ## at which point self.lineno stops incrementing, and further calls
2512 ## to readline() continue to return "".
2513 ## """
2514 ##
2515 ## lineno = 0
2516 ## ateof = 0
2517 ## def readline(self):
2518 ## if self.ateof:
2519 ## return ""
2520 ## s = file.readline(self)
2521 ## # Next line works too.
2522 ## # s = super(CountedInput, self).readline()
2523 ## self.lineno += 1
2524 ## if s == "":
2525 ## self.ateof = 1
2526 ## return s
2527 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002528 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002529 ## lines = ['a\n', 'b\n', 'c\n']
2530 ## try:
2531 ## f.writelines(lines)
2532 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002533 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002534 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2535 ## got = f.readline()
2536 ## self.assertEqual(expected, got)
2537 ## self.assertEqual(f.lineno, i)
2538 ## self.assertEqual(f.ateof, (i > len(lines)))
2539 ## f.close()
2540 ## finally:
2541 ## try:
2542 ## f.close()
2543 ## except:
2544 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002545 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002546
2547 def test_keywords(self):
2548 # Testing keyword args to basic type constructors ...
2549 self.assertEqual(int(x=1), 1)
2550 self.assertEqual(float(x=2), 2.0)
2551 self.assertEqual(int(x=3), 3)
2552 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2553 self.assertEqual(str(object=500), '500')
2554 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2555 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2556 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2557 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2558
2559 for constructor in (int, float, int, complex, str, str,
2560 tuple, list):
2561 try:
2562 constructor(bogus_keyword_arg=1)
2563 except TypeError:
2564 pass
2565 else:
2566 self.fail("expected TypeError from bogus keyword argument to %r"
2567 % constructor)
2568
2569 def test_str_subclass_as_dict_key(self):
2570 # Testing a str subclass used as dict key ..
2571
2572 class cistr(str):
2573 """Sublcass of str that computes __eq__ case-insensitively.
2574
2575 Also computes a hash code of the string in canonical form.
2576 """
2577
2578 def __init__(self, value):
2579 self.canonical = value.lower()
2580 self.hashcode = hash(self.canonical)
2581
2582 def __eq__(self, other):
2583 if not isinstance(other, cistr):
2584 other = cistr(other)
2585 return self.canonical == other.canonical
2586
2587 def __hash__(self):
2588 return self.hashcode
2589
2590 self.assertEqual(cistr('ABC'), 'abc')
2591 self.assertEqual('aBc', cistr('ABC'))
2592 self.assertEqual(str(cistr('ABC')), 'ABC')
2593
2594 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2595 self.assertEqual(d[cistr('one')], 1)
2596 self.assertEqual(d[cistr('tWo')], 2)
2597 self.assertEqual(d[cistr('THrEE')], 3)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002598 self.assertIn(cistr('ONe'), d)
Georg Brandl479a7e72008-02-05 18:13:15 +00002599 self.assertEqual(d.get(cistr('thrEE')), 3)
2600
2601 def test_classic_comparisons(self):
2602 # Testing classic comparisons...
2603 class classic:
2604 pass
2605
2606 for base in (classic, int, object):
2607 class C(base):
2608 def __init__(self, value):
2609 self.value = int(value)
2610 def __eq__(self, other):
2611 if isinstance(other, C):
2612 return self.value == other.value
2613 if isinstance(other, int) or isinstance(other, int):
2614 return self.value == other
2615 return NotImplemented
2616 def __ne__(self, other):
2617 if isinstance(other, C):
2618 return self.value != other.value
2619 if isinstance(other, int) or isinstance(other, int):
2620 return self.value != other
2621 return NotImplemented
2622 def __lt__(self, other):
2623 if isinstance(other, C):
2624 return self.value < other.value
2625 if isinstance(other, int) or isinstance(other, int):
2626 return self.value < other
2627 return NotImplemented
2628 def __le__(self, other):
2629 if isinstance(other, C):
2630 return self.value <= other.value
2631 if isinstance(other, int) or isinstance(other, int):
2632 return self.value <= other
2633 return NotImplemented
2634 def __gt__(self, other):
2635 if isinstance(other, C):
2636 return self.value > other.value
2637 if isinstance(other, int) or isinstance(other, int):
2638 return self.value > other
2639 return NotImplemented
2640 def __ge__(self, other):
2641 if isinstance(other, C):
2642 return self.value >= other.value
2643 if isinstance(other, int) or isinstance(other, int):
2644 return self.value >= other
2645 return NotImplemented
2646
2647 c1 = C(1)
2648 c2 = C(2)
2649 c3 = C(3)
2650 self.assertEqual(c1, 1)
2651 c = {1: c1, 2: c2, 3: c3}
2652 for x in 1, 2, 3:
2653 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002654 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002655 self.assertTrue(eval("c[x] %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002656 eval("x %s y" % op),
2657 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002658 self.assertTrue(eval("c[x] %s y" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002659 eval("x %s y" % op),
2660 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002661 self.assertTrue(eval("x %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002662 eval("x %s y" % op),
2663 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002664
2665 def test_rich_comparisons(self):
2666 # Testing rich comparisons...
2667 class Z(complex):
2668 pass
2669 z = Z(1)
2670 self.assertEqual(z, 1+0j)
2671 self.assertEqual(1+0j, z)
2672 class ZZ(complex):
2673 def __eq__(self, other):
2674 try:
2675 return abs(self - other) <= 1e-6
2676 except:
2677 return NotImplemented
2678 zz = ZZ(1.0000003)
2679 self.assertEqual(zz, 1+0j)
2680 self.assertEqual(1+0j, zz)
2681
2682 class classic:
2683 pass
2684 for base in (classic, int, object, list):
2685 class C(base):
2686 def __init__(self, value):
2687 self.value = int(value)
2688 def __cmp__(self_, other):
2689 self.fail("shouldn't call __cmp__")
2690 def __eq__(self, other):
2691 if isinstance(other, C):
2692 return self.value == other.value
2693 if isinstance(other, int) or isinstance(other, int):
2694 return self.value == other
2695 return NotImplemented
2696 def __ne__(self, other):
2697 if isinstance(other, C):
2698 return self.value != other.value
2699 if isinstance(other, int) or isinstance(other, int):
2700 return self.value != other
2701 return NotImplemented
2702 def __lt__(self, other):
2703 if isinstance(other, C):
2704 return self.value < other.value
2705 if isinstance(other, int) or isinstance(other, int):
2706 return self.value < other
2707 return NotImplemented
2708 def __le__(self, other):
2709 if isinstance(other, C):
2710 return self.value <= other.value
2711 if isinstance(other, int) or isinstance(other, int):
2712 return self.value <= other
2713 return NotImplemented
2714 def __gt__(self, other):
2715 if isinstance(other, C):
2716 return self.value > other.value
2717 if isinstance(other, int) or isinstance(other, int):
2718 return self.value > other
2719 return NotImplemented
2720 def __ge__(self, other):
2721 if isinstance(other, C):
2722 return self.value >= other.value
2723 if isinstance(other, int) or isinstance(other, int):
2724 return self.value >= other
2725 return NotImplemented
2726 c1 = C(1)
2727 c2 = C(2)
2728 c3 = C(3)
2729 self.assertEqual(c1, 1)
2730 c = {1: c1, 2: c2, 3: c3}
2731 for x in 1, 2, 3:
2732 for y in 1, 2, 3:
2733 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002734 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002735 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002736 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002737 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002738 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002739 "x=%d, y=%d" % (x, y))
2740
2741 def test_descrdoc(self):
2742 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002743 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002744 def check(descr, what):
2745 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002746 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002747 check(complex.real, "the real part of a complex number") # member descriptor
2748
2749 def test_doc_descriptor(self):
2750 # Testing __doc__ descriptor...
2751 # SF bug 542984
2752 class DocDescr(object):
2753 def __get__(self, object, otype):
2754 if object:
2755 object = object.__class__.__name__ + ' instance'
2756 if otype:
2757 otype = otype.__name__
2758 return 'object=%s; type=%s' % (object, otype)
2759 class OldClass:
2760 __doc__ = DocDescr()
2761 class NewClass(object):
2762 __doc__ = DocDescr()
2763 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2764 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2765 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2766 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2767
2768 def test_set_class(self):
2769 # Testing __class__ assignment...
2770 class C(object): pass
2771 class D(object): pass
2772 class E(object): pass
2773 class F(D, E): pass
2774 for cls in C, D, E, F:
2775 for cls2 in C, D, E, F:
2776 x = cls()
2777 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002778 self.assertTrue(x.__class__ is cls2)
Georg Brandl479a7e72008-02-05 18:13:15 +00002779 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002780 self.assertTrue(x.__class__ is cls)
Georg Brandl479a7e72008-02-05 18:13:15 +00002781 def cant(x, C):
2782 try:
2783 x.__class__ = C
2784 except TypeError:
2785 pass
2786 else:
2787 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2788 try:
2789 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002790 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002791 pass
2792 else:
2793 self.fail("shouldn't allow del %r.__class__" % x)
2794 cant(C(), list)
2795 cant(list(), C)
2796 cant(C(), 1)
2797 cant(C(), object)
2798 cant(object(), list)
2799 cant(list(), object)
2800 class Int(int): __slots__ = []
2801 cant(2, Int)
2802 cant(Int(), int)
2803 cant(True, int)
2804 cant(2, bool)
2805 o = object()
2806 cant(o, type(1))
2807 cant(o, type(None))
2808 del o
2809 class G(object):
2810 __slots__ = ["a", "b"]
2811 class H(object):
2812 __slots__ = ["b", "a"]
2813 class I(object):
2814 __slots__ = ["a", "b"]
2815 class J(object):
2816 __slots__ = ["c", "b"]
2817 class K(object):
2818 __slots__ = ["a", "b", "d"]
2819 class L(H):
2820 __slots__ = ["e"]
2821 class M(I):
2822 __slots__ = ["e"]
2823 class N(J):
2824 __slots__ = ["__weakref__"]
2825 class P(J):
2826 __slots__ = ["__dict__"]
2827 class Q(J):
2828 pass
2829 class R(J):
2830 __slots__ = ["__dict__", "__weakref__"]
2831
2832 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2833 x = cls()
2834 x.a = 1
2835 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002836 self.assertTrue(x.__class__ is cls2,
Georg Brandl479a7e72008-02-05 18:13:15 +00002837 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2838 self.assertEqual(x.a, 1)
2839 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002840 self.assertTrue(x.__class__ is cls,
Georg Brandl479a7e72008-02-05 18:13:15 +00002841 "assigning %r as __class__ for %r silently failed" % (cls, x))
2842 self.assertEqual(x.a, 1)
2843 for cls in G, J, K, L, M, N, P, R, list, Int:
2844 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2845 if cls is cls2:
2846 continue
2847 cant(cls(), cls2)
2848
Benjamin Peterson193152c2009-04-25 01:08:45 +00002849 # Issue5283: when __class__ changes in __del__, the wrong
2850 # type gets DECREF'd.
2851 class O(object):
2852 pass
2853 class A(object):
2854 def __del__(self):
2855 self.__class__ = O
2856 l = [A() for x in range(100)]
2857 del l
2858
Georg Brandl479a7e72008-02-05 18:13:15 +00002859 def test_set_dict(self):
2860 # Testing __dict__ assignment...
2861 class C(object): pass
2862 a = C()
2863 a.__dict__ = {'b': 1}
2864 self.assertEqual(a.b, 1)
2865 def cant(x, dict):
2866 try:
2867 x.__dict__ = dict
2868 except (AttributeError, TypeError):
2869 pass
2870 else:
2871 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2872 cant(a, None)
2873 cant(a, [])
2874 cant(a, 1)
2875 del a.__dict__ # Deleting __dict__ is allowed
2876
2877 class Base(object):
2878 pass
2879 def verify_dict_readonly(x):
2880 """
2881 x has to be an instance of a class inheriting from Base.
2882 """
2883 cant(x, {})
2884 try:
2885 del x.__dict__
2886 except (AttributeError, TypeError):
2887 pass
2888 else:
2889 self.fail("shouldn't allow del %r.__dict__" % x)
2890 dict_descr = Base.__dict__["__dict__"]
2891 try:
2892 dict_descr.__set__(x, {})
2893 except (AttributeError, TypeError):
2894 pass
2895 else:
2896 self.fail("dict_descr allowed access to %r's dict" % x)
2897
2898 # Classes don't allow __dict__ assignment and have readonly dicts
2899 class Meta1(type, Base):
2900 pass
2901 class Meta2(Base, type):
2902 pass
2903 class D(object, metaclass=Meta1):
2904 pass
2905 class E(object, metaclass=Meta2):
2906 pass
2907 for cls in C, D, E:
2908 verify_dict_readonly(cls)
2909 class_dict = cls.__dict__
2910 try:
2911 class_dict["spam"] = "eggs"
2912 except TypeError:
2913 pass
2914 else:
2915 self.fail("%r's __dict__ can be modified" % cls)
2916
2917 # Modules also disallow __dict__ assignment
2918 class Module1(types.ModuleType, Base):
2919 pass
2920 class Module2(Base, types.ModuleType):
2921 pass
2922 for ModuleType in Module1, Module2:
2923 mod = ModuleType("spam")
2924 verify_dict_readonly(mod)
2925 mod.__dict__["spam"] = "eggs"
2926
2927 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002928 # (at least not any more than regular exception's __dict__ can
2929 # be deleted; on CPython it is not the case, whereas on PyPy they
2930 # can, just like any other new-style instance's __dict__.)
2931 def can_delete_dict(e):
2932 try:
2933 del e.__dict__
2934 except (TypeError, AttributeError):
2935 return False
2936 else:
2937 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002938 class Exception1(Exception, Base):
2939 pass
2940 class Exception2(Base, Exception):
2941 pass
2942 for ExceptionType in Exception, Exception1, Exception2:
2943 e = ExceptionType()
2944 e.__dict__ = {"a": 1}
2945 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002946 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002947
2948 def test_pickles(self):
2949 # Testing pickling and copying new-style classes and objects...
2950 import pickle
2951
2952 def sorteditems(d):
2953 L = list(d.items())
2954 L.sort()
2955 return L
2956
2957 global C
2958 class C(object):
2959 def __init__(self, a, b):
2960 super(C, self).__init__()
2961 self.a = a
2962 self.b = b
2963 def __repr__(self):
2964 return "C(%r, %r)" % (self.a, self.b)
2965
2966 global C1
2967 class C1(list):
2968 def __new__(cls, a, b):
2969 return super(C1, cls).__new__(cls)
2970 def __getnewargs__(self):
2971 return (self.a, self.b)
2972 def __init__(self, a, b):
2973 self.a = a
2974 self.b = b
2975 def __repr__(self):
2976 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2977
2978 global C2
2979 class C2(int):
2980 def __new__(cls, a, b, val=0):
2981 return super(C2, cls).__new__(cls, val)
2982 def __getnewargs__(self):
2983 return (self.a, self.b, int(self))
2984 def __init__(self, a, b, val=0):
2985 self.a = a
2986 self.b = b
2987 def __repr__(self):
2988 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2989
2990 global C3
2991 class C3(object):
2992 def __init__(self, foo):
2993 self.foo = foo
2994 def __getstate__(self):
2995 return self.foo
2996 def __setstate__(self, foo):
2997 self.foo = foo
2998
2999 global C4classic, C4
3000 class C4classic: # classic
3001 pass
3002 class C4(C4classic, object): # mixed inheritance
3003 pass
3004
Guido van Rossum3926a632001-09-25 16:25:58 +00003005 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00003006 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00003007 s = pickle.dumps(cls, bin)
3008 cls2 = pickle.loads(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003009 self.assertTrue(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00003010
3011 a = C1(1, 2); a.append(42); a.append(24)
3012 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003013 s = pickle.dumps((a, b), bin)
3014 x, y = pickle.loads(s)
3015 self.assertEqual(x.__class__, a.__class__)
3016 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3017 self.assertEqual(y.__class__, b.__class__)
3018 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3019 self.assertEqual(repr(x), repr(a))
3020 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003021 # Test for __getstate__ and __setstate__ on new style class
3022 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003023 s = pickle.dumps(u, bin)
3024 v = pickle.loads(s)
3025 self.assertEqual(u.__class__, v.__class__)
3026 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003027 # Test for picklability of hybrid class
3028 u = C4()
3029 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003030 s = pickle.dumps(u, bin)
3031 v = pickle.loads(s)
3032 self.assertEqual(u.__class__, v.__class__)
3033 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003034
Georg Brandl479a7e72008-02-05 18:13:15 +00003035 # Testing copy.deepcopy()
3036 import copy
3037 for cls in C, C1, C2:
3038 cls2 = copy.deepcopy(cls)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003039 self.assertTrue(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003040
Georg Brandl479a7e72008-02-05 18:13:15 +00003041 a = C1(1, 2); a.append(42); a.append(24)
3042 b = C2("hello", "world", 42)
3043 x, y = copy.deepcopy((a, b))
3044 self.assertEqual(x.__class__, a.__class__)
3045 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3046 self.assertEqual(y.__class__, b.__class__)
3047 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3048 self.assertEqual(repr(x), repr(a))
3049 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003050
Georg Brandl479a7e72008-02-05 18:13:15 +00003051 def test_pickle_slots(self):
3052 # Testing pickling of classes with __slots__ ...
3053 import pickle
3054 # Pickling of classes with __slots__ but without __getstate__ should fail
3055 # (if using protocol 0 or 1)
3056 global B, C, D, E
3057 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003058 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003059 for base in [object, B]:
3060 class C(base):
3061 __slots__ = ['a']
3062 class D(C):
3063 pass
3064 try:
3065 pickle.dumps(C(), 0)
3066 except TypeError:
3067 pass
3068 else:
3069 self.fail("should fail: pickle C instance - %s" % base)
3070 try:
3071 pickle.dumps(C(), 0)
3072 except TypeError:
3073 pass
3074 else:
3075 self.fail("should fail: pickle D instance - %s" % base)
3076 # Give C a nice generic __getstate__ and __setstate__
3077 class C(base):
3078 __slots__ = ['a']
3079 def __getstate__(self):
3080 try:
3081 d = self.__dict__.copy()
3082 except AttributeError:
3083 d = {}
3084 for cls in self.__class__.__mro__:
3085 for sn in cls.__dict__.get('__slots__', ()):
3086 try:
3087 d[sn] = getattr(self, sn)
3088 except AttributeError:
3089 pass
3090 return d
3091 def __setstate__(self, d):
3092 for k, v in list(d.items()):
3093 setattr(self, k, v)
3094 class D(C):
3095 pass
3096 # Now it should work
3097 x = C()
3098 y = pickle.loads(pickle.dumps(x))
3099 self.assertEqual(hasattr(y, 'a'), 0)
3100 x.a = 42
3101 y = pickle.loads(pickle.dumps(x))
3102 self.assertEqual(y.a, 42)
3103 x = D()
3104 x.a = 42
3105 x.b = 100
3106 y = pickle.loads(pickle.dumps(x))
3107 self.assertEqual(y.a + y.b, 142)
3108 # A subclass that adds a slot should also work
3109 class E(C):
3110 __slots__ = ['b']
3111 x = E()
3112 x.a = 42
3113 x.b = "foo"
3114 y = pickle.loads(pickle.dumps(x))
3115 self.assertEqual(y.a, x.a)
3116 self.assertEqual(y.b, x.b)
3117
3118 def test_binary_operator_override(self):
3119 # Testing overrides of binary operations...
3120 class I(int):
3121 def __repr__(self):
3122 return "I(%r)" % int(self)
3123 def __add__(self, other):
3124 return I(int(self) + int(other))
3125 __radd__ = __add__
3126 def __pow__(self, other, mod=None):
3127 if mod is None:
3128 return I(pow(int(self), int(other)))
3129 else:
3130 return I(pow(int(self), int(other), int(mod)))
3131 def __rpow__(self, other, mod=None):
3132 if mod is None:
3133 return I(pow(int(other), int(self), mod))
3134 else:
3135 return I(pow(int(other), int(self), int(mod)))
3136
3137 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3138 self.assertEqual(repr(I(1) + 2), "I(3)")
3139 self.assertEqual(repr(1 + I(2)), "I(3)")
3140 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3141 self.assertEqual(repr(2 ** I(3)), "I(8)")
3142 self.assertEqual(repr(I(2) ** 3), "I(8)")
3143 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3144 class S(str):
3145 def __eq__(self, other):
3146 return self.lower() == other.lower()
3147
3148 def test_subclass_propagation(self):
3149 # Testing propagation of slot functions to subclasses...
3150 class A(object):
3151 pass
3152 class B(A):
3153 pass
3154 class C(A):
3155 pass
3156 class D(B, C):
3157 pass
3158 d = D()
3159 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3160 A.__hash__ = lambda self: 42
3161 self.assertEqual(hash(d), 42)
3162 C.__hash__ = lambda self: 314
3163 self.assertEqual(hash(d), 314)
3164 B.__hash__ = lambda self: 144
3165 self.assertEqual(hash(d), 144)
3166 D.__hash__ = lambda self: 100
3167 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003168 D.__hash__ = None
3169 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003170 del D.__hash__
3171 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003172 B.__hash__ = None
3173 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003174 del B.__hash__
3175 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003176 C.__hash__ = None
3177 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003178 del C.__hash__
3179 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003180 A.__hash__ = None
3181 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003182 del A.__hash__
3183 self.assertEqual(hash(d), orig_hash)
3184 d.foo = 42
3185 d.bar = 42
3186 self.assertEqual(d.foo, 42)
3187 self.assertEqual(d.bar, 42)
3188 def __getattribute__(self, name):
3189 if name == "foo":
3190 return 24
3191 return object.__getattribute__(self, name)
3192 A.__getattribute__ = __getattribute__
3193 self.assertEqual(d.foo, 24)
3194 self.assertEqual(d.bar, 42)
3195 def __getattr__(self, name):
3196 if name in ("spam", "foo", "bar"):
3197 return "hello"
3198 raise AttributeError(name)
3199 B.__getattr__ = __getattr__
3200 self.assertEqual(d.spam, "hello")
3201 self.assertEqual(d.foo, 24)
3202 self.assertEqual(d.bar, 42)
3203 del A.__getattribute__
3204 self.assertEqual(d.foo, 42)
3205 del d.foo
3206 self.assertEqual(d.foo, "hello")
3207 self.assertEqual(d.bar, 42)
3208 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003209 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003210 d.foo
3211 except AttributeError:
3212 pass
3213 else:
3214 self.fail("d.foo should be undefined now")
3215
3216 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl479a7e72008-02-05 18:13:15 +00003217 class A(object):
3218 pass
3219 class B(A):
3220 pass
3221 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003222 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003223 A.__setitem__ = lambda *a: None # crash
3224
3225 def test_buffer_inheritance(self):
3226 # Testing that buffer interface is inherited ...
3227
3228 import binascii
3229 # SF bug [#470040] ParseTuple t# vs subclasses.
3230
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003231 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003232 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003233 base = b'abc'
3234 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003235 # b2a_hex uses the buffer interface to get its argument's value, via
3236 # PyArg_ParseTuple 't#' code.
3237 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3238
Georg Brandl479a7e72008-02-05 18:13:15 +00003239 class MyInt(int):
3240 pass
3241 m = MyInt(42)
3242 try:
3243 binascii.b2a_hex(m)
3244 self.fail('subclass of int should not have a buffer interface')
3245 except TypeError:
3246 pass
3247
3248 def test_str_of_str_subclass(self):
3249 # Testing __str__ defined in subclass of str ...
3250 import binascii
3251 import io
3252
3253 class octetstring(str):
3254 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003255 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003256 def __repr__(self):
3257 return self + " repr"
3258
3259 o = octetstring('A')
3260 self.assertEqual(type(o), octetstring)
3261 self.assertEqual(type(str(o)), str)
3262 self.assertEqual(type(repr(o)), str)
3263 self.assertEqual(ord(o), 0x41)
3264 self.assertEqual(str(o), '41')
3265 self.assertEqual(repr(o), 'A repr')
3266 self.assertEqual(o.__str__(), '41')
3267 self.assertEqual(o.__repr__(), 'A repr')
3268
3269 capture = io.StringIO()
3270 # Calling str() or not exercises different internal paths.
3271 print(o, file=capture)
3272 print(str(o), file=capture)
3273 self.assertEqual(capture.getvalue(), '41\n41\n')
3274 capture.close()
3275
3276 def test_keyword_arguments(self):
3277 # Testing keyword arguments to __init__, __call__...
3278 def f(a): return a
3279 self.assertEqual(f.__call__(a=42), 42)
3280 a = []
3281 list.__init__(a, sequence=[0, 1, 2])
3282 self.assertEqual(a, [0, 1, 2])
3283
3284 def test_recursive_call(self):
3285 # Testing recursive __call__() by setting to instance of class...
3286 class A(object):
3287 pass
3288
3289 A.__call__ = A()
3290 try:
3291 A()()
3292 except RuntimeError:
3293 pass
3294 else:
3295 self.fail("Recursion limit should have been reached for __call__()")
3296
3297 def test_delete_hook(self):
3298 # Testing __del__ hook...
3299 log = []
3300 class C(object):
3301 def __del__(self):
3302 log.append(1)
3303 c = C()
3304 self.assertEqual(log, [])
3305 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003306 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003307 self.assertEqual(log, [1])
3308
3309 class D(object): pass
3310 d = D()
3311 try: del d[0]
3312 except TypeError: pass
3313 else: self.fail("invalid del() didn't raise TypeError")
3314
3315 def test_hash_inheritance(self):
3316 # Testing hash of mutable subclasses...
3317
3318 class mydict(dict):
3319 pass
3320 d = mydict()
3321 try:
3322 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003323 except TypeError:
3324 pass
3325 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003326 self.fail("hash() of dict subclass should fail")
3327
3328 class mylist(list):
3329 pass
3330 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003331 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003332 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003333 except TypeError:
3334 pass
3335 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003336 self.fail("hash() of list subclass should fail")
3337
3338 def test_str_operations(self):
3339 try: 'a' + 5
3340 except TypeError: pass
3341 else: self.fail("'' + 5 doesn't raise TypeError")
3342
3343 try: ''.split('')
3344 except ValueError: pass
3345 else: self.fail("''.split('') doesn't raise ValueError")
3346
3347 try: ''.join([0])
3348 except TypeError: pass
3349 else: self.fail("''.join([0]) doesn't raise TypeError")
3350
3351 try: ''.rindex('5')
3352 except ValueError: pass
3353 else: self.fail("''.rindex('5') doesn't raise ValueError")
3354
3355 try: '%(n)s' % None
3356 except TypeError: pass
3357 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3358
3359 try: '%(n' % {}
3360 except ValueError: pass
3361 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3362
3363 try: '%*s' % ('abc')
3364 except TypeError: pass
3365 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3366
3367 try: '%*.*s' % ('abc', 5)
3368 except TypeError: pass
3369 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3370
3371 try: '%s' % (1, 2)
3372 except TypeError: pass
3373 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3374
3375 try: '%' % None
3376 except ValueError: pass
3377 else: self.fail("'%' % None doesn't raise ValueError")
3378
3379 self.assertEqual('534253'.isdigit(), 1)
3380 self.assertEqual('534253x'.isdigit(), 0)
3381 self.assertEqual('%c' % 5, '\x05')
3382 self.assertEqual('%c' % '5', '5')
3383
3384 def test_deepcopy_recursive(self):
3385 # Testing deepcopy of recursive objects...
3386 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003387 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003388 a = Node()
3389 b = Node()
3390 a.b = b
3391 b.a = a
3392 z = deepcopy(a) # This blew up before
3393
3394 def test_unintialized_modules(self):
3395 # Testing uninitialized module objects...
3396 from types import ModuleType as M
3397 m = M.__new__(M)
3398 str(m)
3399 self.assertEqual(hasattr(m, "__name__"), 0)
3400 self.assertEqual(hasattr(m, "__file__"), 0)
3401 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003402 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003403 m.foo = 1
3404 self.assertEqual(m.__dict__, {"foo": 1})
3405
3406 def test_funny_new(self):
3407 # Testing __new__ returning something unexpected...
3408 class C(object):
3409 def __new__(cls, arg):
3410 if isinstance(arg, str): return [1, 2, 3]
3411 elif isinstance(arg, int): return object.__new__(D)
3412 else: return object.__new__(cls)
3413 class D(C):
3414 def __init__(self, arg):
3415 self.foo = arg
3416 self.assertEqual(C("1"), [1, 2, 3])
3417 self.assertEqual(D("1"), [1, 2, 3])
3418 d = D(None)
3419 self.assertEqual(d.foo, None)
3420 d = C(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003421 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003422 self.assertEqual(d.foo, 1)
3423 d = D(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003424 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003425 self.assertEqual(d.foo, 1)
3426
3427 def test_imul_bug(self):
3428 # Testing for __imul__ problems...
3429 # SF bug 544647
3430 class C(object):
3431 def __imul__(self, other):
3432 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003433 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003434 y = x
3435 y *= 1.0
3436 self.assertEqual(y, (x, 1.0))
3437 y = x
3438 y *= 2
3439 self.assertEqual(y, (x, 2))
3440 y = x
3441 y *= 3
3442 self.assertEqual(y, (x, 3))
3443 y = x
3444 y *= 1<<100
3445 self.assertEqual(y, (x, 1<<100))
3446 y = x
3447 y *= None
3448 self.assertEqual(y, (x, None))
3449 y = x
3450 y *= "foo"
3451 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003452
Georg Brandl479a7e72008-02-05 18:13:15 +00003453 def test_copy_setstate(self):
3454 # Testing that copy.*copy() correctly uses __setstate__...
3455 import copy
3456 class C(object):
3457 def __init__(self, foo=None):
3458 self.foo = foo
3459 self.__foo = foo
3460 def setfoo(self, foo=None):
3461 self.foo = foo
3462 def getfoo(self):
3463 return self.__foo
3464 def __getstate__(self):
3465 return [self.foo]
3466 def __setstate__(self_, lst):
3467 self.assertEqual(len(lst), 1)
3468 self_.__foo = self_.foo = lst[0]
3469 a = C(42)
3470 a.setfoo(24)
3471 self.assertEqual(a.foo, 24)
3472 self.assertEqual(a.getfoo(), 42)
3473 b = copy.copy(a)
3474 self.assertEqual(b.foo, 24)
3475 self.assertEqual(b.getfoo(), 24)
3476 b = copy.deepcopy(a)
3477 self.assertEqual(b.foo, 24)
3478 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003479
Georg Brandl479a7e72008-02-05 18:13:15 +00003480 def test_slices(self):
3481 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003482
Georg Brandl479a7e72008-02-05 18:13:15 +00003483 # Strings
3484 self.assertEqual("hello"[:4], "hell")
3485 self.assertEqual("hello"[slice(4)], "hell")
3486 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3487 class S(str):
3488 def __getitem__(self, x):
3489 return str.__getitem__(self, x)
3490 self.assertEqual(S("hello")[:4], "hell")
3491 self.assertEqual(S("hello")[slice(4)], "hell")
3492 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3493 # Tuples
3494 self.assertEqual((1,2,3)[:2], (1,2))
3495 self.assertEqual((1,2,3)[slice(2)], (1,2))
3496 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3497 class T(tuple):
3498 def __getitem__(self, x):
3499 return tuple.__getitem__(self, x)
3500 self.assertEqual(T((1,2,3))[:2], (1,2))
3501 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3502 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3503 # Lists
3504 self.assertEqual([1,2,3][:2], [1,2])
3505 self.assertEqual([1,2,3][slice(2)], [1,2])
3506 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3507 class L(list):
3508 def __getitem__(self, x):
3509 return list.__getitem__(self, x)
3510 self.assertEqual(L([1,2,3])[:2], [1,2])
3511 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3512 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3513 # Now do lists and __setitem__
3514 a = L([1,2,3])
3515 a[slice(1, 3)] = [3,2]
3516 self.assertEqual(a, [1,3,2])
3517 a[slice(0, 2, 1)] = [3,1]
3518 self.assertEqual(a, [3,1,2])
3519 a.__setitem__(slice(1, 3), [2,1])
3520 self.assertEqual(a, [3,2,1])
3521 a.__setitem__(slice(0, 2, 1), [2,3])
3522 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003523
Georg Brandl479a7e72008-02-05 18:13:15 +00003524 def test_subtype_resurrection(self):
3525 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003526
Georg Brandl479a7e72008-02-05 18:13:15 +00003527 class C(object):
3528 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003529
Georg Brandl479a7e72008-02-05 18:13:15 +00003530 def __del__(self):
3531 # resurrect the instance
3532 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003533
Georg Brandl479a7e72008-02-05 18:13:15 +00003534 c = C()
3535 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003536
Benjamin Petersone549ead2009-03-28 21:42:05 +00003537 # The most interesting thing here is whether this blows up, due to
3538 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3539 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003540 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003541
Georg Brandl479a7e72008-02-05 18:13:15 +00003542 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003543 # the last container slot works: that will attempt to delete c again,
3544 # which will cause c to get appended back to the container again
3545 # "during" the del. (On non-CPython implementations, however, __del__
3546 # is typically not called again.)
3547 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003548 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003549 del C.container[-1]
3550 if support.check_impl_detail():
3551 support.gc_collect()
3552 self.assertEqual(len(C.container), 1)
3553 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003554
Georg Brandl479a7e72008-02-05 18:13:15 +00003555 # Make c mortal again, so that the test framework with -l doesn't report
3556 # it as a leak.
3557 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003558
Georg Brandl479a7e72008-02-05 18:13:15 +00003559 def test_slots_trash(self):
3560 # Testing slot trash...
3561 # Deallocating deeply nested slotted trash caused stack overflows
3562 class trash(object):
3563 __slots__ = ['x']
3564 def __init__(self, x):
3565 self.x = x
3566 o = None
3567 for i in range(50000):
3568 o = trash(o)
3569 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003570
Georg Brandl479a7e72008-02-05 18:13:15 +00003571 def test_slots_multiple_inheritance(self):
3572 # SF bug 575229, multiple inheritance w/ slots dumps core
3573 class A(object):
3574 __slots__=()
3575 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003576 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003577 class C(A,B) :
3578 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003579 if support.check_impl_detail():
3580 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003581 self.assertTrue(hasattr(C, '__dict__'))
3582 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl479a7e72008-02-05 18:13:15 +00003583 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003584
Georg Brandl479a7e72008-02-05 18:13:15 +00003585 def test_rmul(self):
3586 # Testing correct invocation of __rmul__...
3587 # SF patch 592646
3588 class C(object):
3589 def __mul__(self, other):
3590 return "mul"
3591 def __rmul__(self, other):
3592 return "rmul"
3593 a = C()
3594 self.assertEqual(a*2, "mul")
3595 self.assertEqual(a*2.2, "mul")
3596 self.assertEqual(2*a, "rmul")
3597 self.assertEqual(2.2*a, "rmul")
3598
3599 def test_ipow(self):
3600 # Testing correct invocation of __ipow__...
3601 # [SF bug 620179]
3602 class C(object):
3603 def __ipow__(self, other):
3604 pass
3605 a = C()
3606 a **= 2
3607
3608 def test_mutable_bases(self):
3609 # Testing mutable bases...
3610
3611 # stuff that should work:
3612 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003613 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003614 class C2(object):
3615 def __getattribute__(self, attr):
3616 if attr == 'a':
3617 return 2
3618 else:
3619 return super(C2, self).__getattribute__(attr)
3620 def meth(self):
3621 return 1
3622 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003623 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003624 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003625 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003626 d = D()
3627 e = E()
3628 D.__bases__ = (C,)
3629 D.__bases__ = (C2,)
3630 self.assertEqual(d.meth(), 1)
3631 self.assertEqual(e.meth(), 1)
3632 self.assertEqual(d.a, 2)
3633 self.assertEqual(e.a, 2)
3634 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003635
Georg Brandl479a7e72008-02-05 18:13:15 +00003636 try:
3637 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003638 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003639 pass
3640 else:
3641 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003642
Georg Brandl479a7e72008-02-05 18:13:15 +00003643 try:
3644 D.__bases__ = ()
3645 except TypeError as msg:
3646 if str(msg) == "a new-style class can't have only classic bases":
3647 self.fail("wrong error message for .__bases__ = ()")
3648 else:
3649 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003650
Georg Brandl479a7e72008-02-05 18:13:15 +00003651 try:
3652 D.__bases__ = (D,)
3653 except TypeError:
3654 pass
3655 else:
3656 # actually, we'll have crashed by here...
3657 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003658
Georg Brandl479a7e72008-02-05 18:13:15 +00003659 try:
3660 D.__bases__ = (C, C)
3661 except TypeError:
3662 pass
3663 else:
3664 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003665
Georg Brandl479a7e72008-02-05 18:13:15 +00003666 try:
3667 D.__bases__ = (E,)
3668 except TypeError:
3669 pass
3670 else:
3671 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003672
Benjamin Petersonae937c02009-04-18 20:54:08 +00003673 def test_builtin_bases(self):
3674 # Make sure all the builtin types can have their base queried without
3675 # segfaulting. See issue #5787.
3676 builtin_types = [tp for tp in builtins.__dict__.values()
3677 if isinstance(tp, type)]
3678 for tp in builtin_types:
3679 object.__getattribute__(tp, "__bases__")
3680 if tp is not object:
3681 self.assertEqual(len(tp.__bases__), 1, tp)
3682
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003683 class L(list):
3684 pass
3685
3686 class C(object):
3687 pass
3688
3689 class D(C):
3690 pass
3691
3692 try:
3693 L.__bases__ = (dict,)
3694 except TypeError:
3695 pass
3696 else:
3697 self.fail("shouldn't turn list subclass into dict subclass")
3698
3699 try:
3700 list.__bases__ = (dict,)
3701 except TypeError:
3702 pass
3703 else:
3704 self.fail("shouldn't be able to assign to list.__bases__")
3705
3706 try:
3707 D.__bases__ = (C, list)
3708 except TypeError:
3709 pass
3710 else:
3711 assert 0, "best_base calculation found wanting"
3712
Benjamin Petersonae937c02009-04-18 20:54:08 +00003713
Georg Brandl479a7e72008-02-05 18:13:15 +00003714 def test_mutable_bases_with_failing_mro(self):
3715 # Testing mutable bases with failing mro...
3716 class WorkOnce(type):
3717 def __new__(self, name, bases, ns):
3718 self.flag = 0
3719 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3720 def mro(self):
3721 if self.flag > 0:
3722 raise RuntimeError("bozo")
3723 else:
3724 self.flag += 1
3725 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003726
Georg Brandl479a7e72008-02-05 18:13:15 +00003727 class WorkAlways(type):
3728 def mro(self):
3729 # this is here to make sure that .mro()s aren't called
3730 # with an exception set (which was possible at one point).
3731 # An error message will be printed in a debug build.
3732 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003733 return type.mro(self)
3734
Georg Brandl479a7e72008-02-05 18:13:15 +00003735 class C(object):
3736 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003737
Georg Brandl479a7e72008-02-05 18:13:15 +00003738 class C2(object):
3739 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003740
Georg Brandl479a7e72008-02-05 18:13:15 +00003741 class D(C):
3742 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003743
Georg Brandl479a7e72008-02-05 18:13:15 +00003744 class E(D):
3745 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003746
Georg Brandl479a7e72008-02-05 18:13:15 +00003747 class F(D, metaclass=WorkOnce):
3748 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003749
Georg Brandl479a7e72008-02-05 18:13:15 +00003750 class G(D, metaclass=WorkAlways):
3751 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003752
Georg Brandl479a7e72008-02-05 18:13:15 +00003753 # Immediate subclasses have their mro's adjusted in alphabetical
3754 # order, so E's will get adjusted before adjusting F's fails. We
3755 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003756
Georg Brandl479a7e72008-02-05 18:13:15 +00003757 E_mro_before = E.__mro__
3758 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003759
Armin Rigofd163f92005-12-29 15:59:19 +00003760 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003761 D.__bases__ = (C2,)
3762 except RuntimeError:
3763 self.assertEqual(E.__mro__, E_mro_before)
3764 self.assertEqual(D.__mro__, D_mro_before)
3765 else:
3766 self.fail("exception not propagated")
3767
3768 def test_mutable_bases_catch_mro_conflict(self):
3769 # Testing mutable bases catch mro conflict...
3770 class A(object):
3771 pass
3772
3773 class B(object):
3774 pass
3775
3776 class C(A, B):
3777 pass
3778
3779 class D(A, B):
3780 pass
3781
3782 class E(C, D):
3783 pass
3784
3785 try:
3786 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003787 except TypeError:
3788 pass
3789 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003790 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003791
Georg Brandl479a7e72008-02-05 18:13:15 +00003792 def test_mutable_names(self):
3793 # Testing mutable names...
3794 class C(object):
3795 pass
3796
3797 # C.__module__ could be 'test_descr' or '__main__'
3798 mod = C.__module__
3799
3800 C.__name__ = 'D'
3801 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3802
3803 C.__name__ = 'D.E'
3804 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3805
3806 def test_subclass_right_op(self):
3807 # Testing correct dispatch of subclass overloading __r<op>__...
3808
3809 # This code tests various cases where right-dispatch of a subclass
3810 # should be preferred over left-dispatch of a base class.
3811
3812 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3813
3814 class B(int):
3815 def __floordiv__(self, other):
3816 return "B.__floordiv__"
3817 def __rfloordiv__(self, other):
3818 return "B.__rfloordiv__"
3819
3820 self.assertEqual(B(1) // 1, "B.__floordiv__")
3821 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3822
3823 # Case 2: subclass of object; this is just the baseline for case 3
3824
3825 class C(object):
3826 def __floordiv__(self, other):
3827 return "C.__floordiv__"
3828 def __rfloordiv__(self, other):
3829 return "C.__rfloordiv__"
3830
3831 self.assertEqual(C() // 1, "C.__floordiv__")
3832 self.assertEqual(1 // C(), "C.__rfloordiv__")
3833
3834 # Case 3: subclass of new-style class; here it gets interesting
3835
3836 class D(C):
3837 def __floordiv__(self, other):
3838 return "D.__floordiv__"
3839 def __rfloordiv__(self, other):
3840 return "D.__rfloordiv__"
3841
3842 self.assertEqual(D() // C(), "D.__floordiv__")
3843 self.assertEqual(C() // D(), "D.__rfloordiv__")
3844
3845 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3846
3847 class E(C):
3848 pass
3849
3850 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3851
3852 self.assertEqual(E() // 1, "C.__floordiv__")
3853 self.assertEqual(1 // E(), "C.__rfloordiv__")
3854 self.assertEqual(E() // C(), "C.__floordiv__")
3855 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3856
Benjamin Petersone549ead2009-03-28 21:42:05 +00003857 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003858 def test_meth_class_get(self):
3859 # Testing __get__ method of METH_CLASS C methods...
3860 # Full coverage of descrobject.c::classmethod_get()
3861
3862 # Baseline
3863 arg = [1, 2, 3]
3864 res = {1: None, 2: None, 3: None}
3865 self.assertEqual(dict.fromkeys(arg), res)
3866 self.assertEqual({}.fromkeys(arg), res)
3867
3868 # Now get the descriptor
3869 descr = dict.__dict__["fromkeys"]
3870
3871 # More baseline using the descriptor directly
3872 self.assertEqual(descr.__get__(None, dict)(arg), res)
3873 self.assertEqual(descr.__get__({})(arg), res)
3874
3875 # Now check various error cases
3876 try:
3877 descr.__get__(None, None)
3878 except TypeError:
3879 pass
3880 else:
3881 self.fail("shouldn't have allowed descr.__get__(None, None)")
3882 try:
3883 descr.__get__(42)
3884 except TypeError:
3885 pass
3886 else:
3887 self.fail("shouldn't have allowed descr.__get__(42)")
3888 try:
3889 descr.__get__(None, 42)
3890 except TypeError:
3891 pass
3892 else:
3893 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3894 try:
3895 descr.__get__(None, int)
3896 except TypeError:
3897 pass
3898 else:
3899 self.fail("shouldn't have allowed descr.__get__(None, int)")
3900
3901 def test_isinst_isclass(self):
3902 # Testing proxy isinstance() and isclass()...
3903 class Proxy(object):
3904 def __init__(self, obj):
3905 self.__obj = obj
3906 def __getattribute__(self, name):
3907 if name.startswith("_Proxy__"):
3908 return object.__getattribute__(self, name)
3909 else:
3910 return getattr(self.__obj, name)
3911 # Test with a classic class
3912 class C:
3913 pass
3914 a = C()
3915 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003916 self.assertIsInstance(a, C) # Baseline
3917 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003918 # Test with a classic subclass
3919 class D(C):
3920 pass
3921 a = D()
3922 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003923 self.assertIsInstance(a, C) # Baseline
3924 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003925 # Test with a new-style class
3926 class C(object):
3927 pass
3928 a = C()
3929 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003930 self.assertIsInstance(a, C) # Baseline
3931 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003932 # Test with a new-style subclass
3933 class D(C):
3934 pass
3935 a = D()
3936 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003937 self.assertIsInstance(a, C) # Baseline
3938 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003939
3940 def test_proxy_super(self):
3941 # Testing super() for a proxy object...
3942 class Proxy(object):
3943 def __init__(self, obj):
3944 self.__obj = obj
3945 def __getattribute__(self, name):
3946 if name.startswith("_Proxy__"):
3947 return object.__getattribute__(self, name)
3948 else:
3949 return getattr(self.__obj, name)
3950
3951 class B(object):
3952 def f(self):
3953 return "B.f"
3954
3955 class C(B):
3956 def f(self):
3957 return super(C, self).f() + "->C.f"
3958
3959 obj = C()
3960 p = Proxy(obj)
3961 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3962
3963 def test_carloverre(self):
3964 # Testing prohibition of Carlo Verre's hack...
3965 try:
3966 object.__setattr__(str, "foo", 42)
3967 except TypeError:
3968 pass
3969 else:
3970 self.fail("Carlo Verre __setattr__ suceeded!")
3971 try:
3972 object.__delattr__(str, "lower")
3973 except TypeError:
3974 pass
3975 else:
3976 self.fail("Carlo Verre __delattr__ succeeded!")
3977
3978 def test_weakref_segfault(self):
3979 # Testing weakref segfault...
3980 # SF 742911
3981 import weakref
3982
3983 class Provoker:
3984 def __init__(self, referrent):
3985 self.ref = weakref.ref(referrent)
3986
3987 def __del__(self):
3988 x = self.ref()
3989
3990 class Oops(object):
3991 pass
3992
3993 o = Oops()
3994 o.whatever = Provoker(o)
3995 del o
3996
3997 def test_wrapper_segfault(self):
3998 # SF 927248: deeply nested wrappers could cause stack overflow
3999 f = lambda:None
4000 for i in range(1000000):
4001 f = f.__call__
4002 f = None
4003
4004 def test_file_fault(self):
4005 # Testing sys.stdout is changed in getattr...
Nick Coghlan6ead5522009-10-18 13:19:33 +00004006 test_stdout = sys.stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004007 class StdoutGuard:
4008 def __getattr__(self, attr):
4009 sys.stdout = sys.__stdout__
4010 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4011 sys.stdout = StdoutGuard()
4012 try:
4013 print("Oops!")
4014 except RuntimeError:
4015 pass
Nick Coghlan6ead5522009-10-18 13:19:33 +00004016 finally:
4017 sys.stdout = test_stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004018
4019 def test_vicious_descriptor_nonsense(self):
4020 # Testing vicious_descriptor_nonsense...
4021
4022 # A potential segfault spotted by Thomas Wouters in mail to
4023 # python-dev 2003-04-17, turned into an example & fixed by Michael
4024 # Hudson just less than four months later...
4025
4026 class Evil(object):
4027 def __hash__(self):
4028 return hash('attr')
4029 def __eq__(self, other):
4030 del C.attr
4031 return 0
4032
4033 class Descr(object):
4034 def __get__(self, ob, type=None):
4035 return 1
4036
4037 class C(object):
4038 attr = Descr()
4039
4040 c = C()
4041 c.__dict__[Evil()] = 0
4042
4043 self.assertEqual(c.attr, 1)
4044 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004045 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004046 self.assertEqual(hasattr(c, 'attr'), False)
4047
4048 def test_init(self):
4049 # SF 1155938
4050 class Foo(object):
4051 def __init__(self):
4052 return 10
4053 try:
4054 Foo()
4055 except TypeError:
4056 pass
4057 else:
4058 self.fail("did not test __init__() for None return")
4059
4060 def test_method_wrapper(self):
4061 # Testing method-wrapper objects...
4062 # <type 'method-wrapper'> did not support any reflection before 2.5
4063
Mark Dickinson211c6252009-02-01 10:28:51 +00004064 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004065
4066 l = []
4067 self.assertEqual(l.__add__, l.__add__)
4068 self.assertEqual(l.__add__, [].__add__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004069 self.assertTrue(l.__add__ != [5].__add__)
4070 self.assertTrue(l.__add__ != l.__mul__)
4071 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004072 if hasattr(l.__add__, '__self__'):
4073 # CPython
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004074 self.assertTrue(l.__add__.__self__ is l)
4075 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Petersone549ead2009-03-28 21:42:05 +00004076 else:
4077 # Python implementations where [].__add__ is a normal bound method
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004078 self.assertTrue(l.__add__.im_self is l)
4079 self.assertTrue(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004080 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4081 try:
4082 hash(l.__add__)
4083 except TypeError:
4084 pass
4085 else:
4086 self.fail("no TypeError from hash([].__add__)")
4087
4088 t = ()
4089 t += (7,)
4090 self.assertEqual(t.__add__, (7,).__add__)
4091 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4092
4093 def test_not_implemented(self):
4094 # Testing NotImplemented...
4095 # all binary methods should be able to return a NotImplemented
Georg Brandl479a7e72008-02-05 18:13:15 +00004096 import operator
4097
4098 def specialmethod(self, other):
4099 return NotImplemented
4100
4101 def check(expr, x, y):
4102 try:
4103 exec(expr, {'x': x, 'y': y, 'operator': operator})
4104 except TypeError:
4105 pass
4106 else:
4107 self.fail("no TypeError from %r" % (expr,))
4108
4109 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4110 # TypeErrors
4111 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4112 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004113 for name, expr, iexpr in [
4114 ('__add__', 'x + y', 'x += y'),
4115 ('__sub__', 'x - y', 'x -= y'),
4116 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004117 ('__truediv__', 'operator.truediv(x, y)', None),
4118 ('__floordiv__', 'operator.floordiv(x, y)', None),
4119 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004120 ('__mod__', 'x % y', 'x %= y'),
4121 ('__divmod__', 'divmod(x, y)', None),
4122 ('__pow__', 'x ** y', 'x **= y'),
4123 ('__lshift__', 'x << y', 'x <<= y'),
4124 ('__rshift__', 'x >> y', 'x >>= y'),
4125 ('__and__', 'x & y', 'x &= y'),
4126 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004127 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004128 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004129 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004130 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004131 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004132 check(expr, a, N1)
4133 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004134 if iexpr:
4135 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004136 check(iexpr, a, N1)
4137 check(iexpr, a, N2)
4138 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004139 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004140 c = C()
4141 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004142 check(iexpr, c, N1)
4143 check(iexpr, c, N2)
4144
Georg Brandl479a7e72008-02-05 18:13:15 +00004145 def test_assign_slice(self):
4146 # ceval.c's assign_slice used to check for
4147 # tp->tp_as_sequence->sq_slice instead of
4148 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004149
Georg Brandl479a7e72008-02-05 18:13:15 +00004150 class C(object):
4151 def __setitem__(self, idx, value):
4152 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004153
Georg Brandl479a7e72008-02-05 18:13:15 +00004154 c = C()
4155 c[1:2] = 3
4156 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004157
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +00004158 def test_set_and_no_get(self):
4159 # See
4160 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4161 class Descr(object):
4162
4163 def __init__(self, name):
4164 self.name = name
4165
4166 def __set__(self, obj, value):
4167 obj.__dict__[self.name] = value
4168 descr = Descr("a")
4169
4170 class X(object):
4171 a = descr
4172
4173 x = X()
4174 self.assertIs(x.a, descr)
4175 x.a = 42
4176 self.assertEqual(x.a, 42)
4177
Benjamin Peterson21896a32010-03-21 22:03:03 +00004178 # Also check type_getattro for correctness.
4179 class Meta(type):
4180 pass
4181 class X(object):
4182 __metaclass__ = Meta
4183 X.a = 42
4184 Meta.a = Descr("a")
4185 self.assertEqual(X.a, 42)
4186
Benjamin Peterson9262b842008-11-17 22:45:50 +00004187 def test_getattr_hooks(self):
4188 # issue 4230
4189
4190 class Descriptor(object):
4191 counter = 0
4192 def __get__(self, obj, objtype=None):
4193 def getter(name):
4194 self.counter += 1
4195 raise AttributeError(name)
4196 return getter
4197
4198 descr = Descriptor()
4199 class A(object):
4200 __getattribute__ = descr
4201 class B(object):
4202 __getattr__ = descr
4203 class C(object):
4204 __getattribute__ = descr
4205 __getattr__ = descr
4206
4207 self.assertRaises(AttributeError, getattr, A(), "attr")
4208 self.assertEquals(descr.counter, 1)
4209 self.assertRaises(AttributeError, getattr, B(), "attr")
4210 self.assertEquals(descr.counter, 2)
4211 self.assertRaises(AttributeError, getattr, C(), "attr")
4212 self.assertEquals(descr.counter, 4)
4213
4214 import gc
4215 class EvilGetattribute(object):
4216 # This used to segfault
4217 def __getattr__(self, name):
4218 raise AttributeError(name)
4219 def __getattribute__(self, name):
4220 del EvilGetattribute.__getattr__
4221 for i in range(5):
4222 gc.collect()
4223 raise AttributeError(name)
4224
4225 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4226
Christian Heimesbbffeb62008-01-24 09:42:52 +00004227
Georg Brandl479a7e72008-02-05 18:13:15 +00004228class DictProxyTests(unittest.TestCase):
4229 def setUp(self):
4230 class C(object):
4231 def meth(self):
4232 pass
4233 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004234
Georg Brandl479a7e72008-02-05 18:13:15 +00004235 def test_iter_keys(self):
4236 # Testing dict-proxy iterkeys...
4237 keys = [ key for key in self.C.__dict__.keys() ]
4238 keys.sort()
4239 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4240 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004241
Georg Brandl479a7e72008-02-05 18:13:15 +00004242 def test_iter_values(self):
4243 # Testing dict-proxy itervalues...
4244 values = [ values for values in self.C.__dict__.values() ]
4245 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004246
Georg Brandl479a7e72008-02-05 18:13:15 +00004247 def test_iter_items(self):
4248 # Testing dict-proxy iteritems...
4249 keys = [ key for (key, value) in self.C.__dict__.items() ]
4250 keys.sort()
4251 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4252 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004253
Georg Brandl479a7e72008-02-05 18:13:15 +00004254 def test_dict_type_with_metaclass(self):
4255 # Testing type of __dict__ when metaclass set...
4256 class B(object):
4257 pass
4258 class M(type):
4259 pass
4260 class C(metaclass=M):
4261 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4262 pass
4263 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004264
Christian Heimesbbffeb62008-01-24 09:42:52 +00004265
Georg Brandl479a7e72008-02-05 18:13:15 +00004266class PTypesLongInitTest(unittest.TestCase):
4267 # This is in its own TestCase so that it can be run before any other tests.
4268 def test_pytype_long_ready(self):
4269 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004270
Georg Brandl479a7e72008-02-05 18:13:15 +00004271 # This dumps core when SF bug 551412 isn't fixed --
4272 # but only when test_descr.py is run separately.
4273 # (That can't be helped -- as soon as PyType_Ready()
4274 # is called for PyLong_Type, the bug is gone.)
4275 class UserLong(object):
4276 def __pow__(self, *args):
4277 pass
4278 try:
4279 pow(0, UserLong(), 0)
4280 except:
4281 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004282
Georg Brandl479a7e72008-02-05 18:13:15 +00004283 # Another segfault only when run early
4284 # (before PyType_Ready(tuple) is called)
4285 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004286
4287
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004288def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004289 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004290 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004291 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004292
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004293if __name__ == "__main__":
4294 test_main()