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