blob: 6f918427e472dcaaf3e83680c02c347431044546 [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
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200401 def assertHasAttr(self, obj, name):
402 self.assertTrue(hasattr(obj, name),
403 '%r has no attribute %r' % (obj, name))
404
405 def assertNotHasAttr(self, obj, name):
406 self.assertFalse(hasattr(obj, name),
407 '%r has unexpected attribute %r' % (obj, name))
408
Georg Brandl48545522008-02-02 10:12:36 +0000409 def test_python_dicts(self):
410 # Testing Python subclass of dict...
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000411 self.assertTrue(issubclass(dict, dict))
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000412 self.assertIsInstance({}, dict)
Georg Brandl48545522008-02-02 10:12:36 +0000413 d = dict()
414 self.assertEqual(d, {})
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200415 self.assertIs(d.__class__, dict)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000416 self.assertIsInstance(d, dict)
Georg Brandl48545522008-02-02 10:12:36 +0000417 class C(dict):
418 state = -1
419 def __init__(self_local, *a, **kw):
420 if a:
421 self.assertEqual(len(a), 1)
422 self_local.state = a[0]
423 if kw:
424 for k, v in kw.items():
425 self_local[v] = k
426 def __getitem__(self, key):
427 return self.get(key, 0)
428 def __setitem__(self_local, key, value):
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000429 self.assertIsInstance(key, type(0))
Georg Brandl48545522008-02-02 10:12:36 +0000430 dict.__setitem__(self_local, key, value)
431 def setstate(self, state):
432 self.state = state
433 def getstate(self):
434 return self.state
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000435 self.assertTrue(issubclass(C, dict))
Georg Brandl48545522008-02-02 10:12:36 +0000436 a1 = C(12)
437 self.assertEqual(a1.state, 12)
438 a2 = C(foo=1, bar=2)
439 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
440 a = C()
441 self.assertEqual(a.state, -1)
442 self.assertEqual(a.getstate(), -1)
443 a.setstate(0)
444 self.assertEqual(a.state, 0)
445 self.assertEqual(a.getstate(), 0)
446 a.setstate(10)
447 self.assertEqual(a.state, 10)
448 self.assertEqual(a.getstate(), 10)
449 self.assertEqual(a[42], 0)
450 a[42] = 24
451 self.assertEqual(a[42], 24)
452 N = 50
453 for i in range(N):
454 a[i] = C()
455 for j in range(N):
456 a[i][j] = i*j
457 for i in range(N):
458 for j in range(N):
459 self.assertEqual(a[i][j], i*j)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000460
Georg Brandl48545522008-02-02 10:12:36 +0000461 def test_python_lists(self):
462 # Testing Python subclass of list...
463 class C(list):
464 def __getitem__(self, i):
465 return list.__getitem__(self, i) + 100
466 def __getslice__(self, i, j):
467 return (i, j)
468 a = C()
469 a.extend([0,1,2])
470 self.assertEqual(a[0], 100)
471 self.assertEqual(a[1], 101)
472 self.assertEqual(a[2], 102)
473 self.assertEqual(a[100:200], (100,200))
Tim Peterscaaff8d2001-09-10 23:12:14 +0000474
Georg Brandl48545522008-02-02 10:12:36 +0000475 def test_metaclass(self):
476 # Testing __metaclass__...
477 class C:
Guido van Rossume54616c2001-12-14 04:19:56 +0000478 __metaclass__ = type
Georg Brandl48545522008-02-02 10:12:36 +0000479 def __init__(self):
480 self.__state = 0
481 def getstate(self):
482 return self.__state
483 def setstate(self, state):
484 self.__state = state
485 a = C()
486 self.assertEqual(a.getstate(), 0)
487 a.setstate(10)
488 self.assertEqual(a.getstate(), 10)
489 class D:
490 class __metaclass__(type):
491 def myself(cls): return cls
492 self.assertEqual(D.myself(), D)
493 d = D()
494 self.assertEqual(d.__class__, D)
495 class M1(type):
496 def __new__(cls, name, bases, dict):
497 dict['__spam__'] = 1
498 return type.__new__(cls, name, bases, dict)
499 class C:
500 __metaclass__ = M1
501 self.assertEqual(C.__spam__, 1)
502 c = C()
503 self.assertEqual(c.__spam__, 1)
Guido van Rossume54616c2001-12-14 04:19:56 +0000504
Georg Brandl48545522008-02-02 10:12:36 +0000505 class _instance(object):
506 pass
507 class M2(object):
508 @staticmethod
509 def __new__(cls, name, bases, dict):
510 self = object.__new__(cls)
511 self.name = name
512 self.bases = bases
513 self.dict = dict
514 return self
515 def __call__(self):
516 it = _instance()
517 # Early binding of methods
518 for key in self.dict:
519 if key.startswith("__"):
520 continue
521 setattr(it, key, self.dict[key].__get__(it, self))
522 return it
523 class C:
524 __metaclass__ = M2
525 def spam(self):
526 return 42
527 self.assertEqual(C.name, 'C')
528 self.assertEqual(C.bases, ())
Ezio Melottiaa980582010-01-23 23:04:36 +0000529 self.assertIn('spam', C.dict)
Georg Brandl48545522008-02-02 10:12:36 +0000530 c = C()
531 self.assertEqual(c.spam(), 42)
Guido van Rossum9a818922002-11-14 19:50:14 +0000532
Georg Brandl48545522008-02-02 10:12:36 +0000533 # More metaclass examples
Guido van Rossum9a818922002-11-14 19:50:14 +0000534
Georg Brandl48545522008-02-02 10:12:36 +0000535 class autosuper(type):
536 # Automatically add __super to the class
537 # This trick only works for dynamic classes
538 def __new__(metaclass, name, bases, dict):
539 cls = super(autosuper, metaclass).__new__(metaclass,
540 name, bases, dict)
541 # Name mangling for __super removes leading underscores
542 while name[:1] == "_":
543 name = name[1:]
544 if name:
545 name = "_%s__super" % name
546 else:
547 name = "__super"
548 setattr(cls, name, super(cls))
549 return cls
550 class A:
551 __metaclass__ = autosuper
552 def meth(self):
553 return "A"
554 class B(A):
555 def meth(self):
556 return "B" + self.__super.meth()
557 class C(A):
558 def meth(self):
559 return "C" + self.__super.meth()
560 class D(C, B):
561 def meth(self):
562 return "D" + self.__super.meth()
563 self.assertEqual(D().meth(), "DCBA")
564 class E(B, C):
565 def meth(self):
566 return "E" + self.__super.meth()
567 self.assertEqual(E().meth(), "EBCA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000568
Georg Brandl48545522008-02-02 10:12:36 +0000569 class autoproperty(type):
570 # Automatically create property attributes when methods
571 # named _get_x and/or _set_x are found
572 def __new__(metaclass, name, bases, dict):
573 hits = {}
574 for key, val in dict.iteritems():
575 if key.startswith("_get_"):
576 key = key[5:]
577 get, set = hits.get(key, (None, None))
578 get = val
579 hits[key] = get, set
580 elif key.startswith("_set_"):
581 key = key[5:]
582 get, set = hits.get(key, (None, None))
583 set = val
584 hits[key] = get, set
585 for key, (get, set) in hits.iteritems():
586 dict[key] = property(get, set)
587 return super(autoproperty, metaclass).__new__(metaclass,
588 name, bases, dict)
589 class A:
590 __metaclass__ = autoproperty
591 def _get_x(self):
592 return -self.__x
593 def _set_x(self, x):
594 self.__x = -x
595 a = A()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200596 self.assertNotHasAttr(a, "x")
Georg Brandl48545522008-02-02 10:12:36 +0000597 a.x = 12
598 self.assertEqual(a.x, 12)
599 self.assertEqual(a._A__x, -12)
Guido van Rossum9a818922002-11-14 19:50:14 +0000600
Georg Brandl48545522008-02-02 10:12:36 +0000601 class multimetaclass(autoproperty, autosuper):
602 # Merge of multiple cooperating metaclasses
603 pass
604 class A:
605 __metaclass__ = multimetaclass
606 def _get_x(self):
607 return "A"
608 class B(A):
609 def _get_x(self):
610 return "B" + self.__super._get_x()
611 class C(A):
612 def _get_x(self):
613 return "C" + self.__super._get_x()
614 class D(C, B):
615 def _get_x(self):
616 return "D" + self.__super._get_x()
617 self.assertEqual(D().x, "DCBA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000618
Georg Brandl48545522008-02-02 10:12:36 +0000619 # Make sure type(x) doesn't call x.__class__.__init__
620 class T(type):
621 counter = 0
622 def __init__(self, *args):
623 T.counter += 1
624 class C:
625 __metaclass__ = T
626 self.assertEqual(T.counter, 1)
627 a = C()
628 self.assertEqual(type(a), C)
629 self.assertEqual(T.counter, 1)
Guido van Rossum9a818922002-11-14 19:50:14 +0000630
Georg Brandl48545522008-02-02 10:12:36 +0000631 class C(object): pass
632 c = C()
633 try: c()
634 except TypeError: pass
635 else: self.fail("calling object w/o call method should raise "
636 "TypeError")
Guido van Rossum9a818922002-11-14 19:50:14 +0000637
Georg Brandl48545522008-02-02 10:12:36 +0000638 # Testing code to find most derived baseclass
639 class A(type):
640 def __new__(*args, **kwargs):
641 return type.__new__(*args, **kwargs)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000642
Georg Brandl48545522008-02-02 10:12:36 +0000643 class B(object):
644 pass
645
646 class C(object):
647 __metaclass__ = A
648
649 # The most derived metaclass of D is A rather than type.
650 class D(B, C):
651 pass
652
653 def test_module_subclasses(self):
654 # Testing Python subclass of module...
655 log = []
Georg Brandl48545522008-02-02 10:12:36 +0000656 MT = type(sys)
657 class MM(MT):
658 def __init__(self, name):
659 MT.__init__(self, name)
660 def __getattribute__(self, name):
661 log.append(("getattr", name))
662 return MT.__getattribute__(self, name)
663 def __setattr__(self, name, value):
664 log.append(("setattr", name, value))
665 MT.__setattr__(self, name, value)
666 def __delattr__(self, name):
667 log.append(("delattr", name))
668 MT.__delattr__(self, name)
669 a = MM("a")
670 a.foo = 12
671 x = a.foo
672 del a.foo
673 self.assertEqual(log, [("setattr", "foo", 12),
674 ("getattr", "foo"),
675 ("delattr", "foo")])
676
677 # http://python.org/sf/1174712
678 try:
679 class Module(types.ModuleType, str):
680 pass
681 except TypeError:
682 pass
683 else:
684 self.fail("inheriting from ModuleType and str at the same time "
685 "should fail")
686
687 def test_multiple_inheritence(self):
688 # Testing multiple inheritance...
689 class C(object):
690 def __init__(self):
691 self.__state = 0
692 def getstate(self):
693 return self.__state
694 def setstate(self, state):
695 self.__state = state
696 a = C()
697 self.assertEqual(a.getstate(), 0)
698 a.setstate(10)
699 self.assertEqual(a.getstate(), 10)
700 class D(dict, C):
701 def __init__(self):
702 type({}).__init__(self)
703 C.__init__(self)
704 d = D()
705 self.assertEqual(d.keys(), [])
706 d["hello"] = "world"
707 self.assertEqual(d.items(), [("hello", "world")])
708 self.assertEqual(d["hello"], "world")
709 self.assertEqual(d.getstate(), 0)
710 d.setstate(10)
711 self.assertEqual(d.getstate(), 10)
712 self.assertEqual(D.__mro__, (D, dict, C, object))
713
714 # SF bug #442833
715 class Node(object):
716 def __int__(self):
717 return int(self.foo())
718 def foo(self):
719 return "23"
720 class Frag(Node, list):
721 def foo(self):
722 return "42"
723 self.assertEqual(Node().__int__(), 23)
724 self.assertEqual(int(Node()), 23)
725 self.assertEqual(Frag().__int__(), 42)
726 self.assertEqual(int(Frag()), 42)
727
728 # MI mixing classic and new-style classes.
729
730 class A:
731 x = 1
732
733 class B(A):
734 pass
735
736 class C(A):
737 x = 2
738
739 class D(B, C):
740 pass
741 self.assertEqual(D.x, 1)
742
743 # Classic MRO is preserved for a classic base class.
744 class E(D, object):
745 pass
746 self.assertEqual(E.__mro__, (E, D, B, A, C, object))
747 self.assertEqual(E.x, 1)
748
749 # But with a mix of classic bases, their MROs are combined using
750 # new-style MRO.
751 class F(B, C, object):
752 pass
753 self.assertEqual(F.__mro__, (F, B, C, A, object))
754 self.assertEqual(F.x, 2)
755
756 # Try something else.
757 class C:
758 def cmethod(self):
759 return "C a"
760 def all_method(self):
761 return "C b"
762
763 class M1(C, object):
764 def m1method(self):
765 return "M1 a"
766 def all_method(self):
767 return "M1 b"
768
769 self.assertEqual(M1.__mro__, (M1, C, object))
770 m = M1()
771 self.assertEqual(m.cmethod(), "C a")
772 self.assertEqual(m.m1method(), "M1 a")
773 self.assertEqual(m.all_method(), "M1 b")
774
775 class D(C):
776 def dmethod(self):
777 return "D a"
778 def all_method(self):
779 return "D b"
780
781 class M2(D, object):
782 def m2method(self):
783 return "M2 a"
784 def all_method(self):
785 return "M2 b"
786
787 self.assertEqual(M2.__mro__, (M2, D, C, object))
788 m = M2()
789 self.assertEqual(m.cmethod(), "C a")
790 self.assertEqual(m.dmethod(), "D a")
791 self.assertEqual(m.m2method(), "M2 a")
792 self.assertEqual(m.all_method(), "M2 b")
793
794 class M3(M1, M2, object):
795 def m3method(self):
796 return "M3 a"
797 def all_method(self):
798 return "M3 b"
799 self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
800 m = M3()
801 self.assertEqual(m.cmethod(), "C a")
802 self.assertEqual(m.dmethod(), "D a")
803 self.assertEqual(m.m1method(), "M1 a")
804 self.assertEqual(m.m2method(), "M2 a")
805 self.assertEqual(m.m3method(), "M3 a")
806 self.assertEqual(m.all_method(), "M3 b")
807
808 class Classic:
809 pass
810 try:
811 class New(Classic):
812 __metaclass__ = type
813 except TypeError:
814 pass
815 else:
816 self.fail("new class with only classic bases - shouldn't be")
817
818 def test_diamond_inheritence(self):
819 # Testing multiple inheritance special cases...
820 class A(object):
821 def spam(self): return "A"
822 self.assertEqual(A().spam(), "A")
823 class B(A):
824 def boo(self): return "B"
825 def spam(self): return "B"
826 self.assertEqual(B().spam(), "B")
827 self.assertEqual(B().boo(), "B")
828 class C(A):
829 def boo(self): return "C"
830 self.assertEqual(C().spam(), "A")
831 self.assertEqual(C().boo(), "C")
832 class D(B, C): pass
833 self.assertEqual(D().spam(), "B")
834 self.assertEqual(D().boo(), "B")
835 self.assertEqual(D.__mro__, (D, B, C, A, object))
836 class E(C, B): pass
837 self.assertEqual(E().spam(), "B")
838 self.assertEqual(E().boo(), "C")
839 self.assertEqual(E.__mro__, (E, C, B, A, object))
840 # MRO order disagreement
841 try:
842 class F(D, E): pass
843 except TypeError:
844 pass
845 else:
846 self.fail("expected MRO order disagreement (F)")
847 try:
848 class G(E, D): pass
849 except TypeError:
850 pass
851 else:
852 self.fail("expected MRO order disagreement (G)")
853
854 # see thread python-dev/2002-October/029035.html
855 def test_ex5_from_c3_switch(self):
856 # Testing ex5 from C3 switch discussion...
857 class A(object): pass
858 class B(object): pass
859 class C(object): pass
860 class X(A): pass
861 class Y(A): pass
862 class Z(X,B,Y,C): pass
863 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
864
865 # see "A Monotonic Superclass Linearization for Dylan",
866 # by Kim Barrett et al. (OOPSLA 1996)
867 def test_monotonicity(self):
868 # Testing MRO monotonicity...
869 class Boat(object): pass
870 class DayBoat(Boat): pass
871 class WheelBoat(Boat): pass
872 class EngineLess(DayBoat): pass
873 class SmallMultihull(DayBoat): pass
874 class PedalWheelBoat(EngineLess,WheelBoat): pass
875 class SmallCatamaran(SmallMultihull): pass
876 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
877
878 self.assertEqual(PedalWheelBoat.__mro__,
879 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
880 self.assertEqual(SmallCatamaran.__mro__,
881 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
882 self.assertEqual(Pedalo.__mro__,
883 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
884 SmallMultihull, DayBoat, WheelBoat, Boat, object))
885
886 # see "A Monotonic Superclass Linearization for Dylan",
887 # by Kim Barrett et al. (OOPSLA 1996)
888 def test_consistency_with_epg(self):
Ezio Melotti24b07bc2011-03-15 18:55:01 +0200889 # Testing consistency with EPG...
Georg Brandl48545522008-02-02 10:12:36 +0000890 class Pane(object): pass
891 class ScrollingMixin(object): pass
892 class EditingMixin(object): pass
893 class ScrollablePane(Pane,ScrollingMixin): pass
894 class EditablePane(Pane,EditingMixin): pass
895 class EditableScrollablePane(ScrollablePane,EditablePane): pass
896
897 self.assertEqual(EditableScrollablePane.__mro__,
898 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
899 ScrollingMixin, EditingMixin, object))
900
901 def test_mro_disagreement(self):
902 # Testing error messages for MRO disagreement...
903 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000904order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000905
Georg Brandl48545522008-02-02 10:12:36 +0000906 def raises(exc, expected, callable, *args):
907 try:
908 callable(*args)
909 except exc, msg:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000910 # the exact msg is generally considered an impl detail
911 if test_support.check_impl_detail():
912 if not str(msg).startswith(expected):
913 self.fail("Message %r, expected %r" %
914 (str(msg), expected))
Georg Brandl48545522008-02-02 10:12:36 +0000915 else:
916 self.fail("Expected %s" % exc)
917
918 class A(object): pass
919 class B(A): pass
920 class C(object): pass
921
922 # Test some very simple errors
923 raises(TypeError, "duplicate base class A",
924 type, "X", (A, A), {})
925 raises(TypeError, mro_err_msg,
926 type, "X", (A, B), {})
927 raises(TypeError, mro_err_msg,
928 type, "X", (A, C, B), {})
929 # Test a slightly more complex error
930 class GridLayout(object): pass
931 class HorizontalGrid(GridLayout): pass
932 class VerticalGrid(GridLayout): pass
933 class HVGrid(HorizontalGrid, VerticalGrid): pass
934 class VHGrid(VerticalGrid, HorizontalGrid): pass
935 raises(TypeError, mro_err_msg,
936 type, "ConfusedGrid", (HVGrid, VHGrid), {})
937
938 def test_object_class(self):
939 # Testing object class...
940 a = object()
941 self.assertEqual(a.__class__, object)
942 self.assertEqual(type(a), object)
943 b = object()
944 self.assertNotEqual(a, b)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200945 self.assertNotHasAttr(a, "foo")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000946 try:
Georg Brandl48545522008-02-02 10:12:36 +0000947 a.foo = 12
948 except (AttributeError, TypeError):
949 pass
Guido van Rossumd32047f2002-11-25 21:38:52 +0000950 else:
Georg Brandl48545522008-02-02 10:12:36 +0000951 self.fail("object() should not allow setting a foo attribute")
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200952 self.assertNotHasAttr(object(), "__dict__")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000953
Georg Brandl48545522008-02-02 10:12:36 +0000954 class Cdict(object):
955 pass
956 x = Cdict()
957 self.assertEqual(x.__dict__, {})
958 x.foo = 1
959 self.assertEqual(x.foo, 1)
960 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000961
Georg Brandl48545522008-02-02 10:12:36 +0000962 def test_slots(self):
963 # Testing __slots__...
964 class C0(object):
965 __slots__ = []
966 x = C0()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200967 self.assertNotHasAttr(x, "__dict__")
968 self.assertNotHasAttr(x, "foo")
Guido van Rossum37202612001-08-09 19:45:21 +0000969
Georg Brandl48545522008-02-02 10:12:36 +0000970 class C1(object):
971 __slots__ = ['a']
972 x = C1()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200973 self.assertNotHasAttr(x, "__dict__")
974 self.assertNotHasAttr(x, "a")
Georg Brandl48545522008-02-02 10:12:36 +0000975 x.a = 1
976 self.assertEqual(x.a, 1)
977 x.a = None
978 self.assertEqual(x.a, None)
979 del x.a
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200980 self.assertNotHasAttr(x, "a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000981
Georg Brandl48545522008-02-02 10:12:36 +0000982 class C3(object):
983 __slots__ = ['a', 'b', 'c']
984 x = C3()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +0200985 self.assertNotHasAttr(x, "__dict__")
986 self.assertNotHasAttr(x, 'a')
987 self.assertNotHasAttr(x, 'b')
988 self.assertNotHasAttr(x, 'c')
Georg Brandl48545522008-02-02 10:12:36 +0000989 x.a = 1
990 x.b = 2
991 x.c = 3
992 self.assertEqual(x.a, 1)
993 self.assertEqual(x.b, 2)
994 self.assertEqual(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995
Georg Brandl48545522008-02-02 10:12:36 +0000996 class C4(object):
997 """Validate name mangling"""
998 __slots__ = ['__a']
999 def __init__(self, value):
1000 self.__a = value
1001 def get(self):
1002 return self.__a
1003 x = C4(5)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001004 self.assertNotHasAttr(x, '__dict__')
1005 self.assertNotHasAttr(x, '__a')
Georg Brandl48545522008-02-02 10:12:36 +00001006 self.assertEqual(x.get(), 5)
1007 try:
1008 x.__a = 6
1009 except AttributeError:
1010 pass
1011 else:
1012 self.fail("Double underscored names not mangled")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013
Georg Brandl48545522008-02-02 10:12:36 +00001014 # Make sure slot names are proper identifiers
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001015 try:
1016 class C(object):
Georg Brandl48545522008-02-02 10:12:36 +00001017 __slots__ = [None]
Guido van Rossum843daa82001-09-18 20:04:26 +00001018 except TypeError:
1019 pass
1020 else:
Georg Brandl48545522008-02-02 10:12:36 +00001021 self.fail("[None] slots not caught")
Tim Peters66c1a522001-09-24 21:17:50 +00001022 try:
Georg Brandl48545522008-02-02 10:12:36 +00001023 class C(object):
1024 __slots__ = ["foo bar"]
1025 except TypeError:
Georg Brandl533ff6f2006-03-08 18:09:27 +00001026 pass
Georg Brandl48545522008-02-02 10:12:36 +00001027 else:
1028 self.fail("['foo bar'] slots not caught")
1029 try:
1030 class C(object):
1031 __slots__ = ["foo\0bar"]
1032 except TypeError:
1033 pass
1034 else:
1035 self.fail("['foo\\0bar'] slots not caught")
1036 try:
1037 class C(object):
1038 __slots__ = ["1"]
1039 except TypeError:
1040 pass
1041 else:
1042 self.fail("['1'] slots not caught")
1043 try:
1044 class C(object):
1045 __slots__ = [""]
1046 except TypeError:
1047 pass
1048 else:
1049 self.fail("[''] slots not caught")
1050 class C(object):
1051 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1052 # XXX(nnorwitz): was there supposed to be something tested
1053 # from the class above?
Georg Brandl533ff6f2006-03-08 18:09:27 +00001054
Georg Brandl48545522008-02-02 10:12:36 +00001055 # Test a single string is not expanded as a sequence.
1056 class C(object):
1057 __slots__ = "abc"
1058 c = C()
1059 c.abc = 5
1060 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001061
Zachary Ware1f702212013-12-10 14:09:20 -06001062 def test_unicode_slots(self):
Georg Brandl48545522008-02-02 10:12:36 +00001063 # Test unicode slot names
1064 try:
1065 unicode
1066 except NameError:
Zachary Ware1f702212013-12-10 14:09:20 -06001067 self.skipTest('no unicode support')
Georg Brandl48545522008-02-02 10:12:36 +00001068 else:
1069 # Test a single unicode string is not expanded as a sequence.
1070 class C(object):
1071 __slots__ = unicode("abc")
1072 c = C()
1073 c.abc = 5
1074 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001075
Georg Brandl48545522008-02-02 10:12:36 +00001076 # _unicode_to_string used to modify slots in certain circumstances
1077 slots = (unicode("foo"), unicode("bar"))
1078 class C(object):
1079 __slots__ = slots
1080 x = C()
1081 x.foo = 5
1082 self.assertEqual(x.foo, 5)
1083 self.assertEqual(type(slots[0]), unicode)
1084 # this used to leak references
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001085 try:
Georg Brandl48545522008-02-02 10:12:36 +00001086 class C(object):
1087 __slots__ = [unichr(128)]
1088 except (TypeError, UnicodeEncodeError):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001089 pass
Tim Peters8fa45672001-09-13 21:01:29 +00001090 else:
Georg Brandl48545522008-02-02 10:12:36 +00001091 self.fail("[unichr(128)] slots not caught")
Tim Peters8fa45672001-09-13 21:01:29 +00001092
Georg Brandl48545522008-02-02 10:12:36 +00001093 # Test leaks
1094 class Counted(object):
1095 counter = 0 # counts the number of instances alive
1096 def __init__(self):
1097 Counted.counter += 1
1098 def __del__(self):
1099 Counted.counter -= 1
1100 class C(object):
1101 __slots__ = ['a', 'b', 'c']
Guido van Rossum8c842552002-03-14 23:05:54 +00001102 x = C()
Georg Brandl48545522008-02-02 10:12:36 +00001103 x.a = Counted()
1104 x.b = Counted()
1105 x.c = Counted()
1106 self.assertEqual(Counted.counter, 3)
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 D(C):
1111 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00001112 x = D()
Georg Brandl48545522008-02-02 10:12:36 +00001113 x.a = Counted()
1114 x.z = Counted()
1115 self.assertEqual(Counted.counter, 2)
1116 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001117 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001118 self.assertEqual(Counted.counter, 0)
1119 class E(D):
1120 __slots__ = ['e']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00001121 x = E()
Georg Brandl48545522008-02-02 10:12:36 +00001122 x.a = Counted()
1123 x.z = Counted()
1124 x.e = Counted()
1125 self.assertEqual(Counted.counter, 3)
1126 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001127 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001128 self.assertEqual(Counted.counter, 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00001129
Georg Brandl48545522008-02-02 10:12:36 +00001130 # Test cyclical leaks [SF bug 519621]
1131 class F(object):
1132 __slots__ = ['a', 'b']
Georg Brandl48545522008-02-02 10:12:36 +00001133 s = F()
1134 s.a = [Counted(), s]
1135 self.assertEqual(Counted.counter, 1)
1136 s = None
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001137 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001138 self.assertEqual(Counted.counter, 0)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001139
Georg Brandl48545522008-02-02 10:12:36 +00001140 # Test lookup leaks [SF bug 572567]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001141 if hasattr(gc, 'get_objects'):
1142 class G(object):
1143 def __cmp__(self, other):
1144 return 0
1145 __hash__ = None # Silence Py3k warning
1146 g = G()
1147 orig_objects = len(gc.get_objects())
1148 for i in xrange(10):
1149 g==g
1150 new_objects = len(gc.get_objects())
1151 self.assertEqual(orig_objects, new_objects)
1152
Georg Brandl48545522008-02-02 10:12:36 +00001153 class H(object):
1154 __slots__ = ['a', 'b']
1155 def __init__(self):
1156 self.a = 1
1157 self.b = 2
1158 def __del__(self_):
1159 self.assertEqual(self_.a, 1)
1160 self.assertEqual(self_.b, 2)
Armin Rigo581eb1e2008-10-28 17:01:21 +00001161 with test_support.captured_output('stderr') as s:
1162 h = H()
Georg Brandl48545522008-02-02 10:12:36 +00001163 del h
Armin Rigo581eb1e2008-10-28 17:01:21 +00001164 self.assertEqual(s.getvalue(), '')
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001165
Benjamin Peterson0f02d392009-12-30 19:34:10 +00001166 class X(object):
1167 __slots__ = "a"
1168 with self.assertRaises(AttributeError):
1169 del X().a
1170
Georg Brandl48545522008-02-02 10:12:36 +00001171 def test_slots_special(self):
1172 # Testing __dict__ and __weakref__ in __slots__...
1173 class D(object):
1174 __slots__ = ["__dict__"]
1175 a = D()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001176 self.assertHasAttr(a, "__dict__")
1177 self.assertNotHasAttr(a, "__weakref__")
Georg Brandl48545522008-02-02 10:12:36 +00001178 a.foo = 42
1179 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001180
Georg Brandl48545522008-02-02 10:12:36 +00001181 class W(object):
1182 __slots__ = ["__weakref__"]
1183 a = W()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001184 self.assertHasAttr(a, "__weakref__")
1185 self.assertNotHasAttr(a, "__dict__")
Georg Brandl48545522008-02-02 10:12:36 +00001186 try:
1187 a.foo = 42
1188 except AttributeError:
1189 pass
1190 else:
1191 self.fail("shouldn't be allowed to set a.foo")
1192
1193 class C1(W, D):
1194 __slots__ = []
1195 a = C1()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001196 self.assertHasAttr(a, "__dict__")
1197 self.assertHasAttr(a, "__weakref__")
Georg Brandl48545522008-02-02 10:12:36 +00001198 a.foo = 42
1199 self.assertEqual(a.__dict__, {"foo": 42})
1200
1201 class C2(D, W):
1202 __slots__ = []
1203 a = C2()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001204 self.assertHasAttr(a, "__dict__")
1205 self.assertHasAttr(a, "__weakref__")
Georg Brandl48545522008-02-02 10:12:36 +00001206 a.foo = 42
1207 self.assertEqual(a.__dict__, {"foo": 42})
1208
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001209 def test_slots_descriptor(self):
1210 # Issue2115: slot descriptors did not correctly check
1211 # the type of the given object
1212 import abc
1213 class MyABC:
1214 __metaclass__ = abc.ABCMeta
1215 __slots__ = "a"
1216
1217 class Unrelated(object):
1218 pass
1219 MyABC.register(Unrelated)
1220
1221 u = Unrelated()
Ezio Melottib0f5adc2010-01-24 16:58:36 +00001222 self.assertIsInstance(u, MyABC)
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001223
1224 # This used to crash
1225 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1226
Benjamin Peterson4895af42009-12-13 16:36:53 +00001227 def test_metaclass_cmp(self):
1228 # See bug 7491.
1229 class M(type):
1230 def __cmp__(self, other):
1231 return -1
1232 class X(object):
1233 __metaclass__ = M
1234 self.assertTrue(X < M)
1235
Georg Brandl48545522008-02-02 10:12:36 +00001236 def test_dynamics(self):
1237 # Testing class attribute propagation...
1238 class D(object):
1239 pass
1240 class E(D):
1241 pass
1242 class F(D):
1243 pass
1244 D.foo = 1
1245 self.assertEqual(D.foo, 1)
1246 # Test that dynamic attributes are inherited
1247 self.assertEqual(E.foo, 1)
1248 self.assertEqual(F.foo, 1)
1249 # Test dynamic instances
1250 class C(object):
1251 pass
1252 a = C()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001253 self.assertNotHasAttr(a, "foobar")
Georg Brandl48545522008-02-02 10:12:36 +00001254 C.foobar = 2
1255 self.assertEqual(a.foobar, 2)
1256 C.method = lambda self: 42
1257 self.assertEqual(a.method(), 42)
1258 C.__repr__ = lambda self: "C()"
1259 self.assertEqual(repr(a), "C()")
1260 C.__int__ = lambda self: 100
1261 self.assertEqual(int(a), 100)
1262 self.assertEqual(a.foobar, 2)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001263 self.assertNotHasAttr(a, "spam")
Georg Brandl48545522008-02-02 10:12:36 +00001264 def mygetattr(self, name):
1265 if name == "spam":
1266 return "spam"
1267 raise AttributeError
1268 C.__getattr__ = mygetattr
1269 self.assertEqual(a.spam, "spam")
1270 a.new = 12
1271 self.assertEqual(a.new, 12)
1272 def mysetattr(self, name, value):
1273 if name == "spam":
1274 raise AttributeError
1275 return object.__setattr__(self, name, value)
1276 C.__setattr__ = mysetattr
1277 try:
1278 a.spam = "not spam"
1279 except AttributeError:
1280 pass
1281 else:
1282 self.fail("expected AttributeError")
1283 self.assertEqual(a.spam, "spam")
1284 class D(C):
1285 pass
1286 d = D()
1287 d.foo = 1
1288 self.assertEqual(d.foo, 1)
1289
1290 # Test handling of int*seq and seq*int
1291 class I(int):
1292 pass
1293 self.assertEqual("a"*I(2), "aa")
1294 self.assertEqual(I(2)*"a", "aa")
1295 self.assertEqual(2*I(3), 6)
1296 self.assertEqual(I(3)*2, 6)
1297 self.assertEqual(I(3)*I(2), 6)
1298
1299 # Test handling of long*seq and seq*long
1300 class L(long):
1301 pass
1302 self.assertEqual("a"*L(2L), "aa")
1303 self.assertEqual(L(2L)*"a", "aa")
1304 self.assertEqual(2*L(3), 6)
1305 self.assertEqual(L(3)*2, 6)
1306 self.assertEqual(L(3)*L(2), 6)
1307
1308 # Test comparison of classes with dynamic metaclasses
1309 class dynamicmetaclass(type):
1310 pass
1311 class someclass:
1312 __metaclass__ = dynamicmetaclass
1313 self.assertNotEqual(someclass, object)
1314
1315 def test_errors(self):
1316 # Testing errors...
1317 try:
1318 class C(list, dict):
1319 pass
1320 except TypeError:
1321 pass
1322 else:
1323 self.fail("inheritance from both list and dict should be illegal")
1324
1325 try:
1326 class C(object, None):
1327 pass
1328 except TypeError:
1329 pass
1330 else:
1331 self.fail("inheritance from non-type should be illegal")
1332 class Classic:
1333 pass
1334
1335 try:
1336 class C(type(len)):
1337 pass
1338 except TypeError:
1339 pass
1340 else:
1341 self.fail("inheritance from CFunction should be illegal")
1342
1343 try:
1344 class C(object):
1345 __slots__ = 1
1346 except TypeError:
1347 pass
1348 else:
1349 self.fail("__slots__ = 1 should be illegal")
1350
1351 try:
1352 class C(object):
1353 __slots__ = [1]
1354 except TypeError:
1355 pass
1356 else:
1357 self.fail("__slots__ = [1] should be illegal")
1358
1359 class M1(type):
1360 pass
1361 class M2(type):
1362 pass
1363 class A1(object):
1364 __metaclass__ = M1
1365 class A2(object):
1366 __metaclass__ = M2
1367 try:
1368 class B(A1, A2):
1369 pass
1370 except TypeError:
1371 pass
1372 else:
1373 self.fail("finding the most derived metaclass should have failed")
1374
1375 def test_classmethods(self):
1376 # Testing class methods...
1377 class C(object):
1378 def foo(*a): return a
1379 goo = classmethod(foo)
1380 c = C()
1381 self.assertEqual(C.goo(1), (C, 1))
1382 self.assertEqual(c.goo(1), (C, 1))
1383 self.assertEqual(c.foo(1), (c, 1))
1384 class D(C):
1385 pass
1386 d = D()
1387 self.assertEqual(D.goo(1), (D, 1))
1388 self.assertEqual(d.goo(1), (D, 1))
1389 self.assertEqual(d.foo(1), (d, 1))
1390 self.assertEqual(D.foo(d, 1), (d, 1))
1391 # Test for a specific crash (SF bug 528132)
1392 def f(cls, arg): return (cls, arg)
1393 ff = classmethod(f)
1394 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1395 self.assertEqual(ff.__get__(0)(42), (int, 42))
1396
1397 # Test super() with classmethods (SF bug 535444)
1398 self.assertEqual(C.goo.im_self, C)
1399 self.assertEqual(D.goo.im_self, D)
1400 self.assertEqual(super(D,D).goo.im_self, D)
1401 self.assertEqual(super(D,d).goo.im_self, D)
1402 self.assertEqual(super(D,D).goo(), (D,))
1403 self.assertEqual(super(D,d).goo(), (D,))
1404
Benjamin Peterson6fcf9b52009-09-01 22:27:57 +00001405 # Verify that a non-callable will raise
1406 meth = classmethod(1).__get__(1)
1407 self.assertRaises(TypeError, meth)
Georg Brandl48545522008-02-02 10:12:36 +00001408
1409 # Verify that classmethod() doesn't allow keyword args
1410 try:
1411 classmethod(f, kw=1)
1412 except TypeError:
1413 pass
1414 else:
1415 self.fail("classmethod shouldn't accept keyword args")
1416
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001417 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001418 def test_classmethods_in_c(self):
1419 # Testing C-based class methods...
1420 import xxsubtype as spam
1421 a = (1, 2, 3)
1422 d = {'abc': 123}
1423 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1424 self.assertEqual(x, spam.spamlist)
1425 self.assertEqual(a, a1)
1426 self.assertEqual(d, d1)
1427 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1428 self.assertEqual(x, spam.spamlist)
1429 self.assertEqual(a, a1)
1430 self.assertEqual(d, d1)
Benjamin Peterson042c47b2012-05-01 09:51:09 -04001431 spam_cm = spam.spamlist.__dict__['classmeth']
1432 x2, a2, d2 = spam_cm(spam.spamlist, *a, **d)
1433 self.assertEqual(x2, spam.spamlist)
1434 self.assertEqual(a2, a1)
1435 self.assertEqual(d2, d1)
1436 class SubSpam(spam.spamlist): pass
1437 x2, a2, d2 = spam_cm(SubSpam, *a, **d)
1438 self.assertEqual(x2, SubSpam)
1439 self.assertEqual(a2, a1)
1440 self.assertEqual(d2, d1)
1441 with self.assertRaises(TypeError):
1442 spam_cm()
1443 with self.assertRaises(TypeError):
1444 spam_cm(spam.spamlist())
1445 with self.assertRaises(TypeError):
1446 spam_cm(list)
Georg Brandl48545522008-02-02 10:12:36 +00001447
1448 def test_staticmethods(self):
1449 # Testing static methods...
1450 class C(object):
1451 def foo(*a): return a
1452 goo = staticmethod(foo)
1453 c = C()
1454 self.assertEqual(C.goo(1), (1,))
1455 self.assertEqual(c.goo(1), (1,))
1456 self.assertEqual(c.foo(1), (c, 1,))
1457 class D(C):
1458 pass
1459 d = D()
1460 self.assertEqual(D.goo(1), (1,))
1461 self.assertEqual(d.goo(1), (1,))
1462 self.assertEqual(d.foo(1), (d, 1))
1463 self.assertEqual(D.foo(d, 1), (d, 1))
1464
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001465 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001466 def test_staticmethods_in_c(self):
1467 # Testing C-based static methods...
1468 import xxsubtype as spam
1469 a = (1, 2, 3)
1470 d = {"abc": 123}
1471 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1472 self.assertEqual(x, None)
1473 self.assertEqual(a, a1)
1474 self.assertEqual(d, d1)
1475 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1476 self.assertEqual(x, None)
1477 self.assertEqual(a, a1)
1478 self.assertEqual(d, d1)
1479
1480 def test_classic(self):
1481 # Testing classic classes...
1482 class C:
1483 def foo(*a): return a
1484 goo = classmethod(foo)
1485 c = C()
1486 self.assertEqual(C.goo(1), (C, 1))
1487 self.assertEqual(c.goo(1), (C, 1))
1488 self.assertEqual(c.foo(1), (c, 1))
1489 class D(C):
1490 pass
1491 d = D()
1492 self.assertEqual(D.goo(1), (D, 1))
1493 self.assertEqual(d.goo(1), (D, 1))
1494 self.assertEqual(d.foo(1), (d, 1))
1495 self.assertEqual(D.foo(d, 1), (d, 1))
1496 class E: # *not* subclassing from C
1497 foo = C.foo
1498 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001499 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001500
1501 def test_compattr(self):
1502 # Testing computed attributes...
1503 class C(object):
1504 class computed_attribute(object):
1505 def __init__(self, get, set=None, delete=None):
1506 self.__get = get
1507 self.__set = set
1508 self.__delete = delete
1509 def __get__(self, obj, type=None):
1510 return self.__get(obj)
1511 def __set__(self, obj, value):
1512 return self.__set(obj, value)
1513 def __delete__(self, obj):
1514 return self.__delete(obj)
1515 def __init__(self):
1516 self.__x = 0
1517 def __get_x(self):
1518 x = self.__x
1519 self.__x = x+1
1520 return x
1521 def __set_x(self, x):
1522 self.__x = x
1523 def __delete_x(self):
1524 del self.__x
1525 x = computed_attribute(__get_x, __set_x, __delete_x)
1526 a = C()
1527 self.assertEqual(a.x, 0)
1528 self.assertEqual(a.x, 1)
1529 a.x = 10
1530 self.assertEqual(a.x, 10)
1531 self.assertEqual(a.x, 11)
1532 del a.x
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001533 self.assertNotHasAttr(a, 'x')
Georg Brandl48545522008-02-02 10:12:36 +00001534
1535 def test_newslots(self):
1536 # Testing __new__ slot override...
1537 class C(list):
1538 def __new__(cls):
1539 self = list.__new__(cls)
1540 self.foo = 1
1541 return self
1542 def __init__(self):
1543 self.foo = self.foo + 2
1544 a = C()
1545 self.assertEqual(a.foo, 3)
1546 self.assertEqual(a.__class__, C)
1547 class D(C):
1548 pass
1549 b = D()
1550 self.assertEqual(b.foo, 3)
1551 self.assertEqual(b.__class__, D)
1552
1553 def test_altmro(self):
1554 # Testing mro() and overriding it...
1555 class A(object):
1556 def f(self): return "A"
1557 class B(A):
1558 pass
1559 class C(A):
1560 def f(self): return "C"
1561 class D(B, C):
1562 pass
1563 self.assertEqual(D.mro(), [D, B, C, A, object])
1564 self.assertEqual(D.__mro__, (D, B, C, A, object))
1565 self.assertEqual(D().f(), "C")
1566
1567 class PerverseMetaType(type):
1568 def mro(cls):
1569 L = type.mro(cls)
1570 L.reverse()
1571 return L
1572 class X(D,B,C,A):
1573 __metaclass__ = PerverseMetaType
1574 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1575 self.assertEqual(X().f(), "A")
1576
1577 try:
1578 class X(object):
1579 class __metaclass__(type):
1580 def mro(self):
1581 return [self, dict, object]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001582 # In CPython, the class creation above already raises
1583 # TypeError, as a protection against the fact that
1584 # instances of X would segfault it. In other Python
1585 # implementations it would be ok to let the class X
1586 # be created, but instead get a clean TypeError on the
1587 # __setitem__ below.
1588 x = object.__new__(X)
1589 x[5] = 6
Georg Brandl48545522008-02-02 10:12:36 +00001590 except TypeError:
1591 pass
1592 else:
1593 self.fail("devious mro() return not caught")
1594
1595 try:
1596 class X(object):
1597 class __metaclass__(type):
1598 def mro(self):
1599 return [1]
1600 except TypeError:
1601 pass
1602 else:
1603 self.fail("non-class mro() return not caught")
1604
1605 try:
1606 class X(object):
1607 class __metaclass__(type):
1608 def mro(self):
1609 return 1
1610 except TypeError:
1611 pass
1612 else:
1613 self.fail("non-sequence mro() return not caught")
1614
1615 def test_overloading(self):
1616 # Testing operator overloading...
1617
1618 class B(object):
1619 "Intermediate class because object doesn't have a __setattr__"
1620
1621 class C(B):
1622 def __getattr__(self, name):
1623 if name == "foo":
1624 return ("getattr", name)
1625 else:
1626 raise AttributeError
1627 def __setattr__(self, name, value):
1628 if name == "foo":
1629 self.setattr = (name, value)
1630 else:
1631 return B.__setattr__(self, name, value)
1632 def __delattr__(self, name):
1633 if name == "foo":
1634 self.delattr = name
1635 else:
1636 return B.__delattr__(self, name)
1637
1638 def __getitem__(self, key):
1639 return ("getitem", key)
1640 def __setitem__(self, key, value):
1641 self.setitem = (key, value)
1642 def __delitem__(self, key):
1643 self.delitem = key
1644
1645 def __getslice__(self, i, j):
1646 return ("getslice", i, j)
1647 def __setslice__(self, i, j, value):
1648 self.setslice = (i, j, value)
1649 def __delslice__(self, i, j):
1650 self.delslice = (i, j)
1651
1652 a = C()
1653 self.assertEqual(a.foo, ("getattr", "foo"))
1654 a.foo = 12
1655 self.assertEqual(a.setattr, ("foo", 12))
1656 del a.foo
1657 self.assertEqual(a.delattr, "foo")
1658
1659 self.assertEqual(a[12], ("getitem", 12))
1660 a[12] = 21
1661 self.assertEqual(a.setitem, (12, 21))
1662 del a[12]
1663 self.assertEqual(a.delitem, 12)
1664
1665 self.assertEqual(a[0:10], ("getslice", 0, 10))
1666 a[0:10] = "foo"
1667 self.assertEqual(a.setslice, (0, 10, "foo"))
1668 del a[0:10]
1669 self.assertEqual(a.delslice, (0, 10))
1670
1671 def test_methods(self):
1672 # Testing methods...
1673 class C(object):
1674 def __init__(self, x):
1675 self.x = x
1676 def foo(self):
1677 return self.x
1678 c1 = C(1)
1679 self.assertEqual(c1.foo(), 1)
1680 class D(C):
1681 boo = C.foo
1682 goo = c1.foo
1683 d2 = D(2)
1684 self.assertEqual(d2.foo(), 2)
1685 self.assertEqual(d2.boo(), 2)
1686 self.assertEqual(d2.goo(), 1)
1687 class E(object):
1688 foo = C.foo
1689 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001690 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001691
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001692 def test_special_method_lookup(self):
1693 # The lookup of special methods bypasses __getattr__ and
1694 # __getattribute__, but they still can be descriptors.
1695
1696 def run_context(manager):
1697 with manager:
1698 pass
1699 def iden(self):
1700 return self
1701 def hello(self):
1702 return "hello"
Benjamin Peterson809e2252009-05-09 02:07:04 +00001703 def empty_seq(self):
1704 return []
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001705 def zero(self):
1706 return 0
Benjamin Petersonecdae192010-01-04 00:43:01 +00001707 def complex_num(self):
1708 return 1j
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001709 def stop(self):
1710 raise StopIteration
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001711 def return_true(self, thing=None):
1712 return True
1713 def do_isinstance(obj):
1714 return isinstance(int, obj)
1715 def do_issubclass(obj):
1716 return issubclass(int, obj)
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001717 def swallow(*args):
1718 pass
1719 def do_dict_missing(checker):
1720 class DictSub(checker.__class__, dict):
1721 pass
1722 self.assertEqual(DictSub()["hi"], 4)
1723 def some_number(self_, key):
1724 self.assertEqual(key, "hi")
1725 return 4
Benjamin Peterson2aa6c382010-06-05 00:32:50 +00001726 def format_impl(self, spec):
1727 return "hello"
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001728
1729 # It would be nice to have every special method tested here, but I'm
1730 # only listing the ones I can remember outside of typeobject.c, since it
1731 # does it right.
1732 specials = [
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001733 ("__unicode__", unicode, hello, set(), {}),
1734 ("__reversed__", reversed, empty_seq, set(), {}),
1735 ("__length_hint__", list, zero, set(),
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001736 {"__iter__" : iden, "next" : stop}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001737 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1738 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001739 ("__missing__", do_dict_missing, some_number,
1740 set(("__class__",)), {}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001741 ("__subclasscheck__", do_issubclass, return_true,
1742 set(("__bases__",)), {}),
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00001743 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1744 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Petersonecdae192010-01-04 00:43:01 +00001745 ("__complex__", complex, complex_num, set(), {}),
Benjamin Peterson2aa6c382010-06-05 00:32:50 +00001746 ("__format__", format, format_impl, set(), {}),
Benjamin Peterson8de87a62011-05-23 16:11:05 -05001747 ("__dir__", dir, empty_seq, set(), {}),
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001748 ]
1749
1750 class Checker(object):
1751 def __getattr__(self, attr, test=self):
1752 test.fail("__getattr__ called with {0}".format(attr))
1753 def __getattribute__(self, attr, test=self):
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001754 if attr not in ok:
1755 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001756 return object.__getattribute__(self, attr)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001757 class SpecialDescr(object):
1758 def __init__(self, impl):
1759 self.impl = impl
1760 def __get__(self, obj, owner):
1761 record.append(1)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001762 return self.impl.__get__(obj, owner)
Benjamin Peterson87e50062009-05-25 02:40:21 +00001763 class MyException(Exception):
1764 pass
1765 class ErrDescr(object):
1766 def __get__(self, obj, owner):
1767 raise MyException
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001768
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001769 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001770 class X(Checker):
1771 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001772 for attr, obj in env.iteritems():
1773 setattr(X, attr, obj)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001774 setattr(X, name, meth_impl)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001775 runner(X())
1776
1777 record = []
1778 class X(Checker):
1779 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001780 for attr, obj in env.iteritems():
1781 setattr(X, attr, obj)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001782 setattr(X, name, SpecialDescr(meth_impl))
1783 runner(X())
1784 self.assertEqual(record, [1], name)
1785
Benjamin Peterson87e50062009-05-25 02:40:21 +00001786 class X(Checker):
1787 pass
1788 for attr, obj in env.iteritems():
1789 setattr(X, attr, obj)
1790 setattr(X, name, ErrDescr())
1791 try:
1792 runner(X())
1793 except MyException:
1794 pass
1795 else:
1796 self.fail("{0!r} didn't raise".format(name))
1797
Georg Brandl48545522008-02-02 10:12:36 +00001798 def test_specials(self):
1799 # Testing special operators...
1800 # Test operators like __hash__ for which a built-in default exists
1801
1802 # Test the default behavior for static classes
1803 class C(object):
1804 def __getitem__(self, i):
1805 if 0 <= i < 10: return i
1806 raise IndexError
1807 c1 = C()
1808 c2 = C()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001809 self.assertFalse(not c1)
Georg Brandl48545522008-02-02 10:12:36 +00001810 self.assertNotEqual(id(c1), id(c2))
1811 hash(c1)
1812 hash(c2)
1813 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1814 self.assertEqual(c1, c1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001815 self.assertTrue(c1 != c2)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001816 self.assertFalse(c1 != c1)
1817 self.assertFalse(c1 == c2)
Georg Brandl48545522008-02-02 10:12:36 +00001818 # Note that the module name appears in str/repr, and that varies
1819 # depending on whether this test is run standalone or from a framework.
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001820 self.assertGreaterEqual(str(c1).find('C object at '), 0)
Georg Brandl48545522008-02-02 10:12:36 +00001821 self.assertEqual(str(c1), repr(c1))
Ezio Melottiaa980582010-01-23 23:04:36 +00001822 self.assertNotIn(-1, c1)
Georg Brandl48545522008-02-02 10:12:36 +00001823 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001824 self.assertIn(i, c1)
1825 self.assertNotIn(10, c1)
Georg Brandl48545522008-02-02 10:12:36 +00001826 # Test the default behavior for dynamic classes
1827 class D(object):
1828 def __getitem__(self, i):
1829 if 0 <= i < 10: return i
1830 raise IndexError
1831 d1 = D()
1832 d2 = D()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001833 self.assertFalse(not d1)
Georg Brandl48545522008-02-02 10:12:36 +00001834 self.assertNotEqual(id(d1), id(d2))
1835 hash(d1)
1836 hash(d2)
1837 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1838 self.assertEqual(d1, d1)
1839 self.assertNotEqual(d1, d2)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001840 self.assertFalse(d1 != d1)
1841 self.assertFalse(d1 == d2)
Georg Brandl48545522008-02-02 10:12:36 +00001842 # Note that the module name appears in str/repr, and that varies
1843 # depending on whether this test is run standalone or from a framework.
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001844 self.assertGreaterEqual(str(d1).find('D object at '), 0)
Georg Brandl48545522008-02-02 10:12:36 +00001845 self.assertEqual(str(d1), repr(d1))
Ezio Melottiaa980582010-01-23 23:04:36 +00001846 self.assertNotIn(-1, d1)
Georg Brandl48545522008-02-02 10:12:36 +00001847 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001848 self.assertIn(i, d1)
1849 self.assertNotIn(10, d1)
Georg Brandl48545522008-02-02 10:12:36 +00001850 # Test overridden behavior for static classes
1851 class Proxy(object):
1852 def __init__(self, x):
1853 self.x = x
1854 def __nonzero__(self):
1855 return not not self.x
1856 def __hash__(self):
1857 return hash(self.x)
1858 def __eq__(self, other):
1859 return self.x == other
1860 def __ne__(self, other):
1861 return self.x != other
1862 def __cmp__(self, other):
1863 return cmp(self.x, other.x)
1864 def __str__(self):
1865 return "Proxy:%s" % self.x
1866 def __repr__(self):
1867 return "Proxy(%r)" % self.x
1868 def __contains__(self, value):
1869 return value in self.x
1870 p0 = Proxy(0)
1871 p1 = Proxy(1)
1872 p_1 = Proxy(-1)
1873 self.assertFalse(p0)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001874 self.assertFalse(not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001875 self.assertEqual(hash(p0), hash(0))
1876 self.assertEqual(p0, p0)
1877 self.assertNotEqual(p0, p1)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001878 self.assertFalse(p0 != p0)
Georg Brandl48545522008-02-02 10:12:36 +00001879 self.assertEqual(not p0, p1)
1880 self.assertEqual(cmp(p0, p1), -1)
1881 self.assertEqual(cmp(p0, p0), 0)
1882 self.assertEqual(cmp(p0, p_1), 1)
1883 self.assertEqual(str(p0), "Proxy:0")
1884 self.assertEqual(repr(p0), "Proxy(0)")
1885 p10 = Proxy(range(10))
Ezio Melottiaa980582010-01-23 23:04:36 +00001886 self.assertNotIn(-1, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001887 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001888 self.assertIn(i, p10)
1889 self.assertNotIn(10, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001890 # Test overridden behavior for dynamic classes
1891 class DProxy(object):
1892 def __init__(self, x):
1893 self.x = x
1894 def __nonzero__(self):
1895 return not not self.x
1896 def __hash__(self):
1897 return hash(self.x)
1898 def __eq__(self, other):
1899 return self.x == other
1900 def __ne__(self, other):
1901 return self.x != other
1902 def __cmp__(self, other):
1903 return cmp(self.x, other.x)
1904 def __str__(self):
1905 return "DProxy:%s" % self.x
1906 def __repr__(self):
1907 return "DProxy(%r)" % self.x
1908 def __contains__(self, value):
1909 return value in self.x
1910 p0 = DProxy(0)
1911 p1 = DProxy(1)
1912 p_1 = DProxy(-1)
1913 self.assertFalse(p0)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02001914 self.assertFalse(not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001915 self.assertEqual(hash(p0), hash(0))
1916 self.assertEqual(p0, p0)
1917 self.assertNotEqual(p0, p1)
1918 self.assertNotEqual(not p0, p0)
1919 self.assertEqual(not p0, p1)
1920 self.assertEqual(cmp(p0, p1), -1)
1921 self.assertEqual(cmp(p0, p0), 0)
1922 self.assertEqual(cmp(p0, p_1), 1)
1923 self.assertEqual(str(p0), "DProxy:0")
1924 self.assertEqual(repr(p0), "DProxy(0)")
1925 p10 = DProxy(range(10))
Ezio Melottiaa980582010-01-23 23:04:36 +00001926 self.assertNotIn(-1, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001927 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001928 self.assertIn(i, p10)
1929 self.assertNotIn(10, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001930
1931 # Safety test for __cmp__
1932 def unsafecmp(a, b):
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001933 if not hasattr(a, '__cmp__'):
1934 return # some types don't have a __cmp__ any more (so the
1935 # test doesn't make sense any more), or maybe they
1936 # never had a __cmp__ at all, e.g. in PyPy
Georg Brandl48545522008-02-02 10:12:36 +00001937 try:
1938 a.__class__.__cmp__(a, b)
1939 except TypeError:
1940 pass
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001941 else:
Georg Brandl48545522008-02-02 10:12:36 +00001942 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1943 a.__class__, a, b))
1944
1945 unsafecmp(u"123", "123")
1946 unsafecmp("123", u"123")
1947 unsafecmp(1, 1.0)
1948 unsafecmp(1.0, 1)
1949 unsafecmp(1, 1L)
1950 unsafecmp(1L, 1)
1951
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001952 @test_support.impl_detail("custom logic for printing to real file objects")
1953 def test_recursions_1(self):
Georg Brandl48545522008-02-02 10:12:36 +00001954 # Testing recursion checks ...
1955 class Letter(str):
1956 def __new__(cls, letter):
1957 if letter == 'EPS':
1958 return str.__new__(cls)
1959 return str.__new__(cls, letter)
1960 def __str__(self):
1961 if not self:
1962 return 'EPS'
1963 return self
1964 # sys.stdout needs to be the original to trigger the recursion bug
Georg Brandl48545522008-02-02 10:12:36 +00001965 test_stdout = sys.stdout
1966 sys.stdout = test_support.get_original_stdout()
1967 try:
1968 # nothing should actually be printed, this should raise an exception
1969 print Letter('w')
1970 except RuntimeError:
1971 pass
1972 else:
1973 self.fail("expected a RuntimeError for print recursion")
1974 finally:
1975 sys.stdout = test_stdout
1976
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001977 def test_recursions_2(self):
Georg Brandl48545522008-02-02 10:12:36 +00001978 # Bug #1202533.
1979 class A(object):
1980 pass
1981 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
1982 try:
1983 A()*2
1984 except RuntimeError:
1985 pass
1986 else:
1987 self.fail("expected a RuntimeError")
1988
1989 def test_weakrefs(self):
1990 # Testing weak references...
1991 import weakref
1992 class C(object):
1993 pass
1994 c = C()
1995 r = weakref.ref(c)
1996 self.assertEqual(r(), c)
1997 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001998 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001999 self.assertEqual(r(), None)
2000 del r
2001 class NoWeak(object):
2002 __slots__ = ['foo']
2003 no = NoWeak()
2004 try:
2005 weakref.ref(no)
2006 except TypeError, msg:
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002007 self.assertIn("weak reference", str(msg))
Georg Brandl48545522008-02-02 10:12:36 +00002008 else:
2009 self.fail("weakref.ref(no) should be illegal")
2010 class Weak(object):
2011 __slots__ = ['foo', '__weakref__']
2012 yes = Weak()
2013 r = weakref.ref(yes)
2014 self.assertEqual(r(), yes)
2015 del yes
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002016 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00002017 self.assertEqual(r(), None)
2018 del r
2019
2020 def test_properties(self):
2021 # Testing property...
2022 class C(object):
2023 def getx(self):
2024 return self.__x
2025 def setx(self, value):
2026 self.__x = value
2027 def delx(self):
2028 del self.__x
2029 x = property(getx, setx, delx, doc="I'm the x property.")
2030 a = C()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002031 self.assertNotHasAttr(a, "x")
Georg Brandl48545522008-02-02 10:12:36 +00002032 a.x = 42
2033 self.assertEqual(a._C__x, 42)
2034 self.assertEqual(a.x, 42)
2035 del a.x
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002036 self.assertNotHasAttr(a, "x")
2037 self.assertNotHasAttr(a, "_C__x")
Georg Brandl48545522008-02-02 10:12:36 +00002038 C.x.__set__(a, 100)
2039 self.assertEqual(C.x.__get__(a), 100)
2040 C.x.__delete__(a)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002041 self.assertNotHasAttr(a, "x")
Georg Brandl48545522008-02-02 10:12:36 +00002042
2043 raw = C.__dict__['x']
Ezio Melottib0f5adc2010-01-24 16:58:36 +00002044 self.assertIsInstance(raw, property)
Georg Brandl48545522008-02-02 10:12:36 +00002045
2046 attrs = dir(raw)
Ezio Melottiaa980582010-01-23 23:04:36 +00002047 self.assertIn("__doc__", attrs)
2048 self.assertIn("fget", attrs)
2049 self.assertIn("fset", attrs)
2050 self.assertIn("fdel", attrs)
Georg Brandl48545522008-02-02 10:12:36 +00002051
2052 self.assertEqual(raw.__doc__, "I'm the x property.")
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002053 self.assertIs(raw.fget, C.__dict__['getx'])
2054 self.assertIs(raw.fset, C.__dict__['setx'])
2055 self.assertIs(raw.fdel, C.__dict__['delx'])
Georg Brandl48545522008-02-02 10:12:36 +00002056
2057 for attr in "__doc__", "fget", "fset", "fdel":
2058 try:
2059 setattr(raw, attr, 42)
2060 except TypeError, msg:
2061 if str(msg).find('readonly') < 0:
2062 self.fail("when setting readonly attr %r on a property, "
2063 "got unexpected TypeError msg %r" % (attr, str(msg)))
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002064 else:
Georg Brandl48545522008-02-02 10:12:36 +00002065 self.fail("expected TypeError from trying to set readonly %r "
2066 "attr on a property" % attr)
Tim Peters2f93e282001-10-04 05:27:00 +00002067
Georg Brandl48545522008-02-02 10:12:36 +00002068 class D(object):
2069 __getitem__ = property(lambda s: 1/0)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002070
Georg Brandl48545522008-02-02 10:12:36 +00002071 d = D()
2072 try:
2073 for i in d:
2074 str(i)
2075 except ZeroDivisionError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002076 pass
Georg Brandl48545522008-02-02 10:12:36 +00002077 else:
2078 self.fail("expected ZeroDivisionError from bad property")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002079
R. David Murrayf28fd242010-02-23 00:24:49 +00002080 @unittest.skipIf(sys.flags.optimize >= 2,
2081 "Docstrings are omitted with -O2 and above")
2082 def test_properties_doc_attrib(self):
Georg Brandl48545522008-02-02 10:12:36 +00002083 class E(object):
2084 def getter(self):
2085 "getter method"
2086 return 0
2087 def setter(self_, value):
2088 "setter method"
2089 pass
2090 prop = property(getter)
2091 self.assertEqual(prop.__doc__, "getter method")
2092 prop2 = property(fset=setter)
2093 self.assertEqual(prop2.__doc__, None)
2094
Serhiy Storchaka76249ea2014-02-07 10:06:05 +02002095 @test_support.cpython_only
R. David Murrayf28fd242010-02-23 00:24:49 +00002096 def test_testcapi_no_segfault(self):
Georg Brandl48545522008-02-02 10:12:36 +00002097 # this segfaulted in 2.5b2
2098 try:
2099 import _testcapi
2100 except ImportError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002101 pass
Georg Brandl48545522008-02-02 10:12:36 +00002102 else:
2103 class X(object):
2104 p = property(_testcapi.test_with_docstring)
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002105
Georg Brandl48545522008-02-02 10:12:36 +00002106 def test_properties_plus(self):
2107 class C(object):
2108 foo = property(doc="hello")
2109 @foo.getter
2110 def foo(self):
2111 return self._foo
2112 @foo.setter
2113 def foo(self, value):
2114 self._foo = abs(value)
2115 @foo.deleter
2116 def foo(self):
2117 del self._foo
2118 c = C()
2119 self.assertEqual(C.foo.__doc__, "hello")
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002120 self.assertNotHasAttr(c, "foo")
Georg Brandl48545522008-02-02 10:12:36 +00002121 c.foo = -42
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002122 self.assertHasAttr(c, '_foo')
Georg Brandl48545522008-02-02 10:12:36 +00002123 self.assertEqual(c._foo, 42)
2124 self.assertEqual(c.foo, 42)
2125 del c.foo
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002126 self.assertNotHasAttr(c, '_foo')
2127 self.assertNotHasAttr(c, "foo")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002128
Georg Brandl48545522008-02-02 10:12:36 +00002129 class D(C):
2130 @C.foo.deleter
2131 def foo(self):
2132 try:
2133 del self._foo
2134 except AttributeError:
2135 pass
2136 d = D()
2137 d.foo = 24
2138 self.assertEqual(d.foo, 24)
2139 del d.foo
2140 del d.foo
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002141
Georg Brandl48545522008-02-02 10:12:36 +00002142 class E(object):
2143 @property
2144 def foo(self):
2145 return self._foo
2146 @foo.setter
2147 def foo(self, value):
2148 raise RuntimeError
2149 @foo.setter
2150 def foo(self, value):
2151 self._foo = abs(value)
2152 @foo.deleter
2153 def foo(self, value=None):
2154 del self._foo
Guido van Rossume8fc6402002-04-16 16:44:51 +00002155
Georg Brandl48545522008-02-02 10:12:36 +00002156 e = E()
2157 e.foo = -42
2158 self.assertEqual(e.foo, 42)
2159 del e.foo
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002160
Georg Brandl48545522008-02-02 10:12:36 +00002161 class F(E):
2162 @E.foo.deleter
2163 def foo(self):
2164 del self._foo
2165 @foo.setter
2166 def foo(self, value):
2167 self._foo = max(0, value)
2168 f = F()
2169 f.foo = -10
2170 self.assertEqual(f.foo, 0)
2171 del f.foo
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00002172
Georg Brandl48545522008-02-02 10:12:36 +00002173 def test_dict_constructors(self):
2174 # Testing dict constructor ...
2175 d = dict()
2176 self.assertEqual(d, {})
2177 d = dict({})
2178 self.assertEqual(d, {})
2179 d = dict({1: 2, 'a': 'b'})
2180 self.assertEqual(d, {1: 2, 'a': 'b'})
2181 self.assertEqual(d, dict(d.items()))
2182 self.assertEqual(d, dict(d.iteritems()))
2183 d = dict({'one':1, 'two':2})
2184 self.assertEqual(d, dict(one=1, two=2))
2185 self.assertEqual(d, dict(**d))
2186 self.assertEqual(d, dict({"one": 1}, two=2))
2187 self.assertEqual(d, dict([("two", 2)], one=1))
2188 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
2189 self.assertEqual(d, dict(**d))
Guido van Rossum09638c12002-06-13 19:17:46 +00002190
Georg Brandl48545522008-02-02 10:12:36 +00002191 for badarg in 0, 0L, 0j, "0", [0], (0,):
2192 try:
2193 dict(badarg)
2194 except TypeError:
2195 pass
2196 except ValueError:
2197 if badarg == "0":
2198 # It's a sequence, and its elements are also sequences (gotta
2199 # love strings <wink>), but they aren't of length 2, so this
2200 # one seemed better as a ValueError than a TypeError.
2201 pass
2202 else:
2203 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002204 else:
Georg Brandl48545522008-02-02 10:12:36 +00002205 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002206
Georg Brandl48545522008-02-02 10:12:36 +00002207 try:
2208 dict({}, {})
2209 except TypeError:
2210 pass
2211 else:
2212 self.fail("no TypeError from dict({}, {})")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002213
Georg Brandl48545522008-02-02 10:12:36 +00002214 class Mapping:
2215 # Lacks a .keys() method; will be added later.
2216 dict = {1:2, 3:4, 'a':1j}
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002217
Georg Brandl48545522008-02-02 10:12:36 +00002218 try:
2219 dict(Mapping())
2220 except TypeError:
2221 pass
2222 else:
2223 self.fail("no TypeError from dict(incomplete mapping)")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002224
Georg Brandl48545522008-02-02 10:12:36 +00002225 Mapping.keys = lambda self: self.dict.keys()
2226 Mapping.__getitem__ = lambda self, i: self.dict[i]
2227 d = dict(Mapping())
2228 self.assertEqual(d, Mapping.dict)
Michael W. Hudsonf3904422006-11-23 13:54:04 +00002229
Georg Brandl48545522008-02-02 10:12:36 +00002230 # Init from sequence of iterable objects, each producing a 2-sequence.
2231 class AddressBookEntry:
2232 def __init__(self, first, last):
2233 self.first = first
2234 self.last = last
2235 def __iter__(self):
2236 return iter([self.first, self.last])
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002237
Georg Brandl48545522008-02-02 10:12:36 +00002238 d = dict([AddressBookEntry('Tim', 'Warsaw'),
2239 AddressBookEntry('Barry', 'Peters'),
2240 AddressBookEntry('Tim', 'Peters'),
2241 AddressBookEntry('Barry', 'Warsaw')])
2242 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00002243
Georg Brandl48545522008-02-02 10:12:36 +00002244 d = dict(zip(range(4), range(1, 5)))
2245 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002246
Georg Brandl48545522008-02-02 10:12:36 +00002247 # Bad sequence lengths.
2248 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2249 try:
2250 dict(bad)
2251 except ValueError:
2252 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00002253 else:
Georg Brandl48545522008-02-02 10:12:36 +00002254 self.fail("no ValueError from dict(%r)" % bad)
2255
2256 def test_dir(self):
2257 # Testing dir() ...
2258 junk = 12
2259 self.assertEqual(dir(), ['junk', 'self'])
2260 del junk
2261
2262 # Just make sure these don't blow up!
2263 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
2264 dir(arg)
2265
2266 # Try classic classes.
2267 class C:
2268 Cdata = 1
2269 def Cmethod(self): pass
2270
2271 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
2272 self.assertEqual(dir(C), cstuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002273 self.assertIn('im_self', dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002274
2275 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
2276 self.assertEqual(dir(c), cstuff)
2277
2278 c.cdata = 2
2279 c.cmethod = lambda self: 0
2280 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002281 self.assertIn('im_self', dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002282
2283 class A(C):
2284 Adata = 1
2285 def Amethod(self): pass
2286
2287 astuff = ['Adata', 'Amethod'] + cstuff
2288 self.assertEqual(dir(A), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002289 self.assertIn('im_self', dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002290 a = A()
2291 self.assertEqual(dir(a), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002292 self.assertIn('im_self', dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002293 a.adata = 42
2294 a.amethod = lambda self: 3
2295 self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
2296
2297 # The same, but with new-style classes. Since these have object as a
2298 # base class, a lot more gets sucked in.
2299 def interesting(strings):
2300 return [s for s in strings if not s.startswith('_')]
2301
2302 class C(object):
2303 Cdata = 1
2304 def Cmethod(self): pass
2305
2306 cstuff = ['Cdata', 'Cmethod']
2307 self.assertEqual(interesting(dir(C)), cstuff)
2308
2309 c = C()
2310 self.assertEqual(interesting(dir(c)), cstuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002311 self.assertIn('im_self', dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002312
2313 c.cdata = 2
2314 c.cmethod = lambda self: 0
2315 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002316 self.assertIn('im_self', dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002317
2318 class A(C):
2319 Adata = 1
2320 def Amethod(self): pass
2321
2322 astuff = ['Adata', 'Amethod'] + cstuff
2323 self.assertEqual(interesting(dir(A)), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002324 self.assertIn('im_self', dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002325 a = A()
2326 self.assertEqual(interesting(dir(a)), astuff)
2327 a.adata = 42
2328 a.amethod = lambda self: 3
2329 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002330 self.assertIn('im_self', dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002331
2332 # Try a module subclass.
Georg Brandl48545522008-02-02 10:12:36 +00002333 class M(type(sys)):
2334 pass
2335 minstance = M("m")
2336 minstance.b = 2
2337 minstance.a = 1
2338 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2339 self.assertEqual(names, ['a', 'b'])
2340
2341 class M2(M):
2342 def getdict(self):
2343 return "Not a dict!"
2344 __dict__ = property(getdict)
2345
2346 m2instance = M2("m2")
2347 m2instance.b = 2
2348 m2instance.a = 1
2349 self.assertEqual(m2instance.__dict__, "Not a dict!")
2350 try:
2351 dir(m2instance)
2352 except TypeError:
2353 pass
2354
2355 # Two essentially featureless objects, just inheriting stuff from
2356 # object.
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002357 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2358 if test_support.check_impl_detail():
2359 # None differs in PyPy: it has a __nonzero__
2360 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl48545522008-02-02 10:12:36 +00002361
2362 # Nasty test case for proxied objects
2363 class Wrapper(object):
2364 def __init__(self, obj):
2365 self.__obj = obj
2366 def __repr__(self):
2367 return "Wrapper(%s)" % repr(self.__obj)
2368 def __getitem__(self, key):
2369 return Wrapper(self.__obj[key])
2370 def __len__(self):
2371 return len(self.__obj)
2372 def __getattr__(self, name):
2373 return Wrapper(getattr(self.__obj, name))
2374
2375 class C(object):
2376 def __getclass(self):
2377 return Wrapper(type(self))
2378 __class__ = property(__getclass)
2379
2380 dir(C()) # This used to segfault
2381
2382 def test_supers(self):
2383 # Testing super...
2384
2385 class A(object):
2386 def meth(self, a):
2387 return "A(%r)" % a
2388
2389 self.assertEqual(A().meth(1), "A(1)")
2390
2391 class B(A):
2392 def __init__(self):
2393 self.__super = super(B, self)
2394 def meth(self, a):
2395 return "B(%r)" % a + self.__super.meth(a)
2396
2397 self.assertEqual(B().meth(2), "B(2)A(2)")
2398
2399 class C(A):
2400 def meth(self, a):
2401 return "C(%r)" % a + self.__super.meth(a)
2402 C._C__super = super(C)
2403
2404 self.assertEqual(C().meth(3), "C(3)A(3)")
2405
2406 class D(C, B):
2407 def meth(self, a):
2408 return "D(%r)" % a + super(D, self).meth(a)
2409
2410 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2411
2412 # Test for subclassing super
2413
2414 class mysuper(super):
2415 def __init__(self, *args):
2416 return super(mysuper, self).__init__(*args)
2417
2418 class E(D):
2419 def meth(self, a):
2420 return "E(%r)" % a + mysuper(E, self).meth(a)
2421
2422 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2423
2424 class F(E):
2425 def meth(self, a):
2426 s = self.__super # == mysuper(F, self)
2427 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2428 F._F__super = mysuper(F)
2429
2430 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2431
2432 # Make sure certain errors are raised
2433
2434 try:
2435 super(D, 42)
2436 except TypeError:
2437 pass
2438 else:
2439 self.fail("shouldn't allow super(D, 42)")
2440
2441 try:
2442 super(D, C())
2443 except TypeError:
2444 pass
2445 else:
2446 self.fail("shouldn't allow super(D, C())")
2447
2448 try:
2449 super(D).__get__(12)
2450 except TypeError:
2451 pass
2452 else:
2453 self.fail("shouldn't allow super(D).__get__(12)")
2454
2455 try:
2456 super(D).__get__(C())
2457 except TypeError:
2458 pass
2459 else:
2460 self.fail("shouldn't allow super(D).__get__(C())")
2461
2462 # Make sure data descriptors can be overridden and accessed via super
2463 # (new feature in Python 2.3)
2464
2465 class DDbase(object):
2466 def getx(self): return 42
2467 x = property(getx)
2468
2469 class DDsub(DDbase):
2470 def getx(self): return "hello"
2471 x = property(getx)
2472
2473 dd = DDsub()
2474 self.assertEqual(dd.x, "hello")
2475 self.assertEqual(super(DDsub, dd).x, 42)
2476
2477 # Ensure that super() lookup of descriptor from classmethod
2478 # works (SF ID# 743627)
2479
2480 class Base(object):
2481 aProp = property(lambda self: "foo")
2482
2483 class Sub(Base):
2484 @classmethod
2485 def test(klass):
2486 return super(Sub,klass).aProp
2487
2488 self.assertEqual(Sub.test(), Base.aProp)
2489
2490 # Verify that super() doesn't allow keyword args
2491 try:
2492 super(Base, kw=1)
2493 except TypeError:
2494 pass
2495 else:
2496 self.assertEqual("super shouldn't accept keyword args")
2497
2498 def test_basic_inheritance(self):
2499 # Testing inheritance from basic types...
2500
2501 class hexint(int):
2502 def __repr__(self):
2503 return hex(self)
2504 def __add__(self, other):
2505 return hexint(int.__add__(self, other))
2506 # (Note that overriding __radd__ doesn't work,
2507 # because the int type gets first dibs.)
2508 self.assertEqual(repr(hexint(7) + 9), "0x10")
2509 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2510 a = hexint(12345)
2511 self.assertEqual(a, 12345)
2512 self.assertEqual(int(a), 12345)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002513 self.assertIs(int(a).__class__, int)
Georg Brandl48545522008-02-02 10:12:36 +00002514 self.assertEqual(hash(a), hash(12345))
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002515 self.assertIs((+a).__class__, int)
2516 self.assertIs((a >> 0).__class__, int)
2517 self.assertIs((a << 0).__class__, int)
2518 self.assertIs((hexint(0) << 12).__class__, int)
2519 self.assertIs((hexint(0) >> 12).__class__, int)
Georg Brandl48545522008-02-02 10:12:36 +00002520
2521 class octlong(long):
2522 __slots__ = []
2523 def __str__(self):
2524 s = oct(self)
2525 if s[-1] == 'L':
2526 s = s[:-1]
2527 return s
2528 def __add__(self, other):
2529 return self.__class__(super(octlong, self).__add__(other))
2530 __radd__ = __add__
2531 self.assertEqual(str(octlong(3) + 5), "010")
2532 # (Note that overriding __radd__ here only seems to work
2533 # because the example uses a short int left argument.)
2534 self.assertEqual(str(5 + octlong(3000)), "05675")
2535 a = octlong(12345)
2536 self.assertEqual(a, 12345L)
2537 self.assertEqual(long(a), 12345L)
2538 self.assertEqual(hash(a), hash(12345L))
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002539 self.assertIs(long(a).__class__, long)
2540 self.assertIs((+a).__class__, long)
2541 self.assertIs((-a).__class__, long)
2542 self.assertIs((-octlong(0)).__class__, long)
2543 self.assertIs((a >> 0).__class__, long)
2544 self.assertIs((a << 0).__class__, long)
2545 self.assertIs((a - 0).__class__, long)
2546 self.assertIs((a * 1).__class__, long)
2547 self.assertIs((a ** 1).__class__, long)
2548 self.assertIs((a // 1).__class__, long)
2549 self.assertIs((1 * a).__class__, long)
2550 self.assertIs((a | 0).__class__, long)
2551 self.assertIs((a ^ 0).__class__, long)
2552 self.assertIs((a & -1L).__class__, long)
2553 self.assertIs((octlong(0) << 12).__class__, long)
2554 self.assertIs((octlong(0) >> 12).__class__, long)
2555 self.assertIs(abs(octlong(0)).__class__, long)
Georg Brandl48545522008-02-02 10:12:36 +00002556
2557 # Because octlong overrides __add__, we can't check the absence of +0
2558 # optimizations using octlong.
2559 class longclone(long):
2560 pass
2561 a = longclone(1)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002562 self.assertIs((a + 0).__class__, long)
2563 self.assertIs((0 + a).__class__, long)
Georg Brandl48545522008-02-02 10:12:36 +00002564
2565 # Check that negative clones don't segfault
2566 a = longclone(-1)
2567 self.assertEqual(a.__dict__, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002568 self.assertEqual(long(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl48545522008-02-02 10:12:36 +00002569
2570 class precfloat(float):
2571 __slots__ = ['prec']
2572 def __init__(self, value=0.0, prec=12):
2573 self.prec = int(prec)
2574 def __repr__(self):
2575 return "%.*g" % (self.prec, self)
2576 self.assertEqual(repr(precfloat(1.1)), "1.1")
2577 a = precfloat(12345)
2578 self.assertEqual(a, 12345.0)
2579 self.assertEqual(float(a), 12345.0)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002580 self.assertIs(float(a).__class__, float)
Georg Brandl48545522008-02-02 10:12:36 +00002581 self.assertEqual(hash(a), hash(12345.0))
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002582 self.assertIs((+a).__class__, float)
Georg Brandl48545522008-02-02 10:12:36 +00002583
2584 class madcomplex(complex):
2585 def __repr__(self):
2586 return "%.17gj%+.17g" % (self.imag, self.real)
2587 a = madcomplex(-3, 4)
2588 self.assertEqual(repr(a), "4j-3")
2589 base = complex(-3, 4)
2590 self.assertEqual(base.__class__, complex)
2591 self.assertEqual(a, base)
2592 self.assertEqual(complex(a), base)
2593 self.assertEqual(complex(a).__class__, complex)
2594 a = madcomplex(a) # just trying another form of the constructor
2595 self.assertEqual(repr(a), "4j-3")
2596 self.assertEqual(a, base)
2597 self.assertEqual(complex(a), base)
2598 self.assertEqual(complex(a).__class__, complex)
2599 self.assertEqual(hash(a), hash(base))
2600 self.assertEqual((+a).__class__, complex)
2601 self.assertEqual((a + 0).__class__, complex)
2602 self.assertEqual(a + 0, base)
2603 self.assertEqual((a - 0).__class__, complex)
2604 self.assertEqual(a - 0, base)
2605 self.assertEqual((a * 1).__class__, complex)
2606 self.assertEqual(a * 1, base)
2607 self.assertEqual((a / 1).__class__, complex)
2608 self.assertEqual(a / 1, base)
2609
2610 class madtuple(tuple):
2611 _rev = None
2612 def rev(self):
2613 if self._rev is not None:
2614 return self._rev
2615 L = list(self)
2616 L.reverse()
2617 self._rev = self.__class__(L)
2618 return self._rev
2619 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2620 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2621 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2622 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2623 for i in range(512):
2624 t = madtuple(range(i))
2625 u = t.rev()
2626 v = u.rev()
2627 self.assertEqual(v, t)
2628 a = madtuple((1,2,3,4,5))
2629 self.assertEqual(tuple(a), (1,2,3,4,5))
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002630 self.assertIs(tuple(a).__class__, tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002631 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002632 self.assertIs(a[:].__class__, tuple)
2633 self.assertIs((a * 1).__class__, tuple)
2634 self.assertIs((a * 0).__class__, tuple)
2635 self.assertIs((a + ()).__class__, tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002636 a = madtuple(())
2637 self.assertEqual(tuple(a), ())
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002638 self.assertIs(tuple(a).__class__, tuple)
2639 self.assertIs((a + a).__class__, tuple)
2640 self.assertIs((a * 0).__class__, tuple)
2641 self.assertIs((a * 1).__class__, tuple)
2642 self.assertIs((a * 2).__class__, tuple)
2643 self.assertIs(a[:].__class__, tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002644
2645 class madstring(str):
2646 _rev = None
2647 def rev(self):
2648 if self._rev is not None:
2649 return self._rev
2650 L = list(self)
2651 L.reverse()
2652 self._rev = self.__class__("".join(L))
2653 return self._rev
2654 s = madstring("abcdefghijklmnopqrstuvwxyz")
2655 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2656 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2657 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2658 for i in range(256):
2659 s = madstring("".join(map(chr, range(i))))
2660 t = s.rev()
2661 u = t.rev()
2662 self.assertEqual(u, s)
2663 s = madstring("12345")
2664 self.assertEqual(str(s), "12345")
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002665 self.assertIs(str(s).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002666
2667 base = "\x00" * 5
2668 s = madstring(base)
2669 self.assertEqual(s, base)
2670 self.assertEqual(str(s), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002671 self.assertIs(str(s).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002672 self.assertEqual(hash(s), hash(base))
2673 self.assertEqual({s: 1}[base], 1)
2674 self.assertEqual({base: 1}[s], 1)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002675 self.assertIs((s + "").__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002676 self.assertEqual(s + "", base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002677 self.assertIs(("" + s).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002678 self.assertEqual("" + s, base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002679 self.assertIs((s * 0).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002680 self.assertEqual(s * 0, "")
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002681 self.assertIs((s * 1).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002682 self.assertEqual(s * 1, base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002683 self.assertIs((s * 2).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002684 self.assertEqual(s * 2, base + base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002685 self.assertIs(s[:].__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002686 self.assertEqual(s[:], base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002687 self.assertIs(s[0:0].__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002688 self.assertEqual(s[0:0], "")
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002689 self.assertIs(s.strip().__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002690 self.assertEqual(s.strip(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002691 self.assertIs(s.lstrip().__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002692 self.assertEqual(s.lstrip(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002693 self.assertIs(s.rstrip().__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002694 self.assertEqual(s.rstrip(), base)
2695 identitytab = ''.join([chr(i) for i in range(256)])
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002696 self.assertIs(s.translate(identitytab).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002697 self.assertEqual(s.translate(identitytab), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002698 self.assertIs(s.translate(identitytab, "x").__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002699 self.assertEqual(s.translate(identitytab, "x"), base)
2700 self.assertEqual(s.translate(identitytab, "\x00"), "")
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002701 self.assertIs(s.replace("x", "x").__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002702 self.assertEqual(s.replace("x", "x"), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002703 self.assertIs(s.ljust(len(s)).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002704 self.assertEqual(s.ljust(len(s)), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002705 self.assertIs(s.rjust(len(s)).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002706 self.assertEqual(s.rjust(len(s)), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002707 self.assertIs(s.center(len(s)).__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002708 self.assertEqual(s.center(len(s)), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002709 self.assertIs(s.lower().__class__, str)
Georg Brandl48545522008-02-02 10:12:36 +00002710 self.assertEqual(s.lower(), base)
2711
2712 class madunicode(unicode):
2713 _rev = None
2714 def rev(self):
2715 if self._rev is not None:
2716 return self._rev
2717 L = list(self)
2718 L.reverse()
2719 self._rev = self.__class__(u"".join(L))
2720 return self._rev
2721 u = madunicode("ABCDEF")
2722 self.assertEqual(u, u"ABCDEF")
2723 self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
2724 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
2725 base = u"12345"
2726 u = madunicode(base)
2727 self.assertEqual(unicode(u), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002728 self.assertIs(unicode(u).__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002729 self.assertEqual(hash(u), hash(base))
2730 self.assertEqual({u: 1}[base], 1)
2731 self.assertEqual({base: 1}[u], 1)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002732 self.assertIs(u.strip().__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002733 self.assertEqual(u.strip(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002734 self.assertIs(u.lstrip().__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002735 self.assertEqual(u.lstrip(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002736 self.assertIs(u.rstrip().__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002737 self.assertEqual(u.rstrip(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002738 self.assertIs(u.replace(u"x", u"x").__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002739 self.assertEqual(u.replace(u"x", u"x"), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002740 self.assertIs(u.replace(u"xy", u"xy").__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002741 self.assertEqual(u.replace(u"xy", u"xy"), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002742 self.assertIs(u.center(len(u)).__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002743 self.assertEqual(u.center(len(u)), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002744 self.assertIs(u.ljust(len(u)).__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002745 self.assertEqual(u.ljust(len(u)), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002746 self.assertIs(u.rjust(len(u)).__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002747 self.assertEqual(u.rjust(len(u)), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002748 self.assertIs(u.lower().__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002749 self.assertEqual(u.lower(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002750 self.assertIs(u.upper().__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002751 self.assertEqual(u.upper(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002752 self.assertIs(u.capitalize().__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002753 self.assertEqual(u.capitalize(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002754 self.assertIs(u.title().__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002755 self.assertEqual(u.title(), base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002756 self.assertIs((u + u"").__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002757 self.assertEqual(u + u"", base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002758 self.assertIs((u"" + u).__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002759 self.assertEqual(u"" + u, base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002760 self.assertIs((u * 0).__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002761 self.assertEqual(u * 0, u"")
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002762 self.assertIs((u * 1).__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002763 self.assertEqual(u * 1, base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002764 self.assertIs((u * 2).__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002765 self.assertEqual(u * 2, base + base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002766 self.assertIs(u[:].__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002767 self.assertEqual(u[:], base)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002768 self.assertIs(u[0:0].__class__, unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002769 self.assertEqual(u[0:0], u"")
2770
2771 class sublist(list):
2772 pass
2773 a = sublist(range(5))
2774 self.assertEqual(a, range(5))
2775 a.append("hello")
2776 self.assertEqual(a, range(5) + ["hello"])
2777 a[5] = 5
2778 self.assertEqual(a, range(6))
2779 a.extend(range(6, 20))
2780 self.assertEqual(a, range(20))
2781 a[-5:] = []
2782 self.assertEqual(a, range(15))
2783 del a[10:15]
2784 self.assertEqual(len(a), 10)
2785 self.assertEqual(a, range(10))
2786 self.assertEqual(list(a), range(10))
2787 self.assertEqual(a[0], 0)
2788 self.assertEqual(a[9], 9)
2789 self.assertEqual(a[-10], 0)
2790 self.assertEqual(a[-1], 9)
2791 self.assertEqual(a[:5], range(5))
2792
2793 class CountedInput(file):
2794 """Counts lines read by self.readline().
2795
2796 self.lineno is the 0-based ordinal of the last line read, up to
2797 a maximum of one greater than the number of lines in the file.
2798
2799 self.ateof is true if and only if the final "" line has been read,
2800 at which point self.lineno stops incrementing, and further calls
2801 to readline() continue to return "".
2802 """
2803
2804 lineno = 0
2805 ateof = 0
2806 def readline(self):
2807 if self.ateof:
2808 return ""
2809 s = file.readline(self)
2810 # Next line works too.
2811 # s = super(CountedInput, self).readline()
2812 self.lineno += 1
2813 if s == "":
2814 self.ateof = 1
2815 return s
2816
2817 f = file(name=test_support.TESTFN, mode='w')
2818 lines = ['a\n', 'b\n', 'c\n']
2819 try:
2820 f.writelines(lines)
2821 f.close()
2822 f = CountedInput(test_support.TESTFN)
2823 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2824 got = f.readline()
2825 self.assertEqual(expected, got)
2826 self.assertEqual(f.lineno, i)
2827 self.assertEqual(f.ateof, (i > len(lines)))
2828 f.close()
2829 finally:
2830 try:
2831 f.close()
2832 except:
2833 pass
2834 test_support.unlink(test_support.TESTFN)
2835
2836 def test_keywords(self):
2837 # Testing keyword args to basic type constructors ...
2838 self.assertEqual(int(x=1), 1)
2839 self.assertEqual(float(x=2), 2.0)
2840 self.assertEqual(long(x=3), 3L)
2841 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2842 self.assertEqual(str(object=500), '500')
2843 self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
2844 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2845 self.assertEqual(list(sequence=(0, 1, 2)), range(3))
2846 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2847
2848 for constructor in (int, float, long, complex, str, unicode,
2849 tuple, list, file):
2850 try:
2851 constructor(bogus_keyword_arg=1)
2852 except TypeError:
2853 pass
2854 else:
2855 self.fail("expected TypeError from bogus keyword argument to %r"
2856 % constructor)
2857
2858 def test_str_subclass_as_dict_key(self):
2859 # Testing a str subclass used as dict key ..
2860
2861 class cistr(str):
2862 """Sublcass of str that computes __eq__ case-insensitively.
2863
2864 Also computes a hash code of the string in canonical form.
2865 """
2866
2867 def __init__(self, value):
2868 self.canonical = value.lower()
2869 self.hashcode = hash(self.canonical)
2870
2871 def __eq__(self, other):
2872 if not isinstance(other, cistr):
2873 other = cistr(other)
2874 return self.canonical == other.canonical
2875
2876 def __hash__(self):
2877 return self.hashcode
2878
2879 self.assertEqual(cistr('ABC'), 'abc')
2880 self.assertEqual('aBc', cistr('ABC'))
2881 self.assertEqual(str(cistr('ABC')), 'ABC')
2882
2883 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2884 self.assertEqual(d[cistr('one')], 1)
2885 self.assertEqual(d[cistr('tWo')], 2)
2886 self.assertEqual(d[cistr('THrEE')], 3)
Ezio Melottiaa980582010-01-23 23:04:36 +00002887 self.assertIn(cistr('ONe'), d)
Georg Brandl48545522008-02-02 10:12:36 +00002888 self.assertEqual(d.get(cistr('thrEE')), 3)
2889
2890 def test_classic_comparisons(self):
2891 # Testing classic comparisons...
2892 class classic:
2893 pass
2894
2895 for base in (classic, int, object):
2896 class C(base):
2897 def __init__(self, value):
2898 self.value = int(value)
2899 def __cmp__(self, other):
2900 if isinstance(other, C):
2901 return cmp(self.value, other.value)
2902 if isinstance(other, int) or isinstance(other, long):
2903 return cmp(self.value, other)
2904 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002905 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002906
2907 c1 = C(1)
2908 c2 = C(2)
2909 c3 = C(3)
2910 self.assertEqual(c1, 1)
2911 c = {1: c1, 2: c2, 3: c3}
2912 for x in 1, 2, 3:
2913 for y in 1, 2, 3:
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002914 self.assertEqual(cmp(c[x], c[y]), cmp(x, y),
2915 "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002916 for op in "<", "<=", "==", "!=", ">", ">=":
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002917 self.assertEqual(eval("c[x] %s c[y]" % op),
2918 eval("x %s y" % op),
2919 "x=%d, y=%d" % (x, y))
2920 self.assertEqual(cmp(c[x], y), cmp(x, y),
2921 "x=%d, y=%d" % (x, y))
2922 self.assertEqual(cmp(x, c[y]), cmp(x, y),
2923 "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002924
2925 def test_rich_comparisons(self):
2926 # Testing rich comparisons...
2927 class Z(complex):
2928 pass
2929 z = Z(1)
2930 self.assertEqual(z, 1+0j)
2931 self.assertEqual(1+0j, z)
2932 class ZZ(complex):
2933 def __eq__(self, other):
2934 try:
2935 return abs(self - other) <= 1e-6
2936 except:
2937 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002938 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002939 zz = ZZ(1.0000003)
2940 self.assertEqual(zz, 1+0j)
2941 self.assertEqual(1+0j, zz)
2942
2943 class classic:
2944 pass
2945 for base in (classic, int, object, list):
2946 class C(base):
2947 def __init__(self, value):
2948 self.value = int(value)
2949 def __cmp__(self_, other):
2950 self.fail("shouldn't call __cmp__")
Nick Coghlan48361f52008-08-11 15:45:58 +00002951 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002952 def __eq__(self, other):
2953 if isinstance(other, C):
2954 return self.value == other.value
2955 if isinstance(other, int) or isinstance(other, long):
2956 return self.value == other
2957 return NotImplemented
2958 def __ne__(self, other):
2959 if isinstance(other, C):
2960 return self.value != other.value
2961 if isinstance(other, int) or isinstance(other, long):
2962 return self.value != other
2963 return NotImplemented
2964 def __lt__(self, other):
2965 if isinstance(other, C):
2966 return self.value < other.value
2967 if isinstance(other, int) or isinstance(other, long):
2968 return self.value < other
2969 return NotImplemented
2970 def __le__(self, other):
2971 if isinstance(other, C):
2972 return self.value <= other.value
2973 if isinstance(other, int) or isinstance(other, long):
2974 return self.value <= other
2975 return NotImplemented
2976 def __gt__(self, other):
2977 if isinstance(other, C):
2978 return self.value > other.value
2979 if isinstance(other, int) or isinstance(other, long):
2980 return self.value > other
2981 return NotImplemented
2982 def __ge__(self, other):
2983 if isinstance(other, C):
2984 return self.value >= other.value
2985 if isinstance(other, int) or isinstance(other, long):
2986 return self.value >= other
2987 return NotImplemented
2988 c1 = C(1)
2989 c2 = C(2)
2990 c3 = C(3)
2991 self.assertEqual(c1, 1)
2992 c = {1: c1, 2: c2, 3: c3}
2993 for x in 1, 2, 3:
2994 for y in 1, 2, 3:
2995 for op in "<", "<=", "==", "!=", ">", ">=":
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02002996 self.assertEqual(eval("c[x] %s c[y]" % op),
2997 eval("x %s y" % op),
2998 "x=%d, y=%d" % (x, y))
2999 self.assertEqual(eval("c[x] %s y" % op),
3000 eval("x %s y" % op),
3001 "x=%d, y=%d" % (x, y))
3002 self.assertEqual(eval("x %s c[y]" % op),
3003 eval("x %s y" % op),
3004 "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00003005
3006 def test_coercions(self):
3007 # Testing coercions...
3008 class I(int): pass
3009 coerce(I(0), 0)
3010 coerce(0, I(0))
3011 class L(long): pass
3012 coerce(L(0), 0)
3013 coerce(L(0), 0L)
3014 coerce(0, L(0))
3015 coerce(0L, L(0))
3016 class F(float): pass
3017 coerce(F(0), 0)
3018 coerce(F(0), 0L)
3019 coerce(F(0), 0.)
3020 coerce(0, F(0))
3021 coerce(0L, F(0))
3022 coerce(0., F(0))
3023 class C(complex): pass
3024 coerce(C(0), 0)
3025 coerce(C(0), 0L)
3026 coerce(C(0), 0.)
3027 coerce(C(0), 0j)
3028 coerce(0, C(0))
3029 coerce(0L, C(0))
3030 coerce(0., C(0))
3031 coerce(0j, C(0))
3032
3033 def test_descrdoc(self):
3034 # Testing descriptor doc strings...
3035 def check(descr, what):
3036 self.assertEqual(descr.__doc__, what)
3037 check(file.closed, "True if the file is closed") # getset descriptor
3038 check(file.name, "file name") # member descriptor
3039
3040 def test_doc_descriptor(self):
3041 # Testing __doc__ descriptor...
3042 # SF bug 542984
3043 class DocDescr(object):
3044 def __get__(self, object, otype):
3045 if object:
3046 object = object.__class__.__name__ + ' instance'
3047 if otype:
3048 otype = otype.__name__
3049 return 'object=%s; type=%s' % (object, otype)
3050 class OldClass:
3051 __doc__ = DocDescr()
3052 class NewClass(object):
3053 __doc__ = DocDescr()
3054 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
3055 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3056 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
3057 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3058
3059 def test_set_class(self):
3060 # Testing __class__ assignment...
3061 class C(object): pass
3062 class D(object): pass
3063 class E(object): pass
3064 class F(D, E): pass
3065 for cls in C, D, E, F:
3066 for cls2 in C, D, E, F:
3067 x = cls()
3068 x.__class__ = cls2
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003069 self.assertIs(x.__class__, cls2)
Georg Brandl48545522008-02-02 10:12:36 +00003070 x.__class__ = cls
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003071 self.assertIs(x.__class__, cls)
Georg Brandl48545522008-02-02 10:12:36 +00003072 def cant(x, C):
3073 try:
3074 x.__class__ = C
3075 except TypeError:
3076 pass
3077 else:
3078 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
3079 try:
3080 delattr(x, "__class__")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003081 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003082 pass
3083 else:
3084 self.fail("shouldn't allow del %r.__class__" % x)
3085 cant(C(), list)
3086 cant(list(), C)
3087 cant(C(), 1)
3088 cant(C(), object)
3089 cant(object(), list)
3090 cant(list(), object)
3091 class Int(int): __slots__ = []
3092 cant(2, Int)
3093 cant(Int(), int)
3094 cant(True, int)
3095 cant(2, bool)
3096 o = object()
3097 cant(o, type(1))
3098 cant(o, type(None))
3099 del o
3100 class G(object):
3101 __slots__ = ["a", "b"]
3102 class H(object):
3103 __slots__ = ["b", "a"]
3104 try:
3105 unicode
3106 except NameError:
3107 class I(object):
3108 __slots__ = ["a", "b"]
3109 else:
3110 class I(object):
3111 __slots__ = [unicode("a"), unicode("b")]
3112 class J(object):
3113 __slots__ = ["c", "b"]
3114 class K(object):
3115 __slots__ = ["a", "b", "d"]
3116 class L(H):
3117 __slots__ = ["e"]
3118 class M(I):
3119 __slots__ = ["e"]
3120 class N(J):
3121 __slots__ = ["__weakref__"]
3122 class P(J):
3123 __slots__ = ["__dict__"]
3124 class Q(J):
3125 pass
3126 class R(J):
3127 __slots__ = ["__dict__", "__weakref__"]
3128
3129 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
3130 x = cls()
3131 x.a = 1
3132 x.__class__ = cls2
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003133 self.assertIs(x.__class__, cls2,
Georg Brandl48545522008-02-02 10:12:36 +00003134 "assigning %r as __class__ for %r silently failed" % (cls2, x))
3135 self.assertEqual(x.a, 1)
3136 x.__class__ = cls
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003137 self.assertIs(x.__class__, cls,
Georg Brandl48545522008-02-02 10:12:36 +00003138 "assigning %r as __class__ for %r silently failed" % (cls, x))
3139 self.assertEqual(x.a, 1)
3140 for cls in G, J, K, L, M, N, P, R, list, Int:
3141 for cls2 in G, J, K, L, M, N, P, R, list, Int:
3142 if cls is cls2:
3143 continue
3144 cant(cls(), cls2)
3145
Benjamin Peterson5083dc52009-04-25 00:41:22 +00003146 # Issue5283: when __class__ changes in __del__, the wrong
3147 # type gets DECREF'd.
3148 class O(object):
3149 pass
3150 class A(object):
3151 def __del__(self):
3152 self.__class__ = O
3153 l = [A() for x in range(100)]
3154 del l
3155
Georg Brandl48545522008-02-02 10:12:36 +00003156 def test_set_dict(self):
3157 # Testing __dict__ assignment...
3158 class C(object): pass
3159 a = C()
3160 a.__dict__ = {'b': 1}
3161 self.assertEqual(a.b, 1)
3162 def cant(x, dict):
3163 try:
3164 x.__dict__ = dict
3165 except (AttributeError, TypeError):
3166 pass
3167 else:
3168 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
3169 cant(a, None)
3170 cant(a, [])
3171 cant(a, 1)
3172 del a.__dict__ # Deleting __dict__ is allowed
3173
3174 class Base(object):
3175 pass
3176 def verify_dict_readonly(x):
3177 """
3178 x has to be an instance of a class inheriting from Base.
3179 """
3180 cant(x, {})
3181 try:
3182 del x.__dict__
3183 except (AttributeError, TypeError):
3184 pass
3185 else:
3186 self.fail("shouldn't allow del %r.__dict__" % x)
3187 dict_descr = Base.__dict__["__dict__"]
3188 try:
3189 dict_descr.__set__(x, {})
3190 except (AttributeError, TypeError):
3191 pass
3192 else:
3193 self.fail("dict_descr allowed access to %r's dict" % x)
3194
3195 # Classes don't allow __dict__ assignment and have readonly dicts
3196 class Meta1(type, Base):
3197 pass
3198 class Meta2(Base, type):
3199 pass
3200 class D(object):
3201 __metaclass__ = Meta1
3202 class E(object):
3203 __metaclass__ = Meta2
3204 for cls in C, D, E:
3205 verify_dict_readonly(cls)
3206 class_dict = cls.__dict__
3207 try:
3208 class_dict["spam"] = "eggs"
3209 except TypeError:
3210 pass
3211 else:
3212 self.fail("%r's __dict__ can be modified" % cls)
3213
3214 # Modules also disallow __dict__ assignment
3215 class Module1(types.ModuleType, Base):
3216 pass
3217 class Module2(Base, types.ModuleType):
3218 pass
3219 for ModuleType in Module1, Module2:
3220 mod = ModuleType("spam")
3221 verify_dict_readonly(mod)
3222 mod.__dict__["spam"] = "eggs"
3223
3224 # Exception's __dict__ can be replaced, but not deleted
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003225 # (at least not any more than regular exception's __dict__ can
3226 # be deleted; on CPython it is not the case, whereas on PyPy they
3227 # can, just like any other new-style instance's __dict__.)
3228 def can_delete_dict(e):
3229 try:
3230 del e.__dict__
3231 except (TypeError, AttributeError):
3232 return False
3233 else:
3234 return True
Georg Brandl48545522008-02-02 10:12:36 +00003235 class Exception1(Exception, Base):
3236 pass
3237 class Exception2(Base, Exception):
3238 pass
3239 for ExceptionType in Exception, Exception1, Exception2:
3240 e = ExceptionType()
3241 e.__dict__ = {"a": 1}
3242 self.assertEqual(e.a, 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003243 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl48545522008-02-02 10:12:36 +00003244
3245 def test_pickles(self):
3246 # Testing pickling and copying new-style classes and objects...
3247 import pickle, cPickle
3248
3249 def sorteditems(d):
3250 L = d.items()
3251 L.sort()
3252 return L
3253
3254 global C
3255 class C(object):
3256 def __init__(self, a, b):
3257 super(C, self).__init__()
3258 self.a = a
3259 self.b = b
3260 def __repr__(self):
3261 return "C(%r, %r)" % (self.a, self.b)
3262
3263 global C1
3264 class C1(list):
3265 def __new__(cls, a, b):
3266 return super(C1, cls).__new__(cls)
3267 def __getnewargs__(self):
3268 return (self.a, self.b)
3269 def __init__(self, a, b):
3270 self.a = a
3271 self.b = b
3272 def __repr__(self):
3273 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3274
3275 global C2
3276 class C2(int):
3277 def __new__(cls, a, b, val=0):
3278 return super(C2, cls).__new__(cls, val)
3279 def __getnewargs__(self):
3280 return (self.a, self.b, int(self))
3281 def __init__(self, a, b, val=0):
3282 self.a = a
3283 self.b = b
3284 def __repr__(self):
3285 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3286
3287 global C3
3288 class C3(object):
3289 def __init__(self, foo):
3290 self.foo = foo
3291 def __getstate__(self):
3292 return self.foo
3293 def __setstate__(self, foo):
3294 self.foo = foo
3295
3296 global C4classic, C4
3297 class C4classic: # classic
3298 pass
3299 class C4(C4classic, object): # mixed inheritance
3300 pass
3301
3302 for p in pickle, cPickle:
3303 for bin in 0, 1:
3304 for cls in C, C1, C2:
3305 s = p.dumps(cls, bin)
3306 cls2 = p.loads(s)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003307 self.assertIs(cls2, cls)
Georg Brandl48545522008-02-02 10:12:36 +00003308
3309 a = C1(1, 2); a.append(42); a.append(24)
3310 b = C2("hello", "world", 42)
3311 s = p.dumps((a, b), bin)
3312 x, y = p.loads(s)
3313 self.assertEqual(x.__class__, a.__class__)
3314 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3315 self.assertEqual(y.__class__, b.__class__)
3316 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3317 self.assertEqual(repr(x), repr(a))
3318 self.assertEqual(repr(y), repr(b))
3319 # Test for __getstate__ and __setstate__ on new style class
3320 u = C3(42)
3321 s = p.dumps(u, bin)
3322 v = p.loads(s)
3323 self.assertEqual(u.__class__, v.__class__)
3324 self.assertEqual(u.foo, v.foo)
3325 # Test for picklability of hybrid class
3326 u = C4()
3327 u.foo = 42
3328 s = p.dumps(u, bin)
3329 v = p.loads(s)
3330 self.assertEqual(u.__class__, v.__class__)
3331 self.assertEqual(u.foo, v.foo)
3332
3333 # Testing copy.deepcopy()
3334 import copy
3335 for cls in C, C1, C2:
3336 cls2 = copy.deepcopy(cls)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003337 self.assertIs(cls2, cls)
Georg Brandl48545522008-02-02 10:12:36 +00003338
3339 a = C1(1, 2); a.append(42); a.append(24)
3340 b = C2("hello", "world", 42)
3341 x, y = copy.deepcopy((a, b))
3342 self.assertEqual(x.__class__, a.__class__)
3343 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3344 self.assertEqual(y.__class__, b.__class__)
3345 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3346 self.assertEqual(repr(x), repr(a))
3347 self.assertEqual(repr(y), repr(b))
3348
3349 def test_pickle_slots(self):
3350 # Testing pickling of classes with __slots__ ...
3351 import pickle, cPickle
3352 # Pickling of classes with __slots__ but without __getstate__ should fail
3353 global B, C, D, E
3354 class B(object):
3355 pass
3356 for base in [object, B]:
3357 class C(base):
3358 __slots__ = ['a']
3359 class D(C):
3360 pass
3361 try:
3362 pickle.dumps(C())
3363 except TypeError:
3364 pass
3365 else:
3366 self.fail("should fail: pickle C instance - %s" % base)
3367 try:
3368 cPickle.dumps(C())
3369 except TypeError:
3370 pass
3371 else:
3372 self.fail("should fail: cPickle C instance - %s" % base)
3373 try:
3374 pickle.dumps(C())
3375 except TypeError:
3376 pass
3377 else:
3378 self.fail("should fail: pickle D instance - %s" % base)
3379 try:
3380 cPickle.dumps(D())
3381 except TypeError:
3382 pass
3383 else:
3384 self.fail("should fail: cPickle D instance - %s" % base)
3385 # Give C a nice generic __getstate__ and __setstate__
3386 class C(base):
3387 __slots__ = ['a']
3388 def __getstate__(self):
3389 try:
3390 d = self.__dict__.copy()
3391 except AttributeError:
3392 d = {}
3393 for cls in self.__class__.__mro__:
3394 for sn in cls.__dict__.get('__slots__', ()):
3395 try:
3396 d[sn] = getattr(self, sn)
3397 except AttributeError:
3398 pass
3399 return d
3400 def __setstate__(self, d):
3401 for k, v in d.items():
3402 setattr(self, k, v)
3403 class D(C):
3404 pass
3405 # Now it should work
3406 x = C()
3407 y = pickle.loads(pickle.dumps(x))
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003408 self.assertNotHasAttr(y, 'a')
Georg Brandl48545522008-02-02 10:12:36 +00003409 y = cPickle.loads(cPickle.dumps(x))
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003410 self.assertNotHasAttr(y, 'a')
Georg Brandl48545522008-02-02 10:12:36 +00003411 x.a = 42
3412 y = pickle.loads(pickle.dumps(x))
3413 self.assertEqual(y.a, 42)
3414 y = cPickle.loads(cPickle.dumps(x))
3415 self.assertEqual(y.a, 42)
3416 x = D()
3417 x.a = 42
3418 x.b = 100
3419 y = pickle.loads(pickle.dumps(x))
3420 self.assertEqual(y.a + y.b, 142)
3421 y = cPickle.loads(cPickle.dumps(x))
3422 self.assertEqual(y.a + y.b, 142)
3423 # A subclass that adds a slot should also work
3424 class E(C):
3425 __slots__ = ['b']
3426 x = E()
3427 x.a = 42
3428 x.b = "foo"
3429 y = pickle.loads(pickle.dumps(x))
3430 self.assertEqual(y.a, x.a)
3431 self.assertEqual(y.b, x.b)
3432 y = cPickle.loads(cPickle.dumps(x))
3433 self.assertEqual(y.a, x.a)
3434 self.assertEqual(y.b, x.b)
3435
3436 def test_binary_operator_override(self):
3437 # Testing overrides of binary operations...
3438 class I(int):
3439 def __repr__(self):
3440 return "I(%r)" % int(self)
3441 def __add__(self, other):
3442 return I(int(self) + int(other))
3443 __radd__ = __add__
3444 def __pow__(self, other, mod=None):
3445 if mod is None:
3446 return I(pow(int(self), int(other)))
3447 else:
3448 return I(pow(int(self), int(other), int(mod)))
3449 def __rpow__(self, other, mod=None):
3450 if mod is None:
3451 return I(pow(int(other), int(self), mod))
3452 else:
3453 return I(pow(int(other), int(self), int(mod)))
3454
3455 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3456 self.assertEqual(repr(I(1) + 2), "I(3)")
3457 self.assertEqual(repr(1 + I(2)), "I(3)")
3458 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3459 self.assertEqual(repr(2 ** I(3)), "I(8)")
3460 self.assertEqual(repr(I(2) ** 3), "I(8)")
3461 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3462 class S(str):
3463 def __eq__(self, other):
3464 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003465 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003466
3467 def test_subclass_propagation(self):
3468 # Testing propagation of slot functions to subclasses...
3469 class A(object):
3470 pass
3471 class B(A):
3472 pass
3473 class C(A):
3474 pass
3475 class D(B, C):
3476 pass
3477 d = D()
3478 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3479 A.__hash__ = lambda self: 42
3480 self.assertEqual(hash(d), 42)
3481 C.__hash__ = lambda self: 314
3482 self.assertEqual(hash(d), 314)
3483 B.__hash__ = lambda self: 144
3484 self.assertEqual(hash(d), 144)
3485 D.__hash__ = lambda self: 100
3486 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003487 D.__hash__ = None
3488 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003489 del D.__hash__
3490 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003491 B.__hash__ = None
3492 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003493 del B.__hash__
3494 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003495 C.__hash__ = None
3496 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003497 del C.__hash__
3498 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003499 A.__hash__ = None
3500 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003501 del A.__hash__
3502 self.assertEqual(hash(d), orig_hash)
3503 d.foo = 42
3504 d.bar = 42
3505 self.assertEqual(d.foo, 42)
3506 self.assertEqual(d.bar, 42)
3507 def __getattribute__(self, name):
3508 if name == "foo":
3509 return 24
3510 return object.__getattribute__(self, name)
3511 A.__getattribute__ = __getattribute__
3512 self.assertEqual(d.foo, 24)
3513 self.assertEqual(d.bar, 42)
3514 def __getattr__(self, name):
3515 if name in ("spam", "foo", "bar"):
3516 return "hello"
3517 raise AttributeError, name
3518 B.__getattr__ = __getattr__
3519 self.assertEqual(d.spam, "hello")
3520 self.assertEqual(d.foo, 24)
3521 self.assertEqual(d.bar, 42)
3522 del A.__getattribute__
3523 self.assertEqual(d.foo, 42)
3524 del d.foo
3525 self.assertEqual(d.foo, "hello")
3526 self.assertEqual(d.bar, 42)
3527 del B.__getattr__
3528 try:
3529 d.foo
3530 except AttributeError:
3531 pass
3532 else:
3533 self.fail("d.foo should be undefined now")
3534
3535 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl48545522008-02-02 10:12:36 +00003536 class A(object):
3537 pass
3538 class B(A):
3539 pass
3540 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003541 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003542 A.__setitem__ = lambda *a: None # crash
3543
3544 def test_buffer_inheritance(self):
3545 # Testing that buffer interface is inherited ...
3546
3547 import binascii
3548 # SF bug [#470040] ParseTuple t# vs subclasses.
3549
3550 class MyStr(str):
3551 pass
3552 base = 'abc'
3553 m = MyStr(base)
3554 # b2a_hex uses the buffer interface to get its argument's value, via
3555 # PyArg_ParseTuple 't#' code.
3556 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3557
3558 # It's not clear that unicode will continue to support the character
3559 # buffer interface, and this test will fail if that's taken away.
3560 class MyUni(unicode):
3561 pass
3562 base = u'abc'
3563 m = MyUni(base)
3564 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3565
3566 class MyInt(int):
3567 pass
3568 m = MyInt(42)
3569 try:
3570 binascii.b2a_hex(m)
3571 self.fail('subclass of int should not have a buffer interface')
3572 except TypeError:
3573 pass
3574
3575 def test_str_of_str_subclass(self):
3576 # Testing __str__ defined in subclass of str ...
3577 import binascii
3578 import cStringIO
3579
3580 class octetstring(str):
3581 def __str__(self):
3582 return binascii.b2a_hex(self)
3583 def __repr__(self):
3584 return self + " repr"
3585
3586 o = octetstring('A')
3587 self.assertEqual(type(o), octetstring)
3588 self.assertEqual(type(str(o)), str)
3589 self.assertEqual(type(repr(o)), str)
3590 self.assertEqual(ord(o), 0x41)
3591 self.assertEqual(str(o), '41')
3592 self.assertEqual(repr(o), 'A repr')
3593 self.assertEqual(o.__str__(), '41')
3594 self.assertEqual(o.__repr__(), 'A repr')
3595
3596 capture = cStringIO.StringIO()
3597 # Calling str() or not exercises different internal paths.
3598 print >> capture, o
3599 print >> capture, str(o)
3600 self.assertEqual(capture.getvalue(), '41\n41\n')
3601 capture.close()
3602
3603 def test_keyword_arguments(self):
3604 # Testing keyword arguments to __init__, __call__...
3605 def f(a): return a
3606 self.assertEqual(f.__call__(a=42), 42)
3607 a = []
3608 list.__init__(a, sequence=[0, 1, 2])
3609 self.assertEqual(a, [0, 1, 2])
3610
3611 def test_recursive_call(self):
3612 # Testing recursive __call__() by setting to instance of class...
3613 class A(object):
3614 pass
3615
3616 A.__call__ = A()
3617 try:
3618 A()()
3619 except RuntimeError:
3620 pass
3621 else:
3622 self.fail("Recursion limit should have been reached for __call__()")
3623
3624 def test_delete_hook(self):
3625 # Testing __del__ hook...
3626 log = []
3627 class C(object):
3628 def __del__(self):
3629 log.append(1)
3630 c = C()
3631 self.assertEqual(log, [])
3632 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003633 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003634 self.assertEqual(log, [1])
3635
3636 class D(object): pass
3637 d = D()
3638 try: del d[0]
3639 except TypeError: pass
3640 else: self.fail("invalid del() didn't raise TypeError")
3641
3642 def test_hash_inheritance(self):
3643 # Testing hash of mutable subclasses...
3644
3645 class mydict(dict):
3646 pass
3647 d = mydict()
3648 try:
3649 hash(d)
3650 except TypeError:
3651 pass
3652 else:
3653 self.fail("hash() of dict subclass should fail")
3654
3655 class mylist(list):
3656 pass
3657 d = mylist()
3658 try:
3659 hash(d)
3660 except TypeError:
3661 pass
3662 else:
3663 self.fail("hash() of list subclass should fail")
3664
3665 def test_str_operations(self):
3666 try: 'a' + 5
3667 except TypeError: pass
3668 else: self.fail("'' + 5 doesn't raise TypeError")
3669
3670 try: ''.split('')
3671 except ValueError: pass
3672 else: self.fail("''.split('') doesn't raise ValueError")
3673
3674 try: ''.join([0])
3675 except TypeError: pass
3676 else: self.fail("''.join([0]) doesn't raise TypeError")
3677
3678 try: ''.rindex('5')
3679 except ValueError: pass
3680 else: self.fail("''.rindex('5') doesn't raise ValueError")
3681
3682 try: '%(n)s' % None
3683 except TypeError: pass
3684 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3685
3686 try: '%(n' % {}
3687 except ValueError: pass
3688 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3689
3690 try: '%*s' % ('abc')
3691 except TypeError: pass
3692 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3693
3694 try: '%*.*s' % ('abc', 5)
3695 except TypeError: pass
3696 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3697
3698 try: '%s' % (1, 2)
3699 except TypeError: pass
3700 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3701
3702 try: '%' % None
3703 except ValueError: pass
3704 else: self.fail("'%' % None doesn't raise ValueError")
3705
3706 self.assertEqual('534253'.isdigit(), 1)
3707 self.assertEqual('534253x'.isdigit(), 0)
3708 self.assertEqual('%c' % 5, '\x05')
3709 self.assertEqual('%c' % '5', '5')
3710
3711 def test_deepcopy_recursive(self):
3712 # Testing deepcopy of recursive objects...
3713 class Node:
3714 pass
3715 a = Node()
3716 b = Node()
3717 a.b = b
3718 b.a = a
3719 z = deepcopy(a) # This blew up before
3720
3721 def test_unintialized_modules(self):
3722 # Testing uninitialized module objects...
3723 from types import ModuleType as M
3724 m = M.__new__(M)
3725 str(m)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003726 self.assertNotHasAttr(m, "__name__")
3727 self.assertNotHasAttr(m, "__file__")
3728 self.assertNotHasAttr(m, "foo")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003729 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003730 m.foo = 1
3731 self.assertEqual(m.__dict__, {"foo": 1})
3732
3733 def test_funny_new(self):
3734 # Testing __new__ returning something unexpected...
3735 class C(object):
3736 def __new__(cls, arg):
3737 if isinstance(arg, str): return [1, 2, 3]
3738 elif isinstance(arg, int): return object.__new__(D)
3739 else: return object.__new__(cls)
3740 class D(C):
3741 def __init__(self, arg):
3742 self.foo = arg
3743 self.assertEqual(C("1"), [1, 2, 3])
3744 self.assertEqual(D("1"), [1, 2, 3])
3745 d = D(None)
3746 self.assertEqual(d.foo, None)
3747 d = C(1)
3748 self.assertEqual(isinstance(d, D), True)
3749 self.assertEqual(d.foo, 1)
3750 d = D(1)
3751 self.assertEqual(isinstance(d, D), True)
3752 self.assertEqual(d.foo, 1)
3753
3754 def test_imul_bug(self):
3755 # Testing for __imul__ problems...
3756 # SF bug 544647
3757 class C(object):
3758 def __imul__(self, other):
3759 return (self, other)
3760 x = C()
3761 y = x
3762 y *= 1.0
3763 self.assertEqual(y, (x, 1.0))
3764 y = x
3765 y *= 2
3766 self.assertEqual(y, (x, 2))
3767 y = x
3768 y *= 3L
3769 self.assertEqual(y, (x, 3L))
3770 y = x
3771 y *= 1L<<100
3772 self.assertEqual(y, (x, 1L<<100))
3773 y = x
3774 y *= None
3775 self.assertEqual(y, (x, None))
3776 y = x
3777 y *= "foo"
3778 self.assertEqual(y, (x, "foo"))
3779
3780 def test_copy_setstate(self):
3781 # Testing that copy.*copy() correctly uses __setstate__...
3782 import copy
3783 class C(object):
3784 def __init__(self, foo=None):
3785 self.foo = foo
3786 self.__foo = foo
3787 def setfoo(self, foo=None):
3788 self.foo = foo
3789 def getfoo(self):
3790 return self.__foo
3791 def __getstate__(self):
3792 return [self.foo]
3793 def __setstate__(self_, lst):
3794 self.assertEqual(len(lst), 1)
3795 self_.__foo = self_.foo = lst[0]
3796 a = C(42)
3797 a.setfoo(24)
3798 self.assertEqual(a.foo, 24)
3799 self.assertEqual(a.getfoo(), 42)
3800 b = copy.copy(a)
3801 self.assertEqual(b.foo, 24)
3802 self.assertEqual(b.getfoo(), 24)
3803 b = copy.deepcopy(a)
3804 self.assertEqual(b.foo, 24)
3805 self.assertEqual(b.getfoo(), 24)
3806
3807 def test_slices(self):
3808 # Testing cases with slices and overridden __getitem__ ...
3809
3810 # Strings
3811 self.assertEqual("hello"[:4], "hell")
3812 self.assertEqual("hello"[slice(4)], "hell")
3813 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3814 class S(str):
3815 def __getitem__(self, x):
3816 return str.__getitem__(self, x)
3817 self.assertEqual(S("hello")[:4], "hell")
3818 self.assertEqual(S("hello")[slice(4)], "hell")
3819 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3820 # Tuples
3821 self.assertEqual((1,2,3)[:2], (1,2))
3822 self.assertEqual((1,2,3)[slice(2)], (1,2))
3823 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3824 class T(tuple):
3825 def __getitem__(self, x):
3826 return tuple.__getitem__(self, x)
3827 self.assertEqual(T((1,2,3))[:2], (1,2))
3828 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3829 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3830 # Lists
3831 self.assertEqual([1,2,3][:2], [1,2])
3832 self.assertEqual([1,2,3][slice(2)], [1,2])
3833 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3834 class L(list):
3835 def __getitem__(self, x):
3836 return list.__getitem__(self, x)
3837 self.assertEqual(L([1,2,3])[:2], [1,2])
3838 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3839 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3840 # Now do lists and __setitem__
3841 a = L([1,2,3])
3842 a[slice(1, 3)] = [3,2]
3843 self.assertEqual(a, [1,3,2])
3844 a[slice(0, 2, 1)] = [3,1]
3845 self.assertEqual(a, [3,1,2])
3846 a.__setitem__(slice(1, 3), [2,1])
3847 self.assertEqual(a, [3,2,1])
3848 a.__setitem__(slice(0, 2, 1), [2,3])
3849 self.assertEqual(a, [2,3,1])
3850
3851 def test_subtype_resurrection(self):
3852 # Testing resurrection of new-style instance...
3853
3854 class C(object):
3855 container = []
3856
3857 def __del__(self):
3858 # resurrect the instance
3859 C.container.append(self)
3860
3861 c = C()
3862 c.attr = 42
3863
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003864 # The most interesting thing here is whether this blows up, due to
3865 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3866 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003867 del c
3868
3869 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003870 # the last container slot works: that will attempt to delete c again,
3871 # which will cause c to get appended back to the container again
3872 # "during" the del. (On non-CPython implementations, however, __del__
3873 # is typically not called again.)
3874 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003875 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003876 del C.container[-1]
3877 if test_support.check_impl_detail():
3878 test_support.gc_collect()
3879 self.assertEqual(len(C.container), 1)
3880 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003881
3882 # Make c mortal again, so that the test framework with -l doesn't report
3883 # it as a leak.
3884 del C.__del__
3885
3886 def test_slots_trash(self):
3887 # Testing slot trash...
3888 # Deallocating deeply nested slotted trash caused stack overflows
3889 class trash(object):
3890 __slots__ = ['x']
3891 def __init__(self, x):
3892 self.x = x
3893 o = None
3894 for i in xrange(50000):
3895 o = trash(o)
3896 del o
3897
3898 def test_slots_multiple_inheritance(self):
3899 # SF bug 575229, multiple inheritance w/ slots dumps core
3900 class A(object):
3901 __slots__=()
3902 class B(object):
3903 pass
3904 class C(A,B) :
3905 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003906 if test_support.check_impl_detail():
3907 self.assertEqual(C.__basicsize__, B.__basicsize__)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003908 self.assertHasAttr(C, '__dict__')
3909 self.assertHasAttr(C, '__weakref__')
Georg Brandl48545522008-02-02 10:12:36 +00003910 C().x = 2
3911
3912 def test_rmul(self):
3913 # Testing correct invocation of __rmul__...
3914 # SF patch 592646
3915 class C(object):
3916 def __mul__(self, other):
3917 return "mul"
3918 def __rmul__(self, other):
3919 return "rmul"
3920 a = C()
3921 self.assertEqual(a*2, "mul")
3922 self.assertEqual(a*2.2, "mul")
3923 self.assertEqual(2*a, "rmul")
3924 self.assertEqual(2.2*a, "rmul")
3925
3926 def test_ipow(self):
3927 # Testing correct invocation of __ipow__...
3928 # [SF bug 620179]
3929 class C(object):
3930 def __ipow__(self, other):
3931 pass
3932 a = C()
3933 a **= 2
3934
3935 def test_mutable_bases(self):
3936 # Testing mutable bases...
3937
3938 # stuff that should work:
3939 class C(object):
3940 pass
3941 class C2(object):
3942 def __getattribute__(self, attr):
3943 if attr == 'a':
3944 return 2
3945 else:
3946 return super(C2, self).__getattribute__(attr)
3947 def meth(self):
3948 return 1
3949 class D(C):
3950 pass
3951 class E(D):
3952 pass
3953 d = D()
3954 e = E()
3955 D.__bases__ = (C,)
3956 D.__bases__ = (C2,)
3957 self.assertEqual(d.meth(), 1)
3958 self.assertEqual(e.meth(), 1)
3959 self.assertEqual(d.a, 2)
3960 self.assertEqual(e.a, 2)
3961 self.assertEqual(C2.__subclasses__(), [D])
3962
Georg Brandl48545522008-02-02 10:12:36 +00003963 try:
3964 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003965 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003966 pass
3967 else:
3968 self.fail("shouldn't be able to delete .__bases__")
3969
3970 try:
3971 D.__bases__ = ()
3972 except TypeError, msg:
3973 if str(msg) == "a new-style class can't have only classic bases":
3974 self.fail("wrong error message for .__bases__ = ()")
3975 else:
3976 self.fail("shouldn't be able to set .__bases__ to ()")
3977
3978 try:
3979 D.__bases__ = (D,)
3980 except TypeError:
3981 pass
3982 else:
3983 # actually, we'll have crashed by here...
3984 self.fail("shouldn't be able to create inheritance cycles")
3985
3986 try:
3987 D.__bases__ = (C, C)
3988 except TypeError:
3989 pass
3990 else:
3991 self.fail("didn't detect repeated base classes")
3992
3993 try:
3994 D.__bases__ = (E,)
3995 except TypeError:
3996 pass
3997 else:
3998 self.fail("shouldn't be able to create inheritance cycles")
3999
4000 # let's throw a classic class into the mix:
4001 class Classic:
4002 def meth2(self):
4003 return 3
4004
4005 D.__bases__ = (C, Classic)
4006
4007 self.assertEqual(d.meth2(), 3)
4008 self.assertEqual(e.meth2(), 3)
4009 try:
4010 d.a
4011 except AttributeError:
4012 pass
4013 else:
4014 self.fail("attribute should have vanished")
4015
4016 try:
4017 D.__bases__ = (Classic,)
4018 except TypeError:
4019 pass
4020 else:
4021 self.fail("new-style class must have a new-style base")
4022
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004023 def test_builtin_bases(self):
4024 # Make sure all the builtin types can have their base queried without
4025 # segfaulting. See issue #5787.
4026 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
4027 if isinstance(tp, type)]
4028 for tp in builtin_types:
4029 object.__getattribute__(tp, "__bases__")
4030 if tp is not object:
4031 self.assertEqual(len(tp.__bases__), 1, tp)
4032
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00004033 class L(list):
4034 pass
4035
4036 class C(object):
4037 pass
4038
4039 class D(C):
4040 pass
4041
4042 try:
4043 L.__bases__ = (dict,)
4044 except TypeError:
4045 pass
4046 else:
4047 self.fail("shouldn't turn list subclass into dict subclass")
4048
4049 try:
4050 list.__bases__ = (dict,)
4051 except TypeError:
4052 pass
4053 else:
4054 self.fail("shouldn't be able to assign to list.__bases__")
4055
4056 try:
4057 D.__bases__ = (C, list)
4058 except TypeError:
4059 pass
4060 else:
4061 assert 0, "best_base calculation found wanting"
4062
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004063
Georg Brandl48545522008-02-02 10:12:36 +00004064 def test_mutable_bases_with_failing_mro(self):
4065 # Testing mutable bases with failing mro...
4066 class WorkOnce(type):
4067 def __new__(self, name, bases, ns):
4068 self.flag = 0
4069 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
4070 def mro(self):
4071 if self.flag > 0:
4072 raise RuntimeError, "bozo"
4073 else:
4074 self.flag += 1
4075 return type.mro(self)
4076
4077 class WorkAlways(type):
4078 def mro(self):
4079 # this is here to make sure that .mro()s aren't called
4080 # with an exception set (which was possible at one point).
4081 # An error message will be printed in a debug build.
4082 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004083 return type.mro(self)
4084
Georg Brandl48545522008-02-02 10:12:36 +00004085 class C(object):
4086 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004087
Georg Brandl48545522008-02-02 10:12:36 +00004088 class C2(object):
4089 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004090
Georg Brandl48545522008-02-02 10:12:36 +00004091 class D(C):
4092 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004093
Georg Brandl48545522008-02-02 10:12:36 +00004094 class E(D):
4095 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004096
Georg Brandl48545522008-02-02 10:12:36 +00004097 class F(D):
4098 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004099
Georg Brandl48545522008-02-02 10:12:36 +00004100 class G(D):
4101 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004102
Georg Brandl48545522008-02-02 10:12:36 +00004103 # Immediate subclasses have their mro's adjusted in alphabetical
4104 # order, so E's will get adjusted before adjusting F's fails. We
4105 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004106
Georg Brandl48545522008-02-02 10:12:36 +00004107 E_mro_before = E.__mro__
4108 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004109
Armin Rigofd163f92005-12-29 15:59:19 +00004110 try:
Georg Brandl48545522008-02-02 10:12:36 +00004111 D.__bases__ = (C2,)
4112 except RuntimeError:
4113 self.assertEqual(E.__mro__, E_mro_before)
4114 self.assertEqual(D.__mro__, D_mro_before)
4115 else:
4116 self.fail("exception not propagated")
4117
4118 def test_mutable_bases_catch_mro_conflict(self):
4119 # Testing mutable bases catch mro conflict...
4120 class A(object):
4121 pass
4122
4123 class B(object):
4124 pass
4125
4126 class C(A, B):
4127 pass
4128
4129 class D(A, B):
4130 pass
4131
4132 class E(C, D):
4133 pass
4134
4135 try:
4136 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004137 except TypeError:
4138 pass
4139 else:
Georg Brandl48545522008-02-02 10:12:36 +00004140 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004141
Georg Brandl48545522008-02-02 10:12:36 +00004142 def test_mutable_names(self):
4143 # Testing mutable names...
4144 class C(object):
4145 pass
4146
4147 # C.__module__ could be 'test_descr' or '__main__'
4148 mod = C.__module__
4149
4150 C.__name__ = 'D'
4151 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4152
4153 C.__name__ = 'D.E'
4154 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4155
Mark Dickinsonf794b142013-04-13 15:19:05 +01004156 def test_evil_type_name(self):
4157 # A badly placed Py_DECREF in type_set_name led to arbitrary code
4158 # execution while the type structure was not in a sane state, and a
4159 # possible segmentation fault as a result. See bug #16447.
4160 class Nasty(str):
4161 def __del__(self):
4162 C.__name__ = "other"
4163
4164 class C(object):
4165 pass
4166
4167 C.__name__ = Nasty("abc")
4168 C.__name__ = "normal"
4169
Georg Brandl48545522008-02-02 10:12:36 +00004170 def test_subclass_right_op(self):
4171 # Testing correct dispatch of subclass overloading __r<op>__...
4172
4173 # This code tests various cases where right-dispatch of a subclass
4174 # should be preferred over left-dispatch of a base class.
4175
4176 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4177
4178 class B(int):
4179 def __floordiv__(self, other):
4180 return "B.__floordiv__"
4181 def __rfloordiv__(self, other):
4182 return "B.__rfloordiv__"
4183
4184 self.assertEqual(B(1) // 1, "B.__floordiv__")
4185 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4186
4187 # Case 2: subclass of object; this is just the baseline for case 3
4188
4189 class C(object):
4190 def __floordiv__(self, other):
4191 return "C.__floordiv__"
4192 def __rfloordiv__(self, other):
4193 return "C.__rfloordiv__"
4194
4195 self.assertEqual(C() // 1, "C.__floordiv__")
4196 self.assertEqual(1 // C(), "C.__rfloordiv__")
4197
4198 # Case 3: subclass of new-style class; here it gets interesting
4199
4200 class D(C):
4201 def __floordiv__(self, other):
4202 return "D.__floordiv__"
4203 def __rfloordiv__(self, other):
4204 return "D.__rfloordiv__"
4205
4206 self.assertEqual(D() // C(), "D.__floordiv__")
4207 self.assertEqual(C() // D(), "D.__rfloordiv__")
4208
4209 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4210
4211 class E(C):
4212 pass
4213
4214 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4215
4216 self.assertEqual(E() // 1, "C.__floordiv__")
4217 self.assertEqual(1 // E(), "C.__rfloordiv__")
4218 self.assertEqual(E() // C(), "C.__floordiv__")
4219 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4220
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004221 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004222 def test_meth_class_get(self):
4223 # Testing __get__ method of METH_CLASS C methods...
4224 # Full coverage of descrobject.c::classmethod_get()
4225
4226 # Baseline
4227 arg = [1, 2, 3]
4228 res = {1: None, 2: None, 3: None}
4229 self.assertEqual(dict.fromkeys(arg), res)
4230 self.assertEqual({}.fromkeys(arg), res)
4231
4232 # Now get the descriptor
4233 descr = dict.__dict__["fromkeys"]
4234
4235 # More baseline using the descriptor directly
4236 self.assertEqual(descr.__get__(None, dict)(arg), res)
4237 self.assertEqual(descr.__get__({})(arg), res)
4238
4239 # Now check various error cases
4240 try:
4241 descr.__get__(None, None)
4242 except TypeError:
4243 pass
4244 else:
4245 self.fail("shouldn't have allowed descr.__get__(None, None)")
4246 try:
4247 descr.__get__(42)
4248 except TypeError:
4249 pass
4250 else:
4251 self.fail("shouldn't have allowed descr.__get__(42)")
4252 try:
4253 descr.__get__(None, 42)
4254 except TypeError:
4255 pass
4256 else:
4257 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4258 try:
4259 descr.__get__(None, int)
4260 except TypeError:
4261 pass
4262 else:
4263 self.fail("shouldn't have allowed descr.__get__(None, int)")
4264
4265 def test_isinst_isclass(self):
4266 # Testing proxy isinstance() and isclass()...
4267 class Proxy(object):
4268 def __init__(self, obj):
4269 self.__obj = obj
4270 def __getattribute__(self, name):
4271 if name.startswith("_Proxy__"):
4272 return object.__getattribute__(self, name)
4273 else:
4274 return getattr(self.__obj, name)
4275 # Test with a classic class
4276 class C:
4277 pass
4278 a = C()
4279 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004280 self.assertIsInstance(a, C) # Baseline
4281 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004282 # Test with a classic subclass
4283 class D(C):
4284 pass
4285 a = D()
4286 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004287 self.assertIsInstance(a, C) # Baseline
4288 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004289 # Test with a new-style class
4290 class C(object):
4291 pass
4292 a = C()
4293 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004294 self.assertIsInstance(a, C) # Baseline
4295 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004296 # Test with a new-style subclass
4297 class D(C):
4298 pass
4299 a = D()
4300 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004301 self.assertIsInstance(a, C) # Baseline
4302 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004303
4304 def test_proxy_super(self):
4305 # Testing super() for a proxy object...
4306 class Proxy(object):
4307 def __init__(self, obj):
4308 self.__obj = obj
4309 def __getattribute__(self, name):
4310 if name.startswith("_Proxy__"):
4311 return object.__getattribute__(self, name)
4312 else:
4313 return getattr(self.__obj, name)
4314
4315 class B(object):
4316 def f(self):
4317 return "B.f"
4318
4319 class C(B):
4320 def f(self):
4321 return super(C, self).f() + "->C.f"
4322
4323 obj = C()
4324 p = Proxy(obj)
4325 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4326
4327 def test_carloverre(self):
4328 # Testing prohibition of Carlo Verre's hack...
4329 try:
4330 object.__setattr__(str, "foo", 42)
4331 except TypeError:
4332 pass
4333 else:
Ezio Melottic2077b02011-03-16 12:34:31 +02004334 self.fail("Carlo Verre __setattr__ succeeded!")
Georg Brandl48545522008-02-02 10:12:36 +00004335 try:
4336 object.__delattr__(str, "lower")
4337 except TypeError:
4338 pass
4339 else:
4340 self.fail("Carlo Verre __delattr__ succeeded!")
4341
4342 def test_weakref_segfault(self):
4343 # Testing weakref segfault...
4344 # SF 742911
4345 import weakref
4346
4347 class Provoker:
4348 def __init__(self, referrent):
4349 self.ref = weakref.ref(referrent)
4350
4351 def __del__(self):
4352 x = self.ref()
4353
4354 class Oops(object):
4355 pass
4356
4357 o = Oops()
4358 o.whatever = Provoker(o)
4359 del o
4360
4361 def test_wrapper_segfault(self):
4362 # SF 927248: deeply nested wrappers could cause stack overflow
4363 f = lambda:None
4364 for i in xrange(1000000):
4365 f = f.__call__
4366 f = None
4367
4368 def test_file_fault(self):
4369 # Testing sys.stdout is changed in getattr...
Nick Coghlan0447cd62009-10-17 06:33:05 +00004370 test_stdout = sys.stdout
Georg Brandl48545522008-02-02 10:12:36 +00004371 class StdoutGuard:
4372 def __getattr__(self, attr):
4373 sys.stdout = sys.__stdout__
4374 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4375 sys.stdout = StdoutGuard()
4376 try:
4377 print "Oops!"
4378 except RuntimeError:
4379 pass
Nick Coghlan0447cd62009-10-17 06:33:05 +00004380 finally:
4381 sys.stdout = test_stdout
Georg Brandl48545522008-02-02 10:12:36 +00004382
4383 def test_vicious_descriptor_nonsense(self):
4384 # Testing vicious_descriptor_nonsense...
4385
4386 # A potential segfault spotted by Thomas Wouters in mail to
4387 # python-dev 2003-04-17, turned into an example & fixed by Michael
4388 # Hudson just less than four months later...
4389
4390 class Evil(object):
4391 def __hash__(self):
4392 return hash('attr')
4393 def __eq__(self, other):
4394 del C.attr
4395 return 0
4396
4397 class Descr(object):
4398 def __get__(self, ob, type=None):
4399 return 1
4400
4401 class C(object):
4402 attr = Descr()
4403
4404 c = C()
4405 c.__dict__[Evil()] = 0
4406
4407 self.assertEqual(c.attr, 1)
4408 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004409 test_support.gc_collect()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004410 self.assertNotHasAttr(c, 'attr')
Georg Brandl48545522008-02-02 10:12:36 +00004411
4412 def test_init(self):
4413 # SF 1155938
4414 class Foo(object):
4415 def __init__(self):
4416 return 10
4417 try:
4418 Foo()
4419 except TypeError:
4420 pass
4421 else:
4422 self.fail("did not test __init__() for None return")
4423
4424 def test_method_wrapper(self):
4425 # Testing method-wrapper objects...
4426 # <type 'method-wrapper'> did not support any reflection before 2.5
4427
4428 l = []
4429 self.assertEqual(l.__add__, l.__add__)
4430 self.assertEqual(l.__add__, [].__add__)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004431 self.assertNotEqual(l.__add__, [5].__add__)
4432 self.assertNotEqual(l.__add__, l.__mul__)
4433 self.assertEqual(l.__add__.__name__, '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004434 if hasattr(l.__add__, '__self__'):
4435 # CPython
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004436 self.assertIs(l.__add__.__self__, l)
4437 self.assertIs(l.__add__.__objclass__, list)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004438 else:
4439 # Python implementations where [].__add__ is a normal bound method
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004440 self.assertIs(l.__add__.im_self, l)
4441 self.assertIs(l.__add__.im_class, list)
Georg Brandl48545522008-02-02 10:12:36 +00004442 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4443 try:
4444 hash(l.__add__)
4445 except TypeError:
4446 pass
4447 else:
4448 self.fail("no TypeError from hash([].__add__)")
4449
4450 t = ()
4451 t += (7,)
4452 self.assertEqual(t.__add__, (7,).__add__)
4453 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4454
4455 def test_not_implemented(self):
4456 # Testing NotImplemented...
4457 # all binary methods should be able to return a NotImplemented
Georg Brandl48545522008-02-02 10:12:36 +00004458 import operator
4459
4460 def specialmethod(self, other):
4461 return NotImplemented
4462
4463 def check(expr, x, y):
4464 try:
4465 exec expr in {'x': x, 'y': y, 'operator': operator}
4466 except TypeError:
4467 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004468 else:
Georg Brandl48545522008-02-02 10:12:36 +00004469 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004470
Georg Brandl48545522008-02-02 10:12:36 +00004471 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4472 # TypeErrors
4473 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4474 # ValueErrors instead of TypeErrors
4475 for metaclass in [type, types.ClassType]:
4476 for name, expr, iexpr in [
4477 ('__add__', 'x + y', 'x += y'),
4478 ('__sub__', 'x - y', 'x -= y'),
4479 ('__mul__', 'x * y', 'x *= y'),
4480 ('__truediv__', 'operator.truediv(x, y)', None),
4481 ('__floordiv__', 'operator.floordiv(x, y)', None),
4482 ('__div__', 'x / y', 'x /= y'),
4483 ('__mod__', 'x % y', 'x %= y'),
4484 ('__divmod__', 'divmod(x, y)', None),
4485 ('__pow__', 'x ** y', 'x **= y'),
4486 ('__lshift__', 'x << y', 'x <<= y'),
4487 ('__rshift__', 'x >> y', 'x >>= y'),
4488 ('__and__', 'x & y', 'x &= y'),
4489 ('__or__', 'x | y', 'x |= y'),
4490 ('__xor__', 'x ^ y', 'x ^= y'),
4491 ('__coerce__', 'coerce(x, y)', None)]:
4492 if name == '__coerce__':
4493 rname = name
4494 else:
4495 rname = '__r' + name[2:]
4496 A = metaclass('A', (), {name: specialmethod})
4497 B = metaclass('B', (), {rname: specialmethod})
4498 a = A()
4499 b = B()
4500 check(expr, a, a)
4501 check(expr, a, b)
4502 check(expr, b, a)
4503 check(expr, b, b)
4504 check(expr, a, N1)
4505 check(expr, a, N2)
4506 check(expr, N1, b)
4507 check(expr, N2, b)
4508 if iexpr:
4509 check(iexpr, a, a)
4510 check(iexpr, a, b)
4511 check(iexpr, b, a)
4512 check(iexpr, b, b)
4513 check(iexpr, a, N1)
4514 check(iexpr, a, N2)
4515 iname = '__i' + name[2:]
4516 C = metaclass('C', (), {iname: specialmethod})
4517 c = C()
4518 check(iexpr, c, a)
4519 check(iexpr, c, b)
4520 check(iexpr, c, N1)
4521 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004522
Georg Brandl48545522008-02-02 10:12:36 +00004523 def test_assign_slice(self):
4524 # ceval.c's assign_slice used to check for
4525 # tp->tp_as_sequence->sq_slice instead of
4526 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004527
Georg Brandl48545522008-02-02 10:12:36 +00004528 class C(object):
4529 def __setslice__(self, start, stop, value):
4530 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004531
Georg Brandl48545522008-02-02 10:12:36 +00004532 c = C()
4533 c[1:2] = 3
4534 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004535
Benjamin Peterson9179dab2010-01-18 23:07:56 +00004536 def test_set_and_no_get(self):
4537 # See
4538 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4539 class Descr(object):
4540
4541 def __init__(self, name):
4542 self.name = name
4543
4544 def __set__(self, obj, value):
4545 obj.__dict__[self.name] = value
4546 descr = Descr("a")
4547
4548 class X(object):
4549 a = descr
4550
4551 x = X()
4552 self.assertIs(x.a, descr)
4553 x.a = 42
4554 self.assertEqual(x.a, 42)
4555
Benjamin Peterson42d59472010-02-06 20:14:10 +00004556 # Also check type_getattro for correctness.
4557 class Meta(type):
4558 pass
4559 class X(object):
4560 __metaclass__ = Meta
4561 X.a = 42
4562 Meta.a = Descr("a")
4563 self.assertEqual(X.a, 42)
4564
Benjamin Peterson273c2332008-11-17 22:39:09 +00004565 def test_getattr_hooks(self):
4566 # issue 4230
4567
4568 class Descriptor(object):
4569 counter = 0
4570 def __get__(self, obj, objtype=None):
4571 def getter(name):
4572 self.counter += 1
4573 raise AttributeError(name)
4574 return getter
4575
4576 descr = Descriptor()
4577 class A(object):
4578 __getattribute__ = descr
4579 class B(object):
4580 __getattr__ = descr
4581 class C(object):
4582 __getattribute__ = descr
4583 __getattr__ = descr
4584
4585 self.assertRaises(AttributeError, getattr, A(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004586 self.assertEqual(descr.counter, 1)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004587 self.assertRaises(AttributeError, getattr, B(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004588 self.assertEqual(descr.counter, 2)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004589 self.assertRaises(AttributeError, getattr, C(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004590 self.assertEqual(descr.counter, 4)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004591
Benjamin Peterson273c2332008-11-17 22:39:09 +00004592 class EvilGetattribute(object):
4593 # This used to segfault
4594 def __getattr__(self, name):
4595 raise AttributeError(name)
4596 def __getattribute__(self, name):
4597 del EvilGetattribute.__getattr__
4598 for i in range(5):
4599 gc.collect()
4600 raise AttributeError(name)
4601
4602 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4603
Benjamin Peterson6e7832b2012-03-16 09:32:59 -05004604 def test_type___getattribute__(self):
4605 self.assertRaises(TypeError, type.__getattribute__, list, type)
4606
Benjamin Peterson9b911ca2011-01-12 15:49:47 +00004607 def test_abstractmethods(self):
4608 # type pretends not to have __abstractmethods__.
4609 self.assertRaises(AttributeError, getattr, type, "__abstractmethods__")
4610 class meta(type):
4611 pass
4612 self.assertRaises(AttributeError, getattr, meta, "__abstractmethods__")
4613 class X(object):
4614 pass
4615 with self.assertRaises(AttributeError):
4616 del X.__abstractmethods__
4617
Victor Stinnere363ec12011-05-01 23:43:37 +02004618 def test_proxy_call(self):
4619 class FakeStr(object):
4620 __class__ = str
4621
4622 fake_str = FakeStr()
4623 # isinstance() reads __class__ on new style classes
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004624 self.assertIsInstance(fake_str, str)
Victor Stinnere363ec12011-05-01 23:43:37 +02004625
4626 # call a method descriptor
4627 with self.assertRaises(TypeError):
4628 str.split(fake_str)
4629
4630 # call a slot wrapper descriptor
4631 with self.assertRaises(TypeError):
4632 str.__add__(fake_str, "abc")
4633
Antoine Pitrou304f0f92011-07-15 21:22:50 +02004634 def test_repr_as_str(self):
4635 # Issue #11603: crash or infinite loop when rebinding __str__ as
4636 # __repr__.
4637 class Foo(object):
4638 pass
4639 Foo.__repr__ = Foo.__str__
4640 foo = Foo()
Benjamin Petersond157a4c2012-04-24 11:06:25 -04004641 self.assertRaises(RuntimeError, str, foo)
4642 self.assertRaises(RuntimeError, repr, foo)
4643
4644 def test_mixing_slot_wrappers(self):
4645 class X(dict):
4646 __setattr__ = dict.__setitem__
4647 x = X()
4648 x.y = 42
4649 self.assertEqual(x["y"], 42)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004650
Benjamin Petersona8d45852012-03-07 18:41:11 -06004651 def test_cycle_through_dict(self):
4652 # See bug #1469629
4653 class X(dict):
4654 def __init__(self):
4655 dict.__init__(self)
4656 self.__dict__ = self
4657 x = X()
4658 x.attr = 42
4659 wr = weakref.ref(x)
4660 del x
4661 test_support.gc_collect()
4662 self.assertIsNone(wr())
4663 for o in gc.get_objects():
4664 self.assertIsNot(type(o), X)
4665
Georg Brandl48545522008-02-02 10:12:36 +00004666class DictProxyTests(unittest.TestCase):
4667 def setUp(self):
4668 class C(object):
4669 def meth(self):
4670 pass
4671 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004672
Raymond Hettingerbf7a2662011-06-30 00:44:36 +01004673 def test_repr(self):
4674 self.assertIn('dict_proxy({', repr(vars(self.C)))
4675 self.assertIn("'meth':", repr(vars(self.C)))
4676
Georg Brandl48545522008-02-02 10:12:36 +00004677 def test_iter_keys(self):
4678 # Testing dict-proxy iterkeys...
4679 keys = [ key for key in self.C.__dict__.iterkeys() ]
4680 keys.sort()
Ezio Melotti2623a372010-11-21 13:34:58 +00004681 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
Georg Brandl48545522008-02-02 10:12:36 +00004682 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004683
Georg Brandl48545522008-02-02 10:12:36 +00004684 def test_iter_values(self):
4685 # Testing dict-proxy itervalues...
4686 values = [ values for values in self.C.__dict__.itervalues() ]
4687 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004688
Georg Brandl48545522008-02-02 10:12:36 +00004689 def test_iter_items(self):
4690 # Testing dict-proxy iteritems...
4691 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4692 keys.sort()
4693 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4694 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004695
Georg Brandl48545522008-02-02 10:12:36 +00004696 def test_dict_type_with_metaclass(self):
4697 # Testing type of __dict__ when __metaclass__ set...
4698 class B(object):
4699 pass
4700 class M(type):
4701 pass
4702 class C:
4703 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4704 __metaclass__ = M
4705 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004706
Guido van Rossum9acc3872008-01-23 23:23:43 +00004707
Georg Brandl48545522008-02-02 10:12:36 +00004708class PTypesLongInitTest(unittest.TestCase):
4709 # This is in its own TestCase so that it can be run before any other tests.
4710 def test_pytype_long_ready(self):
4711 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004712
Georg Brandl48545522008-02-02 10:12:36 +00004713 # This dumps core when SF bug 551412 isn't fixed --
4714 # but only when test_descr.py is run separately.
4715 # (That can't be helped -- as soon as PyType_Ready()
4716 # is called for PyLong_Type, the bug is gone.)
4717 class UserLong(object):
4718 def __pow__(self, *args):
4719 pass
4720 try:
4721 pow(0L, UserLong(), 0L)
4722 except:
4723 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004724
Georg Brandl48545522008-02-02 10:12:36 +00004725 # Another segfault only when run early
4726 # (before PyType_Ready(tuple) is called)
4727 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004728
4729
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004730def test_main():
Florent Xicluna6257a7b2010-03-31 22:01:03 +00004731 deprecations = [(r'complex divmod\(\), // and % are deprecated$',
4732 DeprecationWarning)]
4733 if sys.py3kwarning:
4734 deprecations += [
Florent Xicluna07627882010-03-21 01:14:24 +00004735 ("classic (int|long) division", DeprecationWarning),
4736 ("coerce.. not supported", DeprecationWarning),
Florent Xicluna6257a7b2010-03-31 22:01:03 +00004737 (".+__(get|set|del)slice__ has been removed", DeprecationWarning)]
4738 with test_support.check_warnings(*deprecations):
Florent Xicluna07627882010-03-21 01:14:24 +00004739 # Run all local test cases, with PTypesLongInitTest first.
4740 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4741 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004742
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004743if __name__ == "__main__":
4744 test_main()