blob: 10b5af9250cf2f6ee7028e6573c3df756f0de3bd [file] [log] [blame]
Benjamin Petersond4d400c2009-04-18 20:12:47 +00001import __builtin__
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00002import sys
Armin Rigo9790a272007-05-02 19:23:31 +00003import types
Georg Brandl48545522008-02-02 10:12:36 +00004import unittest
5import warnings
Tim Peters4d9b4662002-04-16 01:59:17 +00006
Georg Brandl48545522008-02-02 10:12:36 +00007from copy import deepcopy
8from test import test_support
Tim Peters6d6c1a32001-08-02 04:15:00 +00009
Guido van Rossum875eeaa2001-10-11 18:33:53 +000010
Georg Brandl48545522008-02-02 10:12:36 +000011class OperatorsTest(unittest.TestCase):
Tim Peters6d6c1a32001-08-02 04:15:00 +000012
Georg Brandl48545522008-02-02 10:12:36 +000013 def __init__(self, *args, **kwargs):
14 unittest.TestCase.__init__(self, *args, **kwargs)
15 self.binops = {
16 'add': '+',
17 'sub': '-',
18 'mul': '*',
19 'div': '/',
20 'divmod': 'divmod',
21 'pow': '**',
22 'lshift': '<<',
23 'rshift': '>>',
24 'and': '&',
25 'xor': '^',
26 'or': '|',
27 'cmp': 'cmp',
28 'lt': '<',
29 'le': '<=',
30 'eq': '==',
31 'ne': '!=',
32 'gt': '>',
33 'ge': '>=',
34 }
Tim Peters3caca232001-12-06 06:23:26 +000035
Georg Brandl48545522008-02-02 10:12:36 +000036 for name, expr in self.binops.items():
37 if expr.islower():
38 expr = expr + "(a, b)"
39 else:
40 expr = 'a %s b' % expr
41 self.binops[name] = expr
Tim Peters3caca232001-12-06 06:23:26 +000042
Georg Brandl48545522008-02-02 10:12:36 +000043 self.unops = {
44 'pos': '+',
45 'neg': '-',
46 'abs': 'abs',
47 'invert': '~',
48 'int': 'int',
49 'long': 'long',
50 'float': 'float',
51 'oct': 'oct',
52 'hex': 'hex',
53 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000054
Georg Brandl48545522008-02-02 10:12:36 +000055 for name, expr in self.unops.items():
56 if expr.islower():
57 expr = expr + "(a)"
58 else:
59 expr = '%s a' % expr
60 self.unops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000061
Georg Brandl48545522008-02-02 10:12:36 +000062 def setUp(self):
63 self.original_filters = warnings.filters[:]
64 warnings.filterwarnings("ignore",
65 r'complex divmod\(\), // and % are deprecated$',
66 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000067
Georg Brandl48545522008-02-02 10:12:36 +000068 def tearDown(self):
69 warnings.filters = self.original_filters
Tim Peters6d6c1a32001-08-02 04:15:00 +000070
Georg Brandl48545522008-02-02 10:12:36 +000071 def unop_test(self, a, res, expr="len(a)", meth="__len__"):
72 d = {'a': a}
73 self.assertEqual(eval(expr, d), res)
74 t = type(a)
75 m = getattr(t, meth)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076
Georg Brandl48545522008-02-02 10:12:36 +000077 # Find method in parent class
78 while meth not in t.__dict__:
79 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +000080 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
81 # method object; the getattr() below obtains its underlying function.
82 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +000083 self.assertEqual(m(a), res)
84 bm = getattr(a, meth)
85 self.assertEqual(bm(), res)
Tim Peters2f93e282001-10-04 05:27:00 +000086
Georg Brandl48545522008-02-02 10:12:36 +000087 def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
88 d = {'a': a, 'b': b}
Tim Peters2f93e282001-10-04 05:27:00 +000089
Georg Brandl48545522008-02-02 10:12:36 +000090 # XXX Hack so this passes before 2.3 when -Qnew is specified.
91 if meth == "__div__" and 1/2 == 0.5:
92 meth = "__truediv__"
Tim Peters2f93e282001-10-04 05:27:00 +000093
Georg Brandl48545522008-02-02 10:12:36 +000094 if meth == '__divmod__': pass
Tim Peters2f93e282001-10-04 05:27:00 +000095
Georg Brandl48545522008-02-02 10:12:36 +000096 self.assertEqual(eval(expr, d), res)
97 t = type(a)
98 m = getattr(t, meth)
99 while meth not in t.__dict__:
100 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000101 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
102 # method object; the getattr() below obtains its underlying function.
103 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000104 self.assertEqual(m(a, b), res)
105 bm = getattr(a, meth)
106 self.assertEqual(bm(b), res)
Tim Peters2f93e282001-10-04 05:27:00 +0000107
Georg Brandl48545522008-02-02 10:12:36 +0000108 def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"):
109 d = {'a': a, 'b': b, 'c': c}
110 self.assertEqual(eval(expr, d), res)
111 t = type(a)
112 m = getattr(t, meth)
113 while meth not in t.__dict__:
114 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000115 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
116 # method object; the getattr() below obtains its underlying function.
117 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000118 self.assertEqual(m(a, b, c), res)
119 bm = getattr(a, meth)
120 self.assertEqual(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000121
Georg Brandl48545522008-02-02 10:12:36 +0000122 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
123 d = {'a': deepcopy(a), 'b': b}
124 exec stmt in d
125 self.assertEqual(d['a'], res)
126 t = type(a)
127 m = getattr(t, meth)
128 while meth not in t.__dict__:
129 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000130 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
131 # method object; the getattr() below obtains its underlying function.
132 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000133 d['a'] = deepcopy(a)
134 m(d['a'], b)
135 self.assertEqual(d['a'], res)
136 d['a'] = deepcopy(a)
137 bm = getattr(d['a'], meth)
138 bm(b)
139 self.assertEqual(d['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000140
Georg Brandl48545522008-02-02 10:12:36 +0000141 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
142 d = {'a': deepcopy(a), 'b': b, 'c': c}
143 exec stmt in d
144 self.assertEqual(d['a'], res)
145 t = type(a)
146 m = getattr(t, meth)
147 while meth not in t.__dict__:
148 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000149 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
150 # method object; the getattr() below obtains its underlying function.
151 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000152 d['a'] = deepcopy(a)
153 m(d['a'], b, c)
154 self.assertEqual(d['a'], res)
155 d['a'] = deepcopy(a)
156 bm = getattr(d['a'], meth)
157 bm(b, c)
158 self.assertEqual(d['a'], res)
159
160 def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
161 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
162 exec stmt in dictionary
163 self.assertEqual(dictionary['a'], res)
164 t = type(a)
165 while meth not in t.__dict__:
166 t = t.__bases__[0]
167 m = getattr(t, meth)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000168 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
169 # method object; the getattr() below obtains its underlying function.
170 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000171 dictionary['a'] = deepcopy(a)
172 m(dictionary['a'], b, c, d)
173 self.assertEqual(dictionary['a'], res)
174 dictionary['a'] = deepcopy(a)
175 bm = getattr(dictionary['a'], meth)
176 bm(b, c, d)
177 self.assertEqual(dictionary['a'], res)
178
179 def test_lists(self):
180 # Testing list operations...
181 # Asserts are within individual test methods
182 self.binop_test([1], [2], [1,2], "a+b", "__add__")
183 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
184 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
185 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
186 self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
187 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
188 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
189 self.unop_test([1,2,3], 3, "len(a)", "__len__")
190 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
191 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
192 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
193 self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
194 "__setslice__")
195
196 def test_dicts(self):
197 # Testing dict operations...
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000198 if hasattr(dict, '__cmp__'): # PyPy has only rich comparison on dicts
199 self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
200 else:
201 self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__")
Georg Brandl48545522008-02-02 10:12:36 +0000202 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
203 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
204 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
205
206 d = {1:2, 3:4}
207 l1 = []
208 for i in d.keys():
209 l1.append(i)
210 l = []
211 for i in iter(d):
212 l.append(i)
213 self.assertEqual(l, l1)
214 l = []
215 for i in d.__iter__():
216 l.append(i)
217 self.assertEqual(l, l1)
218 l = []
219 for i in dict.__iter__(d):
220 l.append(i)
221 self.assertEqual(l, l1)
222 d = {1:2, 3:4}
223 self.unop_test(d, 2, "len(a)", "__len__")
224 self.assertEqual(eval(repr(d), {}), d)
225 self.assertEqual(eval(d.__repr__(), {}), d)
226 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
227 "__setitem__")
228
229 # Tests for unary and binary operators
230 def number_operators(self, a, b, skip=[]):
231 dict = {'a': a, 'b': b}
232
233 for name, expr in self.binops.items():
234 if name not in skip:
235 name = "__%s__" % name
236 if hasattr(a, name):
237 res = eval(expr, dict)
238 self.binop_test(a, b, res, expr, name)
239
240 for name, expr in self.unops.items():
241 if name not in skip:
242 name = "__%s__" % name
243 if hasattr(a, name):
244 res = eval(expr, dict)
245 self.unop_test(a, res, expr, name)
246
247 def test_ints(self):
248 # Testing int operations...
249 self.number_operators(100, 3)
250 # The following crashes in Python 2.2
251 self.assertEqual((1).__nonzero__(), 1)
252 self.assertEqual((0).__nonzero__(), 0)
253 # This returns 'NotImplemented' in Python 2.2
254 class C(int):
255 def __add__(self, other):
256 return NotImplemented
257 self.assertEqual(C(5L), 5)
Tim Peters25786c02001-09-02 08:22:48 +0000258 try:
Georg Brandl48545522008-02-02 10:12:36 +0000259 C() + ""
Tim Peters25786c02001-09-02 08:22:48 +0000260 except TypeError:
261 pass
262 else:
Georg Brandl48545522008-02-02 10:12:36 +0000263 self.fail("NotImplemented should have caused TypeError")
264 import sys
Tim Peters1fc240e2001-10-26 05:06:50 +0000265 try:
Georg Brandl48545522008-02-02 10:12:36 +0000266 C(sys.maxint+1)
267 except OverflowError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000268 pass
269 else:
Georg Brandl48545522008-02-02 10:12:36 +0000270 self.fail("should have raised OverflowError")
Tim Peters1fc240e2001-10-26 05:06:50 +0000271
Georg Brandl48545522008-02-02 10:12:36 +0000272 def test_longs(self):
273 # Testing long operations...
274 self.number_operators(100L, 3L)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275
Georg Brandl48545522008-02-02 10:12:36 +0000276 def test_floats(self):
277 # Testing float operations...
278 self.number_operators(100.0, 3.0)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000279
Georg Brandl48545522008-02-02 10:12:36 +0000280 def test_complexes(self):
281 # Testing complex operations...
282 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
283 'int', 'long', 'float'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000284
Georg Brandl48545522008-02-02 10:12:36 +0000285 class Number(complex):
286 __slots__ = ['prec']
287 def __new__(cls, *args, **kwds):
288 result = complex.__new__(cls, *args)
289 result.prec = kwds.get('prec', 12)
290 return result
291 def __repr__(self):
292 prec = self.prec
293 if self.imag == 0.0:
294 return "%.*g" % (prec, self.real)
295 if self.real == 0.0:
296 return "%.*gj" % (prec, self.imag)
297 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
298 __str__ = __repr__
Tim Peters5d2b77c2001-09-03 05:47:38 +0000299
Georg Brandl48545522008-02-02 10:12:36 +0000300 a = Number(3.14, prec=6)
301 self.assertEqual(repr(a), "3.14")
302 self.assertEqual(a.prec, 6)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000303
Georg Brandl48545522008-02-02 10:12:36 +0000304 a = Number(a, prec=2)
305 self.assertEqual(repr(a), "3.1")
306 self.assertEqual(a.prec, 2)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000307
Georg Brandl48545522008-02-02 10:12:36 +0000308 a = Number(234.5)
309 self.assertEqual(repr(a), "234.5")
310 self.assertEqual(a.prec, 12)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000311
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000312 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000313 def test_spam_lists(self):
314 # Testing spamlist operations...
315 import copy, xxsubtype as spam
Tim Peters37a309d2001-09-04 01:20:04 +0000316
Georg Brandl48545522008-02-02 10:12:36 +0000317 def spamlist(l, memo=None):
318 import xxsubtype as spam
319 return spam.spamlist(l)
Tim Peters37a309d2001-09-04 01:20:04 +0000320
Georg Brandl48545522008-02-02 10:12:36 +0000321 # This is an ugly hack:
322 copy._deepcopy_dispatch[spam.spamlist] = spamlist
Tim Peters37a309d2001-09-04 01:20:04 +0000323
Georg Brandl48545522008-02-02 10:12:36 +0000324 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
325 "__add__")
326 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
327 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
328 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
329 self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
330 "__getslice__")
331 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
332 "__iadd__")
333 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
334 "__imul__")
335 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
336 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
337 "__mul__")
338 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
339 "__rmul__")
340 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
341 "__setitem__")
342 self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
343 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
344 # Test subclassing
345 class C(spam.spamlist):
346 def foo(self): return 1
347 a = C()
348 self.assertEqual(a, [])
349 self.assertEqual(a.foo(), 1)
350 a.append(100)
351 self.assertEqual(a, [100])
352 self.assertEqual(a.getstate(), 0)
353 a.setstate(42)
354 self.assertEqual(a.getstate(), 42)
Tim Peters37a309d2001-09-04 01:20:04 +0000355
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000356 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000357 def test_spam_dicts(self):
358 # Testing spamdict operations...
359 import copy, xxsubtype as spam
360 def spamdict(d, memo=None):
361 import xxsubtype as spam
362 sd = spam.spamdict()
363 for k, v in d.items():
364 sd[k] = v
365 return sd
366 # This is an ugly hack:
367 copy._deepcopy_dispatch[spam.spamdict] = spamdict
Tim Peters37a309d2001-09-04 01:20:04 +0000368
Georg Brandl48545522008-02-02 10:12:36 +0000369 self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
370 "__cmp__")
371 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
372 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
373 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
374 d = spamdict({1:2,3:4})
375 l1 = []
376 for i in d.keys():
377 l1.append(i)
378 l = []
379 for i in iter(d):
380 l.append(i)
381 self.assertEqual(l, l1)
382 l = []
383 for i in d.__iter__():
384 l.append(i)
385 self.assertEqual(l, l1)
386 l = []
387 for i in type(spamdict({})).__iter__(d):
388 l.append(i)
389 self.assertEqual(l, l1)
390 straightd = {1:2, 3:4}
391 spamd = spamdict(straightd)
392 self.unop_test(spamd, 2, "len(a)", "__len__")
393 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
394 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
395 "a[b]=c", "__setitem__")
396 # Test subclassing
397 class C(spam.spamdict):
398 def foo(self): return 1
399 a = C()
400 self.assertEqual(a.items(), [])
401 self.assertEqual(a.foo(), 1)
402 a['foo'] = 'bar'
403 self.assertEqual(a.items(), [('foo', 'bar')])
404 self.assertEqual(a.getstate(), 0)
405 a.setstate(100)
406 self.assertEqual(a.getstate(), 100)
Tim Peters37a309d2001-09-04 01:20:04 +0000407
Georg Brandl48545522008-02-02 10:12:36 +0000408class ClassPropertiesAndMethods(unittest.TestCase):
Tim Peters37a309d2001-09-04 01:20:04 +0000409
Georg Brandl48545522008-02-02 10:12:36 +0000410 def test_python_dicts(self):
411 # Testing Python subclass of dict...
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000412 self.assertTrue(issubclass(dict, dict))
413 self.assertTrue(isinstance({}, dict))
Georg Brandl48545522008-02-02 10:12:36 +0000414 d = dict()
415 self.assertEqual(d, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000416 self.assertTrue(d.__class__ is dict)
417 self.assertTrue(isinstance(d, dict))
Georg Brandl48545522008-02-02 10:12:36 +0000418 class C(dict):
419 state = -1
420 def __init__(self_local, *a, **kw):
421 if a:
422 self.assertEqual(len(a), 1)
423 self_local.state = a[0]
424 if kw:
425 for k, v in kw.items():
426 self_local[v] = k
427 def __getitem__(self, key):
428 return self.get(key, 0)
429 def __setitem__(self_local, key, value):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000430 self.assertTrue(isinstance(key, type(0)))
Georg Brandl48545522008-02-02 10:12:36 +0000431 dict.__setitem__(self_local, key, value)
432 def setstate(self, state):
433 self.state = state
434 def getstate(self):
435 return self.state
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000436 self.assertTrue(issubclass(C, dict))
Georg Brandl48545522008-02-02 10:12:36 +0000437 a1 = C(12)
438 self.assertEqual(a1.state, 12)
439 a2 = C(foo=1, bar=2)
440 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
441 a = C()
442 self.assertEqual(a.state, -1)
443 self.assertEqual(a.getstate(), -1)
444 a.setstate(0)
445 self.assertEqual(a.state, 0)
446 self.assertEqual(a.getstate(), 0)
447 a.setstate(10)
448 self.assertEqual(a.state, 10)
449 self.assertEqual(a.getstate(), 10)
450 self.assertEqual(a[42], 0)
451 a[42] = 24
452 self.assertEqual(a[42], 24)
453 N = 50
454 for i in range(N):
455 a[i] = C()
456 for j in range(N):
457 a[i][j] = i*j
458 for i in range(N):
459 for j in range(N):
460 self.assertEqual(a[i][j], i*j)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000461
Georg Brandl48545522008-02-02 10:12:36 +0000462 def test_python_lists(self):
463 # Testing Python subclass of list...
464 class C(list):
465 def __getitem__(self, i):
466 return list.__getitem__(self, i) + 100
467 def __getslice__(self, i, j):
468 return (i, j)
469 a = C()
470 a.extend([0,1,2])
471 self.assertEqual(a[0], 100)
472 self.assertEqual(a[1], 101)
473 self.assertEqual(a[2], 102)
474 self.assertEqual(a[100:200], (100,200))
Tim Peterscaaff8d2001-09-10 23:12:14 +0000475
Georg Brandl48545522008-02-02 10:12:36 +0000476 def test_metaclass(self):
477 # Testing __metaclass__...
478 class C:
Guido van Rossume54616c2001-12-14 04:19:56 +0000479 __metaclass__ = type
Georg Brandl48545522008-02-02 10:12:36 +0000480 def __init__(self):
481 self.__state = 0
482 def getstate(self):
483 return self.__state
484 def setstate(self, state):
485 self.__state = state
486 a = C()
487 self.assertEqual(a.getstate(), 0)
488 a.setstate(10)
489 self.assertEqual(a.getstate(), 10)
490 class D:
491 class __metaclass__(type):
492 def myself(cls): return cls
493 self.assertEqual(D.myself(), D)
494 d = D()
495 self.assertEqual(d.__class__, D)
496 class M1(type):
497 def __new__(cls, name, bases, dict):
498 dict['__spam__'] = 1
499 return type.__new__(cls, name, bases, dict)
500 class C:
501 __metaclass__ = M1
502 self.assertEqual(C.__spam__, 1)
503 c = C()
504 self.assertEqual(c.__spam__, 1)
Guido van Rossume54616c2001-12-14 04:19:56 +0000505
Georg Brandl48545522008-02-02 10:12:36 +0000506 class _instance(object):
507 pass
508 class M2(object):
509 @staticmethod
510 def __new__(cls, name, bases, dict):
511 self = object.__new__(cls)
512 self.name = name
513 self.bases = bases
514 self.dict = dict
515 return self
516 def __call__(self):
517 it = _instance()
518 # Early binding of methods
519 for key in self.dict:
520 if key.startswith("__"):
521 continue
522 setattr(it, key, self.dict[key].__get__(it, self))
523 return it
524 class C:
525 __metaclass__ = M2
526 def spam(self):
527 return 42
528 self.assertEqual(C.name, 'C')
529 self.assertEqual(C.bases, ())
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000530 self.assertTrue('spam' in C.dict)
Georg Brandl48545522008-02-02 10:12:36 +0000531 c = C()
532 self.assertEqual(c.spam(), 42)
Guido van Rossum9a818922002-11-14 19:50:14 +0000533
Georg Brandl48545522008-02-02 10:12:36 +0000534 # More metaclass examples
Guido van Rossum9a818922002-11-14 19:50:14 +0000535
Georg Brandl48545522008-02-02 10:12:36 +0000536 class autosuper(type):
537 # Automatically add __super to the class
538 # This trick only works for dynamic classes
539 def __new__(metaclass, name, bases, dict):
540 cls = super(autosuper, metaclass).__new__(metaclass,
541 name, bases, dict)
542 # Name mangling for __super removes leading underscores
543 while name[:1] == "_":
544 name = name[1:]
545 if name:
546 name = "_%s__super" % name
547 else:
548 name = "__super"
549 setattr(cls, name, super(cls))
550 return cls
551 class A:
552 __metaclass__ = autosuper
553 def meth(self):
554 return "A"
555 class B(A):
556 def meth(self):
557 return "B" + self.__super.meth()
558 class C(A):
559 def meth(self):
560 return "C" + self.__super.meth()
561 class D(C, B):
562 def meth(self):
563 return "D" + self.__super.meth()
564 self.assertEqual(D().meth(), "DCBA")
565 class E(B, C):
566 def meth(self):
567 return "E" + self.__super.meth()
568 self.assertEqual(E().meth(), "EBCA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000569
Georg Brandl48545522008-02-02 10:12:36 +0000570 class autoproperty(type):
571 # Automatically create property attributes when methods
572 # named _get_x and/or _set_x are found
573 def __new__(metaclass, name, bases, dict):
574 hits = {}
575 for key, val in dict.iteritems():
576 if key.startswith("_get_"):
577 key = key[5:]
578 get, set = hits.get(key, (None, None))
579 get = val
580 hits[key] = get, set
581 elif key.startswith("_set_"):
582 key = key[5:]
583 get, set = hits.get(key, (None, None))
584 set = val
585 hits[key] = get, set
586 for key, (get, set) in hits.iteritems():
587 dict[key] = property(get, set)
588 return super(autoproperty, metaclass).__new__(metaclass,
589 name, bases, dict)
590 class A:
591 __metaclass__ = autoproperty
592 def _get_x(self):
593 return -self.__x
594 def _set_x(self, x):
595 self.__x = -x
596 a = A()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000597 self.assertTrue(not hasattr(a, "x"))
Georg Brandl48545522008-02-02 10:12:36 +0000598 a.x = 12
599 self.assertEqual(a.x, 12)
600 self.assertEqual(a._A__x, -12)
Guido van Rossum9a818922002-11-14 19:50:14 +0000601
Georg Brandl48545522008-02-02 10:12:36 +0000602 class multimetaclass(autoproperty, autosuper):
603 # Merge of multiple cooperating metaclasses
604 pass
605 class A:
606 __metaclass__ = multimetaclass
607 def _get_x(self):
608 return "A"
609 class B(A):
610 def _get_x(self):
611 return "B" + self.__super._get_x()
612 class C(A):
613 def _get_x(self):
614 return "C" + self.__super._get_x()
615 class D(C, B):
616 def _get_x(self):
617 return "D" + self.__super._get_x()
618 self.assertEqual(D().x, "DCBA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000619
Georg Brandl48545522008-02-02 10:12:36 +0000620 # Make sure type(x) doesn't call x.__class__.__init__
621 class T(type):
622 counter = 0
623 def __init__(self, *args):
624 T.counter += 1
625 class C:
626 __metaclass__ = T
627 self.assertEqual(T.counter, 1)
628 a = C()
629 self.assertEqual(type(a), C)
630 self.assertEqual(T.counter, 1)
Guido van Rossum9a818922002-11-14 19:50:14 +0000631
Georg Brandl48545522008-02-02 10:12:36 +0000632 class C(object): pass
633 c = C()
634 try: c()
635 except TypeError: pass
636 else: self.fail("calling object w/o call method should raise "
637 "TypeError")
Guido van Rossum9a818922002-11-14 19:50:14 +0000638
Georg Brandl48545522008-02-02 10:12:36 +0000639 # Testing code to find most derived baseclass
640 class A(type):
641 def __new__(*args, **kwargs):
642 return type.__new__(*args, **kwargs)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000643
Georg Brandl48545522008-02-02 10:12:36 +0000644 class B(object):
645 pass
646
647 class C(object):
648 __metaclass__ = A
649
650 # The most derived metaclass of D is A rather than type.
651 class D(B, C):
652 pass
653
654 def test_module_subclasses(self):
655 # Testing Python subclass of module...
656 log = []
657 import types, sys
658 MT = type(sys)
659 class MM(MT):
660 def __init__(self, name):
661 MT.__init__(self, name)
662 def __getattribute__(self, name):
663 log.append(("getattr", name))
664 return MT.__getattribute__(self, name)
665 def __setattr__(self, name, value):
666 log.append(("setattr", name, value))
667 MT.__setattr__(self, name, value)
668 def __delattr__(self, name):
669 log.append(("delattr", name))
670 MT.__delattr__(self, name)
671 a = MM("a")
672 a.foo = 12
673 x = a.foo
674 del a.foo
675 self.assertEqual(log, [("setattr", "foo", 12),
676 ("getattr", "foo"),
677 ("delattr", "foo")])
678
679 # http://python.org/sf/1174712
680 try:
681 class Module(types.ModuleType, str):
682 pass
683 except TypeError:
684 pass
685 else:
686 self.fail("inheriting from ModuleType and str at the same time "
687 "should fail")
688
689 def test_multiple_inheritence(self):
690 # Testing multiple inheritance...
691 class C(object):
692 def __init__(self):
693 self.__state = 0
694 def getstate(self):
695 return self.__state
696 def setstate(self, state):
697 self.__state = state
698 a = C()
699 self.assertEqual(a.getstate(), 0)
700 a.setstate(10)
701 self.assertEqual(a.getstate(), 10)
702 class D(dict, C):
703 def __init__(self):
704 type({}).__init__(self)
705 C.__init__(self)
706 d = D()
707 self.assertEqual(d.keys(), [])
708 d["hello"] = "world"
709 self.assertEqual(d.items(), [("hello", "world")])
710 self.assertEqual(d["hello"], "world")
711 self.assertEqual(d.getstate(), 0)
712 d.setstate(10)
713 self.assertEqual(d.getstate(), 10)
714 self.assertEqual(D.__mro__, (D, dict, C, object))
715
716 # SF bug #442833
717 class Node(object):
718 def __int__(self):
719 return int(self.foo())
720 def foo(self):
721 return "23"
722 class Frag(Node, list):
723 def foo(self):
724 return "42"
725 self.assertEqual(Node().__int__(), 23)
726 self.assertEqual(int(Node()), 23)
727 self.assertEqual(Frag().__int__(), 42)
728 self.assertEqual(int(Frag()), 42)
729
730 # MI mixing classic and new-style classes.
731
732 class A:
733 x = 1
734
735 class B(A):
736 pass
737
738 class C(A):
739 x = 2
740
741 class D(B, C):
742 pass
743 self.assertEqual(D.x, 1)
744
745 # Classic MRO is preserved for a classic base class.
746 class E(D, object):
747 pass
748 self.assertEqual(E.__mro__, (E, D, B, A, C, object))
749 self.assertEqual(E.x, 1)
750
751 # But with a mix of classic bases, their MROs are combined using
752 # new-style MRO.
753 class F(B, C, object):
754 pass
755 self.assertEqual(F.__mro__, (F, B, C, A, object))
756 self.assertEqual(F.x, 2)
757
758 # Try something else.
759 class C:
760 def cmethod(self):
761 return "C a"
762 def all_method(self):
763 return "C b"
764
765 class M1(C, object):
766 def m1method(self):
767 return "M1 a"
768 def all_method(self):
769 return "M1 b"
770
771 self.assertEqual(M1.__mro__, (M1, C, object))
772 m = M1()
773 self.assertEqual(m.cmethod(), "C a")
774 self.assertEqual(m.m1method(), "M1 a")
775 self.assertEqual(m.all_method(), "M1 b")
776
777 class D(C):
778 def dmethod(self):
779 return "D a"
780 def all_method(self):
781 return "D b"
782
783 class M2(D, object):
784 def m2method(self):
785 return "M2 a"
786 def all_method(self):
787 return "M2 b"
788
789 self.assertEqual(M2.__mro__, (M2, D, C, object))
790 m = M2()
791 self.assertEqual(m.cmethod(), "C a")
792 self.assertEqual(m.dmethod(), "D a")
793 self.assertEqual(m.m2method(), "M2 a")
794 self.assertEqual(m.all_method(), "M2 b")
795
796 class M3(M1, M2, object):
797 def m3method(self):
798 return "M3 a"
799 def all_method(self):
800 return "M3 b"
801 self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
802 m = M3()
803 self.assertEqual(m.cmethod(), "C a")
804 self.assertEqual(m.dmethod(), "D a")
805 self.assertEqual(m.m1method(), "M1 a")
806 self.assertEqual(m.m2method(), "M2 a")
807 self.assertEqual(m.m3method(), "M3 a")
808 self.assertEqual(m.all_method(), "M3 b")
809
810 class Classic:
811 pass
812 try:
813 class New(Classic):
814 __metaclass__ = type
815 except TypeError:
816 pass
817 else:
818 self.fail("new class with only classic bases - shouldn't be")
819
820 def test_diamond_inheritence(self):
821 # Testing multiple inheritance special cases...
822 class A(object):
823 def spam(self): return "A"
824 self.assertEqual(A().spam(), "A")
825 class B(A):
826 def boo(self): return "B"
827 def spam(self): return "B"
828 self.assertEqual(B().spam(), "B")
829 self.assertEqual(B().boo(), "B")
830 class C(A):
831 def boo(self): return "C"
832 self.assertEqual(C().spam(), "A")
833 self.assertEqual(C().boo(), "C")
834 class D(B, C): pass
835 self.assertEqual(D().spam(), "B")
836 self.assertEqual(D().boo(), "B")
837 self.assertEqual(D.__mro__, (D, B, C, A, object))
838 class E(C, B): pass
839 self.assertEqual(E().spam(), "B")
840 self.assertEqual(E().boo(), "C")
841 self.assertEqual(E.__mro__, (E, C, B, A, object))
842 # MRO order disagreement
843 try:
844 class F(D, E): pass
845 except TypeError:
846 pass
847 else:
848 self.fail("expected MRO order disagreement (F)")
849 try:
850 class G(E, D): pass
851 except TypeError:
852 pass
853 else:
854 self.fail("expected MRO order disagreement (G)")
855
856 # see thread python-dev/2002-October/029035.html
857 def test_ex5_from_c3_switch(self):
858 # Testing ex5 from C3 switch discussion...
859 class A(object): pass
860 class B(object): pass
861 class C(object): pass
862 class X(A): pass
863 class Y(A): pass
864 class Z(X,B,Y,C): pass
865 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
866
867 # see "A Monotonic Superclass Linearization for Dylan",
868 # by Kim Barrett et al. (OOPSLA 1996)
869 def test_monotonicity(self):
870 # Testing MRO monotonicity...
871 class Boat(object): pass
872 class DayBoat(Boat): pass
873 class WheelBoat(Boat): pass
874 class EngineLess(DayBoat): pass
875 class SmallMultihull(DayBoat): pass
876 class PedalWheelBoat(EngineLess,WheelBoat): pass
877 class SmallCatamaran(SmallMultihull): pass
878 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
879
880 self.assertEqual(PedalWheelBoat.__mro__,
881 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
882 self.assertEqual(SmallCatamaran.__mro__,
883 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
884 self.assertEqual(Pedalo.__mro__,
885 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
886 SmallMultihull, DayBoat, WheelBoat, Boat, object))
887
888 # see "A Monotonic Superclass Linearization for Dylan",
889 # by Kim Barrett et al. (OOPSLA 1996)
890 def test_consistency_with_epg(self):
891 # Testing consistentcy with EPG...
892 class Pane(object): pass
893 class ScrollingMixin(object): pass
894 class EditingMixin(object): pass
895 class ScrollablePane(Pane,ScrollingMixin): pass
896 class EditablePane(Pane,EditingMixin): pass
897 class EditableScrollablePane(ScrollablePane,EditablePane): pass
898
899 self.assertEqual(EditableScrollablePane.__mro__,
900 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
901 ScrollingMixin, EditingMixin, object))
902
903 def test_mro_disagreement(self):
904 # Testing error messages for MRO disagreement...
905 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000906order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000907
Georg Brandl48545522008-02-02 10:12:36 +0000908 def raises(exc, expected, callable, *args):
909 try:
910 callable(*args)
911 except exc, msg:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000912 # the exact msg is generally considered an impl detail
913 if test_support.check_impl_detail():
914 if not str(msg).startswith(expected):
915 self.fail("Message %r, expected %r" %
916 (str(msg), expected))
Georg Brandl48545522008-02-02 10:12:36 +0000917 else:
918 self.fail("Expected %s" % exc)
919
920 class A(object): pass
921 class B(A): pass
922 class C(object): pass
923
924 # Test some very simple errors
925 raises(TypeError, "duplicate base class A",
926 type, "X", (A, A), {})
927 raises(TypeError, mro_err_msg,
928 type, "X", (A, B), {})
929 raises(TypeError, mro_err_msg,
930 type, "X", (A, C, B), {})
931 # Test a slightly more complex error
932 class GridLayout(object): pass
933 class HorizontalGrid(GridLayout): pass
934 class VerticalGrid(GridLayout): pass
935 class HVGrid(HorizontalGrid, VerticalGrid): pass
936 class VHGrid(VerticalGrid, HorizontalGrid): pass
937 raises(TypeError, mro_err_msg,
938 type, "ConfusedGrid", (HVGrid, VHGrid), {})
939
940 def test_object_class(self):
941 # Testing object class...
942 a = object()
943 self.assertEqual(a.__class__, object)
944 self.assertEqual(type(a), object)
945 b = object()
946 self.assertNotEqual(a, b)
947 self.assertFalse(hasattr(a, "foo"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000948 try:
Georg Brandl48545522008-02-02 10:12:36 +0000949 a.foo = 12
950 except (AttributeError, TypeError):
951 pass
Guido van Rossumd32047f2002-11-25 21:38:52 +0000952 else:
Georg Brandl48545522008-02-02 10:12:36 +0000953 self.fail("object() should not allow setting a foo attribute")
954 self.assertFalse(hasattr(object(), "__dict__"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000955
Georg Brandl48545522008-02-02 10:12:36 +0000956 class Cdict(object):
957 pass
958 x = Cdict()
959 self.assertEqual(x.__dict__, {})
960 x.foo = 1
961 self.assertEqual(x.foo, 1)
962 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000963
Georg Brandl48545522008-02-02 10:12:36 +0000964 def test_slots(self):
965 # Testing __slots__...
966 class C0(object):
967 __slots__ = []
968 x = C0()
969 self.assertFalse(hasattr(x, "__dict__"))
970 self.assertFalse(hasattr(x, "foo"))
Guido van Rossum37202612001-08-09 19:45:21 +0000971
Georg Brandl48545522008-02-02 10:12:36 +0000972 class C1(object):
973 __slots__ = ['a']
974 x = C1()
975 self.assertFalse(hasattr(x, "__dict__"))
976 self.assertFalse(hasattr(x, "a"))
977 x.a = 1
978 self.assertEqual(x.a, 1)
979 x.a = None
980 self.assertEqual(x.a, None)
981 del x.a
982 self.assertFalse(hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000983
Georg Brandl48545522008-02-02 10:12:36 +0000984 class C3(object):
985 __slots__ = ['a', 'b', 'c']
986 x = C3()
987 self.assertFalse(hasattr(x, "__dict__"))
988 self.assertFalse(hasattr(x, 'a'))
989 self.assertFalse(hasattr(x, 'b'))
990 self.assertFalse(hasattr(x, 'c'))
991 x.a = 1
992 x.b = 2
993 x.c = 3
994 self.assertEqual(x.a, 1)
995 self.assertEqual(x.b, 2)
996 self.assertEqual(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997
Georg Brandl48545522008-02-02 10:12:36 +0000998 class C4(object):
999 """Validate name mangling"""
1000 __slots__ = ['__a']
1001 def __init__(self, value):
1002 self.__a = value
1003 def get(self):
1004 return self.__a
1005 x = C4(5)
1006 self.assertFalse(hasattr(x, '__dict__'))
1007 self.assertFalse(hasattr(x, '__a'))
1008 self.assertEqual(x.get(), 5)
1009 try:
1010 x.__a = 6
1011 except AttributeError:
1012 pass
1013 else:
1014 self.fail("Double underscored names not mangled")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001015
Georg Brandl48545522008-02-02 10:12:36 +00001016 # Make sure slot names are proper identifiers
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001017 try:
1018 class C(object):
Georg Brandl48545522008-02-02 10:12:36 +00001019 __slots__ = [None]
Guido van Rossum843daa82001-09-18 20:04:26 +00001020 except TypeError:
1021 pass
1022 else:
Georg Brandl48545522008-02-02 10:12:36 +00001023 self.fail("[None] slots not caught")
Tim Peters66c1a522001-09-24 21:17:50 +00001024 try:
Georg Brandl48545522008-02-02 10:12:36 +00001025 class C(object):
1026 __slots__ = ["foo bar"]
1027 except TypeError:
Georg Brandl533ff6f2006-03-08 18:09:27 +00001028 pass
Georg Brandl48545522008-02-02 10:12:36 +00001029 else:
1030 self.fail("['foo bar'] slots not caught")
1031 try:
1032 class C(object):
1033 __slots__ = ["foo\0bar"]
1034 except TypeError:
1035 pass
1036 else:
1037 self.fail("['foo\\0bar'] slots not caught")
1038 try:
1039 class C(object):
1040 __slots__ = ["1"]
1041 except TypeError:
1042 pass
1043 else:
1044 self.fail("['1'] slots not caught")
1045 try:
1046 class C(object):
1047 __slots__ = [""]
1048 except TypeError:
1049 pass
1050 else:
1051 self.fail("[''] slots not caught")
1052 class C(object):
1053 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1054 # XXX(nnorwitz): was there supposed to be something tested
1055 # from the class above?
Georg Brandl533ff6f2006-03-08 18:09:27 +00001056
Georg Brandl48545522008-02-02 10:12:36 +00001057 # Test a single string is not expanded as a sequence.
1058 class C(object):
1059 __slots__ = "abc"
1060 c = C()
1061 c.abc = 5
1062 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001063
Georg Brandl48545522008-02-02 10:12:36 +00001064 # Test unicode slot names
1065 try:
1066 unicode
1067 except NameError:
1068 pass
1069 else:
1070 # Test a single unicode string is not expanded as a sequence.
1071 class C(object):
1072 __slots__ = unicode("abc")
1073 c = C()
1074 c.abc = 5
1075 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001076
Georg Brandl48545522008-02-02 10:12:36 +00001077 # _unicode_to_string used to modify slots in certain circumstances
1078 slots = (unicode("foo"), unicode("bar"))
1079 class C(object):
1080 __slots__ = slots
1081 x = C()
1082 x.foo = 5
1083 self.assertEqual(x.foo, 5)
1084 self.assertEqual(type(slots[0]), unicode)
1085 # this used to leak references
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001086 try:
Georg Brandl48545522008-02-02 10:12:36 +00001087 class C(object):
1088 __slots__ = [unichr(128)]
1089 except (TypeError, UnicodeEncodeError):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001090 pass
Tim Peters8fa45672001-09-13 21:01:29 +00001091 else:
Georg Brandl48545522008-02-02 10:12:36 +00001092 self.fail("[unichr(128)] slots not caught")
Tim Peters8fa45672001-09-13 21:01:29 +00001093
Georg Brandl48545522008-02-02 10:12:36 +00001094 # Test leaks
1095 class Counted(object):
1096 counter = 0 # counts the number of instances alive
1097 def __init__(self):
1098 Counted.counter += 1
1099 def __del__(self):
1100 Counted.counter -= 1
1101 class C(object):
1102 __slots__ = ['a', 'b', 'c']
Guido van Rossum8c842552002-03-14 23:05:54 +00001103 x = C()
Georg Brandl48545522008-02-02 10:12:36 +00001104 x.a = Counted()
1105 x.b = Counted()
1106 x.c = Counted()
1107 self.assertEqual(Counted.counter, 3)
1108 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001109 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001110 self.assertEqual(Counted.counter, 0)
1111 class D(C):
1112 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00001113 x = D()
Georg Brandl48545522008-02-02 10:12:36 +00001114 x.a = Counted()
1115 x.z = Counted()
1116 self.assertEqual(Counted.counter, 2)
1117 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001118 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001119 self.assertEqual(Counted.counter, 0)
1120 class E(D):
1121 __slots__ = ['e']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00001122 x = E()
Georg Brandl48545522008-02-02 10:12:36 +00001123 x.a = Counted()
1124 x.z = Counted()
1125 x.e = Counted()
1126 self.assertEqual(Counted.counter, 3)
1127 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001128 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001129 self.assertEqual(Counted.counter, 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00001130
Georg Brandl48545522008-02-02 10:12:36 +00001131 # Test cyclical leaks [SF bug 519621]
1132 class F(object):
1133 __slots__ = ['a', 'b']
1134 log = []
1135 s = F()
1136 s.a = [Counted(), s]
1137 self.assertEqual(Counted.counter, 1)
1138 s = None
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001139 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001140 self.assertEqual(Counted.counter, 0)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001141
Georg Brandl48545522008-02-02 10:12:36 +00001142 # Test lookup leaks [SF bug 572567]
1143 import sys,gc
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001144 if hasattr(gc, 'get_objects'):
1145 class G(object):
1146 def __cmp__(self, other):
1147 return 0
1148 __hash__ = None # Silence Py3k warning
1149 g = G()
1150 orig_objects = len(gc.get_objects())
1151 for i in xrange(10):
1152 g==g
1153 new_objects = len(gc.get_objects())
1154 self.assertEqual(orig_objects, new_objects)
1155
Georg Brandl48545522008-02-02 10:12:36 +00001156 class H(object):
1157 __slots__ = ['a', 'b']
1158 def __init__(self):
1159 self.a = 1
1160 self.b = 2
1161 def __del__(self_):
1162 self.assertEqual(self_.a, 1)
1163 self.assertEqual(self_.b, 2)
Armin Rigo581eb1e2008-10-28 17:01:21 +00001164 with test_support.captured_output('stderr') as s:
1165 h = H()
Georg Brandl48545522008-02-02 10:12:36 +00001166 del h
Armin Rigo581eb1e2008-10-28 17:01:21 +00001167 self.assertEqual(s.getvalue(), '')
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001168
Benjamin Peterson0f02d392009-12-30 19:34:10 +00001169 class X(object):
1170 __slots__ = "a"
1171 with self.assertRaises(AttributeError):
1172 del X().a
1173
Georg Brandl48545522008-02-02 10:12:36 +00001174 def test_slots_special(self):
1175 # Testing __dict__ and __weakref__ in __slots__...
1176 class D(object):
1177 __slots__ = ["__dict__"]
1178 a = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001179 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl48545522008-02-02 10:12:36 +00001180 self.assertFalse(hasattr(a, "__weakref__"))
1181 a.foo = 42
1182 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001183
Georg Brandl48545522008-02-02 10:12:36 +00001184 class W(object):
1185 __slots__ = ["__weakref__"]
1186 a = W()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001187 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001188 self.assertFalse(hasattr(a, "__dict__"))
1189 try:
1190 a.foo = 42
1191 except AttributeError:
1192 pass
1193 else:
1194 self.fail("shouldn't be allowed to set a.foo")
1195
1196 class C1(W, D):
1197 __slots__ = []
1198 a = C1()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001199 self.assertTrue(hasattr(a, "__dict__"))
1200 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001201 a.foo = 42
1202 self.assertEqual(a.__dict__, {"foo": 42})
1203
1204 class C2(D, W):
1205 __slots__ = []
1206 a = C2()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001207 self.assertTrue(hasattr(a, "__dict__"))
1208 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001209 a.foo = 42
1210 self.assertEqual(a.__dict__, {"foo": 42})
1211
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001212 def test_slots_descriptor(self):
1213 # Issue2115: slot descriptors did not correctly check
1214 # the type of the given object
1215 import abc
1216 class MyABC:
1217 __metaclass__ = abc.ABCMeta
1218 __slots__ = "a"
1219
1220 class Unrelated(object):
1221 pass
1222 MyABC.register(Unrelated)
1223
1224 u = Unrelated()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001225 self.assertTrue(isinstance(u, MyABC))
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001226
1227 # This used to crash
1228 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1229
Benjamin Peterson4895af42009-12-13 16:36:53 +00001230 def test_metaclass_cmp(self):
1231 # See bug 7491.
1232 class M(type):
1233 def __cmp__(self, other):
1234 return -1
1235 class X(object):
1236 __metaclass__ = M
1237 self.assertTrue(X < M)
1238
Georg Brandl48545522008-02-02 10:12:36 +00001239 def test_dynamics(self):
1240 # Testing class attribute propagation...
1241 class D(object):
1242 pass
1243 class E(D):
1244 pass
1245 class F(D):
1246 pass
1247 D.foo = 1
1248 self.assertEqual(D.foo, 1)
1249 # Test that dynamic attributes are inherited
1250 self.assertEqual(E.foo, 1)
1251 self.assertEqual(F.foo, 1)
1252 # Test dynamic instances
1253 class C(object):
1254 pass
1255 a = C()
1256 self.assertFalse(hasattr(a, "foobar"))
1257 C.foobar = 2
1258 self.assertEqual(a.foobar, 2)
1259 C.method = lambda self: 42
1260 self.assertEqual(a.method(), 42)
1261 C.__repr__ = lambda self: "C()"
1262 self.assertEqual(repr(a), "C()")
1263 C.__int__ = lambda self: 100
1264 self.assertEqual(int(a), 100)
1265 self.assertEqual(a.foobar, 2)
1266 self.assertFalse(hasattr(a, "spam"))
1267 def mygetattr(self, name):
1268 if name == "spam":
1269 return "spam"
1270 raise AttributeError
1271 C.__getattr__ = mygetattr
1272 self.assertEqual(a.spam, "spam")
1273 a.new = 12
1274 self.assertEqual(a.new, 12)
1275 def mysetattr(self, name, value):
1276 if name == "spam":
1277 raise AttributeError
1278 return object.__setattr__(self, name, value)
1279 C.__setattr__ = mysetattr
1280 try:
1281 a.spam = "not spam"
1282 except AttributeError:
1283 pass
1284 else:
1285 self.fail("expected AttributeError")
1286 self.assertEqual(a.spam, "spam")
1287 class D(C):
1288 pass
1289 d = D()
1290 d.foo = 1
1291 self.assertEqual(d.foo, 1)
1292
1293 # Test handling of int*seq and seq*int
1294 class I(int):
1295 pass
1296 self.assertEqual("a"*I(2), "aa")
1297 self.assertEqual(I(2)*"a", "aa")
1298 self.assertEqual(2*I(3), 6)
1299 self.assertEqual(I(3)*2, 6)
1300 self.assertEqual(I(3)*I(2), 6)
1301
1302 # Test handling of long*seq and seq*long
1303 class L(long):
1304 pass
1305 self.assertEqual("a"*L(2L), "aa")
1306 self.assertEqual(L(2L)*"a", "aa")
1307 self.assertEqual(2*L(3), 6)
1308 self.assertEqual(L(3)*2, 6)
1309 self.assertEqual(L(3)*L(2), 6)
1310
1311 # Test comparison of classes with dynamic metaclasses
1312 class dynamicmetaclass(type):
1313 pass
1314 class someclass:
1315 __metaclass__ = dynamicmetaclass
1316 self.assertNotEqual(someclass, object)
1317
1318 def test_errors(self):
1319 # Testing errors...
1320 try:
1321 class C(list, dict):
1322 pass
1323 except TypeError:
1324 pass
1325 else:
1326 self.fail("inheritance from both list and dict should be illegal")
1327
1328 try:
1329 class C(object, None):
1330 pass
1331 except TypeError:
1332 pass
1333 else:
1334 self.fail("inheritance from non-type should be illegal")
1335 class Classic:
1336 pass
1337
1338 try:
1339 class C(type(len)):
1340 pass
1341 except TypeError:
1342 pass
1343 else:
1344 self.fail("inheritance from CFunction should be illegal")
1345
1346 try:
1347 class C(object):
1348 __slots__ = 1
1349 except TypeError:
1350 pass
1351 else:
1352 self.fail("__slots__ = 1 should be illegal")
1353
1354 try:
1355 class C(object):
1356 __slots__ = [1]
1357 except TypeError:
1358 pass
1359 else:
1360 self.fail("__slots__ = [1] should be illegal")
1361
1362 class M1(type):
1363 pass
1364 class M2(type):
1365 pass
1366 class A1(object):
1367 __metaclass__ = M1
1368 class A2(object):
1369 __metaclass__ = M2
1370 try:
1371 class B(A1, A2):
1372 pass
1373 except TypeError:
1374 pass
1375 else:
1376 self.fail("finding the most derived metaclass should have failed")
1377
1378 def test_classmethods(self):
1379 # Testing class methods...
1380 class C(object):
1381 def foo(*a): return a
1382 goo = classmethod(foo)
1383 c = C()
1384 self.assertEqual(C.goo(1), (C, 1))
1385 self.assertEqual(c.goo(1), (C, 1))
1386 self.assertEqual(c.foo(1), (c, 1))
1387 class D(C):
1388 pass
1389 d = D()
1390 self.assertEqual(D.goo(1), (D, 1))
1391 self.assertEqual(d.goo(1), (D, 1))
1392 self.assertEqual(d.foo(1), (d, 1))
1393 self.assertEqual(D.foo(d, 1), (d, 1))
1394 # Test for a specific crash (SF bug 528132)
1395 def f(cls, arg): return (cls, arg)
1396 ff = classmethod(f)
1397 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1398 self.assertEqual(ff.__get__(0)(42), (int, 42))
1399
1400 # Test super() with classmethods (SF bug 535444)
1401 self.assertEqual(C.goo.im_self, C)
1402 self.assertEqual(D.goo.im_self, D)
1403 self.assertEqual(super(D,D).goo.im_self, D)
1404 self.assertEqual(super(D,d).goo.im_self, D)
1405 self.assertEqual(super(D,D).goo(), (D,))
1406 self.assertEqual(super(D,d).goo(), (D,))
1407
Benjamin Peterson6fcf9b52009-09-01 22:27:57 +00001408 # Verify that a non-callable will raise
1409 meth = classmethod(1).__get__(1)
1410 self.assertRaises(TypeError, meth)
Georg Brandl48545522008-02-02 10:12:36 +00001411
1412 # Verify that classmethod() doesn't allow keyword args
1413 try:
1414 classmethod(f, kw=1)
1415 except TypeError:
1416 pass
1417 else:
1418 self.fail("classmethod shouldn't accept keyword args")
1419
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001420 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001421 def test_classmethods_in_c(self):
1422 # Testing C-based class methods...
1423 import xxsubtype as spam
1424 a = (1, 2, 3)
1425 d = {'abc': 123}
1426 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1427 self.assertEqual(x, spam.spamlist)
1428 self.assertEqual(a, a1)
1429 self.assertEqual(d, d1)
1430 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1431 self.assertEqual(x, spam.spamlist)
1432 self.assertEqual(a, a1)
1433 self.assertEqual(d, d1)
1434
1435 def test_staticmethods(self):
1436 # Testing static methods...
1437 class C(object):
1438 def foo(*a): return a
1439 goo = staticmethod(foo)
1440 c = C()
1441 self.assertEqual(C.goo(1), (1,))
1442 self.assertEqual(c.goo(1), (1,))
1443 self.assertEqual(c.foo(1), (c, 1,))
1444 class D(C):
1445 pass
1446 d = D()
1447 self.assertEqual(D.goo(1), (1,))
1448 self.assertEqual(d.goo(1), (1,))
1449 self.assertEqual(d.foo(1), (d, 1))
1450 self.assertEqual(D.foo(d, 1), (d, 1))
1451
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001452 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001453 def test_staticmethods_in_c(self):
1454 # Testing C-based static methods...
1455 import xxsubtype as spam
1456 a = (1, 2, 3)
1457 d = {"abc": 123}
1458 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1459 self.assertEqual(x, None)
1460 self.assertEqual(a, a1)
1461 self.assertEqual(d, d1)
1462 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1463 self.assertEqual(x, None)
1464 self.assertEqual(a, a1)
1465 self.assertEqual(d, d1)
1466
1467 def test_classic(self):
1468 # Testing classic classes...
1469 class C:
1470 def foo(*a): return a
1471 goo = classmethod(foo)
1472 c = C()
1473 self.assertEqual(C.goo(1), (C, 1))
1474 self.assertEqual(c.goo(1), (C, 1))
1475 self.assertEqual(c.foo(1), (c, 1))
1476 class D(C):
1477 pass
1478 d = D()
1479 self.assertEqual(D.goo(1), (D, 1))
1480 self.assertEqual(d.goo(1), (D, 1))
1481 self.assertEqual(d.foo(1), (d, 1))
1482 self.assertEqual(D.foo(d, 1), (d, 1))
1483 class E: # *not* subclassing from C
1484 foo = C.foo
1485 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001486 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001487
1488 def test_compattr(self):
1489 # Testing computed attributes...
1490 class C(object):
1491 class computed_attribute(object):
1492 def __init__(self, get, set=None, delete=None):
1493 self.__get = get
1494 self.__set = set
1495 self.__delete = delete
1496 def __get__(self, obj, type=None):
1497 return self.__get(obj)
1498 def __set__(self, obj, value):
1499 return self.__set(obj, value)
1500 def __delete__(self, obj):
1501 return self.__delete(obj)
1502 def __init__(self):
1503 self.__x = 0
1504 def __get_x(self):
1505 x = self.__x
1506 self.__x = x+1
1507 return x
1508 def __set_x(self, x):
1509 self.__x = x
1510 def __delete_x(self):
1511 del self.__x
1512 x = computed_attribute(__get_x, __set_x, __delete_x)
1513 a = C()
1514 self.assertEqual(a.x, 0)
1515 self.assertEqual(a.x, 1)
1516 a.x = 10
1517 self.assertEqual(a.x, 10)
1518 self.assertEqual(a.x, 11)
1519 del a.x
1520 self.assertEqual(hasattr(a, 'x'), 0)
1521
1522 def test_newslots(self):
1523 # Testing __new__ slot override...
1524 class C(list):
1525 def __new__(cls):
1526 self = list.__new__(cls)
1527 self.foo = 1
1528 return self
1529 def __init__(self):
1530 self.foo = self.foo + 2
1531 a = C()
1532 self.assertEqual(a.foo, 3)
1533 self.assertEqual(a.__class__, C)
1534 class D(C):
1535 pass
1536 b = D()
1537 self.assertEqual(b.foo, 3)
1538 self.assertEqual(b.__class__, D)
1539
1540 def test_altmro(self):
1541 # Testing mro() and overriding it...
1542 class A(object):
1543 def f(self): return "A"
1544 class B(A):
1545 pass
1546 class C(A):
1547 def f(self): return "C"
1548 class D(B, C):
1549 pass
1550 self.assertEqual(D.mro(), [D, B, C, A, object])
1551 self.assertEqual(D.__mro__, (D, B, C, A, object))
1552 self.assertEqual(D().f(), "C")
1553
1554 class PerverseMetaType(type):
1555 def mro(cls):
1556 L = type.mro(cls)
1557 L.reverse()
1558 return L
1559 class X(D,B,C,A):
1560 __metaclass__ = PerverseMetaType
1561 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1562 self.assertEqual(X().f(), "A")
1563
1564 try:
1565 class X(object):
1566 class __metaclass__(type):
1567 def mro(self):
1568 return [self, dict, object]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001569 # In CPython, the class creation above already raises
1570 # TypeError, as a protection against the fact that
1571 # instances of X would segfault it. In other Python
1572 # implementations it would be ok to let the class X
1573 # be created, but instead get a clean TypeError on the
1574 # __setitem__ below.
1575 x = object.__new__(X)
1576 x[5] = 6
Georg Brandl48545522008-02-02 10:12:36 +00001577 except TypeError:
1578 pass
1579 else:
1580 self.fail("devious mro() return not caught")
1581
1582 try:
1583 class X(object):
1584 class __metaclass__(type):
1585 def mro(self):
1586 return [1]
1587 except TypeError:
1588 pass
1589 else:
1590 self.fail("non-class mro() return not caught")
1591
1592 try:
1593 class X(object):
1594 class __metaclass__(type):
1595 def mro(self):
1596 return 1
1597 except TypeError:
1598 pass
1599 else:
1600 self.fail("non-sequence mro() return not caught")
1601
1602 def test_overloading(self):
1603 # Testing operator overloading...
1604
1605 class B(object):
1606 "Intermediate class because object doesn't have a __setattr__"
1607
1608 class C(B):
1609 def __getattr__(self, name):
1610 if name == "foo":
1611 return ("getattr", name)
1612 else:
1613 raise AttributeError
1614 def __setattr__(self, name, value):
1615 if name == "foo":
1616 self.setattr = (name, value)
1617 else:
1618 return B.__setattr__(self, name, value)
1619 def __delattr__(self, name):
1620 if name == "foo":
1621 self.delattr = name
1622 else:
1623 return B.__delattr__(self, name)
1624
1625 def __getitem__(self, key):
1626 return ("getitem", key)
1627 def __setitem__(self, key, value):
1628 self.setitem = (key, value)
1629 def __delitem__(self, key):
1630 self.delitem = key
1631
1632 def __getslice__(self, i, j):
1633 return ("getslice", i, j)
1634 def __setslice__(self, i, j, value):
1635 self.setslice = (i, j, value)
1636 def __delslice__(self, i, j):
1637 self.delslice = (i, j)
1638
1639 a = C()
1640 self.assertEqual(a.foo, ("getattr", "foo"))
1641 a.foo = 12
1642 self.assertEqual(a.setattr, ("foo", 12))
1643 del a.foo
1644 self.assertEqual(a.delattr, "foo")
1645
1646 self.assertEqual(a[12], ("getitem", 12))
1647 a[12] = 21
1648 self.assertEqual(a.setitem, (12, 21))
1649 del a[12]
1650 self.assertEqual(a.delitem, 12)
1651
1652 self.assertEqual(a[0:10], ("getslice", 0, 10))
1653 a[0:10] = "foo"
1654 self.assertEqual(a.setslice, (0, 10, "foo"))
1655 del a[0:10]
1656 self.assertEqual(a.delslice, (0, 10))
1657
1658 def test_methods(self):
1659 # Testing methods...
1660 class C(object):
1661 def __init__(self, x):
1662 self.x = x
1663 def foo(self):
1664 return self.x
1665 c1 = C(1)
1666 self.assertEqual(c1.foo(), 1)
1667 class D(C):
1668 boo = C.foo
1669 goo = c1.foo
1670 d2 = D(2)
1671 self.assertEqual(d2.foo(), 2)
1672 self.assertEqual(d2.boo(), 2)
1673 self.assertEqual(d2.goo(), 1)
1674 class E(object):
1675 foo = C.foo
1676 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001677 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001678
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001679 def test_special_method_lookup(self):
1680 # The lookup of special methods bypasses __getattr__ and
1681 # __getattribute__, but they still can be descriptors.
1682
1683 def run_context(manager):
1684 with manager:
1685 pass
1686 def iden(self):
1687 return self
1688 def hello(self):
1689 return "hello"
Benjamin Peterson809e2252009-05-09 02:07:04 +00001690 def empty_seq(self):
1691 return []
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001692 def zero(self):
1693 return 0
1694 def stop(self):
1695 raise StopIteration
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001696 def return_true(self, thing=None):
1697 return True
1698 def do_isinstance(obj):
1699 return isinstance(int, obj)
1700 def do_issubclass(obj):
1701 return issubclass(int, obj)
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001702 def swallow(*args):
1703 pass
1704 def do_dict_missing(checker):
1705 class DictSub(checker.__class__, dict):
1706 pass
1707 self.assertEqual(DictSub()["hi"], 4)
1708 def some_number(self_, key):
1709 self.assertEqual(key, "hi")
1710 return 4
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001711
1712 # It would be nice to have every special method tested here, but I'm
1713 # only listing the ones I can remember outside of typeobject.c, since it
1714 # does it right.
1715 specials = [
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001716 ("__unicode__", unicode, hello, set(), {}),
1717 ("__reversed__", reversed, empty_seq, set(), {}),
1718 ("__length_hint__", list, zero, set(),
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001719 {"__iter__" : iden, "next" : stop}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001720 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1721 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001722 ("__missing__", do_dict_missing, some_number,
1723 set(("__class__",)), {}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001724 ("__subclasscheck__", do_issubclass, return_true,
1725 set(("__bases__",)), {}),
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00001726 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1727 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001728 ]
1729
1730 class Checker(object):
1731 def __getattr__(self, attr, test=self):
1732 test.fail("__getattr__ called with {0}".format(attr))
1733 def __getattribute__(self, attr, test=self):
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001734 if attr not in ok:
1735 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001736 return object.__getattribute__(self, attr)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001737 class SpecialDescr(object):
1738 def __init__(self, impl):
1739 self.impl = impl
1740 def __get__(self, obj, owner):
1741 record.append(1)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001742 return self.impl.__get__(obj, owner)
Benjamin Peterson87e50062009-05-25 02:40:21 +00001743 class MyException(Exception):
1744 pass
1745 class ErrDescr(object):
1746 def __get__(self, obj, owner):
1747 raise MyException
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001748
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001749 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001750 class X(Checker):
1751 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001752 for attr, obj in env.iteritems():
1753 setattr(X, attr, obj)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001754 setattr(X, name, meth_impl)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001755 runner(X())
1756
1757 record = []
1758 class X(Checker):
1759 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001760 for attr, obj in env.iteritems():
1761 setattr(X, attr, obj)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001762 setattr(X, name, SpecialDescr(meth_impl))
1763 runner(X())
1764 self.assertEqual(record, [1], name)
1765
Benjamin Peterson87e50062009-05-25 02:40:21 +00001766 class X(Checker):
1767 pass
1768 for attr, obj in env.iteritems():
1769 setattr(X, attr, obj)
1770 setattr(X, name, ErrDescr())
1771 try:
1772 runner(X())
1773 except MyException:
1774 pass
1775 else:
1776 self.fail("{0!r} didn't raise".format(name))
1777
Georg Brandl48545522008-02-02 10:12:36 +00001778 def test_specials(self):
1779 # Testing special operators...
1780 # Test operators like __hash__ for which a built-in default exists
1781
1782 # Test the default behavior for static classes
1783 class C(object):
1784 def __getitem__(self, i):
1785 if 0 <= i < 10: return i
1786 raise IndexError
1787 c1 = C()
1788 c2 = C()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001789 self.assertTrue(not not c1) # What?
Georg Brandl48545522008-02-02 10:12:36 +00001790 self.assertNotEqual(id(c1), id(c2))
1791 hash(c1)
1792 hash(c2)
1793 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1794 self.assertEqual(c1, c1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001795 self.assertTrue(c1 != c2)
1796 self.assertTrue(not c1 != c1)
1797 self.assertTrue(not c1 == c2)
Georg Brandl48545522008-02-02 10:12:36 +00001798 # Note that the module name appears in str/repr, and that varies
1799 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001800 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001801 self.assertEqual(str(c1), repr(c1))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001802 self.assertTrue(-1 not in c1)
Georg Brandl48545522008-02-02 10:12:36 +00001803 for i in range(10):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001804 self.assertTrue(i in c1)
Georg Brandl48545522008-02-02 10:12:36 +00001805 self.assertFalse(10 in c1)
1806 # Test the default behavior for dynamic classes
1807 class D(object):
1808 def __getitem__(self, i):
1809 if 0 <= i < 10: return i
1810 raise IndexError
1811 d1 = D()
1812 d2 = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001813 self.assertTrue(not not d1)
Georg Brandl48545522008-02-02 10:12:36 +00001814 self.assertNotEqual(id(d1), id(d2))
1815 hash(d1)
1816 hash(d2)
1817 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1818 self.assertEqual(d1, d1)
1819 self.assertNotEqual(d1, d2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001820 self.assertTrue(not d1 != d1)
1821 self.assertTrue(not d1 == d2)
Georg Brandl48545522008-02-02 10:12:36 +00001822 # Note that the module name appears in str/repr, and that varies
1823 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001824 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001825 self.assertEqual(str(d1), repr(d1))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001826 self.assertTrue(-1 not in d1)
Georg Brandl48545522008-02-02 10:12:36 +00001827 for i in range(10):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001828 self.assertTrue(i in d1)
Georg Brandl48545522008-02-02 10:12:36 +00001829 self.assertFalse(10 in d1)
1830 # Test overridden behavior for static classes
1831 class Proxy(object):
1832 def __init__(self, x):
1833 self.x = x
1834 def __nonzero__(self):
1835 return not not self.x
1836 def __hash__(self):
1837 return hash(self.x)
1838 def __eq__(self, other):
1839 return self.x == other
1840 def __ne__(self, other):
1841 return self.x != other
1842 def __cmp__(self, other):
1843 return cmp(self.x, other.x)
1844 def __str__(self):
1845 return "Proxy:%s" % self.x
1846 def __repr__(self):
1847 return "Proxy(%r)" % self.x
1848 def __contains__(self, value):
1849 return value in self.x
1850 p0 = Proxy(0)
1851 p1 = Proxy(1)
1852 p_1 = Proxy(-1)
1853 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001854 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001855 self.assertEqual(hash(p0), hash(0))
1856 self.assertEqual(p0, p0)
1857 self.assertNotEqual(p0, p1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001858 self.assertTrue(not p0 != p0)
Georg Brandl48545522008-02-02 10:12:36 +00001859 self.assertEqual(not p0, p1)
1860 self.assertEqual(cmp(p0, p1), -1)
1861 self.assertEqual(cmp(p0, p0), 0)
1862 self.assertEqual(cmp(p0, p_1), 1)
1863 self.assertEqual(str(p0), "Proxy:0")
1864 self.assertEqual(repr(p0), "Proxy(0)")
1865 p10 = Proxy(range(10))
1866 self.assertFalse(-1 in p10)
1867 for i in range(10):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001868 self.assertTrue(i in p10)
Georg Brandl48545522008-02-02 10:12:36 +00001869 self.assertFalse(10 in p10)
1870 # Test overridden behavior for dynamic classes
1871 class DProxy(object):
1872 def __init__(self, x):
1873 self.x = x
1874 def __nonzero__(self):
1875 return not not self.x
1876 def __hash__(self):
1877 return hash(self.x)
1878 def __eq__(self, other):
1879 return self.x == other
1880 def __ne__(self, other):
1881 return self.x != other
1882 def __cmp__(self, other):
1883 return cmp(self.x, other.x)
1884 def __str__(self):
1885 return "DProxy:%s" % self.x
1886 def __repr__(self):
1887 return "DProxy(%r)" % self.x
1888 def __contains__(self, value):
1889 return value in self.x
1890 p0 = DProxy(0)
1891 p1 = DProxy(1)
1892 p_1 = DProxy(-1)
1893 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001894 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001895 self.assertEqual(hash(p0), hash(0))
1896 self.assertEqual(p0, p0)
1897 self.assertNotEqual(p0, p1)
1898 self.assertNotEqual(not p0, p0)
1899 self.assertEqual(not p0, p1)
1900 self.assertEqual(cmp(p0, p1), -1)
1901 self.assertEqual(cmp(p0, p0), 0)
1902 self.assertEqual(cmp(p0, p_1), 1)
1903 self.assertEqual(str(p0), "DProxy:0")
1904 self.assertEqual(repr(p0), "DProxy(0)")
1905 p10 = DProxy(range(10))
1906 self.assertFalse(-1 in p10)
1907 for i in range(10):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001908 self.assertTrue(i in p10)
Georg Brandl48545522008-02-02 10:12:36 +00001909 self.assertFalse(10 in p10)
1910
1911 # Safety test for __cmp__
1912 def unsafecmp(a, b):
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001913 if not hasattr(a, '__cmp__'):
1914 return # some types don't have a __cmp__ any more (so the
1915 # test doesn't make sense any more), or maybe they
1916 # never had a __cmp__ at all, e.g. in PyPy
Georg Brandl48545522008-02-02 10:12:36 +00001917 try:
1918 a.__class__.__cmp__(a, b)
1919 except TypeError:
1920 pass
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001921 else:
Georg Brandl48545522008-02-02 10:12:36 +00001922 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1923 a.__class__, a, b))
1924
1925 unsafecmp(u"123", "123")
1926 unsafecmp("123", u"123")
1927 unsafecmp(1, 1.0)
1928 unsafecmp(1.0, 1)
1929 unsafecmp(1, 1L)
1930 unsafecmp(1L, 1)
1931
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001932 @test_support.impl_detail("custom logic for printing to real file objects")
1933 def test_recursions_1(self):
Georg Brandl48545522008-02-02 10:12:36 +00001934 # Testing recursion checks ...
1935 class Letter(str):
1936 def __new__(cls, letter):
1937 if letter == 'EPS':
1938 return str.__new__(cls)
1939 return str.__new__(cls, letter)
1940 def __str__(self):
1941 if not self:
1942 return 'EPS'
1943 return self
1944 # sys.stdout needs to be the original to trigger the recursion bug
1945 import sys
1946 test_stdout = sys.stdout
1947 sys.stdout = test_support.get_original_stdout()
1948 try:
1949 # nothing should actually be printed, this should raise an exception
1950 print Letter('w')
1951 except RuntimeError:
1952 pass
1953 else:
1954 self.fail("expected a RuntimeError for print recursion")
1955 finally:
1956 sys.stdout = test_stdout
1957
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001958 def test_recursions_2(self):
Georg Brandl48545522008-02-02 10:12:36 +00001959 # Bug #1202533.
1960 class A(object):
1961 pass
1962 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
1963 try:
1964 A()*2
1965 except RuntimeError:
1966 pass
1967 else:
1968 self.fail("expected a RuntimeError")
1969
1970 def test_weakrefs(self):
1971 # Testing weak references...
1972 import weakref
1973 class C(object):
1974 pass
1975 c = C()
1976 r = weakref.ref(c)
1977 self.assertEqual(r(), c)
1978 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001979 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001980 self.assertEqual(r(), None)
1981 del r
1982 class NoWeak(object):
1983 __slots__ = ['foo']
1984 no = NoWeak()
1985 try:
1986 weakref.ref(no)
1987 except TypeError, msg:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001988 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001989 else:
1990 self.fail("weakref.ref(no) should be illegal")
1991 class Weak(object):
1992 __slots__ = ['foo', '__weakref__']
1993 yes = Weak()
1994 r = weakref.ref(yes)
1995 self.assertEqual(r(), yes)
1996 del yes
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001997 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001998 self.assertEqual(r(), None)
1999 del r
2000
2001 def test_properties(self):
2002 # Testing property...
2003 class C(object):
2004 def getx(self):
2005 return self.__x
2006 def setx(self, value):
2007 self.__x = value
2008 def delx(self):
2009 del self.__x
2010 x = property(getx, setx, delx, doc="I'm the x property.")
2011 a = C()
2012 self.assertFalse(hasattr(a, "x"))
2013 a.x = 42
2014 self.assertEqual(a._C__x, 42)
2015 self.assertEqual(a.x, 42)
2016 del a.x
2017 self.assertFalse(hasattr(a, "x"))
2018 self.assertFalse(hasattr(a, "_C__x"))
2019 C.x.__set__(a, 100)
2020 self.assertEqual(C.x.__get__(a), 100)
2021 C.x.__delete__(a)
2022 self.assertFalse(hasattr(a, "x"))
2023
2024 raw = C.__dict__['x']
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002025 self.assertTrue(isinstance(raw, property))
Georg Brandl48545522008-02-02 10:12:36 +00002026
2027 attrs = dir(raw)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002028 self.assertTrue("__doc__" in attrs)
2029 self.assertTrue("fget" in attrs)
2030 self.assertTrue("fset" in attrs)
2031 self.assertTrue("fdel" in attrs)
Georg Brandl48545522008-02-02 10:12:36 +00002032
2033 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002034 self.assertTrue(raw.fget is C.__dict__['getx'])
2035 self.assertTrue(raw.fset is C.__dict__['setx'])
2036 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl48545522008-02-02 10:12:36 +00002037
2038 for attr in "__doc__", "fget", "fset", "fdel":
2039 try:
2040 setattr(raw, attr, 42)
2041 except TypeError, msg:
2042 if str(msg).find('readonly') < 0:
2043 self.fail("when setting readonly attr %r on a property, "
2044 "got unexpected TypeError msg %r" % (attr, str(msg)))
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002045 else:
Georg Brandl48545522008-02-02 10:12:36 +00002046 self.fail("expected TypeError from trying to set readonly %r "
2047 "attr on a property" % attr)
Tim Peters2f93e282001-10-04 05:27:00 +00002048
Georg Brandl48545522008-02-02 10:12:36 +00002049 class D(object):
2050 __getitem__ = property(lambda s: 1/0)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002051
Georg Brandl48545522008-02-02 10:12:36 +00002052 d = D()
2053 try:
2054 for i in d:
2055 str(i)
2056 except ZeroDivisionError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002057 pass
Georg Brandl48545522008-02-02 10:12:36 +00002058 else:
2059 self.fail("expected ZeroDivisionError from bad property")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002060
Georg Brandl48545522008-02-02 10:12:36 +00002061 class E(object):
2062 def getter(self):
2063 "getter method"
2064 return 0
2065 def setter(self_, value):
2066 "setter method"
2067 pass
2068 prop = property(getter)
2069 self.assertEqual(prop.__doc__, "getter method")
2070 prop2 = property(fset=setter)
2071 self.assertEqual(prop2.__doc__, None)
2072
2073 # this segfaulted in 2.5b2
2074 try:
2075 import _testcapi
2076 except ImportError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002077 pass
Georg Brandl48545522008-02-02 10:12:36 +00002078 else:
2079 class X(object):
2080 p = property(_testcapi.test_with_docstring)
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002081
Georg Brandl48545522008-02-02 10:12:36 +00002082 def test_properties_plus(self):
2083 class C(object):
2084 foo = property(doc="hello")
2085 @foo.getter
2086 def foo(self):
2087 return self._foo
2088 @foo.setter
2089 def foo(self, value):
2090 self._foo = abs(value)
2091 @foo.deleter
2092 def foo(self):
2093 del self._foo
2094 c = C()
2095 self.assertEqual(C.foo.__doc__, "hello")
2096 self.assertFalse(hasattr(c, "foo"))
2097 c.foo = -42
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002098 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl48545522008-02-02 10:12:36 +00002099 self.assertEqual(c._foo, 42)
2100 self.assertEqual(c.foo, 42)
2101 del c.foo
2102 self.assertFalse(hasattr(c, '_foo'))
2103 self.assertFalse(hasattr(c, "foo"))
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002104
Georg Brandl48545522008-02-02 10:12:36 +00002105 class D(C):
2106 @C.foo.deleter
2107 def foo(self):
2108 try:
2109 del self._foo
2110 except AttributeError:
2111 pass
2112 d = D()
2113 d.foo = 24
2114 self.assertEqual(d.foo, 24)
2115 del d.foo
2116 del d.foo
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002117
Georg Brandl48545522008-02-02 10:12:36 +00002118 class E(object):
2119 @property
2120 def foo(self):
2121 return self._foo
2122 @foo.setter
2123 def foo(self, value):
2124 raise RuntimeError
2125 @foo.setter
2126 def foo(self, value):
2127 self._foo = abs(value)
2128 @foo.deleter
2129 def foo(self, value=None):
2130 del self._foo
Guido van Rossume8fc6402002-04-16 16:44:51 +00002131
Georg Brandl48545522008-02-02 10:12:36 +00002132 e = E()
2133 e.foo = -42
2134 self.assertEqual(e.foo, 42)
2135 del e.foo
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002136
Georg Brandl48545522008-02-02 10:12:36 +00002137 class F(E):
2138 @E.foo.deleter
2139 def foo(self):
2140 del self._foo
2141 @foo.setter
2142 def foo(self, value):
2143 self._foo = max(0, value)
2144 f = F()
2145 f.foo = -10
2146 self.assertEqual(f.foo, 0)
2147 del f.foo
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00002148
Georg Brandl48545522008-02-02 10:12:36 +00002149 def test_dict_constructors(self):
2150 # Testing dict constructor ...
2151 d = dict()
2152 self.assertEqual(d, {})
2153 d = dict({})
2154 self.assertEqual(d, {})
2155 d = dict({1: 2, 'a': 'b'})
2156 self.assertEqual(d, {1: 2, 'a': 'b'})
2157 self.assertEqual(d, dict(d.items()))
2158 self.assertEqual(d, dict(d.iteritems()))
2159 d = dict({'one':1, 'two':2})
2160 self.assertEqual(d, dict(one=1, two=2))
2161 self.assertEqual(d, dict(**d))
2162 self.assertEqual(d, dict({"one": 1}, two=2))
2163 self.assertEqual(d, dict([("two", 2)], one=1))
2164 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
2165 self.assertEqual(d, dict(**d))
Guido van Rossum09638c12002-06-13 19:17:46 +00002166
Georg Brandl48545522008-02-02 10:12:36 +00002167 for badarg in 0, 0L, 0j, "0", [0], (0,):
2168 try:
2169 dict(badarg)
2170 except TypeError:
2171 pass
2172 except ValueError:
2173 if badarg == "0":
2174 # It's a sequence, and its elements are also sequences (gotta
2175 # love strings <wink>), but they aren't of length 2, so this
2176 # one seemed better as a ValueError than a TypeError.
2177 pass
2178 else:
2179 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002180 else:
Georg Brandl48545522008-02-02 10:12:36 +00002181 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002182
Georg Brandl48545522008-02-02 10:12:36 +00002183 try:
2184 dict({}, {})
2185 except TypeError:
2186 pass
2187 else:
2188 self.fail("no TypeError from dict({}, {})")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002189
Georg Brandl48545522008-02-02 10:12:36 +00002190 class Mapping:
2191 # Lacks a .keys() method; will be added later.
2192 dict = {1:2, 3:4, 'a':1j}
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002193
Georg Brandl48545522008-02-02 10:12:36 +00002194 try:
2195 dict(Mapping())
2196 except TypeError:
2197 pass
2198 else:
2199 self.fail("no TypeError from dict(incomplete mapping)")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002200
Georg Brandl48545522008-02-02 10:12:36 +00002201 Mapping.keys = lambda self: self.dict.keys()
2202 Mapping.__getitem__ = lambda self, i: self.dict[i]
2203 d = dict(Mapping())
2204 self.assertEqual(d, Mapping.dict)
Michael W. Hudsonf3904422006-11-23 13:54:04 +00002205
Georg Brandl48545522008-02-02 10:12:36 +00002206 # Init from sequence of iterable objects, each producing a 2-sequence.
2207 class AddressBookEntry:
2208 def __init__(self, first, last):
2209 self.first = first
2210 self.last = last
2211 def __iter__(self):
2212 return iter([self.first, self.last])
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002213
Georg Brandl48545522008-02-02 10:12:36 +00002214 d = dict([AddressBookEntry('Tim', 'Warsaw'),
2215 AddressBookEntry('Barry', 'Peters'),
2216 AddressBookEntry('Tim', 'Peters'),
2217 AddressBookEntry('Barry', 'Warsaw')])
2218 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00002219
Georg Brandl48545522008-02-02 10:12:36 +00002220 d = dict(zip(range(4), range(1, 5)))
2221 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002222
Georg Brandl48545522008-02-02 10:12:36 +00002223 # Bad sequence lengths.
2224 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2225 try:
2226 dict(bad)
2227 except ValueError:
2228 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00002229 else:
Georg Brandl48545522008-02-02 10:12:36 +00002230 self.fail("no ValueError from dict(%r)" % bad)
2231
2232 def test_dir(self):
2233 # Testing dir() ...
2234 junk = 12
2235 self.assertEqual(dir(), ['junk', 'self'])
2236 del junk
2237
2238 # Just make sure these don't blow up!
2239 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
2240 dir(arg)
2241
2242 # Try classic classes.
2243 class C:
2244 Cdata = 1
2245 def Cmethod(self): pass
2246
2247 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
2248 self.assertEqual(dir(C), cstuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002249 self.assertTrue('im_self' in dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002250
2251 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
2252 self.assertEqual(dir(c), cstuff)
2253
2254 c.cdata = 2
2255 c.cmethod = lambda self: 0
2256 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002257 self.assertTrue('im_self' in dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002258
2259 class A(C):
2260 Adata = 1
2261 def Amethod(self): pass
2262
2263 astuff = ['Adata', 'Amethod'] + cstuff
2264 self.assertEqual(dir(A), astuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002265 self.assertTrue('im_self' in dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002266 a = A()
2267 self.assertEqual(dir(a), astuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002268 self.assertTrue('im_self' in dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002269 a.adata = 42
2270 a.amethod = lambda self: 3
2271 self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
2272
2273 # The same, but with new-style classes. Since these have object as a
2274 # base class, a lot more gets sucked in.
2275 def interesting(strings):
2276 return [s for s in strings if not s.startswith('_')]
2277
2278 class C(object):
2279 Cdata = 1
2280 def Cmethod(self): pass
2281
2282 cstuff = ['Cdata', 'Cmethod']
2283 self.assertEqual(interesting(dir(C)), cstuff)
2284
2285 c = C()
2286 self.assertEqual(interesting(dir(c)), cstuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002287 self.assertTrue('im_self' in dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002288
2289 c.cdata = 2
2290 c.cmethod = lambda self: 0
2291 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002292 self.assertTrue('im_self' in dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002293
2294 class A(C):
2295 Adata = 1
2296 def Amethod(self): pass
2297
2298 astuff = ['Adata', 'Amethod'] + cstuff
2299 self.assertEqual(interesting(dir(A)), astuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002300 self.assertTrue('im_self' in dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002301 a = A()
2302 self.assertEqual(interesting(dir(a)), astuff)
2303 a.adata = 42
2304 a.amethod = lambda self: 3
2305 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002306 self.assertTrue('im_self' in dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002307
2308 # Try a module subclass.
2309 import sys
2310 class M(type(sys)):
2311 pass
2312 minstance = M("m")
2313 minstance.b = 2
2314 minstance.a = 1
2315 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2316 self.assertEqual(names, ['a', 'b'])
2317
2318 class M2(M):
2319 def getdict(self):
2320 return "Not a dict!"
2321 __dict__ = property(getdict)
2322
2323 m2instance = M2("m2")
2324 m2instance.b = 2
2325 m2instance.a = 1
2326 self.assertEqual(m2instance.__dict__, "Not a dict!")
2327 try:
2328 dir(m2instance)
2329 except TypeError:
2330 pass
2331
2332 # Two essentially featureless objects, just inheriting stuff from
2333 # object.
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002334 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2335 if test_support.check_impl_detail():
2336 # None differs in PyPy: it has a __nonzero__
2337 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl48545522008-02-02 10:12:36 +00002338
2339 # Nasty test case for proxied objects
2340 class Wrapper(object):
2341 def __init__(self, obj):
2342 self.__obj = obj
2343 def __repr__(self):
2344 return "Wrapper(%s)" % repr(self.__obj)
2345 def __getitem__(self, key):
2346 return Wrapper(self.__obj[key])
2347 def __len__(self):
2348 return len(self.__obj)
2349 def __getattr__(self, name):
2350 return Wrapper(getattr(self.__obj, name))
2351
2352 class C(object):
2353 def __getclass(self):
2354 return Wrapper(type(self))
2355 __class__ = property(__getclass)
2356
2357 dir(C()) # This used to segfault
2358
2359 def test_supers(self):
2360 # Testing super...
2361
2362 class A(object):
2363 def meth(self, a):
2364 return "A(%r)" % a
2365
2366 self.assertEqual(A().meth(1), "A(1)")
2367
2368 class B(A):
2369 def __init__(self):
2370 self.__super = super(B, self)
2371 def meth(self, a):
2372 return "B(%r)" % a + self.__super.meth(a)
2373
2374 self.assertEqual(B().meth(2), "B(2)A(2)")
2375
2376 class C(A):
2377 def meth(self, a):
2378 return "C(%r)" % a + self.__super.meth(a)
2379 C._C__super = super(C)
2380
2381 self.assertEqual(C().meth(3), "C(3)A(3)")
2382
2383 class D(C, B):
2384 def meth(self, a):
2385 return "D(%r)" % a + super(D, self).meth(a)
2386
2387 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2388
2389 # Test for subclassing super
2390
2391 class mysuper(super):
2392 def __init__(self, *args):
2393 return super(mysuper, self).__init__(*args)
2394
2395 class E(D):
2396 def meth(self, a):
2397 return "E(%r)" % a + mysuper(E, self).meth(a)
2398
2399 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2400
2401 class F(E):
2402 def meth(self, a):
2403 s = self.__super # == mysuper(F, self)
2404 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2405 F._F__super = mysuper(F)
2406
2407 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2408
2409 # Make sure certain errors are raised
2410
2411 try:
2412 super(D, 42)
2413 except TypeError:
2414 pass
2415 else:
2416 self.fail("shouldn't allow super(D, 42)")
2417
2418 try:
2419 super(D, C())
2420 except TypeError:
2421 pass
2422 else:
2423 self.fail("shouldn't allow super(D, C())")
2424
2425 try:
2426 super(D).__get__(12)
2427 except TypeError:
2428 pass
2429 else:
2430 self.fail("shouldn't allow super(D).__get__(12)")
2431
2432 try:
2433 super(D).__get__(C())
2434 except TypeError:
2435 pass
2436 else:
2437 self.fail("shouldn't allow super(D).__get__(C())")
2438
2439 # Make sure data descriptors can be overridden and accessed via super
2440 # (new feature in Python 2.3)
2441
2442 class DDbase(object):
2443 def getx(self): return 42
2444 x = property(getx)
2445
2446 class DDsub(DDbase):
2447 def getx(self): return "hello"
2448 x = property(getx)
2449
2450 dd = DDsub()
2451 self.assertEqual(dd.x, "hello")
2452 self.assertEqual(super(DDsub, dd).x, 42)
2453
2454 # Ensure that super() lookup of descriptor from classmethod
2455 # works (SF ID# 743627)
2456
2457 class Base(object):
2458 aProp = property(lambda self: "foo")
2459
2460 class Sub(Base):
2461 @classmethod
2462 def test(klass):
2463 return super(Sub,klass).aProp
2464
2465 self.assertEqual(Sub.test(), Base.aProp)
2466
2467 # Verify that super() doesn't allow keyword args
2468 try:
2469 super(Base, kw=1)
2470 except TypeError:
2471 pass
2472 else:
2473 self.assertEqual("super shouldn't accept keyword args")
2474
2475 def test_basic_inheritance(self):
2476 # Testing inheritance from basic types...
2477
2478 class hexint(int):
2479 def __repr__(self):
2480 return hex(self)
2481 def __add__(self, other):
2482 return hexint(int.__add__(self, other))
2483 # (Note that overriding __radd__ doesn't work,
2484 # because the int type gets first dibs.)
2485 self.assertEqual(repr(hexint(7) + 9), "0x10")
2486 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2487 a = hexint(12345)
2488 self.assertEqual(a, 12345)
2489 self.assertEqual(int(a), 12345)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002490 self.assertTrue(int(a).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002491 self.assertEqual(hash(a), hash(12345))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002492 self.assertTrue((+a).__class__ is int)
2493 self.assertTrue((a >> 0).__class__ is int)
2494 self.assertTrue((a << 0).__class__ is int)
2495 self.assertTrue((hexint(0) << 12).__class__ is int)
2496 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002497
2498 class octlong(long):
2499 __slots__ = []
2500 def __str__(self):
2501 s = oct(self)
2502 if s[-1] == 'L':
2503 s = s[:-1]
2504 return s
2505 def __add__(self, other):
2506 return self.__class__(super(octlong, self).__add__(other))
2507 __radd__ = __add__
2508 self.assertEqual(str(octlong(3) + 5), "010")
2509 # (Note that overriding __radd__ here only seems to work
2510 # because the example uses a short int left argument.)
2511 self.assertEqual(str(5 + octlong(3000)), "05675")
2512 a = octlong(12345)
2513 self.assertEqual(a, 12345L)
2514 self.assertEqual(long(a), 12345L)
2515 self.assertEqual(hash(a), hash(12345L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002516 self.assertTrue(long(a).__class__ is long)
2517 self.assertTrue((+a).__class__ is long)
2518 self.assertTrue((-a).__class__ is long)
2519 self.assertTrue((-octlong(0)).__class__ is long)
2520 self.assertTrue((a >> 0).__class__ is long)
2521 self.assertTrue((a << 0).__class__ is long)
2522 self.assertTrue((a - 0).__class__ is long)
2523 self.assertTrue((a * 1).__class__ is long)
2524 self.assertTrue((a ** 1).__class__ is long)
2525 self.assertTrue((a // 1).__class__ is long)
2526 self.assertTrue((1 * a).__class__ is long)
2527 self.assertTrue((a | 0).__class__ is long)
2528 self.assertTrue((a ^ 0).__class__ is long)
2529 self.assertTrue((a & -1L).__class__ is long)
2530 self.assertTrue((octlong(0) << 12).__class__ is long)
2531 self.assertTrue((octlong(0) >> 12).__class__ is long)
2532 self.assertTrue(abs(octlong(0)).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002533
2534 # Because octlong overrides __add__, we can't check the absence of +0
2535 # optimizations using octlong.
2536 class longclone(long):
2537 pass
2538 a = longclone(1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002539 self.assertTrue((a + 0).__class__ is long)
2540 self.assertTrue((0 + a).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002541
2542 # Check that negative clones don't segfault
2543 a = longclone(-1)
2544 self.assertEqual(a.__dict__, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002545 self.assertEqual(long(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl48545522008-02-02 10:12:36 +00002546
2547 class precfloat(float):
2548 __slots__ = ['prec']
2549 def __init__(self, value=0.0, prec=12):
2550 self.prec = int(prec)
2551 def __repr__(self):
2552 return "%.*g" % (self.prec, self)
2553 self.assertEqual(repr(precfloat(1.1)), "1.1")
2554 a = precfloat(12345)
2555 self.assertEqual(a, 12345.0)
2556 self.assertEqual(float(a), 12345.0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002557 self.assertTrue(float(a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002558 self.assertEqual(hash(a), hash(12345.0))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002559 self.assertTrue((+a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002560
2561 class madcomplex(complex):
2562 def __repr__(self):
2563 return "%.17gj%+.17g" % (self.imag, self.real)
2564 a = madcomplex(-3, 4)
2565 self.assertEqual(repr(a), "4j-3")
2566 base = complex(-3, 4)
2567 self.assertEqual(base.__class__, complex)
2568 self.assertEqual(a, base)
2569 self.assertEqual(complex(a), base)
2570 self.assertEqual(complex(a).__class__, complex)
2571 a = madcomplex(a) # just trying another form of the constructor
2572 self.assertEqual(repr(a), "4j-3")
2573 self.assertEqual(a, base)
2574 self.assertEqual(complex(a), base)
2575 self.assertEqual(complex(a).__class__, complex)
2576 self.assertEqual(hash(a), hash(base))
2577 self.assertEqual((+a).__class__, complex)
2578 self.assertEqual((a + 0).__class__, complex)
2579 self.assertEqual(a + 0, base)
2580 self.assertEqual((a - 0).__class__, complex)
2581 self.assertEqual(a - 0, base)
2582 self.assertEqual((a * 1).__class__, complex)
2583 self.assertEqual(a * 1, base)
2584 self.assertEqual((a / 1).__class__, complex)
2585 self.assertEqual(a / 1, base)
2586
2587 class madtuple(tuple):
2588 _rev = None
2589 def rev(self):
2590 if self._rev is not None:
2591 return self._rev
2592 L = list(self)
2593 L.reverse()
2594 self._rev = self.__class__(L)
2595 return self._rev
2596 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2597 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2598 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2599 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2600 for i in range(512):
2601 t = madtuple(range(i))
2602 u = t.rev()
2603 v = u.rev()
2604 self.assertEqual(v, t)
2605 a = madtuple((1,2,3,4,5))
2606 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002607 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002608 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002609 self.assertTrue(a[:].__class__ is tuple)
2610 self.assertTrue((a * 1).__class__ is tuple)
2611 self.assertTrue((a * 0).__class__ is tuple)
2612 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002613 a = madtuple(())
2614 self.assertEqual(tuple(a), ())
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002615 self.assertTrue(tuple(a).__class__ is tuple)
2616 self.assertTrue((a + a).__class__ is tuple)
2617 self.assertTrue((a * 0).__class__ is tuple)
2618 self.assertTrue((a * 1).__class__ is tuple)
2619 self.assertTrue((a * 2).__class__ is tuple)
2620 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002621
2622 class madstring(str):
2623 _rev = None
2624 def rev(self):
2625 if self._rev is not None:
2626 return self._rev
2627 L = list(self)
2628 L.reverse()
2629 self._rev = self.__class__("".join(L))
2630 return self._rev
2631 s = madstring("abcdefghijklmnopqrstuvwxyz")
2632 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2633 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2634 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2635 for i in range(256):
2636 s = madstring("".join(map(chr, range(i))))
2637 t = s.rev()
2638 u = t.rev()
2639 self.assertEqual(u, s)
2640 s = madstring("12345")
2641 self.assertEqual(str(s), "12345")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002642 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002643
2644 base = "\x00" * 5
2645 s = madstring(base)
2646 self.assertEqual(s, base)
2647 self.assertEqual(str(s), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002648 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002649 self.assertEqual(hash(s), hash(base))
2650 self.assertEqual({s: 1}[base], 1)
2651 self.assertEqual({base: 1}[s], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002652 self.assertTrue((s + "").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002653 self.assertEqual(s + "", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002654 self.assertTrue(("" + s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002655 self.assertEqual("" + s, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002656 self.assertTrue((s * 0).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002657 self.assertEqual(s * 0, "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002658 self.assertTrue((s * 1).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002659 self.assertEqual(s * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002660 self.assertTrue((s * 2).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002661 self.assertEqual(s * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002662 self.assertTrue(s[:].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002663 self.assertEqual(s[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002664 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002665 self.assertEqual(s[0:0], "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002666 self.assertTrue(s.strip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002667 self.assertEqual(s.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002668 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002669 self.assertEqual(s.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002670 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002671 self.assertEqual(s.rstrip(), base)
2672 identitytab = ''.join([chr(i) for i in range(256)])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002673 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002674 self.assertEqual(s.translate(identitytab), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002675 self.assertTrue(s.translate(identitytab, "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002676 self.assertEqual(s.translate(identitytab, "x"), base)
2677 self.assertEqual(s.translate(identitytab, "\x00"), "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002678 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002679 self.assertEqual(s.replace("x", "x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002680 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002681 self.assertEqual(s.ljust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002682 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002683 self.assertEqual(s.rjust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002684 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002685 self.assertEqual(s.center(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002686 self.assertTrue(s.lower().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002687 self.assertEqual(s.lower(), base)
2688
2689 class madunicode(unicode):
2690 _rev = None
2691 def rev(self):
2692 if self._rev is not None:
2693 return self._rev
2694 L = list(self)
2695 L.reverse()
2696 self._rev = self.__class__(u"".join(L))
2697 return self._rev
2698 u = madunicode("ABCDEF")
2699 self.assertEqual(u, u"ABCDEF")
2700 self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
2701 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
2702 base = u"12345"
2703 u = madunicode(base)
2704 self.assertEqual(unicode(u), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002705 self.assertTrue(unicode(u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002706 self.assertEqual(hash(u), hash(base))
2707 self.assertEqual({u: 1}[base], 1)
2708 self.assertEqual({base: 1}[u], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002709 self.assertTrue(u.strip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002710 self.assertEqual(u.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002711 self.assertTrue(u.lstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002712 self.assertEqual(u.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002713 self.assertTrue(u.rstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002714 self.assertEqual(u.rstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002715 self.assertTrue(u.replace(u"x", u"x").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002716 self.assertEqual(u.replace(u"x", u"x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002717 self.assertTrue(u.replace(u"xy", u"xy").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002718 self.assertEqual(u.replace(u"xy", u"xy"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002719 self.assertTrue(u.center(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002720 self.assertEqual(u.center(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002721 self.assertTrue(u.ljust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002722 self.assertEqual(u.ljust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002723 self.assertTrue(u.rjust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002724 self.assertEqual(u.rjust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002725 self.assertTrue(u.lower().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002726 self.assertEqual(u.lower(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002727 self.assertTrue(u.upper().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002728 self.assertEqual(u.upper(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002729 self.assertTrue(u.capitalize().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002730 self.assertEqual(u.capitalize(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002731 self.assertTrue(u.title().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002732 self.assertEqual(u.title(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002733 self.assertTrue((u + u"").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002734 self.assertEqual(u + u"", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002735 self.assertTrue((u"" + u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002736 self.assertEqual(u"" + u, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002737 self.assertTrue((u * 0).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002738 self.assertEqual(u * 0, u"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002739 self.assertTrue((u * 1).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002740 self.assertEqual(u * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002741 self.assertTrue((u * 2).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002742 self.assertEqual(u * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002743 self.assertTrue(u[:].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002744 self.assertEqual(u[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002745 self.assertTrue(u[0:0].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002746 self.assertEqual(u[0:0], u"")
2747
2748 class sublist(list):
2749 pass
2750 a = sublist(range(5))
2751 self.assertEqual(a, range(5))
2752 a.append("hello")
2753 self.assertEqual(a, range(5) + ["hello"])
2754 a[5] = 5
2755 self.assertEqual(a, range(6))
2756 a.extend(range(6, 20))
2757 self.assertEqual(a, range(20))
2758 a[-5:] = []
2759 self.assertEqual(a, range(15))
2760 del a[10:15]
2761 self.assertEqual(len(a), 10)
2762 self.assertEqual(a, range(10))
2763 self.assertEqual(list(a), range(10))
2764 self.assertEqual(a[0], 0)
2765 self.assertEqual(a[9], 9)
2766 self.assertEqual(a[-10], 0)
2767 self.assertEqual(a[-1], 9)
2768 self.assertEqual(a[:5], range(5))
2769
2770 class CountedInput(file):
2771 """Counts lines read by self.readline().
2772
2773 self.lineno is the 0-based ordinal of the last line read, up to
2774 a maximum of one greater than the number of lines in the file.
2775
2776 self.ateof is true if and only if the final "" line has been read,
2777 at which point self.lineno stops incrementing, and further calls
2778 to readline() continue to return "".
2779 """
2780
2781 lineno = 0
2782 ateof = 0
2783 def readline(self):
2784 if self.ateof:
2785 return ""
2786 s = file.readline(self)
2787 # Next line works too.
2788 # s = super(CountedInput, self).readline()
2789 self.lineno += 1
2790 if s == "":
2791 self.ateof = 1
2792 return s
2793
2794 f = file(name=test_support.TESTFN, mode='w')
2795 lines = ['a\n', 'b\n', 'c\n']
2796 try:
2797 f.writelines(lines)
2798 f.close()
2799 f = CountedInput(test_support.TESTFN)
2800 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2801 got = f.readline()
2802 self.assertEqual(expected, got)
2803 self.assertEqual(f.lineno, i)
2804 self.assertEqual(f.ateof, (i > len(lines)))
2805 f.close()
2806 finally:
2807 try:
2808 f.close()
2809 except:
2810 pass
2811 test_support.unlink(test_support.TESTFN)
2812
2813 def test_keywords(self):
2814 # Testing keyword args to basic type constructors ...
2815 self.assertEqual(int(x=1), 1)
2816 self.assertEqual(float(x=2), 2.0)
2817 self.assertEqual(long(x=3), 3L)
2818 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2819 self.assertEqual(str(object=500), '500')
2820 self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
2821 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2822 self.assertEqual(list(sequence=(0, 1, 2)), range(3))
2823 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2824
2825 for constructor in (int, float, long, complex, str, unicode,
2826 tuple, list, file):
2827 try:
2828 constructor(bogus_keyword_arg=1)
2829 except TypeError:
2830 pass
2831 else:
2832 self.fail("expected TypeError from bogus keyword argument to %r"
2833 % constructor)
2834
2835 def test_str_subclass_as_dict_key(self):
2836 # Testing a str subclass used as dict key ..
2837
2838 class cistr(str):
2839 """Sublcass of str that computes __eq__ case-insensitively.
2840
2841 Also computes a hash code of the string in canonical form.
2842 """
2843
2844 def __init__(self, value):
2845 self.canonical = value.lower()
2846 self.hashcode = hash(self.canonical)
2847
2848 def __eq__(self, other):
2849 if not isinstance(other, cistr):
2850 other = cistr(other)
2851 return self.canonical == other.canonical
2852
2853 def __hash__(self):
2854 return self.hashcode
2855
2856 self.assertEqual(cistr('ABC'), 'abc')
2857 self.assertEqual('aBc', cistr('ABC'))
2858 self.assertEqual(str(cistr('ABC')), 'ABC')
2859
2860 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2861 self.assertEqual(d[cistr('one')], 1)
2862 self.assertEqual(d[cistr('tWo')], 2)
2863 self.assertEqual(d[cistr('THrEE')], 3)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002864 self.assertTrue(cistr('ONe') in d)
Georg Brandl48545522008-02-02 10:12:36 +00002865 self.assertEqual(d.get(cistr('thrEE')), 3)
2866
2867 def test_classic_comparisons(self):
2868 # Testing classic comparisons...
2869 class classic:
2870 pass
2871
2872 for base in (classic, int, object):
2873 class C(base):
2874 def __init__(self, value):
2875 self.value = int(value)
2876 def __cmp__(self, other):
2877 if isinstance(other, C):
2878 return cmp(self.value, other.value)
2879 if isinstance(other, int) or isinstance(other, long):
2880 return cmp(self.value, other)
2881 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002882 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002883
2884 c1 = C(1)
2885 c2 = C(2)
2886 c3 = C(3)
2887 self.assertEqual(c1, 1)
2888 c = {1: c1, 2: c2, 3: c3}
2889 for x in 1, 2, 3:
2890 for y in 1, 2, 3:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002891 self.assertTrue(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002892 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002893 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002894 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002895 self.assertTrue(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2896 self.assertTrue(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002897
2898 def test_rich_comparisons(self):
2899 # Testing rich comparisons...
2900 class Z(complex):
2901 pass
2902 z = Z(1)
2903 self.assertEqual(z, 1+0j)
2904 self.assertEqual(1+0j, z)
2905 class ZZ(complex):
2906 def __eq__(self, other):
2907 try:
2908 return abs(self - other) <= 1e-6
2909 except:
2910 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002911 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002912 zz = ZZ(1.0000003)
2913 self.assertEqual(zz, 1+0j)
2914 self.assertEqual(1+0j, zz)
2915
2916 class classic:
2917 pass
2918 for base in (classic, int, object, list):
2919 class C(base):
2920 def __init__(self, value):
2921 self.value = int(value)
2922 def __cmp__(self_, other):
2923 self.fail("shouldn't call __cmp__")
Nick Coghlan48361f52008-08-11 15:45:58 +00002924 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002925 def __eq__(self, other):
2926 if isinstance(other, C):
2927 return self.value == other.value
2928 if isinstance(other, int) or isinstance(other, long):
2929 return self.value == other
2930 return NotImplemented
2931 def __ne__(self, other):
2932 if isinstance(other, C):
2933 return self.value != other.value
2934 if isinstance(other, int) or isinstance(other, long):
2935 return self.value != other
2936 return NotImplemented
2937 def __lt__(self, other):
2938 if isinstance(other, C):
2939 return self.value < other.value
2940 if isinstance(other, int) or isinstance(other, long):
2941 return self.value < other
2942 return NotImplemented
2943 def __le__(self, other):
2944 if isinstance(other, C):
2945 return self.value <= other.value
2946 if isinstance(other, int) or isinstance(other, long):
2947 return self.value <= other
2948 return NotImplemented
2949 def __gt__(self, other):
2950 if isinstance(other, C):
2951 return self.value > other.value
2952 if isinstance(other, int) or isinstance(other, long):
2953 return self.value > other
2954 return NotImplemented
2955 def __ge__(self, other):
2956 if isinstance(other, C):
2957 return self.value >= other.value
2958 if isinstance(other, int) or isinstance(other, long):
2959 return self.value >= other
2960 return NotImplemented
2961 c1 = C(1)
2962 c2 = C(2)
2963 c3 = C(3)
2964 self.assertEqual(c1, 1)
2965 c = {1: c1, 2: c2, 3: c3}
2966 for x in 1, 2, 3:
2967 for y in 1, 2, 3:
2968 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002969 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002970 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002971 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002972 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002973 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002974 "x=%d, y=%d" % (x, y))
2975
2976 def test_coercions(self):
2977 # Testing coercions...
2978 class I(int): pass
2979 coerce(I(0), 0)
2980 coerce(0, I(0))
2981 class L(long): pass
2982 coerce(L(0), 0)
2983 coerce(L(0), 0L)
2984 coerce(0, L(0))
2985 coerce(0L, L(0))
2986 class F(float): pass
2987 coerce(F(0), 0)
2988 coerce(F(0), 0L)
2989 coerce(F(0), 0.)
2990 coerce(0, F(0))
2991 coerce(0L, F(0))
2992 coerce(0., F(0))
2993 class C(complex): pass
2994 coerce(C(0), 0)
2995 coerce(C(0), 0L)
2996 coerce(C(0), 0.)
2997 coerce(C(0), 0j)
2998 coerce(0, C(0))
2999 coerce(0L, C(0))
3000 coerce(0., C(0))
3001 coerce(0j, C(0))
3002
3003 def test_descrdoc(self):
3004 # Testing descriptor doc strings...
3005 def check(descr, what):
3006 self.assertEqual(descr.__doc__, what)
3007 check(file.closed, "True if the file is closed") # getset descriptor
3008 check(file.name, "file name") # member descriptor
3009
3010 def test_doc_descriptor(self):
3011 # Testing __doc__ descriptor...
3012 # SF bug 542984
3013 class DocDescr(object):
3014 def __get__(self, object, otype):
3015 if object:
3016 object = object.__class__.__name__ + ' instance'
3017 if otype:
3018 otype = otype.__name__
3019 return 'object=%s; type=%s' % (object, otype)
3020 class OldClass:
3021 __doc__ = DocDescr()
3022 class NewClass(object):
3023 __doc__ = DocDescr()
3024 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
3025 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3026 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
3027 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3028
3029 def test_set_class(self):
3030 # Testing __class__ assignment...
3031 class C(object): pass
3032 class D(object): pass
3033 class E(object): pass
3034 class F(D, E): pass
3035 for cls in C, D, E, F:
3036 for cls2 in C, D, E, F:
3037 x = cls()
3038 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003039 self.assertTrue(x.__class__ is cls2)
Georg Brandl48545522008-02-02 10:12:36 +00003040 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003041 self.assertTrue(x.__class__ is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003042 def cant(x, C):
3043 try:
3044 x.__class__ = C
3045 except TypeError:
3046 pass
3047 else:
3048 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
3049 try:
3050 delattr(x, "__class__")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003051 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003052 pass
3053 else:
3054 self.fail("shouldn't allow del %r.__class__" % x)
3055 cant(C(), list)
3056 cant(list(), C)
3057 cant(C(), 1)
3058 cant(C(), object)
3059 cant(object(), list)
3060 cant(list(), object)
3061 class Int(int): __slots__ = []
3062 cant(2, Int)
3063 cant(Int(), int)
3064 cant(True, int)
3065 cant(2, bool)
3066 o = object()
3067 cant(o, type(1))
3068 cant(o, type(None))
3069 del o
3070 class G(object):
3071 __slots__ = ["a", "b"]
3072 class H(object):
3073 __slots__ = ["b", "a"]
3074 try:
3075 unicode
3076 except NameError:
3077 class I(object):
3078 __slots__ = ["a", "b"]
3079 else:
3080 class I(object):
3081 __slots__ = [unicode("a"), unicode("b")]
3082 class J(object):
3083 __slots__ = ["c", "b"]
3084 class K(object):
3085 __slots__ = ["a", "b", "d"]
3086 class L(H):
3087 __slots__ = ["e"]
3088 class M(I):
3089 __slots__ = ["e"]
3090 class N(J):
3091 __slots__ = ["__weakref__"]
3092 class P(J):
3093 __slots__ = ["__dict__"]
3094 class Q(J):
3095 pass
3096 class R(J):
3097 __slots__ = ["__dict__", "__weakref__"]
3098
3099 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
3100 x = cls()
3101 x.a = 1
3102 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003103 self.assertTrue(x.__class__ is cls2,
Georg Brandl48545522008-02-02 10:12:36 +00003104 "assigning %r as __class__ for %r silently failed" % (cls2, x))
3105 self.assertEqual(x.a, 1)
3106 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003107 self.assertTrue(x.__class__ is cls,
Georg Brandl48545522008-02-02 10:12:36 +00003108 "assigning %r as __class__ for %r silently failed" % (cls, x))
3109 self.assertEqual(x.a, 1)
3110 for cls in G, J, K, L, M, N, P, R, list, Int:
3111 for cls2 in G, J, K, L, M, N, P, R, list, Int:
3112 if cls is cls2:
3113 continue
3114 cant(cls(), cls2)
3115
Benjamin Peterson5083dc52009-04-25 00:41:22 +00003116 # Issue5283: when __class__ changes in __del__, the wrong
3117 # type gets DECREF'd.
3118 class O(object):
3119 pass
3120 class A(object):
3121 def __del__(self):
3122 self.__class__ = O
3123 l = [A() for x in range(100)]
3124 del l
3125
Georg Brandl48545522008-02-02 10:12:36 +00003126 def test_set_dict(self):
3127 # Testing __dict__ assignment...
3128 class C(object): pass
3129 a = C()
3130 a.__dict__ = {'b': 1}
3131 self.assertEqual(a.b, 1)
3132 def cant(x, dict):
3133 try:
3134 x.__dict__ = dict
3135 except (AttributeError, TypeError):
3136 pass
3137 else:
3138 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
3139 cant(a, None)
3140 cant(a, [])
3141 cant(a, 1)
3142 del a.__dict__ # Deleting __dict__ is allowed
3143
3144 class Base(object):
3145 pass
3146 def verify_dict_readonly(x):
3147 """
3148 x has to be an instance of a class inheriting from Base.
3149 """
3150 cant(x, {})
3151 try:
3152 del x.__dict__
3153 except (AttributeError, TypeError):
3154 pass
3155 else:
3156 self.fail("shouldn't allow del %r.__dict__" % x)
3157 dict_descr = Base.__dict__["__dict__"]
3158 try:
3159 dict_descr.__set__(x, {})
3160 except (AttributeError, TypeError):
3161 pass
3162 else:
3163 self.fail("dict_descr allowed access to %r's dict" % x)
3164
3165 # Classes don't allow __dict__ assignment and have readonly dicts
3166 class Meta1(type, Base):
3167 pass
3168 class Meta2(Base, type):
3169 pass
3170 class D(object):
3171 __metaclass__ = Meta1
3172 class E(object):
3173 __metaclass__ = Meta2
3174 for cls in C, D, E:
3175 verify_dict_readonly(cls)
3176 class_dict = cls.__dict__
3177 try:
3178 class_dict["spam"] = "eggs"
3179 except TypeError:
3180 pass
3181 else:
3182 self.fail("%r's __dict__ can be modified" % cls)
3183
3184 # Modules also disallow __dict__ assignment
3185 class Module1(types.ModuleType, Base):
3186 pass
3187 class Module2(Base, types.ModuleType):
3188 pass
3189 for ModuleType in Module1, Module2:
3190 mod = ModuleType("spam")
3191 verify_dict_readonly(mod)
3192 mod.__dict__["spam"] = "eggs"
3193
3194 # Exception's __dict__ can be replaced, but not deleted
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003195 # (at least not any more than regular exception's __dict__ can
3196 # be deleted; on CPython it is not the case, whereas on PyPy they
3197 # can, just like any other new-style instance's __dict__.)
3198 def can_delete_dict(e):
3199 try:
3200 del e.__dict__
3201 except (TypeError, AttributeError):
3202 return False
3203 else:
3204 return True
Georg Brandl48545522008-02-02 10:12:36 +00003205 class Exception1(Exception, Base):
3206 pass
3207 class Exception2(Base, Exception):
3208 pass
3209 for ExceptionType in Exception, Exception1, Exception2:
3210 e = ExceptionType()
3211 e.__dict__ = {"a": 1}
3212 self.assertEqual(e.a, 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003213 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl48545522008-02-02 10:12:36 +00003214
3215 def test_pickles(self):
3216 # Testing pickling and copying new-style classes and objects...
3217 import pickle, cPickle
3218
3219 def sorteditems(d):
3220 L = d.items()
3221 L.sort()
3222 return L
3223
3224 global C
3225 class C(object):
3226 def __init__(self, a, b):
3227 super(C, self).__init__()
3228 self.a = a
3229 self.b = b
3230 def __repr__(self):
3231 return "C(%r, %r)" % (self.a, self.b)
3232
3233 global C1
3234 class C1(list):
3235 def __new__(cls, a, b):
3236 return super(C1, cls).__new__(cls)
3237 def __getnewargs__(self):
3238 return (self.a, self.b)
3239 def __init__(self, a, b):
3240 self.a = a
3241 self.b = b
3242 def __repr__(self):
3243 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3244
3245 global C2
3246 class C2(int):
3247 def __new__(cls, a, b, val=0):
3248 return super(C2, cls).__new__(cls, val)
3249 def __getnewargs__(self):
3250 return (self.a, self.b, int(self))
3251 def __init__(self, a, b, val=0):
3252 self.a = a
3253 self.b = b
3254 def __repr__(self):
3255 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3256
3257 global C3
3258 class C3(object):
3259 def __init__(self, foo):
3260 self.foo = foo
3261 def __getstate__(self):
3262 return self.foo
3263 def __setstate__(self, foo):
3264 self.foo = foo
3265
3266 global C4classic, C4
3267 class C4classic: # classic
3268 pass
3269 class C4(C4classic, object): # mixed inheritance
3270 pass
3271
3272 for p in pickle, cPickle:
3273 for bin in 0, 1:
3274 for cls in C, C1, C2:
3275 s = p.dumps(cls, bin)
3276 cls2 = p.loads(s)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003277 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003278
3279 a = C1(1, 2); a.append(42); a.append(24)
3280 b = C2("hello", "world", 42)
3281 s = p.dumps((a, b), bin)
3282 x, y = p.loads(s)
3283 self.assertEqual(x.__class__, a.__class__)
3284 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3285 self.assertEqual(y.__class__, b.__class__)
3286 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3287 self.assertEqual(repr(x), repr(a))
3288 self.assertEqual(repr(y), repr(b))
3289 # Test for __getstate__ and __setstate__ on new style class
3290 u = C3(42)
3291 s = p.dumps(u, bin)
3292 v = p.loads(s)
3293 self.assertEqual(u.__class__, v.__class__)
3294 self.assertEqual(u.foo, v.foo)
3295 # Test for picklability of hybrid class
3296 u = C4()
3297 u.foo = 42
3298 s = p.dumps(u, bin)
3299 v = p.loads(s)
3300 self.assertEqual(u.__class__, v.__class__)
3301 self.assertEqual(u.foo, v.foo)
3302
3303 # Testing copy.deepcopy()
3304 import copy
3305 for cls in C, C1, C2:
3306 cls2 = copy.deepcopy(cls)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003307 self.assertTrue(cls2 is 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 x, y = copy.deepcopy((a, b))
3312 self.assertEqual(x.__class__, a.__class__)
3313 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3314 self.assertEqual(y.__class__, b.__class__)
3315 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3316 self.assertEqual(repr(x), repr(a))
3317 self.assertEqual(repr(y), repr(b))
3318
3319 def test_pickle_slots(self):
3320 # Testing pickling of classes with __slots__ ...
3321 import pickle, cPickle
3322 # Pickling of classes with __slots__ but without __getstate__ should fail
3323 global B, C, D, E
3324 class B(object):
3325 pass
3326 for base in [object, B]:
3327 class C(base):
3328 __slots__ = ['a']
3329 class D(C):
3330 pass
3331 try:
3332 pickle.dumps(C())
3333 except TypeError:
3334 pass
3335 else:
3336 self.fail("should fail: pickle C instance - %s" % base)
3337 try:
3338 cPickle.dumps(C())
3339 except TypeError:
3340 pass
3341 else:
3342 self.fail("should fail: cPickle C instance - %s" % base)
3343 try:
3344 pickle.dumps(C())
3345 except TypeError:
3346 pass
3347 else:
3348 self.fail("should fail: pickle D instance - %s" % base)
3349 try:
3350 cPickle.dumps(D())
3351 except TypeError:
3352 pass
3353 else:
3354 self.fail("should fail: cPickle D instance - %s" % base)
3355 # Give C a nice generic __getstate__ and __setstate__
3356 class C(base):
3357 __slots__ = ['a']
3358 def __getstate__(self):
3359 try:
3360 d = self.__dict__.copy()
3361 except AttributeError:
3362 d = {}
3363 for cls in self.__class__.__mro__:
3364 for sn in cls.__dict__.get('__slots__', ()):
3365 try:
3366 d[sn] = getattr(self, sn)
3367 except AttributeError:
3368 pass
3369 return d
3370 def __setstate__(self, d):
3371 for k, v in d.items():
3372 setattr(self, k, v)
3373 class D(C):
3374 pass
3375 # Now it should work
3376 x = C()
3377 y = pickle.loads(pickle.dumps(x))
3378 self.assertEqual(hasattr(y, 'a'), 0)
3379 y = cPickle.loads(cPickle.dumps(x))
3380 self.assertEqual(hasattr(y, 'a'), 0)
3381 x.a = 42
3382 y = pickle.loads(pickle.dumps(x))
3383 self.assertEqual(y.a, 42)
3384 y = cPickle.loads(cPickle.dumps(x))
3385 self.assertEqual(y.a, 42)
3386 x = D()
3387 x.a = 42
3388 x.b = 100
3389 y = pickle.loads(pickle.dumps(x))
3390 self.assertEqual(y.a + y.b, 142)
3391 y = cPickle.loads(cPickle.dumps(x))
3392 self.assertEqual(y.a + y.b, 142)
3393 # A subclass that adds a slot should also work
3394 class E(C):
3395 __slots__ = ['b']
3396 x = E()
3397 x.a = 42
3398 x.b = "foo"
3399 y = pickle.loads(pickle.dumps(x))
3400 self.assertEqual(y.a, x.a)
3401 self.assertEqual(y.b, x.b)
3402 y = cPickle.loads(cPickle.dumps(x))
3403 self.assertEqual(y.a, x.a)
3404 self.assertEqual(y.b, x.b)
3405
3406 def test_binary_operator_override(self):
3407 # Testing overrides of binary operations...
3408 class I(int):
3409 def __repr__(self):
3410 return "I(%r)" % int(self)
3411 def __add__(self, other):
3412 return I(int(self) + int(other))
3413 __radd__ = __add__
3414 def __pow__(self, other, mod=None):
3415 if mod is None:
3416 return I(pow(int(self), int(other)))
3417 else:
3418 return I(pow(int(self), int(other), int(mod)))
3419 def __rpow__(self, other, mod=None):
3420 if mod is None:
3421 return I(pow(int(other), int(self), mod))
3422 else:
3423 return I(pow(int(other), int(self), int(mod)))
3424
3425 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3426 self.assertEqual(repr(I(1) + 2), "I(3)")
3427 self.assertEqual(repr(1 + I(2)), "I(3)")
3428 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3429 self.assertEqual(repr(2 ** I(3)), "I(8)")
3430 self.assertEqual(repr(I(2) ** 3), "I(8)")
3431 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3432 class S(str):
3433 def __eq__(self, other):
3434 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003435 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003436
3437 def test_subclass_propagation(self):
3438 # Testing propagation of slot functions to subclasses...
3439 class A(object):
3440 pass
3441 class B(A):
3442 pass
3443 class C(A):
3444 pass
3445 class D(B, C):
3446 pass
3447 d = D()
3448 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3449 A.__hash__ = lambda self: 42
3450 self.assertEqual(hash(d), 42)
3451 C.__hash__ = lambda self: 314
3452 self.assertEqual(hash(d), 314)
3453 B.__hash__ = lambda self: 144
3454 self.assertEqual(hash(d), 144)
3455 D.__hash__ = lambda self: 100
3456 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003457 D.__hash__ = None
3458 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003459 del D.__hash__
3460 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003461 B.__hash__ = None
3462 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003463 del B.__hash__
3464 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003465 C.__hash__ = None
3466 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003467 del C.__hash__
3468 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003469 A.__hash__ = None
3470 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003471 del A.__hash__
3472 self.assertEqual(hash(d), orig_hash)
3473 d.foo = 42
3474 d.bar = 42
3475 self.assertEqual(d.foo, 42)
3476 self.assertEqual(d.bar, 42)
3477 def __getattribute__(self, name):
3478 if name == "foo":
3479 return 24
3480 return object.__getattribute__(self, name)
3481 A.__getattribute__ = __getattribute__
3482 self.assertEqual(d.foo, 24)
3483 self.assertEqual(d.bar, 42)
3484 def __getattr__(self, name):
3485 if name in ("spam", "foo", "bar"):
3486 return "hello"
3487 raise AttributeError, name
3488 B.__getattr__ = __getattr__
3489 self.assertEqual(d.spam, "hello")
3490 self.assertEqual(d.foo, 24)
3491 self.assertEqual(d.bar, 42)
3492 del A.__getattribute__
3493 self.assertEqual(d.foo, 42)
3494 del d.foo
3495 self.assertEqual(d.foo, "hello")
3496 self.assertEqual(d.bar, 42)
3497 del B.__getattr__
3498 try:
3499 d.foo
3500 except AttributeError:
3501 pass
3502 else:
3503 self.fail("d.foo should be undefined now")
3504
3505 # Test a nasty bug in recurse_down_subclasses()
3506 import gc
3507 class A(object):
3508 pass
3509 class B(A):
3510 pass
3511 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003512 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003513 A.__setitem__ = lambda *a: None # crash
3514
3515 def test_buffer_inheritance(self):
3516 # Testing that buffer interface is inherited ...
3517
3518 import binascii
3519 # SF bug [#470040] ParseTuple t# vs subclasses.
3520
3521 class MyStr(str):
3522 pass
3523 base = 'abc'
3524 m = MyStr(base)
3525 # b2a_hex uses the buffer interface to get its argument's value, via
3526 # PyArg_ParseTuple 't#' code.
3527 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3528
3529 # It's not clear that unicode will continue to support the character
3530 # buffer interface, and this test will fail if that's taken away.
3531 class MyUni(unicode):
3532 pass
3533 base = u'abc'
3534 m = MyUni(base)
3535 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3536
3537 class MyInt(int):
3538 pass
3539 m = MyInt(42)
3540 try:
3541 binascii.b2a_hex(m)
3542 self.fail('subclass of int should not have a buffer interface')
3543 except TypeError:
3544 pass
3545
3546 def test_str_of_str_subclass(self):
3547 # Testing __str__ defined in subclass of str ...
3548 import binascii
3549 import cStringIO
3550
3551 class octetstring(str):
3552 def __str__(self):
3553 return binascii.b2a_hex(self)
3554 def __repr__(self):
3555 return self + " repr"
3556
3557 o = octetstring('A')
3558 self.assertEqual(type(o), octetstring)
3559 self.assertEqual(type(str(o)), str)
3560 self.assertEqual(type(repr(o)), str)
3561 self.assertEqual(ord(o), 0x41)
3562 self.assertEqual(str(o), '41')
3563 self.assertEqual(repr(o), 'A repr')
3564 self.assertEqual(o.__str__(), '41')
3565 self.assertEqual(o.__repr__(), 'A repr')
3566
3567 capture = cStringIO.StringIO()
3568 # Calling str() or not exercises different internal paths.
3569 print >> capture, o
3570 print >> capture, str(o)
3571 self.assertEqual(capture.getvalue(), '41\n41\n')
3572 capture.close()
3573
3574 def test_keyword_arguments(self):
3575 # Testing keyword arguments to __init__, __call__...
3576 def f(a): return a
3577 self.assertEqual(f.__call__(a=42), 42)
3578 a = []
3579 list.__init__(a, sequence=[0, 1, 2])
3580 self.assertEqual(a, [0, 1, 2])
3581
3582 def test_recursive_call(self):
3583 # Testing recursive __call__() by setting to instance of class...
3584 class A(object):
3585 pass
3586
3587 A.__call__ = A()
3588 try:
3589 A()()
3590 except RuntimeError:
3591 pass
3592 else:
3593 self.fail("Recursion limit should have been reached for __call__()")
3594
3595 def test_delete_hook(self):
3596 # Testing __del__ hook...
3597 log = []
3598 class C(object):
3599 def __del__(self):
3600 log.append(1)
3601 c = C()
3602 self.assertEqual(log, [])
3603 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003604 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003605 self.assertEqual(log, [1])
3606
3607 class D(object): pass
3608 d = D()
3609 try: del d[0]
3610 except TypeError: pass
3611 else: self.fail("invalid del() didn't raise TypeError")
3612
3613 def test_hash_inheritance(self):
3614 # Testing hash of mutable subclasses...
3615
3616 class mydict(dict):
3617 pass
3618 d = mydict()
3619 try:
3620 hash(d)
3621 except TypeError:
3622 pass
3623 else:
3624 self.fail("hash() of dict subclass should fail")
3625
3626 class mylist(list):
3627 pass
3628 d = mylist()
3629 try:
3630 hash(d)
3631 except TypeError:
3632 pass
3633 else:
3634 self.fail("hash() of list subclass should fail")
3635
3636 def test_str_operations(self):
3637 try: 'a' + 5
3638 except TypeError: pass
3639 else: self.fail("'' + 5 doesn't raise TypeError")
3640
3641 try: ''.split('')
3642 except ValueError: pass
3643 else: self.fail("''.split('') doesn't raise ValueError")
3644
3645 try: ''.join([0])
3646 except TypeError: pass
3647 else: self.fail("''.join([0]) doesn't raise TypeError")
3648
3649 try: ''.rindex('5')
3650 except ValueError: pass
3651 else: self.fail("''.rindex('5') doesn't raise ValueError")
3652
3653 try: '%(n)s' % None
3654 except TypeError: pass
3655 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3656
3657 try: '%(n' % {}
3658 except ValueError: pass
3659 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3660
3661 try: '%*s' % ('abc')
3662 except TypeError: pass
3663 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3664
3665 try: '%*.*s' % ('abc', 5)
3666 except TypeError: pass
3667 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3668
3669 try: '%s' % (1, 2)
3670 except TypeError: pass
3671 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3672
3673 try: '%' % None
3674 except ValueError: pass
3675 else: self.fail("'%' % None doesn't raise ValueError")
3676
3677 self.assertEqual('534253'.isdigit(), 1)
3678 self.assertEqual('534253x'.isdigit(), 0)
3679 self.assertEqual('%c' % 5, '\x05')
3680 self.assertEqual('%c' % '5', '5')
3681
3682 def test_deepcopy_recursive(self):
3683 # Testing deepcopy of recursive objects...
3684 class Node:
3685 pass
3686 a = Node()
3687 b = Node()
3688 a.b = b
3689 b.a = a
3690 z = deepcopy(a) # This blew up before
3691
3692 def test_unintialized_modules(self):
3693 # Testing uninitialized module objects...
3694 from types import ModuleType as M
3695 m = M.__new__(M)
3696 str(m)
3697 self.assertEqual(hasattr(m, "__name__"), 0)
3698 self.assertEqual(hasattr(m, "__file__"), 0)
3699 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003700 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003701 m.foo = 1
3702 self.assertEqual(m.__dict__, {"foo": 1})
3703
3704 def test_funny_new(self):
3705 # Testing __new__ returning something unexpected...
3706 class C(object):
3707 def __new__(cls, arg):
3708 if isinstance(arg, str): return [1, 2, 3]
3709 elif isinstance(arg, int): return object.__new__(D)
3710 else: return object.__new__(cls)
3711 class D(C):
3712 def __init__(self, arg):
3713 self.foo = arg
3714 self.assertEqual(C("1"), [1, 2, 3])
3715 self.assertEqual(D("1"), [1, 2, 3])
3716 d = D(None)
3717 self.assertEqual(d.foo, None)
3718 d = C(1)
3719 self.assertEqual(isinstance(d, D), True)
3720 self.assertEqual(d.foo, 1)
3721 d = D(1)
3722 self.assertEqual(isinstance(d, D), True)
3723 self.assertEqual(d.foo, 1)
3724
3725 def test_imul_bug(self):
3726 # Testing for __imul__ problems...
3727 # SF bug 544647
3728 class C(object):
3729 def __imul__(self, other):
3730 return (self, other)
3731 x = C()
3732 y = x
3733 y *= 1.0
3734 self.assertEqual(y, (x, 1.0))
3735 y = x
3736 y *= 2
3737 self.assertEqual(y, (x, 2))
3738 y = x
3739 y *= 3L
3740 self.assertEqual(y, (x, 3L))
3741 y = x
3742 y *= 1L<<100
3743 self.assertEqual(y, (x, 1L<<100))
3744 y = x
3745 y *= None
3746 self.assertEqual(y, (x, None))
3747 y = x
3748 y *= "foo"
3749 self.assertEqual(y, (x, "foo"))
3750
3751 def test_copy_setstate(self):
3752 # Testing that copy.*copy() correctly uses __setstate__...
3753 import copy
3754 class C(object):
3755 def __init__(self, foo=None):
3756 self.foo = foo
3757 self.__foo = foo
3758 def setfoo(self, foo=None):
3759 self.foo = foo
3760 def getfoo(self):
3761 return self.__foo
3762 def __getstate__(self):
3763 return [self.foo]
3764 def __setstate__(self_, lst):
3765 self.assertEqual(len(lst), 1)
3766 self_.__foo = self_.foo = lst[0]
3767 a = C(42)
3768 a.setfoo(24)
3769 self.assertEqual(a.foo, 24)
3770 self.assertEqual(a.getfoo(), 42)
3771 b = copy.copy(a)
3772 self.assertEqual(b.foo, 24)
3773 self.assertEqual(b.getfoo(), 24)
3774 b = copy.deepcopy(a)
3775 self.assertEqual(b.foo, 24)
3776 self.assertEqual(b.getfoo(), 24)
3777
3778 def test_slices(self):
3779 # Testing cases with slices and overridden __getitem__ ...
3780
3781 # Strings
3782 self.assertEqual("hello"[:4], "hell")
3783 self.assertEqual("hello"[slice(4)], "hell")
3784 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3785 class S(str):
3786 def __getitem__(self, x):
3787 return str.__getitem__(self, x)
3788 self.assertEqual(S("hello")[:4], "hell")
3789 self.assertEqual(S("hello")[slice(4)], "hell")
3790 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3791 # Tuples
3792 self.assertEqual((1,2,3)[:2], (1,2))
3793 self.assertEqual((1,2,3)[slice(2)], (1,2))
3794 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3795 class T(tuple):
3796 def __getitem__(self, x):
3797 return tuple.__getitem__(self, x)
3798 self.assertEqual(T((1,2,3))[:2], (1,2))
3799 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3800 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3801 # Lists
3802 self.assertEqual([1,2,3][:2], [1,2])
3803 self.assertEqual([1,2,3][slice(2)], [1,2])
3804 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3805 class L(list):
3806 def __getitem__(self, x):
3807 return list.__getitem__(self, x)
3808 self.assertEqual(L([1,2,3])[:2], [1,2])
3809 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3810 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3811 # Now do lists and __setitem__
3812 a = L([1,2,3])
3813 a[slice(1, 3)] = [3,2]
3814 self.assertEqual(a, [1,3,2])
3815 a[slice(0, 2, 1)] = [3,1]
3816 self.assertEqual(a, [3,1,2])
3817 a.__setitem__(slice(1, 3), [2,1])
3818 self.assertEqual(a, [3,2,1])
3819 a.__setitem__(slice(0, 2, 1), [2,3])
3820 self.assertEqual(a, [2,3,1])
3821
3822 def test_subtype_resurrection(self):
3823 # Testing resurrection of new-style instance...
3824
3825 class C(object):
3826 container = []
3827
3828 def __del__(self):
3829 # resurrect the instance
3830 C.container.append(self)
3831
3832 c = C()
3833 c.attr = 42
3834
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003835 # The most interesting thing here is whether this blows up, due to
3836 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3837 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003838 del c
3839
3840 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003841 # the last container slot works: that will attempt to delete c again,
3842 # which will cause c to get appended back to the container again
3843 # "during" the del. (On non-CPython implementations, however, __del__
3844 # is typically not called again.)
3845 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003846 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003847 del C.container[-1]
3848 if test_support.check_impl_detail():
3849 test_support.gc_collect()
3850 self.assertEqual(len(C.container), 1)
3851 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003852
3853 # Make c mortal again, so that the test framework with -l doesn't report
3854 # it as a leak.
3855 del C.__del__
3856
3857 def test_slots_trash(self):
3858 # Testing slot trash...
3859 # Deallocating deeply nested slotted trash caused stack overflows
3860 class trash(object):
3861 __slots__ = ['x']
3862 def __init__(self, x):
3863 self.x = x
3864 o = None
3865 for i in xrange(50000):
3866 o = trash(o)
3867 del o
3868
3869 def test_slots_multiple_inheritance(self):
3870 # SF bug 575229, multiple inheritance w/ slots dumps core
3871 class A(object):
3872 __slots__=()
3873 class B(object):
3874 pass
3875 class C(A,B) :
3876 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003877 if test_support.check_impl_detail():
3878 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003879 self.assertTrue(hasattr(C, '__dict__'))
3880 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl48545522008-02-02 10:12:36 +00003881 C().x = 2
3882
3883 def test_rmul(self):
3884 # Testing correct invocation of __rmul__...
3885 # SF patch 592646
3886 class C(object):
3887 def __mul__(self, other):
3888 return "mul"
3889 def __rmul__(self, other):
3890 return "rmul"
3891 a = C()
3892 self.assertEqual(a*2, "mul")
3893 self.assertEqual(a*2.2, "mul")
3894 self.assertEqual(2*a, "rmul")
3895 self.assertEqual(2.2*a, "rmul")
3896
3897 def test_ipow(self):
3898 # Testing correct invocation of __ipow__...
3899 # [SF bug 620179]
3900 class C(object):
3901 def __ipow__(self, other):
3902 pass
3903 a = C()
3904 a **= 2
3905
3906 def test_mutable_bases(self):
3907 # Testing mutable bases...
3908
3909 # stuff that should work:
3910 class C(object):
3911 pass
3912 class C2(object):
3913 def __getattribute__(self, attr):
3914 if attr == 'a':
3915 return 2
3916 else:
3917 return super(C2, self).__getattribute__(attr)
3918 def meth(self):
3919 return 1
3920 class D(C):
3921 pass
3922 class E(D):
3923 pass
3924 d = D()
3925 e = E()
3926 D.__bases__ = (C,)
3927 D.__bases__ = (C2,)
3928 self.assertEqual(d.meth(), 1)
3929 self.assertEqual(e.meth(), 1)
3930 self.assertEqual(d.a, 2)
3931 self.assertEqual(e.a, 2)
3932 self.assertEqual(C2.__subclasses__(), [D])
3933
Georg Brandl48545522008-02-02 10:12:36 +00003934 try:
3935 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003936 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003937 pass
3938 else:
3939 self.fail("shouldn't be able to delete .__bases__")
3940
3941 try:
3942 D.__bases__ = ()
3943 except TypeError, msg:
3944 if str(msg) == "a new-style class can't have only classic bases":
3945 self.fail("wrong error message for .__bases__ = ()")
3946 else:
3947 self.fail("shouldn't be able to set .__bases__ to ()")
3948
3949 try:
3950 D.__bases__ = (D,)
3951 except TypeError:
3952 pass
3953 else:
3954 # actually, we'll have crashed by here...
3955 self.fail("shouldn't be able to create inheritance cycles")
3956
3957 try:
3958 D.__bases__ = (C, C)
3959 except TypeError:
3960 pass
3961 else:
3962 self.fail("didn't detect repeated base classes")
3963
3964 try:
3965 D.__bases__ = (E,)
3966 except TypeError:
3967 pass
3968 else:
3969 self.fail("shouldn't be able to create inheritance cycles")
3970
3971 # let's throw a classic class into the mix:
3972 class Classic:
3973 def meth2(self):
3974 return 3
3975
3976 D.__bases__ = (C, Classic)
3977
3978 self.assertEqual(d.meth2(), 3)
3979 self.assertEqual(e.meth2(), 3)
3980 try:
3981 d.a
3982 except AttributeError:
3983 pass
3984 else:
3985 self.fail("attribute should have vanished")
3986
3987 try:
3988 D.__bases__ = (Classic,)
3989 except TypeError:
3990 pass
3991 else:
3992 self.fail("new-style class must have a new-style base")
3993
Benjamin Petersond4d400c2009-04-18 20:12:47 +00003994 def test_builtin_bases(self):
3995 # Make sure all the builtin types can have their base queried without
3996 # segfaulting. See issue #5787.
3997 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
3998 if isinstance(tp, type)]
3999 for tp in builtin_types:
4000 object.__getattribute__(tp, "__bases__")
4001 if tp is not object:
4002 self.assertEqual(len(tp.__bases__), 1, tp)
4003
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00004004 class L(list):
4005 pass
4006
4007 class C(object):
4008 pass
4009
4010 class D(C):
4011 pass
4012
4013 try:
4014 L.__bases__ = (dict,)
4015 except TypeError:
4016 pass
4017 else:
4018 self.fail("shouldn't turn list subclass into dict subclass")
4019
4020 try:
4021 list.__bases__ = (dict,)
4022 except TypeError:
4023 pass
4024 else:
4025 self.fail("shouldn't be able to assign to list.__bases__")
4026
4027 try:
4028 D.__bases__ = (C, list)
4029 except TypeError:
4030 pass
4031 else:
4032 assert 0, "best_base calculation found wanting"
4033
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004034
Georg Brandl48545522008-02-02 10:12:36 +00004035 def test_mutable_bases_with_failing_mro(self):
4036 # Testing mutable bases with failing mro...
4037 class WorkOnce(type):
4038 def __new__(self, name, bases, ns):
4039 self.flag = 0
4040 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
4041 def mro(self):
4042 if self.flag > 0:
4043 raise RuntimeError, "bozo"
4044 else:
4045 self.flag += 1
4046 return type.mro(self)
4047
4048 class WorkAlways(type):
4049 def mro(self):
4050 # this is here to make sure that .mro()s aren't called
4051 # with an exception set (which was possible at one point).
4052 # An error message will be printed in a debug build.
4053 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004054 return type.mro(self)
4055
Georg Brandl48545522008-02-02 10:12:36 +00004056 class C(object):
4057 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004058
Georg Brandl48545522008-02-02 10:12:36 +00004059 class C2(object):
4060 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004061
Georg Brandl48545522008-02-02 10:12:36 +00004062 class D(C):
4063 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004064
Georg Brandl48545522008-02-02 10:12:36 +00004065 class E(D):
4066 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004067
Georg Brandl48545522008-02-02 10:12:36 +00004068 class F(D):
4069 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004070
Georg Brandl48545522008-02-02 10:12:36 +00004071 class G(D):
4072 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004073
Georg Brandl48545522008-02-02 10:12:36 +00004074 # Immediate subclasses have their mro's adjusted in alphabetical
4075 # order, so E's will get adjusted before adjusting F's fails. We
4076 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004077
Georg Brandl48545522008-02-02 10:12:36 +00004078 E_mro_before = E.__mro__
4079 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004080
Armin Rigofd163f92005-12-29 15:59:19 +00004081 try:
Georg Brandl48545522008-02-02 10:12:36 +00004082 D.__bases__ = (C2,)
4083 except RuntimeError:
4084 self.assertEqual(E.__mro__, E_mro_before)
4085 self.assertEqual(D.__mro__, D_mro_before)
4086 else:
4087 self.fail("exception not propagated")
4088
4089 def test_mutable_bases_catch_mro_conflict(self):
4090 # Testing mutable bases catch mro conflict...
4091 class A(object):
4092 pass
4093
4094 class B(object):
4095 pass
4096
4097 class C(A, B):
4098 pass
4099
4100 class D(A, B):
4101 pass
4102
4103 class E(C, D):
4104 pass
4105
4106 try:
4107 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004108 except TypeError:
4109 pass
4110 else:
Georg Brandl48545522008-02-02 10:12:36 +00004111 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004112
Georg Brandl48545522008-02-02 10:12:36 +00004113 def test_mutable_names(self):
4114 # Testing mutable names...
4115 class C(object):
4116 pass
4117
4118 # C.__module__ could be 'test_descr' or '__main__'
4119 mod = C.__module__
4120
4121 C.__name__ = 'D'
4122 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4123
4124 C.__name__ = 'D.E'
4125 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4126
4127 def test_subclass_right_op(self):
4128 # Testing correct dispatch of subclass overloading __r<op>__...
4129
4130 # This code tests various cases where right-dispatch of a subclass
4131 # should be preferred over left-dispatch of a base class.
4132
4133 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4134
4135 class B(int):
4136 def __floordiv__(self, other):
4137 return "B.__floordiv__"
4138 def __rfloordiv__(self, other):
4139 return "B.__rfloordiv__"
4140
4141 self.assertEqual(B(1) // 1, "B.__floordiv__")
4142 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4143
4144 # Case 2: subclass of object; this is just the baseline for case 3
4145
4146 class C(object):
4147 def __floordiv__(self, other):
4148 return "C.__floordiv__"
4149 def __rfloordiv__(self, other):
4150 return "C.__rfloordiv__"
4151
4152 self.assertEqual(C() // 1, "C.__floordiv__")
4153 self.assertEqual(1 // C(), "C.__rfloordiv__")
4154
4155 # Case 3: subclass of new-style class; here it gets interesting
4156
4157 class D(C):
4158 def __floordiv__(self, other):
4159 return "D.__floordiv__"
4160 def __rfloordiv__(self, other):
4161 return "D.__rfloordiv__"
4162
4163 self.assertEqual(D() // C(), "D.__floordiv__")
4164 self.assertEqual(C() // D(), "D.__rfloordiv__")
4165
4166 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4167
4168 class E(C):
4169 pass
4170
4171 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4172
4173 self.assertEqual(E() // 1, "C.__floordiv__")
4174 self.assertEqual(1 // E(), "C.__rfloordiv__")
4175 self.assertEqual(E() // C(), "C.__floordiv__")
4176 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4177
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004178 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004179 def test_meth_class_get(self):
4180 # Testing __get__ method of METH_CLASS C methods...
4181 # Full coverage of descrobject.c::classmethod_get()
4182
4183 # Baseline
4184 arg = [1, 2, 3]
4185 res = {1: None, 2: None, 3: None}
4186 self.assertEqual(dict.fromkeys(arg), res)
4187 self.assertEqual({}.fromkeys(arg), res)
4188
4189 # Now get the descriptor
4190 descr = dict.__dict__["fromkeys"]
4191
4192 # More baseline using the descriptor directly
4193 self.assertEqual(descr.__get__(None, dict)(arg), res)
4194 self.assertEqual(descr.__get__({})(arg), res)
4195
4196 # Now check various error cases
4197 try:
4198 descr.__get__(None, None)
4199 except TypeError:
4200 pass
4201 else:
4202 self.fail("shouldn't have allowed descr.__get__(None, None)")
4203 try:
4204 descr.__get__(42)
4205 except TypeError:
4206 pass
4207 else:
4208 self.fail("shouldn't have allowed descr.__get__(42)")
4209 try:
4210 descr.__get__(None, 42)
4211 except TypeError:
4212 pass
4213 else:
4214 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4215 try:
4216 descr.__get__(None, int)
4217 except TypeError:
4218 pass
4219 else:
4220 self.fail("shouldn't have allowed descr.__get__(None, int)")
4221
4222 def test_isinst_isclass(self):
4223 # Testing proxy isinstance() and isclass()...
4224 class Proxy(object):
4225 def __init__(self, obj):
4226 self.__obj = obj
4227 def __getattribute__(self, name):
4228 if name.startswith("_Proxy__"):
4229 return object.__getattribute__(self, name)
4230 else:
4231 return getattr(self.__obj, name)
4232 # Test with a classic class
4233 class C:
4234 pass
4235 a = C()
4236 pa = Proxy(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004237 self.assertTrue(isinstance(a, C)) # Baseline
4238 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004239 # Test with a classic subclass
4240 class D(C):
4241 pass
4242 a = D()
4243 pa = Proxy(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004244 self.assertTrue(isinstance(a, C)) # Baseline
4245 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004246 # Test with a new-style class
4247 class C(object):
4248 pass
4249 a = C()
4250 pa = Proxy(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004251 self.assertTrue(isinstance(a, C)) # Baseline
4252 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004253 # Test with a new-style subclass
4254 class D(C):
4255 pass
4256 a = D()
4257 pa = Proxy(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004258 self.assertTrue(isinstance(a, C)) # Baseline
4259 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004260
4261 def test_proxy_super(self):
4262 # Testing super() for a proxy object...
4263 class Proxy(object):
4264 def __init__(self, obj):
4265 self.__obj = obj
4266 def __getattribute__(self, name):
4267 if name.startswith("_Proxy__"):
4268 return object.__getattribute__(self, name)
4269 else:
4270 return getattr(self.__obj, name)
4271
4272 class B(object):
4273 def f(self):
4274 return "B.f"
4275
4276 class C(B):
4277 def f(self):
4278 return super(C, self).f() + "->C.f"
4279
4280 obj = C()
4281 p = Proxy(obj)
4282 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4283
4284 def test_carloverre(self):
4285 # Testing prohibition of Carlo Verre's hack...
4286 try:
4287 object.__setattr__(str, "foo", 42)
4288 except TypeError:
4289 pass
4290 else:
4291 self.fail("Carlo Verre __setattr__ suceeded!")
4292 try:
4293 object.__delattr__(str, "lower")
4294 except TypeError:
4295 pass
4296 else:
4297 self.fail("Carlo Verre __delattr__ succeeded!")
4298
4299 def test_weakref_segfault(self):
4300 # Testing weakref segfault...
4301 # SF 742911
4302 import weakref
4303
4304 class Provoker:
4305 def __init__(self, referrent):
4306 self.ref = weakref.ref(referrent)
4307
4308 def __del__(self):
4309 x = self.ref()
4310
4311 class Oops(object):
4312 pass
4313
4314 o = Oops()
4315 o.whatever = Provoker(o)
4316 del o
4317
4318 def test_wrapper_segfault(self):
4319 # SF 927248: deeply nested wrappers could cause stack overflow
4320 f = lambda:None
4321 for i in xrange(1000000):
4322 f = f.__call__
4323 f = None
4324
4325 def test_file_fault(self):
4326 # Testing sys.stdout is changed in getattr...
4327 import sys
Nick Coghlan0447cd62009-10-17 06:33:05 +00004328 test_stdout = sys.stdout
Georg Brandl48545522008-02-02 10:12:36 +00004329 class StdoutGuard:
4330 def __getattr__(self, attr):
4331 sys.stdout = sys.__stdout__
4332 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4333 sys.stdout = StdoutGuard()
4334 try:
4335 print "Oops!"
4336 except RuntimeError:
4337 pass
Nick Coghlan0447cd62009-10-17 06:33:05 +00004338 finally:
4339 sys.stdout = test_stdout
Georg Brandl48545522008-02-02 10:12:36 +00004340
4341 def test_vicious_descriptor_nonsense(self):
4342 # Testing vicious_descriptor_nonsense...
4343
4344 # A potential segfault spotted by Thomas Wouters in mail to
4345 # python-dev 2003-04-17, turned into an example & fixed by Michael
4346 # Hudson just less than four months later...
4347
4348 class Evil(object):
4349 def __hash__(self):
4350 return hash('attr')
4351 def __eq__(self, other):
4352 del C.attr
4353 return 0
4354
4355 class Descr(object):
4356 def __get__(self, ob, type=None):
4357 return 1
4358
4359 class C(object):
4360 attr = Descr()
4361
4362 c = C()
4363 c.__dict__[Evil()] = 0
4364
4365 self.assertEqual(c.attr, 1)
4366 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004367 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00004368 self.assertEqual(hasattr(c, 'attr'), False)
4369
4370 def test_init(self):
4371 # SF 1155938
4372 class Foo(object):
4373 def __init__(self):
4374 return 10
4375 try:
4376 Foo()
4377 except TypeError:
4378 pass
4379 else:
4380 self.fail("did not test __init__() for None return")
4381
4382 def test_method_wrapper(self):
4383 # Testing method-wrapper objects...
4384 # <type 'method-wrapper'> did not support any reflection before 2.5
4385
4386 l = []
4387 self.assertEqual(l.__add__, l.__add__)
4388 self.assertEqual(l.__add__, [].__add__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004389 self.assertTrue(l.__add__ != [5].__add__)
4390 self.assertTrue(l.__add__ != l.__mul__)
4391 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004392 if hasattr(l.__add__, '__self__'):
4393 # CPython
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004394 self.assertTrue(l.__add__.__self__ is l)
4395 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004396 else:
4397 # Python implementations where [].__add__ is a normal bound method
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004398 self.assertTrue(l.__add__.im_self is l)
4399 self.assertTrue(l.__add__.im_class is list)
Georg Brandl48545522008-02-02 10:12:36 +00004400 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4401 try:
4402 hash(l.__add__)
4403 except TypeError:
4404 pass
4405 else:
4406 self.fail("no TypeError from hash([].__add__)")
4407
4408 t = ()
4409 t += (7,)
4410 self.assertEqual(t.__add__, (7,).__add__)
4411 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4412
4413 def test_not_implemented(self):
4414 # Testing NotImplemented...
4415 # all binary methods should be able to return a NotImplemented
4416 import sys
4417 import types
4418 import operator
4419
4420 def specialmethod(self, other):
4421 return NotImplemented
4422
4423 def check(expr, x, y):
4424 try:
4425 exec expr in {'x': x, 'y': y, 'operator': operator}
4426 except TypeError:
4427 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004428 else:
Georg Brandl48545522008-02-02 10:12:36 +00004429 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004430
Georg Brandl48545522008-02-02 10:12:36 +00004431 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4432 # TypeErrors
4433 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4434 # ValueErrors instead of TypeErrors
4435 for metaclass in [type, types.ClassType]:
4436 for name, expr, iexpr in [
4437 ('__add__', 'x + y', 'x += y'),
4438 ('__sub__', 'x - y', 'x -= y'),
4439 ('__mul__', 'x * y', 'x *= y'),
4440 ('__truediv__', 'operator.truediv(x, y)', None),
4441 ('__floordiv__', 'operator.floordiv(x, y)', None),
4442 ('__div__', 'x / y', 'x /= y'),
4443 ('__mod__', 'x % y', 'x %= y'),
4444 ('__divmod__', 'divmod(x, y)', None),
4445 ('__pow__', 'x ** y', 'x **= y'),
4446 ('__lshift__', 'x << y', 'x <<= y'),
4447 ('__rshift__', 'x >> y', 'x >>= y'),
4448 ('__and__', 'x & y', 'x &= y'),
4449 ('__or__', 'x | y', 'x |= y'),
4450 ('__xor__', 'x ^ y', 'x ^= y'),
4451 ('__coerce__', 'coerce(x, y)', None)]:
4452 if name == '__coerce__':
4453 rname = name
4454 else:
4455 rname = '__r' + name[2:]
4456 A = metaclass('A', (), {name: specialmethod})
4457 B = metaclass('B', (), {rname: specialmethod})
4458 a = A()
4459 b = B()
4460 check(expr, a, a)
4461 check(expr, a, b)
4462 check(expr, b, a)
4463 check(expr, b, b)
4464 check(expr, a, N1)
4465 check(expr, a, N2)
4466 check(expr, N1, b)
4467 check(expr, N2, b)
4468 if iexpr:
4469 check(iexpr, a, a)
4470 check(iexpr, a, b)
4471 check(iexpr, b, a)
4472 check(iexpr, b, b)
4473 check(iexpr, a, N1)
4474 check(iexpr, a, N2)
4475 iname = '__i' + name[2:]
4476 C = metaclass('C', (), {iname: specialmethod})
4477 c = C()
4478 check(iexpr, c, a)
4479 check(iexpr, c, b)
4480 check(iexpr, c, N1)
4481 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004482
Georg Brandl48545522008-02-02 10:12:36 +00004483 def test_assign_slice(self):
4484 # ceval.c's assign_slice used to check for
4485 # tp->tp_as_sequence->sq_slice instead of
4486 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004487
Georg Brandl48545522008-02-02 10:12:36 +00004488 class C(object):
4489 def __setslice__(self, start, stop, value):
4490 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004491
Georg Brandl48545522008-02-02 10:12:36 +00004492 c = C()
4493 c[1:2] = 3
4494 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004495
Benjamin Peterson273c2332008-11-17 22:39:09 +00004496 def test_getattr_hooks(self):
4497 # issue 4230
4498
4499 class Descriptor(object):
4500 counter = 0
4501 def __get__(self, obj, objtype=None):
4502 def getter(name):
4503 self.counter += 1
4504 raise AttributeError(name)
4505 return getter
4506
4507 descr = Descriptor()
4508 class A(object):
4509 __getattribute__ = descr
4510 class B(object):
4511 __getattr__ = descr
4512 class C(object):
4513 __getattribute__ = descr
4514 __getattr__ = descr
4515
4516 self.assertRaises(AttributeError, getattr, A(), "attr")
4517 self.assertEquals(descr.counter, 1)
4518 self.assertRaises(AttributeError, getattr, B(), "attr")
4519 self.assertEquals(descr.counter, 2)
4520 self.assertRaises(AttributeError, getattr, C(), "attr")
4521 self.assertEquals(descr.counter, 4)
4522
4523 import gc
4524 class EvilGetattribute(object):
4525 # This used to segfault
4526 def __getattr__(self, name):
4527 raise AttributeError(name)
4528 def __getattribute__(self, name):
4529 del EvilGetattribute.__getattr__
4530 for i in range(5):
4531 gc.collect()
4532 raise AttributeError(name)
4533
4534 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4535
Guido van Rossum9acc3872008-01-23 23:23:43 +00004536
Georg Brandl48545522008-02-02 10:12:36 +00004537class DictProxyTests(unittest.TestCase):
4538 def setUp(self):
4539 class C(object):
4540 def meth(self):
4541 pass
4542 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004543
Georg Brandl48545522008-02-02 10:12:36 +00004544 def test_iter_keys(self):
4545 # Testing dict-proxy iterkeys...
4546 keys = [ key for key in self.C.__dict__.iterkeys() ]
4547 keys.sort()
4548 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4549 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004550
Georg Brandl48545522008-02-02 10:12:36 +00004551 def test_iter_values(self):
4552 # Testing dict-proxy itervalues...
4553 values = [ values for values in self.C.__dict__.itervalues() ]
4554 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004555
Georg Brandl48545522008-02-02 10:12:36 +00004556 def test_iter_items(self):
4557 # Testing dict-proxy iteritems...
4558 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4559 keys.sort()
4560 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4561 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004562
Georg Brandl48545522008-02-02 10:12:36 +00004563 def test_dict_type_with_metaclass(self):
4564 # Testing type of __dict__ when __metaclass__ set...
4565 class B(object):
4566 pass
4567 class M(type):
4568 pass
4569 class C:
4570 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4571 __metaclass__ = M
4572 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004573
Guido van Rossum9acc3872008-01-23 23:23:43 +00004574
Georg Brandl48545522008-02-02 10:12:36 +00004575class PTypesLongInitTest(unittest.TestCase):
4576 # This is in its own TestCase so that it can be run before any other tests.
4577 def test_pytype_long_ready(self):
4578 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004579
Georg Brandl48545522008-02-02 10:12:36 +00004580 # This dumps core when SF bug 551412 isn't fixed --
4581 # but only when test_descr.py is run separately.
4582 # (That can't be helped -- as soon as PyType_Ready()
4583 # is called for PyLong_Type, the bug is gone.)
4584 class UserLong(object):
4585 def __pow__(self, *args):
4586 pass
4587 try:
4588 pow(0L, UserLong(), 0L)
4589 except:
4590 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004591
Georg Brandl48545522008-02-02 10:12:36 +00004592 # Another segfault only when run early
4593 # (before PyType_Ready(tuple) is called)
4594 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004595
4596
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004597def test_main():
Georg Brandl48545522008-02-02 10:12:36 +00004598 # Run all local test cases, with PTypesLongInitTest first.
4599 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4600 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004601
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004602if __name__ == "__main__":
4603 test_main()