blob: 297cc35531ac52ff8793704a36f5f0581ac3d4f4 [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
Benjamin Petersone549ead2009-03-28 21:42:05 +0000288 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000289 def test_spam_lists(self):
290 # Testing spamlist operations...
291 import copy, xxsubtype as spam
292
293 def spamlist(l, memo=None):
294 import xxsubtype as spam
295 return spam.spamlist(l)
296
297 # This is an ugly hack:
298 copy._deepcopy_dispatch[spam.spamlist] = spamlist
299
300 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
301 "__add__")
302 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
303 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
304 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
305 self.sliceop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
306 "__getitem__")
307 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
308 "__iadd__")
309 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
310 "__imul__")
311 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
312 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
313 "__mul__")
314 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
315 "__rmul__")
316 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
317 "__setitem__")
318 self.setsliceop_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
319 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
320 # Test subclassing
321 class C(spam.spamlist):
322 def foo(self): return 1
323 a = C()
324 self.assertEqual(a, [])
325 self.assertEqual(a.foo(), 1)
326 a.append(100)
327 self.assertEqual(a, [100])
328 self.assertEqual(a.getstate(), 0)
329 a.setstate(42)
330 self.assertEqual(a.getstate(), 42)
331
Benjamin Petersone549ead2009-03-28 21:42:05 +0000332 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000333 def test_spam_dicts(self):
334 # Testing spamdict operations...
335 import copy, xxsubtype as spam
336 def spamdict(d, memo=None):
337 import xxsubtype as spam
338 sd = spam.spamdict()
339 for k, v in list(d.items()):
340 sd[k] = v
341 return sd
342 # This is an ugly hack:
343 copy._deepcopy_dispatch[spam.spamdict] = spamdict
344
Georg Brandl479a7e72008-02-05 18:13:15 +0000345 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
346 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
347 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
348 d = spamdict({1:2,3:4})
349 l1 = []
350 for i in list(d.keys()):
351 l1.append(i)
352 l = []
353 for i in iter(d):
354 l.append(i)
355 self.assertEqual(l, l1)
356 l = []
357 for i in d.__iter__():
358 l.append(i)
359 self.assertEqual(l, l1)
360 l = []
361 for i in type(spamdict({})).__iter__(d):
362 l.append(i)
363 self.assertEqual(l, l1)
364 straightd = {1:2, 3:4}
365 spamd = spamdict(straightd)
366 self.unop_test(spamd, 2, "len(a)", "__len__")
367 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
368 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
369 "a[b]=c", "__setitem__")
370 # Test subclassing
371 class C(spam.spamdict):
372 def foo(self): return 1
373 a = C()
374 self.assertEqual(list(a.items()), [])
375 self.assertEqual(a.foo(), 1)
376 a['foo'] = 'bar'
377 self.assertEqual(list(a.items()), [('foo', 'bar')])
378 self.assertEqual(a.getstate(), 0)
379 a.setstate(100)
380 self.assertEqual(a.getstate(), 100)
381
382class ClassPropertiesAndMethods(unittest.TestCase):
383
384 def test_python_dicts(self):
385 # Testing Python subclass of dict...
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000386 self.assertTrue(issubclass(dict, dict))
Ezio Melottie9615932010-01-24 19:26:24 +0000387 self.assertIsInstance({}, dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000388 d = dict()
389 self.assertEqual(d, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000390 self.assertTrue(d.__class__ is dict)
Ezio Melottie9615932010-01-24 19:26:24 +0000391 self.assertIsInstance(d, dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000392 class C(dict):
393 state = -1
394 def __init__(self_local, *a, **kw):
395 if a:
396 self.assertEqual(len(a), 1)
397 self_local.state = a[0]
398 if kw:
399 for k, v in list(kw.items()):
400 self_local[v] = k
401 def __getitem__(self, key):
402 return self.get(key, 0)
403 def __setitem__(self_local, key, value):
Ezio Melottie9615932010-01-24 19:26:24 +0000404 self.assertIsInstance(key, type(0))
Georg Brandl479a7e72008-02-05 18:13:15 +0000405 dict.__setitem__(self_local, key, value)
406 def setstate(self, state):
407 self.state = state
408 def getstate(self):
409 return self.state
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000410 self.assertTrue(issubclass(C, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000411 a1 = C(12)
412 self.assertEqual(a1.state, 12)
413 a2 = C(foo=1, bar=2)
414 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
415 a = C()
416 self.assertEqual(a.state, -1)
417 self.assertEqual(a.getstate(), -1)
418 a.setstate(0)
419 self.assertEqual(a.state, 0)
420 self.assertEqual(a.getstate(), 0)
421 a.setstate(10)
422 self.assertEqual(a.state, 10)
423 self.assertEqual(a.getstate(), 10)
424 self.assertEqual(a[42], 0)
425 a[42] = 24
426 self.assertEqual(a[42], 24)
427 N = 50
428 for i in range(N):
429 a[i] = C()
430 for j in range(N):
431 a[i][j] = i*j
432 for i in range(N):
433 for j in range(N):
434 self.assertEqual(a[i][j], i*j)
435
436 def test_python_lists(self):
437 # Testing Python subclass of list...
438 class C(list):
439 def __getitem__(self, i):
440 if isinstance(i, slice):
441 return i.start, i.stop
442 return list.__getitem__(self, i) + 100
443 a = C()
444 a.extend([0,1,2])
445 self.assertEqual(a[0], 100)
446 self.assertEqual(a[1], 101)
447 self.assertEqual(a[2], 102)
448 self.assertEqual(a[100:200], (100,200))
449
450 def test_metaclass(self):
Georg Brandle81f5ef2008-05-27 20:34:09 +0000451 # Testing metaclasses...
Georg Brandl479a7e72008-02-05 18:13:15 +0000452 class C(metaclass=type):
453 def __init__(self):
454 self.__state = 0
455 def getstate(self):
456 return self.__state
457 def setstate(self, state):
458 self.__state = state
459 a = C()
460 self.assertEqual(a.getstate(), 0)
461 a.setstate(10)
462 self.assertEqual(a.getstate(), 10)
463 class _metaclass(type):
464 def myself(cls): return cls
465 class D(metaclass=_metaclass):
466 pass
467 self.assertEqual(D.myself(), D)
468 d = D()
469 self.assertEqual(d.__class__, D)
470 class M1(type):
471 def __new__(cls, name, bases, dict):
472 dict['__spam__'] = 1
473 return type.__new__(cls, name, bases, dict)
474 class C(metaclass=M1):
475 pass
476 self.assertEqual(C.__spam__, 1)
477 c = C()
478 self.assertEqual(c.__spam__, 1)
479
480 class _instance(object):
481 pass
482 class M2(object):
483 @staticmethod
484 def __new__(cls, name, bases, dict):
485 self = object.__new__(cls)
486 self.name = name
487 self.bases = bases
488 self.dict = dict
489 return self
490 def __call__(self):
491 it = _instance()
492 # Early binding of methods
493 for key in self.dict:
494 if key.startswith("__"):
495 continue
496 setattr(it, key, self.dict[key].__get__(it, self))
497 return it
498 class C(metaclass=M2):
499 def spam(self):
500 return 42
501 self.assertEqual(C.name, 'C')
502 self.assertEqual(C.bases, ())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000503 self.assertIn('spam', C.dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000504 c = C()
505 self.assertEqual(c.spam(), 42)
506
507 # More metaclass examples
508
509 class autosuper(type):
510 # Automatically add __super to the class
511 # This trick only works for dynamic classes
512 def __new__(metaclass, name, bases, dict):
513 cls = super(autosuper, metaclass).__new__(metaclass,
514 name, bases, dict)
515 # Name mangling for __super removes leading underscores
516 while name[:1] == "_":
517 name = name[1:]
518 if name:
519 name = "_%s__super" % name
520 else:
521 name = "__super"
522 setattr(cls, name, super(cls))
523 return cls
524 class A(metaclass=autosuper):
525 def meth(self):
526 return "A"
527 class B(A):
528 def meth(self):
529 return "B" + self.__super.meth()
530 class C(A):
531 def meth(self):
532 return "C" + self.__super.meth()
533 class D(C, B):
534 def meth(self):
535 return "D" + self.__super.meth()
536 self.assertEqual(D().meth(), "DCBA")
537 class E(B, C):
538 def meth(self):
539 return "E" + self.__super.meth()
540 self.assertEqual(E().meth(), "EBCA")
541
542 class autoproperty(type):
543 # Automatically create property attributes when methods
544 # named _get_x and/or _set_x are found
545 def __new__(metaclass, name, bases, dict):
546 hits = {}
547 for key, val in dict.items():
548 if key.startswith("_get_"):
549 key = key[5:]
550 get, set = hits.get(key, (None, None))
551 get = val
552 hits[key] = get, set
553 elif key.startswith("_set_"):
554 key = key[5:]
555 get, set = hits.get(key, (None, None))
556 set = val
557 hits[key] = get, set
558 for key, (get, set) in hits.items():
559 dict[key] = property(get, set)
560 return super(autoproperty, metaclass).__new__(metaclass,
561 name, bases, dict)
562 class A(metaclass=autoproperty):
563 def _get_x(self):
564 return -self.__x
565 def _set_x(self, x):
566 self.__x = -x
567 a = A()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000568 self.assertTrue(not hasattr(a, "x"))
Georg Brandl479a7e72008-02-05 18:13:15 +0000569 a.x = 12
570 self.assertEqual(a.x, 12)
571 self.assertEqual(a._A__x, -12)
572
573 class multimetaclass(autoproperty, autosuper):
574 # Merge of multiple cooperating metaclasses
575 pass
576 class A(metaclass=multimetaclass):
577 def _get_x(self):
578 return "A"
579 class B(A):
580 def _get_x(self):
581 return "B" + self.__super._get_x()
582 class C(A):
583 def _get_x(self):
584 return "C" + self.__super._get_x()
585 class D(C, B):
586 def _get_x(self):
587 return "D" + self.__super._get_x()
588 self.assertEqual(D().x, "DCBA")
589
590 # Make sure type(x) doesn't call x.__class__.__init__
591 class T(type):
592 counter = 0
593 def __init__(self, *args):
594 T.counter += 1
595 class C(metaclass=T):
596 pass
597 self.assertEqual(T.counter, 1)
598 a = C()
599 self.assertEqual(type(a), C)
600 self.assertEqual(T.counter, 1)
601
602 class C(object): pass
603 c = C()
604 try: c()
605 except TypeError: pass
606 else: self.fail("calling object w/o call method should raise "
607 "TypeError")
608
609 # Testing code to find most derived baseclass
610 class A(type):
611 def __new__(*args, **kwargs):
612 return type.__new__(*args, **kwargs)
613
614 class B(object):
615 pass
616
617 class C(object, metaclass=A):
618 pass
619
620 # The most derived metaclass of D is A rather than type.
621 class D(B, C):
622 pass
623
624 def test_module_subclasses(self):
625 # Testing Python subclass of module...
626 log = []
Georg Brandl479a7e72008-02-05 18:13:15 +0000627 MT = type(sys)
628 class MM(MT):
629 def __init__(self, name):
630 MT.__init__(self, name)
631 def __getattribute__(self, name):
632 log.append(("getattr", name))
633 return MT.__getattribute__(self, name)
634 def __setattr__(self, name, value):
635 log.append(("setattr", name, value))
636 MT.__setattr__(self, name, value)
637 def __delattr__(self, name):
638 log.append(("delattr", name))
639 MT.__delattr__(self, name)
640 a = MM("a")
641 a.foo = 12
642 x = a.foo
643 del a.foo
644 self.assertEqual(log, [("setattr", "foo", 12),
645 ("getattr", "foo"),
646 ("delattr", "foo")])
647
648 # http://python.org/sf/1174712
Tim Peters1fc240e2001-10-26 05:06:50 +0000649 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000650 class Module(types.ModuleType, str):
651 pass
652 except TypeError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000653 pass
654 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000655 self.fail("inheriting from ModuleType and str at the same time "
656 "should fail")
Tim Peters1fc240e2001-10-26 05:06:50 +0000657
Georg Brandl479a7e72008-02-05 18:13:15 +0000658 def test_multiple_inheritance(self):
659 # Testing multiple inheritance...
660 class C(object):
661 def __init__(self):
662 self.__state = 0
663 def getstate(self):
664 return self.__state
665 def setstate(self, state):
666 self.__state = state
667 a = C()
668 self.assertEqual(a.getstate(), 0)
669 a.setstate(10)
670 self.assertEqual(a.getstate(), 10)
671 class D(dict, C):
672 def __init__(self):
673 type({}).__init__(self)
674 C.__init__(self)
675 d = D()
676 self.assertEqual(list(d.keys()), [])
677 d["hello"] = "world"
678 self.assertEqual(list(d.items()), [("hello", "world")])
679 self.assertEqual(d["hello"], "world")
680 self.assertEqual(d.getstate(), 0)
681 d.setstate(10)
682 self.assertEqual(d.getstate(), 10)
683 self.assertEqual(D.__mro__, (D, dict, C, object))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000684
Georg Brandl479a7e72008-02-05 18:13:15 +0000685 # SF bug #442833
686 class Node(object):
687 def __int__(self):
688 return int(self.foo())
689 def foo(self):
690 return "23"
691 class Frag(Node, list):
692 def foo(self):
693 return "42"
694 self.assertEqual(Node().__int__(), 23)
695 self.assertEqual(int(Node()), 23)
696 self.assertEqual(Frag().__int__(), 42)
697 self.assertEqual(int(Frag()), 42)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000698
Georg Brandl479a7e72008-02-05 18:13:15 +0000699 def test_diamond_inheritence(self):
700 # Testing multiple inheritance special cases...
701 class A(object):
702 def spam(self): return "A"
703 self.assertEqual(A().spam(), "A")
704 class B(A):
705 def boo(self): return "B"
706 def spam(self): return "B"
707 self.assertEqual(B().spam(), "B")
708 self.assertEqual(B().boo(), "B")
709 class C(A):
710 def boo(self): return "C"
711 self.assertEqual(C().spam(), "A")
712 self.assertEqual(C().boo(), "C")
713 class D(B, C): pass
714 self.assertEqual(D().spam(), "B")
715 self.assertEqual(D().boo(), "B")
716 self.assertEqual(D.__mro__, (D, B, C, A, object))
717 class E(C, B): pass
718 self.assertEqual(E().spam(), "B")
719 self.assertEqual(E().boo(), "C")
720 self.assertEqual(E.__mro__, (E, C, B, A, object))
721 # MRO order disagreement
722 try:
723 class F(D, E): pass
724 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000725 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000726 else:
727 self.fail("expected MRO order disagreement (F)")
728 try:
729 class G(E, D): pass
730 except TypeError:
731 pass
732 else:
733 self.fail("expected MRO order disagreement (G)")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000734
Georg Brandl479a7e72008-02-05 18:13:15 +0000735 # see thread python-dev/2002-October/029035.html
736 def test_ex5_from_c3_switch(self):
737 # Testing ex5 from C3 switch discussion...
738 class A(object): pass
739 class B(object): pass
740 class C(object): pass
741 class X(A): pass
742 class Y(A): pass
743 class Z(X,B,Y,C): pass
744 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000745
Georg Brandl479a7e72008-02-05 18:13:15 +0000746 # see "A Monotonic Superclass Linearization for Dylan",
747 # by Kim Barrett et al. (OOPSLA 1996)
748 def test_monotonicity(self):
749 # Testing MRO monotonicity...
750 class Boat(object): pass
751 class DayBoat(Boat): pass
752 class WheelBoat(Boat): pass
753 class EngineLess(DayBoat): pass
754 class SmallMultihull(DayBoat): pass
755 class PedalWheelBoat(EngineLess,WheelBoat): pass
756 class SmallCatamaran(SmallMultihull): pass
757 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
Guido van Rossume45763a2001-08-10 21:28:46 +0000758
Georg Brandl479a7e72008-02-05 18:13:15 +0000759 self.assertEqual(PedalWheelBoat.__mro__,
760 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
761 self.assertEqual(SmallCatamaran.__mro__,
762 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
763 self.assertEqual(Pedalo.__mro__,
764 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
765 SmallMultihull, DayBoat, WheelBoat, Boat, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000766
Georg Brandl479a7e72008-02-05 18:13:15 +0000767 # see "A Monotonic Superclass Linearization for Dylan",
768 # by Kim Barrett et al. (OOPSLA 1996)
769 def test_consistency_with_epg(self):
770 # Testing consistentcy with EPG...
771 class Pane(object): pass
772 class ScrollingMixin(object): pass
773 class EditingMixin(object): pass
774 class ScrollablePane(Pane,ScrollingMixin): pass
775 class EditablePane(Pane,EditingMixin): pass
776 class EditableScrollablePane(ScrollablePane,EditablePane): pass
Guido van Rossum9a818922002-11-14 19:50:14 +0000777
Georg Brandl479a7e72008-02-05 18:13:15 +0000778 self.assertEqual(EditableScrollablePane.__mro__,
779 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
780 ScrollingMixin, EditingMixin, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000781
Georg Brandl479a7e72008-02-05 18:13:15 +0000782 def test_mro_disagreement(self):
783 # Testing error messages for MRO disagreement...
784 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000785order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000786
Georg Brandl479a7e72008-02-05 18:13:15 +0000787 def raises(exc, expected, callable, *args):
Guido van Rossum58da9312007-11-10 23:39:45 +0000788 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000789 callable(*args)
790 except exc as msg:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000791 # the exact msg is generally considered an impl detail
792 if support.check_impl_detail():
793 if not str(msg).startswith(expected):
794 self.fail("Message %r, expected %r" %
795 (str(msg), expected))
Georg Brandl479a7e72008-02-05 18:13:15 +0000796 else:
797 self.fail("Expected %s" % exc)
Guido van Rossum58da9312007-11-10 23:39:45 +0000798
Georg Brandl479a7e72008-02-05 18:13:15 +0000799 class A(object): pass
800 class B(A): pass
801 class C(object): pass
Christian Heimes9a371592007-12-28 14:08:13 +0000802
Georg Brandl479a7e72008-02-05 18:13:15 +0000803 # Test some very simple errors
804 raises(TypeError, "duplicate base class A",
805 type, "X", (A, A), {})
806 raises(TypeError, mro_err_msg,
807 type, "X", (A, B), {})
808 raises(TypeError, mro_err_msg,
809 type, "X", (A, C, B), {})
810 # Test a slightly more complex error
811 class GridLayout(object): pass
812 class HorizontalGrid(GridLayout): pass
813 class VerticalGrid(GridLayout): pass
814 class HVGrid(HorizontalGrid, VerticalGrid): pass
815 class VHGrid(VerticalGrid, HorizontalGrid): pass
816 raises(TypeError, mro_err_msg,
817 type, "ConfusedGrid", (HVGrid, VHGrid), {})
Guido van Rossum58da9312007-11-10 23:39:45 +0000818
Georg Brandl479a7e72008-02-05 18:13:15 +0000819 def test_object_class(self):
820 # Testing object class...
821 a = object()
822 self.assertEqual(a.__class__, object)
823 self.assertEqual(type(a), object)
824 b = object()
825 self.assertNotEqual(a, b)
826 self.assertFalse(hasattr(a, "foo"))
Tim Peters808b94e2001-09-13 19:33:07 +0000827 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000828 a.foo = 12
829 except (AttributeError, TypeError):
Tim Peters808b94e2001-09-13 19:33:07 +0000830 pass
831 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000832 self.fail("object() should not allow setting a foo attribute")
833 self.assertFalse(hasattr(object(), "__dict__"))
Tim Peters561f8992001-09-13 19:36:36 +0000834
Georg Brandl479a7e72008-02-05 18:13:15 +0000835 class Cdict(object):
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000836 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000837 x = Cdict()
838 self.assertEqual(x.__dict__, {})
839 x.foo = 1
840 self.assertEqual(x.foo, 1)
841 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossumd8faa362007-04-27 19:54:29 +0000842
Georg Brandl479a7e72008-02-05 18:13:15 +0000843 def test_slots(self):
844 # Testing __slots__...
845 class C0(object):
846 __slots__ = []
847 x = C0()
848 self.assertFalse(hasattr(x, "__dict__"))
849 self.assertFalse(hasattr(x, "foo"))
850
851 class C1(object):
852 __slots__ = ['a']
853 x = C1()
854 self.assertFalse(hasattr(x, "__dict__"))
855 self.assertFalse(hasattr(x, "a"))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000856 x.a = 1
Georg Brandl479a7e72008-02-05 18:13:15 +0000857 self.assertEqual(x.a, 1)
858 x.a = None
859 self.assertEqual(x.a, None)
860 del x.a
861 self.assertFalse(hasattr(x, "a"))
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000862
Georg Brandl479a7e72008-02-05 18:13:15 +0000863 class C3(object):
864 __slots__ = ['a', 'b', 'c']
865 x = C3()
866 self.assertFalse(hasattr(x, "__dict__"))
867 self.assertFalse(hasattr(x, 'a'))
868 self.assertFalse(hasattr(x, 'b'))
869 self.assertFalse(hasattr(x, 'c'))
870 x.a = 1
871 x.b = 2
872 x.c = 3
873 self.assertEqual(x.a, 1)
874 self.assertEqual(x.b, 2)
875 self.assertEqual(x.c, 3)
876
877 class C4(object):
878 """Validate name mangling"""
879 __slots__ = ['__a']
880 def __init__(self, value):
881 self.__a = value
882 def get(self):
883 return self.__a
884 x = C4(5)
885 self.assertFalse(hasattr(x, '__dict__'))
886 self.assertFalse(hasattr(x, '__a'))
887 self.assertEqual(x.get(), 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000888 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000889 x.__a = 6
890 except AttributeError:
Guido van Rossum6661be32001-10-26 04:26:12 +0000891 pass
892 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000893 self.fail("Double underscored names not mangled")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000894
Georg Brandl479a7e72008-02-05 18:13:15 +0000895 # Make sure slot names are proper identifiers
Guido van Rossum360e4b82007-05-14 22:51:27 +0000896 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000897 class C(object):
898 __slots__ = [None]
Guido van Rossum360e4b82007-05-14 22:51:27 +0000899 except TypeError:
900 pass
901 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000902 self.fail("[None] slots not caught")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000903 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000904 class C(object):
905 __slots__ = ["foo bar"]
906 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000907 pass
908 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000909 self.fail("['foo bar'] slots not caught")
910 try:
911 class C(object):
912 __slots__ = ["foo\0bar"]
913 except TypeError:
914 pass
915 else:
916 self.fail("['foo\\0bar'] slots not caught")
917 try:
918 class C(object):
919 __slots__ = ["1"]
920 except TypeError:
921 pass
922 else:
923 self.fail("['1'] slots not caught")
924 try:
925 class C(object):
926 __slots__ = [""]
927 except TypeError:
928 pass
929 else:
930 self.fail("[''] slots not caught")
931 class C(object):
932 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
933 # XXX(nnorwitz): was there supposed to be something tested
934 # from the class above?
Guido van Rossum360e4b82007-05-14 22:51:27 +0000935
Georg Brandl479a7e72008-02-05 18:13:15 +0000936 # Test a single string is not expanded as a sequence.
937 class C(object):
938 __slots__ = "abc"
939 c = C()
940 c.abc = 5
941 self.assertEqual(c.abc, 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000942
Georg Brandl479a7e72008-02-05 18:13:15 +0000943 # Test unicode slot names
944 # Test a single unicode string is not expanded as a sequence.
945 class C(object):
946 __slots__ = "abc"
947 c = C()
948 c.abc = 5
949 self.assertEqual(c.abc, 5)
Guido van Rossum3926a632001-09-25 16:25:58 +0000950
Georg Brandl479a7e72008-02-05 18:13:15 +0000951 # _unicode_to_string used to modify slots in certain circumstances
952 slots = ("foo", "bar")
953 class C(object):
954 __slots__ = slots
955 x = C()
956 x.foo = 5
957 self.assertEqual(x.foo, 5)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000958 self.assertTrue(type(slots[0]) is str)
Georg Brandl479a7e72008-02-05 18:13:15 +0000959 # this used to leak references
960 try:
961 class C(object):
962 __slots__ = [chr(128)]
963 except (TypeError, UnicodeEncodeError):
964 pass
965 else:
966 raise TestFailed("[chr(128)] slots not caught")
Guido van Rossum3926a632001-09-25 16:25:58 +0000967
Georg Brandl479a7e72008-02-05 18:13:15 +0000968 # Test leaks
969 class Counted(object):
970 counter = 0 # counts the number of instances alive
971 def __init__(self):
972 Counted.counter += 1
973 def __del__(self):
974 Counted.counter -= 1
975 class C(object):
976 __slots__ = ['a', 'b', 'c']
977 x = C()
978 x.a = Counted()
979 x.b = Counted()
980 x.c = Counted()
981 self.assertEqual(Counted.counter, 3)
982 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000983 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000984 self.assertEqual(Counted.counter, 0)
985 class D(C):
986 pass
987 x = D()
988 x.a = Counted()
989 x.z = Counted()
990 self.assertEqual(Counted.counter, 2)
991 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000992 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000993 self.assertEqual(Counted.counter, 0)
994 class E(D):
995 __slots__ = ['e']
996 x = E()
997 x.a = Counted()
998 x.z = Counted()
999 x.e = Counted()
1000 self.assertEqual(Counted.counter, 3)
1001 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +00001002 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001003 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001004
Georg Brandl479a7e72008-02-05 18:13:15 +00001005 # Test cyclical leaks [SF bug 519621]
1006 class F(object):
1007 __slots__ = ['a', 'b']
Georg Brandl479a7e72008-02-05 18:13:15 +00001008 s = F()
1009 s.a = [Counted(), s]
1010 self.assertEqual(Counted.counter, 1)
1011 s = None
Benjamin Petersone549ead2009-03-28 21:42:05 +00001012 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001013 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001014
Georg Brandl479a7e72008-02-05 18:13:15 +00001015 # Test lookup leaks [SF bug 572567]
Georg Brandl1b37e872010-03-14 10:45:50 +00001016 import gc
Benjamin Petersone549ead2009-03-28 21:42:05 +00001017 if hasattr(gc, 'get_objects'):
1018 class G(object):
Benjamin Petersona8b976b2009-10-11 18:28:48 +00001019 def __eq__(self, other):
1020 return False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001021 g = G()
1022 orig_objects = len(gc.get_objects())
1023 for i in range(10):
1024 g==g
1025 new_objects = len(gc.get_objects())
1026 self.assertEqual(orig_objects, new_objects)
1027
Georg Brandl479a7e72008-02-05 18:13:15 +00001028 class H(object):
1029 __slots__ = ['a', 'b']
1030 def __init__(self):
1031 self.a = 1
1032 self.b = 2
1033 def __del__(self_):
1034 self.assertEqual(self_.a, 1)
1035 self.assertEqual(self_.b, 2)
Benjamin Petersonc1de4cc2008-11-03 21:29:09 +00001036 with support.captured_output('stderr') as s:
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001037 h = H()
Georg Brandl479a7e72008-02-05 18:13:15 +00001038 del h
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001039 self.assertEqual(s.getvalue(), '')
Guido van Rossum90c45142001-11-24 21:07:01 +00001040
Benjamin Petersond12362a2009-12-30 19:44:54 +00001041 class X(object):
1042 __slots__ = "a"
1043 with self.assertRaises(AttributeError):
1044 del X().a
1045
Georg Brandl479a7e72008-02-05 18:13:15 +00001046 def test_slots_special(self):
1047 # Testing __dict__ and __weakref__ in __slots__...
1048 class D(object):
1049 __slots__ = ["__dict__"]
1050 a = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001051 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001052 self.assertFalse(hasattr(a, "__weakref__"))
1053 a.foo = 42
1054 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum90c45142001-11-24 21:07:01 +00001055
Georg Brandl479a7e72008-02-05 18:13:15 +00001056 class W(object):
1057 __slots__ = ["__weakref__"]
1058 a = W()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001059 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001060 self.assertFalse(hasattr(a, "__dict__"))
1061 try:
1062 a.foo = 42
1063 except AttributeError:
1064 pass
1065 else:
1066 self.fail("shouldn't be allowed to set a.foo")
1067
1068 class C1(W, D):
1069 __slots__ = []
1070 a = C1()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001071 self.assertTrue(hasattr(a, "__dict__"))
1072 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001073 a.foo = 42
1074 self.assertEqual(a.__dict__, {"foo": 42})
1075
1076 class C2(D, W):
1077 __slots__ = []
1078 a = C2()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001079 self.assertTrue(hasattr(a, "__dict__"))
1080 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001081 a.foo = 42
1082 self.assertEqual(a.__dict__, {"foo": 42})
1083
Christian Heimesa156e092008-02-16 07:38:31 +00001084 def test_slots_descriptor(self):
1085 # Issue2115: slot descriptors did not correctly check
1086 # the type of the given object
1087 import abc
1088 class MyABC(metaclass=abc.ABCMeta):
1089 __slots__ = "a"
1090
1091 class Unrelated(object):
1092 pass
1093 MyABC.register(Unrelated)
1094
1095 u = Unrelated()
Ezio Melottie9615932010-01-24 19:26:24 +00001096 self.assertIsInstance(u, MyABC)
Christian Heimesa156e092008-02-16 07:38:31 +00001097
1098 # This used to crash
1099 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1100
Georg Brandl479a7e72008-02-05 18:13:15 +00001101 def test_dynamics(self):
1102 # Testing class attribute propagation...
1103 class D(object):
1104 pass
1105 class E(D):
1106 pass
1107 class F(D):
1108 pass
1109 D.foo = 1
1110 self.assertEqual(D.foo, 1)
1111 # Test that dynamic attributes are inherited
1112 self.assertEqual(E.foo, 1)
1113 self.assertEqual(F.foo, 1)
1114 # Test dynamic instances
1115 class C(object):
1116 pass
1117 a = C()
1118 self.assertFalse(hasattr(a, "foobar"))
1119 C.foobar = 2
1120 self.assertEqual(a.foobar, 2)
1121 C.method = lambda self: 42
1122 self.assertEqual(a.method(), 42)
1123 C.__repr__ = lambda self: "C()"
1124 self.assertEqual(repr(a), "C()")
1125 C.__int__ = lambda self: 100
1126 self.assertEqual(int(a), 100)
1127 self.assertEqual(a.foobar, 2)
1128 self.assertFalse(hasattr(a, "spam"))
1129 def mygetattr(self, name):
1130 if name == "spam":
1131 return "spam"
1132 raise AttributeError
1133 C.__getattr__ = mygetattr
1134 self.assertEqual(a.spam, "spam")
1135 a.new = 12
1136 self.assertEqual(a.new, 12)
1137 def mysetattr(self, name, value):
1138 if name == "spam":
1139 raise AttributeError
1140 return object.__setattr__(self, name, value)
1141 C.__setattr__ = mysetattr
1142 try:
1143 a.spam = "not spam"
1144 except AttributeError:
1145 pass
1146 else:
1147 self.fail("expected AttributeError")
1148 self.assertEqual(a.spam, "spam")
1149 class D(C):
1150 pass
1151 d = D()
1152 d.foo = 1
1153 self.assertEqual(d.foo, 1)
1154
1155 # Test handling of int*seq and seq*int
1156 class I(int):
1157 pass
1158 self.assertEqual("a"*I(2), "aa")
1159 self.assertEqual(I(2)*"a", "aa")
1160 self.assertEqual(2*I(3), 6)
1161 self.assertEqual(I(3)*2, 6)
1162 self.assertEqual(I(3)*I(2), 6)
1163
Georg Brandl479a7e72008-02-05 18:13:15 +00001164 # Test comparison of classes with dynamic metaclasses
1165 class dynamicmetaclass(type):
1166 pass
1167 class someclass(metaclass=dynamicmetaclass):
1168 pass
1169 self.assertNotEqual(someclass, object)
1170
1171 def test_errors(self):
1172 # Testing errors...
1173 try:
1174 class C(list, dict):
1175 pass
1176 except TypeError:
1177 pass
1178 else:
1179 self.fail("inheritance from both list and dict should be illegal")
1180
1181 try:
1182 class C(object, None):
1183 pass
1184 except TypeError:
1185 pass
1186 else:
1187 self.fail("inheritance from non-type should be illegal")
1188 class Classic:
1189 pass
1190
1191 try:
1192 class C(type(len)):
1193 pass
1194 except TypeError:
1195 pass
1196 else:
1197 self.fail("inheritance from CFunction should be illegal")
1198
1199 try:
1200 class C(object):
1201 __slots__ = 1
1202 except TypeError:
1203 pass
1204 else:
1205 self.fail("__slots__ = 1 should be illegal")
1206
1207 try:
1208 class C(object):
1209 __slots__ = [1]
1210 except TypeError:
1211 pass
1212 else:
1213 self.fail("__slots__ = [1] should be illegal")
1214
1215 class M1(type):
1216 pass
1217 class M2(type):
1218 pass
1219 class A1(object, metaclass=M1):
1220 pass
1221 class A2(object, metaclass=M2):
1222 pass
1223 try:
1224 class B(A1, A2):
1225 pass
1226 except TypeError:
1227 pass
1228 else:
1229 self.fail("finding the most derived metaclass should have failed")
1230
1231 def test_classmethods(self):
1232 # Testing class methods...
1233 class C(object):
1234 def foo(*a): return a
1235 goo = classmethod(foo)
1236 c = C()
1237 self.assertEqual(C.goo(1), (C, 1))
1238 self.assertEqual(c.goo(1), (C, 1))
1239 self.assertEqual(c.foo(1), (c, 1))
1240 class D(C):
1241 pass
1242 d = D()
1243 self.assertEqual(D.goo(1), (D, 1))
1244 self.assertEqual(d.goo(1), (D, 1))
1245 self.assertEqual(d.foo(1), (d, 1))
1246 self.assertEqual(D.foo(d, 1), (d, 1))
1247 # Test for a specific crash (SF bug 528132)
1248 def f(cls, arg): return (cls, arg)
1249 ff = classmethod(f)
1250 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1251 self.assertEqual(ff.__get__(0)(42), (int, 42))
1252
1253 # Test super() with classmethods (SF bug 535444)
1254 self.assertEqual(C.goo.__self__, C)
1255 self.assertEqual(D.goo.__self__, D)
1256 self.assertEqual(super(D,D).goo.__self__, D)
1257 self.assertEqual(super(D,d).goo.__self__, D)
1258 self.assertEqual(super(D,D).goo(), (D,))
1259 self.assertEqual(super(D,d).goo(), (D,))
1260
Benjamin Peterson8719ad52009-09-11 22:24:02 +00001261 # Verify that a non-callable will raise
1262 meth = classmethod(1).__get__(1)
1263 self.assertRaises(TypeError, meth)
Georg Brandl479a7e72008-02-05 18:13:15 +00001264
1265 # Verify that classmethod() doesn't allow keyword args
1266 try:
1267 classmethod(f, kw=1)
1268 except TypeError:
1269 pass
1270 else:
1271 self.fail("classmethod shouldn't accept keyword args")
1272
Benjamin Petersone549ead2009-03-28 21:42:05 +00001273 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001274 def test_classmethods_in_c(self):
1275 # Testing C-based class methods...
1276 import xxsubtype as spam
1277 a = (1, 2, 3)
1278 d = {'abc': 123}
1279 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1280 self.assertEqual(x, spam.spamlist)
1281 self.assertEqual(a, a1)
1282 self.assertEqual(d, d1)
1283 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1284 self.assertEqual(x, spam.spamlist)
1285 self.assertEqual(a, a1)
1286 self.assertEqual(d, d1)
1287
1288 def test_staticmethods(self):
1289 # Testing static methods...
1290 class C(object):
1291 def foo(*a): return a
1292 goo = staticmethod(foo)
1293 c = C()
1294 self.assertEqual(C.goo(1), (1,))
1295 self.assertEqual(c.goo(1), (1,))
1296 self.assertEqual(c.foo(1), (c, 1,))
1297 class D(C):
1298 pass
1299 d = D()
1300 self.assertEqual(D.goo(1), (1,))
1301 self.assertEqual(d.goo(1), (1,))
1302 self.assertEqual(d.foo(1), (d, 1))
1303 self.assertEqual(D.foo(d, 1), (d, 1))
1304
Benjamin Petersone549ead2009-03-28 21:42:05 +00001305 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001306 def test_staticmethods_in_c(self):
1307 # Testing C-based static methods...
1308 import xxsubtype as spam
1309 a = (1, 2, 3)
1310 d = {"abc": 123}
1311 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1312 self.assertEqual(x, None)
1313 self.assertEqual(a, a1)
1314 self.assertEqual(d, d1)
1315 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1316 self.assertEqual(x, None)
1317 self.assertEqual(a, a1)
1318 self.assertEqual(d, d1)
1319
1320 def test_classic(self):
1321 # Testing classic classes...
1322 class C:
1323 def foo(*a): return a
1324 goo = classmethod(foo)
1325 c = C()
1326 self.assertEqual(C.goo(1), (C, 1))
1327 self.assertEqual(c.goo(1), (C, 1))
1328 self.assertEqual(c.foo(1), (c, 1))
1329 class D(C):
1330 pass
1331 d = D()
1332 self.assertEqual(D.goo(1), (D, 1))
1333 self.assertEqual(d.goo(1), (D, 1))
1334 self.assertEqual(d.foo(1), (d, 1))
1335 self.assertEqual(D.foo(d, 1), (d, 1))
1336 class E: # *not* subclassing from C
1337 foo = C.foo
1338 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001339 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001340
1341 def test_compattr(self):
1342 # Testing computed attributes...
1343 class C(object):
1344 class computed_attribute(object):
1345 def __init__(self, get, set=None, delete=None):
1346 self.__get = get
1347 self.__set = set
1348 self.__delete = delete
1349 def __get__(self, obj, type=None):
1350 return self.__get(obj)
1351 def __set__(self, obj, value):
1352 return self.__set(obj, value)
1353 def __delete__(self, obj):
1354 return self.__delete(obj)
1355 def __init__(self):
1356 self.__x = 0
1357 def __get_x(self):
1358 x = self.__x
1359 self.__x = x+1
1360 return x
1361 def __set_x(self, x):
1362 self.__x = x
1363 def __delete_x(self):
1364 del self.__x
1365 x = computed_attribute(__get_x, __set_x, __delete_x)
1366 a = C()
1367 self.assertEqual(a.x, 0)
1368 self.assertEqual(a.x, 1)
1369 a.x = 10
1370 self.assertEqual(a.x, 10)
1371 self.assertEqual(a.x, 11)
1372 del a.x
1373 self.assertEqual(hasattr(a, 'x'), 0)
1374
1375 def test_newslots(self):
1376 # Testing __new__ slot override...
1377 class C(list):
1378 def __new__(cls):
1379 self = list.__new__(cls)
1380 self.foo = 1
1381 return self
1382 def __init__(self):
1383 self.foo = self.foo + 2
1384 a = C()
1385 self.assertEqual(a.foo, 3)
1386 self.assertEqual(a.__class__, C)
1387 class D(C):
1388 pass
1389 b = D()
1390 self.assertEqual(b.foo, 3)
1391 self.assertEqual(b.__class__, D)
1392
1393 def test_altmro(self):
1394 # Testing mro() and overriding it...
1395 class A(object):
1396 def f(self): return "A"
1397 class B(A):
1398 pass
1399 class C(A):
1400 def f(self): return "C"
1401 class D(B, C):
1402 pass
1403 self.assertEqual(D.mro(), [D, B, C, A, object])
1404 self.assertEqual(D.__mro__, (D, B, C, A, object))
1405 self.assertEqual(D().f(), "C")
1406
1407 class PerverseMetaType(type):
1408 def mro(cls):
1409 L = type.mro(cls)
1410 L.reverse()
1411 return L
1412 class X(D,B,C,A, metaclass=PerverseMetaType):
1413 pass
1414 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1415 self.assertEqual(X().f(), "A")
1416
1417 try:
1418 class _metaclass(type):
1419 def mro(self):
1420 return [self, dict, object]
1421 class X(object, metaclass=_metaclass):
1422 pass
Benjamin Petersone549ead2009-03-28 21:42:05 +00001423 # In CPython, the class creation above already raises
1424 # TypeError, as a protection against the fact that
1425 # instances of X would segfault it. In other Python
1426 # implementations it would be ok to let the class X
1427 # be created, but instead get a clean TypeError on the
1428 # __setitem__ below.
1429 x = object.__new__(X)
1430 x[5] = 6
Georg Brandl479a7e72008-02-05 18:13:15 +00001431 except TypeError:
1432 pass
1433 else:
1434 self.fail("devious mro() return not caught")
1435
1436 try:
1437 class _metaclass(type):
1438 def mro(self):
1439 return [1]
1440 class X(object, metaclass=_metaclass):
1441 pass
1442 except TypeError:
1443 pass
1444 else:
1445 self.fail("non-class mro() return not caught")
1446
1447 try:
1448 class _metaclass(type):
1449 def mro(self):
1450 return 1
1451 class X(object, metaclass=_metaclass):
1452 pass
1453 except TypeError:
1454 pass
1455 else:
1456 self.fail("non-sequence mro() return not caught")
1457
1458 def test_overloading(self):
1459 # Testing operator overloading...
1460
1461 class B(object):
1462 "Intermediate class because object doesn't have a __setattr__"
1463
1464 class C(B):
1465 def __getattr__(self, name):
1466 if name == "foo":
1467 return ("getattr", name)
1468 else:
1469 raise AttributeError
1470 def __setattr__(self, name, value):
1471 if name == "foo":
1472 self.setattr = (name, value)
1473 else:
1474 return B.__setattr__(self, name, value)
1475 def __delattr__(self, name):
1476 if name == "foo":
1477 self.delattr = name
1478 else:
1479 return B.__delattr__(self, name)
1480
1481 def __getitem__(self, key):
1482 return ("getitem", key)
1483 def __setitem__(self, key, value):
1484 self.setitem = (key, value)
1485 def __delitem__(self, key):
1486 self.delitem = key
1487
1488 a = C()
1489 self.assertEqual(a.foo, ("getattr", "foo"))
1490 a.foo = 12
1491 self.assertEqual(a.setattr, ("foo", 12))
1492 del a.foo
1493 self.assertEqual(a.delattr, "foo")
1494
1495 self.assertEqual(a[12], ("getitem", 12))
1496 a[12] = 21
1497 self.assertEqual(a.setitem, (12, 21))
1498 del a[12]
1499 self.assertEqual(a.delitem, 12)
1500
1501 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1502 a[0:10] = "foo"
1503 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1504 del a[0:10]
1505 self.assertEqual(a.delitem, (slice(0, 10)))
1506
1507 def test_methods(self):
1508 # Testing methods...
1509 class C(object):
1510 def __init__(self, x):
1511 self.x = x
1512 def foo(self):
1513 return self.x
1514 c1 = C(1)
1515 self.assertEqual(c1.foo(), 1)
1516 class D(C):
1517 boo = C.foo
1518 goo = c1.foo
1519 d2 = D(2)
1520 self.assertEqual(d2.foo(), 2)
1521 self.assertEqual(d2.boo(), 2)
1522 self.assertEqual(d2.goo(), 1)
1523 class E(object):
1524 foo = C.foo
1525 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001526 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001527
Benjamin Peterson224205f2009-05-08 03:25:19 +00001528 def test_special_method_lookup(self):
1529 # The lookup of special methods bypasses __getattr__ and
1530 # __getattribute__, but they still can be descriptors.
1531
1532 def run_context(manager):
1533 with manager:
1534 pass
1535 def iden(self):
1536 return self
1537 def hello(self):
1538 return b"hello"
Benjamin Peterson053c61f2009-05-09 17:21:13 +00001539 def empty_seq(self):
1540 return []
Benjamin Petersona5758c02009-05-09 18:15:04 +00001541 def zero(self):
1542 return 0
Benjamin Petersonaea44282010-01-04 01:10:28 +00001543 def complex_num(self):
1544 return 1j
Benjamin Petersona5758c02009-05-09 18:15:04 +00001545 def stop(self):
1546 raise StopIteration
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001547 def return_true(self, thing=None):
1548 return True
1549 def do_isinstance(obj):
1550 return isinstance(int, obj)
1551 def do_issubclass(obj):
1552 return issubclass(int, obj)
Benjamin Petersona7205592009-05-27 03:08:59 +00001553 def do_dict_missing(checker):
1554 class DictSub(checker.__class__, dict):
1555 pass
1556 self.assertEqual(DictSub()["hi"], 4)
1557 def some_number(self_, key):
1558 self.assertEqual(key, "hi")
1559 return 4
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001560 def swallow(*args): pass
Benjamin Petersonda2cf042010-06-05 00:45:37 +00001561 def format_impl(self, spec):
1562 return "hello"
Benjamin Peterson224205f2009-05-08 03:25:19 +00001563
1564 # It would be nice to have every special method tested here, but I'm
1565 # only listing the ones I can remember outside of typeobject.c, since it
1566 # does it right.
1567 specials = [
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001568 ("__bytes__", bytes, hello, set(), {}),
1569 ("__reversed__", reversed, empty_seq, set(), {}),
1570 ("__length_hint__", list, zero, set(),
Benjamin Petersona5758c02009-05-09 18:15:04 +00001571 {"__iter__" : iden, "__next__" : stop}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001572 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1573 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Petersona7205592009-05-27 03:08:59 +00001574 ("__missing__", do_dict_missing, some_number,
1575 set(("__class__",)), {}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001576 ("__subclasscheck__", do_issubclass, return_true,
1577 set(("__bases__",)), {}),
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001578 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1579 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Petersonaea44282010-01-04 01:10:28 +00001580 ("__complex__", complex, complex_num, set(), {}),
Benjamin Petersonda2cf042010-06-05 00:45:37 +00001581 ("__format__", format, format_impl, set(), {}),
Benjamin Peterson8bb9cde2010-07-01 15:16:55 +00001582 ("__floor__", math.floor, zero, set(), {}),
1583 ("__trunc__", math.trunc, zero, set(), {}),
Benjamin Peterson224205f2009-05-08 03:25:19 +00001584 ]
1585
1586 class Checker(object):
1587 def __getattr__(self, attr, test=self):
1588 test.fail("__getattr__ called with {0}".format(attr))
1589 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001590 if attr not in ok:
1591 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Petersona7205592009-05-27 03:08:59 +00001592 return object.__getattribute__(self, attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001593 class SpecialDescr(object):
1594 def __init__(self, impl):
1595 self.impl = impl
1596 def __get__(self, obj, owner):
1597 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001598 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001599 class MyException(Exception):
1600 pass
1601 class ErrDescr(object):
1602 def __get__(self, obj, owner):
1603 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001604
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001605 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001606 class X(Checker):
1607 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001608 for attr, obj in env.items():
1609 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001610 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001611 runner(X())
1612
1613 record = []
1614 class X(Checker):
1615 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001616 for attr, obj in env.items():
1617 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001618 setattr(X, name, SpecialDescr(meth_impl))
1619 runner(X())
1620 self.assertEqual(record, [1], name)
1621
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001622 class X(Checker):
1623 pass
1624 for attr, obj in env.items():
1625 setattr(X, attr, obj)
1626 setattr(X, name, ErrDescr())
1627 try:
1628 runner(X())
1629 except MyException:
1630 pass
1631 else:
1632 self.fail("{0!r} didn't raise".format(name))
1633
Georg Brandl479a7e72008-02-05 18:13:15 +00001634 def test_specials(self):
1635 # Testing special operators...
1636 # Test operators like __hash__ for which a built-in default exists
1637
1638 # Test the default behavior for static classes
1639 class C(object):
1640 def __getitem__(self, i):
1641 if 0 <= i < 10: return i
1642 raise IndexError
1643 c1 = C()
1644 c2 = C()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001645 self.assertTrue(not not c1) # What?
Georg Brandl479a7e72008-02-05 18:13:15 +00001646 self.assertNotEqual(id(c1), id(c2))
1647 hash(c1)
1648 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001649 self.assertEqual(c1, c1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001650 self.assertTrue(c1 != c2)
1651 self.assertTrue(not c1 != c1)
1652 self.assertTrue(not c1 == c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001653 # Note that the module name appears in str/repr, and that varies
1654 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001655 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001656 self.assertEqual(str(c1), repr(c1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001657 self.assertNotIn(-1, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001658 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001659 self.assertIn(i, c1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001660 self.assertNotIn(10, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001661 # Test the default behavior for dynamic classes
1662 class D(object):
1663 def __getitem__(self, i):
1664 if 0 <= i < 10: return i
1665 raise IndexError
1666 d1 = D()
1667 d2 = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001668 self.assertTrue(not not d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001669 self.assertNotEqual(id(d1), id(d2))
1670 hash(d1)
1671 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001672 self.assertEqual(d1, d1)
1673 self.assertNotEqual(d1, d2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001674 self.assertTrue(not d1 != d1)
1675 self.assertTrue(not d1 == d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001676 # Note that the module name appears in str/repr, and that varies
1677 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001678 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001679 self.assertEqual(str(d1), repr(d1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001680 self.assertNotIn(-1, d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001681 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001682 self.assertIn(i, d1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001683 self.assertNotIn(10, d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001684 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001685 class Proxy(object):
1686 def __init__(self, x):
1687 self.x = x
1688 def __bool__(self):
1689 return not not self.x
1690 def __hash__(self):
1691 return hash(self.x)
1692 def __eq__(self, other):
1693 return self.x == other
1694 def __ne__(self, other):
1695 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001696 def __ge__(self, other):
1697 return self.x >= other
1698 def __gt__(self, other):
1699 return self.x > other
1700 def __le__(self, other):
1701 return self.x <= other
1702 def __lt__(self, other):
1703 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001704 def __str__(self):
1705 return "Proxy:%s" % self.x
1706 def __repr__(self):
1707 return "Proxy(%r)" % self.x
1708 def __contains__(self, value):
1709 return value in self.x
1710 p0 = Proxy(0)
1711 p1 = Proxy(1)
1712 p_1 = Proxy(-1)
1713 self.assertFalse(p0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001714 self.assertTrue(not not p1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001715 self.assertEqual(hash(p0), hash(0))
1716 self.assertEqual(p0, p0)
1717 self.assertNotEqual(p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001718 self.assertTrue(not p0 != p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001719 self.assertEqual(not p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001720 self.assertTrue(p0 < p1)
1721 self.assertTrue(p0 <= p1)
1722 self.assertTrue(p1 > p0)
1723 self.assertTrue(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001724 self.assertEqual(str(p0), "Proxy:0")
1725 self.assertEqual(repr(p0), "Proxy(0)")
1726 p10 = Proxy(range(10))
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001727 self.assertNotIn(-1, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001728 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001729 self.assertIn(i, p10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001730 self.assertNotIn(10, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001731
Georg Brandl479a7e72008-02-05 18:13:15 +00001732 def test_weakrefs(self):
1733 # Testing weak references...
1734 import weakref
1735 class C(object):
1736 pass
1737 c = C()
1738 r = weakref.ref(c)
1739 self.assertEqual(r(), c)
1740 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001741 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001742 self.assertEqual(r(), None)
1743 del r
1744 class NoWeak(object):
1745 __slots__ = ['foo']
1746 no = NoWeak()
1747 try:
1748 weakref.ref(no)
1749 except TypeError as msg:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001750 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001751 else:
1752 self.fail("weakref.ref(no) should be illegal")
1753 class Weak(object):
1754 __slots__ = ['foo', '__weakref__']
1755 yes = Weak()
1756 r = weakref.ref(yes)
1757 self.assertEqual(r(), yes)
1758 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001759 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001760 self.assertEqual(r(), None)
1761 del r
1762
1763 def test_properties(self):
1764 # Testing property...
1765 class C(object):
1766 def getx(self):
1767 return self.__x
1768 def setx(self, value):
1769 self.__x = value
1770 def delx(self):
1771 del self.__x
1772 x = property(getx, setx, delx, doc="I'm the x property.")
1773 a = C()
1774 self.assertFalse(hasattr(a, "x"))
1775 a.x = 42
1776 self.assertEqual(a._C__x, 42)
1777 self.assertEqual(a.x, 42)
1778 del a.x
1779 self.assertFalse(hasattr(a, "x"))
1780 self.assertFalse(hasattr(a, "_C__x"))
1781 C.x.__set__(a, 100)
1782 self.assertEqual(C.x.__get__(a), 100)
1783 C.x.__delete__(a)
1784 self.assertFalse(hasattr(a, "x"))
1785
1786 raw = C.__dict__['x']
Ezio Melottie9615932010-01-24 19:26:24 +00001787 self.assertIsInstance(raw, property)
Georg Brandl479a7e72008-02-05 18:13:15 +00001788
1789 attrs = dir(raw)
Benjamin Peterson577473f2010-01-19 00:09:57 +00001790 self.assertIn("__doc__", attrs)
1791 self.assertIn("fget", attrs)
1792 self.assertIn("fset", attrs)
1793 self.assertIn("fdel", attrs)
Georg Brandl479a7e72008-02-05 18:13:15 +00001794
1795 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001796 self.assertTrue(raw.fget is C.__dict__['getx'])
1797 self.assertTrue(raw.fset is C.__dict__['setx'])
1798 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl479a7e72008-02-05 18:13:15 +00001799
1800 for attr in "__doc__", "fget", "fset", "fdel":
1801 try:
1802 setattr(raw, attr, 42)
1803 except AttributeError as msg:
1804 if str(msg).find('readonly') < 0:
1805 self.fail("when setting readonly attr %r on a property, "
1806 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1807 else:
1808 self.fail("expected AttributeError from trying to set readonly %r "
1809 "attr on a property" % attr)
1810
1811 class D(object):
1812 __getitem__ = property(lambda s: 1/0)
1813
1814 d = D()
1815 try:
1816 for i in d:
1817 str(i)
1818 except ZeroDivisionError:
1819 pass
1820 else:
1821 self.fail("expected ZeroDivisionError from bad property")
1822
R. David Murray378c0cf2010-02-24 01:46:21 +00001823 @unittest.skipIf(sys.flags.optimize >= 2,
1824 "Docstrings are omitted with -O2 and above")
1825 def test_properties_doc_attrib(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001826 class E(object):
1827 def getter(self):
1828 "getter method"
1829 return 0
1830 def setter(self_, value):
1831 "setter method"
1832 pass
1833 prop = property(getter)
1834 self.assertEqual(prop.__doc__, "getter method")
1835 prop2 = property(fset=setter)
1836 self.assertEqual(prop2.__doc__, None)
1837
R. David Murray378c0cf2010-02-24 01:46:21 +00001838 def test_testcapi_no_segfault(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001839 # this segfaulted in 2.5b2
1840 try:
1841 import _testcapi
1842 except ImportError:
1843 pass
1844 else:
1845 class X(object):
1846 p = property(_testcapi.test_with_docstring)
1847
1848 def test_properties_plus(self):
1849 class C(object):
1850 foo = property(doc="hello")
1851 @foo.getter
1852 def foo(self):
1853 return self._foo
1854 @foo.setter
1855 def foo(self, value):
1856 self._foo = abs(value)
1857 @foo.deleter
1858 def foo(self):
1859 del self._foo
1860 c = C()
1861 self.assertEqual(C.foo.__doc__, "hello")
1862 self.assertFalse(hasattr(c, "foo"))
1863 c.foo = -42
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001864 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl479a7e72008-02-05 18:13:15 +00001865 self.assertEqual(c._foo, 42)
1866 self.assertEqual(c.foo, 42)
1867 del c.foo
1868 self.assertFalse(hasattr(c, '_foo'))
1869 self.assertFalse(hasattr(c, "foo"))
1870
1871 class D(C):
1872 @C.foo.deleter
1873 def foo(self):
1874 try:
1875 del self._foo
1876 except AttributeError:
1877 pass
1878 d = D()
1879 d.foo = 24
1880 self.assertEqual(d.foo, 24)
1881 del d.foo
1882 del d.foo
1883
1884 class E(object):
1885 @property
1886 def foo(self):
1887 return self._foo
1888 @foo.setter
1889 def foo(self, value):
1890 raise RuntimeError
1891 @foo.setter
1892 def foo(self, value):
1893 self._foo = abs(value)
1894 @foo.deleter
1895 def foo(self, value=None):
1896 del self._foo
1897
1898 e = E()
1899 e.foo = -42
1900 self.assertEqual(e.foo, 42)
1901 del e.foo
1902
1903 class F(E):
1904 @E.foo.deleter
1905 def foo(self):
1906 del self._foo
1907 @foo.setter
1908 def foo(self, value):
1909 self._foo = max(0, value)
1910 f = F()
1911 f.foo = -10
1912 self.assertEqual(f.foo, 0)
1913 del f.foo
1914
1915 def test_dict_constructors(self):
1916 # Testing dict constructor ...
1917 d = dict()
1918 self.assertEqual(d, {})
1919 d = dict({})
1920 self.assertEqual(d, {})
1921 d = dict({1: 2, 'a': 'b'})
1922 self.assertEqual(d, {1: 2, 'a': 'b'})
1923 self.assertEqual(d, dict(list(d.items())))
1924 self.assertEqual(d, dict(iter(d.items())))
1925 d = dict({'one':1, 'two':2})
1926 self.assertEqual(d, dict(one=1, two=2))
1927 self.assertEqual(d, dict(**d))
1928 self.assertEqual(d, dict({"one": 1}, two=2))
1929 self.assertEqual(d, dict([("two", 2)], one=1))
1930 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1931 self.assertEqual(d, dict(**d))
1932
1933 for badarg in 0, 0, 0j, "0", [0], (0,):
1934 try:
1935 dict(badarg)
1936 except TypeError:
1937 pass
1938 except ValueError:
1939 if badarg == "0":
1940 # It's a sequence, and its elements are also sequences (gotta
1941 # love strings <wink>), but they aren't of length 2, so this
1942 # one seemed better as a ValueError than a TypeError.
1943 pass
1944 else:
1945 self.fail("no TypeError from dict(%r)" % badarg)
1946 else:
1947 self.fail("no TypeError from dict(%r)" % badarg)
1948
1949 try:
1950 dict({}, {})
1951 except TypeError:
1952 pass
1953 else:
1954 self.fail("no TypeError from dict({}, {})")
1955
1956 class Mapping:
1957 # Lacks a .keys() method; will be added later.
1958 dict = {1:2, 3:4, 'a':1j}
1959
1960 try:
1961 dict(Mapping())
1962 except TypeError:
1963 pass
1964 else:
1965 self.fail("no TypeError from dict(incomplete mapping)")
1966
1967 Mapping.keys = lambda self: list(self.dict.keys())
1968 Mapping.__getitem__ = lambda self, i: self.dict[i]
1969 d = dict(Mapping())
1970 self.assertEqual(d, Mapping.dict)
1971
1972 # Init from sequence of iterable objects, each producing a 2-sequence.
1973 class AddressBookEntry:
1974 def __init__(self, first, last):
1975 self.first = first
1976 self.last = last
1977 def __iter__(self):
1978 return iter([self.first, self.last])
1979
1980 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1981 AddressBookEntry('Barry', 'Peters'),
1982 AddressBookEntry('Tim', 'Peters'),
1983 AddressBookEntry('Barry', 'Warsaw')])
1984 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1985
1986 d = dict(zip(range(4), range(1, 5)))
1987 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1988
1989 # Bad sequence lengths.
1990 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1991 try:
1992 dict(bad)
1993 except ValueError:
1994 pass
1995 else:
1996 self.fail("no ValueError from dict(%r)" % bad)
1997
1998 def test_dir(self):
1999 # Testing dir() ...
2000 junk = 12
2001 self.assertEqual(dir(), ['junk', 'self'])
2002 del junk
2003
2004 # Just make sure these don't blow up!
2005 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
2006 dir(arg)
2007
2008 # Test dir on new-style classes. Since these have object as a
2009 # base class, a lot more gets sucked in.
2010 def interesting(strings):
2011 return [s for s in strings if not s.startswith('_')]
2012
2013 class C(object):
2014 Cdata = 1
2015 def Cmethod(self): pass
2016
2017 cstuff = ['Cdata', 'Cmethod']
2018 self.assertEqual(interesting(dir(C)), cstuff)
2019
2020 c = C()
2021 self.assertEqual(interesting(dir(c)), cstuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002022 ## self.assertIn('__self__', dir(C.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002023
2024 c.cdata = 2
2025 c.cmethod = lambda self: 0
2026 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002027 ## self.assertIn('__self__', dir(c.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002028
2029 class A(C):
2030 Adata = 1
2031 def Amethod(self): pass
2032
2033 astuff = ['Adata', 'Amethod'] + cstuff
2034 self.assertEqual(interesting(dir(A)), astuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002035 ## self.assertIn('__self__', dir(A.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002036 a = A()
2037 self.assertEqual(interesting(dir(a)), astuff)
2038 a.adata = 42
2039 a.amethod = lambda self: 3
2040 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002041 ## self.assertIn('__self__', dir(a.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002042
2043 # Try a module subclass.
Georg Brandl479a7e72008-02-05 18:13:15 +00002044 class M(type(sys)):
2045 pass
2046 minstance = M("m")
2047 minstance.b = 2
2048 minstance.a = 1
2049 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2050 self.assertEqual(names, ['a', 'b'])
2051
2052 class M2(M):
2053 def getdict(self):
2054 return "Not a dict!"
2055 __dict__ = property(getdict)
2056
2057 m2instance = M2("m2")
2058 m2instance.b = 2
2059 m2instance.a = 1
2060 self.assertEqual(m2instance.__dict__, "Not a dict!")
2061 try:
2062 dir(m2instance)
2063 except TypeError:
2064 pass
2065
2066 # Two essentially featureless objects, just inheriting stuff from
2067 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002068 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2069 if support.check_impl_detail():
2070 # None differs in PyPy: it has a __nonzero__
2071 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002072
2073 # Nasty test case for proxied objects
2074 class Wrapper(object):
2075 def __init__(self, obj):
2076 self.__obj = obj
2077 def __repr__(self):
2078 return "Wrapper(%s)" % repr(self.__obj)
2079 def __getitem__(self, key):
2080 return Wrapper(self.__obj[key])
2081 def __len__(self):
2082 return len(self.__obj)
2083 def __getattr__(self, name):
2084 return Wrapper(getattr(self.__obj, name))
2085
2086 class C(object):
2087 def __getclass(self):
2088 return Wrapper(type(self))
2089 __class__ = property(__getclass)
2090
2091 dir(C()) # This used to segfault
2092
2093 def test_supers(self):
2094 # Testing super...
2095
2096 class A(object):
2097 def meth(self, a):
2098 return "A(%r)" % a
2099
2100 self.assertEqual(A().meth(1), "A(1)")
2101
2102 class B(A):
2103 def __init__(self):
2104 self.__super = super(B, self)
2105 def meth(self, a):
2106 return "B(%r)" % a + self.__super.meth(a)
2107
2108 self.assertEqual(B().meth(2), "B(2)A(2)")
2109
2110 class C(A):
2111 def meth(self, a):
2112 return "C(%r)" % a + self.__super.meth(a)
2113 C._C__super = super(C)
2114
2115 self.assertEqual(C().meth(3), "C(3)A(3)")
2116
2117 class D(C, B):
2118 def meth(self, a):
2119 return "D(%r)" % a + super(D, self).meth(a)
2120
2121 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2122
2123 # Test for subclassing super
2124
2125 class mysuper(super):
2126 def __init__(self, *args):
2127 return super(mysuper, self).__init__(*args)
2128
2129 class E(D):
2130 def meth(self, a):
2131 return "E(%r)" % a + mysuper(E, self).meth(a)
2132
2133 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2134
2135 class F(E):
2136 def meth(self, a):
2137 s = self.__super # == mysuper(F, self)
2138 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2139 F._F__super = mysuper(F)
2140
2141 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2142
2143 # Make sure certain errors are raised
2144
2145 try:
2146 super(D, 42)
2147 except TypeError:
2148 pass
2149 else:
2150 self.fail("shouldn't allow super(D, 42)")
2151
2152 try:
2153 super(D, C())
2154 except TypeError:
2155 pass
2156 else:
2157 self.fail("shouldn't allow super(D, C())")
2158
2159 try:
2160 super(D).__get__(12)
2161 except TypeError:
2162 pass
2163 else:
2164 self.fail("shouldn't allow super(D).__get__(12)")
2165
2166 try:
2167 super(D).__get__(C())
2168 except TypeError:
2169 pass
2170 else:
2171 self.fail("shouldn't allow super(D).__get__(C())")
2172
2173 # Make sure data descriptors can be overridden and accessed via super
2174 # (new feature in Python 2.3)
2175
2176 class DDbase(object):
2177 def getx(self): return 42
2178 x = property(getx)
2179
2180 class DDsub(DDbase):
2181 def getx(self): return "hello"
2182 x = property(getx)
2183
2184 dd = DDsub()
2185 self.assertEqual(dd.x, "hello")
2186 self.assertEqual(super(DDsub, dd).x, 42)
2187
2188 # Ensure that super() lookup of descriptor from classmethod
2189 # works (SF ID# 743627)
2190
2191 class Base(object):
2192 aProp = property(lambda self: "foo")
2193
2194 class Sub(Base):
2195 @classmethod
2196 def test(klass):
2197 return super(Sub,klass).aProp
2198
2199 self.assertEqual(Sub.test(), Base.aProp)
2200
2201 # Verify that super() doesn't allow keyword args
2202 try:
2203 super(Base, kw=1)
2204 except TypeError:
2205 pass
2206 else:
2207 self.assertEqual("super shouldn't accept keyword args")
2208
2209 def test_basic_inheritance(self):
2210 # Testing inheritance from basic types...
2211
2212 class hexint(int):
2213 def __repr__(self):
2214 return hex(self)
2215 def __add__(self, other):
2216 return hexint(int.__add__(self, other))
2217 # (Note that overriding __radd__ doesn't work,
2218 # because the int type gets first dibs.)
2219 self.assertEqual(repr(hexint(7) + 9), "0x10")
2220 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2221 a = hexint(12345)
2222 self.assertEqual(a, 12345)
2223 self.assertEqual(int(a), 12345)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002224 self.assertTrue(int(a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002225 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002226 self.assertTrue((+a).__class__ is int)
2227 self.assertTrue((a >> 0).__class__ is int)
2228 self.assertTrue((a << 0).__class__ is int)
2229 self.assertTrue((hexint(0) << 12).__class__ is int)
2230 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002231
2232 class octlong(int):
2233 __slots__ = []
2234 def __str__(self):
Mark Dickinson5c2db372009-12-05 20:28:34 +00002235 return oct(self)
Georg Brandl479a7e72008-02-05 18:13:15 +00002236 def __add__(self, other):
2237 return self.__class__(super(octlong, self).__add__(other))
2238 __radd__ = __add__
2239 self.assertEqual(str(octlong(3) + 5), "0o10")
2240 # (Note that overriding __radd__ here only seems to work
2241 # because the example uses a short int left argument.)
2242 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2243 a = octlong(12345)
2244 self.assertEqual(a, 12345)
2245 self.assertEqual(int(a), 12345)
2246 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002247 self.assertTrue(int(a).__class__ is int)
2248 self.assertTrue((+a).__class__ is int)
2249 self.assertTrue((-a).__class__ is int)
2250 self.assertTrue((-octlong(0)).__class__ is int)
2251 self.assertTrue((a >> 0).__class__ is int)
2252 self.assertTrue((a << 0).__class__ is int)
2253 self.assertTrue((a - 0).__class__ is int)
2254 self.assertTrue((a * 1).__class__ is int)
2255 self.assertTrue((a ** 1).__class__ is int)
2256 self.assertTrue((a // 1).__class__ is int)
2257 self.assertTrue((1 * a).__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((octlong(0) << 12).__class__ is int)
2262 self.assertTrue((octlong(0) >> 12).__class__ is int)
2263 self.assertTrue(abs(octlong(0)).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002264
2265 # Because octlong overrides __add__, we can't check the absence of +0
2266 # optimizations using octlong.
2267 class longclone(int):
2268 pass
2269 a = longclone(1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002270 self.assertTrue((a + 0).__class__ is int)
2271 self.assertTrue((0 + a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002272
2273 # Check that negative clones don't segfault
2274 a = longclone(-1)
2275 self.assertEqual(a.__dict__, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002276 self.assertEqual(int(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl479a7e72008-02-05 18:13:15 +00002277
2278 class precfloat(float):
2279 __slots__ = ['prec']
2280 def __init__(self, value=0.0, prec=12):
2281 self.prec = int(prec)
2282 def __repr__(self):
2283 return "%.*g" % (self.prec, self)
2284 self.assertEqual(repr(precfloat(1.1)), "1.1")
2285 a = precfloat(12345)
2286 self.assertEqual(a, 12345.0)
2287 self.assertEqual(float(a), 12345.0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002288 self.assertTrue(float(a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002289 self.assertEqual(hash(a), hash(12345.0))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002290 self.assertTrue((+a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002291
2292 class madcomplex(complex):
2293 def __repr__(self):
2294 return "%.17gj%+.17g" % (self.imag, self.real)
2295 a = madcomplex(-3, 4)
2296 self.assertEqual(repr(a), "4j-3")
2297 base = complex(-3, 4)
2298 self.assertEqual(base.__class__, complex)
2299 self.assertEqual(a, base)
2300 self.assertEqual(complex(a), base)
2301 self.assertEqual(complex(a).__class__, complex)
2302 a = madcomplex(a) # just trying another form of the constructor
2303 self.assertEqual(repr(a), "4j-3")
2304 self.assertEqual(a, base)
2305 self.assertEqual(complex(a), base)
2306 self.assertEqual(complex(a).__class__, complex)
2307 self.assertEqual(hash(a), hash(base))
2308 self.assertEqual((+a).__class__, complex)
2309 self.assertEqual((a + 0).__class__, complex)
2310 self.assertEqual(a + 0, base)
2311 self.assertEqual((a - 0).__class__, complex)
2312 self.assertEqual(a - 0, base)
2313 self.assertEqual((a * 1).__class__, complex)
2314 self.assertEqual(a * 1, base)
2315 self.assertEqual((a / 1).__class__, complex)
2316 self.assertEqual(a / 1, base)
2317
2318 class madtuple(tuple):
2319 _rev = None
2320 def rev(self):
2321 if self._rev is not None:
2322 return self._rev
2323 L = list(self)
2324 L.reverse()
2325 self._rev = self.__class__(L)
2326 return self._rev
2327 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2328 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2329 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2330 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2331 for i in range(512):
2332 t = madtuple(range(i))
2333 u = t.rev()
2334 v = u.rev()
2335 self.assertEqual(v, t)
2336 a = madtuple((1,2,3,4,5))
2337 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002338 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002339 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002340 self.assertTrue(a[:].__class__ is tuple)
2341 self.assertTrue((a * 1).__class__ is tuple)
2342 self.assertTrue((a * 0).__class__ is tuple)
2343 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002344 a = madtuple(())
2345 self.assertEqual(tuple(a), ())
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002346 self.assertTrue(tuple(a).__class__ is tuple)
2347 self.assertTrue((a + a).__class__ is tuple)
2348 self.assertTrue((a * 0).__class__ is tuple)
2349 self.assertTrue((a * 1).__class__ is tuple)
2350 self.assertTrue((a * 2).__class__ is tuple)
2351 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002352
2353 class madstring(str):
2354 _rev = None
2355 def rev(self):
2356 if self._rev is not None:
2357 return self._rev
2358 L = list(self)
2359 L.reverse()
2360 self._rev = self.__class__("".join(L))
2361 return self._rev
2362 s = madstring("abcdefghijklmnopqrstuvwxyz")
2363 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2364 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2365 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2366 for i in range(256):
2367 s = madstring("".join(map(chr, range(i))))
2368 t = s.rev()
2369 u = t.rev()
2370 self.assertEqual(u, s)
2371 s = madstring("12345")
2372 self.assertEqual(str(s), "12345")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002373 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002374
2375 base = "\x00" * 5
2376 s = madstring(base)
2377 self.assertEqual(s, base)
2378 self.assertEqual(str(s), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002379 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002380 self.assertEqual(hash(s), hash(base))
2381 self.assertEqual({s: 1}[base], 1)
2382 self.assertEqual({base: 1}[s], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002383 self.assertTrue((s + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002384 self.assertEqual(s + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002385 self.assertTrue(("" + s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002386 self.assertEqual("" + s, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002387 self.assertTrue((s * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002388 self.assertEqual(s * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002389 self.assertTrue((s * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002390 self.assertEqual(s * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002391 self.assertTrue((s * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002392 self.assertEqual(s * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002393 self.assertTrue(s[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002394 self.assertEqual(s[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002395 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002396 self.assertEqual(s[0:0], "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002397 self.assertTrue(s.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002398 self.assertEqual(s.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002399 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002400 self.assertEqual(s.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002401 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002402 self.assertEqual(s.rstrip(), base)
2403 identitytab = {}
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002404 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002405 self.assertEqual(s.translate(identitytab), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002406 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002407 self.assertEqual(s.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002408 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002409 self.assertEqual(s.ljust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002410 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002411 self.assertEqual(s.rjust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002412 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002413 self.assertEqual(s.center(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002414 self.assertTrue(s.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002415 self.assertEqual(s.lower(), base)
2416
2417 class madunicode(str):
2418 _rev = None
2419 def rev(self):
2420 if self._rev is not None:
2421 return self._rev
2422 L = list(self)
2423 L.reverse()
2424 self._rev = self.__class__("".join(L))
2425 return self._rev
2426 u = madunicode("ABCDEF")
2427 self.assertEqual(u, "ABCDEF")
2428 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2429 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2430 base = "12345"
2431 u = madunicode(base)
2432 self.assertEqual(str(u), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002433 self.assertTrue(str(u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002434 self.assertEqual(hash(u), hash(base))
2435 self.assertEqual({u: 1}[base], 1)
2436 self.assertEqual({base: 1}[u], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002437 self.assertTrue(u.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002438 self.assertEqual(u.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002439 self.assertTrue(u.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002440 self.assertEqual(u.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002441 self.assertTrue(u.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002442 self.assertEqual(u.rstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002443 self.assertTrue(u.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002444 self.assertEqual(u.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002445 self.assertTrue(u.replace("xy", "xy").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002446 self.assertEqual(u.replace("xy", "xy"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002447 self.assertTrue(u.center(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002448 self.assertEqual(u.center(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002449 self.assertTrue(u.ljust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002450 self.assertEqual(u.ljust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002451 self.assertTrue(u.rjust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002452 self.assertEqual(u.rjust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002453 self.assertTrue(u.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002454 self.assertEqual(u.lower(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002455 self.assertTrue(u.upper().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002456 self.assertEqual(u.upper(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002457 self.assertTrue(u.capitalize().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002458 self.assertEqual(u.capitalize(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002459 self.assertTrue(u.title().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002460 self.assertEqual(u.title(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002461 self.assertTrue((u + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002462 self.assertEqual(u + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002463 self.assertTrue(("" + u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002464 self.assertEqual("" + u, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002465 self.assertTrue((u * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002466 self.assertEqual(u * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002467 self.assertTrue((u * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002468 self.assertEqual(u * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002469 self.assertTrue((u * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002470 self.assertEqual(u * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002471 self.assertTrue(u[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002472 self.assertEqual(u[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002473 self.assertTrue(u[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002474 self.assertEqual(u[0:0], "")
2475
2476 class sublist(list):
2477 pass
2478 a = sublist(range(5))
2479 self.assertEqual(a, list(range(5)))
2480 a.append("hello")
2481 self.assertEqual(a, list(range(5)) + ["hello"])
2482 a[5] = 5
2483 self.assertEqual(a, list(range(6)))
2484 a.extend(range(6, 20))
2485 self.assertEqual(a, list(range(20)))
2486 a[-5:] = []
2487 self.assertEqual(a, list(range(15)))
2488 del a[10:15]
2489 self.assertEqual(len(a), 10)
2490 self.assertEqual(a, list(range(10)))
2491 self.assertEqual(list(a), list(range(10)))
2492 self.assertEqual(a[0], 0)
2493 self.assertEqual(a[9], 9)
2494 self.assertEqual(a[-10], 0)
2495 self.assertEqual(a[-1], 9)
2496 self.assertEqual(a[:5], list(range(5)))
2497
2498 ## class CountedInput(file):
2499 ## """Counts lines read by self.readline().
2500 ##
2501 ## self.lineno is the 0-based ordinal of the last line read, up to
2502 ## a maximum of one greater than the number of lines in the file.
2503 ##
2504 ## self.ateof is true if and only if the final "" line has been read,
2505 ## at which point self.lineno stops incrementing, and further calls
2506 ## to readline() continue to return "".
2507 ## """
2508 ##
2509 ## lineno = 0
2510 ## ateof = 0
2511 ## def readline(self):
2512 ## if self.ateof:
2513 ## return ""
2514 ## s = file.readline(self)
2515 ## # Next line works too.
2516 ## # s = super(CountedInput, self).readline()
2517 ## self.lineno += 1
2518 ## if s == "":
2519 ## self.ateof = 1
2520 ## return s
2521 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002522 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002523 ## lines = ['a\n', 'b\n', 'c\n']
2524 ## try:
2525 ## f.writelines(lines)
2526 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002527 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002528 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2529 ## got = f.readline()
2530 ## self.assertEqual(expected, got)
2531 ## self.assertEqual(f.lineno, i)
2532 ## self.assertEqual(f.ateof, (i > len(lines)))
2533 ## f.close()
2534 ## finally:
2535 ## try:
2536 ## f.close()
2537 ## except:
2538 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002539 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002540
2541 def test_keywords(self):
2542 # Testing keyword args to basic type constructors ...
2543 self.assertEqual(int(x=1), 1)
2544 self.assertEqual(float(x=2), 2.0)
2545 self.assertEqual(int(x=3), 3)
2546 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2547 self.assertEqual(str(object=500), '500')
2548 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2549 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2550 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2551 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2552
2553 for constructor in (int, float, int, complex, str, str,
2554 tuple, list):
2555 try:
2556 constructor(bogus_keyword_arg=1)
2557 except TypeError:
2558 pass
2559 else:
2560 self.fail("expected TypeError from bogus keyword argument to %r"
2561 % constructor)
2562
2563 def test_str_subclass_as_dict_key(self):
2564 # Testing a str subclass used as dict key ..
2565
2566 class cistr(str):
2567 """Sublcass of str that computes __eq__ case-insensitively.
2568
2569 Also computes a hash code of the string in canonical form.
2570 """
2571
2572 def __init__(self, value):
2573 self.canonical = value.lower()
2574 self.hashcode = hash(self.canonical)
2575
2576 def __eq__(self, other):
2577 if not isinstance(other, cistr):
2578 other = cistr(other)
2579 return self.canonical == other.canonical
2580
2581 def __hash__(self):
2582 return self.hashcode
2583
2584 self.assertEqual(cistr('ABC'), 'abc')
2585 self.assertEqual('aBc', cistr('ABC'))
2586 self.assertEqual(str(cistr('ABC')), 'ABC')
2587
2588 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2589 self.assertEqual(d[cistr('one')], 1)
2590 self.assertEqual(d[cistr('tWo')], 2)
2591 self.assertEqual(d[cistr('THrEE')], 3)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002592 self.assertIn(cistr('ONe'), d)
Georg Brandl479a7e72008-02-05 18:13:15 +00002593 self.assertEqual(d.get(cistr('thrEE')), 3)
2594
2595 def test_classic_comparisons(self):
2596 # Testing classic comparisons...
2597 class classic:
2598 pass
2599
2600 for base in (classic, int, object):
2601 class C(base):
2602 def __init__(self, value):
2603 self.value = int(value)
2604 def __eq__(self, other):
2605 if isinstance(other, C):
2606 return self.value == other.value
2607 if isinstance(other, int) or isinstance(other, int):
2608 return self.value == other
2609 return NotImplemented
2610 def __ne__(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 __lt__(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 __le__(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 __gt__(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 __ge__(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
2641 c1 = C(1)
2642 c2 = C(2)
2643 c3 = C(3)
2644 self.assertEqual(c1, 1)
2645 c = {1: c1, 2: c2, 3: c3}
2646 for x in 1, 2, 3:
2647 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002648 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002649 self.assertTrue(eval("c[x] %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002650 eval("x %s y" % op),
2651 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002652 self.assertTrue(eval("c[x] %s y" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002653 eval("x %s y" % op),
2654 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002655 self.assertTrue(eval("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))
Georg Brandl479a7e72008-02-05 18:13:15 +00002658
2659 def test_rich_comparisons(self):
2660 # Testing rich comparisons...
2661 class Z(complex):
2662 pass
2663 z = Z(1)
2664 self.assertEqual(z, 1+0j)
2665 self.assertEqual(1+0j, z)
2666 class ZZ(complex):
2667 def __eq__(self, other):
2668 try:
2669 return abs(self - other) <= 1e-6
2670 except:
2671 return NotImplemented
2672 zz = ZZ(1.0000003)
2673 self.assertEqual(zz, 1+0j)
2674 self.assertEqual(1+0j, zz)
2675
2676 class classic:
2677 pass
2678 for base in (classic, int, object, list):
2679 class C(base):
2680 def __init__(self, value):
2681 self.value = int(value)
2682 def __cmp__(self_, other):
2683 self.fail("shouldn't call __cmp__")
2684 def __eq__(self, other):
2685 if isinstance(other, C):
2686 return self.value == other.value
2687 if isinstance(other, int) or isinstance(other, int):
2688 return self.value == other
2689 return NotImplemented
2690 def __ne__(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 __lt__(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 __le__(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 __gt__(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 __ge__(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 c1 = C(1)
2721 c2 = C(2)
2722 c3 = C(3)
2723 self.assertEqual(c1, 1)
2724 c = {1: c1, 2: c2, 3: c3}
2725 for x in 1, 2, 3:
2726 for y in 1, 2, 3:
2727 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002728 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002729 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002730 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002731 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002732 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002733 "x=%d, y=%d" % (x, y))
2734
2735 def test_descrdoc(self):
2736 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002737 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002738 def check(descr, what):
2739 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002740 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002741 check(complex.real, "the real part of a complex number") # member descriptor
2742
2743 def test_doc_descriptor(self):
2744 # Testing __doc__ descriptor...
2745 # SF bug 542984
2746 class DocDescr(object):
2747 def __get__(self, object, otype):
2748 if object:
2749 object = object.__class__.__name__ + ' instance'
2750 if otype:
2751 otype = otype.__name__
2752 return 'object=%s; type=%s' % (object, otype)
2753 class OldClass:
2754 __doc__ = DocDescr()
2755 class NewClass(object):
2756 __doc__ = DocDescr()
2757 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2758 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2759 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2760 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2761
2762 def test_set_class(self):
2763 # Testing __class__ assignment...
2764 class C(object): pass
2765 class D(object): pass
2766 class E(object): pass
2767 class F(D, E): pass
2768 for cls in C, D, E, F:
2769 for cls2 in C, D, E, F:
2770 x = cls()
2771 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002772 self.assertTrue(x.__class__ is cls2)
Georg Brandl479a7e72008-02-05 18:13:15 +00002773 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002774 self.assertTrue(x.__class__ is cls)
Georg Brandl479a7e72008-02-05 18:13:15 +00002775 def cant(x, C):
2776 try:
2777 x.__class__ = C
2778 except TypeError:
2779 pass
2780 else:
2781 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2782 try:
2783 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002784 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002785 pass
2786 else:
2787 self.fail("shouldn't allow del %r.__class__" % x)
2788 cant(C(), list)
2789 cant(list(), C)
2790 cant(C(), 1)
2791 cant(C(), object)
2792 cant(object(), list)
2793 cant(list(), object)
2794 class Int(int): __slots__ = []
2795 cant(2, Int)
2796 cant(Int(), int)
2797 cant(True, int)
2798 cant(2, bool)
2799 o = object()
2800 cant(o, type(1))
2801 cant(o, type(None))
2802 del o
2803 class G(object):
2804 __slots__ = ["a", "b"]
2805 class H(object):
2806 __slots__ = ["b", "a"]
2807 class I(object):
2808 __slots__ = ["a", "b"]
2809 class J(object):
2810 __slots__ = ["c", "b"]
2811 class K(object):
2812 __slots__ = ["a", "b", "d"]
2813 class L(H):
2814 __slots__ = ["e"]
2815 class M(I):
2816 __slots__ = ["e"]
2817 class N(J):
2818 __slots__ = ["__weakref__"]
2819 class P(J):
2820 __slots__ = ["__dict__"]
2821 class Q(J):
2822 pass
2823 class R(J):
2824 __slots__ = ["__dict__", "__weakref__"]
2825
2826 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2827 x = cls()
2828 x.a = 1
2829 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002830 self.assertTrue(x.__class__ is cls2,
Georg Brandl479a7e72008-02-05 18:13:15 +00002831 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2832 self.assertEqual(x.a, 1)
2833 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002834 self.assertTrue(x.__class__ is cls,
Georg Brandl479a7e72008-02-05 18:13:15 +00002835 "assigning %r as __class__ for %r silently failed" % (cls, x))
2836 self.assertEqual(x.a, 1)
2837 for cls in G, J, K, L, M, N, P, R, list, Int:
2838 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2839 if cls is cls2:
2840 continue
2841 cant(cls(), cls2)
2842
Benjamin Peterson193152c2009-04-25 01:08:45 +00002843 # Issue5283: when __class__ changes in __del__, the wrong
2844 # type gets DECREF'd.
2845 class O(object):
2846 pass
2847 class A(object):
2848 def __del__(self):
2849 self.__class__ = O
2850 l = [A() for x in range(100)]
2851 del l
2852
Georg Brandl479a7e72008-02-05 18:13:15 +00002853 def test_set_dict(self):
2854 # Testing __dict__ assignment...
2855 class C(object): pass
2856 a = C()
2857 a.__dict__ = {'b': 1}
2858 self.assertEqual(a.b, 1)
2859 def cant(x, dict):
2860 try:
2861 x.__dict__ = dict
2862 except (AttributeError, TypeError):
2863 pass
2864 else:
2865 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2866 cant(a, None)
2867 cant(a, [])
2868 cant(a, 1)
2869 del a.__dict__ # Deleting __dict__ is allowed
2870
2871 class Base(object):
2872 pass
2873 def verify_dict_readonly(x):
2874 """
2875 x has to be an instance of a class inheriting from Base.
2876 """
2877 cant(x, {})
2878 try:
2879 del x.__dict__
2880 except (AttributeError, TypeError):
2881 pass
2882 else:
2883 self.fail("shouldn't allow del %r.__dict__" % x)
2884 dict_descr = Base.__dict__["__dict__"]
2885 try:
2886 dict_descr.__set__(x, {})
2887 except (AttributeError, TypeError):
2888 pass
2889 else:
2890 self.fail("dict_descr allowed access to %r's dict" % x)
2891
2892 # Classes don't allow __dict__ assignment and have readonly dicts
2893 class Meta1(type, Base):
2894 pass
2895 class Meta2(Base, type):
2896 pass
2897 class D(object, metaclass=Meta1):
2898 pass
2899 class E(object, metaclass=Meta2):
2900 pass
2901 for cls in C, D, E:
2902 verify_dict_readonly(cls)
2903 class_dict = cls.__dict__
2904 try:
2905 class_dict["spam"] = "eggs"
2906 except TypeError:
2907 pass
2908 else:
2909 self.fail("%r's __dict__ can be modified" % cls)
2910
2911 # Modules also disallow __dict__ assignment
2912 class Module1(types.ModuleType, Base):
2913 pass
2914 class Module2(Base, types.ModuleType):
2915 pass
2916 for ModuleType in Module1, Module2:
2917 mod = ModuleType("spam")
2918 verify_dict_readonly(mod)
2919 mod.__dict__["spam"] = "eggs"
2920
2921 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002922 # (at least not any more than regular exception's __dict__ can
2923 # be deleted; on CPython it is not the case, whereas on PyPy they
2924 # can, just like any other new-style instance's __dict__.)
2925 def can_delete_dict(e):
2926 try:
2927 del e.__dict__
2928 except (TypeError, AttributeError):
2929 return False
2930 else:
2931 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002932 class Exception1(Exception, Base):
2933 pass
2934 class Exception2(Base, Exception):
2935 pass
2936 for ExceptionType in Exception, Exception1, Exception2:
2937 e = ExceptionType()
2938 e.__dict__ = {"a": 1}
2939 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002940 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002941
2942 def test_pickles(self):
2943 # Testing pickling and copying new-style classes and objects...
2944 import pickle
2945
2946 def sorteditems(d):
2947 L = list(d.items())
2948 L.sort()
2949 return L
2950
2951 global C
2952 class C(object):
2953 def __init__(self, a, b):
2954 super(C, self).__init__()
2955 self.a = a
2956 self.b = b
2957 def __repr__(self):
2958 return "C(%r, %r)" % (self.a, self.b)
2959
2960 global C1
2961 class C1(list):
2962 def __new__(cls, a, b):
2963 return super(C1, cls).__new__(cls)
2964 def __getnewargs__(self):
2965 return (self.a, self.b)
2966 def __init__(self, a, b):
2967 self.a = a
2968 self.b = b
2969 def __repr__(self):
2970 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2971
2972 global C2
2973 class C2(int):
2974 def __new__(cls, a, b, val=0):
2975 return super(C2, cls).__new__(cls, val)
2976 def __getnewargs__(self):
2977 return (self.a, self.b, int(self))
2978 def __init__(self, a, b, val=0):
2979 self.a = a
2980 self.b = b
2981 def __repr__(self):
2982 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2983
2984 global C3
2985 class C3(object):
2986 def __init__(self, foo):
2987 self.foo = foo
2988 def __getstate__(self):
2989 return self.foo
2990 def __setstate__(self, foo):
2991 self.foo = foo
2992
2993 global C4classic, C4
2994 class C4classic: # classic
2995 pass
2996 class C4(C4classic, object): # mixed inheritance
2997 pass
2998
Guido van Rossum3926a632001-09-25 16:25:58 +00002999 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00003000 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00003001 s = pickle.dumps(cls, bin)
3002 cls2 = pickle.loads(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003003 self.assertTrue(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00003004
3005 a = C1(1, 2); a.append(42); a.append(24)
3006 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003007 s = pickle.dumps((a, b), bin)
3008 x, y = pickle.loads(s)
3009 self.assertEqual(x.__class__, a.__class__)
3010 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3011 self.assertEqual(y.__class__, b.__class__)
3012 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3013 self.assertEqual(repr(x), repr(a))
3014 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003015 # Test for __getstate__ and __setstate__ on new style class
3016 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003017 s = pickle.dumps(u, bin)
3018 v = pickle.loads(s)
3019 self.assertEqual(u.__class__, v.__class__)
3020 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003021 # Test for picklability of hybrid class
3022 u = C4()
3023 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003024 s = pickle.dumps(u, bin)
3025 v = pickle.loads(s)
3026 self.assertEqual(u.__class__, v.__class__)
3027 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003028
Georg Brandl479a7e72008-02-05 18:13:15 +00003029 # Testing copy.deepcopy()
3030 import copy
3031 for cls in C, C1, C2:
3032 cls2 = copy.deepcopy(cls)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003033 self.assertTrue(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003034
Georg Brandl479a7e72008-02-05 18:13:15 +00003035 a = C1(1, 2); a.append(42); a.append(24)
3036 b = C2("hello", "world", 42)
3037 x, y = copy.deepcopy((a, b))
3038 self.assertEqual(x.__class__, a.__class__)
3039 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3040 self.assertEqual(y.__class__, b.__class__)
3041 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3042 self.assertEqual(repr(x), repr(a))
3043 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003044
Georg Brandl479a7e72008-02-05 18:13:15 +00003045 def test_pickle_slots(self):
3046 # Testing pickling of classes with __slots__ ...
3047 import pickle
3048 # Pickling of classes with __slots__ but without __getstate__ should fail
3049 # (if using protocol 0 or 1)
3050 global B, C, D, E
3051 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003052 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003053 for base in [object, B]:
3054 class C(base):
3055 __slots__ = ['a']
3056 class D(C):
3057 pass
3058 try:
3059 pickle.dumps(C(), 0)
3060 except TypeError:
3061 pass
3062 else:
3063 self.fail("should fail: pickle C instance - %s" % base)
3064 try:
3065 pickle.dumps(C(), 0)
3066 except TypeError:
3067 pass
3068 else:
3069 self.fail("should fail: pickle D instance - %s" % base)
3070 # Give C a nice generic __getstate__ and __setstate__
3071 class C(base):
3072 __slots__ = ['a']
3073 def __getstate__(self):
3074 try:
3075 d = self.__dict__.copy()
3076 except AttributeError:
3077 d = {}
3078 for cls in self.__class__.__mro__:
3079 for sn in cls.__dict__.get('__slots__', ()):
3080 try:
3081 d[sn] = getattr(self, sn)
3082 except AttributeError:
3083 pass
3084 return d
3085 def __setstate__(self, d):
3086 for k, v in list(d.items()):
3087 setattr(self, k, v)
3088 class D(C):
3089 pass
3090 # Now it should work
3091 x = C()
3092 y = pickle.loads(pickle.dumps(x))
3093 self.assertEqual(hasattr(y, 'a'), 0)
3094 x.a = 42
3095 y = pickle.loads(pickle.dumps(x))
3096 self.assertEqual(y.a, 42)
3097 x = D()
3098 x.a = 42
3099 x.b = 100
3100 y = pickle.loads(pickle.dumps(x))
3101 self.assertEqual(y.a + y.b, 142)
3102 # A subclass that adds a slot should also work
3103 class E(C):
3104 __slots__ = ['b']
3105 x = E()
3106 x.a = 42
3107 x.b = "foo"
3108 y = pickle.loads(pickle.dumps(x))
3109 self.assertEqual(y.a, x.a)
3110 self.assertEqual(y.b, x.b)
3111
3112 def test_binary_operator_override(self):
3113 # Testing overrides of binary operations...
3114 class I(int):
3115 def __repr__(self):
3116 return "I(%r)" % int(self)
3117 def __add__(self, other):
3118 return I(int(self) + int(other))
3119 __radd__ = __add__
3120 def __pow__(self, other, mod=None):
3121 if mod is None:
3122 return I(pow(int(self), int(other)))
3123 else:
3124 return I(pow(int(self), int(other), int(mod)))
3125 def __rpow__(self, other, mod=None):
3126 if mod is None:
3127 return I(pow(int(other), int(self), mod))
3128 else:
3129 return I(pow(int(other), int(self), int(mod)))
3130
3131 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3132 self.assertEqual(repr(I(1) + 2), "I(3)")
3133 self.assertEqual(repr(1 + I(2)), "I(3)")
3134 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3135 self.assertEqual(repr(2 ** I(3)), "I(8)")
3136 self.assertEqual(repr(I(2) ** 3), "I(8)")
3137 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3138 class S(str):
3139 def __eq__(self, other):
3140 return self.lower() == other.lower()
3141
3142 def test_subclass_propagation(self):
3143 # Testing propagation of slot functions to subclasses...
3144 class A(object):
3145 pass
3146 class B(A):
3147 pass
3148 class C(A):
3149 pass
3150 class D(B, C):
3151 pass
3152 d = D()
3153 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3154 A.__hash__ = lambda self: 42
3155 self.assertEqual(hash(d), 42)
3156 C.__hash__ = lambda self: 314
3157 self.assertEqual(hash(d), 314)
3158 B.__hash__ = lambda self: 144
3159 self.assertEqual(hash(d), 144)
3160 D.__hash__ = lambda self: 100
3161 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003162 D.__hash__ = None
3163 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003164 del D.__hash__
3165 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003166 B.__hash__ = None
3167 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003168 del B.__hash__
3169 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003170 C.__hash__ = None
3171 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003172 del C.__hash__
3173 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003174 A.__hash__ = None
3175 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003176 del A.__hash__
3177 self.assertEqual(hash(d), orig_hash)
3178 d.foo = 42
3179 d.bar = 42
3180 self.assertEqual(d.foo, 42)
3181 self.assertEqual(d.bar, 42)
3182 def __getattribute__(self, name):
3183 if name == "foo":
3184 return 24
3185 return object.__getattribute__(self, name)
3186 A.__getattribute__ = __getattribute__
3187 self.assertEqual(d.foo, 24)
3188 self.assertEqual(d.bar, 42)
3189 def __getattr__(self, name):
3190 if name in ("spam", "foo", "bar"):
3191 return "hello"
3192 raise AttributeError(name)
3193 B.__getattr__ = __getattr__
3194 self.assertEqual(d.spam, "hello")
3195 self.assertEqual(d.foo, 24)
3196 self.assertEqual(d.bar, 42)
3197 del A.__getattribute__
3198 self.assertEqual(d.foo, 42)
3199 del d.foo
3200 self.assertEqual(d.foo, "hello")
3201 self.assertEqual(d.bar, 42)
3202 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003203 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003204 d.foo
3205 except AttributeError:
3206 pass
3207 else:
3208 self.fail("d.foo should be undefined now")
3209
3210 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl479a7e72008-02-05 18:13:15 +00003211 class A(object):
3212 pass
3213 class B(A):
3214 pass
3215 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003216 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003217 A.__setitem__ = lambda *a: None # crash
3218
3219 def test_buffer_inheritance(self):
3220 # Testing that buffer interface is inherited ...
3221
3222 import binascii
3223 # SF bug [#470040] ParseTuple t# vs subclasses.
3224
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003225 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003226 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003227 base = b'abc'
3228 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003229 # b2a_hex uses the buffer interface to get its argument's value, via
3230 # PyArg_ParseTuple 't#' code.
3231 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3232
Georg Brandl479a7e72008-02-05 18:13:15 +00003233 class MyInt(int):
3234 pass
3235 m = MyInt(42)
3236 try:
3237 binascii.b2a_hex(m)
3238 self.fail('subclass of int should not have a buffer interface')
3239 except TypeError:
3240 pass
3241
3242 def test_str_of_str_subclass(self):
3243 # Testing __str__ defined in subclass of str ...
3244 import binascii
3245 import io
3246
3247 class octetstring(str):
3248 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003249 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003250 def __repr__(self):
3251 return self + " repr"
3252
3253 o = octetstring('A')
3254 self.assertEqual(type(o), octetstring)
3255 self.assertEqual(type(str(o)), str)
3256 self.assertEqual(type(repr(o)), str)
3257 self.assertEqual(ord(o), 0x41)
3258 self.assertEqual(str(o), '41')
3259 self.assertEqual(repr(o), 'A repr')
3260 self.assertEqual(o.__str__(), '41')
3261 self.assertEqual(o.__repr__(), 'A repr')
3262
3263 capture = io.StringIO()
3264 # Calling str() or not exercises different internal paths.
3265 print(o, file=capture)
3266 print(str(o), file=capture)
3267 self.assertEqual(capture.getvalue(), '41\n41\n')
3268 capture.close()
3269
3270 def test_keyword_arguments(self):
3271 # Testing keyword arguments to __init__, __call__...
3272 def f(a): return a
3273 self.assertEqual(f.__call__(a=42), 42)
3274 a = []
3275 list.__init__(a, sequence=[0, 1, 2])
3276 self.assertEqual(a, [0, 1, 2])
3277
3278 def test_recursive_call(self):
3279 # Testing recursive __call__() by setting to instance of class...
3280 class A(object):
3281 pass
3282
3283 A.__call__ = A()
3284 try:
3285 A()()
3286 except RuntimeError:
3287 pass
3288 else:
3289 self.fail("Recursion limit should have been reached for __call__()")
3290
3291 def test_delete_hook(self):
3292 # Testing __del__ hook...
3293 log = []
3294 class C(object):
3295 def __del__(self):
3296 log.append(1)
3297 c = C()
3298 self.assertEqual(log, [])
3299 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003300 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003301 self.assertEqual(log, [1])
3302
3303 class D(object): pass
3304 d = D()
3305 try: del d[0]
3306 except TypeError: pass
3307 else: self.fail("invalid del() didn't raise TypeError")
3308
3309 def test_hash_inheritance(self):
3310 # Testing hash of mutable subclasses...
3311
3312 class mydict(dict):
3313 pass
3314 d = mydict()
3315 try:
3316 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003317 except TypeError:
3318 pass
3319 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003320 self.fail("hash() of dict subclass should fail")
3321
3322 class mylist(list):
3323 pass
3324 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003325 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003326 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003327 except TypeError:
3328 pass
3329 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003330 self.fail("hash() of list subclass should fail")
3331
3332 def test_str_operations(self):
3333 try: 'a' + 5
3334 except TypeError: pass
3335 else: self.fail("'' + 5 doesn't raise TypeError")
3336
3337 try: ''.split('')
3338 except ValueError: pass
3339 else: self.fail("''.split('') doesn't raise ValueError")
3340
3341 try: ''.join([0])
3342 except TypeError: pass
3343 else: self.fail("''.join([0]) doesn't raise TypeError")
3344
3345 try: ''.rindex('5')
3346 except ValueError: pass
3347 else: self.fail("''.rindex('5') doesn't raise ValueError")
3348
3349 try: '%(n)s' % None
3350 except TypeError: pass
3351 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3352
3353 try: '%(n' % {}
3354 except ValueError: pass
3355 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3356
3357 try: '%*s' % ('abc')
3358 except TypeError: pass
3359 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3360
3361 try: '%*.*s' % ('abc', 5)
3362 except TypeError: pass
3363 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3364
3365 try: '%s' % (1, 2)
3366 except TypeError: pass
3367 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3368
3369 try: '%' % None
3370 except ValueError: pass
3371 else: self.fail("'%' % None doesn't raise ValueError")
3372
3373 self.assertEqual('534253'.isdigit(), 1)
3374 self.assertEqual('534253x'.isdigit(), 0)
3375 self.assertEqual('%c' % 5, '\x05')
3376 self.assertEqual('%c' % '5', '5')
3377
3378 def test_deepcopy_recursive(self):
3379 # Testing deepcopy of recursive objects...
3380 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003381 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003382 a = Node()
3383 b = Node()
3384 a.b = b
3385 b.a = a
3386 z = deepcopy(a) # This blew up before
3387
3388 def test_unintialized_modules(self):
3389 # Testing uninitialized module objects...
3390 from types import ModuleType as M
3391 m = M.__new__(M)
3392 str(m)
3393 self.assertEqual(hasattr(m, "__name__"), 0)
3394 self.assertEqual(hasattr(m, "__file__"), 0)
3395 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003396 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003397 m.foo = 1
3398 self.assertEqual(m.__dict__, {"foo": 1})
3399
3400 def test_funny_new(self):
3401 # Testing __new__ returning something unexpected...
3402 class C(object):
3403 def __new__(cls, arg):
3404 if isinstance(arg, str): return [1, 2, 3]
3405 elif isinstance(arg, int): return object.__new__(D)
3406 else: return object.__new__(cls)
3407 class D(C):
3408 def __init__(self, arg):
3409 self.foo = arg
3410 self.assertEqual(C("1"), [1, 2, 3])
3411 self.assertEqual(D("1"), [1, 2, 3])
3412 d = D(None)
3413 self.assertEqual(d.foo, None)
3414 d = C(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003415 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003416 self.assertEqual(d.foo, 1)
3417 d = D(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003418 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003419 self.assertEqual(d.foo, 1)
3420
3421 def test_imul_bug(self):
3422 # Testing for __imul__ problems...
3423 # SF bug 544647
3424 class C(object):
3425 def __imul__(self, other):
3426 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003427 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003428 y = x
3429 y *= 1.0
3430 self.assertEqual(y, (x, 1.0))
3431 y = x
3432 y *= 2
3433 self.assertEqual(y, (x, 2))
3434 y = x
3435 y *= 3
3436 self.assertEqual(y, (x, 3))
3437 y = x
3438 y *= 1<<100
3439 self.assertEqual(y, (x, 1<<100))
3440 y = x
3441 y *= None
3442 self.assertEqual(y, (x, None))
3443 y = x
3444 y *= "foo"
3445 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003446
Georg Brandl479a7e72008-02-05 18:13:15 +00003447 def test_copy_setstate(self):
3448 # Testing that copy.*copy() correctly uses __setstate__...
3449 import copy
3450 class C(object):
3451 def __init__(self, foo=None):
3452 self.foo = foo
3453 self.__foo = foo
3454 def setfoo(self, foo=None):
3455 self.foo = foo
3456 def getfoo(self):
3457 return self.__foo
3458 def __getstate__(self):
3459 return [self.foo]
3460 def __setstate__(self_, lst):
3461 self.assertEqual(len(lst), 1)
3462 self_.__foo = self_.foo = lst[0]
3463 a = C(42)
3464 a.setfoo(24)
3465 self.assertEqual(a.foo, 24)
3466 self.assertEqual(a.getfoo(), 42)
3467 b = copy.copy(a)
3468 self.assertEqual(b.foo, 24)
3469 self.assertEqual(b.getfoo(), 24)
3470 b = copy.deepcopy(a)
3471 self.assertEqual(b.foo, 24)
3472 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003473
Georg Brandl479a7e72008-02-05 18:13:15 +00003474 def test_slices(self):
3475 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003476
Georg Brandl479a7e72008-02-05 18:13:15 +00003477 # Strings
3478 self.assertEqual("hello"[:4], "hell")
3479 self.assertEqual("hello"[slice(4)], "hell")
3480 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3481 class S(str):
3482 def __getitem__(self, x):
3483 return str.__getitem__(self, x)
3484 self.assertEqual(S("hello")[:4], "hell")
3485 self.assertEqual(S("hello")[slice(4)], "hell")
3486 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3487 # Tuples
3488 self.assertEqual((1,2,3)[:2], (1,2))
3489 self.assertEqual((1,2,3)[slice(2)], (1,2))
3490 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3491 class T(tuple):
3492 def __getitem__(self, x):
3493 return tuple.__getitem__(self, x)
3494 self.assertEqual(T((1,2,3))[:2], (1,2))
3495 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3496 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3497 # Lists
3498 self.assertEqual([1,2,3][:2], [1,2])
3499 self.assertEqual([1,2,3][slice(2)], [1,2])
3500 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3501 class L(list):
3502 def __getitem__(self, x):
3503 return list.__getitem__(self, x)
3504 self.assertEqual(L([1,2,3])[:2], [1,2])
3505 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3506 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3507 # Now do lists and __setitem__
3508 a = L([1,2,3])
3509 a[slice(1, 3)] = [3,2]
3510 self.assertEqual(a, [1,3,2])
3511 a[slice(0, 2, 1)] = [3,1]
3512 self.assertEqual(a, [3,1,2])
3513 a.__setitem__(slice(1, 3), [2,1])
3514 self.assertEqual(a, [3,2,1])
3515 a.__setitem__(slice(0, 2, 1), [2,3])
3516 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003517
Georg Brandl479a7e72008-02-05 18:13:15 +00003518 def test_subtype_resurrection(self):
3519 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003520
Georg Brandl479a7e72008-02-05 18:13:15 +00003521 class C(object):
3522 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003523
Georg Brandl479a7e72008-02-05 18:13:15 +00003524 def __del__(self):
3525 # resurrect the instance
3526 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003527
Georg Brandl479a7e72008-02-05 18:13:15 +00003528 c = C()
3529 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003530
Benjamin Petersone549ead2009-03-28 21:42:05 +00003531 # The most interesting thing here is whether this blows up, due to
3532 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3533 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003534 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003535
Georg Brandl479a7e72008-02-05 18:13:15 +00003536 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003537 # the last container slot works: that will attempt to delete c again,
3538 # which will cause c to get appended back to the container again
3539 # "during" the del. (On non-CPython implementations, however, __del__
3540 # is typically not called again.)
3541 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003542 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003543 del C.container[-1]
3544 if support.check_impl_detail():
3545 support.gc_collect()
3546 self.assertEqual(len(C.container), 1)
3547 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003548
Georg Brandl479a7e72008-02-05 18:13:15 +00003549 # Make c mortal again, so that the test framework with -l doesn't report
3550 # it as a leak.
3551 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003552
Georg Brandl479a7e72008-02-05 18:13:15 +00003553 def test_slots_trash(self):
3554 # Testing slot trash...
3555 # Deallocating deeply nested slotted trash caused stack overflows
3556 class trash(object):
3557 __slots__ = ['x']
3558 def __init__(self, x):
3559 self.x = x
3560 o = None
3561 for i in range(50000):
3562 o = trash(o)
3563 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003564
Georg Brandl479a7e72008-02-05 18:13:15 +00003565 def test_slots_multiple_inheritance(self):
3566 # SF bug 575229, multiple inheritance w/ slots dumps core
3567 class A(object):
3568 __slots__=()
3569 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003570 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003571 class C(A,B) :
3572 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003573 if support.check_impl_detail():
3574 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003575 self.assertTrue(hasattr(C, '__dict__'))
3576 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl479a7e72008-02-05 18:13:15 +00003577 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003578
Georg Brandl479a7e72008-02-05 18:13:15 +00003579 def test_rmul(self):
3580 # Testing correct invocation of __rmul__...
3581 # SF patch 592646
3582 class C(object):
3583 def __mul__(self, other):
3584 return "mul"
3585 def __rmul__(self, other):
3586 return "rmul"
3587 a = C()
3588 self.assertEqual(a*2, "mul")
3589 self.assertEqual(a*2.2, "mul")
3590 self.assertEqual(2*a, "rmul")
3591 self.assertEqual(2.2*a, "rmul")
3592
3593 def test_ipow(self):
3594 # Testing correct invocation of __ipow__...
3595 # [SF bug 620179]
3596 class C(object):
3597 def __ipow__(self, other):
3598 pass
3599 a = C()
3600 a **= 2
3601
3602 def test_mutable_bases(self):
3603 # Testing mutable bases...
3604
3605 # stuff that should work:
3606 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003607 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003608 class C2(object):
3609 def __getattribute__(self, attr):
3610 if attr == 'a':
3611 return 2
3612 else:
3613 return super(C2, self).__getattribute__(attr)
3614 def meth(self):
3615 return 1
3616 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003617 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003618 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003619 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003620 d = D()
3621 e = E()
3622 D.__bases__ = (C,)
3623 D.__bases__ = (C2,)
3624 self.assertEqual(d.meth(), 1)
3625 self.assertEqual(e.meth(), 1)
3626 self.assertEqual(d.a, 2)
3627 self.assertEqual(e.a, 2)
3628 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003629
Georg Brandl479a7e72008-02-05 18:13:15 +00003630 try:
3631 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003632 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003633 pass
3634 else:
3635 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003636
Georg Brandl479a7e72008-02-05 18:13:15 +00003637 try:
3638 D.__bases__ = ()
3639 except TypeError as msg:
3640 if str(msg) == "a new-style class can't have only classic bases":
3641 self.fail("wrong error message for .__bases__ = ()")
3642 else:
3643 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003644
Georg Brandl479a7e72008-02-05 18:13:15 +00003645 try:
3646 D.__bases__ = (D,)
3647 except TypeError:
3648 pass
3649 else:
3650 # actually, we'll have crashed by here...
3651 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003652
Georg Brandl479a7e72008-02-05 18:13:15 +00003653 try:
3654 D.__bases__ = (C, C)
3655 except TypeError:
3656 pass
3657 else:
3658 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003659
Georg Brandl479a7e72008-02-05 18:13:15 +00003660 try:
3661 D.__bases__ = (E,)
3662 except TypeError:
3663 pass
3664 else:
3665 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003666
Benjamin Petersonae937c02009-04-18 20:54:08 +00003667 def test_builtin_bases(self):
3668 # Make sure all the builtin types can have their base queried without
3669 # segfaulting. See issue #5787.
3670 builtin_types = [tp for tp in builtins.__dict__.values()
3671 if isinstance(tp, type)]
3672 for tp in builtin_types:
3673 object.__getattribute__(tp, "__bases__")
3674 if tp is not object:
3675 self.assertEqual(len(tp.__bases__), 1, tp)
3676
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003677 class L(list):
3678 pass
3679
3680 class C(object):
3681 pass
3682
3683 class D(C):
3684 pass
3685
3686 try:
3687 L.__bases__ = (dict,)
3688 except TypeError:
3689 pass
3690 else:
3691 self.fail("shouldn't turn list subclass into dict subclass")
3692
3693 try:
3694 list.__bases__ = (dict,)
3695 except TypeError:
3696 pass
3697 else:
3698 self.fail("shouldn't be able to assign to list.__bases__")
3699
3700 try:
3701 D.__bases__ = (C, list)
3702 except TypeError:
3703 pass
3704 else:
3705 assert 0, "best_base calculation found wanting"
3706
Benjamin Petersonae937c02009-04-18 20:54:08 +00003707
Georg Brandl479a7e72008-02-05 18:13:15 +00003708 def test_mutable_bases_with_failing_mro(self):
3709 # Testing mutable bases with failing mro...
3710 class WorkOnce(type):
3711 def __new__(self, name, bases, ns):
3712 self.flag = 0
3713 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3714 def mro(self):
3715 if self.flag > 0:
3716 raise RuntimeError("bozo")
3717 else:
3718 self.flag += 1
3719 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003720
Georg Brandl479a7e72008-02-05 18:13:15 +00003721 class WorkAlways(type):
3722 def mro(self):
3723 # this is here to make sure that .mro()s aren't called
3724 # with an exception set (which was possible at one point).
3725 # An error message will be printed in a debug build.
3726 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003727 return type.mro(self)
3728
Georg Brandl479a7e72008-02-05 18:13:15 +00003729 class C(object):
3730 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003731
Georg Brandl479a7e72008-02-05 18:13:15 +00003732 class C2(object):
3733 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003734
Georg Brandl479a7e72008-02-05 18:13:15 +00003735 class D(C):
3736 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003737
Georg Brandl479a7e72008-02-05 18:13:15 +00003738 class E(D):
3739 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003740
Georg Brandl479a7e72008-02-05 18:13:15 +00003741 class F(D, metaclass=WorkOnce):
3742 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003743
Georg Brandl479a7e72008-02-05 18:13:15 +00003744 class G(D, metaclass=WorkAlways):
3745 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003746
Georg Brandl479a7e72008-02-05 18:13:15 +00003747 # Immediate subclasses have their mro's adjusted in alphabetical
3748 # order, so E's will get adjusted before adjusting F's fails. We
3749 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003750
Georg Brandl479a7e72008-02-05 18:13:15 +00003751 E_mro_before = E.__mro__
3752 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003753
Armin Rigofd163f92005-12-29 15:59:19 +00003754 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003755 D.__bases__ = (C2,)
3756 except RuntimeError:
3757 self.assertEqual(E.__mro__, E_mro_before)
3758 self.assertEqual(D.__mro__, D_mro_before)
3759 else:
3760 self.fail("exception not propagated")
3761
3762 def test_mutable_bases_catch_mro_conflict(self):
3763 # Testing mutable bases catch mro conflict...
3764 class A(object):
3765 pass
3766
3767 class B(object):
3768 pass
3769
3770 class C(A, B):
3771 pass
3772
3773 class D(A, B):
3774 pass
3775
3776 class E(C, D):
3777 pass
3778
3779 try:
3780 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003781 except TypeError:
3782 pass
3783 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003784 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003785
Georg Brandl479a7e72008-02-05 18:13:15 +00003786 def test_mutable_names(self):
3787 # Testing mutable names...
3788 class C(object):
3789 pass
3790
3791 # C.__module__ could be 'test_descr' or '__main__'
3792 mod = C.__module__
3793
3794 C.__name__ = 'D'
3795 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3796
3797 C.__name__ = 'D.E'
3798 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3799
3800 def test_subclass_right_op(self):
3801 # Testing correct dispatch of subclass overloading __r<op>__...
3802
3803 # This code tests various cases where right-dispatch of a subclass
3804 # should be preferred over left-dispatch of a base class.
3805
3806 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3807
3808 class B(int):
3809 def __floordiv__(self, other):
3810 return "B.__floordiv__"
3811 def __rfloordiv__(self, other):
3812 return "B.__rfloordiv__"
3813
3814 self.assertEqual(B(1) // 1, "B.__floordiv__")
3815 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3816
3817 # Case 2: subclass of object; this is just the baseline for case 3
3818
3819 class C(object):
3820 def __floordiv__(self, other):
3821 return "C.__floordiv__"
3822 def __rfloordiv__(self, other):
3823 return "C.__rfloordiv__"
3824
3825 self.assertEqual(C() // 1, "C.__floordiv__")
3826 self.assertEqual(1 // C(), "C.__rfloordiv__")
3827
3828 # Case 3: subclass of new-style class; here it gets interesting
3829
3830 class D(C):
3831 def __floordiv__(self, other):
3832 return "D.__floordiv__"
3833 def __rfloordiv__(self, other):
3834 return "D.__rfloordiv__"
3835
3836 self.assertEqual(D() // C(), "D.__floordiv__")
3837 self.assertEqual(C() // D(), "D.__rfloordiv__")
3838
3839 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3840
3841 class E(C):
3842 pass
3843
3844 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3845
3846 self.assertEqual(E() // 1, "C.__floordiv__")
3847 self.assertEqual(1 // E(), "C.__rfloordiv__")
3848 self.assertEqual(E() // C(), "C.__floordiv__")
3849 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3850
Benjamin Petersone549ead2009-03-28 21:42:05 +00003851 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003852 def test_meth_class_get(self):
3853 # Testing __get__ method of METH_CLASS C methods...
3854 # Full coverage of descrobject.c::classmethod_get()
3855
3856 # Baseline
3857 arg = [1, 2, 3]
3858 res = {1: None, 2: None, 3: None}
3859 self.assertEqual(dict.fromkeys(arg), res)
3860 self.assertEqual({}.fromkeys(arg), res)
3861
3862 # Now get the descriptor
3863 descr = dict.__dict__["fromkeys"]
3864
3865 # More baseline using the descriptor directly
3866 self.assertEqual(descr.__get__(None, dict)(arg), res)
3867 self.assertEqual(descr.__get__({})(arg), res)
3868
3869 # Now check various error cases
3870 try:
3871 descr.__get__(None, None)
3872 except TypeError:
3873 pass
3874 else:
3875 self.fail("shouldn't have allowed descr.__get__(None, None)")
3876 try:
3877 descr.__get__(42)
3878 except TypeError:
3879 pass
3880 else:
3881 self.fail("shouldn't have allowed descr.__get__(42)")
3882 try:
3883 descr.__get__(None, 42)
3884 except TypeError:
3885 pass
3886 else:
3887 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3888 try:
3889 descr.__get__(None, int)
3890 except TypeError:
3891 pass
3892 else:
3893 self.fail("shouldn't have allowed descr.__get__(None, int)")
3894
3895 def test_isinst_isclass(self):
3896 # Testing proxy isinstance() and isclass()...
3897 class Proxy(object):
3898 def __init__(self, obj):
3899 self.__obj = obj
3900 def __getattribute__(self, name):
3901 if name.startswith("_Proxy__"):
3902 return object.__getattribute__(self, name)
3903 else:
3904 return getattr(self.__obj, name)
3905 # Test with a classic class
3906 class C:
3907 pass
3908 a = C()
3909 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003910 self.assertIsInstance(a, C) # Baseline
3911 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003912 # Test with a classic subclass
3913 class D(C):
3914 pass
3915 a = D()
3916 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003917 self.assertIsInstance(a, C) # Baseline
3918 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003919 # Test with a new-style class
3920 class C(object):
3921 pass
3922 a = C()
3923 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003924 self.assertIsInstance(a, C) # Baseline
3925 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003926 # Test with a new-style subclass
3927 class D(C):
3928 pass
3929 a = D()
3930 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003931 self.assertIsInstance(a, C) # Baseline
3932 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003933
3934 def test_proxy_super(self):
3935 # Testing super() for a proxy object...
3936 class Proxy(object):
3937 def __init__(self, obj):
3938 self.__obj = obj
3939 def __getattribute__(self, name):
3940 if name.startswith("_Proxy__"):
3941 return object.__getattribute__(self, name)
3942 else:
3943 return getattr(self.__obj, name)
3944
3945 class B(object):
3946 def f(self):
3947 return "B.f"
3948
3949 class C(B):
3950 def f(self):
3951 return super(C, self).f() + "->C.f"
3952
3953 obj = C()
3954 p = Proxy(obj)
3955 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3956
3957 def test_carloverre(self):
3958 # Testing prohibition of Carlo Verre's hack...
3959 try:
3960 object.__setattr__(str, "foo", 42)
3961 except TypeError:
3962 pass
3963 else:
3964 self.fail("Carlo Verre __setattr__ suceeded!")
3965 try:
3966 object.__delattr__(str, "lower")
3967 except TypeError:
3968 pass
3969 else:
3970 self.fail("Carlo Verre __delattr__ succeeded!")
3971
3972 def test_weakref_segfault(self):
3973 # Testing weakref segfault...
3974 # SF 742911
3975 import weakref
3976
3977 class Provoker:
3978 def __init__(self, referrent):
3979 self.ref = weakref.ref(referrent)
3980
3981 def __del__(self):
3982 x = self.ref()
3983
3984 class Oops(object):
3985 pass
3986
3987 o = Oops()
3988 o.whatever = Provoker(o)
3989 del o
3990
3991 def test_wrapper_segfault(self):
3992 # SF 927248: deeply nested wrappers could cause stack overflow
3993 f = lambda:None
3994 for i in range(1000000):
3995 f = f.__call__
3996 f = None
3997
3998 def test_file_fault(self):
3999 # Testing sys.stdout is changed in getattr...
Nick Coghlan6ead5522009-10-18 13:19:33 +00004000 test_stdout = sys.stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004001 class StdoutGuard:
4002 def __getattr__(self, attr):
4003 sys.stdout = sys.__stdout__
4004 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4005 sys.stdout = StdoutGuard()
4006 try:
4007 print("Oops!")
4008 except RuntimeError:
4009 pass
Nick Coghlan6ead5522009-10-18 13:19:33 +00004010 finally:
4011 sys.stdout = test_stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004012
4013 def test_vicious_descriptor_nonsense(self):
4014 # Testing vicious_descriptor_nonsense...
4015
4016 # A potential segfault spotted by Thomas Wouters in mail to
4017 # python-dev 2003-04-17, turned into an example & fixed by Michael
4018 # Hudson just less than four months later...
4019
4020 class Evil(object):
4021 def __hash__(self):
4022 return hash('attr')
4023 def __eq__(self, other):
4024 del C.attr
4025 return 0
4026
4027 class Descr(object):
4028 def __get__(self, ob, type=None):
4029 return 1
4030
4031 class C(object):
4032 attr = Descr()
4033
4034 c = C()
4035 c.__dict__[Evil()] = 0
4036
4037 self.assertEqual(c.attr, 1)
4038 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004039 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004040 self.assertEqual(hasattr(c, 'attr'), False)
4041
4042 def test_init(self):
4043 # SF 1155938
4044 class Foo(object):
4045 def __init__(self):
4046 return 10
4047 try:
4048 Foo()
4049 except TypeError:
4050 pass
4051 else:
4052 self.fail("did not test __init__() for None return")
4053
4054 def test_method_wrapper(self):
4055 # Testing method-wrapper objects...
4056 # <type 'method-wrapper'> did not support any reflection before 2.5
4057
Mark Dickinson211c6252009-02-01 10:28:51 +00004058 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004059
4060 l = []
4061 self.assertEqual(l.__add__, l.__add__)
4062 self.assertEqual(l.__add__, [].__add__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004063 self.assertTrue(l.__add__ != [5].__add__)
4064 self.assertTrue(l.__add__ != l.__mul__)
4065 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004066 if hasattr(l.__add__, '__self__'):
4067 # CPython
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004068 self.assertTrue(l.__add__.__self__ is l)
4069 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Petersone549ead2009-03-28 21:42:05 +00004070 else:
4071 # Python implementations where [].__add__ is a normal bound method
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004072 self.assertTrue(l.__add__.im_self is l)
4073 self.assertTrue(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004074 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4075 try:
4076 hash(l.__add__)
4077 except TypeError:
4078 pass
4079 else:
4080 self.fail("no TypeError from hash([].__add__)")
4081
4082 t = ()
4083 t += (7,)
4084 self.assertEqual(t.__add__, (7,).__add__)
4085 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4086
4087 def test_not_implemented(self):
4088 # Testing NotImplemented...
4089 # all binary methods should be able to return a NotImplemented
Georg Brandl479a7e72008-02-05 18:13:15 +00004090 import operator
4091
4092 def specialmethod(self, other):
4093 return NotImplemented
4094
4095 def check(expr, x, y):
4096 try:
4097 exec(expr, {'x': x, 'y': y, 'operator': operator})
4098 except TypeError:
4099 pass
4100 else:
4101 self.fail("no TypeError from %r" % (expr,))
4102
4103 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4104 # TypeErrors
4105 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4106 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004107 for name, expr, iexpr in [
4108 ('__add__', 'x + y', 'x += y'),
4109 ('__sub__', 'x - y', 'x -= y'),
4110 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004111 ('__truediv__', 'operator.truediv(x, y)', None),
4112 ('__floordiv__', 'operator.floordiv(x, y)', None),
4113 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004114 ('__mod__', 'x % y', 'x %= y'),
4115 ('__divmod__', 'divmod(x, y)', None),
4116 ('__pow__', 'x ** y', 'x **= y'),
4117 ('__lshift__', 'x << y', 'x <<= y'),
4118 ('__rshift__', 'x >> y', 'x >>= y'),
4119 ('__and__', 'x & y', 'x &= y'),
4120 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004121 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004122 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004123 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004124 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004125 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004126 check(expr, a, N1)
4127 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004128 if iexpr:
4129 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004130 check(iexpr, a, N1)
4131 check(iexpr, a, N2)
4132 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004133 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004134 c = C()
4135 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004136 check(iexpr, c, N1)
4137 check(iexpr, c, N2)
4138
Georg Brandl479a7e72008-02-05 18:13:15 +00004139 def test_assign_slice(self):
4140 # ceval.c's assign_slice used to check for
4141 # tp->tp_as_sequence->sq_slice instead of
4142 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004143
Georg Brandl479a7e72008-02-05 18:13:15 +00004144 class C(object):
4145 def __setitem__(self, idx, value):
4146 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004147
Georg Brandl479a7e72008-02-05 18:13:15 +00004148 c = C()
4149 c[1:2] = 3
4150 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004151
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +00004152 def test_set_and_no_get(self):
4153 # See
4154 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4155 class Descr(object):
4156
4157 def __init__(self, name):
4158 self.name = name
4159
4160 def __set__(self, obj, value):
4161 obj.__dict__[self.name] = value
4162 descr = Descr("a")
4163
4164 class X(object):
4165 a = descr
4166
4167 x = X()
4168 self.assertIs(x.a, descr)
4169 x.a = 42
4170 self.assertEqual(x.a, 42)
4171
Benjamin Peterson21896a32010-03-21 22:03:03 +00004172 # Also check type_getattro for correctness.
4173 class Meta(type):
4174 pass
4175 class X(object):
4176 __metaclass__ = Meta
4177 X.a = 42
4178 Meta.a = Descr("a")
4179 self.assertEqual(X.a, 42)
4180
Benjamin Peterson9262b842008-11-17 22:45:50 +00004181 def test_getattr_hooks(self):
4182 # issue 4230
4183
4184 class Descriptor(object):
4185 counter = 0
4186 def __get__(self, obj, objtype=None):
4187 def getter(name):
4188 self.counter += 1
4189 raise AttributeError(name)
4190 return getter
4191
4192 descr = Descriptor()
4193 class A(object):
4194 __getattribute__ = descr
4195 class B(object):
4196 __getattr__ = descr
4197 class C(object):
4198 __getattribute__ = descr
4199 __getattr__ = descr
4200
4201 self.assertRaises(AttributeError, getattr, A(), "attr")
4202 self.assertEquals(descr.counter, 1)
4203 self.assertRaises(AttributeError, getattr, B(), "attr")
4204 self.assertEquals(descr.counter, 2)
4205 self.assertRaises(AttributeError, getattr, C(), "attr")
4206 self.assertEquals(descr.counter, 4)
4207
4208 import gc
4209 class EvilGetattribute(object):
4210 # This used to segfault
4211 def __getattr__(self, name):
4212 raise AttributeError(name)
4213 def __getattribute__(self, name):
4214 del EvilGetattribute.__getattr__
4215 for i in range(5):
4216 gc.collect()
4217 raise AttributeError(name)
4218
4219 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4220
Christian Heimesbbffeb62008-01-24 09:42:52 +00004221
Georg Brandl479a7e72008-02-05 18:13:15 +00004222class DictProxyTests(unittest.TestCase):
4223 def setUp(self):
4224 class C(object):
4225 def meth(self):
4226 pass
4227 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004228
Georg Brandl479a7e72008-02-05 18:13:15 +00004229 def test_iter_keys(self):
4230 # Testing dict-proxy iterkeys...
4231 keys = [ key for key in self.C.__dict__.keys() ]
4232 keys.sort()
4233 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4234 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004235
Georg Brandl479a7e72008-02-05 18:13:15 +00004236 def test_iter_values(self):
4237 # Testing dict-proxy itervalues...
4238 values = [ values for values in self.C.__dict__.values() ]
4239 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004240
Georg Brandl479a7e72008-02-05 18:13:15 +00004241 def test_iter_items(self):
4242 # Testing dict-proxy iteritems...
4243 keys = [ key for (key, value) in self.C.__dict__.items() ]
4244 keys.sort()
4245 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4246 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004247
Georg Brandl479a7e72008-02-05 18:13:15 +00004248 def test_dict_type_with_metaclass(self):
4249 # Testing type of __dict__ when metaclass set...
4250 class B(object):
4251 pass
4252 class M(type):
4253 pass
4254 class C(metaclass=M):
4255 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4256 pass
4257 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004258
Christian Heimesbbffeb62008-01-24 09:42:52 +00004259
Georg Brandl479a7e72008-02-05 18:13:15 +00004260class PTypesLongInitTest(unittest.TestCase):
4261 # This is in its own TestCase so that it can be run before any other tests.
4262 def test_pytype_long_ready(self):
4263 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004264
Georg Brandl479a7e72008-02-05 18:13:15 +00004265 # This dumps core when SF bug 551412 isn't fixed --
4266 # but only when test_descr.py is run separately.
4267 # (That can't be helped -- as soon as PyType_Ready()
4268 # is called for PyLong_Type, the bug is gone.)
4269 class UserLong(object):
4270 def __pow__(self, *args):
4271 pass
4272 try:
4273 pow(0, UserLong(), 0)
4274 except:
4275 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004276
Georg Brandl479a7e72008-02-05 18:13:15 +00004277 # Another segfault only when run early
4278 # (before PyType_Ready(tuple) is called)
4279 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004280
4281
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004282def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004283 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004284 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004285 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004286
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004287if __name__ == "__main__":
4288 test_main()