blob: 627f8aa0977fbc8ec724287dfff35aa4e0166770 [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 Petersonfb6fb062009-05-16 21:44:25 +00001686 def return_true(self, thing=None):
1687 return True
1688 def do_isinstance(obj):
1689 return isinstance(int, obj)
1690 def do_issubclass(obj):
1691 return issubclass(int, obj)
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00001692 def swallow(*args): pass
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001693
1694 # It would be nice to have every special method tested here, but I'm
1695 # only listing the ones I can remember outside of typeobject.c, since it
1696 # does it right.
1697 specials = [
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001698 ("__unicode__", unicode, hello, set(), {}),
1699 ("__reversed__", reversed, empty_seq, set(), {}),
1700 ("__length_hint__", list, zero, set(),
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001701 {"__iter__" : iden, "next" : stop}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001702 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1703 ("__instancecheck__", do_isinstance, return_true, set(), {}),
1704 ("__subclasscheck__", do_issubclass, return_true,
1705 set(("__bases__",)), {}),
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00001706 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1707 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001708 ]
1709
1710 class Checker(object):
1711 def __getattr__(self, attr, test=self):
1712 test.fail("__getattr__ called with {0}".format(attr))
1713 def __getattribute__(self, attr, test=self):
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001714 if attr not in ok:
1715 test.fail("__getattribute__ called with {0}".format(attr))
1716 return object.__getattribute__(attr)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001717 class SpecialDescr(object):
1718 def __init__(self, impl):
1719 self.impl = impl
1720 def __get__(self, obj, owner):
1721 record.append(1)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001722 return self.impl.__get__(obj, owner)
Benjamin Peterson87e50062009-05-25 02:40:21 +00001723 class MyException(Exception):
1724 pass
1725 class ErrDescr(object):
1726 def __get__(self, obj, owner):
1727 raise MyException
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001728
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001729 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001730 class X(Checker):
1731 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001732 for attr, obj in env.iteritems():
1733 setattr(X, attr, obj)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001734 setattr(X, name, meth_impl)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001735 runner(X())
1736
1737 record = []
1738 class X(Checker):
1739 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001740 for attr, obj in env.iteritems():
1741 setattr(X, attr, obj)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001742 setattr(X, name, SpecialDescr(meth_impl))
1743 runner(X())
1744 self.assertEqual(record, [1], name)
1745
Benjamin Peterson87e50062009-05-25 02:40:21 +00001746 class X(Checker):
1747 pass
1748 for attr, obj in env.iteritems():
1749 setattr(X, attr, obj)
1750 setattr(X, name, ErrDescr())
1751 try:
1752 runner(X())
1753 except MyException:
1754 pass
1755 else:
1756 self.fail("{0!r} didn't raise".format(name))
1757
Georg Brandl48545522008-02-02 10:12:36 +00001758 def test_specials(self):
1759 # Testing special operators...
1760 # Test operators like __hash__ for which a built-in default exists
1761
1762 # Test the default behavior for static classes
1763 class C(object):
1764 def __getitem__(self, i):
1765 if 0 <= i < 10: return i
1766 raise IndexError
1767 c1 = C()
1768 c2 = C()
1769 self.assert_(not not c1) # What?
1770 self.assertNotEqual(id(c1), id(c2))
1771 hash(c1)
1772 hash(c2)
1773 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1774 self.assertEqual(c1, c1)
1775 self.assert_(c1 != c2)
1776 self.assert_(not c1 != c1)
1777 self.assert_(not c1 == c2)
1778 # Note that the module name appears in str/repr, and that varies
1779 # depending on whether this test is run standalone or from a framework.
1780 self.assert_(str(c1).find('C object at ') >= 0)
1781 self.assertEqual(str(c1), repr(c1))
1782 self.assert_(-1 not in c1)
1783 for i in range(10):
1784 self.assert_(i in c1)
1785 self.assertFalse(10 in c1)
1786 # Test the default behavior for dynamic classes
1787 class D(object):
1788 def __getitem__(self, i):
1789 if 0 <= i < 10: return i
1790 raise IndexError
1791 d1 = D()
1792 d2 = D()
1793 self.assert_(not not d1)
1794 self.assertNotEqual(id(d1), id(d2))
1795 hash(d1)
1796 hash(d2)
1797 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1798 self.assertEqual(d1, d1)
1799 self.assertNotEqual(d1, d2)
1800 self.assert_(not d1 != d1)
1801 self.assert_(not d1 == d2)
1802 # Note that the module name appears in str/repr, and that varies
1803 # depending on whether this test is run standalone or from a framework.
1804 self.assert_(str(d1).find('D object at ') >= 0)
1805 self.assertEqual(str(d1), repr(d1))
1806 self.assert_(-1 not in d1)
1807 for i in range(10):
1808 self.assert_(i in d1)
1809 self.assertFalse(10 in d1)
1810 # Test overridden behavior for static classes
1811 class Proxy(object):
1812 def __init__(self, x):
1813 self.x = x
1814 def __nonzero__(self):
1815 return not not self.x
1816 def __hash__(self):
1817 return hash(self.x)
1818 def __eq__(self, other):
1819 return self.x == other
1820 def __ne__(self, other):
1821 return self.x != other
1822 def __cmp__(self, other):
1823 return cmp(self.x, other.x)
1824 def __str__(self):
1825 return "Proxy:%s" % self.x
1826 def __repr__(self):
1827 return "Proxy(%r)" % self.x
1828 def __contains__(self, value):
1829 return value in self.x
1830 p0 = Proxy(0)
1831 p1 = Proxy(1)
1832 p_1 = Proxy(-1)
1833 self.assertFalse(p0)
1834 self.assert_(not not p1)
1835 self.assertEqual(hash(p0), hash(0))
1836 self.assertEqual(p0, p0)
1837 self.assertNotEqual(p0, p1)
1838 self.assert_(not p0 != p0)
1839 self.assertEqual(not p0, p1)
1840 self.assertEqual(cmp(p0, p1), -1)
1841 self.assertEqual(cmp(p0, p0), 0)
1842 self.assertEqual(cmp(p0, p_1), 1)
1843 self.assertEqual(str(p0), "Proxy:0")
1844 self.assertEqual(repr(p0), "Proxy(0)")
1845 p10 = Proxy(range(10))
1846 self.assertFalse(-1 in p10)
1847 for i in range(10):
1848 self.assert_(i in p10)
1849 self.assertFalse(10 in p10)
1850 # Test overridden behavior for dynamic classes
1851 class DProxy(object):
1852 def __init__(self, x):
1853 self.x = x
1854 def __nonzero__(self):
1855 return not not self.x
1856 def __hash__(self):
1857 return hash(self.x)
1858 def __eq__(self, other):
1859 return self.x == other
1860 def __ne__(self, other):
1861 return self.x != other
1862 def __cmp__(self, other):
1863 return cmp(self.x, other.x)
1864 def __str__(self):
1865 return "DProxy:%s" % self.x
1866 def __repr__(self):
1867 return "DProxy(%r)" % self.x
1868 def __contains__(self, value):
1869 return value in self.x
1870 p0 = DProxy(0)
1871 p1 = DProxy(1)
1872 p_1 = DProxy(-1)
1873 self.assertFalse(p0)
1874 self.assert_(not not p1)
1875 self.assertEqual(hash(p0), hash(0))
1876 self.assertEqual(p0, p0)
1877 self.assertNotEqual(p0, p1)
1878 self.assertNotEqual(not p0, p0)
1879 self.assertEqual(not p0, p1)
1880 self.assertEqual(cmp(p0, p1), -1)
1881 self.assertEqual(cmp(p0, p0), 0)
1882 self.assertEqual(cmp(p0, p_1), 1)
1883 self.assertEqual(str(p0), "DProxy:0")
1884 self.assertEqual(repr(p0), "DProxy(0)")
1885 p10 = DProxy(range(10))
1886 self.assertFalse(-1 in p10)
1887 for i in range(10):
1888 self.assert_(i in p10)
1889 self.assertFalse(10 in p10)
1890
1891 # Safety test for __cmp__
1892 def unsafecmp(a, b):
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001893 if not hasattr(a, '__cmp__'):
1894 return # some types don't have a __cmp__ any more (so the
1895 # test doesn't make sense any more), or maybe they
1896 # never had a __cmp__ at all, e.g. in PyPy
Georg Brandl48545522008-02-02 10:12:36 +00001897 try:
1898 a.__class__.__cmp__(a, b)
1899 except TypeError:
1900 pass
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001901 else:
Georg Brandl48545522008-02-02 10:12:36 +00001902 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1903 a.__class__, a, b))
1904
1905 unsafecmp(u"123", "123")
1906 unsafecmp("123", u"123")
1907 unsafecmp(1, 1.0)
1908 unsafecmp(1.0, 1)
1909 unsafecmp(1, 1L)
1910 unsafecmp(1L, 1)
1911
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001912 @test_support.impl_detail("custom logic for printing to real file objects")
1913 def test_recursions_1(self):
Georg Brandl48545522008-02-02 10:12:36 +00001914 # Testing recursion checks ...
1915 class Letter(str):
1916 def __new__(cls, letter):
1917 if letter == 'EPS':
1918 return str.__new__(cls)
1919 return str.__new__(cls, letter)
1920 def __str__(self):
1921 if not self:
1922 return 'EPS'
1923 return self
1924 # sys.stdout needs to be the original to trigger the recursion bug
1925 import sys
1926 test_stdout = sys.stdout
1927 sys.stdout = test_support.get_original_stdout()
1928 try:
1929 # nothing should actually be printed, this should raise an exception
1930 print Letter('w')
1931 except RuntimeError:
1932 pass
1933 else:
1934 self.fail("expected a RuntimeError for print recursion")
1935 finally:
1936 sys.stdout = test_stdout
1937
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001938 def test_recursions_2(self):
Georg Brandl48545522008-02-02 10:12:36 +00001939 # Bug #1202533.
1940 class A(object):
1941 pass
1942 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
1943 try:
1944 A()*2
1945 except RuntimeError:
1946 pass
1947 else:
1948 self.fail("expected a RuntimeError")
1949
1950 def test_weakrefs(self):
1951 # Testing weak references...
1952 import weakref
1953 class C(object):
1954 pass
1955 c = C()
1956 r = weakref.ref(c)
1957 self.assertEqual(r(), c)
1958 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001959 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001960 self.assertEqual(r(), None)
1961 del r
1962 class NoWeak(object):
1963 __slots__ = ['foo']
1964 no = NoWeak()
1965 try:
1966 weakref.ref(no)
1967 except TypeError, msg:
1968 self.assert_(str(msg).find("weak reference") >= 0)
1969 else:
1970 self.fail("weakref.ref(no) should be illegal")
1971 class Weak(object):
1972 __slots__ = ['foo', '__weakref__']
1973 yes = Weak()
1974 r = weakref.ref(yes)
1975 self.assertEqual(r(), yes)
1976 del yes
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001977 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001978 self.assertEqual(r(), None)
1979 del r
1980
1981 def test_properties(self):
1982 # Testing property...
1983 class C(object):
1984 def getx(self):
1985 return self.__x
1986 def setx(self, value):
1987 self.__x = value
1988 def delx(self):
1989 del self.__x
1990 x = property(getx, setx, delx, doc="I'm the x property.")
1991 a = C()
1992 self.assertFalse(hasattr(a, "x"))
1993 a.x = 42
1994 self.assertEqual(a._C__x, 42)
1995 self.assertEqual(a.x, 42)
1996 del a.x
1997 self.assertFalse(hasattr(a, "x"))
1998 self.assertFalse(hasattr(a, "_C__x"))
1999 C.x.__set__(a, 100)
2000 self.assertEqual(C.x.__get__(a), 100)
2001 C.x.__delete__(a)
2002 self.assertFalse(hasattr(a, "x"))
2003
2004 raw = C.__dict__['x']
2005 self.assert_(isinstance(raw, property))
2006
2007 attrs = dir(raw)
2008 self.assert_("__doc__" in attrs)
2009 self.assert_("fget" in attrs)
2010 self.assert_("fset" in attrs)
2011 self.assert_("fdel" in attrs)
2012
2013 self.assertEqual(raw.__doc__, "I'm the x property.")
2014 self.assert_(raw.fget is C.__dict__['getx'])
2015 self.assert_(raw.fset is C.__dict__['setx'])
2016 self.assert_(raw.fdel is C.__dict__['delx'])
2017
2018 for attr in "__doc__", "fget", "fset", "fdel":
2019 try:
2020 setattr(raw, attr, 42)
2021 except TypeError, msg:
2022 if str(msg).find('readonly') < 0:
2023 self.fail("when setting readonly attr %r on a property, "
2024 "got unexpected TypeError msg %r" % (attr, str(msg)))
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002025 else:
Georg Brandl48545522008-02-02 10:12:36 +00002026 self.fail("expected TypeError from trying to set readonly %r "
2027 "attr on a property" % attr)
Tim Peters2f93e282001-10-04 05:27:00 +00002028
Georg Brandl48545522008-02-02 10:12:36 +00002029 class D(object):
2030 __getitem__ = property(lambda s: 1/0)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002031
Georg Brandl48545522008-02-02 10:12:36 +00002032 d = D()
2033 try:
2034 for i in d:
2035 str(i)
2036 except ZeroDivisionError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002037 pass
Georg Brandl48545522008-02-02 10:12:36 +00002038 else:
2039 self.fail("expected ZeroDivisionError from bad property")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002040
Georg Brandl48545522008-02-02 10:12:36 +00002041 class E(object):
2042 def getter(self):
2043 "getter method"
2044 return 0
2045 def setter(self_, value):
2046 "setter method"
2047 pass
2048 prop = property(getter)
2049 self.assertEqual(prop.__doc__, "getter method")
2050 prop2 = property(fset=setter)
2051 self.assertEqual(prop2.__doc__, None)
2052
2053 # this segfaulted in 2.5b2
2054 try:
2055 import _testcapi
2056 except ImportError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002057 pass
Georg Brandl48545522008-02-02 10:12:36 +00002058 else:
2059 class X(object):
2060 p = property(_testcapi.test_with_docstring)
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002061
Georg Brandl48545522008-02-02 10:12:36 +00002062 def test_properties_plus(self):
2063 class C(object):
2064 foo = property(doc="hello")
2065 @foo.getter
2066 def foo(self):
2067 return self._foo
2068 @foo.setter
2069 def foo(self, value):
2070 self._foo = abs(value)
2071 @foo.deleter
2072 def foo(self):
2073 del self._foo
2074 c = C()
2075 self.assertEqual(C.foo.__doc__, "hello")
2076 self.assertFalse(hasattr(c, "foo"))
2077 c.foo = -42
2078 self.assert_(hasattr(c, '_foo'))
2079 self.assertEqual(c._foo, 42)
2080 self.assertEqual(c.foo, 42)
2081 del c.foo
2082 self.assertFalse(hasattr(c, '_foo'))
2083 self.assertFalse(hasattr(c, "foo"))
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002084
Georg Brandl48545522008-02-02 10:12:36 +00002085 class D(C):
2086 @C.foo.deleter
2087 def foo(self):
2088 try:
2089 del self._foo
2090 except AttributeError:
2091 pass
2092 d = D()
2093 d.foo = 24
2094 self.assertEqual(d.foo, 24)
2095 del d.foo
2096 del d.foo
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002097
Georg Brandl48545522008-02-02 10:12:36 +00002098 class E(object):
2099 @property
2100 def foo(self):
2101 return self._foo
2102 @foo.setter
2103 def foo(self, value):
2104 raise RuntimeError
2105 @foo.setter
2106 def foo(self, value):
2107 self._foo = abs(value)
2108 @foo.deleter
2109 def foo(self, value=None):
2110 del self._foo
Guido van Rossume8fc6402002-04-16 16:44:51 +00002111
Georg Brandl48545522008-02-02 10:12:36 +00002112 e = E()
2113 e.foo = -42
2114 self.assertEqual(e.foo, 42)
2115 del e.foo
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002116
Georg Brandl48545522008-02-02 10:12:36 +00002117 class F(E):
2118 @E.foo.deleter
2119 def foo(self):
2120 del self._foo
2121 @foo.setter
2122 def foo(self, value):
2123 self._foo = max(0, value)
2124 f = F()
2125 f.foo = -10
2126 self.assertEqual(f.foo, 0)
2127 del f.foo
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00002128
Georg Brandl48545522008-02-02 10:12:36 +00002129 def test_dict_constructors(self):
2130 # Testing dict constructor ...
2131 d = dict()
2132 self.assertEqual(d, {})
2133 d = dict({})
2134 self.assertEqual(d, {})
2135 d = dict({1: 2, 'a': 'b'})
2136 self.assertEqual(d, {1: 2, 'a': 'b'})
2137 self.assertEqual(d, dict(d.items()))
2138 self.assertEqual(d, dict(d.iteritems()))
2139 d = dict({'one':1, 'two':2})
2140 self.assertEqual(d, dict(one=1, two=2))
2141 self.assertEqual(d, dict(**d))
2142 self.assertEqual(d, dict({"one": 1}, two=2))
2143 self.assertEqual(d, dict([("two", 2)], one=1))
2144 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
2145 self.assertEqual(d, dict(**d))
Guido van Rossum09638c12002-06-13 19:17:46 +00002146
Georg Brandl48545522008-02-02 10:12:36 +00002147 for badarg in 0, 0L, 0j, "0", [0], (0,):
2148 try:
2149 dict(badarg)
2150 except TypeError:
2151 pass
2152 except ValueError:
2153 if badarg == "0":
2154 # It's a sequence, and its elements are also sequences (gotta
2155 # love strings <wink>), but they aren't of length 2, so this
2156 # one seemed better as a ValueError than a TypeError.
2157 pass
2158 else:
2159 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002160 else:
Georg Brandl48545522008-02-02 10:12:36 +00002161 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002162
Georg Brandl48545522008-02-02 10:12:36 +00002163 try:
2164 dict({}, {})
2165 except TypeError:
2166 pass
2167 else:
2168 self.fail("no TypeError from dict({}, {})")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002169
Georg Brandl48545522008-02-02 10:12:36 +00002170 class Mapping:
2171 # Lacks a .keys() method; will be added later.
2172 dict = {1:2, 3:4, 'a':1j}
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002173
Georg Brandl48545522008-02-02 10:12:36 +00002174 try:
2175 dict(Mapping())
2176 except TypeError:
2177 pass
2178 else:
2179 self.fail("no TypeError from dict(incomplete mapping)")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002180
Georg Brandl48545522008-02-02 10:12:36 +00002181 Mapping.keys = lambda self: self.dict.keys()
2182 Mapping.__getitem__ = lambda self, i: self.dict[i]
2183 d = dict(Mapping())
2184 self.assertEqual(d, Mapping.dict)
Michael W. Hudsonf3904422006-11-23 13:54:04 +00002185
Georg Brandl48545522008-02-02 10:12:36 +00002186 # Init from sequence of iterable objects, each producing a 2-sequence.
2187 class AddressBookEntry:
2188 def __init__(self, first, last):
2189 self.first = first
2190 self.last = last
2191 def __iter__(self):
2192 return iter([self.first, self.last])
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002193
Georg Brandl48545522008-02-02 10:12:36 +00002194 d = dict([AddressBookEntry('Tim', 'Warsaw'),
2195 AddressBookEntry('Barry', 'Peters'),
2196 AddressBookEntry('Tim', 'Peters'),
2197 AddressBookEntry('Barry', 'Warsaw')])
2198 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00002199
Georg Brandl48545522008-02-02 10:12:36 +00002200 d = dict(zip(range(4), range(1, 5)))
2201 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002202
Georg Brandl48545522008-02-02 10:12:36 +00002203 # Bad sequence lengths.
2204 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2205 try:
2206 dict(bad)
2207 except ValueError:
2208 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00002209 else:
Georg Brandl48545522008-02-02 10:12:36 +00002210 self.fail("no ValueError from dict(%r)" % bad)
2211
2212 def test_dir(self):
2213 # Testing dir() ...
2214 junk = 12
2215 self.assertEqual(dir(), ['junk', 'self'])
2216 del junk
2217
2218 # Just make sure these don't blow up!
2219 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
2220 dir(arg)
2221
2222 # Try classic classes.
2223 class C:
2224 Cdata = 1
2225 def Cmethod(self): pass
2226
2227 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
2228 self.assertEqual(dir(C), cstuff)
2229 self.assert_('im_self' in dir(C.Cmethod))
2230
2231 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
2232 self.assertEqual(dir(c), cstuff)
2233
2234 c.cdata = 2
2235 c.cmethod = lambda self: 0
2236 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
2237 self.assert_('im_self' in dir(c.Cmethod))
2238
2239 class A(C):
2240 Adata = 1
2241 def Amethod(self): pass
2242
2243 astuff = ['Adata', 'Amethod'] + cstuff
2244 self.assertEqual(dir(A), astuff)
2245 self.assert_('im_self' in dir(A.Amethod))
2246 a = A()
2247 self.assertEqual(dir(a), astuff)
2248 self.assert_('im_self' in dir(a.Amethod))
2249 a.adata = 42
2250 a.amethod = lambda self: 3
2251 self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
2252
2253 # The same, but with new-style classes. Since these have object as a
2254 # base class, a lot more gets sucked in.
2255 def interesting(strings):
2256 return [s for s in strings if not s.startswith('_')]
2257
2258 class C(object):
2259 Cdata = 1
2260 def Cmethod(self): pass
2261
2262 cstuff = ['Cdata', 'Cmethod']
2263 self.assertEqual(interesting(dir(C)), cstuff)
2264
2265 c = C()
2266 self.assertEqual(interesting(dir(c)), cstuff)
2267 self.assert_('im_self' in dir(C.Cmethod))
2268
2269 c.cdata = 2
2270 c.cmethod = lambda self: 0
2271 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
2272 self.assert_('im_self' in dir(c.Cmethod))
2273
2274 class A(C):
2275 Adata = 1
2276 def Amethod(self): pass
2277
2278 astuff = ['Adata', 'Amethod'] + cstuff
2279 self.assertEqual(interesting(dir(A)), astuff)
2280 self.assert_('im_self' in dir(A.Amethod))
2281 a = A()
2282 self.assertEqual(interesting(dir(a)), astuff)
2283 a.adata = 42
2284 a.amethod = lambda self: 3
2285 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
2286 self.assert_('im_self' in dir(a.Amethod))
2287
2288 # Try a module subclass.
2289 import sys
2290 class M(type(sys)):
2291 pass
2292 minstance = M("m")
2293 minstance.b = 2
2294 minstance.a = 1
2295 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2296 self.assertEqual(names, ['a', 'b'])
2297
2298 class M2(M):
2299 def getdict(self):
2300 return "Not a dict!"
2301 __dict__ = property(getdict)
2302
2303 m2instance = M2("m2")
2304 m2instance.b = 2
2305 m2instance.a = 1
2306 self.assertEqual(m2instance.__dict__, "Not a dict!")
2307 try:
2308 dir(m2instance)
2309 except TypeError:
2310 pass
2311
2312 # Two essentially featureless objects, just inheriting stuff from
2313 # object.
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002314 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2315 if test_support.check_impl_detail():
2316 # None differs in PyPy: it has a __nonzero__
2317 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl48545522008-02-02 10:12:36 +00002318
2319 # Nasty test case for proxied objects
2320 class Wrapper(object):
2321 def __init__(self, obj):
2322 self.__obj = obj
2323 def __repr__(self):
2324 return "Wrapper(%s)" % repr(self.__obj)
2325 def __getitem__(self, key):
2326 return Wrapper(self.__obj[key])
2327 def __len__(self):
2328 return len(self.__obj)
2329 def __getattr__(self, name):
2330 return Wrapper(getattr(self.__obj, name))
2331
2332 class C(object):
2333 def __getclass(self):
2334 return Wrapper(type(self))
2335 __class__ = property(__getclass)
2336
2337 dir(C()) # This used to segfault
2338
2339 def test_supers(self):
2340 # Testing super...
2341
2342 class A(object):
2343 def meth(self, a):
2344 return "A(%r)" % a
2345
2346 self.assertEqual(A().meth(1), "A(1)")
2347
2348 class B(A):
2349 def __init__(self):
2350 self.__super = super(B, self)
2351 def meth(self, a):
2352 return "B(%r)" % a + self.__super.meth(a)
2353
2354 self.assertEqual(B().meth(2), "B(2)A(2)")
2355
2356 class C(A):
2357 def meth(self, a):
2358 return "C(%r)" % a + self.__super.meth(a)
2359 C._C__super = super(C)
2360
2361 self.assertEqual(C().meth(3), "C(3)A(3)")
2362
2363 class D(C, B):
2364 def meth(self, a):
2365 return "D(%r)" % a + super(D, self).meth(a)
2366
2367 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2368
2369 # Test for subclassing super
2370
2371 class mysuper(super):
2372 def __init__(self, *args):
2373 return super(mysuper, self).__init__(*args)
2374
2375 class E(D):
2376 def meth(self, a):
2377 return "E(%r)" % a + mysuper(E, self).meth(a)
2378
2379 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2380
2381 class F(E):
2382 def meth(self, a):
2383 s = self.__super # == mysuper(F, self)
2384 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2385 F._F__super = mysuper(F)
2386
2387 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2388
2389 # Make sure certain errors are raised
2390
2391 try:
2392 super(D, 42)
2393 except TypeError:
2394 pass
2395 else:
2396 self.fail("shouldn't allow super(D, 42)")
2397
2398 try:
2399 super(D, C())
2400 except TypeError:
2401 pass
2402 else:
2403 self.fail("shouldn't allow super(D, C())")
2404
2405 try:
2406 super(D).__get__(12)
2407 except TypeError:
2408 pass
2409 else:
2410 self.fail("shouldn't allow super(D).__get__(12)")
2411
2412 try:
2413 super(D).__get__(C())
2414 except TypeError:
2415 pass
2416 else:
2417 self.fail("shouldn't allow super(D).__get__(C())")
2418
2419 # Make sure data descriptors can be overridden and accessed via super
2420 # (new feature in Python 2.3)
2421
2422 class DDbase(object):
2423 def getx(self): return 42
2424 x = property(getx)
2425
2426 class DDsub(DDbase):
2427 def getx(self): return "hello"
2428 x = property(getx)
2429
2430 dd = DDsub()
2431 self.assertEqual(dd.x, "hello")
2432 self.assertEqual(super(DDsub, dd).x, 42)
2433
2434 # Ensure that super() lookup of descriptor from classmethod
2435 # works (SF ID# 743627)
2436
2437 class Base(object):
2438 aProp = property(lambda self: "foo")
2439
2440 class Sub(Base):
2441 @classmethod
2442 def test(klass):
2443 return super(Sub,klass).aProp
2444
2445 self.assertEqual(Sub.test(), Base.aProp)
2446
2447 # Verify that super() doesn't allow keyword args
2448 try:
2449 super(Base, kw=1)
2450 except TypeError:
2451 pass
2452 else:
2453 self.assertEqual("super shouldn't accept keyword args")
2454
2455 def test_basic_inheritance(self):
2456 # Testing inheritance from basic types...
2457
2458 class hexint(int):
2459 def __repr__(self):
2460 return hex(self)
2461 def __add__(self, other):
2462 return hexint(int.__add__(self, other))
2463 # (Note that overriding __radd__ doesn't work,
2464 # because the int type gets first dibs.)
2465 self.assertEqual(repr(hexint(7) + 9), "0x10")
2466 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2467 a = hexint(12345)
2468 self.assertEqual(a, 12345)
2469 self.assertEqual(int(a), 12345)
2470 self.assert_(int(a).__class__ is int)
2471 self.assertEqual(hash(a), hash(12345))
2472 self.assert_((+a).__class__ is int)
2473 self.assert_((a >> 0).__class__ is int)
2474 self.assert_((a << 0).__class__ is int)
2475 self.assert_((hexint(0) << 12).__class__ is int)
2476 self.assert_((hexint(0) >> 12).__class__ is int)
2477
2478 class octlong(long):
2479 __slots__ = []
2480 def __str__(self):
2481 s = oct(self)
2482 if s[-1] == 'L':
2483 s = s[:-1]
2484 return s
2485 def __add__(self, other):
2486 return self.__class__(super(octlong, self).__add__(other))
2487 __radd__ = __add__
2488 self.assertEqual(str(octlong(3) + 5), "010")
2489 # (Note that overriding __radd__ here only seems to work
2490 # because the example uses a short int left argument.)
2491 self.assertEqual(str(5 + octlong(3000)), "05675")
2492 a = octlong(12345)
2493 self.assertEqual(a, 12345L)
2494 self.assertEqual(long(a), 12345L)
2495 self.assertEqual(hash(a), hash(12345L))
2496 self.assert_(long(a).__class__ is long)
2497 self.assert_((+a).__class__ is long)
2498 self.assert_((-a).__class__ is long)
2499 self.assert_((-octlong(0)).__class__ is long)
2500 self.assert_((a >> 0).__class__ is long)
2501 self.assert_((a << 0).__class__ is long)
2502 self.assert_((a - 0).__class__ is long)
2503 self.assert_((a * 1).__class__ is long)
2504 self.assert_((a ** 1).__class__ is long)
2505 self.assert_((a // 1).__class__ is long)
2506 self.assert_((1 * a).__class__ is long)
2507 self.assert_((a | 0).__class__ is long)
2508 self.assert_((a ^ 0).__class__ is long)
2509 self.assert_((a & -1L).__class__ is long)
2510 self.assert_((octlong(0) << 12).__class__ is long)
2511 self.assert_((octlong(0) >> 12).__class__ is long)
2512 self.assert_(abs(octlong(0)).__class__ is long)
2513
2514 # Because octlong overrides __add__, we can't check the absence of +0
2515 # optimizations using octlong.
2516 class longclone(long):
2517 pass
2518 a = longclone(1)
2519 self.assert_((a + 0).__class__ is long)
2520 self.assert_((0 + a).__class__ is long)
2521
2522 # Check that negative clones don't segfault
2523 a = longclone(-1)
2524 self.assertEqual(a.__dict__, {})
2525 self.assertEqual(long(a), -1) # self.assert_ PyNumber_Long() copies the sign bit
2526
2527 class precfloat(float):
2528 __slots__ = ['prec']
2529 def __init__(self, value=0.0, prec=12):
2530 self.prec = int(prec)
2531 def __repr__(self):
2532 return "%.*g" % (self.prec, self)
2533 self.assertEqual(repr(precfloat(1.1)), "1.1")
2534 a = precfloat(12345)
2535 self.assertEqual(a, 12345.0)
2536 self.assertEqual(float(a), 12345.0)
2537 self.assert_(float(a).__class__ is float)
2538 self.assertEqual(hash(a), hash(12345.0))
2539 self.assert_((+a).__class__ is float)
2540
2541 class madcomplex(complex):
2542 def __repr__(self):
2543 return "%.17gj%+.17g" % (self.imag, self.real)
2544 a = madcomplex(-3, 4)
2545 self.assertEqual(repr(a), "4j-3")
2546 base = complex(-3, 4)
2547 self.assertEqual(base.__class__, complex)
2548 self.assertEqual(a, base)
2549 self.assertEqual(complex(a), base)
2550 self.assertEqual(complex(a).__class__, complex)
2551 a = madcomplex(a) # just trying another form of the constructor
2552 self.assertEqual(repr(a), "4j-3")
2553 self.assertEqual(a, base)
2554 self.assertEqual(complex(a), base)
2555 self.assertEqual(complex(a).__class__, complex)
2556 self.assertEqual(hash(a), hash(base))
2557 self.assertEqual((+a).__class__, complex)
2558 self.assertEqual((a + 0).__class__, complex)
2559 self.assertEqual(a + 0, base)
2560 self.assertEqual((a - 0).__class__, complex)
2561 self.assertEqual(a - 0, base)
2562 self.assertEqual((a * 1).__class__, complex)
2563 self.assertEqual(a * 1, base)
2564 self.assertEqual((a / 1).__class__, complex)
2565 self.assertEqual(a / 1, base)
2566
2567 class madtuple(tuple):
2568 _rev = None
2569 def rev(self):
2570 if self._rev is not None:
2571 return self._rev
2572 L = list(self)
2573 L.reverse()
2574 self._rev = self.__class__(L)
2575 return self._rev
2576 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2577 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2578 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2579 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2580 for i in range(512):
2581 t = madtuple(range(i))
2582 u = t.rev()
2583 v = u.rev()
2584 self.assertEqual(v, t)
2585 a = madtuple((1,2,3,4,5))
2586 self.assertEqual(tuple(a), (1,2,3,4,5))
2587 self.assert_(tuple(a).__class__ is tuple)
2588 self.assertEqual(hash(a), hash((1,2,3,4,5)))
2589 self.assert_(a[:].__class__ is tuple)
2590 self.assert_((a * 1).__class__ is tuple)
2591 self.assert_((a * 0).__class__ is tuple)
2592 self.assert_((a + ()).__class__ is tuple)
2593 a = madtuple(())
2594 self.assertEqual(tuple(a), ())
2595 self.assert_(tuple(a).__class__ is tuple)
2596 self.assert_((a + a).__class__ is tuple)
2597 self.assert_((a * 0).__class__ is tuple)
2598 self.assert_((a * 1).__class__ is tuple)
2599 self.assert_((a * 2).__class__ is tuple)
2600 self.assert_(a[:].__class__ is tuple)
2601
2602 class madstring(str):
2603 _rev = None
2604 def rev(self):
2605 if self._rev is not None:
2606 return self._rev
2607 L = list(self)
2608 L.reverse()
2609 self._rev = self.__class__("".join(L))
2610 return self._rev
2611 s = madstring("abcdefghijklmnopqrstuvwxyz")
2612 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2613 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2614 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2615 for i in range(256):
2616 s = madstring("".join(map(chr, range(i))))
2617 t = s.rev()
2618 u = t.rev()
2619 self.assertEqual(u, s)
2620 s = madstring("12345")
2621 self.assertEqual(str(s), "12345")
2622 self.assert_(str(s).__class__ is str)
2623
2624 base = "\x00" * 5
2625 s = madstring(base)
2626 self.assertEqual(s, base)
2627 self.assertEqual(str(s), base)
2628 self.assert_(str(s).__class__ is str)
2629 self.assertEqual(hash(s), hash(base))
2630 self.assertEqual({s: 1}[base], 1)
2631 self.assertEqual({base: 1}[s], 1)
2632 self.assert_((s + "").__class__ is str)
2633 self.assertEqual(s + "", base)
2634 self.assert_(("" + s).__class__ is str)
2635 self.assertEqual("" + s, base)
2636 self.assert_((s * 0).__class__ is str)
2637 self.assertEqual(s * 0, "")
2638 self.assert_((s * 1).__class__ is str)
2639 self.assertEqual(s * 1, base)
2640 self.assert_((s * 2).__class__ is str)
2641 self.assertEqual(s * 2, base + base)
2642 self.assert_(s[:].__class__ is str)
2643 self.assertEqual(s[:], base)
2644 self.assert_(s[0:0].__class__ is str)
2645 self.assertEqual(s[0:0], "")
2646 self.assert_(s.strip().__class__ is str)
2647 self.assertEqual(s.strip(), base)
2648 self.assert_(s.lstrip().__class__ is str)
2649 self.assertEqual(s.lstrip(), base)
2650 self.assert_(s.rstrip().__class__ is str)
2651 self.assertEqual(s.rstrip(), base)
2652 identitytab = ''.join([chr(i) for i in range(256)])
2653 self.assert_(s.translate(identitytab).__class__ is str)
2654 self.assertEqual(s.translate(identitytab), base)
2655 self.assert_(s.translate(identitytab, "x").__class__ is str)
2656 self.assertEqual(s.translate(identitytab, "x"), base)
2657 self.assertEqual(s.translate(identitytab, "\x00"), "")
2658 self.assert_(s.replace("x", "x").__class__ is str)
2659 self.assertEqual(s.replace("x", "x"), base)
2660 self.assert_(s.ljust(len(s)).__class__ is str)
2661 self.assertEqual(s.ljust(len(s)), base)
2662 self.assert_(s.rjust(len(s)).__class__ is str)
2663 self.assertEqual(s.rjust(len(s)), base)
2664 self.assert_(s.center(len(s)).__class__ is str)
2665 self.assertEqual(s.center(len(s)), base)
2666 self.assert_(s.lower().__class__ is str)
2667 self.assertEqual(s.lower(), base)
2668
2669 class madunicode(unicode):
2670 _rev = None
2671 def rev(self):
2672 if self._rev is not None:
2673 return self._rev
2674 L = list(self)
2675 L.reverse()
2676 self._rev = self.__class__(u"".join(L))
2677 return self._rev
2678 u = madunicode("ABCDEF")
2679 self.assertEqual(u, u"ABCDEF")
2680 self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
2681 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
2682 base = u"12345"
2683 u = madunicode(base)
2684 self.assertEqual(unicode(u), base)
2685 self.assert_(unicode(u).__class__ is unicode)
2686 self.assertEqual(hash(u), hash(base))
2687 self.assertEqual({u: 1}[base], 1)
2688 self.assertEqual({base: 1}[u], 1)
2689 self.assert_(u.strip().__class__ is unicode)
2690 self.assertEqual(u.strip(), base)
2691 self.assert_(u.lstrip().__class__ is unicode)
2692 self.assertEqual(u.lstrip(), base)
2693 self.assert_(u.rstrip().__class__ is unicode)
2694 self.assertEqual(u.rstrip(), base)
2695 self.assert_(u.replace(u"x", u"x").__class__ is unicode)
2696 self.assertEqual(u.replace(u"x", u"x"), base)
2697 self.assert_(u.replace(u"xy", u"xy").__class__ is unicode)
2698 self.assertEqual(u.replace(u"xy", u"xy"), base)
2699 self.assert_(u.center(len(u)).__class__ is unicode)
2700 self.assertEqual(u.center(len(u)), base)
2701 self.assert_(u.ljust(len(u)).__class__ is unicode)
2702 self.assertEqual(u.ljust(len(u)), base)
2703 self.assert_(u.rjust(len(u)).__class__ is unicode)
2704 self.assertEqual(u.rjust(len(u)), base)
2705 self.assert_(u.lower().__class__ is unicode)
2706 self.assertEqual(u.lower(), base)
2707 self.assert_(u.upper().__class__ is unicode)
2708 self.assertEqual(u.upper(), base)
2709 self.assert_(u.capitalize().__class__ is unicode)
2710 self.assertEqual(u.capitalize(), base)
2711 self.assert_(u.title().__class__ is unicode)
2712 self.assertEqual(u.title(), base)
2713 self.assert_((u + u"").__class__ is unicode)
2714 self.assertEqual(u + u"", base)
2715 self.assert_((u"" + u).__class__ is unicode)
2716 self.assertEqual(u"" + u, base)
2717 self.assert_((u * 0).__class__ is unicode)
2718 self.assertEqual(u * 0, u"")
2719 self.assert_((u * 1).__class__ is unicode)
2720 self.assertEqual(u * 1, base)
2721 self.assert_((u * 2).__class__ is unicode)
2722 self.assertEqual(u * 2, base + base)
2723 self.assert_(u[:].__class__ is unicode)
2724 self.assertEqual(u[:], base)
2725 self.assert_(u[0:0].__class__ is unicode)
2726 self.assertEqual(u[0:0], u"")
2727
2728 class sublist(list):
2729 pass
2730 a = sublist(range(5))
2731 self.assertEqual(a, range(5))
2732 a.append("hello")
2733 self.assertEqual(a, range(5) + ["hello"])
2734 a[5] = 5
2735 self.assertEqual(a, range(6))
2736 a.extend(range(6, 20))
2737 self.assertEqual(a, range(20))
2738 a[-5:] = []
2739 self.assertEqual(a, range(15))
2740 del a[10:15]
2741 self.assertEqual(len(a), 10)
2742 self.assertEqual(a, range(10))
2743 self.assertEqual(list(a), range(10))
2744 self.assertEqual(a[0], 0)
2745 self.assertEqual(a[9], 9)
2746 self.assertEqual(a[-10], 0)
2747 self.assertEqual(a[-1], 9)
2748 self.assertEqual(a[:5], range(5))
2749
2750 class CountedInput(file):
2751 """Counts lines read by self.readline().
2752
2753 self.lineno is the 0-based ordinal of the last line read, up to
2754 a maximum of one greater than the number of lines in the file.
2755
2756 self.ateof is true if and only if the final "" line has been read,
2757 at which point self.lineno stops incrementing, and further calls
2758 to readline() continue to return "".
2759 """
2760
2761 lineno = 0
2762 ateof = 0
2763 def readline(self):
2764 if self.ateof:
2765 return ""
2766 s = file.readline(self)
2767 # Next line works too.
2768 # s = super(CountedInput, self).readline()
2769 self.lineno += 1
2770 if s == "":
2771 self.ateof = 1
2772 return s
2773
2774 f = file(name=test_support.TESTFN, mode='w')
2775 lines = ['a\n', 'b\n', 'c\n']
2776 try:
2777 f.writelines(lines)
2778 f.close()
2779 f = CountedInput(test_support.TESTFN)
2780 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2781 got = f.readline()
2782 self.assertEqual(expected, got)
2783 self.assertEqual(f.lineno, i)
2784 self.assertEqual(f.ateof, (i > len(lines)))
2785 f.close()
2786 finally:
2787 try:
2788 f.close()
2789 except:
2790 pass
2791 test_support.unlink(test_support.TESTFN)
2792
2793 def test_keywords(self):
2794 # Testing keyword args to basic type constructors ...
2795 self.assertEqual(int(x=1), 1)
2796 self.assertEqual(float(x=2), 2.0)
2797 self.assertEqual(long(x=3), 3L)
2798 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2799 self.assertEqual(str(object=500), '500')
2800 self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
2801 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2802 self.assertEqual(list(sequence=(0, 1, 2)), range(3))
2803 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2804
2805 for constructor in (int, float, long, complex, str, unicode,
2806 tuple, list, file):
2807 try:
2808 constructor(bogus_keyword_arg=1)
2809 except TypeError:
2810 pass
2811 else:
2812 self.fail("expected TypeError from bogus keyword argument to %r"
2813 % constructor)
2814
2815 def test_str_subclass_as_dict_key(self):
2816 # Testing a str subclass used as dict key ..
2817
2818 class cistr(str):
2819 """Sublcass of str that computes __eq__ case-insensitively.
2820
2821 Also computes a hash code of the string in canonical form.
2822 """
2823
2824 def __init__(self, value):
2825 self.canonical = value.lower()
2826 self.hashcode = hash(self.canonical)
2827
2828 def __eq__(self, other):
2829 if not isinstance(other, cistr):
2830 other = cistr(other)
2831 return self.canonical == other.canonical
2832
2833 def __hash__(self):
2834 return self.hashcode
2835
2836 self.assertEqual(cistr('ABC'), 'abc')
2837 self.assertEqual('aBc', cistr('ABC'))
2838 self.assertEqual(str(cistr('ABC')), 'ABC')
2839
2840 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2841 self.assertEqual(d[cistr('one')], 1)
2842 self.assertEqual(d[cistr('tWo')], 2)
2843 self.assertEqual(d[cistr('THrEE')], 3)
2844 self.assert_(cistr('ONe') in d)
2845 self.assertEqual(d.get(cistr('thrEE')), 3)
2846
2847 def test_classic_comparisons(self):
2848 # Testing classic comparisons...
2849 class classic:
2850 pass
2851
2852 for base in (classic, int, object):
2853 class C(base):
2854 def __init__(self, value):
2855 self.value = int(value)
2856 def __cmp__(self, other):
2857 if isinstance(other, C):
2858 return cmp(self.value, other.value)
2859 if isinstance(other, int) or isinstance(other, long):
2860 return cmp(self.value, other)
2861 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002862 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002863
2864 c1 = C(1)
2865 c2 = C(2)
2866 c3 = C(3)
2867 self.assertEqual(c1, 1)
2868 c = {1: c1, 2: c2, 3: c3}
2869 for x in 1, 2, 3:
2870 for y in 1, 2, 3:
2871 self.assert_(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2872 for op in "<", "<=", "==", "!=", ">", ">=":
2873 self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2874 "x=%d, y=%d" % (x, y))
2875 self.assert_(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2876 self.assert_(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2877
2878 def test_rich_comparisons(self):
2879 # Testing rich comparisons...
2880 class Z(complex):
2881 pass
2882 z = Z(1)
2883 self.assertEqual(z, 1+0j)
2884 self.assertEqual(1+0j, z)
2885 class ZZ(complex):
2886 def __eq__(self, other):
2887 try:
2888 return abs(self - other) <= 1e-6
2889 except:
2890 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002891 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002892 zz = ZZ(1.0000003)
2893 self.assertEqual(zz, 1+0j)
2894 self.assertEqual(1+0j, zz)
2895
2896 class classic:
2897 pass
2898 for base in (classic, int, object, list):
2899 class C(base):
2900 def __init__(self, value):
2901 self.value = int(value)
2902 def __cmp__(self_, other):
2903 self.fail("shouldn't call __cmp__")
Nick Coghlan48361f52008-08-11 15:45:58 +00002904 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002905 def __eq__(self, other):
2906 if isinstance(other, C):
2907 return self.value == other.value
2908 if isinstance(other, int) or isinstance(other, long):
2909 return self.value == other
2910 return NotImplemented
2911 def __ne__(self, other):
2912 if isinstance(other, C):
2913 return self.value != other.value
2914 if isinstance(other, int) or isinstance(other, long):
2915 return self.value != other
2916 return NotImplemented
2917 def __lt__(self, other):
2918 if isinstance(other, C):
2919 return self.value < other.value
2920 if isinstance(other, int) or isinstance(other, long):
2921 return self.value < other
2922 return NotImplemented
2923 def __le__(self, other):
2924 if isinstance(other, C):
2925 return self.value <= other.value
2926 if isinstance(other, int) or isinstance(other, long):
2927 return self.value <= other
2928 return NotImplemented
2929 def __gt__(self, other):
2930 if isinstance(other, C):
2931 return self.value > other.value
2932 if isinstance(other, int) or isinstance(other, long):
2933 return self.value > other
2934 return NotImplemented
2935 def __ge__(self, other):
2936 if isinstance(other, C):
2937 return self.value >= other.value
2938 if isinstance(other, int) or isinstance(other, long):
2939 return self.value >= other
2940 return NotImplemented
2941 c1 = C(1)
2942 c2 = C(2)
2943 c3 = C(3)
2944 self.assertEqual(c1, 1)
2945 c = {1: c1, 2: c2, 3: c3}
2946 for x in 1, 2, 3:
2947 for y in 1, 2, 3:
2948 for op in "<", "<=", "==", "!=", ">", ">=":
2949 self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2950 "x=%d, y=%d" % (x, y))
2951 self.assert_(eval("c[x] %s y" % op) == eval("x %s y" % op),
2952 "x=%d, y=%d" % (x, y))
2953 self.assert_(eval("x %s c[y]" % op) == eval("x %s y" % op),
2954 "x=%d, y=%d" % (x, y))
2955
2956 def test_coercions(self):
2957 # Testing coercions...
2958 class I(int): pass
2959 coerce(I(0), 0)
2960 coerce(0, I(0))
2961 class L(long): pass
2962 coerce(L(0), 0)
2963 coerce(L(0), 0L)
2964 coerce(0, L(0))
2965 coerce(0L, L(0))
2966 class F(float): pass
2967 coerce(F(0), 0)
2968 coerce(F(0), 0L)
2969 coerce(F(0), 0.)
2970 coerce(0, F(0))
2971 coerce(0L, F(0))
2972 coerce(0., F(0))
2973 class C(complex): pass
2974 coerce(C(0), 0)
2975 coerce(C(0), 0L)
2976 coerce(C(0), 0.)
2977 coerce(C(0), 0j)
2978 coerce(0, C(0))
2979 coerce(0L, C(0))
2980 coerce(0., C(0))
2981 coerce(0j, C(0))
2982
2983 def test_descrdoc(self):
2984 # Testing descriptor doc strings...
2985 def check(descr, what):
2986 self.assertEqual(descr.__doc__, what)
2987 check(file.closed, "True if the file is closed") # getset descriptor
2988 check(file.name, "file name") # member descriptor
2989
2990 def test_doc_descriptor(self):
2991 # Testing __doc__ descriptor...
2992 # SF bug 542984
2993 class DocDescr(object):
2994 def __get__(self, object, otype):
2995 if object:
2996 object = object.__class__.__name__ + ' instance'
2997 if otype:
2998 otype = otype.__name__
2999 return 'object=%s; type=%s' % (object, otype)
3000 class OldClass:
3001 __doc__ = DocDescr()
3002 class NewClass(object):
3003 __doc__ = DocDescr()
3004 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
3005 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3006 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
3007 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3008
3009 def test_set_class(self):
3010 # Testing __class__ assignment...
3011 class C(object): pass
3012 class D(object): pass
3013 class E(object): pass
3014 class F(D, E): pass
3015 for cls in C, D, E, F:
3016 for cls2 in C, D, E, F:
3017 x = cls()
3018 x.__class__ = cls2
3019 self.assert_(x.__class__ is cls2)
3020 x.__class__ = cls
3021 self.assert_(x.__class__ is cls)
3022 def cant(x, C):
3023 try:
3024 x.__class__ = C
3025 except TypeError:
3026 pass
3027 else:
3028 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
3029 try:
3030 delattr(x, "__class__")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003031 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003032 pass
3033 else:
3034 self.fail("shouldn't allow del %r.__class__" % x)
3035 cant(C(), list)
3036 cant(list(), C)
3037 cant(C(), 1)
3038 cant(C(), object)
3039 cant(object(), list)
3040 cant(list(), object)
3041 class Int(int): __slots__ = []
3042 cant(2, Int)
3043 cant(Int(), int)
3044 cant(True, int)
3045 cant(2, bool)
3046 o = object()
3047 cant(o, type(1))
3048 cant(o, type(None))
3049 del o
3050 class G(object):
3051 __slots__ = ["a", "b"]
3052 class H(object):
3053 __slots__ = ["b", "a"]
3054 try:
3055 unicode
3056 except NameError:
3057 class I(object):
3058 __slots__ = ["a", "b"]
3059 else:
3060 class I(object):
3061 __slots__ = [unicode("a"), unicode("b")]
3062 class J(object):
3063 __slots__ = ["c", "b"]
3064 class K(object):
3065 __slots__ = ["a", "b", "d"]
3066 class L(H):
3067 __slots__ = ["e"]
3068 class M(I):
3069 __slots__ = ["e"]
3070 class N(J):
3071 __slots__ = ["__weakref__"]
3072 class P(J):
3073 __slots__ = ["__dict__"]
3074 class Q(J):
3075 pass
3076 class R(J):
3077 __slots__ = ["__dict__", "__weakref__"]
3078
3079 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
3080 x = cls()
3081 x.a = 1
3082 x.__class__ = cls2
3083 self.assert_(x.__class__ is cls2,
3084 "assigning %r as __class__ for %r silently failed" % (cls2, x))
3085 self.assertEqual(x.a, 1)
3086 x.__class__ = cls
3087 self.assert_(x.__class__ is cls,
3088 "assigning %r as __class__ for %r silently failed" % (cls, x))
3089 self.assertEqual(x.a, 1)
3090 for cls in G, J, K, L, M, N, P, R, list, Int:
3091 for cls2 in G, J, K, L, M, N, P, R, list, Int:
3092 if cls is cls2:
3093 continue
3094 cant(cls(), cls2)
3095
Benjamin Peterson5083dc52009-04-25 00:41:22 +00003096 # Issue5283: when __class__ changes in __del__, the wrong
3097 # type gets DECREF'd.
3098 class O(object):
3099 pass
3100 class A(object):
3101 def __del__(self):
3102 self.__class__ = O
3103 l = [A() for x in range(100)]
3104 del l
3105
Georg Brandl48545522008-02-02 10:12:36 +00003106 def test_set_dict(self):
3107 # Testing __dict__ assignment...
3108 class C(object): pass
3109 a = C()
3110 a.__dict__ = {'b': 1}
3111 self.assertEqual(a.b, 1)
3112 def cant(x, dict):
3113 try:
3114 x.__dict__ = dict
3115 except (AttributeError, TypeError):
3116 pass
3117 else:
3118 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
3119 cant(a, None)
3120 cant(a, [])
3121 cant(a, 1)
3122 del a.__dict__ # Deleting __dict__ is allowed
3123
3124 class Base(object):
3125 pass
3126 def verify_dict_readonly(x):
3127 """
3128 x has to be an instance of a class inheriting from Base.
3129 """
3130 cant(x, {})
3131 try:
3132 del x.__dict__
3133 except (AttributeError, TypeError):
3134 pass
3135 else:
3136 self.fail("shouldn't allow del %r.__dict__" % x)
3137 dict_descr = Base.__dict__["__dict__"]
3138 try:
3139 dict_descr.__set__(x, {})
3140 except (AttributeError, TypeError):
3141 pass
3142 else:
3143 self.fail("dict_descr allowed access to %r's dict" % x)
3144
3145 # Classes don't allow __dict__ assignment and have readonly dicts
3146 class Meta1(type, Base):
3147 pass
3148 class Meta2(Base, type):
3149 pass
3150 class D(object):
3151 __metaclass__ = Meta1
3152 class E(object):
3153 __metaclass__ = Meta2
3154 for cls in C, D, E:
3155 verify_dict_readonly(cls)
3156 class_dict = cls.__dict__
3157 try:
3158 class_dict["spam"] = "eggs"
3159 except TypeError:
3160 pass
3161 else:
3162 self.fail("%r's __dict__ can be modified" % cls)
3163
3164 # Modules also disallow __dict__ assignment
3165 class Module1(types.ModuleType, Base):
3166 pass
3167 class Module2(Base, types.ModuleType):
3168 pass
3169 for ModuleType in Module1, Module2:
3170 mod = ModuleType("spam")
3171 verify_dict_readonly(mod)
3172 mod.__dict__["spam"] = "eggs"
3173
3174 # Exception's __dict__ can be replaced, but not deleted
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003175 # (at least not any more than regular exception's __dict__ can
3176 # be deleted; on CPython it is not the case, whereas on PyPy they
3177 # can, just like any other new-style instance's __dict__.)
3178 def can_delete_dict(e):
3179 try:
3180 del e.__dict__
3181 except (TypeError, AttributeError):
3182 return False
3183 else:
3184 return True
Georg Brandl48545522008-02-02 10:12:36 +00003185 class Exception1(Exception, Base):
3186 pass
3187 class Exception2(Base, Exception):
3188 pass
3189 for ExceptionType in Exception, Exception1, Exception2:
3190 e = ExceptionType()
3191 e.__dict__ = {"a": 1}
3192 self.assertEqual(e.a, 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003193 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl48545522008-02-02 10:12:36 +00003194
3195 def test_pickles(self):
3196 # Testing pickling and copying new-style classes and objects...
3197 import pickle, cPickle
3198
3199 def sorteditems(d):
3200 L = d.items()
3201 L.sort()
3202 return L
3203
3204 global C
3205 class C(object):
3206 def __init__(self, a, b):
3207 super(C, self).__init__()
3208 self.a = a
3209 self.b = b
3210 def __repr__(self):
3211 return "C(%r, %r)" % (self.a, self.b)
3212
3213 global C1
3214 class C1(list):
3215 def __new__(cls, a, b):
3216 return super(C1, cls).__new__(cls)
3217 def __getnewargs__(self):
3218 return (self.a, self.b)
3219 def __init__(self, a, b):
3220 self.a = a
3221 self.b = b
3222 def __repr__(self):
3223 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3224
3225 global C2
3226 class C2(int):
3227 def __new__(cls, a, b, val=0):
3228 return super(C2, cls).__new__(cls, val)
3229 def __getnewargs__(self):
3230 return (self.a, self.b, int(self))
3231 def __init__(self, a, b, val=0):
3232 self.a = a
3233 self.b = b
3234 def __repr__(self):
3235 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3236
3237 global C3
3238 class C3(object):
3239 def __init__(self, foo):
3240 self.foo = foo
3241 def __getstate__(self):
3242 return self.foo
3243 def __setstate__(self, foo):
3244 self.foo = foo
3245
3246 global C4classic, C4
3247 class C4classic: # classic
3248 pass
3249 class C4(C4classic, object): # mixed inheritance
3250 pass
3251
3252 for p in pickle, cPickle:
3253 for bin in 0, 1:
3254 for cls in C, C1, C2:
3255 s = p.dumps(cls, bin)
3256 cls2 = p.loads(s)
3257 self.assert_(cls2 is cls)
3258
3259 a = C1(1, 2); a.append(42); a.append(24)
3260 b = C2("hello", "world", 42)
3261 s = p.dumps((a, b), bin)
3262 x, y = p.loads(s)
3263 self.assertEqual(x.__class__, a.__class__)
3264 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3265 self.assertEqual(y.__class__, b.__class__)
3266 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3267 self.assertEqual(repr(x), repr(a))
3268 self.assertEqual(repr(y), repr(b))
3269 # Test for __getstate__ and __setstate__ on new style class
3270 u = C3(42)
3271 s = p.dumps(u, bin)
3272 v = p.loads(s)
3273 self.assertEqual(u.__class__, v.__class__)
3274 self.assertEqual(u.foo, v.foo)
3275 # Test for picklability of hybrid class
3276 u = C4()
3277 u.foo = 42
3278 s = p.dumps(u, bin)
3279 v = p.loads(s)
3280 self.assertEqual(u.__class__, v.__class__)
3281 self.assertEqual(u.foo, v.foo)
3282
3283 # Testing copy.deepcopy()
3284 import copy
3285 for cls in C, C1, C2:
3286 cls2 = copy.deepcopy(cls)
3287 self.assert_(cls2 is cls)
3288
3289 a = C1(1, 2); a.append(42); a.append(24)
3290 b = C2("hello", "world", 42)
3291 x, y = copy.deepcopy((a, b))
3292 self.assertEqual(x.__class__, a.__class__)
3293 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3294 self.assertEqual(y.__class__, b.__class__)
3295 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3296 self.assertEqual(repr(x), repr(a))
3297 self.assertEqual(repr(y), repr(b))
3298
3299 def test_pickle_slots(self):
3300 # Testing pickling of classes with __slots__ ...
3301 import pickle, cPickle
3302 # Pickling of classes with __slots__ but without __getstate__ should fail
3303 global B, C, D, E
3304 class B(object):
3305 pass
3306 for base in [object, B]:
3307 class C(base):
3308 __slots__ = ['a']
3309 class D(C):
3310 pass
3311 try:
3312 pickle.dumps(C())
3313 except TypeError:
3314 pass
3315 else:
3316 self.fail("should fail: pickle C instance - %s" % base)
3317 try:
3318 cPickle.dumps(C())
3319 except TypeError:
3320 pass
3321 else:
3322 self.fail("should fail: cPickle C instance - %s" % base)
3323 try:
3324 pickle.dumps(C())
3325 except TypeError:
3326 pass
3327 else:
3328 self.fail("should fail: pickle D instance - %s" % base)
3329 try:
3330 cPickle.dumps(D())
3331 except TypeError:
3332 pass
3333 else:
3334 self.fail("should fail: cPickle D instance - %s" % base)
3335 # Give C a nice generic __getstate__ and __setstate__
3336 class C(base):
3337 __slots__ = ['a']
3338 def __getstate__(self):
3339 try:
3340 d = self.__dict__.copy()
3341 except AttributeError:
3342 d = {}
3343 for cls in self.__class__.__mro__:
3344 for sn in cls.__dict__.get('__slots__', ()):
3345 try:
3346 d[sn] = getattr(self, sn)
3347 except AttributeError:
3348 pass
3349 return d
3350 def __setstate__(self, d):
3351 for k, v in d.items():
3352 setattr(self, k, v)
3353 class D(C):
3354 pass
3355 # Now it should work
3356 x = C()
3357 y = pickle.loads(pickle.dumps(x))
3358 self.assertEqual(hasattr(y, 'a'), 0)
3359 y = cPickle.loads(cPickle.dumps(x))
3360 self.assertEqual(hasattr(y, 'a'), 0)
3361 x.a = 42
3362 y = pickle.loads(pickle.dumps(x))
3363 self.assertEqual(y.a, 42)
3364 y = cPickle.loads(cPickle.dumps(x))
3365 self.assertEqual(y.a, 42)
3366 x = D()
3367 x.a = 42
3368 x.b = 100
3369 y = pickle.loads(pickle.dumps(x))
3370 self.assertEqual(y.a + y.b, 142)
3371 y = cPickle.loads(cPickle.dumps(x))
3372 self.assertEqual(y.a + y.b, 142)
3373 # A subclass that adds a slot should also work
3374 class E(C):
3375 __slots__ = ['b']
3376 x = E()
3377 x.a = 42
3378 x.b = "foo"
3379 y = pickle.loads(pickle.dumps(x))
3380 self.assertEqual(y.a, x.a)
3381 self.assertEqual(y.b, x.b)
3382 y = cPickle.loads(cPickle.dumps(x))
3383 self.assertEqual(y.a, x.a)
3384 self.assertEqual(y.b, x.b)
3385
3386 def test_binary_operator_override(self):
3387 # Testing overrides of binary operations...
3388 class I(int):
3389 def __repr__(self):
3390 return "I(%r)" % int(self)
3391 def __add__(self, other):
3392 return I(int(self) + int(other))
3393 __radd__ = __add__
3394 def __pow__(self, other, mod=None):
3395 if mod is None:
3396 return I(pow(int(self), int(other)))
3397 else:
3398 return I(pow(int(self), int(other), int(mod)))
3399 def __rpow__(self, other, mod=None):
3400 if mod is None:
3401 return I(pow(int(other), int(self), mod))
3402 else:
3403 return I(pow(int(other), int(self), int(mod)))
3404
3405 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3406 self.assertEqual(repr(I(1) + 2), "I(3)")
3407 self.assertEqual(repr(1 + I(2)), "I(3)")
3408 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3409 self.assertEqual(repr(2 ** I(3)), "I(8)")
3410 self.assertEqual(repr(I(2) ** 3), "I(8)")
3411 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3412 class S(str):
3413 def __eq__(self, other):
3414 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003415 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003416
3417 def test_subclass_propagation(self):
3418 # Testing propagation of slot functions to subclasses...
3419 class A(object):
3420 pass
3421 class B(A):
3422 pass
3423 class C(A):
3424 pass
3425 class D(B, C):
3426 pass
3427 d = D()
3428 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3429 A.__hash__ = lambda self: 42
3430 self.assertEqual(hash(d), 42)
3431 C.__hash__ = lambda self: 314
3432 self.assertEqual(hash(d), 314)
3433 B.__hash__ = lambda self: 144
3434 self.assertEqual(hash(d), 144)
3435 D.__hash__ = lambda self: 100
3436 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003437 D.__hash__ = None
3438 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003439 del D.__hash__
3440 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003441 B.__hash__ = None
3442 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003443 del B.__hash__
3444 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003445 C.__hash__ = None
3446 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003447 del C.__hash__
3448 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003449 A.__hash__ = None
3450 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003451 del A.__hash__
3452 self.assertEqual(hash(d), orig_hash)
3453 d.foo = 42
3454 d.bar = 42
3455 self.assertEqual(d.foo, 42)
3456 self.assertEqual(d.bar, 42)
3457 def __getattribute__(self, name):
3458 if name == "foo":
3459 return 24
3460 return object.__getattribute__(self, name)
3461 A.__getattribute__ = __getattribute__
3462 self.assertEqual(d.foo, 24)
3463 self.assertEqual(d.bar, 42)
3464 def __getattr__(self, name):
3465 if name in ("spam", "foo", "bar"):
3466 return "hello"
3467 raise AttributeError, name
3468 B.__getattr__ = __getattr__
3469 self.assertEqual(d.spam, "hello")
3470 self.assertEqual(d.foo, 24)
3471 self.assertEqual(d.bar, 42)
3472 del A.__getattribute__
3473 self.assertEqual(d.foo, 42)
3474 del d.foo
3475 self.assertEqual(d.foo, "hello")
3476 self.assertEqual(d.bar, 42)
3477 del B.__getattr__
3478 try:
3479 d.foo
3480 except AttributeError:
3481 pass
3482 else:
3483 self.fail("d.foo should be undefined now")
3484
3485 # Test a nasty bug in recurse_down_subclasses()
3486 import gc
3487 class A(object):
3488 pass
3489 class B(A):
3490 pass
3491 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003492 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003493 A.__setitem__ = lambda *a: None # crash
3494
3495 def test_buffer_inheritance(self):
3496 # Testing that buffer interface is inherited ...
3497
3498 import binascii
3499 # SF bug [#470040] ParseTuple t# vs subclasses.
3500
3501 class MyStr(str):
3502 pass
3503 base = 'abc'
3504 m = MyStr(base)
3505 # b2a_hex uses the buffer interface to get its argument's value, via
3506 # PyArg_ParseTuple 't#' code.
3507 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3508
3509 # It's not clear that unicode will continue to support the character
3510 # buffer interface, and this test will fail if that's taken away.
3511 class MyUni(unicode):
3512 pass
3513 base = u'abc'
3514 m = MyUni(base)
3515 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3516
3517 class MyInt(int):
3518 pass
3519 m = MyInt(42)
3520 try:
3521 binascii.b2a_hex(m)
3522 self.fail('subclass of int should not have a buffer interface')
3523 except TypeError:
3524 pass
3525
3526 def test_str_of_str_subclass(self):
3527 # Testing __str__ defined in subclass of str ...
3528 import binascii
3529 import cStringIO
3530
3531 class octetstring(str):
3532 def __str__(self):
3533 return binascii.b2a_hex(self)
3534 def __repr__(self):
3535 return self + " repr"
3536
3537 o = octetstring('A')
3538 self.assertEqual(type(o), octetstring)
3539 self.assertEqual(type(str(o)), str)
3540 self.assertEqual(type(repr(o)), str)
3541 self.assertEqual(ord(o), 0x41)
3542 self.assertEqual(str(o), '41')
3543 self.assertEqual(repr(o), 'A repr')
3544 self.assertEqual(o.__str__(), '41')
3545 self.assertEqual(o.__repr__(), 'A repr')
3546
3547 capture = cStringIO.StringIO()
3548 # Calling str() or not exercises different internal paths.
3549 print >> capture, o
3550 print >> capture, str(o)
3551 self.assertEqual(capture.getvalue(), '41\n41\n')
3552 capture.close()
3553
3554 def test_keyword_arguments(self):
3555 # Testing keyword arguments to __init__, __call__...
3556 def f(a): return a
3557 self.assertEqual(f.__call__(a=42), 42)
3558 a = []
3559 list.__init__(a, sequence=[0, 1, 2])
3560 self.assertEqual(a, [0, 1, 2])
3561
3562 def test_recursive_call(self):
3563 # Testing recursive __call__() by setting to instance of class...
3564 class A(object):
3565 pass
3566
3567 A.__call__ = A()
3568 try:
3569 A()()
3570 except RuntimeError:
3571 pass
3572 else:
3573 self.fail("Recursion limit should have been reached for __call__()")
3574
3575 def test_delete_hook(self):
3576 # Testing __del__ hook...
3577 log = []
3578 class C(object):
3579 def __del__(self):
3580 log.append(1)
3581 c = C()
3582 self.assertEqual(log, [])
3583 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003584 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003585 self.assertEqual(log, [1])
3586
3587 class D(object): pass
3588 d = D()
3589 try: del d[0]
3590 except TypeError: pass
3591 else: self.fail("invalid del() didn't raise TypeError")
3592
3593 def test_hash_inheritance(self):
3594 # Testing hash of mutable subclasses...
3595
3596 class mydict(dict):
3597 pass
3598 d = mydict()
3599 try:
3600 hash(d)
3601 except TypeError:
3602 pass
3603 else:
3604 self.fail("hash() of dict subclass should fail")
3605
3606 class mylist(list):
3607 pass
3608 d = mylist()
3609 try:
3610 hash(d)
3611 except TypeError:
3612 pass
3613 else:
3614 self.fail("hash() of list subclass should fail")
3615
3616 def test_str_operations(self):
3617 try: 'a' + 5
3618 except TypeError: pass
3619 else: self.fail("'' + 5 doesn't raise TypeError")
3620
3621 try: ''.split('')
3622 except ValueError: pass
3623 else: self.fail("''.split('') doesn't raise ValueError")
3624
3625 try: ''.join([0])
3626 except TypeError: pass
3627 else: self.fail("''.join([0]) doesn't raise TypeError")
3628
3629 try: ''.rindex('5')
3630 except ValueError: pass
3631 else: self.fail("''.rindex('5') doesn't raise ValueError")
3632
3633 try: '%(n)s' % None
3634 except TypeError: pass
3635 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3636
3637 try: '%(n' % {}
3638 except ValueError: pass
3639 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3640
3641 try: '%*s' % ('abc')
3642 except TypeError: pass
3643 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3644
3645 try: '%*.*s' % ('abc', 5)
3646 except TypeError: pass
3647 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3648
3649 try: '%s' % (1, 2)
3650 except TypeError: pass
3651 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3652
3653 try: '%' % None
3654 except ValueError: pass
3655 else: self.fail("'%' % None doesn't raise ValueError")
3656
3657 self.assertEqual('534253'.isdigit(), 1)
3658 self.assertEqual('534253x'.isdigit(), 0)
3659 self.assertEqual('%c' % 5, '\x05')
3660 self.assertEqual('%c' % '5', '5')
3661
3662 def test_deepcopy_recursive(self):
3663 # Testing deepcopy of recursive objects...
3664 class Node:
3665 pass
3666 a = Node()
3667 b = Node()
3668 a.b = b
3669 b.a = a
3670 z = deepcopy(a) # This blew up before
3671
3672 def test_unintialized_modules(self):
3673 # Testing uninitialized module objects...
3674 from types import ModuleType as M
3675 m = M.__new__(M)
3676 str(m)
3677 self.assertEqual(hasattr(m, "__name__"), 0)
3678 self.assertEqual(hasattr(m, "__file__"), 0)
3679 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003680 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003681 m.foo = 1
3682 self.assertEqual(m.__dict__, {"foo": 1})
3683
3684 def test_funny_new(self):
3685 # Testing __new__ returning something unexpected...
3686 class C(object):
3687 def __new__(cls, arg):
3688 if isinstance(arg, str): return [1, 2, 3]
3689 elif isinstance(arg, int): return object.__new__(D)
3690 else: return object.__new__(cls)
3691 class D(C):
3692 def __init__(self, arg):
3693 self.foo = arg
3694 self.assertEqual(C("1"), [1, 2, 3])
3695 self.assertEqual(D("1"), [1, 2, 3])
3696 d = D(None)
3697 self.assertEqual(d.foo, None)
3698 d = C(1)
3699 self.assertEqual(isinstance(d, D), True)
3700 self.assertEqual(d.foo, 1)
3701 d = D(1)
3702 self.assertEqual(isinstance(d, D), True)
3703 self.assertEqual(d.foo, 1)
3704
3705 def test_imul_bug(self):
3706 # Testing for __imul__ problems...
3707 # SF bug 544647
3708 class C(object):
3709 def __imul__(self, other):
3710 return (self, other)
3711 x = C()
3712 y = x
3713 y *= 1.0
3714 self.assertEqual(y, (x, 1.0))
3715 y = x
3716 y *= 2
3717 self.assertEqual(y, (x, 2))
3718 y = x
3719 y *= 3L
3720 self.assertEqual(y, (x, 3L))
3721 y = x
3722 y *= 1L<<100
3723 self.assertEqual(y, (x, 1L<<100))
3724 y = x
3725 y *= None
3726 self.assertEqual(y, (x, None))
3727 y = x
3728 y *= "foo"
3729 self.assertEqual(y, (x, "foo"))
3730
3731 def test_copy_setstate(self):
3732 # Testing that copy.*copy() correctly uses __setstate__...
3733 import copy
3734 class C(object):
3735 def __init__(self, foo=None):
3736 self.foo = foo
3737 self.__foo = foo
3738 def setfoo(self, foo=None):
3739 self.foo = foo
3740 def getfoo(self):
3741 return self.__foo
3742 def __getstate__(self):
3743 return [self.foo]
3744 def __setstate__(self_, lst):
3745 self.assertEqual(len(lst), 1)
3746 self_.__foo = self_.foo = lst[0]
3747 a = C(42)
3748 a.setfoo(24)
3749 self.assertEqual(a.foo, 24)
3750 self.assertEqual(a.getfoo(), 42)
3751 b = copy.copy(a)
3752 self.assertEqual(b.foo, 24)
3753 self.assertEqual(b.getfoo(), 24)
3754 b = copy.deepcopy(a)
3755 self.assertEqual(b.foo, 24)
3756 self.assertEqual(b.getfoo(), 24)
3757
3758 def test_slices(self):
3759 # Testing cases with slices and overridden __getitem__ ...
3760
3761 # Strings
3762 self.assertEqual("hello"[:4], "hell")
3763 self.assertEqual("hello"[slice(4)], "hell")
3764 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3765 class S(str):
3766 def __getitem__(self, x):
3767 return str.__getitem__(self, x)
3768 self.assertEqual(S("hello")[:4], "hell")
3769 self.assertEqual(S("hello")[slice(4)], "hell")
3770 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3771 # Tuples
3772 self.assertEqual((1,2,3)[:2], (1,2))
3773 self.assertEqual((1,2,3)[slice(2)], (1,2))
3774 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3775 class T(tuple):
3776 def __getitem__(self, x):
3777 return tuple.__getitem__(self, x)
3778 self.assertEqual(T((1,2,3))[:2], (1,2))
3779 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3780 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3781 # Lists
3782 self.assertEqual([1,2,3][:2], [1,2])
3783 self.assertEqual([1,2,3][slice(2)], [1,2])
3784 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3785 class L(list):
3786 def __getitem__(self, x):
3787 return list.__getitem__(self, x)
3788 self.assertEqual(L([1,2,3])[:2], [1,2])
3789 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3790 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3791 # Now do lists and __setitem__
3792 a = L([1,2,3])
3793 a[slice(1, 3)] = [3,2]
3794 self.assertEqual(a, [1,3,2])
3795 a[slice(0, 2, 1)] = [3,1]
3796 self.assertEqual(a, [3,1,2])
3797 a.__setitem__(slice(1, 3), [2,1])
3798 self.assertEqual(a, [3,2,1])
3799 a.__setitem__(slice(0, 2, 1), [2,3])
3800 self.assertEqual(a, [2,3,1])
3801
3802 def test_subtype_resurrection(self):
3803 # Testing resurrection of new-style instance...
3804
3805 class C(object):
3806 container = []
3807
3808 def __del__(self):
3809 # resurrect the instance
3810 C.container.append(self)
3811
3812 c = C()
3813 c.attr = 42
3814
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003815 # The most interesting thing here is whether this blows up, due to
3816 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3817 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003818 del c
3819
3820 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003821 # the last container slot works: that will attempt to delete c again,
3822 # which will cause c to get appended back to the container again
3823 # "during" the del. (On non-CPython implementations, however, __del__
3824 # is typically not called again.)
3825 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003826 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003827 del C.container[-1]
3828 if test_support.check_impl_detail():
3829 test_support.gc_collect()
3830 self.assertEqual(len(C.container), 1)
3831 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003832
3833 # Make c mortal again, so that the test framework with -l doesn't report
3834 # it as a leak.
3835 del C.__del__
3836
3837 def test_slots_trash(self):
3838 # Testing slot trash...
3839 # Deallocating deeply nested slotted trash caused stack overflows
3840 class trash(object):
3841 __slots__ = ['x']
3842 def __init__(self, x):
3843 self.x = x
3844 o = None
3845 for i in xrange(50000):
3846 o = trash(o)
3847 del o
3848
3849 def test_slots_multiple_inheritance(self):
3850 # SF bug 575229, multiple inheritance w/ slots dumps core
3851 class A(object):
3852 __slots__=()
3853 class B(object):
3854 pass
3855 class C(A,B) :
3856 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003857 if test_support.check_impl_detail():
3858 self.assertEqual(C.__basicsize__, B.__basicsize__)
Georg Brandl48545522008-02-02 10:12:36 +00003859 self.assert_(hasattr(C, '__dict__'))
3860 self.assert_(hasattr(C, '__weakref__'))
3861 C().x = 2
3862
3863 def test_rmul(self):
3864 # Testing correct invocation of __rmul__...
3865 # SF patch 592646
3866 class C(object):
3867 def __mul__(self, other):
3868 return "mul"
3869 def __rmul__(self, other):
3870 return "rmul"
3871 a = C()
3872 self.assertEqual(a*2, "mul")
3873 self.assertEqual(a*2.2, "mul")
3874 self.assertEqual(2*a, "rmul")
3875 self.assertEqual(2.2*a, "rmul")
3876
3877 def test_ipow(self):
3878 # Testing correct invocation of __ipow__...
3879 # [SF bug 620179]
3880 class C(object):
3881 def __ipow__(self, other):
3882 pass
3883 a = C()
3884 a **= 2
3885
3886 def test_mutable_bases(self):
3887 # Testing mutable bases...
3888
3889 # stuff that should work:
3890 class C(object):
3891 pass
3892 class C2(object):
3893 def __getattribute__(self, attr):
3894 if attr == 'a':
3895 return 2
3896 else:
3897 return super(C2, self).__getattribute__(attr)
3898 def meth(self):
3899 return 1
3900 class D(C):
3901 pass
3902 class E(D):
3903 pass
3904 d = D()
3905 e = E()
3906 D.__bases__ = (C,)
3907 D.__bases__ = (C2,)
3908 self.assertEqual(d.meth(), 1)
3909 self.assertEqual(e.meth(), 1)
3910 self.assertEqual(d.a, 2)
3911 self.assertEqual(e.a, 2)
3912 self.assertEqual(C2.__subclasses__(), [D])
3913
Georg Brandl48545522008-02-02 10:12:36 +00003914 try:
3915 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003916 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003917 pass
3918 else:
3919 self.fail("shouldn't be able to delete .__bases__")
3920
3921 try:
3922 D.__bases__ = ()
3923 except TypeError, msg:
3924 if str(msg) == "a new-style class can't have only classic bases":
3925 self.fail("wrong error message for .__bases__ = ()")
3926 else:
3927 self.fail("shouldn't be able to set .__bases__ to ()")
3928
3929 try:
3930 D.__bases__ = (D,)
3931 except TypeError:
3932 pass
3933 else:
3934 # actually, we'll have crashed by here...
3935 self.fail("shouldn't be able to create inheritance cycles")
3936
3937 try:
3938 D.__bases__ = (C, C)
3939 except TypeError:
3940 pass
3941 else:
3942 self.fail("didn't detect repeated base classes")
3943
3944 try:
3945 D.__bases__ = (E,)
3946 except TypeError:
3947 pass
3948 else:
3949 self.fail("shouldn't be able to create inheritance cycles")
3950
3951 # let's throw a classic class into the mix:
3952 class Classic:
3953 def meth2(self):
3954 return 3
3955
3956 D.__bases__ = (C, Classic)
3957
3958 self.assertEqual(d.meth2(), 3)
3959 self.assertEqual(e.meth2(), 3)
3960 try:
3961 d.a
3962 except AttributeError:
3963 pass
3964 else:
3965 self.fail("attribute should have vanished")
3966
3967 try:
3968 D.__bases__ = (Classic,)
3969 except TypeError:
3970 pass
3971 else:
3972 self.fail("new-style class must have a new-style base")
3973
Benjamin Petersond4d400c2009-04-18 20:12:47 +00003974 def test_builtin_bases(self):
3975 # Make sure all the builtin types can have their base queried without
3976 # segfaulting. See issue #5787.
3977 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
3978 if isinstance(tp, type)]
3979 for tp in builtin_types:
3980 object.__getattribute__(tp, "__bases__")
3981 if tp is not object:
3982 self.assertEqual(len(tp.__bases__), 1, tp)
3983
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00003984 class L(list):
3985 pass
3986
3987 class C(object):
3988 pass
3989
3990 class D(C):
3991 pass
3992
3993 try:
3994 L.__bases__ = (dict,)
3995 except TypeError:
3996 pass
3997 else:
3998 self.fail("shouldn't turn list subclass into dict subclass")
3999
4000 try:
4001 list.__bases__ = (dict,)
4002 except TypeError:
4003 pass
4004 else:
4005 self.fail("shouldn't be able to assign to list.__bases__")
4006
4007 try:
4008 D.__bases__ = (C, list)
4009 except TypeError:
4010 pass
4011 else:
4012 assert 0, "best_base calculation found wanting"
4013
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004014
Georg Brandl48545522008-02-02 10:12:36 +00004015 def test_mutable_bases_with_failing_mro(self):
4016 # Testing mutable bases with failing mro...
4017 class WorkOnce(type):
4018 def __new__(self, name, bases, ns):
4019 self.flag = 0
4020 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
4021 def mro(self):
4022 if self.flag > 0:
4023 raise RuntimeError, "bozo"
4024 else:
4025 self.flag += 1
4026 return type.mro(self)
4027
4028 class WorkAlways(type):
4029 def mro(self):
4030 # this is here to make sure that .mro()s aren't called
4031 # with an exception set (which was possible at one point).
4032 # An error message will be printed in a debug build.
4033 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004034 return type.mro(self)
4035
Georg Brandl48545522008-02-02 10:12:36 +00004036 class C(object):
4037 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004038
Georg Brandl48545522008-02-02 10:12:36 +00004039 class C2(object):
4040 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004041
Georg Brandl48545522008-02-02 10:12:36 +00004042 class D(C):
4043 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004044
Georg Brandl48545522008-02-02 10:12:36 +00004045 class E(D):
4046 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004047
Georg Brandl48545522008-02-02 10:12:36 +00004048 class F(D):
4049 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004050
Georg Brandl48545522008-02-02 10:12:36 +00004051 class G(D):
4052 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004053
Georg Brandl48545522008-02-02 10:12:36 +00004054 # Immediate subclasses have their mro's adjusted in alphabetical
4055 # order, so E's will get adjusted before adjusting F's fails. We
4056 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004057
Georg Brandl48545522008-02-02 10:12:36 +00004058 E_mro_before = E.__mro__
4059 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004060
Armin Rigofd163f92005-12-29 15:59:19 +00004061 try:
Georg Brandl48545522008-02-02 10:12:36 +00004062 D.__bases__ = (C2,)
4063 except RuntimeError:
4064 self.assertEqual(E.__mro__, E_mro_before)
4065 self.assertEqual(D.__mro__, D_mro_before)
4066 else:
4067 self.fail("exception not propagated")
4068
4069 def test_mutable_bases_catch_mro_conflict(self):
4070 # Testing mutable bases catch mro conflict...
4071 class A(object):
4072 pass
4073
4074 class B(object):
4075 pass
4076
4077 class C(A, B):
4078 pass
4079
4080 class D(A, B):
4081 pass
4082
4083 class E(C, D):
4084 pass
4085
4086 try:
4087 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004088 except TypeError:
4089 pass
4090 else:
Georg Brandl48545522008-02-02 10:12:36 +00004091 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004092
Georg Brandl48545522008-02-02 10:12:36 +00004093 def test_mutable_names(self):
4094 # Testing mutable names...
4095 class C(object):
4096 pass
4097
4098 # C.__module__ could be 'test_descr' or '__main__'
4099 mod = C.__module__
4100
4101 C.__name__ = 'D'
4102 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4103
4104 C.__name__ = 'D.E'
4105 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4106
4107 def test_subclass_right_op(self):
4108 # Testing correct dispatch of subclass overloading __r<op>__...
4109
4110 # This code tests various cases where right-dispatch of a subclass
4111 # should be preferred over left-dispatch of a base class.
4112
4113 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4114
4115 class B(int):
4116 def __floordiv__(self, other):
4117 return "B.__floordiv__"
4118 def __rfloordiv__(self, other):
4119 return "B.__rfloordiv__"
4120
4121 self.assertEqual(B(1) // 1, "B.__floordiv__")
4122 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4123
4124 # Case 2: subclass of object; this is just the baseline for case 3
4125
4126 class C(object):
4127 def __floordiv__(self, other):
4128 return "C.__floordiv__"
4129 def __rfloordiv__(self, other):
4130 return "C.__rfloordiv__"
4131
4132 self.assertEqual(C() // 1, "C.__floordiv__")
4133 self.assertEqual(1 // C(), "C.__rfloordiv__")
4134
4135 # Case 3: subclass of new-style class; here it gets interesting
4136
4137 class D(C):
4138 def __floordiv__(self, other):
4139 return "D.__floordiv__"
4140 def __rfloordiv__(self, other):
4141 return "D.__rfloordiv__"
4142
4143 self.assertEqual(D() // C(), "D.__floordiv__")
4144 self.assertEqual(C() // D(), "D.__rfloordiv__")
4145
4146 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4147
4148 class E(C):
4149 pass
4150
4151 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4152
4153 self.assertEqual(E() // 1, "C.__floordiv__")
4154 self.assertEqual(1 // E(), "C.__rfloordiv__")
4155 self.assertEqual(E() // C(), "C.__floordiv__")
4156 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4157
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004158 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004159 def test_meth_class_get(self):
4160 # Testing __get__ method of METH_CLASS C methods...
4161 # Full coverage of descrobject.c::classmethod_get()
4162
4163 # Baseline
4164 arg = [1, 2, 3]
4165 res = {1: None, 2: None, 3: None}
4166 self.assertEqual(dict.fromkeys(arg), res)
4167 self.assertEqual({}.fromkeys(arg), res)
4168
4169 # Now get the descriptor
4170 descr = dict.__dict__["fromkeys"]
4171
4172 # More baseline using the descriptor directly
4173 self.assertEqual(descr.__get__(None, dict)(arg), res)
4174 self.assertEqual(descr.__get__({})(arg), res)
4175
4176 # Now check various error cases
4177 try:
4178 descr.__get__(None, None)
4179 except TypeError:
4180 pass
4181 else:
4182 self.fail("shouldn't have allowed descr.__get__(None, None)")
4183 try:
4184 descr.__get__(42)
4185 except TypeError:
4186 pass
4187 else:
4188 self.fail("shouldn't have allowed descr.__get__(42)")
4189 try:
4190 descr.__get__(None, 42)
4191 except TypeError:
4192 pass
4193 else:
4194 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4195 try:
4196 descr.__get__(None, int)
4197 except TypeError:
4198 pass
4199 else:
4200 self.fail("shouldn't have allowed descr.__get__(None, int)")
4201
4202 def test_isinst_isclass(self):
4203 # Testing proxy isinstance() and isclass()...
4204 class Proxy(object):
4205 def __init__(self, obj):
4206 self.__obj = obj
4207 def __getattribute__(self, name):
4208 if name.startswith("_Proxy__"):
4209 return object.__getattribute__(self, name)
4210 else:
4211 return getattr(self.__obj, name)
4212 # Test with a classic class
4213 class C:
4214 pass
4215 a = C()
4216 pa = Proxy(a)
4217 self.assert_(isinstance(a, C)) # Baseline
4218 self.assert_(isinstance(pa, C)) # Test
4219 # Test with a classic subclass
4220 class D(C):
4221 pass
4222 a = D()
4223 pa = Proxy(a)
4224 self.assert_(isinstance(a, C)) # Baseline
4225 self.assert_(isinstance(pa, C)) # Test
4226 # Test with a new-style class
4227 class C(object):
4228 pass
4229 a = C()
4230 pa = Proxy(a)
4231 self.assert_(isinstance(a, C)) # Baseline
4232 self.assert_(isinstance(pa, C)) # Test
4233 # Test with a new-style subclass
4234 class D(C):
4235 pass
4236 a = D()
4237 pa = Proxy(a)
4238 self.assert_(isinstance(a, C)) # Baseline
4239 self.assert_(isinstance(pa, C)) # Test
4240
4241 def test_proxy_super(self):
4242 # Testing super() for a proxy object...
4243 class Proxy(object):
4244 def __init__(self, obj):
4245 self.__obj = obj
4246 def __getattribute__(self, name):
4247 if name.startswith("_Proxy__"):
4248 return object.__getattribute__(self, name)
4249 else:
4250 return getattr(self.__obj, name)
4251
4252 class B(object):
4253 def f(self):
4254 return "B.f"
4255
4256 class C(B):
4257 def f(self):
4258 return super(C, self).f() + "->C.f"
4259
4260 obj = C()
4261 p = Proxy(obj)
4262 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4263
4264 def test_carloverre(self):
4265 # Testing prohibition of Carlo Verre's hack...
4266 try:
4267 object.__setattr__(str, "foo", 42)
4268 except TypeError:
4269 pass
4270 else:
4271 self.fail("Carlo Verre __setattr__ suceeded!")
4272 try:
4273 object.__delattr__(str, "lower")
4274 except TypeError:
4275 pass
4276 else:
4277 self.fail("Carlo Verre __delattr__ succeeded!")
4278
4279 def test_weakref_segfault(self):
4280 # Testing weakref segfault...
4281 # SF 742911
4282 import weakref
4283
4284 class Provoker:
4285 def __init__(self, referrent):
4286 self.ref = weakref.ref(referrent)
4287
4288 def __del__(self):
4289 x = self.ref()
4290
4291 class Oops(object):
4292 pass
4293
4294 o = Oops()
4295 o.whatever = Provoker(o)
4296 del o
4297
4298 def test_wrapper_segfault(self):
4299 # SF 927248: deeply nested wrappers could cause stack overflow
4300 f = lambda:None
4301 for i in xrange(1000000):
4302 f = f.__call__
4303 f = None
4304
4305 def test_file_fault(self):
4306 # Testing sys.stdout is changed in getattr...
4307 import sys
4308 class StdoutGuard:
4309 def __getattr__(self, attr):
4310 sys.stdout = sys.__stdout__
4311 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4312 sys.stdout = StdoutGuard()
4313 try:
4314 print "Oops!"
4315 except RuntimeError:
4316 pass
4317
4318 def test_vicious_descriptor_nonsense(self):
4319 # Testing vicious_descriptor_nonsense...
4320
4321 # A potential segfault spotted by Thomas Wouters in mail to
4322 # python-dev 2003-04-17, turned into an example & fixed by Michael
4323 # Hudson just less than four months later...
4324
4325 class Evil(object):
4326 def __hash__(self):
4327 return hash('attr')
4328 def __eq__(self, other):
4329 del C.attr
4330 return 0
4331
4332 class Descr(object):
4333 def __get__(self, ob, type=None):
4334 return 1
4335
4336 class C(object):
4337 attr = Descr()
4338
4339 c = C()
4340 c.__dict__[Evil()] = 0
4341
4342 self.assertEqual(c.attr, 1)
4343 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004344 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00004345 self.assertEqual(hasattr(c, 'attr'), False)
4346
4347 def test_init(self):
4348 # SF 1155938
4349 class Foo(object):
4350 def __init__(self):
4351 return 10
4352 try:
4353 Foo()
4354 except TypeError:
4355 pass
4356 else:
4357 self.fail("did not test __init__() for None return")
4358
4359 def test_method_wrapper(self):
4360 # Testing method-wrapper objects...
4361 # <type 'method-wrapper'> did not support any reflection before 2.5
4362
4363 l = []
4364 self.assertEqual(l.__add__, l.__add__)
4365 self.assertEqual(l.__add__, [].__add__)
4366 self.assert_(l.__add__ != [5].__add__)
4367 self.assert_(l.__add__ != l.__mul__)
4368 self.assert_(l.__add__.__name__ == '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004369 if hasattr(l.__add__, '__self__'):
4370 # CPython
4371 self.assert_(l.__add__.__self__ is l)
4372 self.assert_(l.__add__.__objclass__ is list)
4373 else:
4374 # Python implementations where [].__add__ is a normal bound method
4375 self.assert_(l.__add__.im_self is l)
4376 self.assert_(l.__add__.im_class is list)
Georg Brandl48545522008-02-02 10:12:36 +00004377 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4378 try:
4379 hash(l.__add__)
4380 except TypeError:
4381 pass
4382 else:
4383 self.fail("no TypeError from hash([].__add__)")
4384
4385 t = ()
4386 t += (7,)
4387 self.assertEqual(t.__add__, (7,).__add__)
4388 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4389
4390 def test_not_implemented(self):
4391 # Testing NotImplemented...
4392 # all binary methods should be able to return a NotImplemented
4393 import sys
4394 import types
4395 import operator
4396
4397 def specialmethod(self, other):
4398 return NotImplemented
4399
4400 def check(expr, x, y):
4401 try:
4402 exec expr in {'x': x, 'y': y, 'operator': operator}
4403 except TypeError:
4404 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004405 else:
Georg Brandl48545522008-02-02 10:12:36 +00004406 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004407
Georg Brandl48545522008-02-02 10:12:36 +00004408 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4409 # TypeErrors
4410 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4411 # ValueErrors instead of TypeErrors
4412 for metaclass in [type, types.ClassType]:
4413 for name, expr, iexpr in [
4414 ('__add__', 'x + y', 'x += y'),
4415 ('__sub__', 'x - y', 'x -= y'),
4416 ('__mul__', 'x * y', 'x *= y'),
4417 ('__truediv__', 'operator.truediv(x, y)', None),
4418 ('__floordiv__', 'operator.floordiv(x, y)', None),
4419 ('__div__', 'x / y', 'x /= y'),
4420 ('__mod__', 'x % y', 'x %= y'),
4421 ('__divmod__', 'divmod(x, y)', None),
4422 ('__pow__', 'x ** y', 'x **= y'),
4423 ('__lshift__', 'x << y', 'x <<= y'),
4424 ('__rshift__', 'x >> y', 'x >>= y'),
4425 ('__and__', 'x & y', 'x &= y'),
4426 ('__or__', 'x | y', 'x |= y'),
4427 ('__xor__', 'x ^ y', 'x ^= y'),
4428 ('__coerce__', 'coerce(x, y)', None)]:
4429 if name == '__coerce__':
4430 rname = name
4431 else:
4432 rname = '__r' + name[2:]
4433 A = metaclass('A', (), {name: specialmethod})
4434 B = metaclass('B', (), {rname: specialmethod})
4435 a = A()
4436 b = B()
4437 check(expr, a, a)
4438 check(expr, a, b)
4439 check(expr, b, a)
4440 check(expr, b, b)
4441 check(expr, a, N1)
4442 check(expr, a, N2)
4443 check(expr, N1, b)
4444 check(expr, N2, b)
4445 if iexpr:
4446 check(iexpr, a, a)
4447 check(iexpr, a, b)
4448 check(iexpr, b, a)
4449 check(iexpr, b, b)
4450 check(iexpr, a, N1)
4451 check(iexpr, a, N2)
4452 iname = '__i' + name[2:]
4453 C = metaclass('C', (), {iname: specialmethod})
4454 c = C()
4455 check(iexpr, c, a)
4456 check(iexpr, c, b)
4457 check(iexpr, c, N1)
4458 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004459
Georg Brandl48545522008-02-02 10:12:36 +00004460 def test_assign_slice(self):
4461 # ceval.c's assign_slice used to check for
4462 # tp->tp_as_sequence->sq_slice instead of
4463 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004464
Georg Brandl48545522008-02-02 10:12:36 +00004465 class C(object):
4466 def __setslice__(self, start, stop, value):
4467 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004468
Georg Brandl48545522008-02-02 10:12:36 +00004469 c = C()
4470 c[1:2] = 3
4471 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004472
Benjamin Peterson273c2332008-11-17 22:39:09 +00004473 def test_getattr_hooks(self):
4474 # issue 4230
4475
4476 class Descriptor(object):
4477 counter = 0
4478 def __get__(self, obj, objtype=None):
4479 def getter(name):
4480 self.counter += 1
4481 raise AttributeError(name)
4482 return getter
4483
4484 descr = Descriptor()
4485 class A(object):
4486 __getattribute__ = descr
4487 class B(object):
4488 __getattr__ = descr
4489 class C(object):
4490 __getattribute__ = descr
4491 __getattr__ = descr
4492
4493 self.assertRaises(AttributeError, getattr, A(), "attr")
4494 self.assertEquals(descr.counter, 1)
4495 self.assertRaises(AttributeError, getattr, B(), "attr")
4496 self.assertEquals(descr.counter, 2)
4497 self.assertRaises(AttributeError, getattr, C(), "attr")
4498 self.assertEquals(descr.counter, 4)
4499
4500 import gc
4501 class EvilGetattribute(object):
4502 # This used to segfault
4503 def __getattr__(self, name):
4504 raise AttributeError(name)
4505 def __getattribute__(self, name):
4506 del EvilGetattribute.__getattr__
4507 for i in range(5):
4508 gc.collect()
4509 raise AttributeError(name)
4510
4511 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4512
Guido van Rossum9acc3872008-01-23 23:23:43 +00004513
Georg Brandl48545522008-02-02 10:12:36 +00004514class DictProxyTests(unittest.TestCase):
4515 def setUp(self):
4516 class C(object):
4517 def meth(self):
4518 pass
4519 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004520
Georg Brandl48545522008-02-02 10:12:36 +00004521 def test_iter_keys(self):
4522 # Testing dict-proxy iterkeys...
4523 keys = [ key for key in self.C.__dict__.iterkeys() ]
4524 keys.sort()
4525 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4526 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004527
Georg Brandl48545522008-02-02 10:12:36 +00004528 def test_iter_values(self):
4529 # Testing dict-proxy itervalues...
4530 values = [ values for values in self.C.__dict__.itervalues() ]
4531 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004532
Georg Brandl48545522008-02-02 10:12:36 +00004533 def test_iter_items(self):
4534 # Testing dict-proxy iteritems...
4535 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4536 keys.sort()
4537 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4538 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004539
Georg Brandl48545522008-02-02 10:12:36 +00004540 def test_dict_type_with_metaclass(self):
4541 # Testing type of __dict__ when __metaclass__ set...
4542 class B(object):
4543 pass
4544 class M(type):
4545 pass
4546 class C:
4547 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4548 __metaclass__ = M
4549 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004550
Guido van Rossum9acc3872008-01-23 23:23:43 +00004551
Georg Brandl48545522008-02-02 10:12:36 +00004552class PTypesLongInitTest(unittest.TestCase):
4553 # This is in its own TestCase so that it can be run before any other tests.
4554 def test_pytype_long_ready(self):
4555 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004556
Georg Brandl48545522008-02-02 10:12:36 +00004557 # This dumps core when SF bug 551412 isn't fixed --
4558 # but only when test_descr.py is run separately.
4559 # (That can't be helped -- as soon as PyType_Ready()
4560 # is called for PyLong_Type, the bug is gone.)
4561 class UserLong(object):
4562 def __pow__(self, *args):
4563 pass
4564 try:
4565 pow(0L, UserLong(), 0L)
4566 except:
4567 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004568
Georg Brandl48545522008-02-02 10:12:36 +00004569 # Another segfault only when run early
4570 # (before PyType_Ready(tuple) is called)
4571 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004572
4573
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004574def test_main():
Georg Brandl48545522008-02-02 10:12:36 +00004575 # Run all local test cases, with PTypesLongInitTest first.
4576 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4577 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004578
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004579if __name__ == "__main__":
4580 test_main()