blob: 07664ac208de61bf064e08925768b50279022963 [file] [log] [blame]
Benjamin Petersond4d400c2009-04-18 20:12:47 +00001import __builtin__
Benjamin Petersona8d45852012-03-07 18:41:11 -06002import gc
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00003import sys
Armin Rigo9790a272007-05-02 19:23:31 +00004import types
Georg Brandl48545522008-02-02 10:12:36 +00005import unittest
Benjamin Petersona8d45852012-03-07 18:41:11 -06006import weakref
Tim Peters4d9b4662002-04-16 01:59:17 +00007
Georg Brandl48545522008-02-02 10:12:36 +00008from copy import deepcopy
9from test import test_support
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011
Georg Brandl48545522008-02-02 10:12:36 +000012class OperatorsTest(unittest.TestCase):
Tim Peters6d6c1a32001-08-02 04:15:00 +000013
Georg Brandl48545522008-02-02 10:12:36 +000014 def __init__(self, *args, **kwargs):
15 unittest.TestCase.__init__(self, *args, **kwargs)
16 self.binops = {
17 'add': '+',
18 'sub': '-',
19 'mul': '*',
20 'div': '/',
21 'divmod': 'divmod',
22 'pow': '**',
23 'lshift': '<<',
24 'rshift': '>>',
25 'and': '&',
26 'xor': '^',
27 'or': '|',
28 'cmp': 'cmp',
29 'lt': '<',
30 'le': '<=',
31 'eq': '==',
32 'ne': '!=',
33 'gt': '>',
34 'ge': '>=',
35 }
Tim Peters3caca232001-12-06 06:23:26 +000036
Georg Brandl48545522008-02-02 10:12:36 +000037 for name, expr in self.binops.items():
38 if expr.islower():
39 expr = expr + "(a, b)"
40 else:
41 expr = 'a %s b' % expr
42 self.binops[name] = expr
Tim Peters3caca232001-12-06 06:23:26 +000043
Georg Brandl48545522008-02-02 10:12:36 +000044 self.unops = {
45 'pos': '+',
46 'neg': '-',
47 'abs': 'abs',
48 'invert': '~',
49 'int': 'int',
50 'long': 'long',
51 'float': 'float',
52 'oct': 'oct',
53 'hex': 'hex',
54 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000055
Georg Brandl48545522008-02-02 10:12:36 +000056 for name, expr in self.unops.items():
57 if expr.islower():
58 expr = expr + "(a)"
59 else:
60 expr = '%s a' % expr
61 self.unops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000062
Georg Brandl48545522008-02-02 10:12:36 +000063 def unop_test(self, a, res, expr="len(a)", meth="__len__"):
64 d = {'a': a}
65 self.assertEqual(eval(expr, d), res)
66 t = type(a)
67 m = getattr(t, meth)
Tim Peters6d6c1a32001-08-02 04:15:00 +000068
Georg Brandl48545522008-02-02 10:12:36 +000069 # Find method in parent class
70 while meth not in t.__dict__:
71 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +000072 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
73 # method object; the getattr() below obtains its underlying function.
74 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +000075 self.assertEqual(m(a), res)
76 bm = getattr(a, meth)
77 self.assertEqual(bm(), res)
Tim Peters2f93e282001-10-04 05:27:00 +000078
Georg Brandl48545522008-02-02 10:12:36 +000079 def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
80 d = {'a': a, 'b': b}
Tim Peters2f93e282001-10-04 05:27:00 +000081
Georg Brandl48545522008-02-02 10:12:36 +000082 # XXX Hack so this passes before 2.3 when -Qnew is specified.
83 if meth == "__div__" and 1/2 == 0.5:
84 meth = "__truediv__"
Tim Peters2f93e282001-10-04 05:27:00 +000085
Georg Brandl48545522008-02-02 10:12:36 +000086 if meth == '__divmod__': pass
Tim Peters2f93e282001-10-04 05:27:00 +000087
Georg Brandl48545522008-02-02 10:12:36 +000088 self.assertEqual(eval(expr, d), res)
89 t = type(a)
90 m = getattr(t, meth)
91 while meth not in t.__dict__:
92 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +000093 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
94 # method object; the getattr() below obtains its underlying function.
95 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +000096 self.assertEqual(m(a, b), res)
97 bm = getattr(a, meth)
98 self.assertEqual(bm(b), res)
Tim Peters2f93e282001-10-04 05:27:00 +000099
Georg Brandl48545522008-02-02 10:12:36 +0000100 def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"):
101 d = {'a': a, 'b': b, 'c': c}
102 self.assertEqual(eval(expr, d), res)
103 t = type(a)
104 m = getattr(t, meth)
105 while meth not in t.__dict__:
106 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000107 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
108 # method object; the getattr() below obtains its underlying function.
109 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000110 self.assertEqual(m(a, b, c), res)
111 bm = getattr(a, meth)
112 self.assertEqual(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000113
Georg Brandl48545522008-02-02 10:12:36 +0000114 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
115 d = {'a': deepcopy(a), 'b': b}
116 exec stmt in d
117 self.assertEqual(d['a'], res)
118 t = type(a)
119 m = getattr(t, meth)
120 while meth not in t.__dict__:
121 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000122 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
123 # method object; the getattr() below obtains its underlying function.
124 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000125 d['a'] = deepcopy(a)
126 m(d['a'], b)
127 self.assertEqual(d['a'], res)
128 d['a'] = deepcopy(a)
129 bm = getattr(d['a'], meth)
130 bm(b)
131 self.assertEqual(d['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000132
Georg Brandl48545522008-02-02 10:12:36 +0000133 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
134 d = {'a': deepcopy(a), 'b': b, 'c': c}
135 exec stmt in d
136 self.assertEqual(d['a'], res)
137 t = type(a)
138 m = getattr(t, meth)
139 while meth not in t.__dict__:
140 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000141 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
142 # method object; the getattr() below obtains its underlying function.
143 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000144 d['a'] = deepcopy(a)
145 m(d['a'], b, c)
146 self.assertEqual(d['a'], res)
147 d['a'] = deepcopy(a)
148 bm = getattr(d['a'], meth)
149 bm(b, c)
150 self.assertEqual(d['a'], res)
151
152 def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
153 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
154 exec stmt in dictionary
155 self.assertEqual(dictionary['a'], res)
156 t = type(a)
157 while meth not in t.__dict__:
158 t = t.__bases__[0]
159 m = getattr(t, meth)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000160 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
161 # method object; the getattr() below obtains its underlying function.
162 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000163 dictionary['a'] = deepcopy(a)
164 m(dictionary['a'], b, c, d)
165 self.assertEqual(dictionary['a'], res)
166 dictionary['a'] = deepcopy(a)
167 bm = getattr(dictionary['a'], meth)
168 bm(b, c, d)
169 self.assertEqual(dictionary['a'], res)
170
171 def test_lists(self):
172 # Testing list operations...
173 # Asserts are within individual test methods
174 self.binop_test([1], [2], [1,2], "a+b", "__add__")
175 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
176 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
177 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
178 self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
179 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
180 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
181 self.unop_test([1,2,3], 3, "len(a)", "__len__")
182 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
183 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
184 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
185 self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
186 "__setslice__")
187
188 def test_dicts(self):
189 # Testing dict operations...
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000190 if hasattr(dict, '__cmp__'): # PyPy has only rich comparison on dicts
191 self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
192 else:
193 self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__")
Georg Brandl48545522008-02-02 10:12:36 +0000194 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
195 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
196 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
197
198 d = {1:2, 3:4}
199 l1 = []
200 for i in d.keys():
201 l1.append(i)
202 l = []
203 for i in iter(d):
204 l.append(i)
205 self.assertEqual(l, l1)
206 l = []
207 for i in d.__iter__():
208 l.append(i)
209 self.assertEqual(l, l1)
210 l = []
211 for i in dict.__iter__(d):
212 l.append(i)
213 self.assertEqual(l, l1)
214 d = {1:2, 3:4}
215 self.unop_test(d, 2, "len(a)", "__len__")
216 self.assertEqual(eval(repr(d), {}), d)
217 self.assertEqual(eval(d.__repr__(), {}), d)
218 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
219 "__setitem__")
220
221 # Tests for unary and binary operators
222 def number_operators(self, a, b, skip=[]):
223 dict = {'a': a, 'b': b}
224
225 for name, expr in self.binops.items():
226 if name not in skip:
227 name = "__%s__" % name
228 if hasattr(a, name):
229 res = eval(expr, dict)
230 self.binop_test(a, b, res, expr, name)
231
232 for name, expr in self.unops.items():
233 if name not in skip:
234 name = "__%s__" % name
235 if hasattr(a, name):
236 res = eval(expr, dict)
237 self.unop_test(a, res, expr, name)
238
239 def test_ints(self):
240 # Testing int operations...
241 self.number_operators(100, 3)
242 # The following crashes in Python 2.2
243 self.assertEqual((1).__nonzero__(), 1)
244 self.assertEqual((0).__nonzero__(), 0)
245 # This returns 'NotImplemented' in Python 2.2
246 class C(int):
247 def __add__(self, other):
248 return NotImplemented
249 self.assertEqual(C(5L), 5)
Tim Peters25786c02001-09-02 08:22:48 +0000250 try:
Georg Brandl48545522008-02-02 10:12:36 +0000251 C() + ""
Tim Peters25786c02001-09-02 08:22:48 +0000252 except TypeError:
253 pass
254 else:
Georg Brandl48545522008-02-02 10:12:36 +0000255 self.fail("NotImplemented should have caused TypeError")
Tim Peters1fc240e2001-10-26 05:06:50 +0000256 try:
Georg Brandl48545522008-02-02 10:12:36 +0000257 C(sys.maxint+1)
258 except OverflowError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000259 pass
260 else:
Georg Brandl48545522008-02-02 10:12:36 +0000261 self.fail("should have raised OverflowError")
Tim Peters1fc240e2001-10-26 05:06:50 +0000262
Georg Brandl48545522008-02-02 10:12:36 +0000263 def test_longs(self):
264 # Testing long operations...
265 self.number_operators(100L, 3L)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000266
Georg Brandl48545522008-02-02 10:12:36 +0000267 def test_floats(self):
268 # Testing float operations...
269 self.number_operators(100.0, 3.0)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000270
Georg Brandl48545522008-02-02 10:12:36 +0000271 def test_complexes(self):
272 # Testing complex operations...
273 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
274 'int', 'long', 'float'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275
Georg Brandl48545522008-02-02 10:12:36 +0000276 class Number(complex):
277 __slots__ = ['prec']
278 def __new__(cls, *args, **kwds):
279 result = complex.__new__(cls, *args)
280 result.prec = kwds.get('prec', 12)
281 return result
282 def __repr__(self):
283 prec = self.prec
284 if self.imag == 0.0:
285 return "%.*g" % (prec, self.real)
286 if self.real == 0.0:
287 return "%.*gj" % (prec, self.imag)
288 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
289 __str__ = __repr__
Tim Peters5d2b77c2001-09-03 05:47:38 +0000290
Georg Brandl48545522008-02-02 10:12:36 +0000291 a = Number(3.14, prec=6)
292 self.assertEqual(repr(a), "3.14")
293 self.assertEqual(a.prec, 6)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000294
Georg Brandl48545522008-02-02 10:12:36 +0000295 a = Number(a, prec=2)
296 self.assertEqual(repr(a), "3.1")
297 self.assertEqual(a.prec, 2)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000298
Georg Brandl48545522008-02-02 10:12:36 +0000299 a = Number(234.5)
300 self.assertEqual(repr(a), "234.5")
301 self.assertEqual(a.prec, 12)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000302
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000303 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000304 def test_spam_lists(self):
305 # Testing spamlist operations...
306 import copy, xxsubtype as spam
Tim Peters37a309d2001-09-04 01:20:04 +0000307
Georg Brandl48545522008-02-02 10:12:36 +0000308 def spamlist(l, memo=None):
309 import xxsubtype as spam
310 return spam.spamlist(l)
Tim Peters37a309d2001-09-04 01:20:04 +0000311
Georg Brandl48545522008-02-02 10:12:36 +0000312 # This is an ugly hack:
313 copy._deepcopy_dispatch[spam.spamlist] = spamlist
Tim Peters37a309d2001-09-04 01:20:04 +0000314
Georg Brandl48545522008-02-02 10:12:36 +0000315 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
316 "__add__")
317 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
318 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
319 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
320 self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
321 "__getslice__")
322 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
323 "__iadd__")
324 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
325 "__imul__")
326 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
327 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
328 "__mul__")
329 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
330 "__rmul__")
331 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
332 "__setitem__")
333 self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
334 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
335 # Test subclassing
336 class C(spam.spamlist):
337 def foo(self): return 1
338 a = C()
339 self.assertEqual(a, [])
340 self.assertEqual(a.foo(), 1)
341 a.append(100)
342 self.assertEqual(a, [100])
343 self.assertEqual(a.getstate(), 0)
344 a.setstate(42)
345 self.assertEqual(a.getstate(), 42)
Tim Peters37a309d2001-09-04 01:20:04 +0000346
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000347 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000348 def test_spam_dicts(self):
349 # Testing spamdict operations...
350 import copy, xxsubtype as spam
351 def spamdict(d, memo=None):
352 import xxsubtype as spam
353 sd = spam.spamdict()
354 for k, v in d.items():
355 sd[k] = v
356 return sd
357 # This is an ugly hack:
358 copy._deepcopy_dispatch[spam.spamdict] = spamdict
Tim Peters37a309d2001-09-04 01:20:04 +0000359
Georg Brandl48545522008-02-02 10:12:36 +0000360 self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
361 "__cmp__")
362 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
363 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
364 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
365 d = spamdict({1:2,3:4})
366 l1 = []
367 for i in d.keys():
368 l1.append(i)
369 l = []
370 for i in iter(d):
371 l.append(i)
372 self.assertEqual(l, l1)
373 l = []
374 for i in d.__iter__():
375 l.append(i)
376 self.assertEqual(l, l1)
377 l = []
378 for i in type(spamdict({})).__iter__(d):
379 l.append(i)
380 self.assertEqual(l, l1)
381 straightd = {1:2, 3:4}
382 spamd = spamdict(straightd)
383 self.unop_test(spamd, 2, "len(a)", "__len__")
384 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
385 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
386 "a[b]=c", "__setitem__")
387 # Test subclassing
388 class C(spam.spamdict):
389 def foo(self): return 1
390 a = C()
391 self.assertEqual(a.items(), [])
392 self.assertEqual(a.foo(), 1)
393 a['foo'] = 'bar'
394 self.assertEqual(a.items(), [('foo', 'bar')])
395 self.assertEqual(a.getstate(), 0)
396 a.setstate(100)
397 self.assertEqual(a.getstate(), 100)
Tim Peters37a309d2001-09-04 01:20:04 +0000398
Georg Brandl48545522008-02-02 10:12:36 +0000399class ClassPropertiesAndMethods(unittest.TestCase):
Tim Peters37a309d2001-09-04 01:20:04 +0000400
Georg Brandl48545522008-02-02 10:12:36 +0000401 def test_python_dicts(self):
402 # Testing Python subclass of dict...
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000403 self.assertTrue(issubclass(dict, dict))
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000404 self.assertIsInstance({}, dict)
Georg Brandl48545522008-02-02 10:12:36 +0000405 d = dict()
406 self.assertEqual(d, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000407 self.assertTrue(d.__class__ is dict)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000408 self.assertIsInstance(d, dict)
Georg Brandl48545522008-02-02 10:12:36 +0000409 class C(dict):
410 state = -1
411 def __init__(self_local, *a, **kw):
412 if a:
413 self.assertEqual(len(a), 1)
414 self_local.state = a[0]
415 if kw:
416 for k, v in kw.items():
417 self_local[v] = k
418 def __getitem__(self, key):
419 return self.get(key, 0)
420 def __setitem__(self_local, key, value):
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000421 self.assertIsInstance(key, type(0))
Georg Brandl48545522008-02-02 10:12:36 +0000422 dict.__setitem__(self_local, key, value)
423 def setstate(self, state):
424 self.state = state
425 def getstate(self):
426 return self.state
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000427 self.assertTrue(issubclass(C, dict))
Georg Brandl48545522008-02-02 10:12:36 +0000428 a1 = C(12)
429 self.assertEqual(a1.state, 12)
430 a2 = C(foo=1, bar=2)
431 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
432 a = C()
433 self.assertEqual(a.state, -1)
434 self.assertEqual(a.getstate(), -1)
435 a.setstate(0)
436 self.assertEqual(a.state, 0)
437 self.assertEqual(a.getstate(), 0)
438 a.setstate(10)
439 self.assertEqual(a.state, 10)
440 self.assertEqual(a.getstate(), 10)
441 self.assertEqual(a[42], 0)
442 a[42] = 24
443 self.assertEqual(a[42], 24)
444 N = 50
445 for i in range(N):
446 a[i] = C()
447 for j in range(N):
448 a[i][j] = i*j
449 for i in range(N):
450 for j in range(N):
451 self.assertEqual(a[i][j], i*j)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000452
Georg Brandl48545522008-02-02 10:12:36 +0000453 def test_python_lists(self):
454 # Testing Python subclass of list...
455 class C(list):
456 def __getitem__(self, i):
457 return list.__getitem__(self, i) + 100
458 def __getslice__(self, i, j):
459 return (i, j)
460 a = C()
461 a.extend([0,1,2])
462 self.assertEqual(a[0], 100)
463 self.assertEqual(a[1], 101)
464 self.assertEqual(a[2], 102)
465 self.assertEqual(a[100:200], (100,200))
Tim Peterscaaff8d2001-09-10 23:12:14 +0000466
Georg Brandl48545522008-02-02 10:12:36 +0000467 def test_metaclass(self):
468 # Testing __metaclass__...
469 class C:
Guido van Rossume54616c2001-12-14 04:19:56 +0000470 __metaclass__ = type
Georg Brandl48545522008-02-02 10:12:36 +0000471 def __init__(self):
472 self.__state = 0
473 def getstate(self):
474 return self.__state
475 def setstate(self, state):
476 self.__state = state
477 a = C()
478 self.assertEqual(a.getstate(), 0)
479 a.setstate(10)
480 self.assertEqual(a.getstate(), 10)
481 class D:
482 class __metaclass__(type):
483 def myself(cls): return cls
484 self.assertEqual(D.myself(), D)
485 d = D()
486 self.assertEqual(d.__class__, D)
487 class M1(type):
488 def __new__(cls, name, bases, dict):
489 dict['__spam__'] = 1
490 return type.__new__(cls, name, bases, dict)
491 class C:
492 __metaclass__ = M1
493 self.assertEqual(C.__spam__, 1)
494 c = C()
495 self.assertEqual(c.__spam__, 1)
Guido van Rossume54616c2001-12-14 04:19:56 +0000496
Georg Brandl48545522008-02-02 10:12:36 +0000497 class _instance(object):
498 pass
499 class M2(object):
500 @staticmethod
501 def __new__(cls, name, bases, dict):
502 self = object.__new__(cls)
503 self.name = name
504 self.bases = bases
505 self.dict = dict
506 return self
507 def __call__(self):
508 it = _instance()
509 # Early binding of methods
510 for key in self.dict:
511 if key.startswith("__"):
512 continue
513 setattr(it, key, self.dict[key].__get__(it, self))
514 return it
515 class C:
516 __metaclass__ = M2
517 def spam(self):
518 return 42
519 self.assertEqual(C.name, 'C')
520 self.assertEqual(C.bases, ())
Ezio Melottiaa980582010-01-23 23:04:36 +0000521 self.assertIn('spam', C.dict)
Georg Brandl48545522008-02-02 10:12:36 +0000522 c = C()
523 self.assertEqual(c.spam(), 42)
Guido van Rossum9a818922002-11-14 19:50:14 +0000524
Georg Brandl48545522008-02-02 10:12:36 +0000525 # More metaclass examples
Guido van Rossum9a818922002-11-14 19:50:14 +0000526
Georg Brandl48545522008-02-02 10:12:36 +0000527 class autosuper(type):
528 # Automatically add __super to the class
529 # This trick only works for dynamic classes
530 def __new__(metaclass, name, bases, dict):
531 cls = super(autosuper, metaclass).__new__(metaclass,
532 name, bases, dict)
533 # Name mangling for __super removes leading underscores
534 while name[:1] == "_":
535 name = name[1:]
536 if name:
537 name = "_%s__super" % name
538 else:
539 name = "__super"
540 setattr(cls, name, super(cls))
541 return cls
542 class A:
543 __metaclass__ = autosuper
544 def meth(self):
545 return "A"
546 class B(A):
547 def meth(self):
548 return "B" + self.__super.meth()
549 class C(A):
550 def meth(self):
551 return "C" + self.__super.meth()
552 class D(C, B):
553 def meth(self):
554 return "D" + self.__super.meth()
555 self.assertEqual(D().meth(), "DCBA")
556 class E(B, C):
557 def meth(self):
558 return "E" + self.__super.meth()
559 self.assertEqual(E().meth(), "EBCA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000560
Georg Brandl48545522008-02-02 10:12:36 +0000561 class autoproperty(type):
562 # Automatically create property attributes when methods
563 # named _get_x and/or _set_x are found
564 def __new__(metaclass, name, bases, dict):
565 hits = {}
566 for key, val in dict.iteritems():
567 if key.startswith("_get_"):
568 key = key[5:]
569 get, set = hits.get(key, (None, None))
570 get = val
571 hits[key] = get, set
572 elif key.startswith("_set_"):
573 key = key[5:]
574 get, set = hits.get(key, (None, None))
575 set = val
576 hits[key] = get, set
577 for key, (get, set) in hits.iteritems():
578 dict[key] = property(get, set)
579 return super(autoproperty, metaclass).__new__(metaclass,
580 name, bases, dict)
581 class A:
582 __metaclass__ = autoproperty
583 def _get_x(self):
584 return -self.__x
585 def _set_x(self, x):
586 self.__x = -x
587 a = A()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000588 self.assertTrue(not hasattr(a, "x"))
Georg Brandl48545522008-02-02 10:12:36 +0000589 a.x = 12
590 self.assertEqual(a.x, 12)
591 self.assertEqual(a._A__x, -12)
Guido van Rossum9a818922002-11-14 19:50:14 +0000592
Georg Brandl48545522008-02-02 10:12:36 +0000593 class multimetaclass(autoproperty, autosuper):
594 # Merge of multiple cooperating metaclasses
595 pass
596 class A:
597 __metaclass__ = multimetaclass
598 def _get_x(self):
599 return "A"
600 class B(A):
601 def _get_x(self):
602 return "B" + self.__super._get_x()
603 class C(A):
604 def _get_x(self):
605 return "C" + self.__super._get_x()
606 class D(C, B):
607 def _get_x(self):
608 return "D" + self.__super._get_x()
609 self.assertEqual(D().x, "DCBA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000610
Georg Brandl48545522008-02-02 10:12:36 +0000611 # Make sure type(x) doesn't call x.__class__.__init__
612 class T(type):
613 counter = 0
614 def __init__(self, *args):
615 T.counter += 1
616 class C:
617 __metaclass__ = T
618 self.assertEqual(T.counter, 1)
619 a = C()
620 self.assertEqual(type(a), C)
621 self.assertEqual(T.counter, 1)
Guido van Rossum9a818922002-11-14 19:50:14 +0000622
Georg Brandl48545522008-02-02 10:12:36 +0000623 class C(object): pass
624 c = C()
625 try: c()
626 except TypeError: pass
627 else: self.fail("calling object w/o call method should raise "
628 "TypeError")
Guido van Rossum9a818922002-11-14 19:50:14 +0000629
Georg Brandl48545522008-02-02 10:12:36 +0000630 # Testing code to find most derived baseclass
631 class A(type):
632 def __new__(*args, **kwargs):
633 return type.__new__(*args, **kwargs)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000634
Georg Brandl48545522008-02-02 10:12:36 +0000635 class B(object):
636 pass
637
638 class C(object):
639 __metaclass__ = A
640
641 # The most derived metaclass of D is A rather than type.
642 class D(B, C):
643 pass
644
645 def test_module_subclasses(self):
646 # Testing Python subclass of module...
647 log = []
Georg Brandl48545522008-02-02 10:12:36 +0000648 MT = type(sys)
649 class MM(MT):
650 def __init__(self, name):
651 MT.__init__(self, name)
652 def __getattribute__(self, name):
653 log.append(("getattr", name))
654 return MT.__getattribute__(self, name)
655 def __setattr__(self, name, value):
656 log.append(("setattr", name, value))
657 MT.__setattr__(self, name, value)
658 def __delattr__(self, name):
659 log.append(("delattr", name))
660 MT.__delattr__(self, name)
661 a = MM("a")
662 a.foo = 12
663 x = a.foo
664 del a.foo
665 self.assertEqual(log, [("setattr", "foo", 12),
666 ("getattr", "foo"),
667 ("delattr", "foo")])
668
669 # http://python.org/sf/1174712
670 try:
671 class Module(types.ModuleType, str):
672 pass
673 except TypeError:
674 pass
675 else:
676 self.fail("inheriting from ModuleType and str at the same time "
677 "should fail")
678
679 def test_multiple_inheritence(self):
680 # Testing multiple inheritance...
681 class C(object):
682 def __init__(self):
683 self.__state = 0
684 def getstate(self):
685 return self.__state
686 def setstate(self, state):
687 self.__state = state
688 a = C()
689 self.assertEqual(a.getstate(), 0)
690 a.setstate(10)
691 self.assertEqual(a.getstate(), 10)
692 class D(dict, C):
693 def __init__(self):
694 type({}).__init__(self)
695 C.__init__(self)
696 d = D()
697 self.assertEqual(d.keys(), [])
698 d["hello"] = "world"
699 self.assertEqual(d.items(), [("hello", "world")])
700 self.assertEqual(d["hello"], "world")
701 self.assertEqual(d.getstate(), 0)
702 d.setstate(10)
703 self.assertEqual(d.getstate(), 10)
704 self.assertEqual(D.__mro__, (D, dict, C, object))
705
706 # SF bug #442833
707 class Node(object):
708 def __int__(self):
709 return int(self.foo())
710 def foo(self):
711 return "23"
712 class Frag(Node, list):
713 def foo(self):
714 return "42"
715 self.assertEqual(Node().__int__(), 23)
716 self.assertEqual(int(Node()), 23)
717 self.assertEqual(Frag().__int__(), 42)
718 self.assertEqual(int(Frag()), 42)
719
720 # MI mixing classic and new-style classes.
721
722 class A:
723 x = 1
724
725 class B(A):
726 pass
727
728 class C(A):
729 x = 2
730
731 class D(B, C):
732 pass
733 self.assertEqual(D.x, 1)
734
735 # Classic MRO is preserved for a classic base class.
736 class E(D, object):
737 pass
738 self.assertEqual(E.__mro__, (E, D, B, A, C, object))
739 self.assertEqual(E.x, 1)
740
741 # But with a mix of classic bases, their MROs are combined using
742 # new-style MRO.
743 class F(B, C, object):
744 pass
745 self.assertEqual(F.__mro__, (F, B, C, A, object))
746 self.assertEqual(F.x, 2)
747
748 # Try something else.
749 class C:
750 def cmethod(self):
751 return "C a"
752 def all_method(self):
753 return "C b"
754
755 class M1(C, object):
756 def m1method(self):
757 return "M1 a"
758 def all_method(self):
759 return "M1 b"
760
761 self.assertEqual(M1.__mro__, (M1, C, object))
762 m = M1()
763 self.assertEqual(m.cmethod(), "C a")
764 self.assertEqual(m.m1method(), "M1 a")
765 self.assertEqual(m.all_method(), "M1 b")
766
767 class D(C):
768 def dmethod(self):
769 return "D a"
770 def all_method(self):
771 return "D b"
772
773 class M2(D, object):
774 def m2method(self):
775 return "M2 a"
776 def all_method(self):
777 return "M2 b"
778
779 self.assertEqual(M2.__mro__, (M2, D, C, object))
780 m = M2()
781 self.assertEqual(m.cmethod(), "C a")
782 self.assertEqual(m.dmethod(), "D a")
783 self.assertEqual(m.m2method(), "M2 a")
784 self.assertEqual(m.all_method(), "M2 b")
785
786 class M3(M1, M2, object):
787 def m3method(self):
788 return "M3 a"
789 def all_method(self):
790 return "M3 b"
791 self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
792 m = M3()
793 self.assertEqual(m.cmethod(), "C a")
794 self.assertEqual(m.dmethod(), "D a")
795 self.assertEqual(m.m1method(), "M1 a")
796 self.assertEqual(m.m2method(), "M2 a")
797 self.assertEqual(m.m3method(), "M3 a")
798 self.assertEqual(m.all_method(), "M3 b")
799
800 class Classic:
801 pass
802 try:
803 class New(Classic):
804 __metaclass__ = type
805 except TypeError:
806 pass
807 else:
808 self.fail("new class with only classic bases - shouldn't be")
809
810 def test_diamond_inheritence(self):
811 # Testing multiple inheritance special cases...
812 class A(object):
813 def spam(self): return "A"
814 self.assertEqual(A().spam(), "A")
815 class B(A):
816 def boo(self): return "B"
817 def spam(self): return "B"
818 self.assertEqual(B().spam(), "B")
819 self.assertEqual(B().boo(), "B")
820 class C(A):
821 def boo(self): return "C"
822 self.assertEqual(C().spam(), "A")
823 self.assertEqual(C().boo(), "C")
824 class D(B, C): pass
825 self.assertEqual(D().spam(), "B")
826 self.assertEqual(D().boo(), "B")
827 self.assertEqual(D.__mro__, (D, B, C, A, object))
828 class E(C, B): pass
829 self.assertEqual(E().spam(), "B")
830 self.assertEqual(E().boo(), "C")
831 self.assertEqual(E.__mro__, (E, C, B, A, object))
832 # MRO order disagreement
833 try:
834 class F(D, E): pass
835 except TypeError:
836 pass
837 else:
838 self.fail("expected MRO order disagreement (F)")
839 try:
840 class G(E, D): pass
841 except TypeError:
842 pass
843 else:
844 self.fail("expected MRO order disagreement (G)")
845
846 # see thread python-dev/2002-October/029035.html
847 def test_ex5_from_c3_switch(self):
848 # Testing ex5 from C3 switch discussion...
849 class A(object): pass
850 class B(object): pass
851 class C(object): pass
852 class X(A): pass
853 class Y(A): pass
854 class Z(X,B,Y,C): pass
855 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
856
857 # see "A Monotonic Superclass Linearization for Dylan",
858 # by Kim Barrett et al. (OOPSLA 1996)
859 def test_monotonicity(self):
860 # Testing MRO monotonicity...
861 class Boat(object): pass
862 class DayBoat(Boat): pass
863 class WheelBoat(Boat): pass
864 class EngineLess(DayBoat): pass
865 class SmallMultihull(DayBoat): pass
866 class PedalWheelBoat(EngineLess,WheelBoat): pass
867 class SmallCatamaran(SmallMultihull): pass
868 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
869
870 self.assertEqual(PedalWheelBoat.__mro__,
871 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
872 self.assertEqual(SmallCatamaran.__mro__,
873 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
874 self.assertEqual(Pedalo.__mro__,
875 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
876 SmallMultihull, DayBoat, WheelBoat, Boat, object))
877
878 # see "A Monotonic Superclass Linearization for Dylan",
879 # by Kim Barrett et al. (OOPSLA 1996)
880 def test_consistency_with_epg(self):
Ezio Melotti24b07bc2011-03-15 18:55:01 +0200881 # Testing consistency with EPG...
Georg Brandl48545522008-02-02 10:12:36 +0000882 class Pane(object): pass
883 class ScrollingMixin(object): pass
884 class EditingMixin(object): pass
885 class ScrollablePane(Pane,ScrollingMixin): pass
886 class EditablePane(Pane,EditingMixin): pass
887 class EditableScrollablePane(ScrollablePane,EditablePane): pass
888
889 self.assertEqual(EditableScrollablePane.__mro__,
890 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
891 ScrollingMixin, EditingMixin, object))
892
893 def test_mro_disagreement(self):
894 # Testing error messages for MRO disagreement...
895 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000896order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000897
Georg Brandl48545522008-02-02 10:12:36 +0000898 def raises(exc, expected, callable, *args):
899 try:
900 callable(*args)
901 except exc, msg:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000902 # the exact msg is generally considered an impl detail
903 if test_support.check_impl_detail():
904 if not str(msg).startswith(expected):
905 self.fail("Message %r, expected %r" %
906 (str(msg), expected))
Georg Brandl48545522008-02-02 10:12:36 +0000907 else:
908 self.fail("Expected %s" % exc)
909
910 class A(object): pass
911 class B(A): pass
912 class C(object): pass
913
914 # Test some very simple errors
915 raises(TypeError, "duplicate base class A",
916 type, "X", (A, A), {})
917 raises(TypeError, mro_err_msg,
918 type, "X", (A, B), {})
919 raises(TypeError, mro_err_msg,
920 type, "X", (A, C, B), {})
921 # Test a slightly more complex error
922 class GridLayout(object): pass
923 class HorizontalGrid(GridLayout): pass
924 class VerticalGrid(GridLayout): pass
925 class HVGrid(HorizontalGrid, VerticalGrid): pass
926 class VHGrid(VerticalGrid, HorizontalGrid): pass
927 raises(TypeError, mro_err_msg,
928 type, "ConfusedGrid", (HVGrid, VHGrid), {})
929
930 def test_object_class(self):
931 # Testing object class...
932 a = object()
933 self.assertEqual(a.__class__, object)
934 self.assertEqual(type(a), object)
935 b = object()
936 self.assertNotEqual(a, b)
937 self.assertFalse(hasattr(a, "foo"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000938 try:
Georg Brandl48545522008-02-02 10:12:36 +0000939 a.foo = 12
940 except (AttributeError, TypeError):
941 pass
Guido van Rossumd32047f2002-11-25 21:38:52 +0000942 else:
Georg Brandl48545522008-02-02 10:12:36 +0000943 self.fail("object() should not allow setting a foo attribute")
944 self.assertFalse(hasattr(object(), "__dict__"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000945
Georg Brandl48545522008-02-02 10:12:36 +0000946 class Cdict(object):
947 pass
948 x = Cdict()
949 self.assertEqual(x.__dict__, {})
950 x.foo = 1
951 self.assertEqual(x.foo, 1)
952 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000953
Georg Brandl48545522008-02-02 10:12:36 +0000954 def test_slots(self):
955 # Testing __slots__...
956 class C0(object):
957 __slots__ = []
958 x = C0()
959 self.assertFalse(hasattr(x, "__dict__"))
960 self.assertFalse(hasattr(x, "foo"))
Guido van Rossum37202612001-08-09 19:45:21 +0000961
Georg Brandl48545522008-02-02 10:12:36 +0000962 class C1(object):
963 __slots__ = ['a']
964 x = C1()
965 self.assertFalse(hasattr(x, "__dict__"))
966 self.assertFalse(hasattr(x, "a"))
967 x.a = 1
968 self.assertEqual(x.a, 1)
969 x.a = None
970 self.assertEqual(x.a, None)
971 del x.a
972 self.assertFalse(hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000973
Georg Brandl48545522008-02-02 10:12:36 +0000974 class C3(object):
975 __slots__ = ['a', 'b', 'c']
976 x = C3()
977 self.assertFalse(hasattr(x, "__dict__"))
978 self.assertFalse(hasattr(x, 'a'))
979 self.assertFalse(hasattr(x, 'b'))
980 self.assertFalse(hasattr(x, 'c'))
981 x.a = 1
982 x.b = 2
983 x.c = 3
984 self.assertEqual(x.a, 1)
985 self.assertEqual(x.b, 2)
986 self.assertEqual(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987
Georg Brandl48545522008-02-02 10:12:36 +0000988 class C4(object):
989 """Validate name mangling"""
990 __slots__ = ['__a']
991 def __init__(self, value):
992 self.__a = value
993 def get(self):
994 return self.__a
995 x = C4(5)
996 self.assertFalse(hasattr(x, '__dict__'))
997 self.assertFalse(hasattr(x, '__a'))
998 self.assertEqual(x.get(), 5)
999 try:
1000 x.__a = 6
1001 except AttributeError:
1002 pass
1003 else:
1004 self.fail("Double underscored names not mangled")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001005
Georg Brandl48545522008-02-02 10:12:36 +00001006 # Make sure slot names are proper identifiers
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001007 try:
1008 class C(object):
Georg Brandl48545522008-02-02 10:12:36 +00001009 __slots__ = [None]
Guido van Rossum843daa82001-09-18 20:04:26 +00001010 except TypeError:
1011 pass
1012 else:
Georg Brandl48545522008-02-02 10:12:36 +00001013 self.fail("[None] slots not caught")
Tim Peters66c1a522001-09-24 21:17:50 +00001014 try:
Georg Brandl48545522008-02-02 10:12:36 +00001015 class C(object):
1016 __slots__ = ["foo bar"]
1017 except TypeError:
Georg Brandl533ff6f2006-03-08 18:09:27 +00001018 pass
Georg Brandl48545522008-02-02 10:12:36 +00001019 else:
1020 self.fail("['foo bar'] slots not caught")
1021 try:
1022 class C(object):
1023 __slots__ = ["foo\0bar"]
1024 except TypeError:
1025 pass
1026 else:
1027 self.fail("['foo\\0bar'] slots not caught")
1028 try:
1029 class C(object):
1030 __slots__ = ["1"]
1031 except TypeError:
1032 pass
1033 else:
1034 self.fail("['1'] slots not caught")
1035 try:
1036 class C(object):
1037 __slots__ = [""]
1038 except TypeError:
1039 pass
1040 else:
1041 self.fail("[''] slots not caught")
1042 class C(object):
1043 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1044 # XXX(nnorwitz): was there supposed to be something tested
1045 # from the class above?
Georg Brandl533ff6f2006-03-08 18:09:27 +00001046
Georg Brandl48545522008-02-02 10:12:36 +00001047 # Test a single string is not expanded as a sequence.
1048 class C(object):
1049 __slots__ = "abc"
1050 c = C()
1051 c.abc = 5
1052 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001053
Georg Brandl48545522008-02-02 10:12:36 +00001054 # Test unicode slot names
1055 try:
1056 unicode
1057 except NameError:
1058 pass
1059 else:
1060 # Test a single unicode string is not expanded as a sequence.
1061 class C(object):
1062 __slots__ = unicode("abc")
1063 c = C()
1064 c.abc = 5
1065 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001066
Georg Brandl48545522008-02-02 10:12:36 +00001067 # _unicode_to_string used to modify slots in certain circumstances
1068 slots = (unicode("foo"), unicode("bar"))
1069 class C(object):
1070 __slots__ = slots
1071 x = C()
1072 x.foo = 5
1073 self.assertEqual(x.foo, 5)
1074 self.assertEqual(type(slots[0]), unicode)
1075 # this used to leak references
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001076 try:
Georg Brandl48545522008-02-02 10:12:36 +00001077 class C(object):
1078 __slots__ = [unichr(128)]
1079 except (TypeError, UnicodeEncodeError):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001080 pass
Tim Peters8fa45672001-09-13 21:01:29 +00001081 else:
Georg Brandl48545522008-02-02 10:12:36 +00001082 self.fail("[unichr(128)] slots not caught")
Tim Peters8fa45672001-09-13 21:01:29 +00001083
Georg Brandl48545522008-02-02 10:12:36 +00001084 # Test leaks
1085 class Counted(object):
1086 counter = 0 # counts the number of instances alive
1087 def __init__(self):
1088 Counted.counter += 1
1089 def __del__(self):
1090 Counted.counter -= 1
1091 class C(object):
1092 __slots__ = ['a', 'b', 'c']
Guido van Rossum8c842552002-03-14 23:05:54 +00001093 x = C()
Georg Brandl48545522008-02-02 10:12:36 +00001094 x.a = Counted()
1095 x.b = Counted()
1096 x.c = Counted()
1097 self.assertEqual(Counted.counter, 3)
1098 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001099 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001100 self.assertEqual(Counted.counter, 0)
1101 class D(C):
1102 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00001103 x = D()
Georg Brandl48545522008-02-02 10:12:36 +00001104 x.a = Counted()
1105 x.z = Counted()
1106 self.assertEqual(Counted.counter, 2)
1107 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001108 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001109 self.assertEqual(Counted.counter, 0)
1110 class E(D):
1111 __slots__ = ['e']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00001112 x = E()
Georg Brandl48545522008-02-02 10:12:36 +00001113 x.a = Counted()
1114 x.z = Counted()
1115 x.e = Counted()
1116 self.assertEqual(Counted.counter, 3)
1117 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001118 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001119 self.assertEqual(Counted.counter, 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00001120
Georg Brandl48545522008-02-02 10:12:36 +00001121 # Test cyclical leaks [SF bug 519621]
1122 class F(object):
1123 __slots__ = ['a', 'b']
Georg Brandl48545522008-02-02 10:12:36 +00001124 s = F()
1125 s.a = [Counted(), s]
1126 self.assertEqual(Counted.counter, 1)
1127 s = None
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001128 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001129 self.assertEqual(Counted.counter, 0)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001130
Georg Brandl48545522008-02-02 10:12:36 +00001131 # Test lookup leaks [SF bug 572567]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001132 if hasattr(gc, 'get_objects'):
1133 class G(object):
1134 def __cmp__(self, other):
1135 return 0
1136 __hash__ = None # Silence Py3k warning
1137 g = G()
1138 orig_objects = len(gc.get_objects())
1139 for i in xrange(10):
1140 g==g
1141 new_objects = len(gc.get_objects())
1142 self.assertEqual(orig_objects, new_objects)
1143
Georg Brandl48545522008-02-02 10:12:36 +00001144 class H(object):
1145 __slots__ = ['a', 'b']
1146 def __init__(self):
1147 self.a = 1
1148 self.b = 2
1149 def __del__(self_):
1150 self.assertEqual(self_.a, 1)
1151 self.assertEqual(self_.b, 2)
Armin Rigo581eb1e2008-10-28 17:01:21 +00001152 with test_support.captured_output('stderr') as s:
1153 h = H()
Georg Brandl48545522008-02-02 10:12:36 +00001154 del h
Armin Rigo581eb1e2008-10-28 17:01:21 +00001155 self.assertEqual(s.getvalue(), '')
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001156
Benjamin Peterson0f02d392009-12-30 19:34:10 +00001157 class X(object):
1158 __slots__ = "a"
1159 with self.assertRaises(AttributeError):
1160 del X().a
1161
Georg Brandl48545522008-02-02 10:12:36 +00001162 def test_slots_special(self):
1163 # Testing __dict__ and __weakref__ in __slots__...
1164 class D(object):
1165 __slots__ = ["__dict__"]
1166 a = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001167 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl48545522008-02-02 10:12:36 +00001168 self.assertFalse(hasattr(a, "__weakref__"))
1169 a.foo = 42
1170 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001171
Georg Brandl48545522008-02-02 10:12:36 +00001172 class W(object):
1173 __slots__ = ["__weakref__"]
1174 a = W()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001175 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001176 self.assertFalse(hasattr(a, "__dict__"))
1177 try:
1178 a.foo = 42
1179 except AttributeError:
1180 pass
1181 else:
1182 self.fail("shouldn't be allowed to set a.foo")
1183
1184 class C1(W, D):
1185 __slots__ = []
1186 a = C1()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001187 self.assertTrue(hasattr(a, "__dict__"))
1188 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001189 a.foo = 42
1190 self.assertEqual(a.__dict__, {"foo": 42})
1191
1192 class C2(D, W):
1193 __slots__ = []
1194 a = C2()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001195 self.assertTrue(hasattr(a, "__dict__"))
1196 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001197 a.foo = 42
1198 self.assertEqual(a.__dict__, {"foo": 42})
1199
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001200 def test_slots_descriptor(self):
1201 # Issue2115: slot descriptors did not correctly check
1202 # the type of the given object
1203 import abc
1204 class MyABC:
1205 __metaclass__ = abc.ABCMeta
1206 __slots__ = "a"
1207
1208 class Unrelated(object):
1209 pass
1210 MyABC.register(Unrelated)
1211
1212 u = Unrelated()
Ezio Melottib0f5adc2010-01-24 16:58:36 +00001213 self.assertIsInstance(u, MyABC)
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001214
1215 # This used to crash
1216 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1217
Benjamin Peterson4895af42009-12-13 16:36:53 +00001218 def test_metaclass_cmp(self):
1219 # See bug 7491.
1220 class M(type):
1221 def __cmp__(self, other):
1222 return -1
1223 class X(object):
1224 __metaclass__ = M
1225 self.assertTrue(X < M)
1226
Georg Brandl48545522008-02-02 10:12:36 +00001227 def test_dynamics(self):
1228 # Testing class attribute propagation...
1229 class D(object):
1230 pass
1231 class E(D):
1232 pass
1233 class F(D):
1234 pass
1235 D.foo = 1
1236 self.assertEqual(D.foo, 1)
1237 # Test that dynamic attributes are inherited
1238 self.assertEqual(E.foo, 1)
1239 self.assertEqual(F.foo, 1)
1240 # Test dynamic instances
1241 class C(object):
1242 pass
1243 a = C()
1244 self.assertFalse(hasattr(a, "foobar"))
1245 C.foobar = 2
1246 self.assertEqual(a.foobar, 2)
1247 C.method = lambda self: 42
1248 self.assertEqual(a.method(), 42)
1249 C.__repr__ = lambda self: "C()"
1250 self.assertEqual(repr(a), "C()")
1251 C.__int__ = lambda self: 100
1252 self.assertEqual(int(a), 100)
1253 self.assertEqual(a.foobar, 2)
1254 self.assertFalse(hasattr(a, "spam"))
1255 def mygetattr(self, name):
1256 if name == "spam":
1257 return "spam"
1258 raise AttributeError
1259 C.__getattr__ = mygetattr
1260 self.assertEqual(a.spam, "spam")
1261 a.new = 12
1262 self.assertEqual(a.new, 12)
1263 def mysetattr(self, name, value):
1264 if name == "spam":
1265 raise AttributeError
1266 return object.__setattr__(self, name, value)
1267 C.__setattr__ = mysetattr
1268 try:
1269 a.spam = "not spam"
1270 except AttributeError:
1271 pass
1272 else:
1273 self.fail("expected AttributeError")
1274 self.assertEqual(a.spam, "spam")
1275 class D(C):
1276 pass
1277 d = D()
1278 d.foo = 1
1279 self.assertEqual(d.foo, 1)
1280
1281 # Test handling of int*seq and seq*int
1282 class I(int):
1283 pass
1284 self.assertEqual("a"*I(2), "aa")
1285 self.assertEqual(I(2)*"a", "aa")
1286 self.assertEqual(2*I(3), 6)
1287 self.assertEqual(I(3)*2, 6)
1288 self.assertEqual(I(3)*I(2), 6)
1289
1290 # Test handling of long*seq and seq*long
1291 class L(long):
1292 pass
1293 self.assertEqual("a"*L(2L), "aa")
1294 self.assertEqual(L(2L)*"a", "aa")
1295 self.assertEqual(2*L(3), 6)
1296 self.assertEqual(L(3)*2, 6)
1297 self.assertEqual(L(3)*L(2), 6)
1298
1299 # Test comparison of classes with dynamic metaclasses
1300 class dynamicmetaclass(type):
1301 pass
1302 class someclass:
1303 __metaclass__ = dynamicmetaclass
1304 self.assertNotEqual(someclass, object)
1305
1306 def test_errors(self):
1307 # Testing errors...
1308 try:
1309 class C(list, dict):
1310 pass
1311 except TypeError:
1312 pass
1313 else:
1314 self.fail("inheritance from both list and dict should be illegal")
1315
1316 try:
1317 class C(object, None):
1318 pass
1319 except TypeError:
1320 pass
1321 else:
1322 self.fail("inheritance from non-type should be illegal")
1323 class Classic:
1324 pass
1325
1326 try:
1327 class C(type(len)):
1328 pass
1329 except TypeError:
1330 pass
1331 else:
1332 self.fail("inheritance from CFunction should be illegal")
1333
1334 try:
1335 class C(object):
1336 __slots__ = 1
1337 except TypeError:
1338 pass
1339 else:
1340 self.fail("__slots__ = 1 should be illegal")
1341
1342 try:
1343 class C(object):
1344 __slots__ = [1]
1345 except TypeError:
1346 pass
1347 else:
1348 self.fail("__slots__ = [1] should be illegal")
1349
1350 class M1(type):
1351 pass
1352 class M2(type):
1353 pass
1354 class A1(object):
1355 __metaclass__ = M1
1356 class A2(object):
1357 __metaclass__ = M2
1358 try:
1359 class B(A1, A2):
1360 pass
1361 except TypeError:
1362 pass
1363 else:
1364 self.fail("finding the most derived metaclass should have failed")
1365
1366 def test_classmethods(self):
1367 # Testing class methods...
1368 class C(object):
1369 def foo(*a): return a
1370 goo = classmethod(foo)
1371 c = C()
1372 self.assertEqual(C.goo(1), (C, 1))
1373 self.assertEqual(c.goo(1), (C, 1))
1374 self.assertEqual(c.foo(1), (c, 1))
1375 class D(C):
1376 pass
1377 d = D()
1378 self.assertEqual(D.goo(1), (D, 1))
1379 self.assertEqual(d.goo(1), (D, 1))
1380 self.assertEqual(d.foo(1), (d, 1))
1381 self.assertEqual(D.foo(d, 1), (d, 1))
1382 # Test for a specific crash (SF bug 528132)
1383 def f(cls, arg): return (cls, arg)
1384 ff = classmethod(f)
1385 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1386 self.assertEqual(ff.__get__(0)(42), (int, 42))
1387
1388 # Test super() with classmethods (SF bug 535444)
1389 self.assertEqual(C.goo.im_self, C)
1390 self.assertEqual(D.goo.im_self, D)
1391 self.assertEqual(super(D,D).goo.im_self, D)
1392 self.assertEqual(super(D,d).goo.im_self, D)
1393 self.assertEqual(super(D,D).goo(), (D,))
1394 self.assertEqual(super(D,d).goo(), (D,))
1395
Benjamin Peterson6fcf9b52009-09-01 22:27:57 +00001396 # Verify that a non-callable will raise
1397 meth = classmethod(1).__get__(1)
1398 self.assertRaises(TypeError, meth)
Georg Brandl48545522008-02-02 10:12:36 +00001399
1400 # Verify that classmethod() doesn't allow keyword args
1401 try:
1402 classmethod(f, kw=1)
1403 except TypeError:
1404 pass
1405 else:
1406 self.fail("classmethod shouldn't accept keyword args")
1407
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001408 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001409 def test_classmethods_in_c(self):
1410 # Testing C-based class methods...
1411 import xxsubtype as spam
1412 a = (1, 2, 3)
1413 d = {'abc': 123}
1414 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1415 self.assertEqual(x, spam.spamlist)
1416 self.assertEqual(a, a1)
1417 self.assertEqual(d, d1)
1418 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1419 self.assertEqual(x, spam.spamlist)
1420 self.assertEqual(a, a1)
1421 self.assertEqual(d, d1)
Benjamin Peterson042c47b2012-05-01 09:51:09 -04001422 spam_cm = spam.spamlist.__dict__['classmeth']
1423 x2, a2, d2 = spam_cm(spam.spamlist, *a, **d)
1424 self.assertEqual(x2, spam.spamlist)
1425 self.assertEqual(a2, a1)
1426 self.assertEqual(d2, d1)
1427 class SubSpam(spam.spamlist): pass
1428 x2, a2, d2 = spam_cm(SubSpam, *a, **d)
1429 self.assertEqual(x2, SubSpam)
1430 self.assertEqual(a2, a1)
1431 self.assertEqual(d2, d1)
1432 with self.assertRaises(TypeError):
1433 spam_cm()
1434 with self.assertRaises(TypeError):
1435 spam_cm(spam.spamlist())
1436 with self.assertRaises(TypeError):
1437 spam_cm(list)
Georg Brandl48545522008-02-02 10:12:36 +00001438
1439 def test_staticmethods(self):
1440 # Testing static methods...
1441 class C(object):
1442 def foo(*a): return a
1443 goo = staticmethod(foo)
1444 c = C()
1445 self.assertEqual(C.goo(1), (1,))
1446 self.assertEqual(c.goo(1), (1,))
1447 self.assertEqual(c.foo(1), (c, 1,))
1448 class D(C):
1449 pass
1450 d = D()
1451 self.assertEqual(D.goo(1), (1,))
1452 self.assertEqual(d.goo(1), (1,))
1453 self.assertEqual(d.foo(1), (d, 1))
1454 self.assertEqual(D.foo(d, 1), (d, 1))
1455
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001456 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001457 def test_staticmethods_in_c(self):
1458 # Testing C-based static methods...
1459 import xxsubtype as spam
1460 a = (1, 2, 3)
1461 d = {"abc": 123}
1462 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1463 self.assertEqual(x, None)
1464 self.assertEqual(a, a1)
1465 self.assertEqual(d, d1)
1466 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1467 self.assertEqual(x, None)
1468 self.assertEqual(a, a1)
1469 self.assertEqual(d, d1)
1470
1471 def test_classic(self):
1472 # Testing classic classes...
1473 class C:
1474 def foo(*a): return a
1475 goo = classmethod(foo)
1476 c = C()
1477 self.assertEqual(C.goo(1), (C, 1))
1478 self.assertEqual(c.goo(1), (C, 1))
1479 self.assertEqual(c.foo(1), (c, 1))
1480 class D(C):
1481 pass
1482 d = D()
1483 self.assertEqual(D.goo(1), (D, 1))
1484 self.assertEqual(d.goo(1), (D, 1))
1485 self.assertEqual(d.foo(1), (d, 1))
1486 self.assertEqual(D.foo(d, 1), (d, 1))
1487 class E: # *not* subclassing from C
1488 foo = C.foo
1489 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001490 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001491
1492 def test_compattr(self):
1493 # Testing computed attributes...
1494 class C(object):
1495 class computed_attribute(object):
1496 def __init__(self, get, set=None, delete=None):
1497 self.__get = get
1498 self.__set = set
1499 self.__delete = delete
1500 def __get__(self, obj, type=None):
1501 return self.__get(obj)
1502 def __set__(self, obj, value):
1503 return self.__set(obj, value)
1504 def __delete__(self, obj):
1505 return self.__delete(obj)
1506 def __init__(self):
1507 self.__x = 0
1508 def __get_x(self):
1509 x = self.__x
1510 self.__x = x+1
1511 return x
1512 def __set_x(self, x):
1513 self.__x = x
1514 def __delete_x(self):
1515 del self.__x
1516 x = computed_attribute(__get_x, __set_x, __delete_x)
1517 a = C()
1518 self.assertEqual(a.x, 0)
1519 self.assertEqual(a.x, 1)
1520 a.x = 10
1521 self.assertEqual(a.x, 10)
1522 self.assertEqual(a.x, 11)
1523 del a.x
1524 self.assertEqual(hasattr(a, 'x'), 0)
1525
1526 def test_newslots(self):
1527 # Testing __new__ slot override...
1528 class C(list):
1529 def __new__(cls):
1530 self = list.__new__(cls)
1531 self.foo = 1
1532 return self
1533 def __init__(self):
1534 self.foo = self.foo + 2
1535 a = C()
1536 self.assertEqual(a.foo, 3)
1537 self.assertEqual(a.__class__, C)
1538 class D(C):
1539 pass
1540 b = D()
1541 self.assertEqual(b.foo, 3)
1542 self.assertEqual(b.__class__, D)
1543
1544 def test_altmro(self):
1545 # Testing mro() and overriding it...
1546 class A(object):
1547 def f(self): return "A"
1548 class B(A):
1549 pass
1550 class C(A):
1551 def f(self): return "C"
1552 class D(B, C):
1553 pass
1554 self.assertEqual(D.mro(), [D, B, C, A, object])
1555 self.assertEqual(D.__mro__, (D, B, C, A, object))
1556 self.assertEqual(D().f(), "C")
1557
1558 class PerverseMetaType(type):
1559 def mro(cls):
1560 L = type.mro(cls)
1561 L.reverse()
1562 return L
1563 class X(D,B,C,A):
1564 __metaclass__ = PerverseMetaType
1565 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1566 self.assertEqual(X().f(), "A")
1567
1568 try:
1569 class X(object):
1570 class __metaclass__(type):
1571 def mro(self):
1572 return [self, dict, object]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001573 # In CPython, the class creation above already raises
1574 # TypeError, as a protection against the fact that
1575 # instances of X would segfault it. In other Python
1576 # implementations it would be ok to let the class X
1577 # be created, but instead get a clean TypeError on the
1578 # __setitem__ below.
1579 x = object.__new__(X)
1580 x[5] = 6
Georg Brandl48545522008-02-02 10:12:36 +00001581 except TypeError:
1582 pass
1583 else:
1584 self.fail("devious mro() return not caught")
1585
1586 try:
1587 class X(object):
1588 class __metaclass__(type):
1589 def mro(self):
1590 return [1]
1591 except TypeError:
1592 pass
1593 else:
1594 self.fail("non-class mro() return not caught")
1595
1596 try:
1597 class X(object):
1598 class __metaclass__(type):
1599 def mro(self):
1600 return 1
1601 except TypeError:
1602 pass
1603 else:
1604 self.fail("non-sequence mro() return not caught")
1605
1606 def test_overloading(self):
1607 # Testing operator overloading...
1608
1609 class B(object):
1610 "Intermediate class because object doesn't have a __setattr__"
1611
1612 class C(B):
1613 def __getattr__(self, name):
1614 if name == "foo":
1615 return ("getattr", name)
1616 else:
1617 raise AttributeError
1618 def __setattr__(self, name, value):
1619 if name == "foo":
1620 self.setattr = (name, value)
1621 else:
1622 return B.__setattr__(self, name, value)
1623 def __delattr__(self, name):
1624 if name == "foo":
1625 self.delattr = name
1626 else:
1627 return B.__delattr__(self, name)
1628
1629 def __getitem__(self, key):
1630 return ("getitem", key)
1631 def __setitem__(self, key, value):
1632 self.setitem = (key, value)
1633 def __delitem__(self, key):
1634 self.delitem = key
1635
1636 def __getslice__(self, i, j):
1637 return ("getslice", i, j)
1638 def __setslice__(self, i, j, value):
1639 self.setslice = (i, j, value)
1640 def __delslice__(self, i, j):
1641 self.delslice = (i, j)
1642
1643 a = C()
1644 self.assertEqual(a.foo, ("getattr", "foo"))
1645 a.foo = 12
1646 self.assertEqual(a.setattr, ("foo", 12))
1647 del a.foo
1648 self.assertEqual(a.delattr, "foo")
1649
1650 self.assertEqual(a[12], ("getitem", 12))
1651 a[12] = 21
1652 self.assertEqual(a.setitem, (12, 21))
1653 del a[12]
1654 self.assertEqual(a.delitem, 12)
1655
1656 self.assertEqual(a[0:10], ("getslice", 0, 10))
1657 a[0:10] = "foo"
1658 self.assertEqual(a.setslice, (0, 10, "foo"))
1659 del a[0:10]
1660 self.assertEqual(a.delslice, (0, 10))
1661
1662 def test_methods(self):
1663 # Testing methods...
1664 class C(object):
1665 def __init__(self, x):
1666 self.x = x
1667 def foo(self):
1668 return self.x
1669 c1 = C(1)
1670 self.assertEqual(c1.foo(), 1)
1671 class D(C):
1672 boo = C.foo
1673 goo = c1.foo
1674 d2 = D(2)
1675 self.assertEqual(d2.foo(), 2)
1676 self.assertEqual(d2.boo(), 2)
1677 self.assertEqual(d2.goo(), 1)
1678 class E(object):
1679 foo = C.foo
1680 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001681 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001682
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001683 def test_special_method_lookup(self):
1684 # The lookup of special methods bypasses __getattr__ and
1685 # __getattribute__, but they still can be descriptors.
1686
1687 def run_context(manager):
1688 with manager:
1689 pass
1690 def iden(self):
1691 return self
1692 def hello(self):
1693 return "hello"
Benjamin Peterson809e2252009-05-09 02:07:04 +00001694 def empty_seq(self):
1695 return []
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001696 def zero(self):
1697 return 0
Benjamin Petersonecdae192010-01-04 00:43:01 +00001698 def complex_num(self):
1699 return 1j
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001700 def stop(self):
1701 raise StopIteration
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001702 def return_true(self, thing=None):
1703 return True
1704 def do_isinstance(obj):
1705 return isinstance(int, obj)
1706 def do_issubclass(obj):
1707 return issubclass(int, obj)
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001708 def swallow(*args):
1709 pass
1710 def do_dict_missing(checker):
1711 class DictSub(checker.__class__, dict):
1712 pass
1713 self.assertEqual(DictSub()["hi"], 4)
1714 def some_number(self_, key):
1715 self.assertEqual(key, "hi")
1716 return 4
Benjamin Peterson2aa6c382010-06-05 00:32:50 +00001717 def format_impl(self, spec):
1718 return "hello"
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001719
1720 # It would be nice to have every special method tested here, but I'm
1721 # only listing the ones I can remember outside of typeobject.c, since it
1722 # does it right.
1723 specials = [
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001724 ("__unicode__", unicode, hello, set(), {}),
1725 ("__reversed__", reversed, empty_seq, set(), {}),
1726 ("__length_hint__", list, zero, set(),
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001727 {"__iter__" : iden, "next" : stop}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001728 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1729 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001730 ("__missing__", do_dict_missing, some_number,
1731 set(("__class__",)), {}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001732 ("__subclasscheck__", do_issubclass, return_true,
1733 set(("__bases__",)), {}),
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00001734 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1735 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Petersonecdae192010-01-04 00:43:01 +00001736 ("__complex__", complex, complex_num, set(), {}),
Benjamin Peterson2aa6c382010-06-05 00:32:50 +00001737 ("__format__", format, format_impl, set(), {}),
Benjamin Peterson8de87a62011-05-23 16:11:05 -05001738 ("__dir__", dir, empty_seq, set(), {}),
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001739 ]
1740
1741 class Checker(object):
1742 def __getattr__(self, attr, test=self):
1743 test.fail("__getattr__ called with {0}".format(attr))
1744 def __getattribute__(self, attr, test=self):
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001745 if attr not in ok:
1746 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001747 return object.__getattribute__(self, attr)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001748 class SpecialDescr(object):
1749 def __init__(self, impl):
1750 self.impl = impl
1751 def __get__(self, obj, owner):
1752 record.append(1)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001753 return self.impl.__get__(obj, owner)
Benjamin Peterson87e50062009-05-25 02:40:21 +00001754 class MyException(Exception):
1755 pass
1756 class ErrDescr(object):
1757 def __get__(self, obj, owner):
1758 raise MyException
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001759
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001760 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001761 class X(Checker):
1762 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001763 for attr, obj in env.iteritems():
1764 setattr(X, attr, obj)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001765 setattr(X, name, meth_impl)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001766 runner(X())
1767
1768 record = []
1769 class X(Checker):
1770 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001771 for attr, obj in env.iteritems():
1772 setattr(X, attr, obj)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001773 setattr(X, name, SpecialDescr(meth_impl))
1774 runner(X())
1775 self.assertEqual(record, [1], name)
1776
Benjamin Peterson87e50062009-05-25 02:40:21 +00001777 class X(Checker):
1778 pass
1779 for attr, obj in env.iteritems():
1780 setattr(X, attr, obj)
1781 setattr(X, name, ErrDescr())
1782 try:
1783 runner(X())
1784 except MyException:
1785 pass
1786 else:
1787 self.fail("{0!r} didn't raise".format(name))
1788
Georg Brandl48545522008-02-02 10:12:36 +00001789 def test_specials(self):
1790 # Testing special operators...
1791 # Test operators like __hash__ for which a built-in default exists
1792
1793 # Test the default behavior for static classes
1794 class C(object):
1795 def __getitem__(self, i):
1796 if 0 <= i < 10: return i
1797 raise IndexError
1798 c1 = C()
1799 c2 = C()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001800 self.assertTrue(not not c1) # What?
Georg Brandl48545522008-02-02 10:12:36 +00001801 self.assertNotEqual(id(c1), id(c2))
1802 hash(c1)
1803 hash(c2)
1804 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1805 self.assertEqual(c1, c1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001806 self.assertTrue(c1 != c2)
1807 self.assertTrue(not c1 != c1)
1808 self.assertTrue(not c1 == c2)
Georg Brandl48545522008-02-02 10:12:36 +00001809 # Note that the module name appears in str/repr, and that varies
1810 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001811 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001812 self.assertEqual(str(c1), repr(c1))
Ezio Melottiaa980582010-01-23 23:04:36 +00001813 self.assertNotIn(-1, c1)
Georg Brandl48545522008-02-02 10:12:36 +00001814 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001815 self.assertIn(i, c1)
1816 self.assertNotIn(10, c1)
Georg Brandl48545522008-02-02 10:12:36 +00001817 # Test the default behavior for dynamic classes
1818 class D(object):
1819 def __getitem__(self, i):
1820 if 0 <= i < 10: return i
1821 raise IndexError
1822 d1 = D()
1823 d2 = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001824 self.assertTrue(not not d1)
Georg Brandl48545522008-02-02 10:12:36 +00001825 self.assertNotEqual(id(d1), id(d2))
1826 hash(d1)
1827 hash(d2)
1828 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1829 self.assertEqual(d1, d1)
1830 self.assertNotEqual(d1, d2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001831 self.assertTrue(not d1 != d1)
1832 self.assertTrue(not d1 == d2)
Georg Brandl48545522008-02-02 10:12:36 +00001833 # Note that the module name appears in str/repr, and that varies
1834 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001835 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001836 self.assertEqual(str(d1), repr(d1))
Ezio Melottiaa980582010-01-23 23:04:36 +00001837 self.assertNotIn(-1, d1)
Georg Brandl48545522008-02-02 10:12:36 +00001838 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001839 self.assertIn(i, d1)
1840 self.assertNotIn(10, d1)
Georg Brandl48545522008-02-02 10:12:36 +00001841 # Test overridden behavior for static classes
1842 class Proxy(object):
1843 def __init__(self, x):
1844 self.x = x
1845 def __nonzero__(self):
1846 return not not self.x
1847 def __hash__(self):
1848 return hash(self.x)
1849 def __eq__(self, other):
1850 return self.x == other
1851 def __ne__(self, other):
1852 return self.x != other
1853 def __cmp__(self, other):
1854 return cmp(self.x, other.x)
1855 def __str__(self):
1856 return "Proxy:%s" % self.x
1857 def __repr__(self):
1858 return "Proxy(%r)" % self.x
1859 def __contains__(self, value):
1860 return value in self.x
1861 p0 = Proxy(0)
1862 p1 = Proxy(1)
1863 p_1 = Proxy(-1)
1864 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001865 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001866 self.assertEqual(hash(p0), hash(0))
1867 self.assertEqual(p0, p0)
1868 self.assertNotEqual(p0, p1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001869 self.assertTrue(not p0 != p0)
Georg Brandl48545522008-02-02 10:12:36 +00001870 self.assertEqual(not p0, p1)
1871 self.assertEqual(cmp(p0, p1), -1)
1872 self.assertEqual(cmp(p0, p0), 0)
1873 self.assertEqual(cmp(p0, p_1), 1)
1874 self.assertEqual(str(p0), "Proxy:0")
1875 self.assertEqual(repr(p0), "Proxy(0)")
1876 p10 = Proxy(range(10))
Ezio Melottiaa980582010-01-23 23:04:36 +00001877 self.assertNotIn(-1, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001878 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001879 self.assertIn(i, p10)
1880 self.assertNotIn(10, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001881 # Test overridden behavior for dynamic classes
1882 class DProxy(object):
1883 def __init__(self, x):
1884 self.x = x
1885 def __nonzero__(self):
1886 return not not self.x
1887 def __hash__(self):
1888 return hash(self.x)
1889 def __eq__(self, other):
1890 return self.x == other
1891 def __ne__(self, other):
1892 return self.x != other
1893 def __cmp__(self, other):
1894 return cmp(self.x, other.x)
1895 def __str__(self):
1896 return "DProxy:%s" % self.x
1897 def __repr__(self):
1898 return "DProxy(%r)" % self.x
1899 def __contains__(self, value):
1900 return value in self.x
1901 p0 = DProxy(0)
1902 p1 = DProxy(1)
1903 p_1 = DProxy(-1)
1904 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001905 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001906 self.assertEqual(hash(p0), hash(0))
1907 self.assertEqual(p0, p0)
1908 self.assertNotEqual(p0, p1)
1909 self.assertNotEqual(not p0, p0)
1910 self.assertEqual(not p0, p1)
1911 self.assertEqual(cmp(p0, p1), -1)
1912 self.assertEqual(cmp(p0, p0), 0)
1913 self.assertEqual(cmp(p0, p_1), 1)
1914 self.assertEqual(str(p0), "DProxy:0")
1915 self.assertEqual(repr(p0), "DProxy(0)")
1916 p10 = DProxy(range(10))
Ezio Melottiaa980582010-01-23 23:04:36 +00001917 self.assertNotIn(-1, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001918 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001919 self.assertIn(i, p10)
1920 self.assertNotIn(10, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001921
1922 # Safety test for __cmp__
1923 def unsafecmp(a, b):
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001924 if not hasattr(a, '__cmp__'):
1925 return # some types don't have a __cmp__ any more (so the
1926 # test doesn't make sense any more), or maybe they
1927 # never had a __cmp__ at all, e.g. in PyPy
Georg Brandl48545522008-02-02 10:12:36 +00001928 try:
1929 a.__class__.__cmp__(a, b)
1930 except TypeError:
1931 pass
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001932 else:
Georg Brandl48545522008-02-02 10:12:36 +00001933 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1934 a.__class__, a, b))
1935
1936 unsafecmp(u"123", "123")
1937 unsafecmp("123", u"123")
1938 unsafecmp(1, 1.0)
1939 unsafecmp(1.0, 1)
1940 unsafecmp(1, 1L)
1941 unsafecmp(1L, 1)
1942
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001943 @test_support.impl_detail("custom logic for printing to real file objects")
1944 def test_recursions_1(self):
Georg Brandl48545522008-02-02 10:12:36 +00001945 # Testing recursion checks ...
1946 class Letter(str):
1947 def __new__(cls, letter):
1948 if letter == 'EPS':
1949 return str.__new__(cls)
1950 return str.__new__(cls, letter)
1951 def __str__(self):
1952 if not self:
1953 return 'EPS'
1954 return self
1955 # sys.stdout needs to be the original to trigger the recursion bug
Georg Brandl48545522008-02-02 10:12:36 +00001956 test_stdout = sys.stdout
1957 sys.stdout = test_support.get_original_stdout()
1958 try:
1959 # nothing should actually be printed, this should raise an exception
1960 print Letter('w')
1961 except RuntimeError:
1962 pass
1963 else:
1964 self.fail("expected a RuntimeError for print recursion")
1965 finally:
1966 sys.stdout = test_stdout
1967
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001968 def test_recursions_2(self):
Georg Brandl48545522008-02-02 10:12:36 +00001969 # Bug #1202533.
1970 class A(object):
1971 pass
1972 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
1973 try:
1974 A()*2
1975 except RuntimeError:
1976 pass
1977 else:
1978 self.fail("expected a RuntimeError")
1979
1980 def test_weakrefs(self):
1981 # Testing weak references...
1982 import weakref
1983 class C(object):
1984 pass
1985 c = C()
1986 r = weakref.ref(c)
1987 self.assertEqual(r(), c)
1988 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001989 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001990 self.assertEqual(r(), None)
1991 del r
1992 class NoWeak(object):
1993 __slots__ = ['foo']
1994 no = NoWeak()
1995 try:
1996 weakref.ref(no)
1997 except TypeError, msg:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001998 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001999 else:
2000 self.fail("weakref.ref(no) should be illegal")
2001 class Weak(object):
2002 __slots__ = ['foo', '__weakref__']
2003 yes = Weak()
2004 r = weakref.ref(yes)
2005 self.assertEqual(r(), yes)
2006 del yes
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002007 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00002008 self.assertEqual(r(), None)
2009 del r
2010
2011 def test_properties(self):
2012 # Testing property...
2013 class C(object):
2014 def getx(self):
2015 return self.__x
2016 def setx(self, value):
2017 self.__x = value
2018 def delx(self):
2019 del self.__x
2020 x = property(getx, setx, delx, doc="I'm the x property.")
2021 a = C()
2022 self.assertFalse(hasattr(a, "x"))
2023 a.x = 42
2024 self.assertEqual(a._C__x, 42)
2025 self.assertEqual(a.x, 42)
2026 del a.x
2027 self.assertFalse(hasattr(a, "x"))
2028 self.assertFalse(hasattr(a, "_C__x"))
2029 C.x.__set__(a, 100)
2030 self.assertEqual(C.x.__get__(a), 100)
2031 C.x.__delete__(a)
2032 self.assertFalse(hasattr(a, "x"))
2033
2034 raw = C.__dict__['x']
Ezio Melottib0f5adc2010-01-24 16:58:36 +00002035 self.assertIsInstance(raw, property)
Georg Brandl48545522008-02-02 10:12:36 +00002036
2037 attrs = dir(raw)
Ezio Melottiaa980582010-01-23 23:04:36 +00002038 self.assertIn("__doc__", attrs)
2039 self.assertIn("fget", attrs)
2040 self.assertIn("fset", attrs)
2041 self.assertIn("fdel", attrs)
Georg Brandl48545522008-02-02 10:12:36 +00002042
2043 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002044 self.assertTrue(raw.fget is C.__dict__['getx'])
2045 self.assertTrue(raw.fset is C.__dict__['setx'])
2046 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl48545522008-02-02 10:12:36 +00002047
2048 for attr in "__doc__", "fget", "fset", "fdel":
2049 try:
2050 setattr(raw, attr, 42)
2051 except TypeError, msg:
2052 if str(msg).find('readonly') < 0:
2053 self.fail("when setting readonly attr %r on a property, "
2054 "got unexpected TypeError msg %r" % (attr, str(msg)))
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002055 else:
Georg Brandl48545522008-02-02 10:12:36 +00002056 self.fail("expected TypeError from trying to set readonly %r "
2057 "attr on a property" % attr)
Tim Peters2f93e282001-10-04 05:27:00 +00002058
Georg Brandl48545522008-02-02 10:12:36 +00002059 class D(object):
2060 __getitem__ = property(lambda s: 1/0)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002061
Georg Brandl48545522008-02-02 10:12:36 +00002062 d = D()
2063 try:
2064 for i in d:
2065 str(i)
2066 except ZeroDivisionError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002067 pass
Georg Brandl48545522008-02-02 10:12:36 +00002068 else:
2069 self.fail("expected ZeroDivisionError from bad property")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002070
R. David Murrayf28fd242010-02-23 00:24:49 +00002071 @unittest.skipIf(sys.flags.optimize >= 2,
2072 "Docstrings are omitted with -O2 and above")
2073 def test_properties_doc_attrib(self):
Georg Brandl48545522008-02-02 10:12:36 +00002074 class E(object):
2075 def getter(self):
2076 "getter method"
2077 return 0
2078 def setter(self_, value):
2079 "setter method"
2080 pass
2081 prop = property(getter)
2082 self.assertEqual(prop.__doc__, "getter method")
2083 prop2 = property(fset=setter)
2084 self.assertEqual(prop2.__doc__, None)
2085
R. David Murrayf28fd242010-02-23 00:24:49 +00002086 def test_testcapi_no_segfault(self):
Georg Brandl48545522008-02-02 10:12:36 +00002087 # this segfaulted in 2.5b2
2088 try:
2089 import _testcapi
2090 except ImportError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002091 pass
Georg Brandl48545522008-02-02 10:12:36 +00002092 else:
2093 class X(object):
2094 p = property(_testcapi.test_with_docstring)
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002095
Georg Brandl48545522008-02-02 10:12:36 +00002096 def test_properties_plus(self):
2097 class C(object):
2098 foo = property(doc="hello")
2099 @foo.getter
2100 def foo(self):
2101 return self._foo
2102 @foo.setter
2103 def foo(self, value):
2104 self._foo = abs(value)
2105 @foo.deleter
2106 def foo(self):
2107 del self._foo
2108 c = C()
2109 self.assertEqual(C.foo.__doc__, "hello")
2110 self.assertFalse(hasattr(c, "foo"))
2111 c.foo = -42
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002112 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl48545522008-02-02 10:12:36 +00002113 self.assertEqual(c._foo, 42)
2114 self.assertEqual(c.foo, 42)
2115 del c.foo
2116 self.assertFalse(hasattr(c, '_foo'))
2117 self.assertFalse(hasattr(c, "foo"))
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002118
Georg Brandl48545522008-02-02 10:12:36 +00002119 class D(C):
2120 @C.foo.deleter
2121 def foo(self):
2122 try:
2123 del self._foo
2124 except AttributeError:
2125 pass
2126 d = D()
2127 d.foo = 24
2128 self.assertEqual(d.foo, 24)
2129 del d.foo
2130 del d.foo
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002131
Georg Brandl48545522008-02-02 10:12:36 +00002132 class E(object):
2133 @property
2134 def foo(self):
2135 return self._foo
2136 @foo.setter
2137 def foo(self, value):
2138 raise RuntimeError
2139 @foo.setter
2140 def foo(self, value):
2141 self._foo = abs(value)
2142 @foo.deleter
2143 def foo(self, value=None):
2144 del self._foo
Guido van Rossume8fc6402002-04-16 16:44:51 +00002145
Georg Brandl48545522008-02-02 10:12:36 +00002146 e = E()
2147 e.foo = -42
2148 self.assertEqual(e.foo, 42)
2149 del e.foo
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002150
Georg Brandl48545522008-02-02 10:12:36 +00002151 class F(E):
2152 @E.foo.deleter
2153 def foo(self):
2154 del self._foo
2155 @foo.setter
2156 def foo(self, value):
2157 self._foo = max(0, value)
2158 f = F()
2159 f.foo = -10
2160 self.assertEqual(f.foo, 0)
2161 del f.foo
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00002162
Georg Brandl48545522008-02-02 10:12:36 +00002163 def test_dict_constructors(self):
2164 # Testing dict constructor ...
2165 d = dict()
2166 self.assertEqual(d, {})
2167 d = dict({})
2168 self.assertEqual(d, {})
2169 d = dict({1: 2, 'a': 'b'})
2170 self.assertEqual(d, {1: 2, 'a': 'b'})
2171 self.assertEqual(d, dict(d.items()))
2172 self.assertEqual(d, dict(d.iteritems()))
2173 d = dict({'one':1, 'two':2})
2174 self.assertEqual(d, dict(one=1, two=2))
2175 self.assertEqual(d, dict(**d))
2176 self.assertEqual(d, dict({"one": 1}, two=2))
2177 self.assertEqual(d, dict([("two", 2)], one=1))
2178 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
2179 self.assertEqual(d, dict(**d))
Guido van Rossum09638c12002-06-13 19:17:46 +00002180
Georg Brandl48545522008-02-02 10:12:36 +00002181 for badarg in 0, 0L, 0j, "0", [0], (0,):
2182 try:
2183 dict(badarg)
2184 except TypeError:
2185 pass
2186 except ValueError:
2187 if badarg == "0":
2188 # It's a sequence, and its elements are also sequences (gotta
2189 # love strings <wink>), but they aren't of length 2, so this
2190 # one seemed better as a ValueError than a TypeError.
2191 pass
2192 else:
2193 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002194 else:
Georg Brandl48545522008-02-02 10:12:36 +00002195 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002196
Georg Brandl48545522008-02-02 10:12:36 +00002197 try:
2198 dict({}, {})
2199 except TypeError:
2200 pass
2201 else:
2202 self.fail("no TypeError from dict({}, {})")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002203
Georg Brandl48545522008-02-02 10:12:36 +00002204 class Mapping:
2205 # Lacks a .keys() method; will be added later.
2206 dict = {1:2, 3:4, 'a':1j}
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002207
Georg Brandl48545522008-02-02 10:12:36 +00002208 try:
2209 dict(Mapping())
2210 except TypeError:
2211 pass
2212 else:
2213 self.fail("no TypeError from dict(incomplete mapping)")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002214
Georg Brandl48545522008-02-02 10:12:36 +00002215 Mapping.keys = lambda self: self.dict.keys()
2216 Mapping.__getitem__ = lambda self, i: self.dict[i]
2217 d = dict(Mapping())
2218 self.assertEqual(d, Mapping.dict)
Michael W. Hudsonf3904422006-11-23 13:54:04 +00002219
Georg Brandl48545522008-02-02 10:12:36 +00002220 # Init from sequence of iterable objects, each producing a 2-sequence.
2221 class AddressBookEntry:
2222 def __init__(self, first, last):
2223 self.first = first
2224 self.last = last
2225 def __iter__(self):
2226 return iter([self.first, self.last])
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002227
Georg Brandl48545522008-02-02 10:12:36 +00002228 d = dict([AddressBookEntry('Tim', 'Warsaw'),
2229 AddressBookEntry('Barry', 'Peters'),
2230 AddressBookEntry('Tim', 'Peters'),
2231 AddressBookEntry('Barry', 'Warsaw')])
2232 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00002233
Georg Brandl48545522008-02-02 10:12:36 +00002234 d = dict(zip(range(4), range(1, 5)))
2235 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002236
Georg Brandl48545522008-02-02 10:12:36 +00002237 # Bad sequence lengths.
2238 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2239 try:
2240 dict(bad)
2241 except ValueError:
2242 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00002243 else:
Georg Brandl48545522008-02-02 10:12:36 +00002244 self.fail("no ValueError from dict(%r)" % bad)
2245
2246 def test_dir(self):
2247 # Testing dir() ...
2248 junk = 12
2249 self.assertEqual(dir(), ['junk', 'self'])
2250 del junk
2251
2252 # Just make sure these don't blow up!
2253 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
2254 dir(arg)
2255
2256 # Try classic classes.
2257 class C:
2258 Cdata = 1
2259 def Cmethod(self): pass
2260
2261 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
2262 self.assertEqual(dir(C), cstuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002263 self.assertIn('im_self', dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002264
2265 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
2266 self.assertEqual(dir(c), cstuff)
2267
2268 c.cdata = 2
2269 c.cmethod = lambda self: 0
2270 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002271 self.assertIn('im_self', dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002272
2273 class A(C):
2274 Adata = 1
2275 def Amethod(self): pass
2276
2277 astuff = ['Adata', 'Amethod'] + cstuff
2278 self.assertEqual(dir(A), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002279 self.assertIn('im_self', dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002280 a = A()
2281 self.assertEqual(dir(a), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002282 self.assertIn('im_self', dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002283 a.adata = 42
2284 a.amethod = lambda self: 3
2285 self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
2286
2287 # The same, but with new-style classes. Since these have object as a
2288 # base class, a lot more gets sucked in.
2289 def interesting(strings):
2290 return [s for s in strings if not s.startswith('_')]
2291
2292 class C(object):
2293 Cdata = 1
2294 def Cmethod(self): pass
2295
2296 cstuff = ['Cdata', 'Cmethod']
2297 self.assertEqual(interesting(dir(C)), cstuff)
2298
2299 c = C()
2300 self.assertEqual(interesting(dir(c)), cstuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002301 self.assertIn('im_self', dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002302
2303 c.cdata = 2
2304 c.cmethod = lambda self: 0
2305 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002306 self.assertIn('im_self', dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002307
2308 class A(C):
2309 Adata = 1
2310 def Amethod(self): pass
2311
2312 astuff = ['Adata', 'Amethod'] + cstuff
2313 self.assertEqual(interesting(dir(A)), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002314 self.assertIn('im_self', dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002315 a = A()
2316 self.assertEqual(interesting(dir(a)), astuff)
2317 a.adata = 42
2318 a.amethod = lambda self: 3
2319 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002320 self.assertIn('im_self', dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002321
2322 # Try a module subclass.
Georg Brandl48545522008-02-02 10:12:36 +00002323 class M(type(sys)):
2324 pass
2325 minstance = M("m")
2326 minstance.b = 2
2327 minstance.a = 1
2328 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2329 self.assertEqual(names, ['a', 'b'])
2330
2331 class M2(M):
2332 def getdict(self):
2333 return "Not a dict!"
2334 __dict__ = property(getdict)
2335
2336 m2instance = M2("m2")
2337 m2instance.b = 2
2338 m2instance.a = 1
2339 self.assertEqual(m2instance.__dict__, "Not a dict!")
2340 try:
2341 dir(m2instance)
2342 except TypeError:
2343 pass
2344
2345 # Two essentially featureless objects, just inheriting stuff from
2346 # object.
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002347 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2348 if test_support.check_impl_detail():
2349 # None differs in PyPy: it has a __nonzero__
2350 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl48545522008-02-02 10:12:36 +00002351
2352 # Nasty test case for proxied objects
2353 class Wrapper(object):
2354 def __init__(self, obj):
2355 self.__obj = obj
2356 def __repr__(self):
2357 return "Wrapper(%s)" % repr(self.__obj)
2358 def __getitem__(self, key):
2359 return Wrapper(self.__obj[key])
2360 def __len__(self):
2361 return len(self.__obj)
2362 def __getattr__(self, name):
2363 return Wrapper(getattr(self.__obj, name))
2364
2365 class C(object):
2366 def __getclass(self):
2367 return Wrapper(type(self))
2368 __class__ = property(__getclass)
2369
2370 dir(C()) # This used to segfault
2371
2372 def test_supers(self):
2373 # Testing super...
2374
2375 class A(object):
2376 def meth(self, a):
2377 return "A(%r)" % a
2378
2379 self.assertEqual(A().meth(1), "A(1)")
2380
2381 class B(A):
2382 def __init__(self):
2383 self.__super = super(B, self)
2384 def meth(self, a):
2385 return "B(%r)" % a + self.__super.meth(a)
2386
2387 self.assertEqual(B().meth(2), "B(2)A(2)")
2388
2389 class C(A):
2390 def meth(self, a):
2391 return "C(%r)" % a + self.__super.meth(a)
2392 C._C__super = super(C)
2393
2394 self.assertEqual(C().meth(3), "C(3)A(3)")
2395
2396 class D(C, B):
2397 def meth(self, a):
2398 return "D(%r)" % a + super(D, self).meth(a)
2399
2400 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2401
2402 # Test for subclassing super
2403
2404 class mysuper(super):
2405 def __init__(self, *args):
2406 return super(mysuper, self).__init__(*args)
2407
2408 class E(D):
2409 def meth(self, a):
2410 return "E(%r)" % a + mysuper(E, self).meth(a)
2411
2412 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2413
2414 class F(E):
2415 def meth(self, a):
2416 s = self.__super # == mysuper(F, self)
2417 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2418 F._F__super = mysuper(F)
2419
2420 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2421
2422 # Make sure certain errors are raised
2423
2424 try:
2425 super(D, 42)
2426 except TypeError:
2427 pass
2428 else:
2429 self.fail("shouldn't allow super(D, 42)")
2430
2431 try:
2432 super(D, C())
2433 except TypeError:
2434 pass
2435 else:
2436 self.fail("shouldn't allow super(D, C())")
2437
2438 try:
2439 super(D).__get__(12)
2440 except TypeError:
2441 pass
2442 else:
2443 self.fail("shouldn't allow super(D).__get__(12)")
2444
2445 try:
2446 super(D).__get__(C())
2447 except TypeError:
2448 pass
2449 else:
2450 self.fail("shouldn't allow super(D).__get__(C())")
2451
2452 # Make sure data descriptors can be overridden and accessed via super
2453 # (new feature in Python 2.3)
2454
2455 class DDbase(object):
2456 def getx(self): return 42
2457 x = property(getx)
2458
2459 class DDsub(DDbase):
2460 def getx(self): return "hello"
2461 x = property(getx)
2462
2463 dd = DDsub()
2464 self.assertEqual(dd.x, "hello")
2465 self.assertEqual(super(DDsub, dd).x, 42)
2466
2467 # Ensure that super() lookup of descriptor from classmethod
2468 # works (SF ID# 743627)
2469
2470 class Base(object):
2471 aProp = property(lambda self: "foo")
2472
2473 class Sub(Base):
2474 @classmethod
2475 def test(klass):
2476 return super(Sub,klass).aProp
2477
2478 self.assertEqual(Sub.test(), Base.aProp)
2479
2480 # Verify that super() doesn't allow keyword args
2481 try:
2482 super(Base, kw=1)
2483 except TypeError:
2484 pass
2485 else:
2486 self.assertEqual("super shouldn't accept keyword args")
2487
2488 def test_basic_inheritance(self):
2489 # Testing inheritance from basic types...
2490
2491 class hexint(int):
2492 def __repr__(self):
2493 return hex(self)
2494 def __add__(self, other):
2495 return hexint(int.__add__(self, other))
2496 # (Note that overriding __radd__ doesn't work,
2497 # because the int type gets first dibs.)
2498 self.assertEqual(repr(hexint(7) + 9), "0x10")
2499 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2500 a = hexint(12345)
2501 self.assertEqual(a, 12345)
2502 self.assertEqual(int(a), 12345)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002503 self.assertTrue(int(a).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002504 self.assertEqual(hash(a), hash(12345))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002505 self.assertTrue((+a).__class__ is int)
2506 self.assertTrue((a >> 0).__class__ is int)
2507 self.assertTrue((a << 0).__class__ is int)
2508 self.assertTrue((hexint(0) << 12).__class__ is int)
2509 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002510
2511 class octlong(long):
2512 __slots__ = []
2513 def __str__(self):
2514 s = oct(self)
2515 if s[-1] == 'L':
2516 s = s[:-1]
2517 return s
2518 def __add__(self, other):
2519 return self.__class__(super(octlong, self).__add__(other))
2520 __radd__ = __add__
2521 self.assertEqual(str(octlong(3) + 5), "010")
2522 # (Note that overriding __radd__ here only seems to work
2523 # because the example uses a short int left argument.)
2524 self.assertEqual(str(5 + octlong(3000)), "05675")
2525 a = octlong(12345)
2526 self.assertEqual(a, 12345L)
2527 self.assertEqual(long(a), 12345L)
2528 self.assertEqual(hash(a), hash(12345L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002529 self.assertTrue(long(a).__class__ is long)
2530 self.assertTrue((+a).__class__ is long)
2531 self.assertTrue((-a).__class__ is long)
2532 self.assertTrue((-octlong(0)).__class__ is long)
2533 self.assertTrue((a >> 0).__class__ is long)
2534 self.assertTrue((a << 0).__class__ is long)
2535 self.assertTrue((a - 0).__class__ is long)
2536 self.assertTrue((a * 1).__class__ is long)
2537 self.assertTrue((a ** 1).__class__ is long)
2538 self.assertTrue((a // 1).__class__ is long)
2539 self.assertTrue((1 * a).__class__ is long)
2540 self.assertTrue((a | 0).__class__ is long)
2541 self.assertTrue((a ^ 0).__class__ is long)
2542 self.assertTrue((a & -1L).__class__ is long)
2543 self.assertTrue((octlong(0) << 12).__class__ is long)
2544 self.assertTrue((octlong(0) >> 12).__class__ is long)
2545 self.assertTrue(abs(octlong(0)).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002546
2547 # Because octlong overrides __add__, we can't check the absence of +0
2548 # optimizations using octlong.
2549 class longclone(long):
2550 pass
2551 a = longclone(1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002552 self.assertTrue((a + 0).__class__ is long)
2553 self.assertTrue((0 + a).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002554
2555 # Check that negative clones don't segfault
2556 a = longclone(-1)
2557 self.assertEqual(a.__dict__, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002558 self.assertEqual(long(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl48545522008-02-02 10:12:36 +00002559
2560 class precfloat(float):
2561 __slots__ = ['prec']
2562 def __init__(self, value=0.0, prec=12):
2563 self.prec = int(prec)
2564 def __repr__(self):
2565 return "%.*g" % (self.prec, self)
2566 self.assertEqual(repr(precfloat(1.1)), "1.1")
2567 a = precfloat(12345)
2568 self.assertEqual(a, 12345.0)
2569 self.assertEqual(float(a), 12345.0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002570 self.assertTrue(float(a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002571 self.assertEqual(hash(a), hash(12345.0))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002572 self.assertTrue((+a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002573
2574 class madcomplex(complex):
2575 def __repr__(self):
2576 return "%.17gj%+.17g" % (self.imag, self.real)
2577 a = madcomplex(-3, 4)
2578 self.assertEqual(repr(a), "4j-3")
2579 base = complex(-3, 4)
2580 self.assertEqual(base.__class__, complex)
2581 self.assertEqual(a, base)
2582 self.assertEqual(complex(a), base)
2583 self.assertEqual(complex(a).__class__, complex)
2584 a = madcomplex(a) # just trying another form of the constructor
2585 self.assertEqual(repr(a), "4j-3")
2586 self.assertEqual(a, base)
2587 self.assertEqual(complex(a), base)
2588 self.assertEqual(complex(a).__class__, complex)
2589 self.assertEqual(hash(a), hash(base))
2590 self.assertEqual((+a).__class__, complex)
2591 self.assertEqual((a + 0).__class__, complex)
2592 self.assertEqual(a + 0, base)
2593 self.assertEqual((a - 0).__class__, complex)
2594 self.assertEqual(a - 0, base)
2595 self.assertEqual((a * 1).__class__, complex)
2596 self.assertEqual(a * 1, base)
2597 self.assertEqual((a / 1).__class__, complex)
2598 self.assertEqual(a / 1, base)
2599
2600 class madtuple(tuple):
2601 _rev = None
2602 def rev(self):
2603 if self._rev is not None:
2604 return self._rev
2605 L = list(self)
2606 L.reverse()
2607 self._rev = self.__class__(L)
2608 return self._rev
2609 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2610 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2611 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2612 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2613 for i in range(512):
2614 t = madtuple(range(i))
2615 u = t.rev()
2616 v = u.rev()
2617 self.assertEqual(v, t)
2618 a = madtuple((1,2,3,4,5))
2619 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002620 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002621 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002622 self.assertTrue(a[:].__class__ is tuple)
2623 self.assertTrue((a * 1).__class__ is tuple)
2624 self.assertTrue((a * 0).__class__ is tuple)
2625 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002626 a = madtuple(())
2627 self.assertEqual(tuple(a), ())
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002628 self.assertTrue(tuple(a).__class__ is tuple)
2629 self.assertTrue((a + a).__class__ is tuple)
2630 self.assertTrue((a * 0).__class__ is tuple)
2631 self.assertTrue((a * 1).__class__ is tuple)
2632 self.assertTrue((a * 2).__class__ is tuple)
2633 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002634
2635 class madstring(str):
2636 _rev = None
2637 def rev(self):
2638 if self._rev is not None:
2639 return self._rev
2640 L = list(self)
2641 L.reverse()
2642 self._rev = self.__class__("".join(L))
2643 return self._rev
2644 s = madstring("abcdefghijklmnopqrstuvwxyz")
2645 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2646 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2647 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2648 for i in range(256):
2649 s = madstring("".join(map(chr, range(i))))
2650 t = s.rev()
2651 u = t.rev()
2652 self.assertEqual(u, s)
2653 s = madstring("12345")
2654 self.assertEqual(str(s), "12345")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002655 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002656
2657 base = "\x00" * 5
2658 s = madstring(base)
2659 self.assertEqual(s, base)
2660 self.assertEqual(str(s), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002661 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002662 self.assertEqual(hash(s), hash(base))
2663 self.assertEqual({s: 1}[base], 1)
2664 self.assertEqual({base: 1}[s], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002665 self.assertTrue((s + "").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002666 self.assertEqual(s + "", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002667 self.assertTrue(("" + s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002668 self.assertEqual("" + s, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002669 self.assertTrue((s * 0).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002670 self.assertEqual(s * 0, "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002671 self.assertTrue((s * 1).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002672 self.assertEqual(s * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002673 self.assertTrue((s * 2).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002674 self.assertEqual(s * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002675 self.assertTrue(s[:].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002676 self.assertEqual(s[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002677 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002678 self.assertEqual(s[0:0], "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002679 self.assertTrue(s.strip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002680 self.assertEqual(s.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002681 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002682 self.assertEqual(s.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002683 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002684 self.assertEqual(s.rstrip(), base)
2685 identitytab = ''.join([chr(i) for i in range(256)])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002686 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002687 self.assertEqual(s.translate(identitytab), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002688 self.assertTrue(s.translate(identitytab, "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002689 self.assertEqual(s.translate(identitytab, "x"), base)
2690 self.assertEqual(s.translate(identitytab, "\x00"), "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002691 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002692 self.assertEqual(s.replace("x", "x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002693 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002694 self.assertEqual(s.ljust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002695 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002696 self.assertEqual(s.rjust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002697 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002698 self.assertEqual(s.center(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002699 self.assertTrue(s.lower().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002700 self.assertEqual(s.lower(), base)
2701
2702 class madunicode(unicode):
2703 _rev = None
2704 def rev(self):
2705 if self._rev is not None:
2706 return self._rev
2707 L = list(self)
2708 L.reverse()
2709 self._rev = self.__class__(u"".join(L))
2710 return self._rev
2711 u = madunicode("ABCDEF")
2712 self.assertEqual(u, u"ABCDEF")
2713 self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
2714 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
2715 base = u"12345"
2716 u = madunicode(base)
2717 self.assertEqual(unicode(u), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002718 self.assertTrue(unicode(u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002719 self.assertEqual(hash(u), hash(base))
2720 self.assertEqual({u: 1}[base], 1)
2721 self.assertEqual({base: 1}[u], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002722 self.assertTrue(u.strip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002723 self.assertEqual(u.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002724 self.assertTrue(u.lstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002725 self.assertEqual(u.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002726 self.assertTrue(u.rstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002727 self.assertEqual(u.rstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002728 self.assertTrue(u.replace(u"x", u"x").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002729 self.assertEqual(u.replace(u"x", u"x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002730 self.assertTrue(u.replace(u"xy", u"xy").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002731 self.assertEqual(u.replace(u"xy", u"xy"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002732 self.assertTrue(u.center(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002733 self.assertEqual(u.center(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002734 self.assertTrue(u.ljust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002735 self.assertEqual(u.ljust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002736 self.assertTrue(u.rjust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002737 self.assertEqual(u.rjust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002738 self.assertTrue(u.lower().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002739 self.assertEqual(u.lower(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002740 self.assertTrue(u.upper().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002741 self.assertEqual(u.upper(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002742 self.assertTrue(u.capitalize().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002743 self.assertEqual(u.capitalize(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002744 self.assertTrue(u.title().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002745 self.assertEqual(u.title(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002746 self.assertTrue((u + u"").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002747 self.assertEqual(u + u"", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002748 self.assertTrue((u"" + u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002749 self.assertEqual(u"" + u, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002750 self.assertTrue((u * 0).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002751 self.assertEqual(u * 0, u"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002752 self.assertTrue((u * 1).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002753 self.assertEqual(u * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002754 self.assertTrue((u * 2).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002755 self.assertEqual(u * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002756 self.assertTrue(u[:].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002757 self.assertEqual(u[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002758 self.assertTrue(u[0:0].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002759 self.assertEqual(u[0:0], u"")
2760
2761 class sublist(list):
2762 pass
2763 a = sublist(range(5))
2764 self.assertEqual(a, range(5))
2765 a.append("hello")
2766 self.assertEqual(a, range(5) + ["hello"])
2767 a[5] = 5
2768 self.assertEqual(a, range(6))
2769 a.extend(range(6, 20))
2770 self.assertEqual(a, range(20))
2771 a[-5:] = []
2772 self.assertEqual(a, range(15))
2773 del a[10:15]
2774 self.assertEqual(len(a), 10)
2775 self.assertEqual(a, range(10))
2776 self.assertEqual(list(a), range(10))
2777 self.assertEqual(a[0], 0)
2778 self.assertEqual(a[9], 9)
2779 self.assertEqual(a[-10], 0)
2780 self.assertEqual(a[-1], 9)
2781 self.assertEqual(a[:5], range(5))
2782
2783 class CountedInput(file):
2784 """Counts lines read by self.readline().
2785
2786 self.lineno is the 0-based ordinal of the last line read, up to
2787 a maximum of one greater than the number of lines in the file.
2788
2789 self.ateof is true if and only if the final "" line has been read,
2790 at which point self.lineno stops incrementing, and further calls
2791 to readline() continue to return "".
2792 """
2793
2794 lineno = 0
2795 ateof = 0
2796 def readline(self):
2797 if self.ateof:
2798 return ""
2799 s = file.readline(self)
2800 # Next line works too.
2801 # s = super(CountedInput, self).readline()
2802 self.lineno += 1
2803 if s == "":
2804 self.ateof = 1
2805 return s
2806
2807 f = file(name=test_support.TESTFN, mode='w')
2808 lines = ['a\n', 'b\n', 'c\n']
2809 try:
2810 f.writelines(lines)
2811 f.close()
2812 f = CountedInput(test_support.TESTFN)
2813 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2814 got = f.readline()
2815 self.assertEqual(expected, got)
2816 self.assertEqual(f.lineno, i)
2817 self.assertEqual(f.ateof, (i > len(lines)))
2818 f.close()
2819 finally:
2820 try:
2821 f.close()
2822 except:
2823 pass
2824 test_support.unlink(test_support.TESTFN)
2825
2826 def test_keywords(self):
2827 # Testing keyword args to basic type constructors ...
2828 self.assertEqual(int(x=1), 1)
2829 self.assertEqual(float(x=2), 2.0)
2830 self.assertEqual(long(x=3), 3L)
2831 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2832 self.assertEqual(str(object=500), '500')
2833 self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
2834 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2835 self.assertEqual(list(sequence=(0, 1, 2)), range(3))
2836 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2837
2838 for constructor in (int, float, long, complex, str, unicode,
2839 tuple, list, file):
2840 try:
2841 constructor(bogus_keyword_arg=1)
2842 except TypeError:
2843 pass
2844 else:
2845 self.fail("expected TypeError from bogus keyword argument to %r"
2846 % constructor)
2847
2848 def test_str_subclass_as_dict_key(self):
2849 # Testing a str subclass used as dict key ..
2850
2851 class cistr(str):
2852 """Sublcass of str that computes __eq__ case-insensitively.
2853
2854 Also computes a hash code of the string in canonical form.
2855 """
2856
2857 def __init__(self, value):
2858 self.canonical = value.lower()
2859 self.hashcode = hash(self.canonical)
2860
2861 def __eq__(self, other):
2862 if not isinstance(other, cistr):
2863 other = cistr(other)
2864 return self.canonical == other.canonical
2865
2866 def __hash__(self):
2867 return self.hashcode
2868
2869 self.assertEqual(cistr('ABC'), 'abc')
2870 self.assertEqual('aBc', cistr('ABC'))
2871 self.assertEqual(str(cistr('ABC')), 'ABC')
2872
2873 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2874 self.assertEqual(d[cistr('one')], 1)
2875 self.assertEqual(d[cistr('tWo')], 2)
2876 self.assertEqual(d[cistr('THrEE')], 3)
Ezio Melottiaa980582010-01-23 23:04:36 +00002877 self.assertIn(cistr('ONe'), d)
Georg Brandl48545522008-02-02 10:12:36 +00002878 self.assertEqual(d.get(cistr('thrEE')), 3)
2879
2880 def test_classic_comparisons(self):
2881 # Testing classic comparisons...
2882 class classic:
2883 pass
2884
2885 for base in (classic, int, object):
2886 class C(base):
2887 def __init__(self, value):
2888 self.value = int(value)
2889 def __cmp__(self, other):
2890 if isinstance(other, C):
2891 return cmp(self.value, other.value)
2892 if isinstance(other, int) or isinstance(other, long):
2893 return cmp(self.value, other)
2894 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002895 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002896
2897 c1 = C(1)
2898 c2 = C(2)
2899 c3 = C(3)
2900 self.assertEqual(c1, 1)
2901 c = {1: c1, 2: c2, 3: c3}
2902 for x in 1, 2, 3:
2903 for y in 1, 2, 3:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002904 self.assertTrue(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002905 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002906 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002907 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002908 self.assertTrue(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2909 self.assertTrue(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002910
2911 def test_rich_comparisons(self):
2912 # Testing rich comparisons...
2913 class Z(complex):
2914 pass
2915 z = Z(1)
2916 self.assertEqual(z, 1+0j)
2917 self.assertEqual(1+0j, z)
2918 class ZZ(complex):
2919 def __eq__(self, other):
2920 try:
2921 return abs(self - other) <= 1e-6
2922 except:
2923 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002924 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002925 zz = ZZ(1.0000003)
2926 self.assertEqual(zz, 1+0j)
2927 self.assertEqual(1+0j, zz)
2928
2929 class classic:
2930 pass
2931 for base in (classic, int, object, list):
2932 class C(base):
2933 def __init__(self, value):
2934 self.value = int(value)
2935 def __cmp__(self_, other):
2936 self.fail("shouldn't call __cmp__")
Nick Coghlan48361f52008-08-11 15:45:58 +00002937 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002938 def __eq__(self, other):
2939 if isinstance(other, C):
2940 return self.value == other.value
2941 if isinstance(other, int) or isinstance(other, long):
2942 return self.value == other
2943 return NotImplemented
2944 def __ne__(self, other):
2945 if isinstance(other, C):
2946 return self.value != other.value
2947 if isinstance(other, int) or isinstance(other, long):
2948 return self.value != other
2949 return NotImplemented
2950 def __lt__(self, other):
2951 if isinstance(other, C):
2952 return self.value < other.value
2953 if isinstance(other, int) or isinstance(other, long):
2954 return self.value < other
2955 return NotImplemented
2956 def __le__(self, other):
2957 if isinstance(other, C):
2958 return self.value <= other.value
2959 if isinstance(other, int) or isinstance(other, long):
2960 return self.value <= other
2961 return NotImplemented
2962 def __gt__(self, other):
2963 if isinstance(other, C):
2964 return self.value > other.value
2965 if isinstance(other, int) or isinstance(other, long):
2966 return self.value > other
2967 return NotImplemented
2968 def __ge__(self, other):
2969 if isinstance(other, C):
2970 return self.value >= other.value
2971 if isinstance(other, int) or isinstance(other, long):
2972 return self.value >= other
2973 return NotImplemented
2974 c1 = C(1)
2975 c2 = C(2)
2976 c3 = C(3)
2977 self.assertEqual(c1, 1)
2978 c = {1: c1, 2: c2, 3: c3}
2979 for x in 1, 2, 3:
2980 for y in 1, 2, 3:
2981 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002982 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002983 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002984 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002985 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002986 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002987 "x=%d, y=%d" % (x, y))
2988
2989 def test_coercions(self):
2990 # Testing coercions...
2991 class I(int): pass
2992 coerce(I(0), 0)
2993 coerce(0, I(0))
2994 class L(long): pass
2995 coerce(L(0), 0)
2996 coerce(L(0), 0L)
2997 coerce(0, L(0))
2998 coerce(0L, L(0))
2999 class F(float): pass
3000 coerce(F(0), 0)
3001 coerce(F(0), 0L)
3002 coerce(F(0), 0.)
3003 coerce(0, F(0))
3004 coerce(0L, F(0))
3005 coerce(0., F(0))
3006 class C(complex): pass
3007 coerce(C(0), 0)
3008 coerce(C(0), 0L)
3009 coerce(C(0), 0.)
3010 coerce(C(0), 0j)
3011 coerce(0, C(0))
3012 coerce(0L, C(0))
3013 coerce(0., C(0))
3014 coerce(0j, C(0))
3015
3016 def test_descrdoc(self):
3017 # Testing descriptor doc strings...
3018 def check(descr, what):
3019 self.assertEqual(descr.__doc__, what)
3020 check(file.closed, "True if the file is closed") # getset descriptor
3021 check(file.name, "file name") # member descriptor
3022
3023 def test_doc_descriptor(self):
3024 # Testing __doc__ descriptor...
3025 # SF bug 542984
3026 class DocDescr(object):
3027 def __get__(self, object, otype):
3028 if object:
3029 object = object.__class__.__name__ + ' instance'
3030 if otype:
3031 otype = otype.__name__
3032 return 'object=%s; type=%s' % (object, otype)
3033 class OldClass:
3034 __doc__ = DocDescr()
3035 class NewClass(object):
3036 __doc__ = DocDescr()
3037 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
3038 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3039 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
3040 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3041
3042 def test_set_class(self):
3043 # Testing __class__ assignment...
3044 class C(object): pass
3045 class D(object): pass
3046 class E(object): pass
3047 class F(D, E): pass
3048 for cls in C, D, E, F:
3049 for cls2 in C, D, E, F:
3050 x = cls()
3051 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003052 self.assertTrue(x.__class__ is cls2)
Georg Brandl48545522008-02-02 10:12:36 +00003053 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003054 self.assertTrue(x.__class__ is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003055 def cant(x, C):
3056 try:
3057 x.__class__ = C
3058 except TypeError:
3059 pass
3060 else:
3061 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
3062 try:
3063 delattr(x, "__class__")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003064 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003065 pass
3066 else:
3067 self.fail("shouldn't allow del %r.__class__" % x)
3068 cant(C(), list)
3069 cant(list(), C)
3070 cant(C(), 1)
3071 cant(C(), object)
3072 cant(object(), list)
3073 cant(list(), object)
3074 class Int(int): __slots__ = []
3075 cant(2, Int)
3076 cant(Int(), int)
3077 cant(True, int)
3078 cant(2, bool)
3079 o = object()
3080 cant(o, type(1))
3081 cant(o, type(None))
3082 del o
3083 class G(object):
3084 __slots__ = ["a", "b"]
3085 class H(object):
3086 __slots__ = ["b", "a"]
3087 try:
3088 unicode
3089 except NameError:
3090 class I(object):
3091 __slots__ = ["a", "b"]
3092 else:
3093 class I(object):
3094 __slots__ = [unicode("a"), unicode("b")]
3095 class J(object):
3096 __slots__ = ["c", "b"]
3097 class K(object):
3098 __slots__ = ["a", "b", "d"]
3099 class L(H):
3100 __slots__ = ["e"]
3101 class M(I):
3102 __slots__ = ["e"]
3103 class N(J):
3104 __slots__ = ["__weakref__"]
3105 class P(J):
3106 __slots__ = ["__dict__"]
3107 class Q(J):
3108 pass
3109 class R(J):
3110 __slots__ = ["__dict__", "__weakref__"]
3111
3112 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
3113 x = cls()
3114 x.a = 1
3115 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003116 self.assertTrue(x.__class__ is cls2,
Georg Brandl48545522008-02-02 10:12:36 +00003117 "assigning %r as __class__ for %r silently failed" % (cls2, x))
3118 self.assertEqual(x.a, 1)
3119 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003120 self.assertTrue(x.__class__ is cls,
Georg Brandl48545522008-02-02 10:12:36 +00003121 "assigning %r as __class__ for %r silently failed" % (cls, x))
3122 self.assertEqual(x.a, 1)
3123 for cls in G, J, K, L, M, N, P, R, list, Int:
3124 for cls2 in G, J, K, L, M, N, P, R, list, Int:
3125 if cls is cls2:
3126 continue
3127 cant(cls(), cls2)
3128
Benjamin Peterson5083dc52009-04-25 00:41:22 +00003129 # Issue5283: when __class__ changes in __del__, the wrong
3130 # type gets DECREF'd.
3131 class O(object):
3132 pass
3133 class A(object):
3134 def __del__(self):
3135 self.__class__ = O
3136 l = [A() for x in range(100)]
3137 del l
3138
Georg Brandl48545522008-02-02 10:12:36 +00003139 def test_set_dict(self):
3140 # Testing __dict__ assignment...
3141 class C(object): pass
3142 a = C()
3143 a.__dict__ = {'b': 1}
3144 self.assertEqual(a.b, 1)
3145 def cant(x, dict):
3146 try:
3147 x.__dict__ = dict
3148 except (AttributeError, TypeError):
3149 pass
3150 else:
3151 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
3152 cant(a, None)
3153 cant(a, [])
3154 cant(a, 1)
3155 del a.__dict__ # Deleting __dict__ is allowed
3156
3157 class Base(object):
3158 pass
3159 def verify_dict_readonly(x):
3160 """
3161 x has to be an instance of a class inheriting from Base.
3162 """
3163 cant(x, {})
3164 try:
3165 del x.__dict__
3166 except (AttributeError, TypeError):
3167 pass
3168 else:
3169 self.fail("shouldn't allow del %r.__dict__" % x)
3170 dict_descr = Base.__dict__["__dict__"]
3171 try:
3172 dict_descr.__set__(x, {})
3173 except (AttributeError, TypeError):
3174 pass
3175 else:
3176 self.fail("dict_descr allowed access to %r's dict" % x)
3177
3178 # Classes don't allow __dict__ assignment and have readonly dicts
3179 class Meta1(type, Base):
3180 pass
3181 class Meta2(Base, type):
3182 pass
3183 class D(object):
3184 __metaclass__ = Meta1
3185 class E(object):
3186 __metaclass__ = Meta2
3187 for cls in C, D, E:
3188 verify_dict_readonly(cls)
3189 class_dict = cls.__dict__
3190 try:
3191 class_dict["spam"] = "eggs"
3192 except TypeError:
3193 pass
3194 else:
3195 self.fail("%r's __dict__ can be modified" % cls)
3196
3197 # Modules also disallow __dict__ assignment
3198 class Module1(types.ModuleType, Base):
3199 pass
3200 class Module2(Base, types.ModuleType):
3201 pass
3202 for ModuleType in Module1, Module2:
3203 mod = ModuleType("spam")
3204 verify_dict_readonly(mod)
3205 mod.__dict__["spam"] = "eggs"
3206
3207 # Exception's __dict__ can be replaced, but not deleted
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003208 # (at least not any more than regular exception's __dict__ can
3209 # be deleted; on CPython it is not the case, whereas on PyPy they
3210 # can, just like any other new-style instance's __dict__.)
3211 def can_delete_dict(e):
3212 try:
3213 del e.__dict__
3214 except (TypeError, AttributeError):
3215 return False
3216 else:
3217 return True
Georg Brandl48545522008-02-02 10:12:36 +00003218 class Exception1(Exception, Base):
3219 pass
3220 class Exception2(Base, Exception):
3221 pass
3222 for ExceptionType in Exception, Exception1, Exception2:
3223 e = ExceptionType()
3224 e.__dict__ = {"a": 1}
3225 self.assertEqual(e.a, 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003226 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl48545522008-02-02 10:12:36 +00003227
3228 def test_pickles(self):
3229 # Testing pickling and copying new-style classes and objects...
3230 import pickle, cPickle
3231
3232 def sorteditems(d):
3233 L = d.items()
3234 L.sort()
3235 return L
3236
3237 global C
3238 class C(object):
3239 def __init__(self, a, b):
3240 super(C, self).__init__()
3241 self.a = a
3242 self.b = b
3243 def __repr__(self):
3244 return "C(%r, %r)" % (self.a, self.b)
3245
3246 global C1
3247 class C1(list):
3248 def __new__(cls, a, b):
3249 return super(C1, cls).__new__(cls)
3250 def __getnewargs__(self):
3251 return (self.a, self.b)
3252 def __init__(self, a, b):
3253 self.a = a
3254 self.b = b
3255 def __repr__(self):
3256 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3257
3258 global C2
3259 class C2(int):
3260 def __new__(cls, a, b, val=0):
3261 return super(C2, cls).__new__(cls, val)
3262 def __getnewargs__(self):
3263 return (self.a, self.b, int(self))
3264 def __init__(self, a, b, val=0):
3265 self.a = a
3266 self.b = b
3267 def __repr__(self):
3268 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3269
3270 global C3
3271 class C3(object):
3272 def __init__(self, foo):
3273 self.foo = foo
3274 def __getstate__(self):
3275 return self.foo
3276 def __setstate__(self, foo):
3277 self.foo = foo
3278
3279 global C4classic, C4
3280 class C4classic: # classic
3281 pass
3282 class C4(C4classic, object): # mixed inheritance
3283 pass
3284
3285 for p in pickle, cPickle:
3286 for bin in 0, 1:
3287 for cls in C, C1, C2:
3288 s = p.dumps(cls, bin)
3289 cls2 = p.loads(s)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003290 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003291
3292 a = C1(1, 2); a.append(42); a.append(24)
3293 b = C2("hello", "world", 42)
3294 s = p.dumps((a, b), bin)
3295 x, y = p.loads(s)
3296 self.assertEqual(x.__class__, a.__class__)
3297 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3298 self.assertEqual(y.__class__, b.__class__)
3299 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3300 self.assertEqual(repr(x), repr(a))
3301 self.assertEqual(repr(y), repr(b))
3302 # Test for __getstate__ and __setstate__ on new style class
3303 u = C3(42)
3304 s = p.dumps(u, bin)
3305 v = p.loads(s)
3306 self.assertEqual(u.__class__, v.__class__)
3307 self.assertEqual(u.foo, v.foo)
3308 # Test for picklability of hybrid class
3309 u = C4()
3310 u.foo = 42
3311 s = p.dumps(u, bin)
3312 v = p.loads(s)
3313 self.assertEqual(u.__class__, v.__class__)
3314 self.assertEqual(u.foo, v.foo)
3315
3316 # Testing copy.deepcopy()
3317 import copy
3318 for cls in C, C1, C2:
3319 cls2 = copy.deepcopy(cls)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003320 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003321
3322 a = C1(1, 2); a.append(42); a.append(24)
3323 b = C2("hello", "world", 42)
3324 x, y = copy.deepcopy((a, b))
3325 self.assertEqual(x.__class__, a.__class__)
3326 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3327 self.assertEqual(y.__class__, b.__class__)
3328 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3329 self.assertEqual(repr(x), repr(a))
3330 self.assertEqual(repr(y), repr(b))
3331
3332 def test_pickle_slots(self):
3333 # Testing pickling of classes with __slots__ ...
3334 import pickle, cPickle
3335 # Pickling of classes with __slots__ but without __getstate__ should fail
3336 global B, C, D, E
3337 class B(object):
3338 pass
3339 for base in [object, B]:
3340 class C(base):
3341 __slots__ = ['a']
3342 class D(C):
3343 pass
3344 try:
3345 pickle.dumps(C())
3346 except TypeError:
3347 pass
3348 else:
3349 self.fail("should fail: pickle C instance - %s" % base)
3350 try:
3351 cPickle.dumps(C())
3352 except TypeError:
3353 pass
3354 else:
3355 self.fail("should fail: cPickle C instance - %s" % base)
3356 try:
3357 pickle.dumps(C())
3358 except TypeError:
3359 pass
3360 else:
3361 self.fail("should fail: pickle D instance - %s" % base)
3362 try:
3363 cPickle.dumps(D())
3364 except TypeError:
3365 pass
3366 else:
3367 self.fail("should fail: cPickle D instance - %s" % base)
3368 # Give C a nice generic __getstate__ and __setstate__
3369 class C(base):
3370 __slots__ = ['a']
3371 def __getstate__(self):
3372 try:
3373 d = self.__dict__.copy()
3374 except AttributeError:
3375 d = {}
3376 for cls in self.__class__.__mro__:
3377 for sn in cls.__dict__.get('__slots__', ()):
3378 try:
3379 d[sn] = getattr(self, sn)
3380 except AttributeError:
3381 pass
3382 return d
3383 def __setstate__(self, d):
3384 for k, v in d.items():
3385 setattr(self, k, v)
3386 class D(C):
3387 pass
3388 # Now it should work
3389 x = C()
3390 y = pickle.loads(pickle.dumps(x))
3391 self.assertEqual(hasattr(y, 'a'), 0)
3392 y = cPickle.loads(cPickle.dumps(x))
3393 self.assertEqual(hasattr(y, 'a'), 0)
3394 x.a = 42
3395 y = pickle.loads(pickle.dumps(x))
3396 self.assertEqual(y.a, 42)
3397 y = cPickle.loads(cPickle.dumps(x))
3398 self.assertEqual(y.a, 42)
3399 x = D()
3400 x.a = 42
3401 x.b = 100
3402 y = pickle.loads(pickle.dumps(x))
3403 self.assertEqual(y.a + y.b, 142)
3404 y = cPickle.loads(cPickle.dumps(x))
3405 self.assertEqual(y.a + y.b, 142)
3406 # A subclass that adds a slot should also work
3407 class E(C):
3408 __slots__ = ['b']
3409 x = E()
3410 x.a = 42
3411 x.b = "foo"
3412 y = pickle.loads(pickle.dumps(x))
3413 self.assertEqual(y.a, x.a)
3414 self.assertEqual(y.b, x.b)
3415 y = cPickle.loads(cPickle.dumps(x))
3416 self.assertEqual(y.a, x.a)
3417 self.assertEqual(y.b, x.b)
3418
3419 def test_binary_operator_override(self):
3420 # Testing overrides of binary operations...
3421 class I(int):
3422 def __repr__(self):
3423 return "I(%r)" % int(self)
3424 def __add__(self, other):
3425 return I(int(self) + int(other))
3426 __radd__ = __add__
3427 def __pow__(self, other, mod=None):
3428 if mod is None:
3429 return I(pow(int(self), int(other)))
3430 else:
3431 return I(pow(int(self), int(other), int(mod)))
3432 def __rpow__(self, other, mod=None):
3433 if mod is None:
3434 return I(pow(int(other), int(self), mod))
3435 else:
3436 return I(pow(int(other), int(self), int(mod)))
3437
3438 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3439 self.assertEqual(repr(I(1) + 2), "I(3)")
3440 self.assertEqual(repr(1 + I(2)), "I(3)")
3441 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3442 self.assertEqual(repr(2 ** I(3)), "I(8)")
3443 self.assertEqual(repr(I(2) ** 3), "I(8)")
3444 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3445 class S(str):
3446 def __eq__(self, other):
3447 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003448 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003449
3450 def test_subclass_propagation(self):
3451 # Testing propagation of slot functions to subclasses...
3452 class A(object):
3453 pass
3454 class B(A):
3455 pass
3456 class C(A):
3457 pass
3458 class D(B, C):
3459 pass
3460 d = D()
3461 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3462 A.__hash__ = lambda self: 42
3463 self.assertEqual(hash(d), 42)
3464 C.__hash__ = lambda self: 314
3465 self.assertEqual(hash(d), 314)
3466 B.__hash__ = lambda self: 144
3467 self.assertEqual(hash(d), 144)
3468 D.__hash__ = lambda self: 100
3469 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003470 D.__hash__ = None
3471 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003472 del D.__hash__
3473 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003474 B.__hash__ = None
3475 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003476 del B.__hash__
3477 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003478 C.__hash__ = None
3479 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003480 del C.__hash__
3481 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003482 A.__hash__ = None
3483 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003484 del A.__hash__
3485 self.assertEqual(hash(d), orig_hash)
3486 d.foo = 42
3487 d.bar = 42
3488 self.assertEqual(d.foo, 42)
3489 self.assertEqual(d.bar, 42)
3490 def __getattribute__(self, name):
3491 if name == "foo":
3492 return 24
3493 return object.__getattribute__(self, name)
3494 A.__getattribute__ = __getattribute__
3495 self.assertEqual(d.foo, 24)
3496 self.assertEqual(d.bar, 42)
3497 def __getattr__(self, name):
3498 if name in ("spam", "foo", "bar"):
3499 return "hello"
3500 raise AttributeError, name
3501 B.__getattr__ = __getattr__
3502 self.assertEqual(d.spam, "hello")
3503 self.assertEqual(d.foo, 24)
3504 self.assertEqual(d.bar, 42)
3505 del A.__getattribute__
3506 self.assertEqual(d.foo, 42)
3507 del d.foo
3508 self.assertEqual(d.foo, "hello")
3509 self.assertEqual(d.bar, 42)
3510 del B.__getattr__
3511 try:
3512 d.foo
3513 except AttributeError:
3514 pass
3515 else:
3516 self.fail("d.foo should be undefined now")
3517
3518 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl48545522008-02-02 10:12:36 +00003519 class A(object):
3520 pass
3521 class B(A):
3522 pass
3523 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003524 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003525 A.__setitem__ = lambda *a: None # crash
3526
3527 def test_buffer_inheritance(self):
3528 # Testing that buffer interface is inherited ...
3529
3530 import binascii
3531 # SF bug [#470040] ParseTuple t# vs subclasses.
3532
3533 class MyStr(str):
3534 pass
3535 base = 'abc'
3536 m = MyStr(base)
3537 # b2a_hex uses the buffer interface to get its argument's value, via
3538 # PyArg_ParseTuple 't#' code.
3539 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3540
3541 # It's not clear that unicode will continue to support the character
3542 # buffer interface, and this test will fail if that's taken away.
3543 class MyUni(unicode):
3544 pass
3545 base = u'abc'
3546 m = MyUni(base)
3547 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3548
3549 class MyInt(int):
3550 pass
3551 m = MyInt(42)
3552 try:
3553 binascii.b2a_hex(m)
3554 self.fail('subclass of int should not have a buffer interface')
3555 except TypeError:
3556 pass
3557
3558 def test_str_of_str_subclass(self):
3559 # Testing __str__ defined in subclass of str ...
3560 import binascii
3561 import cStringIO
3562
3563 class octetstring(str):
3564 def __str__(self):
3565 return binascii.b2a_hex(self)
3566 def __repr__(self):
3567 return self + " repr"
3568
3569 o = octetstring('A')
3570 self.assertEqual(type(o), octetstring)
3571 self.assertEqual(type(str(o)), str)
3572 self.assertEqual(type(repr(o)), str)
3573 self.assertEqual(ord(o), 0x41)
3574 self.assertEqual(str(o), '41')
3575 self.assertEqual(repr(o), 'A repr')
3576 self.assertEqual(o.__str__(), '41')
3577 self.assertEqual(o.__repr__(), 'A repr')
3578
3579 capture = cStringIO.StringIO()
3580 # Calling str() or not exercises different internal paths.
3581 print >> capture, o
3582 print >> capture, str(o)
3583 self.assertEqual(capture.getvalue(), '41\n41\n')
3584 capture.close()
3585
3586 def test_keyword_arguments(self):
3587 # Testing keyword arguments to __init__, __call__...
3588 def f(a): return a
3589 self.assertEqual(f.__call__(a=42), 42)
3590 a = []
3591 list.__init__(a, sequence=[0, 1, 2])
3592 self.assertEqual(a, [0, 1, 2])
3593
3594 def test_recursive_call(self):
3595 # Testing recursive __call__() by setting to instance of class...
3596 class A(object):
3597 pass
3598
3599 A.__call__ = A()
3600 try:
3601 A()()
3602 except RuntimeError:
3603 pass
3604 else:
3605 self.fail("Recursion limit should have been reached for __call__()")
3606
3607 def test_delete_hook(self):
3608 # Testing __del__ hook...
3609 log = []
3610 class C(object):
3611 def __del__(self):
3612 log.append(1)
3613 c = C()
3614 self.assertEqual(log, [])
3615 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003616 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003617 self.assertEqual(log, [1])
3618
3619 class D(object): pass
3620 d = D()
3621 try: del d[0]
3622 except TypeError: pass
3623 else: self.fail("invalid del() didn't raise TypeError")
3624
3625 def test_hash_inheritance(self):
3626 # Testing hash of mutable subclasses...
3627
3628 class mydict(dict):
3629 pass
3630 d = mydict()
3631 try:
3632 hash(d)
3633 except TypeError:
3634 pass
3635 else:
3636 self.fail("hash() of dict subclass should fail")
3637
3638 class mylist(list):
3639 pass
3640 d = mylist()
3641 try:
3642 hash(d)
3643 except TypeError:
3644 pass
3645 else:
3646 self.fail("hash() of list subclass should fail")
3647
3648 def test_str_operations(self):
3649 try: 'a' + 5
3650 except TypeError: pass
3651 else: self.fail("'' + 5 doesn't raise TypeError")
3652
3653 try: ''.split('')
3654 except ValueError: pass
3655 else: self.fail("''.split('') doesn't raise ValueError")
3656
3657 try: ''.join([0])
3658 except TypeError: pass
3659 else: self.fail("''.join([0]) doesn't raise TypeError")
3660
3661 try: ''.rindex('5')
3662 except ValueError: pass
3663 else: self.fail("''.rindex('5') doesn't raise ValueError")
3664
3665 try: '%(n)s' % None
3666 except TypeError: pass
3667 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3668
3669 try: '%(n' % {}
3670 except ValueError: pass
3671 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3672
3673 try: '%*s' % ('abc')
3674 except TypeError: pass
3675 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3676
3677 try: '%*.*s' % ('abc', 5)
3678 except TypeError: pass
3679 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3680
3681 try: '%s' % (1, 2)
3682 except TypeError: pass
3683 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3684
3685 try: '%' % None
3686 except ValueError: pass
3687 else: self.fail("'%' % None doesn't raise ValueError")
3688
3689 self.assertEqual('534253'.isdigit(), 1)
3690 self.assertEqual('534253x'.isdigit(), 0)
3691 self.assertEqual('%c' % 5, '\x05')
3692 self.assertEqual('%c' % '5', '5')
3693
3694 def test_deepcopy_recursive(self):
3695 # Testing deepcopy of recursive objects...
3696 class Node:
3697 pass
3698 a = Node()
3699 b = Node()
3700 a.b = b
3701 b.a = a
3702 z = deepcopy(a) # This blew up before
3703
3704 def test_unintialized_modules(self):
3705 # Testing uninitialized module objects...
3706 from types import ModuleType as M
3707 m = M.__new__(M)
3708 str(m)
3709 self.assertEqual(hasattr(m, "__name__"), 0)
3710 self.assertEqual(hasattr(m, "__file__"), 0)
3711 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003712 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003713 m.foo = 1
3714 self.assertEqual(m.__dict__, {"foo": 1})
3715
3716 def test_funny_new(self):
3717 # Testing __new__ returning something unexpected...
3718 class C(object):
3719 def __new__(cls, arg):
3720 if isinstance(arg, str): return [1, 2, 3]
3721 elif isinstance(arg, int): return object.__new__(D)
3722 else: return object.__new__(cls)
3723 class D(C):
3724 def __init__(self, arg):
3725 self.foo = arg
3726 self.assertEqual(C("1"), [1, 2, 3])
3727 self.assertEqual(D("1"), [1, 2, 3])
3728 d = D(None)
3729 self.assertEqual(d.foo, None)
3730 d = C(1)
3731 self.assertEqual(isinstance(d, D), True)
3732 self.assertEqual(d.foo, 1)
3733 d = D(1)
3734 self.assertEqual(isinstance(d, D), True)
3735 self.assertEqual(d.foo, 1)
3736
3737 def test_imul_bug(self):
3738 # Testing for __imul__ problems...
3739 # SF bug 544647
3740 class C(object):
3741 def __imul__(self, other):
3742 return (self, other)
3743 x = C()
3744 y = x
3745 y *= 1.0
3746 self.assertEqual(y, (x, 1.0))
3747 y = x
3748 y *= 2
3749 self.assertEqual(y, (x, 2))
3750 y = x
3751 y *= 3L
3752 self.assertEqual(y, (x, 3L))
3753 y = x
3754 y *= 1L<<100
3755 self.assertEqual(y, (x, 1L<<100))
3756 y = x
3757 y *= None
3758 self.assertEqual(y, (x, None))
3759 y = x
3760 y *= "foo"
3761 self.assertEqual(y, (x, "foo"))
3762
3763 def test_copy_setstate(self):
3764 # Testing that copy.*copy() correctly uses __setstate__...
3765 import copy
3766 class C(object):
3767 def __init__(self, foo=None):
3768 self.foo = foo
3769 self.__foo = foo
3770 def setfoo(self, foo=None):
3771 self.foo = foo
3772 def getfoo(self):
3773 return self.__foo
3774 def __getstate__(self):
3775 return [self.foo]
3776 def __setstate__(self_, lst):
3777 self.assertEqual(len(lst), 1)
3778 self_.__foo = self_.foo = lst[0]
3779 a = C(42)
3780 a.setfoo(24)
3781 self.assertEqual(a.foo, 24)
3782 self.assertEqual(a.getfoo(), 42)
3783 b = copy.copy(a)
3784 self.assertEqual(b.foo, 24)
3785 self.assertEqual(b.getfoo(), 24)
3786 b = copy.deepcopy(a)
3787 self.assertEqual(b.foo, 24)
3788 self.assertEqual(b.getfoo(), 24)
3789
3790 def test_slices(self):
3791 # Testing cases with slices and overridden __getitem__ ...
3792
3793 # Strings
3794 self.assertEqual("hello"[:4], "hell")
3795 self.assertEqual("hello"[slice(4)], "hell")
3796 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3797 class S(str):
3798 def __getitem__(self, x):
3799 return str.__getitem__(self, x)
3800 self.assertEqual(S("hello")[:4], "hell")
3801 self.assertEqual(S("hello")[slice(4)], "hell")
3802 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3803 # Tuples
3804 self.assertEqual((1,2,3)[:2], (1,2))
3805 self.assertEqual((1,2,3)[slice(2)], (1,2))
3806 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3807 class T(tuple):
3808 def __getitem__(self, x):
3809 return tuple.__getitem__(self, x)
3810 self.assertEqual(T((1,2,3))[:2], (1,2))
3811 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3812 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3813 # Lists
3814 self.assertEqual([1,2,3][:2], [1,2])
3815 self.assertEqual([1,2,3][slice(2)], [1,2])
3816 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3817 class L(list):
3818 def __getitem__(self, x):
3819 return list.__getitem__(self, x)
3820 self.assertEqual(L([1,2,3])[:2], [1,2])
3821 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3822 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3823 # Now do lists and __setitem__
3824 a = L([1,2,3])
3825 a[slice(1, 3)] = [3,2]
3826 self.assertEqual(a, [1,3,2])
3827 a[slice(0, 2, 1)] = [3,1]
3828 self.assertEqual(a, [3,1,2])
3829 a.__setitem__(slice(1, 3), [2,1])
3830 self.assertEqual(a, [3,2,1])
3831 a.__setitem__(slice(0, 2, 1), [2,3])
3832 self.assertEqual(a, [2,3,1])
3833
3834 def test_subtype_resurrection(self):
3835 # Testing resurrection of new-style instance...
3836
3837 class C(object):
3838 container = []
3839
3840 def __del__(self):
3841 # resurrect the instance
3842 C.container.append(self)
3843
3844 c = C()
3845 c.attr = 42
3846
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003847 # The most interesting thing here is whether this blows up, due to
3848 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3849 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003850 del c
3851
3852 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003853 # the last container slot works: that will attempt to delete c again,
3854 # which will cause c to get appended back to the container again
3855 # "during" the del. (On non-CPython implementations, however, __del__
3856 # is typically not called again.)
3857 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003858 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003859 del C.container[-1]
3860 if test_support.check_impl_detail():
3861 test_support.gc_collect()
3862 self.assertEqual(len(C.container), 1)
3863 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003864
3865 # Make c mortal again, so that the test framework with -l doesn't report
3866 # it as a leak.
3867 del C.__del__
3868
3869 def test_slots_trash(self):
3870 # Testing slot trash...
3871 # Deallocating deeply nested slotted trash caused stack overflows
3872 class trash(object):
3873 __slots__ = ['x']
3874 def __init__(self, x):
3875 self.x = x
3876 o = None
3877 for i in xrange(50000):
3878 o = trash(o)
3879 del o
3880
3881 def test_slots_multiple_inheritance(self):
3882 # SF bug 575229, multiple inheritance w/ slots dumps core
3883 class A(object):
3884 __slots__=()
3885 class B(object):
3886 pass
3887 class C(A,B) :
3888 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003889 if test_support.check_impl_detail():
3890 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003891 self.assertTrue(hasattr(C, '__dict__'))
3892 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl48545522008-02-02 10:12:36 +00003893 C().x = 2
3894
3895 def test_rmul(self):
3896 # Testing correct invocation of __rmul__...
3897 # SF patch 592646
3898 class C(object):
3899 def __mul__(self, other):
3900 return "mul"
3901 def __rmul__(self, other):
3902 return "rmul"
3903 a = C()
3904 self.assertEqual(a*2, "mul")
3905 self.assertEqual(a*2.2, "mul")
3906 self.assertEqual(2*a, "rmul")
3907 self.assertEqual(2.2*a, "rmul")
3908
3909 def test_ipow(self):
3910 # Testing correct invocation of __ipow__...
3911 # [SF bug 620179]
3912 class C(object):
3913 def __ipow__(self, other):
3914 pass
3915 a = C()
3916 a **= 2
3917
3918 def test_mutable_bases(self):
3919 # Testing mutable bases...
3920
3921 # stuff that should work:
3922 class C(object):
3923 pass
3924 class C2(object):
3925 def __getattribute__(self, attr):
3926 if attr == 'a':
3927 return 2
3928 else:
3929 return super(C2, self).__getattribute__(attr)
3930 def meth(self):
3931 return 1
3932 class D(C):
3933 pass
3934 class E(D):
3935 pass
3936 d = D()
3937 e = E()
3938 D.__bases__ = (C,)
3939 D.__bases__ = (C2,)
3940 self.assertEqual(d.meth(), 1)
3941 self.assertEqual(e.meth(), 1)
3942 self.assertEqual(d.a, 2)
3943 self.assertEqual(e.a, 2)
3944 self.assertEqual(C2.__subclasses__(), [D])
3945
Georg Brandl48545522008-02-02 10:12:36 +00003946 try:
3947 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003948 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003949 pass
3950 else:
3951 self.fail("shouldn't be able to delete .__bases__")
3952
3953 try:
3954 D.__bases__ = ()
3955 except TypeError, msg:
3956 if str(msg) == "a new-style class can't have only classic bases":
3957 self.fail("wrong error message for .__bases__ = ()")
3958 else:
3959 self.fail("shouldn't be able to set .__bases__ to ()")
3960
3961 try:
3962 D.__bases__ = (D,)
3963 except TypeError:
3964 pass
3965 else:
3966 # actually, we'll have crashed by here...
3967 self.fail("shouldn't be able to create inheritance cycles")
3968
3969 try:
3970 D.__bases__ = (C, C)
3971 except TypeError:
3972 pass
3973 else:
3974 self.fail("didn't detect repeated base classes")
3975
3976 try:
3977 D.__bases__ = (E,)
3978 except TypeError:
3979 pass
3980 else:
3981 self.fail("shouldn't be able to create inheritance cycles")
3982
3983 # let's throw a classic class into the mix:
3984 class Classic:
3985 def meth2(self):
3986 return 3
3987
3988 D.__bases__ = (C, Classic)
3989
3990 self.assertEqual(d.meth2(), 3)
3991 self.assertEqual(e.meth2(), 3)
3992 try:
3993 d.a
3994 except AttributeError:
3995 pass
3996 else:
3997 self.fail("attribute should have vanished")
3998
3999 try:
4000 D.__bases__ = (Classic,)
4001 except TypeError:
4002 pass
4003 else:
4004 self.fail("new-style class must have a new-style base")
4005
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004006 def test_builtin_bases(self):
4007 # Make sure all the builtin types can have their base queried without
4008 # segfaulting. See issue #5787.
4009 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
4010 if isinstance(tp, type)]
4011 for tp in builtin_types:
4012 object.__getattribute__(tp, "__bases__")
4013 if tp is not object:
4014 self.assertEqual(len(tp.__bases__), 1, tp)
4015
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00004016 class L(list):
4017 pass
4018
4019 class C(object):
4020 pass
4021
4022 class D(C):
4023 pass
4024
4025 try:
4026 L.__bases__ = (dict,)
4027 except TypeError:
4028 pass
4029 else:
4030 self.fail("shouldn't turn list subclass into dict subclass")
4031
4032 try:
4033 list.__bases__ = (dict,)
4034 except TypeError:
4035 pass
4036 else:
4037 self.fail("shouldn't be able to assign to list.__bases__")
4038
4039 try:
4040 D.__bases__ = (C, list)
4041 except TypeError:
4042 pass
4043 else:
4044 assert 0, "best_base calculation found wanting"
4045
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004046
Georg Brandl48545522008-02-02 10:12:36 +00004047 def test_mutable_bases_with_failing_mro(self):
4048 # Testing mutable bases with failing mro...
4049 class WorkOnce(type):
4050 def __new__(self, name, bases, ns):
4051 self.flag = 0
4052 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
4053 def mro(self):
4054 if self.flag > 0:
4055 raise RuntimeError, "bozo"
4056 else:
4057 self.flag += 1
4058 return type.mro(self)
4059
4060 class WorkAlways(type):
4061 def mro(self):
4062 # this is here to make sure that .mro()s aren't called
4063 # with an exception set (which was possible at one point).
4064 # An error message will be printed in a debug build.
4065 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004066 return type.mro(self)
4067
Georg Brandl48545522008-02-02 10:12:36 +00004068 class C(object):
4069 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004070
Georg Brandl48545522008-02-02 10:12:36 +00004071 class C2(object):
4072 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004073
Georg Brandl48545522008-02-02 10:12:36 +00004074 class D(C):
4075 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004076
Georg Brandl48545522008-02-02 10:12:36 +00004077 class E(D):
4078 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004079
Georg Brandl48545522008-02-02 10:12:36 +00004080 class F(D):
4081 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004082
Georg Brandl48545522008-02-02 10:12:36 +00004083 class G(D):
4084 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004085
Georg Brandl48545522008-02-02 10:12:36 +00004086 # Immediate subclasses have their mro's adjusted in alphabetical
4087 # order, so E's will get adjusted before adjusting F's fails. We
4088 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004089
Georg Brandl48545522008-02-02 10:12:36 +00004090 E_mro_before = E.__mro__
4091 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004092
Armin Rigofd163f92005-12-29 15:59:19 +00004093 try:
Georg Brandl48545522008-02-02 10:12:36 +00004094 D.__bases__ = (C2,)
4095 except RuntimeError:
4096 self.assertEqual(E.__mro__, E_mro_before)
4097 self.assertEqual(D.__mro__, D_mro_before)
4098 else:
4099 self.fail("exception not propagated")
4100
4101 def test_mutable_bases_catch_mro_conflict(self):
4102 # Testing mutable bases catch mro conflict...
4103 class A(object):
4104 pass
4105
4106 class B(object):
4107 pass
4108
4109 class C(A, B):
4110 pass
4111
4112 class D(A, B):
4113 pass
4114
4115 class E(C, D):
4116 pass
4117
4118 try:
4119 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004120 except TypeError:
4121 pass
4122 else:
Georg Brandl48545522008-02-02 10:12:36 +00004123 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004124
Georg Brandl48545522008-02-02 10:12:36 +00004125 def test_mutable_names(self):
4126 # Testing mutable names...
4127 class C(object):
4128 pass
4129
4130 # C.__module__ could be 'test_descr' or '__main__'
4131 mod = C.__module__
4132
4133 C.__name__ = 'D'
4134 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4135
4136 C.__name__ = 'D.E'
4137 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4138
Mark Dickinsonf794b142013-04-13 15:19:05 +01004139 def test_evil_type_name(self):
4140 # A badly placed Py_DECREF in type_set_name led to arbitrary code
4141 # execution while the type structure was not in a sane state, and a
4142 # possible segmentation fault as a result. See bug #16447.
4143 class Nasty(str):
4144 def __del__(self):
4145 C.__name__ = "other"
4146
4147 class C(object):
4148 pass
4149
4150 C.__name__ = Nasty("abc")
4151 C.__name__ = "normal"
4152
Georg Brandl48545522008-02-02 10:12:36 +00004153 def test_subclass_right_op(self):
4154 # Testing correct dispatch of subclass overloading __r<op>__...
4155
4156 # This code tests various cases where right-dispatch of a subclass
4157 # should be preferred over left-dispatch of a base class.
4158
4159 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4160
4161 class B(int):
4162 def __floordiv__(self, other):
4163 return "B.__floordiv__"
4164 def __rfloordiv__(self, other):
4165 return "B.__rfloordiv__"
4166
4167 self.assertEqual(B(1) // 1, "B.__floordiv__")
4168 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4169
4170 # Case 2: subclass of object; this is just the baseline for case 3
4171
4172 class C(object):
4173 def __floordiv__(self, other):
4174 return "C.__floordiv__"
4175 def __rfloordiv__(self, other):
4176 return "C.__rfloordiv__"
4177
4178 self.assertEqual(C() // 1, "C.__floordiv__")
4179 self.assertEqual(1 // C(), "C.__rfloordiv__")
4180
4181 # Case 3: subclass of new-style class; here it gets interesting
4182
4183 class D(C):
4184 def __floordiv__(self, other):
4185 return "D.__floordiv__"
4186 def __rfloordiv__(self, other):
4187 return "D.__rfloordiv__"
4188
4189 self.assertEqual(D() // C(), "D.__floordiv__")
4190 self.assertEqual(C() // D(), "D.__rfloordiv__")
4191
4192 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4193
4194 class E(C):
4195 pass
4196
4197 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4198
4199 self.assertEqual(E() // 1, "C.__floordiv__")
4200 self.assertEqual(1 // E(), "C.__rfloordiv__")
4201 self.assertEqual(E() // C(), "C.__floordiv__")
4202 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4203
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004204 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004205 def test_meth_class_get(self):
4206 # Testing __get__ method of METH_CLASS C methods...
4207 # Full coverage of descrobject.c::classmethod_get()
4208
4209 # Baseline
4210 arg = [1, 2, 3]
4211 res = {1: None, 2: None, 3: None}
4212 self.assertEqual(dict.fromkeys(arg), res)
4213 self.assertEqual({}.fromkeys(arg), res)
4214
4215 # Now get the descriptor
4216 descr = dict.__dict__["fromkeys"]
4217
4218 # More baseline using the descriptor directly
4219 self.assertEqual(descr.__get__(None, dict)(arg), res)
4220 self.assertEqual(descr.__get__({})(arg), res)
4221
4222 # Now check various error cases
4223 try:
4224 descr.__get__(None, None)
4225 except TypeError:
4226 pass
4227 else:
4228 self.fail("shouldn't have allowed descr.__get__(None, None)")
4229 try:
4230 descr.__get__(42)
4231 except TypeError:
4232 pass
4233 else:
4234 self.fail("shouldn't have allowed descr.__get__(42)")
4235 try:
4236 descr.__get__(None, 42)
4237 except TypeError:
4238 pass
4239 else:
4240 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4241 try:
4242 descr.__get__(None, int)
4243 except TypeError:
4244 pass
4245 else:
4246 self.fail("shouldn't have allowed descr.__get__(None, int)")
4247
4248 def test_isinst_isclass(self):
4249 # Testing proxy isinstance() and isclass()...
4250 class Proxy(object):
4251 def __init__(self, obj):
4252 self.__obj = obj
4253 def __getattribute__(self, name):
4254 if name.startswith("_Proxy__"):
4255 return object.__getattribute__(self, name)
4256 else:
4257 return getattr(self.__obj, name)
4258 # Test with a classic class
4259 class C:
4260 pass
4261 a = C()
4262 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004263 self.assertIsInstance(a, C) # Baseline
4264 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004265 # Test with a classic subclass
4266 class D(C):
4267 pass
4268 a = D()
4269 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004270 self.assertIsInstance(a, C) # Baseline
4271 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004272 # Test with a new-style class
4273 class C(object):
4274 pass
4275 a = C()
4276 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004277 self.assertIsInstance(a, C) # Baseline
4278 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004279 # Test with a new-style subclass
4280 class D(C):
4281 pass
4282 a = D()
4283 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004284 self.assertIsInstance(a, C) # Baseline
4285 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004286
4287 def test_proxy_super(self):
4288 # Testing super() for a proxy object...
4289 class Proxy(object):
4290 def __init__(self, obj):
4291 self.__obj = obj
4292 def __getattribute__(self, name):
4293 if name.startswith("_Proxy__"):
4294 return object.__getattribute__(self, name)
4295 else:
4296 return getattr(self.__obj, name)
4297
4298 class B(object):
4299 def f(self):
4300 return "B.f"
4301
4302 class C(B):
4303 def f(self):
4304 return super(C, self).f() + "->C.f"
4305
4306 obj = C()
4307 p = Proxy(obj)
4308 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4309
4310 def test_carloverre(self):
4311 # Testing prohibition of Carlo Verre's hack...
4312 try:
4313 object.__setattr__(str, "foo", 42)
4314 except TypeError:
4315 pass
4316 else:
Ezio Melottic2077b02011-03-16 12:34:31 +02004317 self.fail("Carlo Verre __setattr__ succeeded!")
Georg Brandl48545522008-02-02 10:12:36 +00004318 try:
4319 object.__delattr__(str, "lower")
4320 except TypeError:
4321 pass
4322 else:
4323 self.fail("Carlo Verre __delattr__ succeeded!")
4324
4325 def test_weakref_segfault(self):
4326 # Testing weakref segfault...
4327 # SF 742911
4328 import weakref
4329
4330 class Provoker:
4331 def __init__(self, referrent):
4332 self.ref = weakref.ref(referrent)
4333
4334 def __del__(self):
4335 x = self.ref()
4336
4337 class Oops(object):
4338 pass
4339
4340 o = Oops()
4341 o.whatever = Provoker(o)
4342 del o
4343
4344 def test_wrapper_segfault(self):
4345 # SF 927248: deeply nested wrappers could cause stack overflow
4346 f = lambda:None
4347 for i in xrange(1000000):
4348 f = f.__call__
4349 f = None
4350
4351 def test_file_fault(self):
4352 # Testing sys.stdout is changed in getattr...
Nick Coghlan0447cd62009-10-17 06:33:05 +00004353 test_stdout = sys.stdout
Georg Brandl48545522008-02-02 10:12:36 +00004354 class StdoutGuard:
4355 def __getattr__(self, attr):
4356 sys.stdout = sys.__stdout__
4357 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4358 sys.stdout = StdoutGuard()
4359 try:
4360 print "Oops!"
4361 except RuntimeError:
4362 pass
Nick Coghlan0447cd62009-10-17 06:33:05 +00004363 finally:
4364 sys.stdout = test_stdout
Georg Brandl48545522008-02-02 10:12:36 +00004365
4366 def test_vicious_descriptor_nonsense(self):
4367 # Testing vicious_descriptor_nonsense...
4368
4369 # A potential segfault spotted by Thomas Wouters in mail to
4370 # python-dev 2003-04-17, turned into an example & fixed by Michael
4371 # Hudson just less than four months later...
4372
4373 class Evil(object):
4374 def __hash__(self):
4375 return hash('attr')
4376 def __eq__(self, other):
4377 del C.attr
4378 return 0
4379
4380 class Descr(object):
4381 def __get__(self, ob, type=None):
4382 return 1
4383
4384 class C(object):
4385 attr = Descr()
4386
4387 c = C()
4388 c.__dict__[Evil()] = 0
4389
4390 self.assertEqual(c.attr, 1)
4391 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004392 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00004393 self.assertEqual(hasattr(c, 'attr'), False)
4394
4395 def test_init(self):
4396 # SF 1155938
4397 class Foo(object):
4398 def __init__(self):
4399 return 10
4400 try:
4401 Foo()
4402 except TypeError:
4403 pass
4404 else:
4405 self.fail("did not test __init__() for None return")
4406
4407 def test_method_wrapper(self):
4408 # Testing method-wrapper objects...
4409 # <type 'method-wrapper'> did not support any reflection before 2.5
4410
4411 l = []
4412 self.assertEqual(l.__add__, l.__add__)
4413 self.assertEqual(l.__add__, [].__add__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004414 self.assertTrue(l.__add__ != [5].__add__)
4415 self.assertTrue(l.__add__ != l.__mul__)
4416 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004417 if hasattr(l.__add__, '__self__'):
4418 # CPython
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004419 self.assertTrue(l.__add__.__self__ is l)
4420 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004421 else:
4422 # Python implementations where [].__add__ is a normal bound method
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004423 self.assertTrue(l.__add__.im_self is l)
4424 self.assertTrue(l.__add__.im_class is list)
Georg Brandl48545522008-02-02 10:12:36 +00004425 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4426 try:
4427 hash(l.__add__)
4428 except TypeError:
4429 pass
4430 else:
4431 self.fail("no TypeError from hash([].__add__)")
4432
4433 t = ()
4434 t += (7,)
4435 self.assertEqual(t.__add__, (7,).__add__)
4436 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4437
4438 def test_not_implemented(self):
4439 # Testing NotImplemented...
4440 # all binary methods should be able to return a NotImplemented
Georg Brandl48545522008-02-02 10:12:36 +00004441 import operator
4442
4443 def specialmethod(self, other):
4444 return NotImplemented
4445
4446 def check(expr, x, y):
4447 try:
4448 exec expr in {'x': x, 'y': y, 'operator': operator}
4449 except TypeError:
4450 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004451 else:
Georg Brandl48545522008-02-02 10:12:36 +00004452 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004453
Georg Brandl48545522008-02-02 10:12:36 +00004454 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4455 # TypeErrors
4456 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4457 # ValueErrors instead of TypeErrors
4458 for metaclass in [type, types.ClassType]:
4459 for name, expr, iexpr in [
4460 ('__add__', 'x + y', 'x += y'),
4461 ('__sub__', 'x - y', 'x -= y'),
4462 ('__mul__', 'x * y', 'x *= y'),
4463 ('__truediv__', 'operator.truediv(x, y)', None),
4464 ('__floordiv__', 'operator.floordiv(x, y)', None),
4465 ('__div__', 'x / y', 'x /= y'),
4466 ('__mod__', 'x % y', 'x %= y'),
4467 ('__divmod__', 'divmod(x, y)', None),
4468 ('__pow__', 'x ** y', 'x **= y'),
4469 ('__lshift__', 'x << y', 'x <<= y'),
4470 ('__rshift__', 'x >> y', 'x >>= y'),
4471 ('__and__', 'x & y', 'x &= y'),
4472 ('__or__', 'x | y', 'x |= y'),
4473 ('__xor__', 'x ^ y', 'x ^= y'),
4474 ('__coerce__', 'coerce(x, y)', None)]:
4475 if name == '__coerce__':
4476 rname = name
4477 else:
4478 rname = '__r' + name[2:]
4479 A = metaclass('A', (), {name: specialmethod})
4480 B = metaclass('B', (), {rname: specialmethod})
4481 a = A()
4482 b = B()
4483 check(expr, a, a)
4484 check(expr, a, b)
4485 check(expr, b, a)
4486 check(expr, b, b)
4487 check(expr, a, N1)
4488 check(expr, a, N2)
4489 check(expr, N1, b)
4490 check(expr, N2, b)
4491 if iexpr:
4492 check(iexpr, a, a)
4493 check(iexpr, a, b)
4494 check(iexpr, b, a)
4495 check(iexpr, b, b)
4496 check(iexpr, a, N1)
4497 check(iexpr, a, N2)
4498 iname = '__i' + name[2:]
4499 C = metaclass('C', (), {iname: specialmethod})
4500 c = C()
4501 check(iexpr, c, a)
4502 check(iexpr, c, b)
4503 check(iexpr, c, N1)
4504 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004505
Georg Brandl48545522008-02-02 10:12:36 +00004506 def test_assign_slice(self):
4507 # ceval.c's assign_slice used to check for
4508 # tp->tp_as_sequence->sq_slice instead of
4509 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004510
Georg Brandl48545522008-02-02 10:12:36 +00004511 class C(object):
4512 def __setslice__(self, start, stop, value):
4513 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004514
Georg Brandl48545522008-02-02 10:12:36 +00004515 c = C()
4516 c[1:2] = 3
4517 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004518
Benjamin Peterson9179dab2010-01-18 23:07:56 +00004519 def test_set_and_no_get(self):
4520 # See
4521 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4522 class Descr(object):
4523
4524 def __init__(self, name):
4525 self.name = name
4526
4527 def __set__(self, obj, value):
4528 obj.__dict__[self.name] = value
4529 descr = Descr("a")
4530
4531 class X(object):
4532 a = descr
4533
4534 x = X()
4535 self.assertIs(x.a, descr)
4536 x.a = 42
4537 self.assertEqual(x.a, 42)
4538
Benjamin Peterson42d59472010-02-06 20:14:10 +00004539 # Also check type_getattro for correctness.
4540 class Meta(type):
4541 pass
4542 class X(object):
4543 __metaclass__ = Meta
4544 X.a = 42
4545 Meta.a = Descr("a")
4546 self.assertEqual(X.a, 42)
4547
Benjamin Peterson273c2332008-11-17 22:39:09 +00004548 def test_getattr_hooks(self):
4549 # issue 4230
4550
4551 class Descriptor(object):
4552 counter = 0
4553 def __get__(self, obj, objtype=None):
4554 def getter(name):
4555 self.counter += 1
4556 raise AttributeError(name)
4557 return getter
4558
4559 descr = Descriptor()
4560 class A(object):
4561 __getattribute__ = descr
4562 class B(object):
4563 __getattr__ = descr
4564 class C(object):
4565 __getattribute__ = descr
4566 __getattr__ = descr
4567
4568 self.assertRaises(AttributeError, getattr, A(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004569 self.assertEqual(descr.counter, 1)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004570 self.assertRaises(AttributeError, getattr, B(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004571 self.assertEqual(descr.counter, 2)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004572 self.assertRaises(AttributeError, getattr, C(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004573 self.assertEqual(descr.counter, 4)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004574
Benjamin Peterson273c2332008-11-17 22:39:09 +00004575 class EvilGetattribute(object):
4576 # This used to segfault
4577 def __getattr__(self, name):
4578 raise AttributeError(name)
4579 def __getattribute__(self, name):
4580 del EvilGetattribute.__getattr__
4581 for i in range(5):
4582 gc.collect()
4583 raise AttributeError(name)
4584
4585 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4586
Benjamin Peterson6e7832b2012-03-16 09:32:59 -05004587 def test_type___getattribute__(self):
4588 self.assertRaises(TypeError, type.__getattribute__, list, type)
4589
Benjamin Peterson9b911ca2011-01-12 15:49:47 +00004590 def test_abstractmethods(self):
4591 # type pretends not to have __abstractmethods__.
4592 self.assertRaises(AttributeError, getattr, type, "__abstractmethods__")
4593 class meta(type):
4594 pass
4595 self.assertRaises(AttributeError, getattr, meta, "__abstractmethods__")
4596 class X(object):
4597 pass
4598 with self.assertRaises(AttributeError):
4599 del X.__abstractmethods__
4600
Victor Stinnere363ec12011-05-01 23:43:37 +02004601 def test_proxy_call(self):
4602 class FakeStr(object):
4603 __class__ = str
4604
4605 fake_str = FakeStr()
4606 # isinstance() reads __class__ on new style classes
4607 self.assertTrue(isinstance(fake_str, str))
4608
4609 # call a method descriptor
4610 with self.assertRaises(TypeError):
4611 str.split(fake_str)
4612
4613 # call a slot wrapper descriptor
4614 with self.assertRaises(TypeError):
4615 str.__add__(fake_str, "abc")
4616
Antoine Pitrou304f0f92011-07-15 21:22:50 +02004617 def test_repr_as_str(self):
4618 # Issue #11603: crash or infinite loop when rebinding __str__ as
4619 # __repr__.
4620 class Foo(object):
4621 pass
4622 Foo.__repr__ = Foo.__str__
4623 foo = Foo()
Benjamin Petersond157a4c2012-04-24 11:06:25 -04004624 self.assertRaises(RuntimeError, str, foo)
4625 self.assertRaises(RuntimeError, repr, foo)
4626
4627 def test_mixing_slot_wrappers(self):
4628 class X(dict):
4629 __setattr__ = dict.__setitem__
4630 x = X()
4631 x.y = 42
4632 self.assertEqual(x["y"], 42)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004633
Benjamin Petersona8d45852012-03-07 18:41:11 -06004634 def test_cycle_through_dict(self):
4635 # See bug #1469629
4636 class X(dict):
4637 def __init__(self):
4638 dict.__init__(self)
4639 self.__dict__ = self
4640 x = X()
4641 x.attr = 42
4642 wr = weakref.ref(x)
4643 del x
4644 test_support.gc_collect()
4645 self.assertIsNone(wr())
4646 for o in gc.get_objects():
4647 self.assertIsNot(type(o), X)
4648
Georg Brandl48545522008-02-02 10:12:36 +00004649class DictProxyTests(unittest.TestCase):
4650 def setUp(self):
4651 class C(object):
4652 def meth(self):
4653 pass
4654 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004655
Raymond Hettingerbf7a2662011-06-30 00:44:36 +01004656 def test_repr(self):
4657 self.assertIn('dict_proxy({', repr(vars(self.C)))
4658 self.assertIn("'meth':", repr(vars(self.C)))
4659
Georg Brandl48545522008-02-02 10:12:36 +00004660 def test_iter_keys(self):
4661 # Testing dict-proxy iterkeys...
4662 keys = [ key for key in self.C.__dict__.iterkeys() ]
4663 keys.sort()
Ezio Melotti2623a372010-11-21 13:34:58 +00004664 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
Georg Brandl48545522008-02-02 10:12:36 +00004665 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004666
Georg Brandl48545522008-02-02 10:12:36 +00004667 def test_iter_values(self):
4668 # Testing dict-proxy itervalues...
4669 values = [ values for values in self.C.__dict__.itervalues() ]
4670 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004671
Georg Brandl48545522008-02-02 10:12:36 +00004672 def test_iter_items(self):
4673 # Testing dict-proxy iteritems...
4674 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4675 keys.sort()
4676 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4677 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004678
Georg Brandl48545522008-02-02 10:12:36 +00004679 def test_dict_type_with_metaclass(self):
4680 # Testing type of __dict__ when __metaclass__ set...
4681 class B(object):
4682 pass
4683 class M(type):
4684 pass
4685 class C:
4686 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4687 __metaclass__ = M
4688 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004689
Guido van Rossum9acc3872008-01-23 23:23:43 +00004690
Georg Brandl48545522008-02-02 10:12:36 +00004691class PTypesLongInitTest(unittest.TestCase):
4692 # This is in its own TestCase so that it can be run before any other tests.
4693 def test_pytype_long_ready(self):
4694 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004695
Georg Brandl48545522008-02-02 10:12:36 +00004696 # This dumps core when SF bug 551412 isn't fixed --
4697 # but only when test_descr.py is run separately.
4698 # (That can't be helped -- as soon as PyType_Ready()
4699 # is called for PyLong_Type, the bug is gone.)
4700 class UserLong(object):
4701 def __pow__(self, *args):
4702 pass
4703 try:
4704 pow(0L, UserLong(), 0L)
4705 except:
4706 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004707
Georg Brandl48545522008-02-02 10:12:36 +00004708 # Another segfault only when run early
4709 # (before PyType_Ready(tuple) is called)
4710 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004711
4712
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004713def test_main():
Florent Xicluna6257a7b2010-03-31 22:01:03 +00004714 deprecations = [(r'complex divmod\(\), // and % are deprecated$',
4715 DeprecationWarning)]
4716 if sys.py3kwarning:
4717 deprecations += [
Florent Xicluna07627882010-03-21 01:14:24 +00004718 ("classic (int|long) division", DeprecationWarning),
4719 ("coerce.. not supported", DeprecationWarning),
Florent Xicluna6257a7b2010-03-31 22:01:03 +00004720 (".+__(get|set|del)slice__ has been removed", DeprecationWarning)]
4721 with test_support.check_warnings(*deprecations):
Florent Xicluna07627882010-03-21 01:14:24 +00004722 # Run all local test cases, with PTypesLongInitTest first.
4723 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4724 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004725
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004726if __name__ == "__main__":
4727 test_main()