blob: bff88bcb3c8ac98aca254bd251b6625779baffe9 [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")
Tim Peters1fc240e2001-10-26 05:06:50 +0000264 try:
Georg Brandl48545522008-02-02 10:12:36 +0000265 C(sys.maxint+1)
266 except OverflowError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000267 pass
268 else:
Georg Brandl48545522008-02-02 10:12:36 +0000269 self.fail("should have raised OverflowError")
Tim Peters1fc240e2001-10-26 05:06:50 +0000270
Georg Brandl48545522008-02-02 10:12:36 +0000271 def test_longs(self):
272 # Testing long operations...
273 self.number_operators(100L, 3L)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000274
Georg Brandl48545522008-02-02 10:12:36 +0000275 def test_floats(self):
276 # Testing float operations...
277 self.number_operators(100.0, 3.0)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000278
Georg Brandl48545522008-02-02 10:12:36 +0000279 def test_complexes(self):
280 # Testing complex operations...
281 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
282 'int', 'long', 'float'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000283
Georg Brandl48545522008-02-02 10:12:36 +0000284 class Number(complex):
285 __slots__ = ['prec']
286 def __new__(cls, *args, **kwds):
287 result = complex.__new__(cls, *args)
288 result.prec = kwds.get('prec', 12)
289 return result
290 def __repr__(self):
291 prec = self.prec
292 if self.imag == 0.0:
293 return "%.*g" % (prec, self.real)
294 if self.real == 0.0:
295 return "%.*gj" % (prec, self.imag)
296 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
297 __str__ = __repr__
Tim Peters5d2b77c2001-09-03 05:47:38 +0000298
Georg Brandl48545522008-02-02 10:12:36 +0000299 a = Number(3.14, prec=6)
300 self.assertEqual(repr(a), "3.14")
301 self.assertEqual(a.prec, 6)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000302
Georg Brandl48545522008-02-02 10:12:36 +0000303 a = Number(a, prec=2)
304 self.assertEqual(repr(a), "3.1")
305 self.assertEqual(a.prec, 2)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000306
Georg Brandl48545522008-02-02 10:12:36 +0000307 a = Number(234.5)
308 self.assertEqual(repr(a), "234.5")
309 self.assertEqual(a.prec, 12)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000310
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000311 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000312 def test_spam_lists(self):
313 # Testing spamlist operations...
314 import copy, xxsubtype as spam
Tim Peters37a309d2001-09-04 01:20:04 +0000315
Georg Brandl48545522008-02-02 10:12:36 +0000316 def spamlist(l, memo=None):
317 import xxsubtype as spam
318 return spam.spamlist(l)
Tim Peters37a309d2001-09-04 01:20:04 +0000319
Georg Brandl48545522008-02-02 10:12:36 +0000320 # This is an ugly hack:
321 copy._deepcopy_dispatch[spam.spamlist] = spamlist
Tim Peters37a309d2001-09-04 01:20:04 +0000322
Georg Brandl48545522008-02-02 10:12:36 +0000323 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
324 "__add__")
325 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
326 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
327 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
328 self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
329 "__getslice__")
330 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
331 "__iadd__")
332 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
333 "__imul__")
334 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
335 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
336 "__mul__")
337 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
338 "__rmul__")
339 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
340 "__setitem__")
341 self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
342 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
343 # Test subclassing
344 class C(spam.spamlist):
345 def foo(self): return 1
346 a = C()
347 self.assertEqual(a, [])
348 self.assertEqual(a.foo(), 1)
349 a.append(100)
350 self.assertEqual(a, [100])
351 self.assertEqual(a.getstate(), 0)
352 a.setstate(42)
353 self.assertEqual(a.getstate(), 42)
Tim Peters37a309d2001-09-04 01:20:04 +0000354
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000355 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000356 def test_spam_dicts(self):
357 # Testing spamdict operations...
358 import copy, xxsubtype as spam
359 def spamdict(d, memo=None):
360 import xxsubtype as spam
361 sd = spam.spamdict()
362 for k, v in d.items():
363 sd[k] = v
364 return sd
365 # This is an ugly hack:
366 copy._deepcopy_dispatch[spam.spamdict] = spamdict
Tim Peters37a309d2001-09-04 01:20:04 +0000367
Georg Brandl48545522008-02-02 10:12:36 +0000368 self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
369 "__cmp__")
370 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
371 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
372 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
373 d = spamdict({1:2,3:4})
374 l1 = []
375 for i in d.keys():
376 l1.append(i)
377 l = []
378 for i in iter(d):
379 l.append(i)
380 self.assertEqual(l, l1)
381 l = []
382 for i in d.__iter__():
383 l.append(i)
384 self.assertEqual(l, l1)
385 l = []
386 for i in type(spamdict({})).__iter__(d):
387 l.append(i)
388 self.assertEqual(l, l1)
389 straightd = {1:2, 3:4}
390 spamd = spamdict(straightd)
391 self.unop_test(spamd, 2, "len(a)", "__len__")
392 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
393 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
394 "a[b]=c", "__setitem__")
395 # Test subclassing
396 class C(spam.spamdict):
397 def foo(self): return 1
398 a = C()
399 self.assertEqual(a.items(), [])
400 self.assertEqual(a.foo(), 1)
401 a['foo'] = 'bar'
402 self.assertEqual(a.items(), [('foo', 'bar')])
403 self.assertEqual(a.getstate(), 0)
404 a.setstate(100)
405 self.assertEqual(a.getstate(), 100)
Tim Peters37a309d2001-09-04 01:20:04 +0000406
Georg Brandl48545522008-02-02 10:12:36 +0000407class ClassPropertiesAndMethods(unittest.TestCase):
Tim Peters37a309d2001-09-04 01:20:04 +0000408
Georg Brandl48545522008-02-02 10:12:36 +0000409 def test_python_dicts(self):
410 # Testing Python subclass of dict...
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000411 self.assertTrue(issubclass(dict, dict))
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000412 self.assertIsInstance({}, dict)
Georg Brandl48545522008-02-02 10:12:36 +0000413 d = dict()
414 self.assertEqual(d, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000415 self.assertTrue(d.__class__ is dict)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000416 self.assertIsInstance(d, dict)
Georg Brandl48545522008-02-02 10:12:36 +0000417 class C(dict):
418 state = -1
419 def __init__(self_local, *a, **kw):
420 if a:
421 self.assertEqual(len(a), 1)
422 self_local.state = a[0]
423 if kw:
424 for k, v in kw.items():
425 self_local[v] = k
426 def __getitem__(self, key):
427 return self.get(key, 0)
428 def __setitem__(self_local, key, value):
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000429 self.assertIsInstance(key, type(0))
Georg Brandl48545522008-02-02 10:12:36 +0000430 dict.__setitem__(self_local, key, value)
431 def setstate(self, state):
432 self.state = state
433 def getstate(self):
434 return self.state
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000435 self.assertTrue(issubclass(C, dict))
Georg Brandl48545522008-02-02 10:12:36 +0000436 a1 = C(12)
437 self.assertEqual(a1.state, 12)
438 a2 = C(foo=1, bar=2)
439 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
440 a = C()
441 self.assertEqual(a.state, -1)
442 self.assertEqual(a.getstate(), -1)
443 a.setstate(0)
444 self.assertEqual(a.state, 0)
445 self.assertEqual(a.getstate(), 0)
446 a.setstate(10)
447 self.assertEqual(a.state, 10)
448 self.assertEqual(a.getstate(), 10)
449 self.assertEqual(a[42], 0)
450 a[42] = 24
451 self.assertEqual(a[42], 24)
452 N = 50
453 for i in range(N):
454 a[i] = C()
455 for j in range(N):
456 a[i][j] = i*j
457 for i in range(N):
458 for j in range(N):
459 self.assertEqual(a[i][j], i*j)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000460
Georg Brandl48545522008-02-02 10:12:36 +0000461 def test_python_lists(self):
462 # Testing Python subclass of list...
463 class C(list):
464 def __getitem__(self, i):
465 return list.__getitem__(self, i) + 100
466 def __getslice__(self, i, j):
467 return (i, j)
468 a = C()
469 a.extend([0,1,2])
470 self.assertEqual(a[0], 100)
471 self.assertEqual(a[1], 101)
472 self.assertEqual(a[2], 102)
473 self.assertEqual(a[100:200], (100,200))
Tim Peterscaaff8d2001-09-10 23:12:14 +0000474
Georg Brandl48545522008-02-02 10:12:36 +0000475 def test_metaclass(self):
476 # Testing __metaclass__...
477 class C:
Guido van Rossume54616c2001-12-14 04:19:56 +0000478 __metaclass__ = type
Georg Brandl48545522008-02-02 10:12:36 +0000479 def __init__(self):
480 self.__state = 0
481 def getstate(self):
482 return self.__state
483 def setstate(self, state):
484 self.__state = state
485 a = C()
486 self.assertEqual(a.getstate(), 0)
487 a.setstate(10)
488 self.assertEqual(a.getstate(), 10)
489 class D:
490 class __metaclass__(type):
491 def myself(cls): return cls
492 self.assertEqual(D.myself(), D)
493 d = D()
494 self.assertEqual(d.__class__, D)
495 class M1(type):
496 def __new__(cls, name, bases, dict):
497 dict['__spam__'] = 1
498 return type.__new__(cls, name, bases, dict)
499 class C:
500 __metaclass__ = M1
501 self.assertEqual(C.__spam__, 1)
502 c = C()
503 self.assertEqual(c.__spam__, 1)
Guido van Rossume54616c2001-12-14 04:19:56 +0000504
Georg Brandl48545522008-02-02 10:12:36 +0000505 class _instance(object):
506 pass
507 class M2(object):
508 @staticmethod
509 def __new__(cls, name, bases, dict):
510 self = object.__new__(cls)
511 self.name = name
512 self.bases = bases
513 self.dict = dict
514 return self
515 def __call__(self):
516 it = _instance()
517 # Early binding of methods
518 for key in self.dict:
519 if key.startswith("__"):
520 continue
521 setattr(it, key, self.dict[key].__get__(it, self))
522 return it
523 class C:
524 __metaclass__ = M2
525 def spam(self):
526 return 42
527 self.assertEqual(C.name, 'C')
528 self.assertEqual(C.bases, ())
Ezio Melottiaa980582010-01-23 23:04:36 +0000529 self.assertIn('spam', C.dict)
Georg Brandl48545522008-02-02 10:12:36 +0000530 c = C()
531 self.assertEqual(c.spam(), 42)
Guido van Rossum9a818922002-11-14 19:50:14 +0000532
Georg Brandl48545522008-02-02 10:12:36 +0000533 # More metaclass examples
Guido van Rossum9a818922002-11-14 19:50:14 +0000534
Georg Brandl48545522008-02-02 10:12:36 +0000535 class autosuper(type):
536 # Automatically add __super to the class
537 # This trick only works for dynamic classes
538 def __new__(metaclass, name, bases, dict):
539 cls = super(autosuper, metaclass).__new__(metaclass,
540 name, bases, dict)
541 # Name mangling for __super removes leading underscores
542 while name[:1] == "_":
543 name = name[1:]
544 if name:
545 name = "_%s__super" % name
546 else:
547 name = "__super"
548 setattr(cls, name, super(cls))
549 return cls
550 class A:
551 __metaclass__ = autosuper
552 def meth(self):
553 return "A"
554 class B(A):
555 def meth(self):
556 return "B" + self.__super.meth()
557 class C(A):
558 def meth(self):
559 return "C" + self.__super.meth()
560 class D(C, B):
561 def meth(self):
562 return "D" + self.__super.meth()
563 self.assertEqual(D().meth(), "DCBA")
564 class E(B, C):
565 def meth(self):
566 return "E" + self.__super.meth()
567 self.assertEqual(E().meth(), "EBCA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000568
Georg Brandl48545522008-02-02 10:12:36 +0000569 class autoproperty(type):
570 # Automatically create property attributes when methods
571 # named _get_x and/or _set_x are found
572 def __new__(metaclass, name, bases, dict):
573 hits = {}
574 for key, val in dict.iteritems():
575 if key.startswith("_get_"):
576 key = key[5:]
577 get, set = hits.get(key, (None, None))
578 get = val
579 hits[key] = get, set
580 elif key.startswith("_set_"):
581 key = key[5:]
582 get, set = hits.get(key, (None, None))
583 set = val
584 hits[key] = get, set
585 for key, (get, set) in hits.iteritems():
586 dict[key] = property(get, set)
587 return super(autoproperty, metaclass).__new__(metaclass,
588 name, bases, dict)
589 class A:
590 __metaclass__ = autoproperty
591 def _get_x(self):
592 return -self.__x
593 def _set_x(self, x):
594 self.__x = -x
595 a = A()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000596 self.assertTrue(not hasattr(a, "x"))
Georg Brandl48545522008-02-02 10:12:36 +0000597 a.x = 12
598 self.assertEqual(a.x, 12)
599 self.assertEqual(a._A__x, -12)
Guido van Rossum9a818922002-11-14 19:50:14 +0000600
Georg Brandl48545522008-02-02 10:12:36 +0000601 class multimetaclass(autoproperty, autosuper):
602 # Merge of multiple cooperating metaclasses
603 pass
604 class A:
605 __metaclass__ = multimetaclass
606 def _get_x(self):
607 return "A"
608 class B(A):
609 def _get_x(self):
610 return "B" + self.__super._get_x()
611 class C(A):
612 def _get_x(self):
613 return "C" + self.__super._get_x()
614 class D(C, B):
615 def _get_x(self):
616 return "D" + self.__super._get_x()
617 self.assertEqual(D().x, "DCBA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000618
Georg Brandl48545522008-02-02 10:12:36 +0000619 # Make sure type(x) doesn't call x.__class__.__init__
620 class T(type):
621 counter = 0
622 def __init__(self, *args):
623 T.counter += 1
624 class C:
625 __metaclass__ = T
626 self.assertEqual(T.counter, 1)
627 a = C()
628 self.assertEqual(type(a), C)
629 self.assertEqual(T.counter, 1)
Guido van Rossum9a818922002-11-14 19:50:14 +0000630
Georg Brandl48545522008-02-02 10:12:36 +0000631 class C(object): pass
632 c = C()
633 try: c()
634 except TypeError: pass
635 else: self.fail("calling object w/o call method should raise "
636 "TypeError")
Guido van Rossum9a818922002-11-14 19:50:14 +0000637
Georg Brandl48545522008-02-02 10:12:36 +0000638 # Testing code to find most derived baseclass
639 class A(type):
640 def __new__(*args, **kwargs):
641 return type.__new__(*args, **kwargs)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000642
Georg Brandl48545522008-02-02 10:12:36 +0000643 class B(object):
644 pass
645
646 class C(object):
647 __metaclass__ = A
648
649 # The most derived metaclass of D is A rather than type.
650 class D(B, C):
651 pass
652
653 def test_module_subclasses(self):
654 # Testing Python subclass of module...
655 log = []
Georg Brandl48545522008-02-02 10:12:36 +0000656 MT = type(sys)
657 class MM(MT):
658 def __init__(self, name):
659 MT.__init__(self, name)
660 def __getattribute__(self, name):
661 log.append(("getattr", name))
662 return MT.__getattribute__(self, name)
663 def __setattr__(self, name, value):
664 log.append(("setattr", name, value))
665 MT.__setattr__(self, name, value)
666 def __delattr__(self, name):
667 log.append(("delattr", name))
668 MT.__delattr__(self, name)
669 a = MM("a")
670 a.foo = 12
671 x = a.foo
672 del a.foo
673 self.assertEqual(log, [("setattr", "foo", 12),
674 ("getattr", "foo"),
675 ("delattr", "foo")])
676
677 # http://python.org/sf/1174712
678 try:
679 class Module(types.ModuleType, str):
680 pass
681 except TypeError:
682 pass
683 else:
684 self.fail("inheriting from ModuleType and str at the same time "
685 "should fail")
686
687 def test_multiple_inheritence(self):
688 # Testing multiple inheritance...
689 class C(object):
690 def __init__(self):
691 self.__state = 0
692 def getstate(self):
693 return self.__state
694 def setstate(self, state):
695 self.__state = state
696 a = C()
697 self.assertEqual(a.getstate(), 0)
698 a.setstate(10)
699 self.assertEqual(a.getstate(), 10)
700 class D(dict, C):
701 def __init__(self):
702 type({}).__init__(self)
703 C.__init__(self)
704 d = D()
705 self.assertEqual(d.keys(), [])
706 d["hello"] = "world"
707 self.assertEqual(d.items(), [("hello", "world")])
708 self.assertEqual(d["hello"], "world")
709 self.assertEqual(d.getstate(), 0)
710 d.setstate(10)
711 self.assertEqual(d.getstate(), 10)
712 self.assertEqual(D.__mro__, (D, dict, C, object))
713
714 # SF bug #442833
715 class Node(object):
716 def __int__(self):
717 return int(self.foo())
718 def foo(self):
719 return "23"
720 class Frag(Node, list):
721 def foo(self):
722 return "42"
723 self.assertEqual(Node().__int__(), 23)
724 self.assertEqual(int(Node()), 23)
725 self.assertEqual(Frag().__int__(), 42)
726 self.assertEqual(int(Frag()), 42)
727
728 # MI mixing classic and new-style classes.
729
730 class A:
731 x = 1
732
733 class B(A):
734 pass
735
736 class C(A):
737 x = 2
738
739 class D(B, C):
740 pass
741 self.assertEqual(D.x, 1)
742
743 # Classic MRO is preserved for a classic base class.
744 class E(D, object):
745 pass
746 self.assertEqual(E.__mro__, (E, D, B, A, C, object))
747 self.assertEqual(E.x, 1)
748
749 # But with a mix of classic bases, their MROs are combined using
750 # new-style MRO.
751 class F(B, C, object):
752 pass
753 self.assertEqual(F.__mro__, (F, B, C, A, object))
754 self.assertEqual(F.x, 2)
755
756 # Try something else.
757 class C:
758 def cmethod(self):
759 return "C a"
760 def all_method(self):
761 return "C b"
762
763 class M1(C, object):
764 def m1method(self):
765 return "M1 a"
766 def all_method(self):
767 return "M1 b"
768
769 self.assertEqual(M1.__mro__, (M1, C, object))
770 m = M1()
771 self.assertEqual(m.cmethod(), "C a")
772 self.assertEqual(m.m1method(), "M1 a")
773 self.assertEqual(m.all_method(), "M1 b")
774
775 class D(C):
776 def dmethod(self):
777 return "D a"
778 def all_method(self):
779 return "D b"
780
781 class M2(D, object):
782 def m2method(self):
783 return "M2 a"
784 def all_method(self):
785 return "M2 b"
786
787 self.assertEqual(M2.__mro__, (M2, D, C, object))
788 m = M2()
789 self.assertEqual(m.cmethod(), "C a")
790 self.assertEqual(m.dmethod(), "D a")
791 self.assertEqual(m.m2method(), "M2 a")
792 self.assertEqual(m.all_method(), "M2 b")
793
794 class M3(M1, M2, object):
795 def m3method(self):
796 return "M3 a"
797 def all_method(self):
798 return "M3 b"
799 self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
800 m = M3()
801 self.assertEqual(m.cmethod(), "C a")
802 self.assertEqual(m.dmethod(), "D a")
803 self.assertEqual(m.m1method(), "M1 a")
804 self.assertEqual(m.m2method(), "M2 a")
805 self.assertEqual(m.m3method(), "M3 a")
806 self.assertEqual(m.all_method(), "M3 b")
807
808 class Classic:
809 pass
810 try:
811 class New(Classic):
812 __metaclass__ = type
813 except TypeError:
814 pass
815 else:
816 self.fail("new class with only classic bases - shouldn't be")
817
818 def test_diamond_inheritence(self):
819 # Testing multiple inheritance special cases...
820 class A(object):
821 def spam(self): return "A"
822 self.assertEqual(A().spam(), "A")
823 class B(A):
824 def boo(self): return "B"
825 def spam(self): return "B"
826 self.assertEqual(B().spam(), "B")
827 self.assertEqual(B().boo(), "B")
828 class C(A):
829 def boo(self): return "C"
830 self.assertEqual(C().spam(), "A")
831 self.assertEqual(C().boo(), "C")
832 class D(B, C): pass
833 self.assertEqual(D().spam(), "B")
834 self.assertEqual(D().boo(), "B")
835 self.assertEqual(D.__mro__, (D, B, C, A, object))
836 class E(C, B): pass
837 self.assertEqual(E().spam(), "B")
838 self.assertEqual(E().boo(), "C")
839 self.assertEqual(E.__mro__, (E, C, B, A, object))
840 # MRO order disagreement
841 try:
842 class F(D, E): pass
843 except TypeError:
844 pass
845 else:
846 self.fail("expected MRO order disagreement (F)")
847 try:
848 class G(E, D): pass
849 except TypeError:
850 pass
851 else:
852 self.fail("expected MRO order disagreement (G)")
853
854 # see thread python-dev/2002-October/029035.html
855 def test_ex5_from_c3_switch(self):
856 # Testing ex5 from C3 switch discussion...
857 class A(object): pass
858 class B(object): pass
859 class C(object): pass
860 class X(A): pass
861 class Y(A): pass
862 class Z(X,B,Y,C): pass
863 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
864
865 # see "A Monotonic Superclass Linearization for Dylan",
866 # by Kim Barrett et al. (OOPSLA 1996)
867 def test_monotonicity(self):
868 # Testing MRO monotonicity...
869 class Boat(object): pass
870 class DayBoat(Boat): pass
871 class WheelBoat(Boat): pass
872 class EngineLess(DayBoat): pass
873 class SmallMultihull(DayBoat): pass
874 class PedalWheelBoat(EngineLess,WheelBoat): pass
875 class SmallCatamaran(SmallMultihull): pass
876 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
877
878 self.assertEqual(PedalWheelBoat.__mro__,
879 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
880 self.assertEqual(SmallCatamaran.__mro__,
881 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
882 self.assertEqual(Pedalo.__mro__,
883 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
884 SmallMultihull, DayBoat, WheelBoat, Boat, object))
885
886 # see "A Monotonic Superclass Linearization for Dylan",
887 # by Kim Barrett et al. (OOPSLA 1996)
888 def test_consistency_with_epg(self):
889 # Testing consistentcy with EPG...
890 class Pane(object): pass
891 class ScrollingMixin(object): pass
892 class EditingMixin(object): pass
893 class ScrollablePane(Pane,ScrollingMixin): pass
894 class EditablePane(Pane,EditingMixin): pass
895 class EditableScrollablePane(ScrollablePane,EditablePane): pass
896
897 self.assertEqual(EditableScrollablePane.__mro__,
898 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
899 ScrollingMixin, EditingMixin, object))
900
901 def test_mro_disagreement(self):
902 # Testing error messages for MRO disagreement...
903 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000904order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000905
Georg Brandl48545522008-02-02 10:12:36 +0000906 def raises(exc, expected, callable, *args):
907 try:
908 callable(*args)
909 except exc, msg:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000910 # the exact msg is generally considered an impl detail
911 if test_support.check_impl_detail():
912 if not str(msg).startswith(expected):
913 self.fail("Message %r, expected %r" %
914 (str(msg), expected))
Georg Brandl48545522008-02-02 10:12:36 +0000915 else:
916 self.fail("Expected %s" % exc)
917
918 class A(object): pass
919 class B(A): pass
920 class C(object): pass
921
922 # Test some very simple errors
923 raises(TypeError, "duplicate base class A",
924 type, "X", (A, A), {})
925 raises(TypeError, mro_err_msg,
926 type, "X", (A, B), {})
927 raises(TypeError, mro_err_msg,
928 type, "X", (A, C, B), {})
929 # Test a slightly more complex error
930 class GridLayout(object): pass
931 class HorizontalGrid(GridLayout): pass
932 class VerticalGrid(GridLayout): pass
933 class HVGrid(HorizontalGrid, VerticalGrid): pass
934 class VHGrid(VerticalGrid, HorizontalGrid): pass
935 raises(TypeError, mro_err_msg,
936 type, "ConfusedGrid", (HVGrid, VHGrid), {})
937
938 def test_object_class(self):
939 # Testing object class...
940 a = object()
941 self.assertEqual(a.__class__, object)
942 self.assertEqual(type(a), object)
943 b = object()
944 self.assertNotEqual(a, b)
945 self.assertFalse(hasattr(a, "foo"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000946 try:
Georg Brandl48545522008-02-02 10:12:36 +0000947 a.foo = 12
948 except (AttributeError, TypeError):
949 pass
Guido van Rossumd32047f2002-11-25 21:38:52 +0000950 else:
Georg Brandl48545522008-02-02 10:12:36 +0000951 self.fail("object() should not allow setting a foo attribute")
952 self.assertFalse(hasattr(object(), "__dict__"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000953
Georg Brandl48545522008-02-02 10:12:36 +0000954 class Cdict(object):
955 pass
956 x = Cdict()
957 self.assertEqual(x.__dict__, {})
958 x.foo = 1
959 self.assertEqual(x.foo, 1)
960 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000961
Georg Brandl48545522008-02-02 10:12:36 +0000962 def test_slots(self):
963 # Testing __slots__...
964 class C0(object):
965 __slots__ = []
966 x = C0()
967 self.assertFalse(hasattr(x, "__dict__"))
968 self.assertFalse(hasattr(x, "foo"))
Guido van Rossum37202612001-08-09 19:45:21 +0000969
Georg Brandl48545522008-02-02 10:12:36 +0000970 class C1(object):
971 __slots__ = ['a']
972 x = C1()
973 self.assertFalse(hasattr(x, "__dict__"))
974 self.assertFalse(hasattr(x, "a"))
975 x.a = 1
976 self.assertEqual(x.a, 1)
977 x.a = None
978 self.assertEqual(x.a, None)
979 del x.a
980 self.assertFalse(hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000981
Georg Brandl48545522008-02-02 10:12:36 +0000982 class C3(object):
983 __slots__ = ['a', 'b', 'c']
984 x = C3()
985 self.assertFalse(hasattr(x, "__dict__"))
986 self.assertFalse(hasattr(x, 'a'))
987 self.assertFalse(hasattr(x, 'b'))
988 self.assertFalse(hasattr(x, 'c'))
989 x.a = 1
990 x.b = 2
991 x.c = 3
992 self.assertEqual(x.a, 1)
993 self.assertEqual(x.b, 2)
994 self.assertEqual(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995
Georg Brandl48545522008-02-02 10:12:36 +0000996 class C4(object):
997 """Validate name mangling"""
998 __slots__ = ['__a']
999 def __init__(self, value):
1000 self.__a = value
1001 def get(self):
1002 return self.__a
1003 x = C4(5)
1004 self.assertFalse(hasattr(x, '__dict__'))
1005 self.assertFalse(hasattr(x, '__a'))
1006 self.assertEqual(x.get(), 5)
1007 try:
1008 x.__a = 6
1009 except AttributeError:
1010 pass
1011 else:
1012 self.fail("Double underscored names not mangled")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013
Georg Brandl48545522008-02-02 10:12:36 +00001014 # Make sure slot names are proper identifiers
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001015 try:
1016 class C(object):
Georg Brandl48545522008-02-02 10:12:36 +00001017 __slots__ = [None]
Guido van Rossum843daa82001-09-18 20:04:26 +00001018 except TypeError:
1019 pass
1020 else:
Georg Brandl48545522008-02-02 10:12:36 +00001021 self.fail("[None] slots not caught")
Tim Peters66c1a522001-09-24 21:17:50 +00001022 try:
Georg Brandl48545522008-02-02 10:12:36 +00001023 class C(object):
1024 __slots__ = ["foo bar"]
1025 except TypeError:
Georg Brandl533ff6f2006-03-08 18:09:27 +00001026 pass
Georg Brandl48545522008-02-02 10:12:36 +00001027 else:
1028 self.fail("['foo bar'] slots not caught")
1029 try:
1030 class C(object):
1031 __slots__ = ["foo\0bar"]
1032 except TypeError:
1033 pass
1034 else:
1035 self.fail("['foo\\0bar'] slots not caught")
1036 try:
1037 class C(object):
1038 __slots__ = ["1"]
1039 except TypeError:
1040 pass
1041 else:
1042 self.fail("['1'] slots not caught")
1043 try:
1044 class C(object):
1045 __slots__ = [""]
1046 except TypeError:
1047 pass
1048 else:
1049 self.fail("[''] slots not caught")
1050 class C(object):
1051 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1052 # XXX(nnorwitz): was there supposed to be something tested
1053 # from the class above?
Georg Brandl533ff6f2006-03-08 18:09:27 +00001054
Georg Brandl48545522008-02-02 10:12:36 +00001055 # Test a single string is not expanded as a sequence.
1056 class C(object):
1057 __slots__ = "abc"
1058 c = C()
1059 c.abc = 5
1060 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001061
Georg Brandl48545522008-02-02 10:12:36 +00001062 # Test unicode slot names
1063 try:
1064 unicode
1065 except NameError:
1066 pass
1067 else:
1068 # Test a single unicode string is not expanded as a sequence.
1069 class C(object):
1070 __slots__ = unicode("abc")
1071 c = C()
1072 c.abc = 5
1073 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001074
Georg Brandl48545522008-02-02 10:12:36 +00001075 # _unicode_to_string used to modify slots in certain circumstances
1076 slots = (unicode("foo"), unicode("bar"))
1077 class C(object):
1078 __slots__ = slots
1079 x = C()
1080 x.foo = 5
1081 self.assertEqual(x.foo, 5)
1082 self.assertEqual(type(slots[0]), unicode)
1083 # this used to leak references
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001084 try:
Georg Brandl48545522008-02-02 10:12:36 +00001085 class C(object):
1086 __slots__ = [unichr(128)]
1087 except (TypeError, UnicodeEncodeError):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001088 pass
Tim Peters8fa45672001-09-13 21:01:29 +00001089 else:
Georg Brandl48545522008-02-02 10:12:36 +00001090 self.fail("[unichr(128)] slots not caught")
Tim Peters8fa45672001-09-13 21:01:29 +00001091
Georg Brandl48545522008-02-02 10:12:36 +00001092 # Test leaks
1093 class Counted(object):
1094 counter = 0 # counts the number of instances alive
1095 def __init__(self):
1096 Counted.counter += 1
1097 def __del__(self):
1098 Counted.counter -= 1
1099 class C(object):
1100 __slots__ = ['a', 'b', 'c']
Guido van Rossum8c842552002-03-14 23:05:54 +00001101 x = C()
Georg Brandl48545522008-02-02 10:12:36 +00001102 x.a = Counted()
1103 x.b = Counted()
1104 x.c = Counted()
1105 self.assertEqual(Counted.counter, 3)
1106 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001107 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001108 self.assertEqual(Counted.counter, 0)
1109 class D(C):
1110 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00001111 x = D()
Georg Brandl48545522008-02-02 10:12:36 +00001112 x.a = Counted()
1113 x.z = Counted()
1114 self.assertEqual(Counted.counter, 2)
1115 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001116 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001117 self.assertEqual(Counted.counter, 0)
1118 class E(D):
1119 __slots__ = ['e']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00001120 x = E()
Georg Brandl48545522008-02-02 10:12:36 +00001121 x.a = Counted()
1122 x.z = Counted()
1123 x.e = Counted()
1124 self.assertEqual(Counted.counter, 3)
1125 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001126 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001127 self.assertEqual(Counted.counter, 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00001128
Georg Brandl48545522008-02-02 10:12:36 +00001129 # Test cyclical leaks [SF bug 519621]
1130 class F(object):
1131 __slots__ = ['a', 'b']
Georg Brandl48545522008-02-02 10:12:36 +00001132 s = F()
1133 s.a = [Counted(), s]
1134 self.assertEqual(Counted.counter, 1)
1135 s = None
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001136 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001137 self.assertEqual(Counted.counter, 0)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001138
Georg Brandl48545522008-02-02 10:12:36 +00001139 # Test lookup leaks [SF bug 572567]
Georg Brandla4f46e12010-02-07 17:03:15 +00001140 import gc
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001141 if hasattr(gc, 'get_objects'):
1142 class G(object):
1143 def __cmp__(self, other):
1144 return 0
1145 __hash__ = None # Silence Py3k warning
1146 g = G()
1147 orig_objects = len(gc.get_objects())
1148 for i in xrange(10):
1149 g==g
1150 new_objects = len(gc.get_objects())
1151 self.assertEqual(orig_objects, new_objects)
1152
Georg Brandl48545522008-02-02 10:12:36 +00001153 class H(object):
1154 __slots__ = ['a', 'b']
1155 def __init__(self):
1156 self.a = 1
1157 self.b = 2
1158 def __del__(self_):
1159 self.assertEqual(self_.a, 1)
1160 self.assertEqual(self_.b, 2)
Armin Rigo581eb1e2008-10-28 17:01:21 +00001161 with test_support.captured_output('stderr') as s:
1162 h = H()
Georg Brandl48545522008-02-02 10:12:36 +00001163 del h
Armin Rigo581eb1e2008-10-28 17:01:21 +00001164 self.assertEqual(s.getvalue(), '')
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001165
Benjamin Peterson0f02d392009-12-30 19:34:10 +00001166 class X(object):
1167 __slots__ = "a"
1168 with self.assertRaises(AttributeError):
1169 del X().a
1170
Georg Brandl48545522008-02-02 10:12:36 +00001171 def test_slots_special(self):
1172 # Testing __dict__ and __weakref__ in __slots__...
1173 class D(object):
1174 __slots__ = ["__dict__"]
1175 a = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001176 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl48545522008-02-02 10:12:36 +00001177 self.assertFalse(hasattr(a, "__weakref__"))
1178 a.foo = 42
1179 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001180
Georg Brandl48545522008-02-02 10:12:36 +00001181 class W(object):
1182 __slots__ = ["__weakref__"]
1183 a = W()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001184 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001185 self.assertFalse(hasattr(a, "__dict__"))
1186 try:
1187 a.foo = 42
1188 except AttributeError:
1189 pass
1190 else:
1191 self.fail("shouldn't be allowed to set a.foo")
1192
1193 class C1(W, D):
1194 __slots__ = []
1195 a = C1()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001196 self.assertTrue(hasattr(a, "__dict__"))
1197 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001198 a.foo = 42
1199 self.assertEqual(a.__dict__, {"foo": 42})
1200
1201 class C2(D, W):
1202 __slots__ = []
1203 a = C2()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001204 self.assertTrue(hasattr(a, "__dict__"))
1205 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001206 a.foo = 42
1207 self.assertEqual(a.__dict__, {"foo": 42})
1208
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001209 def test_slots_descriptor(self):
1210 # Issue2115: slot descriptors did not correctly check
1211 # the type of the given object
1212 import abc
1213 class MyABC:
1214 __metaclass__ = abc.ABCMeta
1215 __slots__ = "a"
1216
1217 class Unrelated(object):
1218 pass
1219 MyABC.register(Unrelated)
1220
1221 u = Unrelated()
Ezio Melottib0f5adc2010-01-24 16:58:36 +00001222 self.assertIsInstance(u, MyABC)
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001223
1224 # This used to crash
1225 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1226
Benjamin Peterson4895af42009-12-13 16:36:53 +00001227 def test_metaclass_cmp(self):
1228 # See bug 7491.
1229 class M(type):
1230 def __cmp__(self, other):
1231 return -1
1232 class X(object):
1233 __metaclass__ = M
1234 self.assertTrue(X < M)
1235
Georg Brandl48545522008-02-02 10:12:36 +00001236 def test_dynamics(self):
1237 # Testing class attribute propagation...
1238 class D(object):
1239 pass
1240 class E(D):
1241 pass
1242 class F(D):
1243 pass
1244 D.foo = 1
1245 self.assertEqual(D.foo, 1)
1246 # Test that dynamic attributes are inherited
1247 self.assertEqual(E.foo, 1)
1248 self.assertEqual(F.foo, 1)
1249 # Test dynamic instances
1250 class C(object):
1251 pass
1252 a = C()
1253 self.assertFalse(hasattr(a, "foobar"))
1254 C.foobar = 2
1255 self.assertEqual(a.foobar, 2)
1256 C.method = lambda self: 42
1257 self.assertEqual(a.method(), 42)
1258 C.__repr__ = lambda self: "C()"
1259 self.assertEqual(repr(a), "C()")
1260 C.__int__ = lambda self: 100
1261 self.assertEqual(int(a), 100)
1262 self.assertEqual(a.foobar, 2)
1263 self.assertFalse(hasattr(a, "spam"))
1264 def mygetattr(self, name):
1265 if name == "spam":
1266 return "spam"
1267 raise AttributeError
1268 C.__getattr__ = mygetattr
1269 self.assertEqual(a.spam, "spam")
1270 a.new = 12
1271 self.assertEqual(a.new, 12)
1272 def mysetattr(self, name, value):
1273 if name == "spam":
1274 raise AttributeError
1275 return object.__setattr__(self, name, value)
1276 C.__setattr__ = mysetattr
1277 try:
1278 a.spam = "not spam"
1279 except AttributeError:
1280 pass
1281 else:
1282 self.fail("expected AttributeError")
1283 self.assertEqual(a.spam, "spam")
1284 class D(C):
1285 pass
1286 d = D()
1287 d.foo = 1
1288 self.assertEqual(d.foo, 1)
1289
1290 # Test handling of int*seq and seq*int
1291 class I(int):
1292 pass
1293 self.assertEqual("a"*I(2), "aa")
1294 self.assertEqual(I(2)*"a", "aa")
1295 self.assertEqual(2*I(3), 6)
1296 self.assertEqual(I(3)*2, 6)
1297 self.assertEqual(I(3)*I(2), 6)
1298
1299 # Test handling of long*seq and seq*long
1300 class L(long):
1301 pass
1302 self.assertEqual("a"*L(2L), "aa")
1303 self.assertEqual(L(2L)*"a", "aa")
1304 self.assertEqual(2*L(3), 6)
1305 self.assertEqual(L(3)*2, 6)
1306 self.assertEqual(L(3)*L(2), 6)
1307
1308 # Test comparison of classes with dynamic metaclasses
1309 class dynamicmetaclass(type):
1310 pass
1311 class someclass:
1312 __metaclass__ = dynamicmetaclass
1313 self.assertNotEqual(someclass, object)
1314
1315 def test_errors(self):
1316 # Testing errors...
1317 try:
1318 class C(list, dict):
1319 pass
1320 except TypeError:
1321 pass
1322 else:
1323 self.fail("inheritance from both list and dict should be illegal")
1324
1325 try:
1326 class C(object, None):
1327 pass
1328 except TypeError:
1329 pass
1330 else:
1331 self.fail("inheritance from non-type should be illegal")
1332 class Classic:
1333 pass
1334
1335 try:
1336 class C(type(len)):
1337 pass
1338 except TypeError:
1339 pass
1340 else:
1341 self.fail("inheritance from CFunction should be illegal")
1342
1343 try:
1344 class C(object):
1345 __slots__ = 1
1346 except TypeError:
1347 pass
1348 else:
1349 self.fail("__slots__ = 1 should be illegal")
1350
1351 try:
1352 class C(object):
1353 __slots__ = [1]
1354 except TypeError:
1355 pass
1356 else:
1357 self.fail("__slots__ = [1] should be illegal")
1358
1359 class M1(type):
1360 pass
1361 class M2(type):
1362 pass
1363 class A1(object):
1364 __metaclass__ = M1
1365 class A2(object):
1366 __metaclass__ = M2
1367 try:
1368 class B(A1, A2):
1369 pass
1370 except TypeError:
1371 pass
1372 else:
1373 self.fail("finding the most derived metaclass should have failed")
1374
1375 def test_classmethods(self):
1376 # Testing class methods...
1377 class C(object):
1378 def foo(*a): return a
1379 goo = classmethod(foo)
1380 c = C()
1381 self.assertEqual(C.goo(1), (C, 1))
1382 self.assertEqual(c.goo(1), (C, 1))
1383 self.assertEqual(c.foo(1), (c, 1))
1384 class D(C):
1385 pass
1386 d = D()
1387 self.assertEqual(D.goo(1), (D, 1))
1388 self.assertEqual(d.goo(1), (D, 1))
1389 self.assertEqual(d.foo(1), (d, 1))
1390 self.assertEqual(D.foo(d, 1), (d, 1))
1391 # Test for a specific crash (SF bug 528132)
1392 def f(cls, arg): return (cls, arg)
1393 ff = classmethod(f)
1394 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1395 self.assertEqual(ff.__get__(0)(42), (int, 42))
1396
1397 # Test super() with classmethods (SF bug 535444)
1398 self.assertEqual(C.goo.im_self, C)
1399 self.assertEqual(D.goo.im_self, D)
1400 self.assertEqual(super(D,D).goo.im_self, D)
1401 self.assertEqual(super(D,d).goo.im_self, D)
1402 self.assertEqual(super(D,D).goo(), (D,))
1403 self.assertEqual(super(D,d).goo(), (D,))
1404
Benjamin Peterson6fcf9b52009-09-01 22:27:57 +00001405 # Verify that a non-callable will raise
1406 meth = classmethod(1).__get__(1)
1407 self.assertRaises(TypeError, meth)
Georg Brandl48545522008-02-02 10:12:36 +00001408
1409 # Verify that classmethod() doesn't allow keyword args
1410 try:
1411 classmethod(f, kw=1)
1412 except TypeError:
1413 pass
1414 else:
1415 self.fail("classmethod shouldn't accept keyword args")
1416
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001417 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001418 def test_classmethods_in_c(self):
1419 # Testing C-based class methods...
1420 import xxsubtype as spam
1421 a = (1, 2, 3)
1422 d = {'abc': 123}
1423 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1424 self.assertEqual(x, spam.spamlist)
1425 self.assertEqual(a, a1)
1426 self.assertEqual(d, d1)
1427 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1428 self.assertEqual(x, spam.spamlist)
1429 self.assertEqual(a, a1)
1430 self.assertEqual(d, d1)
1431
1432 def test_staticmethods(self):
1433 # Testing static methods...
1434 class C(object):
1435 def foo(*a): return a
1436 goo = staticmethod(foo)
1437 c = C()
1438 self.assertEqual(C.goo(1), (1,))
1439 self.assertEqual(c.goo(1), (1,))
1440 self.assertEqual(c.foo(1), (c, 1,))
1441 class D(C):
1442 pass
1443 d = D()
1444 self.assertEqual(D.goo(1), (1,))
1445 self.assertEqual(d.goo(1), (1,))
1446 self.assertEqual(d.foo(1), (d, 1))
1447 self.assertEqual(D.foo(d, 1), (d, 1))
1448
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001449 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001450 def test_staticmethods_in_c(self):
1451 # Testing C-based static methods...
1452 import xxsubtype as spam
1453 a = (1, 2, 3)
1454 d = {"abc": 123}
1455 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1456 self.assertEqual(x, None)
1457 self.assertEqual(a, a1)
1458 self.assertEqual(d, d1)
1459 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1460 self.assertEqual(x, None)
1461 self.assertEqual(a, a1)
1462 self.assertEqual(d, d1)
1463
1464 def test_classic(self):
1465 # Testing classic classes...
1466 class C:
1467 def foo(*a): return a
1468 goo = classmethod(foo)
1469 c = C()
1470 self.assertEqual(C.goo(1), (C, 1))
1471 self.assertEqual(c.goo(1), (C, 1))
1472 self.assertEqual(c.foo(1), (c, 1))
1473 class D(C):
1474 pass
1475 d = D()
1476 self.assertEqual(D.goo(1), (D, 1))
1477 self.assertEqual(d.goo(1), (D, 1))
1478 self.assertEqual(d.foo(1), (d, 1))
1479 self.assertEqual(D.foo(d, 1), (d, 1))
1480 class E: # *not* subclassing from C
1481 foo = C.foo
1482 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001483 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001484
1485 def test_compattr(self):
1486 # Testing computed attributes...
1487 class C(object):
1488 class computed_attribute(object):
1489 def __init__(self, get, set=None, delete=None):
1490 self.__get = get
1491 self.__set = set
1492 self.__delete = delete
1493 def __get__(self, obj, type=None):
1494 return self.__get(obj)
1495 def __set__(self, obj, value):
1496 return self.__set(obj, value)
1497 def __delete__(self, obj):
1498 return self.__delete(obj)
1499 def __init__(self):
1500 self.__x = 0
1501 def __get_x(self):
1502 x = self.__x
1503 self.__x = x+1
1504 return x
1505 def __set_x(self, x):
1506 self.__x = x
1507 def __delete_x(self):
1508 del self.__x
1509 x = computed_attribute(__get_x, __set_x, __delete_x)
1510 a = C()
1511 self.assertEqual(a.x, 0)
1512 self.assertEqual(a.x, 1)
1513 a.x = 10
1514 self.assertEqual(a.x, 10)
1515 self.assertEqual(a.x, 11)
1516 del a.x
1517 self.assertEqual(hasattr(a, 'x'), 0)
1518
1519 def test_newslots(self):
1520 # Testing __new__ slot override...
1521 class C(list):
1522 def __new__(cls):
1523 self = list.__new__(cls)
1524 self.foo = 1
1525 return self
1526 def __init__(self):
1527 self.foo = self.foo + 2
1528 a = C()
1529 self.assertEqual(a.foo, 3)
1530 self.assertEqual(a.__class__, C)
1531 class D(C):
1532 pass
1533 b = D()
1534 self.assertEqual(b.foo, 3)
1535 self.assertEqual(b.__class__, D)
1536
1537 def test_altmro(self):
1538 # Testing mro() and overriding it...
1539 class A(object):
1540 def f(self): return "A"
1541 class B(A):
1542 pass
1543 class C(A):
1544 def f(self): return "C"
1545 class D(B, C):
1546 pass
1547 self.assertEqual(D.mro(), [D, B, C, A, object])
1548 self.assertEqual(D.__mro__, (D, B, C, A, object))
1549 self.assertEqual(D().f(), "C")
1550
1551 class PerverseMetaType(type):
1552 def mro(cls):
1553 L = type.mro(cls)
1554 L.reverse()
1555 return L
1556 class X(D,B,C,A):
1557 __metaclass__ = PerverseMetaType
1558 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1559 self.assertEqual(X().f(), "A")
1560
1561 try:
1562 class X(object):
1563 class __metaclass__(type):
1564 def mro(self):
1565 return [self, dict, object]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001566 # In CPython, the class creation above already raises
1567 # TypeError, as a protection against the fact that
1568 # instances of X would segfault it. In other Python
1569 # implementations it would be ok to let the class X
1570 # be created, but instead get a clean TypeError on the
1571 # __setitem__ below.
1572 x = object.__new__(X)
1573 x[5] = 6
Georg Brandl48545522008-02-02 10:12:36 +00001574 except TypeError:
1575 pass
1576 else:
1577 self.fail("devious mro() return not caught")
1578
1579 try:
1580 class X(object):
1581 class __metaclass__(type):
1582 def mro(self):
1583 return [1]
1584 except TypeError:
1585 pass
1586 else:
1587 self.fail("non-class mro() return not caught")
1588
1589 try:
1590 class X(object):
1591 class __metaclass__(type):
1592 def mro(self):
1593 return 1
1594 except TypeError:
1595 pass
1596 else:
1597 self.fail("non-sequence mro() return not caught")
1598
1599 def test_overloading(self):
1600 # Testing operator overloading...
1601
1602 class B(object):
1603 "Intermediate class because object doesn't have a __setattr__"
1604
1605 class C(B):
1606 def __getattr__(self, name):
1607 if name == "foo":
1608 return ("getattr", name)
1609 else:
1610 raise AttributeError
1611 def __setattr__(self, name, value):
1612 if name == "foo":
1613 self.setattr = (name, value)
1614 else:
1615 return B.__setattr__(self, name, value)
1616 def __delattr__(self, name):
1617 if name == "foo":
1618 self.delattr = name
1619 else:
1620 return B.__delattr__(self, name)
1621
1622 def __getitem__(self, key):
1623 return ("getitem", key)
1624 def __setitem__(self, key, value):
1625 self.setitem = (key, value)
1626 def __delitem__(self, key):
1627 self.delitem = key
1628
1629 def __getslice__(self, i, j):
1630 return ("getslice", i, j)
1631 def __setslice__(self, i, j, value):
1632 self.setslice = (i, j, value)
1633 def __delslice__(self, i, j):
1634 self.delslice = (i, j)
1635
1636 a = C()
1637 self.assertEqual(a.foo, ("getattr", "foo"))
1638 a.foo = 12
1639 self.assertEqual(a.setattr, ("foo", 12))
1640 del a.foo
1641 self.assertEqual(a.delattr, "foo")
1642
1643 self.assertEqual(a[12], ("getitem", 12))
1644 a[12] = 21
1645 self.assertEqual(a.setitem, (12, 21))
1646 del a[12]
1647 self.assertEqual(a.delitem, 12)
1648
1649 self.assertEqual(a[0:10], ("getslice", 0, 10))
1650 a[0:10] = "foo"
1651 self.assertEqual(a.setslice, (0, 10, "foo"))
1652 del a[0:10]
1653 self.assertEqual(a.delslice, (0, 10))
1654
1655 def test_methods(self):
1656 # Testing methods...
1657 class C(object):
1658 def __init__(self, x):
1659 self.x = x
1660 def foo(self):
1661 return self.x
1662 c1 = C(1)
1663 self.assertEqual(c1.foo(), 1)
1664 class D(C):
1665 boo = C.foo
1666 goo = c1.foo
1667 d2 = D(2)
1668 self.assertEqual(d2.foo(), 2)
1669 self.assertEqual(d2.boo(), 2)
1670 self.assertEqual(d2.goo(), 1)
1671 class E(object):
1672 foo = C.foo
1673 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001674 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001675
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001676 def test_special_method_lookup(self):
1677 # The lookup of special methods bypasses __getattr__ and
1678 # __getattribute__, but they still can be descriptors.
1679
1680 def run_context(manager):
1681 with manager:
1682 pass
1683 def iden(self):
1684 return self
1685 def hello(self):
1686 return "hello"
Benjamin Peterson809e2252009-05-09 02:07:04 +00001687 def empty_seq(self):
1688 return []
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001689 def zero(self):
1690 return 0
Benjamin Petersonecdae192010-01-04 00:43:01 +00001691 def complex_num(self):
1692 return 1j
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001693 def stop(self):
1694 raise StopIteration
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001695 def return_true(self, thing=None):
1696 return True
1697 def do_isinstance(obj):
1698 return isinstance(int, obj)
1699 def do_issubclass(obj):
1700 return issubclass(int, obj)
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001701 def swallow(*args):
1702 pass
1703 def do_dict_missing(checker):
1704 class DictSub(checker.__class__, dict):
1705 pass
1706 self.assertEqual(DictSub()["hi"], 4)
1707 def some_number(self_, key):
1708 self.assertEqual(key, "hi")
1709 return 4
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001710
1711 # It would be nice to have every special method tested here, but I'm
1712 # only listing the ones I can remember outside of typeobject.c, since it
1713 # does it right.
1714 specials = [
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001715 ("__unicode__", unicode, hello, set(), {}),
1716 ("__reversed__", reversed, empty_seq, set(), {}),
1717 ("__length_hint__", list, zero, set(),
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001718 {"__iter__" : iden, "next" : stop}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001719 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1720 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001721 ("__missing__", do_dict_missing, some_number,
1722 set(("__class__",)), {}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001723 ("__subclasscheck__", do_issubclass, return_true,
1724 set(("__bases__",)), {}),
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00001725 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1726 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Petersonecdae192010-01-04 00:43:01 +00001727 ("__complex__", complex, complex_num, set(), {}),
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001728 ]
1729
1730 class Checker(object):
1731 def __getattr__(self, attr, test=self):
1732 test.fail("__getattr__ called with {0}".format(attr))
1733 def __getattribute__(self, attr, test=self):
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001734 if attr not in ok:
1735 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001736 return object.__getattribute__(self, attr)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001737 class SpecialDescr(object):
1738 def __init__(self, impl):
1739 self.impl = impl
1740 def __get__(self, obj, owner):
1741 record.append(1)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001742 return self.impl.__get__(obj, owner)
Benjamin Peterson87e50062009-05-25 02:40:21 +00001743 class MyException(Exception):
1744 pass
1745 class ErrDescr(object):
1746 def __get__(self, obj, owner):
1747 raise MyException
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001748
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001749 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001750 class X(Checker):
1751 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001752 for attr, obj in env.iteritems():
1753 setattr(X, attr, obj)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001754 setattr(X, name, meth_impl)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001755 runner(X())
1756
1757 record = []
1758 class X(Checker):
1759 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001760 for attr, obj in env.iteritems():
1761 setattr(X, attr, obj)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001762 setattr(X, name, SpecialDescr(meth_impl))
1763 runner(X())
1764 self.assertEqual(record, [1], name)
1765
Benjamin Peterson87e50062009-05-25 02:40:21 +00001766 class X(Checker):
1767 pass
1768 for attr, obj in env.iteritems():
1769 setattr(X, attr, obj)
1770 setattr(X, name, ErrDescr())
1771 try:
1772 runner(X())
1773 except MyException:
1774 pass
1775 else:
1776 self.fail("{0!r} didn't raise".format(name))
1777
Georg Brandl48545522008-02-02 10:12:36 +00001778 def test_specials(self):
1779 # Testing special operators...
1780 # Test operators like __hash__ for which a built-in default exists
1781
1782 # Test the default behavior for static classes
1783 class C(object):
1784 def __getitem__(self, i):
1785 if 0 <= i < 10: return i
1786 raise IndexError
1787 c1 = C()
1788 c2 = C()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001789 self.assertTrue(not not c1) # What?
Georg Brandl48545522008-02-02 10:12:36 +00001790 self.assertNotEqual(id(c1), id(c2))
1791 hash(c1)
1792 hash(c2)
1793 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1794 self.assertEqual(c1, c1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001795 self.assertTrue(c1 != c2)
1796 self.assertTrue(not c1 != c1)
1797 self.assertTrue(not c1 == c2)
Georg Brandl48545522008-02-02 10:12:36 +00001798 # Note that the module name appears in str/repr, and that varies
1799 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001800 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001801 self.assertEqual(str(c1), repr(c1))
Ezio Melottiaa980582010-01-23 23:04:36 +00001802 self.assertNotIn(-1, c1)
Georg Brandl48545522008-02-02 10:12:36 +00001803 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001804 self.assertIn(i, c1)
1805 self.assertNotIn(10, c1)
Georg Brandl48545522008-02-02 10:12:36 +00001806 # Test the default behavior for dynamic classes
1807 class D(object):
1808 def __getitem__(self, i):
1809 if 0 <= i < 10: return i
1810 raise IndexError
1811 d1 = D()
1812 d2 = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001813 self.assertTrue(not not d1)
Georg Brandl48545522008-02-02 10:12:36 +00001814 self.assertNotEqual(id(d1), id(d2))
1815 hash(d1)
1816 hash(d2)
1817 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1818 self.assertEqual(d1, d1)
1819 self.assertNotEqual(d1, d2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001820 self.assertTrue(not d1 != d1)
1821 self.assertTrue(not d1 == d2)
Georg Brandl48545522008-02-02 10:12:36 +00001822 # Note that the module name appears in str/repr, and that varies
1823 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001824 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001825 self.assertEqual(str(d1), repr(d1))
Ezio Melottiaa980582010-01-23 23:04:36 +00001826 self.assertNotIn(-1, d1)
Georg Brandl48545522008-02-02 10:12:36 +00001827 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001828 self.assertIn(i, d1)
1829 self.assertNotIn(10, d1)
Georg Brandl48545522008-02-02 10:12:36 +00001830 # Test overridden behavior for static classes
1831 class Proxy(object):
1832 def __init__(self, x):
1833 self.x = x
1834 def __nonzero__(self):
1835 return not not self.x
1836 def __hash__(self):
1837 return hash(self.x)
1838 def __eq__(self, other):
1839 return self.x == other
1840 def __ne__(self, other):
1841 return self.x != other
1842 def __cmp__(self, other):
1843 return cmp(self.x, other.x)
1844 def __str__(self):
1845 return "Proxy:%s" % self.x
1846 def __repr__(self):
1847 return "Proxy(%r)" % self.x
1848 def __contains__(self, value):
1849 return value in self.x
1850 p0 = Proxy(0)
1851 p1 = Proxy(1)
1852 p_1 = Proxy(-1)
1853 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001854 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001855 self.assertEqual(hash(p0), hash(0))
1856 self.assertEqual(p0, p0)
1857 self.assertNotEqual(p0, p1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001858 self.assertTrue(not p0 != p0)
Georg Brandl48545522008-02-02 10:12:36 +00001859 self.assertEqual(not p0, p1)
1860 self.assertEqual(cmp(p0, p1), -1)
1861 self.assertEqual(cmp(p0, p0), 0)
1862 self.assertEqual(cmp(p0, p_1), 1)
1863 self.assertEqual(str(p0), "Proxy:0")
1864 self.assertEqual(repr(p0), "Proxy(0)")
1865 p10 = Proxy(range(10))
Ezio Melottiaa980582010-01-23 23:04:36 +00001866 self.assertNotIn(-1, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001867 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001868 self.assertIn(i, p10)
1869 self.assertNotIn(10, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001870 # Test overridden behavior for dynamic classes
1871 class DProxy(object):
1872 def __init__(self, x):
1873 self.x = x
1874 def __nonzero__(self):
1875 return not not self.x
1876 def __hash__(self):
1877 return hash(self.x)
1878 def __eq__(self, other):
1879 return self.x == other
1880 def __ne__(self, other):
1881 return self.x != other
1882 def __cmp__(self, other):
1883 return cmp(self.x, other.x)
1884 def __str__(self):
1885 return "DProxy:%s" % self.x
1886 def __repr__(self):
1887 return "DProxy(%r)" % self.x
1888 def __contains__(self, value):
1889 return value in self.x
1890 p0 = DProxy(0)
1891 p1 = DProxy(1)
1892 p_1 = DProxy(-1)
1893 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001894 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001895 self.assertEqual(hash(p0), hash(0))
1896 self.assertEqual(p0, p0)
1897 self.assertNotEqual(p0, p1)
1898 self.assertNotEqual(not p0, p0)
1899 self.assertEqual(not p0, p1)
1900 self.assertEqual(cmp(p0, p1), -1)
1901 self.assertEqual(cmp(p0, p0), 0)
1902 self.assertEqual(cmp(p0, p_1), 1)
1903 self.assertEqual(str(p0), "DProxy:0")
1904 self.assertEqual(repr(p0), "DProxy(0)")
1905 p10 = DProxy(range(10))
Ezio Melottiaa980582010-01-23 23:04:36 +00001906 self.assertNotIn(-1, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001907 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001908 self.assertIn(i, p10)
1909 self.assertNotIn(10, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001910
1911 # Safety test for __cmp__
1912 def unsafecmp(a, b):
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001913 if not hasattr(a, '__cmp__'):
1914 return # some types don't have a __cmp__ any more (so the
1915 # test doesn't make sense any more), or maybe they
1916 # never had a __cmp__ at all, e.g. in PyPy
Georg Brandl48545522008-02-02 10:12:36 +00001917 try:
1918 a.__class__.__cmp__(a, b)
1919 except TypeError:
1920 pass
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001921 else:
Georg Brandl48545522008-02-02 10:12:36 +00001922 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1923 a.__class__, a, b))
1924
1925 unsafecmp(u"123", "123")
1926 unsafecmp("123", u"123")
1927 unsafecmp(1, 1.0)
1928 unsafecmp(1.0, 1)
1929 unsafecmp(1, 1L)
1930 unsafecmp(1L, 1)
1931
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001932 @test_support.impl_detail("custom logic for printing to real file objects")
1933 def test_recursions_1(self):
Georg Brandl48545522008-02-02 10:12:36 +00001934 # Testing recursion checks ...
1935 class Letter(str):
1936 def __new__(cls, letter):
1937 if letter == 'EPS':
1938 return str.__new__(cls)
1939 return str.__new__(cls, letter)
1940 def __str__(self):
1941 if not self:
1942 return 'EPS'
1943 return self
1944 # sys.stdout needs to be the original to trigger the recursion bug
Georg Brandl48545522008-02-02 10:12:36 +00001945 test_stdout = sys.stdout
1946 sys.stdout = test_support.get_original_stdout()
1947 try:
1948 # nothing should actually be printed, this should raise an exception
1949 print Letter('w')
1950 except RuntimeError:
1951 pass
1952 else:
1953 self.fail("expected a RuntimeError for print recursion")
1954 finally:
1955 sys.stdout = test_stdout
1956
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001957 def test_recursions_2(self):
Georg Brandl48545522008-02-02 10:12:36 +00001958 # Bug #1202533.
1959 class A(object):
1960 pass
1961 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
1962 try:
1963 A()*2
1964 except RuntimeError:
1965 pass
1966 else:
1967 self.fail("expected a RuntimeError")
1968
1969 def test_weakrefs(self):
1970 # Testing weak references...
1971 import weakref
1972 class C(object):
1973 pass
1974 c = C()
1975 r = weakref.ref(c)
1976 self.assertEqual(r(), c)
1977 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001978 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001979 self.assertEqual(r(), None)
1980 del r
1981 class NoWeak(object):
1982 __slots__ = ['foo']
1983 no = NoWeak()
1984 try:
1985 weakref.ref(no)
1986 except TypeError, msg:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001987 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001988 else:
1989 self.fail("weakref.ref(no) should be illegal")
1990 class Weak(object):
1991 __slots__ = ['foo', '__weakref__']
1992 yes = Weak()
1993 r = weakref.ref(yes)
1994 self.assertEqual(r(), yes)
1995 del yes
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001996 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001997 self.assertEqual(r(), None)
1998 del r
1999
2000 def test_properties(self):
2001 # Testing property...
2002 class C(object):
2003 def getx(self):
2004 return self.__x
2005 def setx(self, value):
2006 self.__x = value
2007 def delx(self):
2008 del self.__x
2009 x = property(getx, setx, delx, doc="I'm the x property.")
2010 a = C()
2011 self.assertFalse(hasattr(a, "x"))
2012 a.x = 42
2013 self.assertEqual(a._C__x, 42)
2014 self.assertEqual(a.x, 42)
2015 del a.x
2016 self.assertFalse(hasattr(a, "x"))
2017 self.assertFalse(hasattr(a, "_C__x"))
2018 C.x.__set__(a, 100)
2019 self.assertEqual(C.x.__get__(a), 100)
2020 C.x.__delete__(a)
2021 self.assertFalse(hasattr(a, "x"))
2022
2023 raw = C.__dict__['x']
Ezio Melottib0f5adc2010-01-24 16:58:36 +00002024 self.assertIsInstance(raw, property)
Georg Brandl48545522008-02-02 10:12:36 +00002025
2026 attrs = dir(raw)
Ezio Melottiaa980582010-01-23 23:04:36 +00002027 self.assertIn("__doc__", attrs)
2028 self.assertIn("fget", attrs)
2029 self.assertIn("fset", attrs)
2030 self.assertIn("fdel", attrs)
Georg Brandl48545522008-02-02 10:12:36 +00002031
2032 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002033 self.assertTrue(raw.fget is C.__dict__['getx'])
2034 self.assertTrue(raw.fset is C.__dict__['setx'])
2035 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl48545522008-02-02 10:12:36 +00002036
2037 for attr in "__doc__", "fget", "fset", "fdel":
2038 try:
2039 setattr(raw, attr, 42)
2040 except TypeError, msg:
2041 if str(msg).find('readonly') < 0:
2042 self.fail("when setting readonly attr %r on a property, "
2043 "got unexpected TypeError msg %r" % (attr, str(msg)))
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002044 else:
Georg Brandl48545522008-02-02 10:12:36 +00002045 self.fail("expected TypeError from trying to set readonly %r "
2046 "attr on a property" % attr)
Tim Peters2f93e282001-10-04 05:27:00 +00002047
Georg Brandl48545522008-02-02 10:12:36 +00002048 class D(object):
2049 __getitem__ = property(lambda s: 1/0)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002050
Georg Brandl48545522008-02-02 10:12:36 +00002051 d = D()
2052 try:
2053 for i in d:
2054 str(i)
2055 except ZeroDivisionError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002056 pass
Georg Brandl48545522008-02-02 10:12:36 +00002057 else:
2058 self.fail("expected ZeroDivisionError from bad property")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002059
R. David Murrayf28fd242010-02-23 00:24:49 +00002060 @unittest.skipIf(sys.flags.optimize >= 2,
2061 "Docstrings are omitted with -O2 and above")
2062 def test_properties_doc_attrib(self):
Georg Brandl48545522008-02-02 10:12:36 +00002063 class E(object):
2064 def getter(self):
2065 "getter method"
2066 return 0
2067 def setter(self_, value):
2068 "setter method"
2069 pass
2070 prop = property(getter)
2071 self.assertEqual(prop.__doc__, "getter method")
2072 prop2 = property(fset=setter)
2073 self.assertEqual(prop2.__doc__, None)
2074
R. David Murrayf28fd242010-02-23 00:24:49 +00002075 def test_testcapi_no_segfault(self):
Georg Brandl48545522008-02-02 10:12:36 +00002076 # this segfaulted in 2.5b2
2077 try:
2078 import _testcapi
2079 except ImportError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002080 pass
Georg Brandl48545522008-02-02 10:12:36 +00002081 else:
2082 class X(object):
2083 p = property(_testcapi.test_with_docstring)
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002084
Georg Brandl48545522008-02-02 10:12:36 +00002085 def test_properties_plus(self):
2086 class C(object):
2087 foo = property(doc="hello")
2088 @foo.getter
2089 def foo(self):
2090 return self._foo
2091 @foo.setter
2092 def foo(self, value):
2093 self._foo = abs(value)
2094 @foo.deleter
2095 def foo(self):
2096 del self._foo
2097 c = C()
2098 self.assertEqual(C.foo.__doc__, "hello")
2099 self.assertFalse(hasattr(c, "foo"))
2100 c.foo = -42
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002101 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl48545522008-02-02 10:12:36 +00002102 self.assertEqual(c._foo, 42)
2103 self.assertEqual(c.foo, 42)
2104 del c.foo
2105 self.assertFalse(hasattr(c, '_foo'))
2106 self.assertFalse(hasattr(c, "foo"))
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002107
Georg Brandl48545522008-02-02 10:12:36 +00002108 class D(C):
2109 @C.foo.deleter
2110 def foo(self):
2111 try:
2112 del self._foo
2113 except AttributeError:
2114 pass
2115 d = D()
2116 d.foo = 24
2117 self.assertEqual(d.foo, 24)
2118 del d.foo
2119 del d.foo
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002120
Georg Brandl48545522008-02-02 10:12:36 +00002121 class E(object):
2122 @property
2123 def foo(self):
2124 return self._foo
2125 @foo.setter
2126 def foo(self, value):
2127 raise RuntimeError
2128 @foo.setter
2129 def foo(self, value):
2130 self._foo = abs(value)
2131 @foo.deleter
2132 def foo(self, value=None):
2133 del self._foo
Guido van Rossume8fc6402002-04-16 16:44:51 +00002134
Georg Brandl48545522008-02-02 10:12:36 +00002135 e = E()
2136 e.foo = -42
2137 self.assertEqual(e.foo, 42)
2138 del e.foo
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002139
Georg Brandl48545522008-02-02 10:12:36 +00002140 class F(E):
2141 @E.foo.deleter
2142 def foo(self):
2143 del self._foo
2144 @foo.setter
2145 def foo(self, value):
2146 self._foo = max(0, value)
2147 f = F()
2148 f.foo = -10
2149 self.assertEqual(f.foo, 0)
2150 del f.foo
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00002151
Georg Brandl48545522008-02-02 10:12:36 +00002152 def test_dict_constructors(self):
2153 # Testing dict constructor ...
2154 d = dict()
2155 self.assertEqual(d, {})
2156 d = dict({})
2157 self.assertEqual(d, {})
2158 d = dict({1: 2, 'a': 'b'})
2159 self.assertEqual(d, {1: 2, 'a': 'b'})
2160 self.assertEqual(d, dict(d.items()))
2161 self.assertEqual(d, dict(d.iteritems()))
2162 d = dict({'one':1, 'two':2})
2163 self.assertEqual(d, dict(one=1, two=2))
2164 self.assertEqual(d, dict(**d))
2165 self.assertEqual(d, dict({"one": 1}, two=2))
2166 self.assertEqual(d, dict([("two", 2)], one=1))
2167 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
2168 self.assertEqual(d, dict(**d))
Guido van Rossum09638c12002-06-13 19:17:46 +00002169
Georg Brandl48545522008-02-02 10:12:36 +00002170 for badarg in 0, 0L, 0j, "0", [0], (0,):
2171 try:
2172 dict(badarg)
2173 except TypeError:
2174 pass
2175 except ValueError:
2176 if badarg == "0":
2177 # It's a sequence, and its elements are also sequences (gotta
2178 # love strings <wink>), but they aren't of length 2, so this
2179 # one seemed better as a ValueError than a TypeError.
2180 pass
2181 else:
2182 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002183 else:
Georg Brandl48545522008-02-02 10:12:36 +00002184 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002185
Georg Brandl48545522008-02-02 10:12:36 +00002186 try:
2187 dict({}, {})
2188 except TypeError:
2189 pass
2190 else:
2191 self.fail("no TypeError from dict({}, {})")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002192
Georg Brandl48545522008-02-02 10:12:36 +00002193 class Mapping:
2194 # Lacks a .keys() method; will be added later.
2195 dict = {1:2, 3:4, 'a':1j}
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002196
Georg Brandl48545522008-02-02 10:12:36 +00002197 try:
2198 dict(Mapping())
2199 except TypeError:
2200 pass
2201 else:
2202 self.fail("no TypeError from dict(incomplete mapping)")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002203
Georg Brandl48545522008-02-02 10:12:36 +00002204 Mapping.keys = lambda self: self.dict.keys()
2205 Mapping.__getitem__ = lambda self, i: self.dict[i]
2206 d = dict(Mapping())
2207 self.assertEqual(d, Mapping.dict)
Michael W. Hudsonf3904422006-11-23 13:54:04 +00002208
Georg Brandl48545522008-02-02 10:12:36 +00002209 # Init from sequence of iterable objects, each producing a 2-sequence.
2210 class AddressBookEntry:
2211 def __init__(self, first, last):
2212 self.first = first
2213 self.last = last
2214 def __iter__(self):
2215 return iter([self.first, self.last])
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002216
Georg Brandl48545522008-02-02 10:12:36 +00002217 d = dict([AddressBookEntry('Tim', 'Warsaw'),
2218 AddressBookEntry('Barry', 'Peters'),
2219 AddressBookEntry('Tim', 'Peters'),
2220 AddressBookEntry('Barry', 'Warsaw')])
2221 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00002222
Georg Brandl48545522008-02-02 10:12:36 +00002223 d = dict(zip(range(4), range(1, 5)))
2224 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002225
Georg Brandl48545522008-02-02 10:12:36 +00002226 # Bad sequence lengths.
2227 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2228 try:
2229 dict(bad)
2230 except ValueError:
2231 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00002232 else:
Georg Brandl48545522008-02-02 10:12:36 +00002233 self.fail("no ValueError from dict(%r)" % bad)
2234
2235 def test_dir(self):
2236 # Testing dir() ...
2237 junk = 12
2238 self.assertEqual(dir(), ['junk', 'self'])
2239 del junk
2240
2241 # Just make sure these don't blow up!
2242 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
2243 dir(arg)
2244
2245 # Try classic classes.
2246 class C:
2247 Cdata = 1
2248 def Cmethod(self): pass
2249
2250 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
2251 self.assertEqual(dir(C), cstuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002252 self.assertIn('im_self', dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002253
2254 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
2255 self.assertEqual(dir(c), cstuff)
2256
2257 c.cdata = 2
2258 c.cmethod = lambda self: 0
2259 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002260 self.assertIn('im_self', dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002261
2262 class A(C):
2263 Adata = 1
2264 def Amethod(self): pass
2265
2266 astuff = ['Adata', 'Amethod'] + cstuff
2267 self.assertEqual(dir(A), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002268 self.assertIn('im_self', dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002269 a = A()
2270 self.assertEqual(dir(a), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002271 self.assertIn('im_self', dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002272 a.adata = 42
2273 a.amethod = lambda self: 3
2274 self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
2275
2276 # The same, but with new-style classes. Since these have object as a
2277 # base class, a lot more gets sucked in.
2278 def interesting(strings):
2279 return [s for s in strings if not s.startswith('_')]
2280
2281 class C(object):
2282 Cdata = 1
2283 def Cmethod(self): pass
2284
2285 cstuff = ['Cdata', 'Cmethod']
2286 self.assertEqual(interesting(dir(C)), cstuff)
2287
2288 c = C()
2289 self.assertEqual(interesting(dir(c)), cstuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002290 self.assertIn('im_self', dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002291
2292 c.cdata = 2
2293 c.cmethod = lambda self: 0
2294 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002295 self.assertIn('im_self', dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002296
2297 class A(C):
2298 Adata = 1
2299 def Amethod(self): pass
2300
2301 astuff = ['Adata', 'Amethod'] + cstuff
2302 self.assertEqual(interesting(dir(A)), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002303 self.assertIn('im_self', dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002304 a = A()
2305 self.assertEqual(interesting(dir(a)), astuff)
2306 a.adata = 42
2307 a.amethod = lambda self: 3
2308 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002309 self.assertIn('im_self', dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002310
2311 # Try a module subclass.
Georg Brandl48545522008-02-02 10:12:36 +00002312 class M(type(sys)):
2313 pass
2314 minstance = M("m")
2315 minstance.b = 2
2316 minstance.a = 1
2317 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2318 self.assertEqual(names, ['a', 'b'])
2319
2320 class M2(M):
2321 def getdict(self):
2322 return "Not a dict!"
2323 __dict__ = property(getdict)
2324
2325 m2instance = M2("m2")
2326 m2instance.b = 2
2327 m2instance.a = 1
2328 self.assertEqual(m2instance.__dict__, "Not a dict!")
2329 try:
2330 dir(m2instance)
2331 except TypeError:
2332 pass
2333
2334 # Two essentially featureless objects, just inheriting stuff from
2335 # object.
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002336 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2337 if test_support.check_impl_detail():
2338 # None differs in PyPy: it has a __nonzero__
2339 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl48545522008-02-02 10:12:36 +00002340
2341 # Nasty test case for proxied objects
2342 class Wrapper(object):
2343 def __init__(self, obj):
2344 self.__obj = obj
2345 def __repr__(self):
2346 return "Wrapper(%s)" % repr(self.__obj)
2347 def __getitem__(self, key):
2348 return Wrapper(self.__obj[key])
2349 def __len__(self):
2350 return len(self.__obj)
2351 def __getattr__(self, name):
2352 return Wrapper(getattr(self.__obj, name))
2353
2354 class C(object):
2355 def __getclass(self):
2356 return Wrapper(type(self))
2357 __class__ = property(__getclass)
2358
2359 dir(C()) # This used to segfault
2360
2361 def test_supers(self):
2362 # Testing super...
2363
2364 class A(object):
2365 def meth(self, a):
2366 return "A(%r)" % a
2367
2368 self.assertEqual(A().meth(1), "A(1)")
2369
2370 class B(A):
2371 def __init__(self):
2372 self.__super = super(B, self)
2373 def meth(self, a):
2374 return "B(%r)" % a + self.__super.meth(a)
2375
2376 self.assertEqual(B().meth(2), "B(2)A(2)")
2377
2378 class C(A):
2379 def meth(self, a):
2380 return "C(%r)" % a + self.__super.meth(a)
2381 C._C__super = super(C)
2382
2383 self.assertEqual(C().meth(3), "C(3)A(3)")
2384
2385 class D(C, B):
2386 def meth(self, a):
2387 return "D(%r)" % a + super(D, self).meth(a)
2388
2389 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2390
2391 # Test for subclassing super
2392
2393 class mysuper(super):
2394 def __init__(self, *args):
2395 return super(mysuper, self).__init__(*args)
2396
2397 class E(D):
2398 def meth(self, a):
2399 return "E(%r)" % a + mysuper(E, self).meth(a)
2400
2401 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2402
2403 class F(E):
2404 def meth(self, a):
2405 s = self.__super # == mysuper(F, self)
2406 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2407 F._F__super = mysuper(F)
2408
2409 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2410
2411 # Make sure certain errors are raised
2412
2413 try:
2414 super(D, 42)
2415 except TypeError:
2416 pass
2417 else:
2418 self.fail("shouldn't allow super(D, 42)")
2419
2420 try:
2421 super(D, C())
2422 except TypeError:
2423 pass
2424 else:
2425 self.fail("shouldn't allow super(D, C())")
2426
2427 try:
2428 super(D).__get__(12)
2429 except TypeError:
2430 pass
2431 else:
2432 self.fail("shouldn't allow super(D).__get__(12)")
2433
2434 try:
2435 super(D).__get__(C())
2436 except TypeError:
2437 pass
2438 else:
2439 self.fail("shouldn't allow super(D).__get__(C())")
2440
2441 # Make sure data descriptors can be overridden and accessed via super
2442 # (new feature in Python 2.3)
2443
2444 class DDbase(object):
2445 def getx(self): return 42
2446 x = property(getx)
2447
2448 class DDsub(DDbase):
2449 def getx(self): return "hello"
2450 x = property(getx)
2451
2452 dd = DDsub()
2453 self.assertEqual(dd.x, "hello")
2454 self.assertEqual(super(DDsub, dd).x, 42)
2455
2456 # Ensure that super() lookup of descriptor from classmethod
2457 # works (SF ID# 743627)
2458
2459 class Base(object):
2460 aProp = property(lambda self: "foo")
2461
2462 class Sub(Base):
2463 @classmethod
2464 def test(klass):
2465 return super(Sub,klass).aProp
2466
2467 self.assertEqual(Sub.test(), Base.aProp)
2468
2469 # Verify that super() doesn't allow keyword args
2470 try:
2471 super(Base, kw=1)
2472 except TypeError:
2473 pass
2474 else:
2475 self.assertEqual("super shouldn't accept keyword args")
2476
2477 def test_basic_inheritance(self):
2478 # Testing inheritance from basic types...
2479
2480 class hexint(int):
2481 def __repr__(self):
2482 return hex(self)
2483 def __add__(self, other):
2484 return hexint(int.__add__(self, other))
2485 # (Note that overriding __radd__ doesn't work,
2486 # because the int type gets first dibs.)
2487 self.assertEqual(repr(hexint(7) + 9), "0x10")
2488 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2489 a = hexint(12345)
2490 self.assertEqual(a, 12345)
2491 self.assertEqual(int(a), 12345)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002492 self.assertTrue(int(a).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002493 self.assertEqual(hash(a), hash(12345))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002494 self.assertTrue((+a).__class__ is int)
2495 self.assertTrue((a >> 0).__class__ is int)
2496 self.assertTrue((a << 0).__class__ is int)
2497 self.assertTrue((hexint(0) << 12).__class__ is int)
2498 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002499
2500 class octlong(long):
2501 __slots__ = []
2502 def __str__(self):
2503 s = oct(self)
2504 if s[-1] == 'L':
2505 s = s[:-1]
2506 return s
2507 def __add__(self, other):
2508 return self.__class__(super(octlong, self).__add__(other))
2509 __radd__ = __add__
2510 self.assertEqual(str(octlong(3) + 5), "010")
2511 # (Note that overriding __radd__ here only seems to work
2512 # because the example uses a short int left argument.)
2513 self.assertEqual(str(5 + octlong(3000)), "05675")
2514 a = octlong(12345)
2515 self.assertEqual(a, 12345L)
2516 self.assertEqual(long(a), 12345L)
2517 self.assertEqual(hash(a), hash(12345L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002518 self.assertTrue(long(a).__class__ is long)
2519 self.assertTrue((+a).__class__ is long)
2520 self.assertTrue((-a).__class__ is long)
2521 self.assertTrue((-octlong(0)).__class__ is long)
2522 self.assertTrue((a >> 0).__class__ is long)
2523 self.assertTrue((a << 0).__class__ is long)
2524 self.assertTrue((a - 0).__class__ is long)
2525 self.assertTrue((a * 1).__class__ is long)
2526 self.assertTrue((a ** 1).__class__ is long)
2527 self.assertTrue((a // 1).__class__ is long)
2528 self.assertTrue((1 * a).__class__ is long)
2529 self.assertTrue((a | 0).__class__ is long)
2530 self.assertTrue((a ^ 0).__class__ is long)
2531 self.assertTrue((a & -1L).__class__ is long)
2532 self.assertTrue((octlong(0) << 12).__class__ is long)
2533 self.assertTrue((octlong(0) >> 12).__class__ is long)
2534 self.assertTrue(abs(octlong(0)).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002535
2536 # Because octlong overrides __add__, we can't check the absence of +0
2537 # optimizations using octlong.
2538 class longclone(long):
2539 pass
2540 a = longclone(1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002541 self.assertTrue((a + 0).__class__ is long)
2542 self.assertTrue((0 + a).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002543
2544 # Check that negative clones don't segfault
2545 a = longclone(-1)
2546 self.assertEqual(a.__dict__, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002547 self.assertEqual(long(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl48545522008-02-02 10:12:36 +00002548
2549 class precfloat(float):
2550 __slots__ = ['prec']
2551 def __init__(self, value=0.0, prec=12):
2552 self.prec = int(prec)
2553 def __repr__(self):
2554 return "%.*g" % (self.prec, self)
2555 self.assertEqual(repr(precfloat(1.1)), "1.1")
2556 a = precfloat(12345)
2557 self.assertEqual(a, 12345.0)
2558 self.assertEqual(float(a), 12345.0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002559 self.assertTrue(float(a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002560 self.assertEqual(hash(a), hash(12345.0))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002561 self.assertTrue((+a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002562
2563 class madcomplex(complex):
2564 def __repr__(self):
2565 return "%.17gj%+.17g" % (self.imag, self.real)
2566 a = madcomplex(-3, 4)
2567 self.assertEqual(repr(a), "4j-3")
2568 base = complex(-3, 4)
2569 self.assertEqual(base.__class__, complex)
2570 self.assertEqual(a, base)
2571 self.assertEqual(complex(a), base)
2572 self.assertEqual(complex(a).__class__, complex)
2573 a = madcomplex(a) # just trying another form of the constructor
2574 self.assertEqual(repr(a), "4j-3")
2575 self.assertEqual(a, base)
2576 self.assertEqual(complex(a), base)
2577 self.assertEqual(complex(a).__class__, complex)
2578 self.assertEqual(hash(a), hash(base))
2579 self.assertEqual((+a).__class__, complex)
2580 self.assertEqual((a + 0).__class__, complex)
2581 self.assertEqual(a + 0, base)
2582 self.assertEqual((a - 0).__class__, complex)
2583 self.assertEqual(a - 0, base)
2584 self.assertEqual((a * 1).__class__, complex)
2585 self.assertEqual(a * 1, base)
2586 self.assertEqual((a / 1).__class__, complex)
2587 self.assertEqual(a / 1, base)
2588
2589 class madtuple(tuple):
2590 _rev = None
2591 def rev(self):
2592 if self._rev is not None:
2593 return self._rev
2594 L = list(self)
2595 L.reverse()
2596 self._rev = self.__class__(L)
2597 return self._rev
2598 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2599 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2600 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2601 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2602 for i in range(512):
2603 t = madtuple(range(i))
2604 u = t.rev()
2605 v = u.rev()
2606 self.assertEqual(v, t)
2607 a = madtuple((1,2,3,4,5))
2608 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002609 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002610 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002611 self.assertTrue(a[:].__class__ is tuple)
2612 self.assertTrue((a * 1).__class__ is tuple)
2613 self.assertTrue((a * 0).__class__ is tuple)
2614 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002615 a = madtuple(())
2616 self.assertEqual(tuple(a), ())
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002617 self.assertTrue(tuple(a).__class__ is tuple)
2618 self.assertTrue((a + a).__class__ is tuple)
2619 self.assertTrue((a * 0).__class__ is tuple)
2620 self.assertTrue((a * 1).__class__ is tuple)
2621 self.assertTrue((a * 2).__class__ is tuple)
2622 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002623
2624 class madstring(str):
2625 _rev = None
2626 def rev(self):
2627 if self._rev is not None:
2628 return self._rev
2629 L = list(self)
2630 L.reverse()
2631 self._rev = self.__class__("".join(L))
2632 return self._rev
2633 s = madstring("abcdefghijklmnopqrstuvwxyz")
2634 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2635 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2636 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2637 for i in range(256):
2638 s = madstring("".join(map(chr, range(i))))
2639 t = s.rev()
2640 u = t.rev()
2641 self.assertEqual(u, s)
2642 s = madstring("12345")
2643 self.assertEqual(str(s), "12345")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002644 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002645
2646 base = "\x00" * 5
2647 s = madstring(base)
2648 self.assertEqual(s, base)
2649 self.assertEqual(str(s), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002650 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002651 self.assertEqual(hash(s), hash(base))
2652 self.assertEqual({s: 1}[base], 1)
2653 self.assertEqual({base: 1}[s], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002654 self.assertTrue((s + "").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002655 self.assertEqual(s + "", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002656 self.assertTrue(("" + s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002657 self.assertEqual("" + s, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002658 self.assertTrue((s * 0).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002659 self.assertEqual(s * 0, "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002660 self.assertTrue((s * 1).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002661 self.assertEqual(s * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002662 self.assertTrue((s * 2).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002663 self.assertEqual(s * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002664 self.assertTrue(s[:].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002665 self.assertEqual(s[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002666 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002667 self.assertEqual(s[0:0], "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002668 self.assertTrue(s.strip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002669 self.assertEqual(s.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002670 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002671 self.assertEqual(s.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002672 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002673 self.assertEqual(s.rstrip(), base)
2674 identitytab = ''.join([chr(i) for i in range(256)])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002675 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002676 self.assertEqual(s.translate(identitytab), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002677 self.assertTrue(s.translate(identitytab, "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002678 self.assertEqual(s.translate(identitytab, "x"), base)
2679 self.assertEqual(s.translate(identitytab, "\x00"), "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002680 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002681 self.assertEqual(s.replace("x", "x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002682 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002683 self.assertEqual(s.ljust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002684 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002685 self.assertEqual(s.rjust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002686 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002687 self.assertEqual(s.center(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002688 self.assertTrue(s.lower().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002689 self.assertEqual(s.lower(), base)
2690
2691 class madunicode(unicode):
2692 _rev = None
2693 def rev(self):
2694 if self._rev is not None:
2695 return self._rev
2696 L = list(self)
2697 L.reverse()
2698 self._rev = self.__class__(u"".join(L))
2699 return self._rev
2700 u = madunicode("ABCDEF")
2701 self.assertEqual(u, u"ABCDEF")
2702 self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
2703 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
2704 base = u"12345"
2705 u = madunicode(base)
2706 self.assertEqual(unicode(u), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002707 self.assertTrue(unicode(u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002708 self.assertEqual(hash(u), hash(base))
2709 self.assertEqual({u: 1}[base], 1)
2710 self.assertEqual({base: 1}[u], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002711 self.assertTrue(u.strip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002712 self.assertEqual(u.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002713 self.assertTrue(u.lstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002714 self.assertEqual(u.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002715 self.assertTrue(u.rstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002716 self.assertEqual(u.rstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002717 self.assertTrue(u.replace(u"x", u"x").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002718 self.assertEqual(u.replace(u"x", u"x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002719 self.assertTrue(u.replace(u"xy", u"xy").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002720 self.assertEqual(u.replace(u"xy", u"xy"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002721 self.assertTrue(u.center(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002722 self.assertEqual(u.center(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002723 self.assertTrue(u.ljust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002724 self.assertEqual(u.ljust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002725 self.assertTrue(u.rjust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002726 self.assertEqual(u.rjust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002727 self.assertTrue(u.lower().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002728 self.assertEqual(u.lower(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002729 self.assertTrue(u.upper().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002730 self.assertEqual(u.upper(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002731 self.assertTrue(u.capitalize().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002732 self.assertEqual(u.capitalize(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002733 self.assertTrue(u.title().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002734 self.assertEqual(u.title(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002735 self.assertTrue((u + u"").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002736 self.assertEqual(u + u"", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002737 self.assertTrue((u"" + u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002738 self.assertEqual(u"" + u, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002739 self.assertTrue((u * 0).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002740 self.assertEqual(u * 0, u"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002741 self.assertTrue((u * 1).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002742 self.assertEqual(u * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002743 self.assertTrue((u * 2).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002744 self.assertEqual(u * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002745 self.assertTrue(u[:].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002746 self.assertEqual(u[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002747 self.assertTrue(u[0:0].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002748 self.assertEqual(u[0:0], u"")
2749
2750 class sublist(list):
2751 pass
2752 a = sublist(range(5))
2753 self.assertEqual(a, range(5))
2754 a.append("hello")
2755 self.assertEqual(a, range(5) + ["hello"])
2756 a[5] = 5
2757 self.assertEqual(a, range(6))
2758 a.extend(range(6, 20))
2759 self.assertEqual(a, range(20))
2760 a[-5:] = []
2761 self.assertEqual(a, range(15))
2762 del a[10:15]
2763 self.assertEqual(len(a), 10)
2764 self.assertEqual(a, range(10))
2765 self.assertEqual(list(a), range(10))
2766 self.assertEqual(a[0], 0)
2767 self.assertEqual(a[9], 9)
2768 self.assertEqual(a[-10], 0)
2769 self.assertEqual(a[-1], 9)
2770 self.assertEqual(a[:5], range(5))
2771
2772 class CountedInput(file):
2773 """Counts lines read by self.readline().
2774
2775 self.lineno is the 0-based ordinal of the last line read, up to
2776 a maximum of one greater than the number of lines in the file.
2777
2778 self.ateof is true if and only if the final "" line has been read,
2779 at which point self.lineno stops incrementing, and further calls
2780 to readline() continue to return "".
2781 """
2782
2783 lineno = 0
2784 ateof = 0
2785 def readline(self):
2786 if self.ateof:
2787 return ""
2788 s = file.readline(self)
2789 # Next line works too.
2790 # s = super(CountedInput, self).readline()
2791 self.lineno += 1
2792 if s == "":
2793 self.ateof = 1
2794 return s
2795
2796 f = file(name=test_support.TESTFN, mode='w')
2797 lines = ['a\n', 'b\n', 'c\n']
2798 try:
2799 f.writelines(lines)
2800 f.close()
2801 f = CountedInput(test_support.TESTFN)
2802 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2803 got = f.readline()
2804 self.assertEqual(expected, got)
2805 self.assertEqual(f.lineno, i)
2806 self.assertEqual(f.ateof, (i > len(lines)))
2807 f.close()
2808 finally:
2809 try:
2810 f.close()
2811 except:
2812 pass
2813 test_support.unlink(test_support.TESTFN)
2814
2815 def test_keywords(self):
2816 # Testing keyword args to basic type constructors ...
2817 self.assertEqual(int(x=1), 1)
2818 self.assertEqual(float(x=2), 2.0)
2819 self.assertEqual(long(x=3), 3L)
2820 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2821 self.assertEqual(str(object=500), '500')
2822 self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
2823 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2824 self.assertEqual(list(sequence=(0, 1, 2)), range(3))
2825 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2826
2827 for constructor in (int, float, long, complex, str, unicode,
2828 tuple, list, file):
2829 try:
2830 constructor(bogus_keyword_arg=1)
2831 except TypeError:
2832 pass
2833 else:
2834 self.fail("expected TypeError from bogus keyword argument to %r"
2835 % constructor)
2836
2837 def test_str_subclass_as_dict_key(self):
2838 # Testing a str subclass used as dict key ..
2839
2840 class cistr(str):
2841 """Sublcass of str that computes __eq__ case-insensitively.
2842
2843 Also computes a hash code of the string in canonical form.
2844 """
2845
2846 def __init__(self, value):
2847 self.canonical = value.lower()
2848 self.hashcode = hash(self.canonical)
2849
2850 def __eq__(self, other):
2851 if not isinstance(other, cistr):
2852 other = cistr(other)
2853 return self.canonical == other.canonical
2854
2855 def __hash__(self):
2856 return self.hashcode
2857
2858 self.assertEqual(cistr('ABC'), 'abc')
2859 self.assertEqual('aBc', cistr('ABC'))
2860 self.assertEqual(str(cistr('ABC')), 'ABC')
2861
2862 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2863 self.assertEqual(d[cistr('one')], 1)
2864 self.assertEqual(d[cistr('tWo')], 2)
2865 self.assertEqual(d[cistr('THrEE')], 3)
Ezio Melottiaa980582010-01-23 23:04:36 +00002866 self.assertIn(cistr('ONe'), d)
Georg Brandl48545522008-02-02 10:12:36 +00002867 self.assertEqual(d.get(cistr('thrEE')), 3)
2868
2869 def test_classic_comparisons(self):
2870 # Testing classic comparisons...
2871 class classic:
2872 pass
2873
2874 for base in (classic, int, object):
2875 class C(base):
2876 def __init__(self, value):
2877 self.value = int(value)
2878 def __cmp__(self, other):
2879 if isinstance(other, C):
2880 return cmp(self.value, other.value)
2881 if isinstance(other, int) or isinstance(other, long):
2882 return cmp(self.value, other)
2883 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002884 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002885
2886 c1 = C(1)
2887 c2 = C(2)
2888 c3 = C(3)
2889 self.assertEqual(c1, 1)
2890 c = {1: c1, 2: c2, 3: c3}
2891 for x in 1, 2, 3:
2892 for y in 1, 2, 3:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002893 self.assertTrue(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002894 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002895 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002896 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002897 self.assertTrue(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2898 self.assertTrue(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002899
2900 def test_rich_comparisons(self):
2901 # Testing rich comparisons...
2902 class Z(complex):
2903 pass
2904 z = Z(1)
2905 self.assertEqual(z, 1+0j)
2906 self.assertEqual(1+0j, z)
2907 class ZZ(complex):
2908 def __eq__(self, other):
2909 try:
2910 return abs(self - other) <= 1e-6
2911 except:
2912 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002913 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002914 zz = ZZ(1.0000003)
2915 self.assertEqual(zz, 1+0j)
2916 self.assertEqual(1+0j, zz)
2917
2918 class classic:
2919 pass
2920 for base in (classic, int, object, list):
2921 class C(base):
2922 def __init__(self, value):
2923 self.value = int(value)
2924 def __cmp__(self_, other):
2925 self.fail("shouldn't call __cmp__")
Nick Coghlan48361f52008-08-11 15:45:58 +00002926 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002927 def __eq__(self, other):
2928 if isinstance(other, C):
2929 return self.value == other.value
2930 if isinstance(other, int) or isinstance(other, long):
2931 return self.value == other
2932 return NotImplemented
2933 def __ne__(self, other):
2934 if isinstance(other, C):
2935 return self.value != other.value
2936 if isinstance(other, int) or isinstance(other, long):
2937 return self.value != other
2938 return NotImplemented
2939 def __lt__(self, other):
2940 if isinstance(other, C):
2941 return self.value < other.value
2942 if isinstance(other, int) or isinstance(other, long):
2943 return self.value < other
2944 return NotImplemented
2945 def __le__(self, other):
2946 if isinstance(other, C):
2947 return self.value <= other.value
2948 if isinstance(other, int) or isinstance(other, long):
2949 return self.value <= other
2950 return NotImplemented
2951 def __gt__(self, other):
2952 if isinstance(other, C):
2953 return self.value > other.value
2954 if isinstance(other, int) or isinstance(other, long):
2955 return self.value > other
2956 return NotImplemented
2957 def __ge__(self, other):
2958 if isinstance(other, C):
2959 return self.value >= other.value
2960 if isinstance(other, int) or isinstance(other, long):
2961 return self.value >= other
2962 return NotImplemented
2963 c1 = C(1)
2964 c2 = C(2)
2965 c3 = C(3)
2966 self.assertEqual(c1, 1)
2967 c = {1: c1, 2: c2, 3: c3}
2968 for x in 1, 2, 3:
2969 for y in 1, 2, 3:
2970 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002971 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002972 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002973 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002974 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002975 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002976 "x=%d, y=%d" % (x, y))
2977
2978 def test_coercions(self):
2979 # Testing coercions...
2980 class I(int): pass
2981 coerce(I(0), 0)
2982 coerce(0, I(0))
2983 class L(long): pass
2984 coerce(L(0), 0)
2985 coerce(L(0), 0L)
2986 coerce(0, L(0))
2987 coerce(0L, L(0))
2988 class F(float): pass
2989 coerce(F(0), 0)
2990 coerce(F(0), 0L)
2991 coerce(F(0), 0.)
2992 coerce(0, F(0))
2993 coerce(0L, F(0))
2994 coerce(0., F(0))
2995 class C(complex): pass
2996 coerce(C(0), 0)
2997 coerce(C(0), 0L)
2998 coerce(C(0), 0.)
2999 coerce(C(0), 0j)
3000 coerce(0, C(0))
3001 coerce(0L, C(0))
3002 coerce(0., C(0))
3003 coerce(0j, C(0))
3004
3005 def test_descrdoc(self):
3006 # Testing descriptor doc strings...
3007 def check(descr, what):
3008 self.assertEqual(descr.__doc__, what)
3009 check(file.closed, "True if the file is closed") # getset descriptor
3010 check(file.name, "file name") # member descriptor
3011
3012 def test_doc_descriptor(self):
3013 # Testing __doc__ descriptor...
3014 # SF bug 542984
3015 class DocDescr(object):
3016 def __get__(self, object, otype):
3017 if object:
3018 object = object.__class__.__name__ + ' instance'
3019 if otype:
3020 otype = otype.__name__
3021 return 'object=%s; type=%s' % (object, otype)
3022 class OldClass:
3023 __doc__ = DocDescr()
3024 class NewClass(object):
3025 __doc__ = DocDescr()
3026 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
3027 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3028 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
3029 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3030
3031 def test_set_class(self):
3032 # Testing __class__ assignment...
3033 class C(object): pass
3034 class D(object): pass
3035 class E(object): pass
3036 class F(D, E): pass
3037 for cls in C, D, E, F:
3038 for cls2 in C, D, E, F:
3039 x = cls()
3040 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003041 self.assertTrue(x.__class__ is cls2)
Georg Brandl48545522008-02-02 10:12:36 +00003042 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003043 self.assertTrue(x.__class__ is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003044 def cant(x, C):
3045 try:
3046 x.__class__ = C
3047 except TypeError:
3048 pass
3049 else:
3050 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
3051 try:
3052 delattr(x, "__class__")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003053 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003054 pass
3055 else:
3056 self.fail("shouldn't allow del %r.__class__" % x)
3057 cant(C(), list)
3058 cant(list(), C)
3059 cant(C(), 1)
3060 cant(C(), object)
3061 cant(object(), list)
3062 cant(list(), object)
3063 class Int(int): __slots__ = []
3064 cant(2, Int)
3065 cant(Int(), int)
3066 cant(True, int)
3067 cant(2, bool)
3068 o = object()
3069 cant(o, type(1))
3070 cant(o, type(None))
3071 del o
3072 class G(object):
3073 __slots__ = ["a", "b"]
3074 class H(object):
3075 __slots__ = ["b", "a"]
3076 try:
3077 unicode
3078 except NameError:
3079 class I(object):
3080 __slots__ = ["a", "b"]
3081 else:
3082 class I(object):
3083 __slots__ = [unicode("a"), unicode("b")]
3084 class J(object):
3085 __slots__ = ["c", "b"]
3086 class K(object):
3087 __slots__ = ["a", "b", "d"]
3088 class L(H):
3089 __slots__ = ["e"]
3090 class M(I):
3091 __slots__ = ["e"]
3092 class N(J):
3093 __slots__ = ["__weakref__"]
3094 class P(J):
3095 __slots__ = ["__dict__"]
3096 class Q(J):
3097 pass
3098 class R(J):
3099 __slots__ = ["__dict__", "__weakref__"]
3100
3101 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
3102 x = cls()
3103 x.a = 1
3104 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003105 self.assertTrue(x.__class__ is cls2,
Georg Brandl48545522008-02-02 10:12:36 +00003106 "assigning %r as __class__ for %r silently failed" % (cls2, x))
3107 self.assertEqual(x.a, 1)
3108 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003109 self.assertTrue(x.__class__ is cls,
Georg Brandl48545522008-02-02 10:12:36 +00003110 "assigning %r as __class__ for %r silently failed" % (cls, x))
3111 self.assertEqual(x.a, 1)
3112 for cls in G, J, K, L, M, N, P, R, list, Int:
3113 for cls2 in G, J, K, L, M, N, P, R, list, Int:
3114 if cls is cls2:
3115 continue
3116 cant(cls(), cls2)
3117
Benjamin Peterson5083dc52009-04-25 00:41:22 +00003118 # Issue5283: when __class__ changes in __del__, the wrong
3119 # type gets DECREF'd.
3120 class O(object):
3121 pass
3122 class A(object):
3123 def __del__(self):
3124 self.__class__ = O
3125 l = [A() for x in range(100)]
3126 del l
3127
Georg Brandl48545522008-02-02 10:12:36 +00003128 def test_set_dict(self):
3129 # Testing __dict__ assignment...
3130 class C(object): pass
3131 a = C()
3132 a.__dict__ = {'b': 1}
3133 self.assertEqual(a.b, 1)
3134 def cant(x, dict):
3135 try:
3136 x.__dict__ = dict
3137 except (AttributeError, TypeError):
3138 pass
3139 else:
3140 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
3141 cant(a, None)
3142 cant(a, [])
3143 cant(a, 1)
3144 del a.__dict__ # Deleting __dict__ is allowed
3145
3146 class Base(object):
3147 pass
3148 def verify_dict_readonly(x):
3149 """
3150 x has to be an instance of a class inheriting from Base.
3151 """
3152 cant(x, {})
3153 try:
3154 del x.__dict__
3155 except (AttributeError, TypeError):
3156 pass
3157 else:
3158 self.fail("shouldn't allow del %r.__dict__" % x)
3159 dict_descr = Base.__dict__["__dict__"]
3160 try:
3161 dict_descr.__set__(x, {})
3162 except (AttributeError, TypeError):
3163 pass
3164 else:
3165 self.fail("dict_descr allowed access to %r's dict" % x)
3166
3167 # Classes don't allow __dict__ assignment and have readonly dicts
3168 class Meta1(type, Base):
3169 pass
3170 class Meta2(Base, type):
3171 pass
3172 class D(object):
3173 __metaclass__ = Meta1
3174 class E(object):
3175 __metaclass__ = Meta2
3176 for cls in C, D, E:
3177 verify_dict_readonly(cls)
3178 class_dict = cls.__dict__
3179 try:
3180 class_dict["spam"] = "eggs"
3181 except TypeError:
3182 pass
3183 else:
3184 self.fail("%r's __dict__ can be modified" % cls)
3185
3186 # Modules also disallow __dict__ assignment
3187 class Module1(types.ModuleType, Base):
3188 pass
3189 class Module2(Base, types.ModuleType):
3190 pass
3191 for ModuleType in Module1, Module2:
3192 mod = ModuleType("spam")
3193 verify_dict_readonly(mod)
3194 mod.__dict__["spam"] = "eggs"
3195
3196 # Exception's __dict__ can be replaced, but not deleted
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003197 # (at least not any more than regular exception's __dict__ can
3198 # be deleted; on CPython it is not the case, whereas on PyPy they
3199 # can, just like any other new-style instance's __dict__.)
3200 def can_delete_dict(e):
3201 try:
3202 del e.__dict__
3203 except (TypeError, AttributeError):
3204 return False
3205 else:
3206 return True
Georg Brandl48545522008-02-02 10:12:36 +00003207 class Exception1(Exception, Base):
3208 pass
3209 class Exception2(Base, Exception):
3210 pass
3211 for ExceptionType in Exception, Exception1, Exception2:
3212 e = ExceptionType()
3213 e.__dict__ = {"a": 1}
3214 self.assertEqual(e.a, 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003215 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl48545522008-02-02 10:12:36 +00003216
3217 def test_pickles(self):
3218 # Testing pickling and copying new-style classes and objects...
3219 import pickle, cPickle
3220
3221 def sorteditems(d):
3222 L = d.items()
3223 L.sort()
3224 return L
3225
3226 global C
3227 class C(object):
3228 def __init__(self, a, b):
3229 super(C, self).__init__()
3230 self.a = a
3231 self.b = b
3232 def __repr__(self):
3233 return "C(%r, %r)" % (self.a, self.b)
3234
3235 global C1
3236 class C1(list):
3237 def __new__(cls, a, b):
3238 return super(C1, cls).__new__(cls)
3239 def __getnewargs__(self):
3240 return (self.a, self.b)
3241 def __init__(self, a, b):
3242 self.a = a
3243 self.b = b
3244 def __repr__(self):
3245 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3246
3247 global C2
3248 class C2(int):
3249 def __new__(cls, a, b, val=0):
3250 return super(C2, cls).__new__(cls, val)
3251 def __getnewargs__(self):
3252 return (self.a, self.b, int(self))
3253 def __init__(self, a, b, val=0):
3254 self.a = a
3255 self.b = b
3256 def __repr__(self):
3257 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3258
3259 global C3
3260 class C3(object):
3261 def __init__(self, foo):
3262 self.foo = foo
3263 def __getstate__(self):
3264 return self.foo
3265 def __setstate__(self, foo):
3266 self.foo = foo
3267
3268 global C4classic, C4
3269 class C4classic: # classic
3270 pass
3271 class C4(C4classic, object): # mixed inheritance
3272 pass
3273
3274 for p in pickle, cPickle:
3275 for bin in 0, 1:
3276 for cls in C, C1, C2:
3277 s = p.dumps(cls, bin)
3278 cls2 = p.loads(s)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003279 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003280
3281 a = C1(1, 2); a.append(42); a.append(24)
3282 b = C2("hello", "world", 42)
3283 s = p.dumps((a, b), bin)
3284 x, y = p.loads(s)
3285 self.assertEqual(x.__class__, a.__class__)
3286 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3287 self.assertEqual(y.__class__, b.__class__)
3288 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3289 self.assertEqual(repr(x), repr(a))
3290 self.assertEqual(repr(y), repr(b))
3291 # Test for __getstate__ and __setstate__ on new style class
3292 u = C3(42)
3293 s = p.dumps(u, bin)
3294 v = p.loads(s)
3295 self.assertEqual(u.__class__, v.__class__)
3296 self.assertEqual(u.foo, v.foo)
3297 # Test for picklability of hybrid class
3298 u = C4()
3299 u.foo = 42
3300 s = p.dumps(u, bin)
3301 v = p.loads(s)
3302 self.assertEqual(u.__class__, v.__class__)
3303 self.assertEqual(u.foo, v.foo)
3304
3305 # Testing copy.deepcopy()
3306 import copy
3307 for cls in C, C1, C2:
3308 cls2 = copy.deepcopy(cls)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003309 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003310
3311 a = C1(1, 2); a.append(42); a.append(24)
3312 b = C2("hello", "world", 42)
3313 x, y = copy.deepcopy((a, b))
3314 self.assertEqual(x.__class__, a.__class__)
3315 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3316 self.assertEqual(y.__class__, b.__class__)
3317 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3318 self.assertEqual(repr(x), repr(a))
3319 self.assertEqual(repr(y), repr(b))
3320
3321 def test_pickle_slots(self):
3322 # Testing pickling of classes with __slots__ ...
3323 import pickle, cPickle
3324 # Pickling of classes with __slots__ but without __getstate__ should fail
3325 global B, C, D, E
3326 class B(object):
3327 pass
3328 for base in [object, B]:
3329 class C(base):
3330 __slots__ = ['a']
3331 class D(C):
3332 pass
3333 try:
3334 pickle.dumps(C())
3335 except TypeError:
3336 pass
3337 else:
3338 self.fail("should fail: pickle C instance - %s" % base)
3339 try:
3340 cPickle.dumps(C())
3341 except TypeError:
3342 pass
3343 else:
3344 self.fail("should fail: cPickle C instance - %s" % base)
3345 try:
3346 pickle.dumps(C())
3347 except TypeError:
3348 pass
3349 else:
3350 self.fail("should fail: pickle D instance - %s" % base)
3351 try:
3352 cPickle.dumps(D())
3353 except TypeError:
3354 pass
3355 else:
3356 self.fail("should fail: cPickle D instance - %s" % base)
3357 # Give C a nice generic __getstate__ and __setstate__
3358 class C(base):
3359 __slots__ = ['a']
3360 def __getstate__(self):
3361 try:
3362 d = self.__dict__.copy()
3363 except AttributeError:
3364 d = {}
3365 for cls in self.__class__.__mro__:
3366 for sn in cls.__dict__.get('__slots__', ()):
3367 try:
3368 d[sn] = getattr(self, sn)
3369 except AttributeError:
3370 pass
3371 return d
3372 def __setstate__(self, d):
3373 for k, v in d.items():
3374 setattr(self, k, v)
3375 class D(C):
3376 pass
3377 # Now it should work
3378 x = C()
3379 y = pickle.loads(pickle.dumps(x))
3380 self.assertEqual(hasattr(y, 'a'), 0)
3381 y = cPickle.loads(cPickle.dumps(x))
3382 self.assertEqual(hasattr(y, 'a'), 0)
3383 x.a = 42
3384 y = pickle.loads(pickle.dumps(x))
3385 self.assertEqual(y.a, 42)
3386 y = cPickle.loads(cPickle.dumps(x))
3387 self.assertEqual(y.a, 42)
3388 x = D()
3389 x.a = 42
3390 x.b = 100
3391 y = pickle.loads(pickle.dumps(x))
3392 self.assertEqual(y.a + y.b, 142)
3393 y = cPickle.loads(cPickle.dumps(x))
3394 self.assertEqual(y.a + y.b, 142)
3395 # A subclass that adds a slot should also work
3396 class E(C):
3397 __slots__ = ['b']
3398 x = E()
3399 x.a = 42
3400 x.b = "foo"
3401 y = pickle.loads(pickle.dumps(x))
3402 self.assertEqual(y.a, x.a)
3403 self.assertEqual(y.b, x.b)
3404 y = cPickle.loads(cPickle.dumps(x))
3405 self.assertEqual(y.a, x.a)
3406 self.assertEqual(y.b, x.b)
3407
3408 def test_binary_operator_override(self):
3409 # Testing overrides of binary operations...
3410 class I(int):
3411 def __repr__(self):
3412 return "I(%r)" % int(self)
3413 def __add__(self, other):
3414 return I(int(self) + int(other))
3415 __radd__ = __add__
3416 def __pow__(self, other, mod=None):
3417 if mod is None:
3418 return I(pow(int(self), int(other)))
3419 else:
3420 return I(pow(int(self), int(other), int(mod)))
3421 def __rpow__(self, other, mod=None):
3422 if mod is None:
3423 return I(pow(int(other), int(self), mod))
3424 else:
3425 return I(pow(int(other), int(self), int(mod)))
3426
3427 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3428 self.assertEqual(repr(I(1) + 2), "I(3)")
3429 self.assertEqual(repr(1 + I(2)), "I(3)")
3430 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3431 self.assertEqual(repr(2 ** I(3)), "I(8)")
3432 self.assertEqual(repr(I(2) ** 3), "I(8)")
3433 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3434 class S(str):
3435 def __eq__(self, other):
3436 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003437 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003438
3439 def test_subclass_propagation(self):
3440 # Testing propagation of slot functions to subclasses...
3441 class A(object):
3442 pass
3443 class B(A):
3444 pass
3445 class C(A):
3446 pass
3447 class D(B, C):
3448 pass
3449 d = D()
3450 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3451 A.__hash__ = lambda self: 42
3452 self.assertEqual(hash(d), 42)
3453 C.__hash__ = lambda self: 314
3454 self.assertEqual(hash(d), 314)
3455 B.__hash__ = lambda self: 144
3456 self.assertEqual(hash(d), 144)
3457 D.__hash__ = lambda self: 100
3458 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003459 D.__hash__ = None
3460 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003461 del D.__hash__
3462 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003463 B.__hash__ = None
3464 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003465 del B.__hash__
3466 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003467 C.__hash__ = None
3468 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003469 del C.__hash__
3470 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003471 A.__hash__ = None
3472 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003473 del A.__hash__
3474 self.assertEqual(hash(d), orig_hash)
3475 d.foo = 42
3476 d.bar = 42
3477 self.assertEqual(d.foo, 42)
3478 self.assertEqual(d.bar, 42)
3479 def __getattribute__(self, name):
3480 if name == "foo":
3481 return 24
3482 return object.__getattribute__(self, name)
3483 A.__getattribute__ = __getattribute__
3484 self.assertEqual(d.foo, 24)
3485 self.assertEqual(d.bar, 42)
3486 def __getattr__(self, name):
3487 if name in ("spam", "foo", "bar"):
3488 return "hello"
3489 raise AttributeError, name
3490 B.__getattr__ = __getattr__
3491 self.assertEqual(d.spam, "hello")
3492 self.assertEqual(d.foo, 24)
3493 self.assertEqual(d.bar, 42)
3494 del A.__getattribute__
3495 self.assertEqual(d.foo, 42)
3496 del d.foo
3497 self.assertEqual(d.foo, "hello")
3498 self.assertEqual(d.bar, 42)
3499 del B.__getattr__
3500 try:
3501 d.foo
3502 except AttributeError:
3503 pass
3504 else:
3505 self.fail("d.foo should be undefined now")
3506
3507 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl48545522008-02-02 10:12:36 +00003508 class A(object):
3509 pass
3510 class B(A):
3511 pass
3512 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003513 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003514 A.__setitem__ = lambda *a: None # crash
3515
3516 def test_buffer_inheritance(self):
3517 # Testing that buffer interface is inherited ...
3518
3519 import binascii
3520 # SF bug [#470040] ParseTuple t# vs subclasses.
3521
3522 class MyStr(str):
3523 pass
3524 base = 'abc'
3525 m = MyStr(base)
3526 # b2a_hex uses the buffer interface to get its argument's value, via
3527 # PyArg_ParseTuple 't#' code.
3528 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3529
3530 # It's not clear that unicode will continue to support the character
3531 # buffer interface, and this test will fail if that's taken away.
3532 class MyUni(unicode):
3533 pass
3534 base = u'abc'
3535 m = MyUni(base)
3536 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3537
3538 class MyInt(int):
3539 pass
3540 m = MyInt(42)
3541 try:
3542 binascii.b2a_hex(m)
3543 self.fail('subclass of int should not have a buffer interface')
3544 except TypeError:
3545 pass
3546
3547 def test_str_of_str_subclass(self):
3548 # Testing __str__ defined in subclass of str ...
3549 import binascii
3550 import cStringIO
3551
3552 class octetstring(str):
3553 def __str__(self):
3554 return binascii.b2a_hex(self)
3555 def __repr__(self):
3556 return self + " repr"
3557
3558 o = octetstring('A')
3559 self.assertEqual(type(o), octetstring)
3560 self.assertEqual(type(str(o)), str)
3561 self.assertEqual(type(repr(o)), str)
3562 self.assertEqual(ord(o), 0x41)
3563 self.assertEqual(str(o), '41')
3564 self.assertEqual(repr(o), 'A repr')
3565 self.assertEqual(o.__str__(), '41')
3566 self.assertEqual(o.__repr__(), 'A repr')
3567
3568 capture = cStringIO.StringIO()
3569 # Calling str() or not exercises different internal paths.
3570 print >> capture, o
3571 print >> capture, str(o)
3572 self.assertEqual(capture.getvalue(), '41\n41\n')
3573 capture.close()
3574
3575 def test_keyword_arguments(self):
3576 # Testing keyword arguments to __init__, __call__...
3577 def f(a): return a
3578 self.assertEqual(f.__call__(a=42), 42)
3579 a = []
3580 list.__init__(a, sequence=[0, 1, 2])
3581 self.assertEqual(a, [0, 1, 2])
3582
3583 def test_recursive_call(self):
3584 # Testing recursive __call__() by setting to instance of class...
3585 class A(object):
3586 pass
3587
3588 A.__call__ = A()
3589 try:
3590 A()()
3591 except RuntimeError:
3592 pass
3593 else:
3594 self.fail("Recursion limit should have been reached for __call__()")
3595
3596 def test_delete_hook(self):
3597 # Testing __del__ hook...
3598 log = []
3599 class C(object):
3600 def __del__(self):
3601 log.append(1)
3602 c = C()
3603 self.assertEqual(log, [])
3604 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003605 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003606 self.assertEqual(log, [1])
3607
3608 class D(object): pass
3609 d = D()
3610 try: del d[0]
3611 except TypeError: pass
3612 else: self.fail("invalid del() didn't raise TypeError")
3613
3614 def test_hash_inheritance(self):
3615 # Testing hash of mutable subclasses...
3616
3617 class mydict(dict):
3618 pass
3619 d = mydict()
3620 try:
3621 hash(d)
3622 except TypeError:
3623 pass
3624 else:
3625 self.fail("hash() of dict subclass should fail")
3626
3627 class mylist(list):
3628 pass
3629 d = mylist()
3630 try:
3631 hash(d)
3632 except TypeError:
3633 pass
3634 else:
3635 self.fail("hash() of list subclass should fail")
3636
3637 def test_str_operations(self):
3638 try: 'a' + 5
3639 except TypeError: pass
3640 else: self.fail("'' + 5 doesn't raise TypeError")
3641
3642 try: ''.split('')
3643 except ValueError: pass
3644 else: self.fail("''.split('') doesn't raise ValueError")
3645
3646 try: ''.join([0])
3647 except TypeError: pass
3648 else: self.fail("''.join([0]) doesn't raise TypeError")
3649
3650 try: ''.rindex('5')
3651 except ValueError: pass
3652 else: self.fail("''.rindex('5') doesn't raise ValueError")
3653
3654 try: '%(n)s' % None
3655 except TypeError: pass
3656 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3657
3658 try: '%(n' % {}
3659 except ValueError: pass
3660 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3661
3662 try: '%*s' % ('abc')
3663 except TypeError: pass
3664 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3665
3666 try: '%*.*s' % ('abc', 5)
3667 except TypeError: pass
3668 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3669
3670 try: '%s' % (1, 2)
3671 except TypeError: pass
3672 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3673
3674 try: '%' % None
3675 except ValueError: pass
3676 else: self.fail("'%' % None doesn't raise ValueError")
3677
3678 self.assertEqual('534253'.isdigit(), 1)
3679 self.assertEqual('534253x'.isdigit(), 0)
3680 self.assertEqual('%c' % 5, '\x05')
3681 self.assertEqual('%c' % '5', '5')
3682
3683 def test_deepcopy_recursive(self):
3684 # Testing deepcopy of recursive objects...
3685 class Node:
3686 pass
3687 a = Node()
3688 b = Node()
3689 a.b = b
3690 b.a = a
3691 z = deepcopy(a) # This blew up before
3692
3693 def test_unintialized_modules(self):
3694 # Testing uninitialized module objects...
3695 from types import ModuleType as M
3696 m = M.__new__(M)
3697 str(m)
3698 self.assertEqual(hasattr(m, "__name__"), 0)
3699 self.assertEqual(hasattr(m, "__file__"), 0)
3700 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003701 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003702 m.foo = 1
3703 self.assertEqual(m.__dict__, {"foo": 1})
3704
3705 def test_funny_new(self):
3706 # Testing __new__ returning something unexpected...
3707 class C(object):
3708 def __new__(cls, arg):
3709 if isinstance(arg, str): return [1, 2, 3]
3710 elif isinstance(arg, int): return object.__new__(D)
3711 else: return object.__new__(cls)
3712 class D(C):
3713 def __init__(self, arg):
3714 self.foo = arg
3715 self.assertEqual(C("1"), [1, 2, 3])
3716 self.assertEqual(D("1"), [1, 2, 3])
3717 d = D(None)
3718 self.assertEqual(d.foo, None)
3719 d = C(1)
3720 self.assertEqual(isinstance(d, D), True)
3721 self.assertEqual(d.foo, 1)
3722 d = D(1)
3723 self.assertEqual(isinstance(d, D), True)
3724 self.assertEqual(d.foo, 1)
3725
3726 def test_imul_bug(self):
3727 # Testing for __imul__ problems...
3728 # SF bug 544647
3729 class C(object):
3730 def __imul__(self, other):
3731 return (self, other)
3732 x = C()
3733 y = x
3734 y *= 1.0
3735 self.assertEqual(y, (x, 1.0))
3736 y = x
3737 y *= 2
3738 self.assertEqual(y, (x, 2))
3739 y = x
3740 y *= 3L
3741 self.assertEqual(y, (x, 3L))
3742 y = x
3743 y *= 1L<<100
3744 self.assertEqual(y, (x, 1L<<100))
3745 y = x
3746 y *= None
3747 self.assertEqual(y, (x, None))
3748 y = x
3749 y *= "foo"
3750 self.assertEqual(y, (x, "foo"))
3751
3752 def test_copy_setstate(self):
3753 # Testing that copy.*copy() correctly uses __setstate__...
3754 import copy
3755 class C(object):
3756 def __init__(self, foo=None):
3757 self.foo = foo
3758 self.__foo = foo
3759 def setfoo(self, foo=None):
3760 self.foo = foo
3761 def getfoo(self):
3762 return self.__foo
3763 def __getstate__(self):
3764 return [self.foo]
3765 def __setstate__(self_, lst):
3766 self.assertEqual(len(lst), 1)
3767 self_.__foo = self_.foo = lst[0]
3768 a = C(42)
3769 a.setfoo(24)
3770 self.assertEqual(a.foo, 24)
3771 self.assertEqual(a.getfoo(), 42)
3772 b = copy.copy(a)
3773 self.assertEqual(b.foo, 24)
3774 self.assertEqual(b.getfoo(), 24)
3775 b = copy.deepcopy(a)
3776 self.assertEqual(b.foo, 24)
3777 self.assertEqual(b.getfoo(), 24)
3778
3779 def test_slices(self):
3780 # Testing cases with slices and overridden __getitem__ ...
3781
3782 # Strings
3783 self.assertEqual("hello"[:4], "hell")
3784 self.assertEqual("hello"[slice(4)], "hell")
3785 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3786 class S(str):
3787 def __getitem__(self, x):
3788 return str.__getitem__(self, x)
3789 self.assertEqual(S("hello")[:4], "hell")
3790 self.assertEqual(S("hello")[slice(4)], "hell")
3791 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3792 # Tuples
3793 self.assertEqual((1,2,3)[:2], (1,2))
3794 self.assertEqual((1,2,3)[slice(2)], (1,2))
3795 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3796 class T(tuple):
3797 def __getitem__(self, x):
3798 return tuple.__getitem__(self, x)
3799 self.assertEqual(T((1,2,3))[:2], (1,2))
3800 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3801 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3802 # Lists
3803 self.assertEqual([1,2,3][:2], [1,2])
3804 self.assertEqual([1,2,3][slice(2)], [1,2])
3805 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3806 class L(list):
3807 def __getitem__(self, x):
3808 return list.__getitem__(self, x)
3809 self.assertEqual(L([1,2,3])[:2], [1,2])
3810 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3811 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3812 # Now do lists and __setitem__
3813 a = L([1,2,3])
3814 a[slice(1, 3)] = [3,2]
3815 self.assertEqual(a, [1,3,2])
3816 a[slice(0, 2, 1)] = [3,1]
3817 self.assertEqual(a, [3,1,2])
3818 a.__setitem__(slice(1, 3), [2,1])
3819 self.assertEqual(a, [3,2,1])
3820 a.__setitem__(slice(0, 2, 1), [2,3])
3821 self.assertEqual(a, [2,3,1])
3822
3823 def test_subtype_resurrection(self):
3824 # Testing resurrection of new-style instance...
3825
3826 class C(object):
3827 container = []
3828
3829 def __del__(self):
3830 # resurrect the instance
3831 C.container.append(self)
3832
3833 c = C()
3834 c.attr = 42
3835
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003836 # The most interesting thing here is whether this blows up, due to
3837 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3838 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003839 del c
3840
3841 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003842 # the last container slot works: that will attempt to delete c again,
3843 # which will cause c to get appended back to the container again
3844 # "during" the del. (On non-CPython implementations, however, __del__
3845 # is typically not called again.)
3846 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003847 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003848 del C.container[-1]
3849 if test_support.check_impl_detail():
3850 test_support.gc_collect()
3851 self.assertEqual(len(C.container), 1)
3852 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003853
3854 # Make c mortal again, so that the test framework with -l doesn't report
3855 # it as a leak.
3856 del C.__del__
3857
3858 def test_slots_trash(self):
3859 # Testing slot trash...
3860 # Deallocating deeply nested slotted trash caused stack overflows
3861 class trash(object):
3862 __slots__ = ['x']
3863 def __init__(self, x):
3864 self.x = x
3865 o = None
3866 for i in xrange(50000):
3867 o = trash(o)
3868 del o
3869
3870 def test_slots_multiple_inheritance(self):
3871 # SF bug 575229, multiple inheritance w/ slots dumps core
3872 class A(object):
3873 __slots__=()
3874 class B(object):
3875 pass
3876 class C(A,B) :
3877 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003878 if test_support.check_impl_detail():
3879 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003880 self.assertTrue(hasattr(C, '__dict__'))
3881 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl48545522008-02-02 10:12:36 +00003882 C().x = 2
3883
3884 def test_rmul(self):
3885 # Testing correct invocation of __rmul__...
3886 # SF patch 592646
3887 class C(object):
3888 def __mul__(self, other):
3889 return "mul"
3890 def __rmul__(self, other):
3891 return "rmul"
3892 a = C()
3893 self.assertEqual(a*2, "mul")
3894 self.assertEqual(a*2.2, "mul")
3895 self.assertEqual(2*a, "rmul")
3896 self.assertEqual(2.2*a, "rmul")
3897
3898 def test_ipow(self):
3899 # Testing correct invocation of __ipow__...
3900 # [SF bug 620179]
3901 class C(object):
3902 def __ipow__(self, other):
3903 pass
3904 a = C()
3905 a **= 2
3906
3907 def test_mutable_bases(self):
3908 # Testing mutable bases...
3909
3910 # stuff that should work:
3911 class C(object):
3912 pass
3913 class C2(object):
3914 def __getattribute__(self, attr):
3915 if attr == 'a':
3916 return 2
3917 else:
3918 return super(C2, self).__getattribute__(attr)
3919 def meth(self):
3920 return 1
3921 class D(C):
3922 pass
3923 class E(D):
3924 pass
3925 d = D()
3926 e = E()
3927 D.__bases__ = (C,)
3928 D.__bases__ = (C2,)
3929 self.assertEqual(d.meth(), 1)
3930 self.assertEqual(e.meth(), 1)
3931 self.assertEqual(d.a, 2)
3932 self.assertEqual(e.a, 2)
3933 self.assertEqual(C2.__subclasses__(), [D])
3934
Georg Brandl48545522008-02-02 10:12:36 +00003935 try:
3936 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003937 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003938 pass
3939 else:
3940 self.fail("shouldn't be able to delete .__bases__")
3941
3942 try:
3943 D.__bases__ = ()
3944 except TypeError, msg:
3945 if str(msg) == "a new-style class can't have only classic bases":
3946 self.fail("wrong error message for .__bases__ = ()")
3947 else:
3948 self.fail("shouldn't be able to set .__bases__ to ()")
3949
3950 try:
3951 D.__bases__ = (D,)
3952 except TypeError:
3953 pass
3954 else:
3955 # actually, we'll have crashed by here...
3956 self.fail("shouldn't be able to create inheritance cycles")
3957
3958 try:
3959 D.__bases__ = (C, C)
3960 except TypeError:
3961 pass
3962 else:
3963 self.fail("didn't detect repeated base classes")
3964
3965 try:
3966 D.__bases__ = (E,)
3967 except TypeError:
3968 pass
3969 else:
3970 self.fail("shouldn't be able to create inheritance cycles")
3971
3972 # let's throw a classic class into the mix:
3973 class Classic:
3974 def meth2(self):
3975 return 3
3976
3977 D.__bases__ = (C, Classic)
3978
3979 self.assertEqual(d.meth2(), 3)
3980 self.assertEqual(e.meth2(), 3)
3981 try:
3982 d.a
3983 except AttributeError:
3984 pass
3985 else:
3986 self.fail("attribute should have vanished")
3987
3988 try:
3989 D.__bases__ = (Classic,)
3990 except TypeError:
3991 pass
3992 else:
3993 self.fail("new-style class must have a new-style base")
3994
Benjamin Petersond4d400c2009-04-18 20:12:47 +00003995 def test_builtin_bases(self):
3996 # Make sure all the builtin types can have their base queried without
3997 # segfaulting. See issue #5787.
3998 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
3999 if isinstance(tp, type)]
4000 for tp in builtin_types:
4001 object.__getattribute__(tp, "__bases__")
4002 if tp is not object:
4003 self.assertEqual(len(tp.__bases__), 1, tp)
4004
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00004005 class L(list):
4006 pass
4007
4008 class C(object):
4009 pass
4010
4011 class D(C):
4012 pass
4013
4014 try:
4015 L.__bases__ = (dict,)
4016 except TypeError:
4017 pass
4018 else:
4019 self.fail("shouldn't turn list subclass into dict subclass")
4020
4021 try:
4022 list.__bases__ = (dict,)
4023 except TypeError:
4024 pass
4025 else:
4026 self.fail("shouldn't be able to assign to list.__bases__")
4027
4028 try:
4029 D.__bases__ = (C, list)
4030 except TypeError:
4031 pass
4032 else:
4033 assert 0, "best_base calculation found wanting"
4034
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004035
Georg Brandl48545522008-02-02 10:12:36 +00004036 def test_mutable_bases_with_failing_mro(self):
4037 # Testing mutable bases with failing mro...
4038 class WorkOnce(type):
4039 def __new__(self, name, bases, ns):
4040 self.flag = 0
4041 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
4042 def mro(self):
4043 if self.flag > 0:
4044 raise RuntimeError, "bozo"
4045 else:
4046 self.flag += 1
4047 return type.mro(self)
4048
4049 class WorkAlways(type):
4050 def mro(self):
4051 # this is here to make sure that .mro()s aren't called
4052 # with an exception set (which was possible at one point).
4053 # An error message will be printed in a debug build.
4054 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004055 return type.mro(self)
4056
Georg Brandl48545522008-02-02 10:12:36 +00004057 class C(object):
4058 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004059
Georg Brandl48545522008-02-02 10:12:36 +00004060 class C2(object):
4061 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004062
Georg Brandl48545522008-02-02 10:12:36 +00004063 class D(C):
4064 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004065
Georg Brandl48545522008-02-02 10:12:36 +00004066 class E(D):
4067 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004068
Georg Brandl48545522008-02-02 10:12:36 +00004069 class F(D):
4070 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004071
Georg Brandl48545522008-02-02 10:12:36 +00004072 class G(D):
4073 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004074
Georg Brandl48545522008-02-02 10:12:36 +00004075 # Immediate subclasses have their mro's adjusted in alphabetical
4076 # order, so E's will get adjusted before adjusting F's fails. We
4077 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004078
Georg Brandl48545522008-02-02 10:12:36 +00004079 E_mro_before = E.__mro__
4080 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004081
Armin Rigofd163f92005-12-29 15:59:19 +00004082 try:
Georg Brandl48545522008-02-02 10:12:36 +00004083 D.__bases__ = (C2,)
4084 except RuntimeError:
4085 self.assertEqual(E.__mro__, E_mro_before)
4086 self.assertEqual(D.__mro__, D_mro_before)
4087 else:
4088 self.fail("exception not propagated")
4089
4090 def test_mutable_bases_catch_mro_conflict(self):
4091 # Testing mutable bases catch mro conflict...
4092 class A(object):
4093 pass
4094
4095 class B(object):
4096 pass
4097
4098 class C(A, B):
4099 pass
4100
4101 class D(A, B):
4102 pass
4103
4104 class E(C, D):
4105 pass
4106
4107 try:
4108 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004109 except TypeError:
4110 pass
4111 else:
Georg Brandl48545522008-02-02 10:12:36 +00004112 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004113
Georg Brandl48545522008-02-02 10:12:36 +00004114 def test_mutable_names(self):
4115 # Testing mutable names...
4116 class C(object):
4117 pass
4118
4119 # C.__module__ could be 'test_descr' or '__main__'
4120 mod = C.__module__
4121
4122 C.__name__ = 'D'
4123 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4124
4125 C.__name__ = 'D.E'
4126 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4127
4128 def test_subclass_right_op(self):
4129 # Testing correct dispatch of subclass overloading __r<op>__...
4130
4131 # This code tests various cases where right-dispatch of a subclass
4132 # should be preferred over left-dispatch of a base class.
4133
4134 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4135
4136 class B(int):
4137 def __floordiv__(self, other):
4138 return "B.__floordiv__"
4139 def __rfloordiv__(self, other):
4140 return "B.__rfloordiv__"
4141
4142 self.assertEqual(B(1) // 1, "B.__floordiv__")
4143 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4144
4145 # Case 2: subclass of object; this is just the baseline for case 3
4146
4147 class C(object):
4148 def __floordiv__(self, other):
4149 return "C.__floordiv__"
4150 def __rfloordiv__(self, other):
4151 return "C.__rfloordiv__"
4152
4153 self.assertEqual(C() // 1, "C.__floordiv__")
4154 self.assertEqual(1 // C(), "C.__rfloordiv__")
4155
4156 # Case 3: subclass of new-style class; here it gets interesting
4157
4158 class D(C):
4159 def __floordiv__(self, other):
4160 return "D.__floordiv__"
4161 def __rfloordiv__(self, other):
4162 return "D.__rfloordiv__"
4163
4164 self.assertEqual(D() // C(), "D.__floordiv__")
4165 self.assertEqual(C() // D(), "D.__rfloordiv__")
4166
4167 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4168
4169 class E(C):
4170 pass
4171
4172 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4173
4174 self.assertEqual(E() // 1, "C.__floordiv__")
4175 self.assertEqual(1 // E(), "C.__rfloordiv__")
4176 self.assertEqual(E() // C(), "C.__floordiv__")
4177 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4178
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004179 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004180 def test_meth_class_get(self):
4181 # Testing __get__ method of METH_CLASS C methods...
4182 # Full coverage of descrobject.c::classmethod_get()
4183
4184 # Baseline
4185 arg = [1, 2, 3]
4186 res = {1: None, 2: None, 3: None}
4187 self.assertEqual(dict.fromkeys(arg), res)
4188 self.assertEqual({}.fromkeys(arg), res)
4189
4190 # Now get the descriptor
4191 descr = dict.__dict__["fromkeys"]
4192
4193 # More baseline using the descriptor directly
4194 self.assertEqual(descr.__get__(None, dict)(arg), res)
4195 self.assertEqual(descr.__get__({})(arg), res)
4196
4197 # Now check various error cases
4198 try:
4199 descr.__get__(None, None)
4200 except TypeError:
4201 pass
4202 else:
4203 self.fail("shouldn't have allowed descr.__get__(None, None)")
4204 try:
4205 descr.__get__(42)
4206 except TypeError:
4207 pass
4208 else:
4209 self.fail("shouldn't have allowed descr.__get__(42)")
4210 try:
4211 descr.__get__(None, 42)
4212 except TypeError:
4213 pass
4214 else:
4215 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4216 try:
4217 descr.__get__(None, int)
4218 except TypeError:
4219 pass
4220 else:
4221 self.fail("shouldn't have allowed descr.__get__(None, int)")
4222
4223 def test_isinst_isclass(self):
4224 # Testing proxy isinstance() and isclass()...
4225 class Proxy(object):
4226 def __init__(self, obj):
4227 self.__obj = obj
4228 def __getattribute__(self, name):
4229 if name.startswith("_Proxy__"):
4230 return object.__getattribute__(self, name)
4231 else:
4232 return getattr(self.__obj, name)
4233 # Test with a classic class
4234 class C:
4235 pass
4236 a = C()
4237 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004238 self.assertIsInstance(a, C) # Baseline
4239 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004240 # Test with a classic subclass
4241 class D(C):
4242 pass
4243 a = D()
4244 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004245 self.assertIsInstance(a, C) # Baseline
4246 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004247 # Test with a new-style class
4248 class C(object):
4249 pass
4250 a = C()
4251 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004252 self.assertIsInstance(a, C) # Baseline
4253 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004254 # Test with a new-style subclass
4255 class D(C):
4256 pass
4257 a = D()
4258 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004259 self.assertIsInstance(a, C) # Baseline
4260 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004261
4262 def test_proxy_super(self):
4263 # Testing super() for a proxy object...
4264 class Proxy(object):
4265 def __init__(self, obj):
4266 self.__obj = obj
4267 def __getattribute__(self, name):
4268 if name.startswith("_Proxy__"):
4269 return object.__getattribute__(self, name)
4270 else:
4271 return getattr(self.__obj, name)
4272
4273 class B(object):
4274 def f(self):
4275 return "B.f"
4276
4277 class C(B):
4278 def f(self):
4279 return super(C, self).f() + "->C.f"
4280
4281 obj = C()
4282 p = Proxy(obj)
4283 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4284
4285 def test_carloverre(self):
4286 # Testing prohibition of Carlo Verre's hack...
4287 try:
4288 object.__setattr__(str, "foo", 42)
4289 except TypeError:
4290 pass
4291 else:
4292 self.fail("Carlo Verre __setattr__ suceeded!")
4293 try:
4294 object.__delattr__(str, "lower")
4295 except TypeError:
4296 pass
4297 else:
4298 self.fail("Carlo Verre __delattr__ succeeded!")
4299
4300 def test_weakref_segfault(self):
4301 # Testing weakref segfault...
4302 # SF 742911
4303 import weakref
4304
4305 class Provoker:
4306 def __init__(self, referrent):
4307 self.ref = weakref.ref(referrent)
4308
4309 def __del__(self):
4310 x = self.ref()
4311
4312 class Oops(object):
4313 pass
4314
4315 o = Oops()
4316 o.whatever = Provoker(o)
4317 del o
4318
4319 def test_wrapper_segfault(self):
4320 # SF 927248: deeply nested wrappers could cause stack overflow
4321 f = lambda:None
4322 for i in xrange(1000000):
4323 f = f.__call__
4324 f = None
4325
4326 def test_file_fault(self):
4327 # Testing sys.stdout is changed in getattr...
Nick Coghlan0447cd62009-10-17 06:33:05 +00004328 test_stdout = sys.stdout
Georg Brandl48545522008-02-02 10:12:36 +00004329 class StdoutGuard:
4330 def __getattr__(self, attr):
4331 sys.stdout = sys.__stdout__
4332 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4333 sys.stdout = StdoutGuard()
4334 try:
4335 print "Oops!"
4336 except RuntimeError:
4337 pass
Nick Coghlan0447cd62009-10-17 06:33:05 +00004338 finally:
4339 sys.stdout = test_stdout
Georg Brandl48545522008-02-02 10:12:36 +00004340
4341 def test_vicious_descriptor_nonsense(self):
4342 # Testing vicious_descriptor_nonsense...
4343
4344 # A potential segfault spotted by Thomas Wouters in mail to
4345 # python-dev 2003-04-17, turned into an example & fixed by Michael
4346 # Hudson just less than four months later...
4347
4348 class Evil(object):
4349 def __hash__(self):
4350 return hash('attr')
4351 def __eq__(self, other):
4352 del C.attr
4353 return 0
4354
4355 class Descr(object):
4356 def __get__(self, ob, type=None):
4357 return 1
4358
4359 class C(object):
4360 attr = Descr()
4361
4362 c = C()
4363 c.__dict__[Evil()] = 0
4364
4365 self.assertEqual(c.attr, 1)
4366 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004367 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00004368 self.assertEqual(hasattr(c, 'attr'), False)
4369
4370 def test_init(self):
4371 # SF 1155938
4372 class Foo(object):
4373 def __init__(self):
4374 return 10
4375 try:
4376 Foo()
4377 except TypeError:
4378 pass
4379 else:
4380 self.fail("did not test __init__() for None return")
4381
4382 def test_method_wrapper(self):
4383 # Testing method-wrapper objects...
4384 # <type 'method-wrapper'> did not support any reflection before 2.5
4385
4386 l = []
4387 self.assertEqual(l.__add__, l.__add__)
4388 self.assertEqual(l.__add__, [].__add__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004389 self.assertTrue(l.__add__ != [5].__add__)
4390 self.assertTrue(l.__add__ != l.__mul__)
4391 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004392 if hasattr(l.__add__, '__self__'):
4393 # CPython
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004394 self.assertTrue(l.__add__.__self__ is l)
4395 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004396 else:
4397 # Python implementations where [].__add__ is a normal bound method
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004398 self.assertTrue(l.__add__.im_self is l)
4399 self.assertTrue(l.__add__.im_class is list)
Georg Brandl48545522008-02-02 10:12:36 +00004400 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4401 try:
4402 hash(l.__add__)
4403 except TypeError:
4404 pass
4405 else:
4406 self.fail("no TypeError from hash([].__add__)")
4407
4408 t = ()
4409 t += (7,)
4410 self.assertEqual(t.__add__, (7,).__add__)
4411 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4412
4413 def test_not_implemented(self):
4414 # Testing NotImplemented...
4415 # all binary methods should be able to return a NotImplemented
Georg Brandl48545522008-02-02 10:12:36 +00004416 import operator
4417
4418 def specialmethod(self, other):
4419 return NotImplemented
4420
4421 def check(expr, x, y):
4422 try:
4423 exec expr in {'x': x, 'y': y, 'operator': operator}
4424 except TypeError:
4425 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004426 else:
Georg Brandl48545522008-02-02 10:12:36 +00004427 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004428
Georg Brandl48545522008-02-02 10:12:36 +00004429 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4430 # TypeErrors
4431 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4432 # ValueErrors instead of TypeErrors
4433 for metaclass in [type, types.ClassType]:
4434 for name, expr, iexpr in [
4435 ('__add__', 'x + y', 'x += y'),
4436 ('__sub__', 'x - y', 'x -= y'),
4437 ('__mul__', 'x * y', 'x *= y'),
4438 ('__truediv__', 'operator.truediv(x, y)', None),
4439 ('__floordiv__', 'operator.floordiv(x, y)', None),
4440 ('__div__', 'x / y', 'x /= y'),
4441 ('__mod__', 'x % y', 'x %= y'),
4442 ('__divmod__', 'divmod(x, y)', None),
4443 ('__pow__', 'x ** y', 'x **= y'),
4444 ('__lshift__', 'x << y', 'x <<= y'),
4445 ('__rshift__', 'x >> y', 'x >>= y'),
4446 ('__and__', 'x & y', 'x &= y'),
4447 ('__or__', 'x | y', 'x |= y'),
4448 ('__xor__', 'x ^ y', 'x ^= y'),
4449 ('__coerce__', 'coerce(x, y)', None)]:
4450 if name == '__coerce__':
4451 rname = name
4452 else:
4453 rname = '__r' + name[2:]
4454 A = metaclass('A', (), {name: specialmethod})
4455 B = metaclass('B', (), {rname: specialmethod})
4456 a = A()
4457 b = B()
4458 check(expr, a, a)
4459 check(expr, a, b)
4460 check(expr, b, a)
4461 check(expr, b, b)
4462 check(expr, a, N1)
4463 check(expr, a, N2)
4464 check(expr, N1, b)
4465 check(expr, N2, b)
4466 if iexpr:
4467 check(iexpr, a, a)
4468 check(iexpr, a, b)
4469 check(iexpr, b, a)
4470 check(iexpr, b, b)
4471 check(iexpr, a, N1)
4472 check(iexpr, a, N2)
4473 iname = '__i' + name[2:]
4474 C = metaclass('C', (), {iname: specialmethod})
4475 c = C()
4476 check(iexpr, c, a)
4477 check(iexpr, c, b)
4478 check(iexpr, c, N1)
4479 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004480
Georg Brandl48545522008-02-02 10:12:36 +00004481 def test_assign_slice(self):
4482 # ceval.c's assign_slice used to check for
4483 # tp->tp_as_sequence->sq_slice instead of
4484 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004485
Georg Brandl48545522008-02-02 10:12:36 +00004486 class C(object):
4487 def __setslice__(self, start, stop, value):
4488 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004489
Georg Brandl48545522008-02-02 10:12:36 +00004490 c = C()
4491 c[1:2] = 3
4492 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004493
Benjamin Peterson9179dab2010-01-18 23:07:56 +00004494 def test_set_and_no_get(self):
4495 # See
4496 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4497 class Descr(object):
4498
4499 def __init__(self, name):
4500 self.name = name
4501
4502 def __set__(self, obj, value):
4503 obj.__dict__[self.name] = value
4504 descr = Descr("a")
4505
4506 class X(object):
4507 a = descr
4508
4509 x = X()
4510 self.assertIs(x.a, descr)
4511 x.a = 42
4512 self.assertEqual(x.a, 42)
4513
Benjamin Peterson42d59472010-02-06 20:14:10 +00004514 # Also check type_getattro for correctness.
4515 class Meta(type):
4516 pass
4517 class X(object):
4518 __metaclass__ = Meta
4519 X.a = 42
4520 Meta.a = Descr("a")
4521 self.assertEqual(X.a, 42)
4522
Benjamin Peterson273c2332008-11-17 22:39:09 +00004523 def test_getattr_hooks(self):
4524 # issue 4230
4525
4526 class Descriptor(object):
4527 counter = 0
4528 def __get__(self, obj, objtype=None):
4529 def getter(name):
4530 self.counter += 1
4531 raise AttributeError(name)
4532 return getter
4533
4534 descr = Descriptor()
4535 class A(object):
4536 __getattribute__ = descr
4537 class B(object):
4538 __getattr__ = descr
4539 class C(object):
4540 __getattribute__ = descr
4541 __getattr__ = descr
4542
4543 self.assertRaises(AttributeError, getattr, A(), "attr")
4544 self.assertEquals(descr.counter, 1)
4545 self.assertRaises(AttributeError, getattr, B(), "attr")
4546 self.assertEquals(descr.counter, 2)
4547 self.assertRaises(AttributeError, getattr, C(), "attr")
4548 self.assertEquals(descr.counter, 4)
4549
4550 import gc
4551 class EvilGetattribute(object):
4552 # This used to segfault
4553 def __getattr__(self, name):
4554 raise AttributeError(name)
4555 def __getattribute__(self, name):
4556 del EvilGetattribute.__getattr__
4557 for i in range(5):
4558 gc.collect()
4559 raise AttributeError(name)
4560
4561 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4562
Guido van Rossum9acc3872008-01-23 23:23:43 +00004563
Georg Brandl48545522008-02-02 10:12:36 +00004564class DictProxyTests(unittest.TestCase):
4565 def setUp(self):
4566 class C(object):
4567 def meth(self):
4568 pass
4569 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004570
Georg Brandl48545522008-02-02 10:12:36 +00004571 def test_iter_keys(self):
4572 # Testing dict-proxy iterkeys...
4573 keys = [ key for key in self.C.__dict__.iterkeys() ]
4574 keys.sort()
4575 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4576 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004577
Georg Brandl48545522008-02-02 10:12:36 +00004578 def test_iter_values(self):
4579 # Testing dict-proxy itervalues...
4580 values = [ values for values in self.C.__dict__.itervalues() ]
4581 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004582
Georg Brandl48545522008-02-02 10:12:36 +00004583 def test_iter_items(self):
4584 # Testing dict-proxy iteritems...
4585 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4586 keys.sort()
4587 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4588 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004589
Georg Brandl48545522008-02-02 10:12:36 +00004590 def test_dict_type_with_metaclass(self):
4591 # Testing type of __dict__ when __metaclass__ set...
4592 class B(object):
4593 pass
4594 class M(type):
4595 pass
4596 class C:
4597 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4598 __metaclass__ = M
4599 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004600
Guido van Rossum9acc3872008-01-23 23:23:43 +00004601
Georg Brandl48545522008-02-02 10:12:36 +00004602class PTypesLongInitTest(unittest.TestCase):
4603 # This is in its own TestCase so that it can be run before any other tests.
4604 def test_pytype_long_ready(self):
4605 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004606
Georg Brandl48545522008-02-02 10:12:36 +00004607 # This dumps core when SF bug 551412 isn't fixed --
4608 # but only when test_descr.py is run separately.
4609 # (That can't be helped -- as soon as PyType_Ready()
4610 # is called for PyLong_Type, the bug is gone.)
4611 class UserLong(object):
4612 def __pow__(self, *args):
4613 pass
4614 try:
4615 pow(0L, UserLong(), 0L)
4616 except:
4617 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004618
Georg Brandl48545522008-02-02 10:12:36 +00004619 # Another segfault only when run early
4620 # (before PyType_Ready(tuple) is called)
4621 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004622
4623
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004624def test_main():
Florent Xicluna07627882010-03-21 01:14:24 +00004625 with test_support.check_py3k_warnings(
4626 ("classic (int|long) division", DeprecationWarning),
4627 ("coerce.. not supported", DeprecationWarning),
4628 ("Overriding __cmp__ ", DeprecationWarning),
4629 (".+__(get|set|del)slice__ has been removed", DeprecationWarning)):
4630 # Run all local test cases, with PTypesLongInitTest first.
4631 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4632 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004633
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004634if __name__ == "__main__":
4635 test_main()