blob: 6dc27bec4f91faec12d11931f9a01b71a7461660 [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
Georg Brandl48545522008-02-02 10:12:36 +00001169 def test_slots_special(self):
1170 # Testing __dict__ and __weakref__ in __slots__...
1171 class D(object):
1172 __slots__ = ["__dict__"]
1173 a = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001174 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl48545522008-02-02 10:12:36 +00001175 self.assertFalse(hasattr(a, "__weakref__"))
1176 a.foo = 42
1177 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001178
Georg Brandl48545522008-02-02 10:12:36 +00001179 class W(object):
1180 __slots__ = ["__weakref__"]
1181 a = W()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001182 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001183 self.assertFalse(hasattr(a, "__dict__"))
1184 try:
1185 a.foo = 42
1186 except AttributeError:
1187 pass
1188 else:
1189 self.fail("shouldn't be allowed to set a.foo")
1190
1191 class C1(W, D):
1192 __slots__ = []
1193 a = C1()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001194 self.assertTrue(hasattr(a, "__dict__"))
1195 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001196 a.foo = 42
1197 self.assertEqual(a.__dict__, {"foo": 42})
1198
1199 class C2(D, W):
1200 __slots__ = []
1201 a = C2()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001202 self.assertTrue(hasattr(a, "__dict__"))
1203 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001204 a.foo = 42
1205 self.assertEqual(a.__dict__, {"foo": 42})
1206
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001207 def test_slots_descriptor(self):
1208 # Issue2115: slot descriptors did not correctly check
1209 # the type of the given object
1210 import abc
1211 class MyABC:
1212 __metaclass__ = abc.ABCMeta
1213 __slots__ = "a"
1214
1215 class Unrelated(object):
1216 pass
1217 MyABC.register(Unrelated)
1218
1219 u = Unrelated()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001220 self.assertTrue(isinstance(u, MyABC))
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001221
1222 # This used to crash
1223 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1224
Georg Brandl48545522008-02-02 10:12:36 +00001225 def test_dynamics(self):
1226 # Testing class attribute propagation...
1227 class D(object):
1228 pass
1229 class E(D):
1230 pass
1231 class F(D):
1232 pass
1233 D.foo = 1
1234 self.assertEqual(D.foo, 1)
1235 # Test that dynamic attributes are inherited
1236 self.assertEqual(E.foo, 1)
1237 self.assertEqual(F.foo, 1)
1238 # Test dynamic instances
1239 class C(object):
1240 pass
1241 a = C()
1242 self.assertFalse(hasattr(a, "foobar"))
1243 C.foobar = 2
1244 self.assertEqual(a.foobar, 2)
1245 C.method = lambda self: 42
1246 self.assertEqual(a.method(), 42)
1247 C.__repr__ = lambda self: "C()"
1248 self.assertEqual(repr(a), "C()")
1249 C.__int__ = lambda self: 100
1250 self.assertEqual(int(a), 100)
1251 self.assertEqual(a.foobar, 2)
1252 self.assertFalse(hasattr(a, "spam"))
1253 def mygetattr(self, name):
1254 if name == "spam":
1255 return "spam"
1256 raise AttributeError
1257 C.__getattr__ = mygetattr
1258 self.assertEqual(a.spam, "spam")
1259 a.new = 12
1260 self.assertEqual(a.new, 12)
1261 def mysetattr(self, name, value):
1262 if name == "spam":
1263 raise AttributeError
1264 return object.__setattr__(self, name, value)
1265 C.__setattr__ = mysetattr
1266 try:
1267 a.spam = "not spam"
1268 except AttributeError:
1269 pass
1270 else:
1271 self.fail("expected AttributeError")
1272 self.assertEqual(a.spam, "spam")
1273 class D(C):
1274 pass
1275 d = D()
1276 d.foo = 1
1277 self.assertEqual(d.foo, 1)
1278
1279 # Test handling of int*seq and seq*int
1280 class I(int):
1281 pass
1282 self.assertEqual("a"*I(2), "aa")
1283 self.assertEqual(I(2)*"a", "aa")
1284 self.assertEqual(2*I(3), 6)
1285 self.assertEqual(I(3)*2, 6)
1286 self.assertEqual(I(3)*I(2), 6)
1287
1288 # Test handling of long*seq and seq*long
1289 class L(long):
1290 pass
1291 self.assertEqual("a"*L(2L), "aa")
1292 self.assertEqual(L(2L)*"a", "aa")
1293 self.assertEqual(2*L(3), 6)
1294 self.assertEqual(L(3)*2, 6)
1295 self.assertEqual(L(3)*L(2), 6)
1296
1297 # Test comparison of classes with dynamic metaclasses
1298 class dynamicmetaclass(type):
1299 pass
1300 class someclass:
1301 __metaclass__ = dynamicmetaclass
1302 self.assertNotEqual(someclass, object)
1303
1304 def test_errors(self):
1305 # Testing errors...
1306 try:
1307 class C(list, dict):
1308 pass
1309 except TypeError:
1310 pass
1311 else:
1312 self.fail("inheritance from both list and dict should be illegal")
1313
1314 try:
1315 class C(object, None):
1316 pass
1317 except TypeError:
1318 pass
1319 else:
1320 self.fail("inheritance from non-type should be illegal")
1321 class Classic:
1322 pass
1323
1324 try:
1325 class C(type(len)):
1326 pass
1327 except TypeError:
1328 pass
1329 else:
1330 self.fail("inheritance from CFunction should be illegal")
1331
1332 try:
1333 class C(object):
1334 __slots__ = 1
1335 except TypeError:
1336 pass
1337 else:
1338 self.fail("__slots__ = 1 should be illegal")
1339
1340 try:
1341 class C(object):
1342 __slots__ = [1]
1343 except TypeError:
1344 pass
1345 else:
1346 self.fail("__slots__ = [1] should be illegal")
1347
1348 class M1(type):
1349 pass
1350 class M2(type):
1351 pass
1352 class A1(object):
1353 __metaclass__ = M1
1354 class A2(object):
1355 __metaclass__ = M2
1356 try:
1357 class B(A1, A2):
1358 pass
1359 except TypeError:
1360 pass
1361 else:
1362 self.fail("finding the most derived metaclass should have failed")
1363
1364 def test_classmethods(self):
1365 # Testing class methods...
1366 class C(object):
1367 def foo(*a): return a
1368 goo = classmethod(foo)
1369 c = C()
1370 self.assertEqual(C.goo(1), (C, 1))
1371 self.assertEqual(c.goo(1), (C, 1))
1372 self.assertEqual(c.foo(1), (c, 1))
1373 class D(C):
1374 pass
1375 d = D()
1376 self.assertEqual(D.goo(1), (D, 1))
1377 self.assertEqual(d.goo(1), (D, 1))
1378 self.assertEqual(d.foo(1), (d, 1))
1379 self.assertEqual(D.foo(d, 1), (d, 1))
1380 # Test for a specific crash (SF bug 528132)
1381 def f(cls, arg): return (cls, arg)
1382 ff = classmethod(f)
1383 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1384 self.assertEqual(ff.__get__(0)(42), (int, 42))
1385
1386 # Test super() with classmethods (SF bug 535444)
1387 self.assertEqual(C.goo.im_self, C)
1388 self.assertEqual(D.goo.im_self, D)
1389 self.assertEqual(super(D,D).goo.im_self, D)
1390 self.assertEqual(super(D,d).goo.im_self, D)
1391 self.assertEqual(super(D,D).goo(), (D,))
1392 self.assertEqual(super(D,d).goo(), (D,))
1393
1394 # Verify that argument is checked for callability (SF bug 753451)
1395 try:
1396 classmethod(1).__get__(1)
1397 except TypeError:
1398 pass
1399 else:
1400 self.fail("classmethod should check for callability")
1401
1402 # Verify that classmethod() doesn't allow keyword args
1403 try:
1404 classmethod(f, kw=1)
1405 except TypeError:
1406 pass
1407 else:
1408 self.fail("classmethod shouldn't accept keyword args")
1409
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001410 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001411 def test_classmethods_in_c(self):
1412 # Testing C-based class methods...
1413 import xxsubtype as spam
1414 a = (1, 2, 3)
1415 d = {'abc': 123}
1416 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1417 self.assertEqual(x, spam.spamlist)
1418 self.assertEqual(a, a1)
1419 self.assertEqual(d, d1)
1420 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1421 self.assertEqual(x, spam.spamlist)
1422 self.assertEqual(a, a1)
1423 self.assertEqual(d, d1)
1424
1425 def test_staticmethods(self):
1426 # Testing static methods...
1427 class C(object):
1428 def foo(*a): return a
1429 goo = staticmethod(foo)
1430 c = C()
1431 self.assertEqual(C.goo(1), (1,))
1432 self.assertEqual(c.goo(1), (1,))
1433 self.assertEqual(c.foo(1), (c, 1,))
1434 class D(C):
1435 pass
1436 d = D()
1437 self.assertEqual(D.goo(1), (1,))
1438 self.assertEqual(d.goo(1), (1,))
1439 self.assertEqual(d.foo(1), (d, 1))
1440 self.assertEqual(D.foo(d, 1), (d, 1))
1441
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001442 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001443 def test_staticmethods_in_c(self):
1444 # Testing C-based static methods...
1445 import xxsubtype as spam
1446 a = (1, 2, 3)
1447 d = {"abc": 123}
1448 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1449 self.assertEqual(x, None)
1450 self.assertEqual(a, a1)
1451 self.assertEqual(d, d1)
1452 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1453 self.assertEqual(x, None)
1454 self.assertEqual(a, a1)
1455 self.assertEqual(d, d1)
1456
1457 def test_classic(self):
1458 # Testing classic classes...
1459 class C:
1460 def foo(*a): return a
1461 goo = classmethod(foo)
1462 c = C()
1463 self.assertEqual(C.goo(1), (C, 1))
1464 self.assertEqual(c.goo(1), (C, 1))
1465 self.assertEqual(c.foo(1), (c, 1))
1466 class D(C):
1467 pass
1468 d = D()
1469 self.assertEqual(D.goo(1), (D, 1))
1470 self.assertEqual(d.goo(1), (D, 1))
1471 self.assertEqual(d.foo(1), (d, 1))
1472 self.assertEqual(D.foo(d, 1), (d, 1))
1473 class E: # *not* subclassing from C
1474 foo = C.foo
1475 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001476 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001477
1478 def test_compattr(self):
1479 # Testing computed attributes...
1480 class C(object):
1481 class computed_attribute(object):
1482 def __init__(self, get, set=None, delete=None):
1483 self.__get = get
1484 self.__set = set
1485 self.__delete = delete
1486 def __get__(self, obj, type=None):
1487 return self.__get(obj)
1488 def __set__(self, obj, value):
1489 return self.__set(obj, value)
1490 def __delete__(self, obj):
1491 return self.__delete(obj)
1492 def __init__(self):
1493 self.__x = 0
1494 def __get_x(self):
1495 x = self.__x
1496 self.__x = x+1
1497 return x
1498 def __set_x(self, x):
1499 self.__x = x
1500 def __delete_x(self):
1501 del self.__x
1502 x = computed_attribute(__get_x, __set_x, __delete_x)
1503 a = C()
1504 self.assertEqual(a.x, 0)
1505 self.assertEqual(a.x, 1)
1506 a.x = 10
1507 self.assertEqual(a.x, 10)
1508 self.assertEqual(a.x, 11)
1509 del a.x
1510 self.assertEqual(hasattr(a, 'x'), 0)
1511
1512 def test_newslots(self):
1513 # Testing __new__ slot override...
1514 class C(list):
1515 def __new__(cls):
1516 self = list.__new__(cls)
1517 self.foo = 1
1518 return self
1519 def __init__(self):
1520 self.foo = self.foo + 2
1521 a = C()
1522 self.assertEqual(a.foo, 3)
1523 self.assertEqual(a.__class__, C)
1524 class D(C):
1525 pass
1526 b = D()
1527 self.assertEqual(b.foo, 3)
1528 self.assertEqual(b.__class__, D)
1529
1530 def test_altmro(self):
1531 # Testing mro() and overriding it...
1532 class A(object):
1533 def f(self): return "A"
1534 class B(A):
1535 pass
1536 class C(A):
1537 def f(self): return "C"
1538 class D(B, C):
1539 pass
1540 self.assertEqual(D.mro(), [D, B, C, A, object])
1541 self.assertEqual(D.__mro__, (D, B, C, A, object))
1542 self.assertEqual(D().f(), "C")
1543
1544 class PerverseMetaType(type):
1545 def mro(cls):
1546 L = type.mro(cls)
1547 L.reverse()
1548 return L
1549 class X(D,B,C,A):
1550 __metaclass__ = PerverseMetaType
1551 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1552 self.assertEqual(X().f(), "A")
1553
1554 try:
1555 class X(object):
1556 class __metaclass__(type):
1557 def mro(self):
1558 return [self, dict, object]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001559 # In CPython, the class creation above already raises
1560 # TypeError, as a protection against the fact that
1561 # instances of X would segfault it. In other Python
1562 # implementations it would be ok to let the class X
1563 # be created, but instead get a clean TypeError on the
1564 # __setitem__ below.
1565 x = object.__new__(X)
1566 x[5] = 6
Georg Brandl48545522008-02-02 10:12:36 +00001567 except TypeError:
1568 pass
1569 else:
1570 self.fail("devious mro() return not caught")
1571
1572 try:
1573 class X(object):
1574 class __metaclass__(type):
1575 def mro(self):
1576 return [1]
1577 except TypeError:
1578 pass
1579 else:
1580 self.fail("non-class 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-sequence mro() return not caught")
1591
1592 def test_overloading(self):
1593 # Testing operator overloading...
1594
1595 class B(object):
1596 "Intermediate class because object doesn't have a __setattr__"
1597
1598 class C(B):
1599 def __getattr__(self, name):
1600 if name == "foo":
1601 return ("getattr", name)
1602 else:
1603 raise AttributeError
1604 def __setattr__(self, name, value):
1605 if name == "foo":
1606 self.setattr = (name, value)
1607 else:
1608 return B.__setattr__(self, name, value)
1609 def __delattr__(self, name):
1610 if name == "foo":
1611 self.delattr = name
1612 else:
1613 return B.__delattr__(self, name)
1614
1615 def __getitem__(self, key):
1616 return ("getitem", key)
1617 def __setitem__(self, key, value):
1618 self.setitem = (key, value)
1619 def __delitem__(self, key):
1620 self.delitem = key
1621
1622 def __getslice__(self, i, j):
1623 return ("getslice", i, j)
1624 def __setslice__(self, i, j, value):
1625 self.setslice = (i, j, value)
1626 def __delslice__(self, i, j):
1627 self.delslice = (i, j)
1628
1629 a = C()
1630 self.assertEqual(a.foo, ("getattr", "foo"))
1631 a.foo = 12
1632 self.assertEqual(a.setattr, ("foo", 12))
1633 del a.foo
1634 self.assertEqual(a.delattr, "foo")
1635
1636 self.assertEqual(a[12], ("getitem", 12))
1637 a[12] = 21
1638 self.assertEqual(a.setitem, (12, 21))
1639 del a[12]
1640 self.assertEqual(a.delitem, 12)
1641
1642 self.assertEqual(a[0:10], ("getslice", 0, 10))
1643 a[0:10] = "foo"
1644 self.assertEqual(a.setslice, (0, 10, "foo"))
1645 del a[0:10]
1646 self.assertEqual(a.delslice, (0, 10))
1647
1648 def test_methods(self):
1649 # Testing methods...
1650 class C(object):
1651 def __init__(self, x):
1652 self.x = x
1653 def foo(self):
1654 return self.x
1655 c1 = C(1)
1656 self.assertEqual(c1.foo(), 1)
1657 class D(C):
1658 boo = C.foo
1659 goo = c1.foo
1660 d2 = D(2)
1661 self.assertEqual(d2.foo(), 2)
1662 self.assertEqual(d2.boo(), 2)
1663 self.assertEqual(d2.goo(), 1)
1664 class E(object):
1665 foo = C.foo
1666 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001667 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001668
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001669 def test_special_method_lookup(self):
1670 # The lookup of special methods bypasses __getattr__ and
1671 # __getattribute__, but they still can be descriptors.
1672
1673 def run_context(manager):
1674 with manager:
1675 pass
1676 def iden(self):
1677 return self
1678 def hello(self):
1679 return "hello"
Benjamin Peterson809e2252009-05-09 02:07:04 +00001680 def empty_seq(self):
1681 return []
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001682 def zero(self):
1683 return 0
1684 def stop(self):
1685 raise StopIteration
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001686 def return_true(self, thing=None):
1687 return True
1688 def do_isinstance(obj):
1689 return isinstance(int, obj)
1690 def do_issubclass(obj):
1691 return issubclass(int, obj)
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001692 def swallow(*args):
1693 pass
1694 def do_dict_missing(checker):
1695 class DictSub(checker.__class__, dict):
1696 pass
1697 self.assertEqual(DictSub()["hi"], 4)
1698 def some_number(self_, key):
1699 self.assertEqual(key, "hi")
1700 return 4
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001701
1702 # It would be nice to have every special method tested here, but I'm
1703 # only listing the ones I can remember outside of typeobject.c, since it
1704 # does it right.
1705 specials = [
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001706 ("__unicode__", unicode, hello, set(), {}),
1707 ("__reversed__", reversed, empty_seq, set(), {}),
1708 ("__length_hint__", list, zero, set(),
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001709 {"__iter__" : iden, "next" : stop}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001710 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1711 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001712 ("__missing__", do_dict_missing, some_number,
1713 set(("__class__",)), {}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001714 ("__subclasscheck__", do_issubclass, return_true,
1715 set(("__bases__",)), {}),
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00001716 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1717 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001718 ]
1719
1720 class Checker(object):
1721 def __getattr__(self, attr, test=self):
1722 test.fail("__getattr__ called with {0}".format(attr))
1723 def __getattribute__(self, attr, test=self):
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001724 if attr not in ok:
1725 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001726 return object.__getattribute__(self, attr)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001727 class SpecialDescr(object):
1728 def __init__(self, impl):
1729 self.impl = impl
1730 def __get__(self, obj, owner):
1731 record.append(1)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001732 return self.impl.__get__(obj, owner)
Benjamin Peterson87e50062009-05-25 02:40:21 +00001733 class MyException(Exception):
1734 pass
1735 class ErrDescr(object):
1736 def __get__(self, obj, owner):
1737 raise MyException
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001738
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001739 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001740 class X(Checker):
1741 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001742 for attr, obj in env.iteritems():
1743 setattr(X, attr, obj)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001744 setattr(X, name, meth_impl)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001745 runner(X())
1746
1747 record = []
1748 class X(Checker):
1749 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001750 for attr, obj in env.iteritems():
1751 setattr(X, attr, obj)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001752 setattr(X, name, SpecialDescr(meth_impl))
1753 runner(X())
1754 self.assertEqual(record, [1], name)
1755
Benjamin Peterson87e50062009-05-25 02:40:21 +00001756 class X(Checker):
1757 pass
1758 for attr, obj in env.iteritems():
1759 setattr(X, attr, obj)
1760 setattr(X, name, ErrDescr())
1761 try:
1762 runner(X())
1763 except MyException:
1764 pass
1765 else:
1766 self.fail("{0!r} didn't raise".format(name))
1767
Georg Brandl48545522008-02-02 10:12:36 +00001768 def test_specials(self):
1769 # Testing special operators...
1770 # Test operators like __hash__ for which a built-in default exists
1771
1772 # Test the default behavior for static classes
1773 class C(object):
1774 def __getitem__(self, i):
1775 if 0 <= i < 10: return i
1776 raise IndexError
1777 c1 = C()
1778 c2 = C()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001779 self.assertTrue(not not c1) # What?
Georg Brandl48545522008-02-02 10:12:36 +00001780 self.assertNotEqual(id(c1), id(c2))
1781 hash(c1)
1782 hash(c2)
1783 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1784 self.assertEqual(c1, c1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001785 self.assertTrue(c1 != c2)
1786 self.assertTrue(not c1 != c1)
1787 self.assertTrue(not c1 == c2)
Georg Brandl48545522008-02-02 10:12:36 +00001788 # Note that the module name appears in str/repr, and that varies
1789 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001790 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001791 self.assertEqual(str(c1), repr(c1))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001792 self.assertTrue(-1 not in c1)
Georg Brandl48545522008-02-02 10:12:36 +00001793 for i in range(10):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001794 self.assertTrue(i in c1)
Georg Brandl48545522008-02-02 10:12:36 +00001795 self.assertFalse(10 in c1)
1796 # Test the default behavior for dynamic classes
1797 class D(object):
1798 def __getitem__(self, i):
1799 if 0 <= i < 10: return i
1800 raise IndexError
1801 d1 = D()
1802 d2 = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001803 self.assertTrue(not not d1)
Georg Brandl48545522008-02-02 10:12:36 +00001804 self.assertNotEqual(id(d1), id(d2))
1805 hash(d1)
1806 hash(d2)
1807 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1808 self.assertEqual(d1, d1)
1809 self.assertNotEqual(d1, d2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001810 self.assertTrue(not d1 != d1)
1811 self.assertTrue(not d1 == d2)
Georg Brandl48545522008-02-02 10:12:36 +00001812 # Note that the module name appears in str/repr, and that varies
1813 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001814 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001815 self.assertEqual(str(d1), repr(d1))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001816 self.assertTrue(-1 not in d1)
Georg Brandl48545522008-02-02 10:12:36 +00001817 for i in range(10):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001818 self.assertTrue(i in d1)
Georg Brandl48545522008-02-02 10:12:36 +00001819 self.assertFalse(10 in d1)
1820 # Test overridden behavior for static classes
1821 class Proxy(object):
1822 def __init__(self, x):
1823 self.x = x
1824 def __nonzero__(self):
1825 return not not self.x
1826 def __hash__(self):
1827 return hash(self.x)
1828 def __eq__(self, other):
1829 return self.x == other
1830 def __ne__(self, other):
1831 return self.x != other
1832 def __cmp__(self, other):
1833 return cmp(self.x, other.x)
1834 def __str__(self):
1835 return "Proxy:%s" % self.x
1836 def __repr__(self):
1837 return "Proxy(%r)" % self.x
1838 def __contains__(self, value):
1839 return value in self.x
1840 p0 = Proxy(0)
1841 p1 = Proxy(1)
1842 p_1 = Proxy(-1)
1843 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001844 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001845 self.assertEqual(hash(p0), hash(0))
1846 self.assertEqual(p0, p0)
1847 self.assertNotEqual(p0, p1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001848 self.assertTrue(not p0 != p0)
Georg Brandl48545522008-02-02 10:12:36 +00001849 self.assertEqual(not p0, p1)
1850 self.assertEqual(cmp(p0, p1), -1)
1851 self.assertEqual(cmp(p0, p0), 0)
1852 self.assertEqual(cmp(p0, p_1), 1)
1853 self.assertEqual(str(p0), "Proxy:0")
1854 self.assertEqual(repr(p0), "Proxy(0)")
1855 p10 = Proxy(range(10))
1856 self.assertFalse(-1 in p10)
1857 for i in range(10):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001858 self.assertTrue(i in p10)
Georg Brandl48545522008-02-02 10:12:36 +00001859 self.assertFalse(10 in p10)
1860 # Test overridden behavior for dynamic classes
1861 class DProxy(object):
1862 def __init__(self, x):
1863 self.x = x
1864 def __nonzero__(self):
1865 return not not self.x
1866 def __hash__(self):
1867 return hash(self.x)
1868 def __eq__(self, other):
1869 return self.x == other
1870 def __ne__(self, other):
1871 return self.x != other
1872 def __cmp__(self, other):
1873 return cmp(self.x, other.x)
1874 def __str__(self):
1875 return "DProxy:%s" % self.x
1876 def __repr__(self):
1877 return "DProxy(%r)" % self.x
1878 def __contains__(self, value):
1879 return value in self.x
1880 p0 = DProxy(0)
1881 p1 = DProxy(1)
1882 p_1 = DProxy(-1)
1883 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001884 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001885 self.assertEqual(hash(p0), hash(0))
1886 self.assertEqual(p0, p0)
1887 self.assertNotEqual(p0, p1)
1888 self.assertNotEqual(not p0, p0)
1889 self.assertEqual(not p0, p1)
1890 self.assertEqual(cmp(p0, p1), -1)
1891 self.assertEqual(cmp(p0, p0), 0)
1892 self.assertEqual(cmp(p0, p_1), 1)
1893 self.assertEqual(str(p0), "DProxy:0")
1894 self.assertEqual(repr(p0), "DProxy(0)")
1895 p10 = DProxy(range(10))
1896 self.assertFalse(-1 in p10)
1897 for i in range(10):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001898 self.assertTrue(i in p10)
Georg Brandl48545522008-02-02 10:12:36 +00001899 self.assertFalse(10 in p10)
1900
1901 # Safety test for __cmp__
1902 def unsafecmp(a, b):
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001903 if not hasattr(a, '__cmp__'):
1904 return # some types don't have a __cmp__ any more (so the
1905 # test doesn't make sense any more), or maybe they
1906 # never had a __cmp__ at all, e.g. in PyPy
Georg Brandl48545522008-02-02 10:12:36 +00001907 try:
1908 a.__class__.__cmp__(a, b)
1909 except TypeError:
1910 pass
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001911 else:
Georg Brandl48545522008-02-02 10:12:36 +00001912 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1913 a.__class__, a, b))
1914
1915 unsafecmp(u"123", "123")
1916 unsafecmp("123", u"123")
1917 unsafecmp(1, 1.0)
1918 unsafecmp(1.0, 1)
1919 unsafecmp(1, 1L)
1920 unsafecmp(1L, 1)
1921
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001922 @test_support.impl_detail("custom logic for printing to real file objects")
1923 def test_recursions_1(self):
Georg Brandl48545522008-02-02 10:12:36 +00001924 # Testing recursion checks ...
1925 class Letter(str):
1926 def __new__(cls, letter):
1927 if letter == 'EPS':
1928 return str.__new__(cls)
1929 return str.__new__(cls, letter)
1930 def __str__(self):
1931 if not self:
1932 return 'EPS'
1933 return self
1934 # sys.stdout needs to be the original to trigger the recursion bug
1935 import sys
1936 test_stdout = sys.stdout
1937 sys.stdout = test_support.get_original_stdout()
1938 try:
1939 # nothing should actually be printed, this should raise an exception
1940 print Letter('w')
1941 except RuntimeError:
1942 pass
1943 else:
1944 self.fail("expected a RuntimeError for print recursion")
1945 finally:
1946 sys.stdout = test_stdout
1947
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001948 def test_recursions_2(self):
Georg Brandl48545522008-02-02 10:12:36 +00001949 # Bug #1202533.
1950 class A(object):
1951 pass
1952 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
1953 try:
1954 A()*2
1955 except RuntimeError:
1956 pass
1957 else:
1958 self.fail("expected a RuntimeError")
1959
1960 def test_weakrefs(self):
1961 # Testing weak references...
1962 import weakref
1963 class C(object):
1964 pass
1965 c = C()
1966 r = weakref.ref(c)
1967 self.assertEqual(r(), c)
1968 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001969 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001970 self.assertEqual(r(), None)
1971 del r
1972 class NoWeak(object):
1973 __slots__ = ['foo']
1974 no = NoWeak()
1975 try:
1976 weakref.ref(no)
1977 except TypeError, msg:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001978 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001979 else:
1980 self.fail("weakref.ref(no) should be illegal")
1981 class Weak(object):
1982 __slots__ = ['foo', '__weakref__']
1983 yes = Weak()
1984 r = weakref.ref(yes)
1985 self.assertEqual(r(), yes)
1986 del yes
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001987 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001988 self.assertEqual(r(), None)
1989 del r
1990
1991 def test_properties(self):
1992 # Testing property...
1993 class C(object):
1994 def getx(self):
1995 return self.__x
1996 def setx(self, value):
1997 self.__x = value
1998 def delx(self):
1999 del self.__x
2000 x = property(getx, setx, delx, doc="I'm the x property.")
2001 a = C()
2002 self.assertFalse(hasattr(a, "x"))
2003 a.x = 42
2004 self.assertEqual(a._C__x, 42)
2005 self.assertEqual(a.x, 42)
2006 del a.x
2007 self.assertFalse(hasattr(a, "x"))
2008 self.assertFalse(hasattr(a, "_C__x"))
2009 C.x.__set__(a, 100)
2010 self.assertEqual(C.x.__get__(a), 100)
2011 C.x.__delete__(a)
2012 self.assertFalse(hasattr(a, "x"))
2013
2014 raw = C.__dict__['x']
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002015 self.assertTrue(isinstance(raw, property))
Georg Brandl48545522008-02-02 10:12:36 +00002016
2017 attrs = dir(raw)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002018 self.assertTrue("__doc__" in attrs)
2019 self.assertTrue("fget" in attrs)
2020 self.assertTrue("fset" in attrs)
2021 self.assertTrue("fdel" in attrs)
Georg Brandl48545522008-02-02 10:12:36 +00002022
2023 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002024 self.assertTrue(raw.fget is C.__dict__['getx'])
2025 self.assertTrue(raw.fset is C.__dict__['setx'])
2026 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl48545522008-02-02 10:12:36 +00002027
2028 for attr in "__doc__", "fget", "fset", "fdel":
2029 try:
2030 setattr(raw, attr, 42)
2031 except TypeError, msg:
2032 if str(msg).find('readonly') < 0:
2033 self.fail("when setting readonly attr %r on a property, "
2034 "got unexpected TypeError msg %r" % (attr, str(msg)))
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002035 else:
Georg Brandl48545522008-02-02 10:12:36 +00002036 self.fail("expected TypeError from trying to set readonly %r "
2037 "attr on a property" % attr)
Tim Peters2f93e282001-10-04 05:27:00 +00002038
Georg Brandl48545522008-02-02 10:12:36 +00002039 class D(object):
2040 __getitem__ = property(lambda s: 1/0)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002041
Georg Brandl48545522008-02-02 10:12:36 +00002042 d = D()
2043 try:
2044 for i in d:
2045 str(i)
2046 except ZeroDivisionError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002047 pass
Georg Brandl48545522008-02-02 10:12:36 +00002048 else:
2049 self.fail("expected ZeroDivisionError from bad property")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002050
Georg Brandl48545522008-02-02 10:12:36 +00002051 class E(object):
2052 def getter(self):
2053 "getter method"
2054 return 0
2055 def setter(self_, value):
2056 "setter method"
2057 pass
2058 prop = property(getter)
2059 self.assertEqual(prop.__doc__, "getter method")
2060 prop2 = property(fset=setter)
2061 self.assertEqual(prop2.__doc__, None)
2062
2063 # this segfaulted in 2.5b2
2064 try:
2065 import _testcapi
2066 except ImportError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002067 pass
Georg Brandl48545522008-02-02 10:12:36 +00002068 else:
2069 class X(object):
2070 p = property(_testcapi.test_with_docstring)
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002071
Georg Brandl48545522008-02-02 10:12:36 +00002072 def test_properties_plus(self):
2073 class C(object):
2074 foo = property(doc="hello")
2075 @foo.getter
2076 def foo(self):
2077 return self._foo
2078 @foo.setter
2079 def foo(self, value):
2080 self._foo = abs(value)
2081 @foo.deleter
2082 def foo(self):
2083 del self._foo
2084 c = C()
2085 self.assertEqual(C.foo.__doc__, "hello")
2086 self.assertFalse(hasattr(c, "foo"))
2087 c.foo = -42
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002088 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl48545522008-02-02 10:12:36 +00002089 self.assertEqual(c._foo, 42)
2090 self.assertEqual(c.foo, 42)
2091 del c.foo
2092 self.assertFalse(hasattr(c, '_foo'))
2093 self.assertFalse(hasattr(c, "foo"))
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002094
Georg Brandl48545522008-02-02 10:12:36 +00002095 class D(C):
2096 @C.foo.deleter
2097 def foo(self):
2098 try:
2099 del self._foo
2100 except AttributeError:
2101 pass
2102 d = D()
2103 d.foo = 24
2104 self.assertEqual(d.foo, 24)
2105 del d.foo
2106 del d.foo
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002107
Georg Brandl48545522008-02-02 10:12:36 +00002108 class E(object):
2109 @property
2110 def foo(self):
2111 return self._foo
2112 @foo.setter
2113 def foo(self, value):
2114 raise RuntimeError
2115 @foo.setter
2116 def foo(self, value):
2117 self._foo = abs(value)
2118 @foo.deleter
2119 def foo(self, value=None):
2120 del self._foo
Guido van Rossume8fc6402002-04-16 16:44:51 +00002121
Georg Brandl48545522008-02-02 10:12:36 +00002122 e = E()
2123 e.foo = -42
2124 self.assertEqual(e.foo, 42)
2125 del e.foo
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002126
Georg Brandl48545522008-02-02 10:12:36 +00002127 class F(E):
2128 @E.foo.deleter
2129 def foo(self):
2130 del self._foo
2131 @foo.setter
2132 def foo(self, value):
2133 self._foo = max(0, value)
2134 f = F()
2135 f.foo = -10
2136 self.assertEqual(f.foo, 0)
2137 del f.foo
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00002138
Georg Brandl48545522008-02-02 10:12:36 +00002139 def test_dict_constructors(self):
2140 # Testing dict constructor ...
2141 d = dict()
2142 self.assertEqual(d, {})
2143 d = dict({})
2144 self.assertEqual(d, {})
2145 d = dict({1: 2, 'a': 'b'})
2146 self.assertEqual(d, {1: 2, 'a': 'b'})
2147 self.assertEqual(d, dict(d.items()))
2148 self.assertEqual(d, dict(d.iteritems()))
2149 d = dict({'one':1, 'two':2})
2150 self.assertEqual(d, dict(one=1, two=2))
2151 self.assertEqual(d, dict(**d))
2152 self.assertEqual(d, dict({"one": 1}, two=2))
2153 self.assertEqual(d, dict([("two", 2)], one=1))
2154 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
2155 self.assertEqual(d, dict(**d))
Guido van Rossum09638c12002-06-13 19:17:46 +00002156
Georg Brandl48545522008-02-02 10:12:36 +00002157 for badarg in 0, 0L, 0j, "0", [0], (0,):
2158 try:
2159 dict(badarg)
2160 except TypeError:
2161 pass
2162 except ValueError:
2163 if badarg == "0":
2164 # It's a sequence, and its elements are also sequences (gotta
2165 # love strings <wink>), but they aren't of length 2, so this
2166 # one seemed better as a ValueError than a TypeError.
2167 pass
2168 else:
2169 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002170 else:
Georg Brandl48545522008-02-02 10:12:36 +00002171 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002172
Georg Brandl48545522008-02-02 10:12:36 +00002173 try:
2174 dict({}, {})
2175 except TypeError:
2176 pass
2177 else:
2178 self.fail("no TypeError from dict({}, {})")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002179
Georg Brandl48545522008-02-02 10:12:36 +00002180 class Mapping:
2181 # Lacks a .keys() method; will be added later.
2182 dict = {1:2, 3:4, 'a':1j}
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002183
Georg Brandl48545522008-02-02 10:12:36 +00002184 try:
2185 dict(Mapping())
2186 except TypeError:
2187 pass
2188 else:
2189 self.fail("no TypeError from dict(incomplete mapping)")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002190
Georg Brandl48545522008-02-02 10:12:36 +00002191 Mapping.keys = lambda self: self.dict.keys()
2192 Mapping.__getitem__ = lambda self, i: self.dict[i]
2193 d = dict(Mapping())
2194 self.assertEqual(d, Mapping.dict)
Michael W. Hudsonf3904422006-11-23 13:54:04 +00002195
Georg Brandl48545522008-02-02 10:12:36 +00002196 # Init from sequence of iterable objects, each producing a 2-sequence.
2197 class AddressBookEntry:
2198 def __init__(self, first, last):
2199 self.first = first
2200 self.last = last
2201 def __iter__(self):
2202 return iter([self.first, self.last])
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002203
Georg Brandl48545522008-02-02 10:12:36 +00002204 d = dict([AddressBookEntry('Tim', 'Warsaw'),
2205 AddressBookEntry('Barry', 'Peters'),
2206 AddressBookEntry('Tim', 'Peters'),
2207 AddressBookEntry('Barry', 'Warsaw')])
2208 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00002209
Georg Brandl48545522008-02-02 10:12:36 +00002210 d = dict(zip(range(4), range(1, 5)))
2211 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002212
Georg Brandl48545522008-02-02 10:12:36 +00002213 # Bad sequence lengths.
2214 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2215 try:
2216 dict(bad)
2217 except ValueError:
2218 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00002219 else:
Georg Brandl48545522008-02-02 10:12:36 +00002220 self.fail("no ValueError from dict(%r)" % bad)
2221
2222 def test_dir(self):
2223 # Testing dir() ...
2224 junk = 12
2225 self.assertEqual(dir(), ['junk', 'self'])
2226 del junk
2227
2228 # Just make sure these don't blow up!
2229 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
2230 dir(arg)
2231
2232 # Try classic classes.
2233 class C:
2234 Cdata = 1
2235 def Cmethod(self): pass
2236
2237 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
2238 self.assertEqual(dir(C), cstuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002239 self.assertTrue('im_self' in dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002240
2241 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
2242 self.assertEqual(dir(c), cstuff)
2243
2244 c.cdata = 2
2245 c.cmethod = lambda self: 0
2246 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002247 self.assertTrue('im_self' in dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002248
2249 class A(C):
2250 Adata = 1
2251 def Amethod(self): pass
2252
2253 astuff = ['Adata', 'Amethod'] + cstuff
2254 self.assertEqual(dir(A), astuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002255 self.assertTrue('im_self' in dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002256 a = A()
2257 self.assertEqual(dir(a), astuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002258 self.assertTrue('im_self' in dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002259 a.adata = 42
2260 a.amethod = lambda self: 3
2261 self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
2262
2263 # The same, but with new-style classes. Since these have object as a
2264 # base class, a lot more gets sucked in.
2265 def interesting(strings):
2266 return [s for s in strings if not s.startswith('_')]
2267
2268 class C(object):
2269 Cdata = 1
2270 def Cmethod(self): pass
2271
2272 cstuff = ['Cdata', 'Cmethod']
2273 self.assertEqual(interesting(dir(C)), cstuff)
2274
2275 c = C()
2276 self.assertEqual(interesting(dir(c)), cstuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002277 self.assertTrue('im_self' in dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002278
2279 c.cdata = 2
2280 c.cmethod = lambda self: 0
2281 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002282 self.assertTrue('im_self' in dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002283
2284 class A(C):
2285 Adata = 1
2286 def Amethod(self): pass
2287
2288 astuff = ['Adata', 'Amethod'] + cstuff
2289 self.assertEqual(interesting(dir(A)), astuff)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002290 self.assertTrue('im_self' in dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002291 a = A()
2292 self.assertEqual(interesting(dir(a)), astuff)
2293 a.adata = 42
2294 a.amethod = lambda self: 3
2295 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002296 self.assertTrue('im_self' in dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002297
2298 # Try a module subclass.
2299 import sys
2300 class M(type(sys)):
2301 pass
2302 minstance = M("m")
2303 minstance.b = 2
2304 minstance.a = 1
2305 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2306 self.assertEqual(names, ['a', 'b'])
2307
2308 class M2(M):
2309 def getdict(self):
2310 return "Not a dict!"
2311 __dict__ = property(getdict)
2312
2313 m2instance = M2("m2")
2314 m2instance.b = 2
2315 m2instance.a = 1
2316 self.assertEqual(m2instance.__dict__, "Not a dict!")
2317 try:
2318 dir(m2instance)
2319 except TypeError:
2320 pass
2321
2322 # Two essentially featureless objects, just inheriting stuff from
2323 # object.
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002324 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2325 if test_support.check_impl_detail():
2326 # None differs in PyPy: it has a __nonzero__
2327 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl48545522008-02-02 10:12:36 +00002328
2329 # Nasty test case for proxied objects
2330 class Wrapper(object):
2331 def __init__(self, obj):
2332 self.__obj = obj
2333 def __repr__(self):
2334 return "Wrapper(%s)" % repr(self.__obj)
2335 def __getitem__(self, key):
2336 return Wrapper(self.__obj[key])
2337 def __len__(self):
2338 return len(self.__obj)
2339 def __getattr__(self, name):
2340 return Wrapper(getattr(self.__obj, name))
2341
2342 class C(object):
2343 def __getclass(self):
2344 return Wrapper(type(self))
2345 __class__ = property(__getclass)
2346
2347 dir(C()) # This used to segfault
2348
2349 def test_supers(self):
2350 # Testing super...
2351
2352 class A(object):
2353 def meth(self, a):
2354 return "A(%r)" % a
2355
2356 self.assertEqual(A().meth(1), "A(1)")
2357
2358 class B(A):
2359 def __init__(self):
2360 self.__super = super(B, self)
2361 def meth(self, a):
2362 return "B(%r)" % a + self.__super.meth(a)
2363
2364 self.assertEqual(B().meth(2), "B(2)A(2)")
2365
2366 class C(A):
2367 def meth(self, a):
2368 return "C(%r)" % a + self.__super.meth(a)
2369 C._C__super = super(C)
2370
2371 self.assertEqual(C().meth(3), "C(3)A(3)")
2372
2373 class D(C, B):
2374 def meth(self, a):
2375 return "D(%r)" % a + super(D, self).meth(a)
2376
2377 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2378
2379 # Test for subclassing super
2380
2381 class mysuper(super):
2382 def __init__(self, *args):
2383 return super(mysuper, self).__init__(*args)
2384
2385 class E(D):
2386 def meth(self, a):
2387 return "E(%r)" % a + mysuper(E, self).meth(a)
2388
2389 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2390
2391 class F(E):
2392 def meth(self, a):
2393 s = self.__super # == mysuper(F, self)
2394 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2395 F._F__super = mysuper(F)
2396
2397 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2398
2399 # Make sure certain errors are raised
2400
2401 try:
2402 super(D, 42)
2403 except TypeError:
2404 pass
2405 else:
2406 self.fail("shouldn't allow super(D, 42)")
2407
2408 try:
2409 super(D, C())
2410 except TypeError:
2411 pass
2412 else:
2413 self.fail("shouldn't allow super(D, C())")
2414
2415 try:
2416 super(D).__get__(12)
2417 except TypeError:
2418 pass
2419 else:
2420 self.fail("shouldn't allow super(D).__get__(12)")
2421
2422 try:
2423 super(D).__get__(C())
2424 except TypeError:
2425 pass
2426 else:
2427 self.fail("shouldn't allow super(D).__get__(C())")
2428
2429 # Make sure data descriptors can be overridden and accessed via super
2430 # (new feature in Python 2.3)
2431
2432 class DDbase(object):
2433 def getx(self): return 42
2434 x = property(getx)
2435
2436 class DDsub(DDbase):
2437 def getx(self): return "hello"
2438 x = property(getx)
2439
2440 dd = DDsub()
2441 self.assertEqual(dd.x, "hello")
2442 self.assertEqual(super(DDsub, dd).x, 42)
2443
2444 # Ensure that super() lookup of descriptor from classmethod
2445 # works (SF ID# 743627)
2446
2447 class Base(object):
2448 aProp = property(lambda self: "foo")
2449
2450 class Sub(Base):
2451 @classmethod
2452 def test(klass):
2453 return super(Sub,klass).aProp
2454
2455 self.assertEqual(Sub.test(), Base.aProp)
2456
2457 # Verify that super() doesn't allow keyword args
2458 try:
2459 super(Base, kw=1)
2460 except TypeError:
2461 pass
2462 else:
2463 self.assertEqual("super shouldn't accept keyword args")
2464
2465 def test_basic_inheritance(self):
2466 # Testing inheritance from basic types...
2467
2468 class hexint(int):
2469 def __repr__(self):
2470 return hex(self)
2471 def __add__(self, other):
2472 return hexint(int.__add__(self, other))
2473 # (Note that overriding __radd__ doesn't work,
2474 # because the int type gets first dibs.)
2475 self.assertEqual(repr(hexint(7) + 9), "0x10")
2476 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2477 a = hexint(12345)
2478 self.assertEqual(a, 12345)
2479 self.assertEqual(int(a), 12345)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002480 self.assertTrue(int(a).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002481 self.assertEqual(hash(a), hash(12345))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002482 self.assertTrue((+a).__class__ is int)
2483 self.assertTrue((a >> 0).__class__ is int)
2484 self.assertTrue((a << 0).__class__ is int)
2485 self.assertTrue((hexint(0) << 12).__class__ is int)
2486 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002487
2488 class octlong(long):
2489 __slots__ = []
2490 def __str__(self):
2491 s = oct(self)
2492 if s[-1] == 'L':
2493 s = s[:-1]
2494 return s
2495 def __add__(self, other):
2496 return self.__class__(super(octlong, self).__add__(other))
2497 __radd__ = __add__
2498 self.assertEqual(str(octlong(3) + 5), "010")
2499 # (Note that overriding __radd__ here only seems to work
2500 # because the example uses a short int left argument.)
2501 self.assertEqual(str(5 + octlong(3000)), "05675")
2502 a = octlong(12345)
2503 self.assertEqual(a, 12345L)
2504 self.assertEqual(long(a), 12345L)
2505 self.assertEqual(hash(a), hash(12345L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002506 self.assertTrue(long(a).__class__ is long)
2507 self.assertTrue((+a).__class__ is long)
2508 self.assertTrue((-a).__class__ is long)
2509 self.assertTrue((-octlong(0)).__class__ is long)
2510 self.assertTrue((a >> 0).__class__ is long)
2511 self.assertTrue((a << 0).__class__ is long)
2512 self.assertTrue((a - 0).__class__ is long)
2513 self.assertTrue((a * 1).__class__ is long)
2514 self.assertTrue((a ** 1).__class__ is long)
2515 self.assertTrue((a // 1).__class__ is long)
2516 self.assertTrue((1 * a).__class__ is long)
2517 self.assertTrue((a | 0).__class__ is long)
2518 self.assertTrue((a ^ 0).__class__ is long)
2519 self.assertTrue((a & -1L).__class__ is long)
2520 self.assertTrue((octlong(0) << 12).__class__ is long)
2521 self.assertTrue((octlong(0) >> 12).__class__ is long)
2522 self.assertTrue(abs(octlong(0)).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002523
2524 # Because octlong overrides __add__, we can't check the absence of +0
2525 # optimizations using octlong.
2526 class longclone(long):
2527 pass
2528 a = longclone(1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002529 self.assertTrue((a + 0).__class__ is long)
2530 self.assertTrue((0 + a).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002531
2532 # Check that negative clones don't segfault
2533 a = longclone(-1)
2534 self.assertEqual(a.__dict__, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002535 self.assertEqual(long(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl48545522008-02-02 10:12:36 +00002536
2537 class precfloat(float):
2538 __slots__ = ['prec']
2539 def __init__(self, value=0.0, prec=12):
2540 self.prec = int(prec)
2541 def __repr__(self):
2542 return "%.*g" % (self.prec, self)
2543 self.assertEqual(repr(precfloat(1.1)), "1.1")
2544 a = precfloat(12345)
2545 self.assertEqual(a, 12345.0)
2546 self.assertEqual(float(a), 12345.0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002547 self.assertTrue(float(a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002548 self.assertEqual(hash(a), hash(12345.0))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002549 self.assertTrue((+a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002550
2551 class madcomplex(complex):
2552 def __repr__(self):
2553 return "%.17gj%+.17g" % (self.imag, self.real)
2554 a = madcomplex(-3, 4)
2555 self.assertEqual(repr(a), "4j-3")
2556 base = complex(-3, 4)
2557 self.assertEqual(base.__class__, complex)
2558 self.assertEqual(a, base)
2559 self.assertEqual(complex(a), base)
2560 self.assertEqual(complex(a).__class__, complex)
2561 a = madcomplex(a) # just trying another form of the constructor
2562 self.assertEqual(repr(a), "4j-3")
2563 self.assertEqual(a, base)
2564 self.assertEqual(complex(a), base)
2565 self.assertEqual(complex(a).__class__, complex)
2566 self.assertEqual(hash(a), hash(base))
2567 self.assertEqual((+a).__class__, complex)
2568 self.assertEqual((a + 0).__class__, complex)
2569 self.assertEqual(a + 0, base)
2570 self.assertEqual((a - 0).__class__, complex)
2571 self.assertEqual(a - 0, base)
2572 self.assertEqual((a * 1).__class__, complex)
2573 self.assertEqual(a * 1, base)
2574 self.assertEqual((a / 1).__class__, complex)
2575 self.assertEqual(a / 1, base)
2576
2577 class madtuple(tuple):
2578 _rev = None
2579 def rev(self):
2580 if self._rev is not None:
2581 return self._rev
2582 L = list(self)
2583 L.reverse()
2584 self._rev = self.__class__(L)
2585 return self._rev
2586 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2587 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2588 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2589 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2590 for i in range(512):
2591 t = madtuple(range(i))
2592 u = t.rev()
2593 v = u.rev()
2594 self.assertEqual(v, t)
2595 a = madtuple((1,2,3,4,5))
2596 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002597 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002598 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002599 self.assertTrue(a[:].__class__ is tuple)
2600 self.assertTrue((a * 1).__class__ is tuple)
2601 self.assertTrue((a * 0).__class__ is tuple)
2602 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002603 a = madtuple(())
2604 self.assertEqual(tuple(a), ())
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002605 self.assertTrue(tuple(a).__class__ is tuple)
2606 self.assertTrue((a + a).__class__ is tuple)
2607 self.assertTrue((a * 0).__class__ is tuple)
2608 self.assertTrue((a * 1).__class__ is tuple)
2609 self.assertTrue((a * 2).__class__ is tuple)
2610 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002611
2612 class madstring(str):
2613 _rev = None
2614 def rev(self):
2615 if self._rev is not None:
2616 return self._rev
2617 L = list(self)
2618 L.reverse()
2619 self._rev = self.__class__("".join(L))
2620 return self._rev
2621 s = madstring("abcdefghijklmnopqrstuvwxyz")
2622 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2623 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2624 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2625 for i in range(256):
2626 s = madstring("".join(map(chr, range(i))))
2627 t = s.rev()
2628 u = t.rev()
2629 self.assertEqual(u, s)
2630 s = madstring("12345")
2631 self.assertEqual(str(s), "12345")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002632 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002633
2634 base = "\x00" * 5
2635 s = madstring(base)
2636 self.assertEqual(s, base)
2637 self.assertEqual(str(s), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002638 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002639 self.assertEqual(hash(s), hash(base))
2640 self.assertEqual({s: 1}[base], 1)
2641 self.assertEqual({base: 1}[s], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002642 self.assertTrue((s + "").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002643 self.assertEqual(s + "", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002644 self.assertTrue(("" + s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002645 self.assertEqual("" + s, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002646 self.assertTrue((s * 0).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002647 self.assertEqual(s * 0, "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002648 self.assertTrue((s * 1).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002649 self.assertEqual(s * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002650 self.assertTrue((s * 2).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002651 self.assertEqual(s * 2, base + base)
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[0:0].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002655 self.assertEqual(s[0:0], "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002656 self.assertTrue(s.strip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002657 self.assertEqual(s.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002658 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002659 self.assertEqual(s.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002660 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002661 self.assertEqual(s.rstrip(), base)
2662 identitytab = ''.join([chr(i) for i in range(256)])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002663 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002664 self.assertEqual(s.translate(identitytab), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002665 self.assertTrue(s.translate(identitytab, "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002666 self.assertEqual(s.translate(identitytab, "x"), base)
2667 self.assertEqual(s.translate(identitytab, "\x00"), "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002668 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002669 self.assertEqual(s.replace("x", "x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002670 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002671 self.assertEqual(s.ljust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002672 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002673 self.assertEqual(s.rjust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002674 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002675 self.assertEqual(s.center(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002676 self.assertTrue(s.lower().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002677 self.assertEqual(s.lower(), base)
2678
2679 class madunicode(unicode):
2680 _rev = None
2681 def rev(self):
2682 if self._rev is not None:
2683 return self._rev
2684 L = list(self)
2685 L.reverse()
2686 self._rev = self.__class__(u"".join(L))
2687 return self._rev
2688 u = madunicode("ABCDEF")
2689 self.assertEqual(u, u"ABCDEF")
2690 self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
2691 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
2692 base = u"12345"
2693 u = madunicode(base)
2694 self.assertEqual(unicode(u), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002695 self.assertTrue(unicode(u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002696 self.assertEqual(hash(u), hash(base))
2697 self.assertEqual({u: 1}[base], 1)
2698 self.assertEqual({base: 1}[u], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002699 self.assertTrue(u.strip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002700 self.assertEqual(u.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002701 self.assertTrue(u.lstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002702 self.assertEqual(u.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002703 self.assertTrue(u.rstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002704 self.assertEqual(u.rstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002705 self.assertTrue(u.replace(u"x", u"x").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002706 self.assertEqual(u.replace(u"x", u"x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002707 self.assertTrue(u.replace(u"xy", u"xy").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002708 self.assertEqual(u.replace(u"xy", u"xy"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002709 self.assertTrue(u.center(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002710 self.assertEqual(u.center(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002711 self.assertTrue(u.ljust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002712 self.assertEqual(u.ljust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002713 self.assertTrue(u.rjust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002714 self.assertEqual(u.rjust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002715 self.assertTrue(u.lower().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002716 self.assertEqual(u.lower(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002717 self.assertTrue(u.upper().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002718 self.assertEqual(u.upper(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002719 self.assertTrue(u.capitalize().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002720 self.assertEqual(u.capitalize(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002721 self.assertTrue(u.title().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002722 self.assertEqual(u.title(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002723 self.assertTrue((u + u"").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002724 self.assertEqual(u + u"", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002725 self.assertTrue((u"" + u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002726 self.assertEqual(u"" + u, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002727 self.assertTrue((u * 0).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002728 self.assertEqual(u * 0, u"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002729 self.assertTrue((u * 1).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002730 self.assertEqual(u * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002731 self.assertTrue((u * 2).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002732 self.assertEqual(u * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002733 self.assertTrue(u[:].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002734 self.assertEqual(u[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002735 self.assertTrue(u[0:0].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002736 self.assertEqual(u[0:0], u"")
2737
2738 class sublist(list):
2739 pass
2740 a = sublist(range(5))
2741 self.assertEqual(a, range(5))
2742 a.append("hello")
2743 self.assertEqual(a, range(5) + ["hello"])
2744 a[5] = 5
2745 self.assertEqual(a, range(6))
2746 a.extend(range(6, 20))
2747 self.assertEqual(a, range(20))
2748 a[-5:] = []
2749 self.assertEqual(a, range(15))
2750 del a[10:15]
2751 self.assertEqual(len(a), 10)
2752 self.assertEqual(a, range(10))
2753 self.assertEqual(list(a), range(10))
2754 self.assertEqual(a[0], 0)
2755 self.assertEqual(a[9], 9)
2756 self.assertEqual(a[-10], 0)
2757 self.assertEqual(a[-1], 9)
2758 self.assertEqual(a[:5], range(5))
2759
2760 class CountedInput(file):
2761 """Counts lines read by self.readline().
2762
2763 self.lineno is the 0-based ordinal of the last line read, up to
2764 a maximum of one greater than the number of lines in the file.
2765
2766 self.ateof is true if and only if the final "" line has been read,
2767 at which point self.lineno stops incrementing, and further calls
2768 to readline() continue to return "".
2769 """
2770
2771 lineno = 0
2772 ateof = 0
2773 def readline(self):
2774 if self.ateof:
2775 return ""
2776 s = file.readline(self)
2777 # Next line works too.
2778 # s = super(CountedInput, self).readline()
2779 self.lineno += 1
2780 if s == "":
2781 self.ateof = 1
2782 return s
2783
2784 f = file(name=test_support.TESTFN, mode='w')
2785 lines = ['a\n', 'b\n', 'c\n']
2786 try:
2787 f.writelines(lines)
2788 f.close()
2789 f = CountedInput(test_support.TESTFN)
2790 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2791 got = f.readline()
2792 self.assertEqual(expected, got)
2793 self.assertEqual(f.lineno, i)
2794 self.assertEqual(f.ateof, (i > len(lines)))
2795 f.close()
2796 finally:
2797 try:
2798 f.close()
2799 except:
2800 pass
2801 test_support.unlink(test_support.TESTFN)
2802
2803 def test_keywords(self):
2804 # Testing keyword args to basic type constructors ...
2805 self.assertEqual(int(x=1), 1)
2806 self.assertEqual(float(x=2), 2.0)
2807 self.assertEqual(long(x=3), 3L)
2808 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2809 self.assertEqual(str(object=500), '500')
2810 self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
2811 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2812 self.assertEqual(list(sequence=(0, 1, 2)), range(3))
2813 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2814
2815 for constructor in (int, float, long, complex, str, unicode,
2816 tuple, list, file):
2817 try:
2818 constructor(bogus_keyword_arg=1)
2819 except TypeError:
2820 pass
2821 else:
2822 self.fail("expected TypeError from bogus keyword argument to %r"
2823 % constructor)
2824
2825 def test_str_subclass_as_dict_key(self):
2826 # Testing a str subclass used as dict key ..
2827
2828 class cistr(str):
2829 """Sublcass of str that computes __eq__ case-insensitively.
2830
2831 Also computes a hash code of the string in canonical form.
2832 """
2833
2834 def __init__(self, value):
2835 self.canonical = value.lower()
2836 self.hashcode = hash(self.canonical)
2837
2838 def __eq__(self, other):
2839 if not isinstance(other, cistr):
2840 other = cistr(other)
2841 return self.canonical == other.canonical
2842
2843 def __hash__(self):
2844 return self.hashcode
2845
2846 self.assertEqual(cistr('ABC'), 'abc')
2847 self.assertEqual('aBc', cistr('ABC'))
2848 self.assertEqual(str(cistr('ABC')), 'ABC')
2849
2850 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2851 self.assertEqual(d[cistr('one')], 1)
2852 self.assertEqual(d[cistr('tWo')], 2)
2853 self.assertEqual(d[cistr('THrEE')], 3)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002854 self.assertTrue(cistr('ONe') in d)
Georg Brandl48545522008-02-02 10:12:36 +00002855 self.assertEqual(d.get(cistr('thrEE')), 3)
2856
2857 def test_classic_comparisons(self):
2858 # Testing classic comparisons...
2859 class classic:
2860 pass
2861
2862 for base in (classic, int, object):
2863 class C(base):
2864 def __init__(self, value):
2865 self.value = int(value)
2866 def __cmp__(self, other):
2867 if isinstance(other, C):
2868 return cmp(self.value, other.value)
2869 if isinstance(other, int) or isinstance(other, long):
2870 return cmp(self.value, other)
2871 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002872 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002873
2874 c1 = C(1)
2875 c2 = C(2)
2876 c3 = C(3)
2877 self.assertEqual(c1, 1)
2878 c = {1: c1, 2: c2, 3: c3}
2879 for x in 1, 2, 3:
2880 for y in 1, 2, 3:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002881 self.assertTrue(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002882 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002883 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002884 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002885 self.assertTrue(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2886 self.assertTrue(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002887
2888 def test_rich_comparisons(self):
2889 # Testing rich comparisons...
2890 class Z(complex):
2891 pass
2892 z = Z(1)
2893 self.assertEqual(z, 1+0j)
2894 self.assertEqual(1+0j, z)
2895 class ZZ(complex):
2896 def __eq__(self, other):
2897 try:
2898 return abs(self - other) <= 1e-6
2899 except:
2900 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002901 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002902 zz = ZZ(1.0000003)
2903 self.assertEqual(zz, 1+0j)
2904 self.assertEqual(1+0j, zz)
2905
2906 class classic:
2907 pass
2908 for base in (classic, int, object, list):
2909 class C(base):
2910 def __init__(self, value):
2911 self.value = int(value)
2912 def __cmp__(self_, other):
2913 self.fail("shouldn't call __cmp__")
Nick Coghlan48361f52008-08-11 15:45:58 +00002914 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002915 def __eq__(self, other):
2916 if isinstance(other, C):
2917 return self.value == other.value
2918 if isinstance(other, int) or isinstance(other, long):
2919 return self.value == other
2920 return NotImplemented
2921 def __ne__(self, other):
2922 if isinstance(other, C):
2923 return self.value != other.value
2924 if isinstance(other, int) or isinstance(other, long):
2925 return self.value != other
2926 return NotImplemented
2927 def __lt__(self, other):
2928 if isinstance(other, C):
2929 return self.value < other.value
2930 if isinstance(other, int) or isinstance(other, long):
2931 return self.value < other
2932 return NotImplemented
2933 def __le__(self, other):
2934 if isinstance(other, C):
2935 return self.value <= other.value
2936 if isinstance(other, int) or isinstance(other, long):
2937 return self.value <= other
2938 return NotImplemented
2939 def __gt__(self, other):
2940 if isinstance(other, C):
2941 return self.value > other.value
2942 if isinstance(other, int) or isinstance(other, long):
2943 return self.value > other
2944 return NotImplemented
2945 def __ge__(self, other):
2946 if isinstance(other, C):
2947 return self.value >= other.value
2948 if isinstance(other, int) or isinstance(other, long):
2949 return self.value >= other
2950 return NotImplemented
2951 c1 = C(1)
2952 c2 = C(2)
2953 c3 = C(3)
2954 self.assertEqual(c1, 1)
2955 c = {1: c1, 2: c2, 3: c3}
2956 for x in 1, 2, 3:
2957 for y in 1, 2, 3:
2958 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002959 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002960 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002961 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002962 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002963 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002964 "x=%d, y=%d" % (x, y))
2965
2966 def test_coercions(self):
2967 # Testing coercions...
2968 class I(int): pass
2969 coerce(I(0), 0)
2970 coerce(0, I(0))
2971 class L(long): pass
2972 coerce(L(0), 0)
2973 coerce(L(0), 0L)
2974 coerce(0, L(0))
2975 coerce(0L, L(0))
2976 class F(float): pass
2977 coerce(F(0), 0)
2978 coerce(F(0), 0L)
2979 coerce(F(0), 0.)
2980 coerce(0, F(0))
2981 coerce(0L, F(0))
2982 coerce(0., F(0))
2983 class C(complex): pass
2984 coerce(C(0), 0)
2985 coerce(C(0), 0L)
2986 coerce(C(0), 0.)
2987 coerce(C(0), 0j)
2988 coerce(0, C(0))
2989 coerce(0L, C(0))
2990 coerce(0., C(0))
2991 coerce(0j, C(0))
2992
2993 def test_descrdoc(self):
2994 # Testing descriptor doc strings...
2995 def check(descr, what):
2996 self.assertEqual(descr.__doc__, what)
2997 check(file.closed, "True if the file is closed") # getset descriptor
2998 check(file.name, "file name") # member descriptor
2999
3000 def test_doc_descriptor(self):
3001 # Testing __doc__ descriptor...
3002 # SF bug 542984
3003 class DocDescr(object):
3004 def __get__(self, object, otype):
3005 if object:
3006 object = object.__class__.__name__ + ' instance'
3007 if otype:
3008 otype = otype.__name__
3009 return 'object=%s; type=%s' % (object, otype)
3010 class OldClass:
3011 __doc__ = DocDescr()
3012 class NewClass(object):
3013 __doc__ = DocDescr()
3014 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
3015 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3016 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
3017 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3018
3019 def test_set_class(self):
3020 # Testing __class__ assignment...
3021 class C(object): pass
3022 class D(object): pass
3023 class E(object): pass
3024 class F(D, E): pass
3025 for cls in C, D, E, F:
3026 for cls2 in C, D, E, F:
3027 x = cls()
3028 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003029 self.assertTrue(x.__class__ is cls2)
Georg Brandl48545522008-02-02 10:12:36 +00003030 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003031 self.assertTrue(x.__class__ is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003032 def cant(x, C):
3033 try:
3034 x.__class__ = C
3035 except TypeError:
3036 pass
3037 else:
3038 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
3039 try:
3040 delattr(x, "__class__")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003041 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003042 pass
3043 else:
3044 self.fail("shouldn't allow del %r.__class__" % x)
3045 cant(C(), list)
3046 cant(list(), C)
3047 cant(C(), 1)
3048 cant(C(), object)
3049 cant(object(), list)
3050 cant(list(), object)
3051 class Int(int): __slots__ = []
3052 cant(2, Int)
3053 cant(Int(), int)
3054 cant(True, int)
3055 cant(2, bool)
3056 o = object()
3057 cant(o, type(1))
3058 cant(o, type(None))
3059 del o
3060 class G(object):
3061 __slots__ = ["a", "b"]
3062 class H(object):
3063 __slots__ = ["b", "a"]
3064 try:
3065 unicode
3066 except NameError:
3067 class I(object):
3068 __slots__ = ["a", "b"]
3069 else:
3070 class I(object):
3071 __slots__ = [unicode("a"), unicode("b")]
3072 class J(object):
3073 __slots__ = ["c", "b"]
3074 class K(object):
3075 __slots__ = ["a", "b", "d"]
3076 class L(H):
3077 __slots__ = ["e"]
3078 class M(I):
3079 __slots__ = ["e"]
3080 class N(J):
3081 __slots__ = ["__weakref__"]
3082 class P(J):
3083 __slots__ = ["__dict__"]
3084 class Q(J):
3085 pass
3086 class R(J):
3087 __slots__ = ["__dict__", "__weakref__"]
3088
3089 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
3090 x = cls()
3091 x.a = 1
3092 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003093 self.assertTrue(x.__class__ is cls2,
Georg Brandl48545522008-02-02 10:12:36 +00003094 "assigning %r as __class__ for %r silently failed" % (cls2, x))
3095 self.assertEqual(x.a, 1)
3096 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003097 self.assertTrue(x.__class__ is cls,
Georg Brandl48545522008-02-02 10:12:36 +00003098 "assigning %r as __class__ for %r silently failed" % (cls, x))
3099 self.assertEqual(x.a, 1)
3100 for cls in G, J, K, L, M, N, P, R, list, Int:
3101 for cls2 in G, J, K, L, M, N, P, R, list, Int:
3102 if cls is cls2:
3103 continue
3104 cant(cls(), cls2)
3105
Benjamin Peterson5083dc52009-04-25 00:41:22 +00003106 # Issue5283: when __class__ changes in __del__, the wrong
3107 # type gets DECREF'd.
3108 class O(object):
3109 pass
3110 class A(object):
3111 def __del__(self):
3112 self.__class__ = O
3113 l = [A() for x in range(100)]
3114 del l
3115
Georg Brandl48545522008-02-02 10:12:36 +00003116 def test_set_dict(self):
3117 # Testing __dict__ assignment...
3118 class C(object): pass
3119 a = C()
3120 a.__dict__ = {'b': 1}
3121 self.assertEqual(a.b, 1)
3122 def cant(x, dict):
3123 try:
3124 x.__dict__ = dict
3125 except (AttributeError, TypeError):
3126 pass
3127 else:
3128 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
3129 cant(a, None)
3130 cant(a, [])
3131 cant(a, 1)
3132 del a.__dict__ # Deleting __dict__ is allowed
3133
3134 class Base(object):
3135 pass
3136 def verify_dict_readonly(x):
3137 """
3138 x has to be an instance of a class inheriting from Base.
3139 """
3140 cant(x, {})
3141 try:
3142 del x.__dict__
3143 except (AttributeError, TypeError):
3144 pass
3145 else:
3146 self.fail("shouldn't allow del %r.__dict__" % x)
3147 dict_descr = Base.__dict__["__dict__"]
3148 try:
3149 dict_descr.__set__(x, {})
3150 except (AttributeError, TypeError):
3151 pass
3152 else:
3153 self.fail("dict_descr allowed access to %r's dict" % x)
3154
3155 # Classes don't allow __dict__ assignment and have readonly dicts
3156 class Meta1(type, Base):
3157 pass
3158 class Meta2(Base, type):
3159 pass
3160 class D(object):
3161 __metaclass__ = Meta1
3162 class E(object):
3163 __metaclass__ = Meta2
3164 for cls in C, D, E:
3165 verify_dict_readonly(cls)
3166 class_dict = cls.__dict__
3167 try:
3168 class_dict["spam"] = "eggs"
3169 except TypeError:
3170 pass
3171 else:
3172 self.fail("%r's __dict__ can be modified" % cls)
3173
3174 # Modules also disallow __dict__ assignment
3175 class Module1(types.ModuleType, Base):
3176 pass
3177 class Module2(Base, types.ModuleType):
3178 pass
3179 for ModuleType in Module1, Module2:
3180 mod = ModuleType("spam")
3181 verify_dict_readonly(mod)
3182 mod.__dict__["spam"] = "eggs"
3183
3184 # Exception's __dict__ can be replaced, but not deleted
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003185 # (at least not any more than regular exception's __dict__ can
3186 # be deleted; on CPython it is not the case, whereas on PyPy they
3187 # can, just like any other new-style instance's __dict__.)
3188 def can_delete_dict(e):
3189 try:
3190 del e.__dict__
3191 except (TypeError, AttributeError):
3192 return False
3193 else:
3194 return True
Georg Brandl48545522008-02-02 10:12:36 +00003195 class Exception1(Exception, Base):
3196 pass
3197 class Exception2(Base, Exception):
3198 pass
3199 for ExceptionType in Exception, Exception1, Exception2:
3200 e = ExceptionType()
3201 e.__dict__ = {"a": 1}
3202 self.assertEqual(e.a, 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003203 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl48545522008-02-02 10:12:36 +00003204
3205 def test_pickles(self):
3206 # Testing pickling and copying new-style classes and objects...
3207 import pickle, cPickle
3208
3209 def sorteditems(d):
3210 L = d.items()
3211 L.sort()
3212 return L
3213
3214 global C
3215 class C(object):
3216 def __init__(self, a, b):
3217 super(C, self).__init__()
3218 self.a = a
3219 self.b = b
3220 def __repr__(self):
3221 return "C(%r, %r)" % (self.a, self.b)
3222
3223 global C1
3224 class C1(list):
3225 def __new__(cls, a, b):
3226 return super(C1, cls).__new__(cls)
3227 def __getnewargs__(self):
3228 return (self.a, self.b)
3229 def __init__(self, a, b):
3230 self.a = a
3231 self.b = b
3232 def __repr__(self):
3233 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3234
3235 global C2
3236 class C2(int):
3237 def __new__(cls, a, b, val=0):
3238 return super(C2, cls).__new__(cls, val)
3239 def __getnewargs__(self):
3240 return (self.a, self.b, int(self))
3241 def __init__(self, a, b, val=0):
3242 self.a = a
3243 self.b = b
3244 def __repr__(self):
3245 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3246
3247 global C3
3248 class C3(object):
3249 def __init__(self, foo):
3250 self.foo = foo
3251 def __getstate__(self):
3252 return self.foo
3253 def __setstate__(self, foo):
3254 self.foo = foo
3255
3256 global C4classic, C4
3257 class C4classic: # classic
3258 pass
3259 class C4(C4classic, object): # mixed inheritance
3260 pass
3261
3262 for p in pickle, cPickle:
3263 for bin in 0, 1:
3264 for cls in C, C1, C2:
3265 s = p.dumps(cls, bin)
3266 cls2 = p.loads(s)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003267 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003268
3269 a = C1(1, 2); a.append(42); a.append(24)
3270 b = C2("hello", "world", 42)
3271 s = p.dumps((a, b), bin)
3272 x, y = p.loads(s)
3273 self.assertEqual(x.__class__, a.__class__)
3274 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3275 self.assertEqual(y.__class__, b.__class__)
3276 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3277 self.assertEqual(repr(x), repr(a))
3278 self.assertEqual(repr(y), repr(b))
3279 # Test for __getstate__ and __setstate__ on new style class
3280 u = C3(42)
3281 s = p.dumps(u, bin)
3282 v = p.loads(s)
3283 self.assertEqual(u.__class__, v.__class__)
3284 self.assertEqual(u.foo, v.foo)
3285 # Test for picklability of hybrid class
3286 u = C4()
3287 u.foo = 42
3288 s = p.dumps(u, bin)
3289 v = p.loads(s)
3290 self.assertEqual(u.__class__, v.__class__)
3291 self.assertEqual(u.foo, v.foo)
3292
3293 # Testing copy.deepcopy()
3294 import copy
3295 for cls in C, C1, C2:
3296 cls2 = copy.deepcopy(cls)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003297 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003298
3299 a = C1(1, 2); a.append(42); a.append(24)
3300 b = C2("hello", "world", 42)
3301 x, y = copy.deepcopy((a, b))
3302 self.assertEqual(x.__class__, a.__class__)
3303 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3304 self.assertEqual(y.__class__, b.__class__)
3305 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3306 self.assertEqual(repr(x), repr(a))
3307 self.assertEqual(repr(y), repr(b))
3308
3309 def test_pickle_slots(self):
3310 # Testing pickling of classes with __slots__ ...
3311 import pickle, cPickle
3312 # Pickling of classes with __slots__ but without __getstate__ should fail
3313 global B, C, D, E
3314 class B(object):
3315 pass
3316 for base in [object, B]:
3317 class C(base):
3318 __slots__ = ['a']
3319 class D(C):
3320 pass
3321 try:
3322 pickle.dumps(C())
3323 except TypeError:
3324 pass
3325 else:
3326 self.fail("should fail: pickle C instance - %s" % base)
3327 try:
3328 cPickle.dumps(C())
3329 except TypeError:
3330 pass
3331 else:
3332 self.fail("should fail: cPickle C instance - %s" % base)
3333 try:
3334 pickle.dumps(C())
3335 except TypeError:
3336 pass
3337 else:
3338 self.fail("should fail: pickle D instance - %s" % base)
3339 try:
3340 cPickle.dumps(D())
3341 except TypeError:
3342 pass
3343 else:
3344 self.fail("should fail: cPickle D instance - %s" % base)
3345 # Give C a nice generic __getstate__ and __setstate__
3346 class C(base):
3347 __slots__ = ['a']
3348 def __getstate__(self):
3349 try:
3350 d = self.__dict__.copy()
3351 except AttributeError:
3352 d = {}
3353 for cls in self.__class__.__mro__:
3354 for sn in cls.__dict__.get('__slots__', ()):
3355 try:
3356 d[sn] = getattr(self, sn)
3357 except AttributeError:
3358 pass
3359 return d
3360 def __setstate__(self, d):
3361 for k, v in d.items():
3362 setattr(self, k, v)
3363 class D(C):
3364 pass
3365 # Now it should work
3366 x = C()
3367 y = pickle.loads(pickle.dumps(x))
3368 self.assertEqual(hasattr(y, 'a'), 0)
3369 y = cPickle.loads(cPickle.dumps(x))
3370 self.assertEqual(hasattr(y, 'a'), 0)
3371 x.a = 42
3372 y = pickle.loads(pickle.dumps(x))
3373 self.assertEqual(y.a, 42)
3374 y = cPickle.loads(cPickle.dumps(x))
3375 self.assertEqual(y.a, 42)
3376 x = D()
3377 x.a = 42
3378 x.b = 100
3379 y = pickle.loads(pickle.dumps(x))
3380 self.assertEqual(y.a + y.b, 142)
3381 y = cPickle.loads(cPickle.dumps(x))
3382 self.assertEqual(y.a + y.b, 142)
3383 # A subclass that adds a slot should also work
3384 class E(C):
3385 __slots__ = ['b']
3386 x = E()
3387 x.a = 42
3388 x.b = "foo"
3389 y = pickle.loads(pickle.dumps(x))
3390 self.assertEqual(y.a, x.a)
3391 self.assertEqual(y.b, x.b)
3392 y = cPickle.loads(cPickle.dumps(x))
3393 self.assertEqual(y.a, x.a)
3394 self.assertEqual(y.b, x.b)
3395
3396 def test_binary_operator_override(self):
3397 # Testing overrides of binary operations...
3398 class I(int):
3399 def __repr__(self):
3400 return "I(%r)" % int(self)
3401 def __add__(self, other):
3402 return I(int(self) + int(other))
3403 __radd__ = __add__
3404 def __pow__(self, other, mod=None):
3405 if mod is None:
3406 return I(pow(int(self), int(other)))
3407 else:
3408 return I(pow(int(self), int(other), int(mod)))
3409 def __rpow__(self, other, mod=None):
3410 if mod is None:
3411 return I(pow(int(other), int(self), mod))
3412 else:
3413 return I(pow(int(other), int(self), int(mod)))
3414
3415 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3416 self.assertEqual(repr(I(1) + 2), "I(3)")
3417 self.assertEqual(repr(1 + I(2)), "I(3)")
3418 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3419 self.assertEqual(repr(2 ** I(3)), "I(8)")
3420 self.assertEqual(repr(I(2) ** 3), "I(8)")
3421 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3422 class S(str):
3423 def __eq__(self, other):
3424 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003425 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003426
3427 def test_subclass_propagation(self):
3428 # Testing propagation of slot functions to subclasses...
3429 class A(object):
3430 pass
3431 class B(A):
3432 pass
3433 class C(A):
3434 pass
3435 class D(B, C):
3436 pass
3437 d = D()
3438 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3439 A.__hash__ = lambda self: 42
3440 self.assertEqual(hash(d), 42)
3441 C.__hash__ = lambda self: 314
3442 self.assertEqual(hash(d), 314)
3443 B.__hash__ = lambda self: 144
3444 self.assertEqual(hash(d), 144)
3445 D.__hash__ = lambda self: 100
3446 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003447 D.__hash__ = None
3448 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003449 del D.__hash__
3450 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003451 B.__hash__ = None
3452 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003453 del B.__hash__
3454 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003455 C.__hash__ = None
3456 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003457 del C.__hash__
3458 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003459 A.__hash__ = None
3460 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003461 del A.__hash__
3462 self.assertEqual(hash(d), orig_hash)
3463 d.foo = 42
3464 d.bar = 42
3465 self.assertEqual(d.foo, 42)
3466 self.assertEqual(d.bar, 42)
3467 def __getattribute__(self, name):
3468 if name == "foo":
3469 return 24
3470 return object.__getattribute__(self, name)
3471 A.__getattribute__ = __getattribute__
3472 self.assertEqual(d.foo, 24)
3473 self.assertEqual(d.bar, 42)
3474 def __getattr__(self, name):
3475 if name in ("spam", "foo", "bar"):
3476 return "hello"
3477 raise AttributeError, name
3478 B.__getattr__ = __getattr__
3479 self.assertEqual(d.spam, "hello")
3480 self.assertEqual(d.foo, 24)
3481 self.assertEqual(d.bar, 42)
3482 del A.__getattribute__
3483 self.assertEqual(d.foo, 42)
3484 del d.foo
3485 self.assertEqual(d.foo, "hello")
3486 self.assertEqual(d.bar, 42)
3487 del B.__getattr__
3488 try:
3489 d.foo
3490 except AttributeError:
3491 pass
3492 else:
3493 self.fail("d.foo should be undefined now")
3494
3495 # Test a nasty bug in recurse_down_subclasses()
3496 import gc
3497 class A(object):
3498 pass
3499 class B(A):
3500 pass
3501 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003502 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003503 A.__setitem__ = lambda *a: None # crash
3504
3505 def test_buffer_inheritance(self):
3506 # Testing that buffer interface is inherited ...
3507
3508 import binascii
3509 # SF bug [#470040] ParseTuple t# vs subclasses.
3510
3511 class MyStr(str):
3512 pass
3513 base = 'abc'
3514 m = MyStr(base)
3515 # b2a_hex uses the buffer interface to get its argument's value, via
3516 # PyArg_ParseTuple 't#' code.
3517 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3518
3519 # It's not clear that unicode will continue to support the character
3520 # buffer interface, and this test will fail if that's taken away.
3521 class MyUni(unicode):
3522 pass
3523 base = u'abc'
3524 m = MyUni(base)
3525 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3526
3527 class MyInt(int):
3528 pass
3529 m = MyInt(42)
3530 try:
3531 binascii.b2a_hex(m)
3532 self.fail('subclass of int should not have a buffer interface')
3533 except TypeError:
3534 pass
3535
3536 def test_str_of_str_subclass(self):
3537 # Testing __str__ defined in subclass of str ...
3538 import binascii
3539 import cStringIO
3540
3541 class octetstring(str):
3542 def __str__(self):
3543 return binascii.b2a_hex(self)
3544 def __repr__(self):
3545 return self + " repr"
3546
3547 o = octetstring('A')
3548 self.assertEqual(type(o), octetstring)
3549 self.assertEqual(type(str(o)), str)
3550 self.assertEqual(type(repr(o)), str)
3551 self.assertEqual(ord(o), 0x41)
3552 self.assertEqual(str(o), '41')
3553 self.assertEqual(repr(o), 'A repr')
3554 self.assertEqual(o.__str__(), '41')
3555 self.assertEqual(o.__repr__(), 'A repr')
3556
3557 capture = cStringIO.StringIO()
3558 # Calling str() or not exercises different internal paths.
3559 print >> capture, o
3560 print >> capture, str(o)
3561 self.assertEqual(capture.getvalue(), '41\n41\n')
3562 capture.close()
3563
3564 def test_keyword_arguments(self):
3565 # Testing keyword arguments to __init__, __call__...
3566 def f(a): return a
3567 self.assertEqual(f.__call__(a=42), 42)
3568 a = []
3569 list.__init__(a, sequence=[0, 1, 2])
3570 self.assertEqual(a, [0, 1, 2])
3571
3572 def test_recursive_call(self):
3573 # Testing recursive __call__() by setting to instance of class...
3574 class A(object):
3575 pass
3576
3577 A.__call__ = A()
3578 try:
3579 A()()
3580 except RuntimeError:
3581 pass
3582 else:
3583 self.fail("Recursion limit should have been reached for __call__()")
3584
3585 def test_delete_hook(self):
3586 # Testing __del__ hook...
3587 log = []
3588 class C(object):
3589 def __del__(self):
3590 log.append(1)
3591 c = C()
3592 self.assertEqual(log, [])
3593 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003594 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003595 self.assertEqual(log, [1])
3596
3597 class D(object): pass
3598 d = D()
3599 try: del d[0]
3600 except TypeError: pass
3601 else: self.fail("invalid del() didn't raise TypeError")
3602
3603 def test_hash_inheritance(self):
3604 # Testing hash of mutable subclasses...
3605
3606 class mydict(dict):
3607 pass
3608 d = mydict()
3609 try:
3610 hash(d)
3611 except TypeError:
3612 pass
3613 else:
3614 self.fail("hash() of dict subclass should fail")
3615
3616 class mylist(list):
3617 pass
3618 d = mylist()
3619 try:
3620 hash(d)
3621 except TypeError:
3622 pass
3623 else:
3624 self.fail("hash() of list subclass should fail")
3625
3626 def test_str_operations(self):
3627 try: 'a' + 5
3628 except TypeError: pass
3629 else: self.fail("'' + 5 doesn't raise TypeError")
3630
3631 try: ''.split('')
3632 except ValueError: pass
3633 else: self.fail("''.split('') doesn't raise ValueError")
3634
3635 try: ''.join([0])
3636 except TypeError: pass
3637 else: self.fail("''.join([0]) doesn't raise TypeError")
3638
3639 try: ''.rindex('5')
3640 except ValueError: pass
3641 else: self.fail("''.rindex('5') doesn't raise ValueError")
3642
3643 try: '%(n)s' % None
3644 except TypeError: pass
3645 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3646
3647 try: '%(n' % {}
3648 except ValueError: pass
3649 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3650
3651 try: '%*s' % ('abc')
3652 except TypeError: pass
3653 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3654
3655 try: '%*.*s' % ('abc', 5)
3656 except TypeError: pass
3657 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3658
3659 try: '%s' % (1, 2)
3660 except TypeError: pass
3661 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3662
3663 try: '%' % None
3664 except ValueError: pass
3665 else: self.fail("'%' % None doesn't raise ValueError")
3666
3667 self.assertEqual('534253'.isdigit(), 1)
3668 self.assertEqual('534253x'.isdigit(), 0)
3669 self.assertEqual('%c' % 5, '\x05')
3670 self.assertEqual('%c' % '5', '5')
3671
3672 def test_deepcopy_recursive(self):
3673 # Testing deepcopy of recursive objects...
3674 class Node:
3675 pass
3676 a = Node()
3677 b = Node()
3678 a.b = b
3679 b.a = a
3680 z = deepcopy(a) # This blew up before
3681
3682 def test_unintialized_modules(self):
3683 # Testing uninitialized module objects...
3684 from types import ModuleType as M
3685 m = M.__new__(M)
3686 str(m)
3687 self.assertEqual(hasattr(m, "__name__"), 0)
3688 self.assertEqual(hasattr(m, "__file__"), 0)
3689 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003690 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003691 m.foo = 1
3692 self.assertEqual(m.__dict__, {"foo": 1})
3693
3694 def test_funny_new(self):
3695 # Testing __new__ returning something unexpected...
3696 class C(object):
3697 def __new__(cls, arg):
3698 if isinstance(arg, str): return [1, 2, 3]
3699 elif isinstance(arg, int): return object.__new__(D)
3700 else: return object.__new__(cls)
3701 class D(C):
3702 def __init__(self, arg):
3703 self.foo = arg
3704 self.assertEqual(C("1"), [1, 2, 3])
3705 self.assertEqual(D("1"), [1, 2, 3])
3706 d = D(None)
3707 self.assertEqual(d.foo, None)
3708 d = C(1)
3709 self.assertEqual(isinstance(d, D), True)
3710 self.assertEqual(d.foo, 1)
3711 d = D(1)
3712 self.assertEqual(isinstance(d, D), True)
3713 self.assertEqual(d.foo, 1)
3714
3715 def test_imul_bug(self):
3716 # Testing for __imul__ problems...
3717 # SF bug 544647
3718 class C(object):
3719 def __imul__(self, other):
3720 return (self, other)
3721 x = C()
3722 y = x
3723 y *= 1.0
3724 self.assertEqual(y, (x, 1.0))
3725 y = x
3726 y *= 2
3727 self.assertEqual(y, (x, 2))
3728 y = x
3729 y *= 3L
3730 self.assertEqual(y, (x, 3L))
3731 y = x
3732 y *= 1L<<100
3733 self.assertEqual(y, (x, 1L<<100))
3734 y = x
3735 y *= None
3736 self.assertEqual(y, (x, None))
3737 y = x
3738 y *= "foo"
3739 self.assertEqual(y, (x, "foo"))
3740
3741 def test_copy_setstate(self):
3742 # Testing that copy.*copy() correctly uses __setstate__...
3743 import copy
3744 class C(object):
3745 def __init__(self, foo=None):
3746 self.foo = foo
3747 self.__foo = foo
3748 def setfoo(self, foo=None):
3749 self.foo = foo
3750 def getfoo(self):
3751 return self.__foo
3752 def __getstate__(self):
3753 return [self.foo]
3754 def __setstate__(self_, lst):
3755 self.assertEqual(len(lst), 1)
3756 self_.__foo = self_.foo = lst[0]
3757 a = C(42)
3758 a.setfoo(24)
3759 self.assertEqual(a.foo, 24)
3760 self.assertEqual(a.getfoo(), 42)
3761 b = copy.copy(a)
3762 self.assertEqual(b.foo, 24)
3763 self.assertEqual(b.getfoo(), 24)
3764 b = copy.deepcopy(a)
3765 self.assertEqual(b.foo, 24)
3766 self.assertEqual(b.getfoo(), 24)
3767
3768 def test_slices(self):
3769 # Testing cases with slices and overridden __getitem__ ...
3770
3771 # Strings
3772 self.assertEqual("hello"[:4], "hell")
3773 self.assertEqual("hello"[slice(4)], "hell")
3774 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3775 class S(str):
3776 def __getitem__(self, x):
3777 return str.__getitem__(self, x)
3778 self.assertEqual(S("hello")[:4], "hell")
3779 self.assertEqual(S("hello")[slice(4)], "hell")
3780 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3781 # Tuples
3782 self.assertEqual((1,2,3)[:2], (1,2))
3783 self.assertEqual((1,2,3)[slice(2)], (1,2))
3784 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3785 class T(tuple):
3786 def __getitem__(self, x):
3787 return tuple.__getitem__(self, x)
3788 self.assertEqual(T((1,2,3))[:2], (1,2))
3789 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3790 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3791 # Lists
3792 self.assertEqual([1,2,3][:2], [1,2])
3793 self.assertEqual([1,2,3][slice(2)], [1,2])
3794 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3795 class L(list):
3796 def __getitem__(self, x):
3797 return list.__getitem__(self, x)
3798 self.assertEqual(L([1,2,3])[:2], [1,2])
3799 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3800 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3801 # Now do lists and __setitem__
3802 a = L([1,2,3])
3803 a[slice(1, 3)] = [3,2]
3804 self.assertEqual(a, [1,3,2])
3805 a[slice(0, 2, 1)] = [3,1]
3806 self.assertEqual(a, [3,1,2])
3807 a.__setitem__(slice(1, 3), [2,1])
3808 self.assertEqual(a, [3,2,1])
3809 a.__setitem__(slice(0, 2, 1), [2,3])
3810 self.assertEqual(a, [2,3,1])
3811
3812 def test_subtype_resurrection(self):
3813 # Testing resurrection of new-style instance...
3814
3815 class C(object):
3816 container = []
3817
3818 def __del__(self):
3819 # resurrect the instance
3820 C.container.append(self)
3821
3822 c = C()
3823 c.attr = 42
3824
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003825 # The most interesting thing here is whether this blows up, due to
3826 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3827 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003828 del c
3829
3830 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003831 # the last container slot works: that will attempt to delete c again,
3832 # which will cause c to get appended back to the container again
3833 # "during" the del. (On non-CPython implementations, however, __del__
3834 # is typically not called again.)
3835 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003836 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003837 del C.container[-1]
3838 if test_support.check_impl_detail():
3839 test_support.gc_collect()
3840 self.assertEqual(len(C.container), 1)
3841 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003842
3843 # Make c mortal again, so that the test framework with -l doesn't report
3844 # it as a leak.
3845 del C.__del__
3846
3847 def test_slots_trash(self):
3848 # Testing slot trash...
3849 # Deallocating deeply nested slotted trash caused stack overflows
3850 class trash(object):
3851 __slots__ = ['x']
3852 def __init__(self, x):
3853 self.x = x
3854 o = None
3855 for i in xrange(50000):
3856 o = trash(o)
3857 del o
3858
3859 def test_slots_multiple_inheritance(self):
3860 # SF bug 575229, multiple inheritance w/ slots dumps core
3861 class A(object):
3862 __slots__=()
3863 class B(object):
3864 pass
3865 class C(A,B) :
3866 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003867 if test_support.check_impl_detail():
3868 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003869 self.assertTrue(hasattr(C, '__dict__'))
3870 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl48545522008-02-02 10:12:36 +00003871 C().x = 2
3872
3873 def test_rmul(self):
3874 # Testing correct invocation of __rmul__...
3875 # SF patch 592646
3876 class C(object):
3877 def __mul__(self, other):
3878 return "mul"
3879 def __rmul__(self, other):
3880 return "rmul"
3881 a = C()
3882 self.assertEqual(a*2, "mul")
3883 self.assertEqual(a*2.2, "mul")
3884 self.assertEqual(2*a, "rmul")
3885 self.assertEqual(2.2*a, "rmul")
3886
3887 def test_ipow(self):
3888 # Testing correct invocation of __ipow__...
3889 # [SF bug 620179]
3890 class C(object):
3891 def __ipow__(self, other):
3892 pass
3893 a = C()
3894 a **= 2
3895
3896 def test_mutable_bases(self):
3897 # Testing mutable bases...
3898
3899 # stuff that should work:
3900 class C(object):
3901 pass
3902 class C2(object):
3903 def __getattribute__(self, attr):
3904 if attr == 'a':
3905 return 2
3906 else:
3907 return super(C2, self).__getattribute__(attr)
3908 def meth(self):
3909 return 1
3910 class D(C):
3911 pass
3912 class E(D):
3913 pass
3914 d = D()
3915 e = E()
3916 D.__bases__ = (C,)
3917 D.__bases__ = (C2,)
3918 self.assertEqual(d.meth(), 1)
3919 self.assertEqual(e.meth(), 1)
3920 self.assertEqual(d.a, 2)
3921 self.assertEqual(e.a, 2)
3922 self.assertEqual(C2.__subclasses__(), [D])
3923
Georg Brandl48545522008-02-02 10:12:36 +00003924 try:
3925 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003926 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003927 pass
3928 else:
3929 self.fail("shouldn't be able to delete .__bases__")
3930
3931 try:
3932 D.__bases__ = ()
3933 except TypeError, msg:
3934 if str(msg) == "a new-style class can't have only classic bases":
3935 self.fail("wrong error message for .__bases__ = ()")
3936 else:
3937 self.fail("shouldn't be able to set .__bases__ to ()")
3938
3939 try:
3940 D.__bases__ = (D,)
3941 except TypeError:
3942 pass
3943 else:
3944 # actually, we'll have crashed by here...
3945 self.fail("shouldn't be able to create inheritance cycles")
3946
3947 try:
3948 D.__bases__ = (C, C)
3949 except TypeError:
3950 pass
3951 else:
3952 self.fail("didn't detect repeated base classes")
3953
3954 try:
3955 D.__bases__ = (E,)
3956 except TypeError:
3957 pass
3958 else:
3959 self.fail("shouldn't be able to create inheritance cycles")
3960
3961 # let's throw a classic class into the mix:
3962 class Classic:
3963 def meth2(self):
3964 return 3
3965
3966 D.__bases__ = (C, Classic)
3967
3968 self.assertEqual(d.meth2(), 3)
3969 self.assertEqual(e.meth2(), 3)
3970 try:
3971 d.a
3972 except AttributeError:
3973 pass
3974 else:
3975 self.fail("attribute should have vanished")
3976
3977 try:
3978 D.__bases__ = (Classic,)
3979 except TypeError:
3980 pass
3981 else:
3982 self.fail("new-style class must have a new-style base")
3983
Benjamin Petersond4d400c2009-04-18 20:12:47 +00003984 def test_builtin_bases(self):
3985 # Make sure all the builtin types can have their base queried without
3986 # segfaulting. See issue #5787.
3987 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
3988 if isinstance(tp, type)]
3989 for tp in builtin_types:
3990 object.__getattribute__(tp, "__bases__")
3991 if tp is not object:
3992 self.assertEqual(len(tp.__bases__), 1, tp)
3993
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00003994 class L(list):
3995 pass
3996
3997 class C(object):
3998 pass
3999
4000 class D(C):
4001 pass
4002
4003 try:
4004 L.__bases__ = (dict,)
4005 except TypeError:
4006 pass
4007 else:
4008 self.fail("shouldn't turn list subclass into dict subclass")
4009
4010 try:
4011 list.__bases__ = (dict,)
4012 except TypeError:
4013 pass
4014 else:
4015 self.fail("shouldn't be able to assign to list.__bases__")
4016
4017 try:
4018 D.__bases__ = (C, list)
4019 except TypeError:
4020 pass
4021 else:
4022 assert 0, "best_base calculation found wanting"
4023
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004024
Georg Brandl48545522008-02-02 10:12:36 +00004025 def test_mutable_bases_with_failing_mro(self):
4026 # Testing mutable bases with failing mro...
4027 class WorkOnce(type):
4028 def __new__(self, name, bases, ns):
4029 self.flag = 0
4030 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
4031 def mro(self):
4032 if self.flag > 0:
4033 raise RuntimeError, "bozo"
4034 else:
4035 self.flag += 1
4036 return type.mro(self)
4037
4038 class WorkAlways(type):
4039 def mro(self):
4040 # this is here to make sure that .mro()s aren't called
4041 # with an exception set (which was possible at one point).
4042 # An error message will be printed in a debug build.
4043 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004044 return type.mro(self)
4045
Georg Brandl48545522008-02-02 10:12:36 +00004046 class C(object):
4047 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004048
Georg Brandl48545522008-02-02 10:12:36 +00004049 class C2(object):
4050 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004051
Georg Brandl48545522008-02-02 10:12:36 +00004052 class D(C):
4053 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004054
Georg Brandl48545522008-02-02 10:12:36 +00004055 class E(D):
4056 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004057
Georg Brandl48545522008-02-02 10:12:36 +00004058 class F(D):
4059 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004060
Georg Brandl48545522008-02-02 10:12:36 +00004061 class G(D):
4062 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004063
Georg Brandl48545522008-02-02 10:12:36 +00004064 # Immediate subclasses have their mro's adjusted in alphabetical
4065 # order, so E's will get adjusted before adjusting F's fails. We
4066 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004067
Georg Brandl48545522008-02-02 10:12:36 +00004068 E_mro_before = E.__mro__
4069 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004070
Armin Rigofd163f92005-12-29 15:59:19 +00004071 try:
Georg Brandl48545522008-02-02 10:12:36 +00004072 D.__bases__ = (C2,)
4073 except RuntimeError:
4074 self.assertEqual(E.__mro__, E_mro_before)
4075 self.assertEqual(D.__mro__, D_mro_before)
4076 else:
4077 self.fail("exception not propagated")
4078
4079 def test_mutable_bases_catch_mro_conflict(self):
4080 # Testing mutable bases catch mro conflict...
4081 class A(object):
4082 pass
4083
4084 class B(object):
4085 pass
4086
4087 class C(A, B):
4088 pass
4089
4090 class D(A, B):
4091 pass
4092
4093 class E(C, D):
4094 pass
4095
4096 try:
4097 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004098 except TypeError:
4099 pass
4100 else:
Georg Brandl48545522008-02-02 10:12:36 +00004101 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004102
Georg Brandl48545522008-02-02 10:12:36 +00004103 def test_mutable_names(self):
4104 # Testing mutable names...
4105 class C(object):
4106 pass
4107
4108 # C.__module__ could be 'test_descr' or '__main__'
4109 mod = C.__module__
4110
4111 C.__name__ = 'D'
4112 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4113
4114 C.__name__ = 'D.E'
4115 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4116
4117 def test_subclass_right_op(self):
4118 # Testing correct dispatch of subclass overloading __r<op>__...
4119
4120 # This code tests various cases where right-dispatch of a subclass
4121 # should be preferred over left-dispatch of a base class.
4122
4123 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4124
4125 class B(int):
4126 def __floordiv__(self, other):
4127 return "B.__floordiv__"
4128 def __rfloordiv__(self, other):
4129 return "B.__rfloordiv__"
4130
4131 self.assertEqual(B(1) // 1, "B.__floordiv__")
4132 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4133
4134 # Case 2: subclass of object; this is just the baseline for case 3
4135
4136 class C(object):
4137 def __floordiv__(self, other):
4138 return "C.__floordiv__"
4139 def __rfloordiv__(self, other):
4140 return "C.__rfloordiv__"
4141
4142 self.assertEqual(C() // 1, "C.__floordiv__")
4143 self.assertEqual(1 // C(), "C.__rfloordiv__")
4144
4145 # Case 3: subclass of new-style class; here it gets interesting
4146
4147 class D(C):
4148 def __floordiv__(self, other):
4149 return "D.__floordiv__"
4150 def __rfloordiv__(self, other):
4151 return "D.__rfloordiv__"
4152
4153 self.assertEqual(D() // C(), "D.__floordiv__")
4154 self.assertEqual(C() // D(), "D.__rfloordiv__")
4155
4156 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4157
4158 class E(C):
4159 pass
4160
4161 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4162
4163 self.assertEqual(E() // 1, "C.__floordiv__")
4164 self.assertEqual(1 // E(), "C.__rfloordiv__")
4165 self.assertEqual(E() // C(), "C.__floordiv__")
4166 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4167
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004168 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004169 def test_meth_class_get(self):
4170 # Testing __get__ method of METH_CLASS C methods...
4171 # Full coverage of descrobject.c::classmethod_get()
4172
4173 # Baseline
4174 arg = [1, 2, 3]
4175 res = {1: None, 2: None, 3: None}
4176 self.assertEqual(dict.fromkeys(arg), res)
4177 self.assertEqual({}.fromkeys(arg), res)
4178
4179 # Now get the descriptor
4180 descr = dict.__dict__["fromkeys"]
4181
4182 # More baseline using the descriptor directly
4183 self.assertEqual(descr.__get__(None, dict)(arg), res)
4184 self.assertEqual(descr.__get__({})(arg), res)
4185
4186 # Now check various error cases
4187 try:
4188 descr.__get__(None, None)
4189 except TypeError:
4190 pass
4191 else:
4192 self.fail("shouldn't have allowed descr.__get__(None, None)")
4193 try:
4194 descr.__get__(42)
4195 except TypeError:
4196 pass
4197 else:
4198 self.fail("shouldn't have allowed descr.__get__(42)")
4199 try:
4200 descr.__get__(None, 42)
4201 except TypeError:
4202 pass
4203 else:
4204 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4205 try:
4206 descr.__get__(None, int)
4207 except TypeError:
4208 pass
4209 else:
4210 self.fail("shouldn't have allowed descr.__get__(None, int)")
4211
4212 def test_isinst_isclass(self):
4213 # Testing proxy isinstance() and isclass()...
4214 class Proxy(object):
4215 def __init__(self, obj):
4216 self.__obj = obj
4217 def __getattribute__(self, name):
4218 if name.startswith("_Proxy__"):
4219 return object.__getattribute__(self, name)
4220 else:
4221 return getattr(self.__obj, name)
4222 # Test with a classic class
4223 class C:
4224 pass
4225 a = C()
4226 pa = Proxy(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004227 self.assertTrue(isinstance(a, C)) # Baseline
4228 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004229 # Test with a classic subclass
4230 class D(C):
4231 pass
4232 a = D()
4233 pa = Proxy(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004234 self.assertTrue(isinstance(a, C)) # Baseline
4235 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004236 # Test with a new-style class
4237 class C(object):
4238 pass
4239 a = C()
4240 pa = Proxy(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004241 self.assertTrue(isinstance(a, C)) # Baseline
4242 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004243 # Test with a new-style subclass
4244 class D(C):
4245 pass
4246 a = D()
4247 pa = Proxy(a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004248 self.assertTrue(isinstance(a, C)) # Baseline
4249 self.assertTrue(isinstance(pa, C)) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004250
4251 def test_proxy_super(self):
4252 # Testing super() for a proxy object...
4253 class Proxy(object):
4254 def __init__(self, obj):
4255 self.__obj = obj
4256 def __getattribute__(self, name):
4257 if name.startswith("_Proxy__"):
4258 return object.__getattribute__(self, name)
4259 else:
4260 return getattr(self.__obj, name)
4261
4262 class B(object):
4263 def f(self):
4264 return "B.f"
4265
4266 class C(B):
4267 def f(self):
4268 return super(C, self).f() + "->C.f"
4269
4270 obj = C()
4271 p = Proxy(obj)
4272 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4273
4274 def test_carloverre(self):
4275 # Testing prohibition of Carlo Verre's hack...
4276 try:
4277 object.__setattr__(str, "foo", 42)
4278 except TypeError:
4279 pass
4280 else:
4281 self.fail("Carlo Verre __setattr__ suceeded!")
4282 try:
4283 object.__delattr__(str, "lower")
4284 except TypeError:
4285 pass
4286 else:
4287 self.fail("Carlo Verre __delattr__ succeeded!")
4288
4289 def test_weakref_segfault(self):
4290 # Testing weakref segfault...
4291 # SF 742911
4292 import weakref
4293
4294 class Provoker:
4295 def __init__(self, referrent):
4296 self.ref = weakref.ref(referrent)
4297
4298 def __del__(self):
4299 x = self.ref()
4300
4301 class Oops(object):
4302 pass
4303
4304 o = Oops()
4305 o.whatever = Provoker(o)
4306 del o
4307
4308 def test_wrapper_segfault(self):
4309 # SF 927248: deeply nested wrappers could cause stack overflow
4310 f = lambda:None
4311 for i in xrange(1000000):
4312 f = f.__call__
4313 f = None
4314
4315 def test_file_fault(self):
4316 # Testing sys.stdout is changed in getattr...
4317 import sys
4318 class StdoutGuard:
4319 def __getattr__(self, attr):
4320 sys.stdout = sys.__stdout__
4321 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4322 sys.stdout = StdoutGuard()
4323 try:
4324 print "Oops!"
4325 except RuntimeError:
4326 pass
4327
4328 def test_vicious_descriptor_nonsense(self):
4329 # Testing vicious_descriptor_nonsense...
4330
4331 # A potential segfault spotted by Thomas Wouters in mail to
4332 # python-dev 2003-04-17, turned into an example & fixed by Michael
4333 # Hudson just less than four months later...
4334
4335 class Evil(object):
4336 def __hash__(self):
4337 return hash('attr')
4338 def __eq__(self, other):
4339 del C.attr
4340 return 0
4341
4342 class Descr(object):
4343 def __get__(self, ob, type=None):
4344 return 1
4345
4346 class C(object):
4347 attr = Descr()
4348
4349 c = C()
4350 c.__dict__[Evil()] = 0
4351
4352 self.assertEqual(c.attr, 1)
4353 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004354 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00004355 self.assertEqual(hasattr(c, 'attr'), False)
4356
4357 def test_init(self):
4358 # SF 1155938
4359 class Foo(object):
4360 def __init__(self):
4361 return 10
4362 try:
4363 Foo()
4364 except TypeError:
4365 pass
4366 else:
4367 self.fail("did not test __init__() for None return")
4368
4369 def test_method_wrapper(self):
4370 # Testing method-wrapper objects...
4371 # <type 'method-wrapper'> did not support any reflection before 2.5
4372
4373 l = []
4374 self.assertEqual(l.__add__, l.__add__)
4375 self.assertEqual(l.__add__, [].__add__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004376 self.assertTrue(l.__add__ != [5].__add__)
4377 self.assertTrue(l.__add__ != l.__mul__)
4378 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004379 if hasattr(l.__add__, '__self__'):
4380 # CPython
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004381 self.assertTrue(l.__add__.__self__ is l)
4382 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004383 else:
4384 # Python implementations where [].__add__ is a normal bound method
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004385 self.assertTrue(l.__add__.im_self is l)
4386 self.assertTrue(l.__add__.im_class is list)
Georg Brandl48545522008-02-02 10:12:36 +00004387 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4388 try:
4389 hash(l.__add__)
4390 except TypeError:
4391 pass
4392 else:
4393 self.fail("no TypeError from hash([].__add__)")
4394
4395 t = ()
4396 t += (7,)
4397 self.assertEqual(t.__add__, (7,).__add__)
4398 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4399
4400 def test_not_implemented(self):
4401 # Testing NotImplemented...
4402 # all binary methods should be able to return a NotImplemented
4403 import sys
4404 import types
4405 import operator
4406
4407 def specialmethod(self, other):
4408 return NotImplemented
4409
4410 def check(expr, x, y):
4411 try:
4412 exec expr in {'x': x, 'y': y, 'operator': operator}
4413 except TypeError:
4414 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004415 else:
Georg Brandl48545522008-02-02 10:12:36 +00004416 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004417
Georg Brandl48545522008-02-02 10:12:36 +00004418 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4419 # TypeErrors
4420 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4421 # ValueErrors instead of TypeErrors
4422 for metaclass in [type, types.ClassType]:
4423 for name, expr, iexpr in [
4424 ('__add__', 'x + y', 'x += y'),
4425 ('__sub__', 'x - y', 'x -= y'),
4426 ('__mul__', 'x * y', 'x *= y'),
4427 ('__truediv__', 'operator.truediv(x, y)', None),
4428 ('__floordiv__', 'operator.floordiv(x, y)', None),
4429 ('__div__', 'x / y', 'x /= y'),
4430 ('__mod__', 'x % y', 'x %= y'),
4431 ('__divmod__', 'divmod(x, y)', None),
4432 ('__pow__', 'x ** y', 'x **= y'),
4433 ('__lshift__', 'x << y', 'x <<= y'),
4434 ('__rshift__', 'x >> y', 'x >>= y'),
4435 ('__and__', 'x & y', 'x &= y'),
4436 ('__or__', 'x | y', 'x |= y'),
4437 ('__xor__', 'x ^ y', 'x ^= y'),
4438 ('__coerce__', 'coerce(x, y)', None)]:
4439 if name == '__coerce__':
4440 rname = name
4441 else:
4442 rname = '__r' + name[2:]
4443 A = metaclass('A', (), {name: specialmethod})
4444 B = metaclass('B', (), {rname: specialmethod})
4445 a = A()
4446 b = B()
4447 check(expr, a, a)
4448 check(expr, a, b)
4449 check(expr, b, a)
4450 check(expr, b, b)
4451 check(expr, a, N1)
4452 check(expr, a, N2)
4453 check(expr, N1, b)
4454 check(expr, N2, b)
4455 if iexpr:
4456 check(iexpr, a, a)
4457 check(iexpr, a, b)
4458 check(iexpr, b, a)
4459 check(iexpr, b, b)
4460 check(iexpr, a, N1)
4461 check(iexpr, a, N2)
4462 iname = '__i' + name[2:]
4463 C = metaclass('C', (), {iname: specialmethod})
4464 c = C()
4465 check(iexpr, c, a)
4466 check(iexpr, c, b)
4467 check(iexpr, c, N1)
4468 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004469
Georg Brandl48545522008-02-02 10:12:36 +00004470 def test_assign_slice(self):
4471 # ceval.c's assign_slice used to check for
4472 # tp->tp_as_sequence->sq_slice instead of
4473 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004474
Georg Brandl48545522008-02-02 10:12:36 +00004475 class C(object):
4476 def __setslice__(self, start, stop, value):
4477 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004478
Georg Brandl48545522008-02-02 10:12:36 +00004479 c = C()
4480 c[1:2] = 3
4481 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004482
Benjamin Peterson273c2332008-11-17 22:39:09 +00004483 def test_getattr_hooks(self):
4484 # issue 4230
4485
4486 class Descriptor(object):
4487 counter = 0
4488 def __get__(self, obj, objtype=None):
4489 def getter(name):
4490 self.counter += 1
4491 raise AttributeError(name)
4492 return getter
4493
4494 descr = Descriptor()
4495 class A(object):
4496 __getattribute__ = descr
4497 class B(object):
4498 __getattr__ = descr
4499 class C(object):
4500 __getattribute__ = descr
4501 __getattr__ = descr
4502
4503 self.assertRaises(AttributeError, getattr, A(), "attr")
4504 self.assertEquals(descr.counter, 1)
4505 self.assertRaises(AttributeError, getattr, B(), "attr")
4506 self.assertEquals(descr.counter, 2)
4507 self.assertRaises(AttributeError, getattr, C(), "attr")
4508 self.assertEquals(descr.counter, 4)
4509
4510 import gc
4511 class EvilGetattribute(object):
4512 # This used to segfault
4513 def __getattr__(self, name):
4514 raise AttributeError(name)
4515 def __getattribute__(self, name):
4516 del EvilGetattribute.__getattr__
4517 for i in range(5):
4518 gc.collect()
4519 raise AttributeError(name)
4520
4521 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4522
Guido van Rossum9acc3872008-01-23 23:23:43 +00004523
Georg Brandl48545522008-02-02 10:12:36 +00004524class DictProxyTests(unittest.TestCase):
4525 def setUp(self):
4526 class C(object):
4527 def meth(self):
4528 pass
4529 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004530
Georg Brandl48545522008-02-02 10:12:36 +00004531 def test_iter_keys(self):
4532 # Testing dict-proxy iterkeys...
4533 keys = [ key for key in self.C.__dict__.iterkeys() ]
4534 keys.sort()
4535 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4536 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004537
Georg Brandl48545522008-02-02 10:12:36 +00004538 def test_iter_values(self):
4539 # Testing dict-proxy itervalues...
4540 values = [ values for values in self.C.__dict__.itervalues() ]
4541 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004542
Georg Brandl48545522008-02-02 10:12:36 +00004543 def test_iter_items(self):
4544 # Testing dict-proxy iteritems...
4545 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4546 keys.sort()
4547 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4548 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004549
Georg Brandl48545522008-02-02 10:12:36 +00004550 def test_dict_type_with_metaclass(self):
4551 # Testing type of __dict__ when __metaclass__ set...
4552 class B(object):
4553 pass
4554 class M(type):
4555 pass
4556 class C:
4557 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4558 __metaclass__ = M
4559 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004560
Guido van Rossum9acc3872008-01-23 23:23:43 +00004561
Georg Brandl48545522008-02-02 10:12:36 +00004562class PTypesLongInitTest(unittest.TestCase):
4563 # This is in its own TestCase so that it can be run before any other tests.
4564 def test_pytype_long_ready(self):
4565 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004566
Georg Brandl48545522008-02-02 10:12:36 +00004567 # This dumps core when SF bug 551412 isn't fixed --
4568 # but only when test_descr.py is run separately.
4569 # (That can't be helped -- as soon as PyType_Ready()
4570 # is called for PyLong_Type, the bug is gone.)
4571 class UserLong(object):
4572 def __pow__(self, *args):
4573 pass
4574 try:
4575 pow(0L, UserLong(), 0L)
4576 except:
4577 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004578
Georg Brandl48545522008-02-02 10:12:36 +00004579 # Another segfault only when run early
4580 # (before PyType_Ready(tuple) is called)
4581 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004582
4583
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004584def test_main():
Georg Brandl48545522008-02-02 10:12:36 +00004585 # Run all local test cases, with PTypesLongInitTest first.
4586 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4587 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004588
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004589if __name__ == "__main__":
4590 test_main()