blob: 95a68c0c55d3fe571b2a04a6a198db6d148f99bf [file] [log] [blame]
Benjamin Petersonae937c02009-04-18 20:54:08 +00001import builtins
Benjamin Petersona5758c02009-05-09 18:15:04 +00002import sys
Guido van Rossum360e4b82007-05-14 22:51:27 +00003import types
Georg Brandl479a7e72008-02-05 18:13:15 +00004import unittest
5import warnings
Tim Peters4d9b4662002-04-16 01:59:17 +00006
Georg Brandl479a7e72008-02-05 18:13:15 +00007from copy import deepcopy
Benjamin Petersonee8712c2008-05-20 21:35:26 +00008from test import support
Guido van Rossum875eeaa2001-10-11 18:33:53 +00009
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Georg Brandl479a7e72008-02-05 18:13:15 +000011class OperatorsTest(unittest.TestCase):
Tim Peters3caca232001-12-06 06:23:26 +000012
Georg Brandl479a7e72008-02-05 18:13:15 +000013 def __init__(self, *args, **kwargs):
14 unittest.TestCase.__init__(self, *args, **kwargs)
15 self.binops = {
16 'add': '+',
17 'sub': '-',
18 'mul': '*',
19 'div': '/',
20 'divmod': 'divmod',
21 'pow': '**',
22 'lshift': '<<',
23 'rshift': '>>',
24 'and': '&',
25 'xor': '^',
26 'or': '|',
27 'cmp': 'cmp',
28 'lt': '<',
29 'le': '<=',
30 'eq': '==',
31 'ne': '!=',
32 'gt': '>',
33 'ge': '>=',
34 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000035
Georg Brandl479a7e72008-02-05 18:13:15 +000036 for name, expr in list(self.binops.items()):
37 if expr.islower():
38 expr = expr + "(a, b)"
39 else:
40 expr = 'a %s b' % expr
41 self.binops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000042
Georg Brandl479a7e72008-02-05 18:13:15 +000043 self.unops = {
44 'pos': '+',
45 'neg': '-',
46 'abs': 'abs',
47 'invert': '~',
48 'int': 'int',
49 'float': 'float',
50 'oct': 'oct',
51 'hex': 'hex',
52 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000053
Georg Brandl479a7e72008-02-05 18:13:15 +000054 for name, expr in list(self.unops.items()):
55 if expr.islower():
56 expr = expr + "(a)"
57 else:
58 expr = '%s a' % expr
59 self.unops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000060
Georg Brandl479a7e72008-02-05 18:13:15 +000061 def unop_test(self, a, res, expr="len(a)", meth="__len__"):
62 d = {'a': a}
63 self.assertEqual(eval(expr, d), res)
64 t = type(a)
65 m = getattr(t, meth)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066
Georg Brandl479a7e72008-02-05 18:13:15 +000067 # Find method in parent class
68 while meth not in t.__dict__:
69 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +000070 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
71 # method object; the getattr() below obtains its underlying function.
72 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +000073 self.assertEqual(m(a), res)
74 bm = getattr(a, meth)
75 self.assertEqual(bm(), res)
Tim Peters2f93e282001-10-04 05:27:00 +000076
Georg Brandl479a7e72008-02-05 18:13:15 +000077 def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
78 d = {'a': a, 'b': b}
Tim Peters2f93e282001-10-04 05:27:00 +000079
Georg Brandl479a7e72008-02-05 18:13:15 +000080 # XXX Hack so this passes before 2.3 when -Qnew is specified.
81 if meth == "__div__" and 1/2 == 0.5:
82 meth = "__truediv__"
Tim Peters2f93e282001-10-04 05:27:00 +000083
Georg Brandl479a7e72008-02-05 18:13:15 +000084 if meth == '__divmod__': pass
Tim Peters2f93e282001-10-04 05:27:00 +000085
Georg Brandl479a7e72008-02-05 18:13:15 +000086 self.assertEqual(eval(expr, d), res)
87 t = type(a)
88 m = getattr(t, meth)
89 while meth not in t.__dict__:
90 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +000091 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
92 # method object; the getattr() below obtains its underlying function.
93 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +000094 self.assertEqual(m(a, b), res)
95 bm = getattr(a, meth)
96 self.assertEqual(bm(b), res)
Tim Peters2f93e282001-10-04 05:27:00 +000097
Georg Brandl479a7e72008-02-05 18:13:15 +000098 def sliceop_test(self, a, b, c, res, expr="a[b:c]", meth="__getitem__"):
99 d = {'a': a, 'b': b, 'c': c}
100 self.assertEqual(eval(expr, d), res)
101 t = type(a)
102 m = getattr(t, meth)
103 while meth not in t.__dict__:
104 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000105 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
106 # method object; the getattr() below obtains its underlying function.
107 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000108 self.assertEqual(m(a, slice(b, c)), res)
109 bm = getattr(a, meth)
110 self.assertEqual(bm(slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000111
Georg Brandl479a7e72008-02-05 18:13:15 +0000112 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
113 d = {'a': deepcopy(a), 'b': b}
114 exec(stmt, d)
115 self.assertEqual(d['a'], res)
116 t = type(a)
117 m = getattr(t, meth)
118 while meth not in t.__dict__:
119 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000120 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
121 # method object; the getattr() below obtains its underlying function.
122 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000123 d['a'] = deepcopy(a)
124 m(d['a'], b)
125 self.assertEqual(d['a'], res)
126 d['a'] = deepcopy(a)
127 bm = getattr(d['a'], meth)
128 bm(b)
129 self.assertEqual(d['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000130
Georg Brandl479a7e72008-02-05 18:13:15 +0000131 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
132 d = {'a': deepcopy(a), 'b': b, 'c': c}
133 exec(stmt, d)
134 self.assertEqual(d['a'], res)
135 t = type(a)
136 m = getattr(t, meth)
137 while meth not in t.__dict__:
138 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000139 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
140 # method object; the getattr() below obtains its underlying function.
141 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000142 d['a'] = deepcopy(a)
143 m(d['a'], b, c)
144 self.assertEqual(d['a'], res)
145 d['a'] = deepcopy(a)
146 bm = getattr(d['a'], meth)
147 bm(b, c)
148 self.assertEqual(d['a'], res)
149
150 def setsliceop_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
151 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
152 exec(stmt, dictionary)
153 self.assertEqual(dictionary['a'], res)
154 t = type(a)
155 while meth not in t.__dict__:
156 t = t.__bases__[0]
157 m = getattr(t, meth)
Benjamin Petersone549ead2009-03-28 21:42:05 +0000158 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
159 # method object; the getattr() below obtains its underlying function.
160 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000161 dictionary['a'] = deepcopy(a)
162 m(dictionary['a'], slice(b, c), d)
163 self.assertEqual(dictionary['a'], res)
164 dictionary['a'] = deepcopy(a)
165 bm = getattr(dictionary['a'], meth)
166 bm(slice(b, c), d)
167 self.assertEqual(dictionary['a'], res)
168
169 def test_lists(self):
170 # Testing list operations...
171 # Asserts are within individual test methods
172 self.binop_test([1], [2], [1,2], "a+b", "__add__")
173 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
174 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
175 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
176 self.sliceop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
177 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
178 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
179 self.unop_test([1,2,3], 3, "len(a)", "__len__")
180 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
181 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
182 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
183 self.setsliceop_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
184 "__setitem__")
185
186 def test_dicts(self):
187 # Testing dict operations...
Georg Brandl479a7e72008-02-05 18:13:15 +0000188 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
189 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
190 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
191
192 d = {1:2, 3:4}
193 l1 = []
194 for i in list(d.keys()):
195 l1.append(i)
196 l = []
197 for i in iter(d):
198 l.append(i)
199 self.assertEqual(l, l1)
200 l = []
201 for i in d.__iter__():
202 l.append(i)
203 self.assertEqual(l, l1)
204 l = []
205 for i in dict.__iter__(d):
206 l.append(i)
207 self.assertEqual(l, l1)
208 d = {1:2, 3:4}
209 self.unop_test(d, 2, "len(a)", "__len__")
210 self.assertEqual(eval(repr(d), {}), d)
211 self.assertEqual(eval(d.__repr__(), {}), d)
212 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
213 "__setitem__")
214
215 # Tests for unary and binary operators
216 def number_operators(self, a, b, skip=[]):
217 dict = {'a': a, 'b': b}
218
219 for name, expr in list(self.binops.items()):
220 if name not in skip:
221 name = "__%s__" % name
222 if hasattr(a, name):
223 res = eval(expr, dict)
224 self.binop_test(a, b, res, expr, name)
225
226 for name, expr in list(self.unops.items()):
227 if name not in skip:
228 name = "__%s__" % name
229 if hasattr(a, name):
230 res = eval(expr, dict)
231 self.unop_test(a, res, expr, name)
232
233 def test_ints(self):
234 # Testing int operations...
235 self.number_operators(100, 3)
236 # The following crashes in Python 2.2
237 self.assertEqual((1).__bool__(), 1)
238 self.assertEqual((0).__bool__(), 0)
239 # This returns 'NotImplemented' in Python 2.2
240 class C(int):
241 def __add__(self, other):
242 return NotImplemented
243 self.assertEqual(C(5), 5)
Tim Peters25786c02001-09-02 08:22:48 +0000244 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000245 C() + ""
Tim Peters25786c02001-09-02 08:22:48 +0000246 except TypeError:
247 pass
248 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000249 self.fail("NotImplemented should have caused TypeError")
Tim Peters25786c02001-09-02 08:22:48 +0000250
Georg Brandl479a7e72008-02-05 18:13:15 +0000251 def test_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 = []
627 import types, sys
628 MT = type(sys)
629 class MM(MT):
630 def __init__(self, name):
631 MT.__init__(self, name)
632 def __getattribute__(self, name):
633 log.append(("getattr", name))
634 return MT.__getattribute__(self, name)
635 def __setattr__(self, name, value):
636 log.append(("setattr", name, value))
637 MT.__setattr__(self, name, value)
638 def __delattr__(self, name):
639 log.append(("delattr", name))
640 MT.__delattr__(self, name)
641 a = MM("a")
642 a.foo = 12
643 x = a.foo
644 del a.foo
645 self.assertEqual(log, [("setattr", "foo", 12),
646 ("getattr", "foo"),
647 ("delattr", "foo")])
648
649 # http://python.org/sf/1174712
Tim Peters1fc240e2001-10-26 05:06:50 +0000650 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000651 class Module(types.ModuleType, str):
652 pass
653 except TypeError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000654 pass
655 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000656 self.fail("inheriting from ModuleType and str at the same time "
657 "should fail")
Tim Peters1fc240e2001-10-26 05:06:50 +0000658
Georg Brandl479a7e72008-02-05 18:13:15 +0000659 def test_multiple_inheritance(self):
660 # Testing multiple inheritance...
661 class C(object):
662 def __init__(self):
663 self.__state = 0
664 def getstate(self):
665 return self.__state
666 def setstate(self, state):
667 self.__state = state
668 a = C()
669 self.assertEqual(a.getstate(), 0)
670 a.setstate(10)
671 self.assertEqual(a.getstate(), 10)
672 class D(dict, C):
673 def __init__(self):
674 type({}).__init__(self)
675 C.__init__(self)
676 d = D()
677 self.assertEqual(list(d.keys()), [])
678 d["hello"] = "world"
679 self.assertEqual(list(d.items()), [("hello", "world")])
680 self.assertEqual(d["hello"], "world")
681 self.assertEqual(d.getstate(), 0)
682 d.setstate(10)
683 self.assertEqual(d.getstate(), 10)
684 self.assertEqual(D.__mro__, (D, dict, C, object))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000685
Georg Brandl479a7e72008-02-05 18:13:15 +0000686 # SF bug #442833
687 class Node(object):
688 def __int__(self):
689 return int(self.foo())
690 def foo(self):
691 return "23"
692 class Frag(Node, list):
693 def foo(self):
694 return "42"
695 self.assertEqual(Node().__int__(), 23)
696 self.assertEqual(int(Node()), 23)
697 self.assertEqual(Frag().__int__(), 42)
698 self.assertEqual(int(Frag()), 42)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000699
Georg Brandl479a7e72008-02-05 18:13:15 +0000700 def test_diamond_inheritence(self):
701 # Testing multiple inheritance special cases...
702 class A(object):
703 def spam(self): return "A"
704 self.assertEqual(A().spam(), "A")
705 class B(A):
706 def boo(self): return "B"
707 def spam(self): return "B"
708 self.assertEqual(B().spam(), "B")
709 self.assertEqual(B().boo(), "B")
710 class C(A):
711 def boo(self): return "C"
712 self.assertEqual(C().spam(), "A")
713 self.assertEqual(C().boo(), "C")
714 class D(B, C): pass
715 self.assertEqual(D().spam(), "B")
716 self.assertEqual(D().boo(), "B")
717 self.assertEqual(D.__mro__, (D, B, C, A, object))
718 class E(C, B): pass
719 self.assertEqual(E().spam(), "B")
720 self.assertEqual(E().boo(), "C")
721 self.assertEqual(E.__mro__, (E, C, B, A, object))
722 # MRO order disagreement
723 try:
724 class F(D, E): pass
725 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000726 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000727 else:
728 self.fail("expected MRO order disagreement (F)")
729 try:
730 class G(E, D): pass
731 except TypeError:
732 pass
733 else:
734 self.fail("expected MRO order disagreement (G)")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000735
Georg Brandl479a7e72008-02-05 18:13:15 +0000736 # see thread python-dev/2002-October/029035.html
737 def test_ex5_from_c3_switch(self):
738 # Testing ex5 from C3 switch discussion...
739 class A(object): pass
740 class B(object): pass
741 class C(object): pass
742 class X(A): pass
743 class Y(A): pass
744 class Z(X,B,Y,C): pass
745 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000746
Georg Brandl479a7e72008-02-05 18:13:15 +0000747 # see "A Monotonic Superclass Linearization for Dylan",
748 # by Kim Barrett et al. (OOPSLA 1996)
749 def test_monotonicity(self):
750 # Testing MRO monotonicity...
751 class Boat(object): pass
752 class DayBoat(Boat): pass
753 class WheelBoat(Boat): pass
754 class EngineLess(DayBoat): pass
755 class SmallMultihull(DayBoat): pass
756 class PedalWheelBoat(EngineLess,WheelBoat): pass
757 class SmallCatamaran(SmallMultihull): pass
758 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
Guido van Rossume45763a2001-08-10 21:28:46 +0000759
Georg Brandl479a7e72008-02-05 18:13:15 +0000760 self.assertEqual(PedalWheelBoat.__mro__,
761 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
762 self.assertEqual(SmallCatamaran.__mro__,
763 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
764 self.assertEqual(Pedalo.__mro__,
765 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
766 SmallMultihull, DayBoat, WheelBoat, Boat, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000767
Georg Brandl479a7e72008-02-05 18:13:15 +0000768 # see "A Monotonic Superclass Linearization for Dylan",
769 # by Kim Barrett et al. (OOPSLA 1996)
770 def test_consistency_with_epg(self):
771 # Testing consistentcy with EPG...
772 class Pane(object): pass
773 class ScrollingMixin(object): pass
774 class EditingMixin(object): pass
775 class ScrollablePane(Pane,ScrollingMixin): pass
776 class EditablePane(Pane,EditingMixin): pass
777 class EditableScrollablePane(ScrollablePane,EditablePane): pass
Guido van Rossum9a818922002-11-14 19:50:14 +0000778
Georg Brandl479a7e72008-02-05 18:13:15 +0000779 self.assertEqual(EditableScrollablePane.__mro__,
780 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
781 ScrollingMixin, EditingMixin, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000782
Georg Brandl479a7e72008-02-05 18:13:15 +0000783 def test_mro_disagreement(self):
784 # Testing error messages for MRO disagreement...
785 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000786order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000787
Georg Brandl479a7e72008-02-05 18:13:15 +0000788 def raises(exc, expected, callable, *args):
Guido van Rossum58da9312007-11-10 23:39:45 +0000789 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000790 callable(*args)
791 except exc as msg:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000792 # the exact msg is generally considered an impl detail
793 if support.check_impl_detail():
794 if not str(msg).startswith(expected):
795 self.fail("Message %r, expected %r" %
796 (str(msg), expected))
Georg Brandl479a7e72008-02-05 18:13:15 +0000797 else:
798 self.fail("Expected %s" % exc)
Guido van Rossum58da9312007-11-10 23:39:45 +0000799
Georg Brandl479a7e72008-02-05 18:13:15 +0000800 class A(object): pass
801 class B(A): pass
802 class C(object): pass
Christian Heimes9a371592007-12-28 14:08:13 +0000803
Georg Brandl479a7e72008-02-05 18:13:15 +0000804 # Test some very simple errors
805 raises(TypeError, "duplicate base class A",
806 type, "X", (A, A), {})
807 raises(TypeError, mro_err_msg,
808 type, "X", (A, B), {})
809 raises(TypeError, mro_err_msg,
810 type, "X", (A, C, B), {})
811 # Test a slightly more complex error
812 class GridLayout(object): pass
813 class HorizontalGrid(GridLayout): pass
814 class VerticalGrid(GridLayout): pass
815 class HVGrid(HorizontalGrid, VerticalGrid): pass
816 class VHGrid(VerticalGrid, HorizontalGrid): pass
817 raises(TypeError, mro_err_msg,
818 type, "ConfusedGrid", (HVGrid, VHGrid), {})
Guido van Rossum58da9312007-11-10 23:39:45 +0000819
Georg Brandl479a7e72008-02-05 18:13:15 +0000820 def test_object_class(self):
821 # Testing object class...
822 a = object()
823 self.assertEqual(a.__class__, object)
824 self.assertEqual(type(a), object)
825 b = object()
826 self.assertNotEqual(a, b)
827 self.assertFalse(hasattr(a, "foo"))
Tim Peters808b94e2001-09-13 19:33:07 +0000828 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000829 a.foo = 12
830 except (AttributeError, TypeError):
Tim Peters808b94e2001-09-13 19:33:07 +0000831 pass
832 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000833 self.fail("object() should not allow setting a foo attribute")
834 self.assertFalse(hasattr(object(), "__dict__"))
Tim Peters561f8992001-09-13 19:36:36 +0000835
Georg Brandl479a7e72008-02-05 18:13:15 +0000836 class Cdict(object):
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000837 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000838 x = Cdict()
839 self.assertEqual(x.__dict__, {})
840 x.foo = 1
841 self.assertEqual(x.foo, 1)
842 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossumd8faa362007-04-27 19:54:29 +0000843
Georg Brandl479a7e72008-02-05 18:13:15 +0000844 def test_slots(self):
845 # Testing __slots__...
846 class C0(object):
847 __slots__ = []
848 x = C0()
849 self.assertFalse(hasattr(x, "__dict__"))
850 self.assertFalse(hasattr(x, "foo"))
851
852 class C1(object):
853 __slots__ = ['a']
854 x = C1()
855 self.assertFalse(hasattr(x, "__dict__"))
856 self.assertFalse(hasattr(x, "a"))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000857 x.a = 1
Georg Brandl479a7e72008-02-05 18:13:15 +0000858 self.assertEqual(x.a, 1)
859 x.a = None
860 self.assertEqual(x.a, None)
861 del x.a
862 self.assertFalse(hasattr(x, "a"))
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000863
Georg Brandl479a7e72008-02-05 18:13:15 +0000864 class C3(object):
865 __slots__ = ['a', 'b', 'c']
866 x = C3()
867 self.assertFalse(hasattr(x, "__dict__"))
868 self.assertFalse(hasattr(x, 'a'))
869 self.assertFalse(hasattr(x, 'b'))
870 self.assertFalse(hasattr(x, 'c'))
871 x.a = 1
872 x.b = 2
873 x.c = 3
874 self.assertEqual(x.a, 1)
875 self.assertEqual(x.b, 2)
876 self.assertEqual(x.c, 3)
877
878 class C4(object):
879 """Validate name mangling"""
880 __slots__ = ['__a']
881 def __init__(self, value):
882 self.__a = value
883 def get(self):
884 return self.__a
885 x = C4(5)
886 self.assertFalse(hasattr(x, '__dict__'))
887 self.assertFalse(hasattr(x, '__a'))
888 self.assertEqual(x.get(), 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000889 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000890 x.__a = 6
891 except AttributeError:
Guido van Rossum6661be32001-10-26 04:26:12 +0000892 pass
893 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000894 self.fail("Double underscored names not mangled")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000895
Georg Brandl479a7e72008-02-05 18:13:15 +0000896 # Make sure slot names are proper identifiers
Guido van Rossum360e4b82007-05-14 22:51:27 +0000897 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000898 class C(object):
899 __slots__ = [None]
Guido van Rossum360e4b82007-05-14 22:51:27 +0000900 except TypeError:
901 pass
902 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000903 self.fail("[None] slots not caught")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000904 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000905 class C(object):
906 __slots__ = ["foo bar"]
907 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000908 pass
909 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000910 self.fail("['foo bar'] slots not caught")
911 try:
912 class C(object):
913 __slots__ = ["foo\0bar"]
914 except TypeError:
915 pass
916 else:
917 self.fail("['foo\\0bar'] slots not caught")
918 try:
919 class C(object):
920 __slots__ = ["1"]
921 except TypeError:
922 pass
923 else:
924 self.fail("['1'] slots not caught")
925 try:
926 class C(object):
927 __slots__ = [""]
928 except TypeError:
929 pass
930 else:
931 self.fail("[''] slots not caught")
932 class C(object):
933 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
934 # XXX(nnorwitz): was there supposed to be something tested
935 # from the class above?
Guido van Rossum360e4b82007-05-14 22:51:27 +0000936
Georg Brandl479a7e72008-02-05 18:13:15 +0000937 # Test a single string is not expanded as a sequence.
938 class C(object):
939 __slots__ = "abc"
940 c = C()
941 c.abc = 5
942 self.assertEqual(c.abc, 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000943
Georg Brandl479a7e72008-02-05 18:13:15 +0000944 # Test unicode slot names
945 # Test a single unicode string is not expanded as a sequence.
946 class C(object):
947 __slots__ = "abc"
948 c = C()
949 c.abc = 5
950 self.assertEqual(c.abc, 5)
Guido van Rossum3926a632001-09-25 16:25:58 +0000951
Georg Brandl479a7e72008-02-05 18:13:15 +0000952 # _unicode_to_string used to modify slots in certain circumstances
953 slots = ("foo", "bar")
954 class C(object):
955 __slots__ = slots
956 x = C()
957 x.foo = 5
958 self.assertEqual(x.foo, 5)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000959 self.assertTrue(type(slots[0]) is str)
Georg Brandl479a7e72008-02-05 18:13:15 +0000960 # this used to leak references
961 try:
962 class C(object):
963 __slots__ = [chr(128)]
964 except (TypeError, UnicodeEncodeError):
965 pass
966 else:
967 raise TestFailed("[chr(128)] slots not caught")
Guido van Rossum3926a632001-09-25 16:25:58 +0000968
Georg Brandl479a7e72008-02-05 18:13:15 +0000969 # Test leaks
970 class Counted(object):
971 counter = 0 # counts the number of instances alive
972 def __init__(self):
973 Counted.counter += 1
974 def __del__(self):
975 Counted.counter -= 1
976 class C(object):
977 __slots__ = ['a', 'b', 'c']
978 x = C()
979 x.a = Counted()
980 x.b = Counted()
981 x.c = Counted()
982 self.assertEqual(Counted.counter, 3)
983 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000984 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000985 self.assertEqual(Counted.counter, 0)
986 class D(C):
987 pass
988 x = D()
989 x.a = Counted()
990 x.z = Counted()
991 self.assertEqual(Counted.counter, 2)
992 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000993 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000994 self.assertEqual(Counted.counter, 0)
995 class E(D):
996 __slots__ = ['e']
997 x = E()
998 x.a = Counted()
999 x.z = Counted()
1000 x.e = Counted()
1001 self.assertEqual(Counted.counter, 3)
1002 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +00001003 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001004 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001005
Georg Brandl479a7e72008-02-05 18:13:15 +00001006 # Test cyclical leaks [SF bug 519621]
1007 class F(object):
1008 __slots__ = ['a', 'b']
1009 log = []
1010 s = F()
1011 s.a = [Counted(), s]
1012 self.assertEqual(Counted.counter, 1)
1013 s = None
Benjamin Petersone549ead2009-03-28 21:42:05 +00001014 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001015 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001016
Georg Brandl479a7e72008-02-05 18:13:15 +00001017 # Test lookup leaks [SF bug 572567]
1018 import sys,gc
Benjamin Petersone549ead2009-03-28 21:42:05 +00001019 if hasattr(gc, 'get_objects'):
1020 class G(object):
Benjamin Petersona8b976b2009-10-11 18:28:48 +00001021 def __eq__(self, other):
1022 return False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001023 g = G()
1024 orig_objects = len(gc.get_objects())
1025 for i in range(10):
1026 g==g
1027 new_objects = len(gc.get_objects())
1028 self.assertEqual(orig_objects, new_objects)
1029
Georg Brandl479a7e72008-02-05 18:13:15 +00001030 class H(object):
1031 __slots__ = ['a', 'b']
1032 def __init__(self):
1033 self.a = 1
1034 self.b = 2
1035 def __del__(self_):
1036 self.assertEqual(self_.a, 1)
1037 self.assertEqual(self_.b, 2)
Benjamin Petersonc1de4cc2008-11-03 21:29:09 +00001038 with support.captured_output('stderr') as s:
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001039 h = H()
Georg Brandl479a7e72008-02-05 18:13:15 +00001040 del h
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001041 self.assertEqual(s.getvalue(), '')
Guido van Rossum90c45142001-11-24 21:07:01 +00001042
Benjamin Petersond12362a2009-12-30 19:44:54 +00001043 class X(object):
1044 __slots__ = "a"
1045 with self.assertRaises(AttributeError):
1046 del X().a
1047
Georg Brandl479a7e72008-02-05 18:13:15 +00001048 def test_slots_special(self):
1049 # Testing __dict__ and __weakref__ in __slots__...
1050 class D(object):
1051 __slots__ = ["__dict__"]
1052 a = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001053 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001054 self.assertFalse(hasattr(a, "__weakref__"))
1055 a.foo = 42
1056 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum90c45142001-11-24 21:07:01 +00001057
Georg Brandl479a7e72008-02-05 18:13:15 +00001058 class W(object):
1059 __slots__ = ["__weakref__"]
1060 a = W()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001061 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001062 self.assertFalse(hasattr(a, "__dict__"))
1063 try:
1064 a.foo = 42
1065 except AttributeError:
1066 pass
1067 else:
1068 self.fail("shouldn't be allowed to set a.foo")
1069
1070 class C1(W, D):
1071 __slots__ = []
1072 a = C1()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001073 self.assertTrue(hasattr(a, "__dict__"))
1074 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001075 a.foo = 42
1076 self.assertEqual(a.__dict__, {"foo": 42})
1077
1078 class C2(D, W):
1079 __slots__ = []
1080 a = C2()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001081 self.assertTrue(hasattr(a, "__dict__"))
1082 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001083 a.foo = 42
1084 self.assertEqual(a.__dict__, {"foo": 42})
1085
Christian Heimesa156e092008-02-16 07:38:31 +00001086 def test_slots_descriptor(self):
1087 # Issue2115: slot descriptors did not correctly check
1088 # the type of the given object
1089 import abc
1090 class MyABC(metaclass=abc.ABCMeta):
1091 __slots__ = "a"
1092
1093 class Unrelated(object):
1094 pass
1095 MyABC.register(Unrelated)
1096
1097 u = Unrelated()
Ezio Melottie9615932010-01-24 19:26:24 +00001098 self.assertIsInstance(u, MyABC)
Christian Heimesa156e092008-02-16 07:38:31 +00001099
1100 # This used to crash
1101 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1102
Georg Brandl479a7e72008-02-05 18:13:15 +00001103 def test_dynamics(self):
1104 # Testing class attribute propagation...
1105 class D(object):
1106 pass
1107 class E(D):
1108 pass
1109 class F(D):
1110 pass
1111 D.foo = 1
1112 self.assertEqual(D.foo, 1)
1113 # Test that dynamic attributes are inherited
1114 self.assertEqual(E.foo, 1)
1115 self.assertEqual(F.foo, 1)
1116 # Test dynamic instances
1117 class C(object):
1118 pass
1119 a = C()
1120 self.assertFalse(hasattr(a, "foobar"))
1121 C.foobar = 2
1122 self.assertEqual(a.foobar, 2)
1123 C.method = lambda self: 42
1124 self.assertEqual(a.method(), 42)
1125 C.__repr__ = lambda self: "C()"
1126 self.assertEqual(repr(a), "C()")
1127 C.__int__ = lambda self: 100
1128 self.assertEqual(int(a), 100)
1129 self.assertEqual(a.foobar, 2)
1130 self.assertFalse(hasattr(a, "spam"))
1131 def mygetattr(self, name):
1132 if name == "spam":
1133 return "spam"
1134 raise AttributeError
1135 C.__getattr__ = mygetattr
1136 self.assertEqual(a.spam, "spam")
1137 a.new = 12
1138 self.assertEqual(a.new, 12)
1139 def mysetattr(self, name, value):
1140 if name == "spam":
1141 raise AttributeError
1142 return object.__setattr__(self, name, value)
1143 C.__setattr__ = mysetattr
1144 try:
1145 a.spam = "not spam"
1146 except AttributeError:
1147 pass
1148 else:
1149 self.fail("expected AttributeError")
1150 self.assertEqual(a.spam, "spam")
1151 class D(C):
1152 pass
1153 d = D()
1154 d.foo = 1
1155 self.assertEqual(d.foo, 1)
1156
1157 # Test handling of int*seq and seq*int
1158 class I(int):
1159 pass
1160 self.assertEqual("a"*I(2), "aa")
1161 self.assertEqual(I(2)*"a", "aa")
1162 self.assertEqual(2*I(3), 6)
1163 self.assertEqual(I(3)*2, 6)
1164 self.assertEqual(I(3)*I(2), 6)
1165
Georg Brandl479a7e72008-02-05 18:13:15 +00001166 # Test comparison of classes with dynamic metaclasses
1167 class dynamicmetaclass(type):
1168 pass
1169 class someclass(metaclass=dynamicmetaclass):
1170 pass
1171 self.assertNotEqual(someclass, object)
1172
1173 def test_errors(self):
1174 # Testing errors...
1175 try:
1176 class C(list, dict):
1177 pass
1178 except TypeError:
1179 pass
1180 else:
1181 self.fail("inheritance from both list and dict should be illegal")
1182
1183 try:
1184 class C(object, None):
1185 pass
1186 except TypeError:
1187 pass
1188 else:
1189 self.fail("inheritance from non-type should be illegal")
1190 class Classic:
1191 pass
1192
1193 try:
1194 class C(type(len)):
1195 pass
1196 except TypeError:
1197 pass
1198 else:
1199 self.fail("inheritance from CFunction should be illegal")
1200
1201 try:
1202 class C(object):
1203 __slots__ = 1
1204 except TypeError:
1205 pass
1206 else:
1207 self.fail("__slots__ = 1 should be illegal")
1208
1209 try:
1210 class C(object):
1211 __slots__ = [1]
1212 except TypeError:
1213 pass
1214 else:
1215 self.fail("__slots__ = [1] should be illegal")
1216
1217 class M1(type):
1218 pass
1219 class M2(type):
1220 pass
1221 class A1(object, metaclass=M1):
1222 pass
1223 class A2(object, metaclass=M2):
1224 pass
1225 try:
1226 class B(A1, A2):
1227 pass
1228 except TypeError:
1229 pass
1230 else:
1231 self.fail("finding the most derived metaclass should have failed")
1232
1233 def test_classmethods(self):
1234 # Testing class methods...
1235 class C(object):
1236 def foo(*a): return a
1237 goo = classmethod(foo)
1238 c = C()
1239 self.assertEqual(C.goo(1), (C, 1))
1240 self.assertEqual(c.goo(1), (C, 1))
1241 self.assertEqual(c.foo(1), (c, 1))
1242 class D(C):
1243 pass
1244 d = D()
1245 self.assertEqual(D.goo(1), (D, 1))
1246 self.assertEqual(d.goo(1), (D, 1))
1247 self.assertEqual(d.foo(1), (d, 1))
1248 self.assertEqual(D.foo(d, 1), (d, 1))
1249 # Test for a specific crash (SF bug 528132)
1250 def f(cls, arg): return (cls, arg)
1251 ff = classmethod(f)
1252 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1253 self.assertEqual(ff.__get__(0)(42), (int, 42))
1254
1255 # Test super() with classmethods (SF bug 535444)
1256 self.assertEqual(C.goo.__self__, C)
1257 self.assertEqual(D.goo.__self__, D)
1258 self.assertEqual(super(D,D).goo.__self__, D)
1259 self.assertEqual(super(D,d).goo.__self__, D)
1260 self.assertEqual(super(D,D).goo(), (D,))
1261 self.assertEqual(super(D,d).goo(), (D,))
1262
Benjamin Peterson8719ad52009-09-11 22:24:02 +00001263 # Verify that a non-callable will raise
1264 meth = classmethod(1).__get__(1)
1265 self.assertRaises(TypeError, meth)
Georg Brandl479a7e72008-02-05 18:13:15 +00001266
1267 # Verify that classmethod() doesn't allow keyword args
1268 try:
1269 classmethod(f, kw=1)
1270 except TypeError:
1271 pass
1272 else:
1273 self.fail("classmethod shouldn't accept keyword args")
1274
Benjamin Petersone549ead2009-03-28 21:42:05 +00001275 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001276 def test_classmethods_in_c(self):
1277 # Testing C-based class methods...
1278 import xxsubtype as spam
1279 a = (1, 2, 3)
1280 d = {'abc': 123}
1281 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1282 self.assertEqual(x, spam.spamlist)
1283 self.assertEqual(a, a1)
1284 self.assertEqual(d, d1)
1285 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1286 self.assertEqual(x, spam.spamlist)
1287 self.assertEqual(a, a1)
1288 self.assertEqual(d, d1)
1289
1290 def test_staticmethods(self):
1291 # Testing static methods...
1292 class C(object):
1293 def foo(*a): return a
1294 goo = staticmethod(foo)
1295 c = C()
1296 self.assertEqual(C.goo(1), (1,))
1297 self.assertEqual(c.goo(1), (1,))
1298 self.assertEqual(c.foo(1), (c, 1,))
1299 class D(C):
1300 pass
1301 d = D()
1302 self.assertEqual(D.goo(1), (1,))
1303 self.assertEqual(d.goo(1), (1,))
1304 self.assertEqual(d.foo(1), (d, 1))
1305 self.assertEqual(D.foo(d, 1), (d, 1))
1306
Benjamin Petersone549ead2009-03-28 21:42:05 +00001307 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001308 def test_staticmethods_in_c(self):
1309 # Testing C-based static methods...
1310 import xxsubtype as spam
1311 a = (1, 2, 3)
1312 d = {"abc": 123}
1313 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1314 self.assertEqual(x, None)
1315 self.assertEqual(a, a1)
1316 self.assertEqual(d, d1)
1317 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1318 self.assertEqual(x, None)
1319 self.assertEqual(a, a1)
1320 self.assertEqual(d, d1)
1321
1322 def test_classic(self):
1323 # Testing classic classes...
1324 class C:
1325 def foo(*a): return a
1326 goo = classmethod(foo)
1327 c = C()
1328 self.assertEqual(C.goo(1), (C, 1))
1329 self.assertEqual(c.goo(1), (C, 1))
1330 self.assertEqual(c.foo(1), (c, 1))
1331 class D(C):
1332 pass
1333 d = D()
1334 self.assertEqual(D.goo(1), (D, 1))
1335 self.assertEqual(d.goo(1), (D, 1))
1336 self.assertEqual(d.foo(1), (d, 1))
1337 self.assertEqual(D.foo(d, 1), (d, 1))
1338 class E: # *not* subclassing from C
1339 foo = C.foo
1340 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001341 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001342
1343 def test_compattr(self):
1344 # Testing computed attributes...
1345 class C(object):
1346 class computed_attribute(object):
1347 def __init__(self, get, set=None, delete=None):
1348 self.__get = get
1349 self.__set = set
1350 self.__delete = delete
1351 def __get__(self, obj, type=None):
1352 return self.__get(obj)
1353 def __set__(self, obj, value):
1354 return self.__set(obj, value)
1355 def __delete__(self, obj):
1356 return self.__delete(obj)
1357 def __init__(self):
1358 self.__x = 0
1359 def __get_x(self):
1360 x = self.__x
1361 self.__x = x+1
1362 return x
1363 def __set_x(self, x):
1364 self.__x = x
1365 def __delete_x(self):
1366 del self.__x
1367 x = computed_attribute(__get_x, __set_x, __delete_x)
1368 a = C()
1369 self.assertEqual(a.x, 0)
1370 self.assertEqual(a.x, 1)
1371 a.x = 10
1372 self.assertEqual(a.x, 10)
1373 self.assertEqual(a.x, 11)
1374 del a.x
1375 self.assertEqual(hasattr(a, 'x'), 0)
1376
1377 def test_newslots(self):
1378 # Testing __new__ slot override...
1379 class C(list):
1380 def __new__(cls):
1381 self = list.__new__(cls)
1382 self.foo = 1
1383 return self
1384 def __init__(self):
1385 self.foo = self.foo + 2
1386 a = C()
1387 self.assertEqual(a.foo, 3)
1388 self.assertEqual(a.__class__, C)
1389 class D(C):
1390 pass
1391 b = D()
1392 self.assertEqual(b.foo, 3)
1393 self.assertEqual(b.__class__, D)
1394
1395 def test_altmro(self):
1396 # Testing mro() and overriding it...
1397 class A(object):
1398 def f(self): return "A"
1399 class B(A):
1400 pass
1401 class C(A):
1402 def f(self): return "C"
1403 class D(B, C):
1404 pass
1405 self.assertEqual(D.mro(), [D, B, C, A, object])
1406 self.assertEqual(D.__mro__, (D, B, C, A, object))
1407 self.assertEqual(D().f(), "C")
1408
1409 class PerverseMetaType(type):
1410 def mro(cls):
1411 L = type.mro(cls)
1412 L.reverse()
1413 return L
1414 class X(D,B,C,A, metaclass=PerverseMetaType):
1415 pass
1416 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1417 self.assertEqual(X().f(), "A")
1418
1419 try:
1420 class _metaclass(type):
1421 def mro(self):
1422 return [self, dict, object]
1423 class X(object, metaclass=_metaclass):
1424 pass
Benjamin Petersone549ead2009-03-28 21:42:05 +00001425 # In CPython, the class creation above already raises
1426 # TypeError, as a protection against the fact that
1427 # instances of X would segfault it. In other Python
1428 # implementations it would be ok to let the class X
1429 # be created, but instead get a clean TypeError on the
1430 # __setitem__ below.
1431 x = object.__new__(X)
1432 x[5] = 6
Georg Brandl479a7e72008-02-05 18:13:15 +00001433 except TypeError:
1434 pass
1435 else:
1436 self.fail("devious mro() return not caught")
1437
1438 try:
1439 class _metaclass(type):
1440 def mro(self):
1441 return [1]
1442 class X(object, metaclass=_metaclass):
1443 pass
1444 except TypeError:
1445 pass
1446 else:
1447 self.fail("non-class mro() return not caught")
1448
1449 try:
1450 class _metaclass(type):
1451 def mro(self):
1452 return 1
1453 class X(object, metaclass=_metaclass):
1454 pass
1455 except TypeError:
1456 pass
1457 else:
1458 self.fail("non-sequence mro() return not caught")
1459
1460 def test_overloading(self):
1461 # Testing operator overloading...
1462
1463 class B(object):
1464 "Intermediate class because object doesn't have a __setattr__"
1465
1466 class C(B):
1467 def __getattr__(self, name):
1468 if name == "foo":
1469 return ("getattr", name)
1470 else:
1471 raise AttributeError
1472 def __setattr__(self, name, value):
1473 if name == "foo":
1474 self.setattr = (name, value)
1475 else:
1476 return B.__setattr__(self, name, value)
1477 def __delattr__(self, name):
1478 if name == "foo":
1479 self.delattr = name
1480 else:
1481 return B.__delattr__(self, name)
1482
1483 def __getitem__(self, key):
1484 return ("getitem", key)
1485 def __setitem__(self, key, value):
1486 self.setitem = (key, value)
1487 def __delitem__(self, key):
1488 self.delitem = key
1489
1490 a = C()
1491 self.assertEqual(a.foo, ("getattr", "foo"))
1492 a.foo = 12
1493 self.assertEqual(a.setattr, ("foo", 12))
1494 del a.foo
1495 self.assertEqual(a.delattr, "foo")
1496
1497 self.assertEqual(a[12], ("getitem", 12))
1498 a[12] = 21
1499 self.assertEqual(a.setitem, (12, 21))
1500 del a[12]
1501 self.assertEqual(a.delitem, 12)
1502
1503 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1504 a[0:10] = "foo"
1505 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1506 del a[0:10]
1507 self.assertEqual(a.delitem, (slice(0, 10)))
1508
1509 def test_methods(self):
1510 # Testing methods...
1511 class C(object):
1512 def __init__(self, x):
1513 self.x = x
1514 def foo(self):
1515 return self.x
1516 c1 = C(1)
1517 self.assertEqual(c1.foo(), 1)
1518 class D(C):
1519 boo = C.foo
1520 goo = c1.foo
1521 d2 = D(2)
1522 self.assertEqual(d2.foo(), 2)
1523 self.assertEqual(d2.boo(), 2)
1524 self.assertEqual(d2.goo(), 1)
1525 class E(object):
1526 foo = C.foo
1527 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001528 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001529
Benjamin Peterson224205f2009-05-08 03:25:19 +00001530 def test_special_method_lookup(self):
1531 # The lookup of special methods bypasses __getattr__ and
1532 # __getattribute__, but they still can be descriptors.
1533
1534 def run_context(manager):
1535 with manager:
1536 pass
1537 def iden(self):
1538 return self
1539 def hello(self):
1540 return b"hello"
Benjamin Peterson053c61f2009-05-09 17:21:13 +00001541 def empty_seq(self):
1542 return []
Benjamin Petersona5758c02009-05-09 18:15:04 +00001543 def zero(self):
1544 return 0
Benjamin Petersonaea44282010-01-04 01:10:28 +00001545 def complex_num(self):
1546 return 1j
Benjamin Petersona5758c02009-05-09 18:15:04 +00001547 def stop(self):
1548 raise StopIteration
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001549 def return_true(self, thing=None):
1550 return True
1551 def do_isinstance(obj):
1552 return isinstance(int, obj)
1553 def do_issubclass(obj):
1554 return issubclass(int, obj)
Benjamin Petersona7205592009-05-27 03:08:59 +00001555 def do_dict_missing(checker):
1556 class DictSub(checker.__class__, dict):
1557 pass
1558 self.assertEqual(DictSub()["hi"], 4)
1559 def some_number(self_, key):
1560 self.assertEqual(key, "hi")
1561 return 4
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001562 def swallow(*args): pass
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 Peterson224205f2009-05-08 03:25:19 +00001581 ]
1582
1583 class Checker(object):
1584 def __getattr__(self, attr, test=self):
1585 test.fail("__getattr__ called with {0}".format(attr))
1586 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001587 if attr not in ok:
1588 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Petersona7205592009-05-27 03:08:59 +00001589 return object.__getattribute__(self, attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001590 class SpecialDescr(object):
1591 def __init__(self, impl):
1592 self.impl = impl
1593 def __get__(self, obj, owner):
1594 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001595 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001596 class MyException(Exception):
1597 pass
1598 class ErrDescr(object):
1599 def __get__(self, obj, owner):
1600 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001601
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001602 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001603 class X(Checker):
1604 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001605 for attr, obj in env.items():
1606 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001607 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001608 runner(X())
1609
1610 record = []
1611 class X(Checker):
1612 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001613 for attr, obj in env.items():
1614 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001615 setattr(X, name, SpecialDescr(meth_impl))
1616 runner(X())
1617 self.assertEqual(record, [1], name)
1618
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001619 class X(Checker):
1620 pass
1621 for attr, obj in env.items():
1622 setattr(X, attr, obj)
1623 setattr(X, name, ErrDescr())
1624 try:
1625 runner(X())
1626 except MyException:
1627 pass
1628 else:
1629 self.fail("{0!r} didn't raise".format(name))
1630
Georg Brandl479a7e72008-02-05 18:13:15 +00001631 def test_specials(self):
1632 # Testing special operators...
1633 # Test operators like __hash__ for which a built-in default exists
1634
1635 # Test the default behavior for static classes
1636 class C(object):
1637 def __getitem__(self, i):
1638 if 0 <= i < 10: return i
1639 raise IndexError
1640 c1 = C()
1641 c2 = C()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001642 self.assertTrue(not not c1) # What?
Georg Brandl479a7e72008-02-05 18:13:15 +00001643 self.assertNotEqual(id(c1), id(c2))
1644 hash(c1)
1645 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001646 self.assertEqual(c1, c1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001647 self.assertTrue(c1 != c2)
1648 self.assertTrue(not c1 != c1)
1649 self.assertTrue(not c1 == c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001650 # Note that the module name appears in str/repr, and that varies
1651 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001652 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001653 self.assertEqual(str(c1), repr(c1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001654 self.assertNotIn(-1, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001655 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001656 self.assertIn(i, c1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001657 self.assertNotIn(10, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001658 # Test the default behavior for dynamic classes
1659 class D(object):
1660 def __getitem__(self, i):
1661 if 0 <= i < 10: return i
1662 raise IndexError
1663 d1 = D()
1664 d2 = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001665 self.assertTrue(not not d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001666 self.assertNotEqual(id(d1), id(d2))
1667 hash(d1)
1668 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001669 self.assertEqual(d1, d1)
1670 self.assertNotEqual(d1, d2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001671 self.assertTrue(not d1 != d1)
1672 self.assertTrue(not d1 == d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001673 # Note that the module name appears in str/repr, and that varies
1674 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001675 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001676 self.assertEqual(str(d1), repr(d1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001677 self.assertNotIn(-1, d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001678 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001679 self.assertIn(i, d1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001680 self.assertNotIn(10, d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001681 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001682 class Proxy(object):
1683 def __init__(self, x):
1684 self.x = x
1685 def __bool__(self):
1686 return not not self.x
1687 def __hash__(self):
1688 return hash(self.x)
1689 def __eq__(self, other):
1690 return self.x == other
1691 def __ne__(self, other):
1692 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001693 def __ge__(self, other):
1694 return self.x >= other
1695 def __gt__(self, other):
1696 return self.x > other
1697 def __le__(self, other):
1698 return self.x <= other
1699 def __lt__(self, other):
1700 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001701 def __str__(self):
1702 return "Proxy:%s" % self.x
1703 def __repr__(self):
1704 return "Proxy(%r)" % self.x
1705 def __contains__(self, value):
1706 return value in self.x
1707 p0 = Proxy(0)
1708 p1 = Proxy(1)
1709 p_1 = Proxy(-1)
1710 self.assertFalse(p0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001711 self.assertTrue(not not p1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001712 self.assertEqual(hash(p0), hash(0))
1713 self.assertEqual(p0, p0)
1714 self.assertNotEqual(p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001715 self.assertTrue(not p0 != p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001716 self.assertEqual(not p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001717 self.assertTrue(p0 < p1)
1718 self.assertTrue(p0 <= p1)
1719 self.assertTrue(p1 > p0)
1720 self.assertTrue(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001721 self.assertEqual(str(p0), "Proxy:0")
1722 self.assertEqual(repr(p0), "Proxy(0)")
1723 p10 = Proxy(range(10))
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001724 self.assertNotIn(-1, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001725 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001726 self.assertIn(i, p10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001727 self.assertNotIn(10, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001728
Georg Brandl479a7e72008-02-05 18:13:15 +00001729 def test_weakrefs(self):
1730 # Testing weak references...
1731 import weakref
1732 class C(object):
1733 pass
1734 c = C()
1735 r = weakref.ref(c)
1736 self.assertEqual(r(), c)
1737 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001738 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001739 self.assertEqual(r(), None)
1740 del r
1741 class NoWeak(object):
1742 __slots__ = ['foo']
1743 no = NoWeak()
1744 try:
1745 weakref.ref(no)
1746 except TypeError as msg:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001747 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001748 else:
1749 self.fail("weakref.ref(no) should be illegal")
1750 class Weak(object):
1751 __slots__ = ['foo', '__weakref__']
1752 yes = Weak()
1753 r = weakref.ref(yes)
1754 self.assertEqual(r(), yes)
1755 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001756 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001757 self.assertEqual(r(), None)
1758 del r
1759
1760 def test_properties(self):
1761 # Testing property...
1762 class C(object):
1763 def getx(self):
1764 return self.__x
1765 def setx(self, value):
1766 self.__x = value
1767 def delx(self):
1768 del self.__x
1769 x = property(getx, setx, delx, doc="I'm the x property.")
1770 a = C()
1771 self.assertFalse(hasattr(a, "x"))
1772 a.x = 42
1773 self.assertEqual(a._C__x, 42)
1774 self.assertEqual(a.x, 42)
1775 del a.x
1776 self.assertFalse(hasattr(a, "x"))
1777 self.assertFalse(hasattr(a, "_C__x"))
1778 C.x.__set__(a, 100)
1779 self.assertEqual(C.x.__get__(a), 100)
1780 C.x.__delete__(a)
1781 self.assertFalse(hasattr(a, "x"))
1782
1783 raw = C.__dict__['x']
Ezio Melottie9615932010-01-24 19:26:24 +00001784 self.assertIsInstance(raw, property)
Georg Brandl479a7e72008-02-05 18:13:15 +00001785
1786 attrs = dir(raw)
Benjamin Peterson577473f2010-01-19 00:09:57 +00001787 self.assertIn("__doc__", attrs)
1788 self.assertIn("fget", attrs)
1789 self.assertIn("fset", attrs)
1790 self.assertIn("fdel", attrs)
Georg Brandl479a7e72008-02-05 18:13:15 +00001791
1792 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001793 self.assertTrue(raw.fget is C.__dict__['getx'])
1794 self.assertTrue(raw.fset is C.__dict__['setx'])
1795 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl479a7e72008-02-05 18:13:15 +00001796
1797 for attr in "__doc__", "fget", "fset", "fdel":
1798 try:
1799 setattr(raw, attr, 42)
1800 except AttributeError as msg:
1801 if str(msg).find('readonly') < 0:
1802 self.fail("when setting readonly attr %r on a property, "
1803 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1804 else:
1805 self.fail("expected AttributeError from trying to set readonly %r "
1806 "attr on a property" % attr)
1807
1808 class D(object):
1809 __getitem__ = property(lambda s: 1/0)
1810
1811 d = D()
1812 try:
1813 for i in d:
1814 str(i)
1815 except ZeroDivisionError:
1816 pass
1817 else:
1818 self.fail("expected ZeroDivisionError from bad property")
1819
R. David Murray378c0cf2010-02-24 01:46:21 +00001820 @unittest.skipIf(sys.flags.optimize >= 2,
1821 "Docstrings are omitted with -O2 and above")
1822 def test_properties_doc_attrib(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001823 class E(object):
1824 def getter(self):
1825 "getter method"
1826 return 0
1827 def setter(self_, value):
1828 "setter method"
1829 pass
1830 prop = property(getter)
1831 self.assertEqual(prop.__doc__, "getter method")
1832 prop2 = property(fset=setter)
1833 self.assertEqual(prop2.__doc__, None)
1834
R. David Murray378c0cf2010-02-24 01:46:21 +00001835 def test_testcapi_no_segfault(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001836 # this segfaulted in 2.5b2
1837 try:
1838 import _testcapi
1839 except ImportError:
1840 pass
1841 else:
1842 class X(object):
1843 p = property(_testcapi.test_with_docstring)
1844
1845 def test_properties_plus(self):
1846 class C(object):
1847 foo = property(doc="hello")
1848 @foo.getter
1849 def foo(self):
1850 return self._foo
1851 @foo.setter
1852 def foo(self, value):
1853 self._foo = abs(value)
1854 @foo.deleter
1855 def foo(self):
1856 del self._foo
1857 c = C()
1858 self.assertEqual(C.foo.__doc__, "hello")
1859 self.assertFalse(hasattr(c, "foo"))
1860 c.foo = -42
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001861 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl479a7e72008-02-05 18:13:15 +00001862 self.assertEqual(c._foo, 42)
1863 self.assertEqual(c.foo, 42)
1864 del c.foo
1865 self.assertFalse(hasattr(c, '_foo'))
1866 self.assertFalse(hasattr(c, "foo"))
1867
1868 class D(C):
1869 @C.foo.deleter
1870 def foo(self):
1871 try:
1872 del self._foo
1873 except AttributeError:
1874 pass
1875 d = D()
1876 d.foo = 24
1877 self.assertEqual(d.foo, 24)
1878 del d.foo
1879 del d.foo
1880
1881 class E(object):
1882 @property
1883 def foo(self):
1884 return self._foo
1885 @foo.setter
1886 def foo(self, value):
1887 raise RuntimeError
1888 @foo.setter
1889 def foo(self, value):
1890 self._foo = abs(value)
1891 @foo.deleter
1892 def foo(self, value=None):
1893 del self._foo
1894
1895 e = E()
1896 e.foo = -42
1897 self.assertEqual(e.foo, 42)
1898 del e.foo
1899
1900 class F(E):
1901 @E.foo.deleter
1902 def foo(self):
1903 del self._foo
1904 @foo.setter
1905 def foo(self, value):
1906 self._foo = max(0, value)
1907 f = F()
1908 f.foo = -10
1909 self.assertEqual(f.foo, 0)
1910 del f.foo
1911
1912 def test_dict_constructors(self):
1913 # Testing dict constructor ...
1914 d = dict()
1915 self.assertEqual(d, {})
1916 d = dict({})
1917 self.assertEqual(d, {})
1918 d = dict({1: 2, 'a': 'b'})
1919 self.assertEqual(d, {1: 2, 'a': 'b'})
1920 self.assertEqual(d, dict(list(d.items())))
1921 self.assertEqual(d, dict(iter(d.items())))
1922 d = dict({'one':1, 'two':2})
1923 self.assertEqual(d, dict(one=1, two=2))
1924 self.assertEqual(d, dict(**d))
1925 self.assertEqual(d, dict({"one": 1}, two=2))
1926 self.assertEqual(d, dict([("two", 2)], one=1))
1927 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1928 self.assertEqual(d, dict(**d))
1929
1930 for badarg in 0, 0, 0j, "0", [0], (0,):
1931 try:
1932 dict(badarg)
1933 except TypeError:
1934 pass
1935 except ValueError:
1936 if badarg == "0":
1937 # It's a sequence, and its elements are also sequences (gotta
1938 # love strings <wink>), but they aren't of length 2, so this
1939 # one seemed better as a ValueError than a TypeError.
1940 pass
1941 else:
1942 self.fail("no TypeError from dict(%r)" % badarg)
1943 else:
1944 self.fail("no TypeError from dict(%r)" % badarg)
1945
1946 try:
1947 dict({}, {})
1948 except TypeError:
1949 pass
1950 else:
1951 self.fail("no TypeError from dict({}, {})")
1952
1953 class Mapping:
1954 # Lacks a .keys() method; will be added later.
1955 dict = {1:2, 3:4, 'a':1j}
1956
1957 try:
1958 dict(Mapping())
1959 except TypeError:
1960 pass
1961 else:
1962 self.fail("no TypeError from dict(incomplete mapping)")
1963
1964 Mapping.keys = lambda self: list(self.dict.keys())
1965 Mapping.__getitem__ = lambda self, i: self.dict[i]
1966 d = dict(Mapping())
1967 self.assertEqual(d, Mapping.dict)
1968
1969 # Init from sequence of iterable objects, each producing a 2-sequence.
1970 class AddressBookEntry:
1971 def __init__(self, first, last):
1972 self.first = first
1973 self.last = last
1974 def __iter__(self):
1975 return iter([self.first, self.last])
1976
1977 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1978 AddressBookEntry('Barry', 'Peters'),
1979 AddressBookEntry('Tim', 'Peters'),
1980 AddressBookEntry('Barry', 'Warsaw')])
1981 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1982
1983 d = dict(zip(range(4), range(1, 5)))
1984 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1985
1986 # Bad sequence lengths.
1987 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1988 try:
1989 dict(bad)
1990 except ValueError:
1991 pass
1992 else:
1993 self.fail("no ValueError from dict(%r)" % bad)
1994
1995 def test_dir(self):
1996 # Testing dir() ...
1997 junk = 12
1998 self.assertEqual(dir(), ['junk', 'self'])
1999 del junk
2000
2001 # Just make sure these don't blow up!
2002 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
2003 dir(arg)
2004
2005 # Test dir on new-style classes. Since these have object as a
2006 # base class, a lot more gets sucked in.
2007 def interesting(strings):
2008 return [s for s in strings if not s.startswith('_')]
2009
2010 class C(object):
2011 Cdata = 1
2012 def Cmethod(self): pass
2013
2014 cstuff = ['Cdata', 'Cmethod']
2015 self.assertEqual(interesting(dir(C)), cstuff)
2016
2017 c = C()
2018 self.assertEqual(interesting(dir(c)), cstuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002019 ## self.assertIn('__self__', dir(C.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002020
2021 c.cdata = 2
2022 c.cmethod = lambda self: 0
2023 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002024 ## self.assertIn('__self__', dir(c.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002025
2026 class A(C):
2027 Adata = 1
2028 def Amethod(self): pass
2029
2030 astuff = ['Adata', 'Amethod'] + cstuff
2031 self.assertEqual(interesting(dir(A)), astuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002032 ## self.assertIn('__self__', dir(A.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002033 a = A()
2034 self.assertEqual(interesting(dir(a)), astuff)
2035 a.adata = 42
2036 a.amethod = lambda self: 3
2037 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002038 ## self.assertIn('__self__', dir(a.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002039
2040 # Try a module subclass.
2041 import sys
2042 class M(type(sys)):
2043 pass
2044 minstance = M("m")
2045 minstance.b = 2
2046 minstance.a = 1
2047 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2048 self.assertEqual(names, ['a', 'b'])
2049
2050 class M2(M):
2051 def getdict(self):
2052 return "Not a dict!"
2053 __dict__ = property(getdict)
2054
2055 m2instance = M2("m2")
2056 m2instance.b = 2
2057 m2instance.a = 1
2058 self.assertEqual(m2instance.__dict__, "Not a dict!")
2059 try:
2060 dir(m2instance)
2061 except TypeError:
2062 pass
2063
2064 # Two essentially featureless objects, just inheriting stuff from
2065 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002066 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2067 if support.check_impl_detail():
2068 # None differs in PyPy: it has a __nonzero__
2069 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002070
2071 # Nasty test case for proxied objects
2072 class Wrapper(object):
2073 def __init__(self, obj):
2074 self.__obj = obj
2075 def __repr__(self):
2076 return "Wrapper(%s)" % repr(self.__obj)
2077 def __getitem__(self, key):
2078 return Wrapper(self.__obj[key])
2079 def __len__(self):
2080 return len(self.__obj)
2081 def __getattr__(self, name):
2082 return Wrapper(getattr(self.__obj, name))
2083
2084 class C(object):
2085 def __getclass(self):
2086 return Wrapper(type(self))
2087 __class__ = property(__getclass)
2088
2089 dir(C()) # This used to segfault
2090
2091 def test_supers(self):
2092 # Testing super...
2093
2094 class A(object):
2095 def meth(self, a):
2096 return "A(%r)" % a
2097
2098 self.assertEqual(A().meth(1), "A(1)")
2099
2100 class B(A):
2101 def __init__(self):
2102 self.__super = super(B, self)
2103 def meth(self, a):
2104 return "B(%r)" % a + self.__super.meth(a)
2105
2106 self.assertEqual(B().meth(2), "B(2)A(2)")
2107
2108 class C(A):
2109 def meth(self, a):
2110 return "C(%r)" % a + self.__super.meth(a)
2111 C._C__super = super(C)
2112
2113 self.assertEqual(C().meth(3), "C(3)A(3)")
2114
2115 class D(C, B):
2116 def meth(self, a):
2117 return "D(%r)" % a + super(D, self).meth(a)
2118
2119 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2120
2121 # Test for subclassing super
2122
2123 class mysuper(super):
2124 def __init__(self, *args):
2125 return super(mysuper, self).__init__(*args)
2126
2127 class E(D):
2128 def meth(self, a):
2129 return "E(%r)" % a + mysuper(E, self).meth(a)
2130
2131 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2132
2133 class F(E):
2134 def meth(self, a):
2135 s = self.__super # == mysuper(F, self)
2136 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2137 F._F__super = mysuper(F)
2138
2139 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2140
2141 # Make sure certain errors are raised
2142
2143 try:
2144 super(D, 42)
2145 except TypeError:
2146 pass
2147 else:
2148 self.fail("shouldn't allow super(D, 42)")
2149
2150 try:
2151 super(D, C())
2152 except TypeError:
2153 pass
2154 else:
2155 self.fail("shouldn't allow super(D, C())")
2156
2157 try:
2158 super(D).__get__(12)
2159 except TypeError:
2160 pass
2161 else:
2162 self.fail("shouldn't allow super(D).__get__(12)")
2163
2164 try:
2165 super(D).__get__(C())
2166 except TypeError:
2167 pass
2168 else:
2169 self.fail("shouldn't allow super(D).__get__(C())")
2170
2171 # Make sure data descriptors can be overridden and accessed via super
2172 # (new feature in Python 2.3)
2173
2174 class DDbase(object):
2175 def getx(self): return 42
2176 x = property(getx)
2177
2178 class DDsub(DDbase):
2179 def getx(self): return "hello"
2180 x = property(getx)
2181
2182 dd = DDsub()
2183 self.assertEqual(dd.x, "hello")
2184 self.assertEqual(super(DDsub, dd).x, 42)
2185
2186 # Ensure that super() lookup of descriptor from classmethod
2187 # works (SF ID# 743627)
2188
2189 class Base(object):
2190 aProp = property(lambda self: "foo")
2191
2192 class Sub(Base):
2193 @classmethod
2194 def test(klass):
2195 return super(Sub,klass).aProp
2196
2197 self.assertEqual(Sub.test(), Base.aProp)
2198
2199 # Verify that super() doesn't allow keyword args
2200 try:
2201 super(Base, kw=1)
2202 except TypeError:
2203 pass
2204 else:
2205 self.assertEqual("super shouldn't accept keyword args")
2206
2207 def test_basic_inheritance(self):
2208 # Testing inheritance from basic types...
2209
2210 class hexint(int):
2211 def __repr__(self):
2212 return hex(self)
2213 def __add__(self, other):
2214 return hexint(int.__add__(self, other))
2215 # (Note that overriding __radd__ doesn't work,
2216 # because the int type gets first dibs.)
2217 self.assertEqual(repr(hexint(7) + 9), "0x10")
2218 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2219 a = hexint(12345)
2220 self.assertEqual(a, 12345)
2221 self.assertEqual(int(a), 12345)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002222 self.assertTrue(int(a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002223 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002224 self.assertTrue((+a).__class__ is int)
2225 self.assertTrue((a >> 0).__class__ is int)
2226 self.assertTrue((a << 0).__class__ is int)
2227 self.assertTrue((hexint(0) << 12).__class__ is int)
2228 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002229
2230 class octlong(int):
2231 __slots__ = []
2232 def __str__(self):
Mark Dickinson5c2db372009-12-05 20:28:34 +00002233 return oct(self)
Georg Brandl479a7e72008-02-05 18:13:15 +00002234 def __add__(self, other):
2235 return self.__class__(super(octlong, self).__add__(other))
2236 __radd__ = __add__
2237 self.assertEqual(str(octlong(3) + 5), "0o10")
2238 # (Note that overriding __radd__ here only seems to work
2239 # because the example uses a short int left argument.)
2240 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2241 a = octlong(12345)
2242 self.assertEqual(a, 12345)
2243 self.assertEqual(int(a), 12345)
2244 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002245 self.assertTrue(int(a).__class__ is int)
2246 self.assertTrue((+a).__class__ is int)
2247 self.assertTrue((-a).__class__ is int)
2248 self.assertTrue((-octlong(0)).__class__ is int)
2249 self.assertTrue((a >> 0).__class__ is int)
2250 self.assertTrue((a << 0).__class__ is int)
2251 self.assertTrue((a - 0).__class__ is int)
2252 self.assertTrue((a * 1).__class__ is int)
2253 self.assertTrue((a ** 1).__class__ is int)
2254 self.assertTrue((a // 1).__class__ is int)
2255 self.assertTrue((1 * a).__class__ is int)
2256 self.assertTrue((a | 0).__class__ is int)
2257 self.assertTrue((a ^ 0).__class__ is int)
2258 self.assertTrue((a & -1).__class__ is int)
2259 self.assertTrue((octlong(0) << 12).__class__ is int)
2260 self.assertTrue((octlong(0) >> 12).__class__ is int)
2261 self.assertTrue(abs(octlong(0)).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002262
2263 # Because octlong overrides __add__, we can't check the absence of +0
2264 # optimizations using octlong.
2265 class longclone(int):
2266 pass
2267 a = longclone(1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002268 self.assertTrue((a + 0).__class__ is int)
2269 self.assertTrue((0 + a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002270
2271 # Check that negative clones don't segfault
2272 a = longclone(-1)
2273 self.assertEqual(a.__dict__, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002274 self.assertEqual(int(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl479a7e72008-02-05 18:13:15 +00002275
2276 class precfloat(float):
2277 __slots__ = ['prec']
2278 def __init__(self, value=0.0, prec=12):
2279 self.prec = int(prec)
2280 def __repr__(self):
2281 return "%.*g" % (self.prec, self)
2282 self.assertEqual(repr(precfloat(1.1)), "1.1")
2283 a = precfloat(12345)
2284 self.assertEqual(a, 12345.0)
2285 self.assertEqual(float(a), 12345.0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002286 self.assertTrue(float(a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002287 self.assertEqual(hash(a), hash(12345.0))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002288 self.assertTrue((+a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002289
2290 class madcomplex(complex):
2291 def __repr__(self):
2292 return "%.17gj%+.17g" % (self.imag, self.real)
2293 a = madcomplex(-3, 4)
2294 self.assertEqual(repr(a), "4j-3")
2295 base = complex(-3, 4)
2296 self.assertEqual(base.__class__, complex)
2297 self.assertEqual(a, base)
2298 self.assertEqual(complex(a), base)
2299 self.assertEqual(complex(a).__class__, complex)
2300 a = madcomplex(a) # just trying another form of the constructor
2301 self.assertEqual(repr(a), "4j-3")
2302 self.assertEqual(a, base)
2303 self.assertEqual(complex(a), base)
2304 self.assertEqual(complex(a).__class__, complex)
2305 self.assertEqual(hash(a), hash(base))
2306 self.assertEqual((+a).__class__, complex)
2307 self.assertEqual((a + 0).__class__, complex)
2308 self.assertEqual(a + 0, base)
2309 self.assertEqual((a - 0).__class__, complex)
2310 self.assertEqual(a - 0, base)
2311 self.assertEqual((a * 1).__class__, complex)
2312 self.assertEqual(a * 1, base)
2313 self.assertEqual((a / 1).__class__, complex)
2314 self.assertEqual(a / 1, base)
2315
2316 class madtuple(tuple):
2317 _rev = None
2318 def rev(self):
2319 if self._rev is not None:
2320 return self._rev
2321 L = list(self)
2322 L.reverse()
2323 self._rev = self.__class__(L)
2324 return self._rev
2325 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2326 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2327 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2328 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2329 for i in range(512):
2330 t = madtuple(range(i))
2331 u = t.rev()
2332 v = u.rev()
2333 self.assertEqual(v, t)
2334 a = madtuple((1,2,3,4,5))
2335 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002336 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002337 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002338 self.assertTrue(a[:].__class__ is tuple)
2339 self.assertTrue((a * 1).__class__ is tuple)
2340 self.assertTrue((a * 0).__class__ is tuple)
2341 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002342 a = madtuple(())
2343 self.assertEqual(tuple(a), ())
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002344 self.assertTrue(tuple(a).__class__ is tuple)
2345 self.assertTrue((a + a).__class__ is tuple)
2346 self.assertTrue((a * 0).__class__ is tuple)
2347 self.assertTrue((a * 1).__class__ is tuple)
2348 self.assertTrue((a * 2).__class__ is tuple)
2349 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002350
2351 class madstring(str):
2352 _rev = None
2353 def rev(self):
2354 if self._rev is not None:
2355 return self._rev
2356 L = list(self)
2357 L.reverse()
2358 self._rev = self.__class__("".join(L))
2359 return self._rev
2360 s = madstring("abcdefghijklmnopqrstuvwxyz")
2361 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2362 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2363 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2364 for i in range(256):
2365 s = madstring("".join(map(chr, range(i))))
2366 t = s.rev()
2367 u = t.rev()
2368 self.assertEqual(u, s)
2369 s = madstring("12345")
2370 self.assertEqual(str(s), "12345")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002371 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002372
2373 base = "\x00" * 5
2374 s = madstring(base)
2375 self.assertEqual(s, base)
2376 self.assertEqual(str(s), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002377 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002378 self.assertEqual(hash(s), hash(base))
2379 self.assertEqual({s: 1}[base], 1)
2380 self.assertEqual({base: 1}[s], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002381 self.assertTrue((s + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002382 self.assertEqual(s + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002383 self.assertTrue(("" + s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002384 self.assertEqual("" + s, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002385 self.assertTrue((s * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002386 self.assertEqual(s * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002387 self.assertTrue((s * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002388 self.assertEqual(s * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002389 self.assertTrue((s * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002390 self.assertEqual(s * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002391 self.assertTrue(s[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002392 self.assertEqual(s[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002393 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002394 self.assertEqual(s[0:0], "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002395 self.assertTrue(s.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002396 self.assertEqual(s.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002397 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002398 self.assertEqual(s.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002399 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002400 self.assertEqual(s.rstrip(), base)
2401 identitytab = {}
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002402 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002403 self.assertEqual(s.translate(identitytab), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002404 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002405 self.assertEqual(s.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002406 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002407 self.assertEqual(s.ljust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002408 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002409 self.assertEqual(s.rjust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002410 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002411 self.assertEqual(s.center(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002412 self.assertTrue(s.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002413 self.assertEqual(s.lower(), base)
2414
2415 class madunicode(str):
2416 _rev = None
2417 def rev(self):
2418 if self._rev is not None:
2419 return self._rev
2420 L = list(self)
2421 L.reverse()
2422 self._rev = self.__class__("".join(L))
2423 return self._rev
2424 u = madunicode("ABCDEF")
2425 self.assertEqual(u, "ABCDEF")
2426 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2427 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2428 base = "12345"
2429 u = madunicode(base)
2430 self.assertEqual(str(u), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002431 self.assertTrue(str(u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002432 self.assertEqual(hash(u), hash(base))
2433 self.assertEqual({u: 1}[base], 1)
2434 self.assertEqual({base: 1}[u], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002435 self.assertTrue(u.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002436 self.assertEqual(u.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002437 self.assertTrue(u.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002438 self.assertEqual(u.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002439 self.assertTrue(u.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002440 self.assertEqual(u.rstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002441 self.assertTrue(u.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002442 self.assertEqual(u.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002443 self.assertTrue(u.replace("xy", "xy").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002444 self.assertEqual(u.replace("xy", "xy"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002445 self.assertTrue(u.center(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002446 self.assertEqual(u.center(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002447 self.assertTrue(u.ljust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002448 self.assertEqual(u.ljust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002449 self.assertTrue(u.rjust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002450 self.assertEqual(u.rjust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002451 self.assertTrue(u.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002452 self.assertEqual(u.lower(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002453 self.assertTrue(u.upper().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002454 self.assertEqual(u.upper(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002455 self.assertTrue(u.capitalize().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002456 self.assertEqual(u.capitalize(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002457 self.assertTrue(u.title().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002458 self.assertEqual(u.title(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002459 self.assertTrue((u + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002460 self.assertEqual(u + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002461 self.assertTrue(("" + u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002462 self.assertEqual("" + u, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002463 self.assertTrue((u * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002464 self.assertEqual(u * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002465 self.assertTrue((u * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002466 self.assertEqual(u * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002467 self.assertTrue((u * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002468 self.assertEqual(u * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002469 self.assertTrue(u[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002470 self.assertEqual(u[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002471 self.assertTrue(u[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002472 self.assertEqual(u[0:0], "")
2473
2474 class sublist(list):
2475 pass
2476 a = sublist(range(5))
2477 self.assertEqual(a, list(range(5)))
2478 a.append("hello")
2479 self.assertEqual(a, list(range(5)) + ["hello"])
2480 a[5] = 5
2481 self.assertEqual(a, list(range(6)))
2482 a.extend(range(6, 20))
2483 self.assertEqual(a, list(range(20)))
2484 a[-5:] = []
2485 self.assertEqual(a, list(range(15)))
2486 del a[10:15]
2487 self.assertEqual(len(a), 10)
2488 self.assertEqual(a, list(range(10)))
2489 self.assertEqual(list(a), list(range(10)))
2490 self.assertEqual(a[0], 0)
2491 self.assertEqual(a[9], 9)
2492 self.assertEqual(a[-10], 0)
2493 self.assertEqual(a[-1], 9)
2494 self.assertEqual(a[:5], list(range(5)))
2495
2496 ## class CountedInput(file):
2497 ## """Counts lines read by self.readline().
2498 ##
2499 ## self.lineno is the 0-based ordinal of the last line read, up to
2500 ## a maximum of one greater than the number of lines in the file.
2501 ##
2502 ## self.ateof is true if and only if the final "" line has been read,
2503 ## at which point self.lineno stops incrementing, and further calls
2504 ## to readline() continue to return "".
2505 ## """
2506 ##
2507 ## lineno = 0
2508 ## ateof = 0
2509 ## def readline(self):
2510 ## if self.ateof:
2511 ## return ""
2512 ## s = file.readline(self)
2513 ## # Next line works too.
2514 ## # s = super(CountedInput, self).readline()
2515 ## self.lineno += 1
2516 ## if s == "":
2517 ## self.ateof = 1
2518 ## return s
2519 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002520 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002521 ## lines = ['a\n', 'b\n', 'c\n']
2522 ## try:
2523 ## f.writelines(lines)
2524 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002525 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002526 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2527 ## got = f.readline()
2528 ## self.assertEqual(expected, got)
2529 ## self.assertEqual(f.lineno, i)
2530 ## self.assertEqual(f.ateof, (i > len(lines)))
2531 ## f.close()
2532 ## finally:
2533 ## try:
2534 ## f.close()
2535 ## except:
2536 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002537 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002538
2539 def test_keywords(self):
2540 # Testing keyword args to basic type constructors ...
2541 self.assertEqual(int(x=1), 1)
2542 self.assertEqual(float(x=2), 2.0)
2543 self.assertEqual(int(x=3), 3)
2544 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2545 self.assertEqual(str(object=500), '500')
2546 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2547 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2548 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2549 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2550
2551 for constructor in (int, float, int, complex, str, str,
2552 tuple, list):
2553 try:
2554 constructor(bogus_keyword_arg=1)
2555 except TypeError:
2556 pass
2557 else:
2558 self.fail("expected TypeError from bogus keyword argument to %r"
2559 % constructor)
2560
2561 def test_str_subclass_as_dict_key(self):
2562 # Testing a str subclass used as dict key ..
2563
2564 class cistr(str):
2565 """Sublcass of str that computes __eq__ case-insensitively.
2566
2567 Also computes a hash code of the string in canonical form.
2568 """
2569
2570 def __init__(self, value):
2571 self.canonical = value.lower()
2572 self.hashcode = hash(self.canonical)
2573
2574 def __eq__(self, other):
2575 if not isinstance(other, cistr):
2576 other = cistr(other)
2577 return self.canonical == other.canonical
2578
2579 def __hash__(self):
2580 return self.hashcode
2581
2582 self.assertEqual(cistr('ABC'), 'abc')
2583 self.assertEqual('aBc', cistr('ABC'))
2584 self.assertEqual(str(cistr('ABC')), 'ABC')
2585
2586 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2587 self.assertEqual(d[cistr('one')], 1)
2588 self.assertEqual(d[cistr('tWo')], 2)
2589 self.assertEqual(d[cistr('THrEE')], 3)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002590 self.assertIn(cistr('ONe'), d)
Georg Brandl479a7e72008-02-05 18:13:15 +00002591 self.assertEqual(d.get(cistr('thrEE')), 3)
2592
2593 def test_classic_comparisons(self):
2594 # Testing classic comparisons...
2595 class classic:
2596 pass
2597
2598 for base in (classic, int, object):
2599 class C(base):
2600 def __init__(self, value):
2601 self.value = int(value)
2602 def __eq__(self, other):
2603 if isinstance(other, C):
2604 return self.value == other.value
2605 if isinstance(other, int) or isinstance(other, int):
2606 return self.value == other
2607 return NotImplemented
2608 def __ne__(self, other):
2609 if isinstance(other, C):
2610 return self.value != other.value
2611 if isinstance(other, int) or isinstance(other, int):
2612 return self.value != other
2613 return NotImplemented
2614 def __lt__(self, other):
2615 if isinstance(other, C):
2616 return self.value < other.value
2617 if isinstance(other, int) or isinstance(other, int):
2618 return self.value < other
2619 return NotImplemented
2620 def __le__(self, other):
2621 if isinstance(other, C):
2622 return self.value <= other.value
2623 if isinstance(other, int) or isinstance(other, int):
2624 return self.value <= other
2625 return NotImplemented
2626 def __gt__(self, other):
2627 if isinstance(other, C):
2628 return self.value > other.value
2629 if isinstance(other, int) or isinstance(other, int):
2630 return self.value > other
2631 return NotImplemented
2632 def __ge__(self, other):
2633 if isinstance(other, C):
2634 return self.value >= other.value
2635 if isinstance(other, int) or isinstance(other, int):
2636 return self.value >= other
2637 return NotImplemented
2638
2639 c1 = C(1)
2640 c2 = C(2)
2641 c3 = C(3)
2642 self.assertEqual(c1, 1)
2643 c = {1: c1, 2: c2, 3: c3}
2644 for x in 1, 2, 3:
2645 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002646 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002647 self.assertTrue(eval("c[x] %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002648 eval("x %s y" % op),
2649 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002650 self.assertTrue(eval("c[x] %s 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("x %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002654 eval("x %s y" % op),
2655 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002656
2657 def test_rich_comparisons(self):
2658 # Testing rich comparisons...
2659 class Z(complex):
2660 pass
2661 z = Z(1)
2662 self.assertEqual(z, 1+0j)
2663 self.assertEqual(1+0j, z)
2664 class ZZ(complex):
2665 def __eq__(self, other):
2666 try:
2667 return abs(self - other) <= 1e-6
2668 except:
2669 return NotImplemented
2670 zz = ZZ(1.0000003)
2671 self.assertEqual(zz, 1+0j)
2672 self.assertEqual(1+0j, zz)
2673
2674 class classic:
2675 pass
2676 for base in (classic, int, object, list):
2677 class C(base):
2678 def __init__(self, value):
2679 self.value = int(value)
2680 def __cmp__(self_, other):
2681 self.fail("shouldn't call __cmp__")
2682 def __eq__(self, other):
2683 if isinstance(other, C):
2684 return self.value == other.value
2685 if isinstance(other, int) or isinstance(other, int):
2686 return self.value == other
2687 return NotImplemented
2688 def __ne__(self, other):
2689 if isinstance(other, C):
2690 return self.value != other.value
2691 if isinstance(other, int) or isinstance(other, int):
2692 return self.value != other
2693 return NotImplemented
2694 def __lt__(self, other):
2695 if isinstance(other, C):
2696 return self.value < other.value
2697 if isinstance(other, int) or isinstance(other, int):
2698 return self.value < other
2699 return NotImplemented
2700 def __le__(self, other):
2701 if isinstance(other, C):
2702 return self.value <= other.value
2703 if isinstance(other, int) or isinstance(other, int):
2704 return self.value <= other
2705 return NotImplemented
2706 def __gt__(self, other):
2707 if isinstance(other, C):
2708 return self.value > other.value
2709 if isinstance(other, int) or isinstance(other, int):
2710 return self.value > other
2711 return NotImplemented
2712 def __ge__(self, other):
2713 if isinstance(other, C):
2714 return self.value >= other.value
2715 if isinstance(other, int) or isinstance(other, int):
2716 return self.value >= other
2717 return NotImplemented
2718 c1 = C(1)
2719 c2 = C(2)
2720 c3 = C(3)
2721 self.assertEqual(c1, 1)
2722 c = {1: c1, 2: c2, 3: c3}
2723 for x in 1, 2, 3:
2724 for y in 1, 2, 3:
2725 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002726 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002727 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002728 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002729 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002730 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002731 "x=%d, y=%d" % (x, y))
2732
2733 def test_descrdoc(self):
2734 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002735 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002736 def check(descr, what):
2737 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002738 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002739 check(complex.real, "the real part of a complex number") # member descriptor
2740
2741 def test_doc_descriptor(self):
2742 # Testing __doc__ descriptor...
2743 # SF bug 542984
2744 class DocDescr(object):
2745 def __get__(self, object, otype):
2746 if object:
2747 object = object.__class__.__name__ + ' instance'
2748 if otype:
2749 otype = otype.__name__
2750 return 'object=%s; type=%s' % (object, otype)
2751 class OldClass:
2752 __doc__ = DocDescr()
2753 class NewClass(object):
2754 __doc__ = DocDescr()
2755 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2756 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2757 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2758 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2759
2760 def test_set_class(self):
2761 # Testing __class__ assignment...
2762 class C(object): pass
2763 class D(object): pass
2764 class E(object): pass
2765 class F(D, E): pass
2766 for cls in C, D, E, F:
2767 for cls2 in C, D, E, F:
2768 x = cls()
2769 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002770 self.assertTrue(x.__class__ is cls2)
Georg Brandl479a7e72008-02-05 18:13:15 +00002771 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002772 self.assertTrue(x.__class__ is cls)
Georg Brandl479a7e72008-02-05 18:13:15 +00002773 def cant(x, C):
2774 try:
2775 x.__class__ = C
2776 except TypeError:
2777 pass
2778 else:
2779 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2780 try:
2781 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002782 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002783 pass
2784 else:
2785 self.fail("shouldn't allow del %r.__class__" % x)
2786 cant(C(), list)
2787 cant(list(), C)
2788 cant(C(), 1)
2789 cant(C(), object)
2790 cant(object(), list)
2791 cant(list(), object)
2792 class Int(int): __slots__ = []
2793 cant(2, Int)
2794 cant(Int(), int)
2795 cant(True, int)
2796 cant(2, bool)
2797 o = object()
2798 cant(o, type(1))
2799 cant(o, type(None))
2800 del o
2801 class G(object):
2802 __slots__ = ["a", "b"]
2803 class H(object):
2804 __slots__ = ["b", "a"]
2805 class I(object):
2806 __slots__ = ["a", "b"]
2807 class J(object):
2808 __slots__ = ["c", "b"]
2809 class K(object):
2810 __slots__ = ["a", "b", "d"]
2811 class L(H):
2812 __slots__ = ["e"]
2813 class M(I):
2814 __slots__ = ["e"]
2815 class N(J):
2816 __slots__ = ["__weakref__"]
2817 class P(J):
2818 __slots__ = ["__dict__"]
2819 class Q(J):
2820 pass
2821 class R(J):
2822 __slots__ = ["__dict__", "__weakref__"]
2823
2824 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2825 x = cls()
2826 x.a = 1
2827 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002828 self.assertTrue(x.__class__ is cls2,
Georg Brandl479a7e72008-02-05 18:13:15 +00002829 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2830 self.assertEqual(x.a, 1)
2831 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002832 self.assertTrue(x.__class__ is cls,
Georg Brandl479a7e72008-02-05 18:13:15 +00002833 "assigning %r as __class__ for %r silently failed" % (cls, x))
2834 self.assertEqual(x.a, 1)
2835 for cls in G, J, K, L, M, N, P, R, list, Int:
2836 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2837 if cls is cls2:
2838 continue
2839 cant(cls(), cls2)
2840
Benjamin Peterson193152c2009-04-25 01:08:45 +00002841 # Issue5283: when __class__ changes in __del__, the wrong
2842 # type gets DECREF'd.
2843 class O(object):
2844 pass
2845 class A(object):
2846 def __del__(self):
2847 self.__class__ = O
2848 l = [A() for x in range(100)]
2849 del l
2850
Georg Brandl479a7e72008-02-05 18:13:15 +00002851 def test_set_dict(self):
2852 # Testing __dict__ assignment...
2853 class C(object): pass
2854 a = C()
2855 a.__dict__ = {'b': 1}
2856 self.assertEqual(a.b, 1)
2857 def cant(x, dict):
2858 try:
2859 x.__dict__ = dict
2860 except (AttributeError, TypeError):
2861 pass
2862 else:
2863 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2864 cant(a, None)
2865 cant(a, [])
2866 cant(a, 1)
2867 del a.__dict__ # Deleting __dict__ is allowed
2868
2869 class Base(object):
2870 pass
2871 def verify_dict_readonly(x):
2872 """
2873 x has to be an instance of a class inheriting from Base.
2874 """
2875 cant(x, {})
2876 try:
2877 del x.__dict__
2878 except (AttributeError, TypeError):
2879 pass
2880 else:
2881 self.fail("shouldn't allow del %r.__dict__" % x)
2882 dict_descr = Base.__dict__["__dict__"]
2883 try:
2884 dict_descr.__set__(x, {})
2885 except (AttributeError, TypeError):
2886 pass
2887 else:
2888 self.fail("dict_descr allowed access to %r's dict" % x)
2889
2890 # Classes don't allow __dict__ assignment and have readonly dicts
2891 class Meta1(type, Base):
2892 pass
2893 class Meta2(Base, type):
2894 pass
2895 class D(object, metaclass=Meta1):
2896 pass
2897 class E(object, metaclass=Meta2):
2898 pass
2899 for cls in C, D, E:
2900 verify_dict_readonly(cls)
2901 class_dict = cls.__dict__
2902 try:
2903 class_dict["spam"] = "eggs"
2904 except TypeError:
2905 pass
2906 else:
2907 self.fail("%r's __dict__ can be modified" % cls)
2908
2909 # Modules also disallow __dict__ assignment
2910 class Module1(types.ModuleType, Base):
2911 pass
2912 class Module2(Base, types.ModuleType):
2913 pass
2914 for ModuleType in Module1, Module2:
2915 mod = ModuleType("spam")
2916 verify_dict_readonly(mod)
2917 mod.__dict__["spam"] = "eggs"
2918
2919 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002920 # (at least not any more than regular exception's __dict__ can
2921 # be deleted; on CPython it is not the case, whereas on PyPy they
2922 # can, just like any other new-style instance's __dict__.)
2923 def can_delete_dict(e):
2924 try:
2925 del e.__dict__
2926 except (TypeError, AttributeError):
2927 return False
2928 else:
2929 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002930 class Exception1(Exception, Base):
2931 pass
2932 class Exception2(Base, Exception):
2933 pass
2934 for ExceptionType in Exception, Exception1, Exception2:
2935 e = ExceptionType()
2936 e.__dict__ = {"a": 1}
2937 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002938 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002939
2940 def test_pickles(self):
2941 # Testing pickling and copying new-style classes and objects...
2942 import pickle
2943
2944 def sorteditems(d):
2945 L = list(d.items())
2946 L.sort()
2947 return L
2948
2949 global C
2950 class C(object):
2951 def __init__(self, a, b):
2952 super(C, self).__init__()
2953 self.a = a
2954 self.b = b
2955 def __repr__(self):
2956 return "C(%r, %r)" % (self.a, self.b)
2957
2958 global C1
2959 class C1(list):
2960 def __new__(cls, a, b):
2961 return super(C1, cls).__new__(cls)
2962 def __getnewargs__(self):
2963 return (self.a, self.b)
2964 def __init__(self, a, b):
2965 self.a = a
2966 self.b = b
2967 def __repr__(self):
2968 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2969
2970 global C2
2971 class C2(int):
2972 def __new__(cls, a, b, val=0):
2973 return super(C2, cls).__new__(cls, val)
2974 def __getnewargs__(self):
2975 return (self.a, self.b, int(self))
2976 def __init__(self, a, b, val=0):
2977 self.a = a
2978 self.b = b
2979 def __repr__(self):
2980 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2981
2982 global C3
2983 class C3(object):
2984 def __init__(self, foo):
2985 self.foo = foo
2986 def __getstate__(self):
2987 return self.foo
2988 def __setstate__(self, foo):
2989 self.foo = foo
2990
2991 global C4classic, C4
2992 class C4classic: # classic
2993 pass
2994 class C4(C4classic, object): # mixed inheritance
2995 pass
2996
Guido van Rossum3926a632001-09-25 16:25:58 +00002997 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00002998 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00002999 s = pickle.dumps(cls, bin)
3000 cls2 = pickle.loads(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003001 self.assertTrue(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00003002
3003 a = C1(1, 2); a.append(42); a.append(24)
3004 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003005 s = pickle.dumps((a, b), bin)
3006 x, y = pickle.loads(s)
3007 self.assertEqual(x.__class__, a.__class__)
3008 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3009 self.assertEqual(y.__class__, b.__class__)
3010 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3011 self.assertEqual(repr(x), repr(a))
3012 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003013 # Test for __getstate__ and __setstate__ on new style class
3014 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003015 s = pickle.dumps(u, bin)
3016 v = pickle.loads(s)
3017 self.assertEqual(u.__class__, v.__class__)
3018 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003019 # Test for picklability of hybrid class
3020 u = C4()
3021 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003022 s = pickle.dumps(u, bin)
3023 v = pickle.loads(s)
3024 self.assertEqual(u.__class__, v.__class__)
3025 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003026
Georg Brandl479a7e72008-02-05 18:13:15 +00003027 # Testing copy.deepcopy()
3028 import copy
3029 for cls in C, C1, C2:
3030 cls2 = copy.deepcopy(cls)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003031 self.assertTrue(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003032
Georg Brandl479a7e72008-02-05 18:13:15 +00003033 a = C1(1, 2); a.append(42); a.append(24)
3034 b = C2("hello", "world", 42)
3035 x, y = copy.deepcopy((a, b))
3036 self.assertEqual(x.__class__, a.__class__)
3037 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3038 self.assertEqual(y.__class__, b.__class__)
3039 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3040 self.assertEqual(repr(x), repr(a))
3041 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003042
Georg Brandl479a7e72008-02-05 18:13:15 +00003043 def test_pickle_slots(self):
3044 # Testing pickling of classes with __slots__ ...
3045 import pickle
3046 # Pickling of classes with __slots__ but without __getstate__ should fail
3047 # (if using protocol 0 or 1)
3048 global B, C, D, E
3049 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003050 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003051 for base in [object, B]:
3052 class C(base):
3053 __slots__ = ['a']
3054 class D(C):
3055 pass
3056 try:
3057 pickle.dumps(C(), 0)
3058 except TypeError:
3059 pass
3060 else:
3061 self.fail("should fail: pickle C instance - %s" % base)
3062 try:
3063 pickle.dumps(C(), 0)
3064 except TypeError:
3065 pass
3066 else:
3067 self.fail("should fail: pickle D instance - %s" % base)
3068 # Give C a nice generic __getstate__ and __setstate__
3069 class C(base):
3070 __slots__ = ['a']
3071 def __getstate__(self):
3072 try:
3073 d = self.__dict__.copy()
3074 except AttributeError:
3075 d = {}
3076 for cls in self.__class__.__mro__:
3077 for sn in cls.__dict__.get('__slots__', ()):
3078 try:
3079 d[sn] = getattr(self, sn)
3080 except AttributeError:
3081 pass
3082 return d
3083 def __setstate__(self, d):
3084 for k, v in list(d.items()):
3085 setattr(self, k, v)
3086 class D(C):
3087 pass
3088 # Now it should work
3089 x = C()
3090 y = pickle.loads(pickle.dumps(x))
3091 self.assertEqual(hasattr(y, 'a'), 0)
3092 x.a = 42
3093 y = pickle.loads(pickle.dumps(x))
3094 self.assertEqual(y.a, 42)
3095 x = D()
3096 x.a = 42
3097 x.b = 100
3098 y = pickle.loads(pickle.dumps(x))
3099 self.assertEqual(y.a + y.b, 142)
3100 # A subclass that adds a slot should also work
3101 class E(C):
3102 __slots__ = ['b']
3103 x = E()
3104 x.a = 42
3105 x.b = "foo"
3106 y = pickle.loads(pickle.dumps(x))
3107 self.assertEqual(y.a, x.a)
3108 self.assertEqual(y.b, x.b)
3109
3110 def test_binary_operator_override(self):
3111 # Testing overrides of binary operations...
3112 class I(int):
3113 def __repr__(self):
3114 return "I(%r)" % int(self)
3115 def __add__(self, other):
3116 return I(int(self) + int(other))
3117 __radd__ = __add__
3118 def __pow__(self, other, mod=None):
3119 if mod is None:
3120 return I(pow(int(self), int(other)))
3121 else:
3122 return I(pow(int(self), int(other), int(mod)))
3123 def __rpow__(self, other, mod=None):
3124 if mod is None:
3125 return I(pow(int(other), int(self), mod))
3126 else:
3127 return I(pow(int(other), int(self), int(mod)))
3128
3129 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3130 self.assertEqual(repr(I(1) + 2), "I(3)")
3131 self.assertEqual(repr(1 + I(2)), "I(3)")
3132 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3133 self.assertEqual(repr(2 ** I(3)), "I(8)")
3134 self.assertEqual(repr(I(2) ** 3), "I(8)")
3135 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3136 class S(str):
3137 def __eq__(self, other):
3138 return self.lower() == other.lower()
3139
3140 def test_subclass_propagation(self):
3141 # Testing propagation of slot functions to subclasses...
3142 class A(object):
3143 pass
3144 class B(A):
3145 pass
3146 class C(A):
3147 pass
3148 class D(B, C):
3149 pass
3150 d = D()
3151 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3152 A.__hash__ = lambda self: 42
3153 self.assertEqual(hash(d), 42)
3154 C.__hash__ = lambda self: 314
3155 self.assertEqual(hash(d), 314)
3156 B.__hash__ = lambda self: 144
3157 self.assertEqual(hash(d), 144)
3158 D.__hash__ = lambda self: 100
3159 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003160 D.__hash__ = None
3161 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003162 del D.__hash__
3163 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003164 B.__hash__ = None
3165 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003166 del B.__hash__
3167 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003168 C.__hash__ = None
3169 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003170 del C.__hash__
3171 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003172 A.__hash__ = None
3173 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003174 del A.__hash__
3175 self.assertEqual(hash(d), orig_hash)
3176 d.foo = 42
3177 d.bar = 42
3178 self.assertEqual(d.foo, 42)
3179 self.assertEqual(d.bar, 42)
3180 def __getattribute__(self, name):
3181 if name == "foo":
3182 return 24
3183 return object.__getattribute__(self, name)
3184 A.__getattribute__ = __getattribute__
3185 self.assertEqual(d.foo, 24)
3186 self.assertEqual(d.bar, 42)
3187 def __getattr__(self, name):
3188 if name in ("spam", "foo", "bar"):
3189 return "hello"
3190 raise AttributeError(name)
3191 B.__getattr__ = __getattr__
3192 self.assertEqual(d.spam, "hello")
3193 self.assertEqual(d.foo, 24)
3194 self.assertEqual(d.bar, 42)
3195 del A.__getattribute__
3196 self.assertEqual(d.foo, 42)
3197 del d.foo
3198 self.assertEqual(d.foo, "hello")
3199 self.assertEqual(d.bar, 42)
3200 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003201 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003202 d.foo
3203 except AttributeError:
3204 pass
3205 else:
3206 self.fail("d.foo should be undefined now")
3207
3208 # Test a nasty bug in recurse_down_subclasses()
3209 import gc
3210 class A(object):
3211 pass
3212 class B(A):
3213 pass
3214 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003215 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003216 A.__setitem__ = lambda *a: None # crash
3217
3218 def test_buffer_inheritance(self):
3219 # Testing that buffer interface is inherited ...
3220
3221 import binascii
3222 # SF bug [#470040] ParseTuple t# vs subclasses.
3223
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003224 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003225 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003226 base = b'abc'
3227 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003228 # b2a_hex uses the buffer interface to get its argument's value, via
3229 # PyArg_ParseTuple 't#' code.
3230 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3231
Georg Brandl479a7e72008-02-05 18:13:15 +00003232 class MyInt(int):
3233 pass
3234 m = MyInt(42)
3235 try:
3236 binascii.b2a_hex(m)
3237 self.fail('subclass of int should not have a buffer interface')
3238 except TypeError:
3239 pass
3240
3241 def test_str_of_str_subclass(self):
3242 # Testing __str__ defined in subclass of str ...
3243 import binascii
3244 import io
3245
3246 class octetstring(str):
3247 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003248 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003249 def __repr__(self):
3250 return self + " repr"
3251
3252 o = octetstring('A')
3253 self.assertEqual(type(o), octetstring)
3254 self.assertEqual(type(str(o)), str)
3255 self.assertEqual(type(repr(o)), str)
3256 self.assertEqual(ord(o), 0x41)
3257 self.assertEqual(str(o), '41')
3258 self.assertEqual(repr(o), 'A repr')
3259 self.assertEqual(o.__str__(), '41')
3260 self.assertEqual(o.__repr__(), 'A repr')
3261
3262 capture = io.StringIO()
3263 # Calling str() or not exercises different internal paths.
3264 print(o, file=capture)
3265 print(str(o), file=capture)
3266 self.assertEqual(capture.getvalue(), '41\n41\n')
3267 capture.close()
3268
3269 def test_keyword_arguments(self):
3270 # Testing keyword arguments to __init__, __call__...
3271 def f(a): return a
3272 self.assertEqual(f.__call__(a=42), 42)
3273 a = []
3274 list.__init__(a, sequence=[0, 1, 2])
3275 self.assertEqual(a, [0, 1, 2])
3276
3277 def test_recursive_call(self):
3278 # Testing recursive __call__() by setting to instance of class...
3279 class A(object):
3280 pass
3281
3282 A.__call__ = A()
3283 try:
3284 A()()
3285 except RuntimeError:
3286 pass
3287 else:
3288 self.fail("Recursion limit should have been reached for __call__()")
3289
3290 def test_delete_hook(self):
3291 # Testing __del__ hook...
3292 log = []
3293 class C(object):
3294 def __del__(self):
3295 log.append(1)
3296 c = C()
3297 self.assertEqual(log, [])
3298 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003299 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003300 self.assertEqual(log, [1])
3301
3302 class D(object): pass
3303 d = D()
3304 try: del d[0]
3305 except TypeError: pass
3306 else: self.fail("invalid del() didn't raise TypeError")
3307
3308 def test_hash_inheritance(self):
3309 # Testing hash of mutable subclasses...
3310
3311 class mydict(dict):
3312 pass
3313 d = mydict()
3314 try:
3315 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003316 except TypeError:
3317 pass
3318 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003319 self.fail("hash() of dict subclass should fail")
3320
3321 class mylist(list):
3322 pass
3323 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003324 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003325 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003326 except TypeError:
3327 pass
3328 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003329 self.fail("hash() of list subclass should fail")
3330
3331 def test_str_operations(self):
3332 try: 'a' + 5
3333 except TypeError: pass
3334 else: self.fail("'' + 5 doesn't raise TypeError")
3335
3336 try: ''.split('')
3337 except ValueError: pass
3338 else: self.fail("''.split('') doesn't raise ValueError")
3339
3340 try: ''.join([0])
3341 except TypeError: pass
3342 else: self.fail("''.join([0]) doesn't raise TypeError")
3343
3344 try: ''.rindex('5')
3345 except ValueError: pass
3346 else: self.fail("''.rindex('5') doesn't raise ValueError")
3347
3348 try: '%(n)s' % None
3349 except TypeError: pass
3350 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3351
3352 try: '%(n' % {}
3353 except ValueError: pass
3354 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3355
3356 try: '%*s' % ('abc')
3357 except TypeError: pass
3358 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3359
3360 try: '%*.*s' % ('abc', 5)
3361 except TypeError: pass
3362 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3363
3364 try: '%s' % (1, 2)
3365 except TypeError: pass
3366 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3367
3368 try: '%' % None
3369 except ValueError: pass
3370 else: self.fail("'%' % None doesn't raise ValueError")
3371
3372 self.assertEqual('534253'.isdigit(), 1)
3373 self.assertEqual('534253x'.isdigit(), 0)
3374 self.assertEqual('%c' % 5, '\x05')
3375 self.assertEqual('%c' % '5', '5')
3376
3377 def test_deepcopy_recursive(self):
3378 # Testing deepcopy of recursive objects...
3379 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003380 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003381 a = Node()
3382 b = Node()
3383 a.b = b
3384 b.a = a
3385 z = deepcopy(a) # This blew up before
3386
3387 def test_unintialized_modules(self):
3388 # Testing uninitialized module objects...
3389 from types import ModuleType as M
3390 m = M.__new__(M)
3391 str(m)
3392 self.assertEqual(hasattr(m, "__name__"), 0)
3393 self.assertEqual(hasattr(m, "__file__"), 0)
3394 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003395 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003396 m.foo = 1
3397 self.assertEqual(m.__dict__, {"foo": 1})
3398
3399 def test_funny_new(self):
3400 # Testing __new__ returning something unexpected...
3401 class C(object):
3402 def __new__(cls, arg):
3403 if isinstance(arg, str): return [1, 2, 3]
3404 elif isinstance(arg, int): return object.__new__(D)
3405 else: return object.__new__(cls)
3406 class D(C):
3407 def __init__(self, arg):
3408 self.foo = arg
3409 self.assertEqual(C("1"), [1, 2, 3])
3410 self.assertEqual(D("1"), [1, 2, 3])
3411 d = D(None)
3412 self.assertEqual(d.foo, None)
3413 d = C(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003414 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003415 self.assertEqual(d.foo, 1)
3416 d = D(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003417 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003418 self.assertEqual(d.foo, 1)
3419
3420 def test_imul_bug(self):
3421 # Testing for __imul__ problems...
3422 # SF bug 544647
3423 class C(object):
3424 def __imul__(self, other):
3425 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003426 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003427 y = x
3428 y *= 1.0
3429 self.assertEqual(y, (x, 1.0))
3430 y = x
3431 y *= 2
3432 self.assertEqual(y, (x, 2))
3433 y = x
3434 y *= 3
3435 self.assertEqual(y, (x, 3))
3436 y = x
3437 y *= 1<<100
3438 self.assertEqual(y, (x, 1<<100))
3439 y = x
3440 y *= None
3441 self.assertEqual(y, (x, None))
3442 y = x
3443 y *= "foo"
3444 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003445
Georg Brandl479a7e72008-02-05 18:13:15 +00003446 def test_copy_setstate(self):
3447 # Testing that copy.*copy() correctly uses __setstate__...
3448 import copy
3449 class C(object):
3450 def __init__(self, foo=None):
3451 self.foo = foo
3452 self.__foo = foo
3453 def setfoo(self, foo=None):
3454 self.foo = foo
3455 def getfoo(self):
3456 return self.__foo
3457 def __getstate__(self):
3458 return [self.foo]
3459 def __setstate__(self_, lst):
3460 self.assertEqual(len(lst), 1)
3461 self_.__foo = self_.foo = lst[0]
3462 a = C(42)
3463 a.setfoo(24)
3464 self.assertEqual(a.foo, 24)
3465 self.assertEqual(a.getfoo(), 42)
3466 b = copy.copy(a)
3467 self.assertEqual(b.foo, 24)
3468 self.assertEqual(b.getfoo(), 24)
3469 b = copy.deepcopy(a)
3470 self.assertEqual(b.foo, 24)
3471 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003472
Georg Brandl479a7e72008-02-05 18:13:15 +00003473 def test_slices(self):
3474 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003475
Georg Brandl479a7e72008-02-05 18:13:15 +00003476 # Strings
3477 self.assertEqual("hello"[:4], "hell")
3478 self.assertEqual("hello"[slice(4)], "hell")
3479 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3480 class S(str):
3481 def __getitem__(self, x):
3482 return str.__getitem__(self, x)
3483 self.assertEqual(S("hello")[:4], "hell")
3484 self.assertEqual(S("hello")[slice(4)], "hell")
3485 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3486 # Tuples
3487 self.assertEqual((1,2,3)[:2], (1,2))
3488 self.assertEqual((1,2,3)[slice(2)], (1,2))
3489 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3490 class T(tuple):
3491 def __getitem__(self, x):
3492 return tuple.__getitem__(self, x)
3493 self.assertEqual(T((1,2,3))[:2], (1,2))
3494 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3495 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3496 # Lists
3497 self.assertEqual([1,2,3][:2], [1,2])
3498 self.assertEqual([1,2,3][slice(2)], [1,2])
3499 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3500 class L(list):
3501 def __getitem__(self, x):
3502 return list.__getitem__(self, x)
3503 self.assertEqual(L([1,2,3])[:2], [1,2])
3504 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3505 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3506 # Now do lists and __setitem__
3507 a = L([1,2,3])
3508 a[slice(1, 3)] = [3,2]
3509 self.assertEqual(a, [1,3,2])
3510 a[slice(0, 2, 1)] = [3,1]
3511 self.assertEqual(a, [3,1,2])
3512 a.__setitem__(slice(1, 3), [2,1])
3513 self.assertEqual(a, [3,2,1])
3514 a.__setitem__(slice(0, 2, 1), [2,3])
3515 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003516
Georg Brandl479a7e72008-02-05 18:13:15 +00003517 def test_subtype_resurrection(self):
3518 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003519
Georg Brandl479a7e72008-02-05 18:13:15 +00003520 class C(object):
3521 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003522
Georg Brandl479a7e72008-02-05 18:13:15 +00003523 def __del__(self):
3524 # resurrect the instance
3525 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003526
Georg Brandl479a7e72008-02-05 18:13:15 +00003527 c = C()
3528 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003529
Benjamin Petersone549ead2009-03-28 21:42:05 +00003530 # The most interesting thing here is whether this blows up, due to
3531 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3532 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003533 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003534
Georg Brandl479a7e72008-02-05 18:13:15 +00003535 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003536 # the last container slot works: that will attempt to delete c again,
3537 # which will cause c to get appended back to the container again
3538 # "during" the del. (On non-CPython implementations, however, __del__
3539 # is typically not called again.)
3540 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003541 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003542 del C.container[-1]
3543 if support.check_impl_detail():
3544 support.gc_collect()
3545 self.assertEqual(len(C.container), 1)
3546 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003547
Georg Brandl479a7e72008-02-05 18:13:15 +00003548 # Make c mortal again, so that the test framework with -l doesn't report
3549 # it as a leak.
3550 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003551
Georg Brandl479a7e72008-02-05 18:13:15 +00003552 def test_slots_trash(self):
3553 # Testing slot trash...
3554 # Deallocating deeply nested slotted trash caused stack overflows
3555 class trash(object):
3556 __slots__ = ['x']
3557 def __init__(self, x):
3558 self.x = x
3559 o = None
3560 for i in range(50000):
3561 o = trash(o)
3562 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003563
Georg Brandl479a7e72008-02-05 18:13:15 +00003564 def test_slots_multiple_inheritance(self):
3565 # SF bug 575229, multiple inheritance w/ slots dumps core
3566 class A(object):
3567 __slots__=()
3568 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003569 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003570 class C(A,B) :
3571 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003572 if support.check_impl_detail():
3573 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003574 self.assertTrue(hasattr(C, '__dict__'))
3575 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl479a7e72008-02-05 18:13:15 +00003576 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003577
Georg Brandl479a7e72008-02-05 18:13:15 +00003578 def test_rmul(self):
3579 # Testing correct invocation of __rmul__...
3580 # SF patch 592646
3581 class C(object):
3582 def __mul__(self, other):
3583 return "mul"
3584 def __rmul__(self, other):
3585 return "rmul"
3586 a = C()
3587 self.assertEqual(a*2, "mul")
3588 self.assertEqual(a*2.2, "mul")
3589 self.assertEqual(2*a, "rmul")
3590 self.assertEqual(2.2*a, "rmul")
3591
3592 def test_ipow(self):
3593 # Testing correct invocation of __ipow__...
3594 # [SF bug 620179]
3595 class C(object):
3596 def __ipow__(self, other):
3597 pass
3598 a = C()
3599 a **= 2
3600
3601 def test_mutable_bases(self):
3602 # Testing mutable bases...
3603
3604 # stuff that should work:
3605 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003606 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003607 class C2(object):
3608 def __getattribute__(self, attr):
3609 if attr == 'a':
3610 return 2
3611 else:
3612 return super(C2, self).__getattribute__(attr)
3613 def meth(self):
3614 return 1
3615 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003616 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003617 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003618 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003619 d = D()
3620 e = E()
3621 D.__bases__ = (C,)
3622 D.__bases__ = (C2,)
3623 self.assertEqual(d.meth(), 1)
3624 self.assertEqual(e.meth(), 1)
3625 self.assertEqual(d.a, 2)
3626 self.assertEqual(e.a, 2)
3627 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003628
Georg Brandl479a7e72008-02-05 18:13:15 +00003629 try:
3630 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003631 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003632 pass
3633 else:
3634 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003635
Georg Brandl479a7e72008-02-05 18:13:15 +00003636 try:
3637 D.__bases__ = ()
3638 except TypeError as msg:
3639 if str(msg) == "a new-style class can't have only classic bases":
3640 self.fail("wrong error message for .__bases__ = ()")
3641 else:
3642 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003643
Georg Brandl479a7e72008-02-05 18:13:15 +00003644 try:
3645 D.__bases__ = (D,)
3646 except TypeError:
3647 pass
3648 else:
3649 # actually, we'll have crashed by here...
3650 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003651
Georg Brandl479a7e72008-02-05 18:13:15 +00003652 try:
3653 D.__bases__ = (C, C)
3654 except TypeError:
3655 pass
3656 else:
3657 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003658
Georg Brandl479a7e72008-02-05 18:13:15 +00003659 try:
3660 D.__bases__ = (E,)
3661 except TypeError:
3662 pass
3663 else:
3664 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003665
Benjamin Petersonae937c02009-04-18 20:54:08 +00003666 def test_builtin_bases(self):
3667 # Make sure all the builtin types can have their base queried without
3668 # segfaulting. See issue #5787.
3669 builtin_types = [tp for tp in builtins.__dict__.values()
3670 if isinstance(tp, type)]
3671 for tp in builtin_types:
3672 object.__getattribute__(tp, "__bases__")
3673 if tp is not object:
3674 self.assertEqual(len(tp.__bases__), 1, tp)
3675
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003676 class L(list):
3677 pass
3678
3679 class C(object):
3680 pass
3681
3682 class D(C):
3683 pass
3684
3685 try:
3686 L.__bases__ = (dict,)
3687 except TypeError:
3688 pass
3689 else:
3690 self.fail("shouldn't turn list subclass into dict subclass")
3691
3692 try:
3693 list.__bases__ = (dict,)
3694 except TypeError:
3695 pass
3696 else:
3697 self.fail("shouldn't be able to assign to list.__bases__")
3698
3699 try:
3700 D.__bases__ = (C, list)
3701 except TypeError:
3702 pass
3703 else:
3704 assert 0, "best_base calculation found wanting"
3705
Benjamin Petersonae937c02009-04-18 20:54:08 +00003706
Georg Brandl479a7e72008-02-05 18:13:15 +00003707 def test_mutable_bases_with_failing_mro(self):
3708 # Testing mutable bases with failing mro...
3709 class WorkOnce(type):
3710 def __new__(self, name, bases, ns):
3711 self.flag = 0
3712 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3713 def mro(self):
3714 if self.flag > 0:
3715 raise RuntimeError("bozo")
3716 else:
3717 self.flag += 1
3718 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003719
Georg Brandl479a7e72008-02-05 18:13:15 +00003720 class WorkAlways(type):
3721 def mro(self):
3722 # this is here to make sure that .mro()s aren't called
3723 # with an exception set (which was possible at one point).
3724 # An error message will be printed in a debug build.
3725 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003726 return type.mro(self)
3727
Georg Brandl479a7e72008-02-05 18:13:15 +00003728 class C(object):
3729 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003730
Georg Brandl479a7e72008-02-05 18:13:15 +00003731 class C2(object):
3732 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003733
Georg Brandl479a7e72008-02-05 18:13:15 +00003734 class D(C):
3735 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003736
Georg Brandl479a7e72008-02-05 18:13:15 +00003737 class E(D):
3738 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003739
Georg Brandl479a7e72008-02-05 18:13:15 +00003740 class F(D, metaclass=WorkOnce):
3741 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003742
Georg Brandl479a7e72008-02-05 18:13:15 +00003743 class G(D, metaclass=WorkAlways):
3744 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003745
Georg Brandl479a7e72008-02-05 18:13:15 +00003746 # Immediate subclasses have their mro's adjusted in alphabetical
3747 # order, so E's will get adjusted before adjusting F's fails. We
3748 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003749
Georg Brandl479a7e72008-02-05 18:13:15 +00003750 E_mro_before = E.__mro__
3751 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003752
Armin Rigofd163f92005-12-29 15:59:19 +00003753 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003754 D.__bases__ = (C2,)
3755 except RuntimeError:
3756 self.assertEqual(E.__mro__, E_mro_before)
3757 self.assertEqual(D.__mro__, D_mro_before)
3758 else:
3759 self.fail("exception not propagated")
3760
3761 def test_mutable_bases_catch_mro_conflict(self):
3762 # Testing mutable bases catch mro conflict...
3763 class A(object):
3764 pass
3765
3766 class B(object):
3767 pass
3768
3769 class C(A, B):
3770 pass
3771
3772 class D(A, B):
3773 pass
3774
3775 class E(C, D):
3776 pass
3777
3778 try:
3779 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003780 except TypeError:
3781 pass
3782 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003783 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003784
Georg Brandl479a7e72008-02-05 18:13:15 +00003785 def test_mutable_names(self):
3786 # Testing mutable names...
3787 class C(object):
3788 pass
3789
3790 # C.__module__ could be 'test_descr' or '__main__'
3791 mod = C.__module__
3792
3793 C.__name__ = 'D'
3794 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3795
3796 C.__name__ = 'D.E'
3797 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3798
3799 def test_subclass_right_op(self):
3800 # Testing correct dispatch of subclass overloading __r<op>__...
3801
3802 # This code tests various cases where right-dispatch of a subclass
3803 # should be preferred over left-dispatch of a base class.
3804
3805 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3806
3807 class B(int):
3808 def __floordiv__(self, other):
3809 return "B.__floordiv__"
3810 def __rfloordiv__(self, other):
3811 return "B.__rfloordiv__"
3812
3813 self.assertEqual(B(1) // 1, "B.__floordiv__")
3814 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3815
3816 # Case 2: subclass of object; this is just the baseline for case 3
3817
3818 class C(object):
3819 def __floordiv__(self, other):
3820 return "C.__floordiv__"
3821 def __rfloordiv__(self, other):
3822 return "C.__rfloordiv__"
3823
3824 self.assertEqual(C() // 1, "C.__floordiv__")
3825 self.assertEqual(1 // C(), "C.__rfloordiv__")
3826
3827 # Case 3: subclass of new-style class; here it gets interesting
3828
3829 class D(C):
3830 def __floordiv__(self, other):
3831 return "D.__floordiv__"
3832 def __rfloordiv__(self, other):
3833 return "D.__rfloordiv__"
3834
3835 self.assertEqual(D() // C(), "D.__floordiv__")
3836 self.assertEqual(C() // D(), "D.__rfloordiv__")
3837
3838 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3839
3840 class E(C):
3841 pass
3842
3843 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3844
3845 self.assertEqual(E() // 1, "C.__floordiv__")
3846 self.assertEqual(1 // E(), "C.__rfloordiv__")
3847 self.assertEqual(E() // C(), "C.__floordiv__")
3848 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3849
Benjamin Petersone549ead2009-03-28 21:42:05 +00003850 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003851 def test_meth_class_get(self):
3852 # Testing __get__ method of METH_CLASS C methods...
3853 # Full coverage of descrobject.c::classmethod_get()
3854
3855 # Baseline
3856 arg = [1, 2, 3]
3857 res = {1: None, 2: None, 3: None}
3858 self.assertEqual(dict.fromkeys(arg), res)
3859 self.assertEqual({}.fromkeys(arg), res)
3860
3861 # Now get the descriptor
3862 descr = dict.__dict__["fromkeys"]
3863
3864 # More baseline using the descriptor directly
3865 self.assertEqual(descr.__get__(None, dict)(arg), res)
3866 self.assertEqual(descr.__get__({})(arg), res)
3867
3868 # Now check various error cases
3869 try:
3870 descr.__get__(None, None)
3871 except TypeError:
3872 pass
3873 else:
3874 self.fail("shouldn't have allowed descr.__get__(None, None)")
3875 try:
3876 descr.__get__(42)
3877 except TypeError:
3878 pass
3879 else:
3880 self.fail("shouldn't have allowed descr.__get__(42)")
3881 try:
3882 descr.__get__(None, 42)
3883 except TypeError:
3884 pass
3885 else:
3886 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3887 try:
3888 descr.__get__(None, int)
3889 except TypeError:
3890 pass
3891 else:
3892 self.fail("shouldn't have allowed descr.__get__(None, int)")
3893
3894 def test_isinst_isclass(self):
3895 # Testing proxy isinstance() and isclass()...
3896 class Proxy(object):
3897 def __init__(self, obj):
3898 self.__obj = obj
3899 def __getattribute__(self, name):
3900 if name.startswith("_Proxy__"):
3901 return object.__getattribute__(self, name)
3902 else:
3903 return getattr(self.__obj, name)
3904 # Test with a classic class
3905 class C:
3906 pass
3907 a = C()
3908 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003909 self.assertIsInstance(a, C) # Baseline
3910 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003911 # Test with a classic subclass
3912 class D(C):
3913 pass
3914 a = D()
3915 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003916 self.assertIsInstance(a, C) # Baseline
3917 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003918 # Test with a new-style class
3919 class C(object):
3920 pass
3921 a = C()
3922 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003923 self.assertIsInstance(a, C) # Baseline
3924 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003925 # Test with a new-style subclass
3926 class D(C):
3927 pass
3928 a = D()
3929 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003930 self.assertIsInstance(a, C) # Baseline
3931 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003932
3933 def test_proxy_super(self):
3934 # Testing super() for a proxy object...
3935 class Proxy(object):
3936 def __init__(self, obj):
3937 self.__obj = obj
3938 def __getattribute__(self, name):
3939 if name.startswith("_Proxy__"):
3940 return object.__getattribute__(self, name)
3941 else:
3942 return getattr(self.__obj, name)
3943
3944 class B(object):
3945 def f(self):
3946 return "B.f"
3947
3948 class C(B):
3949 def f(self):
3950 return super(C, self).f() + "->C.f"
3951
3952 obj = C()
3953 p = Proxy(obj)
3954 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3955
3956 def test_carloverre(self):
3957 # Testing prohibition of Carlo Verre's hack...
3958 try:
3959 object.__setattr__(str, "foo", 42)
3960 except TypeError:
3961 pass
3962 else:
3963 self.fail("Carlo Verre __setattr__ suceeded!")
3964 try:
3965 object.__delattr__(str, "lower")
3966 except TypeError:
3967 pass
3968 else:
3969 self.fail("Carlo Verre __delattr__ succeeded!")
3970
3971 def test_weakref_segfault(self):
3972 # Testing weakref segfault...
3973 # SF 742911
3974 import weakref
3975
3976 class Provoker:
3977 def __init__(self, referrent):
3978 self.ref = weakref.ref(referrent)
3979
3980 def __del__(self):
3981 x = self.ref()
3982
3983 class Oops(object):
3984 pass
3985
3986 o = Oops()
3987 o.whatever = Provoker(o)
3988 del o
3989
3990 def test_wrapper_segfault(self):
3991 # SF 927248: deeply nested wrappers could cause stack overflow
3992 f = lambda:None
3993 for i in range(1000000):
3994 f = f.__call__
3995 f = None
3996
3997 def test_file_fault(self):
3998 # Testing sys.stdout is changed in getattr...
3999 import sys
Nick Coghlan6ead5522009-10-18 13:19:33 +00004000 test_stdout = sys.stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004001 class StdoutGuard:
4002 def __getattr__(self, attr):
4003 sys.stdout = sys.__stdout__
4004 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4005 sys.stdout = StdoutGuard()
4006 try:
4007 print("Oops!")
4008 except RuntimeError:
4009 pass
Nick Coghlan6ead5522009-10-18 13:19:33 +00004010 finally:
4011 sys.stdout = test_stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004012
4013 def test_vicious_descriptor_nonsense(self):
4014 # Testing vicious_descriptor_nonsense...
4015
4016 # A potential segfault spotted by Thomas Wouters in mail to
4017 # python-dev 2003-04-17, turned into an example & fixed by Michael
4018 # Hudson just less than four months later...
4019
4020 class Evil(object):
4021 def __hash__(self):
4022 return hash('attr')
4023 def __eq__(self, other):
4024 del C.attr
4025 return 0
4026
4027 class Descr(object):
4028 def __get__(self, ob, type=None):
4029 return 1
4030
4031 class C(object):
4032 attr = Descr()
4033
4034 c = C()
4035 c.__dict__[Evil()] = 0
4036
4037 self.assertEqual(c.attr, 1)
4038 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004039 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004040 self.assertEqual(hasattr(c, 'attr'), False)
4041
4042 def test_init(self):
4043 # SF 1155938
4044 class Foo(object):
4045 def __init__(self):
4046 return 10
4047 try:
4048 Foo()
4049 except TypeError:
4050 pass
4051 else:
4052 self.fail("did not test __init__() for None return")
4053
4054 def test_method_wrapper(self):
4055 # Testing method-wrapper objects...
4056 # <type 'method-wrapper'> did not support any reflection before 2.5
4057
Mark Dickinson211c6252009-02-01 10:28:51 +00004058 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004059
4060 l = []
4061 self.assertEqual(l.__add__, l.__add__)
4062 self.assertEqual(l.__add__, [].__add__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004063 self.assertTrue(l.__add__ != [5].__add__)
4064 self.assertTrue(l.__add__ != l.__mul__)
4065 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004066 if hasattr(l.__add__, '__self__'):
4067 # CPython
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004068 self.assertTrue(l.__add__.__self__ is l)
4069 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Petersone549ead2009-03-28 21:42:05 +00004070 else:
4071 # Python implementations where [].__add__ is a normal bound method
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004072 self.assertTrue(l.__add__.im_self is l)
4073 self.assertTrue(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004074 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4075 try:
4076 hash(l.__add__)
4077 except TypeError:
4078 pass
4079 else:
4080 self.fail("no TypeError from hash([].__add__)")
4081
4082 t = ()
4083 t += (7,)
4084 self.assertEqual(t.__add__, (7,).__add__)
4085 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4086
4087 def test_not_implemented(self):
4088 # Testing NotImplemented...
4089 # all binary methods should be able to return a NotImplemented
4090 import sys
4091 import types
4092 import operator
4093
4094 def specialmethod(self, other):
4095 return NotImplemented
4096
4097 def check(expr, x, y):
4098 try:
4099 exec(expr, {'x': x, 'y': y, 'operator': operator})
4100 except TypeError:
4101 pass
4102 else:
4103 self.fail("no TypeError from %r" % (expr,))
4104
4105 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4106 # TypeErrors
4107 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4108 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004109 for name, expr, iexpr in [
4110 ('__add__', 'x + y', 'x += y'),
4111 ('__sub__', 'x - y', 'x -= y'),
4112 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004113 ('__truediv__', 'operator.truediv(x, y)', None),
4114 ('__floordiv__', 'operator.floordiv(x, y)', None),
4115 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004116 ('__mod__', 'x % y', 'x %= y'),
4117 ('__divmod__', 'divmod(x, y)', None),
4118 ('__pow__', 'x ** y', 'x **= y'),
4119 ('__lshift__', 'x << y', 'x <<= y'),
4120 ('__rshift__', 'x >> y', 'x >>= y'),
4121 ('__and__', 'x & y', 'x &= y'),
4122 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004123 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004124 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004125 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004126 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004127 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004128 check(expr, a, N1)
4129 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004130 if iexpr:
4131 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004132 check(iexpr, a, N1)
4133 check(iexpr, a, N2)
4134 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004135 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004136 c = C()
4137 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004138 check(iexpr, c, N1)
4139 check(iexpr, c, N2)
4140
Georg Brandl479a7e72008-02-05 18:13:15 +00004141 def test_assign_slice(self):
4142 # ceval.c's assign_slice used to check for
4143 # tp->tp_as_sequence->sq_slice instead of
4144 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004145
Georg Brandl479a7e72008-02-05 18:13:15 +00004146 class C(object):
4147 def __setitem__(self, idx, value):
4148 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004149
Georg Brandl479a7e72008-02-05 18:13:15 +00004150 c = C()
4151 c[1:2] = 3
4152 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004153
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +00004154 def test_set_and_no_get(self):
4155 # See
4156 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4157 class Descr(object):
4158
4159 def __init__(self, name):
4160 self.name = name
4161
4162 def __set__(self, obj, value):
4163 obj.__dict__[self.name] = value
4164 descr = Descr("a")
4165
4166 class X(object):
4167 a = descr
4168
4169 x = X()
4170 self.assertIs(x.a, descr)
4171 x.a = 42
4172 self.assertEqual(x.a, 42)
4173
Benjamin Peterson9262b842008-11-17 22:45:50 +00004174 def test_getattr_hooks(self):
4175 # issue 4230
4176
4177 class Descriptor(object):
4178 counter = 0
4179 def __get__(self, obj, objtype=None):
4180 def getter(name):
4181 self.counter += 1
4182 raise AttributeError(name)
4183 return getter
4184
4185 descr = Descriptor()
4186 class A(object):
4187 __getattribute__ = descr
4188 class B(object):
4189 __getattr__ = descr
4190 class C(object):
4191 __getattribute__ = descr
4192 __getattr__ = descr
4193
4194 self.assertRaises(AttributeError, getattr, A(), "attr")
4195 self.assertEquals(descr.counter, 1)
4196 self.assertRaises(AttributeError, getattr, B(), "attr")
4197 self.assertEquals(descr.counter, 2)
4198 self.assertRaises(AttributeError, getattr, C(), "attr")
4199 self.assertEquals(descr.counter, 4)
4200
4201 import gc
4202 class EvilGetattribute(object):
4203 # This used to segfault
4204 def __getattr__(self, name):
4205 raise AttributeError(name)
4206 def __getattribute__(self, name):
4207 del EvilGetattribute.__getattr__
4208 for i in range(5):
4209 gc.collect()
4210 raise AttributeError(name)
4211
4212 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4213
Christian Heimesbbffeb62008-01-24 09:42:52 +00004214
Georg Brandl479a7e72008-02-05 18:13:15 +00004215class DictProxyTests(unittest.TestCase):
4216 def setUp(self):
4217 class C(object):
4218 def meth(self):
4219 pass
4220 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004221
Georg Brandl479a7e72008-02-05 18:13:15 +00004222 def test_iter_keys(self):
4223 # Testing dict-proxy iterkeys...
4224 keys = [ key for key in self.C.__dict__.keys() ]
4225 keys.sort()
4226 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4227 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004228
Georg Brandl479a7e72008-02-05 18:13:15 +00004229 def test_iter_values(self):
4230 # Testing dict-proxy itervalues...
4231 values = [ values for values in self.C.__dict__.values() ]
4232 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004233
Georg Brandl479a7e72008-02-05 18:13:15 +00004234 def test_iter_items(self):
4235 # Testing dict-proxy iteritems...
4236 keys = [ key for (key, value) in self.C.__dict__.items() ]
4237 keys.sort()
4238 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4239 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004240
Georg Brandl479a7e72008-02-05 18:13:15 +00004241 def test_dict_type_with_metaclass(self):
4242 # Testing type of __dict__ when metaclass set...
4243 class B(object):
4244 pass
4245 class M(type):
4246 pass
4247 class C(metaclass=M):
4248 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4249 pass
4250 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004251
Christian Heimesbbffeb62008-01-24 09:42:52 +00004252
Georg Brandl479a7e72008-02-05 18:13:15 +00004253class PTypesLongInitTest(unittest.TestCase):
4254 # This is in its own TestCase so that it can be run before any other tests.
4255 def test_pytype_long_ready(self):
4256 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004257
Georg Brandl479a7e72008-02-05 18:13:15 +00004258 # This dumps core when SF bug 551412 isn't fixed --
4259 # but only when test_descr.py is run separately.
4260 # (That can't be helped -- as soon as PyType_Ready()
4261 # is called for PyLong_Type, the bug is gone.)
4262 class UserLong(object):
4263 def __pow__(self, *args):
4264 pass
4265 try:
4266 pow(0, UserLong(), 0)
4267 except:
4268 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004269
Georg Brandl479a7e72008-02-05 18:13:15 +00004270 # Another segfault only when run early
4271 # (before PyType_Ready(tuple) is called)
4272 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004273
4274
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004275def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004276 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004277 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004278 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004279
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004280if __name__ == "__main__":
4281 test_main()