blob: 0ac458f1e3a89074b032e58b592d6c6c0286b9ad [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):
Serhiy Storchaka5312a7f2015-01-31 11:27:06 +02002069 __getitem__ = property(lambda s: 1.0/0.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:
Serhiy Storchaka655720e2014-12-15 14:02:43 +02003303 for bin in range(p.HIGHEST_PROTOCOL + 1):
Georg Brandl48545522008-02-02 10:12:36 +00003304 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
Serhiy Storchaka655720e2014-12-15 14:02:43 +02003361 for proto in range(2):
3362 try:
3363 pickle.dumps(C(), proto)
3364 except TypeError:
3365 pass
3366 else:
3367 self.fail("should fail: pickle C instance - %s" % base)
3368 try:
3369 cPickle.dumps(C(), proto)
3370 except TypeError:
3371 pass
3372 else:
3373 self.fail("should fail: cPickle C instance - %s" % base)
3374 try:
3375 pickle.dumps(C(), proto)
3376 except TypeError:
3377 pass
3378 else:
3379 self.fail("should fail: pickle D instance - %s" % base)
3380 try:
3381 cPickle.dumps(D(), proto)
3382 except TypeError:
3383 pass
3384 else:
3385 self.fail("should fail: cPickle D instance - %s" % base)
Georg Brandl48545522008-02-02 10:12:36 +00003386 # Give C a nice generic __getstate__ and __setstate__
3387 class C(base):
3388 __slots__ = ['a']
3389 def __getstate__(self):
3390 try:
3391 d = self.__dict__.copy()
3392 except AttributeError:
3393 d = {}
3394 for cls in self.__class__.__mro__:
3395 for sn in cls.__dict__.get('__slots__', ()):
3396 try:
3397 d[sn] = getattr(self, sn)
3398 except AttributeError:
3399 pass
3400 return d
3401 def __setstate__(self, d):
3402 for k, v in d.items():
3403 setattr(self, k, v)
3404 class D(C):
3405 pass
3406 # Now it should work
3407 x = C()
Serhiy Storchaka655720e2014-12-15 14:02:43 +02003408 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3409 y = pickle.loads(pickle.dumps(x, proto))
3410 self.assertNotHasAttr(y, 'a')
3411 y = cPickle.loads(cPickle.dumps(x, proto))
3412 self.assertNotHasAttr(y, 'a')
Georg Brandl48545522008-02-02 10:12:36 +00003413 x.a = 42
Serhiy Storchaka655720e2014-12-15 14:02:43 +02003414 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3415 y = pickle.loads(pickle.dumps(x, proto))
3416 self.assertEqual(y.a, 42)
3417 y = cPickle.loads(cPickle.dumps(x, proto))
3418 self.assertEqual(y.a, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003419 x = D()
3420 x.a = 42
3421 x.b = 100
Serhiy Storchaka655720e2014-12-15 14:02:43 +02003422 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3423 y = pickle.loads(pickle.dumps(x, proto))
3424 self.assertEqual(y.a + y.b, 142)
3425 y = cPickle.loads(cPickle.dumps(x, proto))
3426 self.assertEqual(y.a + y.b, 142)
Georg Brandl48545522008-02-02 10:12:36 +00003427 # A subclass that adds a slot should also work
3428 class E(C):
3429 __slots__ = ['b']
3430 x = E()
3431 x.a = 42
3432 x.b = "foo"
Serhiy Storchaka655720e2014-12-15 14:02:43 +02003433 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3434 y = pickle.loads(pickle.dumps(x, proto))
3435 self.assertEqual(y.a, x.a)
3436 self.assertEqual(y.b, x.b)
3437 y = cPickle.loads(cPickle.dumps(x, proto))
3438 self.assertEqual(y.a, x.a)
3439 self.assertEqual(y.b, x.b)
Georg Brandl48545522008-02-02 10:12:36 +00003440
3441 def test_binary_operator_override(self):
3442 # Testing overrides of binary operations...
3443 class I(int):
3444 def __repr__(self):
3445 return "I(%r)" % int(self)
3446 def __add__(self, other):
3447 return I(int(self) + int(other))
3448 __radd__ = __add__
3449 def __pow__(self, other, mod=None):
3450 if mod is None:
3451 return I(pow(int(self), int(other)))
3452 else:
3453 return I(pow(int(self), int(other), int(mod)))
3454 def __rpow__(self, other, mod=None):
3455 if mod is None:
3456 return I(pow(int(other), int(self), mod))
3457 else:
3458 return I(pow(int(other), int(self), int(mod)))
3459
3460 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3461 self.assertEqual(repr(I(1) + 2), "I(3)")
3462 self.assertEqual(repr(1 + I(2)), "I(3)")
3463 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3464 self.assertEqual(repr(2 ** I(3)), "I(8)")
3465 self.assertEqual(repr(I(2) ** 3), "I(8)")
3466 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3467 class S(str):
3468 def __eq__(self, other):
3469 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003470 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003471
3472 def test_subclass_propagation(self):
3473 # Testing propagation of slot functions to subclasses...
3474 class A(object):
3475 pass
3476 class B(A):
3477 pass
3478 class C(A):
3479 pass
3480 class D(B, C):
3481 pass
3482 d = D()
3483 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3484 A.__hash__ = lambda self: 42
3485 self.assertEqual(hash(d), 42)
3486 C.__hash__ = lambda self: 314
3487 self.assertEqual(hash(d), 314)
3488 B.__hash__ = lambda self: 144
3489 self.assertEqual(hash(d), 144)
3490 D.__hash__ = lambda self: 100
3491 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003492 D.__hash__ = None
3493 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003494 del D.__hash__
3495 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003496 B.__hash__ = None
3497 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003498 del B.__hash__
3499 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003500 C.__hash__ = None
3501 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003502 del C.__hash__
3503 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003504 A.__hash__ = None
3505 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003506 del A.__hash__
3507 self.assertEqual(hash(d), orig_hash)
3508 d.foo = 42
3509 d.bar = 42
3510 self.assertEqual(d.foo, 42)
3511 self.assertEqual(d.bar, 42)
3512 def __getattribute__(self, name):
3513 if name == "foo":
3514 return 24
3515 return object.__getattribute__(self, name)
3516 A.__getattribute__ = __getattribute__
3517 self.assertEqual(d.foo, 24)
3518 self.assertEqual(d.bar, 42)
3519 def __getattr__(self, name):
3520 if name in ("spam", "foo", "bar"):
3521 return "hello"
3522 raise AttributeError, name
3523 B.__getattr__ = __getattr__
3524 self.assertEqual(d.spam, "hello")
3525 self.assertEqual(d.foo, 24)
3526 self.assertEqual(d.bar, 42)
3527 del A.__getattribute__
3528 self.assertEqual(d.foo, 42)
3529 del d.foo
3530 self.assertEqual(d.foo, "hello")
3531 self.assertEqual(d.bar, 42)
3532 del B.__getattr__
3533 try:
3534 d.foo
3535 except AttributeError:
3536 pass
3537 else:
3538 self.fail("d.foo should be undefined now")
3539
3540 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl48545522008-02-02 10:12:36 +00003541 class A(object):
3542 pass
3543 class B(A):
3544 pass
3545 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003546 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003547 A.__setitem__ = lambda *a: None # crash
3548
3549 def test_buffer_inheritance(self):
3550 # Testing that buffer interface is inherited ...
3551
3552 import binascii
3553 # SF bug [#470040] ParseTuple t# vs subclasses.
3554
3555 class MyStr(str):
3556 pass
3557 base = 'abc'
3558 m = MyStr(base)
3559 # b2a_hex uses the buffer interface to get its argument's value, via
3560 # PyArg_ParseTuple 't#' code.
3561 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3562
3563 # It's not clear that unicode will continue to support the character
3564 # buffer interface, and this test will fail if that's taken away.
3565 class MyUni(unicode):
3566 pass
3567 base = u'abc'
3568 m = MyUni(base)
3569 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3570
3571 class MyInt(int):
3572 pass
3573 m = MyInt(42)
3574 try:
3575 binascii.b2a_hex(m)
3576 self.fail('subclass of int should not have a buffer interface')
3577 except TypeError:
3578 pass
3579
3580 def test_str_of_str_subclass(self):
3581 # Testing __str__ defined in subclass of str ...
3582 import binascii
3583 import cStringIO
3584
3585 class octetstring(str):
3586 def __str__(self):
3587 return binascii.b2a_hex(self)
3588 def __repr__(self):
3589 return self + " repr"
3590
3591 o = octetstring('A')
3592 self.assertEqual(type(o), octetstring)
3593 self.assertEqual(type(str(o)), str)
3594 self.assertEqual(type(repr(o)), str)
3595 self.assertEqual(ord(o), 0x41)
3596 self.assertEqual(str(o), '41')
3597 self.assertEqual(repr(o), 'A repr')
3598 self.assertEqual(o.__str__(), '41')
3599 self.assertEqual(o.__repr__(), 'A repr')
3600
3601 capture = cStringIO.StringIO()
3602 # Calling str() or not exercises different internal paths.
3603 print >> capture, o
3604 print >> capture, str(o)
3605 self.assertEqual(capture.getvalue(), '41\n41\n')
3606 capture.close()
3607
3608 def test_keyword_arguments(self):
3609 # Testing keyword arguments to __init__, __call__...
3610 def f(a): return a
3611 self.assertEqual(f.__call__(a=42), 42)
3612 a = []
3613 list.__init__(a, sequence=[0, 1, 2])
3614 self.assertEqual(a, [0, 1, 2])
3615
3616 def test_recursive_call(self):
3617 # Testing recursive __call__() by setting to instance of class...
3618 class A(object):
3619 pass
3620
3621 A.__call__ = A()
3622 try:
3623 A()()
3624 except RuntimeError:
3625 pass
3626 else:
3627 self.fail("Recursion limit should have been reached for __call__()")
3628
3629 def test_delete_hook(self):
3630 # Testing __del__ hook...
3631 log = []
3632 class C(object):
3633 def __del__(self):
3634 log.append(1)
3635 c = C()
3636 self.assertEqual(log, [])
3637 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003638 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003639 self.assertEqual(log, [1])
3640
3641 class D(object): pass
3642 d = D()
3643 try: del d[0]
3644 except TypeError: pass
3645 else: self.fail("invalid del() didn't raise TypeError")
3646
3647 def test_hash_inheritance(self):
3648 # Testing hash of mutable subclasses...
3649
3650 class mydict(dict):
3651 pass
3652 d = mydict()
3653 try:
3654 hash(d)
3655 except TypeError:
3656 pass
3657 else:
3658 self.fail("hash() of dict subclass should fail")
3659
3660 class mylist(list):
3661 pass
3662 d = mylist()
3663 try:
3664 hash(d)
3665 except TypeError:
3666 pass
3667 else:
3668 self.fail("hash() of list subclass should fail")
3669
3670 def test_str_operations(self):
3671 try: 'a' + 5
3672 except TypeError: pass
3673 else: self.fail("'' + 5 doesn't raise TypeError")
3674
3675 try: ''.split('')
3676 except ValueError: pass
3677 else: self.fail("''.split('') doesn't raise ValueError")
3678
3679 try: ''.join([0])
3680 except TypeError: pass
3681 else: self.fail("''.join([0]) doesn't raise TypeError")
3682
3683 try: ''.rindex('5')
3684 except ValueError: pass
3685 else: self.fail("''.rindex('5') doesn't raise ValueError")
3686
3687 try: '%(n)s' % None
3688 except TypeError: pass
3689 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3690
3691 try: '%(n' % {}
3692 except ValueError: pass
3693 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3694
3695 try: '%*s' % ('abc')
3696 except TypeError: pass
3697 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3698
3699 try: '%*.*s' % ('abc', 5)
3700 except TypeError: pass
3701 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3702
3703 try: '%s' % (1, 2)
3704 except TypeError: pass
3705 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3706
3707 try: '%' % None
3708 except ValueError: pass
3709 else: self.fail("'%' % None doesn't raise ValueError")
3710
3711 self.assertEqual('534253'.isdigit(), 1)
3712 self.assertEqual('534253x'.isdigit(), 0)
3713 self.assertEqual('%c' % 5, '\x05')
3714 self.assertEqual('%c' % '5', '5')
3715
3716 def test_deepcopy_recursive(self):
3717 # Testing deepcopy of recursive objects...
3718 class Node:
3719 pass
3720 a = Node()
3721 b = Node()
3722 a.b = b
3723 b.a = a
3724 z = deepcopy(a) # This blew up before
3725
3726 def test_unintialized_modules(self):
3727 # Testing uninitialized module objects...
3728 from types import ModuleType as M
3729 m = M.__new__(M)
3730 str(m)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003731 self.assertNotHasAttr(m, "__name__")
3732 self.assertNotHasAttr(m, "__file__")
3733 self.assertNotHasAttr(m, "foo")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003734 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003735 m.foo = 1
3736 self.assertEqual(m.__dict__, {"foo": 1})
3737
3738 def test_funny_new(self):
3739 # Testing __new__ returning something unexpected...
3740 class C(object):
3741 def __new__(cls, arg):
3742 if isinstance(arg, str): return [1, 2, 3]
3743 elif isinstance(arg, int): return object.__new__(D)
3744 else: return object.__new__(cls)
3745 class D(C):
3746 def __init__(self, arg):
3747 self.foo = arg
3748 self.assertEqual(C("1"), [1, 2, 3])
3749 self.assertEqual(D("1"), [1, 2, 3])
3750 d = D(None)
3751 self.assertEqual(d.foo, None)
3752 d = C(1)
3753 self.assertEqual(isinstance(d, D), True)
3754 self.assertEqual(d.foo, 1)
3755 d = D(1)
3756 self.assertEqual(isinstance(d, D), True)
3757 self.assertEqual(d.foo, 1)
3758
3759 def test_imul_bug(self):
3760 # Testing for __imul__ problems...
3761 # SF bug 544647
3762 class C(object):
3763 def __imul__(self, other):
3764 return (self, other)
3765 x = C()
3766 y = x
3767 y *= 1.0
3768 self.assertEqual(y, (x, 1.0))
3769 y = x
3770 y *= 2
3771 self.assertEqual(y, (x, 2))
3772 y = x
3773 y *= 3L
3774 self.assertEqual(y, (x, 3L))
3775 y = x
3776 y *= 1L<<100
3777 self.assertEqual(y, (x, 1L<<100))
3778 y = x
3779 y *= None
3780 self.assertEqual(y, (x, None))
3781 y = x
3782 y *= "foo"
3783 self.assertEqual(y, (x, "foo"))
3784
3785 def test_copy_setstate(self):
3786 # Testing that copy.*copy() correctly uses __setstate__...
3787 import copy
3788 class C(object):
3789 def __init__(self, foo=None):
3790 self.foo = foo
3791 self.__foo = foo
3792 def setfoo(self, foo=None):
3793 self.foo = foo
3794 def getfoo(self):
3795 return self.__foo
3796 def __getstate__(self):
3797 return [self.foo]
3798 def __setstate__(self_, lst):
3799 self.assertEqual(len(lst), 1)
3800 self_.__foo = self_.foo = lst[0]
3801 a = C(42)
3802 a.setfoo(24)
3803 self.assertEqual(a.foo, 24)
3804 self.assertEqual(a.getfoo(), 42)
3805 b = copy.copy(a)
3806 self.assertEqual(b.foo, 24)
3807 self.assertEqual(b.getfoo(), 24)
3808 b = copy.deepcopy(a)
3809 self.assertEqual(b.foo, 24)
3810 self.assertEqual(b.getfoo(), 24)
3811
3812 def test_slices(self):
3813 # Testing cases with slices and overridden __getitem__ ...
3814
3815 # Strings
3816 self.assertEqual("hello"[:4], "hell")
3817 self.assertEqual("hello"[slice(4)], "hell")
3818 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3819 class S(str):
3820 def __getitem__(self, x):
3821 return str.__getitem__(self, x)
3822 self.assertEqual(S("hello")[:4], "hell")
3823 self.assertEqual(S("hello")[slice(4)], "hell")
3824 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3825 # Tuples
3826 self.assertEqual((1,2,3)[:2], (1,2))
3827 self.assertEqual((1,2,3)[slice(2)], (1,2))
3828 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3829 class T(tuple):
3830 def __getitem__(self, x):
3831 return tuple.__getitem__(self, x)
3832 self.assertEqual(T((1,2,3))[:2], (1,2))
3833 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3834 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3835 # Lists
3836 self.assertEqual([1,2,3][:2], [1,2])
3837 self.assertEqual([1,2,3][slice(2)], [1,2])
3838 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3839 class L(list):
3840 def __getitem__(self, x):
3841 return list.__getitem__(self, x)
3842 self.assertEqual(L([1,2,3])[:2], [1,2])
3843 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3844 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3845 # Now do lists and __setitem__
3846 a = L([1,2,3])
3847 a[slice(1, 3)] = [3,2]
3848 self.assertEqual(a, [1,3,2])
3849 a[slice(0, 2, 1)] = [3,1]
3850 self.assertEqual(a, [3,1,2])
3851 a.__setitem__(slice(1, 3), [2,1])
3852 self.assertEqual(a, [3,2,1])
3853 a.__setitem__(slice(0, 2, 1), [2,3])
3854 self.assertEqual(a, [2,3,1])
3855
3856 def test_subtype_resurrection(self):
3857 # Testing resurrection of new-style instance...
3858
3859 class C(object):
3860 container = []
3861
3862 def __del__(self):
3863 # resurrect the instance
3864 C.container.append(self)
3865
3866 c = C()
3867 c.attr = 42
3868
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003869 # The most interesting thing here is whether this blows up, due to
3870 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3871 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003872 del c
3873
3874 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003875 # the last container slot works: that will attempt to delete c again,
3876 # which will cause c to get appended back to the container again
3877 # "during" the del. (On non-CPython implementations, however, __del__
3878 # is typically not called again.)
3879 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003880 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003881 del C.container[-1]
3882 if test_support.check_impl_detail():
3883 test_support.gc_collect()
3884 self.assertEqual(len(C.container), 1)
3885 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003886
3887 # Make c mortal again, so that the test framework with -l doesn't report
3888 # it as a leak.
3889 del C.__del__
3890
3891 def test_slots_trash(self):
3892 # Testing slot trash...
3893 # Deallocating deeply nested slotted trash caused stack overflows
3894 class trash(object):
3895 __slots__ = ['x']
3896 def __init__(self, x):
3897 self.x = x
3898 o = None
3899 for i in xrange(50000):
3900 o = trash(o)
3901 del o
3902
3903 def test_slots_multiple_inheritance(self):
3904 # SF bug 575229, multiple inheritance w/ slots dumps core
3905 class A(object):
3906 __slots__=()
3907 class B(object):
3908 pass
3909 class C(A,B) :
3910 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003911 if test_support.check_impl_detail():
3912 self.assertEqual(C.__basicsize__, B.__basicsize__)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02003913 self.assertHasAttr(C, '__dict__')
3914 self.assertHasAttr(C, '__weakref__')
Georg Brandl48545522008-02-02 10:12:36 +00003915 C().x = 2
3916
3917 def test_rmul(self):
3918 # Testing correct invocation of __rmul__...
3919 # SF patch 592646
3920 class C(object):
3921 def __mul__(self, other):
3922 return "mul"
3923 def __rmul__(self, other):
3924 return "rmul"
3925 a = C()
3926 self.assertEqual(a*2, "mul")
3927 self.assertEqual(a*2.2, "mul")
3928 self.assertEqual(2*a, "rmul")
3929 self.assertEqual(2.2*a, "rmul")
3930
3931 def test_ipow(self):
3932 # Testing correct invocation of __ipow__...
3933 # [SF bug 620179]
3934 class C(object):
3935 def __ipow__(self, other):
3936 pass
3937 a = C()
3938 a **= 2
3939
3940 def test_mutable_bases(self):
3941 # Testing mutable bases...
3942
3943 # stuff that should work:
3944 class C(object):
3945 pass
3946 class C2(object):
3947 def __getattribute__(self, attr):
3948 if attr == 'a':
3949 return 2
3950 else:
3951 return super(C2, self).__getattribute__(attr)
3952 def meth(self):
3953 return 1
3954 class D(C):
3955 pass
3956 class E(D):
3957 pass
3958 d = D()
3959 e = E()
3960 D.__bases__ = (C,)
3961 D.__bases__ = (C2,)
3962 self.assertEqual(d.meth(), 1)
3963 self.assertEqual(e.meth(), 1)
3964 self.assertEqual(d.a, 2)
3965 self.assertEqual(e.a, 2)
3966 self.assertEqual(C2.__subclasses__(), [D])
3967
Georg Brandl48545522008-02-02 10:12:36 +00003968 try:
3969 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003970 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003971 pass
3972 else:
3973 self.fail("shouldn't be able to delete .__bases__")
3974
3975 try:
3976 D.__bases__ = ()
3977 except TypeError, msg:
3978 if str(msg) == "a new-style class can't have only classic bases":
3979 self.fail("wrong error message for .__bases__ = ()")
3980 else:
3981 self.fail("shouldn't be able to set .__bases__ to ()")
3982
3983 try:
3984 D.__bases__ = (D,)
3985 except TypeError:
3986 pass
3987 else:
3988 # actually, we'll have crashed by here...
3989 self.fail("shouldn't be able to create inheritance cycles")
3990
3991 try:
3992 D.__bases__ = (C, C)
3993 except TypeError:
3994 pass
3995 else:
3996 self.fail("didn't detect repeated base classes")
3997
3998 try:
3999 D.__bases__ = (E,)
4000 except TypeError:
4001 pass
4002 else:
4003 self.fail("shouldn't be able to create inheritance cycles")
4004
4005 # let's throw a classic class into the mix:
4006 class Classic:
4007 def meth2(self):
4008 return 3
4009
4010 D.__bases__ = (C, Classic)
4011
4012 self.assertEqual(d.meth2(), 3)
4013 self.assertEqual(e.meth2(), 3)
4014 try:
4015 d.a
4016 except AttributeError:
4017 pass
4018 else:
4019 self.fail("attribute should have vanished")
4020
4021 try:
4022 D.__bases__ = (Classic,)
4023 except TypeError:
4024 pass
4025 else:
4026 self.fail("new-style class must have a new-style base")
4027
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004028 def test_builtin_bases(self):
4029 # Make sure all the builtin types can have their base queried without
4030 # segfaulting. See issue #5787.
4031 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
4032 if isinstance(tp, type)]
4033 for tp in builtin_types:
4034 object.__getattribute__(tp, "__bases__")
4035 if tp is not object:
4036 self.assertEqual(len(tp.__bases__), 1, tp)
4037
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00004038 class L(list):
4039 pass
4040
4041 class C(object):
4042 pass
4043
4044 class D(C):
4045 pass
4046
4047 try:
4048 L.__bases__ = (dict,)
4049 except TypeError:
4050 pass
4051 else:
4052 self.fail("shouldn't turn list subclass into dict subclass")
4053
4054 try:
4055 list.__bases__ = (dict,)
4056 except TypeError:
4057 pass
4058 else:
4059 self.fail("shouldn't be able to assign to list.__bases__")
4060
4061 try:
4062 D.__bases__ = (C, list)
4063 except TypeError:
4064 pass
4065 else:
4066 assert 0, "best_base calculation found wanting"
4067
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004068
Georg Brandl48545522008-02-02 10:12:36 +00004069 def test_mutable_bases_with_failing_mro(self):
4070 # Testing mutable bases with failing mro...
4071 class WorkOnce(type):
4072 def __new__(self, name, bases, ns):
4073 self.flag = 0
4074 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
4075 def mro(self):
4076 if self.flag > 0:
4077 raise RuntimeError, "bozo"
4078 else:
4079 self.flag += 1
4080 return type.mro(self)
4081
4082 class WorkAlways(type):
4083 def mro(self):
4084 # this is here to make sure that .mro()s aren't called
4085 # with an exception set (which was possible at one point).
4086 # An error message will be printed in a debug build.
4087 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004088 return type.mro(self)
4089
Georg Brandl48545522008-02-02 10:12:36 +00004090 class C(object):
4091 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004092
Georg Brandl48545522008-02-02 10:12:36 +00004093 class C2(object):
4094 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004095
Georg Brandl48545522008-02-02 10:12:36 +00004096 class D(C):
4097 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004098
Georg Brandl48545522008-02-02 10:12:36 +00004099 class E(D):
4100 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004101
Georg Brandl48545522008-02-02 10:12:36 +00004102 class F(D):
4103 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004104
Georg Brandl48545522008-02-02 10:12:36 +00004105 class G(D):
4106 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004107
Georg Brandl48545522008-02-02 10:12:36 +00004108 # Immediate subclasses have their mro's adjusted in alphabetical
4109 # order, so E's will get adjusted before adjusting F's fails. We
4110 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004111
Georg Brandl48545522008-02-02 10:12:36 +00004112 E_mro_before = E.__mro__
4113 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004114
Armin Rigofd163f92005-12-29 15:59:19 +00004115 try:
Georg Brandl48545522008-02-02 10:12:36 +00004116 D.__bases__ = (C2,)
4117 except RuntimeError:
4118 self.assertEqual(E.__mro__, E_mro_before)
4119 self.assertEqual(D.__mro__, D_mro_before)
4120 else:
4121 self.fail("exception not propagated")
4122
4123 def test_mutable_bases_catch_mro_conflict(self):
4124 # Testing mutable bases catch mro conflict...
4125 class A(object):
4126 pass
4127
4128 class B(object):
4129 pass
4130
4131 class C(A, B):
4132 pass
4133
4134 class D(A, B):
4135 pass
4136
4137 class E(C, D):
4138 pass
4139
4140 try:
4141 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004142 except TypeError:
4143 pass
4144 else:
Georg Brandl48545522008-02-02 10:12:36 +00004145 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004146
Georg Brandl48545522008-02-02 10:12:36 +00004147 def test_mutable_names(self):
4148 # Testing mutable names...
4149 class C(object):
4150 pass
4151
4152 # C.__module__ could be 'test_descr' or '__main__'
4153 mod = C.__module__
4154
4155 C.__name__ = 'D'
4156 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4157
4158 C.__name__ = 'D.E'
4159 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4160
Mark Dickinsonf794b142013-04-13 15:19:05 +01004161 def test_evil_type_name(self):
4162 # A badly placed Py_DECREF in type_set_name led to arbitrary code
4163 # execution while the type structure was not in a sane state, and a
4164 # possible segmentation fault as a result. See bug #16447.
4165 class Nasty(str):
4166 def __del__(self):
4167 C.__name__ = "other"
4168
4169 class C(object):
4170 pass
4171
4172 C.__name__ = Nasty("abc")
4173 C.__name__ = "normal"
4174
Georg Brandl48545522008-02-02 10:12:36 +00004175 def test_subclass_right_op(self):
4176 # Testing correct dispatch of subclass overloading __r<op>__...
4177
4178 # This code tests various cases where right-dispatch of a subclass
4179 # should be preferred over left-dispatch of a base class.
4180
4181 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4182
4183 class B(int):
4184 def __floordiv__(self, other):
4185 return "B.__floordiv__"
4186 def __rfloordiv__(self, other):
4187 return "B.__rfloordiv__"
4188
4189 self.assertEqual(B(1) // 1, "B.__floordiv__")
4190 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4191
4192 # Case 2: subclass of object; this is just the baseline for case 3
4193
4194 class C(object):
4195 def __floordiv__(self, other):
4196 return "C.__floordiv__"
4197 def __rfloordiv__(self, other):
4198 return "C.__rfloordiv__"
4199
4200 self.assertEqual(C() // 1, "C.__floordiv__")
4201 self.assertEqual(1 // C(), "C.__rfloordiv__")
4202
4203 # Case 3: subclass of new-style class; here it gets interesting
4204
4205 class D(C):
4206 def __floordiv__(self, other):
4207 return "D.__floordiv__"
4208 def __rfloordiv__(self, other):
4209 return "D.__rfloordiv__"
4210
4211 self.assertEqual(D() // C(), "D.__floordiv__")
4212 self.assertEqual(C() // D(), "D.__rfloordiv__")
4213
4214 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4215
4216 class E(C):
4217 pass
4218
4219 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4220
4221 self.assertEqual(E() // 1, "C.__floordiv__")
4222 self.assertEqual(1 // E(), "C.__rfloordiv__")
4223 self.assertEqual(E() // C(), "C.__floordiv__")
4224 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4225
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004226 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004227 def test_meth_class_get(self):
4228 # Testing __get__ method of METH_CLASS C methods...
4229 # Full coverage of descrobject.c::classmethod_get()
4230
4231 # Baseline
4232 arg = [1, 2, 3]
4233 res = {1: None, 2: None, 3: None}
4234 self.assertEqual(dict.fromkeys(arg), res)
4235 self.assertEqual({}.fromkeys(arg), res)
4236
4237 # Now get the descriptor
4238 descr = dict.__dict__["fromkeys"]
4239
4240 # More baseline using the descriptor directly
4241 self.assertEqual(descr.__get__(None, dict)(arg), res)
4242 self.assertEqual(descr.__get__({})(arg), res)
4243
4244 # Now check various error cases
4245 try:
4246 descr.__get__(None, None)
4247 except TypeError:
4248 pass
4249 else:
4250 self.fail("shouldn't have allowed descr.__get__(None, None)")
4251 try:
4252 descr.__get__(42)
4253 except TypeError:
4254 pass
4255 else:
4256 self.fail("shouldn't have allowed descr.__get__(42)")
4257 try:
4258 descr.__get__(None, 42)
4259 except TypeError:
4260 pass
4261 else:
4262 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4263 try:
4264 descr.__get__(None, int)
4265 except TypeError:
4266 pass
4267 else:
4268 self.fail("shouldn't have allowed descr.__get__(None, int)")
4269
4270 def test_isinst_isclass(self):
4271 # Testing proxy isinstance() and isclass()...
4272 class Proxy(object):
4273 def __init__(self, obj):
4274 self.__obj = obj
4275 def __getattribute__(self, name):
4276 if name.startswith("_Proxy__"):
4277 return object.__getattribute__(self, name)
4278 else:
4279 return getattr(self.__obj, name)
4280 # Test with a classic class
4281 class C:
4282 pass
4283 a = C()
4284 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004285 self.assertIsInstance(a, C) # Baseline
4286 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004287 # Test with a classic subclass
4288 class D(C):
4289 pass
4290 a = D()
4291 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004292 self.assertIsInstance(a, C) # Baseline
4293 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004294 # Test with a new-style class
4295 class C(object):
4296 pass
4297 a = C()
4298 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004299 self.assertIsInstance(a, C) # Baseline
4300 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004301 # Test with a new-style subclass
4302 class D(C):
4303 pass
4304 a = D()
4305 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004306 self.assertIsInstance(a, C) # Baseline
4307 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004308
4309 def test_proxy_super(self):
4310 # Testing super() for a proxy object...
4311 class Proxy(object):
4312 def __init__(self, obj):
4313 self.__obj = obj
4314 def __getattribute__(self, name):
4315 if name.startswith("_Proxy__"):
4316 return object.__getattribute__(self, name)
4317 else:
4318 return getattr(self.__obj, name)
4319
4320 class B(object):
4321 def f(self):
4322 return "B.f"
4323
4324 class C(B):
4325 def f(self):
4326 return super(C, self).f() + "->C.f"
4327
4328 obj = C()
4329 p = Proxy(obj)
4330 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4331
4332 def test_carloverre(self):
4333 # Testing prohibition of Carlo Verre's hack...
4334 try:
4335 object.__setattr__(str, "foo", 42)
4336 except TypeError:
4337 pass
4338 else:
Ezio Melottic2077b02011-03-16 12:34:31 +02004339 self.fail("Carlo Verre __setattr__ succeeded!")
Georg Brandl48545522008-02-02 10:12:36 +00004340 try:
4341 object.__delattr__(str, "lower")
4342 except TypeError:
4343 pass
4344 else:
4345 self.fail("Carlo Verre __delattr__ succeeded!")
4346
4347 def test_weakref_segfault(self):
4348 # Testing weakref segfault...
4349 # SF 742911
4350 import weakref
4351
4352 class Provoker:
4353 def __init__(self, referrent):
4354 self.ref = weakref.ref(referrent)
4355
4356 def __del__(self):
4357 x = self.ref()
4358
4359 class Oops(object):
4360 pass
4361
4362 o = Oops()
4363 o.whatever = Provoker(o)
4364 del o
4365
4366 def test_wrapper_segfault(self):
4367 # SF 927248: deeply nested wrappers could cause stack overflow
4368 f = lambda:None
4369 for i in xrange(1000000):
4370 f = f.__call__
4371 f = None
4372
4373 def test_file_fault(self):
4374 # Testing sys.stdout is changed in getattr...
Nick Coghlan0447cd62009-10-17 06:33:05 +00004375 test_stdout = sys.stdout
Georg Brandl48545522008-02-02 10:12:36 +00004376 class StdoutGuard:
4377 def __getattr__(self, attr):
4378 sys.stdout = sys.__stdout__
4379 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4380 sys.stdout = StdoutGuard()
4381 try:
4382 print "Oops!"
4383 except RuntimeError:
4384 pass
Nick Coghlan0447cd62009-10-17 06:33:05 +00004385 finally:
4386 sys.stdout = test_stdout
Georg Brandl48545522008-02-02 10:12:36 +00004387
4388 def test_vicious_descriptor_nonsense(self):
4389 # Testing vicious_descriptor_nonsense...
4390
4391 # A potential segfault spotted by Thomas Wouters in mail to
4392 # python-dev 2003-04-17, turned into an example & fixed by Michael
4393 # Hudson just less than four months later...
4394
4395 class Evil(object):
4396 def __hash__(self):
4397 return hash('attr')
4398 def __eq__(self, other):
4399 del C.attr
4400 return 0
4401
4402 class Descr(object):
4403 def __get__(self, ob, type=None):
4404 return 1
4405
4406 class C(object):
4407 attr = Descr()
4408
4409 c = C()
4410 c.__dict__[Evil()] = 0
4411
4412 self.assertEqual(c.attr, 1)
4413 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004414 test_support.gc_collect()
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004415 self.assertNotHasAttr(c, 'attr')
Georg Brandl48545522008-02-02 10:12:36 +00004416
4417 def test_init(self):
4418 # SF 1155938
4419 class Foo(object):
4420 def __init__(self):
4421 return 10
4422 try:
4423 Foo()
4424 except TypeError:
4425 pass
4426 else:
4427 self.fail("did not test __init__() for None return")
4428
4429 def test_method_wrapper(self):
4430 # Testing method-wrapper objects...
4431 # <type 'method-wrapper'> did not support any reflection before 2.5
4432
4433 l = []
4434 self.assertEqual(l.__add__, l.__add__)
4435 self.assertEqual(l.__add__, [].__add__)
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004436 self.assertNotEqual(l.__add__, [5].__add__)
4437 self.assertNotEqual(l.__add__, l.__mul__)
4438 self.assertEqual(l.__add__.__name__, '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004439 if hasattr(l.__add__, '__self__'):
4440 # CPython
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004441 self.assertIs(l.__add__.__self__, l)
4442 self.assertIs(l.__add__.__objclass__, list)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004443 else:
4444 # Python implementations where [].__add__ is a normal bound method
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004445 self.assertIs(l.__add__.im_self, l)
4446 self.assertIs(l.__add__.im_class, list)
Georg Brandl48545522008-02-02 10:12:36 +00004447 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4448 try:
4449 hash(l.__add__)
4450 except TypeError:
4451 pass
4452 else:
4453 self.fail("no TypeError from hash([].__add__)")
4454
4455 t = ()
4456 t += (7,)
4457 self.assertEqual(t.__add__, (7,).__add__)
4458 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4459
4460 def test_not_implemented(self):
4461 # Testing NotImplemented...
4462 # all binary methods should be able to return a NotImplemented
Georg Brandl48545522008-02-02 10:12:36 +00004463 import operator
4464
4465 def specialmethod(self, other):
4466 return NotImplemented
4467
4468 def check(expr, x, y):
4469 try:
4470 exec expr in {'x': x, 'y': y, 'operator': operator}
4471 except TypeError:
4472 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004473 else:
Georg Brandl48545522008-02-02 10:12:36 +00004474 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004475
Georg Brandl48545522008-02-02 10:12:36 +00004476 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4477 # TypeErrors
4478 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4479 # ValueErrors instead of TypeErrors
4480 for metaclass in [type, types.ClassType]:
4481 for name, expr, iexpr in [
4482 ('__add__', 'x + y', 'x += y'),
4483 ('__sub__', 'x - y', 'x -= y'),
4484 ('__mul__', 'x * y', 'x *= y'),
4485 ('__truediv__', 'operator.truediv(x, y)', None),
4486 ('__floordiv__', 'operator.floordiv(x, y)', None),
4487 ('__div__', 'x / y', 'x /= y'),
4488 ('__mod__', 'x % y', 'x %= y'),
4489 ('__divmod__', 'divmod(x, y)', None),
4490 ('__pow__', 'x ** y', 'x **= y'),
4491 ('__lshift__', 'x << y', 'x <<= y'),
4492 ('__rshift__', 'x >> y', 'x >>= y'),
4493 ('__and__', 'x & y', 'x &= y'),
4494 ('__or__', 'x | y', 'x |= y'),
4495 ('__xor__', 'x ^ y', 'x ^= y'),
4496 ('__coerce__', 'coerce(x, y)', None)]:
4497 if name == '__coerce__':
4498 rname = name
4499 else:
4500 rname = '__r' + name[2:]
4501 A = metaclass('A', (), {name: specialmethod})
4502 B = metaclass('B', (), {rname: specialmethod})
4503 a = A()
4504 b = B()
4505 check(expr, a, a)
4506 check(expr, a, b)
4507 check(expr, b, a)
4508 check(expr, b, b)
4509 check(expr, a, N1)
4510 check(expr, a, N2)
4511 check(expr, N1, b)
4512 check(expr, N2, b)
4513 if iexpr:
4514 check(iexpr, a, a)
4515 check(iexpr, a, b)
4516 check(iexpr, b, a)
4517 check(iexpr, b, b)
4518 check(iexpr, a, N1)
4519 check(iexpr, a, N2)
4520 iname = '__i' + name[2:]
4521 C = metaclass('C', (), {iname: specialmethod})
4522 c = C()
4523 check(iexpr, c, a)
4524 check(iexpr, c, b)
4525 check(iexpr, c, N1)
4526 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004527
Georg Brandl48545522008-02-02 10:12:36 +00004528 def test_assign_slice(self):
4529 # ceval.c's assign_slice used to check for
4530 # tp->tp_as_sequence->sq_slice instead of
4531 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004532
Georg Brandl48545522008-02-02 10:12:36 +00004533 class C(object):
4534 def __setslice__(self, start, stop, value):
4535 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004536
Georg Brandl48545522008-02-02 10:12:36 +00004537 c = C()
4538 c[1:2] = 3
4539 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004540
Benjamin Peterson9179dab2010-01-18 23:07:56 +00004541 def test_set_and_no_get(self):
4542 # See
4543 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4544 class Descr(object):
4545
4546 def __init__(self, name):
4547 self.name = name
4548
4549 def __set__(self, obj, value):
4550 obj.__dict__[self.name] = value
4551 descr = Descr("a")
4552
4553 class X(object):
4554 a = descr
4555
4556 x = X()
4557 self.assertIs(x.a, descr)
4558 x.a = 42
4559 self.assertEqual(x.a, 42)
4560
Benjamin Peterson42d59472010-02-06 20:14:10 +00004561 # Also check type_getattro for correctness.
4562 class Meta(type):
4563 pass
4564 class X(object):
4565 __metaclass__ = Meta
4566 X.a = 42
4567 Meta.a = Descr("a")
4568 self.assertEqual(X.a, 42)
4569
Benjamin Peterson273c2332008-11-17 22:39:09 +00004570 def test_getattr_hooks(self):
4571 # issue 4230
4572
4573 class Descriptor(object):
4574 counter = 0
4575 def __get__(self, obj, objtype=None):
4576 def getter(name):
4577 self.counter += 1
4578 raise AttributeError(name)
4579 return getter
4580
4581 descr = Descriptor()
4582 class A(object):
4583 __getattribute__ = descr
4584 class B(object):
4585 __getattr__ = descr
4586 class C(object):
4587 __getattribute__ = descr
4588 __getattr__ = descr
4589
4590 self.assertRaises(AttributeError, getattr, A(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004591 self.assertEqual(descr.counter, 1)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004592 self.assertRaises(AttributeError, getattr, B(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004593 self.assertEqual(descr.counter, 2)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004594 self.assertRaises(AttributeError, getattr, C(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004595 self.assertEqual(descr.counter, 4)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004596
Benjamin Peterson273c2332008-11-17 22:39:09 +00004597 class EvilGetattribute(object):
4598 # This used to segfault
4599 def __getattr__(self, name):
4600 raise AttributeError(name)
4601 def __getattribute__(self, name):
4602 del EvilGetattribute.__getattr__
4603 for i in range(5):
4604 gc.collect()
4605 raise AttributeError(name)
4606
4607 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4608
Benjamin Peterson6e7832b2012-03-16 09:32:59 -05004609 def test_type___getattribute__(self):
4610 self.assertRaises(TypeError, type.__getattribute__, list, type)
4611
Benjamin Peterson9b911ca2011-01-12 15:49:47 +00004612 def test_abstractmethods(self):
4613 # type pretends not to have __abstractmethods__.
4614 self.assertRaises(AttributeError, getattr, type, "__abstractmethods__")
4615 class meta(type):
4616 pass
4617 self.assertRaises(AttributeError, getattr, meta, "__abstractmethods__")
4618 class X(object):
4619 pass
4620 with self.assertRaises(AttributeError):
4621 del X.__abstractmethods__
4622
Victor Stinnere363ec12011-05-01 23:43:37 +02004623 def test_proxy_call(self):
4624 class FakeStr(object):
4625 __class__ = str
4626
4627 fake_str = FakeStr()
4628 # isinstance() reads __class__ on new style classes
Serhiy Storchaka000b4c52013-11-17 23:39:24 +02004629 self.assertIsInstance(fake_str, str)
Victor Stinnere363ec12011-05-01 23:43:37 +02004630
4631 # call a method descriptor
4632 with self.assertRaises(TypeError):
4633 str.split(fake_str)
4634
4635 # call a slot wrapper descriptor
4636 with self.assertRaises(TypeError):
4637 str.__add__(fake_str, "abc")
4638
Antoine Pitrou304f0f92011-07-15 21:22:50 +02004639 def test_repr_as_str(self):
4640 # Issue #11603: crash or infinite loop when rebinding __str__ as
4641 # __repr__.
4642 class Foo(object):
4643 pass
4644 Foo.__repr__ = Foo.__str__
4645 foo = Foo()
Benjamin Petersond157a4c2012-04-24 11:06:25 -04004646 self.assertRaises(RuntimeError, str, foo)
4647 self.assertRaises(RuntimeError, repr, foo)
4648
4649 def test_mixing_slot_wrappers(self):
4650 class X(dict):
4651 __setattr__ = dict.__setitem__
4652 x = X()
4653 x.y = 42
4654 self.assertEqual(x["y"], 42)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004655
Benjamin Petersona8d45852012-03-07 18:41:11 -06004656 def test_cycle_through_dict(self):
4657 # See bug #1469629
4658 class X(dict):
4659 def __init__(self):
4660 dict.__init__(self)
4661 self.__dict__ = self
4662 x = X()
4663 x.attr = 42
4664 wr = weakref.ref(x)
4665 del x
4666 test_support.gc_collect()
4667 self.assertIsNone(wr())
4668 for o in gc.get_objects():
4669 self.assertIsNot(type(o), X)
4670
Georg Brandl48545522008-02-02 10:12:36 +00004671class DictProxyTests(unittest.TestCase):
4672 def setUp(self):
4673 class C(object):
4674 def meth(self):
4675 pass
4676 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004677
Raymond Hettingerbf7a2662011-06-30 00:44:36 +01004678 def test_repr(self):
4679 self.assertIn('dict_proxy({', repr(vars(self.C)))
4680 self.assertIn("'meth':", repr(vars(self.C)))
4681
Georg Brandl48545522008-02-02 10:12:36 +00004682 def test_iter_keys(self):
4683 # Testing dict-proxy iterkeys...
4684 keys = [ key for key in self.C.__dict__.iterkeys() ]
4685 keys.sort()
Ezio Melotti2623a372010-11-21 13:34:58 +00004686 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
Georg Brandl48545522008-02-02 10:12:36 +00004687 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004688
Georg Brandl48545522008-02-02 10:12:36 +00004689 def test_iter_values(self):
4690 # Testing dict-proxy itervalues...
4691 values = [ values for values in self.C.__dict__.itervalues() ]
4692 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004693
Georg Brandl48545522008-02-02 10:12:36 +00004694 def test_iter_items(self):
4695 # Testing dict-proxy iteritems...
4696 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4697 keys.sort()
4698 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4699 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004700
Georg Brandl48545522008-02-02 10:12:36 +00004701 def test_dict_type_with_metaclass(self):
4702 # Testing type of __dict__ when __metaclass__ set...
4703 class B(object):
4704 pass
4705 class M(type):
4706 pass
4707 class C:
4708 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4709 __metaclass__ = M
4710 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004711
Guido van Rossum9acc3872008-01-23 23:23:43 +00004712
Georg Brandl48545522008-02-02 10:12:36 +00004713class PTypesLongInitTest(unittest.TestCase):
4714 # This is in its own TestCase so that it can be run before any other tests.
4715 def test_pytype_long_ready(self):
4716 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004717
Georg Brandl48545522008-02-02 10:12:36 +00004718 # This dumps core when SF bug 551412 isn't fixed --
4719 # but only when test_descr.py is run separately.
4720 # (That can't be helped -- as soon as PyType_Ready()
4721 # is called for PyLong_Type, the bug is gone.)
4722 class UserLong(object):
4723 def __pow__(self, *args):
4724 pass
4725 try:
4726 pow(0L, UserLong(), 0L)
4727 except:
4728 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004729
Georg Brandl48545522008-02-02 10:12:36 +00004730 # Another segfault only when run early
4731 # (before PyType_Ready(tuple) is called)
4732 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004733
4734
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004735def test_main():
Florent Xicluna6257a7b2010-03-31 22:01:03 +00004736 deprecations = [(r'complex divmod\(\), // and % are deprecated$',
4737 DeprecationWarning)]
4738 if sys.py3kwarning:
4739 deprecations += [
Florent Xicluna07627882010-03-21 01:14:24 +00004740 ("classic (int|long) division", DeprecationWarning),
4741 ("coerce.. not supported", DeprecationWarning),
Florent Xicluna6257a7b2010-03-31 22:01:03 +00004742 (".+__(get|set|del)slice__ has been removed", DeprecationWarning)]
4743 with test_support.check_warnings(*deprecations):
Florent Xicluna07627882010-03-21 01:14:24 +00004744 # Run all local test cases, with PTypesLongInitTest first.
4745 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4746 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004747
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004748if __name__ == "__main__":
4749 test_main()