blob: 011cb6d8ea9a64c0f1bd0441fcf3760962b5505f [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 = []
Georg Brandl479a7e72008-02-05 18:13:15 +0000627 MT = type(sys)
628 class MM(MT):
629 def __init__(self, name):
630 MT.__init__(self, name)
631 def __getattribute__(self, name):
632 log.append(("getattr", name))
633 return MT.__getattribute__(self, name)
634 def __setattr__(self, name, value):
635 log.append(("setattr", name, value))
636 MT.__setattr__(self, name, value)
637 def __delattr__(self, name):
638 log.append(("delattr", name))
639 MT.__delattr__(self, name)
640 a = MM("a")
641 a.foo = 12
642 x = a.foo
643 del a.foo
644 self.assertEqual(log, [("setattr", "foo", 12),
645 ("getattr", "foo"),
646 ("delattr", "foo")])
647
648 # http://python.org/sf/1174712
Tim Peters1fc240e2001-10-26 05:06:50 +0000649 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000650 class Module(types.ModuleType, str):
651 pass
652 except TypeError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000653 pass
654 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000655 self.fail("inheriting from ModuleType and str at the same time "
656 "should fail")
Tim Peters1fc240e2001-10-26 05:06:50 +0000657
Georg Brandl479a7e72008-02-05 18:13:15 +0000658 def test_multiple_inheritance(self):
659 # Testing multiple inheritance...
660 class C(object):
661 def __init__(self):
662 self.__state = 0
663 def getstate(self):
664 return self.__state
665 def setstate(self, state):
666 self.__state = state
667 a = C()
668 self.assertEqual(a.getstate(), 0)
669 a.setstate(10)
670 self.assertEqual(a.getstate(), 10)
671 class D(dict, C):
672 def __init__(self):
673 type({}).__init__(self)
674 C.__init__(self)
675 d = D()
676 self.assertEqual(list(d.keys()), [])
677 d["hello"] = "world"
678 self.assertEqual(list(d.items()), [("hello", "world")])
679 self.assertEqual(d["hello"], "world")
680 self.assertEqual(d.getstate(), 0)
681 d.setstate(10)
682 self.assertEqual(d.getstate(), 10)
683 self.assertEqual(D.__mro__, (D, dict, C, object))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000684
Georg Brandl479a7e72008-02-05 18:13:15 +0000685 # SF bug #442833
686 class Node(object):
687 def __int__(self):
688 return int(self.foo())
689 def foo(self):
690 return "23"
691 class Frag(Node, list):
692 def foo(self):
693 return "42"
694 self.assertEqual(Node().__int__(), 23)
695 self.assertEqual(int(Node()), 23)
696 self.assertEqual(Frag().__int__(), 42)
697 self.assertEqual(int(Frag()), 42)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000698
Georg Brandl479a7e72008-02-05 18:13:15 +0000699 def test_diamond_inheritence(self):
700 # Testing multiple inheritance special cases...
701 class A(object):
702 def spam(self): return "A"
703 self.assertEqual(A().spam(), "A")
704 class B(A):
705 def boo(self): return "B"
706 def spam(self): return "B"
707 self.assertEqual(B().spam(), "B")
708 self.assertEqual(B().boo(), "B")
709 class C(A):
710 def boo(self): return "C"
711 self.assertEqual(C().spam(), "A")
712 self.assertEqual(C().boo(), "C")
713 class D(B, C): pass
714 self.assertEqual(D().spam(), "B")
715 self.assertEqual(D().boo(), "B")
716 self.assertEqual(D.__mro__, (D, B, C, A, object))
717 class E(C, B): pass
718 self.assertEqual(E().spam(), "B")
719 self.assertEqual(E().boo(), "C")
720 self.assertEqual(E.__mro__, (E, C, B, A, object))
721 # MRO order disagreement
722 try:
723 class F(D, E): pass
724 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000725 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000726 else:
727 self.fail("expected MRO order disagreement (F)")
728 try:
729 class G(E, D): pass
730 except TypeError:
731 pass
732 else:
733 self.fail("expected MRO order disagreement (G)")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000734
Georg Brandl479a7e72008-02-05 18:13:15 +0000735 # see thread python-dev/2002-October/029035.html
736 def test_ex5_from_c3_switch(self):
737 # Testing ex5 from C3 switch discussion...
738 class A(object): pass
739 class B(object): pass
740 class C(object): pass
741 class X(A): pass
742 class Y(A): pass
743 class Z(X,B,Y,C): pass
744 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000745
Georg Brandl479a7e72008-02-05 18:13:15 +0000746 # see "A Monotonic Superclass Linearization for Dylan",
747 # by Kim Barrett et al. (OOPSLA 1996)
748 def test_monotonicity(self):
749 # Testing MRO monotonicity...
750 class Boat(object): pass
751 class DayBoat(Boat): pass
752 class WheelBoat(Boat): pass
753 class EngineLess(DayBoat): pass
754 class SmallMultihull(DayBoat): pass
755 class PedalWheelBoat(EngineLess,WheelBoat): pass
756 class SmallCatamaran(SmallMultihull): pass
757 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
Guido van Rossume45763a2001-08-10 21:28:46 +0000758
Georg Brandl479a7e72008-02-05 18:13:15 +0000759 self.assertEqual(PedalWheelBoat.__mro__,
760 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
761 self.assertEqual(SmallCatamaran.__mro__,
762 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
763 self.assertEqual(Pedalo.__mro__,
764 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
765 SmallMultihull, DayBoat, WheelBoat, Boat, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000766
Georg Brandl479a7e72008-02-05 18:13:15 +0000767 # see "A Monotonic Superclass Linearization for Dylan",
768 # by Kim Barrett et al. (OOPSLA 1996)
769 def test_consistency_with_epg(self):
770 # Testing consistentcy with EPG...
771 class Pane(object): pass
772 class ScrollingMixin(object): pass
773 class EditingMixin(object): pass
774 class ScrollablePane(Pane,ScrollingMixin): pass
775 class EditablePane(Pane,EditingMixin): pass
776 class EditableScrollablePane(ScrollablePane,EditablePane): pass
Guido van Rossum9a818922002-11-14 19:50:14 +0000777
Georg Brandl479a7e72008-02-05 18:13:15 +0000778 self.assertEqual(EditableScrollablePane.__mro__,
779 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
780 ScrollingMixin, EditingMixin, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000781
Georg Brandl479a7e72008-02-05 18:13:15 +0000782 def test_mro_disagreement(self):
783 # Testing error messages for MRO disagreement...
784 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000785order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000786
Georg Brandl479a7e72008-02-05 18:13:15 +0000787 def raises(exc, expected, callable, *args):
Guido van Rossum58da9312007-11-10 23:39:45 +0000788 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000789 callable(*args)
790 except exc as msg:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000791 # the exact msg is generally considered an impl detail
792 if support.check_impl_detail():
793 if not str(msg).startswith(expected):
794 self.fail("Message %r, expected %r" %
795 (str(msg), expected))
Georg Brandl479a7e72008-02-05 18:13:15 +0000796 else:
797 self.fail("Expected %s" % exc)
Guido van Rossum58da9312007-11-10 23:39:45 +0000798
Georg Brandl479a7e72008-02-05 18:13:15 +0000799 class A(object): pass
800 class B(A): pass
801 class C(object): pass
Christian Heimes9a371592007-12-28 14:08:13 +0000802
Georg Brandl479a7e72008-02-05 18:13:15 +0000803 # Test some very simple errors
804 raises(TypeError, "duplicate base class A",
805 type, "X", (A, A), {})
806 raises(TypeError, mro_err_msg,
807 type, "X", (A, B), {})
808 raises(TypeError, mro_err_msg,
809 type, "X", (A, C, B), {})
810 # Test a slightly more complex error
811 class GridLayout(object): pass
812 class HorizontalGrid(GridLayout): pass
813 class VerticalGrid(GridLayout): pass
814 class HVGrid(HorizontalGrid, VerticalGrid): pass
815 class VHGrid(VerticalGrid, HorizontalGrid): pass
816 raises(TypeError, mro_err_msg,
817 type, "ConfusedGrid", (HVGrid, VHGrid), {})
Guido van Rossum58da9312007-11-10 23:39:45 +0000818
Georg Brandl479a7e72008-02-05 18:13:15 +0000819 def test_object_class(self):
820 # Testing object class...
821 a = object()
822 self.assertEqual(a.__class__, object)
823 self.assertEqual(type(a), object)
824 b = object()
825 self.assertNotEqual(a, b)
826 self.assertFalse(hasattr(a, "foo"))
Tim Peters808b94e2001-09-13 19:33:07 +0000827 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000828 a.foo = 12
829 except (AttributeError, TypeError):
Tim Peters808b94e2001-09-13 19:33:07 +0000830 pass
831 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000832 self.fail("object() should not allow setting a foo attribute")
833 self.assertFalse(hasattr(object(), "__dict__"))
Tim Peters561f8992001-09-13 19:36:36 +0000834
Georg Brandl479a7e72008-02-05 18:13:15 +0000835 class Cdict(object):
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000836 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000837 x = Cdict()
838 self.assertEqual(x.__dict__, {})
839 x.foo = 1
840 self.assertEqual(x.foo, 1)
841 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossumd8faa362007-04-27 19:54:29 +0000842
Georg Brandl479a7e72008-02-05 18:13:15 +0000843 def test_slots(self):
844 # Testing __slots__...
845 class C0(object):
846 __slots__ = []
847 x = C0()
848 self.assertFalse(hasattr(x, "__dict__"))
849 self.assertFalse(hasattr(x, "foo"))
850
851 class C1(object):
852 __slots__ = ['a']
853 x = C1()
854 self.assertFalse(hasattr(x, "__dict__"))
855 self.assertFalse(hasattr(x, "a"))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000856 x.a = 1
Georg Brandl479a7e72008-02-05 18:13:15 +0000857 self.assertEqual(x.a, 1)
858 x.a = None
859 self.assertEqual(x.a, None)
860 del x.a
861 self.assertFalse(hasattr(x, "a"))
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000862
Georg Brandl479a7e72008-02-05 18:13:15 +0000863 class C3(object):
864 __slots__ = ['a', 'b', 'c']
865 x = C3()
866 self.assertFalse(hasattr(x, "__dict__"))
867 self.assertFalse(hasattr(x, 'a'))
868 self.assertFalse(hasattr(x, 'b'))
869 self.assertFalse(hasattr(x, 'c'))
870 x.a = 1
871 x.b = 2
872 x.c = 3
873 self.assertEqual(x.a, 1)
874 self.assertEqual(x.b, 2)
875 self.assertEqual(x.c, 3)
876
877 class C4(object):
878 """Validate name mangling"""
879 __slots__ = ['__a']
880 def __init__(self, value):
881 self.__a = value
882 def get(self):
883 return self.__a
884 x = C4(5)
885 self.assertFalse(hasattr(x, '__dict__'))
886 self.assertFalse(hasattr(x, '__a'))
887 self.assertEqual(x.get(), 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000888 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000889 x.__a = 6
890 except AttributeError:
Guido van Rossum6661be32001-10-26 04:26:12 +0000891 pass
892 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000893 self.fail("Double underscored names not mangled")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000894
Georg Brandl479a7e72008-02-05 18:13:15 +0000895 # Make sure slot names are proper identifiers
Guido van Rossum360e4b82007-05-14 22:51:27 +0000896 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000897 class C(object):
898 __slots__ = [None]
Guido van Rossum360e4b82007-05-14 22:51:27 +0000899 except TypeError:
900 pass
901 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000902 self.fail("[None] slots not caught")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000903 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000904 class C(object):
905 __slots__ = ["foo bar"]
906 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000907 pass
908 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000909 self.fail("['foo bar'] slots not caught")
910 try:
911 class C(object):
912 __slots__ = ["foo\0bar"]
913 except TypeError:
914 pass
915 else:
916 self.fail("['foo\\0bar'] slots not caught")
917 try:
918 class C(object):
919 __slots__ = ["1"]
920 except TypeError:
921 pass
922 else:
923 self.fail("['1'] slots not caught")
924 try:
925 class C(object):
926 __slots__ = [""]
927 except TypeError:
928 pass
929 else:
930 self.fail("[''] slots not caught")
931 class C(object):
932 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
933 # XXX(nnorwitz): was there supposed to be something tested
934 # from the class above?
Guido van Rossum360e4b82007-05-14 22:51:27 +0000935
Georg Brandl479a7e72008-02-05 18:13:15 +0000936 # Test a single string is not expanded as a sequence.
937 class C(object):
938 __slots__ = "abc"
939 c = C()
940 c.abc = 5
941 self.assertEqual(c.abc, 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000942
Georg Brandl479a7e72008-02-05 18:13:15 +0000943 # Test unicode slot names
944 # Test a single unicode string is not expanded as a sequence.
945 class C(object):
946 __slots__ = "abc"
947 c = C()
948 c.abc = 5
949 self.assertEqual(c.abc, 5)
Guido van Rossum3926a632001-09-25 16:25:58 +0000950
Georg Brandl479a7e72008-02-05 18:13:15 +0000951 # _unicode_to_string used to modify slots in certain circumstances
952 slots = ("foo", "bar")
953 class C(object):
954 __slots__ = slots
955 x = C()
956 x.foo = 5
957 self.assertEqual(x.foo, 5)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000958 self.assertTrue(type(slots[0]) is str)
Georg Brandl479a7e72008-02-05 18:13:15 +0000959 # this used to leak references
960 try:
961 class C(object):
962 __slots__ = [chr(128)]
963 except (TypeError, UnicodeEncodeError):
964 pass
965 else:
966 raise TestFailed("[chr(128)] slots not caught")
Guido van Rossum3926a632001-09-25 16:25:58 +0000967
Georg Brandl479a7e72008-02-05 18:13:15 +0000968 # Test leaks
969 class Counted(object):
970 counter = 0 # counts the number of instances alive
971 def __init__(self):
972 Counted.counter += 1
973 def __del__(self):
974 Counted.counter -= 1
975 class C(object):
976 __slots__ = ['a', 'b', 'c']
977 x = C()
978 x.a = Counted()
979 x.b = Counted()
980 x.c = Counted()
981 self.assertEqual(Counted.counter, 3)
982 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000983 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000984 self.assertEqual(Counted.counter, 0)
985 class D(C):
986 pass
987 x = D()
988 x.a = Counted()
989 x.z = Counted()
990 self.assertEqual(Counted.counter, 2)
991 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +0000992 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +0000993 self.assertEqual(Counted.counter, 0)
994 class E(D):
995 __slots__ = ['e']
996 x = E()
997 x.a = Counted()
998 x.z = Counted()
999 x.e = Counted()
1000 self.assertEqual(Counted.counter, 3)
1001 del x
Benjamin Petersone549ead2009-03-28 21:42:05 +00001002 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001003 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001004
Georg Brandl479a7e72008-02-05 18:13:15 +00001005 # Test cyclical leaks [SF bug 519621]
1006 class F(object):
1007 __slots__ = ['a', 'b']
Georg Brandl479a7e72008-02-05 18:13:15 +00001008 s = F()
1009 s.a = [Counted(), s]
1010 self.assertEqual(Counted.counter, 1)
1011 s = None
Benjamin Petersone549ead2009-03-28 21:42:05 +00001012 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001013 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001014
Georg Brandl479a7e72008-02-05 18:13:15 +00001015 # Test lookup leaks [SF bug 572567]
Georg Brandl1b37e872010-03-14 10:45:50 +00001016 import gc
Benjamin Petersone549ead2009-03-28 21:42:05 +00001017 if hasattr(gc, 'get_objects'):
1018 class G(object):
Benjamin Petersona8b976b2009-10-11 18:28:48 +00001019 def __eq__(self, other):
1020 return False
Benjamin Petersone549ead2009-03-28 21:42:05 +00001021 g = G()
1022 orig_objects = len(gc.get_objects())
1023 for i in range(10):
1024 g==g
1025 new_objects = len(gc.get_objects())
1026 self.assertEqual(orig_objects, new_objects)
1027
Georg Brandl479a7e72008-02-05 18:13:15 +00001028 class H(object):
1029 __slots__ = ['a', 'b']
1030 def __init__(self):
1031 self.a = 1
1032 self.b = 2
1033 def __del__(self_):
1034 self.assertEqual(self_.a, 1)
1035 self.assertEqual(self_.b, 2)
Benjamin Petersonc1de4cc2008-11-03 21:29:09 +00001036 with support.captured_output('stderr') as s:
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001037 h = H()
Georg Brandl479a7e72008-02-05 18:13:15 +00001038 del h
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001039 self.assertEqual(s.getvalue(), '')
Guido van Rossum90c45142001-11-24 21:07:01 +00001040
Benjamin Petersond12362a2009-12-30 19:44:54 +00001041 class X(object):
1042 __slots__ = "a"
1043 with self.assertRaises(AttributeError):
1044 del X().a
1045
Georg Brandl479a7e72008-02-05 18:13:15 +00001046 def test_slots_special(self):
1047 # Testing __dict__ and __weakref__ in __slots__...
1048 class D(object):
1049 __slots__ = ["__dict__"]
1050 a = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001051 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001052 self.assertFalse(hasattr(a, "__weakref__"))
1053 a.foo = 42
1054 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum90c45142001-11-24 21:07:01 +00001055
Georg Brandl479a7e72008-02-05 18:13:15 +00001056 class W(object):
1057 __slots__ = ["__weakref__"]
1058 a = W()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001059 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001060 self.assertFalse(hasattr(a, "__dict__"))
1061 try:
1062 a.foo = 42
1063 except AttributeError:
1064 pass
1065 else:
1066 self.fail("shouldn't be allowed to set a.foo")
1067
1068 class C1(W, D):
1069 __slots__ = []
1070 a = C1()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001071 self.assertTrue(hasattr(a, "__dict__"))
1072 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001073 a.foo = 42
1074 self.assertEqual(a.__dict__, {"foo": 42})
1075
1076 class C2(D, W):
1077 __slots__ = []
1078 a = C2()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001079 self.assertTrue(hasattr(a, "__dict__"))
1080 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl479a7e72008-02-05 18:13:15 +00001081 a.foo = 42
1082 self.assertEqual(a.__dict__, {"foo": 42})
1083
Christian Heimesa156e092008-02-16 07:38:31 +00001084 def test_slots_descriptor(self):
1085 # Issue2115: slot descriptors did not correctly check
1086 # the type of the given object
1087 import abc
1088 class MyABC(metaclass=abc.ABCMeta):
1089 __slots__ = "a"
1090
1091 class Unrelated(object):
1092 pass
1093 MyABC.register(Unrelated)
1094
1095 u = Unrelated()
Ezio Melottie9615932010-01-24 19:26:24 +00001096 self.assertIsInstance(u, MyABC)
Christian Heimesa156e092008-02-16 07:38:31 +00001097
1098 # This used to crash
1099 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1100
Georg Brandl479a7e72008-02-05 18:13:15 +00001101 def test_dynamics(self):
1102 # Testing class attribute propagation...
1103 class D(object):
1104 pass
1105 class E(D):
1106 pass
1107 class F(D):
1108 pass
1109 D.foo = 1
1110 self.assertEqual(D.foo, 1)
1111 # Test that dynamic attributes are inherited
1112 self.assertEqual(E.foo, 1)
1113 self.assertEqual(F.foo, 1)
1114 # Test dynamic instances
1115 class C(object):
1116 pass
1117 a = C()
1118 self.assertFalse(hasattr(a, "foobar"))
1119 C.foobar = 2
1120 self.assertEqual(a.foobar, 2)
1121 C.method = lambda self: 42
1122 self.assertEqual(a.method(), 42)
1123 C.__repr__ = lambda self: "C()"
1124 self.assertEqual(repr(a), "C()")
1125 C.__int__ = lambda self: 100
1126 self.assertEqual(int(a), 100)
1127 self.assertEqual(a.foobar, 2)
1128 self.assertFalse(hasattr(a, "spam"))
1129 def mygetattr(self, name):
1130 if name == "spam":
1131 return "spam"
1132 raise AttributeError
1133 C.__getattr__ = mygetattr
1134 self.assertEqual(a.spam, "spam")
1135 a.new = 12
1136 self.assertEqual(a.new, 12)
1137 def mysetattr(self, name, value):
1138 if name == "spam":
1139 raise AttributeError
1140 return object.__setattr__(self, name, value)
1141 C.__setattr__ = mysetattr
1142 try:
1143 a.spam = "not spam"
1144 except AttributeError:
1145 pass
1146 else:
1147 self.fail("expected AttributeError")
1148 self.assertEqual(a.spam, "spam")
1149 class D(C):
1150 pass
1151 d = D()
1152 d.foo = 1
1153 self.assertEqual(d.foo, 1)
1154
1155 # Test handling of int*seq and seq*int
1156 class I(int):
1157 pass
1158 self.assertEqual("a"*I(2), "aa")
1159 self.assertEqual(I(2)*"a", "aa")
1160 self.assertEqual(2*I(3), 6)
1161 self.assertEqual(I(3)*2, 6)
1162 self.assertEqual(I(3)*I(2), 6)
1163
Georg Brandl479a7e72008-02-05 18:13:15 +00001164 # Test comparison of classes with dynamic metaclasses
1165 class dynamicmetaclass(type):
1166 pass
1167 class someclass(metaclass=dynamicmetaclass):
1168 pass
1169 self.assertNotEqual(someclass, object)
1170
1171 def test_errors(self):
1172 # Testing errors...
1173 try:
1174 class C(list, dict):
1175 pass
1176 except TypeError:
1177 pass
1178 else:
1179 self.fail("inheritance from both list and dict should be illegal")
1180
1181 try:
1182 class C(object, None):
1183 pass
1184 except TypeError:
1185 pass
1186 else:
1187 self.fail("inheritance from non-type should be illegal")
1188 class Classic:
1189 pass
1190
1191 try:
1192 class C(type(len)):
1193 pass
1194 except TypeError:
1195 pass
1196 else:
1197 self.fail("inheritance from CFunction should be illegal")
1198
1199 try:
1200 class C(object):
1201 __slots__ = 1
1202 except TypeError:
1203 pass
1204 else:
1205 self.fail("__slots__ = 1 should be illegal")
1206
1207 try:
1208 class C(object):
1209 __slots__ = [1]
1210 except TypeError:
1211 pass
1212 else:
1213 self.fail("__slots__ = [1] should be illegal")
1214
1215 class M1(type):
1216 pass
1217 class M2(type):
1218 pass
1219 class A1(object, metaclass=M1):
1220 pass
1221 class A2(object, metaclass=M2):
1222 pass
1223 try:
1224 class B(A1, A2):
1225 pass
1226 except TypeError:
1227 pass
1228 else:
1229 self.fail("finding the most derived metaclass should have failed")
1230
1231 def test_classmethods(self):
1232 # Testing class methods...
1233 class C(object):
1234 def foo(*a): return a
1235 goo = classmethod(foo)
1236 c = C()
1237 self.assertEqual(C.goo(1), (C, 1))
1238 self.assertEqual(c.goo(1), (C, 1))
1239 self.assertEqual(c.foo(1), (c, 1))
1240 class D(C):
1241 pass
1242 d = D()
1243 self.assertEqual(D.goo(1), (D, 1))
1244 self.assertEqual(d.goo(1), (D, 1))
1245 self.assertEqual(d.foo(1), (d, 1))
1246 self.assertEqual(D.foo(d, 1), (d, 1))
1247 # Test for a specific crash (SF bug 528132)
1248 def f(cls, arg): return (cls, arg)
1249 ff = classmethod(f)
1250 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1251 self.assertEqual(ff.__get__(0)(42), (int, 42))
1252
1253 # Test super() with classmethods (SF bug 535444)
1254 self.assertEqual(C.goo.__self__, C)
1255 self.assertEqual(D.goo.__self__, D)
1256 self.assertEqual(super(D,D).goo.__self__, D)
1257 self.assertEqual(super(D,d).goo.__self__, D)
1258 self.assertEqual(super(D,D).goo(), (D,))
1259 self.assertEqual(super(D,d).goo(), (D,))
1260
Benjamin Peterson8719ad52009-09-11 22:24:02 +00001261 # Verify that a non-callable will raise
1262 meth = classmethod(1).__get__(1)
1263 self.assertRaises(TypeError, meth)
Georg Brandl479a7e72008-02-05 18:13:15 +00001264
1265 # Verify that classmethod() doesn't allow keyword args
1266 try:
1267 classmethod(f, kw=1)
1268 except TypeError:
1269 pass
1270 else:
1271 self.fail("classmethod shouldn't accept keyword args")
1272
Benjamin Petersone549ead2009-03-28 21:42:05 +00001273 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001274 def test_classmethods_in_c(self):
1275 # Testing C-based class methods...
1276 import xxsubtype as spam
1277 a = (1, 2, 3)
1278 d = {'abc': 123}
1279 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1280 self.assertEqual(x, spam.spamlist)
1281 self.assertEqual(a, a1)
1282 self.assertEqual(d, d1)
1283 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1284 self.assertEqual(x, spam.spamlist)
1285 self.assertEqual(a, a1)
1286 self.assertEqual(d, d1)
1287
1288 def test_staticmethods(self):
1289 # Testing static methods...
1290 class C(object):
1291 def foo(*a): return a
1292 goo = staticmethod(foo)
1293 c = C()
1294 self.assertEqual(C.goo(1), (1,))
1295 self.assertEqual(c.goo(1), (1,))
1296 self.assertEqual(c.foo(1), (c, 1,))
1297 class D(C):
1298 pass
1299 d = D()
1300 self.assertEqual(D.goo(1), (1,))
1301 self.assertEqual(d.goo(1), (1,))
1302 self.assertEqual(d.foo(1), (d, 1))
1303 self.assertEqual(D.foo(d, 1), (d, 1))
1304
Benjamin Petersone549ead2009-03-28 21:42:05 +00001305 @support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl479a7e72008-02-05 18:13:15 +00001306 def test_staticmethods_in_c(self):
1307 # Testing C-based static methods...
1308 import xxsubtype as spam
1309 a = (1, 2, 3)
1310 d = {"abc": 123}
1311 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1312 self.assertEqual(x, None)
1313 self.assertEqual(a, a1)
1314 self.assertEqual(d, d1)
1315 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1316 self.assertEqual(x, None)
1317 self.assertEqual(a, a1)
1318 self.assertEqual(d, d1)
1319
1320 def test_classic(self):
1321 # Testing classic classes...
1322 class C:
1323 def foo(*a): return a
1324 goo = classmethod(foo)
1325 c = C()
1326 self.assertEqual(C.goo(1), (C, 1))
1327 self.assertEqual(c.goo(1), (C, 1))
1328 self.assertEqual(c.foo(1), (c, 1))
1329 class D(C):
1330 pass
1331 d = D()
1332 self.assertEqual(D.goo(1), (D, 1))
1333 self.assertEqual(d.goo(1), (D, 1))
1334 self.assertEqual(d.foo(1), (d, 1))
1335 self.assertEqual(D.foo(d, 1), (d, 1))
1336 class E: # *not* subclassing from C
1337 foo = C.foo
1338 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001339 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001340
1341 def test_compattr(self):
1342 # Testing computed attributes...
1343 class C(object):
1344 class computed_attribute(object):
1345 def __init__(self, get, set=None, delete=None):
1346 self.__get = get
1347 self.__set = set
1348 self.__delete = delete
1349 def __get__(self, obj, type=None):
1350 return self.__get(obj)
1351 def __set__(self, obj, value):
1352 return self.__set(obj, value)
1353 def __delete__(self, obj):
1354 return self.__delete(obj)
1355 def __init__(self):
1356 self.__x = 0
1357 def __get_x(self):
1358 x = self.__x
1359 self.__x = x+1
1360 return x
1361 def __set_x(self, x):
1362 self.__x = x
1363 def __delete_x(self):
1364 del self.__x
1365 x = computed_attribute(__get_x, __set_x, __delete_x)
1366 a = C()
1367 self.assertEqual(a.x, 0)
1368 self.assertEqual(a.x, 1)
1369 a.x = 10
1370 self.assertEqual(a.x, 10)
1371 self.assertEqual(a.x, 11)
1372 del a.x
1373 self.assertEqual(hasattr(a, 'x'), 0)
1374
1375 def test_newslots(self):
1376 # Testing __new__ slot override...
1377 class C(list):
1378 def __new__(cls):
1379 self = list.__new__(cls)
1380 self.foo = 1
1381 return self
1382 def __init__(self):
1383 self.foo = self.foo + 2
1384 a = C()
1385 self.assertEqual(a.foo, 3)
1386 self.assertEqual(a.__class__, C)
1387 class D(C):
1388 pass
1389 b = D()
1390 self.assertEqual(b.foo, 3)
1391 self.assertEqual(b.__class__, D)
1392
1393 def test_altmro(self):
1394 # Testing mro() and overriding it...
1395 class A(object):
1396 def f(self): return "A"
1397 class B(A):
1398 pass
1399 class C(A):
1400 def f(self): return "C"
1401 class D(B, C):
1402 pass
1403 self.assertEqual(D.mro(), [D, B, C, A, object])
1404 self.assertEqual(D.__mro__, (D, B, C, A, object))
1405 self.assertEqual(D().f(), "C")
1406
1407 class PerverseMetaType(type):
1408 def mro(cls):
1409 L = type.mro(cls)
1410 L.reverse()
1411 return L
1412 class X(D,B,C,A, metaclass=PerverseMetaType):
1413 pass
1414 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1415 self.assertEqual(X().f(), "A")
1416
1417 try:
1418 class _metaclass(type):
1419 def mro(self):
1420 return [self, dict, object]
1421 class X(object, metaclass=_metaclass):
1422 pass
Benjamin Petersone549ead2009-03-28 21:42:05 +00001423 # In CPython, the class creation above already raises
1424 # TypeError, as a protection against the fact that
1425 # instances of X would segfault it. In other Python
1426 # implementations it would be ok to let the class X
1427 # be created, but instead get a clean TypeError on the
1428 # __setitem__ below.
1429 x = object.__new__(X)
1430 x[5] = 6
Georg Brandl479a7e72008-02-05 18:13:15 +00001431 except TypeError:
1432 pass
1433 else:
1434 self.fail("devious mro() return not caught")
1435
1436 try:
1437 class _metaclass(type):
1438 def mro(self):
1439 return [1]
1440 class X(object, metaclass=_metaclass):
1441 pass
1442 except TypeError:
1443 pass
1444 else:
1445 self.fail("non-class mro() return not caught")
1446
1447 try:
1448 class _metaclass(type):
1449 def mro(self):
1450 return 1
1451 class X(object, metaclass=_metaclass):
1452 pass
1453 except TypeError:
1454 pass
1455 else:
1456 self.fail("non-sequence mro() return not caught")
1457
1458 def test_overloading(self):
1459 # Testing operator overloading...
1460
1461 class B(object):
1462 "Intermediate class because object doesn't have a __setattr__"
1463
1464 class C(B):
1465 def __getattr__(self, name):
1466 if name == "foo":
1467 return ("getattr", name)
1468 else:
1469 raise AttributeError
1470 def __setattr__(self, name, value):
1471 if name == "foo":
1472 self.setattr = (name, value)
1473 else:
1474 return B.__setattr__(self, name, value)
1475 def __delattr__(self, name):
1476 if name == "foo":
1477 self.delattr = name
1478 else:
1479 return B.__delattr__(self, name)
1480
1481 def __getitem__(self, key):
1482 return ("getitem", key)
1483 def __setitem__(self, key, value):
1484 self.setitem = (key, value)
1485 def __delitem__(self, key):
1486 self.delitem = key
1487
1488 a = C()
1489 self.assertEqual(a.foo, ("getattr", "foo"))
1490 a.foo = 12
1491 self.assertEqual(a.setattr, ("foo", 12))
1492 del a.foo
1493 self.assertEqual(a.delattr, "foo")
1494
1495 self.assertEqual(a[12], ("getitem", 12))
1496 a[12] = 21
1497 self.assertEqual(a.setitem, (12, 21))
1498 del a[12]
1499 self.assertEqual(a.delitem, 12)
1500
1501 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1502 a[0:10] = "foo"
1503 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1504 del a[0:10]
1505 self.assertEqual(a.delitem, (slice(0, 10)))
1506
1507 def test_methods(self):
1508 # Testing methods...
1509 class C(object):
1510 def __init__(self, x):
1511 self.x = x
1512 def foo(self):
1513 return self.x
1514 c1 = C(1)
1515 self.assertEqual(c1.foo(), 1)
1516 class D(C):
1517 boo = C.foo
1518 goo = c1.foo
1519 d2 = D(2)
1520 self.assertEqual(d2.foo(), 2)
1521 self.assertEqual(d2.boo(), 2)
1522 self.assertEqual(d2.goo(), 1)
1523 class E(object):
1524 foo = C.foo
1525 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001526 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl479a7e72008-02-05 18:13:15 +00001527
Benjamin Peterson224205f2009-05-08 03:25:19 +00001528 def test_special_method_lookup(self):
1529 # The lookup of special methods bypasses __getattr__ and
1530 # __getattribute__, but they still can be descriptors.
1531
1532 def run_context(manager):
1533 with manager:
1534 pass
1535 def iden(self):
1536 return self
1537 def hello(self):
1538 return b"hello"
Benjamin Peterson053c61f2009-05-09 17:21:13 +00001539 def empty_seq(self):
1540 return []
Benjamin Petersona5758c02009-05-09 18:15:04 +00001541 def zero(self):
1542 return 0
Benjamin Petersonaea44282010-01-04 01:10:28 +00001543 def complex_num(self):
1544 return 1j
Benjamin Petersona5758c02009-05-09 18:15:04 +00001545 def stop(self):
1546 raise StopIteration
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001547 def return_true(self, thing=None):
1548 return True
1549 def do_isinstance(obj):
1550 return isinstance(int, obj)
1551 def do_issubclass(obj):
1552 return issubclass(int, obj)
Benjamin Petersona7205592009-05-27 03:08:59 +00001553 def do_dict_missing(checker):
1554 class DictSub(checker.__class__, dict):
1555 pass
1556 self.assertEqual(DictSub()["hi"], 4)
1557 def some_number(self_, key):
1558 self.assertEqual(key, "hi")
1559 return 4
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001560 def swallow(*args): pass
Benjamin Peterson224205f2009-05-08 03:25:19 +00001561
1562 # It would be nice to have every special method tested here, but I'm
1563 # only listing the ones I can remember outside of typeobject.c, since it
1564 # does it right.
1565 specials = [
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001566 ("__bytes__", bytes, hello, set(), {}),
1567 ("__reversed__", reversed, empty_seq, set(), {}),
1568 ("__length_hint__", list, zero, set(),
Benjamin Petersona5758c02009-05-09 18:15:04 +00001569 {"__iter__" : iden, "__next__" : stop}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001570 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1571 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Petersona7205592009-05-27 03:08:59 +00001572 ("__missing__", do_dict_missing, some_number,
1573 set(("__class__",)), {}),
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001574 ("__subclasscheck__", do_issubclass, return_true,
1575 set(("__bases__",)), {}),
Benjamin Peterson876b2f22009-06-28 03:18:59 +00001576 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1577 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Petersonaea44282010-01-04 01:10:28 +00001578 ("__complex__", complex, complex_num, set(), {}),
Benjamin Peterson224205f2009-05-08 03:25:19 +00001579 ]
1580
1581 class Checker(object):
1582 def __getattr__(self, attr, test=self):
1583 test.fail("__getattr__ called with {0}".format(attr))
1584 def __getattribute__(self, attr, test=self):
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001585 if attr not in ok:
1586 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Petersona7205592009-05-27 03:08:59 +00001587 return object.__getattribute__(self, attr)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001588 class SpecialDescr(object):
1589 def __init__(self, impl):
1590 self.impl = impl
1591 def __get__(self, obj, owner):
1592 record.append(1)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001593 return self.impl.__get__(obj, owner)
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001594 class MyException(Exception):
1595 pass
1596 class ErrDescr(object):
1597 def __get__(self, obj, owner):
1598 raise MyException
Benjamin Peterson224205f2009-05-08 03:25:19 +00001599
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00001600 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson224205f2009-05-08 03:25:19 +00001601 class X(Checker):
1602 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001603 for attr, obj in env.items():
1604 setattr(X, attr, obj)
Benjamin Peterson8a282d12009-05-08 18:18:45 +00001605 setattr(X, name, meth_impl)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001606 runner(X())
1607
1608 record = []
1609 class X(Checker):
1610 pass
Benjamin Petersona5758c02009-05-09 18:15:04 +00001611 for attr, obj in env.items():
1612 setattr(X, attr, obj)
Benjamin Peterson224205f2009-05-08 03:25:19 +00001613 setattr(X, name, SpecialDescr(meth_impl))
1614 runner(X())
1615 self.assertEqual(record, [1], name)
1616
Benjamin Peterson94c65d92009-05-25 03:10:48 +00001617 class X(Checker):
1618 pass
1619 for attr, obj in env.items():
1620 setattr(X, attr, obj)
1621 setattr(X, name, ErrDescr())
1622 try:
1623 runner(X())
1624 except MyException:
1625 pass
1626 else:
1627 self.fail("{0!r} didn't raise".format(name))
1628
Georg Brandl479a7e72008-02-05 18:13:15 +00001629 def test_specials(self):
1630 # Testing special operators...
1631 # Test operators like __hash__ for which a built-in default exists
1632
1633 # Test the default behavior for static classes
1634 class C(object):
1635 def __getitem__(self, i):
1636 if 0 <= i < 10: return i
1637 raise IndexError
1638 c1 = C()
1639 c2 = C()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001640 self.assertTrue(not not c1) # What?
Georg Brandl479a7e72008-02-05 18:13:15 +00001641 self.assertNotEqual(id(c1), id(c2))
1642 hash(c1)
1643 hash(c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001644 self.assertEqual(c1, c1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001645 self.assertTrue(c1 != c2)
1646 self.assertTrue(not c1 != c1)
1647 self.assertTrue(not c1 == c2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001648 # Note that the module name appears in str/repr, and that varies
1649 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001650 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001651 self.assertEqual(str(c1), repr(c1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001652 self.assertNotIn(-1, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001653 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001654 self.assertIn(i, c1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001655 self.assertNotIn(10, c1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001656 # Test the default behavior for dynamic classes
1657 class D(object):
1658 def __getitem__(self, i):
1659 if 0 <= i < 10: return i
1660 raise IndexError
1661 d1 = D()
1662 d2 = D()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001663 self.assertTrue(not not d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001664 self.assertNotEqual(id(d1), id(d2))
1665 hash(d1)
1666 hash(d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001667 self.assertEqual(d1, d1)
1668 self.assertNotEqual(d1, d2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001669 self.assertTrue(not d1 != d1)
1670 self.assertTrue(not d1 == d2)
Georg Brandl479a7e72008-02-05 18:13:15 +00001671 # Note that the module name appears in str/repr, and that varies
1672 # depending on whether this test is run standalone or from a framework.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001673 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001674 self.assertEqual(str(d1), repr(d1))
Benjamin Peterson577473f2010-01-19 00:09:57 +00001675 self.assertNotIn(-1, d1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001676 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001677 self.assertIn(i, d1)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001678 self.assertNotIn(10, d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001679 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001680 class Proxy(object):
1681 def __init__(self, x):
1682 self.x = x
1683 def __bool__(self):
1684 return not not self.x
1685 def __hash__(self):
1686 return hash(self.x)
1687 def __eq__(self, other):
1688 return self.x == other
1689 def __ne__(self, other):
1690 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001691 def __ge__(self, other):
1692 return self.x >= other
1693 def __gt__(self, other):
1694 return self.x > other
1695 def __le__(self, other):
1696 return self.x <= other
1697 def __lt__(self, other):
1698 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001699 def __str__(self):
1700 return "Proxy:%s" % self.x
1701 def __repr__(self):
1702 return "Proxy(%r)" % self.x
1703 def __contains__(self, value):
1704 return value in self.x
1705 p0 = Proxy(0)
1706 p1 = Proxy(1)
1707 p_1 = Proxy(-1)
1708 self.assertFalse(p0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001709 self.assertTrue(not not p1)
Georg Brandl479a7e72008-02-05 18:13:15 +00001710 self.assertEqual(hash(p0), hash(0))
1711 self.assertEqual(p0, p0)
1712 self.assertNotEqual(p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001713 self.assertTrue(not p0 != p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001714 self.assertEqual(not p0, p1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001715 self.assertTrue(p0 < p1)
1716 self.assertTrue(p0 <= p1)
1717 self.assertTrue(p1 > p0)
1718 self.assertTrue(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001719 self.assertEqual(str(p0), "Proxy:0")
1720 self.assertEqual(repr(p0), "Proxy(0)")
1721 p10 = Proxy(range(10))
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001722 self.assertNotIn(-1, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001723 for i in range(10):
Benjamin Peterson577473f2010-01-19 00:09:57 +00001724 self.assertIn(i, p10)
Ezio Melottib58e0bd2010-01-23 15:40:09 +00001725 self.assertNotIn(10, p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001726
Georg Brandl479a7e72008-02-05 18:13:15 +00001727 def test_weakrefs(self):
1728 # Testing weak references...
1729 import weakref
1730 class C(object):
1731 pass
1732 c = C()
1733 r = weakref.ref(c)
1734 self.assertEqual(r(), c)
1735 del c
Benjamin Petersone549ead2009-03-28 21:42:05 +00001736 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001737 self.assertEqual(r(), None)
1738 del r
1739 class NoWeak(object):
1740 __slots__ = ['foo']
1741 no = NoWeak()
1742 try:
1743 weakref.ref(no)
1744 except TypeError as msg:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001745 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001746 else:
1747 self.fail("weakref.ref(no) should be illegal")
1748 class Weak(object):
1749 __slots__ = ['foo', '__weakref__']
1750 yes = Weak()
1751 r = weakref.ref(yes)
1752 self.assertEqual(r(), yes)
1753 del yes
Benjamin Petersone549ead2009-03-28 21:42:05 +00001754 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00001755 self.assertEqual(r(), None)
1756 del r
1757
1758 def test_properties(self):
1759 # Testing property...
1760 class C(object):
1761 def getx(self):
1762 return self.__x
1763 def setx(self, value):
1764 self.__x = value
1765 def delx(self):
1766 del self.__x
1767 x = property(getx, setx, delx, doc="I'm the x property.")
1768 a = C()
1769 self.assertFalse(hasattr(a, "x"))
1770 a.x = 42
1771 self.assertEqual(a._C__x, 42)
1772 self.assertEqual(a.x, 42)
1773 del a.x
1774 self.assertFalse(hasattr(a, "x"))
1775 self.assertFalse(hasattr(a, "_C__x"))
1776 C.x.__set__(a, 100)
1777 self.assertEqual(C.x.__get__(a), 100)
1778 C.x.__delete__(a)
1779 self.assertFalse(hasattr(a, "x"))
1780
1781 raw = C.__dict__['x']
Ezio Melottie9615932010-01-24 19:26:24 +00001782 self.assertIsInstance(raw, property)
Georg Brandl479a7e72008-02-05 18:13:15 +00001783
1784 attrs = dir(raw)
Benjamin Peterson577473f2010-01-19 00:09:57 +00001785 self.assertIn("__doc__", attrs)
1786 self.assertIn("fget", attrs)
1787 self.assertIn("fset", attrs)
1788 self.assertIn("fdel", attrs)
Georg Brandl479a7e72008-02-05 18:13:15 +00001789
1790 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001791 self.assertTrue(raw.fget is C.__dict__['getx'])
1792 self.assertTrue(raw.fset is C.__dict__['setx'])
1793 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl479a7e72008-02-05 18:13:15 +00001794
1795 for attr in "__doc__", "fget", "fset", "fdel":
1796 try:
1797 setattr(raw, attr, 42)
1798 except AttributeError as msg:
1799 if str(msg).find('readonly') < 0:
1800 self.fail("when setting readonly attr %r on a property, "
1801 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1802 else:
1803 self.fail("expected AttributeError from trying to set readonly %r "
1804 "attr on a property" % attr)
1805
1806 class D(object):
1807 __getitem__ = property(lambda s: 1/0)
1808
1809 d = D()
1810 try:
1811 for i in d:
1812 str(i)
1813 except ZeroDivisionError:
1814 pass
1815 else:
1816 self.fail("expected ZeroDivisionError from bad property")
1817
R. David Murray378c0cf2010-02-24 01:46:21 +00001818 @unittest.skipIf(sys.flags.optimize >= 2,
1819 "Docstrings are omitted with -O2 and above")
1820 def test_properties_doc_attrib(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001821 class E(object):
1822 def getter(self):
1823 "getter method"
1824 return 0
1825 def setter(self_, value):
1826 "setter method"
1827 pass
1828 prop = property(getter)
1829 self.assertEqual(prop.__doc__, "getter method")
1830 prop2 = property(fset=setter)
1831 self.assertEqual(prop2.__doc__, None)
1832
R. David Murray378c0cf2010-02-24 01:46:21 +00001833 def test_testcapi_no_segfault(self):
Georg Brandl479a7e72008-02-05 18:13:15 +00001834 # this segfaulted in 2.5b2
1835 try:
1836 import _testcapi
1837 except ImportError:
1838 pass
1839 else:
1840 class X(object):
1841 p = property(_testcapi.test_with_docstring)
1842
1843 def test_properties_plus(self):
1844 class C(object):
1845 foo = property(doc="hello")
1846 @foo.getter
1847 def foo(self):
1848 return self._foo
1849 @foo.setter
1850 def foo(self, value):
1851 self._foo = abs(value)
1852 @foo.deleter
1853 def foo(self):
1854 del self._foo
1855 c = C()
1856 self.assertEqual(C.foo.__doc__, "hello")
1857 self.assertFalse(hasattr(c, "foo"))
1858 c.foo = -42
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001859 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl479a7e72008-02-05 18:13:15 +00001860 self.assertEqual(c._foo, 42)
1861 self.assertEqual(c.foo, 42)
1862 del c.foo
1863 self.assertFalse(hasattr(c, '_foo'))
1864 self.assertFalse(hasattr(c, "foo"))
1865
1866 class D(C):
1867 @C.foo.deleter
1868 def foo(self):
1869 try:
1870 del self._foo
1871 except AttributeError:
1872 pass
1873 d = D()
1874 d.foo = 24
1875 self.assertEqual(d.foo, 24)
1876 del d.foo
1877 del d.foo
1878
1879 class E(object):
1880 @property
1881 def foo(self):
1882 return self._foo
1883 @foo.setter
1884 def foo(self, value):
1885 raise RuntimeError
1886 @foo.setter
1887 def foo(self, value):
1888 self._foo = abs(value)
1889 @foo.deleter
1890 def foo(self, value=None):
1891 del self._foo
1892
1893 e = E()
1894 e.foo = -42
1895 self.assertEqual(e.foo, 42)
1896 del e.foo
1897
1898 class F(E):
1899 @E.foo.deleter
1900 def foo(self):
1901 del self._foo
1902 @foo.setter
1903 def foo(self, value):
1904 self._foo = max(0, value)
1905 f = F()
1906 f.foo = -10
1907 self.assertEqual(f.foo, 0)
1908 del f.foo
1909
1910 def test_dict_constructors(self):
1911 # Testing dict constructor ...
1912 d = dict()
1913 self.assertEqual(d, {})
1914 d = dict({})
1915 self.assertEqual(d, {})
1916 d = dict({1: 2, 'a': 'b'})
1917 self.assertEqual(d, {1: 2, 'a': 'b'})
1918 self.assertEqual(d, dict(list(d.items())))
1919 self.assertEqual(d, dict(iter(d.items())))
1920 d = dict({'one':1, 'two':2})
1921 self.assertEqual(d, dict(one=1, two=2))
1922 self.assertEqual(d, dict(**d))
1923 self.assertEqual(d, dict({"one": 1}, two=2))
1924 self.assertEqual(d, dict([("two", 2)], one=1))
1925 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1926 self.assertEqual(d, dict(**d))
1927
1928 for badarg in 0, 0, 0j, "0", [0], (0,):
1929 try:
1930 dict(badarg)
1931 except TypeError:
1932 pass
1933 except ValueError:
1934 if badarg == "0":
1935 # It's a sequence, and its elements are also sequences (gotta
1936 # love strings <wink>), but they aren't of length 2, so this
1937 # one seemed better as a ValueError than a TypeError.
1938 pass
1939 else:
1940 self.fail("no TypeError from dict(%r)" % badarg)
1941 else:
1942 self.fail("no TypeError from dict(%r)" % badarg)
1943
1944 try:
1945 dict({}, {})
1946 except TypeError:
1947 pass
1948 else:
1949 self.fail("no TypeError from dict({}, {})")
1950
1951 class Mapping:
1952 # Lacks a .keys() method; will be added later.
1953 dict = {1:2, 3:4, 'a':1j}
1954
1955 try:
1956 dict(Mapping())
1957 except TypeError:
1958 pass
1959 else:
1960 self.fail("no TypeError from dict(incomplete mapping)")
1961
1962 Mapping.keys = lambda self: list(self.dict.keys())
1963 Mapping.__getitem__ = lambda self, i: self.dict[i]
1964 d = dict(Mapping())
1965 self.assertEqual(d, Mapping.dict)
1966
1967 # Init from sequence of iterable objects, each producing a 2-sequence.
1968 class AddressBookEntry:
1969 def __init__(self, first, last):
1970 self.first = first
1971 self.last = last
1972 def __iter__(self):
1973 return iter([self.first, self.last])
1974
1975 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1976 AddressBookEntry('Barry', 'Peters'),
1977 AddressBookEntry('Tim', 'Peters'),
1978 AddressBookEntry('Barry', 'Warsaw')])
1979 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1980
1981 d = dict(zip(range(4), range(1, 5)))
1982 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1983
1984 # Bad sequence lengths.
1985 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1986 try:
1987 dict(bad)
1988 except ValueError:
1989 pass
1990 else:
1991 self.fail("no ValueError from dict(%r)" % bad)
1992
1993 def test_dir(self):
1994 # Testing dir() ...
1995 junk = 12
1996 self.assertEqual(dir(), ['junk', 'self'])
1997 del junk
1998
1999 # Just make sure these don't blow up!
2000 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
2001 dir(arg)
2002
2003 # Test dir on new-style classes. Since these have object as a
2004 # base class, a lot more gets sucked in.
2005 def interesting(strings):
2006 return [s for s in strings if not s.startswith('_')]
2007
2008 class C(object):
2009 Cdata = 1
2010 def Cmethod(self): pass
2011
2012 cstuff = ['Cdata', 'Cmethod']
2013 self.assertEqual(interesting(dir(C)), cstuff)
2014
2015 c = C()
2016 self.assertEqual(interesting(dir(c)), cstuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002017 ## self.assertIn('__self__', dir(C.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002018
2019 c.cdata = 2
2020 c.cmethod = lambda self: 0
2021 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002022 ## self.assertIn('__self__', dir(c.Cmethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002023
2024 class A(C):
2025 Adata = 1
2026 def Amethod(self): pass
2027
2028 astuff = ['Adata', 'Amethod'] + cstuff
2029 self.assertEqual(interesting(dir(A)), astuff)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002030 ## self.assertIn('__self__', dir(A.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002031 a = A()
2032 self.assertEqual(interesting(dir(a)), astuff)
2033 a.adata = 42
2034 a.amethod = lambda self: 3
2035 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Benjamin Peterson577473f2010-01-19 00:09:57 +00002036 ## self.assertIn('__self__', dir(a.Amethod))
Georg Brandl479a7e72008-02-05 18:13:15 +00002037
2038 # Try a module subclass.
Georg Brandl479a7e72008-02-05 18:13:15 +00002039 class M(type(sys)):
2040 pass
2041 minstance = M("m")
2042 minstance.b = 2
2043 minstance.a = 1
2044 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2045 self.assertEqual(names, ['a', 'b'])
2046
2047 class M2(M):
2048 def getdict(self):
2049 return "Not a dict!"
2050 __dict__ = property(getdict)
2051
2052 m2instance = M2("m2")
2053 m2instance.b = 2
2054 m2instance.a = 1
2055 self.assertEqual(m2instance.__dict__, "Not a dict!")
2056 try:
2057 dir(m2instance)
2058 except TypeError:
2059 pass
2060
2061 # Two essentially featureless objects, just inheriting stuff from
2062 # object.
Benjamin Petersone549ead2009-03-28 21:42:05 +00002063 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2064 if support.check_impl_detail():
2065 # None differs in PyPy: it has a __nonzero__
2066 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl479a7e72008-02-05 18:13:15 +00002067
2068 # Nasty test case for proxied objects
2069 class Wrapper(object):
2070 def __init__(self, obj):
2071 self.__obj = obj
2072 def __repr__(self):
2073 return "Wrapper(%s)" % repr(self.__obj)
2074 def __getitem__(self, key):
2075 return Wrapper(self.__obj[key])
2076 def __len__(self):
2077 return len(self.__obj)
2078 def __getattr__(self, name):
2079 return Wrapper(getattr(self.__obj, name))
2080
2081 class C(object):
2082 def __getclass(self):
2083 return Wrapper(type(self))
2084 __class__ = property(__getclass)
2085
2086 dir(C()) # This used to segfault
2087
2088 def test_supers(self):
2089 # Testing super...
2090
2091 class A(object):
2092 def meth(self, a):
2093 return "A(%r)" % a
2094
2095 self.assertEqual(A().meth(1), "A(1)")
2096
2097 class B(A):
2098 def __init__(self):
2099 self.__super = super(B, self)
2100 def meth(self, a):
2101 return "B(%r)" % a + self.__super.meth(a)
2102
2103 self.assertEqual(B().meth(2), "B(2)A(2)")
2104
2105 class C(A):
2106 def meth(self, a):
2107 return "C(%r)" % a + self.__super.meth(a)
2108 C._C__super = super(C)
2109
2110 self.assertEqual(C().meth(3), "C(3)A(3)")
2111
2112 class D(C, B):
2113 def meth(self, a):
2114 return "D(%r)" % a + super(D, self).meth(a)
2115
2116 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2117
2118 # Test for subclassing super
2119
2120 class mysuper(super):
2121 def __init__(self, *args):
2122 return super(mysuper, self).__init__(*args)
2123
2124 class E(D):
2125 def meth(self, a):
2126 return "E(%r)" % a + mysuper(E, self).meth(a)
2127
2128 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2129
2130 class F(E):
2131 def meth(self, a):
2132 s = self.__super # == mysuper(F, self)
2133 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2134 F._F__super = mysuper(F)
2135
2136 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2137
2138 # Make sure certain errors are raised
2139
2140 try:
2141 super(D, 42)
2142 except TypeError:
2143 pass
2144 else:
2145 self.fail("shouldn't allow super(D, 42)")
2146
2147 try:
2148 super(D, C())
2149 except TypeError:
2150 pass
2151 else:
2152 self.fail("shouldn't allow super(D, C())")
2153
2154 try:
2155 super(D).__get__(12)
2156 except TypeError:
2157 pass
2158 else:
2159 self.fail("shouldn't allow super(D).__get__(12)")
2160
2161 try:
2162 super(D).__get__(C())
2163 except TypeError:
2164 pass
2165 else:
2166 self.fail("shouldn't allow super(D).__get__(C())")
2167
2168 # Make sure data descriptors can be overridden and accessed via super
2169 # (new feature in Python 2.3)
2170
2171 class DDbase(object):
2172 def getx(self): return 42
2173 x = property(getx)
2174
2175 class DDsub(DDbase):
2176 def getx(self): return "hello"
2177 x = property(getx)
2178
2179 dd = DDsub()
2180 self.assertEqual(dd.x, "hello")
2181 self.assertEqual(super(DDsub, dd).x, 42)
2182
2183 # Ensure that super() lookup of descriptor from classmethod
2184 # works (SF ID# 743627)
2185
2186 class Base(object):
2187 aProp = property(lambda self: "foo")
2188
2189 class Sub(Base):
2190 @classmethod
2191 def test(klass):
2192 return super(Sub,klass).aProp
2193
2194 self.assertEqual(Sub.test(), Base.aProp)
2195
2196 # Verify that super() doesn't allow keyword args
2197 try:
2198 super(Base, kw=1)
2199 except TypeError:
2200 pass
2201 else:
2202 self.assertEqual("super shouldn't accept keyword args")
2203
2204 def test_basic_inheritance(self):
2205 # Testing inheritance from basic types...
2206
2207 class hexint(int):
2208 def __repr__(self):
2209 return hex(self)
2210 def __add__(self, other):
2211 return hexint(int.__add__(self, other))
2212 # (Note that overriding __radd__ doesn't work,
2213 # because the int type gets first dibs.)
2214 self.assertEqual(repr(hexint(7) + 9), "0x10")
2215 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2216 a = hexint(12345)
2217 self.assertEqual(a, 12345)
2218 self.assertEqual(int(a), 12345)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002219 self.assertTrue(int(a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002220 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002221 self.assertTrue((+a).__class__ is int)
2222 self.assertTrue((a >> 0).__class__ is int)
2223 self.assertTrue((a << 0).__class__ is int)
2224 self.assertTrue((hexint(0) << 12).__class__ is int)
2225 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002226
2227 class octlong(int):
2228 __slots__ = []
2229 def __str__(self):
Mark Dickinson5c2db372009-12-05 20:28:34 +00002230 return oct(self)
Georg Brandl479a7e72008-02-05 18:13:15 +00002231 def __add__(self, other):
2232 return self.__class__(super(octlong, self).__add__(other))
2233 __radd__ = __add__
2234 self.assertEqual(str(octlong(3) + 5), "0o10")
2235 # (Note that overriding __radd__ here only seems to work
2236 # because the example uses a short int left argument.)
2237 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2238 a = octlong(12345)
2239 self.assertEqual(a, 12345)
2240 self.assertEqual(int(a), 12345)
2241 self.assertEqual(hash(a), hash(12345))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002242 self.assertTrue(int(a).__class__ is int)
2243 self.assertTrue((+a).__class__ is int)
2244 self.assertTrue((-a).__class__ is int)
2245 self.assertTrue((-octlong(0)).__class__ is int)
2246 self.assertTrue((a >> 0).__class__ is int)
2247 self.assertTrue((a << 0).__class__ is int)
2248 self.assertTrue((a - 0).__class__ is int)
2249 self.assertTrue((a * 1).__class__ is int)
2250 self.assertTrue((a ** 1).__class__ is int)
2251 self.assertTrue((a // 1).__class__ is int)
2252 self.assertTrue((1 * a).__class__ is int)
2253 self.assertTrue((a | 0).__class__ is int)
2254 self.assertTrue((a ^ 0).__class__ is int)
2255 self.assertTrue((a & -1).__class__ is int)
2256 self.assertTrue((octlong(0) << 12).__class__ is int)
2257 self.assertTrue((octlong(0) >> 12).__class__ is int)
2258 self.assertTrue(abs(octlong(0)).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002259
2260 # Because octlong overrides __add__, we can't check the absence of +0
2261 # optimizations using octlong.
2262 class longclone(int):
2263 pass
2264 a = longclone(1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002265 self.assertTrue((a + 0).__class__ is int)
2266 self.assertTrue((0 + a).__class__ is int)
Georg Brandl479a7e72008-02-05 18:13:15 +00002267
2268 # Check that negative clones don't segfault
2269 a = longclone(-1)
2270 self.assertEqual(a.__dict__, {})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002271 self.assertEqual(int(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl479a7e72008-02-05 18:13:15 +00002272
2273 class precfloat(float):
2274 __slots__ = ['prec']
2275 def __init__(self, value=0.0, prec=12):
2276 self.prec = int(prec)
2277 def __repr__(self):
2278 return "%.*g" % (self.prec, self)
2279 self.assertEqual(repr(precfloat(1.1)), "1.1")
2280 a = precfloat(12345)
2281 self.assertEqual(a, 12345.0)
2282 self.assertEqual(float(a), 12345.0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002283 self.assertTrue(float(a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002284 self.assertEqual(hash(a), hash(12345.0))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002285 self.assertTrue((+a).__class__ is float)
Georg Brandl479a7e72008-02-05 18:13:15 +00002286
2287 class madcomplex(complex):
2288 def __repr__(self):
2289 return "%.17gj%+.17g" % (self.imag, self.real)
2290 a = madcomplex(-3, 4)
2291 self.assertEqual(repr(a), "4j-3")
2292 base = complex(-3, 4)
2293 self.assertEqual(base.__class__, complex)
2294 self.assertEqual(a, base)
2295 self.assertEqual(complex(a), base)
2296 self.assertEqual(complex(a).__class__, complex)
2297 a = madcomplex(a) # just trying another form of the constructor
2298 self.assertEqual(repr(a), "4j-3")
2299 self.assertEqual(a, base)
2300 self.assertEqual(complex(a), base)
2301 self.assertEqual(complex(a).__class__, complex)
2302 self.assertEqual(hash(a), hash(base))
2303 self.assertEqual((+a).__class__, complex)
2304 self.assertEqual((a + 0).__class__, complex)
2305 self.assertEqual(a + 0, base)
2306 self.assertEqual((a - 0).__class__, complex)
2307 self.assertEqual(a - 0, base)
2308 self.assertEqual((a * 1).__class__, complex)
2309 self.assertEqual(a * 1, base)
2310 self.assertEqual((a / 1).__class__, complex)
2311 self.assertEqual(a / 1, base)
2312
2313 class madtuple(tuple):
2314 _rev = None
2315 def rev(self):
2316 if self._rev is not None:
2317 return self._rev
2318 L = list(self)
2319 L.reverse()
2320 self._rev = self.__class__(L)
2321 return self._rev
2322 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2323 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2324 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2325 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2326 for i in range(512):
2327 t = madtuple(range(i))
2328 u = t.rev()
2329 v = u.rev()
2330 self.assertEqual(v, t)
2331 a = madtuple((1,2,3,4,5))
2332 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002333 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002334 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002335 self.assertTrue(a[:].__class__ is tuple)
2336 self.assertTrue((a * 1).__class__ is tuple)
2337 self.assertTrue((a * 0).__class__ is tuple)
2338 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002339 a = madtuple(())
2340 self.assertEqual(tuple(a), ())
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002341 self.assertTrue(tuple(a).__class__ is tuple)
2342 self.assertTrue((a + a).__class__ is tuple)
2343 self.assertTrue((a * 0).__class__ is tuple)
2344 self.assertTrue((a * 1).__class__ is tuple)
2345 self.assertTrue((a * 2).__class__ is tuple)
2346 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl479a7e72008-02-05 18:13:15 +00002347
2348 class madstring(str):
2349 _rev = None
2350 def rev(self):
2351 if self._rev is not None:
2352 return self._rev
2353 L = list(self)
2354 L.reverse()
2355 self._rev = self.__class__("".join(L))
2356 return self._rev
2357 s = madstring("abcdefghijklmnopqrstuvwxyz")
2358 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2359 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2360 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2361 for i in range(256):
2362 s = madstring("".join(map(chr, range(i))))
2363 t = s.rev()
2364 u = t.rev()
2365 self.assertEqual(u, s)
2366 s = madstring("12345")
2367 self.assertEqual(str(s), "12345")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002368 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002369
2370 base = "\x00" * 5
2371 s = madstring(base)
2372 self.assertEqual(s, base)
2373 self.assertEqual(str(s), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002374 self.assertTrue(str(s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002375 self.assertEqual(hash(s), hash(base))
2376 self.assertEqual({s: 1}[base], 1)
2377 self.assertEqual({base: 1}[s], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002378 self.assertTrue((s + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002379 self.assertEqual(s + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002380 self.assertTrue(("" + s).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002381 self.assertEqual("" + s, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002382 self.assertTrue((s * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002383 self.assertEqual(s * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002384 self.assertTrue((s * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002385 self.assertEqual(s * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002386 self.assertTrue((s * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002387 self.assertEqual(s * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002388 self.assertTrue(s[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002389 self.assertEqual(s[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002390 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002391 self.assertEqual(s[0:0], "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002392 self.assertTrue(s.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002393 self.assertEqual(s.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002394 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002395 self.assertEqual(s.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002396 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002397 self.assertEqual(s.rstrip(), base)
2398 identitytab = {}
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002399 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002400 self.assertEqual(s.translate(identitytab), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002401 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002402 self.assertEqual(s.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002403 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002404 self.assertEqual(s.ljust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002405 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002406 self.assertEqual(s.rjust(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002407 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002408 self.assertEqual(s.center(len(s)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002409 self.assertTrue(s.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002410 self.assertEqual(s.lower(), base)
2411
2412 class madunicode(str):
2413 _rev = None
2414 def rev(self):
2415 if self._rev is not None:
2416 return self._rev
2417 L = list(self)
2418 L.reverse()
2419 self._rev = self.__class__("".join(L))
2420 return self._rev
2421 u = madunicode("ABCDEF")
2422 self.assertEqual(u, "ABCDEF")
2423 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2424 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2425 base = "12345"
2426 u = madunicode(base)
2427 self.assertEqual(str(u), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002428 self.assertTrue(str(u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002429 self.assertEqual(hash(u), hash(base))
2430 self.assertEqual({u: 1}[base], 1)
2431 self.assertEqual({base: 1}[u], 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002432 self.assertTrue(u.strip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002433 self.assertEqual(u.strip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002434 self.assertTrue(u.lstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002435 self.assertEqual(u.lstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002436 self.assertTrue(u.rstrip().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002437 self.assertEqual(u.rstrip(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002438 self.assertTrue(u.replace("x", "x").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002439 self.assertEqual(u.replace("x", "x"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002440 self.assertTrue(u.replace("xy", "xy").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002441 self.assertEqual(u.replace("xy", "xy"), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002442 self.assertTrue(u.center(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002443 self.assertEqual(u.center(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002444 self.assertTrue(u.ljust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002445 self.assertEqual(u.ljust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002446 self.assertTrue(u.rjust(len(u)).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002447 self.assertEqual(u.rjust(len(u)), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002448 self.assertTrue(u.lower().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002449 self.assertEqual(u.lower(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002450 self.assertTrue(u.upper().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002451 self.assertEqual(u.upper(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002452 self.assertTrue(u.capitalize().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002453 self.assertEqual(u.capitalize(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002454 self.assertTrue(u.title().__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002455 self.assertEqual(u.title(), base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002456 self.assertTrue((u + "").__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002457 self.assertEqual(u + "", base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002458 self.assertTrue(("" + u).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002459 self.assertEqual("" + u, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002460 self.assertTrue((u * 0).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002461 self.assertEqual(u * 0, "")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002462 self.assertTrue((u * 1).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002463 self.assertEqual(u * 1, base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002464 self.assertTrue((u * 2).__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002465 self.assertEqual(u * 2, base + base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002466 self.assertTrue(u[:].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002467 self.assertEqual(u[:], base)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002468 self.assertTrue(u[0:0].__class__ is str)
Georg Brandl479a7e72008-02-05 18:13:15 +00002469 self.assertEqual(u[0:0], "")
2470
2471 class sublist(list):
2472 pass
2473 a = sublist(range(5))
2474 self.assertEqual(a, list(range(5)))
2475 a.append("hello")
2476 self.assertEqual(a, list(range(5)) + ["hello"])
2477 a[5] = 5
2478 self.assertEqual(a, list(range(6)))
2479 a.extend(range(6, 20))
2480 self.assertEqual(a, list(range(20)))
2481 a[-5:] = []
2482 self.assertEqual(a, list(range(15)))
2483 del a[10:15]
2484 self.assertEqual(len(a), 10)
2485 self.assertEqual(a, list(range(10)))
2486 self.assertEqual(list(a), list(range(10)))
2487 self.assertEqual(a[0], 0)
2488 self.assertEqual(a[9], 9)
2489 self.assertEqual(a[-10], 0)
2490 self.assertEqual(a[-1], 9)
2491 self.assertEqual(a[:5], list(range(5)))
2492
2493 ## class CountedInput(file):
2494 ## """Counts lines read by self.readline().
2495 ##
2496 ## self.lineno is the 0-based ordinal of the last line read, up to
2497 ## a maximum of one greater than the number of lines in the file.
2498 ##
2499 ## self.ateof is true if and only if the final "" line has been read,
2500 ## at which point self.lineno stops incrementing, and further calls
2501 ## to readline() continue to return "".
2502 ## """
2503 ##
2504 ## lineno = 0
2505 ## ateof = 0
2506 ## def readline(self):
2507 ## if self.ateof:
2508 ## return ""
2509 ## s = file.readline(self)
2510 ## # Next line works too.
2511 ## # s = super(CountedInput, self).readline()
2512 ## self.lineno += 1
2513 ## if s == "":
2514 ## self.ateof = 1
2515 ## return s
2516 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002517 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002518 ## lines = ['a\n', 'b\n', 'c\n']
2519 ## try:
2520 ## f.writelines(lines)
2521 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002522 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002523 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2524 ## got = f.readline()
2525 ## self.assertEqual(expected, got)
2526 ## self.assertEqual(f.lineno, i)
2527 ## self.assertEqual(f.ateof, (i > len(lines)))
2528 ## f.close()
2529 ## finally:
2530 ## try:
2531 ## f.close()
2532 ## except:
2533 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002534 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002535
2536 def test_keywords(self):
2537 # Testing keyword args to basic type constructors ...
2538 self.assertEqual(int(x=1), 1)
2539 self.assertEqual(float(x=2), 2.0)
2540 self.assertEqual(int(x=3), 3)
2541 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2542 self.assertEqual(str(object=500), '500')
2543 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2544 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2545 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2546 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2547
2548 for constructor in (int, float, int, complex, str, str,
2549 tuple, list):
2550 try:
2551 constructor(bogus_keyword_arg=1)
2552 except TypeError:
2553 pass
2554 else:
2555 self.fail("expected TypeError from bogus keyword argument to %r"
2556 % constructor)
2557
2558 def test_str_subclass_as_dict_key(self):
2559 # Testing a str subclass used as dict key ..
2560
2561 class cistr(str):
2562 """Sublcass of str that computes __eq__ case-insensitively.
2563
2564 Also computes a hash code of the string in canonical form.
2565 """
2566
2567 def __init__(self, value):
2568 self.canonical = value.lower()
2569 self.hashcode = hash(self.canonical)
2570
2571 def __eq__(self, other):
2572 if not isinstance(other, cistr):
2573 other = cistr(other)
2574 return self.canonical == other.canonical
2575
2576 def __hash__(self):
2577 return self.hashcode
2578
2579 self.assertEqual(cistr('ABC'), 'abc')
2580 self.assertEqual('aBc', cistr('ABC'))
2581 self.assertEqual(str(cistr('ABC')), 'ABC')
2582
2583 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2584 self.assertEqual(d[cistr('one')], 1)
2585 self.assertEqual(d[cistr('tWo')], 2)
2586 self.assertEqual(d[cistr('THrEE')], 3)
Benjamin Peterson577473f2010-01-19 00:09:57 +00002587 self.assertIn(cistr('ONe'), d)
Georg Brandl479a7e72008-02-05 18:13:15 +00002588 self.assertEqual(d.get(cistr('thrEE')), 3)
2589
2590 def test_classic_comparisons(self):
2591 # Testing classic comparisons...
2592 class classic:
2593 pass
2594
2595 for base in (classic, int, object):
2596 class C(base):
2597 def __init__(self, value):
2598 self.value = int(value)
2599 def __eq__(self, other):
2600 if isinstance(other, C):
2601 return self.value == other.value
2602 if isinstance(other, int) or isinstance(other, int):
2603 return self.value == other
2604 return NotImplemented
2605 def __ne__(self, other):
2606 if isinstance(other, C):
2607 return self.value != other.value
2608 if isinstance(other, int) or isinstance(other, int):
2609 return self.value != other
2610 return NotImplemented
2611 def __lt__(self, other):
2612 if isinstance(other, C):
2613 return self.value < other.value
2614 if isinstance(other, int) or isinstance(other, int):
2615 return self.value < other
2616 return NotImplemented
2617 def __le__(self, other):
2618 if isinstance(other, C):
2619 return self.value <= other.value
2620 if isinstance(other, int) or isinstance(other, int):
2621 return self.value <= other
2622 return NotImplemented
2623 def __gt__(self, other):
2624 if isinstance(other, C):
2625 return self.value > other.value
2626 if isinstance(other, int) or isinstance(other, int):
2627 return self.value > other
2628 return NotImplemented
2629 def __ge__(self, other):
2630 if isinstance(other, C):
2631 return self.value >= other.value
2632 if isinstance(other, int) or isinstance(other, int):
2633 return self.value >= other
2634 return NotImplemented
2635
2636 c1 = C(1)
2637 c2 = C(2)
2638 c3 = C(3)
2639 self.assertEqual(c1, 1)
2640 c = {1: c1, 2: c2, 3: c3}
2641 for x in 1, 2, 3:
2642 for y in 1, 2, 3:
Georg Brandl479a7e72008-02-05 18:13:15 +00002643 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002644 self.assertTrue(eval("c[x] %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002645 eval("x %s y" % op),
2646 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002647 self.assertTrue(eval("c[x] %s y" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002648 eval("x %s y" % op),
2649 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002650 self.assertTrue(eval("x %s c[y]" % op) ==
Mark Dickinsona56c4672009-01-27 18:17:45 +00002651 eval("x %s y" % op),
2652 "x=%d, y=%d" % (x, y))
Georg Brandl479a7e72008-02-05 18:13:15 +00002653
2654 def test_rich_comparisons(self):
2655 # Testing rich comparisons...
2656 class Z(complex):
2657 pass
2658 z = Z(1)
2659 self.assertEqual(z, 1+0j)
2660 self.assertEqual(1+0j, z)
2661 class ZZ(complex):
2662 def __eq__(self, other):
2663 try:
2664 return abs(self - other) <= 1e-6
2665 except:
2666 return NotImplemented
2667 zz = ZZ(1.0000003)
2668 self.assertEqual(zz, 1+0j)
2669 self.assertEqual(1+0j, zz)
2670
2671 class classic:
2672 pass
2673 for base in (classic, int, object, list):
2674 class C(base):
2675 def __init__(self, value):
2676 self.value = int(value)
2677 def __cmp__(self_, other):
2678 self.fail("shouldn't call __cmp__")
2679 def __eq__(self, other):
2680 if isinstance(other, C):
2681 return self.value == other.value
2682 if isinstance(other, int) or isinstance(other, int):
2683 return self.value == other
2684 return NotImplemented
2685 def __ne__(self, other):
2686 if isinstance(other, C):
2687 return self.value != other.value
2688 if isinstance(other, int) or isinstance(other, int):
2689 return self.value != other
2690 return NotImplemented
2691 def __lt__(self, other):
2692 if isinstance(other, C):
2693 return self.value < other.value
2694 if isinstance(other, int) or isinstance(other, int):
2695 return self.value < other
2696 return NotImplemented
2697 def __le__(self, other):
2698 if isinstance(other, C):
2699 return self.value <= other.value
2700 if isinstance(other, int) or isinstance(other, int):
2701 return self.value <= other
2702 return NotImplemented
2703 def __gt__(self, other):
2704 if isinstance(other, C):
2705 return self.value > other.value
2706 if isinstance(other, int) or isinstance(other, int):
2707 return self.value > other
2708 return NotImplemented
2709 def __ge__(self, other):
2710 if isinstance(other, C):
2711 return self.value >= other.value
2712 if isinstance(other, int) or isinstance(other, int):
2713 return self.value >= other
2714 return NotImplemented
2715 c1 = C(1)
2716 c2 = C(2)
2717 c3 = C(3)
2718 self.assertEqual(c1, 1)
2719 c = {1: c1, 2: c2, 3: c3}
2720 for x in 1, 2, 3:
2721 for y in 1, 2, 3:
2722 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002723 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002724 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002725 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002726 "x=%d, y=%d" % (x, y))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002727 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl479a7e72008-02-05 18:13:15 +00002728 "x=%d, y=%d" % (x, y))
2729
2730 def test_descrdoc(self):
2731 # Testing descriptor doc strings...
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002732 from _io import FileIO
Georg Brandl479a7e72008-02-05 18:13:15 +00002733 def check(descr, what):
2734 self.assertEqual(descr.__doc__, what)
Benjamin Peterson4fa88fa2009-03-04 00:14:51 +00002735 check(FileIO.closed, "True if the file is closed") # getset descriptor
Georg Brandl479a7e72008-02-05 18:13:15 +00002736 check(complex.real, "the real part of a complex number") # member descriptor
2737
2738 def test_doc_descriptor(self):
2739 # Testing __doc__ descriptor...
2740 # SF bug 542984
2741 class DocDescr(object):
2742 def __get__(self, object, otype):
2743 if object:
2744 object = object.__class__.__name__ + ' instance'
2745 if otype:
2746 otype = otype.__name__
2747 return 'object=%s; type=%s' % (object, otype)
2748 class OldClass:
2749 __doc__ = DocDescr()
2750 class NewClass(object):
2751 __doc__ = DocDescr()
2752 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2753 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2754 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2755 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2756
2757 def test_set_class(self):
2758 # Testing __class__ assignment...
2759 class C(object): pass
2760 class D(object): pass
2761 class E(object): pass
2762 class F(D, E): pass
2763 for cls in C, D, E, F:
2764 for cls2 in C, D, E, F:
2765 x = cls()
2766 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002767 self.assertTrue(x.__class__ is cls2)
Georg Brandl479a7e72008-02-05 18:13:15 +00002768 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002769 self.assertTrue(x.__class__ is cls)
Georg Brandl479a7e72008-02-05 18:13:15 +00002770 def cant(x, C):
2771 try:
2772 x.__class__ = C
2773 except TypeError:
2774 pass
2775 else:
2776 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2777 try:
2778 delattr(x, "__class__")
Benjamin Petersone549ead2009-03-28 21:42:05 +00002779 except (TypeError, AttributeError):
Georg Brandl479a7e72008-02-05 18:13:15 +00002780 pass
2781 else:
2782 self.fail("shouldn't allow del %r.__class__" % x)
2783 cant(C(), list)
2784 cant(list(), C)
2785 cant(C(), 1)
2786 cant(C(), object)
2787 cant(object(), list)
2788 cant(list(), object)
2789 class Int(int): __slots__ = []
2790 cant(2, Int)
2791 cant(Int(), int)
2792 cant(True, int)
2793 cant(2, bool)
2794 o = object()
2795 cant(o, type(1))
2796 cant(o, type(None))
2797 del o
2798 class G(object):
2799 __slots__ = ["a", "b"]
2800 class H(object):
2801 __slots__ = ["b", "a"]
2802 class I(object):
2803 __slots__ = ["a", "b"]
2804 class J(object):
2805 __slots__ = ["c", "b"]
2806 class K(object):
2807 __slots__ = ["a", "b", "d"]
2808 class L(H):
2809 __slots__ = ["e"]
2810 class M(I):
2811 __slots__ = ["e"]
2812 class N(J):
2813 __slots__ = ["__weakref__"]
2814 class P(J):
2815 __slots__ = ["__dict__"]
2816 class Q(J):
2817 pass
2818 class R(J):
2819 __slots__ = ["__dict__", "__weakref__"]
2820
2821 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2822 x = cls()
2823 x.a = 1
2824 x.__class__ = cls2
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002825 self.assertTrue(x.__class__ is cls2,
Georg Brandl479a7e72008-02-05 18:13:15 +00002826 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2827 self.assertEqual(x.a, 1)
2828 x.__class__ = cls
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002829 self.assertTrue(x.__class__ is cls,
Georg Brandl479a7e72008-02-05 18:13:15 +00002830 "assigning %r as __class__ for %r silently failed" % (cls, x))
2831 self.assertEqual(x.a, 1)
2832 for cls in G, J, K, L, M, N, P, R, list, Int:
2833 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2834 if cls is cls2:
2835 continue
2836 cant(cls(), cls2)
2837
Benjamin Peterson193152c2009-04-25 01:08:45 +00002838 # Issue5283: when __class__ changes in __del__, the wrong
2839 # type gets DECREF'd.
2840 class O(object):
2841 pass
2842 class A(object):
2843 def __del__(self):
2844 self.__class__ = O
2845 l = [A() for x in range(100)]
2846 del l
2847
Georg Brandl479a7e72008-02-05 18:13:15 +00002848 def test_set_dict(self):
2849 # Testing __dict__ assignment...
2850 class C(object): pass
2851 a = C()
2852 a.__dict__ = {'b': 1}
2853 self.assertEqual(a.b, 1)
2854 def cant(x, dict):
2855 try:
2856 x.__dict__ = dict
2857 except (AttributeError, TypeError):
2858 pass
2859 else:
2860 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2861 cant(a, None)
2862 cant(a, [])
2863 cant(a, 1)
2864 del a.__dict__ # Deleting __dict__ is allowed
2865
2866 class Base(object):
2867 pass
2868 def verify_dict_readonly(x):
2869 """
2870 x has to be an instance of a class inheriting from Base.
2871 """
2872 cant(x, {})
2873 try:
2874 del x.__dict__
2875 except (AttributeError, TypeError):
2876 pass
2877 else:
2878 self.fail("shouldn't allow del %r.__dict__" % x)
2879 dict_descr = Base.__dict__["__dict__"]
2880 try:
2881 dict_descr.__set__(x, {})
2882 except (AttributeError, TypeError):
2883 pass
2884 else:
2885 self.fail("dict_descr allowed access to %r's dict" % x)
2886
2887 # Classes don't allow __dict__ assignment and have readonly dicts
2888 class Meta1(type, Base):
2889 pass
2890 class Meta2(Base, type):
2891 pass
2892 class D(object, metaclass=Meta1):
2893 pass
2894 class E(object, metaclass=Meta2):
2895 pass
2896 for cls in C, D, E:
2897 verify_dict_readonly(cls)
2898 class_dict = cls.__dict__
2899 try:
2900 class_dict["spam"] = "eggs"
2901 except TypeError:
2902 pass
2903 else:
2904 self.fail("%r's __dict__ can be modified" % cls)
2905
2906 # Modules also disallow __dict__ assignment
2907 class Module1(types.ModuleType, Base):
2908 pass
2909 class Module2(Base, types.ModuleType):
2910 pass
2911 for ModuleType in Module1, Module2:
2912 mod = ModuleType("spam")
2913 verify_dict_readonly(mod)
2914 mod.__dict__["spam"] = "eggs"
2915
2916 # Exception's __dict__ can be replaced, but not deleted
Benjamin Petersone549ead2009-03-28 21:42:05 +00002917 # (at least not any more than regular exception's __dict__ can
2918 # be deleted; on CPython it is not the case, whereas on PyPy they
2919 # can, just like any other new-style instance's __dict__.)
2920 def can_delete_dict(e):
2921 try:
2922 del e.__dict__
2923 except (TypeError, AttributeError):
2924 return False
2925 else:
2926 return True
Georg Brandl479a7e72008-02-05 18:13:15 +00002927 class Exception1(Exception, Base):
2928 pass
2929 class Exception2(Base, Exception):
2930 pass
2931 for ExceptionType in Exception, Exception1, Exception2:
2932 e = ExceptionType()
2933 e.__dict__ = {"a": 1}
2934 self.assertEqual(e.a, 1)
Benjamin Petersone549ead2009-03-28 21:42:05 +00002935 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl479a7e72008-02-05 18:13:15 +00002936
2937 def test_pickles(self):
2938 # Testing pickling and copying new-style classes and objects...
2939 import pickle
2940
2941 def sorteditems(d):
2942 L = list(d.items())
2943 L.sort()
2944 return L
2945
2946 global C
2947 class C(object):
2948 def __init__(self, a, b):
2949 super(C, self).__init__()
2950 self.a = a
2951 self.b = b
2952 def __repr__(self):
2953 return "C(%r, %r)" % (self.a, self.b)
2954
2955 global C1
2956 class C1(list):
2957 def __new__(cls, a, b):
2958 return super(C1, cls).__new__(cls)
2959 def __getnewargs__(self):
2960 return (self.a, self.b)
2961 def __init__(self, a, b):
2962 self.a = a
2963 self.b = b
2964 def __repr__(self):
2965 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2966
2967 global C2
2968 class C2(int):
2969 def __new__(cls, a, b, val=0):
2970 return super(C2, cls).__new__(cls, val)
2971 def __getnewargs__(self):
2972 return (self.a, self.b, int(self))
2973 def __init__(self, a, b, val=0):
2974 self.a = a
2975 self.b = b
2976 def __repr__(self):
2977 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2978
2979 global C3
2980 class C3(object):
2981 def __init__(self, foo):
2982 self.foo = foo
2983 def __getstate__(self):
2984 return self.foo
2985 def __setstate__(self, foo):
2986 self.foo = foo
2987
2988 global C4classic, C4
2989 class C4classic: # classic
2990 pass
2991 class C4(C4classic, object): # mixed inheritance
2992 pass
2993
Guido van Rossum3926a632001-09-25 16:25:58 +00002994 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00002995 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00002996 s = pickle.dumps(cls, bin)
2997 cls2 = pickle.loads(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00002998 self.assertTrue(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00002999
3000 a = C1(1, 2); a.append(42); a.append(24)
3001 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003002 s = pickle.dumps((a, b), bin)
3003 x, y = pickle.loads(s)
3004 self.assertEqual(x.__class__, a.__class__)
3005 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3006 self.assertEqual(y.__class__, b.__class__)
3007 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3008 self.assertEqual(repr(x), repr(a))
3009 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003010 # Test for __getstate__ and __setstate__ on new style class
3011 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00003012 s = pickle.dumps(u, bin)
3013 v = pickle.loads(s)
3014 self.assertEqual(u.__class__, v.__class__)
3015 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00003016 # Test for picklability of hybrid class
3017 u = C4()
3018 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00003019 s = pickle.dumps(u, bin)
3020 v = pickle.loads(s)
3021 self.assertEqual(u.__class__, v.__class__)
3022 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003023
Georg Brandl479a7e72008-02-05 18:13:15 +00003024 # Testing copy.deepcopy()
3025 import copy
3026 for cls in C, C1, C2:
3027 cls2 = copy.deepcopy(cls)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003028 self.assertTrue(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003029
Georg Brandl479a7e72008-02-05 18:13:15 +00003030 a = C1(1, 2); a.append(42); a.append(24)
3031 b = C2("hello", "world", 42)
3032 x, y = copy.deepcopy((a, b))
3033 self.assertEqual(x.__class__, a.__class__)
3034 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3035 self.assertEqual(y.__class__, b.__class__)
3036 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3037 self.assertEqual(repr(x), repr(a))
3038 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003039
Georg Brandl479a7e72008-02-05 18:13:15 +00003040 def test_pickle_slots(self):
3041 # Testing pickling of classes with __slots__ ...
3042 import pickle
3043 # Pickling of classes with __slots__ but without __getstate__ should fail
3044 # (if using protocol 0 or 1)
3045 global B, C, D, E
3046 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00003047 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003048 for base in [object, B]:
3049 class C(base):
3050 __slots__ = ['a']
3051 class D(C):
3052 pass
3053 try:
3054 pickle.dumps(C(), 0)
3055 except TypeError:
3056 pass
3057 else:
3058 self.fail("should fail: pickle C instance - %s" % base)
3059 try:
3060 pickle.dumps(C(), 0)
3061 except TypeError:
3062 pass
3063 else:
3064 self.fail("should fail: pickle D instance - %s" % base)
3065 # Give C a nice generic __getstate__ and __setstate__
3066 class C(base):
3067 __slots__ = ['a']
3068 def __getstate__(self):
3069 try:
3070 d = self.__dict__.copy()
3071 except AttributeError:
3072 d = {}
3073 for cls in self.__class__.__mro__:
3074 for sn in cls.__dict__.get('__slots__', ()):
3075 try:
3076 d[sn] = getattr(self, sn)
3077 except AttributeError:
3078 pass
3079 return d
3080 def __setstate__(self, d):
3081 for k, v in list(d.items()):
3082 setattr(self, k, v)
3083 class D(C):
3084 pass
3085 # Now it should work
3086 x = C()
3087 y = pickle.loads(pickle.dumps(x))
3088 self.assertEqual(hasattr(y, 'a'), 0)
3089 x.a = 42
3090 y = pickle.loads(pickle.dumps(x))
3091 self.assertEqual(y.a, 42)
3092 x = D()
3093 x.a = 42
3094 x.b = 100
3095 y = pickle.loads(pickle.dumps(x))
3096 self.assertEqual(y.a + y.b, 142)
3097 # A subclass that adds a slot should also work
3098 class E(C):
3099 __slots__ = ['b']
3100 x = E()
3101 x.a = 42
3102 x.b = "foo"
3103 y = pickle.loads(pickle.dumps(x))
3104 self.assertEqual(y.a, x.a)
3105 self.assertEqual(y.b, x.b)
3106
3107 def test_binary_operator_override(self):
3108 # Testing overrides of binary operations...
3109 class I(int):
3110 def __repr__(self):
3111 return "I(%r)" % int(self)
3112 def __add__(self, other):
3113 return I(int(self) + int(other))
3114 __radd__ = __add__
3115 def __pow__(self, other, mod=None):
3116 if mod is None:
3117 return I(pow(int(self), int(other)))
3118 else:
3119 return I(pow(int(self), int(other), int(mod)))
3120 def __rpow__(self, other, mod=None):
3121 if mod is None:
3122 return I(pow(int(other), int(self), mod))
3123 else:
3124 return I(pow(int(other), int(self), int(mod)))
3125
3126 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3127 self.assertEqual(repr(I(1) + 2), "I(3)")
3128 self.assertEqual(repr(1 + I(2)), "I(3)")
3129 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3130 self.assertEqual(repr(2 ** I(3)), "I(8)")
3131 self.assertEqual(repr(I(2) ** 3), "I(8)")
3132 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3133 class S(str):
3134 def __eq__(self, other):
3135 return self.lower() == other.lower()
3136
3137 def test_subclass_propagation(self):
3138 # Testing propagation of slot functions to subclasses...
3139 class A(object):
3140 pass
3141 class B(A):
3142 pass
3143 class C(A):
3144 pass
3145 class D(B, C):
3146 pass
3147 d = D()
3148 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3149 A.__hash__ = lambda self: 42
3150 self.assertEqual(hash(d), 42)
3151 C.__hash__ = lambda self: 314
3152 self.assertEqual(hash(d), 314)
3153 B.__hash__ = lambda self: 144
3154 self.assertEqual(hash(d), 144)
3155 D.__hash__ = lambda self: 100
3156 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003157 D.__hash__ = None
3158 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003159 del D.__hash__
3160 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003161 B.__hash__ = None
3162 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003163 del B.__hash__
3164 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003165 C.__hash__ = None
3166 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003167 del C.__hash__
3168 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003169 A.__hash__ = None
3170 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003171 del A.__hash__
3172 self.assertEqual(hash(d), orig_hash)
3173 d.foo = 42
3174 d.bar = 42
3175 self.assertEqual(d.foo, 42)
3176 self.assertEqual(d.bar, 42)
3177 def __getattribute__(self, name):
3178 if name == "foo":
3179 return 24
3180 return object.__getattribute__(self, name)
3181 A.__getattribute__ = __getattribute__
3182 self.assertEqual(d.foo, 24)
3183 self.assertEqual(d.bar, 42)
3184 def __getattr__(self, name):
3185 if name in ("spam", "foo", "bar"):
3186 return "hello"
3187 raise AttributeError(name)
3188 B.__getattr__ = __getattr__
3189 self.assertEqual(d.spam, "hello")
3190 self.assertEqual(d.foo, 24)
3191 self.assertEqual(d.bar, 42)
3192 del A.__getattribute__
3193 self.assertEqual(d.foo, 42)
3194 del d.foo
3195 self.assertEqual(d.foo, "hello")
3196 self.assertEqual(d.bar, 42)
3197 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003198 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003199 d.foo
3200 except AttributeError:
3201 pass
3202 else:
3203 self.fail("d.foo should be undefined now")
3204
3205 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl479a7e72008-02-05 18:13:15 +00003206 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...
Nick Coghlan6ead5522009-10-18 13:19:33 +00003995 test_stdout = sys.stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00003996 class StdoutGuard:
3997 def __getattr__(self, attr):
3998 sys.stdout = sys.__stdout__
3999 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4000 sys.stdout = StdoutGuard()
4001 try:
4002 print("Oops!")
4003 except RuntimeError:
4004 pass
Nick Coghlan6ead5522009-10-18 13:19:33 +00004005 finally:
4006 sys.stdout = test_stdout
Georg Brandl479a7e72008-02-05 18:13:15 +00004007
4008 def test_vicious_descriptor_nonsense(self):
4009 # Testing vicious_descriptor_nonsense...
4010
4011 # A potential segfault spotted by Thomas Wouters in mail to
4012 # python-dev 2003-04-17, turned into an example & fixed by Michael
4013 # Hudson just less than four months later...
4014
4015 class Evil(object):
4016 def __hash__(self):
4017 return hash('attr')
4018 def __eq__(self, other):
4019 del C.attr
4020 return 0
4021
4022 class Descr(object):
4023 def __get__(self, ob, type=None):
4024 return 1
4025
4026 class C(object):
4027 attr = Descr()
4028
4029 c = C()
4030 c.__dict__[Evil()] = 0
4031
4032 self.assertEqual(c.attr, 1)
4033 # this makes a crash more likely:
Benjamin Petersone549ead2009-03-28 21:42:05 +00004034 support.gc_collect()
Georg Brandl479a7e72008-02-05 18:13:15 +00004035 self.assertEqual(hasattr(c, 'attr'), False)
4036
4037 def test_init(self):
4038 # SF 1155938
4039 class Foo(object):
4040 def __init__(self):
4041 return 10
4042 try:
4043 Foo()
4044 except TypeError:
4045 pass
4046 else:
4047 self.fail("did not test __init__() for None return")
4048
4049 def test_method_wrapper(self):
4050 # Testing method-wrapper objects...
4051 # <type 'method-wrapper'> did not support any reflection before 2.5
4052
Mark Dickinson211c6252009-02-01 10:28:51 +00004053 # XXX should methods really support __eq__?
Georg Brandl479a7e72008-02-05 18:13:15 +00004054
4055 l = []
4056 self.assertEqual(l.__add__, l.__add__)
4057 self.assertEqual(l.__add__, [].__add__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004058 self.assertTrue(l.__add__ != [5].__add__)
4059 self.assertTrue(l.__add__ != l.__mul__)
4060 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Petersone549ead2009-03-28 21:42:05 +00004061 if hasattr(l.__add__, '__self__'):
4062 # CPython
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004063 self.assertTrue(l.__add__.__self__ is l)
4064 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Petersone549ead2009-03-28 21:42:05 +00004065 else:
4066 # Python implementations where [].__add__ is a normal bound method
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004067 self.assertTrue(l.__add__.im_self is l)
4068 self.assertTrue(l.__add__.im_class is list)
Georg Brandl479a7e72008-02-05 18:13:15 +00004069 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4070 try:
4071 hash(l.__add__)
4072 except TypeError:
4073 pass
4074 else:
4075 self.fail("no TypeError from hash([].__add__)")
4076
4077 t = ()
4078 t += (7,)
4079 self.assertEqual(t.__add__, (7,).__add__)
4080 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4081
4082 def test_not_implemented(self):
4083 # Testing NotImplemented...
4084 # all binary methods should be able to return a NotImplemented
Georg Brandl479a7e72008-02-05 18:13:15 +00004085 import operator
4086
4087 def specialmethod(self, other):
4088 return NotImplemented
4089
4090 def check(expr, x, y):
4091 try:
4092 exec(expr, {'x': x, 'y': y, 'operator': operator})
4093 except TypeError:
4094 pass
4095 else:
4096 self.fail("no TypeError from %r" % (expr,))
4097
4098 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
4099 # TypeErrors
4100 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
4101 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004102 for name, expr, iexpr in [
4103 ('__add__', 'x + y', 'x += y'),
4104 ('__sub__', 'x - y', 'x -= y'),
4105 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004106 ('__truediv__', 'operator.truediv(x, y)', None),
4107 ('__floordiv__', 'operator.floordiv(x, y)', None),
4108 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00004109 ('__mod__', 'x % y', 'x %= y'),
4110 ('__divmod__', 'divmod(x, y)', None),
4111 ('__pow__', 'x ** y', 'x **= y'),
4112 ('__lshift__', 'x << y', 'x <<= y'),
4113 ('__rshift__', 'x >> y', 'x >>= y'),
4114 ('__and__', 'x & y', 'x &= y'),
4115 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00004116 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00004117 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004118 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004119 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00004120 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004121 check(expr, a, N1)
4122 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00004123 if iexpr:
4124 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004125 check(iexpr, a, N1)
4126 check(iexpr, a, N2)
4127 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00004128 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00004129 c = C()
4130 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00004131 check(iexpr, c, N1)
4132 check(iexpr, c, N2)
4133
Georg Brandl479a7e72008-02-05 18:13:15 +00004134 def test_assign_slice(self):
4135 # ceval.c's assign_slice used to check for
4136 # tp->tp_as_sequence->sq_slice instead of
4137 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00004138
Georg Brandl479a7e72008-02-05 18:13:15 +00004139 class C(object):
4140 def __setitem__(self, idx, value):
4141 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00004142
Georg Brandl479a7e72008-02-05 18:13:15 +00004143 c = C()
4144 c[1:2] = 3
4145 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004146
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +00004147 def test_set_and_no_get(self):
4148 # See
4149 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4150 class Descr(object):
4151
4152 def __init__(self, name):
4153 self.name = name
4154
4155 def __set__(self, obj, value):
4156 obj.__dict__[self.name] = value
4157 descr = Descr("a")
4158
4159 class X(object):
4160 a = descr
4161
4162 x = X()
4163 self.assertIs(x.a, descr)
4164 x.a = 42
4165 self.assertEqual(x.a, 42)
4166
Benjamin Peterson9262b842008-11-17 22:45:50 +00004167 def test_getattr_hooks(self):
4168 # issue 4230
4169
4170 class Descriptor(object):
4171 counter = 0
4172 def __get__(self, obj, objtype=None):
4173 def getter(name):
4174 self.counter += 1
4175 raise AttributeError(name)
4176 return getter
4177
4178 descr = Descriptor()
4179 class A(object):
4180 __getattribute__ = descr
4181 class B(object):
4182 __getattr__ = descr
4183 class C(object):
4184 __getattribute__ = descr
4185 __getattr__ = descr
4186
4187 self.assertRaises(AttributeError, getattr, A(), "attr")
4188 self.assertEquals(descr.counter, 1)
4189 self.assertRaises(AttributeError, getattr, B(), "attr")
4190 self.assertEquals(descr.counter, 2)
4191 self.assertRaises(AttributeError, getattr, C(), "attr")
4192 self.assertEquals(descr.counter, 4)
4193
4194 import gc
4195 class EvilGetattribute(object):
4196 # This used to segfault
4197 def __getattr__(self, name):
4198 raise AttributeError(name)
4199 def __getattribute__(self, name):
4200 del EvilGetattribute.__getattr__
4201 for i in range(5):
4202 gc.collect()
4203 raise AttributeError(name)
4204
4205 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4206
Christian Heimesbbffeb62008-01-24 09:42:52 +00004207
Georg Brandl479a7e72008-02-05 18:13:15 +00004208class DictProxyTests(unittest.TestCase):
4209 def setUp(self):
4210 class C(object):
4211 def meth(self):
4212 pass
4213 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004214
Georg Brandl479a7e72008-02-05 18:13:15 +00004215 def test_iter_keys(self):
4216 # Testing dict-proxy iterkeys...
4217 keys = [ key for key in self.C.__dict__.keys() ]
4218 keys.sort()
4219 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4220 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004221
Georg Brandl479a7e72008-02-05 18:13:15 +00004222 def test_iter_values(self):
4223 # Testing dict-proxy itervalues...
4224 values = [ values for values in self.C.__dict__.values() ]
4225 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004226
Georg Brandl479a7e72008-02-05 18:13:15 +00004227 def test_iter_items(self):
4228 # Testing dict-proxy iteritems...
4229 keys = [ key for (key, value) in self.C.__dict__.items() ]
4230 keys.sort()
4231 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4232 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004233
Georg Brandl479a7e72008-02-05 18:13:15 +00004234 def test_dict_type_with_metaclass(self):
4235 # Testing type of __dict__ when metaclass set...
4236 class B(object):
4237 pass
4238 class M(type):
4239 pass
4240 class C(metaclass=M):
4241 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4242 pass
4243 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004244
Christian Heimesbbffeb62008-01-24 09:42:52 +00004245
Georg Brandl479a7e72008-02-05 18:13:15 +00004246class PTypesLongInitTest(unittest.TestCase):
4247 # This is in its own TestCase so that it can be run before any other tests.
4248 def test_pytype_long_ready(self):
4249 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004250
Georg Brandl479a7e72008-02-05 18:13:15 +00004251 # This dumps core when SF bug 551412 isn't fixed --
4252 # but only when test_descr.py is run separately.
4253 # (That can't be helped -- as soon as PyType_Ready()
4254 # is called for PyLong_Type, the bug is gone.)
4255 class UserLong(object):
4256 def __pow__(self, *args):
4257 pass
4258 try:
4259 pow(0, UserLong(), 0)
4260 except:
4261 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004262
Georg Brandl479a7e72008-02-05 18:13:15 +00004263 # Another segfault only when run early
4264 # (before PyType_Ready(tuple) is called)
4265 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004266
4267
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004268def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004269 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004270 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004271 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004272
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004273if __name__ == "__main__":
4274 test_main()