blob: e66b550ce4a6a27e614fdaaf06e56724c13b97a6 [file] [log] [blame]
Benjamin Petersond4d400c2009-04-18 20:12:47 +00001import __builtin__
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00002import sys
Armin Rigo9790a272007-05-02 19:23:31 +00003import types
Georg Brandl48545522008-02-02 10:12:36 +00004import unittest
5import warnings
Tim Peters4d9b4662002-04-16 01:59:17 +00006
Georg Brandl48545522008-02-02 10:12:36 +00007from copy import deepcopy
8from test import test_support
Tim Peters6d6c1a32001-08-02 04:15:00 +00009
Guido van Rossum875eeaa2001-10-11 18:33:53 +000010
Georg Brandl48545522008-02-02 10:12:36 +000011class OperatorsTest(unittest.TestCase):
Tim Peters6d6c1a32001-08-02 04:15:00 +000012
Georg Brandl48545522008-02-02 10:12:36 +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 Peters3caca232001-12-06 06:23:26 +000035
Georg Brandl48545522008-02-02 10:12:36 +000036 for name, expr in 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 Peters3caca232001-12-06 06:23:26 +000042
Georg Brandl48545522008-02-02 10:12:36 +000043 self.unops = {
44 'pos': '+',
45 'neg': '-',
46 'abs': 'abs',
47 'invert': '~',
48 'int': 'int',
49 'long': 'long',
50 'float': 'float',
51 'oct': 'oct',
52 'hex': 'hex',
53 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000054
Georg Brandl48545522008-02-02 10:12:36 +000055 for name, expr in self.unops.items():
56 if expr.islower():
57 expr = expr + "(a)"
58 else:
59 expr = '%s a' % expr
60 self.unops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000061
Georg Brandl48545522008-02-02 10:12:36 +000062 def setUp(self):
63 self.original_filters = warnings.filters[:]
64 warnings.filterwarnings("ignore",
65 r'complex divmod\(\), // and % are deprecated$',
66 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000067
Georg Brandl48545522008-02-02 10:12:36 +000068 def tearDown(self):
69 warnings.filters = self.original_filters
Tim Peters6d6c1a32001-08-02 04:15:00 +000070
Georg Brandl48545522008-02-02 10:12:36 +000071 def unop_test(self, a, res, expr="len(a)", meth="__len__"):
72 d = {'a': a}
73 self.assertEqual(eval(expr, d), res)
74 t = type(a)
75 m = getattr(t, meth)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076
Georg Brandl48545522008-02-02 10:12:36 +000077 # Find method in parent class
78 while meth not in t.__dict__:
79 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +000080 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
81 # method object; the getattr() below obtains its underlying function.
82 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +000083 self.assertEqual(m(a), res)
84 bm = getattr(a, meth)
85 self.assertEqual(bm(), res)
Tim Peters2f93e282001-10-04 05:27:00 +000086
Georg Brandl48545522008-02-02 10:12:36 +000087 def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
88 d = {'a': a, 'b': b}
Tim Peters2f93e282001-10-04 05:27:00 +000089
Georg Brandl48545522008-02-02 10:12:36 +000090 # XXX Hack so this passes before 2.3 when -Qnew is specified.
91 if meth == "__div__" and 1/2 == 0.5:
92 meth = "__truediv__"
Tim Peters2f93e282001-10-04 05:27:00 +000093
Georg Brandl48545522008-02-02 10:12:36 +000094 if meth == '__divmod__': pass
Tim Peters2f93e282001-10-04 05:27:00 +000095
Georg Brandl48545522008-02-02 10:12:36 +000096 self.assertEqual(eval(expr, d), res)
97 t = type(a)
98 m = getattr(t, meth)
99 while meth not in t.__dict__:
100 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000101 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
102 # method object; the getattr() below obtains its underlying function.
103 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000104 self.assertEqual(m(a, b), res)
105 bm = getattr(a, meth)
106 self.assertEqual(bm(b), res)
Tim Peters2f93e282001-10-04 05:27:00 +0000107
Georg Brandl48545522008-02-02 10:12:36 +0000108 def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"):
109 d = {'a': a, 'b': b, 'c': c}
110 self.assertEqual(eval(expr, d), res)
111 t = type(a)
112 m = getattr(t, meth)
113 while meth not in t.__dict__:
114 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000115 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
116 # method object; the getattr() below obtains its underlying function.
117 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000118 self.assertEqual(m(a, b, c), res)
119 bm = getattr(a, meth)
120 self.assertEqual(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000121
Georg Brandl48545522008-02-02 10:12:36 +0000122 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
123 d = {'a': deepcopy(a), 'b': b}
124 exec stmt in d
125 self.assertEqual(d['a'], res)
126 t = type(a)
127 m = getattr(t, meth)
128 while meth not in t.__dict__:
129 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000130 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
131 # method object; the getattr() below obtains its underlying function.
132 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000133 d['a'] = deepcopy(a)
134 m(d['a'], b)
135 self.assertEqual(d['a'], res)
136 d['a'] = deepcopy(a)
137 bm = getattr(d['a'], meth)
138 bm(b)
139 self.assertEqual(d['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000140
Georg Brandl48545522008-02-02 10:12:36 +0000141 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
142 d = {'a': deepcopy(a), 'b': b, 'c': c}
143 exec stmt in d
144 self.assertEqual(d['a'], res)
145 t = type(a)
146 m = getattr(t, meth)
147 while meth not in t.__dict__:
148 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000149 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
150 # method object; the getattr() below obtains its underlying function.
151 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000152 d['a'] = deepcopy(a)
153 m(d['a'], b, c)
154 self.assertEqual(d['a'], res)
155 d['a'] = deepcopy(a)
156 bm = getattr(d['a'], meth)
157 bm(b, c)
158 self.assertEqual(d['a'], res)
159
160 def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
161 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
162 exec stmt in dictionary
163 self.assertEqual(dictionary['a'], res)
164 t = type(a)
165 while meth not in t.__dict__:
166 t = t.__bases__[0]
167 m = getattr(t, meth)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000168 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
169 # method object; the getattr() below obtains its underlying function.
170 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000171 dictionary['a'] = deepcopy(a)
172 m(dictionary['a'], b, c, d)
173 self.assertEqual(dictionary['a'], res)
174 dictionary['a'] = deepcopy(a)
175 bm = getattr(dictionary['a'], meth)
176 bm(b, c, d)
177 self.assertEqual(dictionary['a'], res)
178
179 def test_lists(self):
180 # Testing list operations...
181 # Asserts are within individual test methods
182 self.binop_test([1], [2], [1,2], "a+b", "__add__")
183 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
184 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
185 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
186 self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
187 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
188 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
189 self.unop_test([1,2,3], 3, "len(a)", "__len__")
190 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
191 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
192 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
193 self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
194 "__setslice__")
195
196 def test_dicts(self):
197 # Testing dict operations...
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000198 if hasattr(dict, '__cmp__'): # PyPy has only rich comparison on dicts
199 self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
200 else:
201 self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__")
Georg Brandl48545522008-02-02 10:12:36 +0000202 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
203 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
204 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
205
206 d = {1:2, 3:4}
207 l1 = []
208 for i in d.keys():
209 l1.append(i)
210 l = []
211 for i in iter(d):
212 l.append(i)
213 self.assertEqual(l, l1)
214 l = []
215 for i in d.__iter__():
216 l.append(i)
217 self.assertEqual(l, l1)
218 l = []
219 for i in dict.__iter__(d):
220 l.append(i)
221 self.assertEqual(l, l1)
222 d = {1:2, 3:4}
223 self.unop_test(d, 2, "len(a)", "__len__")
224 self.assertEqual(eval(repr(d), {}), d)
225 self.assertEqual(eval(d.__repr__(), {}), d)
226 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
227 "__setitem__")
228
229 # Tests for unary and binary operators
230 def number_operators(self, a, b, skip=[]):
231 dict = {'a': a, 'b': b}
232
233 for name, expr in self.binops.items():
234 if name not in skip:
235 name = "__%s__" % name
236 if hasattr(a, name):
237 res = eval(expr, dict)
238 self.binop_test(a, b, res, expr, name)
239
240 for name, expr in self.unops.items():
241 if name not in skip:
242 name = "__%s__" % name
243 if hasattr(a, name):
244 res = eval(expr, dict)
245 self.unop_test(a, res, expr, name)
246
247 def test_ints(self):
248 # Testing int operations...
249 self.number_operators(100, 3)
250 # The following crashes in Python 2.2
251 self.assertEqual((1).__nonzero__(), 1)
252 self.assertEqual((0).__nonzero__(), 0)
253 # This returns 'NotImplemented' in Python 2.2
254 class C(int):
255 def __add__(self, other):
256 return NotImplemented
257 self.assertEqual(C(5L), 5)
Tim Peters25786c02001-09-02 08:22:48 +0000258 try:
Georg Brandl48545522008-02-02 10:12:36 +0000259 C() + ""
Tim Peters25786c02001-09-02 08:22:48 +0000260 except TypeError:
261 pass
262 else:
Georg Brandl48545522008-02-02 10:12:36 +0000263 self.fail("NotImplemented should have caused TypeError")
264 import sys
Tim Peters1fc240e2001-10-26 05:06:50 +0000265 try:
Georg Brandl48545522008-02-02 10:12:36 +0000266 C(sys.maxint+1)
267 except OverflowError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000268 pass
269 else:
Georg Brandl48545522008-02-02 10:12:36 +0000270 self.fail("should have raised OverflowError")
Tim Peters1fc240e2001-10-26 05:06:50 +0000271
Georg Brandl48545522008-02-02 10:12:36 +0000272 def test_longs(self):
273 # Testing long operations...
274 self.number_operators(100L, 3L)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275
Georg Brandl48545522008-02-02 10:12:36 +0000276 def test_floats(self):
277 # Testing float operations...
278 self.number_operators(100.0, 3.0)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000279
Georg Brandl48545522008-02-02 10:12:36 +0000280 def test_complexes(self):
281 # Testing complex operations...
282 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
283 'int', 'long', 'float'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000284
Georg Brandl48545522008-02-02 10:12:36 +0000285 class Number(complex):
286 __slots__ = ['prec']
287 def __new__(cls, *args, **kwds):
288 result = complex.__new__(cls, *args)
289 result.prec = kwds.get('prec', 12)
290 return result
291 def __repr__(self):
292 prec = self.prec
293 if self.imag == 0.0:
294 return "%.*g" % (prec, self.real)
295 if self.real == 0.0:
296 return "%.*gj" % (prec, self.imag)
297 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
298 __str__ = __repr__
Tim Peters5d2b77c2001-09-03 05:47:38 +0000299
Georg Brandl48545522008-02-02 10:12:36 +0000300 a = Number(3.14, prec=6)
301 self.assertEqual(repr(a), "3.14")
302 self.assertEqual(a.prec, 6)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000303
Georg Brandl48545522008-02-02 10:12:36 +0000304 a = Number(a, prec=2)
305 self.assertEqual(repr(a), "3.1")
306 self.assertEqual(a.prec, 2)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000307
Georg Brandl48545522008-02-02 10:12:36 +0000308 a = Number(234.5)
309 self.assertEqual(repr(a), "234.5")
310 self.assertEqual(a.prec, 12)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000311
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000312 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000313 def test_spam_lists(self):
314 # Testing spamlist operations...
315 import copy, xxsubtype as spam
Tim Peters37a309d2001-09-04 01:20:04 +0000316
Georg Brandl48545522008-02-02 10:12:36 +0000317 def spamlist(l, memo=None):
318 import xxsubtype as spam
319 return spam.spamlist(l)
Tim Peters37a309d2001-09-04 01:20:04 +0000320
Georg Brandl48545522008-02-02 10:12:36 +0000321 # This is an ugly hack:
322 copy._deepcopy_dispatch[spam.spamlist] = spamlist
Tim Peters37a309d2001-09-04 01:20:04 +0000323
Georg Brandl48545522008-02-02 10:12:36 +0000324 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
325 "__add__")
326 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
327 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
328 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
329 self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
330 "__getslice__")
331 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
332 "__iadd__")
333 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
334 "__imul__")
335 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
336 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
337 "__mul__")
338 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
339 "__rmul__")
340 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
341 "__setitem__")
342 self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
343 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
344 # Test subclassing
345 class C(spam.spamlist):
346 def foo(self): return 1
347 a = C()
348 self.assertEqual(a, [])
349 self.assertEqual(a.foo(), 1)
350 a.append(100)
351 self.assertEqual(a, [100])
352 self.assertEqual(a.getstate(), 0)
353 a.setstate(42)
354 self.assertEqual(a.getstate(), 42)
Tim Peters37a309d2001-09-04 01:20:04 +0000355
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000356 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000357 def test_spam_dicts(self):
358 # Testing spamdict operations...
359 import copy, xxsubtype as spam
360 def spamdict(d, memo=None):
361 import xxsubtype as spam
362 sd = spam.spamdict()
363 for k, v in d.items():
364 sd[k] = v
365 return sd
366 # This is an ugly hack:
367 copy._deepcopy_dispatch[spam.spamdict] = spamdict
Tim Peters37a309d2001-09-04 01:20:04 +0000368
Georg Brandl48545522008-02-02 10:12:36 +0000369 self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
370 "__cmp__")
371 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
372 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
373 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
374 d = spamdict({1:2,3:4})
375 l1 = []
376 for i in d.keys():
377 l1.append(i)
378 l = []
379 for i in iter(d):
380 l.append(i)
381 self.assertEqual(l, l1)
382 l = []
383 for i in d.__iter__():
384 l.append(i)
385 self.assertEqual(l, l1)
386 l = []
387 for i in type(spamdict({})).__iter__(d):
388 l.append(i)
389 self.assertEqual(l, l1)
390 straightd = {1:2, 3:4}
391 spamd = spamdict(straightd)
392 self.unop_test(spamd, 2, "len(a)", "__len__")
393 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
394 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
395 "a[b]=c", "__setitem__")
396 # Test subclassing
397 class C(spam.spamdict):
398 def foo(self): return 1
399 a = C()
400 self.assertEqual(a.items(), [])
401 self.assertEqual(a.foo(), 1)
402 a['foo'] = 'bar'
403 self.assertEqual(a.items(), [('foo', 'bar')])
404 self.assertEqual(a.getstate(), 0)
405 a.setstate(100)
406 self.assertEqual(a.getstate(), 100)
Tim Peters37a309d2001-09-04 01:20:04 +0000407
Georg Brandl48545522008-02-02 10:12:36 +0000408class ClassPropertiesAndMethods(unittest.TestCase):
Tim Peters37a309d2001-09-04 01:20:04 +0000409
Georg Brandl48545522008-02-02 10:12:36 +0000410 def test_python_dicts(self):
411 # Testing Python subclass of dict...
412 self.assert_(issubclass(dict, dict))
413 self.assert_(isinstance({}, dict))
414 d = dict()
415 self.assertEqual(d, {})
416 self.assert_(d.__class__ is dict)
417 self.assert_(isinstance(d, dict))
418 class C(dict):
419 state = -1
420 def __init__(self_local, *a, **kw):
421 if a:
422 self.assertEqual(len(a), 1)
423 self_local.state = a[0]
424 if kw:
425 for k, v in kw.items():
426 self_local[v] = k
427 def __getitem__(self, key):
428 return self.get(key, 0)
429 def __setitem__(self_local, key, value):
430 self.assert_(isinstance(key, type(0)))
431 dict.__setitem__(self_local, key, value)
432 def setstate(self, state):
433 self.state = state
434 def getstate(self):
435 return self.state
436 self.assert_(issubclass(C, dict))
437 a1 = C(12)
438 self.assertEqual(a1.state, 12)
439 a2 = C(foo=1, bar=2)
440 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
441 a = C()
442 self.assertEqual(a.state, -1)
443 self.assertEqual(a.getstate(), -1)
444 a.setstate(0)
445 self.assertEqual(a.state, 0)
446 self.assertEqual(a.getstate(), 0)
447 a.setstate(10)
448 self.assertEqual(a.state, 10)
449 self.assertEqual(a.getstate(), 10)
450 self.assertEqual(a[42], 0)
451 a[42] = 24
452 self.assertEqual(a[42], 24)
453 N = 50
454 for i in range(N):
455 a[i] = C()
456 for j in range(N):
457 a[i][j] = i*j
458 for i in range(N):
459 for j in range(N):
460 self.assertEqual(a[i][j], i*j)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000461
Georg Brandl48545522008-02-02 10:12:36 +0000462 def test_python_lists(self):
463 # Testing Python subclass of list...
464 class C(list):
465 def __getitem__(self, i):
466 return list.__getitem__(self, i) + 100
467 def __getslice__(self, i, j):
468 return (i, j)
469 a = C()
470 a.extend([0,1,2])
471 self.assertEqual(a[0], 100)
472 self.assertEqual(a[1], 101)
473 self.assertEqual(a[2], 102)
474 self.assertEqual(a[100:200], (100,200))
Tim Peterscaaff8d2001-09-10 23:12:14 +0000475
Georg Brandl48545522008-02-02 10:12:36 +0000476 def test_metaclass(self):
477 # Testing __metaclass__...
478 class C:
Guido van Rossume54616c2001-12-14 04:19:56 +0000479 __metaclass__ = type
Georg Brandl48545522008-02-02 10:12:36 +0000480 def __init__(self):
481 self.__state = 0
482 def getstate(self):
483 return self.__state
484 def setstate(self, state):
485 self.__state = state
486 a = C()
487 self.assertEqual(a.getstate(), 0)
488 a.setstate(10)
489 self.assertEqual(a.getstate(), 10)
490 class D:
491 class __metaclass__(type):
492 def myself(cls): return cls
493 self.assertEqual(D.myself(), D)
494 d = D()
495 self.assertEqual(d.__class__, D)
496 class M1(type):
497 def __new__(cls, name, bases, dict):
498 dict['__spam__'] = 1
499 return type.__new__(cls, name, bases, dict)
500 class C:
501 __metaclass__ = M1
502 self.assertEqual(C.__spam__, 1)
503 c = C()
504 self.assertEqual(c.__spam__, 1)
Guido van Rossume54616c2001-12-14 04:19:56 +0000505
Georg Brandl48545522008-02-02 10:12:36 +0000506 class _instance(object):
507 pass
508 class M2(object):
509 @staticmethod
510 def __new__(cls, name, bases, dict):
511 self = object.__new__(cls)
512 self.name = name
513 self.bases = bases
514 self.dict = dict
515 return self
516 def __call__(self):
517 it = _instance()
518 # Early binding of methods
519 for key in self.dict:
520 if key.startswith("__"):
521 continue
522 setattr(it, key, self.dict[key].__get__(it, self))
523 return it
524 class C:
525 __metaclass__ = M2
526 def spam(self):
527 return 42
528 self.assertEqual(C.name, 'C')
529 self.assertEqual(C.bases, ())
530 self.assert_('spam' in C.dict)
531 c = C()
532 self.assertEqual(c.spam(), 42)
Guido van Rossum9a818922002-11-14 19:50:14 +0000533
Georg Brandl48545522008-02-02 10:12:36 +0000534 # More metaclass examples
Guido van Rossum9a818922002-11-14 19:50:14 +0000535
Georg Brandl48545522008-02-02 10:12:36 +0000536 class autosuper(type):
537 # Automatically add __super to the class
538 # This trick only works for dynamic classes
539 def __new__(metaclass, name, bases, dict):
540 cls = super(autosuper, metaclass).__new__(metaclass,
541 name, bases, dict)
542 # Name mangling for __super removes leading underscores
543 while name[:1] == "_":
544 name = name[1:]
545 if name:
546 name = "_%s__super" % name
547 else:
548 name = "__super"
549 setattr(cls, name, super(cls))
550 return cls
551 class A:
552 __metaclass__ = autosuper
553 def meth(self):
554 return "A"
555 class B(A):
556 def meth(self):
557 return "B" + self.__super.meth()
558 class C(A):
559 def meth(self):
560 return "C" + self.__super.meth()
561 class D(C, B):
562 def meth(self):
563 return "D" + self.__super.meth()
564 self.assertEqual(D().meth(), "DCBA")
565 class E(B, C):
566 def meth(self):
567 return "E" + self.__super.meth()
568 self.assertEqual(E().meth(), "EBCA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000569
Georg Brandl48545522008-02-02 10:12:36 +0000570 class autoproperty(type):
571 # Automatically create property attributes when methods
572 # named _get_x and/or _set_x are found
573 def __new__(metaclass, name, bases, dict):
574 hits = {}
575 for key, val in dict.iteritems():
576 if key.startswith("_get_"):
577 key = key[5:]
578 get, set = hits.get(key, (None, None))
579 get = val
580 hits[key] = get, set
581 elif key.startswith("_set_"):
582 key = key[5:]
583 get, set = hits.get(key, (None, None))
584 set = val
585 hits[key] = get, set
586 for key, (get, set) in hits.iteritems():
587 dict[key] = property(get, set)
588 return super(autoproperty, metaclass).__new__(metaclass,
589 name, bases, dict)
590 class A:
591 __metaclass__ = autoproperty
592 def _get_x(self):
593 return -self.__x
594 def _set_x(self, x):
595 self.__x = -x
596 a = A()
597 self.assert_(not hasattr(a, "x"))
598 a.x = 12
599 self.assertEqual(a.x, 12)
600 self.assertEqual(a._A__x, -12)
Guido van Rossum9a818922002-11-14 19:50:14 +0000601
Georg Brandl48545522008-02-02 10:12:36 +0000602 class multimetaclass(autoproperty, autosuper):
603 # Merge of multiple cooperating metaclasses
604 pass
605 class A:
606 __metaclass__ = multimetaclass
607 def _get_x(self):
608 return "A"
609 class B(A):
610 def _get_x(self):
611 return "B" + self.__super._get_x()
612 class C(A):
613 def _get_x(self):
614 return "C" + self.__super._get_x()
615 class D(C, B):
616 def _get_x(self):
617 return "D" + self.__super._get_x()
618 self.assertEqual(D().x, "DCBA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000619
Georg Brandl48545522008-02-02 10:12:36 +0000620 # Make sure type(x) doesn't call x.__class__.__init__
621 class T(type):
622 counter = 0
623 def __init__(self, *args):
624 T.counter += 1
625 class C:
626 __metaclass__ = T
627 self.assertEqual(T.counter, 1)
628 a = C()
629 self.assertEqual(type(a), C)
630 self.assertEqual(T.counter, 1)
Guido van Rossum9a818922002-11-14 19:50:14 +0000631
Georg Brandl48545522008-02-02 10:12:36 +0000632 class C(object): pass
633 c = C()
634 try: c()
635 except TypeError: pass
636 else: self.fail("calling object w/o call method should raise "
637 "TypeError")
Guido van Rossum9a818922002-11-14 19:50:14 +0000638
Georg Brandl48545522008-02-02 10:12:36 +0000639 # Testing code to find most derived baseclass
640 class A(type):
641 def __new__(*args, **kwargs):
642 return type.__new__(*args, **kwargs)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000643
Georg Brandl48545522008-02-02 10:12:36 +0000644 class B(object):
645 pass
646
647 class C(object):
648 __metaclass__ = A
649
650 # The most derived metaclass of D is A rather than type.
651 class D(B, C):
652 pass
653
654 def test_module_subclasses(self):
655 # Testing Python subclass of module...
656 log = []
657 import types, sys
658 MT = type(sys)
659 class MM(MT):
660 def __init__(self, name):
661 MT.__init__(self, name)
662 def __getattribute__(self, name):
663 log.append(("getattr", name))
664 return MT.__getattribute__(self, name)
665 def __setattr__(self, name, value):
666 log.append(("setattr", name, value))
667 MT.__setattr__(self, name, value)
668 def __delattr__(self, name):
669 log.append(("delattr", name))
670 MT.__delattr__(self, name)
671 a = MM("a")
672 a.foo = 12
673 x = a.foo
674 del a.foo
675 self.assertEqual(log, [("setattr", "foo", 12),
676 ("getattr", "foo"),
677 ("delattr", "foo")])
678
679 # http://python.org/sf/1174712
680 try:
681 class Module(types.ModuleType, str):
682 pass
683 except TypeError:
684 pass
685 else:
686 self.fail("inheriting from ModuleType and str at the same time "
687 "should fail")
688
689 def test_multiple_inheritence(self):
690 # Testing multiple inheritance...
691 class C(object):
692 def __init__(self):
693 self.__state = 0
694 def getstate(self):
695 return self.__state
696 def setstate(self, state):
697 self.__state = state
698 a = C()
699 self.assertEqual(a.getstate(), 0)
700 a.setstate(10)
701 self.assertEqual(a.getstate(), 10)
702 class D(dict, C):
703 def __init__(self):
704 type({}).__init__(self)
705 C.__init__(self)
706 d = D()
707 self.assertEqual(d.keys(), [])
708 d["hello"] = "world"
709 self.assertEqual(d.items(), [("hello", "world")])
710 self.assertEqual(d["hello"], "world")
711 self.assertEqual(d.getstate(), 0)
712 d.setstate(10)
713 self.assertEqual(d.getstate(), 10)
714 self.assertEqual(D.__mro__, (D, dict, C, object))
715
716 # SF bug #442833
717 class Node(object):
718 def __int__(self):
719 return int(self.foo())
720 def foo(self):
721 return "23"
722 class Frag(Node, list):
723 def foo(self):
724 return "42"
725 self.assertEqual(Node().__int__(), 23)
726 self.assertEqual(int(Node()), 23)
727 self.assertEqual(Frag().__int__(), 42)
728 self.assertEqual(int(Frag()), 42)
729
730 # MI mixing classic and new-style classes.
731
732 class A:
733 x = 1
734
735 class B(A):
736 pass
737
738 class C(A):
739 x = 2
740
741 class D(B, C):
742 pass
743 self.assertEqual(D.x, 1)
744
745 # Classic MRO is preserved for a classic base class.
746 class E(D, object):
747 pass
748 self.assertEqual(E.__mro__, (E, D, B, A, C, object))
749 self.assertEqual(E.x, 1)
750
751 # But with a mix of classic bases, their MROs are combined using
752 # new-style MRO.
753 class F(B, C, object):
754 pass
755 self.assertEqual(F.__mro__, (F, B, C, A, object))
756 self.assertEqual(F.x, 2)
757
758 # Try something else.
759 class C:
760 def cmethod(self):
761 return "C a"
762 def all_method(self):
763 return "C b"
764
765 class M1(C, object):
766 def m1method(self):
767 return "M1 a"
768 def all_method(self):
769 return "M1 b"
770
771 self.assertEqual(M1.__mro__, (M1, C, object))
772 m = M1()
773 self.assertEqual(m.cmethod(), "C a")
774 self.assertEqual(m.m1method(), "M1 a")
775 self.assertEqual(m.all_method(), "M1 b")
776
777 class D(C):
778 def dmethod(self):
779 return "D a"
780 def all_method(self):
781 return "D b"
782
783 class M2(D, object):
784 def m2method(self):
785 return "M2 a"
786 def all_method(self):
787 return "M2 b"
788
789 self.assertEqual(M2.__mro__, (M2, D, C, object))
790 m = M2()
791 self.assertEqual(m.cmethod(), "C a")
792 self.assertEqual(m.dmethod(), "D a")
793 self.assertEqual(m.m2method(), "M2 a")
794 self.assertEqual(m.all_method(), "M2 b")
795
796 class M3(M1, M2, object):
797 def m3method(self):
798 return "M3 a"
799 def all_method(self):
800 return "M3 b"
801 self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
802 m = M3()
803 self.assertEqual(m.cmethod(), "C a")
804 self.assertEqual(m.dmethod(), "D a")
805 self.assertEqual(m.m1method(), "M1 a")
806 self.assertEqual(m.m2method(), "M2 a")
807 self.assertEqual(m.m3method(), "M3 a")
808 self.assertEqual(m.all_method(), "M3 b")
809
810 class Classic:
811 pass
812 try:
813 class New(Classic):
814 __metaclass__ = type
815 except TypeError:
816 pass
817 else:
818 self.fail("new class with only classic bases - shouldn't be")
819
820 def test_diamond_inheritence(self):
821 # Testing multiple inheritance special cases...
822 class A(object):
823 def spam(self): return "A"
824 self.assertEqual(A().spam(), "A")
825 class B(A):
826 def boo(self): return "B"
827 def spam(self): return "B"
828 self.assertEqual(B().spam(), "B")
829 self.assertEqual(B().boo(), "B")
830 class C(A):
831 def boo(self): return "C"
832 self.assertEqual(C().spam(), "A")
833 self.assertEqual(C().boo(), "C")
834 class D(B, C): pass
835 self.assertEqual(D().spam(), "B")
836 self.assertEqual(D().boo(), "B")
837 self.assertEqual(D.__mro__, (D, B, C, A, object))
838 class E(C, B): pass
839 self.assertEqual(E().spam(), "B")
840 self.assertEqual(E().boo(), "C")
841 self.assertEqual(E.__mro__, (E, C, B, A, object))
842 # MRO order disagreement
843 try:
844 class F(D, E): pass
845 except TypeError:
846 pass
847 else:
848 self.fail("expected MRO order disagreement (F)")
849 try:
850 class G(E, D): pass
851 except TypeError:
852 pass
853 else:
854 self.fail("expected MRO order disagreement (G)")
855
856 # see thread python-dev/2002-October/029035.html
857 def test_ex5_from_c3_switch(self):
858 # Testing ex5 from C3 switch discussion...
859 class A(object): pass
860 class B(object): pass
861 class C(object): pass
862 class X(A): pass
863 class Y(A): pass
864 class Z(X,B,Y,C): pass
865 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
866
867 # see "A Monotonic Superclass Linearization for Dylan",
868 # by Kim Barrett et al. (OOPSLA 1996)
869 def test_monotonicity(self):
870 # Testing MRO monotonicity...
871 class Boat(object): pass
872 class DayBoat(Boat): pass
873 class WheelBoat(Boat): pass
874 class EngineLess(DayBoat): pass
875 class SmallMultihull(DayBoat): pass
876 class PedalWheelBoat(EngineLess,WheelBoat): pass
877 class SmallCatamaran(SmallMultihull): pass
878 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
879
880 self.assertEqual(PedalWheelBoat.__mro__,
881 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
882 self.assertEqual(SmallCatamaran.__mro__,
883 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
884 self.assertEqual(Pedalo.__mro__,
885 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
886 SmallMultihull, DayBoat, WheelBoat, Boat, object))
887
888 # see "A Monotonic Superclass Linearization for Dylan",
889 # by Kim Barrett et al. (OOPSLA 1996)
890 def test_consistency_with_epg(self):
891 # Testing consistentcy with EPG...
892 class Pane(object): pass
893 class ScrollingMixin(object): pass
894 class EditingMixin(object): pass
895 class ScrollablePane(Pane,ScrollingMixin): pass
896 class EditablePane(Pane,EditingMixin): pass
897 class EditableScrollablePane(ScrollablePane,EditablePane): pass
898
899 self.assertEqual(EditableScrollablePane.__mro__,
900 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
901 ScrollingMixin, EditingMixin, object))
902
903 def test_mro_disagreement(self):
904 # Testing error messages for MRO disagreement...
905 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000906order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000907
Georg Brandl48545522008-02-02 10:12:36 +0000908 def raises(exc, expected, callable, *args):
909 try:
910 callable(*args)
911 except exc, msg:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000912 # the exact msg is generally considered an impl detail
913 if test_support.check_impl_detail():
914 if not str(msg).startswith(expected):
915 self.fail("Message %r, expected %r" %
916 (str(msg), expected))
Georg Brandl48545522008-02-02 10:12:36 +0000917 else:
918 self.fail("Expected %s" % exc)
919
920 class A(object): pass
921 class B(A): pass
922 class C(object): pass
923
924 # Test some very simple errors
925 raises(TypeError, "duplicate base class A",
926 type, "X", (A, A), {})
927 raises(TypeError, mro_err_msg,
928 type, "X", (A, B), {})
929 raises(TypeError, mro_err_msg,
930 type, "X", (A, C, B), {})
931 # Test a slightly more complex error
932 class GridLayout(object): pass
933 class HorizontalGrid(GridLayout): pass
934 class VerticalGrid(GridLayout): pass
935 class HVGrid(HorizontalGrid, VerticalGrid): pass
936 class VHGrid(VerticalGrid, HorizontalGrid): pass
937 raises(TypeError, mro_err_msg,
938 type, "ConfusedGrid", (HVGrid, VHGrid), {})
939
940 def test_object_class(self):
941 # Testing object class...
942 a = object()
943 self.assertEqual(a.__class__, object)
944 self.assertEqual(type(a), object)
945 b = object()
946 self.assertNotEqual(a, b)
947 self.assertFalse(hasattr(a, "foo"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000948 try:
Georg Brandl48545522008-02-02 10:12:36 +0000949 a.foo = 12
950 except (AttributeError, TypeError):
951 pass
Guido van Rossumd32047f2002-11-25 21:38:52 +0000952 else:
Georg Brandl48545522008-02-02 10:12:36 +0000953 self.fail("object() should not allow setting a foo attribute")
954 self.assertFalse(hasattr(object(), "__dict__"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000955
Georg Brandl48545522008-02-02 10:12:36 +0000956 class Cdict(object):
957 pass
958 x = Cdict()
959 self.assertEqual(x.__dict__, {})
960 x.foo = 1
961 self.assertEqual(x.foo, 1)
962 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000963
Georg Brandl48545522008-02-02 10:12:36 +0000964 def test_slots(self):
965 # Testing __slots__...
966 class C0(object):
967 __slots__ = []
968 x = C0()
969 self.assertFalse(hasattr(x, "__dict__"))
970 self.assertFalse(hasattr(x, "foo"))
Guido van Rossum37202612001-08-09 19:45:21 +0000971
Georg Brandl48545522008-02-02 10:12:36 +0000972 class C1(object):
973 __slots__ = ['a']
974 x = C1()
975 self.assertFalse(hasattr(x, "__dict__"))
976 self.assertFalse(hasattr(x, "a"))
977 x.a = 1
978 self.assertEqual(x.a, 1)
979 x.a = None
980 self.assertEqual(x.a, None)
981 del x.a
982 self.assertFalse(hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000983
Georg Brandl48545522008-02-02 10:12:36 +0000984 class C3(object):
985 __slots__ = ['a', 'b', 'c']
986 x = C3()
987 self.assertFalse(hasattr(x, "__dict__"))
988 self.assertFalse(hasattr(x, 'a'))
989 self.assertFalse(hasattr(x, 'b'))
990 self.assertFalse(hasattr(x, 'c'))
991 x.a = 1
992 x.b = 2
993 x.c = 3
994 self.assertEqual(x.a, 1)
995 self.assertEqual(x.b, 2)
996 self.assertEqual(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997
Georg Brandl48545522008-02-02 10:12:36 +0000998 class C4(object):
999 """Validate name mangling"""
1000 __slots__ = ['__a']
1001 def __init__(self, value):
1002 self.__a = value
1003 def get(self):
1004 return self.__a
1005 x = C4(5)
1006 self.assertFalse(hasattr(x, '__dict__'))
1007 self.assertFalse(hasattr(x, '__a'))
1008 self.assertEqual(x.get(), 5)
1009 try:
1010 x.__a = 6
1011 except AttributeError:
1012 pass
1013 else:
1014 self.fail("Double underscored names not mangled")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001015
Georg Brandl48545522008-02-02 10:12:36 +00001016 # Make sure slot names are proper identifiers
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001017 try:
1018 class C(object):
Georg Brandl48545522008-02-02 10:12:36 +00001019 __slots__ = [None]
Guido van Rossum843daa82001-09-18 20:04:26 +00001020 except TypeError:
1021 pass
1022 else:
Georg Brandl48545522008-02-02 10:12:36 +00001023 self.fail("[None] slots not caught")
Tim Peters66c1a522001-09-24 21:17:50 +00001024 try:
Georg Brandl48545522008-02-02 10:12:36 +00001025 class C(object):
1026 __slots__ = ["foo bar"]
1027 except TypeError:
Georg Brandl533ff6f2006-03-08 18:09:27 +00001028 pass
Georg Brandl48545522008-02-02 10:12:36 +00001029 else:
1030 self.fail("['foo bar'] slots not caught")
1031 try:
1032 class C(object):
1033 __slots__ = ["foo\0bar"]
1034 except TypeError:
1035 pass
1036 else:
1037 self.fail("['foo\\0bar'] slots not caught")
1038 try:
1039 class C(object):
1040 __slots__ = ["1"]
1041 except TypeError:
1042 pass
1043 else:
1044 self.fail("['1'] slots not caught")
1045 try:
1046 class C(object):
1047 __slots__ = [""]
1048 except TypeError:
1049 pass
1050 else:
1051 self.fail("[''] slots not caught")
1052 class C(object):
1053 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1054 # XXX(nnorwitz): was there supposed to be something tested
1055 # from the class above?
Georg Brandl533ff6f2006-03-08 18:09:27 +00001056
Georg Brandl48545522008-02-02 10:12:36 +00001057 # Test a single string is not expanded as a sequence.
1058 class C(object):
1059 __slots__ = "abc"
1060 c = C()
1061 c.abc = 5
1062 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001063
Georg Brandl48545522008-02-02 10:12:36 +00001064 # Test unicode slot names
1065 try:
1066 unicode
1067 except NameError:
1068 pass
1069 else:
1070 # Test a single unicode string is not expanded as a sequence.
1071 class C(object):
1072 __slots__ = unicode("abc")
1073 c = C()
1074 c.abc = 5
1075 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001076
Georg Brandl48545522008-02-02 10:12:36 +00001077 # _unicode_to_string used to modify slots in certain circumstances
1078 slots = (unicode("foo"), unicode("bar"))
1079 class C(object):
1080 __slots__ = slots
1081 x = C()
1082 x.foo = 5
1083 self.assertEqual(x.foo, 5)
1084 self.assertEqual(type(slots[0]), unicode)
1085 # this used to leak references
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001086 try:
Georg Brandl48545522008-02-02 10:12:36 +00001087 class C(object):
1088 __slots__ = [unichr(128)]
1089 except (TypeError, UnicodeEncodeError):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001090 pass
Tim Peters8fa45672001-09-13 21:01:29 +00001091 else:
Georg Brandl48545522008-02-02 10:12:36 +00001092 self.fail("[unichr(128)] slots not caught")
Tim Peters8fa45672001-09-13 21:01:29 +00001093
Georg Brandl48545522008-02-02 10:12:36 +00001094 # Test leaks
1095 class Counted(object):
1096 counter = 0 # counts the number of instances alive
1097 def __init__(self):
1098 Counted.counter += 1
1099 def __del__(self):
1100 Counted.counter -= 1
1101 class C(object):
1102 __slots__ = ['a', 'b', 'c']
Guido van Rossum8c842552002-03-14 23:05:54 +00001103 x = C()
Georg Brandl48545522008-02-02 10:12:36 +00001104 x.a = Counted()
1105 x.b = Counted()
1106 x.c = Counted()
1107 self.assertEqual(Counted.counter, 3)
1108 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001109 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001110 self.assertEqual(Counted.counter, 0)
1111 class D(C):
1112 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00001113 x = D()
Georg Brandl48545522008-02-02 10:12:36 +00001114 x.a = Counted()
1115 x.z = Counted()
1116 self.assertEqual(Counted.counter, 2)
1117 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001118 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001119 self.assertEqual(Counted.counter, 0)
1120 class E(D):
1121 __slots__ = ['e']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00001122 x = E()
Georg Brandl48545522008-02-02 10:12:36 +00001123 x.a = Counted()
1124 x.z = Counted()
1125 x.e = Counted()
1126 self.assertEqual(Counted.counter, 3)
1127 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001128 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001129 self.assertEqual(Counted.counter, 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00001130
Georg Brandl48545522008-02-02 10:12:36 +00001131 # Test cyclical leaks [SF bug 519621]
1132 class F(object):
1133 __slots__ = ['a', 'b']
1134 log = []
1135 s = F()
1136 s.a = [Counted(), s]
1137 self.assertEqual(Counted.counter, 1)
1138 s = None
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001139 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001140 self.assertEqual(Counted.counter, 0)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001141
Georg Brandl48545522008-02-02 10:12:36 +00001142 # Test lookup leaks [SF bug 572567]
1143 import sys,gc
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001144 if hasattr(gc, 'get_objects'):
1145 class G(object):
1146 def __cmp__(self, other):
1147 return 0
1148 __hash__ = None # Silence Py3k warning
1149 g = G()
1150 orig_objects = len(gc.get_objects())
1151 for i in xrange(10):
1152 g==g
1153 new_objects = len(gc.get_objects())
1154 self.assertEqual(orig_objects, new_objects)
1155
Georg Brandl48545522008-02-02 10:12:36 +00001156 class H(object):
1157 __slots__ = ['a', 'b']
1158 def __init__(self):
1159 self.a = 1
1160 self.b = 2
1161 def __del__(self_):
1162 self.assertEqual(self_.a, 1)
1163 self.assertEqual(self_.b, 2)
Armin Rigo581eb1e2008-10-28 17:01:21 +00001164 with test_support.captured_output('stderr') as s:
1165 h = H()
Georg Brandl48545522008-02-02 10:12:36 +00001166 del h
Armin Rigo581eb1e2008-10-28 17:01:21 +00001167 self.assertEqual(s.getvalue(), '')
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001168
Georg Brandl48545522008-02-02 10:12:36 +00001169 def test_slots_special(self):
1170 # Testing __dict__ and __weakref__ in __slots__...
1171 class D(object):
1172 __slots__ = ["__dict__"]
1173 a = D()
1174 self.assert_(hasattr(a, "__dict__"))
1175 self.assertFalse(hasattr(a, "__weakref__"))
1176 a.foo = 42
1177 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001178
Georg Brandl48545522008-02-02 10:12:36 +00001179 class W(object):
1180 __slots__ = ["__weakref__"]
1181 a = W()
1182 self.assert_(hasattr(a, "__weakref__"))
1183 self.assertFalse(hasattr(a, "__dict__"))
1184 try:
1185 a.foo = 42
1186 except AttributeError:
1187 pass
1188 else:
1189 self.fail("shouldn't be allowed to set a.foo")
1190
1191 class C1(W, D):
1192 __slots__ = []
1193 a = C1()
1194 self.assert_(hasattr(a, "__dict__"))
1195 self.assert_(hasattr(a, "__weakref__"))
1196 a.foo = 42
1197 self.assertEqual(a.__dict__, {"foo": 42})
1198
1199 class C2(D, W):
1200 __slots__ = []
1201 a = C2()
1202 self.assert_(hasattr(a, "__dict__"))
1203 self.assert_(hasattr(a, "__weakref__"))
1204 a.foo = 42
1205 self.assertEqual(a.__dict__, {"foo": 42})
1206
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001207 def test_slots_descriptor(self):
1208 # Issue2115: slot descriptors did not correctly check
1209 # the type of the given object
1210 import abc
1211 class MyABC:
1212 __metaclass__ = abc.ABCMeta
1213 __slots__ = "a"
1214
1215 class Unrelated(object):
1216 pass
1217 MyABC.register(Unrelated)
1218
1219 u = Unrelated()
1220 self.assert_(isinstance(u, MyABC))
1221
1222 # This used to crash
1223 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1224
Georg Brandl48545522008-02-02 10:12:36 +00001225 def test_dynamics(self):
1226 # Testing class attribute propagation...
1227 class D(object):
1228 pass
1229 class E(D):
1230 pass
1231 class F(D):
1232 pass
1233 D.foo = 1
1234 self.assertEqual(D.foo, 1)
1235 # Test that dynamic attributes are inherited
1236 self.assertEqual(E.foo, 1)
1237 self.assertEqual(F.foo, 1)
1238 # Test dynamic instances
1239 class C(object):
1240 pass
1241 a = C()
1242 self.assertFalse(hasattr(a, "foobar"))
1243 C.foobar = 2
1244 self.assertEqual(a.foobar, 2)
1245 C.method = lambda self: 42
1246 self.assertEqual(a.method(), 42)
1247 C.__repr__ = lambda self: "C()"
1248 self.assertEqual(repr(a), "C()")
1249 C.__int__ = lambda self: 100
1250 self.assertEqual(int(a), 100)
1251 self.assertEqual(a.foobar, 2)
1252 self.assertFalse(hasattr(a, "spam"))
1253 def mygetattr(self, name):
1254 if name == "spam":
1255 return "spam"
1256 raise AttributeError
1257 C.__getattr__ = mygetattr
1258 self.assertEqual(a.spam, "spam")
1259 a.new = 12
1260 self.assertEqual(a.new, 12)
1261 def mysetattr(self, name, value):
1262 if name == "spam":
1263 raise AttributeError
1264 return object.__setattr__(self, name, value)
1265 C.__setattr__ = mysetattr
1266 try:
1267 a.spam = "not spam"
1268 except AttributeError:
1269 pass
1270 else:
1271 self.fail("expected AttributeError")
1272 self.assertEqual(a.spam, "spam")
1273 class D(C):
1274 pass
1275 d = D()
1276 d.foo = 1
1277 self.assertEqual(d.foo, 1)
1278
1279 # Test handling of int*seq and seq*int
1280 class I(int):
1281 pass
1282 self.assertEqual("a"*I(2), "aa")
1283 self.assertEqual(I(2)*"a", "aa")
1284 self.assertEqual(2*I(3), 6)
1285 self.assertEqual(I(3)*2, 6)
1286 self.assertEqual(I(3)*I(2), 6)
1287
1288 # Test handling of long*seq and seq*long
1289 class L(long):
1290 pass
1291 self.assertEqual("a"*L(2L), "aa")
1292 self.assertEqual(L(2L)*"a", "aa")
1293 self.assertEqual(2*L(3), 6)
1294 self.assertEqual(L(3)*2, 6)
1295 self.assertEqual(L(3)*L(2), 6)
1296
1297 # Test comparison of classes with dynamic metaclasses
1298 class dynamicmetaclass(type):
1299 pass
1300 class someclass:
1301 __metaclass__ = dynamicmetaclass
1302 self.assertNotEqual(someclass, object)
1303
1304 def test_errors(self):
1305 # Testing errors...
1306 try:
1307 class C(list, dict):
1308 pass
1309 except TypeError:
1310 pass
1311 else:
1312 self.fail("inheritance from both list and dict should be illegal")
1313
1314 try:
1315 class C(object, None):
1316 pass
1317 except TypeError:
1318 pass
1319 else:
1320 self.fail("inheritance from non-type should be illegal")
1321 class Classic:
1322 pass
1323
1324 try:
1325 class C(type(len)):
1326 pass
1327 except TypeError:
1328 pass
1329 else:
1330 self.fail("inheritance from CFunction should be illegal")
1331
1332 try:
1333 class C(object):
1334 __slots__ = 1
1335 except TypeError:
1336 pass
1337 else:
1338 self.fail("__slots__ = 1 should be illegal")
1339
1340 try:
1341 class C(object):
1342 __slots__ = [1]
1343 except TypeError:
1344 pass
1345 else:
1346 self.fail("__slots__ = [1] should be illegal")
1347
1348 class M1(type):
1349 pass
1350 class M2(type):
1351 pass
1352 class A1(object):
1353 __metaclass__ = M1
1354 class A2(object):
1355 __metaclass__ = M2
1356 try:
1357 class B(A1, A2):
1358 pass
1359 except TypeError:
1360 pass
1361 else:
1362 self.fail("finding the most derived metaclass should have failed")
1363
1364 def test_classmethods(self):
1365 # Testing class methods...
1366 class C(object):
1367 def foo(*a): return a
1368 goo = classmethod(foo)
1369 c = C()
1370 self.assertEqual(C.goo(1), (C, 1))
1371 self.assertEqual(c.goo(1), (C, 1))
1372 self.assertEqual(c.foo(1), (c, 1))
1373 class D(C):
1374 pass
1375 d = D()
1376 self.assertEqual(D.goo(1), (D, 1))
1377 self.assertEqual(d.goo(1), (D, 1))
1378 self.assertEqual(d.foo(1), (d, 1))
1379 self.assertEqual(D.foo(d, 1), (d, 1))
1380 # Test for a specific crash (SF bug 528132)
1381 def f(cls, arg): return (cls, arg)
1382 ff = classmethod(f)
1383 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1384 self.assertEqual(ff.__get__(0)(42), (int, 42))
1385
1386 # Test super() with classmethods (SF bug 535444)
1387 self.assertEqual(C.goo.im_self, C)
1388 self.assertEqual(D.goo.im_self, D)
1389 self.assertEqual(super(D,D).goo.im_self, D)
1390 self.assertEqual(super(D,d).goo.im_self, D)
1391 self.assertEqual(super(D,D).goo(), (D,))
1392 self.assertEqual(super(D,d).goo(), (D,))
1393
1394 # Verify that argument is checked for callability (SF bug 753451)
1395 try:
1396 classmethod(1).__get__(1)
1397 except TypeError:
1398 pass
1399 else:
1400 self.fail("classmethod should check for callability")
1401
1402 # Verify that classmethod() doesn't allow keyword args
1403 try:
1404 classmethod(f, kw=1)
1405 except TypeError:
1406 pass
1407 else:
1408 self.fail("classmethod shouldn't accept keyword args")
1409
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001410 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001411 def test_classmethods_in_c(self):
1412 # Testing C-based class methods...
1413 import xxsubtype as spam
1414 a = (1, 2, 3)
1415 d = {'abc': 123}
1416 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1417 self.assertEqual(x, spam.spamlist)
1418 self.assertEqual(a, a1)
1419 self.assertEqual(d, d1)
1420 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1421 self.assertEqual(x, spam.spamlist)
1422 self.assertEqual(a, a1)
1423 self.assertEqual(d, d1)
1424
1425 def test_staticmethods(self):
1426 # Testing static methods...
1427 class C(object):
1428 def foo(*a): return a
1429 goo = staticmethod(foo)
1430 c = C()
1431 self.assertEqual(C.goo(1), (1,))
1432 self.assertEqual(c.goo(1), (1,))
1433 self.assertEqual(c.foo(1), (c, 1,))
1434 class D(C):
1435 pass
1436 d = D()
1437 self.assertEqual(D.goo(1), (1,))
1438 self.assertEqual(d.goo(1), (1,))
1439 self.assertEqual(d.foo(1), (d, 1))
1440 self.assertEqual(D.foo(d, 1), (d, 1))
1441
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001442 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001443 def test_staticmethods_in_c(self):
1444 # Testing C-based static methods...
1445 import xxsubtype as spam
1446 a = (1, 2, 3)
1447 d = {"abc": 123}
1448 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1449 self.assertEqual(x, None)
1450 self.assertEqual(a, a1)
1451 self.assertEqual(d, d1)
1452 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1453 self.assertEqual(x, None)
1454 self.assertEqual(a, a1)
1455 self.assertEqual(d, d1)
1456
1457 def test_classic(self):
1458 # Testing classic classes...
1459 class C:
1460 def foo(*a): return a
1461 goo = classmethod(foo)
1462 c = C()
1463 self.assertEqual(C.goo(1), (C, 1))
1464 self.assertEqual(c.goo(1), (C, 1))
1465 self.assertEqual(c.foo(1), (c, 1))
1466 class D(C):
1467 pass
1468 d = D()
1469 self.assertEqual(D.goo(1), (D, 1))
1470 self.assertEqual(d.goo(1), (D, 1))
1471 self.assertEqual(d.foo(1), (d, 1))
1472 self.assertEqual(D.foo(d, 1), (d, 1))
1473 class E: # *not* subclassing from C
1474 foo = C.foo
1475 self.assertEqual(E().foo, C.foo) # i.e., unbound
1476 self.assert_(repr(C.foo.__get__(C())).startswith("<bound method "))
1477
1478 def test_compattr(self):
1479 # Testing computed attributes...
1480 class C(object):
1481 class computed_attribute(object):
1482 def __init__(self, get, set=None, delete=None):
1483 self.__get = get
1484 self.__set = set
1485 self.__delete = delete
1486 def __get__(self, obj, type=None):
1487 return self.__get(obj)
1488 def __set__(self, obj, value):
1489 return self.__set(obj, value)
1490 def __delete__(self, obj):
1491 return self.__delete(obj)
1492 def __init__(self):
1493 self.__x = 0
1494 def __get_x(self):
1495 x = self.__x
1496 self.__x = x+1
1497 return x
1498 def __set_x(self, x):
1499 self.__x = x
1500 def __delete_x(self):
1501 del self.__x
1502 x = computed_attribute(__get_x, __set_x, __delete_x)
1503 a = C()
1504 self.assertEqual(a.x, 0)
1505 self.assertEqual(a.x, 1)
1506 a.x = 10
1507 self.assertEqual(a.x, 10)
1508 self.assertEqual(a.x, 11)
1509 del a.x
1510 self.assertEqual(hasattr(a, 'x'), 0)
1511
1512 def test_newslots(self):
1513 # Testing __new__ slot override...
1514 class C(list):
1515 def __new__(cls):
1516 self = list.__new__(cls)
1517 self.foo = 1
1518 return self
1519 def __init__(self):
1520 self.foo = self.foo + 2
1521 a = C()
1522 self.assertEqual(a.foo, 3)
1523 self.assertEqual(a.__class__, C)
1524 class D(C):
1525 pass
1526 b = D()
1527 self.assertEqual(b.foo, 3)
1528 self.assertEqual(b.__class__, D)
1529
1530 def test_altmro(self):
1531 # Testing mro() and overriding it...
1532 class A(object):
1533 def f(self): return "A"
1534 class B(A):
1535 pass
1536 class C(A):
1537 def f(self): return "C"
1538 class D(B, C):
1539 pass
1540 self.assertEqual(D.mro(), [D, B, C, A, object])
1541 self.assertEqual(D.__mro__, (D, B, C, A, object))
1542 self.assertEqual(D().f(), "C")
1543
1544 class PerverseMetaType(type):
1545 def mro(cls):
1546 L = type.mro(cls)
1547 L.reverse()
1548 return L
1549 class X(D,B,C,A):
1550 __metaclass__ = PerverseMetaType
1551 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1552 self.assertEqual(X().f(), "A")
1553
1554 try:
1555 class X(object):
1556 class __metaclass__(type):
1557 def mro(self):
1558 return [self, dict, object]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001559 # In CPython, the class creation above already raises
1560 # TypeError, as a protection against the fact that
1561 # instances of X would segfault it. In other Python
1562 # implementations it would be ok to let the class X
1563 # be created, but instead get a clean TypeError on the
1564 # __setitem__ below.
1565 x = object.__new__(X)
1566 x[5] = 6
Georg Brandl48545522008-02-02 10:12:36 +00001567 except TypeError:
1568 pass
1569 else:
1570 self.fail("devious mro() return not caught")
1571
1572 try:
1573 class X(object):
1574 class __metaclass__(type):
1575 def mro(self):
1576 return [1]
1577 except TypeError:
1578 pass
1579 else:
1580 self.fail("non-class mro() return not caught")
1581
1582 try:
1583 class X(object):
1584 class __metaclass__(type):
1585 def mro(self):
1586 return 1
1587 except TypeError:
1588 pass
1589 else:
1590 self.fail("non-sequence mro() return not caught")
1591
1592 def test_overloading(self):
1593 # Testing operator overloading...
1594
1595 class B(object):
1596 "Intermediate class because object doesn't have a __setattr__"
1597
1598 class C(B):
1599 def __getattr__(self, name):
1600 if name == "foo":
1601 return ("getattr", name)
1602 else:
1603 raise AttributeError
1604 def __setattr__(self, name, value):
1605 if name == "foo":
1606 self.setattr = (name, value)
1607 else:
1608 return B.__setattr__(self, name, value)
1609 def __delattr__(self, name):
1610 if name == "foo":
1611 self.delattr = name
1612 else:
1613 return B.__delattr__(self, name)
1614
1615 def __getitem__(self, key):
1616 return ("getitem", key)
1617 def __setitem__(self, key, value):
1618 self.setitem = (key, value)
1619 def __delitem__(self, key):
1620 self.delitem = key
1621
1622 def __getslice__(self, i, j):
1623 return ("getslice", i, j)
1624 def __setslice__(self, i, j, value):
1625 self.setslice = (i, j, value)
1626 def __delslice__(self, i, j):
1627 self.delslice = (i, j)
1628
1629 a = C()
1630 self.assertEqual(a.foo, ("getattr", "foo"))
1631 a.foo = 12
1632 self.assertEqual(a.setattr, ("foo", 12))
1633 del a.foo
1634 self.assertEqual(a.delattr, "foo")
1635
1636 self.assertEqual(a[12], ("getitem", 12))
1637 a[12] = 21
1638 self.assertEqual(a.setitem, (12, 21))
1639 del a[12]
1640 self.assertEqual(a.delitem, 12)
1641
1642 self.assertEqual(a[0:10], ("getslice", 0, 10))
1643 a[0:10] = "foo"
1644 self.assertEqual(a.setslice, (0, 10, "foo"))
1645 del a[0:10]
1646 self.assertEqual(a.delslice, (0, 10))
1647
1648 def test_methods(self):
1649 # Testing methods...
1650 class C(object):
1651 def __init__(self, x):
1652 self.x = x
1653 def foo(self):
1654 return self.x
1655 c1 = C(1)
1656 self.assertEqual(c1.foo(), 1)
1657 class D(C):
1658 boo = C.foo
1659 goo = c1.foo
1660 d2 = D(2)
1661 self.assertEqual(d2.foo(), 2)
1662 self.assertEqual(d2.boo(), 2)
1663 self.assertEqual(d2.goo(), 1)
1664 class E(object):
1665 foo = C.foo
1666 self.assertEqual(E().foo, C.foo) # i.e., unbound
1667 self.assert_(repr(C.foo.__get__(C(1))).startswith("<bound method "))
1668
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001669 def test_special_method_lookup(self):
1670 # The lookup of special methods bypasses __getattr__ and
1671 # __getattribute__, but they still can be descriptors.
1672
1673 def run_context(manager):
1674 with manager:
1675 pass
1676 def iden(self):
1677 return self
1678 def hello(self):
1679 return "hello"
Benjamin Peterson809e2252009-05-09 02:07:04 +00001680 def empty_seq(self):
1681 return []
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001682 def zero(self):
1683 return 0
1684 def stop(self):
1685 raise StopIteration
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001686
1687 # It would be nice to have every special method tested here, but I'm
1688 # only listing the ones I can remember outside of typeobject.c, since it
1689 # does it right.
1690 specials = [
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001691 ("__unicode__", unicode, hello, {}),
1692 ("__reversed__", reversed, empty_seq, {}),
1693 ("__length_hint__", list, zero,
1694 {"__iter__" : iden, "next" : stop}),
1695 ("__sizeof__", sys.getsizeof, zero, {}),
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001696 # These two fail because the compiler generates LOAD_ATTR to look
1697 # them up. We'd have to add a new opcode to fix this, and it's
1698 # probably not worth it.
1699 # ("__enter__", run_context, iden),
1700 # ("__exit__", run_context, iden),
1701 ]
1702
1703 class Checker(object):
1704 def __getattr__(self, attr, test=self):
1705 test.fail("__getattr__ called with {0}".format(attr))
1706 def __getattribute__(self, attr, test=self):
1707 test.fail("__getattribute__ called with {0}".format(attr))
1708 class SpecialDescr(object):
1709 def __init__(self, impl):
1710 self.impl = impl
1711 def __get__(self, obj, owner):
1712 record.append(1)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001713 return self.impl.__get__(obj, owner)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001714
1715
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001716 for name, runner, meth_impl, env in specials:
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001717 class X(Checker):
1718 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001719 for attr, obj in env.iteritems():
1720 setattr(X, attr, obj)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001721 setattr(X, name, meth_impl)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001722 runner(X())
1723
1724 record = []
1725 class X(Checker):
1726 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001727 for attr, obj in env.iteritems():
1728 setattr(X, attr, obj)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001729 setattr(X, name, SpecialDescr(meth_impl))
1730 runner(X())
1731 self.assertEqual(record, [1], name)
1732
Georg Brandl48545522008-02-02 10:12:36 +00001733 def test_specials(self):
1734 # Testing special operators...
1735 # Test operators like __hash__ for which a built-in default exists
1736
1737 # Test the default behavior for static classes
1738 class C(object):
1739 def __getitem__(self, i):
1740 if 0 <= i < 10: return i
1741 raise IndexError
1742 c1 = C()
1743 c2 = C()
1744 self.assert_(not not c1) # What?
1745 self.assertNotEqual(id(c1), id(c2))
1746 hash(c1)
1747 hash(c2)
1748 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1749 self.assertEqual(c1, c1)
1750 self.assert_(c1 != c2)
1751 self.assert_(not c1 != c1)
1752 self.assert_(not c1 == c2)
1753 # Note that the module name appears in str/repr, and that varies
1754 # depending on whether this test is run standalone or from a framework.
1755 self.assert_(str(c1).find('C object at ') >= 0)
1756 self.assertEqual(str(c1), repr(c1))
1757 self.assert_(-1 not in c1)
1758 for i in range(10):
1759 self.assert_(i in c1)
1760 self.assertFalse(10 in c1)
1761 # Test the default behavior for dynamic classes
1762 class D(object):
1763 def __getitem__(self, i):
1764 if 0 <= i < 10: return i
1765 raise IndexError
1766 d1 = D()
1767 d2 = D()
1768 self.assert_(not not d1)
1769 self.assertNotEqual(id(d1), id(d2))
1770 hash(d1)
1771 hash(d2)
1772 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1773 self.assertEqual(d1, d1)
1774 self.assertNotEqual(d1, d2)
1775 self.assert_(not d1 != d1)
1776 self.assert_(not d1 == d2)
1777 # Note that the module name appears in str/repr, and that varies
1778 # depending on whether this test is run standalone or from a framework.
1779 self.assert_(str(d1).find('D object at ') >= 0)
1780 self.assertEqual(str(d1), repr(d1))
1781 self.assert_(-1 not in d1)
1782 for i in range(10):
1783 self.assert_(i in d1)
1784 self.assertFalse(10 in d1)
1785 # Test overridden behavior for static classes
1786 class Proxy(object):
1787 def __init__(self, x):
1788 self.x = x
1789 def __nonzero__(self):
1790 return not not self.x
1791 def __hash__(self):
1792 return hash(self.x)
1793 def __eq__(self, other):
1794 return self.x == other
1795 def __ne__(self, other):
1796 return self.x != other
1797 def __cmp__(self, other):
1798 return cmp(self.x, other.x)
1799 def __str__(self):
1800 return "Proxy:%s" % self.x
1801 def __repr__(self):
1802 return "Proxy(%r)" % self.x
1803 def __contains__(self, value):
1804 return value in self.x
1805 p0 = Proxy(0)
1806 p1 = Proxy(1)
1807 p_1 = Proxy(-1)
1808 self.assertFalse(p0)
1809 self.assert_(not not p1)
1810 self.assertEqual(hash(p0), hash(0))
1811 self.assertEqual(p0, p0)
1812 self.assertNotEqual(p0, p1)
1813 self.assert_(not p0 != p0)
1814 self.assertEqual(not p0, p1)
1815 self.assertEqual(cmp(p0, p1), -1)
1816 self.assertEqual(cmp(p0, p0), 0)
1817 self.assertEqual(cmp(p0, p_1), 1)
1818 self.assertEqual(str(p0), "Proxy:0")
1819 self.assertEqual(repr(p0), "Proxy(0)")
1820 p10 = Proxy(range(10))
1821 self.assertFalse(-1 in p10)
1822 for i in range(10):
1823 self.assert_(i in p10)
1824 self.assertFalse(10 in p10)
1825 # Test overridden behavior for dynamic classes
1826 class DProxy(object):
1827 def __init__(self, x):
1828 self.x = x
1829 def __nonzero__(self):
1830 return not not self.x
1831 def __hash__(self):
1832 return hash(self.x)
1833 def __eq__(self, other):
1834 return self.x == other
1835 def __ne__(self, other):
1836 return self.x != other
1837 def __cmp__(self, other):
1838 return cmp(self.x, other.x)
1839 def __str__(self):
1840 return "DProxy:%s" % self.x
1841 def __repr__(self):
1842 return "DProxy(%r)" % self.x
1843 def __contains__(self, value):
1844 return value in self.x
1845 p0 = DProxy(0)
1846 p1 = DProxy(1)
1847 p_1 = DProxy(-1)
1848 self.assertFalse(p0)
1849 self.assert_(not not p1)
1850 self.assertEqual(hash(p0), hash(0))
1851 self.assertEqual(p0, p0)
1852 self.assertNotEqual(p0, p1)
1853 self.assertNotEqual(not p0, p0)
1854 self.assertEqual(not p0, p1)
1855 self.assertEqual(cmp(p0, p1), -1)
1856 self.assertEqual(cmp(p0, p0), 0)
1857 self.assertEqual(cmp(p0, p_1), 1)
1858 self.assertEqual(str(p0), "DProxy:0")
1859 self.assertEqual(repr(p0), "DProxy(0)")
1860 p10 = DProxy(range(10))
1861 self.assertFalse(-1 in p10)
1862 for i in range(10):
1863 self.assert_(i in p10)
1864 self.assertFalse(10 in p10)
1865
1866 # Safety test for __cmp__
1867 def unsafecmp(a, b):
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001868 if not hasattr(a, '__cmp__'):
1869 return # some types don't have a __cmp__ any more (so the
1870 # test doesn't make sense any more), or maybe they
1871 # never had a __cmp__ at all, e.g. in PyPy
Georg Brandl48545522008-02-02 10:12:36 +00001872 try:
1873 a.__class__.__cmp__(a, b)
1874 except TypeError:
1875 pass
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001876 else:
Georg Brandl48545522008-02-02 10:12:36 +00001877 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1878 a.__class__, a, b))
1879
1880 unsafecmp(u"123", "123")
1881 unsafecmp("123", u"123")
1882 unsafecmp(1, 1.0)
1883 unsafecmp(1.0, 1)
1884 unsafecmp(1, 1L)
1885 unsafecmp(1L, 1)
1886
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001887 @test_support.impl_detail("custom logic for printing to real file objects")
1888 def test_recursions_1(self):
Georg Brandl48545522008-02-02 10:12:36 +00001889 # Testing recursion checks ...
1890 class Letter(str):
1891 def __new__(cls, letter):
1892 if letter == 'EPS':
1893 return str.__new__(cls)
1894 return str.__new__(cls, letter)
1895 def __str__(self):
1896 if not self:
1897 return 'EPS'
1898 return self
1899 # sys.stdout needs to be the original to trigger the recursion bug
1900 import sys
1901 test_stdout = sys.stdout
1902 sys.stdout = test_support.get_original_stdout()
1903 try:
1904 # nothing should actually be printed, this should raise an exception
1905 print Letter('w')
1906 except RuntimeError:
1907 pass
1908 else:
1909 self.fail("expected a RuntimeError for print recursion")
1910 finally:
1911 sys.stdout = test_stdout
1912
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001913 def test_recursions_2(self):
Georg Brandl48545522008-02-02 10:12:36 +00001914 # Bug #1202533.
1915 class A(object):
1916 pass
1917 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
1918 try:
1919 A()*2
1920 except RuntimeError:
1921 pass
1922 else:
1923 self.fail("expected a RuntimeError")
1924
1925 def test_weakrefs(self):
1926 # Testing weak references...
1927 import weakref
1928 class C(object):
1929 pass
1930 c = C()
1931 r = weakref.ref(c)
1932 self.assertEqual(r(), c)
1933 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001934 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001935 self.assertEqual(r(), None)
1936 del r
1937 class NoWeak(object):
1938 __slots__ = ['foo']
1939 no = NoWeak()
1940 try:
1941 weakref.ref(no)
1942 except TypeError, msg:
1943 self.assert_(str(msg).find("weak reference") >= 0)
1944 else:
1945 self.fail("weakref.ref(no) should be illegal")
1946 class Weak(object):
1947 __slots__ = ['foo', '__weakref__']
1948 yes = Weak()
1949 r = weakref.ref(yes)
1950 self.assertEqual(r(), yes)
1951 del yes
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001952 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001953 self.assertEqual(r(), None)
1954 del r
1955
1956 def test_properties(self):
1957 # Testing property...
1958 class C(object):
1959 def getx(self):
1960 return self.__x
1961 def setx(self, value):
1962 self.__x = value
1963 def delx(self):
1964 del self.__x
1965 x = property(getx, setx, delx, doc="I'm the x property.")
1966 a = C()
1967 self.assertFalse(hasattr(a, "x"))
1968 a.x = 42
1969 self.assertEqual(a._C__x, 42)
1970 self.assertEqual(a.x, 42)
1971 del a.x
1972 self.assertFalse(hasattr(a, "x"))
1973 self.assertFalse(hasattr(a, "_C__x"))
1974 C.x.__set__(a, 100)
1975 self.assertEqual(C.x.__get__(a), 100)
1976 C.x.__delete__(a)
1977 self.assertFalse(hasattr(a, "x"))
1978
1979 raw = C.__dict__['x']
1980 self.assert_(isinstance(raw, property))
1981
1982 attrs = dir(raw)
1983 self.assert_("__doc__" in attrs)
1984 self.assert_("fget" in attrs)
1985 self.assert_("fset" in attrs)
1986 self.assert_("fdel" in attrs)
1987
1988 self.assertEqual(raw.__doc__, "I'm the x property.")
1989 self.assert_(raw.fget is C.__dict__['getx'])
1990 self.assert_(raw.fset is C.__dict__['setx'])
1991 self.assert_(raw.fdel is C.__dict__['delx'])
1992
1993 for attr in "__doc__", "fget", "fset", "fdel":
1994 try:
1995 setattr(raw, attr, 42)
1996 except TypeError, msg:
1997 if str(msg).find('readonly') < 0:
1998 self.fail("when setting readonly attr %r on a property, "
1999 "got unexpected TypeError msg %r" % (attr, str(msg)))
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002000 else:
Georg Brandl48545522008-02-02 10:12:36 +00002001 self.fail("expected TypeError from trying to set readonly %r "
2002 "attr on a property" % attr)
Tim Peters2f93e282001-10-04 05:27:00 +00002003
Georg Brandl48545522008-02-02 10:12:36 +00002004 class D(object):
2005 __getitem__ = property(lambda s: 1/0)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002006
Georg Brandl48545522008-02-02 10:12:36 +00002007 d = D()
2008 try:
2009 for i in d:
2010 str(i)
2011 except ZeroDivisionError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002012 pass
Georg Brandl48545522008-02-02 10:12:36 +00002013 else:
2014 self.fail("expected ZeroDivisionError from bad property")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002015
Georg Brandl48545522008-02-02 10:12:36 +00002016 class E(object):
2017 def getter(self):
2018 "getter method"
2019 return 0
2020 def setter(self_, value):
2021 "setter method"
2022 pass
2023 prop = property(getter)
2024 self.assertEqual(prop.__doc__, "getter method")
2025 prop2 = property(fset=setter)
2026 self.assertEqual(prop2.__doc__, None)
2027
2028 # this segfaulted in 2.5b2
2029 try:
2030 import _testcapi
2031 except ImportError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002032 pass
Georg Brandl48545522008-02-02 10:12:36 +00002033 else:
2034 class X(object):
2035 p = property(_testcapi.test_with_docstring)
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002036
Georg Brandl48545522008-02-02 10:12:36 +00002037 def test_properties_plus(self):
2038 class C(object):
2039 foo = property(doc="hello")
2040 @foo.getter
2041 def foo(self):
2042 return self._foo
2043 @foo.setter
2044 def foo(self, value):
2045 self._foo = abs(value)
2046 @foo.deleter
2047 def foo(self):
2048 del self._foo
2049 c = C()
2050 self.assertEqual(C.foo.__doc__, "hello")
2051 self.assertFalse(hasattr(c, "foo"))
2052 c.foo = -42
2053 self.assert_(hasattr(c, '_foo'))
2054 self.assertEqual(c._foo, 42)
2055 self.assertEqual(c.foo, 42)
2056 del c.foo
2057 self.assertFalse(hasattr(c, '_foo'))
2058 self.assertFalse(hasattr(c, "foo"))
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002059
Georg Brandl48545522008-02-02 10:12:36 +00002060 class D(C):
2061 @C.foo.deleter
2062 def foo(self):
2063 try:
2064 del self._foo
2065 except AttributeError:
2066 pass
2067 d = D()
2068 d.foo = 24
2069 self.assertEqual(d.foo, 24)
2070 del d.foo
2071 del d.foo
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002072
Georg Brandl48545522008-02-02 10:12:36 +00002073 class E(object):
2074 @property
2075 def foo(self):
2076 return self._foo
2077 @foo.setter
2078 def foo(self, value):
2079 raise RuntimeError
2080 @foo.setter
2081 def foo(self, value):
2082 self._foo = abs(value)
2083 @foo.deleter
2084 def foo(self, value=None):
2085 del self._foo
Guido van Rossume8fc6402002-04-16 16:44:51 +00002086
Georg Brandl48545522008-02-02 10:12:36 +00002087 e = E()
2088 e.foo = -42
2089 self.assertEqual(e.foo, 42)
2090 del e.foo
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002091
Georg Brandl48545522008-02-02 10:12:36 +00002092 class F(E):
2093 @E.foo.deleter
2094 def foo(self):
2095 del self._foo
2096 @foo.setter
2097 def foo(self, value):
2098 self._foo = max(0, value)
2099 f = F()
2100 f.foo = -10
2101 self.assertEqual(f.foo, 0)
2102 del f.foo
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00002103
Georg Brandl48545522008-02-02 10:12:36 +00002104 def test_dict_constructors(self):
2105 # Testing dict constructor ...
2106 d = dict()
2107 self.assertEqual(d, {})
2108 d = dict({})
2109 self.assertEqual(d, {})
2110 d = dict({1: 2, 'a': 'b'})
2111 self.assertEqual(d, {1: 2, 'a': 'b'})
2112 self.assertEqual(d, dict(d.items()))
2113 self.assertEqual(d, dict(d.iteritems()))
2114 d = dict({'one':1, 'two':2})
2115 self.assertEqual(d, dict(one=1, two=2))
2116 self.assertEqual(d, dict(**d))
2117 self.assertEqual(d, dict({"one": 1}, two=2))
2118 self.assertEqual(d, dict([("two", 2)], one=1))
2119 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
2120 self.assertEqual(d, dict(**d))
Guido van Rossum09638c12002-06-13 19:17:46 +00002121
Georg Brandl48545522008-02-02 10:12:36 +00002122 for badarg in 0, 0L, 0j, "0", [0], (0,):
2123 try:
2124 dict(badarg)
2125 except TypeError:
2126 pass
2127 except ValueError:
2128 if badarg == "0":
2129 # It's a sequence, and its elements are also sequences (gotta
2130 # love strings <wink>), but they aren't of length 2, so this
2131 # one seemed better as a ValueError than a TypeError.
2132 pass
2133 else:
2134 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002135 else:
Georg Brandl48545522008-02-02 10:12:36 +00002136 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002137
Georg Brandl48545522008-02-02 10:12:36 +00002138 try:
2139 dict({}, {})
2140 except TypeError:
2141 pass
2142 else:
2143 self.fail("no TypeError from dict({}, {})")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002144
Georg Brandl48545522008-02-02 10:12:36 +00002145 class Mapping:
2146 # Lacks a .keys() method; will be added later.
2147 dict = {1:2, 3:4, 'a':1j}
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002148
Georg Brandl48545522008-02-02 10:12:36 +00002149 try:
2150 dict(Mapping())
2151 except TypeError:
2152 pass
2153 else:
2154 self.fail("no TypeError from dict(incomplete mapping)")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002155
Georg Brandl48545522008-02-02 10:12:36 +00002156 Mapping.keys = lambda self: self.dict.keys()
2157 Mapping.__getitem__ = lambda self, i: self.dict[i]
2158 d = dict(Mapping())
2159 self.assertEqual(d, Mapping.dict)
Michael W. Hudsonf3904422006-11-23 13:54:04 +00002160
Georg Brandl48545522008-02-02 10:12:36 +00002161 # Init from sequence of iterable objects, each producing a 2-sequence.
2162 class AddressBookEntry:
2163 def __init__(self, first, last):
2164 self.first = first
2165 self.last = last
2166 def __iter__(self):
2167 return iter([self.first, self.last])
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002168
Georg Brandl48545522008-02-02 10:12:36 +00002169 d = dict([AddressBookEntry('Tim', 'Warsaw'),
2170 AddressBookEntry('Barry', 'Peters'),
2171 AddressBookEntry('Tim', 'Peters'),
2172 AddressBookEntry('Barry', 'Warsaw')])
2173 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00002174
Georg Brandl48545522008-02-02 10:12:36 +00002175 d = dict(zip(range(4), range(1, 5)))
2176 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002177
Georg Brandl48545522008-02-02 10:12:36 +00002178 # Bad sequence lengths.
2179 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2180 try:
2181 dict(bad)
2182 except ValueError:
2183 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00002184 else:
Georg Brandl48545522008-02-02 10:12:36 +00002185 self.fail("no ValueError from dict(%r)" % bad)
2186
2187 def test_dir(self):
2188 # Testing dir() ...
2189 junk = 12
2190 self.assertEqual(dir(), ['junk', 'self'])
2191 del junk
2192
2193 # Just make sure these don't blow up!
2194 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
2195 dir(arg)
2196
2197 # Try classic classes.
2198 class C:
2199 Cdata = 1
2200 def Cmethod(self): pass
2201
2202 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
2203 self.assertEqual(dir(C), cstuff)
2204 self.assert_('im_self' in dir(C.Cmethod))
2205
2206 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
2207 self.assertEqual(dir(c), cstuff)
2208
2209 c.cdata = 2
2210 c.cmethod = lambda self: 0
2211 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
2212 self.assert_('im_self' in dir(c.Cmethod))
2213
2214 class A(C):
2215 Adata = 1
2216 def Amethod(self): pass
2217
2218 astuff = ['Adata', 'Amethod'] + cstuff
2219 self.assertEqual(dir(A), astuff)
2220 self.assert_('im_self' in dir(A.Amethod))
2221 a = A()
2222 self.assertEqual(dir(a), astuff)
2223 self.assert_('im_self' in dir(a.Amethod))
2224 a.adata = 42
2225 a.amethod = lambda self: 3
2226 self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
2227
2228 # The same, but with new-style classes. Since these have object as a
2229 # base class, a lot more gets sucked in.
2230 def interesting(strings):
2231 return [s for s in strings if not s.startswith('_')]
2232
2233 class C(object):
2234 Cdata = 1
2235 def Cmethod(self): pass
2236
2237 cstuff = ['Cdata', 'Cmethod']
2238 self.assertEqual(interesting(dir(C)), cstuff)
2239
2240 c = C()
2241 self.assertEqual(interesting(dir(c)), cstuff)
2242 self.assert_('im_self' in dir(C.Cmethod))
2243
2244 c.cdata = 2
2245 c.cmethod = lambda self: 0
2246 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
2247 self.assert_('im_self' in dir(c.Cmethod))
2248
2249 class A(C):
2250 Adata = 1
2251 def Amethod(self): pass
2252
2253 astuff = ['Adata', 'Amethod'] + cstuff
2254 self.assertEqual(interesting(dir(A)), astuff)
2255 self.assert_('im_self' in dir(A.Amethod))
2256 a = A()
2257 self.assertEqual(interesting(dir(a)), astuff)
2258 a.adata = 42
2259 a.amethod = lambda self: 3
2260 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
2261 self.assert_('im_self' in dir(a.Amethod))
2262
2263 # Try a module subclass.
2264 import sys
2265 class M(type(sys)):
2266 pass
2267 minstance = M("m")
2268 minstance.b = 2
2269 minstance.a = 1
2270 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2271 self.assertEqual(names, ['a', 'b'])
2272
2273 class M2(M):
2274 def getdict(self):
2275 return "Not a dict!"
2276 __dict__ = property(getdict)
2277
2278 m2instance = M2("m2")
2279 m2instance.b = 2
2280 m2instance.a = 1
2281 self.assertEqual(m2instance.__dict__, "Not a dict!")
2282 try:
2283 dir(m2instance)
2284 except TypeError:
2285 pass
2286
2287 # Two essentially featureless objects, just inheriting stuff from
2288 # object.
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002289 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2290 if test_support.check_impl_detail():
2291 # None differs in PyPy: it has a __nonzero__
2292 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl48545522008-02-02 10:12:36 +00002293
2294 # Nasty test case for proxied objects
2295 class Wrapper(object):
2296 def __init__(self, obj):
2297 self.__obj = obj
2298 def __repr__(self):
2299 return "Wrapper(%s)" % repr(self.__obj)
2300 def __getitem__(self, key):
2301 return Wrapper(self.__obj[key])
2302 def __len__(self):
2303 return len(self.__obj)
2304 def __getattr__(self, name):
2305 return Wrapper(getattr(self.__obj, name))
2306
2307 class C(object):
2308 def __getclass(self):
2309 return Wrapper(type(self))
2310 __class__ = property(__getclass)
2311
2312 dir(C()) # This used to segfault
2313
2314 def test_supers(self):
2315 # Testing super...
2316
2317 class A(object):
2318 def meth(self, a):
2319 return "A(%r)" % a
2320
2321 self.assertEqual(A().meth(1), "A(1)")
2322
2323 class B(A):
2324 def __init__(self):
2325 self.__super = super(B, self)
2326 def meth(self, a):
2327 return "B(%r)" % a + self.__super.meth(a)
2328
2329 self.assertEqual(B().meth(2), "B(2)A(2)")
2330
2331 class C(A):
2332 def meth(self, a):
2333 return "C(%r)" % a + self.__super.meth(a)
2334 C._C__super = super(C)
2335
2336 self.assertEqual(C().meth(3), "C(3)A(3)")
2337
2338 class D(C, B):
2339 def meth(self, a):
2340 return "D(%r)" % a + super(D, self).meth(a)
2341
2342 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2343
2344 # Test for subclassing super
2345
2346 class mysuper(super):
2347 def __init__(self, *args):
2348 return super(mysuper, self).__init__(*args)
2349
2350 class E(D):
2351 def meth(self, a):
2352 return "E(%r)" % a + mysuper(E, self).meth(a)
2353
2354 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2355
2356 class F(E):
2357 def meth(self, a):
2358 s = self.__super # == mysuper(F, self)
2359 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2360 F._F__super = mysuper(F)
2361
2362 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2363
2364 # Make sure certain errors are raised
2365
2366 try:
2367 super(D, 42)
2368 except TypeError:
2369 pass
2370 else:
2371 self.fail("shouldn't allow super(D, 42)")
2372
2373 try:
2374 super(D, C())
2375 except TypeError:
2376 pass
2377 else:
2378 self.fail("shouldn't allow super(D, C())")
2379
2380 try:
2381 super(D).__get__(12)
2382 except TypeError:
2383 pass
2384 else:
2385 self.fail("shouldn't allow super(D).__get__(12)")
2386
2387 try:
2388 super(D).__get__(C())
2389 except TypeError:
2390 pass
2391 else:
2392 self.fail("shouldn't allow super(D).__get__(C())")
2393
2394 # Make sure data descriptors can be overridden and accessed via super
2395 # (new feature in Python 2.3)
2396
2397 class DDbase(object):
2398 def getx(self): return 42
2399 x = property(getx)
2400
2401 class DDsub(DDbase):
2402 def getx(self): return "hello"
2403 x = property(getx)
2404
2405 dd = DDsub()
2406 self.assertEqual(dd.x, "hello")
2407 self.assertEqual(super(DDsub, dd).x, 42)
2408
2409 # Ensure that super() lookup of descriptor from classmethod
2410 # works (SF ID# 743627)
2411
2412 class Base(object):
2413 aProp = property(lambda self: "foo")
2414
2415 class Sub(Base):
2416 @classmethod
2417 def test(klass):
2418 return super(Sub,klass).aProp
2419
2420 self.assertEqual(Sub.test(), Base.aProp)
2421
2422 # Verify that super() doesn't allow keyword args
2423 try:
2424 super(Base, kw=1)
2425 except TypeError:
2426 pass
2427 else:
2428 self.assertEqual("super shouldn't accept keyword args")
2429
2430 def test_basic_inheritance(self):
2431 # Testing inheritance from basic types...
2432
2433 class hexint(int):
2434 def __repr__(self):
2435 return hex(self)
2436 def __add__(self, other):
2437 return hexint(int.__add__(self, other))
2438 # (Note that overriding __radd__ doesn't work,
2439 # because the int type gets first dibs.)
2440 self.assertEqual(repr(hexint(7) + 9), "0x10")
2441 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2442 a = hexint(12345)
2443 self.assertEqual(a, 12345)
2444 self.assertEqual(int(a), 12345)
2445 self.assert_(int(a).__class__ is int)
2446 self.assertEqual(hash(a), hash(12345))
2447 self.assert_((+a).__class__ is int)
2448 self.assert_((a >> 0).__class__ is int)
2449 self.assert_((a << 0).__class__ is int)
2450 self.assert_((hexint(0) << 12).__class__ is int)
2451 self.assert_((hexint(0) >> 12).__class__ is int)
2452
2453 class octlong(long):
2454 __slots__ = []
2455 def __str__(self):
2456 s = oct(self)
2457 if s[-1] == 'L':
2458 s = s[:-1]
2459 return s
2460 def __add__(self, other):
2461 return self.__class__(super(octlong, self).__add__(other))
2462 __radd__ = __add__
2463 self.assertEqual(str(octlong(3) + 5), "010")
2464 # (Note that overriding __radd__ here only seems to work
2465 # because the example uses a short int left argument.)
2466 self.assertEqual(str(5 + octlong(3000)), "05675")
2467 a = octlong(12345)
2468 self.assertEqual(a, 12345L)
2469 self.assertEqual(long(a), 12345L)
2470 self.assertEqual(hash(a), hash(12345L))
2471 self.assert_(long(a).__class__ is long)
2472 self.assert_((+a).__class__ is long)
2473 self.assert_((-a).__class__ is long)
2474 self.assert_((-octlong(0)).__class__ is long)
2475 self.assert_((a >> 0).__class__ is long)
2476 self.assert_((a << 0).__class__ is long)
2477 self.assert_((a - 0).__class__ is long)
2478 self.assert_((a * 1).__class__ is long)
2479 self.assert_((a ** 1).__class__ is long)
2480 self.assert_((a // 1).__class__ is long)
2481 self.assert_((1 * a).__class__ is long)
2482 self.assert_((a | 0).__class__ is long)
2483 self.assert_((a ^ 0).__class__ is long)
2484 self.assert_((a & -1L).__class__ is long)
2485 self.assert_((octlong(0) << 12).__class__ is long)
2486 self.assert_((octlong(0) >> 12).__class__ is long)
2487 self.assert_(abs(octlong(0)).__class__ is long)
2488
2489 # Because octlong overrides __add__, we can't check the absence of +0
2490 # optimizations using octlong.
2491 class longclone(long):
2492 pass
2493 a = longclone(1)
2494 self.assert_((a + 0).__class__ is long)
2495 self.assert_((0 + a).__class__ is long)
2496
2497 # Check that negative clones don't segfault
2498 a = longclone(-1)
2499 self.assertEqual(a.__dict__, {})
2500 self.assertEqual(long(a), -1) # self.assert_ PyNumber_Long() copies the sign bit
2501
2502 class precfloat(float):
2503 __slots__ = ['prec']
2504 def __init__(self, value=0.0, prec=12):
2505 self.prec = int(prec)
2506 def __repr__(self):
2507 return "%.*g" % (self.prec, self)
2508 self.assertEqual(repr(precfloat(1.1)), "1.1")
2509 a = precfloat(12345)
2510 self.assertEqual(a, 12345.0)
2511 self.assertEqual(float(a), 12345.0)
2512 self.assert_(float(a).__class__ is float)
2513 self.assertEqual(hash(a), hash(12345.0))
2514 self.assert_((+a).__class__ is float)
2515
2516 class madcomplex(complex):
2517 def __repr__(self):
2518 return "%.17gj%+.17g" % (self.imag, self.real)
2519 a = madcomplex(-3, 4)
2520 self.assertEqual(repr(a), "4j-3")
2521 base = complex(-3, 4)
2522 self.assertEqual(base.__class__, complex)
2523 self.assertEqual(a, base)
2524 self.assertEqual(complex(a), base)
2525 self.assertEqual(complex(a).__class__, complex)
2526 a = madcomplex(a) # just trying another form of the constructor
2527 self.assertEqual(repr(a), "4j-3")
2528 self.assertEqual(a, base)
2529 self.assertEqual(complex(a), base)
2530 self.assertEqual(complex(a).__class__, complex)
2531 self.assertEqual(hash(a), hash(base))
2532 self.assertEqual((+a).__class__, complex)
2533 self.assertEqual((a + 0).__class__, complex)
2534 self.assertEqual(a + 0, base)
2535 self.assertEqual((a - 0).__class__, complex)
2536 self.assertEqual(a - 0, base)
2537 self.assertEqual((a * 1).__class__, complex)
2538 self.assertEqual(a * 1, base)
2539 self.assertEqual((a / 1).__class__, complex)
2540 self.assertEqual(a / 1, base)
2541
2542 class madtuple(tuple):
2543 _rev = None
2544 def rev(self):
2545 if self._rev is not None:
2546 return self._rev
2547 L = list(self)
2548 L.reverse()
2549 self._rev = self.__class__(L)
2550 return self._rev
2551 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2552 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2553 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2554 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2555 for i in range(512):
2556 t = madtuple(range(i))
2557 u = t.rev()
2558 v = u.rev()
2559 self.assertEqual(v, t)
2560 a = madtuple((1,2,3,4,5))
2561 self.assertEqual(tuple(a), (1,2,3,4,5))
2562 self.assert_(tuple(a).__class__ is tuple)
2563 self.assertEqual(hash(a), hash((1,2,3,4,5)))
2564 self.assert_(a[:].__class__ is tuple)
2565 self.assert_((a * 1).__class__ is tuple)
2566 self.assert_((a * 0).__class__ is tuple)
2567 self.assert_((a + ()).__class__ is tuple)
2568 a = madtuple(())
2569 self.assertEqual(tuple(a), ())
2570 self.assert_(tuple(a).__class__ is tuple)
2571 self.assert_((a + a).__class__ is tuple)
2572 self.assert_((a * 0).__class__ is tuple)
2573 self.assert_((a * 1).__class__ is tuple)
2574 self.assert_((a * 2).__class__ is tuple)
2575 self.assert_(a[:].__class__ is tuple)
2576
2577 class madstring(str):
2578 _rev = None
2579 def rev(self):
2580 if self._rev is not None:
2581 return self._rev
2582 L = list(self)
2583 L.reverse()
2584 self._rev = self.__class__("".join(L))
2585 return self._rev
2586 s = madstring("abcdefghijklmnopqrstuvwxyz")
2587 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2588 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2589 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2590 for i in range(256):
2591 s = madstring("".join(map(chr, range(i))))
2592 t = s.rev()
2593 u = t.rev()
2594 self.assertEqual(u, s)
2595 s = madstring("12345")
2596 self.assertEqual(str(s), "12345")
2597 self.assert_(str(s).__class__ is str)
2598
2599 base = "\x00" * 5
2600 s = madstring(base)
2601 self.assertEqual(s, base)
2602 self.assertEqual(str(s), base)
2603 self.assert_(str(s).__class__ is str)
2604 self.assertEqual(hash(s), hash(base))
2605 self.assertEqual({s: 1}[base], 1)
2606 self.assertEqual({base: 1}[s], 1)
2607 self.assert_((s + "").__class__ is str)
2608 self.assertEqual(s + "", base)
2609 self.assert_(("" + s).__class__ is str)
2610 self.assertEqual("" + s, base)
2611 self.assert_((s * 0).__class__ is str)
2612 self.assertEqual(s * 0, "")
2613 self.assert_((s * 1).__class__ is str)
2614 self.assertEqual(s * 1, base)
2615 self.assert_((s * 2).__class__ is str)
2616 self.assertEqual(s * 2, base + base)
2617 self.assert_(s[:].__class__ is str)
2618 self.assertEqual(s[:], base)
2619 self.assert_(s[0:0].__class__ is str)
2620 self.assertEqual(s[0:0], "")
2621 self.assert_(s.strip().__class__ is str)
2622 self.assertEqual(s.strip(), base)
2623 self.assert_(s.lstrip().__class__ is str)
2624 self.assertEqual(s.lstrip(), base)
2625 self.assert_(s.rstrip().__class__ is str)
2626 self.assertEqual(s.rstrip(), base)
2627 identitytab = ''.join([chr(i) for i in range(256)])
2628 self.assert_(s.translate(identitytab).__class__ is str)
2629 self.assertEqual(s.translate(identitytab), base)
2630 self.assert_(s.translate(identitytab, "x").__class__ is str)
2631 self.assertEqual(s.translate(identitytab, "x"), base)
2632 self.assertEqual(s.translate(identitytab, "\x00"), "")
2633 self.assert_(s.replace("x", "x").__class__ is str)
2634 self.assertEqual(s.replace("x", "x"), base)
2635 self.assert_(s.ljust(len(s)).__class__ is str)
2636 self.assertEqual(s.ljust(len(s)), base)
2637 self.assert_(s.rjust(len(s)).__class__ is str)
2638 self.assertEqual(s.rjust(len(s)), base)
2639 self.assert_(s.center(len(s)).__class__ is str)
2640 self.assertEqual(s.center(len(s)), base)
2641 self.assert_(s.lower().__class__ is str)
2642 self.assertEqual(s.lower(), base)
2643
2644 class madunicode(unicode):
2645 _rev = None
2646 def rev(self):
2647 if self._rev is not None:
2648 return self._rev
2649 L = list(self)
2650 L.reverse()
2651 self._rev = self.__class__(u"".join(L))
2652 return self._rev
2653 u = madunicode("ABCDEF")
2654 self.assertEqual(u, u"ABCDEF")
2655 self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
2656 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
2657 base = u"12345"
2658 u = madunicode(base)
2659 self.assertEqual(unicode(u), base)
2660 self.assert_(unicode(u).__class__ is unicode)
2661 self.assertEqual(hash(u), hash(base))
2662 self.assertEqual({u: 1}[base], 1)
2663 self.assertEqual({base: 1}[u], 1)
2664 self.assert_(u.strip().__class__ is unicode)
2665 self.assertEqual(u.strip(), base)
2666 self.assert_(u.lstrip().__class__ is unicode)
2667 self.assertEqual(u.lstrip(), base)
2668 self.assert_(u.rstrip().__class__ is unicode)
2669 self.assertEqual(u.rstrip(), base)
2670 self.assert_(u.replace(u"x", u"x").__class__ is unicode)
2671 self.assertEqual(u.replace(u"x", u"x"), base)
2672 self.assert_(u.replace(u"xy", u"xy").__class__ is unicode)
2673 self.assertEqual(u.replace(u"xy", u"xy"), base)
2674 self.assert_(u.center(len(u)).__class__ is unicode)
2675 self.assertEqual(u.center(len(u)), base)
2676 self.assert_(u.ljust(len(u)).__class__ is unicode)
2677 self.assertEqual(u.ljust(len(u)), base)
2678 self.assert_(u.rjust(len(u)).__class__ is unicode)
2679 self.assertEqual(u.rjust(len(u)), base)
2680 self.assert_(u.lower().__class__ is unicode)
2681 self.assertEqual(u.lower(), base)
2682 self.assert_(u.upper().__class__ is unicode)
2683 self.assertEqual(u.upper(), base)
2684 self.assert_(u.capitalize().__class__ is unicode)
2685 self.assertEqual(u.capitalize(), base)
2686 self.assert_(u.title().__class__ is unicode)
2687 self.assertEqual(u.title(), base)
2688 self.assert_((u + u"").__class__ is unicode)
2689 self.assertEqual(u + u"", base)
2690 self.assert_((u"" + u).__class__ is unicode)
2691 self.assertEqual(u"" + u, base)
2692 self.assert_((u * 0).__class__ is unicode)
2693 self.assertEqual(u * 0, u"")
2694 self.assert_((u * 1).__class__ is unicode)
2695 self.assertEqual(u * 1, base)
2696 self.assert_((u * 2).__class__ is unicode)
2697 self.assertEqual(u * 2, base + base)
2698 self.assert_(u[:].__class__ is unicode)
2699 self.assertEqual(u[:], base)
2700 self.assert_(u[0:0].__class__ is unicode)
2701 self.assertEqual(u[0:0], u"")
2702
2703 class sublist(list):
2704 pass
2705 a = sublist(range(5))
2706 self.assertEqual(a, range(5))
2707 a.append("hello")
2708 self.assertEqual(a, range(5) + ["hello"])
2709 a[5] = 5
2710 self.assertEqual(a, range(6))
2711 a.extend(range(6, 20))
2712 self.assertEqual(a, range(20))
2713 a[-5:] = []
2714 self.assertEqual(a, range(15))
2715 del a[10:15]
2716 self.assertEqual(len(a), 10)
2717 self.assertEqual(a, range(10))
2718 self.assertEqual(list(a), range(10))
2719 self.assertEqual(a[0], 0)
2720 self.assertEqual(a[9], 9)
2721 self.assertEqual(a[-10], 0)
2722 self.assertEqual(a[-1], 9)
2723 self.assertEqual(a[:5], range(5))
2724
2725 class CountedInput(file):
2726 """Counts lines read by self.readline().
2727
2728 self.lineno is the 0-based ordinal of the last line read, up to
2729 a maximum of one greater than the number of lines in the file.
2730
2731 self.ateof is true if and only if the final "" line has been read,
2732 at which point self.lineno stops incrementing, and further calls
2733 to readline() continue to return "".
2734 """
2735
2736 lineno = 0
2737 ateof = 0
2738 def readline(self):
2739 if self.ateof:
2740 return ""
2741 s = file.readline(self)
2742 # Next line works too.
2743 # s = super(CountedInput, self).readline()
2744 self.lineno += 1
2745 if s == "":
2746 self.ateof = 1
2747 return s
2748
2749 f = file(name=test_support.TESTFN, mode='w')
2750 lines = ['a\n', 'b\n', 'c\n']
2751 try:
2752 f.writelines(lines)
2753 f.close()
2754 f = CountedInput(test_support.TESTFN)
2755 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2756 got = f.readline()
2757 self.assertEqual(expected, got)
2758 self.assertEqual(f.lineno, i)
2759 self.assertEqual(f.ateof, (i > len(lines)))
2760 f.close()
2761 finally:
2762 try:
2763 f.close()
2764 except:
2765 pass
2766 test_support.unlink(test_support.TESTFN)
2767
2768 def test_keywords(self):
2769 # Testing keyword args to basic type constructors ...
2770 self.assertEqual(int(x=1), 1)
2771 self.assertEqual(float(x=2), 2.0)
2772 self.assertEqual(long(x=3), 3L)
2773 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2774 self.assertEqual(str(object=500), '500')
2775 self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
2776 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2777 self.assertEqual(list(sequence=(0, 1, 2)), range(3))
2778 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2779
2780 for constructor in (int, float, long, complex, str, unicode,
2781 tuple, list, file):
2782 try:
2783 constructor(bogus_keyword_arg=1)
2784 except TypeError:
2785 pass
2786 else:
2787 self.fail("expected TypeError from bogus keyword argument to %r"
2788 % constructor)
2789
2790 def test_str_subclass_as_dict_key(self):
2791 # Testing a str subclass used as dict key ..
2792
2793 class cistr(str):
2794 """Sublcass of str that computes __eq__ case-insensitively.
2795
2796 Also computes a hash code of the string in canonical form.
2797 """
2798
2799 def __init__(self, value):
2800 self.canonical = value.lower()
2801 self.hashcode = hash(self.canonical)
2802
2803 def __eq__(self, other):
2804 if not isinstance(other, cistr):
2805 other = cistr(other)
2806 return self.canonical == other.canonical
2807
2808 def __hash__(self):
2809 return self.hashcode
2810
2811 self.assertEqual(cistr('ABC'), 'abc')
2812 self.assertEqual('aBc', cistr('ABC'))
2813 self.assertEqual(str(cistr('ABC')), 'ABC')
2814
2815 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2816 self.assertEqual(d[cistr('one')], 1)
2817 self.assertEqual(d[cistr('tWo')], 2)
2818 self.assertEqual(d[cistr('THrEE')], 3)
2819 self.assert_(cistr('ONe') in d)
2820 self.assertEqual(d.get(cistr('thrEE')), 3)
2821
2822 def test_classic_comparisons(self):
2823 # Testing classic comparisons...
2824 class classic:
2825 pass
2826
2827 for base in (classic, int, object):
2828 class C(base):
2829 def __init__(self, value):
2830 self.value = int(value)
2831 def __cmp__(self, other):
2832 if isinstance(other, C):
2833 return cmp(self.value, other.value)
2834 if isinstance(other, int) or isinstance(other, long):
2835 return cmp(self.value, other)
2836 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002837 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002838
2839 c1 = C(1)
2840 c2 = C(2)
2841 c3 = C(3)
2842 self.assertEqual(c1, 1)
2843 c = {1: c1, 2: c2, 3: c3}
2844 for x in 1, 2, 3:
2845 for y in 1, 2, 3:
2846 self.assert_(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2847 for op in "<", "<=", "==", "!=", ">", ">=":
2848 self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2849 "x=%d, y=%d" % (x, y))
2850 self.assert_(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2851 self.assert_(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2852
2853 def test_rich_comparisons(self):
2854 # Testing rich comparisons...
2855 class Z(complex):
2856 pass
2857 z = Z(1)
2858 self.assertEqual(z, 1+0j)
2859 self.assertEqual(1+0j, z)
2860 class ZZ(complex):
2861 def __eq__(self, other):
2862 try:
2863 return abs(self - other) <= 1e-6
2864 except:
2865 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002866 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002867 zz = ZZ(1.0000003)
2868 self.assertEqual(zz, 1+0j)
2869 self.assertEqual(1+0j, zz)
2870
2871 class classic:
2872 pass
2873 for base in (classic, int, object, list):
2874 class C(base):
2875 def __init__(self, value):
2876 self.value = int(value)
2877 def __cmp__(self_, other):
2878 self.fail("shouldn't call __cmp__")
Nick Coghlan48361f52008-08-11 15:45:58 +00002879 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002880 def __eq__(self, other):
2881 if isinstance(other, C):
2882 return self.value == other.value
2883 if isinstance(other, int) or isinstance(other, long):
2884 return self.value == other
2885 return NotImplemented
2886 def __ne__(self, other):
2887 if isinstance(other, C):
2888 return self.value != other.value
2889 if isinstance(other, int) or isinstance(other, long):
2890 return self.value != other
2891 return NotImplemented
2892 def __lt__(self, other):
2893 if isinstance(other, C):
2894 return self.value < other.value
2895 if isinstance(other, int) or isinstance(other, long):
2896 return self.value < other
2897 return NotImplemented
2898 def __le__(self, other):
2899 if isinstance(other, C):
2900 return self.value <= other.value
2901 if isinstance(other, int) or isinstance(other, long):
2902 return self.value <= other
2903 return NotImplemented
2904 def __gt__(self, other):
2905 if isinstance(other, C):
2906 return self.value > other.value
2907 if isinstance(other, int) or isinstance(other, long):
2908 return self.value > other
2909 return NotImplemented
2910 def __ge__(self, other):
2911 if isinstance(other, C):
2912 return self.value >= other.value
2913 if isinstance(other, int) or isinstance(other, long):
2914 return self.value >= other
2915 return NotImplemented
2916 c1 = C(1)
2917 c2 = C(2)
2918 c3 = C(3)
2919 self.assertEqual(c1, 1)
2920 c = {1: c1, 2: c2, 3: c3}
2921 for x in 1, 2, 3:
2922 for y in 1, 2, 3:
2923 for op in "<", "<=", "==", "!=", ">", ">=":
2924 self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2925 "x=%d, y=%d" % (x, y))
2926 self.assert_(eval("c[x] %s y" % op) == eval("x %s y" % op),
2927 "x=%d, y=%d" % (x, y))
2928 self.assert_(eval("x %s c[y]" % op) == eval("x %s y" % op),
2929 "x=%d, y=%d" % (x, y))
2930
2931 def test_coercions(self):
2932 # Testing coercions...
2933 class I(int): pass
2934 coerce(I(0), 0)
2935 coerce(0, I(0))
2936 class L(long): pass
2937 coerce(L(0), 0)
2938 coerce(L(0), 0L)
2939 coerce(0, L(0))
2940 coerce(0L, L(0))
2941 class F(float): pass
2942 coerce(F(0), 0)
2943 coerce(F(0), 0L)
2944 coerce(F(0), 0.)
2945 coerce(0, F(0))
2946 coerce(0L, F(0))
2947 coerce(0., F(0))
2948 class C(complex): pass
2949 coerce(C(0), 0)
2950 coerce(C(0), 0L)
2951 coerce(C(0), 0.)
2952 coerce(C(0), 0j)
2953 coerce(0, C(0))
2954 coerce(0L, C(0))
2955 coerce(0., C(0))
2956 coerce(0j, C(0))
2957
2958 def test_descrdoc(self):
2959 # Testing descriptor doc strings...
2960 def check(descr, what):
2961 self.assertEqual(descr.__doc__, what)
2962 check(file.closed, "True if the file is closed") # getset descriptor
2963 check(file.name, "file name") # member descriptor
2964
2965 def test_doc_descriptor(self):
2966 # Testing __doc__ descriptor...
2967 # SF bug 542984
2968 class DocDescr(object):
2969 def __get__(self, object, otype):
2970 if object:
2971 object = object.__class__.__name__ + ' instance'
2972 if otype:
2973 otype = otype.__name__
2974 return 'object=%s; type=%s' % (object, otype)
2975 class OldClass:
2976 __doc__ = DocDescr()
2977 class NewClass(object):
2978 __doc__ = DocDescr()
2979 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2980 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2981 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2982 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2983
2984 def test_set_class(self):
2985 # Testing __class__ assignment...
2986 class C(object): pass
2987 class D(object): pass
2988 class E(object): pass
2989 class F(D, E): pass
2990 for cls in C, D, E, F:
2991 for cls2 in C, D, E, F:
2992 x = cls()
2993 x.__class__ = cls2
2994 self.assert_(x.__class__ is cls2)
2995 x.__class__ = cls
2996 self.assert_(x.__class__ is cls)
2997 def cant(x, C):
2998 try:
2999 x.__class__ = C
3000 except TypeError:
3001 pass
3002 else:
3003 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
3004 try:
3005 delattr(x, "__class__")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003006 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003007 pass
3008 else:
3009 self.fail("shouldn't allow del %r.__class__" % x)
3010 cant(C(), list)
3011 cant(list(), C)
3012 cant(C(), 1)
3013 cant(C(), object)
3014 cant(object(), list)
3015 cant(list(), object)
3016 class Int(int): __slots__ = []
3017 cant(2, Int)
3018 cant(Int(), int)
3019 cant(True, int)
3020 cant(2, bool)
3021 o = object()
3022 cant(o, type(1))
3023 cant(o, type(None))
3024 del o
3025 class G(object):
3026 __slots__ = ["a", "b"]
3027 class H(object):
3028 __slots__ = ["b", "a"]
3029 try:
3030 unicode
3031 except NameError:
3032 class I(object):
3033 __slots__ = ["a", "b"]
3034 else:
3035 class I(object):
3036 __slots__ = [unicode("a"), unicode("b")]
3037 class J(object):
3038 __slots__ = ["c", "b"]
3039 class K(object):
3040 __slots__ = ["a", "b", "d"]
3041 class L(H):
3042 __slots__ = ["e"]
3043 class M(I):
3044 __slots__ = ["e"]
3045 class N(J):
3046 __slots__ = ["__weakref__"]
3047 class P(J):
3048 __slots__ = ["__dict__"]
3049 class Q(J):
3050 pass
3051 class R(J):
3052 __slots__ = ["__dict__", "__weakref__"]
3053
3054 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
3055 x = cls()
3056 x.a = 1
3057 x.__class__ = cls2
3058 self.assert_(x.__class__ is cls2,
3059 "assigning %r as __class__ for %r silently failed" % (cls2, x))
3060 self.assertEqual(x.a, 1)
3061 x.__class__ = cls
3062 self.assert_(x.__class__ is cls,
3063 "assigning %r as __class__ for %r silently failed" % (cls, x))
3064 self.assertEqual(x.a, 1)
3065 for cls in G, J, K, L, M, N, P, R, list, Int:
3066 for cls2 in G, J, K, L, M, N, P, R, list, Int:
3067 if cls is cls2:
3068 continue
3069 cant(cls(), cls2)
3070
Benjamin Peterson5083dc52009-04-25 00:41:22 +00003071 # Issue5283: when __class__ changes in __del__, the wrong
3072 # type gets DECREF'd.
3073 class O(object):
3074 pass
3075 class A(object):
3076 def __del__(self):
3077 self.__class__ = O
3078 l = [A() for x in range(100)]
3079 del l
3080
Georg Brandl48545522008-02-02 10:12:36 +00003081 def test_set_dict(self):
3082 # Testing __dict__ assignment...
3083 class C(object): pass
3084 a = C()
3085 a.__dict__ = {'b': 1}
3086 self.assertEqual(a.b, 1)
3087 def cant(x, dict):
3088 try:
3089 x.__dict__ = dict
3090 except (AttributeError, TypeError):
3091 pass
3092 else:
3093 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
3094 cant(a, None)
3095 cant(a, [])
3096 cant(a, 1)
3097 del a.__dict__ # Deleting __dict__ is allowed
3098
3099 class Base(object):
3100 pass
3101 def verify_dict_readonly(x):
3102 """
3103 x has to be an instance of a class inheriting from Base.
3104 """
3105 cant(x, {})
3106 try:
3107 del x.__dict__
3108 except (AttributeError, TypeError):
3109 pass
3110 else:
3111 self.fail("shouldn't allow del %r.__dict__" % x)
3112 dict_descr = Base.__dict__["__dict__"]
3113 try:
3114 dict_descr.__set__(x, {})
3115 except (AttributeError, TypeError):
3116 pass
3117 else:
3118 self.fail("dict_descr allowed access to %r's dict" % x)
3119
3120 # Classes don't allow __dict__ assignment and have readonly dicts
3121 class Meta1(type, Base):
3122 pass
3123 class Meta2(Base, type):
3124 pass
3125 class D(object):
3126 __metaclass__ = Meta1
3127 class E(object):
3128 __metaclass__ = Meta2
3129 for cls in C, D, E:
3130 verify_dict_readonly(cls)
3131 class_dict = cls.__dict__
3132 try:
3133 class_dict["spam"] = "eggs"
3134 except TypeError:
3135 pass
3136 else:
3137 self.fail("%r's __dict__ can be modified" % cls)
3138
3139 # Modules also disallow __dict__ assignment
3140 class Module1(types.ModuleType, Base):
3141 pass
3142 class Module2(Base, types.ModuleType):
3143 pass
3144 for ModuleType in Module1, Module2:
3145 mod = ModuleType("spam")
3146 verify_dict_readonly(mod)
3147 mod.__dict__["spam"] = "eggs"
3148
3149 # Exception's __dict__ can be replaced, but not deleted
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003150 # (at least not any more than regular exception's __dict__ can
3151 # be deleted; on CPython it is not the case, whereas on PyPy they
3152 # can, just like any other new-style instance's __dict__.)
3153 def can_delete_dict(e):
3154 try:
3155 del e.__dict__
3156 except (TypeError, AttributeError):
3157 return False
3158 else:
3159 return True
Georg Brandl48545522008-02-02 10:12:36 +00003160 class Exception1(Exception, Base):
3161 pass
3162 class Exception2(Base, Exception):
3163 pass
3164 for ExceptionType in Exception, Exception1, Exception2:
3165 e = ExceptionType()
3166 e.__dict__ = {"a": 1}
3167 self.assertEqual(e.a, 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003168 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl48545522008-02-02 10:12:36 +00003169
3170 def test_pickles(self):
3171 # Testing pickling and copying new-style classes and objects...
3172 import pickle, cPickle
3173
3174 def sorteditems(d):
3175 L = d.items()
3176 L.sort()
3177 return L
3178
3179 global C
3180 class C(object):
3181 def __init__(self, a, b):
3182 super(C, self).__init__()
3183 self.a = a
3184 self.b = b
3185 def __repr__(self):
3186 return "C(%r, %r)" % (self.a, self.b)
3187
3188 global C1
3189 class C1(list):
3190 def __new__(cls, a, b):
3191 return super(C1, cls).__new__(cls)
3192 def __getnewargs__(self):
3193 return (self.a, self.b)
3194 def __init__(self, a, b):
3195 self.a = a
3196 self.b = b
3197 def __repr__(self):
3198 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3199
3200 global C2
3201 class C2(int):
3202 def __new__(cls, a, b, val=0):
3203 return super(C2, cls).__new__(cls, val)
3204 def __getnewargs__(self):
3205 return (self.a, self.b, int(self))
3206 def __init__(self, a, b, val=0):
3207 self.a = a
3208 self.b = b
3209 def __repr__(self):
3210 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3211
3212 global C3
3213 class C3(object):
3214 def __init__(self, foo):
3215 self.foo = foo
3216 def __getstate__(self):
3217 return self.foo
3218 def __setstate__(self, foo):
3219 self.foo = foo
3220
3221 global C4classic, C4
3222 class C4classic: # classic
3223 pass
3224 class C4(C4classic, object): # mixed inheritance
3225 pass
3226
3227 for p in pickle, cPickle:
3228 for bin in 0, 1:
3229 for cls in C, C1, C2:
3230 s = p.dumps(cls, bin)
3231 cls2 = p.loads(s)
3232 self.assert_(cls2 is cls)
3233
3234 a = C1(1, 2); a.append(42); a.append(24)
3235 b = C2("hello", "world", 42)
3236 s = p.dumps((a, b), bin)
3237 x, y = p.loads(s)
3238 self.assertEqual(x.__class__, a.__class__)
3239 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3240 self.assertEqual(y.__class__, b.__class__)
3241 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3242 self.assertEqual(repr(x), repr(a))
3243 self.assertEqual(repr(y), repr(b))
3244 # Test for __getstate__ and __setstate__ on new style class
3245 u = C3(42)
3246 s = p.dumps(u, bin)
3247 v = p.loads(s)
3248 self.assertEqual(u.__class__, v.__class__)
3249 self.assertEqual(u.foo, v.foo)
3250 # Test for picklability of hybrid class
3251 u = C4()
3252 u.foo = 42
3253 s = p.dumps(u, bin)
3254 v = p.loads(s)
3255 self.assertEqual(u.__class__, v.__class__)
3256 self.assertEqual(u.foo, v.foo)
3257
3258 # Testing copy.deepcopy()
3259 import copy
3260 for cls in C, C1, C2:
3261 cls2 = copy.deepcopy(cls)
3262 self.assert_(cls2 is cls)
3263
3264 a = C1(1, 2); a.append(42); a.append(24)
3265 b = C2("hello", "world", 42)
3266 x, y = copy.deepcopy((a, b))
3267 self.assertEqual(x.__class__, a.__class__)
3268 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3269 self.assertEqual(y.__class__, b.__class__)
3270 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3271 self.assertEqual(repr(x), repr(a))
3272 self.assertEqual(repr(y), repr(b))
3273
3274 def test_pickle_slots(self):
3275 # Testing pickling of classes with __slots__ ...
3276 import pickle, cPickle
3277 # Pickling of classes with __slots__ but without __getstate__ should fail
3278 global B, C, D, E
3279 class B(object):
3280 pass
3281 for base in [object, B]:
3282 class C(base):
3283 __slots__ = ['a']
3284 class D(C):
3285 pass
3286 try:
3287 pickle.dumps(C())
3288 except TypeError:
3289 pass
3290 else:
3291 self.fail("should fail: pickle C instance - %s" % base)
3292 try:
3293 cPickle.dumps(C())
3294 except TypeError:
3295 pass
3296 else:
3297 self.fail("should fail: cPickle C instance - %s" % base)
3298 try:
3299 pickle.dumps(C())
3300 except TypeError:
3301 pass
3302 else:
3303 self.fail("should fail: pickle D instance - %s" % base)
3304 try:
3305 cPickle.dumps(D())
3306 except TypeError:
3307 pass
3308 else:
3309 self.fail("should fail: cPickle D instance - %s" % base)
3310 # Give C a nice generic __getstate__ and __setstate__
3311 class C(base):
3312 __slots__ = ['a']
3313 def __getstate__(self):
3314 try:
3315 d = self.__dict__.copy()
3316 except AttributeError:
3317 d = {}
3318 for cls in self.__class__.__mro__:
3319 for sn in cls.__dict__.get('__slots__', ()):
3320 try:
3321 d[sn] = getattr(self, sn)
3322 except AttributeError:
3323 pass
3324 return d
3325 def __setstate__(self, d):
3326 for k, v in d.items():
3327 setattr(self, k, v)
3328 class D(C):
3329 pass
3330 # Now it should work
3331 x = C()
3332 y = pickle.loads(pickle.dumps(x))
3333 self.assertEqual(hasattr(y, 'a'), 0)
3334 y = cPickle.loads(cPickle.dumps(x))
3335 self.assertEqual(hasattr(y, 'a'), 0)
3336 x.a = 42
3337 y = pickle.loads(pickle.dumps(x))
3338 self.assertEqual(y.a, 42)
3339 y = cPickle.loads(cPickle.dumps(x))
3340 self.assertEqual(y.a, 42)
3341 x = D()
3342 x.a = 42
3343 x.b = 100
3344 y = pickle.loads(pickle.dumps(x))
3345 self.assertEqual(y.a + y.b, 142)
3346 y = cPickle.loads(cPickle.dumps(x))
3347 self.assertEqual(y.a + y.b, 142)
3348 # A subclass that adds a slot should also work
3349 class E(C):
3350 __slots__ = ['b']
3351 x = E()
3352 x.a = 42
3353 x.b = "foo"
3354 y = pickle.loads(pickle.dumps(x))
3355 self.assertEqual(y.a, x.a)
3356 self.assertEqual(y.b, x.b)
3357 y = cPickle.loads(cPickle.dumps(x))
3358 self.assertEqual(y.a, x.a)
3359 self.assertEqual(y.b, x.b)
3360
3361 def test_binary_operator_override(self):
3362 # Testing overrides of binary operations...
3363 class I(int):
3364 def __repr__(self):
3365 return "I(%r)" % int(self)
3366 def __add__(self, other):
3367 return I(int(self) + int(other))
3368 __radd__ = __add__
3369 def __pow__(self, other, mod=None):
3370 if mod is None:
3371 return I(pow(int(self), int(other)))
3372 else:
3373 return I(pow(int(self), int(other), int(mod)))
3374 def __rpow__(self, other, mod=None):
3375 if mod is None:
3376 return I(pow(int(other), int(self), mod))
3377 else:
3378 return I(pow(int(other), int(self), int(mod)))
3379
3380 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3381 self.assertEqual(repr(I(1) + 2), "I(3)")
3382 self.assertEqual(repr(1 + I(2)), "I(3)")
3383 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3384 self.assertEqual(repr(2 ** I(3)), "I(8)")
3385 self.assertEqual(repr(I(2) ** 3), "I(8)")
3386 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3387 class S(str):
3388 def __eq__(self, other):
3389 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003390 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003391
3392 def test_subclass_propagation(self):
3393 # Testing propagation of slot functions to subclasses...
3394 class A(object):
3395 pass
3396 class B(A):
3397 pass
3398 class C(A):
3399 pass
3400 class D(B, C):
3401 pass
3402 d = D()
3403 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3404 A.__hash__ = lambda self: 42
3405 self.assertEqual(hash(d), 42)
3406 C.__hash__ = lambda self: 314
3407 self.assertEqual(hash(d), 314)
3408 B.__hash__ = lambda self: 144
3409 self.assertEqual(hash(d), 144)
3410 D.__hash__ = lambda self: 100
3411 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003412 D.__hash__ = None
3413 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003414 del D.__hash__
3415 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003416 B.__hash__ = None
3417 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003418 del B.__hash__
3419 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003420 C.__hash__ = None
3421 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003422 del C.__hash__
3423 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003424 A.__hash__ = None
3425 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003426 del A.__hash__
3427 self.assertEqual(hash(d), orig_hash)
3428 d.foo = 42
3429 d.bar = 42
3430 self.assertEqual(d.foo, 42)
3431 self.assertEqual(d.bar, 42)
3432 def __getattribute__(self, name):
3433 if name == "foo":
3434 return 24
3435 return object.__getattribute__(self, name)
3436 A.__getattribute__ = __getattribute__
3437 self.assertEqual(d.foo, 24)
3438 self.assertEqual(d.bar, 42)
3439 def __getattr__(self, name):
3440 if name in ("spam", "foo", "bar"):
3441 return "hello"
3442 raise AttributeError, name
3443 B.__getattr__ = __getattr__
3444 self.assertEqual(d.spam, "hello")
3445 self.assertEqual(d.foo, 24)
3446 self.assertEqual(d.bar, 42)
3447 del A.__getattribute__
3448 self.assertEqual(d.foo, 42)
3449 del d.foo
3450 self.assertEqual(d.foo, "hello")
3451 self.assertEqual(d.bar, 42)
3452 del B.__getattr__
3453 try:
3454 d.foo
3455 except AttributeError:
3456 pass
3457 else:
3458 self.fail("d.foo should be undefined now")
3459
3460 # Test a nasty bug in recurse_down_subclasses()
3461 import gc
3462 class A(object):
3463 pass
3464 class B(A):
3465 pass
3466 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003467 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003468 A.__setitem__ = lambda *a: None # crash
3469
3470 def test_buffer_inheritance(self):
3471 # Testing that buffer interface is inherited ...
3472
3473 import binascii
3474 # SF bug [#470040] ParseTuple t# vs subclasses.
3475
3476 class MyStr(str):
3477 pass
3478 base = 'abc'
3479 m = MyStr(base)
3480 # b2a_hex uses the buffer interface to get its argument's value, via
3481 # PyArg_ParseTuple 't#' code.
3482 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3483
3484 # It's not clear that unicode will continue to support the character
3485 # buffer interface, and this test will fail if that's taken away.
3486 class MyUni(unicode):
3487 pass
3488 base = u'abc'
3489 m = MyUni(base)
3490 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3491
3492 class MyInt(int):
3493 pass
3494 m = MyInt(42)
3495 try:
3496 binascii.b2a_hex(m)
3497 self.fail('subclass of int should not have a buffer interface')
3498 except TypeError:
3499 pass
3500
3501 def test_str_of_str_subclass(self):
3502 # Testing __str__ defined in subclass of str ...
3503 import binascii
3504 import cStringIO
3505
3506 class octetstring(str):
3507 def __str__(self):
3508 return binascii.b2a_hex(self)
3509 def __repr__(self):
3510 return self + " repr"
3511
3512 o = octetstring('A')
3513 self.assertEqual(type(o), octetstring)
3514 self.assertEqual(type(str(o)), str)
3515 self.assertEqual(type(repr(o)), str)
3516 self.assertEqual(ord(o), 0x41)
3517 self.assertEqual(str(o), '41')
3518 self.assertEqual(repr(o), 'A repr')
3519 self.assertEqual(o.__str__(), '41')
3520 self.assertEqual(o.__repr__(), 'A repr')
3521
3522 capture = cStringIO.StringIO()
3523 # Calling str() or not exercises different internal paths.
3524 print >> capture, o
3525 print >> capture, str(o)
3526 self.assertEqual(capture.getvalue(), '41\n41\n')
3527 capture.close()
3528
3529 def test_keyword_arguments(self):
3530 # Testing keyword arguments to __init__, __call__...
3531 def f(a): return a
3532 self.assertEqual(f.__call__(a=42), 42)
3533 a = []
3534 list.__init__(a, sequence=[0, 1, 2])
3535 self.assertEqual(a, [0, 1, 2])
3536
3537 def test_recursive_call(self):
3538 # Testing recursive __call__() by setting to instance of class...
3539 class A(object):
3540 pass
3541
3542 A.__call__ = A()
3543 try:
3544 A()()
3545 except RuntimeError:
3546 pass
3547 else:
3548 self.fail("Recursion limit should have been reached for __call__()")
3549
3550 def test_delete_hook(self):
3551 # Testing __del__ hook...
3552 log = []
3553 class C(object):
3554 def __del__(self):
3555 log.append(1)
3556 c = C()
3557 self.assertEqual(log, [])
3558 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003559 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003560 self.assertEqual(log, [1])
3561
3562 class D(object): pass
3563 d = D()
3564 try: del d[0]
3565 except TypeError: pass
3566 else: self.fail("invalid del() didn't raise TypeError")
3567
3568 def test_hash_inheritance(self):
3569 # Testing hash of mutable subclasses...
3570
3571 class mydict(dict):
3572 pass
3573 d = mydict()
3574 try:
3575 hash(d)
3576 except TypeError:
3577 pass
3578 else:
3579 self.fail("hash() of dict subclass should fail")
3580
3581 class mylist(list):
3582 pass
3583 d = mylist()
3584 try:
3585 hash(d)
3586 except TypeError:
3587 pass
3588 else:
3589 self.fail("hash() of list subclass should fail")
3590
3591 def test_str_operations(self):
3592 try: 'a' + 5
3593 except TypeError: pass
3594 else: self.fail("'' + 5 doesn't raise TypeError")
3595
3596 try: ''.split('')
3597 except ValueError: pass
3598 else: self.fail("''.split('') doesn't raise ValueError")
3599
3600 try: ''.join([0])
3601 except TypeError: pass
3602 else: self.fail("''.join([0]) doesn't raise TypeError")
3603
3604 try: ''.rindex('5')
3605 except ValueError: pass
3606 else: self.fail("''.rindex('5') doesn't raise ValueError")
3607
3608 try: '%(n)s' % None
3609 except TypeError: pass
3610 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3611
3612 try: '%(n' % {}
3613 except ValueError: pass
3614 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3615
3616 try: '%*s' % ('abc')
3617 except TypeError: pass
3618 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3619
3620 try: '%*.*s' % ('abc', 5)
3621 except TypeError: pass
3622 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3623
3624 try: '%s' % (1, 2)
3625 except TypeError: pass
3626 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3627
3628 try: '%' % None
3629 except ValueError: pass
3630 else: self.fail("'%' % None doesn't raise ValueError")
3631
3632 self.assertEqual('534253'.isdigit(), 1)
3633 self.assertEqual('534253x'.isdigit(), 0)
3634 self.assertEqual('%c' % 5, '\x05')
3635 self.assertEqual('%c' % '5', '5')
3636
3637 def test_deepcopy_recursive(self):
3638 # Testing deepcopy of recursive objects...
3639 class Node:
3640 pass
3641 a = Node()
3642 b = Node()
3643 a.b = b
3644 b.a = a
3645 z = deepcopy(a) # This blew up before
3646
3647 def test_unintialized_modules(self):
3648 # Testing uninitialized module objects...
3649 from types import ModuleType as M
3650 m = M.__new__(M)
3651 str(m)
3652 self.assertEqual(hasattr(m, "__name__"), 0)
3653 self.assertEqual(hasattr(m, "__file__"), 0)
3654 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003655 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003656 m.foo = 1
3657 self.assertEqual(m.__dict__, {"foo": 1})
3658
3659 def test_funny_new(self):
3660 # Testing __new__ returning something unexpected...
3661 class C(object):
3662 def __new__(cls, arg):
3663 if isinstance(arg, str): return [1, 2, 3]
3664 elif isinstance(arg, int): return object.__new__(D)
3665 else: return object.__new__(cls)
3666 class D(C):
3667 def __init__(self, arg):
3668 self.foo = arg
3669 self.assertEqual(C("1"), [1, 2, 3])
3670 self.assertEqual(D("1"), [1, 2, 3])
3671 d = D(None)
3672 self.assertEqual(d.foo, None)
3673 d = C(1)
3674 self.assertEqual(isinstance(d, D), True)
3675 self.assertEqual(d.foo, 1)
3676 d = D(1)
3677 self.assertEqual(isinstance(d, D), True)
3678 self.assertEqual(d.foo, 1)
3679
3680 def test_imul_bug(self):
3681 # Testing for __imul__ problems...
3682 # SF bug 544647
3683 class C(object):
3684 def __imul__(self, other):
3685 return (self, other)
3686 x = C()
3687 y = x
3688 y *= 1.0
3689 self.assertEqual(y, (x, 1.0))
3690 y = x
3691 y *= 2
3692 self.assertEqual(y, (x, 2))
3693 y = x
3694 y *= 3L
3695 self.assertEqual(y, (x, 3L))
3696 y = x
3697 y *= 1L<<100
3698 self.assertEqual(y, (x, 1L<<100))
3699 y = x
3700 y *= None
3701 self.assertEqual(y, (x, None))
3702 y = x
3703 y *= "foo"
3704 self.assertEqual(y, (x, "foo"))
3705
3706 def test_copy_setstate(self):
3707 # Testing that copy.*copy() correctly uses __setstate__...
3708 import copy
3709 class C(object):
3710 def __init__(self, foo=None):
3711 self.foo = foo
3712 self.__foo = foo
3713 def setfoo(self, foo=None):
3714 self.foo = foo
3715 def getfoo(self):
3716 return self.__foo
3717 def __getstate__(self):
3718 return [self.foo]
3719 def __setstate__(self_, lst):
3720 self.assertEqual(len(lst), 1)
3721 self_.__foo = self_.foo = lst[0]
3722 a = C(42)
3723 a.setfoo(24)
3724 self.assertEqual(a.foo, 24)
3725 self.assertEqual(a.getfoo(), 42)
3726 b = copy.copy(a)
3727 self.assertEqual(b.foo, 24)
3728 self.assertEqual(b.getfoo(), 24)
3729 b = copy.deepcopy(a)
3730 self.assertEqual(b.foo, 24)
3731 self.assertEqual(b.getfoo(), 24)
3732
3733 def test_slices(self):
3734 # Testing cases with slices and overridden __getitem__ ...
3735
3736 # Strings
3737 self.assertEqual("hello"[:4], "hell")
3738 self.assertEqual("hello"[slice(4)], "hell")
3739 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3740 class S(str):
3741 def __getitem__(self, x):
3742 return str.__getitem__(self, x)
3743 self.assertEqual(S("hello")[:4], "hell")
3744 self.assertEqual(S("hello")[slice(4)], "hell")
3745 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3746 # Tuples
3747 self.assertEqual((1,2,3)[:2], (1,2))
3748 self.assertEqual((1,2,3)[slice(2)], (1,2))
3749 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3750 class T(tuple):
3751 def __getitem__(self, x):
3752 return tuple.__getitem__(self, x)
3753 self.assertEqual(T((1,2,3))[:2], (1,2))
3754 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3755 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3756 # Lists
3757 self.assertEqual([1,2,3][:2], [1,2])
3758 self.assertEqual([1,2,3][slice(2)], [1,2])
3759 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3760 class L(list):
3761 def __getitem__(self, x):
3762 return list.__getitem__(self, x)
3763 self.assertEqual(L([1,2,3])[:2], [1,2])
3764 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3765 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3766 # Now do lists and __setitem__
3767 a = L([1,2,3])
3768 a[slice(1, 3)] = [3,2]
3769 self.assertEqual(a, [1,3,2])
3770 a[slice(0, 2, 1)] = [3,1]
3771 self.assertEqual(a, [3,1,2])
3772 a.__setitem__(slice(1, 3), [2,1])
3773 self.assertEqual(a, [3,2,1])
3774 a.__setitem__(slice(0, 2, 1), [2,3])
3775 self.assertEqual(a, [2,3,1])
3776
3777 def test_subtype_resurrection(self):
3778 # Testing resurrection of new-style instance...
3779
3780 class C(object):
3781 container = []
3782
3783 def __del__(self):
3784 # resurrect the instance
3785 C.container.append(self)
3786
3787 c = C()
3788 c.attr = 42
3789
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003790 # The most interesting thing here is whether this blows up, due to
3791 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3792 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003793 del c
3794
3795 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003796 # the last container slot works: that will attempt to delete c again,
3797 # which will cause c to get appended back to the container again
3798 # "during" the del. (On non-CPython implementations, however, __del__
3799 # is typically not called again.)
3800 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003801 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003802 del C.container[-1]
3803 if test_support.check_impl_detail():
3804 test_support.gc_collect()
3805 self.assertEqual(len(C.container), 1)
3806 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003807
3808 # Make c mortal again, so that the test framework with -l doesn't report
3809 # it as a leak.
3810 del C.__del__
3811
3812 def test_slots_trash(self):
3813 # Testing slot trash...
3814 # Deallocating deeply nested slotted trash caused stack overflows
3815 class trash(object):
3816 __slots__ = ['x']
3817 def __init__(self, x):
3818 self.x = x
3819 o = None
3820 for i in xrange(50000):
3821 o = trash(o)
3822 del o
3823
3824 def test_slots_multiple_inheritance(self):
3825 # SF bug 575229, multiple inheritance w/ slots dumps core
3826 class A(object):
3827 __slots__=()
3828 class B(object):
3829 pass
3830 class C(A,B) :
3831 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003832 if test_support.check_impl_detail():
3833 self.assertEqual(C.__basicsize__, B.__basicsize__)
Georg Brandl48545522008-02-02 10:12:36 +00003834 self.assert_(hasattr(C, '__dict__'))
3835 self.assert_(hasattr(C, '__weakref__'))
3836 C().x = 2
3837
3838 def test_rmul(self):
3839 # Testing correct invocation of __rmul__...
3840 # SF patch 592646
3841 class C(object):
3842 def __mul__(self, other):
3843 return "mul"
3844 def __rmul__(self, other):
3845 return "rmul"
3846 a = C()
3847 self.assertEqual(a*2, "mul")
3848 self.assertEqual(a*2.2, "mul")
3849 self.assertEqual(2*a, "rmul")
3850 self.assertEqual(2.2*a, "rmul")
3851
3852 def test_ipow(self):
3853 # Testing correct invocation of __ipow__...
3854 # [SF bug 620179]
3855 class C(object):
3856 def __ipow__(self, other):
3857 pass
3858 a = C()
3859 a **= 2
3860
3861 def test_mutable_bases(self):
3862 # Testing mutable bases...
3863
3864 # stuff that should work:
3865 class C(object):
3866 pass
3867 class C2(object):
3868 def __getattribute__(self, attr):
3869 if attr == 'a':
3870 return 2
3871 else:
3872 return super(C2, self).__getattribute__(attr)
3873 def meth(self):
3874 return 1
3875 class D(C):
3876 pass
3877 class E(D):
3878 pass
3879 d = D()
3880 e = E()
3881 D.__bases__ = (C,)
3882 D.__bases__ = (C2,)
3883 self.assertEqual(d.meth(), 1)
3884 self.assertEqual(e.meth(), 1)
3885 self.assertEqual(d.a, 2)
3886 self.assertEqual(e.a, 2)
3887 self.assertEqual(C2.__subclasses__(), [D])
3888
Georg Brandl48545522008-02-02 10:12:36 +00003889 try:
3890 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003891 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003892 pass
3893 else:
3894 self.fail("shouldn't be able to delete .__bases__")
3895
3896 try:
3897 D.__bases__ = ()
3898 except TypeError, msg:
3899 if str(msg) == "a new-style class can't have only classic bases":
3900 self.fail("wrong error message for .__bases__ = ()")
3901 else:
3902 self.fail("shouldn't be able to set .__bases__ to ()")
3903
3904 try:
3905 D.__bases__ = (D,)
3906 except TypeError:
3907 pass
3908 else:
3909 # actually, we'll have crashed by here...
3910 self.fail("shouldn't be able to create inheritance cycles")
3911
3912 try:
3913 D.__bases__ = (C, C)
3914 except TypeError:
3915 pass
3916 else:
3917 self.fail("didn't detect repeated base classes")
3918
3919 try:
3920 D.__bases__ = (E,)
3921 except TypeError:
3922 pass
3923 else:
3924 self.fail("shouldn't be able to create inheritance cycles")
3925
3926 # let's throw a classic class into the mix:
3927 class Classic:
3928 def meth2(self):
3929 return 3
3930
3931 D.__bases__ = (C, Classic)
3932
3933 self.assertEqual(d.meth2(), 3)
3934 self.assertEqual(e.meth2(), 3)
3935 try:
3936 d.a
3937 except AttributeError:
3938 pass
3939 else:
3940 self.fail("attribute should have vanished")
3941
3942 try:
3943 D.__bases__ = (Classic,)
3944 except TypeError:
3945 pass
3946 else:
3947 self.fail("new-style class must have a new-style base")
3948
Benjamin Petersond4d400c2009-04-18 20:12:47 +00003949 def test_builtin_bases(self):
3950 # Make sure all the builtin types can have their base queried without
3951 # segfaulting. See issue #5787.
3952 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
3953 if isinstance(tp, type)]
3954 for tp in builtin_types:
3955 object.__getattribute__(tp, "__bases__")
3956 if tp is not object:
3957 self.assertEqual(len(tp.__bases__), 1, tp)
3958
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00003959 class L(list):
3960 pass
3961
3962 class C(object):
3963 pass
3964
3965 class D(C):
3966 pass
3967
3968 try:
3969 L.__bases__ = (dict,)
3970 except TypeError:
3971 pass
3972 else:
3973 self.fail("shouldn't turn list subclass into dict subclass")
3974
3975 try:
3976 list.__bases__ = (dict,)
3977 except TypeError:
3978 pass
3979 else:
3980 self.fail("shouldn't be able to assign to list.__bases__")
3981
3982 try:
3983 D.__bases__ = (C, list)
3984 except TypeError:
3985 pass
3986 else:
3987 assert 0, "best_base calculation found wanting"
3988
Benjamin Petersond4d400c2009-04-18 20:12:47 +00003989
Georg Brandl48545522008-02-02 10:12:36 +00003990 def test_mutable_bases_with_failing_mro(self):
3991 # Testing mutable bases with failing mro...
3992 class WorkOnce(type):
3993 def __new__(self, name, bases, ns):
3994 self.flag = 0
3995 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3996 def mro(self):
3997 if self.flag > 0:
3998 raise RuntimeError, "bozo"
3999 else:
4000 self.flag += 1
4001 return type.mro(self)
4002
4003 class WorkAlways(type):
4004 def mro(self):
4005 # this is here to make sure that .mro()s aren't called
4006 # with an exception set (which was possible at one point).
4007 # An error message will be printed in a debug build.
4008 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004009 return type.mro(self)
4010
Georg Brandl48545522008-02-02 10:12:36 +00004011 class C(object):
4012 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004013
Georg Brandl48545522008-02-02 10:12:36 +00004014 class C2(object):
4015 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004016
Georg Brandl48545522008-02-02 10:12:36 +00004017 class D(C):
4018 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004019
Georg Brandl48545522008-02-02 10:12:36 +00004020 class E(D):
4021 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004022
Georg Brandl48545522008-02-02 10:12:36 +00004023 class F(D):
4024 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004025
Georg Brandl48545522008-02-02 10:12:36 +00004026 class G(D):
4027 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004028
Georg Brandl48545522008-02-02 10:12:36 +00004029 # Immediate subclasses have their mro's adjusted in alphabetical
4030 # order, so E's will get adjusted before adjusting F's fails. We
4031 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004032
Georg Brandl48545522008-02-02 10:12:36 +00004033 E_mro_before = E.__mro__
4034 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004035
Armin Rigofd163f92005-12-29 15:59:19 +00004036 try:
Georg Brandl48545522008-02-02 10:12:36 +00004037 D.__bases__ = (C2,)
4038 except RuntimeError:
4039 self.assertEqual(E.__mro__, E_mro_before)
4040 self.assertEqual(D.__mro__, D_mro_before)
4041 else:
4042 self.fail("exception not propagated")
4043
4044 def test_mutable_bases_catch_mro_conflict(self):
4045 # Testing mutable bases catch mro conflict...
4046 class A(object):
4047 pass
4048
4049 class B(object):
4050 pass
4051
4052 class C(A, B):
4053 pass
4054
4055 class D(A, B):
4056 pass
4057
4058 class E(C, D):
4059 pass
4060
4061 try:
4062 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004063 except TypeError:
4064 pass
4065 else:
Georg Brandl48545522008-02-02 10:12:36 +00004066 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004067
Georg Brandl48545522008-02-02 10:12:36 +00004068 def test_mutable_names(self):
4069 # Testing mutable names...
4070 class C(object):
4071 pass
4072
4073 # C.__module__ could be 'test_descr' or '__main__'
4074 mod = C.__module__
4075
4076 C.__name__ = 'D'
4077 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4078
4079 C.__name__ = 'D.E'
4080 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4081
4082 def test_subclass_right_op(self):
4083 # Testing correct dispatch of subclass overloading __r<op>__...
4084
4085 # This code tests various cases where right-dispatch of a subclass
4086 # should be preferred over left-dispatch of a base class.
4087
4088 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4089
4090 class B(int):
4091 def __floordiv__(self, other):
4092 return "B.__floordiv__"
4093 def __rfloordiv__(self, other):
4094 return "B.__rfloordiv__"
4095
4096 self.assertEqual(B(1) // 1, "B.__floordiv__")
4097 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4098
4099 # Case 2: subclass of object; this is just the baseline for case 3
4100
4101 class C(object):
4102 def __floordiv__(self, other):
4103 return "C.__floordiv__"
4104 def __rfloordiv__(self, other):
4105 return "C.__rfloordiv__"
4106
4107 self.assertEqual(C() // 1, "C.__floordiv__")
4108 self.assertEqual(1 // C(), "C.__rfloordiv__")
4109
4110 # Case 3: subclass of new-style class; here it gets interesting
4111
4112 class D(C):
4113 def __floordiv__(self, other):
4114 return "D.__floordiv__"
4115 def __rfloordiv__(self, other):
4116 return "D.__rfloordiv__"
4117
4118 self.assertEqual(D() // C(), "D.__floordiv__")
4119 self.assertEqual(C() // D(), "D.__rfloordiv__")
4120
4121 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4122
4123 class E(C):
4124 pass
4125
4126 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4127
4128 self.assertEqual(E() // 1, "C.__floordiv__")
4129 self.assertEqual(1 // E(), "C.__rfloordiv__")
4130 self.assertEqual(E() // C(), "C.__floordiv__")
4131 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4132
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004133 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004134 def test_meth_class_get(self):
4135 # Testing __get__ method of METH_CLASS C methods...
4136 # Full coverage of descrobject.c::classmethod_get()
4137
4138 # Baseline
4139 arg = [1, 2, 3]
4140 res = {1: None, 2: None, 3: None}
4141 self.assertEqual(dict.fromkeys(arg), res)
4142 self.assertEqual({}.fromkeys(arg), res)
4143
4144 # Now get the descriptor
4145 descr = dict.__dict__["fromkeys"]
4146
4147 # More baseline using the descriptor directly
4148 self.assertEqual(descr.__get__(None, dict)(arg), res)
4149 self.assertEqual(descr.__get__({})(arg), res)
4150
4151 # Now check various error cases
4152 try:
4153 descr.__get__(None, None)
4154 except TypeError:
4155 pass
4156 else:
4157 self.fail("shouldn't have allowed descr.__get__(None, None)")
4158 try:
4159 descr.__get__(42)
4160 except TypeError:
4161 pass
4162 else:
4163 self.fail("shouldn't have allowed descr.__get__(42)")
4164 try:
4165 descr.__get__(None, 42)
4166 except TypeError:
4167 pass
4168 else:
4169 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4170 try:
4171 descr.__get__(None, int)
4172 except TypeError:
4173 pass
4174 else:
4175 self.fail("shouldn't have allowed descr.__get__(None, int)")
4176
4177 def test_isinst_isclass(self):
4178 # Testing proxy isinstance() and isclass()...
4179 class Proxy(object):
4180 def __init__(self, obj):
4181 self.__obj = obj
4182 def __getattribute__(self, name):
4183 if name.startswith("_Proxy__"):
4184 return object.__getattribute__(self, name)
4185 else:
4186 return getattr(self.__obj, name)
4187 # Test with a classic class
4188 class C:
4189 pass
4190 a = C()
4191 pa = Proxy(a)
4192 self.assert_(isinstance(a, C)) # Baseline
4193 self.assert_(isinstance(pa, C)) # Test
4194 # Test with a classic subclass
4195 class D(C):
4196 pass
4197 a = D()
4198 pa = Proxy(a)
4199 self.assert_(isinstance(a, C)) # Baseline
4200 self.assert_(isinstance(pa, C)) # Test
4201 # Test with a new-style class
4202 class C(object):
4203 pass
4204 a = C()
4205 pa = Proxy(a)
4206 self.assert_(isinstance(a, C)) # Baseline
4207 self.assert_(isinstance(pa, C)) # Test
4208 # Test with a new-style subclass
4209 class D(C):
4210 pass
4211 a = D()
4212 pa = Proxy(a)
4213 self.assert_(isinstance(a, C)) # Baseline
4214 self.assert_(isinstance(pa, C)) # Test
4215
4216 def test_proxy_super(self):
4217 # Testing super() for a proxy object...
4218 class Proxy(object):
4219 def __init__(self, obj):
4220 self.__obj = obj
4221 def __getattribute__(self, name):
4222 if name.startswith("_Proxy__"):
4223 return object.__getattribute__(self, name)
4224 else:
4225 return getattr(self.__obj, name)
4226
4227 class B(object):
4228 def f(self):
4229 return "B.f"
4230
4231 class C(B):
4232 def f(self):
4233 return super(C, self).f() + "->C.f"
4234
4235 obj = C()
4236 p = Proxy(obj)
4237 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4238
4239 def test_carloverre(self):
4240 # Testing prohibition of Carlo Verre's hack...
4241 try:
4242 object.__setattr__(str, "foo", 42)
4243 except TypeError:
4244 pass
4245 else:
4246 self.fail("Carlo Verre __setattr__ suceeded!")
4247 try:
4248 object.__delattr__(str, "lower")
4249 except TypeError:
4250 pass
4251 else:
4252 self.fail("Carlo Verre __delattr__ succeeded!")
4253
4254 def test_weakref_segfault(self):
4255 # Testing weakref segfault...
4256 # SF 742911
4257 import weakref
4258
4259 class Provoker:
4260 def __init__(self, referrent):
4261 self.ref = weakref.ref(referrent)
4262
4263 def __del__(self):
4264 x = self.ref()
4265
4266 class Oops(object):
4267 pass
4268
4269 o = Oops()
4270 o.whatever = Provoker(o)
4271 del o
4272
4273 def test_wrapper_segfault(self):
4274 # SF 927248: deeply nested wrappers could cause stack overflow
4275 f = lambda:None
4276 for i in xrange(1000000):
4277 f = f.__call__
4278 f = None
4279
4280 def test_file_fault(self):
4281 # Testing sys.stdout is changed in getattr...
4282 import sys
4283 class StdoutGuard:
4284 def __getattr__(self, attr):
4285 sys.stdout = sys.__stdout__
4286 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4287 sys.stdout = StdoutGuard()
4288 try:
4289 print "Oops!"
4290 except RuntimeError:
4291 pass
4292
4293 def test_vicious_descriptor_nonsense(self):
4294 # Testing vicious_descriptor_nonsense...
4295
4296 # A potential segfault spotted by Thomas Wouters in mail to
4297 # python-dev 2003-04-17, turned into an example & fixed by Michael
4298 # Hudson just less than four months later...
4299
4300 class Evil(object):
4301 def __hash__(self):
4302 return hash('attr')
4303 def __eq__(self, other):
4304 del C.attr
4305 return 0
4306
4307 class Descr(object):
4308 def __get__(self, ob, type=None):
4309 return 1
4310
4311 class C(object):
4312 attr = Descr()
4313
4314 c = C()
4315 c.__dict__[Evil()] = 0
4316
4317 self.assertEqual(c.attr, 1)
4318 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004319 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00004320 self.assertEqual(hasattr(c, 'attr'), False)
4321
4322 def test_init(self):
4323 # SF 1155938
4324 class Foo(object):
4325 def __init__(self):
4326 return 10
4327 try:
4328 Foo()
4329 except TypeError:
4330 pass
4331 else:
4332 self.fail("did not test __init__() for None return")
4333
4334 def test_method_wrapper(self):
4335 # Testing method-wrapper objects...
4336 # <type 'method-wrapper'> did not support any reflection before 2.5
4337
4338 l = []
4339 self.assertEqual(l.__add__, l.__add__)
4340 self.assertEqual(l.__add__, [].__add__)
4341 self.assert_(l.__add__ != [5].__add__)
4342 self.assert_(l.__add__ != l.__mul__)
4343 self.assert_(l.__add__.__name__ == '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004344 if hasattr(l.__add__, '__self__'):
4345 # CPython
4346 self.assert_(l.__add__.__self__ is l)
4347 self.assert_(l.__add__.__objclass__ is list)
4348 else:
4349 # Python implementations where [].__add__ is a normal bound method
4350 self.assert_(l.__add__.im_self is l)
4351 self.assert_(l.__add__.im_class is list)
Georg Brandl48545522008-02-02 10:12:36 +00004352 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4353 try:
4354 hash(l.__add__)
4355 except TypeError:
4356 pass
4357 else:
4358 self.fail("no TypeError from hash([].__add__)")
4359
4360 t = ()
4361 t += (7,)
4362 self.assertEqual(t.__add__, (7,).__add__)
4363 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4364
4365 def test_not_implemented(self):
4366 # Testing NotImplemented...
4367 # all binary methods should be able to return a NotImplemented
4368 import sys
4369 import types
4370 import operator
4371
4372 def specialmethod(self, other):
4373 return NotImplemented
4374
4375 def check(expr, x, y):
4376 try:
4377 exec expr in {'x': x, 'y': y, 'operator': operator}
4378 except TypeError:
4379 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004380 else:
Georg Brandl48545522008-02-02 10:12:36 +00004381 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004382
Georg Brandl48545522008-02-02 10:12:36 +00004383 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4384 # TypeErrors
4385 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4386 # ValueErrors instead of TypeErrors
4387 for metaclass in [type, types.ClassType]:
4388 for name, expr, iexpr in [
4389 ('__add__', 'x + y', 'x += y'),
4390 ('__sub__', 'x - y', 'x -= y'),
4391 ('__mul__', 'x * y', 'x *= y'),
4392 ('__truediv__', 'operator.truediv(x, y)', None),
4393 ('__floordiv__', 'operator.floordiv(x, y)', None),
4394 ('__div__', 'x / y', 'x /= y'),
4395 ('__mod__', 'x % y', 'x %= y'),
4396 ('__divmod__', 'divmod(x, y)', None),
4397 ('__pow__', 'x ** y', 'x **= y'),
4398 ('__lshift__', 'x << y', 'x <<= y'),
4399 ('__rshift__', 'x >> y', 'x >>= y'),
4400 ('__and__', 'x & y', 'x &= y'),
4401 ('__or__', 'x | y', 'x |= y'),
4402 ('__xor__', 'x ^ y', 'x ^= y'),
4403 ('__coerce__', 'coerce(x, y)', None)]:
4404 if name == '__coerce__':
4405 rname = name
4406 else:
4407 rname = '__r' + name[2:]
4408 A = metaclass('A', (), {name: specialmethod})
4409 B = metaclass('B', (), {rname: specialmethod})
4410 a = A()
4411 b = B()
4412 check(expr, a, a)
4413 check(expr, a, b)
4414 check(expr, b, a)
4415 check(expr, b, b)
4416 check(expr, a, N1)
4417 check(expr, a, N2)
4418 check(expr, N1, b)
4419 check(expr, N2, b)
4420 if iexpr:
4421 check(iexpr, a, a)
4422 check(iexpr, a, b)
4423 check(iexpr, b, a)
4424 check(iexpr, b, b)
4425 check(iexpr, a, N1)
4426 check(iexpr, a, N2)
4427 iname = '__i' + name[2:]
4428 C = metaclass('C', (), {iname: specialmethod})
4429 c = C()
4430 check(iexpr, c, a)
4431 check(iexpr, c, b)
4432 check(iexpr, c, N1)
4433 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004434
Georg Brandl48545522008-02-02 10:12:36 +00004435 def test_assign_slice(self):
4436 # ceval.c's assign_slice used to check for
4437 # tp->tp_as_sequence->sq_slice instead of
4438 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004439
Georg Brandl48545522008-02-02 10:12:36 +00004440 class C(object):
4441 def __setslice__(self, start, stop, value):
4442 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004443
Georg Brandl48545522008-02-02 10:12:36 +00004444 c = C()
4445 c[1:2] = 3
4446 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004447
Benjamin Peterson273c2332008-11-17 22:39:09 +00004448 def test_getattr_hooks(self):
4449 # issue 4230
4450
4451 class Descriptor(object):
4452 counter = 0
4453 def __get__(self, obj, objtype=None):
4454 def getter(name):
4455 self.counter += 1
4456 raise AttributeError(name)
4457 return getter
4458
4459 descr = Descriptor()
4460 class A(object):
4461 __getattribute__ = descr
4462 class B(object):
4463 __getattr__ = descr
4464 class C(object):
4465 __getattribute__ = descr
4466 __getattr__ = descr
4467
4468 self.assertRaises(AttributeError, getattr, A(), "attr")
4469 self.assertEquals(descr.counter, 1)
4470 self.assertRaises(AttributeError, getattr, B(), "attr")
4471 self.assertEquals(descr.counter, 2)
4472 self.assertRaises(AttributeError, getattr, C(), "attr")
4473 self.assertEquals(descr.counter, 4)
4474
4475 import gc
4476 class EvilGetattribute(object):
4477 # This used to segfault
4478 def __getattr__(self, name):
4479 raise AttributeError(name)
4480 def __getattribute__(self, name):
4481 del EvilGetattribute.__getattr__
4482 for i in range(5):
4483 gc.collect()
4484 raise AttributeError(name)
4485
4486 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4487
Guido van Rossum9acc3872008-01-23 23:23:43 +00004488
Georg Brandl48545522008-02-02 10:12:36 +00004489class DictProxyTests(unittest.TestCase):
4490 def setUp(self):
4491 class C(object):
4492 def meth(self):
4493 pass
4494 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004495
Georg Brandl48545522008-02-02 10:12:36 +00004496 def test_iter_keys(self):
4497 # Testing dict-proxy iterkeys...
4498 keys = [ key for key in self.C.__dict__.iterkeys() ]
4499 keys.sort()
4500 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4501 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004502
Georg Brandl48545522008-02-02 10:12:36 +00004503 def test_iter_values(self):
4504 # Testing dict-proxy itervalues...
4505 values = [ values for values in self.C.__dict__.itervalues() ]
4506 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004507
Georg Brandl48545522008-02-02 10:12:36 +00004508 def test_iter_items(self):
4509 # Testing dict-proxy iteritems...
4510 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4511 keys.sort()
4512 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4513 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004514
Georg Brandl48545522008-02-02 10:12:36 +00004515 def test_dict_type_with_metaclass(self):
4516 # Testing type of __dict__ when __metaclass__ set...
4517 class B(object):
4518 pass
4519 class M(type):
4520 pass
4521 class C:
4522 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4523 __metaclass__ = M
4524 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004525
Guido van Rossum9acc3872008-01-23 23:23:43 +00004526
Georg Brandl48545522008-02-02 10:12:36 +00004527class PTypesLongInitTest(unittest.TestCase):
4528 # This is in its own TestCase so that it can be run before any other tests.
4529 def test_pytype_long_ready(self):
4530 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004531
Georg Brandl48545522008-02-02 10:12:36 +00004532 # This dumps core when SF bug 551412 isn't fixed --
4533 # but only when test_descr.py is run separately.
4534 # (That can't be helped -- as soon as PyType_Ready()
4535 # is called for PyLong_Type, the bug is gone.)
4536 class UserLong(object):
4537 def __pow__(self, *args):
4538 pass
4539 try:
4540 pow(0L, UserLong(), 0L)
4541 except:
4542 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004543
Georg Brandl48545522008-02-02 10:12:36 +00004544 # Another segfault only when run early
4545 # (before PyType_Ready(tuple) is called)
4546 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004547
4548
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004549def test_main():
Georg Brandl48545522008-02-02 10:12:36 +00004550 # Run all local test cases, with PTypesLongInitTest first.
4551 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4552 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004553
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004554if __name__ == "__main__":
4555 test_main()