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