blob: 93c4a19de0fda6d7ff961e0dc210af02e042daa9 [file] [log] [blame]
Benjamin Petersonae937c02009-04-18 20:54:08 +00001import builtins
Benjamin Petersona5758c02009-05-09 18:15:04 +00002import sys
Guido van Rossum360e4b82007-05-14 22:51:27 +00003import types
Georg Brandl479a7e72008-02-05 18:13:15 +00004import unittest
5import warnings
Tim Peters4d9b4662002-04-16 01:59:17 +00006
Georg Brandl479a7e72008-02-05 18:13:15 +00007from copy import deepcopy
Benjamin Petersonee8712c2008-05-20 21:35:26 +00008from test import support
Guido van Rossum875eeaa2001-10-11 18:33:53 +00009
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Georg Brandl479a7e72008-02-05 18:13:15 +000011class OperatorsTest(unittest.TestCase):
Tim Peters3caca232001-12-06 06:23:26 +000012
Georg Brandl479a7e72008-02-05 18:13:15 +000013 def __init__(self, *args, **kwargs):
14 unittest.TestCase.__init__(self, *args, **kwargs)
15 self.binops = {
16 'add': '+',
17 'sub': '-',
18 'mul': '*',
19 'div': '/',
20 'divmod': 'divmod',
21 'pow': '**',
22 'lshift': '<<',
23 'rshift': '>>',
24 'and': '&',
25 'xor': '^',
26 'or': '|',
27 'cmp': 'cmp',
28 'lt': '<',
29 'le': '<=',
30 'eq': '==',
31 'ne': '!=',
32 'gt': '>',
33 'ge': '>=',
34 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000035
Georg Brandl479a7e72008-02-05 18:13:15 +000036 for name, expr in list(self.binops.items()):
37 if expr.islower():
38 expr = expr + "(a, b)"
39 else:
40 expr = 'a %s b' % expr
41 self.binops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000042
Georg Brandl479a7e72008-02-05 18:13:15 +000043 self.unops = {
44 'pos': '+',
45 'neg': '-',
46 'abs': 'abs',
47 'invert': '~',
48 'int': 'int',
49 'float': 'float',
50 'oct': 'oct',
51 'hex': 'hex',
52 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000053
Georg Brandl479a7e72008-02-05 18:13:15 +000054 for name, expr in list(self.unops.items()):
55 if expr.islower():
56 expr = expr + "(a)"
57 else:
58 expr = '%s a' % expr
59 self.unops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000060
Georg Brandl479a7e72008-02-05 18:13:15 +000061 def unop_test(self, a, res, expr="len(a)", meth="__len__"):
62 d = {'a': a}
63 self.assertEqual(eval(expr, d), res)
64 t = type(a)
65 m = getattr(t, meth)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066
Georg Brandl479a7e72008-02-05 18:13:15 +000067 # Find method in parent class
68 while meth not in t.__dict__:
69 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +000070 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
71 # method object; the getattr() below obtains its underlying function.
72 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +000073 self.assertEqual(m(a), res)
74 bm = getattr(a, meth)
75 self.assertEqual(bm(), res)
Tim Peters2f93e282001-10-04 05:27:00 +000076
Georg Brandl479a7e72008-02-05 18:13:15 +000077 def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
78 d = {'a': a, 'b': b}
Tim Peters2f93e282001-10-04 05:27:00 +000079
Georg Brandl479a7e72008-02-05 18:13:15 +000080 # XXX Hack so this passes before 2.3 when -Qnew is specified.
81 if meth == "__div__" and 1/2 == 0.5:
82 meth = "__truediv__"
Tim Peters2f93e282001-10-04 05:27:00 +000083
Georg Brandl479a7e72008-02-05 18:13:15 +000084 if meth == '__divmod__': pass
Tim Peters2f93e282001-10-04 05:27:00 +000085
Georg Brandl479a7e72008-02-05 18:13:15 +000086 self.assertEqual(eval(expr, d), res)
87 t = type(a)
88 m = getattr(t, meth)
89 while meth not in t.__dict__:
90 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +000091 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
92 # method object; the getattr() below obtains its underlying function.
93 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +000094 self.assertEqual(m(a, b), res)
95 bm = getattr(a, meth)
96 self.assertEqual(bm(b), res)
Tim Peters2f93e282001-10-04 05:27:00 +000097
Georg Brandl479a7e72008-02-05 18:13:15 +000098 def sliceop_test(self, a, b, c, res, expr="a[b:c]", meth="__getitem__"):
99 d = {'a': a, 'b': b, 'c': c}
100 self.assertEqual(eval(expr, d), res)
101 t = type(a)
102 m = getattr(t, meth)
103 while meth not in t.__dict__:
104 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000105 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
106 # method object; the getattr() below obtains its underlying function.
107 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000108 self.assertEqual(m(a, slice(b, c)), res)
109 bm = getattr(a, meth)
110 self.assertEqual(bm(slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000111
Georg Brandl479a7e72008-02-05 18:13:15 +0000112 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
113 d = {'a': deepcopy(a), 'b': b}
114 exec(stmt, d)
115 self.assertEqual(d['a'], res)
116 t = type(a)
117 m = getattr(t, meth)
118 while meth not in t.__dict__:
119 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000120 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
121 # method object; the getattr() below obtains its underlying function.
122 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000123 d['a'] = deepcopy(a)
124 m(d['a'], b)
125 self.assertEqual(d['a'], res)
126 d['a'] = deepcopy(a)
127 bm = getattr(d['a'], meth)
128 bm(b)
129 self.assertEqual(d['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000130
Georg Brandl479a7e72008-02-05 18:13:15 +0000131 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
132 d = {'a': deepcopy(a), 'b': b, 'c': c}
133 exec(stmt, d)
134 self.assertEqual(d['a'], res)
135 t = type(a)
136 m = getattr(t, meth)
137 while meth not in t.__dict__:
138 t = t.__bases__[0]
Benjamin Petersone549ead2009-03-28 21:42:05 +0000139 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
140 # method object; the getattr() below obtains its underlying function.
141 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000142 d['a'] = deepcopy(a)
143 m(d['a'], b, c)
144 self.assertEqual(d['a'], res)
145 d['a'] = deepcopy(a)
146 bm = getattr(d['a'], meth)
147 bm(b, c)
148 self.assertEqual(d['a'], res)
149
150 def setsliceop_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
151 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
152 exec(stmt, dictionary)
153 self.assertEqual(dictionary['a'], res)
154 t = type(a)
155 while meth not in t.__dict__:
156 t = t.__bases__[0]
157 m = getattr(t, meth)
Benjamin Petersone549ead2009-03-28 21:42:05 +0000158 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
159 # method object; the getattr() below obtains its underlying function.
160 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl479a7e72008-02-05 18:13:15 +0000161 dictionary['a'] = deepcopy(a)
162 m(dictionary['a'], slice(b, c), d)
163 self.assertEqual(dictionary['a'], res)
164 dictionary['a'] = deepcopy(a)
165 bm = getattr(dictionary['a'], meth)
166 bm(slice(b, c), d)
167 self.assertEqual(dictionary['a'], res)
168
169 def test_lists(self):
170 # Testing list operations...
171 # Asserts are within individual test methods
172 self.binop_test([1], [2], [1,2], "a+b", "__add__")
173 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
174 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
175 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
176 self.sliceop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
177 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
178 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
179 self.unop_test([1,2,3], 3, "len(a)", "__len__")
180 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
181 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
182 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
183 self.setsliceop_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
184 "__setitem__")
185
186 def test_dicts(self):
187 # Testing dict operations...
Georg Brandl479a7e72008-02-05 18:13:15 +0000188 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
189 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
190 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
191
192 d = {1:2, 3:4}
193 l1 = []
194 for i in list(d.keys()):
195 l1.append(i)
196 l = []
197 for i in iter(d):
198 l.append(i)
199 self.assertEqual(l, l1)
200 l = []
201 for i in d.__iter__():
202 l.append(i)
203 self.assertEqual(l, l1)
204 l = []
205 for i in dict.__iter__(d):
206 l.append(i)
207 self.assertEqual(l, l1)
208 d = {1:2, 3:4}
209 self.unop_test(d, 2, "len(a)", "__len__")
210 self.assertEqual(eval(repr(d), {}), d)
211 self.assertEqual(eval(d.__repr__(), {}), d)
212 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
213 "__setitem__")
214
215 # Tests for unary and binary operators
216 def number_operators(self, a, b, skip=[]):
217 dict = {'a': a, 'b': b}
218
219 for name, expr in list(self.binops.items()):
220 if name not in skip:
221 name = "__%s__" % name
222 if hasattr(a, name):
223 res = eval(expr, dict)
224 self.binop_test(a, b, res, expr, name)
225
226 for name, expr in list(self.unops.items()):
227 if name not in skip:
228 name = "__%s__" % name
229 if hasattr(a, name):
230 res = eval(expr, dict)
231 self.unop_test(a, res, expr, name)
232
233 def test_ints(self):
234 # Testing int operations...
235 self.number_operators(100, 3)
236 # The following crashes in Python 2.2
237 self.assertEqual((1).__bool__(), 1)
238 self.assertEqual((0).__bool__(), 0)
239 # This returns 'NotImplemented' in Python 2.2
240 class C(int):
241 def __add__(self, other):
242 return NotImplemented
243 self.assertEqual(C(5), 5)
Tim Peters25786c02001-09-02 08:22:48 +0000244 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000245 C() + ""
Tim Peters25786c02001-09-02 08:22:48 +0000246 except TypeError:
247 pass
248 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000249 self.fail("NotImplemented should have caused TypeError")
Tim Peters25786c02001-09-02 08:22:48 +0000250
Georg Brandl479a7e72008-02-05 18:13:15 +0000251 def test_floats(self):
252 # Testing float operations...
253 self.number_operators(100.0, 3.0)
Tim Peters25786c02001-09-02 08:22:48 +0000254
Georg Brandl479a7e72008-02-05 18:13:15 +0000255 def test_complexes(self):
256 # Testing complex operations...
257 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
Mark Dickinson5c2db372009-12-05 20:28:34 +0000258 'int', 'float',
Georg Brandl479a7e72008-02-05 18:13:15 +0000259 'divmod', 'mod'])
Tim Peters25786c02001-09-02 08:22:48 +0000260
Georg Brandl479a7e72008-02-05 18:13:15 +0000261 class Number(complex):
262 __slots__ = ['prec']
263 def __new__(cls, *args, **kwds):
264 result = complex.__new__(cls, *args)
265 result.prec = kwds.get('prec', 12)
266 return result
267 def __repr__(self):
268 prec = self.prec
269 if self.imag == 0.0:
270 return "%.*g" % (prec, self.real)
271 if self.real == 0.0:
272 return "%.*gj" % (prec, self.imag)
273 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
274 __str__ = __repr__
Tim Peters25786c02001-09-02 08:22:48 +0000275
Georg Brandl479a7e72008-02-05 18:13:15 +0000276 a = Number(3.14, prec=6)
277 self.assertEqual(repr(a), "3.14")
278 self.assertEqual(a.prec, 6)
Tim Peters1fc240e2001-10-26 05:06:50 +0000279
Georg Brandl479a7e72008-02-05 18:13:15 +0000280 a = Number(a, prec=2)
281 self.assertEqual(repr(a), "3.1")
282 self.assertEqual(a.prec, 2)
Tim Peters1fc240e2001-10-26 05:06:50 +0000283
Georg Brandl479a7e72008-02-05 18:13:15 +0000284 a = Number(234.5)
285 self.assertEqual(repr(a), "234.5")
286 self.assertEqual(a.prec, 12)
Tim Peters1fc240e2001-10-26 05:06:50 +0000287
Benjamin Petersone549ead2009-03-28 21:42:05 +0000288 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000289 def test_spam_lists(self):
290 # Testing spamlist operations...
291 import copy, xxsubtype as spam
292
293 def spamlist(l, memo=None):
294 import xxsubtype as spam
295 return spam.spamlist(l)
296
297 # This is an ugly hack:
298 copy._deepcopy_dispatch[spam.spamlist] = spamlist
299
300 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
301 "__add__")
302 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
303 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
304 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
305 self.sliceop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
306 "__getitem__")
307 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
308 "__iadd__")
309 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
310 "__imul__")
311 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
312 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
313 "__mul__")
314 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
315 "__rmul__")
316 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
317 "__setitem__")
318 self.setsliceop_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
319 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
320 # Test subclassing
321 class C(spam.spamlist):
322 def foo(self): return 1
323 a = C()
324 self.assertEqual(a, [])
325 self.assertEqual(a.foo(), 1)
326 a.append(100)
327 self.assertEqual(a, [100])
328 self.assertEqual(a.getstate(), 0)
329 a.setstate(42)
330 self.assertEqual(a.getstate(), 42)
331
Benjamin Petersone549ead2009-03-28 21:42:05 +0000332 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +0000333 def test_spam_dicts(self):
334 # Testing spamdict operations...
335 import copy, xxsubtype as spam
336 def spamdict(d, memo=None):
337 import xxsubtype as spam
338 sd = spam.spamdict()
339 for k, v in list(d.items()):
340 sd[k] = v
341 return sd
342 # This is an ugly hack:
343 copy._deepcopy_dispatch[spam.spamdict] = spamdict
344
Georg Brandl479a7e72008-02-05 18:13:15 +0000345 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
346 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
347 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
348 d = spamdict({1:2,3:4})
349 l1 = []
350 for i in list(d.keys()):
351 l1.append(i)
352 l = []
353 for i in iter(d):
354 l.append(i)
355 self.assertEqual(l, l1)
356 l = []
357 for i in d.__iter__():
358 l.append(i)
359 self.assertEqual(l, l1)
360 l = []
361 for i in type(spamdict({})).__iter__(d):
362 l.append(i)
363 self.assertEqual(l, l1)
364 straightd = {1:2, 3:4}
365 spamd = spamdict(straightd)
366 self.unop_test(spamd, 2, "len(a)", "__len__")
367 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
368 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
369 "a[b]=c", "__setitem__")
370 # Test subclassing
371 class C(spam.spamdict):
372 def foo(self): return 1
373 a = C()
374 self.assertEqual(list(a.items()), [])
375 self.assertEqual(a.foo(), 1)
376 a['foo'] = 'bar'
377 self.assertEqual(list(a.items()), [('foo', 'bar')])
378 self.assertEqual(a.getstate(), 0)
379 a.setstate(100)
380 self.assertEqual(a.getstate(), 100)
381
382class ClassPropertiesAndMethods(unittest.TestCase):
383
384 def test_python_dicts(self):
385 # Testing Python subclass of dict...
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000386 self.assertTrue(issubclass(dict, dict))
Ezio Melottie9615932010-01-24 19:26:24 +0000387 self.assertIsInstance({}, dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000388 d = dict()
389 self.assertEqual(d, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000390 self.assertTrue(d.__class__ is dict)
Ezio Melottie9615932010-01-24 19:26:24 +0000391 self.assertIsInstance(d, dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000392 class C(dict):
393 state = -1
394 def __init__(self_local, *a, **kw):
395 if a:
396 self.assertEqual(len(a), 1)
397 self_local.state = a[0]
398 if kw:
399 for k, v in list(kw.items()):
400 self_local[v] = k
401 def __getitem__(self, key):
402 return self.get(key, 0)
403 def __setitem__(self_local, key, value):
Ezio Melottie9615932010-01-24 19:26:24 +0000404 self.assertIsInstance(key, type(0))
Georg Brandl479a7e72008-02-05 18:13:15 +0000405 dict.__setitem__(self_local, key, value)
406 def setstate(self, state):
407 self.state = state
408 def getstate(self):
409 return self.state
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000410 self.assertTrue(issubclass(C, dict))
Georg Brandl479a7e72008-02-05 18:13:15 +0000411 a1 = C(12)
412 self.assertEqual(a1.state, 12)
413 a2 = C(foo=1, bar=2)
414 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
415 a = C()
416 self.assertEqual(a.state, -1)
417 self.assertEqual(a.getstate(), -1)
418 a.setstate(0)
419 self.assertEqual(a.state, 0)
420 self.assertEqual(a.getstate(), 0)
421 a.setstate(10)
422 self.assertEqual(a.state, 10)
423 self.assertEqual(a.getstate(), 10)
424 self.assertEqual(a[42], 0)
425 a[42] = 24
426 self.assertEqual(a[42], 24)
427 N = 50
428 for i in range(N):
429 a[i] = C()
430 for j in range(N):
431 a[i][j] = i*j
432 for i in range(N):
433 for j in range(N):
434 self.assertEqual(a[i][j], i*j)
435
436 def test_python_lists(self):
437 # Testing Python subclass of list...
438 class C(list):
439 def __getitem__(self, i):
440 if isinstance(i, slice):
441 return i.start, i.stop
442 return list.__getitem__(self, i) + 100
443 a = C()
444 a.extend([0,1,2])
445 self.assertEqual(a[0], 100)
446 self.assertEqual(a[1], 101)
447 self.assertEqual(a[2], 102)
448 self.assertEqual(a[100:200], (100,200))
449
450 def test_metaclass(self):
Georg Brandle81f5ef2008-05-27 20:34:09 +0000451 # Testing metaclasses...
Georg Brandl479a7e72008-02-05 18:13:15 +0000452 class C(metaclass=type):
453 def __init__(self):
454 self.__state = 0
455 def getstate(self):
456 return self.__state
457 def setstate(self, state):
458 self.__state = state
459 a = C()
460 self.assertEqual(a.getstate(), 0)
461 a.setstate(10)
462 self.assertEqual(a.getstate(), 10)
463 class _metaclass(type):
464 def myself(cls): return cls
465 class D(metaclass=_metaclass):
466 pass
467 self.assertEqual(D.myself(), D)
468 d = D()
469 self.assertEqual(d.__class__, D)
470 class M1(type):
471 def __new__(cls, name, bases, dict):
472 dict['__spam__'] = 1
473 return type.__new__(cls, name, bases, dict)
474 class C(metaclass=M1):
475 pass
476 self.assertEqual(C.__spam__, 1)
477 c = C()
478 self.assertEqual(c.__spam__, 1)
479
480 class _instance(object):
481 pass
482 class M2(object):
483 @staticmethod
484 def __new__(cls, name, bases, dict):
485 self = object.__new__(cls)
486 self.name = name
487 self.bases = bases
488 self.dict = dict
489 return self
490 def __call__(self):
491 it = _instance()
492 # Early binding of methods
493 for key in self.dict:
494 if key.startswith("__"):
495 continue
496 setattr(it, key, self.dict[key].__get__(it, self))
497 return it
498 class C(metaclass=M2):
499 def spam(self):
500 return 42
501 self.assertEqual(C.name, 'C')
502 self.assertEqual(C.bases, ())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000503 self.assertIn('spam', C.dict)
Georg Brandl479a7e72008-02-05 18:13:15 +0000504 c = C()
505 self.assertEqual(c.spam(), 42)
506
507 # More metaclass examples
508
509 class autosuper(type):
510 # Automatically add __super to the class
511 # This trick only works for dynamic classes
512 def __new__(metaclass, name, bases, dict):
513 cls = super(autosuper, metaclass).__new__(metaclass,
514 name, bases, dict)
515 # Name mangling for __super removes leading underscores
516 while name[:1] == "_":
517 name = name[1:]
518 if name:
519 name = "_%s__super" % name
520 else:
521 name = "__super"
522 setattr(cls, name, super(cls))
523 return cls
524 class A(metaclass=autosuper):
525 def meth(self):
526 return "A"
527 class B(A):
528 def meth(self):
529 return "B" + self.__super.meth()
530 class C(A):
531 def meth(self):
532 return "C" + self.__super.meth()
533 class D(C, B):
534 def meth(self):
535 return "D" + self.__super.meth()
536 self.assertEqual(D().meth(), "DCBA")
537 class E(B, C):
538 def meth(self):
539 return "E" + self.__super.meth()
540 self.assertEqual(E().meth(), "EBCA")
541
542 class autoproperty(type):
543 # Automatically create property attributes when methods
544 # named _get_x and/or _set_x are found
545 def __new__(metaclass, name, bases, dict):
546 hits = {}
547 for key, val in dict.items():
548 if key.startswith("_get_"):
549 key = key[5:]
550 get, set = hits.get(key, (None, None))
551 get = val
552 hits[key] = get, set
553 elif key.startswith("_set_"):
554 key = key[5:]
555 get, set = hits.get(key, (None, None))
556 set = val
557 hits[key] = get, set
558 for key, (get, set) in hits.items():
559 dict[key] = property(get, set)
560 return super(autoproperty, metaclass).__new__(metaclass,
561 name, bases, dict)
562 class A(metaclass=autoproperty):
563 def _get_x(self):
564 return -self.__x
565 def _set_x(self, x):
566 self.__x = -x
567 a = A()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000568 self.assertTrue(not hasattr(a, "x"))
Georg Brandl479a7e72008-02-05 18:13:15 +0000569 a.x = 12
570 self.assertEqual(a.x, 12)
571 self.assertEqual(a._A__x, -12)
572
573 class multimetaclass(autoproperty, autosuper):
574 # Merge of multiple cooperating metaclasses
575 pass
576 class A(metaclass=multimetaclass):
577 def _get_x(self):
578 return "A"
579 class B(A):
580 def _get_x(self):
581 return "B" + self.__super._get_x()
582 class C(A):
583 def _get_x(self):
584 return "C" + self.__super._get_x()
585 class D(C, B):
586 def _get_x(self):
587 return "D" + self.__super._get_x()
588 self.assertEqual(D().x, "DCBA")
589
590 # Make sure type(x) doesn't call x.__class__.__init__
591 class T(type):
592 counter = 0
593 def __init__(self, *args):
594 T.counter += 1
595 class C(metaclass=T):
596 pass
597 self.assertEqual(T.counter, 1)
598 a = C()
599 self.assertEqual(type(a), C)
600 self.assertEqual(T.counter, 1)
601
602 class C(object): pass
603 c = C()
604 try: c()
605 except TypeError: pass
606 else: self.fail("calling object w/o call method should raise "
607 "TypeError")
608
609 # Testing code to find most derived baseclass
610 class A(type):
611 def __new__(*args, **kwargs):
612 return type.__new__(*args, **kwargs)
613
614 class B(object):
615 pass
616
617 class C(object, metaclass=A):
618 pass
619
620 # The most derived metaclass of D is A rather than type.
621 class D(B, C):
622 pass
623
624 def test_module_subclasses(self):
625 # Testing Python subclass of module...
626 log = []
627 import types, sys
628 MT = type(sys)
629 class MM(MT):
630 def __init__(self, name):
631 MT.__init__(self, name)
632 def __getattribute__(self, name):
633 log.append(("getattr", name))
634 return MT.__getattribute__(self, name)
635 def __setattr__(self, name, value):
636 log.append(("setattr", name, value))
637 MT.__setattr__(self, name, value)
638 def __delattr__(self, name):
639 log.append(("delattr", name))
640 MT.__delattr__(self, name)
641 a = MM("a")
642 a.foo = 12
643 x = a.foo
644 del a.foo
645 self.assertEqual(log, [("setattr", "foo", 12),
646 ("getattr", "foo"),
647 ("delattr", "foo")])
648
649 # http://python.org/sf/1174712
Tim Peters1fc240e2001-10-26 05:06:50 +0000650 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000651 class Module(types.ModuleType, str):
652 pass
653 except TypeError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000654 pass
655 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000656 self.fail("inheriting from ModuleType and str at the same time "
657 "should fail")
Tim Peters1fc240e2001-10-26 05:06:50 +0000658
Georg Brandl479a7e72008-02-05 18:13:15 +0000659 def test_multiple_inheritance(self):
660 # Testing multiple inheritance...
661 class C(object):
662 def __init__(self):
663 self.__state = 0
664 def getstate(self):
665 return self.__state
666 def setstate(self, state):
667 self.__state = state
668 a = C()
669 self.assertEqual(a.getstate(), 0)
670 a.setstate(10)
671 self.assertEqual(a.getstate(), 10)
672 class D(dict, C):
673 def __init__(self):
674 type({}).__init__(self)
675 C.__init__(self)
676 d = D()
677 self.assertEqual(list(d.keys()), [])
678 d["hello"] = "world"
679 self.assertEqual(list(d.items()), [("hello", "world")])
680 self.assertEqual(d["hello"], "world")
681 self.assertEqual(d.getstate(), 0)
682 d.setstate(10)
683 self.assertEqual(d.getstate(), 10)
684 self.assertEqual(D.__mro__, (D, dict, C, object))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000685
Georg Brandl479a7e72008-02-05 18:13:15 +0000686 # SF bug #442833
687 class Node(object):
688 def __int__(self):
689 return int(self.foo())
690 def foo(self):
691 return "23"
692 class Frag(Node, list):
693 def foo(self):
694 return "42"
695 self.assertEqual(Node().__int__(), 23)
696 self.assertEqual(int(Node()), 23)
697 self.assertEqual(Frag().__int__(), 42)
698 self.assertEqual(int(Frag()), 42)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000699
Georg Brandl479a7e72008-02-05 18:13:15 +0000700 def test_diamond_inheritence(self):
701 # Testing multiple inheritance special cases...
702 class A(object):
703 def spam(self): return "A"
704 self.assertEqual(A().spam(), "A")
705 class B(A):
706 def boo(self): return "B"
707 def spam(self): return "B"
708 self.assertEqual(B().spam(), "B")
709 self.assertEqual(B().boo(), "B")
710 class C(A):
711 def boo(self): return "C"
712 self.assertEqual(C().spam(), "A")
713 self.assertEqual(C().boo(), "C")
714 class D(B, C): pass
715 self.assertEqual(D().spam(), "B")
716 self.assertEqual(D().boo(), "B")
717 self.assertEqual(D.__mro__, (D, B, C, A, object))
718 class E(C, B): pass
719 self.assertEqual(E().spam(), "B")
720 self.assertEqual(E().boo(), "C")
721 self.assertEqual(E.__mro__, (E, C, B, A, object))
722 # MRO order disagreement
723 try:
724 class F(D, E): pass
725 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000726 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000727 else:
728 self.fail("expected MRO order disagreement (F)")
729 try:
730 class G(E, D): pass
731 except TypeError:
732 pass
733 else:
734 self.fail("expected MRO order disagreement (G)")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000735
Georg Brandl479a7e72008-02-05 18:13:15 +0000736 # see thread python-dev/2002-October/029035.html
737 def test_ex5_from_c3_switch(self):
738 # Testing ex5 from C3 switch discussion...
739 class A(object): pass
740 class B(object): pass
741 class C(object): pass
742 class X(A): pass
743 class Y(A): pass
744 class Z(X,B,Y,C): pass
745 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000746
Georg Brandl479a7e72008-02-05 18:13:15 +0000747 # see "A Monotonic Superclass Linearization for Dylan",
748 # by Kim Barrett et al. (OOPSLA 1996)
749 def test_monotonicity(self):
750 # Testing MRO monotonicity...
751 class Boat(object): pass
752 class DayBoat(Boat): pass
753 class WheelBoat(Boat): pass
754 class EngineLess(DayBoat): pass
755 class SmallMultihull(DayBoat): pass
756 class PedalWheelBoat(EngineLess,WheelBoat): pass
757 class SmallCatamaran(SmallMultihull): pass
758 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
Guido van Rossume45763a2001-08-10 21:28:46 +0000759
Georg Brandl479a7e72008-02-05 18:13:15 +0000760 self.assertEqual(PedalWheelBoat.__mro__,
761 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
762 self.assertEqual(SmallCatamaran.__mro__,
763 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
764 self.assertEqual(Pedalo.__mro__,
765 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
766 SmallMultihull, DayBoat, WheelBoat, Boat, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000767
Georg Brandl479a7e72008-02-05 18:13:15 +0000768 # see "A Monotonic Superclass Linearization for Dylan",
769 # by Kim Barrett et al. (OOPSLA 1996)
770 def test_consistency_with_epg(self):
771 # Testing consistentcy with EPG...
772 class Pane(object): pass
773 class ScrollingMixin(object): pass
774 class EditingMixin(object): pass
775 class ScrollablePane(Pane,ScrollingMixin): pass
776 class EditablePane(Pane,EditingMixin): pass
777 class EditableScrollablePane(ScrollablePane,EditablePane): pass
Guido van Rossum9a818922002-11-14 19:50:14 +0000778
Georg Brandl479a7e72008-02-05 18:13:15 +0000779 self.assertEqual(EditableScrollablePane.__mro__,
780 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
781 ScrollingMixin, EditingMixin, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000782
Georg Brandl479a7e72008-02-05 18:13:15 +0000783 def test_mro_disagreement(self):
784 # Testing error messages for MRO disagreement...
785 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000786order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000787
Georg Brandl479a7e72008-02-05 18:13:15 +0000788 def raises(exc, expected, callable, *args):
Guido van Rossum58da9312007-11-10 23:39:45 +0000789 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000790 callable(*args)
791 except exc as msg:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000792 # the exact msg is generally considered an impl detail
793 if support.check_impl_detail():
794 if not str(msg).startswith(expected):
795 self.fail("Message %r, expected %r" %
796 (str(msg), expected))
Georg Brandl479a7e72008-02-05 18:13:15 +0000797 else:
798 self.fail("Expected %s" % exc)
Guido van Rossum58da9312007-11-10 23:39:45 +0000799
Georg Brandl479a7e72008-02-05 18:13:15 +0000800 class A(object): pass
801 class B(A): pass
802 class C(object): pass
Christian Heimes9a371592007-12-28 14:08:13 +0000803
Georg Brandl479a7e72008-02-05 18:13:15 +0000804 # Test some very simple errors
805 raises(TypeError, "duplicate base class A",
806 type, "X", (A, A), {})
807 raises(TypeError, mro_err_msg,
808 type, "X", (A, B), {})
809 raises(TypeError, mro_err_msg,
810 type, "X", (A, C, B), {})
811 # Test a slightly more complex error
812 class GridLayout(object): pass
813 class HorizontalGrid(GridLayout): pass
814 class VerticalGrid(GridLayout): pass
815 class HVGrid(HorizontalGrid, VerticalGrid): pass
816 class VHGrid(VerticalGrid, HorizontalGrid): pass
817 raises(TypeError, mro_err_msg,
818 type, "ConfusedGrid", (HVGrid, VHGrid), {})
Guido van Rossum58da9312007-11-10 23:39:45 +0000819
Georg Brandl479a7e72008-02-05 18:13:15 +0000820 def test_object_class(self):
821 # Testing object class...
822 a = object()
823 self.assertEqual(a.__class__, object)
824 self.assertEqual(type(a), object)
825 b = object()
826 self.assertNotEqual(a, b)
827 self.assertFalse(hasattr(a, "foo"))
Tim Peters808b94e2001-09-13 19:33:07 +0000828 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000829 a.foo = 12
830 except (AttributeError, TypeError):
Tim Peters808b94e2001-09-13 19:33:07 +0000831 pass
832 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000833 self.fail("object() should not allow setting a foo attribute")
834 self.assertFalse(hasattr(object(), "__dict__"))
Tim Peters561f8992001-09-13 19:36:36 +0000835
Georg Brandl479a7e72008-02-05 18:13:15 +0000836 class Cdict(object):
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000837 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000838 x = Cdict()
839 self.assertEqual(x.__dict__, {})
840 x.foo = 1
841 self.assertEqual(x.foo, 1)
842 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossumd8faa362007-04-27 19:54:29 +0000843
Georg Brandl479a7e72008-02-05 18:13:15 +0000844 def test_slots(self):
845 # Testing __slots__...
846 class C0(object):
847 __slots__ = []
848 x = C0()
849 self.assertFalse(hasattr(x, "__dict__"))
850 self.assertFalse(hasattr(x, "foo"))
851
852 class C1(object):
853 __slots__ = ['a']
854 x = C1()
855 self.assertFalse(hasattr(x, "__dict__"))
856 self.assertFalse(hasattr(x, "a"))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000857 x.a = 1
Georg Brandl479a7e72008-02-05 18:13:15 +0000858 self.assertEqual(x.a, 1)
859 x.a = None
860 self.assertEqual(x.a, None)
861 del x.a
862 self.assertFalse(hasattr(x, "a"))
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000863
Georg Brandl479a7e72008-02-05 18:13:15 +0000864 class C3(object):
865 __slots__ = ['a', 'b', 'c']
866 x = C3()
867 self.assertFalse(hasattr(x, "__dict__"))
868 self.assertFalse(hasattr(x, 'a'))
869 self.assertFalse(hasattr(x, 'b'))
870 self.assertFalse(hasattr(x, 'c'))
871 x.a = 1
872 x.b = 2
873 x.c = 3
874 self.assertEqual(x.a, 1)
875 self.assertEqual(x.b, 2)
876 self.assertEqual(x.c, 3)
877
878 class C4(object):
879 """Validate name mangling"""
880 __slots__ = ['__a']
881 def __init__(self, value):
882 self.__a = value
883 def get(self):
884 return self.__a
885 x = C4(5)
886 self.assertFalse(hasattr(x, '__dict__'))
887 self.assertFalse(hasattr(x, '__a'))
888 self.assertEqual(x.get(), 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000889 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000890 x.__a = 6
891 except AttributeError:
Guido van Rossum6661be32001-10-26 04:26:12 +0000892 pass
893 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000894 self.fail("Double underscored names not mangled")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000895
Georg Brandl479a7e72008-02-05 18:13:15 +0000896 # Make sure slot names are proper identifiers
Guido van Rossum360e4b82007-05-14 22:51:27 +0000897 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000898 class C(object):
899 __slots__ = [None]
Guido van Rossum360e4b82007-05-14 22:51:27 +0000900 except TypeError:
901 pass
902 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000903 self.fail("[None] slots not caught")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000904 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000905 class C(object):
906 __slots__ = ["foo bar"]
907 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000908 pass
909 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000910 self.fail("['foo bar'] slots not caught")
911 try:
912 class C(object):
913 __slots__ = ["foo\0bar"]
914 except TypeError:
915 pass
916 else:
917 self.fail("['foo\\0bar'] slots not caught")
918 try:
919 class C(object):
920 __slots__ = ["1"]
921 except TypeError:
922 pass
923 else:
924 self.fail("['1'] slots not caught")
925 try:
926 class C(object):
927 __slots__ = [""]
928 except TypeError:
929 pass
930 else:
931 self.fail("[''] slots not caught")
932 class C(object):
933 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
934 # XXX(nnorwitz): was there supposed to be something tested
935 # from the class above?
Guido van Rossum360e4b82007-05-14 22:51:27 +0000936
Georg Brandl479a7e72008-02-05 18:13:15 +0000937 # Test a single string is not expanded as a sequence.
938 class C(object):
939 __slots__ = "abc"
940 c = C()
941 c.abc = 5
942 self.assertEqual(c.abc, 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000943
Georg Brandl479a7e72008-02-05 18:13:15 +0000944 # Test unicode slot names
945 # Test a single unicode string is not expanded as a sequence.
946 class C(object):
947 __slots__ = "abc"
948 c = C()
949 c.abc = 5
950 self.assertEqual(c.abc, 5)
Guido van Rossum3926a632001-09-25 16:25:58 +0000951
Georg Brandl479a7e72008-02-05 18:13:15 +0000952 # _unicode_to_string used to modify slots in certain circumstances
953 slots = ("foo", "bar")
954 class C(object):
955 __slots__ = slots
956 x = C()
957 x.foo = 5
958 self.assertEqual(x.foo, 5)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000959 self.assertTrue(type(slots[0]) is str)
Georg Brandl479a7e72008-02-05 18:13:15 +0000960 # this used to leak references
961 try:
962 class C(object):
963 __slots__ = [chr(128)]
964 except (TypeError, UnicodeEncodeError):
965 pass
966 else:
967 raise TestFailed("[chr(128)] slots not caught")
Guido van Rossum3926a632001-09-25 16:25:58 +0000968
Georg Brandl479a7e72008-02-05 18:13:15 +0000969 # Test leaks
970 class Counted(object):
971 counter = 0 # counts the number of instances alive
972 def __init__(self):
973 Counted.counter += 1
974 def __del__(self):
975 Counted.counter -= 1
976 class C(object):
977 __slots__ = ['a', 'b', 'c']
978 x = C()
979 x.a = Counted()
980 x.b = Counted()
981 x.c = Counted()
982 self.assertEqual(Counted.counter, 3)
983 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000984 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000985 self.assertEqual(Counted.counter, 0)
986 class D(C):
987 pass
988 x = D()
989 x.a = Counted()
990 x.z = Counted()
991 self.assertEqual(Counted.counter, 2)
992 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000993 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000994 self.assertEqual(Counted.counter, 0)
995 class E(D):
996 __slots__ = ['e']
997 x = E()
998 x.a = Counted()
999 x.z = Counted()
1000 x.e = Counted()
1001 self.assertEqual(Counted.counter, 3)
1002 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +00001003 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001004 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001005
Georg Brandl479a7e72008-02-05 18:13:15 +00001006 # Test cyclical leaks [SF bug 519621]
1007 class F(object):
1008 __slots__ = ['a', 'b']
1009 log = []
1010 s = F()
1011 s.a = [Counted(), s]
1012 self.assertEqual(Counted.counter, 1)
1013 s = None
Benjamin Petersone549ead2009-03-28 21:42:05 +00001014 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001015 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001016
Georg Brandl479a7e72008-02-05 18:13:15 +00001017 # Test lookup leaks [SF bug 572567]
1018 import sys,gc
Benjamin Petersone549ead2009-03-28 21:42:05 +00001019 if hasattr(gc, 'get_objects'):
1020 class G(object):
Benjamin Petersona8b976b2009-10-11 18:28:48 +00001021 def __eq__(self, other):
1022 return False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001023 g = G()
1024 orig_objects = len(gc.get_objects())
1025 for i in range(10):
1026 g==g
1027 new_objects = len(gc.get_objects())
1028 self.assertEqual(orig_objects, new_objects)
1029
Georg Brandl479a7e72008-02-05 18:13:15 +00001030 class H(object):
1031 __slots__ = ['a', 'b']
1032 def __init__(self):
1033 self.a = 1
1034 self.b = 2
1035 def __del__(self_):
1036 self.assertEqual(self_.a, 1)
1037 self.assertEqual(self_.b, 2)
Benjamin Petersonc1de4cc2008-11-03 21:29:09 +00001038 with support.captured_output('stderr') as s:
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001039 h = H()
Georg Brandl479a7e72008-02-05 18:13:15 +00001040 del h
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001041 self.assertEqual(s.getvalue(), '')
Guido van Rossum90c45142001-11-24 21:07:01 +00001042
Benjamin Petersond12362a2009-12-30 19:44:54 +00001043 class X(object):
1044 __slots__ = "a"
1045 with self.assertRaises(AttributeError):
1046 del X().a
1047
Georg Brandl479a7e72008-02-05 18:13:15 +00001048 def test_slots_special(self):
1049 # Testing __dict__ and __weakref__ in __slots__...
1050 class D(object):
1051 __slots__ = ["__dict__"]
1052 a = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001053 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001054 self.assertFalse(hasattr(a, "__weakref__"))
1055 a.foo = 42
1056 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum90c45142001-11-24 21:07:01 +00001057
Georg Brandl479a7e72008-02-05 18:13:15 +00001058 class W(object):
1059 __slots__ = ["__weakref__"]
1060 a = W()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001061 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001062 self.assertFalse(hasattr(a, "__dict__"))
1063 try:
1064 a.foo = 42
1065 except AttributeError:
1066 pass
1067 else:
1068 self.fail("shouldn't be allowed to set a.foo")
1069
1070 class C1(W, D):
1071 __slots__ = []
1072 a = C1()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001073 self.assertTrue(hasattr(a, "__dict__"))
1074 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001075 a.foo = 42
1076 self.assertEqual(a.__dict__, {"foo": 42})
1077
1078 class C2(D, W):
1079 __slots__ = []
1080 a = C2()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001081 self.assertTrue(hasattr(a, "__dict__"))
1082 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001083 a.foo = 42
1084 self.assertEqual(a.__dict__, {"foo": 42})
1085
Christian Heimesa156e092008-02-16 07:38:31 +00001086 def test_slots_descriptor(self):
1087 # Issue2115: slot descriptors did not correctly check
1088 # the type of the given object
1089 import abc
1090 class MyABC(metaclass=abc.ABCMeta):
1091 __slots__ = "a"
1092
1093 class Unrelated(object):
1094 pass
1095 MyABC.register(Unrelated)
1096
1097 u = Unrelated()
Ezio Melottie9615932010-01-24 19:26:24 +00001098 self.assertIsInstance(u, MyABC)
Christian Heimesa156e092008-02-16 07:38:31 +00001099
1100 # This used to crash
1101 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1102
Georg Brandl479a7e72008-02-05 18:13:15 +00001103 def test_dynamics(self):
1104 # Testing class attribute propagation...
1105 class D(object):
1106 pass
1107 class E(D):
1108 pass
1109 class F(D):
1110 pass
1111 D.foo = 1
1112 self.assertEqual(D.foo, 1)
1113 # Test that dynamic attributes are inherited
1114 self.assertEqual(E.foo, 1)
1115 self.assertEqual(F.foo, 1)
1116 # Test dynamic instances
1117 class C(object):
1118 pass
1119 a = C()
1120 self.assertFalse(hasattr(a, "foobar"))
1121 C.foobar = 2
1122 self.assertEqual(a.foobar, 2)
1123 C.method = lambda self: 42
1124 self.assertEqual(a.method(), 42)
1125 C.__repr__ = lambda self: "C()"
1126 self.assertEqual(repr(a), "C()")
1127 C.__int__ = lambda self: 100
1128 self.assertEqual(int(a), 100)
1129 self.assertEqual(a.foobar, 2)
1130 self.assertFalse(hasattr(a, "spam"))
1131 def mygetattr(self, name):
1132 if name == "spam":
1133 return "spam"
1134 raise AttributeError
1135 C.__getattr__ = mygetattr
1136 self.assertEqual(a.spam, "spam")
1137 a.new = 12
1138 self.assertEqual(a.new, 12)
1139 def mysetattr(self, name, value):
1140 if name == "spam":
1141 raise AttributeError
1142 return object.__setattr__(self, name, value)
1143 C.__setattr__ = mysetattr
1144 try:
1145 a.spam = "not spam"
1146 except AttributeError:
1147 pass
1148 else:
1149 self.fail("expected AttributeError")
1150 self.assertEqual(a.spam, "spam")
1151 class D(C):
1152 pass
1153 d = D()
1154 d.foo = 1
1155 self.assertEqual(d.foo, 1)
1156
1157 # Test handling of int*seq and seq*int
1158 class I(int):
1159 pass
1160 self.assertEqual("a"*I(2), "aa")
1161 self.assertEqual(I(2)*"a", "aa")
1162 self.assertEqual(2*I(3), 6)
1163 self.assertEqual(I(3)*2, 6)
1164 self.assertEqual(I(3)*I(2), 6)
1165
Georg Brandl479a7e72008-02-05 18:13:15 +00001166 # Test comparison of classes with dynamic metaclasses
1167 class dynamicmetaclass(type):
1168 pass
1169 class someclass(metaclass=dynamicmetaclass):
1170 pass
1171 self.assertNotEqual(someclass, object)
1172
1173 def test_errors(self):
1174 # Testing errors...
1175 try:
1176 class C(list, dict):
1177 pass
1178 except TypeError:
1179 pass
1180 else:
1181 self.fail("inheritance from both list and dict should be illegal")
1182
1183 try:
1184 class C(object, None):
1185 pass
1186 except TypeError:
1187 pass
1188 else:
1189 self.fail("inheritance from non-type should be illegal")
1190 class Classic:
1191 pass
1192
1193 try:
1194 class C(type(len)):
1195 pass
1196 except TypeError:
1197 pass
1198 else:
1199 self.fail("inheritance from CFunction should be illegal")
1200
1201 try:
1202 class C(object):
1203 __slots__ = 1
1204 except TypeError:
1205 pass
1206 else:
1207 self.fail("__slots__ = 1 should be illegal")
1208
1209 try:
1210 class C(object):
1211 __slots__ = [1]
1212 except TypeError:
1213 pass
1214 else:
1215 self.fail("__slots__ = [1] should be illegal")
1216
1217 class M1(type):
1218 pass
1219 class M2(type):
1220 pass
1221 class A1(object, metaclass=M1):
1222 pass
1223 class A2(object, metaclass=M2):
1224 pass
1225 try:
1226 class B(A1, A2):
1227 pass
1228 except TypeError:
1229 pass
1230 else:
1231 self.fail("finding the most derived metaclass should have failed")
1232
1233 def test_classmethods(self):
1234 # Testing class methods...
1235 class C(object):
1236 def foo(*a): return a
1237 goo = classmethod(foo)
1238 c = C()
1239 self.assertEqual(C.goo(1), (C, 1))
1240 self.assertEqual(c.goo(1), (C, 1))
1241 self.assertEqual(c.foo(1), (c, 1))
1242 class D(C):
1243 pass
1244 d = D()
1245 self.assertEqual(D.goo(1), (D, 1))
1246 self.assertEqual(d.goo(1), (D, 1))
1247 self.assertEqual(d.foo(1), (d, 1))
1248 self.assertEqual(D.foo(d, 1), (d, 1))
1249 # Test for a specific crash (SF bug 528132)
1250 def f(cls, arg): return (cls, arg)
1251 ff = classmethod(f)
1252 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1253 self.assertEqual(ff.__get__(0)(42), (int, 42))
1254
1255 # Test super() with classmethods (SF bug 535444)
1256 self.assertEqual(C.goo.__self__, C)
1257 self.assertEqual(D.goo.__self__, D)
1258 self.assertEqual(super(D,D).goo.__self__, D)
1259 self.assertEqual(super(D,d).goo.__self__, D)
1260 self.assertEqual(super(D,D).goo(), (D,))
1261 self.assertEqual(super(D,d).goo(), (D,))
1262
Benjamin Peterson8719ad52009-09-11 22:24:02 +00001263 # Verify that a non-callable will raise
1264 meth = classmethod(1).__get__(1)
1265 self.assertRaises(TypeError, meth)
Georg Brandl479a7e72008-02-05 18:13:15 +00001266
1267 # Verify that classmethod() doesn't allow keyword args
1268 try:
1269 classmethod(f, kw=1)
1270 except TypeError:
1271 pass
1272 else:
1273 self.fail("classmethod shouldn't accept keyword args")
1274
Benjamin Petersone549ead2009-03-28 21:42:05 +00001275 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001276 def test_classmethods_in_c(self):
1277 # Testing C-based class methods...
1278 import xxsubtype as spam
1279 a = (1, 2, 3)
1280 d = {'abc': 123}
1281 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1282 self.assertEqual(x, spam.spamlist)
1283 self.assertEqual(a, a1)
1284 self.assertEqual(d, d1)
1285 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1286 self.assertEqual(x, spam.spamlist)
1287 self.assertEqual(a, a1)
1288 self.assertEqual(d, d1)
1289
1290 def test_staticmethods(self):
1291 # Testing static methods...
1292 class C(object):
1293 def foo(*a): return a
1294 goo = staticmethod(foo)
1295 c = C()
1296 self.assertEqual(C.goo(1), (1,))
1297 self.assertEqual(c.goo(1), (1,))
1298 self.assertEqual(c.foo(1), (c, 1,))
1299 class D(C):
1300 pass
1301 d = D()
1302 self.assertEqual(D.goo(1), (1,))
1303 self.assertEqual(d.goo(1), (1,))
1304 self.assertEqual(d.foo(1), (d, 1))
1305 self.assertEqual(D.foo(d, 1), (d, 1))
1306
Benjamin Petersone549ead2009-03-28 21:42:05 +00001307 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001308 def test_staticmethods_in_c(self):
1309 # Testing C-based static methods...
1310 import xxsubtype as spam
1311 a = (1, 2, 3)
1312 d = {"abc": 123}
1313 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1314 self.assertEqual(x, None)
1315 self.assertEqual(a, a1)
1316 self.assertEqual(d, d1)
1317 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1318 self.assertEqual(x, None)
1319 self.assertEqual(a, a1)
1320 self.assertEqual(d, d1)
1321
1322 def test_classic(self):
1323 # Testing classic classes...
1324 class C:
1325 def foo(*a): return a
1326 goo = classmethod(foo)
1327 c = C()
1328 self.assertEqual(C.goo(1), (C, 1))
1329 self.assertEqual(c.goo(1), (C, 1))
1330 self.assertEqual(c.foo(1), (c, 1))
1331 class D(C):
1332 pass
1333 d = D()
1334 self.assertEqual(D.goo(1), (D, 1))
1335 self.assertEqual(d.goo(1), (D, 1))
1336 self.assertEqual(d.foo(1), (d, 1))
1337 self.assertEqual(D.foo(d, 1), (d, 1))
1338 class E: # *not* subclassing from C
1339 foo = C.foo
1340 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001341 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001342
1343 def test_compattr(self):
1344 # Testing computed attributes...
1345 class C(object):
1346 class computed_attribute(object):
1347 def __init__(self, get, set=None, delete=None):
1348 self.__get = get
1349 self.__set = set
1350 self.__delete = delete
1351 def __get__(self, obj, type=None):
1352 return self.__get(obj)
1353 def __set__(self, obj, value):
1354 return self.__set(obj, value)
1355 def __delete__(self, obj):
1356 return self.__delete(obj)
1357 def __init__(self):
1358 self.__x = 0
1359 def __get_x(self):
1360 x = self.__x
1361 self.__x = x+1
1362 return x
1363 def __set_x(self, x):
1364 self.__x = x
1365 def __delete_x(self):
1366 del self.__x
1367 x = computed_attribute(__get_x, __set_x, __delete_x)
1368 a = C()
1369 self.assertEqual(a.x, 0)
1370 self.assertEqual(a.x, 1)
1371 a.x = 10
1372 self.assertEqual(a.x, 10)
1373 self.assertEqual(a.x, 11)
1374 del a.x
1375 self.assertEqual(hasattr(a, 'x'), 0)
1376
1377 def test_newslots(self):
1378 # Testing __new__ slot override...
1379 class C(list):
1380 def __new__(cls):
1381 self = list.__new__(cls)
1382 self.foo = 1
1383 return self
1384 def __init__(self):
1385 self.foo = self.foo + 2
1386 a = C()
1387 self.assertEqual(a.foo, 3)
1388 self.assertEqual(a.__class__, C)
1389 class D(C):
1390 pass
1391 b = D()
1392 self.assertEqual(b.foo, 3)
1393 self.assertEqual(b.__class__, D)
1394
1395 def test_altmro(self):
1396 # Testing mro() and overriding it...
1397 class A(object):
1398 def f(self): return "A"
1399 class B(A):
1400 pass
1401 class C(A):
1402 def f(self): return "C"
1403 class D(B, C):
1404 pass
1405 self.assertEqual(D.mro(), [D, B, C, A, object])
1406 self.assertEqual(D.__mro__, (D, B, C, A, object))
1407 self.assertEqual(D().f(), "C")
1408
1409 class PerverseMetaType(type):
1410 def mro(cls):
1411 L = type.mro(cls)
1412 L.reverse()
1413 return L
1414 class X(D,B,C,A, metaclass=PerverseMetaType):
1415 pass
1416 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1417 self.assertEqual(X().f(), "A")
1418
1419 try:
1420 class _metaclass(type):
1421 def mro(self):
1422 return [self, dict, object]
1423 class X(object, metaclass=_metaclass):
1424 pass
Benjamin Petersone549ead2009-03-28 21:42:05 +00001425 # In CPython, the class creation above already raises
1426 # TypeError, as a protection against the fact that
1427 # instances of X would segfault it. In other Python
1428 # implementations it would be ok to let the class X
1429 # be created, but instead get a clean TypeError on the
1430 # __setitem__ below.
1431 x = object.__new__(X)
1432 x[5] = 6
Georg Brandl479a7e72008-02-05 18:13:15 +00001433 except TypeError:
1434 pass
1435 else:
1436 self.fail("devious mro() return not caught")
1437
1438 try:
1439 class _metaclass(type):
1440 def mro(self):
1441 return [1]
1442 class X(object, metaclass=_metaclass):
1443 pass
1444 except TypeError:
1445 pass
1446 else:
1447 self.fail("non-class mro() return not caught")
1448
1449 try:
1450 class _metaclass(type):
1451 def mro(self):
1452 return 1
1453 class X(object, metaclass=_metaclass):
1454 pass
1455 except TypeError:
1456 pass
1457 else:
1458 self.fail("non-sequence mro() return not caught")
1459
1460 def test_overloading(self):
1461 # Testing operator overloading...
1462
1463 class B(object):
1464 "Intermediate class because object doesn't have a __setattr__"
1465
1466 class C(B):
1467 def __getattr__(self, name):
1468 if name == "foo":
1469 return ("getattr", name)
1470 else:
1471 raise AttributeError
1472 def __setattr__(self, name, value):
1473 if name == "foo":
1474 self.setattr = (name, value)
1475 else:
1476 return B.__setattr__(self, name, value)
1477 def __delattr__(self, name):
1478 if name == "foo":
1479 self.delattr = name
1480 else:
1481 return B.__delattr__(self, name)
1482
1483 def __getitem__(self, key):
1484 return ("getitem", key)
1485 def __setitem__(self, key, value):
1486 self.setitem = (key, value)
1487 def __delitem__(self, key):
1488 self.delitem = key
1489
1490 a = C()
1491 self.assertEqual(a.foo, ("getattr", "foo"))
1492 a.foo = 12
1493 self.assertEqual(a.setattr, ("foo", 12))
1494 del a.foo
1495 self.assertEqual(a.delattr, "foo")
1496
1497 self.assertEqual(a[12], ("getitem", 12))
1498 a[12] = 21
1499 self.assertEqual(a.setitem, (12, 21))
1500 del a[12]
1501 self.assertEqual(a.delitem, 12)
1502
1503 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1504 a[0:10] = "foo"
1505 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1506 del a[0:10]
1507 self.assertEqual(a.delitem, (slice(0, 10)))
1508
1509 def test_methods(self):
1510 # Testing methods...
1511 class C(object):
1512 def __init__(self, x):
1513 self.x = x
1514 def foo(self):
1515 return self.x
1516 c1 = C(1)
1517 self.assertEqual(c1.foo(), 1)
1518 class D(C):
1519 boo = C.foo
1520 goo = c1.foo
1521 d2 = D(2)
1522 self.assertEqual(d2.foo(), 2)
1523 self.assertEqual(d2.boo(), 2)
1524 self.assertEqual(d2.goo(), 1)
1525 class E(object):
1526 foo = C.foo
1527 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001528 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001529
Benjamin Peterson224205f2009-05-08 03:25:19 +00001530 def test_special_method_lookup(self):
1531 # The lookup of special methods bypasses __getattr__ and
1532 # __getattribute__, but they still can be descriptors.
1533
1534 def run_context(manager):
1535 with manager:
1536 pass
1537 def iden(self):
1538 return self
1539 def hello(self):
1540 return b"hello"
Benjamin Peterson053c61f2009-05-09 17:21:13 +00001541 def empty_seq(self):
1542 return []
Benjamin Petersona5758c02009-05-09 18:15:04 +00001543 def zero(self):
1544 return 0
Benjamin Petersonaea44282010-01-04 01:10:28 +00001545 def complex_num(self):
1546 return 1j
Benjamin Petersona5758c02009-05-09 18:15:04 +00001547 def stop(self):
1548 raise StopIteration
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001549 def return_true(self, thing=None):
1550 return True
1551 def do_isinstance(obj):
1552 return isinstance(int, obj)
1553 def do_issubclass(obj):
1554 return issubclass(int, obj)
Benjamin Petersona7205592009-05-27 03:08:59 +00001555 def do_dict_missing(checker):
1556 class DictSub(checker.__class__, dict):
1557 pass
1558 self.assertEqual(DictSub()["hi"], 4)
1559 def some_number(self_, key):
1560 self.assertEqual(key, "hi")
1561 return 4
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001562 def swallow(*args): pass
Benjamin Peterson224205f2009-05-08 03:25:19 +00001563
1564 # It would be nice to have every special method tested here, but I'm
1565 # only listing the ones I can remember outside of typeobject.c, since it
1566 # does it right.
1567 specials = [
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001568 ("__bytes__", bytes, hello, set(), {}),
1569 ("__reversed__", reversed, empty_seq, set(), {}),
1570 ("__length_hint__", list, zero, set(),
Benjamin Petersona5758c02009-05-09 18:15:04 +00001571 {"__iter__" : iden, "__next__" : stop}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001572 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1573 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Petersona7205592009-05-27 03:08:59 +00001574 ("__missing__", do_dict_missing, some_number,
1575 set(("__class__",)), {}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001576 ("__subclasscheck__", do_issubclass, return_true,
1577 set(("__bases__",)), {}),
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001578 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1579 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Petersonaea44282010-01-04 01:10:28 +00001580 ("__complex__", complex, complex_num, set(), {}),
Benjamin Peterson224205f2009-05-08 03:25:19 +00001581 ]
1582
1583 class Checker(object):
1584 def __getattr__(self, attr, test=self):
1585 test.fail("__getattr__ called with {0}".format(attr))
1586 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001587 if attr not in ok:
1588 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Petersona7205592009-05-27 03:08:59 +00001589 return object.__getattribute__(self, attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001590 class SpecialDescr(object):
1591 def __init__(self, impl):
1592 self.impl = impl
1593 def __get__(self, obj, owner):
1594 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001595 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001596 class MyException(Exception):
1597 pass
1598 class ErrDescr(object):
1599 def __get__(self, obj, owner):
1600 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001601
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001602 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001603 class X(Checker):
1604 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001605 for attr, obj in env.items():
1606 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001607 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001608 runner(X())
1609
1610 record = []
1611 class X(Checker):
1612 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001613 for attr, obj in env.items():
1614 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001615 setattr(X, name, SpecialDescr(meth_impl))
1616 runner(X())
1617 self.assertEqual(record, [1], name)
1618
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001619 class X(Checker):
1620 pass
1621 for attr, obj in env.items():
1622 setattr(X, attr, obj)
1623 setattr(X, name, ErrDescr())
1624 try:
1625 runner(X())
1626 except MyException:
1627 pass
1628 else:
1629 self.fail("{0!r} didn't raise".format(name))
1630
Georg Brandl479a7e72008-02-05 18:13:15 +00001631 def test_specials(self):
1632 # Testing special operators...
1633 # Test operators like __hash__ for which a built-in default exists
1634
1635 # Test the default behavior for static classes
1636 class C(object):
1637 def __getitem__(self, i):
1638 if 0 <= i < 10: return i
1639 raise IndexError
1640 c1 = C()
1641 c2 = C()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001642 self.assertTrue(not not c1) # What?
Georg Brandl479a7e72008-02-05 18:13:15 +00001643 self.assertNotEqual(id(c1), id(c2))
1644 hash(c1)
1645 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001646 self.assertEqual(c1, c1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001647 self.assertTrue(c1 != c2)
1648 self.assertTrue(not c1 != c1)
1649 self.assertTrue(not c1 == c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001650 # Note that the module name appears in str/repr, and that varies
1651 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001652 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001653 self.assertEqual(str(c1), repr(c1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001654 self.assertNotIn(-1, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001655 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001656 self.assertIn(i, c1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001657 self.assertNotIn(10, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001658 # Test the default behavior for dynamic classes
1659 class D(object):
1660 def __getitem__(self, i):
1661 if 0 <= i < 10: return i
1662 raise IndexError
1663 d1 = D()
1664 d2 = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001665 self.assertTrue(not not d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001666 self.assertNotEqual(id(d1), id(d2))
1667 hash(d1)
1668 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001669 self.assertEqual(d1, d1)
1670 self.assertNotEqual(d1, d2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001671 self.assertTrue(not d1 != d1)
1672 self.assertTrue(not d1 == d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001673 # Note that the module name appears in str/repr, and that varies
1674 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001675 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001676 self.assertEqual(str(d1), repr(d1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001677 self.assertNotIn(-1, d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001678 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001679 self.assertIn(i, d1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001680 self.assertNotIn(10, d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001681 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001682 class Proxy(object):
1683 def __init__(self, x):
1684 self.x = x
1685 def __bool__(self):
1686 return not not self.x
1687 def __hash__(self):
1688 return hash(self.x)
1689 def __eq__(self, other):
1690 return self.x == other
1691 def __ne__(self, other):
1692 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001693 def __ge__(self, other):
1694 return self.x >= other
1695 def __gt__(self, other):
1696 return self.x > other
1697 def __le__(self, other):
1698 return self.x <= other
1699 def __lt__(self, other):
1700 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001701 def __str__(self):
1702 return "Proxy:%s" % self.x
1703 def __repr__(self):
1704 return "Proxy(%r)" % self.x
1705 def __contains__(self, value):
1706 return value in self.x
1707 p0 = Proxy(0)
1708 p1 = Proxy(1)
1709 p_1 = Proxy(-1)
1710 self.assertFalse(p0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001711 self.assertTrue(not not p1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001712 self.assertEqual(hash(p0), hash(0))
1713 self.assertEqual(p0, p0)
1714 self.assertNotEqual(p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001715 self.assertTrue(not p0 != p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001716 self.assertEqual(not p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001717 self.assertTrue(p0 < p1)
1718 self.assertTrue(p0 <= p1)
1719 self.assertTrue(p1 > p0)
1720 self.assertTrue(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001721 self.assertEqual(str(p0), "Proxy:0")
1722 self.assertEqual(repr(p0), "Proxy(0)")
1723 p10 = Proxy(range(10))
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001724 self.assertNotIn(-1, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001725 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001726 self.assertIn(i, p10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001727 self.assertNotIn(10, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001728
Georg Brandl479a7e72008-02-05 18:13:15 +00001729 def test_weakrefs(self):
1730 # Testing weak references...
1731 import weakref
1732 class C(object):
1733 pass
1734 c = C()
1735 r = weakref.ref(c)
1736 self.assertEqual(r(), c)
1737 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001738 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001739 self.assertEqual(r(), None)
1740 del r
1741 class NoWeak(object):
1742 __slots__ = ['foo']
1743 no = NoWeak()
1744 try:
1745 weakref.ref(no)
1746 except TypeError as msg:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001747 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001748 else:
1749 self.fail("weakref.ref(no) should be illegal")
1750 class Weak(object):
1751 __slots__ = ['foo', '__weakref__']
1752 yes = Weak()
1753 r = weakref.ref(yes)
1754 self.assertEqual(r(), yes)
1755 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001756 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001757 self.assertEqual(r(), None)
1758 del r
1759
1760 def test_properties(self):
1761 # Testing property...
1762 class C(object):
1763 def getx(self):
1764 return self.__x
1765 def setx(self, value):
1766 self.__x = value
1767 def delx(self):
1768 del self.__x
1769 x = property(getx, setx, delx, doc="I'm the x property.")
1770 a = C()
1771 self.assertFalse(hasattr(a, "x"))
1772 a.x = 42
1773 self.assertEqual(a._C__x, 42)
1774 self.assertEqual(a.x, 42)
1775 del a.x
1776 self.assertFalse(hasattr(a, "x"))
1777 self.assertFalse(hasattr(a, "_C__x"))
1778 C.x.__set__(a, 100)
1779 self.assertEqual(C.x.__get__(a), 100)
1780 C.x.__delete__(a)
1781 self.assertFalse(hasattr(a, "x"))
1782
1783 raw = C.__dict__['x']
Ezio Melottie9615932010-01-24 19:26:24 +00001784 self.assertIsInstance(raw, property)
Georg Brandl479a7e72008-02-05 18:13:15 +00001785
1786 attrs = dir(raw)
Benjamin Peterson577473f2010-01-19 00:09:57 +00001787 self.assertIn("__doc__", attrs)
1788 self.assertIn("fget", attrs)
1789 self.assertIn("fset", attrs)
1790 self.assertIn("fdel", attrs)
Georg Brandl479a7e72008-02-05 18:13:15 +00001791
1792 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001793 self.assertTrue(raw.fget is C.__dict__['getx'])
1794 self.assertTrue(raw.fset is C.__dict__['setx'])
1795 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl479a7e72008-02-05 18:13:15 +00001796
1797 for attr in "__doc__", "fget", "fset", "fdel":
1798 try:
1799 setattr(raw, attr, 42)
1800 except AttributeError as msg:
1801 if str(msg).find('readonly') < 0:
1802 self.fail("when setting readonly attr %r on a property, "
1803 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1804 else:
1805 self.fail("expected AttributeError from trying to set readonly %r "
1806 "attr on a property" % attr)
1807
1808 class D(object):
1809 __getitem__ = property(lambda s: 1/0)
1810
1811 d = D()
1812 try:
1813 for i in d:
1814 str(i)
1815 except ZeroDivisionError:
1816 pass
1817 else:
1818 self.fail("expected ZeroDivisionError from bad property")
1819
1820 class E(object):
1821 def getter(self):
1822 "getter method"
1823 return 0
1824 def setter(self_, value):
1825 "setter method"
1826 pass
1827 prop = property(getter)
1828 self.assertEqual(prop.__doc__, "getter method")
1829 prop2 = property(fset=setter)
1830 self.assertEqual(prop2.__doc__, None)
1831
1832 # this segfaulted in 2.5b2
1833 try:
1834 import _testcapi
1835 except ImportError:
1836 pass
1837 else:
1838 class X(object):
1839 p = property(_testcapi.test_with_docstring)
1840
1841 def test_properties_plus(self):
1842 class C(object):
1843 foo = property(doc="hello")
1844 @foo.getter
1845 def foo(self):
1846 return self._foo
1847 @foo.setter
1848 def foo(self, value):
1849 self._foo = abs(value)
1850 @foo.deleter
1851 def foo(self):
1852 del self._foo
1853 c = C()
1854 self.assertEqual(C.foo.__doc__, "hello")
1855 self.assertFalse(hasattr(c, "foo"))
1856 c.foo = -42
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001857 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl479a7e72008-02-05 18:13:15 +00001858 self.assertEqual(c._foo, 42)
1859 self.assertEqual(c.foo, 42)
1860 del c.foo
1861 self.assertFalse(hasattr(c, '_foo'))
1862 self.assertFalse(hasattr(c, "foo"))
1863
1864 class D(C):
1865 @C.foo.deleter
1866 def foo(self):
1867 try:
1868 del self._foo
1869 except AttributeError:
1870 pass
1871 d = D()
1872 d.foo = 24
1873 self.assertEqual(d.foo, 24)
1874 del d.foo
1875 del d.foo
1876
1877 class E(object):
1878 @property
1879 def foo(self):
1880 return self._foo
1881 @foo.setter
1882 def foo(self, value):
1883 raise RuntimeError
1884 @foo.setter
1885 def foo(self, value):
1886 self._foo = abs(value)
1887 @foo.deleter
1888 def foo(self, value=None):
1889 del self._foo
1890
1891 e = E()
1892 e.foo = -42
1893 self.assertEqual(e.foo, 42)
1894 del e.foo
1895
1896 class F(E):
1897 @E.foo.deleter
1898 def foo(self):
1899 del self._foo
1900 @foo.setter
1901 def foo(self, value):
1902 self._foo = max(0, value)
1903 f = F()
1904 f.foo = -10
1905 self.assertEqual(f.foo, 0)
1906 del f.foo
1907
1908 def test_dict_constructors(self):
1909 # Testing dict constructor ...
1910 d = dict()
1911 self.assertEqual(d, {})
1912 d = dict({})
1913 self.assertEqual(d, {})
1914 d = dict({1: 2, 'a': 'b'})
1915 self.assertEqual(d, {1: 2, 'a': 'b'})
1916 self.assertEqual(d, dict(list(d.items())))
1917 self.assertEqual(d, dict(iter(d.items())))
1918 d = dict({'one':1, 'two':2})
1919 self.assertEqual(d, dict(one=1, two=2))
1920 self.assertEqual(d, dict(**d))
1921 self.assertEqual(d, dict({"one": 1}, two=2))
1922 self.assertEqual(d, dict([("two", 2)], one=1))
1923 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1924 self.assertEqual(d, dict(**d))
1925
1926 for badarg in 0, 0, 0j, "0", [0], (0,):
1927 try:
1928 dict(badarg)
1929 except TypeError:
1930 pass
1931 except ValueError:
1932 if badarg == "0":
1933 # It's a sequence, and its elements are also sequences (gotta
1934 # love strings <wink>), but they aren't of length 2, so this
1935 # one seemed better as a ValueError than a TypeError.
1936 pass
1937 else:
1938 self.fail("no TypeError from dict(%r)" % badarg)
1939 else:
1940 self.fail("no TypeError from dict(%r)" % badarg)
1941
1942 try:
1943 dict({}, {})
1944 except TypeError:
1945 pass
1946 else:
1947 self.fail("no TypeError from dict({}, {})")
1948
1949 class Mapping:
1950 # Lacks a .keys() method; will be added later.
1951 dict = {1:2, 3:4, 'a':1j}
1952
1953 try:
1954 dict(Mapping())
1955 except TypeError:
1956 pass
1957 else:
1958 self.fail("no TypeError from dict(incomplete mapping)")
1959
1960 Mapping.keys = lambda self: list(self.dict.keys())
1961 Mapping.__getitem__ = lambda self, i: self.dict[i]
1962 d = dict(Mapping())
1963 self.assertEqual(d, Mapping.dict)
1964
1965 # Init from sequence of iterable objects, each producing a 2-sequence.
1966 class AddressBookEntry:
1967 def __init__(self, first, last):
1968 self.first = first
1969 self.last = last
1970 def __iter__(self):
1971 return iter([self.first, self.last])
1972
1973 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1974 AddressBookEntry('Barry', 'Peters'),
1975 AddressBookEntry('Tim', 'Peters'),
1976 AddressBookEntry('Barry', 'Warsaw')])
1977 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1978
1979 d = dict(zip(range(4), range(1, 5)))
1980 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1981
1982 # Bad sequence lengths.
1983 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1984 try:
1985 dict(bad)
1986 except ValueError:
1987 pass
1988 else:
1989 self.fail("no ValueError from dict(%r)" % bad)
1990
1991 def test_dir(self):
1992 # Testing dir() ...
1993 junk = 12
1994 self.assertEqual(dir(), ['junk', 'self'])
1995 del junk
1996
1997 # Just make sure these don't blow up!
1998 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
1999 dir(arg)
2000
2001 # Test dir on new-style classes. Since these have object as a
2002 # base class, a lot more gets sucked in.
2003 def interesting(strings):
2004 return [s for s in strings if not s.startswith('_')]
2005
2006 class C(object):
2007 Cdata = 1
2008 def Cmethod(self): pass
2009
2010 cstuff = ['Cdata', 'Cmethod']
2011 self.assertEqual(interesting(dir(C)), cstuff)
2012
2013 c = C()
2014 self.assertEqual(interesting(dir(c)), cstuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002015 ## self.assertIn('__self__', dir(C.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002016
2017 c.cdata = 2
2018 c.cmethod = lambda self: 0
2019 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002020 ## self.assertIn('__self__', dir(c.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002021
2022 class A(C):
2023 Adata = 1
2024 def Amethod(self): pass
2025
2026 astuff = ['Adata', 'Amethod'] + cstuff
2027 self.assertEqual(interesting(dir(A)), astuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002028 ## self.assertIn('__self__', dir(A.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002029 a = A()
2030 self.assertEqual(interesting(dir(a)), astuff)
2031 a.adata = 42
2032 a.amethod = lambda self: 3
2033 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002034 ## self.assertIn('__self__', dir(a.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002035
2036 # Try a module subclass.
2037 import sys
2038 class M(type(sys)):
2039 pass
2040 minstance = M("m")
2041 minstance.b = 2
2042 minstance.a = 1
2043 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2044 self.assertEqual(names, ['a', 'b'])
2045
2046 class M2(M):
2047 def getdict(self):
2048 return "Not a dict!"
2049 __dict__ = property(getdict)
2050
2051 m2instance = M2("m2")
2052 m2instance.b = 2
2053 m2instance.a = 1
2054 self.assertEqual(m2instance.__dict__, "Not a dict!")
2055 try:
2056 dir(m2instance)
2057 except TypeError:
2058 pass
2059
2060 # Two essentially featureless objects, just inheriting stuff from
2061 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002062 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2063 if support.check_impl_detail():
2064 # None differs in PyPy: it has a __nonzero__
2065 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002066
2067 # Nasty test case for proxied objects
2068 class Wrapper(object):
2069 def __init__(self, obj):
2070 self.__obj = obj
2071 def __repr__(self):
2072 return "Wrapper(%s)" % repr(self.__obj)
2073 def __getitem__(self, key):
2074 return Wrapper(self.__obj[key])
2075 def __len__(self):
2076 return len(self.__obj)
2077 def __getattr__(self, name):
2078 return Wrapper(getattr(self.__obj, name))
2079
2080 class C(object):
2081 def __getclass(self):
2082 return Wrapper(type(self))
2083 __class__ = property(__getclass)
2084
2085 dir(C()) # This used to segfault
2086
2087 def test_supers(self):
2088 # Testing super...
2089
2090 class A(object):
2091 def meth(self, a):
2092 return "A(%r)" % a
2093
2094 self.assertEqual(A().meth(1), "A(1)")
2095
2096 class B(A):
2097 def __init__(self):
2098 self.__super = super(B, self)
2099 def meth(self, a):
2100 return "B(%r)" % a + self.__super.meth(a)
2101
2102 self.assertEqual(B().meth(2), "B(2)A(2)")
2103
2104 class C(A):
2105 def meth(self, a):
2106 return "C(%r)" % a + self.__super.meth(a)
2107 C._C__super = super(C)
2108
2109 self.assertEqual(C().meth(3), "C(3)A(3)")
2110
2111 class D(C, B):
2112 def meth(self, a):
2113 return "D(%r)" % a + super(D, self).meth(a)
2114
2115 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2116
2117 # Test for subclassing super
2118
2119 class mysuper(super):
2120 def __init__(self, *args):
2121 return super(mysuper, self).__init__(*args)
2122
2123 class E(D):
2124 def meth(self, a):
2125 return "E(%r)" % a + mysuper(E, self).meth(a)
2126
2127 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2128
2129 class F(E):
2130 def meth(self, a):
2131 s = self.__super # == mysuper(F, self)
2132 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2133 F._F__super = mysuper(F)
2134
2135 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2136
2137 # Make sure certain errors are raised
2138
2139 try:
2140 super(D, 42)
2141 except TypeError:
2142 pass
2143 else:
2144 self.fail("shouldn't allow super(D, 42)")
2145
2146 try:
2147 super(D, C())
2148 except TypeError:
2149 pass
2150 else:
2151 self.fail("shouldn't allow super(D, C())")
2152
2153 try:
2154 super(D).__get__(12)
2155 except TypeError:
2156 pass
2157 else:
2158 self.fail("shouldn't allow super(D).__get__(12)")
2159
2160 try:
2161 super(D).__get__(C())
2162 except TypeError:
2163 pass
2164 else:
2165 self.fail("shouldn't allow super(D).__get__(C())")
2166
2167 # Make sure data descriptors can be overridden and accessed via super
2168 # (new feature in Python 2.3)
2169
2170 class DDbase(object):
2171 def getx(self): return 42
2172 x = property(getx)
2173
2174 class DDsub(DDbase):
2175 def getx(self): return "hello"
2176 x = property(getx)
2177
2178 dd = DDsub()
2179 self.assertEqual(dd.x, "hello")
2180 self.assertEqual(super(DDsub, dd).x, 42)
2181
2182 # Ensure that super() lookup of descriptor from classmethod
2183 # works (SF ID# 743627)
2184
2185 class Base(object):
2186 aProp = property(lambda self: "foo")
2187
2188 class Sub(Base):
2189 @classmethod
2190 def test(klass):
2191 return super(Sub,klass).aProp
2192
2193 self.assertEqual(Sub.test(), Base.aProp)
2194
2195 # Verify that super() doesn't allow keyword args
2196 try:
2197 super(Base, kw=1)
2198 except TypeError:
2199 pass
2200 else:
2201 self.assertEqual("super shouldn't accept keyword args")
2202
2203 def test_basic_inheritance(self):
2204 # Testing inheritance from basic types...
2205
2206 class hexint(int):
2207 def __repr__(self):
2208 return hex(self)
2209 def __add__(self, other):
2210 return hexint(int.__add__(self, other))
2211 # (Note that overriding __radd__ doesn't work,
2212 # because the int type gets first dibs.)
2213 self.assertEqual(repr(hexint(7) + 9), "0x10")
2214 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2215 a = hexint(12345)
2216 self.assertEqual(a, 12345)
2217 self.assertEqual(int(a), 12345)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002218 self.assertTrue(int(a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002219 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002220 self.assertTrue((+a).__class__ is int)
2221 self.assertTrue((a >> 0).__class__ is int)
2222 self.assertTrue((a << 0).__class__ is int)
2223 self.assertTrue((hexint(0) << 12).__class__ is int)
2224 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002225
2226 class octlong(int):
2227 __slots__ = []
2228 def __str__(self):
Mark Dickinson5c2db372009-12-05 20:28:34 +00002229 return oct(self)
Georg Brandl479a7e72008-02-05 18:13:15 +00002230 def __add__(self, other):
2231 return self.__class__(super(octlong, self).__add__(other))
2232 __radd__ = __add__
2233 self.assertEqual(str(octlong(3) + 5), "0o10")
2234 # (Note that overriding __radd__ here only seems to work
2235 # because the example uses a short int left argument.)
2236 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2237 a = octlong(12345)
2238 self.assertEqual(a, 12345)
2239 self.assertEqual(int(a), 12345)
2240 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002241 self.assertTrue(int(a).__class__ is int)
2242 self.assertTrue((+a).__class__ is int)
2243 self.assertTrue((-a).__class__ is int)
2244 self.assertTrue((-octlong(0)).__class__ is int)
2245 self.assertTrue((a >> 0).__class__ is int)
2246 self.assertTrue((a << 0).__class__ is int)
2247 self.assertTrue((a - 0).__class__ is int)
2248 self.assertTrue((a * 1).__class__ is int)
2249 self.assertTrue((a ** 1).__class__ is int)
2250 self.assertTrue((a // 1).__class__ is int)
2251 self.assertTrue((1 * a).__class__ is int)
2252 self.assertTrue((a | 0).__class__ is int)
2253 self.assertTrue((a ^ 0).__class__ is int)
2254 self.assertTrue((a & -1).__class__ is int)
2255 self.assertTrue((octlong(0) << 12).__class__ is int)
2256 self.assertTrue((octlong(0) >> 12).__class__ is int)
2257 self.assertTrue(abs(octlong(0)).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002258
2259 # Because octlong overrides __add__, we can't check the absence of +0
2260 # optimizations using octlong.
2261 class longclone(int):
2262 pass
2263 a = longclone(1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002264 self.assertTrue((a + 0).__class__ is int)
2265 self.assertTrue((0 + a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002266
2267 # Check that negative clones don't segfault
2268 a = longclone(-1)
2269 self.assertEqual(a.__dict__, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002270 self.assertEqual(int(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl479a7e72008-02-05 18:13:15 +00002271
2272 class precfloat(float):
2273 __slots__ = ['prec']
2274 def __init__(self, value=0.0, prec=12):
2275 self.prec = int(prec)
2276 def __repr__(self):
2277 return "%.*g" % (self.prec, self)
2278 self.assertEqual(repr(precfloat(1.1)), "1.1")
2279 a = precfloat(12345)
2280 self.assertEqual(a, 12345.0)
2281 self.assertEqual(float(a), 12345.0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002282 self.assertTrue(float(a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002283 self.assertEqual(hash(a), hash(12345.0))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002284 self.assertTrue((+a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002285
2286 class madcomplex(complex):
2287 def __repr__(self):
2288 return "%.17gj%+.17g" % (self.imag, self.real)
2289 a = madcomplex(-3, 4)
2290 self.assertEqual(repr(a), "4j-3")
2291 base = complex(-3, 4)
2292 self.assertEqual(base.__class__, complex)
2293 self.assertEqual(a, base)
2294 self.assertEqual(complex(a), base)
2295 self.assertEqual(complex(a).__class__, complex)
2296 a = madcomplex(a) # just trying another form of the constructor
2297 self.assertEqual(repr(a), "4j-3")
2298 self.assertEqual(a, base)
2299 self.assertEqual(complex(a), base)
2300 self.assertEqual(complex(a).__class__, complex)
2301 self.assertEqual(hash(a), hash(base))
2302 self.assertEqual((+a).__class__, complex)
2303 self.assertEqual((a + 0).__class__, complex)
2304 self.assertEqual(a + 0, base)
2305 self.assertEqual((a - 0).__class__, complex)
2306 self.assertEqual(a - 0, base)
2307 self.assertEqual((a * 1).__class__, complex)
2308 self.assertEqual(a * 1, base)
2309 self.assertEqual((a / 1).__class__, complex)
2310 self.assertEqual(a / 1, base)
2311
2312 class madtuple(tuple):
2313 _rev = None
2314 def rev(self):
2315 if self._rev is not None:
2316 return self._rev
2317 L = list(self)
2318 L.reverse()
2319 self._rev = self.__class__(L)
2320 return self._rev
2321 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2322 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2323 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2324 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2325 for i in range(512):
2326 t = madtuple(range(i))
2327 u = t.rev()
2328 v = u.rev()
2329 self.assertEqual(v, t)
2330 a = madtuple((1,2,3,4,5))
2331 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002332 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002333 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002334 self.assertTrue(a[:].__class__ is tuple)
2335 self.assertTrue((a * 1).__class__ is tuple)
2336 self.assertTrue((a * 0).__class__ is tuple)
2337 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002338 a = madtuple(())
2339 self.assertEqual(tuple(a), ())
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002340 self.assertTrue(tuple(a).__class__ is tuple)
2341 self.assertTrue((a + a).__class__ is tuple)
2342 self.assertTrue((a * 0).__class__ is tuple)
2343 self.assertTrue((a * 1).__class__ is tuple)
2344 self.assertTrue((a * 2).__class__ is tuple)
2345 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002346
2347 class madstring(str):
2348 _rev = None
2349 def rev(self):
2350 if self._rev is not None:
2351 return self._rev
2352 L = list(self)
2353 L.reverse()
2354 self._rev = self.__class__("".join(L))
2355 return self._rev
2356 s = madstring("abcdefghijklmnopqrstuvwxyz")
2357 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2358 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2359 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2360 for i in range(256):
2361 s = madstring("".join(map(chr, range(i))))
2362 t = s.rev()
2363 u = t.rev()
2364 self.assertEqual(u, s)
2365 s = madstring("12345")
2366 self.assertEqual(str(s), "12345")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002367 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002368
2369 base = "\x00" * 5
2370 s = madstring(base)
2371 self.assertEqual(s, base)
2372 self.assertEqual(str(s), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002373 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002374 self.assertEqual(hash(s), hash(base))
2375 self.assertEqual({s: 1}[base], 1)
2376 self.assertEqual({base: 1}[s], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002377 self.assertTrue((s + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002378 self.assertEqual(s + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002379 self.assertTrue(("" + s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002380 self.assertEqual("" + s, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002381 self.assertTrue((s * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002382 self.assertEqual(s * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002383 self.assertTrue((s * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002384 self.assertEqual(s * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002385 self.assertTrue((s * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002386 self.assertEqual(s * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002387 self.assertTrue(s[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002388 self.assertEqual(s[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002389 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002390 self.assertEqual(s[0:0], "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002391 self.assertTrue(s.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002392 self.assertEqual(s.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002393 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002394 self.assertEqual(s.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002395 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002396 self.assertEqual(s.rstrip(), base)
2397 identitytab = {}
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002398 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002399 self.assertEqual(s.translate(identitytab), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002400 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002401 self.assertEqual(s.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002402 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002403 self.assertEqual(s.ljust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002404 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002405 self.assertEqual(s.rjust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002406 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002407 self.assertEqual(s.center(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002408 self.assertTrue(s.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002409 self.assertEqual(s.lower(), base)
2410
2411 class madunicode(str):
2412 _rev = None
2413 def rev(self):
2414 if self._rev is not None:
2415 return self._rev
2416 L = list(self)
2417 L.reverse()
2418 self._rev = self.__class__("".join(L))
2419 return self._rev
2420 u = madunicode("ABCDEF")
2421 self.assertEqual(u, "ABCDEF")
2422 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2423 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2424 base = "12345"
2425 u = madunicode(base)
2426 self.assertEqual(str(u), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002427 self.assertTrue(str(u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002428 self.assertEqual(hash(u), hash(base))
2429 self.assertEqual({u: 1}[base], 1)
2430 self.assertEqual({base: 1}[u], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002431 self.assertTrue(u.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002432 self.assertEqual(u.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002433 self.assertTrue(u.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002434 self.assertEqual(u.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002435 self.assertTrue(u.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002436 self.assertEqual(u.rstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002437 self.assertTrue(u.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002438 self.assertEqual(u.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002439 self.assertTrue(u.replace("xy", "xy").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002440 self.assertEqual(u.replace("xy", "xy"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002441 self.assertTrue(u.center(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002442 self.assertEqual(u.center(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002443 self.assertTrue(u.ljust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002444 self.assertEqual(u.ljust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002445 self.assertTrue(u.rjust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002446 self.assertEqual(u.rjust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002447 self.assertTrue(u.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002448 self.assertEqual(u.lower(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002449 self.assertTrue(u.upper().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002450 self.assertEqual(u.upper(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002451 self.assertTrue(u.capitalize().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002452 self.assertEqual(u.capitalize(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002453 self.assertTrue(u.title().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002454 self.assertEqual(u.title(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002455 self.assertTrue((u + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002456 self.assertEqual(u + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002457 self.assertTrue(("" + u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002458 self.assertEqual("" + u, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002459 self.assertTrue((u * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002460 self.assertEqual(u * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002461 self.assertTrue((u * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002462 self.assertEqual(u * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002463 self.assertTrue((u * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002464 self.assertEqual(u * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002465 self.assertTrue(u[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002466 self.assertEqual(u[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002467 self.assertTrue(u[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002468 self.assertEqual(u[0:0], "")
2469
2470 class sublist(list):
2471 pass
2472 a = sublist(range(5))
2473 self.assertEqual(a, list(range(5)))
2474 a.append("hello")
2475 self.assertEqual(a, list(range(5)) + ["hello"])
2476 a[5] = 5
2477 self.assertEqual(a, list(range(6)))
2478 a.extend(range(6, 20))
2479 self.assertEqual(a, list(range(20)))
2480 a[-5:] = []
2481 self.assertEqual(a, list(range(15)))
2482 del a[10:15]
2483 self.assertEqual(len(a), 10)
2484 self.assertEqual(a, list(range(10)))
2485 self.assertEqual(list(a), list(range(10)))
2486 self.assertEqual(a[0], 0)
2487 self.assertEqual(a[9], 9)
2488 self.assertEqual(a[-10], 0)
2489 self.assertEqual(a[-1], 9)
2490 self.assertEqual(a[:5], list(range(5)))
2491
2492 ## class CountedInput(file):
2493 ## """Counts lines read by self.readline().
2494 ##
2495 ## self.lineno is the 0-based ordinal of the last line read, up to
2496 ## a maximum of one greater than the number of lines in the file.
2497 ##
2498 ## self.ateof is true if and only if the final "" line has been read,
2499 ## at which point self.lineno stops incrementing, and further calls
2500 ## to readline() continue to return "".
2501 ## """
2502 ##
2503 ## lineno = 0
2504 ## ateof = 0
2505 ## def readline(self):
2506 ## if self.ateof:
2507 ## return ""
2508 ## s = file.readline(self)
2509 ## # Next line works too.
2510 ## # s = super(CountedInput, self).readline()
2511 ## self.lineno += 1
2512 ## if s == "":
2513 ## self.ateof = 1
2514 ## return s
2515 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002516 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002517 ## lines = ['a\n', 'b\n', 'c\n']
2518 ## try:
2519 ## f.writelines(lines)
2520 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002521 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002522 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2523 ## got = f.readline()
2524 ## self.assertEqual(expected, got)
2525 ## self.assertEqual(f.lineno, i)
2526 ## self.assertEqual(f.ateof, (i > len(lines)))
2527 ## f.close()
2528 ## finally:
2529 ## try:
2530 ## f.close()
2531 ## except:
2532 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002533 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002534
2535 def test_keywords(self):
2536 # Testing keyword args to basic type constructors ...
2537 self.assertEqual(int(x=1), 1)
2538 self.assertEqual(float(x=2), 2.0)
2539 self.assertEqual(int(x=3), 3)
2540 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2541 self.assertEqual(str(object=500), '500')
2542 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2543 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2544 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2545 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2546
2547 for constructor in (int, float, int, complex, str, str,
2548 tuple, list):
2549 try:
2550 constructor(bogus_keyword_arg=1)
2551 except TypeError:
2552 pass
2553 else:
2554 self.fail("expected TypeError from bogus keyword argument to %r"
2555 % constructor)
2556
2557 def test_str_subclass_as_dict_key(self):
2558 # Testing a str subclass used as dict key ..
2559
2560 class cistr(str):
2561 """Sublcass of str that computes __eq__ case-insensitively.
2562
2563 Also computes a hash code of the string in canonical form.
2564 """
2565
2566 def __init__(self, value):
2567 self.canonical = value.lower()
2568 self.hashcode = hash(self.canonical)
2569
2570 def __eq__(self, other):
2571 if not isinstance(other, cistr):
2572 other = cistr(other)
2573 return self.canonical == other.canonical
2574
2575 def __hash__(self):
2576 return self.hashcode
2577
2578 self.assertEqual(cistr('ABC'), 'abc')
2579 self.assertEqual('aBc', cistr('ABC'))
2580 self.assertEqual(str(cistr('ABC')), 'ABC')
2581
2582 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2583 self.assertEqual(d[cistr('one')], 1)
2584 self.assertEqual(d[cistr('tWo')], 2)
2585 self.assertEqual(d[cistr('THrEE')], 3)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002586 self.assertIn(cistr('ONe'), d)
Georg Brandl479a7e72008-02-05 18:13:15 +00002587 self.assertEqual(d.get(cistr('thrEE')), 3)
2588
2589 def test_classic_comparisons(self):
2590 # Testing classic comparisons...
2591 class classic:
2592 pass
2593
2594 for base in (classic, int, object):
2595 class C(base):
2596 def __init__(self, value):
2597 self.value = int(value)
2598 def __eq__(self, other):
2599 if isinstance(other, C):
2600 return self.value == other.value
2601 if isinstance(other, int) or isinstance(other, int):
2602 return self.value == other
2603 return NotImplemented
2604 def __ne__(self, other):
2605 if isinstance(other, C):
2606 return self.value != other.value
2607 if isinstance(other, int) or isinstance(other, int):
2608 return self.value != other
2609 return NotImplemented
2610 def __lt__(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 __le__(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 __gt__(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 __ge__(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
2635 c1 = C(1)
2636 c2 = C(2)
2637 c3 = C(3)
2638 self.assertEqual(c1, 1)
2639 c = {1: c1, 2: c2, 3: c3}
2640 for x in 1, 2, 3:
2641 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002642 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002643 self.assertTrue(eval("c[x] %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002644 eval("x %s y" % op),
2645 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002646 self.assertTrue(eval("c[x] %s y" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002647 eval("x %s y" % op),
2648 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002649 self.assertTrue(eval("x %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002650 eval("x %s y" % op),
2651 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002652
2653 def test_rich_comparisons(self):
2654 # Testing rich comparisons...
2655 class Z(complex):
2656 pass
2657 z = Z(1)
2658 self.assertEqual(z, 1+0j)
2659 self.assertEqual(1+0j, z)
2660 class ZZ(complex):
2661 def __eq__(self, other):
2662 try:
2663 return abs(self - other) <= 1e-6
2664 except:
2665 return NotImplemented
2666 zz = ZZ(1.0000003)
2667 self.assertEqual(zz, 1+0j)
2668 self.assertEqual(1+0j, zz)
2669
2670 class classic:
2671 pass
2672 for base in (classic, int, object, list):
2673 class C(base):
2674 def __init__(self, value):
2675 self.value = int(value)
2676 def __cmp__(self_, other):
2677 self.fail("shouldn't call __cmp__")
2678 def __eq__(self, other):
2679 if isinstance(other, C):
2680 return self.value == other.value
2681 if isinstance(other, int) or isinstance(other, int):
2682 return self.value == other
2683 return NotImplemented
2684 def __ne__(self, other):
2685 if isinstance(other, C):
2686 return self.value != other.value
2687 if isinstance(other, int) or isinstance(other, int):
2688 return self.value != other
2689 return NotImplemented
2690 def __lt__(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 __le__(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 __gt__(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 __ge__(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 c1 = C(1)
2715 c2 = C(2)
2716 c3 = C(3)
2717 self.assertEqual(c1, 1)
2718 c = {1: c1, 2: c2, 3: c3}
2719 for x in 1, 2, 3:
2720 for y in 1, 2, 3:
2721 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002722 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002723 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002724 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002725 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002726 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002727 "x=%d, y=%d" % (x, y))
2728
2729 def test_descrdoc(self):
2730 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002731 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002732 def check(descr, what):
2733 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002734 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002735 check(complex.real, "the real part of a complex number") # member descriptor
2736
2737 def test_doc_descriptor(self):
2738 # Testing __doc__ descriptor...
2739 # SF bug 542984
2740 class DocDescr(object):
2741 def __get__(self, object, otype):
2742 if object:
2743 object = object.__class__.__name__ + ' instance'
2744 if otype:
2745 otype = otype.__name__
2746 return 'object=%s; type=%s' % (object, otype)
2747 class OldClass:
2748 __doc__ = DocDescr()
2749 class NewClass(object):
2750 __doc__ = DocDescr()
2751 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2752 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2753 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2754 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2755
2756 def test_set_class(self):
2757 # Testing __class__ assignment...
2758 class C(object): pass
2759 class D(object): pass
2760 class E(object): pass
2761 class F(D, E): pass
2762 for cls in C, D, E, F:
2763 for cls2 in C, D, E, F:
2764 x = cls()
2765 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002766 self.assertTrue(x.__class__ is cls2)
Georg Brandl479a7e72008-02-05 18:13:15 +00002767 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002768 self.assertTrue(x.__class__ is cls)
Georg Brandl479a7e72008-02-05 18:13:15 +00002769 def cant(x, C):
2770 try:
2771 x.__class__ = C
2772 except TypeError:
2773 pass
2774 else:
2775 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2776 try:
2777 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002778 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002779 pass
2780 else:
2781 self.fail("shouldn't allow del %r.__class__" % x)
2782 cant(C(), list)
2783 cant(list(), C)
2784 cant(C(), 1)
2785 cant(C(), object)
2786 cant(object(), list)
2787 cant(list(), object)
2788 class Int(int): __slots__ = []
2789 cant(2, Int)
2790 cant(Int(), int)
2791 cant(True, int)
2792 cant(2, bool)
2793 o = object()
2794 cant(o, type(1))
2795 cant(o, type(None))
2796 del o
2797 class G(object):
2798 __slots__ = ["a", "b"]
2799 class H(object):
2800 __slots__ = ["b", "a"]
2801 class I(object):
2802 __slots__ = ["a", "b"]
2803 class J(object):
2804 __slots__ = ["c", "b"]
2805 class K(object):
2806 __slots__ = ["a", "b", "d"]
2807 class L(H):
2808 __slots__ = ["e"]
2809 class M(I):
2810 __slots__ = ["e"]
2811 class N(J):
2812 __slots__ = ["__weakref__"]
2813 class P(J):
2814 __slots__ = ["__dict__"]
2815 class Q(J):
2816 pass
2817 class R(J):
2818 __slots__ = ["__dict__", "__weakref__"]
2819
2820 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2821 x = cls()
2822 x.a = 1
2823 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002824 self.assertTrue(x.__class__ is cls2,
Georg Brandl479a7e72008-02-05 18:13:15 +00002825 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2826 self.assertEqual(x.a, 1)
2827 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002828 self.assertTrue(x.__class__ is cls,
Georg Brandl479a7e72008-02-05 18:13:15 +00002829 "assigning %r as __class__ for %r silently failed" % (cls, x))
2830 self.assertEqual(x.a, 1)
2831 for cls in G, J, K, L, M, N, P, R, list, Int:
2832 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2833 if cls is cls2:
2834 continue
2835 cant(cls(), cls2)
2836
Benjamin Peterson193152c2009-04-25 01:08:45 +00002837 # Issue5283: when __class__ changes in __del__, the wrong
2838 # type gets DECREF'd.
2839 class O(object):
2840 pass
2841 class A(object):
2842 def __del__(self):
2843 self.__class__ = O
2844 l = [A() for x in range(100)]
2845 del l
2846
Georg Brandl479a7e72008-02-05 18:13:15 +00002847 def test_set_dict(self):
2848 # Testing __dict__ assignment...
2849 class C(object): pass
2850 a = C()
2851 a.__dict__ = {'b': 1}
2852 self.assertEqual(a.b, 1)
2853 def cant(x, dict):
2854 try:
2855 x.__dict__ = dict
2856 except (AttributeError, TypeError):
2857 pass
2858 else:
2859 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2860 cant(a, None)
2861 cant(a, [])
2862 cant(a, 1)
2863 del a.__dict__ # Deleting __dict__ is allowed
2864
2865 class Base(object):
2866 pass
2867 def verify_dict_readonly(x):
2868 """
2869 x has to be an instance of a class inheriting from Base.
2870 """
2871 cant(x, {})
2872 try:
2873 del x.__dict__
2874 except (AttributeError, TypeError):
2875 pass
2876 else:
2877 self.fail("shouldn't allow del %r.__dict__" % x)
2878 dict_descr = Base.__dict__["__dict__"]
2879 try:
2880 dict_descr.__set__(x, {})
2881 except (AttributeError, TypeError):
2882 pass
2883 else:
2884 self.fail("dict_descr allowed access to %r's dict" % x)
2885
2886 # Classes don't allow __dict__ assignment and have readonly dicts
2887 class Meta1(type, Base):
2888 pass
2889 class Meta2(Base, type):
2890 pass
2891 class D(object, metaclass=Meta1):
2892 pass
2893 class E(object, metaclass=Meta2):
2894 pass
2895 for cls in C, D, E:
2896 verify_dict_readonly(cls)
2897 class_dict = cls.__dict__
2898 try:
2899 class_dict["spam"] = "eggs"
2900 except TypeError:
2901 pass
2902 else:
2903 self.fail("%r's __dict__ can be modified" % cls)
2904
2905 # Modules also disallow __dict__ assignment
2906 class Module1(types.ModuleType, Base):
2907 pass
2908 class Module2(Base, types.ModuleType):
2909 pass
2910 for ModuleType in Module1, Module2:
2911 mod = ModuleType("spam")
2912 verify_dict_readonly(mod)
2913 mod.__dict__["spam"] = "eggs"
2914
2915 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002916 # (at least not any more than regular exception's __dict__ can
2917 # be deleted; on CPython it is not the case, whereas on PyPy they
2918 # can, just like any other new-style instance's __dict__.)
2919 def can_delete_dict(e):
2920 try:
2921 del e.__dict__
2922 except (TypeError, AttributeError):
2923 return False
2924 else:
2925 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002926 class Exception1(Exception, Base):
2927 pass
2928 class Exception2(Base, Exception):
2929 pass
2930 for ExceptionType in Exception, Exception1, Exception2:
2931 e = ExceptionType()
2932 e.__dict__ = {"a": 1}
2933 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002934 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002935
2936 def test_pickles(self):
2937 # Testing pickling and copying new-style classes and objects...
2938 import pickle
2939
2940 def sorteditems(d):
2941 L = list(d.items())
2942 L.sort()
2943 return L
2944
2945 global C
2946 class C(object):
2947 def __init__(self, a, b):
2948 super(C, self).__init__()
2949 self.a = a
2950 self.b = b
2951 def __repr__(self):
2952 return "C(%r, %r)" % (self.a, self.b)
2953
2954 global C1
2955 class C1(list):
2956 def __new__(cls, a, b):
2957 return super(C1, cls).__new__(cls)
2958 def __getnewargs__(self):
2959 return (self.a, self.b)
2960 def __init__(self, a, b):
2961 self.a = a
2962 self.b = b
2963 def __repr__(self):
2964 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2965
2966 global C2
2967 class C2(int):
2968 def __new__(cls, a, b, val=0):
2969 return super(C2, cls).__new__(cls, val)
2970 def __getnewargs__(self):
2971 return (self.a, self.b, int(self))
2972 def __init__(self, a, b, val=0):
2973 self.a = a
2974 self.b = b
2975 def __repr__(self):
2976 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2977
2978 global C3
2979 class C3(object):
2980 def __init__(self, foo):
2981 self.foo = foo
2982 def __getstate__(self):
2983 return self.foo
2984 def __setstate__(self, foo):
2985 self.foo = foo
2986
2987 global C4classic, C4
2988 class C4classic: # classic
2989 pass
2990 class C4(C4classic, object): # mixed inheritance
2991 pass
2992
Guido van Rossum3926a632001-09-25 16:25:58 +00002993 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00002994 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00002995 s = pickle.dumps(cls, bin)
2996 cls2 = pickle.loads(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002997 self.assertTrue(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00002998
2999 a = C1(1, 2); a.append(42); a.append(24)
3000 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003001 s = pickle.dumps((a, b), bin)
3002 x, y = pickle.loads(s)
3003 self.assertEqual(x.__class__, a.__class__)
3004 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3005 self.assertEqual(y.__class__, b.__class__)
3006 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3007 self.assertEqual(repr(x), repr(a))
3008 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003009 # Test for __getstate__ and __setstate__ on new style class
3010 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003011 s = pickle.dumps(u, bin)
3012 v = pickle.loads(s)
3013 self.assertEqual(u.__class__, v.__class__)
3014 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003015 # Test for picklability of hybrid class
3016 u = C4()
3017 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003018 s = pickle.dumps(u, bin)
3019 v = pickle.loads(s)
3020 self.assertEqual(u.__class__, v.__class__)
3021 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003022
Georg Brandl479a7e72008-02-05 18:13:15 +00003023 # Testing copy.deepcopy()
3024 import copy
3025 for cls in C, C1, C2:
3026 cls2 = copy.deepcopy(cls)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003027 self.assertTrue(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003028
Georg Brandl479a7e72008-02-05 18:13:15 +00003029 a = C1(1, 2); a.append(42); a.append(24)
3030 b = C2("hello", "world", 42)
3031 x, y = copy.deepcopy((a, b))
3032 self.assertEqual(x.__class__, a.__class__)
3033 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3034 self.assertEqual(y.__class__, b.__class__)
3035 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3036 self.assertEqual(repr(x), repr(a))
3037 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003038
Georg Brandl479a7e72008-02-05 18:13:15 +00003039 def test_pickle_slots(self):
3040 # Testing pickling of classes with __slots__ ...
3041 import pickle
3042 # Pickling of classes with __slots__ but without __getstate__ should fail
3043 # (if using protocol 0 or 1)
3044 global B, C, D, E
3045 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003046 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003047 for base in [object, B]:
3048 class C(base):
3049 __slots__ = ['a']
3050 class D(C):
3051 pass
3052 try:
3053 pickle.dumps(C(), 0)
3054 except TypeError:
3055 pass
3056 else:
3057 self.fail("should fail: pickle C instance - %s" % base)
3058 try:
3059 pickle.dumps(C(), 0)
3060 except TypeError:
3061 pass
3062 else:
3063 self.fail("should fail: pickle D instance - %s" % base)
3064 # Give C a nice generic __getstate__ and __setstate__
3065 class C(base):
3066 __slots__ = ['a']
3067 def __getstate__(self):
3068 try:
3069 d = self.__dict__.copy()
3070 except AttributeError:
3071 d = {}
3072 for cls in self.__class__.__mro__:
3073 for sn in cls.__dict__.get('__slots__', ()):
3074 try:
3075 d[sn] = getattr(self, sn)
3076 except AttributeError:
3077 pass
3078 return d
3079 def __setstate__(self, d):
3080 for k, v in list(d.items()):
3081 setattr(self, k, v)
3082 class D(C):
3083 pass
3084 # Now it should work
3085 x = C()
3086 y = pickle.loads(pickle.dumps(x))
3087 self.assertEqual(hasattr(y, 'a'), 0)
3088 x.a = 42
3089 y = pickle.loads(pickle.dumps(x))
3090 self.assertEqual(y.a, 42)
3091 x = D()
3092 x.a = 42
3093 x.b = 100
3094 y = pickle.loads(pickle.dumps(x))
3095 self.assertEqual(y.a + y.b, 142)
3096 # A subclass that adds a slot should also work
3097 class E(C):
3098 __slots__ = ['b']
3099 x = E()
3100 x.a = 42
3101 x.b = "foo"
3102 y = pickle.loads(pickle.dumps(x))
3103 self.assertEqual(y.a, x.a)
3104 self.assertEqual(y.b, x.b)
3105
3106 def test_binary_operator_override(self):
3107 # Testing overrides of binary operations...
3108 class I(int):
3109 def __repr__(self):
3110 return "I(%r)" % int(self)
3111 def __add__(self, other):
3112 return I(int(self) + int(other))
3113 __radd__ = __add__
3114 def __pow__(self, other, mod=None):
3115 if mod is None:
3116 return I(pow(int(self), int(other)))
3117 else:
3118 return I(pow(int(self), int(other), int(mod)))
3119 def __rpow__(self, other, mod=None):
3120 if mod is None:
3121 return I(pow(int(other), int(self), mod))
3122 else:
3123 return I(pow(int(other), int(self), int(mod)))
3124
3125 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3126 self.assertEqual(repr(I(1) + 2), "I(3)")
3127 self.assertEqual(repr(1 + I(2)), "I(3)")
3128 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3129 self.assertEqual(repr(2 ** I(3)), "I(8)")
3130 self.assertEqual(repr(I(2) ** 3), "I(8)")
3131 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3132 class S(str):
3133 def __eq__(self, other):
3134 return self.lower() == other.lower()
3135
3136 def test_subclass_propagation(self):
3137 # Testing propagation of slot functions to subclasses...
3138 class A(object):
3139 pass
3140 class B(A):
3141 pass
3142 class C(A):
3143 pass
3144 class D(B, C):
3145 pass
3146 d = D()
3147 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3148 A.__hash__ = lambda self: 42
3149 self.assertEqual(hash(d), 42)
3150 C.__hash__ = lambda self: 314
3151 self.assertEqual(hash(d), 314)
3152 B.__hash__ = lambda self: 144
3153 self.assertEqual(hash(d), 144)
3154 D.__hash__ = lambda self: 100
3155 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003156 D.__hash__ = None
3157 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003158 del D.__hash__
3159 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003160 B.__hash__ = None
3161 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003162 del B.__hash__
3163 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003164 C.__hash__ = None
3165 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003166 del C.__hash__
3167 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003168 A.__hash__ = None
3169 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003170 del A.__hash__
3171 self.assertEqual(hash(d), orig_hash)
3172 d.foo = 42
3173 d.bar = 42
3174 self.assertEqual(d.foo, 42)
3175 self.assertEqual(d.bar, 42)
3176 def __getattribute__(self, name):
3177 if name == "foo":
3178 return 24
3179 return object.__getattribute__(self, name)
3180 A.__getattribute__ = __getattribute__
3181 self.assertEqual(d.foo, 24)
3182 self.assertEqual(d.bar, 42)
3183 def __getattr__(self, name):
3184 if name in ("spam", "foo", "bar"):
3185 return "hello"
3186 raise AttributeError(name)
3187 B.__getattr__ = __getattr__
3188 self.assertEqual(d.spam, "hello")
3189 self.assertEqual(d.foo, 24)
3190 self.assertEqual(d.bar, 42)
3191 del A.__getattribute__
3192 self.assertEqual(d.foo, 42)
3193 del d.foo
3194 self.assertEqual(d.foo, "hello")
3195 self.assertEqual(d.bar, 42)
3196 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003197 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003198 d.foo
3199 except AttributeError:
3200 pass
3201 else:
3202 self.fail("d.foo should be undefined now")
3203
3204 # Test a nasty bug in recurse_down_subclasses()
3205 import gc
3206 class A(object):
3207 pass
3208 class B(A):
3209 pass
3210 del B
Benjamin Petersone549ead2009-03-28 21:42:05 +00003211 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003212 A.__setitem__ = lambda *a: None # crash
3213
3214 def test_buffer_inheritance(self):
3215 # Testing that buffer interface is inherited ...
3216
3217 import binascii
3218 # SF bug [#470040] ParseTuple t# vs subclasses.
3219
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003220 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003221 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003222 base = b'abc'
3223 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003224 # b2a_hex uses the buffer interface to get its argument's value, via
3225 # PyArg_ParseTuple 't#' code.
3226 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3227
Georg Brandl479a7e72008-02-05 18:13:15 +00003228 class MyInt(int):
3229 pass
3230 m = MyInt(42)
3231 try:
3232 binascii.b2a_hex(m)
3233 self.fail('subclass of int should not have a buffer interface')
3234 except TypeError:
3235 pass
3236
3237 def test_str_of_str_subclass(self):
3238 # Testing __str__ defined in subclass of str ...
3239 import binascii
3240 import io
3241
3242 class octetstring(str):
3243 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003244 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003245 def __repr__(self):
3246 return self + " repr"
3247
3248 o = octetstring('A')
3249 self.assertEqual(type(o), octetstring)
3250 self.assertEqual(type(str(o)), str)
3251 self.assertEqual(type(repr(o)), str)
3252 self.assertEqual(ord(o), 0x41)
3253 self.assertEqual(str(o), '41')
3254 self.assertEqual(repr(o), 'A repr')
3255 self.assertEqual(o.__str__(), '41')
3256 self.assertEqual(o.__repr__(), 'A repr')
3257
3258 capture = io.StringIO()
3259 # Calling str() or not exercises different internal paths.
3260 print(o, file=capture)
3261 print(str(o), file=capture)
3262 self.assertEqual(capture.getvalue(), '41\n41\n')
3263 capture.close()
3264
3265 def test_keyword_arguments(self):
3266 # Testing keyword arguments to __init__, __call__...
3267 def f(a): return a
3268 self.assertEqual(f.__call__(a=42), 42)
3269 a = []
3270 list.__init__(a, sequence=[0, 1, 2])
3271 self.assertEqual(a, [0, 1, 2])
3272
3273 def test_recursive_call(self):
3274 # Testing recursive __call__() by setting to instance of class...
3275 class A(object):
3276 pass
3277
3278 A.__call__ = A()
3279 try:
3280 A()()
3281 except RuntimeError:
3282 pass
3283 else:
3284 self.fail("Recursion limit should have been reached for __call__()")
3285
3286 def test_delete_hook(self):
3287 # Testing __del__ hook...
3288 log = []
3289 class C(object):
3290 def __del__(self):
3291 log.append(1)
3292 c = C()
3293 self.assertEqual(log, [])
3294 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00003295 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003296 self.assertEqual(log, [1])
3297
3298 class D(object): pass
3299 d = D()
3300 try: del d[0]
3301 except TypeError: pass
3302 else: self.fail("invalid del() didn't raise TypeError")
3303
3304 def test_hash_inheritance(self):
3305 # Testing hash of mutable subclasses...
3306
3307 class mydict(dict):
3308 pass
3309 d = mydict()
3310 try:
3311 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003312 except TypeError:
3313 pass
3314 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003315 self.fail("hash() of dict subclass should fail")
3316
3317 class mylist(list):
3318 pass
3319 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003320 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003321 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003322 except TypeError:
3323 pass
3324 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003325 self.fail("hash() of list subclass should fail")
3326
3327 def test_str_operations(self):
3328 try: 'a' + 5
3329 except TypeError: pass
3330 else: self.fail("'' + 5 doesn't raise TypeError")
3331
3332 try: ''.split('')
3333 except ValueError: pass
3334 else: self.fail("''.split('') doesn't raise ValueError")
3335
3336 try: ''.join([0])
3337 except TypeError: pass
3338 else: self.fail("''.join([0]) doesn't raise TypeError")
3339
3340 try: ''.rindex('5')
3341 except ValueError: pass
3342 else: self.fail("''.rindex('5') doesn't raise ValueError")
3343
3344 try: '%(n)s' % None
3345 except TypeError: pass
3346 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3347
3348 try: '%(n' % {}
3349 except ValueError: pass
3350 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3351
3352 try: '%*s' % ('abc')
3353 except TypeError: pass
3354 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3355
3356 try: '%*.*s' % ('abc', 5)
3357 except TypeError: pass
3358 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3359
3360 try: '%s' % (1, 2)
3361 except TypeError: pass
3362 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3363
3364 try: '%' % None
3365 except ValueError: pass
3366 else: self.fail("'%' % None doesn't raise ValueError")
3367
3368 self.assertEqual('534253'.isdigit(), 1)
3369 self.assertEqual('534253x'.isdigit(), 0)
3370 self.assertEqual('%c' % 5, '\x05')
3371 self.assertEqual('%c' % '5', '5')
3372
3373 def test_deepcopy_recursive(self):
3374 # Testing deepcopy of recursive objects...
3375 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003376 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003377 a = Node()
3378 b = Node()
3379 a.b = b
3380 b.a = a
3381 z = deepcopy(a) # This blew up before
3382
3383 def test_unintialized_modules(self):
3384 # Testing uninitialized module objects...
3385 from types import ModuleType as M
3386 m = M.__new__(M)
3387 str(m)
3388 self.assertEqual(hasattr(m, "__name__"), 0)
3389 self.assertEqual(hasattr(m, "__file__"), 0)
3390 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003391 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl479a7e72008-02-05 18:13:15 +00003392 m.foo = 1
3393 self.assertEqual(m.__dict__, {"foo": 1})
3394
3395 def test_funny_new(self):
3396 # Testing __new__ returning something unexpected...
3397 class C(object):
3398 def __new__(cls, arg):
3399 if isinstance(arg, str): return [1, 2, 3]
3400 elif isinstance(arg, int): return object.__new__(D)
3401 else: return object.__new__(cls)
3402 class D(C):
3403 def __init__(self, arg):
3404 self.foo = arg
3405 self.assertEqual(C("1"), [1, 2, 3])
3406 self.assertEqual(D("1"), [1, 2, 3])
3407 d = D(None)
3408 self.assertEqual(d.foo, None)
3409 d = C(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003410 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003411 self.assertEqual(d.foo, 1)
3412 d = D(1)
Ezio Melottie9615932010-01-24 19:26:24 +00003413 self.assertIsInstance(d, D)
Georg Brandl479a7e72008-02-05 18:13:15 +00003414 self.assertEqual(d.foo, 1)
3415
3416 def test_imul_bug(self):
3417 # Testing for __imul__ problems...
3418 # SF bug 544647
3419 class C(object):
3420 def __imul__(self, other):
3421 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003422 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003423 y = x
3424 y *= 1.0
3425 self.assertEqual(y, (x, 1.0))
3426 y = x
3427 y *= 2
3428 self.assertEqual(y, (x, 2))
3429 y = x
3430 y *= 3
3431 self.assertEqual(y, (x, 3))
3432 y = x
3433 y *= 1<<100
3434 self.assertEqual(y, (x, 1<<100))
3435 y = x
3436 y *= None
3437 self.assertEqual(y, (x, None))
3438 y = x
3439 y *= "foo"
3440 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003441
Georg Brandl479a7e72008-02-05 18:13:15 +00003442 def test_copy_setstate(self):
3443 # Testing that copy.*copy() correctly uses __setstate__...
3444 import copy
3445 class C(object):
3446 def __init__(self, foo=None):
3447 self.foo = foo
3448 self.__foo = foo
3449 def setfoo(self, foo=None):
3450 self.foo = foo
3451 def getfoo(self):
3452 return self.__foo
3453 def __getstate__(self):
3454 return [self.foo]
3455 def __setstate__(self_, lst):
3456 self.assertEqual(len(lst), 1)
3457 self_.__foo = self_.foo = lst[0]
3458 a = C(42)
3459 a.setfoo(24)
3460 self.assertEqual(a.foo, 24)
3461 self.assertEqual(a.getfoo(), 42)
3462 b = copy.copy(a)
3463 self.assertEqual(b.foo, 24)
3464 self.assertEqual(b.getfoo(), 24)
3465 b = copy.deepcopy(a)
3466 self.assertEqual(b.foo, 24)
3467 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003468
Georg Brandl479a7e72008-02-05 18:13:15 +00003469 def test_slices(self):
3470 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003471
Georg Brandl479a7e72008-02-05 18:13:15 +00003472 # Strings
3473 self.assertEqual("hello"[:4], "hell")
3474 self.assertEqual("hello"[slice(4)], "hell")
3475 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3476 class S(str):
3477 def __getitem__(self, x):
3478 return str.__getitem__(self, x)
3479 self.assertEqual(S("hello")[:4], "hell")
3480 self.assertEqual(S("hello")[slice(4)], "hell")
3481 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3482 # Tuples
3483 self.assertEqual((1,2,3)[:2], (1,2))
3484 self.assertEqual((1,2,3)[slice(2)], (1,2))
3485 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3486 class T(tuple):
3487 def __getitem__(self, x):
3488 return tuple.__getitem__(self, x)
3489 self.assertEqual(T((1,2,3))[:2], (1,2))
3490 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3491 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3492 # Lists
3493 self.assertEqual([1,2,3][:2], [1,2])
3494 self.assertEqual([1,2,3][slice(2)], [1,2])
3495 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3496 class L(list):
3497 def __getitem__(self, x):
3498 return list.__getitem__(self, x)
3499 self.assertEqual(L([1,2,3])[:2], [1,2])
3500 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3501 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3502 # Now do lists and __setitem__
3503 a = L([1,2,3])
3504 a[slice(1, 3)] = [3,2]
3505 self.assertEqual(a, [1,3,2])
3506 a[slice(0, 2, 1)] = [3,1]
3507 self.assertEqual(a, [3,1,2])
3508 a.__setitem__(slice(1, 3), [2,1])
3509 self.assertEqual(a, [3,2,1])
3510 a.__setitem__(slice(0, 2, 1), [2,3])
3511 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003512
Georg Brandl479a7e72008-02-05 18:13:15 +00003513 def test_subtype_resurrection(self):
3514 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003515
Georg Brandl479a7e72008-02-05 18:13:15 +00003516 class C(object):
3517 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003518
Georg Brandl479a7e72008-02-05 18:13:15 +00003519 def __del__(self):
3520 # resurrect the instance
3521 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003522
Georg Brandl479a7e72008-02-05 18:13:15 +00003523 c = C()
3524 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003525
Benjamin Petersone549ead2009-03-28 21:42:05 +00003526 # The most interesting thing here is whether this blows up, due to
3527 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3528 # bug).
Georg Brandl479a7e72008-02-05 18:13:15 +00003529 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003530
Georg Brandl479a7e72008-02-05 18:13:15 +00003531 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Petersone549ead2009-03-28 21:42:05 +00003532 # the last container slot works: that will attempt to delete c again,
3533 # which will cause c to get appended back to the container again
3534 # "during" the del. (On non-CPython implementations, however, __del__
3535 # is typically not called again.)
3536 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00003537 self.assertEqual(len(C.container), 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00003538 del C.container[-1]
3539 if support.check_impl_detail():
3540 support.gc_collect()
3541 self.assertEqual(len(C.container), 1)
3542 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003543
Georg Brandl479a7e72008-02-05 18:13:15 +00003544 # Make c mortal again, so that the test framework with -l doesn't report
3545 # it as a leak.
3546 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003547
Georg Brandl479a7e72008-02-05 18:13:15 +00003548 def test_slots_trash(self):
3549 # Testing slot trash...
3550 # Deallocating deeply nested slotted trash caused stack overflows
3551 class trash(object):
3552 __slots__ = ['x']
3553 def __init__(self, x):
3554 self.x = x
3555 o = None
3556 for i in range(50000):
3557 o = trash(o)
3558 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003559
Georg Brandl479a7e72008-02-05 18:13:15 +00003560 def test_slots_multiple_inheritance(self):
3561 # SF bug 575229, multiple inheritance w/ slots dumps core
3562 class A(object):
3563 __slots__=()
3564 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003565 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003566 class C(A,B) :
3567 __slots__=()
Benjamin Petersone549ead2009-03-28 21:42:05 +00003568 if support.check_impl_detail():
3569 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003570 self.assertTrue(hasattr(C, '__dict__'))
3571 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl479a7e72008-02-05 18:13:15 +00003572 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003573
Georg Brandl479a7e72008-02-05 18:13:15 +00003574 def test_rmul(self):
3575 # Testing correct invocation of __rmul__...
3576 # SF patch 592646
3577 class C(object):
3578 def __mul__(self, other):
3579 return "mul"
3580 def __rmul__(self, other):
3581 return "rmul"
3582 a = C()
3583 self.assertEqual(a*2, "mul")
3584 self.assertEqual(a*2.2, "mul")
3585 self.assertEqual(2*a, "rmul")
3586 self.assertEqual(2.2*a, "rmul")
3587
3588 def test_ipow(self):
3589 # Testing correct invocation of __ipow__...
3590 # [SF bug 620179]
3591 class C(object):
3592 def __ipow__(self, other):
3593 pass
3594 a = C()
3595 a **= 2
3596
3597 def test_mutable_bases(self):
3598 # Testing mutable bases...
3599
3600 # stuff that should work:
3601 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003602 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003603 class C2(object):
3604 def __getattribute__(self, attr):
3605 if attr == 'a':
3606 return 2
3607 else:
3608 return super(C2, self).__getattribute__(attr)
3609 def meth(self):
3610 return 1
3611 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003612 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003613 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003614 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003615 d = D()
3616 e = E()
3617 D.__bases__ = (C,)
3618 D.__bases__ = (C2,)
3619 self.assertEqual(d.meth(), 1)
3620 self.assertEqual(e.meth(), 1)
3621 self.assertEqual(d.a, 2)
3622 self.assertEqual(e.a, 2)
3623 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003624
Georg Brandl479a7e72008-02-05 18:13:15 +00003625 try:
3626 del D.__bases__
Benjamin Petersone549ead2009-03-28 21:42:05 +00003627 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00003628 pass
3629 else:
3630 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003631
Georg Brandl479a7e72008-02-05 18:13:15 +00003632 try:
3633 D.__bases__ = ()
3634 except TypeError as msg:
3635 if str(msg) == "a new-style class can't have only classic bases":
3636 self.fail("wrong error message for .__bases__ = ()")
3637 else:
3638 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003639
Georg Brandl479a7e72008-02-05 18:13:15 +00003640 try:
3641 D.__bases__ = (D,)
3642 except TypeError:
3643 pass
3644 else:
3645 # actually, we'll have crashed by here...
3646 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003647
Georg Brandl479a7e72008-02-05 18:13:15 +00003648 try:
3649 D.__bases__ = (C, C)
3650 except TypeError:
3651 pass
3652 else:
3653 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003654
Georg Brandl479a7e72008-02-05 18:13:15 +00003655 try:
3656 D.__bases__ = (E,)
3657 except TypeError:
3658 pass
3659 else:
3660 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003661
Benjamin Petersonae937c02009-04-18 20:54:08 +00003662 def test_builtin_bases(self):
3663 # Make sure all the builtin types can have their base queried without
3664 # segfaulting. See issue #5787.
3665 builtin_types = [tp for tp in builtins.__dict__.values()
3666 if isinstance(tp, type)]
3667 for tp in builtin_types:
3668 object.__getattribute__(tp, "__bases__")
3669 if tp is not object:
3670 self.assertEqual(len(tp.__bases__), 1, tp)
3671
Benjamin Peterson25c95f12009-05-08 20:42:26 +00003672 class L(list):
3673 pass
3674
3675 class C(object):
3676 pass
3677
3678 class D(C):
3679 pass
3680
3681 try:
3682 L.__bases__ = (dict,)
3683 except TypeError:
3684 pass
3685 else:
3686 self.fail("shouldn't turn list subclass into dict subclass")
3687
3688 try:
3689 list.__bases__ = (dict,)
3690 except TypeError:
3691 pass
3692 else:
3693 self.fail("shouldn't be able to assign to list.__bases__")
3694
3695 try:
3696 D.__bases__ = (C, list)
3697 except TypeError:
3698 pass
3699 else:
3700 assert 0, "best_base calculation found wanting"
3701
Benjamin Petersonae937c02009-04-18 20:54:08 +00003702
Georg Brandl479a7e72008-02-05 18:13:15 +00003703 def test_mutable_bases_with_failing_mro(self):
3704 # Testing mutable bases with failing mro...
3705 class WorkOnce(type):
3706 def __new__(self, name, bases, ns):
3707 self.flag = 0
3708 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3709 def mro(self):
3710 if self.flag > 0:
3711 raise RuntimeError("bozo")
3712 else:
3713 self.flag += 1
3714 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003715
Georg Brandl479a7e72008-02-05 18:13:15 +00003716 class WorkAlways(type):
3717 def mro(self):
3718 # this is here to make sure that .mro()s aren't called
3719 # with an exception set (which was possible at one point).
3720 # An error message will be printed in a debug build.
3721 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003722 return type.mro(self)
3723
Georg Brandl479a7e72008-02-05 18:13:15 +00003724 class C(object):
3725 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003726
Georg Brandl479a7e72008-02-05 18:13:15 +00003727 class C2(object):
3728 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003729
Georg Brandl479a7e72008-02-05 18:13:15 +00003730 class D(C):
3731 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003732
Georg Brandl479a7e72008-02-05 18:13:15 +00003733 class E(D):
3734 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003735
Georg Brandl479a7e72008-02-05 18:13:15 +00003736 class F(D, metaclass=WorkOnce):
3737 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003738
Georg Brandl479a7e72008-02-05 18:13:15 +00003739 class G(D, metaclass=WorkAlways):
3740 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003741
Georg Brandl479a7e72008-02-05 18:13:15 +00003742 # Immediate subclasses have their mro's adjusted in alphabetical
3743 # order, so E's will get adjusted before adjusting F's fails. We
3744 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003745
Georg Brandl479a7e72008-02-05 18:13:15 +00003746 E_mro_before = E.__mro__
3747 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003748
Armin Rigofd163f92005-12-29 15:59:19 +00003749 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003750 D.__bases__ = (C2,)
3751 except RuntimeError:
3752 self.assertEqual(E.__mro__, E_mro_before)
3753 self.assertEqual(D.__mro__, D_mro_before)
3754 else:
3755 self.fail("exception not propagated")
3756
3757 def test_mutable_bases_catch_mro_conflict(self):
3758 # Testing mutable bases catch mro conflict...
3759 class A(object):
3760 pass
3761
3762 class B(object):
3763 pass
3764
3765 class C(A, B):
3766 pass
3767
3768 class D(A, B):
3769 pass
3770
3771 class E(C, D):
3772 pass
3773
3774 try:
3775 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003776 except TypeError:
3777 pass
3778 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003779 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003780
Georg Brandl479a7e72008-02-05 18:13:15 +00003781 def test_mutable_names(self):
3782 # Testing mutable names...
3783 class C(object):
3784 pass
3785
3786 # C.__module__ could be 'test_descr' or '__main__'
3787 mod = C.__module__
3788
3789 C.__name__ = 'D'
3790 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3791
3792 C.__name__ = 'D.E'
3793 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3794
3795 def test_subclass_right_op(self):
3796 # Testing correct dispatch of subclass overloading __r<op>__...
3797
3798 # This code tests various cases where right-dispatch of a subclass
3799 # should be preferred over left-dispatch of a base class.
3800
3801 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3802
3803 class B(int):
3804 def __floordiv__(self, other):
3805 return "B.__floordiv__"
3806 def __rfloordiv__(self, other):
3807 return "B.__rfloordiv__"
3808
3809 self.assertEqual(B(1) // 1, "B.__floordiv__")
3810 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3811
3812 # Case 2: subclass of object; this is just the baseline for case 3
3813
3814 class C(object):
3815 def __floordiv__(self, other):
3816 return "C.__floordiv__"
3817 def __rfloordiv__(self, other):
3818 return "C.__rfloordiv__"
3819
3820 self.assertEqual(C() // 1, "C.__floordiv__")
3821 self.assertEqual(1 // C(), "C.__rfloordiv__")
3822
3823 # Case 3: subclass of new-style class; here it gets interesting
3824
3825 class D(C):
3826 def __floordiv__(self, other):
3827 return "D.__floordiv__"
3828 def __rfloordiv__(self, other):
3829 return "D.__rfloordiv__"
3830
3831 self.assertEqual(D() // C(), "D.__floordiv__")
3832 self.assertEqual(C() // D(), "D.__rfloordiv__")
3833
3834 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3835
3836 class E(C):
3837 pass
3838
3839 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3840
3841 self.assertEqual(E() // 1, "C.__floordiv__")
3842 self.assertEqual(1 // E(), "C.__rfloordiv__")
3843 self.assertEqual(E() // C(), "C.__floordiv__")
3844 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3845
Benjamin Petersone549ead2009-03-28 21:42:05 +00003846 @support.impl_detail("testing an internal kind of method object")
Georg Brandl479a7e72008-02-05 18:13:15 +00003847 def test_meth_class_get(self):
3848 # Testing __get__ method of METH_CLASS C methods...
3849 # Full coverage of descrobject.c::classmethod_get()
3850
3851 # Baseline
3852 arg = [1, 2, 3]
3853 res = {1: None, 2: None, 3: None}
3854 self.assertEqual(dict.fromkeys(arg), res)
3855 self.assertEqual({}.fromkeys(arg), res)
3856
3857 # Now get the descriptor
3858 descr = dict.__dict__["fromkeys"]
3859
3860 # More baseline using the descriptor directly
3861 self.assertEqual(descr.__get__(None, dict)(arg), res)
3862 self.assertEqual(descr.__get__({})(arg), res)
3863
3864 # Now check various error cases
3865 try:
3866 descr.__get__(None, None)
3867 except TypeError:
3868 pass
3869 else:
3870 self.fail("shouldn't have allowed descr.__get__(None, None)")
3871 try:
3872 descr.__get__(42)
3873 except TypeError:
3874 pass
3875 else:
3876 self.fail("shouldn't have allowed descr.__get__(42)")
3877 try:
3878 descr.__get__(None, 42)
3879 except TypeError:
3880 pass
3881 else:
3882 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3883 try:
3884 descr.__get__(None, int)
3885 except TypeError:
3886 pass
3887 else:
3888 self.fail("shouldn't have allowed descr.__get__(None, int)")
3889
3890 def test_isinst_isclass(self):
3891 # Testing proxy isinstance() and isclass()...
3892 class Proxy(object):
3893 def __init__(self, obj):
3894 self.__obj = obj
3895 def __getattribute__(self, name):
3896 if name.startswith("_Proxy__"):
3897 return object.__getattribute__(self, name)
3898 else:
3899 return getattr(self.__obj, name)
3900 # Test with a classic class
3901 class C:
3902 pass
3903 a = C()
3904 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003905 self.assertIsInstance(a, C) # Baseline
3906 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003907 # Test with a classic subclass
3908 class D(C):
3909 pass
3910 a = D()
3911 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003912 self.assertIsInstance(a, C) # Baseline
3913 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003914 # Test with a new-style class
3915 class C(object):
3916 pass
3917 a = C()
3918 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003919 self.assertIsInstance(a, C) # Baseline
3920 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003921 # Test with a new-style subclass
3922 class D(C):
3923 pass
3924 a = D()
3925 pa = Proxy(a)
Ezio Melottie9615932010-01-24 19:26:24 +00003926 self.assertIsInstance(a, C) # Baseline
3927 self.assertIsInstance(pa, C) # Test
Georg Brandl479a7e72008-02-05 18:13:15 +00003928
3929 def test_proxy_super(self):
3930 # Testing super() for a proxy object...
3931 class Proxy(object):
3932 def __init__(self, obj):
3933 self.__obj = obj
3934 def __getattribute__(self, name):
3935 if name.startswith("_Proxy__"):
3936 return object.__getattribute__(self, name)
3937 else:
3938 return getattr(self.__obj, name)
3939
3940 class B(object):
3941 def f(self):
3942 return "B.f"
3943
3944 class C(B):
3945 def f(self):
3946 return super(C, self).f() + "->C.f"
3947
3948 obj = C()
3949 p = Proxy(obj)
3950 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3951
3952 def test_carloverre(self):
3953 # Testing prohibition of Carlo Verre's hack...
3954 try:
3955 object.__setattr__(str, "foo", 42)
3956 except TypeError:
3957 pass
3958 else:
3959 self.fail("Carlo Verre __setattr__ suceeded!")
3960 try:
3961 object.__delattr__(str, "lower")
3962 except TypeError:
3963 pass
3964 else:
3965 self.fail("Carlo Verre __delattr__ succeeded!")
3966
3967 def test_weakref_segfault(self):
3968 # Testing weakref segfault...
3969 # SF 742911
3970 import weakref
3971
3972 class Provoker:
3973 def __init__(self, referrent):
3974 self.ref = weakref.ref(referrent)
3975
3976 def __del__(self):
3977 x = self.ref()
3978
3979 class Oops(object):
3980 pass
3981
3982 o = Oops()
3983 o.whatever = Provoker(o)
3984 del o
3985
3986 def test_wrapper_segfault(self):
3987 # SF 927248: deeply nested wrappers could cause stack overflow
3988 f = lambda:None
3989 for i in range(1000000):
3990 f = f.__call__
3991 f = None
3992
3993 def test_file_fault(self):
3994 # Testing sys.stdout is changed in getattr...
3995 import sys
Nick Coghlan6ead5522009-10-18 13:19:33 +00003996 test_stdout = sys.stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00003997 class StdoutGuard:
3998 def __getattr__(self, attr):
3999 sys.stdout = sys.__stdout__
4000 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4001 sys.stdout = StdoutGuard()
4002 try:
4003 print("Oops!")
4004 except RuntimeError:
4005 pass
Nick Coghlan6ead5522009-10-18 13:19:33 +00004006 finally:
4007 sys.stdout = test_stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004008
4009 def test_vicious_descriptor_nonsense(self):
4010 # Testing vicious_descriptor_nonsense...
4011
4012 # A potential segfault spotted by Thomas Wouters in mail to
4013 # python-dev 2003-04-17, turned into an example & fixed by Michael
4014 # Hudson just less than four months later...
4015
4016 class Evil(object):
4017 def __hash__(self):
4018 return hash('attr')
4019 def __eq__(self, other):
4020 del C.attr
4021 return 0
4022
4023 class Descr(object):
4024 def __get__(self, ob, type=None):
4025 return 1
4026
4027 class C(object):
4028 attr = Descr()
4029
4030 c = C()
4031 c.__dict__[Evil()] = 0
4032
4033 self.assertEqual(c.attr, 1)
4034 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004035 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004036 self.assertEqual(hasattr(c, 'attr'), False)
4037
4038 def test_init(self):
4039 # SF 1155938
4040 class Foo(object):
4041 def __init__(self):
4042 return 10
4043 try:
4044 Foo()
4045 except TypeError:
4046 pass
4047 else:
4048 self.fail("did not test __init__() for None return")
4049
4050 def test_method_wrapper(self):
4051 # Testing method-wrapper objects...
4052 # <type 'method-wrapper'> did not support any reflection before 2.5
4053
Mark Dickinson211c6252009-02-01 10:28:51 +00004054 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004055
4056 l = []
4057 self.assertEqual(l.__add__, l.__add__)
4058 self.assertEqual(l.__add__, [].__add__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004059 self.assertTrue(l.__add__ != [5].__add__)
4060 self.assertTrue(l.__add__ != l.__mul__)
4061 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004062 if hasattr(l.__add__, '__self__'):
4063 # CPython
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004064 self.assertTrue(l.__add__.__self__ is l)
4065 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Petersone549ead2009-03-28 21:42:05 +00004066 else:
4067 # Python implementations where [].__add__ is a normal bound method
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004068 self.assertTrue(l.__add__.im_self is l)
4069 self.assertTrue(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004070 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4071 try:
4072 hash(l.__add__)
4073 except TypeError:
4074 pass
4075 else:
4076 self.fail("no TypeError from hash([].__add__)")
4077
4078 t = ()
4079 t += (7,)
4080 self.assertEqual(t.__add__, (7,).__add__)
4081 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4082
4083 def test_not_implemented(self):
4084 # Testing NotImplemented...
4085 # all binary methods should be able to return a NotImplemented
4086 import sys
4087 import types
4088 import operator
4089
4090 def specialmethod(self, other):
4091 return NotImplemented
4092
4093 def check(expr, x, y):
4094 try:
4095 exec(expr, {'x': x, 'y': y, 'operator': operator})
4096 except TypeError:
4097 pass
4098 else:
4099 self.fail("no TypeError from %r" % (expr,))
4100
4101 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4102 # TypeErrors
4103 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4104 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004105 for name, expr, iexpr in [
4106 ('__add__', 'x + y', 'x += y'),
4107 ('__sub__', 'x - y', 'x -= y'),
4108 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004109 ('__truediv__', 'operator.truediv(x, y)', None),
4110 ('__floordiv__', 'operator.floordiv(x, y)', None),
4111 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004112 ('__mod__', 'x % y', 'x %= y'),
4113 ('__divmod__', 'divmod(x, y)', None),
4114 ('__pow__', 'x ** y', 'x **= y'),
4115 ('__lshift__', 'x << y', 'x <<= y'),
4116 ('__rshift__', 'x >> y', 'x >>= y'),
4117 ('__and__', 'x & y', 'x &= y'),
4118 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004119 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004120 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004121 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004122 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004123 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004124 check(expr, a, N1)
4125 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004126 if iexpr:
4127 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004128 check(iexpr, a, N1)
4129 check(iexpr, a, N2)
4130 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004131 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004132 c = C()
4133 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004134 check(iexpr, c, N1)
4135 check(iexpr, c, N2)
4136
Georg Brandl479a7e72008-02-05 18:13:15 +00004137 def test_assign_slice(self):
4138 # ceval.c's assign_slice used to check for
4139 # tp->tp_as_sequence->sq_slice instead of
4140 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004141
Georg Brandl479a7e72008-02-05 18:13:15 +00004142 class C(object):
4143 def __setitem__(self, idx, value):
4144 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004145
Georg Brandl479a7e72008-02-05 18:13:15 +00004146 c = C()
4147 c[1:2] = 3
4148 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004149
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +00004150 def test_set_and_no_get(self):
4151 # See
4152 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4153 class Descr(object):
4154
4155 def __init__(self, name):
4156 self.name = name
4157
4158 def __set__(self, obj, value):
4159 obj.__dict__[self.name] = value
4160 descr = Descr("a")
4161
4162 class X(object):
4163 a = descr
4164
4165 x = X()
4166 self.assertIs(x.a, descr)
4167 x.a = 42
4168 self.assertEqual(x.a, 42)
4169
Benjamin Peterson9262b842008-11-17 22:45:50 +00004170 def test_getattr_hooks(self):
4171 # issue 4230
4172
4173 class Descriptor(object):
4174 counter = 0
4175 def __get__(self, obj, objtype=None):
4176 def getter(name):
4177 self.counter += 1
4178 raise AttributeError(name)
4179 return getter
4180
4181 descr = Descriptor()
4182 class A(object):
4183 __getattribute__ = descr
4184 class B(object):
4185 __getattr__ = descr
4186 class C(object):
4187 __getattribute__ = descr
4188 __getattr__ = descr
4189
4190 self.assertRaises(AttributeError, getattr, A(), "attr")
4191 self.assertEquals(descr.counter, 1)
4192 self.assertRaises(AttributeError, getattr, B(), "attr")
4193 self.assertEquals(descr.counter, 2)
4194 self.assertRaises(AttributeError, getattr, C(), "attr")
4195 self.assertEquals(descr.counter, 4)
4196
4197 import gc
4198 class EvilGetattribute(object):
4199 # This used to segfault
4200 def __getattr__(self, name):
4201 raise AttributeError(name)
4202 def __getattribute__(self, name):
4203 del EvilGetattribute.__getattr__
4204 for i in range(5):
4205 gc.collect()
4206 raise AttributeError(name)
4207
4208 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4209
Christian Heimesbbffeb62008-01-24 09:42:52 +00004210
Georg Brandl479a7e72008-02-05 18:13:15 +00004211class DictProxyTests(unittest.TestCase):
4212 def setUp(self):
4213 class C(object):
4214 def meth(self):
4215 pass
4216 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004217
Georg Brandl479a7e72008-02-05 18:13:15 +00004218 def test_iter_keys(self):
4219 # Testing dict-proxy iterkeys...
4220 keys = [ key for key in self.C.__dict__.keys() ]
4221 keys.sort()
4222 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4223 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004224
Georg Brandl479a7e72008-02-05 18:13:15 +00004225 def test_iter_values(self):
4226 # Testing dict-proxy itervalues...
4227 values = [ values for values in self.C.__dict__.values() ]
4228 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004229
Georg Brandl479a7e72008-02-05 18:13:15 +00004230 def test_iter_items(self):
4231 # Testing dict-proxy iteritems...
4232 keys = [ key for (key, value) in self.C.__dict__.items() ]
4233 keys.sort()
4234 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4235 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004236
Georg Brandl479a7e72008-02-05 18:13:15 +00004237 def test_dict_type_with_metaclass(self):
4238 # Testing type of __dict__ when metaclass set...
4239 class B(object):
4240 pass
4241 class M(type):
4242 pass
4243 class C(metaclass=M):
4244 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4245 pass
4246 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004247
Christian Heimesbbffeb62008-01-24 09:42:52 +00004248
Georg Brandl479a7e72008-02-05 18:13:15 +00004249class PTypesLongInitTest(unittest.TestCase):
4250 # This is in its own TestCase so that it can be run before any other tests.
4251 def test_pytype_long_ready(self):
4252 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004253
Georg Brandl479a7e72008-02-05 18:13:15 +00004254 # This dumps core when SF bug 551412 isn't fixed --
4255 # but only when test_descr.py is run separately.
4256 # (That can't be helped -- as soon as PyType_Ready()
4257 # is called for PyLong_Type, the bug is gone.)
4258 class UserLong(object):
4259 def __pow__(self, *args):
4260 pass
4261 try:
4262 pow(0, UserLong(), 0)
4263 except:
4264 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004265
Georg Brandl479a7e72008-02-05 18:13:15 +00004266 # Another segfault only when run early
4267 # (before PyType_Ready(tuple) is called)
4268 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004269
4270
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004271def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004272 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004273 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004274 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004275
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004276if __name__ == "__main__":
4277 test_main()