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