blob: 09798802f3a32061a43ad2867748ad44b5df2667 [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 Petersonf751bc92010-07-02 13:46:42 +00001584 ("__ceil__", math.ceil, zero, set(), {}),
Benjamin Peterson224205f2009-05-08 03:25:19 +00001585 ]
1586
1587 class Checker(object):
1588 def __getattr__(self, attr, test=self):
1589 test.fail("__getattr__ called with {0}".format(attr))
1590 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001591 if attr not in ok:
1592 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Petersona7205592009-05-27 03:08:59 +00001593 return object.__getattribute__(self, attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001594 class SpecialDescr(object):
1595 def __init__(self, impl):
1596 self.impl = impl
1597 def __get__(self, obj, owner):
1598 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001599 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001600 class MyException(Exception):
1601 pass
1602 class ErrDescr(object):
1603 def __get__(self, obj, owner):
1604 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001605
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001606 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001607 class X(Checker):
1608 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001609 for attr, obj in env.items():
1610 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001611 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001612 runner(X())
1613
1614 record = []
1615 class X(Checker):
1616 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001617 for attr, obj in env.items():
1618 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001619 setattr(X, name, SpecialDescr(meth_impl))
1620 runner(X())
1621 self.assertEqual(record, [1], name)
1622
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001623 class X(Checker):
1624 pass
1625 for attr, obj in env.items():
1626 setattr(X, attr, obj)
1627 setattr(X, name, ErrDescr())
1628 try:
1629 runner(X())
1630 except MyException:
1631 pass
1632 else:
1633 self.fail("{0!r} didn't raise".format(name))
1634
Georg Brandl479a7e72008-02-05 18:13:15 +00001635 def test_specials(self):
1636 # Testing special operators...
1637 # Test operators like __hash__ for which a built-in default exists
1638
1639 # Test the default behavior for static classes
1640 class C(object):
1641 def __getitem__(self, i):
1642 if 0 <= i < 10: return i
1643 raise IndexError
1644 c1 = C()
1645 c2 = C()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001646 self.assertTrue(not not c1) # What?
Georg Brandl479a7e72008-02-05 18:13:15 +00001647 self.assertNotEqual(id(c1), id(c2))
1648 hash(c1)
1649 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001650 self.assertEqual(c1, c1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001651 self.assertTrue(c1 != c2)
1652 self.assertTrue(not c1 != c1)
1653 self.assertTrue(not c1 == c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001654 # Note that the module name appears in str/repr, and that varies
1655 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001656 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001657 self.assertEqual(str(c1), repr(c1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001658 self.assertNotIn(-1, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001659 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001660 self.assertIn(i, c1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001661 self.assertNotIn(10, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001662 # Test the default behavior for dynamic classes
1663 class D(object):
1664 def __getitem__(self, i):
1665 if 0 <= i < 10: return i
1666 raise IndexError
1667 d1 = D()
1668 d2 = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001669 self.assertTrue(not not d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001670 self.assertNotEqual(id(d1), id(d2))
1671 hash(d1)
1672 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001673 self.assertEqual(d1, d1)
1674 self.assertNotEqual(d1, d2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001675 self.assertTrue(not d1 != d1)
1676 self.assertTrue(not d1 == d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001677 # Note that the module name appears in str/repr, and that varies
1678 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001679 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001680 self.assertEqual(str(d1), repr(d1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001681 self.assertNotIn(-1, d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001682 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001683 self.assertIn(i, d1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001684 self.assertNotIn(10, d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001685 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001686 class Proxy(object):
1687 def __init__(self, x):
1688 self.x = x
1689 def __bool__(self):
1690 return not not self.x
1691 def __hash__(self):
1692 return hash(self.x)
1693 def __eq__(self, other):
1694 return self.x == other
1695 def __ne__(self, other):
1696 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001697 def __ge__(self, other):
1698 return self.x >= other
1699 def __gt__(self, other):
1700 return self.x > other
1701 def __le__(self, other):
1702 return self.x <= other
1703 def __lt__(self, other):
1704 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001705 def __str__(self):
1706 return "Proxy:%s" % self.x
1707 def __repr__(self):
1708 return "Proxy(%r)" % self.x
1709 def __contains__(self, value):
1710 return value in self.x
1711 p0 = Proxy(0)
1712 p1 = Proxy(1)
1713 p_1 = Proxy(-1)
1714 self.assertFalse(p0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001715 self.assertTrue(not not p1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001716 self.assertEqual(hash(p0), hash(0))
1717 self.assertEqual(p0, p0)
1718 self.assertNotEqual(p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001719 self.assertTrue(not p0 != p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001720 self.assertEqual(not p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001721 self.assertTrue(p0 < p1)
1722 self.assertTrue(p0 <= p1)
1723 self.assertTrue(p1 > p0)
1724 self.assertTrue(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001725 self.assertEqual(str(p0), "Proxy:0")
1726 self.assertEqual(repr(p0), "Proxy(0)")
1727 p10 = Proxy(range(10))
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001728 self.assertNotIn(-1, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001729 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001730 self.assertIn(i, p10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001731 self.assertNotIn(10, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001732
Georg Brandl479a7e72008-02-05 18:13:15 +00001733 def test_weakrefs(self):
1734 # Testing weak references...
1735 import weakref
1736 class C(object):
1737 pass
1738 c = C()
1739 r = weakref.ref(c)
1740 self.assertEqual(r(), c)
1741 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001742 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001743 self.assertEqual(r(), None)
1744 del r
1745 class NoWeak(object):
1746 __slots__ = ['foo']
1747 no = NoWeak()
1748 try:
1749 weakref.ref(no)
1750 except TypeError as msg:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001751 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001752 else:
1753 self.fail("weakref.ref(no) should be illegal")
1754 class Weak(object):
1755 __slots__ = ['foo', '__weakref__']
1756 yes = Weak()
1757 r = weakref.ref(yes)
1758 self.assertEqual(r(), yes)
1759 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001760 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001761 self.assertEqual(r(), None)
1762 del r
1763
1764 def test_properties(self):
1765 # Testing property...
1766 class C(object):
1767 def getx(self):
1768 return self.__x
1769 def setx(self, value):
1770 self.__x = value
1771 def delx(self):
1772 del self.__x
1773 x = property(getx, setx, delx, doc="I'm the x property.")
1774 a = C()
1775 self.assertFalse(hasattr(a, "x"))
1776 a.x = 42
1777 self.assertEqual(a._C__x, 42)
1778 self.assertEqual(a.x, 42)
1779 del a.x
1780 self.assertFalse(hasattr(a, "x"))
1781 self.assertFalse(hasattr(a, "_C__x"))
1782 C.x.__set__(a, 100)
1783 self.assertEqual(C.x.__get__(a), 100)
1784 C.x.__delete__(a)
1785 self.assertFalse(hasattr(a, "x"))
1786
1787 raw = C.__dict__['x']
Ezio Melottie9615932010-01-24 19:26:24 +00001788 self.assertIsInstance(raw, property)
Georg Brandl479a7e72008-02-05 18:13:15 +00001789
1790 attrs = dir(raw)
Benjamin Peterson577473f2010-01-19 00:09:57 +00001791 self.assertIn("__doc__", attrs)
1792 self.assertIn("fget", attrs)
1793 self.assertIn("fset", attrs)
1794 self.assertIn("fdel", attrs)
Georg Brandl479a7e72008-02-05 18:13:15 +00001795
1796 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001797 self.assertTrue(raw.fget is C.__dict__['getx'])
1798 self.assertTrue(raw.fset is C.__dict__['setx'])
1799 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl479a7e72008-02-05 18:13:15 +00001800
1801 for attr in "__doc__", "fget", "fset", "fdel":
1802 try:
1803 setattr(raw, attr, 42)
1804 except AttributeError as msg:
1805 if str(msg).find('readonly') < 0:
1806 self.fail("when setting readonly attr %r on a property, "
1807 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1808 else:
1809 self.fail("expected AttributeError from trying to set readonly %r "
1810 "attr on a property" % attr)
1811
1812 class D(object):
1813 __getitem__ = property(lambda s: 1/0)
1814
1815 d = D()
1816 try:
1817 for i in d:
1818 str(i)
1819 except ZeroDivisionError:
1820 pass
1821 else:
1822 self.fail("expected ZeroDivisionError from bad property")
1823
R. David Murray378c0cf2010-02-24 01:46:21 +00001824 @unittest.skipIf(sys.flags.optimize >= 2,
1825 "Docstrings are omitted with -O2 and above")
1826 def test_properties_doc_attrib(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001827 class E(object):
1828 def getter(self):
1829 "getter method"
1830 return 0
1831 def setter(self_, value):
1832 "setter method"
1833 pass
1834 prop = property(getter)
1835 self.assertEqual(prop.__doc__, "getter method")
1836 prop2 = property(fset=setter)
1837 self.assertEqual(prop2.__doc__, None)
1838
R. David Murray378c0cf2010-02-24 01:46:21 +00001839 def test_testcapi_no_segfault(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001840 # this segfaulted in 2.5b2
1841 try:
1842 import _testcapi
1843 except ImportError:
1844 pass
1845 else:
1846 class X(object):
1847 p = property(_testcapi.test_with_docstring)
1848
1849 def test_properties_plus(self):
1850 class C(object):
1851 foo = property(doc="hello")
1852 @foo.getter
1853 def foo(self):
1854 return self._foo
1855 @foo.setter
1856 def foo(self, value):
1857 self._foo = abs(value)
1858 @foo.deleter
1859 def foo(self):
1860 del self._foo
1861 c = C()
1862 self.assertEqual(C.foo.__doc__, "hello")
1863 self.assertFalse(hasattr(c, "foo"))
1864 c.foo = -42
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001865 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl479a7e72008-02-05 18:13:15 +00001866 self.assertEqual(c._foo, 42)
1867 self.assertEqual(c.foo, 42)
1868 del c.foo
1869 self.assertFalse(hasattr(c, '_foo'))
1870 self.assertFalse(hasattr(c, "foo"))
1871
1872 class D(C):
1873 @C.foo.deleter
1874 def foo(self):
1875 try:
1876 del self._foo
1877 except AttributeError:
1878 pass
1879 d = D()
1880 d.foo = 24
1881 self.assertEqual(d.foo, 24)
1882 del d.foo
1883 del d.foo
1884
1885 class E(object):
1886 @property
1887 def foo(self):
1888 return self._foo
1889 @foo.setter
1890 def foo(self, value):
1891 raise RuntimeError
1892 @foo.setter
1893 def foo(self, value):
1894 self._foo = abs(value)
1895 @foo.deleter
1896 def foo(self, value=None):
1897 del self._foo
1898
1899 e = E()
1900 e.foo = -42
1901 self.assertEqual(e.foo, 42)
1902 del e.foo
1903
1904 class F(E):
1905 @E.foo.deleter
1906 def foo(self):
1907 del self._foo
1908 @foo.setter
1909 def foo(self, value):
1910 self._foo = max(0, value)
1911 f = F()
1912 f.foo = -10
1913 self.assertEqual(f.foo, 0)
1914 del f.foo
1915
1916 def test_dict_constructors(self):
1917 # Testing dict constructor ...
1918 d = dict()
1919 self.assertEqual(d, {})
1920 d = dict({})
1921 self.assertEqual(d, {})
1922 d = dict({1: 2, 'a': 'b'})
1923 self.assertEqual(d, {1: 2, 'a': 'b'})
1924 self.assertEqual(d, dict(list(d.items())))
1925 self.assertEqual(d, dict(iter(d.items())))
1926 d = dict({'one':1, 'two':2})
1927 self.assertEqual(d, dict(one=1, two=2))
1928 self.assertEqual(d, dict(**d))
1929 self.assertEqual(d, dict({"one": 1}, two=2))
1930 self.assertEqual(d, dict([("two", 2)], one=1))
1931 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1932 self.assertEqual(d, dict(**d))
1933
1934 for badarg in 0, 0, 0j, "0", [0], (0,):
1935 try:
1936 dict(badarg)
1937 except TypeError:
1938 pass
1939 except ValueError:
1940 if badarg == "0":
1941 # It's a sequence, and its elements are also sequences (gotta
1942 # love strings <wink>), but they aren't of length 2, so this
1943 # one seemed better as a ValueError than a TypeError.
1944 pass
1945 else:
1946 self.fail("no TypeError from dict(%r)" % badarg)
1947 else:
1948 self.fail("no TypeError from dict(%r)" % badarg)
1949
1950 try:
1951 dict({}, {})
1952 except TypeError:
1953 pass
1954 else:
1955 self.fail("no TypeError from dict({}, {})")
1956
1957 class Mapping:
1958 # Lacks a .keys() method; will be added later.
1959 dict = {1:2, 3:4, 'a':1j}
1960
1961 try:
1962 dict(Mapping())
1963 except TypeError:
1964 pass
1965 else:
1966 self.fail("no TypeError from dict(incomplete mapping)")
1967
1968 Mapping.keys = lambda self: list(self.dict.keys())
1969 Mapping.__getitem__ = lambda self, i: self.dict[i]
1970 d = dict(Mapping())
1971 self.assertEqual(d, Mapping.dict)
1972
1973 # Init from sequence of iterable objects, each producing a 2-sequence.
1974 class AddressBookEntry:
1975 def __init__(self, first, last):
1976 self.first = first
1977 self.last = last
1978 def __iter__(self):
1979 return iter([self.first, self.last])
1980
1981 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1982 AddressBookEntry('Barry', 'Peters'),
1983 AddressBookEntry('Tim', 'Peters'),
1984 AddressBookEntry('Barry', 'Warsaw')])
1985 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1986
1987 d = dict(zip(range(4), range(1, 5)))
1988 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1989
1990 # Bad sequence lengths.
1991 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1992 try:
1993 dict(bad)
1994 except ValueError:
1995 pass
1996 else:
1997 self.fail("no ValueError from dict(%r)" % bad)
1998
1999 def test_dir(self):
2000 # Testing dir() ...
2001 junk = 12
2002 self.assertEqual(dir(), ['junk', 'self'])
2003 del junk
2004
2005 # Just make sure these don't blow up!
2006 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
2007 dir(arg)
2008
2009 # Test dir on new-style classes. Since these have object as a
2010 # base class, a lot more gets sucked in.
2011 def interesting(strings):
2012 return [s for s in strings if not s.startswith('_')]
2013
2014 class C(object):
2015 Cdata = 1
2016 def Cmethod(self): pass
2017
2018 cstuff = ['Cdata', 'Cmethod']
2019 self.assertEqual(interesting(dir(C)), cstuff)
2020
2021 c = C()
2022 self.assertEqual(interesting(dir(c)), cstuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002023 ## self.assertIn('__self__', dir(C.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002024
2025 c.cdata = 2
2026 c.cmethod = lambda self: 0
2027 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002028 ## self.assertIn('__self__', dir(c.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002029
2030 class A(C):
2031 Adata = 1
2032 def Amethod(self): pass
2033
2034 astuff = ['Adata', 'Amethod'] + cstuff
2035 self.assertEqual(interesting(dir(A)), astuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002036 ## self.assertIn('__self__', dir(A.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002037 a = A()
2038 self.assertEqual(interesting(dir(a)), astuff)
2039 a.adata = 42
2040 a.amethod = lambda self: 3
2041 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002042 ## self.assertIn('__self__', dir(a.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002043
2044 # Try a module subclass.
Georg Brandl479a7e72008-02-05 18:13:15 +00002045 class M(type(sys)):
2046 pass
2047 minstance = M("m")
2048 minstance.b = 2
2049 minstance.a = 1
2050 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2051 self.assertEqual(names, ['a', 'b'])
2052
2053 class M2(M):
2054 def getdict(self):
2055 return "Not a dict!"
2056 __dict__ = property(getdict)
2057
2058 m2instance = M2("m2")
2059 m2instance.b = 2
2060 m2instance.a = 1
2061 self.assertEqual(m2instance.__dict__, "Not a dict!")
2062 try:
2063 dir(m2instance)
2064 except TypeError:
2065 pass
2066
2067 # Two essentially featureless objects, just inheriting stuff from
2068 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002069 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2070 if support.check_impl_detail():
2071 # None differs in PyPy: it has a __nonzero__
2072 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002073
2074 # Nasty test case for proxied objects
2075 class Wrapper(object):
2076 def __init__(self, obj):
2077 self.__obj = obj
2078 def __repr__(self):
2079 return "Wrapper(%s)" % repr(self.__obj)
2080 def __getitem__(self, key):
2081 return Wrapper(self.__obj[key])
2082 def __len__(self):
2083 return len(self.__obj)
2084 def __getattr__(self, name):
2085 return Wrapper(getattr(self.__obj, name))
2086
2087 class C(object):
2088 def __getclass(self):
2089 return Wrapper(type(self))
2090 __class__ = property(__getclass)
2091
2092 dir(C()) # This used to segfault
2093
2094 def test_supers(self):
2095 # Testing super...
2096
2097 class A(object):
2098 def meth(self, a):
2099 return "A(%r)" % a
2100
2101 self.assertEqual(A().meth(1), "A(1)")
2102
2103 class B(A):
2104 def __init__(self):
2105 self.__super = super(B, self)
2106 def meth(self, a):
2107 return "B(%r)" % a + self.__super.meth(a)
2108
2109 self.assertEqual(B().meth(2), "B(2)A(2)")
2110
2111 class C(A):
2112 def meth(self, a):
2113 return "C(%r)" % a + self.__super.meth(a)
2114 C._C__super = super(C)
2115
2116 self.assertEqual(C().meth(3), "C(3)A(3)")
2117
2118 class D(C, B):
2119 def meth(self, a):
2120 return "D(%r)" % a + super(D, self).meth(a)
2121
2122 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2123
2124 # Test for subclassing super
2125
2126 class mysuper(super):
2127 def __init__(self, *args):
2128 return super(mysuper, self).__init__(*args)
2129
2130 class E(D):
2131 def meth(self, a):
2132 return "E(%r)" % a + mysuper(E, self).meth(a)
2133
2134 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2135
2136 class F(E):
2137 def meth(self, a):
2138 s = self.__super # == mysuper(F, self)
2139 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2140 F._F__super = mysuper(F)
2141
2142 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2143
2144 # Make sure certain errors are raised
2145
2146 try:
2147 super(D, 42)
2148 except TypeError:
2149 pass
2150 else:
2151 self.fail("shouldn't allow super(D, 42)")
2152
2153 try:
2154 super(D, C())
2155 except TypeError:
2156 pass
2157 else:
2158 self.fail("shouldn't allow super(D, C())")
2159
2160 try:
2161 super(D).__get__(12)
2162 except TypeError:
2163 pass
2164 else:
2165 self.fail("shouldn't allow super(D).__get__(12)")
2166
2167 try:
2168 super(D).__get__(C())
2169 except TypeError:
2170 pass
2171 else:
2172 self.fail("shouldn't allow super(D).__get__(C())")
2173
2174 # Make sure data descriptors can be overridden and accessed via super
2175 # (new feature in Python 2.3)
2176
2177 class DDbase(object):
2178 def getx(self): return 42
2179 x = property(getx)
2180
2181 class DDsub(DDbase):
2182 def getx(self): return "hello"
2183 x = property(getx)
2184
2185 dd = DDsub()
2186 self.assertEqual(dd.x, "hello")
2187 self.assertEqual(super(DDsub, dd).x, 42)
2188
2189 # Ensure that super() lookup of descriptor from classmethod
2190 # works (SF ID# 743627)
2191
2192 class Base(object):
2193 aProp = property(lambda self: "foo")
2194
2195 class Sub(Base):
2196 @classmethod
2197 def test(klass):
2198 return super(Sub,klass).aProp
2199
2200 self.assertEqual(Sub.test(), Base.aProp)
2201
2202 # Verify that super() doesn't allow keyword args
2203 try:
2204 super(Base, kw=1)
2205 except TypeError:
2206 pass
2207 else:
2208 self.assertEqual("super shouldn't accept keyword args")
2209
2210 def test_basic_inheritance(self):
2211 # Testing inheritance from basic types...
2212
2213 class hexint(int):
2214 def __repr__(self):
2215 return hex(self)
2216 def __add__(self, other):
2217 return hexint(int.__add__(self, other))
2218 # (Note that overriding __radd__ doesn't work,
2219 # because the int type gets first dibs.)
2220 self.assertEqual(repr(hexint(7) + 9), "0x10")
2221 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2222 a = hexint(12345)
2223 self.assertEqual(a, 12345)
2224 self.assertEqual(int(a), 12345)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002225 self.assertTrue(int(a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002226 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002227 self.assertTrue((+a).__class__ is int)
2228 self.assertTrue((a >> 0).__class__ is int)
2229 self.assertTrue((a << 0).__class__ is int)
2230 self.assertTrue((hexint(0) << 12).__class__ is int)
2231 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002232
2233 class octlong(int):
2234 __slots__ = []
2235 def __str__(self):
Mark Dickinson5c2db372009-12-05 20:28:34 +00002236 return oct(self)
Georg Brandl479a7e72008-02-05 18:13:15 +00002237 def __add__(self, other):
2238 return self.__class__(super(octlong, self).__add__(other))
2239 __radd__ = __add__
2240 self.assertEqual(str(octlong(3) + 5), "0o10")
2241 # (Note that overriding __radd__ here only seems to work
2242 # because the example uses a short int left argument.)
2243 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2244 a = octlong(12345)
2245 self.assertEqual(a, 12345)
2246 self.assertEqual(int(a), 12345)
2247 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002248 self.assertTrue(int(a).__class__ is int)
2249 self.assertTrue((+a).__class__ is int)
2250 self.assertTrue((-a).__class__ is int)
2251 self.assertTrue((-octlong(0)).__class__ is int)
2252 self.assertTrue((a >> 0).__class__ is int)
2253 self.assertTrue((a << 0).__class__ is int)
2254 self.assertTrue((a - 0).__class__ is int)
2255 self.assertTrue((a * 1).__class__ is int)
2256 self.assertTrue((a ** 1).__class__ is int)
2257 self.assertTrue((a // 1).__class__ is int)
2258 self.assertTrue((1 * a).__class__ is int)
2259 self.assertTrue((a | 0).__class__ is int)
2260 self.assertTrue((a ^ 0).__class__ is int)
2261 self.assertTrue((a & -1).__class__ is int)
2262 self.assertTrue((octlong(0) << 12).__class__ is int)
2263 self.assertTrue((octlong(0) >> 12).__class__ is int)
2264 self.assertTrue(abs(octlong(0)).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002265
2266 # Because octlong overrides __add__, we can't check the absence of +0
2267 # optimizations using octlong.
2268 class longclone(int):
2269 pass
2270 a = longclone(1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002271 self.assertTrue((a + 0).__class__ is int)
2272 self.assertTrue((0 + a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002273
2274 # Check that negative clones don't segfault
2275 a = longclone(-1)
2276 self.assertEqual(a.__dict__, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002277 self.assertEqual(int(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl479a7e72008-02-05 18:13:15 +00002278
2279 class precfloat(float):
2280 __slots__ = ['prec']
2281 def __init__(self, value=0.0, prec=12):
2282 self.prec = int(prec)
2283 def __repr__(self):
2284 return "%.*g" % (self.prec, self)
2285 self.assertEqual(repr(precfloat(1.1)), "1.1")
2286 a = precfloat(12345)
2287 self.assertEqual(a, 12345.0)
2288 self.assertEqual(float(a), 12345.0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002289 self.assertTrue(float(a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002290 self.assertEqual(hash(a), hash(12345.0))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002291 self.assertTrue((+a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002292
2293 class madcomplex(complex):
2294 def __repr__(self):
2295 return "%.17gj%+.17g" % (self.imag, self.real)
2296 a = madcomplex(-3, 4)
2297 self.assertEqual(repr(a), "4j-3")
2298 base = complex(-3, 4)
2299 self.assertEqual(base.__class__, complex)
2300 self.assertEqual(a, base)
2301 self.assertEqual(complex(a), base)
2302 self.assertEqual(complex(a).__class__, complex)
2303 a = madcomplex(a) # just trying another form of the constructor
2304 self.assertEqual(repr(a), "4j-3")
2305 self.assertEqual(a, base)
2306 self.assertEqual(complex(a), base)
2307 self.assertEqual(complex(a).__class__, complex)
2308 self.assertEqual(hash(a), hash(base))
2309 self.assertEqual((+a).__class__, complex)
2310 self.assertEqual((a + 0).__class__, complex)
2311 self.assertEqual(a + 0, base)
2312 self.assertEqual((a - 0).__class__, complex)
2313 self.assertEqual(a - 0, base)
2314 self.assertEqual((a * 1).__class__, complex)
2315 self.assertEqual(a * 1, base)
2316 self.assertEqual((a / 1).__class__, complex)
2317 self.assertEqual(a / 1, base)
2318
2319 class madtuple(tuple):
2320 _rev = None
2321 def rev(self):
2322 if self._rev is not None:
2323 return self._rev
2324 L = list(self)
2325 L.reverse()
2326 self._rev = self.__class__(L)
2327 return self._rev
2328 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2329 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2330 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2331 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2332 for i in range(512):
2333 t = madtuple(range(i))
2334 u = t.rev()
2335 v = u.rev()
2336 self.assertEqual(v, t)
2337 a = madtuple((1,2,3,4,5))
2338 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002339 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002340 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002341 self.assertTrue(a[:].__class__ is tuple)
2342 self.assertTrue((a * 1).__class__ is tuple)
2343 self.assertTrue((a * 0).__class__ is tuple)
2344 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002345 a = madtuple(())
2346 self.assertEqual(tuple(a), ())
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002347 self.assertTrue(tuple(a).__class__ is tuple)
2348 self.assertTrue((a + a).__class__ is tuple)
2349 self.assertTrue((a * 0).__class__ is tuple)
2350 self.assertTrue((a * 1).__class__ is tuple)
2351 self.assertTrue((a * 2).__class__ is tuple)
2352 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002353
2354 class madstring(str):
2355 _rev = None
2356 def rev(self):
2357 if self._rev is not None:
2358 return self._rev
2359 L = list(self)
2360 L.reverse()
2361 self._rev = self.__class__("".join(L))
2362 return self._rev
2363 s = madstring("abcdefghijklmnopqrstuvwxyz")
2364 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2365 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2366 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2367 for i in range(256):
2368 s = madstring("".join(map(chr, range(i))))
2369 t = s.rev()
2370 u = t.rev()
2371 self.assertEqual(u, s)
2372 s = madstring("12345")
2373 self.assertEqual(str(s), "12345")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002374 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002375
2376 base = "\x00" * 5
2377 s = madstring(base)
2378 self.assertEqual(s, base)
2379 self.assertEqual(str(s), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002380 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002381 self.assertEqual(hash(s), hash(base))
2382 self.assertEqual({s: 1}[base], 1)
2383 self.assertEqual({base: 1}[s], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002384 self.assertTrue((s + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002385 self.assertEqual(s + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002386 self.assertTrue(("" + s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002387 self.assertEqual("" + s, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002388 self.assertTrue((s * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002389 self.assertEqual(s * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002390 self.assertTrue((s * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002391 self.assertEqual(s * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002392 self.assertTrue((s * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002393 self.assertEqual(s * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002394 self.assertTrue(s[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002395 self.assertEqual(s[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002396 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002397 self.assertEqual(s[0:0], "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002398 self.assertTrue(s.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002399 self.assertEqual(s.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002400 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002401 self.assertEqual(s.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002402 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002403 self.assertEqual(s.rstrip(), base)
2404 identitytab = {}
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002405 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002406 self.assertEqual(s.translate(identitytab), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002407 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002408 self.assertEqual(s.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002409 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002410 self.assertEqual(s.ljust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002411 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002412 self.assertEqual(s.rjust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002413 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002414 self.assertEqual(s.center(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002415 self.assertTrue(s.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002416 self.assertEqual(s.lower(), base)
2417
2418 class madunicode(str):
2419 _rev = None
2420 def rev(self):
2421 if self._rev is not None:
2422 return self._rev
2423 L = list(self)
2424 L.reverse()
2425 self._rev = self.__class__("".join(L))
2426 return self._rev
2427 u = madunicode("ABCDEF")
2428 self.assertEqual(u, "ABCDEF")
2429 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2430 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2431 base = "12345"
2432 u = madunicode(base)
2433 self.assertEqual(str(u), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002434 self.assertTrue(str(u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002435 self.assertEqual(hash(u), hash(base))
2436 self.assertEqual({u: 1}[base], 1)
2437 self.assertEqual({base: 1}[u], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002438 self.assertTrue(u.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002439 self.assertEqual(u.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002440 self.assertTrue(u.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002441 self.assertEqual(u.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002442 self.assertTrue(u.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002443 self.assertEqual(u.rstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002444 self.assertTrue(u.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002445 self.assertEqual(u.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002446 self.assertTrue(u.replace("xy", "xy").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002447 self.assertEqual(u.replace("xy", "xy"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002448 self.assertTrue(u.center(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002449 self.assertEqual(u.center(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002450 self.assertTrue(u.ljust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002451 self.assertEqual(u.ljust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002452 self.assertTrue(u.rjust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002453 self.assertEqual(u.rjust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002454 self.assertTrue(u.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002455 self.assertEqual(u.lower(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002456 self.assertTrue(u.upper().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002457 self.assertEqual(u.upper(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002458 self.assertTrue(u.capitalize().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002459 self.assertEqual(u.capitalize(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002460 self.assertTrue(u.title().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002461 self.assertEqual(u.title(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002462 self.assertTrue((u + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002463 self.assertEqual(u + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002464 self.assertTrue(("" + u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002465 self.assertEqual("" + u, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002466 self.assertTrue((u * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002467 self.assertEqual(u * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002468 self.assertTrue((u * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002469 self.assertEqual(u * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002470 self.assertTrue((u * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002471 self.assertEqual(u * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002472 self.assertTrue(u[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002473 self.assertEqual(u[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002474 self.assertTrue(u[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002475 self.assertEqual(u[0:0], "")
2476
2477 class sublist(list):
2478 pass
2479 a = sublist(range(5))
2480 self.assertEqual(a, list(range(5)))
2481 a.append("hello")
2482 self.assertEqual(a, list(range(5)) + ["hello"])
2483 a[5] = 5
2484 self.assertEqual(a, list(range(6)))
2485 a.extend(range(6, 20))
2486 self.assertEqual(a, list(range(20)))
2487 a[-5:] = []
2488 self.assertEqual(a, list(range(15)))
2489 del a[10:15]
2490 self.assertEqual(len(a), 10)
2491 self.assertEqual(a, list(range(10)))
2492 self.assertEqual(list(a), list(range(10)))
2493 self.assertEqual(a[0], 0)
2494 self.assertEqual(a[9], 9)
2495 self.assertEqual(a[-10], 0)
2496 self.assertEqual(a[-1], 9)
2497 self.assertEqual(a[:5], list(range(5)))
2498
2499 ## class CountedInput(file):
2500 ## """Counts lines read by self.readline().
2501 ##
2502 ## self.lineno is the 0-based ordinal of the last line read, up to
2503 ## a maximum of one greater than the number of lines in the file.
2504 ##
2505 ## self.ateof is true if and only if the final "" line has been read,
2506 ## at which point self.lineno stops incrementing, and further calls
2507 ## to readline() continue to return "".
2508 ## """
2509 ##
2510 ## lineno = 0
2511 ## ateof = 0
2512 ## def readline(self):
2513 ## if self.ateof:
2514 ## return ""
2515 ## s = file.readline(self)
2516 ## # Next line works too.
2517 ## # s = super(CountedInput, self).readline()
2518 ## self.lineno += 1
2519 ## if s == "":
2520 ## self.ateof = 1
2521 ## return s
2522 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002523 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002524 ## lines = ['a\n', 'b\n', 'c\n']
2525 ## try:
2526 ## f.writelines(lines)
2527 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002528 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002529 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2530 ## got = f.readline()
2531 ## self.assertEqual(expected, got)
2532 ## self.assertEqual(f.lineno, i)
2533 ## self.assertEqual(f.ateof, (i > len(lines)))
2534 ## f.close()
2535 ## finally:
2536 ## try:
2537 ## f.close()
2538 ## except:
2539 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002540 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002541
2542 def test_keywords(self):
2543 # Testing keyword args to basic type constructors ...
2544 self.assertEqual(int(x=1), 1)
2545 self.assertEqual(float(x=2), 2.0)
2546 self.assertEqual(int(x=3), 3)
2547 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2548 self.assertEqual(str(object=500), '500')
2549 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2550 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2551 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2552 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2553
2554 for constructor in (int, float, int, complex, str, str,
2555 tuple, list):
2556 try:
2557 constructor(bogus_keyword_arg=1)
2558 except TypeError:
2559 pass
2560 else:
2561 self.fail("expected TypeError from bogus keyword argument to %r"
2562 % constructor)
2563
2564 def test_str_subclass_as_dict_key(self):
2565 # Testing a str subclass used as dict key ..
2566
2567 class cistr(str):
2568 """Sublcass of str that computes __eq__ case-insensitively.
2569
2570 Also computes a hash code of the string in canonical form.
2571 """
2572
2573 def __init__(self, value):
2574 self.canonical = value.lower()
2575 self.hashcode = hash(self.canonical)
2576
2577 def __eq__(self, other):
2578 if not isinstance(other, cistr):
2579 other = cistr(other)
2580 return self.canonical == other.canonical
2581
2582 def __hash__(self):
2583 return self.hashcode
2584
2585 self.assertEqual(cistr('ABC'), 'abc')
2586 self.assertEqual('aBc', cistr('ABC'))
2587 self.assertEqual(str(cistr('ABC')), 'ABC')
2588
2589 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2590 self.assertEqual(d[cistr('one')], 1)
2591 self.assertEqual(d[cistr('tWo')], 2)
2592 self.assertEqual(d[cistr('THrEE')], 3)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002593 self.assertIn(cistr('ONe'), d)
Georg Brandl479a7e72008-02-05 18:13:15 +00002594 self.assertEqual(d.get(cistr('thrEE')), 3)
2595
2596 def test_classic_comparisons(self):
2597 # Testing classic comparisons...
2598 class classic:
2599 pass
2600
2601 for base in (classic, int, object):
2602 class C(base):
2603 def __init__(self, value):
2604 self.value = int(value)
2605 def __eq__(self, other):
2606 if isinstance(other, C):
2607 return self.value == other.value
2608 if isinstance(other, int) or isinstance(other, int):
2609 return self.value == other
2610 return NotImplemented
2611 def __ne__(self, other):
2612 if isinstance(other, C):
2613 return self.value != other.value
2614 if isinstance(other, int) or isinstance(other, int):
2615 return self.value != other
2616 return NotImplemented
2617 def __lt__(self, other):
2618 if isinstance(other, C):
2619 return self.value < other.value
2620 if isinstance(other, int) or isinstance(other, int):
2621 return self.value < other
2622 return NotImplemented
2623 def __le__(self, other):
2624 if isinstance(other, C):
2625 return self.value <= other.value
2626 if isinstance(other, int) or isinstance(other, int):
2627 return self.value <= other
2628 return NotImplemented
2629 def __gt__(self, other):
2630 if isinstance(other, C):
2631 return self.value > other.value
2632 if isinstance(other, int) or isinstance(other, int):
2633 return self.value > other
2634 return NotImplemented
2635 def __ge__(self, other):
2636 if isinstance(other, C):
2637 return self.value >= other.value
2638 if isinstance(other, int) or isinstance(other, int):
2639 return self.value >= other
2640 return NotImplemented
2641
2642 c1 = C(1)
2643 c2 = C(2)
2644 c3 = C(3)
2645 self.assertEqual(c1, 1)
2646 c = {1: c1, 2: c2, 3: c3}
2647 for x in 1, 2, 3:
2648 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002649 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002650 self.assertTrue(eval("c[x] %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002651 eval("x %s y" % op),
2652 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002653 self.assertTrue(eval("c[x] %s y" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002654 eval("x %s y" % op),
2655 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002656 self.assertTrue(eval("x %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002657 eval("x %s y" % op),
2658 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002659
2660 def test_rich_comparisons(self):
2661 # Testing rich comparisons...
2662 class Z(complex):
2663 pass
2664 z = Z(1)
2665 self.assertEqual(z, 1+0j)
2666 self.assertEqual(1+0j, z)
2667 class ZZ(complex):
2668 def __eq__(self, other):
2669 try:
2670 return abs(self - other) <= 1e-6
2671 except:
2672 return NotImplemented
2673 zz = ZZ(1.0000003)
2674 self.assertEqual(zz, 1+0j)
2675 self.assertEqual(1+0j, zz)
2676
2677 class classic:
2678 pass
2679 for base in (classic, int, object, list):
2680 class C(base):
2681 def __init__(self, value):
2682 self.value = int(value)
2683 def __cmp__(self_, other):
2684 self.fail("shouldn't call __cmp__")
2685 def __eq__(self, other):
2686 if isinstance(other, C):
2687 return self.value == other.value
2688 if isinstance(other, int) or isinstance(other, int):
2689 return self.value == other
2690 return NotImplemented
2691 def __ne__(self, other):
2692 if isinstance(other, C):
2693 return self.value != other.value
2694 if isinstance(other, int) or isinstance(other, int):
2695 return self.value != other
2696 return NotImplemented
2697 def __lt__(self, other):
2698 if isinstance(other, C):
2699 return self.value < other.value
2700 if isinstance(other, int) or isinstance(other, int):
2701 return self.value < other
2702 return NotImplemented
2703 def __le__(self, other):
2704 if isinstance(other, C):
2705 return self.value <= other.value
2706 if isinstance(other, int) or isinstance(other, int):
2707 return self.value <= other
2708 return NotImplemented
2709 def __gt__(self, other):
2710 if isinstance(other, C):
2711 return self.value > other.value
2712 if isinstance(other, int) or isinstance(other, int):
2713 return self.value > other
2714 return NotImplemented
2715 def __ge__(self, other):
2716 if isinstance(other, C):
2717 return self.value >= other.value
2718 if isinstance(other, int) or isinstance(other, int):
2719 return self.value >= other
2720 return NotImplemented
2721 c1 = C(1)
2722 c2 = C(2)
2723 c3 = C(3)
2724 self.assertEqual(c1, 1)
2725 c = {1: c1, 2: c2, 3: c3}
2726 for x in 1, 2, 3:
2727 for y in 1, 2, 3:
2728 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002729 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002730 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002731 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002732 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002733 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002734 "x=%d, y=%d" % (x, y))
2735
2736 def test_descrdoc(self):
2737 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002738 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002739 def check(descr, what):
2740 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002741 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002742 check(complex.real, "the real part of a complex number") # member descriptor
2743
2744 def test_doc_descriptor(self):
2745 # Testing __doc__ descriptor...
2746 # SF bug 542984
2747 class DocDescr(object):
2748 def __get__(self, object, otype):
2749 if object:
2750 object = object.__class__.__name__ + ' instance'
2751 if otype:
2752 otype = otype.__name__
2753 return 'object=%s; type=%s' % (object, otype)
2754 class OldClass:
2755 __doc__ = DocDescr()
2756 class NewClass(object):
2757 __doc__ = DocDescr()
2758 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2759 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2760 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2761 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2762
2763 def test_set_class(self):
2764 # Testing __class__ assignment...
2765 class C(object): pass
2766 class D(object): pass
2767 class E(object): pass
2768 class F(D, E): pass
2769 for cls in C, D, E, F:
2770 for cls2 in C, D, E, F:
2771 x = cls()
2772 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002773 self.assertTrue(x.__class__ is cls2)
Georg Brandl479a7e72008-02-05 18:13:15 +00002774 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002775 self.assertTrue(x.__class__ is cls)
Georg Brandl479a7e72008-02-05 18:13:15 +00002776 def cant(x, C):
2777 try:
2778 x.__class__ = C
2779 except TypeError:
2780 pass
2781 else:
2782 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2783 try:
2784 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002785 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002786 pass
2787 else:
2788 self.fail("shouldn't allow del %r.__class__" % x)
2789 cant(C(), list)
2790 cant(list(), C)
2791 cant(C(), 1)
2792 cant(C(), object)
2793 cant(object(), list)
2794 cant(list(), object)
2795 class Int(int): __slots__ = []
2796 cant(2, Int)
2797 cant(Int(), int)
2798 cant(True, int)
2799 cant(2, bool)
2800 o = object()
2801 cant(o, type(1))
2802 cant(o, type(None))
2803 del o
2804 class G(object):
2805 __slots__ = ["a", "b"]
2806 class H(object):
2807 __slots__ = ["b", "a"]
2808 class I(object):
2809 __slots__ = ["a", "b"]
2810 class J(object):
2811 __slots__ = ["c", "b"]
2812 class K(object):
2813 __slots__ = ["a", "b", "d"]
2814 class L(H):
2815 __slots__ = ["e"]
2816 class M(I):
2817 __slots__ = ["e"]
2818 class N(J):
2819 __slots__ = ["__weakref__"]
2820 class P(J):
2821 __slots__ = ["__dict__"]
2822 class Q(J):
2823 pass
2824 class R(J):
2825 __slots__ = ["__dict__", "__weakref__"]
2826
2827 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2828 x = cls()
2829 x.a = 1
2830 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002831 self.assertTrue(x.__class__ is cls2,
Georg Brandl479a7e72008-02-05 18:13:15 +00002832 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2833 self.assertEqual(x.a, 1)
2834 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002835 self.assertTrue(x.__class__ is cls,
Georg Brandl479a7e72008-02-05 18:13:15 +00002836 "assigning %r as __class__ for %r silently failed" % (cls, x))
2837 self.assertEqual(x.a, 1)
2838 for cls in G, J, K, L, M, N, P, R, list, Int:
2839 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2840 if cls is cls2:
2841 continue
2842 cant(cls(), cls2)
2843
Benjamin Peterson193152c2009-04-25 01:08:45 +00002844 # Issue5283: when __class__ changes in __del__, the wrong
2845 # type gets DECREF'd.
2846 class O(object):
2847 pass
2848 class A(object):
2849 def __del__(self):
2850 self.__class__ = O
2851 l = [A() for x in range(100)]
2852 del l
2853
Georg Brandl479a7e72008-02-05 18:13:15 +00002854 def test_set_dict(self):
2855 # Testing __dict__ assignment...
2856 class C(object): pass
2857 a = C()
2858 a.__dict__ = {'b': 1}
2859 self.assertEqual(a.b, 1)
2860 def cant(x, dict):
2861 try:
2862 x.__dict__ = dict
2863 except (AttributeError, TypeError):
2864 pass
2865 else:
2866 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2867 cant(a, None)
2868 cant(a, [])
2869 cant(a, 1)
2870 del a.__dict__ # Deleting __dict__ is allowed
2871
2872 class Base(object):
2873 pass
2874 def verify_dict_readonly(x):
2875 """
2876 x has to be an instance of a class inheriting from Base.
2877 """
2878 cant(x, {})
2879 try:
2880 del x.__dict__
2881 except (AttributeError, TypeError):
2882 pass
2883 else:
2884 self.fail("shouldn't allow del %r.__dict__" % x)
2885 dict_descr = Base.__dict__["__dict__"]
2886 try:
2887 dict_descr.__set__(x, {})
2888 except (AttributeError, TypeError):
2889 pass
2890 else:
2891 self.fail("dict_descr allowed access to %r's dict" % x)
2892
2893 # Classes don't allow __dict__ assignment and have readonly dicts
2894 class Meta1(type, Base):
2895 pass
2896 class Meta2(Base, type):
2897 pass
2898 class D(object, metaclass=Meta1):
2899 pass
2900 class E(object, metaclass=Meta2):
2901 pass
2902 for cls in C, D, E:
2903 verify_dict_readonly(cls)
2904 class_dict = cls.__dict__
2905 try:
2906 class_dict["spam"] = "eggs"
2907 except TypeError:
2908 pass
2909 else:
2910 self.fail("%r's __dict__ can be modified" % cls)
2911
2912 # Modules also disallow __dict__ assignment
2913 class Module1(types.ModuleType, Base):
2914 pass
2915 class Module2(Base, types.ModuleType):
2916 pass
2917 for ModuleType in Module1, Module2:
2918 mod = ModuleType("spam")
2919 verify_dict_readonly(mod)
2920 mod.__dict__["spam"] = "eggs"
2921
2922 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002923 # (at least not any more than regular exception's __dict__ can
2924 # be deleted; on CPython it is not the case, whereas on PyPy they
2925 # can, just like any other new-style instance's __dict__.)
2926 def can_delete_dict(e):
2927 try:
2928 del e.__dict__
2929 except (TypeError, AttributeError):
2930 return False
2931 else:
2932 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002933 class Exception1(Exception, Base):
2934 pass
2935 class Exception2(Base, Exception):
2936 pass
2937 for ExceptionType in Exception, Exception1, Exception2:
2938 e = ExceptionType()
2939 e.__dict__ = {"a": 1}
2940 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002941 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002942
2943 def test_pickles(self):
2944 # Testing pickling and copying new-style classes and objects...
2945 import pickle
2946
2947 def sorteditems(d):
2948 L = list(d.items())
2949 L.sort()
2950 return L
2951
2952 global C
2953 class C(object):
2954 def __init__(self, a, b):
2955 super(C, self).__init__()
2956 self.a = a
2957 self.b = b
2958 def __repr__(self):
2959 return "C(%r, %r)" % (self.a, self.b)
2960
2961 global C1
2962 class C1(list):
2963 def __new__(cls, a, b):
2964 return super(C1, cls).__new__(cls)
2965 def __getnewargs__(self):
2966 return (self.a, self.b)
2967 def __init__(self, a, b):
2968 self.a = a
2969 self.b = b
2970 def __repr__(self):
2971 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2972
2973 global C2
2974 class C2(int):
2975 def __new__(cls, a, b, val=0):
2976 return super(C2, cls).__new__(cls, val)
2977 def __getnewargs__(self):
2978 return (self.a, self.b, int(self))
2979 def __init__(self, a, b, val=0):
2980 self.a = a
2981 self.b = b
2982 def __repr__(self):
2983 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2984
2985 global C3
2986 class C3(object):
2987 def __init__(self, foo):
2988 self.foo = foo
2989 def __getstate__(self):
2990 return self.foo
2991 def __setstate__(self, foo):
2992 self.foo = foo
2993
2994 global C4classic, C4
2995 class C4classic: # classic
2996 pass
2997 class C4(C4classic, object): # mixed inheritance
2998 pass
2999
Guido van Rossum3926a632001-09-25 16:25:58 +00003000 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00003001 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00003002 s = pickle.dumps(cls, bin)
3003 cls2 = pickle.loads(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003004 self.assertTrue(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00003005
3006 a = C1(1, 2); a.append(42); a.append(24)
3007 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003008 s = pickle.dumps((a, b), bin)
3009 x, y = pickle.loads(s)
3010 self.assertEqual(x.__class__, a.__class__)
3011 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3012 self.assertEqual(y.__class__, b.__class__)
3013 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3014 self.assertEqual(repr(x), repr(a))
3015 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003016 # Test for __getstate__ and __setstate__ on new style class
3017 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003018 s = pickle.dumps(u, bin)
3019 v = pickle.loads(s)
3020 self.assertEqual(u.__class__, v.__class__)
3021 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003022 # Test for picklability of hybrid class
3023 u = C4()
3024 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003025 s = pickle.dumps(u, bin)
3026 v = pickle.loads(s)
3027 self.assertEqual(u.__class__, v.__class__)
3028 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003029
Georg Brandl479a7e72008-02-05 18:13:15 +00003030 # Testing copy.deepcopy()
3031 import copy
3032 for cls in C, C1, C2:
3033 cls2 = copy.deepcopy(cls)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003034 self.assertTrue(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003035
Georg Brandl479a7e72008-02-05 18:13:15 +00003036 a = C1(1, 2); a.append(42); a.append(24)
3037 b = C2("hello", "world", 42)
3038 x, y = copy.deepcopy((a, b))
3039 self.assertEqual(x.__class__, a.__class__)
3040 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3041 self.assertEqual(y.__class__, b.__class__)
3042 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3043 self.assertEqual(repr(x), repr(a))
3044 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003045
Georg Brandl479a7e72008-02-05 18:13:15 +00003046 def test_pickle_slots(self):
3047 # Testing pickling of classes with __slots__ ...
3048 import pickle
3049 # Pickling of classes with __slots__ but without __getstate__ should fail
3050 # (if using protocol 0 or 1)
3051 global B, C, D, E
3052 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003053 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003054 for base in [object, B]:
3055 class C(base):
3056 __slots__ = ['a']
3057 class D(C):
3058 pass
3059 try:
3060 pickle.dumps(C(), 0)
3061 except TypeError:
3062 pass
3063 else:
3064 self.fail("should fail: pickle C instance - %s" % base)
3065 try:
3066 pickle.dumps(C(), 0)
3067 except TypeError:
3068 pass
3069 else:
3070 self.fail("should fail: pickle D instance - %s" % base)
3071 # Give C a nice generic __getstate__ and __setstate__
3072 class C(base):
3073 __slots__ = ['a']
3074 def __getstate__(self):
3075 try:
3076 d = self.__dict__.copy()
3077 except AttributeError:
3078 d = {}
3079 for cls in self.__class__.__mro__:
3080 for sn in cls.__dict__.get('__slots__', ()):
3081 try:
3082 d[sn] = getattr(self, sn)
3083 except AttributeError:
3084 pass
3085 return d
3086 def __setstate__(self, d):
3087 for k, v in list(d.items()):
3088 setattr(self, k, v)
3089 class D(C):
3090 pass
3091 # Now it should work
3092 x = C()
3093 y = pickle.loads(pickle.dumps(x))
3094 self.assertEqual(hasattr(y, 'a'), 0)
3095 x.a = 42
3096 y = pickle.loads(pickle.dumps(x))
3097 self.assertEqual(y.a, 42)
3098 x = D()
3099 x.a = 42
3100 x.b = 100
3101 y = pickle.loads(pickle.dumps(x))
3102 self.assertEqual(y.a + y.b, 142)
3103 # A subclass that adds a slot should also work
3104 class E(C):
3105 __slots__ = ['b']
3106 x = E()
3107 x.a = 42
3108 x.b = "foo"
3109 y = pickle.loads(pickle.dumps(x))
3110 self.assertEqual(y.a, x.a)
3111 self.assertEqual(y.b, x.b)
3112
3113 def test_binary_operator_override(self):
3114 # Testing overrides of binary operations...
3115 class I(int):
3116 def __repr__(self):
3117 return "I(%r)" % int(self)
3118 def __add__(self, other):
3119 return I(int(self) + int(other))
3120 __radd__ = __add__
3121 def __pow__(self, other, mod=None):
3122 if mod is None:
3123 return I(pow(int(self), int(other)))
3124 else:
3125 return I(pow(int(self), int(other), int(mod)))
3126 def __rpow__(self, other, mod=None):
3127 if mod is None:
3128 return I(pow(int(other), int(self), mod))
3129 else:
3130 return I(pow(int(other), int(self), int(mod)))
3131
3132 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3133 self.assertEqual(repr(I(1) + 2), "I(3)")
3134 self.assertEqual(repr(1 + I(2)), "I(3)")
3135 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3136 self.assertEqual(repr(2 ** I(3)), "I(8)")
3137 self.assertEqual(repr(I(2) ** 3), "I(8)")
3138 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3139 class S(str):
3140 def __eq__(self, other):
3141 return self.lower() == other.lower()
3142
3143 def test_subclass_propagation(self):
3144 # Testing propagation of slot functions to subclasses...
3145 class A(object):
3146 pass
3147 class B(A):
3148 pass
3149 class C(A):
3150 pass
3151 class D(B, C):
3152 pass
3153 d = D()
3154 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3155 A.__hash__ = lambda self: 42
3156 self.assertEqual(hash(d), 42)
3157 C.__hash__ = lambda self: 314
3158 self.assertEqual(hash(d), 314)
3159 B.__hash__ = lambda self: 144
3160 self.assertEqual(hash(d), 144)
3161 D.__hash__ = lambda self: 100
3162 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003163 D.__hash__ = None
3164 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003165 del D.__hash__
3166 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003167 B.__hash__ = None
3168 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003169 del B.__hash__
3170 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003171 C.__hash__ = None
3172 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003173 del C.__hash__
3174 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003175 A.__hash__ = None
3176 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003177 del A.__hash__
3178 self.assertEqual(hash(d), orig_hash)
3179 d.foo = 42
3180 d.bar = 42
3181 self.assertEqual(d.foo, 42)
3182 self.assertEqual(d.bar, 42)
3183 def __getattribute__(self, name):
3184 if name == "foo":
3185 return 24
3186 return object.__getattribute__(self, name)
3187 A.__getattribute__ = __getattribute__
3188 self.assertEqual(d.foo, 24)
3189 self.assertEqual(d.bar, 42)
3190 def __getattr__(self, name):
3191 if name in ("spam", "foo", "bar"):
3192 return "hello"
3193 raise AttributeError(name)
3194 B.__getattr__ = __getattr__
3195 self.assertEqual(d.spam, "hello")
3196 self.assertEqual(d.foo, 24)
3197 self.assertEqual(d.bar, 42)
3198 del A.__getattribute__
3199 self.assertEqual(d.foo, 42)
3200 del d.foo
3201 self.assertEqual(d.foo, "hello")
3202 self.assertEqual(d.bar, 42)
3203 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003204 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003205 d.foo
3206 except AttributeError:
3207 pass
3208 else:
3209 self.fail("d.foo should be undefined now")
3210
3211 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl479a7e72008-02-05 18:13:15 +00003212 class A(object):
3213 pass
3214 class B(A):
3215 pass
3216 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003217 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003218 A.__setitem__ = lambda *a: None # crash
3219
3220 def test_buffer_inheritance(self):
3221 # Testing that buffer interface is inherited ...
3222
3223 import binascii
3224 # SF bug [#470040] ParseTuple t# vs subclasses.
3225
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003226 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003227 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003228 base = b'abc'
3229 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003230 # b2a_hex uses the buffer interface to get its argument's value, via
3231 # PyArg_ParseTuple 't#' code.
3232 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3233
Georg Brandl479a7e72008-02-05 18:13:15 +00003234 class MyInt(int):
3235 pass
3236 m = MyInt(42)
3237 try:
3238 binascii.b2a_hex(m)
3239 self.fail('subclass of int should not have a buffer interface')
3240 except TypeError:
3241 pass
3242
3243 def test_str_of_str_subclass(self):
3244 # Testing __str__ defined in subclass of str ...
3245 import binascii
3246 import io
3247
3248 class octetstring(str):
3249 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003250 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003251 def __repr__(self):
3252 return self + " repr"
3253
3254 o = octetstring('A')
3255 self.assertEqual(type(o), octetstring)
3256 self.assertEqual(type(str(o)), str)
3257 self.assertEqual(type(repr(o)), str)
3258 self.assertEqual(ord(o), 0x41)
3259 self.assertEqual(str(o), '41')
3260 self.assertEqual(repr(o), 'A repr')
3261 self.assertEqual(o.__str__(), '41')
3262 self.assertEqual(o.__repr__(), 'A repr')
3263
3264 capture = io.StringIO()
3265 # Calling str() or not exercises different internal paths.
3266 print(o, file=capture)
3267 print(str(o), file=capture)
3268 self.assertEqual(capture.getvalue(), '41\n41\n')
3269 capture.close()
3270
3271 def test_keyword_arguments(self):
3272 # Testing keyword arguments to __init__, __call__...
3273 def f(a): return a
3274 self.assertEqual(f.__call__(a=42), 42)
3275 a = []
3276 list.__init__(a, sequence=[0, 1, 2])
3277 self.assertEqual(a, [0, 1, 2])
3278
3279 def test_recursive_call(self):
3280 # Testing recursive __call__() by setting to instance of class...
3281 class A(object):
3282 pass
3283
3284 A.__call__ = A()
3285 try:
3286 A()()
3287 except RuntimeError:
3288 pass
3289 else:
3290 self.fail("Recursion limit should have been reached for __call__()")
3291
3292 def test_delete_hook(self):
3293 # Testing __del__ hook...
3294 log = []
3295 class C(object):
3296 def __del__(self):
3297 log.append(1)
3298 c = C()
3299 self.assertEqual(log, [])
3300 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003301 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003302 self.assertEqual(log, [1])
3303
3304 class D(object): pass
3305 d = D()
3306 try: del d[0]
3307 except TypeError: pass
3308 else: self.fail("invalid del() didn't raise TypeError")
3309
3310 def test_hash_inheritance(self):
3311 # Testing hash of mutable subclasses...
3312
3313 class mydict(dict):
3314 pass
3315 d = mydict()
3316 try:
3317 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003318 except TypeError:
3319 pass
3320 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003321 self.fail("hash() of dict subclass should fail")
3322
3323 class mylist(list):
3324 pass
3325 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003326 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003327 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003328 except TypeError:
3329 pass
3330 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003331 self.fail("hash() of list subclass should fail")
3332
3333 def test_str_operations(self):
3334 try: 'a' + 5
3335 except TypeError: pass
3336 else: self.fail("'' + 5 doesn't raise TypeError")
3337
3338 try: ''.split('')
3339 except ValueError: pass
3340 else: self.fail("''.split('') doesn't raise ValueError")
3341
3342 try: ''.join([0])
3343 except TypeError: pass
3344 else: self.fail("''.join([0]) doesn't raise TypeError")
3345
3346 try: ''.rindex('5')
3347 except ValueError: pass
3348 else: self.fail("''.rindex('5') doesn't raise ValueError")
3349
3350 try: '%(n)s' % None
3351 except TypeError: pass
3352 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3353
3354 try: '%(n' % {}
3355 except ValueError: pass
3356 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3357
3358 try: '%*s' % ('abc')
3359 except TypeError: pass
3360 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3361
3362 try: '%*.*s' % ('abc', 5)
3363 except TypeError: pass
3364 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3365
3366 try: '%s' % (1, 2)
3367 except TypeError: pass
3368 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3369
3370 try: '%' % None
3371 except ValueError: pass
3372 else: self.fail("'%' % None doesn't raise ValueError")
3373
3374 self.assertEqual('534253'.isdigit(), 1)
3375 self.assertEqual('534253x'.isdigit(), 0)
3376 self.assertEqual('%c' % 5, '\x05')
3377 self.assertEqual('%c' % '5', '5')
3378
3379 def test_deepcopy_recursive(self):
3380 # Testing deepcopy of recursive objects...
3381 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003382 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003383 a = Node()
3384 b = Node()
3385 a.b = b
3386 b.a = a
3387 z = deepcopy(a) # This blew up before
3388
3389 def test_unintialized_modules(self):
3390 # Testing uninitialized module objects...
3391 from types import ModuleType as M
3392 m = M.__new__(M)
3393 str(m)
3394 self.assertEqual(hasattr(m, "__name__"), 0)
3395 self.assertEqual(hasattr(m, "__file__"), 0)
3396 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003397 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003398 m.foo = 1
3399 self.assertEqual(m.__dict__, {"foo": 1})
3400
3401 def test_funny_new(self):
3402 # Testing __new__ returning something unexpected...
3403 class C(object):
3404 def __new__(cls, arg):
3405 if isinstance(arg, str): return [1, 2, 3]
3406 elif isinstance(arg, int): return object.__new__(D)
3407 else: return object.__new__(cls)
3408 class D(C):
3409 def __init__(self, arg):
3410 self.foo = arg
3411 self.assertEqual(C("1"), [1, 2, 3])
3412 self.assertEqual(D("1"), [1, 2, 3])
3413 d = D(None)
3414 self.assertEqual(d.foo, None)
3415 d = C(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003416 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003417 self.assertEqual(d.foo, 1)
3418 d = D(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003419 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003420 self.assertEqual(d.foo, 1)
3421
3422 def test_imul_bug(self):
3423 # Testing for __imul__ problems...
3424 # SF bug 544647
3425 class C(object):
3426 def __imul__(self, other):
3427 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003428 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003429 y = x
3430 y *= 1.0
3431 self.assertEqual(y, (x, 1.0))
3432 y = x
3433 y *= 2
3434 self.assertEqual(y, (x, 2))
3435 y = x
3436 y *= 3
3437 self.assertEqual(y, (x, 3))
3438 y = x
3439 y *= 1<<100
3440 self.assertEqual(y, (x, 1<<100))
3441 y = x
3442 y *= None
3443 self.assertEqual(y, (x, None))
3444 y = x
3445 y *= "foo"
3446 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003447
Georg Brandl479a7e72008-02-05 18:13:15 +00003448 def test_copy_setstate(self):
3449 # Testing that copy.*copy() correctly uses __setstate__...
3450 import copy
3451 class C(object):
3452 def __init__(self, foo=None):
3453 self.foo = foo
3454 self.__foo = foo
3455 def setfoo(self, foo=None):
3456 self.foo = foo
3457 def getfoo(self):
3458 return self.__foo
3459 def __getstate__(self):
3460 return [self.foo]
3461 def __setstate__(self_, lst):
3462 self.assertEqual(len(lst), 1)
3463 self_.__foo = self_.foo = lst[0]
3464 a = C(42)
3465 a.setfoo(24)
3466 self.assertEqual(a.foo, 24)
3467 self.assertEqual(a.getfoo(), 42)
3468 b = copy.copy(a)
3469 self.assertEqual(b.foo, 24)
3470 self.assertEqual(b.getfoo(), 24)
3471 b = copy.deepcopy(a)
3472 self.assertEqual(b.foo, 24)
3473 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003474
Georg Brandl479a7e72008-02-05 18:13:15 +00003475 def test_slices(self):
3476 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003477
Georg Brandl479a7e72008-02-05 18:13:15 +00003478 # Strings
3479 self.assertEqual("hello"[:4], "hell")
3480 self.assertEqual("hello"[slice(4)], "hell")
3481 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3482 class S(str):
3483 def __getitem__(self, x):
3484 return str.__getitem__(self, x)
3485 self.assertEqual(S("hello")[:4], "hell")
3486 self.assertEqual(S("hello")[slice(4)], "hell")
3487 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3488 # Tuples
3489 self.assertEqual((1,2,3)[:2], (1,2))
3490 self.assertEqual((1,2,3)[slice(2)], (1,2))
3491 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3492 class T(tuple):
3493 def __getitem__(self, x):
3494 return tuple.__getitem__(self, x)
3495 self.assertEqual(T((1,2,3))[:2], (1,2))
3496 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3497 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3498 # Lists
3499 self.assertEqual([1,2,3][:2], [1,2])
3500 self.assertEqual([1,2,3][slice(2)], [1,2])
3501 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3502 class L(list):
3503 def __getitem__(self, x):
3504 return list.__getitem__(self, x)
3505 self.assertEqual(L([1,2,3])[:2], [1,2])
3506 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3507 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3508 # Now do lists and __setitem__
3509 a = L([1,2,3])
3510 a[slice(1, 3)] = [3,2]
3511 self.assertEqual(a, [1,3,2])
3512 a[slice(0, 2, 1)] = [3,1]
3513 self.assertEqual(a, [3,1,2])
3514 a.__setitem__(slice(1, 3), [2,1])
3515 self.assertEqual(a, [3,2,1])
3516 a.__setitem__(slice(0, 2, 1), [2,3])
3517 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003518
Georg Brandl479a7e72008-02-05 18:13:15 +00003519 def test_subtype_resurrection(self):
3520 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003521
Georg Brandl479a7e72008-02-05 18:13:15 +00003522 class C(object):
3523 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003524
Georg Brandl479a7e72008-02-05 18:13:15 +00003525 def __del__(self):
3526 # resurrect the instance
3527 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003528
Georg Brandl479a7e72008-02-05 18:13:15 +00003529 c = C()
3530 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003531
Benjamin Petersone549ead2009-03-28 21:42:05 +00003532 # The most interesting thing here is whether this blows up, due to
3533 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3534 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003535 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003536
Georg Brandl479a7e72008-02-05 18:13:15 +00003537 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003538 # the last container slot works: that will attempt to delete c again,
3539 # which will cause c to get appended back to the container again
3540 # "during" the del. (On non-CPython implementations, however, __del__
3541 # is typically not called again.)
3542 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003543 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003544 del C.container[-1]
3545 if support.check_impl_detail():
3546 support.gc_collect()
3547 self.assertEqual(len(C.container), 1)
3548 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003549
Georg Brandl479a7e72008-02-05 18:13:15 +00003550 # Make c mortal again, so that the test framework with -l doesn't report
3551 # it as a leak.
3552 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003553
Georg Brandl479a7e72008-02-05 18:13:15 +00003554 def test_slots_trash(self):
3555 # Testing slot trash...
3556 # Deallocating deeply nested slotted trash caused stack overflows
3557 class trash(object):
3558 __slots__ = ['x']
3559 def __init__(self, x):
3560 self.x = x
3561 o = None
3562 for i in range(50000):
3563 o = trash(o)
3564 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003565
Georg Brandl479a7e72008-02-05 18:13:15 +00003566 def test_slots_multiple_inheritance(self):
3567 # SF bug 575229, multiple inheritance w/ slots dumps core
3568 class A(object):
3569 __slots__=()
3570 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003571 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003572 class C(A,B) :
3573 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003574 if support.check_impl_detail():
3575 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003576 self.assertTrue(hasattr(C, '__dict__'))
3577 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl479a7e72008-02-05 18:13:15 +00003578 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003579
Georg Brandl479a7e72008-02-05 18:13:15 +00003580 def test_rmul(self):
3581 # Testing correct invocation of __rmul__...
3582 # SF patch 592646
3583 class C(object):
3584 def __mul__(self, other):
3585 return "mul"
3586 def __rmul__(self, other):
3587 return "rmul"
3588 a = C()
3589 self.assertEqual(a*2, "mul")
3590 self.assertEqual(a*2.2, "mul")
3591 self.assertEqual(2*a, "rmul")
3592 self.assertEqual(2.2*a, "rmul")
3593
3594 def test_ipow(self):
3595 # Testing correct invocation of __ipow__...
3596 # [SF bug 620179]
3597 class C(object):
3598 def __ipow__(self, other):
3599 pass
3600 a = C()
3601 a **= 2
3602
3603 def test_mutable_bases(self):
3604 # Testing mutable bases...
3605
3606 # stuff that should work:
3607 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003608 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003609 class C2(object):
3610 def __getattribute__(self, attr):
3611 if attr == 'a':
3612 return 2
3613 else:
3614 return super(C2, self).__getattribute__(attr)
3615 def meth(self):
3616 return 1
3617 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003618 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003619 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003620 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003621 d = D()
3622 e = E()
3623 D.__bases__ = (C,)
3624 D.__bases__ = (C2,)
3625 self.assertEqual(d.meth(), 1)
3626 self.assertEqual(e.meth(), 1)
3627 self.assertEqual(d.a, 2)
3628 self.assertEqual(e.a, 2)
3629 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003630
Georg Brandl479a7e72008-02-05 18:13:15 +00003631 try:
3632 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003633 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003634 pass
3635 else:
3636 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003637
Georg Brandl479a7e72008-02-05 18:13:15 +00003638 try:
3639 D.__bases__ = ()
3640 except TypeError as msg:
3641 if str(msg) == "a new-style class can't have only classic bases":
3642 self.fail("wrong error message for .__bases__ = ()")
3643 else:
3644 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003645
Georg Brandl479a7e72008-02-05 18:13:15 +00003646 try:
3647 D.__bases__ = (D,)
3648 except TypeError:
3649 pass
3650 else:
3651 # actually, we'll have crashed by here...
3652 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003653
Georg Brandl479a7e72008-02-05 18:13:15 +00003654 try:
3655 D.__bases__ = (C, C)
3656 except TypeError:
3657 pass
3658 else:
3659 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003660
Georg Brandl479a7e72008-02-05 18:13:15 +00003661 try:
3662 D.__bases__ = (E,)
3663 except TypeError:
3664 pass
3665 else:
3666 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003667
Benjamin Petersonae937c02009-04-18 20:54:08 +00003668 def test_builtin_bases(self):
3669 # Make sure all the builtin types can have their base queried without
3670 # segfaulting. See issue #5787.
3671 builtin_types = [tp for tp in builtins.__dict__.values()
3672 if isinstance(tp, type)]
3673 for tp in builtin_types:
3674 object.__getattribute__(tp, "__bases__")
3675 if tp is not object:
3676 self.assertEqual(len(tp.__bases__), 1, tp)
3677
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003678 class L(list):
3679 pass
3680
3681 class C(object):
3682 pass
3683
3684 class D(C):
3685 pass
3686
3687 try:
3688 L.__bases__ = (dict,)
3689 except TypeError:
3690 pass
3691 else:
3692 self.fail("shouldn't turn list subclass into dict subclass")
3693
3694 try:
3695 list.__bases__ = (dict,)
3696 except TypeError:
3697 pass
3698 else:
3699 self.fail("shouldn't be able to assign to list.__bases__")
3700
3701 try:
3702 D.__bases__ = (C, list)
3703 except TypeError:
3704 pass
3705 else:
3706 assert 0, "best_base calculation found wanting"
3707
Benjamin Petersonae937c02009-04-18 20:54:08 +00003708
Georg Brandl479a7e72008-02-05 18:13:15 +00003709 def test_mutable_bases_with_failing_mro(self):
3710 # Testing mutable bases with failing mro...
3711 class WorkOnce(type):
3712 def __new__(self, name, bases, ns):
3713 self.flag = 0
3714 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3715 def mro(self):
3716 if self.flag > 0:
3717 raise RuntimeError("bozo")
3718 else:
3719 self.flag += 1
3720 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003721
Georg Brandl479a7e72008-02-05 18:13:15 +00003722 class WorkAlways(type):
3723 def mro(self):
3724 # this is here to make sure that .mro()s aren't called
3725 # with an exception set (which was possible at one point).
3726 # An error message will be printed in a debug build.
3727 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003728 return type.mro(self)
3729
Georg Brandl479a7e72008-02-05 18:13:15 +00003730 class C(object):
3731 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003732
Georg Brandl479a7e72008-02-05 18:13:15 +00003733 class C2(object):
3734 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003735
Georg Brandl479a7e72008-02-05 18:13:15 +00003736 class D(C):
3737 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003738
Georg Brandl479a7e72008-02-05 18:13:15 +00003739 class E(D):
3740 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003741
Georg Brandl479a7e72008-02-05 18:13:15 +00003742 class F(D, metaclass=WorkOnce):
3743 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003744
Georg Brandl479a7e72008-02-05 18:13:15 +00003745 class G(D, metaclass=WorkAlways):
3746 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003747
Georg Brandl479a7e72008-02-05 18:13:15 +00003748 # Immediate subclasses have their mro's adjusted in alphabetical
3749 # order, so E's will get adjusted before adjusting F's fails. We
3750 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003751
Georg Brandl479a7e72008-02-05 18:13:15 +00003752 E_mro_before = E.__mro__
3753 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003754
Armin Rigofd163f92005-12-29 15:59:19 +00003755 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003756 D.__bases__ = (C2,)
3757 except RuntimeError:
3758 self.assertEqual(E.__mro__, E_mro_before)
3759 self.assertEqual(D.__mro__, D_mro_before)
3760 else:
3761 self.fail("exception not propagated")
3762
3763 def test_mutable_bases_catch_mro_conflict(self):
3764 # Testing mutable bases catch mro conflict...
3765 class A(object):
3766 pass
3767
3768 class B(object):
3769 pass
3770
3771 class C(A, B):
3772 pass
3773
3774 class D(A, B):
3775 pass
3776
3777 class E(C, D):
3778 pass
3779
3780 try:
3781 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003782 except TypeError:
3783 pass
3784 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003785 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003786
Georg Brandl479a7e72008-02-05 18:13:15 +00003787 def test_mutable_names(self):
3788 # Testing mutable names...
3789 class C(object):
3790 pass
3791
3792 # C.__module__ could be 'test_descr' or '__main__'
3793 mod = C.__module__
3794
3795 C.__name__ = 'D'
3796 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3797
3798 C.__name__ = 'D.E'
3799 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3800
3801 def test_subclass_right_op(self):
3802 # Testing correct dispatch of subclass overloading __r<op>__...
3803
3804 # This code tests various cases where right-dispatch of a subclass
3805 # should be preferred over left-dispatch of a base class.
3806
3807 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3808
3809 class B(int):
3810 def __floordiv__(self, other):
3811 return "B.__floordiv__"
3812 def __rfloordiv__(self, other):
3813 return "B.__rfloordiv__"
3814
3815 self.assertEqual(B(1) // 1, "B.__floordiv__")
3816 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3817
3818 # Case 2: subclass of object; this is just the baseline for case 3
3819
3820 class C(object):
3821 def __floordiv__(self, other):
3822 return "C.__floordiv__"
3823 def __rfloordiv__(self, other):
3824 return "C.__rfloordiv__"
3825
3826 self.assertEqual(C() // 1, "C.__floordiv__")
3827 self.assertEqual(1 // C(), "C.__rfloordiv__")
3828
3829 # Case 3: subclass of new-style class; here it gets interesting
3830
3831 class D(C):
3832 def __floordiv__(self, other):
3833 return "D.__floordiv__"
3834 def __rfloordiv__(self, other):
3835 return "D.__rfloordiv__"
3836
3837 self.assertEqual(D() // C(), "D.__floordiv__")
3838 self.assertEqual(C() // D(), "D.__rfloordiv__")
3839
3840 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3841
3842 class E(C):
3843 pass
3844
3845 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3846
3847 self.assertEqual(E() // 1, "C.__floordiv__")
3848 self.assertEqual(1 // E(), "C.__rfloordiv__")
3849 self.assertEqual(E() // C(), "C.__floordiv__")
3850 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3851
Benjamin Petersone549ead2009-03-28 21:42:05 +00003852 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003853 def test_meth_class_get(self):
3854 # Testing __get__ method of METH_CLASS C methods...
3855 # Full coverage of descrobject.c::classmethod_get()
3856
3857 # Baseline
3858 arg = [1, 2, 3]
3859 res = {1: None, 2: None, 3: None}
3860 self.assertEqual(dict.fromkeys(arg), res)
3861 self.assertEqual({}.fromkeys(arg), res)
3862
3863 # Now get the descriptor
3864 descr = dict.__dict__["fromkeys"]
3865
3866 # More baseline using the descriptor directly
3867 self.assertEqual(descr.__get__(None, dict)(arg), res)
3868 self.assertEqual(descr.__get__({})(arg), res)
3869
3870 # Now check various error cases
3871 try:
3872 descr.__get__(None, None)
3873 except TypeError:
3874 pass
3875 else:
3876 self.fail("shouldn't have allowed descr.__get__(None, None)")
3877 try:
3878 descr.__get__(42)
3879 except TypeError:
3880 pass
3881 else:
3882 self.fail("shouldn't have allowed descr.__get__(42)")
3883 try:
3884 descr.__get__(None, 42)
3885 except TypeError:
3886 pass
3887 else:
3888 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3889 try:
3890 descr.__get__(None, int)
3891 except TypeError:
3892 pass
3893 else:
3894 self.fail("shouldn't have allowed descr.__get__(None, int)")
3895
3896 def test_isinst_isclass(self):
3897 # Testing proxy isinstance() and isclass()...
3898 class Proxy(object):
3899 def __init__(self, obj):
3900 self.__obj = obj
3901 def __getattribute__(self, name):
3902 if name.startswith("_Proxy__"):
3903 return object.__getattribute__(self, name)
3904 else:
3905 return getattr(self.__obj, name)
3906 # Test with a classic class
3907 class C:
3908 pass
3909 a = C()
3910 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003911 self.assertIsInstance(a, C) # Baseline
3912 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003913 # Test with a classic subclass
3914 class D(C):
3915 pass
3916 a = D()
3917 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003918 self.assertIsInstance(a, C) # Baseline
3919 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003920 # Test with a new-style class
3921 class C(object):
3922 pass
3923 a = C()
3924 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003925 self.assertIsInstance(a, C) # Baseline
3926 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003927 # Test with a new-style subclass
3928 class D(C):
3929 pass
3930 a = D()
3931 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003932 self.assertIsInstance(a, C) # Baseline
3933 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003934
3935 def test_proxy_super(self):
3936 # Testing super() for a proxy object...
3937 class Proxy(object):
3938 def __init__(self, obj):
3939 self.__obj = obj
3940 def __getattribute__(self, name):
3941 if name.startswith("_Proxy__"):
3942 return object.__getattribute__(self, name)
3943 else:
3944 return getattr(self.__obj, name)
3945
3946 class B(object):
3947 def f(self):
3948 return "B.f"
3949
3950 class C(B):
3951 def f(self):
3952 return super(C, self).f() + "->C.f"
3953
3954 obj = C()
3955 p = Proxy(obj)
3956 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3957
3958 def test_carloverre(self):
3959 # Testing prohibition of Carlo Verre's hack...
3960 try:
3961 object.__setattr__(str, "foo", 42)
3962 except TypeError:
3963 pass
3964 else:
3965 self.fail("Carlo Verre __setattr__ suceeded!")
3966 try:
3967 object.__delattr__(str, "lower")
3968 except TypeError:
3969 pass
3970 else:
3971 self.fail("Carlo Verre __delattr__ succeeded!")
3972
3973 def test_weakref_segfault(self):
3974 # Testing weakref segfault...
3975 # SF 742911
3976 import weakref
3977
3978 class Provoker:
3979 def __init__(self, referrent):
3980 self.ref = weakref.ref(referrent)
3981
3982 def __del__(self):
3983 x = self.ref()
3984
3985 class Oops(object):
3986 pass
3987
3988 o = Oops()
3989 o.whatever = Provoker(o)
3990 del o
3991
3992 def test_wrapper_segfault(self):
3993 # SF 927248: deeply nested wrappers could cause stack overflow
3994 f = lambda:None
3995 for i in range(1000000):
3996 f = f.__call__
3997 f = None
3998
3999 def test_file_fault(self):
4000 # Testing sys.stdout is changed in getattr...
Nick Coghlan6ead5522009-10-18 13:19:33 +00004001 test_stdout = sys.stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004002 class StdoutGuard:
4003 def __getattr__(self, attr):
4004 sys.stdout = sys.__stdout__
4005 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4006 sys.stdout = StdoutGuard()
4007 try:
4008 print("Oops!")
4009 except RuntimeError:
4010 pass
Nick Coghlan6ead5522009-10-18 13:19:33 +00004011 finally:
4012 sys.stdout = test_stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004013
4014 def test_vicious_descriptor_nonsense(self):
4015 # Testing vicious_descriptor_nonsense...
4016
4017 # A potential segfault spotted by Thomas Wouters in mail to
4018 # python-dev 2003-04-17, turned into an example & fixed by Michael
4019 # Hudson just less than four months later...
4020
4021 class Evil(object):
4022 def __hash__(self):
4023 return hash('attr')
4024 def __eq__(self, other):
4025 del C.attr
4026 return 0
4027
4028 class Descr(object):
4029 def __get__(self, ob, type=None):
4030 return 1
4031
4032 class C(object):
4033 attr = Descr()
4034
4035 c = C()
4036 c.__dict__[Evil()] = 0
4037
4038 self.assertEqual(c.attr, 1)
4039 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004040 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004041 self.assertEqual(hasattr(c, 'attr'), False)
4042
4043 def test_init(self):
4044 # SF 1155938
4045 class Foo(object):
4046 def __init__(self):
4047 return 10
4048 try:
4049 Foo()
4050 except TypeError:
4051 pass
4052 else:
4053 self.fail("did not test __init__() for None return")
4054
4055 def test_method_wrapper(self):
4056 # Testing method-wrapper objects...
4057 # <type 'method-wrapper'> did not support any reflection before 2.5
4058
Mark Dickinson211c6252009-02-01 10:28:51 +00004059 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004060
4061 l = []
4062 self.assertEqual(l.__add__, l.__add__)
4063 self.assertEqual(l.__add__, [].__add__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004064 self.assertTrue(l.__add__ != [5].__add__)
4065 self.assertTrue(l.__add__ != l.__mul__)
4066 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004067 if hasattr(l.__add__, '__self__'):
4068 # CPython
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004069 self.assertTrue(l.__add__.__self__ is l)
4070 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Petersone549ead2009-03-28 21:42:05 +00004071 else:
4072 # Python implementations where [].__add__ is a normal bound method
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004073 self.assertTrue(l.__add__.im_self is l)
4074 self.assertTrue(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004075 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4076 try:
4077 hash(l.__add__)
4078 except TypeError:
4079 pass
4080 else:
4081 self.fail("no TypeError from hash([].__add__)")
4082
4083 t = ()
4084 t += (7,)
4085 self.assertEqual(t.__add__, (7,).__add__)
4086 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4087
4088 def test_not_implemented(self):
4089 # Testing NotImplemented...
4090 # all binary methods should be able to return a NotImplemented
Georg Brandl479a7e72008-02-05 18:13:15 +00004091 import operator
4092
4093 def specialmethod(self, other):
4094 return NotImplemented
4095
4096 def check(expr, x, y):
4097 try:
4098 exec(expr, {'x': x, 'y': y, 'operator': operator})
4099 except TypeError:
4100 pass
4101 else:
4102 self.fail("no TypeError from %r" % (expr,))
4103
4104 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4105 # TypeErrors
4106 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4107 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004108 for name, expr, iexpr in [
4109 ('__add__', 'x + y', 'x += y'),
4110 ('__sub__', 'x - y', 'x -= y'),
4111 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004112 ('__truediv__', 'operator.truediv(x, y)', None),
4113 ('__floordiv__', 'operator.floordiv(x, y)', None),
4114 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004115 ('__mod__', 'x % y', 'x %= y'),
4116 ('__divmod__', 'divmod(x, y)', None),
4117 ('__pow__', 'x ** y', 'x **= y'),
4118 ('__lshift__', 'x << y', 'x <<= y'),
4119 ('__rshift__', 'x >> y', 'x >>= y'),
4120 ('__and__', 'x & y', 'x &= y'),
4121 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004122 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004123 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004124 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004125 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004126 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004127 check(expr, a, N1)
4128 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004129 if iexpr:
4130 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004131 check(iexpr, a, N1)
4132 check(iexpr, a, N2)
4133 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004134 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004135 c = C()
4136 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004137 check(iexpr, c, N1)
4138 check(iexpr, c, N2)
4139
Georg Brandl479a7e72008-02-05 18:13:15 +00004140 def test_assign_slice(self):
4141 # ceval.c's assign_slice used to check for
4142 # tp->tp_as_sequence->sq_slice instead of
4143 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004144
Georg Brandl479a7e72008-02-05 18:13:15 +00004145 class C(object):
4146 def __setitem__(self, idx, value):
4147 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004148
Georg Brandl479a7e72008-02-05 18:13:15 +00004149 c = C()
4150 c[1:2] = 3
4151 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004152
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +00004153 def test_set_and_no_get(self):
4154 # See
4155 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4156 class Descr(object):
4157
4158 def __init__(self, name):
4159 self.name = name
4160
4161 def __set__(self, obj, value):
4162 obj.__dict__[self.name] = value
4163 descr = Descr("a")
4164
4165 class X(object):
4166 a = descr
4167
4168 x = X()
4169 self.assertIs(x.a, descr)
4170 x.a = 42
4171 self.assertEqual(x.a, 42)
4172
Benjamin Peterson21896a32010-03-21 22:03:03 +00004173 # Also check type_getattro for correctness.
4174 class Meta(type):
4175 pass
4176 class X(object):
4177 __metaclass__ = Meta
4178 X.a = 42
4179 Meta.a = Descr("a")
4180 self.assertEqual(X.a, 42)
4181
Benjamin Peterson9262b842008-11-17 22:45:50 +00004182 def test_getattr_hooks(self):
4183 # issue 4230
4184
4185 class Descriptor(object):
4186 counter = 0
4187 def __get__(self, obj, objtype=None):
4188 def getter(name):
4189 self.counter += 1
4190 raise AttributeError(name)
4191 return getter
4192
4193 descr = Descriptor()
4194 class A(object):
4195 __getattribute__ = descr
4196 class B(object):
4197 __getattr__ = descr
4198 class C(object):
4199 __getattribute__ = descr
4200 __getattr__ = descr
4201
4202 self.assertRaises(AttributeError, getattr, A(), "attr")
4203 self.assertEquals(descr.counter, 1)
4204 self.assertRaises(AttributeError, getattr, B(), "attr")
4205 self.assertEquals(descr.counter, 2)
4206 self.assertRaises(AttributeError, getattr, C(), "attr")
4207 self.assertEquals(descr.counter, 4)
4208
4209 import gc
4210 class EvilGetattribute(object):
4211 # This used to segfault
4212 def __getattr__(self, name):
4213 raise AttributeError(name)
4214 def __getattribute__(self, name):
4215 del EvilGetattribute.__getattr__
4216 for i in range(5):
4217 gc.collect()
4218 raise AttributeError(name)
4219
4220 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4221
Christian Heimesbbffeb62008-01-24 09:42:52 +00004222
Georg Brandl479a7e72008-02-05 18:13:15 +00004223class DictProxyTests(unittest.TestCase):
4224 def setUp(self):
4225 class C(object):
4226 def meth(self):
4227 pass
4228 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004229
Georg Brandl479a7e72008-02-05 18:13:15 +00004230 def test_iter_keys(self):
4231 # Testing dict-proxy iterkeys...
4232 keys = [ key for key in self.C.__dict__.keys() ]
4233 keys.sort()
4234 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4235 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004236
Georg Brandl479a7e72008-02-05 18:13:15 +00004237 def test_iter_values(self):
4238 # Testing dict-proxy itervalues...
4239 values = [ values for values in self.C.__dict__.values() ]
4240 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004241
Georg Brandl479a7e72008-02-05 18:13:15 +00004242 def test_iter_items(self):
4243 # Testing dict-proxy iteritems...
4244 keys = [ key for (key, value) in self.C.__dict__.items() ]
4245 keys.sort()
4246 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4247 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004248
Georg Brandl479a7e72008-02-05 18:13:15 +00004249 def test_dict_type_with_metaclass(self):
4250 # Testing type of __dict__ when metaclass set...
4251 class B(object):
4252 pass
4253 class M(type):
4254 pass
4255 class C(metaclass=M):
4256 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4257 pass
4258 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004259
Christian Heimesbbffeb62008-01-24 09:42:52 +00004260
Georg Brandl479a7e72008-02-05 18:13:15 +00004261class PTypesLongInitTest(unittest.TestCase):
4262 # This is in its own TestCase so that it can be run before any other tests.
4263 def test_pytype_long_ready(self):
4264 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004265
Georg Brandl479a7e72008-02-05 18:13:15 +00004266 # This dumps core when SF bug 551412 isn't fixed --
4267 # but only when test_descr.py is run separately.
4268 # (That can't be helped -- as soon as PyType_Ready()
4269 # is called for PyLong_Type, the bug is gone.)
4270 class UserLong(object):
4271 def __pow__(self, *args):
4272 pass
4273 try:
4274 pow(0, UserLong(), 0)
4275 except:
4276 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004277
Georg Brandl479a7e72008-02-05 18:13:15 +00004278 # Another segfault only when run early
4279 # (before PyType_Ready(tuple) is called)
4280 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004281
4282
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004283def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004284 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004285 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004286 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004287
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004288if __name__ == "__main__":
4289 test_main()