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