blob: b5d98900e23ab3547fa739439164111a7501c8df [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
Tim Peters4d9b4662002-04-16 01:59:17 +00005
Georg Brandl48545522008-02-02 10:12:36 +00006from copy import deepcopy
7from test import test_support
Tim Peters6d6c1a32001-08-02 04:15:00 +00008
Guido van Rossum875eeaa2001-10-11 18:33:53 +00009
Georg Brandl48545522008-02-02 10:12:36 +000010class OperatorsTest(unittest.TestCase):
Tim Peters6d6c1a32001-08-02 04:15:00 +000011
Georg Brandl48545522008-02-02 10:12:36 +000012 def __init__(self, *args, **kwargs):
13 unittest.TestCase.__init__(self, *args, **kwargs)
14 self.binops = {
15 'add': '+',
16 'sub': '-',
17 'mul': '*',
18 'div': '/',
19 'divmod': 'divmod',
20 'pow': '**',
21 'lshift': '<<',
22 'rshift': '>>',
23 'and': '&',
24 'xor': '^',
25 'or': '|',
26 'cmp': 'cmp',
27 'lt': '<',
28 'le': '<=',
29 'eq': '==',
30 'ne': '!=',
31 'gt': '>',
32 'ge': '>=',
33 }
Tim Peters3caca232001-12-06 06:23:26 +000034
Georg Brandl48545522008-02-02 10:12:36 +000035 for name, expr in self.binops.items():
36 if expr.islower():
37 expr = expr + "(a, b)"
38 else:
39 expr = 'a %s b' % expr
40 self.binops[name] = expr
Tim Peters3caca232001-12-06 06:23:26 +000041
Georg Brandl48545522008-02-02 10:12:36 +000042 self.unops = {
43 'pos': '+',
44 'neg': '-',
45 'abs': 'abs',
46 'invert': '~',
47 'int': 'int',
48 'long': 'long',
49 'float': 'float',
50 'oct': 'oct',
51 'hex': 'hex',
52 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000053
Georg Brandl48545522008-02-02 10:12:36 +000054 for name, expr in self.unops.items():
55 if expr.islower():
56 expr = expr + "(a)"
57 else:
58 expr = '%s a' % expr
59 self.unops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000060
Georg Brandl48545522008-02-02 10:12:36 +000061 def unop_test(self, a, res, expr="len(a)", meth="__len__"):
62 d = {'a': a}
63 self.assertEqual(eval(expr, d), res)
64 t = type(a)
65 m = getattr(t, meth)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066
Georg Brandl48545522008-02-02 10:12:36 +000067 # Find method in parent class
68 while meth not in t.__dict__:
69 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +000070 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
71 # method object; the getattr() below obtains its underlying function.
72 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +000073 self.assertEqual(m(a), res)
74 bm = getattr(a, meth)
75 self.assertEqual(bm(), res)
Tim Peters2f93e282001-10-04 05:27:00 +000076
Georg Brandl48545522008-02-02 10:12:36 +000077 def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
78 d = {'a': a, 'b': b}
Tim Peters2f93e282001-10-04 05:27:00 +000079
Georg Brandl48545522008-02-02 10:12:36 +000080 # XXX Hack so this passes before 2.3 when -Qnew is specified.
81 if meth == "__div__" and 1/2 == 0.5:
82 meth = "__truediv__"
Tim Peters2f93e282001-10-04 05:27:00 +000083
Georg Brandl48545522008-02-02 10:12:36 +000084 if meth == '__divmod__': pass
Tim Peters2f93e282001-10-04 05:27:00 +000085
Georg Brandl48545522008-02-02 10:12:36 +000086 self.assertEqual(eval(expr, d), res)
87 t = type(a)
88 m = getattr(t, meth)
89 while meth not in t.__dict__:
90 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +000091 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
92 # method object; the getattr() below obtains its underlying function.
93 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +000094 self.assertEqual(m(a, b), res)
95 bm = getattr(a, meth)
96 self.assertEqual(bm(b), res)
Tim Peters2f93e282001-10-04 05:27:00 +000097
Georg Brandl48545522008-02-02 10:12:36 +000098 def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"):
99 d = {'a': a, 'b': b, 'c': c}
100 self.assertEqual(eval(expr, d), res)
101 t = type(a)
102 m = getattr(t, meth)
103 while meth not in t.__dict__:
104 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000105 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
106 # method object; the getattr() below obtains its underlying function.
107 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000108 self.assertEqual(m(a, b, c), res)
109 bm = getattr(a, meth)
110 self.assertEqual(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000111
Georg Brandl48545522008-02-02 10:12:36 +0000112 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
113 d = {'a': deepcopy(a), 'b': b}
114 exec stmt in d
115 self.assertEqual(d['a'], res)
116 t = type(a)
117 m = getattr(t, meth)
118 while meth not in t.__dict__:
119 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000120 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
121 # method object; the getattr() below obtains its underlying function.
122 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000123 d['a'] = deepcopy(a)
124 m(d['a'], b)
125 self.assertEqual(d['a'], res)
126 d['a'] = deepcopy(a)
127 bm = getattr(d['a'], meth)
128 bm(b)
129 self.assertEqual(d['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000130
Georg Brandl48545522008-02-02 10:12:36 +0000131 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
132 d = {'a': deepcopy(a), 'b': b, 'c': c}
133 exec stmt in d
134 self.assertEqual(d['a'], res)
135 t = type(a)
136 m = getattr(t, meth)
137 while meth not in t.__dict__:
138 t = t.__bases__[0]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000139 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
140 # method object; the getattr() below obtains its underlying function.
141 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000142 d['a'] = deepcopy(a)
143 m(d['a'], b, c)
144 self.assertEqual(d['a'], res)
145 d['a'] = deepcopy(a)
146 bm = getattr(d['a'], meth)
147 bm(b, c)
148 self.assertEqual(d['a'], res)
149
150 def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
151 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
152 exec stmt in dictionary
153 self.assertEqual(dictionary['a'], res)
154 t = type(a)
155 while meth not in t.__dict__:
156 t = t.__bases__[0]
157 m = getattr(t, meth)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000158 # in some implementations (e.g. PyPy), 'm' can be a regular unbound
159 # method object; the getattr() below obtains its underlying function.
160 self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
Georg Brandl48545522008-02-02 10:12:36 +0000161 dictionary['a'] = deepcopy(a)
162 m(dictionary['a'], b, c, d)
163 self.assertEqual(dictionary['a'], res)
164 dictionary['a'] = deepcopy(a)
165 bm = getattr(dictionary['a'], meth)
166 bm(b, c, d)
167 self.assertEqual(dictionary['a'], res)
168
169 def test_lists(self):
170 # Testing list operations...
171 # Asserts are within individual test methods
172 self.binop_test([1], [2], [1,2], "a+b", "__add__")
173 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
174 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
175 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
176 self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
177 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
178 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
179 self.unop_test([1,2,3], 3, "len(a)", "__len__")
180 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
181 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
182 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
183 self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
184 "__setslice__")
185
186 def test_dicts(self):
187 # Testing dict operations...
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000188 if hasattr(dict, '__cmp__'): # PyPy has only rich comparison on dicts
189 self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
190 else:
191 self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__")
Georg Brandl48545522008-02-02 10:12:36 +0000192 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
193 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
194 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
195
196 d = {1:2, 3:4}
197 l1 = []
198 for i in d.keys():
199 l1.append(i)
200 l = []
201 for i in iter(d):
202 l.append(i)
203 self.assertEqual(l, l1)
204 l = []
205 for i in d.__iter__():
206 l.append(i)
207 self.assertEqual(l, l1)
208 l = []
209 for i in dict.__iter__(d):
210 l.append(i)
211 self.assertEqual(l, l1)
212 d = {1:2, 3:4}
213 self.unop_test(d, 2, "len(a)", "__len__")
214 self.assertEqual(eval(repr(d), {}), d)
215 self.assertEqual(eval(d.__repr__(), {}), d)
216 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
217 "__setitem__")
218
219 # Tests for unary and binary operators
220 def number_operators(self, a, b, skip=[]):
221 dict = {'a': a, 'b': b}
222
223 for name, expr in self.binops.items():
224 if name not in skip:
225 name = "__%s__" % name
226 if hasattr(a, name):
227 res = eval(expr, dict)
228 self.binop_test(a, b, res, expr, name)
229
230 for name, expr in self.unops.items():
231 if name not in skip:
232 name = "__%s__" % name
233 if hasattr(a, name):
234 res = eval(expr, dict)
235 self.unop_test(a, res, expr, name)
236
237 def test_ints(self):
238 # Testing int operations...
239 self.number_operators(100, 3)
240 # The following crashes in Python 2.2
241 self.assertEqual((1).__nonzero__(), 1)
242 self.assertEqual((0).__nonzero__(), 0)
243 # This returns 'NotImplemented' in Python 2.2
244 class C(int):
245 def __add__(self, other):
246 return NotImplemented
247 self.assertEqual(C(5L), 5)
Tim Peters25786c02001-09-02 08:22:48 +0000248 try:
Georg Brandl48545522008-02-02 10:12:36 +0000249 C() + ""
Tim Peters25786c02001-09-02 08:22:48 +0000250 except TypeError:
251 pass
252 else:
Georg Brandl48545522008-02-02 10:12:36 +0000253 self.fail("NotImplemented should have caused TypeError")
Tim Peters1fc240e2001-10-26 05:06:50 +0000254 try:
Georg Brandl48545522008-02-02 10:12:36 +0000255 C(sys.maxint+1)
256 except OverflowError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000257 pass
258 else:
Georg Brandl48545522008-02-02 10:12:36 +0000259 self.fail("should have raised OverflowError")
Tim Peters1fc240e2001-10-26 05:06:50 +0000260
Georg Brandl48545522008-02-02 10:12:36 +0000261 def test_longs(self):
262 # Testing long operations...
263 self.number_operators(100L, 3L)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264
Georg Brandl48545522008-02-02 10:12:36 +0000265 def test_floats(self):
266 # Testing float operations...
267 self.number_operators(100.0, 3.0)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000268
Georg Brandl48545522008-02-02 10:12:36 +0000269 def test_complexes(self):
270 # Testing complex operations...
271 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
272 'int', 'long', 'float'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000273
Georg Brandl48545522008-02-02 10:12:36 +0000274 class Number(complex):
275 __slots__ = ['prec']
276 def __new__(cls, *args, **kwds):
277 result = complex.__new__(cls, *args)
278 result.prec = kwds.get('prec', 12)
279 return result
280 def __repr__(self):
281 prec = self.prec
282 if self.imag == 0.0:
283 return "%.*g" % (prec, self.real)
284 if self.real == 0.0:
285 return "%.*gj" % (prec, self.imag)
286 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
287 __str__ = __repr__
Tim Peters5d2b77c2001-09-03 05:47:38 +0000288
Georg Brandl48545522008-02-02 10:12:36 +0000289 a = Number(3.14, prec=6)
290 self.assertEqual(repr(a), "3.14")
291 self.assertEqual(a.prec, 6)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000292
Georg Brandl48545522008-02-02 10:12:36 +0000293 a = Number(a, prec=2)
294 self.assertEqual(repr(a), "3.1")
295 self.assertEqual(a.prec, 2)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000296
Georg Brandl48545522008-02-02 10:12:36 +0000297 a = Number(234.5)
298 self.assertEqual(repr(a), "234.5")
299 self.assertEqual(a.prec, 12)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000300
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000301 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000302 def test_spam_lists(self):
303 # Testing spamlist operations...
304 import copy, xxsubtype as spam
Tim Peters37a309d2001-09-04 01:20:04 +0000305
Georg Brandl48545522008-02-02 10:12:36 +0000306 def spamlist(l, memo=None):
307 import xxsubtype as spam
308 return spam.spamlist(l)
Tim Peters37a309d2001-09-04 01:20:04 +0000309
Georg Brandl48545522008-02-02 10:12:36 +0000310 # This is an ugly hack:
311 copy._deepcopy_dispatch[spam.spamlist] = spamlist
Tim Peters37a309d2001-09-04 01:20:04 +0000312
Georg Brandl48545522008-02-02 10:12:36 +0000313 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
314 "__add__")
315 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
316 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
317 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
318 self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
319 "__getslice__")
320 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
321 "__iadd__")
322 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
323 "__imul__")
324 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
325 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
326 "__mul__")
327 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
328 "__rmul__")
329 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
330 "__setitem__")
331 self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
332 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
333 # Test subclassing
334 class C(spam.spamlist):
335 def foo(self): return 1
336 a = C()
337 self.assertEqual(a, [])
338 self.assertEqual(a.foo(), 1)
339 a.append(100)
340 self.assertEqual(a, [100])
341 self.assertEqual(a.getstate(), 0)
342 a.setstate(42)
343 self.assertEqual(a.getstate(), 42)
Tim Peters37a309d2001-09-04 01:20:04 +0000344
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000345 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +0000346 def test_spam_dicts(self):
347 # Testing spamdict operations...
348 import copy, xxsubtype as spam
349 def spamdict(d, memo=None):
350 import xxsubtype as spam
351 sd = spam.spamdict()
352 for k, v in d.items():
353 sd[k] = v
354 return sd
355 # This is an ugly hack:
356 copy._deepcopy_dispatch[spam.spamdict] = spamdict
Tim Peters37a309d2001-09-04 01:20:04 +0000357
Georg Brandl48545522008-02-02 10:12:36 +0000358 self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
359 "__cmp__")
360 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
361 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
362 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
363 d = spamdict({1:2,3:4})
364 l1 = []
365 for i in d.keys():
366 l1.append(i)
367 l = []
368 for i in iter(d):
369 l.append(i)
370 self.assertEqual(l, l1)
371 l = []
372 for i in d.__iter__():
373 l.append(i)
374 self.assertEqual(l, l1)
375 l = []
376 for i in type(spamdict({})).__iter__(d):
377 l.append(i)
378 self.assertEqual(l, l1)
379 straightd = {1:2, 3:4}
380 spamd = spamdict(straightd)
381 self.unop_test(spamd, 2, "len(a)", "__len__")
382 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
383 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
384 "a[b]=c", "__setitem__")
385 # Test subclassing
386 class C(spam.spamdict):
387 def foo(self): return 1
388 a = C()
389 self.assertEqual(a.items(), [])
390 self.assertEqual(a.foo(), 1)
391 a['foo'] = 'bar'
392 self.assertEqual(a.items(), [('foo', 'bar')])
393 self.assertEqual(a.getstate(), 0)
394 a.setstate(100)
395 self.assertEqual(a.getstate(), 100)
Tim Peters37a309d2001-09-04 01:20:04 +0000396
Georg Brandl48545522008-02-02 10:12:36 +0000397class ClassPropertiesAndMethods(unittest.TestCase):
Tim Peters37a309d2001-09-04 01:20:04 +0000398
Georg Brandl48545522008-02-02 10:12:36 +0000399 def test_python_dicts(self):
400 # Testing Python subclass of dict...
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000401 self.assertTrue(issubclass(dict, dict))
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000402 self.assertIsInstance({}, dict)
Georg Brandl48545522008-02-02 10:12:36 +0000403 d = dict()
404 self.assertEqual(d, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000405 self.assertTrue(d.__class__ is dict)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000406 self.assertIsInstance(d, dict)
Georg Brandl48545522008-02-02 10:12:36 +0000407 class C(dict):
408 state = -1
409 def __init__(self_local, *a, **kw):
410 if a:
411 self.assertEqual(len(a), 1)
412 self_local.state = a[0]
413 if kw:
414 for k, v in kw.items():
415 self_local[v] = k
416 def __getitem__(self, key):
417 return self.get(key, 0)
418 def __setitem__(self_local, key, value):
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000419 self.assertIsInstance(key, type(0))
Georg Brandl48545522008-02-02 10:12:36 +0000420 dict.__setitem__(self_local, key, value)
421 def setstate(self, state):
422 self.state = state
423 def getstate(self):
424 return self.state
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000425 self.assertTrue(issubclass(C, dict))
Georg Brandl48545522008-02-02 10:12:36 +0000426 a1 = C(12)
427 self.assertEqual(a1.state, 12)
428 a2 = C(foo=1, bar=2)
429 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
430 a = C()
431 self.assertEqual(a.state, -1)
432 self.assertEqual(a.getstate(), -1)
433 a.setstate(0)
434 self.assertEqual(a.state, 0)
435 self.assertEqual(a.getstate(), 0)
436 a.setstate(10)
437 self.assertEqual(a.state, 10)
438 self.assertEqual(a.getstate(), 10)
439 self.assertEqual(a[42], 0)
440 a[42] = 24
441 self.assertEqual(a[42], 24)
442 N = 50
443 for i in range(N):
444 a[i] = C()
445 for j in range(N):
446 a[i][j] = i*j
447 for i in range(N):
448 for j in range(N):
449 self.assertEqual(a[i][j], i*j)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000450
Georg Brandl48545522008-02-02 10:12:36 +0000451 def test_python_lists(self):
452 # Testing Python subclass of list...
453 class C(list):
454 def __getitem__(self, i):
455 return list.__getitem__(self, i) + 100
456 def __getslice__(self, i, j):
457 return (i, j)
458 a = C()
459 a.extend([0,1,2])
460 self.assertEqual(a[0], 100)
461 self.assertEqual(a[1], 101)
462 self.assertEqual(a[2], 102)
463 self.assertEqual(a[100:200], (100,200))
Tim Peterscaaff8d2001-09-10 23:12:14 +0000464
Georg Brandl48545522008-02-02 10:12:36 +0000465 def test_metaclass(self):
466 # Testing __metaclass__...
467 class C:
Guido van Rossume54616c2001-12-14 04:19:56 +0000468 __metaclass__ = type
Georg Brandl48545522008-02-02 10:12:36 +0000469 def __init__(self):
470 self.__state = 0
471 def getstate(self):
472 return self.__state
473 def setstate(self, state):
474 self.__state = state
475 a = C()
476 self.assertEqual(a.getstate(), 0)
477 a.setstate(10)
478 self.assertEqual(a.getstate(), 10)
479 class D:
480 class __metaclass__(type):
481 def myself(cls): return cls
482 self.assertEqual(D.myself(), D)
483 d = D()
484 self.assertEqual(d.__class__, D)
485 class M1(type):
486 def __new__(cls, name, bases, dict):
487 dict['__spam__'] = 1
488 return type.__new__(cls, name, bases, dict)
489 class C:
490 __metaclass__ = M1
491 self.assertEqual(C.__spam__, 1)
492 c = C()
493 self.assertEqual(c.__spam__, 1)
Guido van Rossume54616c2001-12-14 04:19:56 +0000494
Georg Brandl48545522008-02-02 10:12:36 +0000495 class _instance(object):
496 pass
497 class M2(object):
498 @staticmethod
499 def __new__(cls, name, bases, dict):
500 self = object.__new__(cls)
501 self.name = name
502 self.bases = bases
503 self.dict = dict
504 return self
505 def __call__(self):
506 it = _instance()
507 # Early binding of methods
508 for key in self.dict:
509 if key.startswith("__"):
510 continue
511 setattr(it, key, self.dict[key].__get__(it, self))
512 return it
513 class C:
514 __metaclass__ = M2
515 def spam(self):
516 return 42
517 self.assertEqual(C.name, 'C')
518 self.assertEqual(C.bases, ())
Ezio Melottiaa980582010-01-23 23:04:36 +0000519 self.assertIn('spam', C.dict)
Georg Brandl48545522008-02-02 10:12:36 +0000520 c = C()
521 self.assertEqual(c.spam(), 42)
Guido van Rossum9a818922002-11-14 19:50:14 +0000522
Georg Brandl48545522008-02-02 10:12:36 +0000523 # More metaclass examples
Guido van Rossum9a818922002-11-14 19:50:14 +0000524
Georg Brandl48545522008-02-02 10:12:36 +0000525 class autosuper(type):
526 # Automatically add __super to the class
527 # This trick only works for dynamic classes
528 def __new__(metaclass, name, bases, dict):
529 cls = super(autosuper, metaclass).__new__(metaclass,
530 name, bases, dict)
531 # Name mangling for __super removes leading underscores
532 while name[:1] == "_":
533 name = name[1:]
534 if name:
535 name = "_%s__super" % name
536 else:
537 name = "__super"
538 setattr(cls, name, super(cls))
539 return cls
540 class A:
541 __metaclass__ = autosuper
542 def meth(self):
543 return "A"
544 class B(A):
545 def meth(self):
546 return "B" + self.__super.meth()
547 class C(A):
548 def meth(self):
549 return "C" + self.__super.meth()
550 class D(C, B):
551 def meth(self):
552 return "D" + self.__super.meth()
553 self.assertEqual(D().meth(), "DCBA")
554 class E(B, C):
555 def meth(self):
556 return "E" + self.__super.meth()
557 self.assertEqual(E().meth(), "EBCA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000558
Georg Brandl48545522008-02-02 10:12:36 +0000559 class autoproperty(type):
560 # Automatically create property attributes when methods
561 # named _get_x and/or _set_x are found
562 def __new__(metaclass, name, bases, dict):
563 hits = {}
564 for key, val in dict.iteritems():
565 if key.startswith("_get_"):
566 key = key[5:]
567 get, set = hits.get(key, (None, None))
568 get = val
569 hits[key] = get, set
570 elif key.startswith("_set_"):
571 key = key[5:]
572 get, set = hits.get(key, (None, None))
573 set = val
574 hits[key] = get, set
575 for key, (get, set) in hits.iteritems():
576 dict[key] = property(get, set)
577 return super(autoproperty, metaclass).__new__(metaclass,
578 name, bases, dict)
579 class A:
580 __metaclass__ = autoproperty
581 def _get_x(self):
582 return -self.__x
583 def _set_x(self, x):
584 self.__x = -x
585 a = A()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000586 self.assertTrue(not hasattr(a, "x"))
Georg Brandl48545522008-02-02 10:12:36 +0000587 a.x = 12
588 self.assertEqual(a.x, 12)
589 self.assertEqual(a._A__x, -12)
Guido van Rossum9a818922002-11-14 19:50:14 +0000590
Georg Brandl48545522008-02-02 10:12:36 +0000591 class multimetaclass(autoproperty, autosuper):
592 # Merge of multiple cooperating metaclasses
593 pass
594 class A:
595 __metaclass__ = multimetaclass
596 def _get_x(self):
597 return "A"
598 class B(A):
599 def _get_x(self):
600 return "B" + self.__super._get_x()
601 class C(A):
602 def _get_x(self):
603 return "C" + self.__super._get_x()
604 class D(C, B):
605 def _get_x(self):
606 return "D" + self.__super._get_x()
607 self.assertEqual(D().x, "DCBA")
Guido van Rossum9a818922002-11-14 19:50:14 +0000608
Georg Brandl48545522008-02-02 10:12:36 +0000609 # Make sure type(x) doesn't call x.__class__.__init__
610 class T(type):
611 counter = 0
612 def __init__(self, *args):
613 T.counter += 1
614 class C:
615 __metaclass__ = T
616 self.assertEqual(T.counter, 1)
617 a = C()
618 self.assertEqual(type(a), C)
619 self.assertEqual(T.counter, 1)
Guido van Rossum9a818922002-11-14 19:50:14 +0000620
Georg Brandl48545522008-02-02 10:12:36 +0000621 class C(object): pass
622 c = C()
623 try: c()
624 except TypeError: pass
625 else: self.fail("calling object w/o call method should raise "
626 "TypeError")
Guido van Rossum9a818922002-11-14 19:50:14 +0000627
Georg Brandl48545522008-02-02 10:12:36 +0000628 # Testing code to find most derived baseclass
629 class A(type):
630 def __new__(*args, **kwargs):
631 return type.__new__(*args, **kwargs)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000632
Georg Brandl48545522008-02-02 10:12:36 +0000633 class B(object):
634 pass
635
636 class C(object):
637 __metaclass__ = A
638
639 # The most derived metaclass of D is A rather than type.
640 class D(B, C):
641 pass
642
643 def test_module_subclasses(self):
644 # Testing Python subclass of module...
645 log = []
Georg Brandl48545522008-02-02 10:12:36 +0000646 MT = type(sys)
647 class MM(MT):
648 def __init__(self, name):
649 MT.__init__(self, name)
650 def __getattribute__(self, name):
651 log.append(("getattr", name))
652 return MT.__getattribute__(self, name)
653 def __setattr__(self, name, value):
654 log.append(("setattr", name, value))
655 MT.__setattr__(self, name, value)
656 def __delattr__(self, name):
657 log.append(("delattr", name))
658 MT.__delattr__(self, name)
659 a = MM("a")
660 a.foo = 12
661 x = a.foo
662 del a.foo
663 self.assertEqual(log, [("setattr", "foo", 12),
664 ("getattr", "foo"),
665 ("delattr", "foo")])
666
667 # http://python.org/sf/1174712
668 try:
669 class Module(types.ModuleType, str):
670 pass
671 except TypeError:
672 pass
673 else:
674 self.fail("inheriting from ModuleType and str at the same time "
675 "should fail")
676
677 def test_multiple_inheritence(self):
678 # Testing multiple inheritance...
679 class C(object):
680 def __init__(self):
681 self.__state = 0
682 def getstate(self):
683 return self.__state
684 def setstate(self, state):
685 self.__state = state
686 a = C()
687 self.assertEqual(a.getstate(), 0)
688 a.setstate(10)
689 self.assertEqual(a.getstate(), 10)
690 class D(dict, C):
691 def __init__(self):
692 type({}).__init__(self)
693 C.__init__(self)
694 d = D()
695 self.assertEqual(d.keys(), [])
696 d["hello"] = "world"
697 self.assertEqual(d.items(), [("hello", "world")])
698 self.assertEqual(d["hello"], "world")
699 self.assertEqual(d.getstate(), 0)
700 d.setstate(10)
701 self.assertEqual(d.getstate(), 10)
702 self.assertEqual(D.__mro__, (D, dict, C, object))
703
704 # SF bug #442833
705 class Node(object):
706 def __int__(self):
707 return int(self.foo())
708 def foo(self):
709 return "23"
710 class Frag(Node, list):
711 def foo(self):
712 return "42"
713 self.assertEqual(Node().__int__(), 23)
714 self.assertEqual(int(Node()), 23)
715 self.assertEqual(Frag().__int__(), 42)
716 self.assertEqual(int(Frag()), 42)
717
718 # MI mixing classic and new-style classes.
719
720 class A:
721 x = 1
722
723 class B(A):
724 pass
725
726 class C(A):
727 x = 2
728
729 class D(B, C):
730 pass
731 self.assertEqual(D.x, 1)
732
733 # Classic MRO is preserved for a classic base class.
734 class E(D, object):
735 pass
736 self.assertEqual(E.__mro__, (E, D, B, A, C, object))
737 self.assertEqual(E.x, 1)
738
739 # But with a mix of classic bases, their MROs are combined using
740 # new-style MRO.
741 class F(B, C, object):
742 pass
743 self.assertEqual(F.__mro__, (F, B, C, A, object))
744 self.assertEqual(F.x, 2)
745
746 # Try something else.
747 class C:
748 def cmethod(self):
749 return "C a"
750 def all_method(self):
751 return "C b"
752
753 class M1(C, object):
754 def m1method(self):
755 return "M1 a"
756 def all_method(self):
757 return "M1 b"
758
759 self.assertEqual(M1.__mro__, (M1, C, object))
760 m = M1()
761 self.assertEqual(m.cmethod(), "C a")
762 self.assertEqual(m.m1method(), "M1 a")
763 self.assertEqual(m.all_method(), "M1 b")
764
765 class D(C):
766 def dmethod(self):
767 return "D a"
768 def all_method(self):
769 return "D b"
770
771 class M2(D, object):
772 def m2method(self):
773 return "M2 a"
774 def all_method(self):
775 return "M2 b"
776
777 self.assertEqual(M2.__mro__, (M2, D, C, object))
778 m = M2()
779 self.assertEqual(m.cmethod(), "C a")
780 self.assertEqual(m.dmethod(), "D a")
781 self.assertEqual(m.m2method(), "M2 a")
782 self.assertEqual(m.all_method(), "M2 b")
783
784 class M3(M1, M2, object):
785 def m3method(self):
786 return "M3 a"
787 def all_method(self):
788 return "M3 b"
789 self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
790 m = M3()
791 self.assertEqual(m.cmethod(), "C a")
792 self.assertEqual(m.dmethod(), "D a")
793 self.assertEqual(m.m1method(), "M1 a")
794 self.assertEqual(m.m2method(), "M2 a")
795 self.assertEqual(m.m3method(), "M3 a")
796 self.assertEqual(m.all_method(), "M3 b")
797
798 class Classic:
799 pass
800 try:
801 class New(Classic):
802 __metaclass__ = type
803 except TypeError:
804 pass
805 else:
806 self.fail("new class with only classic bases - shouldn't be")
807
808 def test_diamond_inheritence(self):
809 # Testing multiple inheritance special cases...
810 class A(object):
811 def spam(self): return "A"
812 self.assertEqual(A().spam(), "A")
813 class B(A):
814 def boo(self): return "B"
815 def spam(self): return "B"
816 self.assertEqual(B().spam(), "B")
817 self.assertEqual(B().boo(), "B")
818 class C(A):
819 def boo(self): return "C"
820 self.assertEqual(C().spam(), "A")
821 self.assertEqual(C().boo(), "C")
822 class D(B, C): pass
823 self.assertEqual(D().spam(), "B")
824 self.assertEqual(D().boo(), "B")
825 self.assertEqual(D.__mro__, (D, B, C, A, object))
826 class E(C, B): pass
827 self.assertEqual(E().spam(), "B")
828 self.assertEqual(E().boo(), "C")
829 self.assertEqual(E.__mro__, (E, C, B, A, object))
830 # MRO order disagreement
831 try:
832 class F(D, E): pass
833 except TypeError:
834 pass
835 else:
836 self.fail("expected MRO order disagreement (F)")
837 try:
838 class G(E, D): pass
839 except TypeError:
840 pass
841 else:
842 self.fail("expected MRO order disagreement (G)")
843
844 # see thread python-dev/2002-October/029035.html
845 def test_ex5_from_c3_switch(self):
846 # Testing ex5 from C3 switch discussion...
847 class A(object): pass
848 class B(object): pass
849 class C(object): pass
850 class X(A): pass
851 class Y(A): pass
852 class Z(X,B,Y,C): pass
853 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
854
855 # see "A Monotonic Superclass Linearization for Dylan",
856 # by Kim Barrett et al. (OOPSLA 1996)
857 def test_monotonicity(self):
858 # Testing MRO monotonicity...
859 class Boat(object): pass
860 class DayBoat(Boat): pass
861 class WheelBoat(Boat): pass
862 class EngineLess(DayBoat): pass
863 class SmallMultihull(DayBoat): pass
864 class PedalWheelBoat(EngineLess,WheelBoat): pass
865 class SmallCatamaran(SmallMultihull): pass
866 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
867
868 self.assertEqual(PedalWheelBoat.__mro__,
869 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
870 self.assertEqual(SmallCatamaran.__mro__,
871 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
872 self.assertEqual(Pedalo.__mro__,
873 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
874 SmallMultihull, DayBoat, WheelBoat, Boat, object))
875
876 # see "A Monotonic Superclass Linearization for Dylan",
877 # by Kim Barrett et al. (OOPSLA 1996)
878 def test_consistency_with_epg(self):
Ezio Melotti24b07bc2011-03-15 18:55:01 +0200879 # Testing consistency with EPG...
Georg Brandl48545522008-02-02 10:12:36 +0000880 class Pane(object): pass
881 class ScrollingMixin(object): pass
882 class EditingMixin(object): pass
883 class ScrollablePane(Pane,ScrollingMixin): pass
884 class EditablePane(Pane,EditingMixin): pass
885 class EditableScrollablePane(ScrollablePane,EditablePane): pass
886
887 self.assertEqual(EditableScrollablePane.__mro__,
888 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
889 ScrollingMixin, EditingMixin, object))
890
891 def test_mro_disagreement(self):
892 # Testing error messages for MRO disagreement...
893 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000894order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000895
Georg Brandl48545522008-02-02 10:12:36 +0000896 def raises(exc, expected, callable, *args):
897 try:
898 callable(*args)
899 except exc, msg:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +0000900 # the exact msg is generally considered an impl detail
901 if test_support.check_impl_detail():
902 if not str(msg).startswith(expected):
903 self.fail("Message %r, expected %r" %
904 (str(msg), expected))
Georg Brandl48545522008-02-02 10:12:36 +0000905 else:
906 self.fail("Expected %s" % exc)
907
908 class A(object): pass
909 class B(A): pass
910 class C(object): pass
911
912 # Test some very simple errors
913 raises(TypeError, "duplicate base class A",
914 type, "X", (A, A), {})
915 raises(TypeError, mro_err_msg,
916 type, "X", (A, B), {})
917 raises(TypeError, mro_err_msg,
918 type, "X", (A, C, B), {})
919 # Test a slightly more complex error
920 class GridLayout(object): pass
921 class HorizontalGrid(GridLayout): pass
922 class VerticalGrid(GridLayout): pass
923 class HVGrid(HorizontalGrid, VerticalGrid): pass
924 class VHGrid(VerticalGrid, HorizontalGrid): pass
925 raises(TypeError, mro_err_msg,
926 type, "ConfusedGrid", (HVGrid, VHGrid), {})
927
928 def test_object_class(self):
929 # Testing object class...
930 a = object()
931 self.assertEqual(a.__class__, object)
932 self.assertEqual(type(a), object)
933 b = object()
934 self.assertNotEqual(a, b)
935 self.assertFalse(hasattr(a, "foo"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000936 try:
Georg Brandl48545522008-02-02 10:12:36 +0000937 a.foo = 12
938 except (AttributeError, TypeError):
939 pass
Guido van Rossumd32047f2002-11-25 21:38:52 +0000940 else:
Georg Brandl48545522008-02-02 10:12:36 +0000941 self.fail("object() should not allow setting a foo attribute")
942 self.assertFalse(hasattr(object(), "__dict__"))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000943
Georg Brandl48545522008-02-02 10:12:36 +0000944 class Cdict(object):
945 pass
946 x = Cdict()
947 self.assertEqual(x.__dict__, {})
948 x.foo = 1
949 self.assertEqual(x.foo, 1)
950 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000951
Georg Brandl48545522008-02-02 10:12:36 +0000952 def test_slots(self):
953 # Testing __slots__...
954 class C0(object):
955 __slots__ = []
956 x = C0()
957 self.assertFalse(hasattr(x, "__dict__"))
958 self.assertFalse(hasattr(x, "foo"))
Guido van Rossum37202612001-08-09 19:45:21 +0000959
Georg Brandl48545522008-02-02 10:12:36 +0000960 class C1(object):
961 __slots__ = ['a']
962 x = C1()
963 self.assertFalse(hasattr(x, "__dict__"))
964 self.assertFalse(hasattr(x, "a"))
965 x.a = 1
966 self.assertEqual(x.a, 1)
967 x.a = None
968 self.assertEqual(x.a, None)
969 del x.a
970 self.assertFalse(hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000971
Georg Brandl48545522008-02-02 10:12:36 +0000972 class C3(object):
973 __slots__ = ['a', 'b', 'c']
974 x = C3()
975 self.assertFalse(hasattr(x, "__dict__"))
976 self.assertFalse(hasattr(x, 'a'))
977 self.assertFalse(hasattr(x, 'b'))
978 self.assertFalse(hasattr(x, 'c'))
979 x.a = 1
980 x.b = 2
981 x.c = 3
982 self.assertEqual(x.a, 1)
983 self.assertEqual(x.b, 2)
984 self.assertEqual(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000985
Georg Brandl48545522008-02-02 10:12:36 +0000986 class C4(object):
987 """Validate name mangling"""
988 __slots__ = ['__a']
989 def __init__(self, value):
990 self.__a = value
991 def get(self):
992 return self.__a
993 x = C4(5)
994 self.assertFalse(hasattr(x, '__dict__'))
995 self.assertFalse(hasattr(x, '__a'))
996 self.assertEqual(x.get(), 5)
997 try:
998 x.__a = 6
999 except AttributeError:
1000 pass
1001 else:
1002 self.fail("Double underscored names not mangled")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003
Georg Brandl48545522008-02-02 10:12:36 +00001004 # Make sure slot names are proper identifiers
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001005 try:
1006 class C(object):
Georg Brandl48545522008-02-02 10:12:36 +00001007 __slots__ = [None]
Guido van Rossum843daa82001-09-18 20:04:26 +00001008 except TypeError:
1009 pass
1010 else:
Georg Brandl48545522008-02-02 10:12:36 +00001011 self.fail("[None] slots not caught")
Tim Peters66c1a522001-09-24 21:17:50 +00001012 try:
Georg Brandl48545522008-02-02 10:12:36 +00001013 class C(object):
1014 __slots__ = ["foo bar"]
1015 except TypeError:
Georg Brandl533ff6f2006-03-08 18:09:27 +00001016 pass
Georg Brandl48545522008-02-02 10:12:36 +00001017 else:
1018 self.fail("['foo bar'] slots not caught")
1019 try:
1020 class C(object):
1021 __slots__ = ["foo\0bar"]
1022 except TypeError:
1023 pass
1024 else:
1025 self.fail("['foo\\0bar'] slots not caught")
1026 try:
1027 class C(object):
1028 __slots__ = ["1"]
1029 except TypeError:
1030 pass
1031 else:
1032 self.fail("['1'] slots not caught")
1033 try:
1034 class C(object):
1035 __slots__ = [""]
1036 except TypeError:
1037 pass
1038 else:
1039 self.fail("[''] slots not caught")
1040 class C(object):
1041 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1042 # XXX(nnorwitz): was there supposed to be something tested
1043 # from the class above?
Georg Brandl533ff6f2006-03-08 18:09:27 +00001044
Georg Brandl48545522008-02-02 10:12:36 +00001045 # Test a single string is not expanded as a sequence.
1046 class C(object):
1047 __slots__ = "abc"
1048 c = C()
1049 c.abc = 5
1050 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001051
Georg Brandl48545522008-02-02 10:12:36 +00001052 # Test unicode slot names
1053 try:
1054 unicode
1055 except NameError:
1056 pass
1057 else:
1058 # Test a single unicode string is not expanded as a sequence.
1059 class C(object):
1060 __slots__ = unicode("abc")
1061 c = C()
1062 c.abc = 5
1063 self.assertEqual(c.abc, 5)
Georg Brandle9462c72006-08-04 18:03:37 +00001064
Georg Brandl48545522008-02-02 10:12:36 +00001065 # _unicode_to_string used to modify slots in certain circumstances
1066 slots = (unicode("foo"), unicode("bar"))
1067 class C(object):
1068 __slots__ = slots
1069 x = C()
1070 x.foo = 5
1071 self.assertEqual(x.foo, 5)
1072 self.assertEqual(type(slots[0]), unicode)
1073 # this used to leak references
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001074 try:
Georg Brandl48545522008-02-02 10:12:36 +00001075 class C(object):
1076 __slots__ = [unichr(128)]
1077 except (TypeError, UnicodeEncodeError):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00001078 pass
Tim Peters8fa45672001-09-13 21:01:29 +00001079 else:
Georg Brandl48545522008-02-02 10:12:36 +00001080 self.fail("[unichr(128)] slots not caught")
Tim Peters8fa45672001-09-13 21:01:29 +00001081
Georg Brandl48545522008-02-02 10:12:36 +00001082 # Test leaks
1083 class Counted(object):
1084 counter = 0 # counts the number of instances alive
1085 def __init__(self):
1086 Counted.counter += 1
1087 def __del__(self):
1088 Counted.counter -= 1
1089 class C(object):
1090 __slots__ = ['a', 'b', 'c']
Guido van Rossum8c842552002-03-14 23:05:54 +00001091 x = C()
Georg Brandl48545522008-02-02 10:12:36 +00001092 x.a = Counted()
1093 x.b = Counted()
1094 x.c = Counted()
1095 self.assertEqual(Counted.counter, 3)
1096 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001097 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001098 self.assertEqual(Counted.counter, 0)
1099 class D(C):
1100 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00001101 x = D()
Georg Brandl48545522008-02-02 10:12:36 +00001102 x.a = Counted()
1103 x.z = Counted()
1104 self.assertEqual(Counted.counter, 2)
1105 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001106 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001107 self.assertEqual(Counted.counter, 0)
1108 class E(D):
1109 __slots__ = ['e']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00001110 x = E()
Georg Brandl48545522008-02-02 10:12:36 +00001111 x.a = Counted()
1112 x.z = Counted()
1113 x.e = Counted()
1114 self.assertEqual(Counted.counter, 3)
1115 del x
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001116 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001117 self.assertEqual(Counted.counter, 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00001118
Georg Brandl48545522008-02-02 10:12:36 +00001119 # Test cyclical leaks [SF bug 519621]
1120 class F(object):
1121 __slots__ = ['a', 'b']
Georg Brandl48545522008-02-02 10:12:36 +00001122 s = F()
1123 s.a = [Counted(), s]
1124 self.assertEqual(Counted.counter, 1)
1125 s = None
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001126 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001127 self.assertEqual(Counted.counter, 0)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001128
Georg Brandl48545522008-02-02 10:12:36 +00001129 # Test lookup leaks [SF bug 572567]
Georg Brandla4f46e12010-02-07 17:03:15 +00001130 import gc
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001131 if hasattr(gc, 'get_objects'):
1132 class G(object):
1133 def __cmp__(self, other):
1134 return 0
1135 __hash__ = None # Silence Py3k warning
1136 g = G()
1137 orig_objects = len(gc.get_objects())
1138 for i in xrange(10):
1139 g==g
1140 new_objects = len(gc.get_objects())
1141 self.assertEqual(orig_objects, new_objects)
1142
Georg Brandl48545522008-02-02 10:12:36 +00001143 class H(object):
1144 __slots__ = ['a', 'b']
1145 def __init__(self):
1146 self.a = 1
1147 self.b = 2
1148 def __del__(self_):
1149 self.assertEqual(self_.a, 1)
1150 self.assertEqual(self_.b, 2)
Armin Rigo581eb1e2008-10-28 17:01:21 +00001151 with test_support.captured_output('stderr') as s:
1152 h = H()
Georg Brandl48545522008-02-02 10:12:36 +00001153 del h
Armin Rigo581eb1e2008-10-28 17:01:21 +00001154 self.assertEqual(s.getvalue(), '')
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001155
Benjamin Peterson0f02d392009-12-30 19:34:10 +00001156 class X(object):
1157 __slots__ = "a"
1158 with self.assertRaises(AttributeError):
1159 del X().a
1160
Georg Brandl48545522008-02-02 10:12:36 +00001161 def test_slots_special(self):
1162 # Testing __dict__ and __weakref__ in __slots__...
1163 class D(object):
1164 __slots__ = ["__dict__"]
1165 a = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001166 self.assertTrue(hasattr(a, "__dict__"))
Georg Brandl48545522008-02-02 10:12:36 +00001167 self.assertFalse(hasattr(a, "__weakref__"))
1168 a.foo = 42
1169 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum6cef6d52001-09-28 18:13:29 +00001170
Georg Brandl48545522008-02-02 10:12:36 +00001171 class W(object):
1172 __slots__ = ["__weakref__"]
1173 a = W()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001174 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001175 self.assertFalse(hasattr(a, "__dict__"))
1176 try:
1177 a.foo = 42
1178 except AttributeError:
1179 pass
1180 else:
1181 self.fail("shouldn't be allowed to set a.foo")
1182
1183 class C1(W, D):
1184 __slots__ = []
1185 a = C1()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001186 self.assertTrue(hasattr(a, "__dict__"))
1187 self.assertTrue(hasattr(a, "__weakref__"))
Georg Brandl48545522008-02-02 10:12:36 +00001188 a.foo = 42
1189 self.assertEqual(a.__dict__, {"foo": 42})
1190
1191 class C2(D, W):
1192 __slots__ = []
1193 a = C2()
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
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001199 def test_slots_descriptor(self):
1200 # Issue2115: slot descriptors did not correctly check
1201 # the type of the given object
1202 import abc
1203 class MyABC:
1204 __metaclass__ = abc.ABCMeta
1205 __slots__ = "a"
1206
1207 class Unrelated(object):
1208 pass
1209 MyABC.register(Unrelated)
1210
1211 u = Unrelated()
Ezio Melottib0f5adc2010-01-24 16:58:36 +00001212 self.assertIsInstance(u, MyABC)
Amaury Forgeot d'Arc60d6c7f2008-02-15 21:22:45 +00001213
1214 # This used to crash
1215 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1216
Benjamin Peterson4895af42009-12-13 16:36:53 +00001217 def test_metaclass_cmp(self):
1218 # See bug 7491.
1219 class M(type):
1220 def __cmp__(self, other):
1221 return -1
1222 class X(object):
1223 __metaclass__ = M
1224 self.assertTrue(X < M)
1225
Georg Brandl48545522008-02-02 10:12:36 +00001226 def test_dynamics(self):
1227 # Testing class attribute propagation...
1228 class D(object):
1229 pass
1230 class E(D):
1231 pass
1232 class F(D):
1233 pass
1234 D.foo = 1
1235 self.assertEqual(D.foo, 1)
1236 # Test that dynamic attributes are inherited
1237 self.assertEqual(E.foo, 1)
1238 self.assertEqual(F.foo, 1)
1239 # Test dynamic instances
1240 class C(object):
1241 pass
1242 a = C()
1243 self.assertFalse(hasattr(a, "foobar"))
1244 C.foobar = 2
1245 self.assertEqual(a.foobar, 2)
1246 C.method = lambda self: 42
1247 self.assertEqual(a.method(), 42)
1248 C.__repr__ = lambda self: "C()"
1249 self.assertEqual(repr(a), "C()")
1250 C.__int__ = lambda self: 100
1251 self.assertEqual(int(a), 100)
1252 self.assertEqual(a.foobar, 2)
1253 self.assertFalse(hasattr(a, "spam"))
1254 def mygetattr(self, name):
1255 if name == "spam":
1256 return "spam"
1257 raise AttributeError
1258 C.__getattr__ = mygetattr
1259 self.assertEqual(a.spam, "spam")
1260 a.new = 12
1261 self.assertEqual(a.new, 12)
1262 def mysetattr(self, name, value):
1263 if name == "spam":
1264 raise AttributeError
1265 return object.__setattr__(self, name, value)
1266 C.__setattr__ = mysetattr
1267 try:
1268 a.spam = "not spam"
1269 except AttributeError:
1270 pass
1271 else:
1272 self.fail("expected AttributeError")
1273 self.assertEqual(a.spam, "spam")
1274 class D(C):
1275 pass
1276 d = D()
1277 d.foo = 1
1278 self.assertEqual(d.foo, 1)
1279
1280 # Test handling of int*seq and seq*int
1281 class I(int):
1282 pass
1283 self.assertEqual("a"*I(2), "aa")
1284 self.assertEqual(I(2)*"a", "aa")
1285 self.assertEqual(2*I(3), 6)
1286 self.assertEqual(I(3)*2, 6)
1287 self.assertEqual(I(3)*I(2), 6)
1288
1289 # Test handling of long*seq and seq*long
1290 class L(long):
1291 pass
1292 self.assertEqual("a"*L(2L), "aa")
1293 self.assertEqual(L(2L)*"a", "aa")
1294 self.assertEqual(2*L(3), 6)
1295 self.assertEqual(L(3)*2, 6)
1296 self.assertEqual(L(3)*L(2), 6)
1297
1298 # Test comparison of classes with dynamic metaclasses
1299 class dynamicmetaclass(type):
1300 pass
1301 class someclass:
1302 __metaclass__ = dynamicmetaclass
1303 self.assertNotEqual(someclass, object)
1304
1305 def test_errors(self):
1306 # Testing errors...
1307 try:
1308 class C(list, dict):
1309 pass
1310 except TypeError:
1311 pass
1312 else:
1313 self.fail("inheritance from both list and dict should be illegal")
1314
1315 try:
1316 class C(object, None):
1317 pass
1318 except TypeError:
1319 pass
1320 else:
1321 self.fail("inheritance from non-type should be illegal")
1322 class Classic:
1323 pass
1324
1325 try:
1326 class C(type(len)):
1327 pass
1328 except TypeError:
1329 pass
1330 else:
1331 self.fail("inheritance from CFunction should be illegal")
1332
1333 try:
1334 class C(object):
1335 __slots__ = 1
1336 except TypeError:
1337 pass
1338 else:
1339 self.fail("__slots__ = 1 should be illegal")
1340
1341 try:
1342 class C(object):
1343 __slots__ = [1]
1344 except TypeError:
1345 pass
1346 else:
1347 self.fail("__slots__ = [1] should be illegal")
1348
1349 class M1(type):
1350 pass
1351 class M2(type):
1352 pass
1353 class A1(object):
1354 __metaclass__ = M1
1355 class A2(object):
1356 __metaclass__ = M2
1357 try:
1358 class B(A1, A2):
1359 pass
1360 except TypeError:
1361 pass
1362 else:
1363 self.fail("finding the most derived metaclass should have failed")
1364
1365 def test_classmethods(self):
1366 # Testing class methods...
1367 class C(object):
1368 def foo(*a): return a
1369 goo = classmethod(foo)
1370 c = C()
1371 self.assertEqual(C.goo(1), (C, 1))
1372 self.assertEqual(c.goo(1), (C, 1))
1373 self.assertEqual(c.foo(1), (c, 1))
1374 class D(C):
1375 pass
1376 d = D()
1377 self.assertEqual(D.goo(1), (D, 1))
1378 self.assertEqual(d.goo(1), (D, 1))
1379 self.assertEqual(d.foo(1), (d, 1))
1380 self.assertEqual(D.foo(d, 1), (d, 1))
1381 # Test for a specific crash (SF bug 528132)
1382 def f(cls, arg): return (cls, arg)
1383 ff = classmethod(f)
1384 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1385 self.assertEqual(ff.__get__(0)(42), (int, 42))
1386
1387 # Test super() with classmethods (SF bug 535444)
1388 self.assertEqual(C.goo.im_self, C)
1389 self.assertEqual(D.goo.im_self, D)
1390 self.assertEqual(super(D,D).goo.im_self, D)
1391 self.assertEqual(super(D,d).goo.im_self, D)
1392 self.assertEqual(super(D,D).goo(), (D,))
1393 self.assertEqual(super(D,d).goo(), (D,))
1394
Benjamin Peterson6fcf9b52009-09-01 22:27:57 +00001395 # Verify that a non-callable will raise
1396 meth = classmethod(1).__get__(1)
1397 self.assertRaises(TypeError, meth)
Georg Brandl48545522008-02-02 10:12:36 +00001398
1399 # Verify that classmethod() doesn't allow keyword args
1400 try:
1401 classmethod(f, kw=1)
1402 except TypeError:
1403 pass
1404 else:
1405 self.fail("classmethod shouldn't accept keyword args")
1406
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001407 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001408 def test_classmethods_in_c(self):
1409 # Testing C-based class methods...
1410 import xxsubtype as spam
1411 a = (1, 2, 3)
1412 d = {'abc': 123}
1413 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1414 self.assertEqual(x, spam.spamlist)
1415 self.assertEqual(a, a1)
1416 self.assertEqual(d, d1)
1417 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1418 self.assertEqual(x, spam.spamlist)
1419 self.assertEqual(a, a1)
1420 self.assertEqual(d, d1)
1421
1422 def test_staticmethods(self):
1423 # Testing static methods...
1424 class C(object):
1425 def foo(*a): return a
1426 goo = staticmethod(foo)
1427 c = C()
1428 self.assertEqual(C.goo(1), (1,))
1429 self.assertEqual(c.goo(1), (1,))
1430 self.assertEqual(c.foo(1), (c, 1,))
1431 class D(C):
1432 pass
1433 d = D()
1434 self.assertEqual(D.goo(1), (1,))
1435 self.assertEqual(d.goo(1), (1,))
1436 self.assertEqual(d.foo(1), (d, 1))
1437 self.assertEqual(D.foo(d, 1), (d, 1))
1438
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001439 @test_support.impl_detail("the module 'xxsubtype' is internal")
Georg Brandl48545522008-02-02 10:12:36 +00001440 def test_staticmethods_in_c(self):
1441 # Testing C-based static methods...
1442 import xxsubtype as spam
1443 a = (1, 2, 3)
1444 d = {"abc": 123}
1445 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1446 self.assertEqual(x, None)
1447 self.assertEqual(a, a1)
1448 self.assertEqual(d, d1)
1449 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1450 self.assertEqual(x, None)
1451 self.assertEqual(a, a1)
1452 self.assertEqual(d, d1)
1453
1454 def test_classic(self):
1455 # Testing classic classes...
1456 class C:
1457 def foo(*a): return a
1458 goo = classmethod(foo)
1459 c = C()
1460 self.assertEqual(C.goo(1), (C, 1))
1461 self.assertEqual(c.goo(1), (C, 1))
1462 self.assertEqual(c.foo(1), (c, 1))
1463 class D(C):
1464 pass
1465 d = D()
1466 self.assertEqual(D.goo(1), (D, 1))
1467 self.assertEqual(d.goo(1), (D, 1))
1468 self.assertEqual(d.foo(1), (d, 1))
1469 self.assertEqual(D.foo(d, 1), (d, 1))
1470 class E: # *not* subclassing from C
1471 foo = C.foo
1472 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001473 self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001474
1475 def test_compattr(self):
1476 # Testing computed attributes...
1477 class C(object):
1478 class computed_attribute(object):
1479 def __init__(self, get, set=None, delete=None):
1480 self.__get = get
1481 self.__set = set
1482 self.__delete = delete
1483 def __get__(self, obj, type=None):
1484 return self.__get(obj)
1485 def __set__(self, obj, value):
1486 return self.__set(obj, value)
1487 def __delete__(self, obj):
1488 return self.__delete(obj)
1489 def __init__(self):
1490 self.__x = 0
1491 def __get_x(self):
1492 x = self.__x
1493 self.__x = x+1
1494 return x
1495 def __set_x(self, x):
1496 self.__x = x
1497 def __delete_x(self):
1498 del self.__x
1499 x = computed_attribute(__get_x, __set_x, __delete_x)
1500 a = C()
1501 self.assertEqual(a.x, 0)
1502 self.assertEqual(a.x, 1)
1503 a.x = 10
1504 self.assertEqual(a.x, 10)
1505 self.assertEqual(a.x, 11)
1506 del a.x
1507 self.assertEqual(hasattr(a, 'x'), 0)
1508
1509 def test_newslots(self):
1510 # Testing __new__ slot override...
1511 class C(list):
1512 def __new__(cls):
1513 self = list.__new__(cls)
1514 self.foo = 1
1515 return self
1516 def __init__(self):
1517 self.foo = self.foo + 2
1518 a = C()
1519 self.assertEqual(a.foo, 3)
1520 self.assertEqual(a.__class__, C)
1521 class D(C):
1522 pass
1523 b = D()
1524 self.assertEqual(b.foo, 3)
1525 self.assertEqual(b.__class__, D)
1526
1527 def test_altmro(self):
1528 # Testing mro() and overriding it...
1529 class A(object):
1530 def f(self): return "A"
1531 class B(A):
1532 pass
1533 class C(A):
1534 def f(self): return "C"
1535 class D(B, C):
1536 pass
1537 self.assertEqual(D.mro(), [D, B, C, A, object])
1538 self.assertEqual(D.__mro__, (D, B, C, A, object))
1539 self.assertEqual(D().f(), "C")
1540
1541 class PerverseMetaType(type):
1542 def mro(cls):
1543 L = type.mro(cls)
1544 L.reverse()
1545 return L
1546 class X(D,B,C,A):
1547 __metaclass__ = PerverseMetaType
1548 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1549 self.assertEqual(X().f(), "A")
1550
1551 try:
1552 class X(object):
1553 class __metaclass__(type):
1554 def mro(self):
1555 return [self, dict, object]
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001556 # In CPython, the class creation above already raises
1557 # TypeError, as a protection against the fact that
1558 # instances of X would segfault it. In other Python
1559 # implementations it would be ok to let the class X
1560 # be created, but instead get a clean TypeError on the
1561 # __setitem__ below.
1562 x = object.__new__(X)
1563 x[5] = 6
Georg Brandl48545522008-02-02 10:12:36 +00001564 except TypeError:
1565 pass
1566 else:
1567 self.fail("devious mro() return not caught")
1568
1569 try:
1570 class X(object):
1571 class __metaclass__(type):
1572 def mro(self):
1573 return [1]
1574 except TypeError:
1575 pass
1576 else:
1577 self.fail("non-class mro() return not caught")
1578
1579 try:
1580 class X(object):
1581 class __metaclass__(type):
1582 def mro(self):
1583 return 1
1584 except TypeError:
1585 pass
1586 else:
1587 self.fail("non-sequence mro() return not caught")
1588
1589 def test_overloading(self):
1590 # Testing operator overloading...
1591
1592 class B(object):
1593 "Intermediate class because object doesn't have a __setattr__"
1594
1595 class C(B):
1596 def __getattr__(self, name):
1597 if name == "foo":
1598 return ("getattr", name)
1599 else:
1600 raise AttributeError
1601 def __setattr__(self, name, value):
1602 if name == "foo":
1603 self.setattr = (name, value)
1604 else:
1605 return B.__setattr__(self, name, value)
1606 def __delattr__(self, name):
1607 if name == "foo":
1608 self.delattr = name
1609 else:
1610 return B.__delattr__(self, name)
1611
1612 def __getitem__(self, key):
1613 return ("getitem", key)
1614 def __setitem__(self, key, value):
1615 self.setitem = (key, value)
1616 def __delitem__(self, key):
1617 self.delitem = key
1618
1619 def __getslice__(self, i, j):
1620 return ("getslice", i, j)
1621 def __setslice__(self, i, j, value):
1622 self.setslice = (i, j, value)
1623 def __delslice__(self, i, j):
1624 self.delslice = (i, j)
1625
1626 a = C()
1627 self.assertEqual(a.foo, ("getattr", "foo"))
1628 a.foo = 12
1629 self.assertEqual(a.setattr, ("foo", 12))
1630 del a.foo
1631 self.assertEqual(a.delattr, "foo")
1632
1633 self.assertEqual(a[12], ("getitem", 12))
1634 a[12] = 21
1635 self.assertEqual(a.setitem, (12, 21))
1636 del a[12]
1637 self.assertEqual(a.delitem, 12)
1638
1639 self.assertEqual(a[0:10], ("getslice", 0, 10))
1640 a[0:10] = "foo"
1641 self.assertEqual(a.setslice, (0, 10, "foo"))
1642 del a[0:10]
1643 self.assertEqual(a.delslice, (0, 10))
1644
1645 def test_methods(self):
1646 # Testing methods...
1647 class C(object):
1648 def __init__(self, x):
1649 self.x = x
1650 def foo(self):
1651 return self.x
1652 c1 = C(1)
1653 self.assertEqual(c1.foo(), 1)
1654 class D(C):
1655 boo = C.foo
1656 goo = c1.foo
1657 d2 = D(2)
1658 self.assertEqual(d2.foo(), 2)
1659 self.assertEqual(d2.boo(), 2)
1660 self.assertEqual(d2.goo(), 1)
1661 class E(object):
1662 foo = C.foo
1663 self.assertEqual(E().foo, C.foo) # i.e., unbound
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001664 self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Georg Brandl48545522008-02-02 10:12:36 +00001665
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001666 def test_special_method_lookup(self):
1667 # The lookup of special methods bypasses __getattr__ and
1668 # __getattribute__, but they still can be descriptors.
1669
1670 def run_context(manager):
1671 with manager:
1672 pass
1673 def iden(self):
1674 return self
1675 def hello(self):
1676 return "hello"
Benjamin Peterson809e2252009-05-09 02:07:04 +00001677 def empty_seq(self):
1678 return []
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001679 def zero(self):
1680 return 0
Benjamin Petersonecdae192010-01-04 00:43:01 +00001681 def complex_num(self):
1682 return 1j
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001683 def stop(self):
1684 raise StopIteration
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001685 def return_true(self, thing=None):
1686 return True
1687 def do_isinstance(obj):
1688 return isinstance(int, obj)
1689 def do_issubclass(obj):
1690 return issubclass(int, obj)
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001691 def swallow(*args):
1692 pass
1693 def do_dict_missing(checker):
1694 class DictSub(checker.__class__, dict):
1695 pass
1696 self.assertEqual(DictSub()["hi"], 4)
1697 def some_number(self_, key):
1698 self.assertEqual(key, "hi")
1699 return 4
Benjamin Peterson2aa6c382010-06-05 00:32:50 +00001700 def format_impl(self, spec):
1701 return "hello"
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001702
1703 # It would be nice to have every special method tested here, but I'm
1704 # only listing the ones I can remember outside of typeobject.c, since it
1705 # does it right.
1706 specials = [
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001707 ("__unicode__", unicode, hello, set(), {}),
1708 ("__reversed__", reversed, empty_seq, set(), {}),
1709 ("__length_hint__", list, zero, set(),
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001710 {"__iter__" : iden, "next" : stop}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001711 ("__sizeof__", sys.getsizeof, zero, set(), {}),
1712 ("__instancecheck__", do_isinstance, return_true, set(), {}),
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001713 ("__missing__", do_dict_missing, some_number,
1714 set(("__class__",)), {}),
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001715 ("__subclasscheck__", do_issubclass, return_true,
1716 set(("__bases__",)), {}),
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00001717 ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
1718 ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
Benjamin Petersonecdae192010-01-04 00:43:01 +00001719 ("__complex__", complex, complex_num, set(), {}),
Benjamin Peterson2aa6c382010-06-05 00:32:50 +00001720 ("__format__", format, format_impl, set(), {}),
Benjamin Peterson8de87a62011-05-23 16:11:05 -05001721 ("__dir__", dir, empty_seq, set(), {}),
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001722 ]
1723
1724 class Checker(object):
1725 def __getattr__(self, attr, test=self):
1726 test.fail("__getattr__ called with {0}".format(attr))
1727 def __getattribute__(self, attr, test=self):
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001728 if attr not in ok:
1729 test.fail("__getattribute__ called with {0}".format(attr))
Benjamin Peterson39d43b42009-05-27 02:43:46 +00001730 return object.__getattribute__(self, attr)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001731 class SpecialDescr(object):
1732 def __init__(self, impl):
1733 self.impl = impl
1734 def __get__(self, obj, owner):
1735 record.append(1)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001736 return self.impl.__get__(obj, owner)
Benjamin Peterson87e50062009-05-25 02:40:21 +00001737 class MyException(Exception):
1738 pass
1739 class ErrDescr(object):
1740 def __get__(self, obj, owner):
1741 raise MyException
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001742
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00001743 for name, runner, meth_impl, ok, env in specials:
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001744 class X(Checker):
1745 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001746 for attr, obj in env.iteritems():
1747 setattr(X, attr, obj)
Benjamin Petersondb7ebcf2009-05-08 17:59:29 +00001748 setattr(X, name, meth_impl)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001749 runner(X())
1750
1751 record = []
1752 class X(Checker):
1753 pass
Benjamin Petersonaf1692a2009-05-09 16:36:39 +00001754 for attr, obj in env.iteritems():
1755 setattr(X, attr, obj)
Benjamin Peterson399e4c42009-05-08 03:06:00 +00001756 setattr(X, name, SpecialDescr(meth_impl))
1757 runner(X())
1758 self.assertEqual(record, [1], name)
1759
Benjamin Peterson87e50062009-05-25 02:40:21 +00001760 class X(Checker):
1761 pass
1762 for attr, obj in env.iteritems():
1763 setattr(X, attr, obj)
1764 setattr(X, name, ErrDescr())
1765 try:
1766 runner(X())
1767 except MyException:
1768 pass
1769 else:
1770 self.fail("{0!r} didn't raise".format(name))
1771
Georg Brandl48545522008-02-02 10:12:36 +00001772 def test_specials(self):
1773 # Testing special operators...
1774 # Test operators like __hash__ for which a built-in default exists
1775
1776 # Test the default behavior for static classes
1777 class C(object):
1778 def __getitem__(self, i):
1779 if 0 <= i < 10: return i
1780 raise IndexError
1781 c1 = C()
1782 c2 = C()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001783 self.assertTrue(not not c1) # What?
Georg Brandl48545522008-02-02 10:12:36 +00001784 self.assertNotEqual(id(c1), id(c2))
1785 hash(c1)
1786 hash(c2)
1787 self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1788 self.assertEqual(c1, c1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001789 self.assertTrue(c1 != c2)
1790 self.assertTrue(not c1 != c1)
1791 self.assertTrue(not c1 == c2)
Georg Brandl48545522008-02-02 10:12:36 +00001792 # Note that the module name appears in str/repr, and that varies
1793 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001794 self.assertTrue(str(c1).find('C object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001795 self.assertEqual(str(c1), repr(c1))
Ezio Melottiaa980582010-01-23 23:04:36 +00001796 self.assertNotIn(-1, c1)
Georg Brandl48545522008-02-02 10:12:36 +00001797 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001798 self.assertIn(i, c1)
1799 self.assertNotIn(10, c1)
Georg Brandl48545522008-02-02 10:12:36 +00001800 # Test the default behavior for dynamic classes
1801 class D(object):
1802 def __getitem__(self, i):
1803 if 0 <= i < 10: return i
1804 raise IndexError
1805 d1 = D()
1806 d2 = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001807 self.assertTrue(not not d1)
Georg Brandl48545522008-02-02 10:12:36 +00001808 self.assertNotEqual(id(d1), id(d2))
1809 hash(d1)
1810 hash(d2)
1811 self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1812 self.assertEqual(d1, d1)
1813 self.assertNotEqual(d1, d2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001814 self.assertTrue(not d1 != d1)
1815 self.assertTrue(not d1 == d2)
Georg Brandl48545522008-02-02 10:12:36 +00001816 # Note that the module name appears in str/repr, and that varies
1817 # depending on whether this test is run standalone or from a framework.
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001818 self.assertTrue(str(d1).find('D object at ') >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001819 self.assertEqual(str(d1), repr(d1))
Ezio Melottiaa980582010-01-23 23:04:36 +00001820 self.assertNotIn(-1, d1)
Georg Brandl48545522008-02-02 10:12:36 +00001821 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001822 self.assertIn(i, d1)
1823 self.assertNotIn(10, d1)
Georg Brandl48545522008-02-02 10:12:36 +00001824 # Test overridden behavior for static classes
1825 class Proxy(object):
1826 def __init__(self, x):
1827 self.x = x
1828 def __nonzero__(self):
1829 return not not self.x
1830 def __hash__(self):
1831 return hash(self.x)
1832 def __eq__(self, other):
1833 return self.x == other
1834 def __ne__(self, other):
1835 return self.x != other
1836 def __cmp__(self, other):
1837 return cmp(self.x, other.x)
1838 def __str__(self):
1839 return "Proxy:%s" % self.x
1840 def __repr__(self):
1841 return "Proxy(%r)" % self.x
1842 def __contains__(self, value):
1843 return value in self.x
1844 p0 = Proxy(0)
1845 p1 = Proxy(1)
1846 p_1 = Proxy(-1)
1847 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001848 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001849 self.assertEqual(hash(p0), hash(0))
1850 self.assertEqual(p0, p0)
1851 self.assertNotEqual(p0, p1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001852 self.assertTrue(not p0 != p0)
Georg Brandl48545522008-02-02 10:12:36 +00001853 self.assertEqual(not p0, p1)
1854 self.assertEqual(cmp(p0, p1), -1)
1855 self.assertEqual(cmp(p0, p0), 0)
1856 self.assertEqual(cmp(p0, p_1), 1)
1857 self.assertEqual(str(p0), "Proxy:0")
1858 self.assertEqual(repr(p0), "Proxy(0)")
1859 p10 = Proxy(range(10))
Ezio Melottiaa980582010-01-23 23:04:36 +00001860 self.assertNotIn(-1, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001861 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001862 self.assertIn(i, p10)
1863 self.assertNotIn(10, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001864 # Test overridden behavior for dynamic classes
1865 class DProxy(object):
1866 def __init__(self, x):
1867 self.x = x
1868 def __nonzero__(self):
1869 return not not self.x
1870 def __hash__(self):
1871 return hash(self.x)
1872 def __eq__(self, other):
1873 return self.x == other
1874 def __ne__(self, other):
1875 return self.x != other
1876 def __cmp__(self, other):
1877 return cmp(self.x, other.x)
1878 def __str__(self):
1879 return "DProxy:%s" % self.x
1880 def __repr__(self):
1881 return "DProxy(%r)" % self.x
1882 def __contains__(self, value):
1883 return value in self.x
1884 p0 = DProxy(0)
1885 p1 = DProxy(1)
1886 p_1 = DProxy(-1)
1887 self.assertFalse(p0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001888 self.assertTrue(not not p1)
Georg Brandl48545522008-02-02 10:12:36 +00001889 self.assertEqual(hash(p0), hash(0))
1890 self.assertEqual(p0, p0)
1891 self.assertNotEqual(p0, p1)
1892 self.assertNotEqual(not p0, p0)
1893 self.assertEqual(not p0, p1)
1894 self.assertEqual(cmp(p0, p1), -1)
1895 self.assertEqual(cmp(p0, p0), 0)
1896 self.assertEqual(cmp(p0, p_1), 1)
1897 self.assertEqual(str(p0), "DProxy:0")
1898 self.assertEqual(repr(p0), "DProxy(0)")
1899 p10 = DProxy(range(10))
Ezio Melottiaa980582010-01-23 23:04:36 +00001900 self.assertNotIn(-1, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001901 for i in range(10):
Ezio Melottiaa980582010-01-23 23:04:36 +00001902 self.assertIn(i, p10)
1903 self.assertNotIn(10, p10)
Georg Brandl48545522008-02-02 10:12:36 +00001904
1905 # Safety test for __cmp__
1906 def unsafecmp(a, b):
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001907 if not hasattr(a, '__cmp__'):
1908 return # some types don't have a __cmp__ any more (so the
1909 # test doesn't make sense any more), or maybe they
1910 # never had a __cmp__ at all, e.g. in PyPy
Georg Brandl48545522008-02-02 10:12:36 +00001911 try:
1912 a.__class__.__cmp__(a, b)
1913 except TypeError:
1914 pass
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001915 else:
Georg Brandl48545522008-02-02 10:12:36 +00001916 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1917 a.__class__, a, b))
1918
1919 unsafecmp(u"123", "123")
1920 unsafecmp("123", u"123")
1921 unsafecmp(1, 1.0)
1922 unsafecmp(1.0, 1)
1923 unsafecmp(1, 1L)
1924 unsafecmp(1L, 1)
1925
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001926 @test_support.impl_detail("custom logic for printing to real file objects")
1927 def test_recursions_1(self):
Georg Brandl48545522008-02-02 10:12:36 +00001928 # Testing recursion checks ...
1929 class Letter(str):
1930 def __new__(cls, letter):
1931 if letter == 'EPS':
1932 return str.__new__(cls)
1933 return str.__new__(cls, letter)
1934 def __str__(self):
1935 if not self:
1936 return 'EPS'
1937 return self
1938 # sys.stdout needs to be the original to trigger the recursion bug
Georg Brandl48545522008-02-02 10:12:36 +00001939 test_stdout = sys.stdout
1940 sys.stdout = test_support.get_original_stdout()
1941 try:
1942 # nothing should actually be printed, this should raise an exception
1943 print Letter('w')
1944 except RuntimeError:
1945 pass
1946 else:
1947 self.fail("expected a RuntimeError for print recursion")
1948 finally:
1949 sys.stdout = test_stdout
1950
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001951 def test_recursions_2(self):
Georg Brandl48545522008-02-02 10:12:36 +00001952 # Bug #1202533.
1953 class A(object):
1954 pass
1955 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
1956 try:
1957 A()*2
1958 except RuntimeError:
1959 pass
1960 else:
1961 self.fail("expected a RuntimeError")
1962
1963 def test_weakrefs(self):
1964 # Testing weak references...
1965 import weakref
1966 class C(object):
1967 pass
1968 c = C()
1969 r = weakref.ref(c)
1970 self.assertEqual(r(), c)
1971 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001972 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001973 self.assertEqual(r(), None)
1974 del r
1975 class NoWeak(object):
1976 __slots__ = ['foo']
1977 no = NoWeak()
1978 try:
1979 weakref.ref(no)
1980 except TypeError, msg:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001981 self.assertTrue(str(msg).find("weak reference") >= 0)
Georg Brandl48545522008-02-02 10:12:36 +00001982 else:
1983 self.fail("weakref.ref(no) should be illegal")
1984 class Weak(object):
1985 __slots__ = ['foo', '__weakref__']
1986 yes = Weak()
1987 r = weakref.ref(yes)
1988 self.assertEqual(r(), yes)
1989 del yes
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00001990 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00001991 self.assertEqual(r(), None)
1992 del r
1993
1994 def test_properties(self):
1995 # Testing property...
1996 class C(object):
1997 def getx(self):
1998 return self.__x
1999 def setx(self, value):
2000 self.__x = value
2001 def delx(self):
2002 del self.__x
2003 x = property(getx, setx, delx, doc="I'm the x property.")
2004 a = C()
2005 self.assertFalse(hasattr(a, "x"))
2006 a.x = 42
2007 self.assertEqual(a._C__x, 42)
2008 self.assertEqual(a.x, 42)
2009 del a.x
2010 self.assertFalse(hasattr(a, "x"))
2011 self.assertFalse(hasattr(a, "_C__x"))
2012 C.x.__set__(a, 100)
2013 self.assertEqual(C.x.__get__(a), 100)
2014 C.x.__delete__(a)
2015 self.assertFalse(hasattr(a, "x"))
2016
2017 raw = C.__dict__['x']
Ezio Melottib0f5adc2010-01-24 16:58:36 +00002018 self.assertIsInstance(raw, property)
Georg Brandl48545522008-02-02 10:12:36 +00002019
2020 attrs = dir(raw)
Ezio Melottiaa980582010-01-23 23:04:36 +00002021 self.assertIn("__doc__", attrs)
2022 self.assertIn("fget", attrs)
2023 self.assertIn("fset", attrs)
2024 self.assertIn("fdel", attrs)
Georg Brandl48545522008-02-02 10:12:36 +00002025
2026 self.assertEqual(raw.__doc__, "I'm the x property.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002027 self.assertTrue(raw.fget is C.__dict__['getx'])
2028 self.assertTrue(raw.fset is C.__dict__['setx'])
2029 self.assertTrue(raw.fdel is C.__dict__['delx'])
Georg Brandl48545522008-02-02 10:12:36 +00002030
2031 for attr in "__doc__", "fget", "fset", "fdel":
2032 try:
2033 setattr(raw, attr, 42)
2034 except TypeError, msg:
2035 if str(msg).find('readonly') < 0:
2036 self.fail("when setting readonly attr %r on a property, "
2037 "got unexpected TypeError msg %r" % (attr, str(msg)))
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002038 else:
Georg Brandl48545522008-02-02 10:12:36 +00002039 self.fail("expected TypeError from trying to set readonly %r "
2040 "attr on a property" % attr)
Tim Peters2f93e282001-10-04 05:27:00 +00002041
Georg Brandl48545522008-02-02 10:12:36 +00002042 class D(object):
2043 __getitem__ = property(lambda s: 1/0)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002044
Georg Brandl48545522008-02-02 10:12:36 +00002045 d = D()
2046 try:
2047 for i in d:
2048 str(i)
2049 except ZeroDivisionError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002050 pass
Georg Brandl48545522008-02-02 10:12:36 +00002051 else:
2052 self.fail("expected ZeroDivisionError from bad property")
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002053
R. David Murrayf28fd242010-02-23 00:24:49 +00002054 @unittest.skipIf(sys.flags.optimize >= 2,
2055 "Docstrings are omitted with -O2 and above")
2056 def test_properties_doc_attrib(self):
Georg Brandl48545522008-02-02 10:12:36 +00002057 class E(object):
2058 def getter(self):
2059 "getter method"
2060 return 0
2061 def setter(self_, value):
2062 "setter method"
2063 pass
2064 prop = property(getter)
2065 self.assertEqual(prop.__doc__, "getter method")
2066 prop2 = property(fset=setter)
2067 self.assertEqual(prop2.__doc__, None)
2068
R. David Murrayf28fd242010-02-23 00:24:49 +00002069 def test_testcapi_no_segfault(self):
Georg Brandl48545522008-02-02 10:12:36 +00002070 # this segfaulted in 2.5b2
2071 try:
2072 import _testcapi
2073 except ImportError:
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002074 pass
Georg Brandl48545522008-02-02 10:12:36 +00002075 else:
2076 class X(object):
2077 p = property(_testcapi.test_with_docstring)
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002078
Georg Brandl48545522008-02-02 10:12:36 +00002079 def test_properties_plus(self):
2080 class C(object):
2081 foo = property(doc="hello")
2082 @foo.getter
2083 def foo(self):
2084 return self._foo
2085 @foo.setter
2086 def foo(self, value):
2087 self._foo = abs(value)
2088 @foo.deleter
2089 def foo(self):
2090 del self._foo
2091 c = C()
2092 self.assertEqual(C.foo.__doc__, "hello")
2093 self.assertFalse(hasattr(c, "foo"))
2094 c.foo = -42
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002095 self.assertTrue(hasattr(c, '_foo'))
Georg Brandl48545522008-02-02 10:12:36 +00002096 self.assertEqual(c._foo, 42)
2097 self.assertEqual(c.foo, 42)
2098 del c.foo
2099 self.assertFalse(hasattr(c, '_foo'))
2100 self.assertFalse(hasattr(c, "foo"))
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002101
Georg Brandl48545522008-02-02 10:12:36 +00002102 class D(C):
2103 @C.foo.deleter
2104 def foo(self):
2105 try:
2106 del self._foo
2107 except AttributeError:
2108 pass
2109 d = D()
2110 d.foo = 24
2111 self.assertEqual(d.foo, 24)
2112 del d.foo
2113 del d.foo
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002114
Georg Brandl48545522008-02-02 10:12:36 +00002115 class E(object):
2116 @property
2117 def foo(self):
2118 return self._foo
2119 @foo.setter
2120 def foo(self, value):
2121 raise RuntimeError
2122 @foo.setter
2123 def foo(self, value):
2124 self._foo = abs(value)
2125 @foo.deleter
2126 def foo(self, value=None):
2127 del self._foo
Guido van Rossume8fc6402002-04-16 16:44:51 +00002128
Georg Brandl48545522008-02-02 10:12:36 +00002129 e = E()
2130 e.foo = -42
2131 self.assertEqual(e.foo, 42)
2132 del e.foo
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002133
Georg Brandl48545522008-02-02 10:12:36 +00002134 class F(E):
2135 @E.foo.deleter
2136 def foo(self):
2137 del self._foo
2138 @foo.setter
2139 def foo(self, value):
2140 self._foo = max(0, value)
2141 f = F()
2142 f.foo = -10
2143 self.assertEqual(f.foo, 0)
2144 del f.foo
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00002145
Georg Brandl48545522008-02-02 10:12:36 +00002146 def test_dict_constructors(self):
2147 # Testing dict constructor ...
2148 d = dict()
2149 self.assertEqual(d, {})
2150 d = dict({})
2151 self.assertEqual(d, {})
2152 d = dict({1: 2, 'a': 'b'})
2153 self.assertEqual(d, {1: 2, 'a': 'b'})
2154 self.assertEqual(d, dict(d.items()))
2155 self.assertEqual(d, dict(d.iteritems()))
2156 d = dict({'one':1, 'two':2})
2157 self.assertEqual(d, dict(one=1, two=2))
2158 self.assertEqual(d, dict(**d))
2159 self.assertEqual(d, dict({"one": 1}, two=2))
2160 self.assertEqual(d, dict([("two", 2)], one=1))
2161 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
2162 self.assertEqual(d, dict(**d))
Guido van Rossum09638c12002-06-13 19:17:46 +00002163
Georg Brandl48545522008-02-02 10:12:36 +00002164 for badarg in 0, 0L, 0j, "0", [0], (0,):
2165 try:
2166 dict(badarg)
2167 except TypeError:
2168 pass
2169 except ValueError:
2170 if badarg == "0":
2171 # It's a sequence, and its elements are also sequences (gotta
2172 # love strings <wink>), but they aren't of length 2, so this
2173 # one seemed better as a ValueError than a TypeError.
2174 pass
2175 else:
2176 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002177 else:
Georg Brandl48545522008-02-02 10:12:36 +00002178 self.fail("no TypeError from dict(%r)" % badarg)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002179
Georg Brandl48545522008-02-02 10:12:36 +00002180 try:
2181 dict({}, {})
2182 except TypeError:
2183 pass
2184 else:
2185 self.fail("no TypeError from dict({}, {})")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002186
Georg Brandl48545522008-02-02 10:12:36 +00002187 class Mapping:
2188 # Lacks a .keys() method; will be added later.
2189 dict = {1:2, 3:4, 'a':1j}
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002190
Georg Brandl48545522008-02-02 10:12:36 +00002191 try:
2192 dict(Mapping())
2193 except TypeError:
2194 pass
2195 else:
2196 self.fail("no TypeError from dict(incomplete mapping)")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002197
Georg Brandl48545522008-02-02 10:12:36 +00002198 Mapping.keys = lambda self: self.dict.keys()
2199 Mapping.__getitem__ = lambda self, i: self.dict[i]
2200 d = dict(Mapping())
2201 self.assertEqual(d, Mapping.dict)
Michael W. Hudsonf3904422006-11-23 13:54:04 +00002202
Georg Brandl48545522008-02-02 10:12:36 +00002203 # Init from sequence of iterable objects, each producing a 2-sequence.
2204 class AddressBookEntry:
2205 def __init__(self, first, last):
2206 self.first = first
2207 self.last = last
2208 def __iter__(self):
2209 return iter([self.first, self.last])
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002210
Georg Brandl48545522008-02-02 10:12:36 +00002211 d = dict([AddressBookEntry('Tim', 'Warsaw'),
2212 AddressBookEntry('Barry', 'Peters'),
2213 AddressBookEntry('Tim', 'Peters'),
2214 AddressBookEntry('Barry', 'Warsaw')])
2215 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00002216
Georg Brandl48545522008-02-02 10:12:36 +00002217 d = dict(zip(range(4), range(1, 5)))
2218 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002219
Georg Brandl48545522008-02-02 10:12:36 +00002220 # Bad sequence lengths.
2221 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
2222 try:
2223 dict(bad)
2224 except ValueError:
2225 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00002226 else:
Georg Brandl48545522008-02-02 10:12:36 +00002227 self.fail("no ValueError from dict(%r)" % bad)
2228
2229 def test_dir(self):
2230 # Testing dir() ...
2231 junk = 12
2232 self.assertEqual(dir(), ['junk', 'self'])
2233 del junk
2234
2235 # Just make sure these don't blow up!
2236 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
2237 dir(arg)
2238
2239 # Try classic classes.
2240 class C:
2241 Cdata = 1
2242 def Cmethod(self): pass
2243
2244 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
2245 self.assertEqual(dir(C), cstuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002246 self.assertIn('im_self', dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002247
2248 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
2249 self.assertEqual(dir(c), cstuff)
2250
2251 c.cdata = 2
2252 c.cmethod = lambda self: 0
2253 self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002254 self.assertIn('im_self', dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002255
2256 class A(C):
2257 Adata = 1
2258 def Amethod(self): pass
2259
2260 astuff = ['Adata', 'Amethod'] + cstuff
2261 self.assertEqual(dir(A), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002262 self.assertIn('im_self', dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002263 a = A()
2264 self.assertEqual(dir(a), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002265 self.assertIn('im_self', dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002266 a.adata = 42
2267 a.amethod = lambda self: 3
2268 self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
2269
2270 # The same, but with new-style classes. Since these have object as a
2271 # base class, a lot more gets sucked in.
2272 def interesting(strings):
2273 return [s for s in strings if not s.startswith('_')]
2274
2275 class C(object):
2276 Cdata = 1
2277 def Cmethod(self): pass
2278
2279 cstuff = ['Cdata', 'Cmethod']
2280 self.assertEqual(interesting(dir(C)), cstuff)
2281
2282 c = C()
2283 self.assertEqual(interesting(dir(c)), cstuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002284 self.assertIn('im_self', dir(C.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002285
2286 c.cdata = 2
2287 c.cmethod = lambda self: 0
2288 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002289 self.assertIn('im_self', dir(c.Cmethod))
Georg Brandl48545522008-02-02 10:12:36 +00002290
2291 class A(C):
2292 Adata = 1
2293 def Amethod(self): pass
2294
2295 astuff = ['Adata', 'Amethod'] + cstuff
2296 self.assertEqual(interesting(dir(A)), astuff)
Ezio Melottiaa980582010-01-23 23:04:36 +00002297 self.assertIn('im_self', dir(A.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002298 a = A()
2299 self.assertEqual(interesting(dir(a)), astuff)
2300 a.adata = 42
2301 a.amethod = lambda self: 3
2302 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
Ezio Melottiaa980582010-01-23 23:04:36 +00002303 self.assertIn('im_self', dir(a.Amethod))
Georg Brandl48545522008-02-02 10:12:36 +00002304
2305 # Try a module subclass.
Georg Brandl48545522008-02-02 10:12:36 +00002306 class M(type(sys)):
2307 pass
2308 minstance = M("m")
2309 minstance.b = 2
2310 minstance.a = 1
2311 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
2312 self.assertEqual(names, ['a', 'b'])
2313
2314 class M2(M):
2315 def getdict(self):
2316 return "Not a dict!"
2317 __dict__ = property(getdict)
2318
2319 m2instance = M2("m2")
2320 m2instance.b = 2
2321 m2instance.a = 1
2322 self.assertEqual(m2instance.__dict__, "Not a dict!")
2323 try:
2324 dir(m2instance)
2325 except TypeError:
2326 pass
2327
2328 # Two essentially featureless objects, just inheriting stuff from
2329 # object.
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00002330 self.assertEqual(dir(NotImplemented), dir(Ellipsis))
2331 if test_support.check_impl_detail():
2332 # None differs in PyPy: it has a __nonzero__
2333 self.assertEqual(dir(None), dir(Ellipsis))
Georg Brandl48545522008-02-02 10:12:36 +00002334
2335 # Nasty test case for proxied objects
2336 class Wrapper(object):
2337 def __init__(self, obj):
2338 self.__obj = obj
2339 def __repr__(self):
2340 return "Wrapper(%s)" % repr(self.__obj)
2341 def __getitem__(self, key):
2342 return Wrapper(self.__obj[key])
2343 def __len__(self):
2344 return len(self.__obj)
2345 def __getattr__(self, name):
2346 return Wrapper(getattr(self.__obj, name))
2347
2348 class C(object):
2349 def __getclass(self):
2350 return Wrapper(type(self))
2351 __class__ = property(__getclass)
2352
2353 dir(C()) # This used to segfault
2354
2355 def test_supers(self):
2356 # Testing super...
2357
2358 class A(object):
2359 def meth(self, a):
2360 return "A(%r)" % a
2361
2362 self.assertEqual(A().meth(1), "A(1)")
2363
2364 class B(A):
2365 def __init__(self):
2366 self.__super = super(B, self)
2367 def meth(self, a):
2368 return "B(%r)" % a + self.__super.meth(a)
2369
2370 self.assertEqual(B().meth(2), "B(2)A(2)")
2371
2372 class C(A):
2373 def meth(self, a):
2374 return "C(%r)" % a + self.__super.meth(a)
2375 C._C__super = super(C)
2376
2377 self.assertEqual(C().meth(3), "C(3)A(3)")
2378
2379 class D(C, B):
2380 def meth(self, a):
2381 return "D(%r)" % a + super(D, self).meth(a)
2382
2383 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2384
2385 # Test for subclassing super
2386
2387 class mysuper(super):
2388 def __init__(self, *args):
2389 return super(mysuper, self).__init__(*args)
2390
2391 class E(D):
2392 def meth(self, a):
2393 return "E(%r)" % a + mysuper(E, self).meth(a)
2394
2395 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2396
2397 class F(E):
2398 def meth(self, a):
2399 s = self.__super # == mysuper(F, self)
2400 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2401 F._F__super = mysuper(F)
2402
2403 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2404
2405 # Make sure certain errors are raised
2406
2407 try:
2408 super(D, 42)
2409 except TypeError:
2410 pass
2411 else:
2412 self.fail("shouldn't allow super(D, 42)")
2413
2414 try:
2415 super(D, C())
2416 except TypeError:
2417 pass
2418 else:
2419 self.fail("shouldn't allow super(D, C())")
2420
2421 try:
2422 super(D).__get__(12)
2423 except TypeError:
2424 pass
2425 else:
2426 self.fail("shouldn't allow super(D).__get__(12)")
2427
2428 try:
2429 super(D).__get__(C())
2430 except TypeError:
2431 pass
2432 else:
2433 self.fail("shouldn't allow super(D).__get__(C())")
2434
2435 # Make sure data descriptors can be overridden and accessed via super
2436 # (new feature in Python 2.3)
2437
2438 class DDbase(object):
2439 def getx(self): return 42
2440 x = property(getx)
2441
2442 class DDsub(DDbase):
2443 def getx(self): return "hello"
2444 x = property(getx)
2445
2446 dd = DDsub()
2447 self.assertEqual(dd.x, "hello")
2448 self.assertEqual(super(DDsub, dd).x, 42)
2449
2450 # Ensure that super() lookup of descriptor from classmethod
2451 # works (SF ID# 743627)
2452
2453 class Base(object):
2454 aProp = property(lambda self: "foo")
2455
2456 class Sub(Base):
2457 @classmethod
2458 def test(klass):
2459 return super(Sub,klass).aProp
2460
2461 self.assertEqual(Sub.test(), Base.aProp)
2462
2463 # Verify that super() doesn't allow keyword args
2464 try:
2465 super(Base, kw=1)
2466 except TypeError:
2467 pass
2468 else:
2469 self.assertEqual("super shouldn't accept keyword args")
2470
2471 def test_basic_inheritance(self):
2472 # Testing inheritance from basic types...
2473
2474 class hexint(int):
2475 def __repr__(self):
2476 return hex(self)
2477 def __add__(self, other):
2478 return hexint(int.__add__(self, other))
2479 # (Note that overriding __radd__ doesn't work,
2480 # because the int type gets first dibs.)
2481 self.assertEqual(repr(hexint(7) + 9), "0x10")
2482 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2483 a = hexint(12345)
2484 self.assertEqual(a, 12345)
2485 self.assertEqual(int(a), 12345)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002486 self.assertTrue(int(a).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002487 self.assertEqual(hash(a), hash(12345))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002488 self.assertTrue((+a).__class__ is int)
2489 self.assertTrue((a >> 0).__class__ is int)
2490 self.assertTrue((a << 0).__class__ is int)
2491 self.assertTrue((hexint(0) << 12).__class__ is int)
2492 self.assertTrue((hexint(0) >> 12).__class__ is int)
Georg Brandl48545522008-02-02 10:12:36 +00002493
2494 class octlong(long):
2495 __slots__ = []
2496 def __str__(self):
2497 s = oct(self)
2498 if s[-1] == 'L':
2499 s = s[:-1]
2500 return s
2501 def __add__(self, other):
2502 return self.__class__(super(octlong, self).__add__(other))
2503 __radd__ = __add__
2504 self.assertEqual(str(octlong(3) + 5), "010")
2505 # (Note that overriding __radd__ here only seems to work
2506 # because the example uses a short int left argument.)
2507 self.assertEqual(str(5 + octlong(3000)), "05675")
2508 a = octlong(12345)
2509 self.assertEqual(a, 12345L)
2510 self.assertEqual(long(a), 12345L)
2511 self.assertEqual(hash(a), hash(12345L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002512 self.assertTrue(long(a).__class__ is long)
2513 self.assertTrue((+a).__class__ is long)
2514 self.assertTrue((-a).__class__ is long)
2515 self.assertTrue((-octlong(0)).__class__ is long)
2516 self.assertTrue((a >> 0).__class__ is long)
2517 self.assertTrue((a << 0).__class__ is long)
2518 self.assertTrue((a - 0).__class__ is long)
2519 self.assertTrue((a * 1).__class__ is long)
2520 self.assertTrue((a ** 1).__class__ is long)
2521 self.assertTrue((a // 1).__class__ is long)
2522 self.assertTrue((1 * a).__class__ is long)
2523 self.assertTrue((a | 0).__class__ is long)
2524 self.assertTrue((a ^ 0).__class__ is long)
2525 self.assertTrue((a & -1L).__class__ is long)
2526 self.assertTrue((octlong(0) << 12).__class__ is long)
2527 self.assertTrue((octlong(0) >> 12).__class__ is long)
2528 self.assertTrue(abs(octlong(0)).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002529
2530 # Because octlong overrides __add__, we can't check the absence of +0
2531 # optimizations using octlong.
2532 class longclone(long):
2533 pass
2534 a = longclone(1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002535 self.assertTrue((a + 0).__class__ is long)
2536 self.assertTrue((0 + a).__class__ is long)
Georg Brandl48545522008-02-02 10:12:36 +00002537
2538 # Check that negative clones don't segfault
2539 a = longclone(-1)
2540 self.assertEqual(a.__dict__, {})
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002541 self.assertEqual(long(a), -1) # self.assertTrue PyNumber_Long() copies the sign bit
Georg Brandl48545522008-02-02 10:12:36 +00002542
2543 class precfloat(float):
2544 __slots__ = ['prec']
2545 def __init__(self, value=0.0, prec=12):
2546 self.prec = int(prec)
2547 def __repr__(self):
2548 return "%.*g" % (self.prec, self)
2549 self.assertEqual(repr(precfloat(1.1)), "1.1")
2550 a = precfloat(12345)
2551 self.assertEqual(a, 12345.0)
2552 self.assertEqual(float(a), 12345.0)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002553 self.assertTrue(float(a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002554 self.assertEqual(hash(a), hash(12345.0))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002555 self.assertTrue((+a).__class__ is float)
Georg Brandl48545522008-02-02 10:12:36 +00002556
2557 class madcomplex(complex):
2558 def __repr__(self):
2559 return "%.17gj%+.17g" % (self.imag, self.real)
2560 a = madcomplex(-3, 4)
2561 self.assertEqual(repr(a), "4j-3")
2562 base = complex(-3, 4)
2563 self.assertEqual(base.__class__, complex)
2564 self.assertEqual(a, base)
2565 self.assertEqual(complex(a), base)
2566 self.assertEqual(complex(a).__class__, complex)
2567 a = madcomplex(a) # just trying another form of the constructor
2568 self.assertEqual(repr(a), "4j-3")
2569 self.assertEqual(a, base)
2570 self.assertEqual(complex(a), base)
2571 self.assertEqual(complex(a).__class__, complex)
2572 self.assertEqual(hash(a), hash(base))
2573 self.assertEqual((+a).__class__, complex)
2574 self.assertEqual((a + 0).__class__, complex)
2575 self.assertEqual(a + 0, base)
2576 self.assertEqual((a - 0).__class__, complex)
2577 self.assertEqual(a - 0, base)
2578 self.assertEqual((a * 1).__class__, complex)
2579 self.assertEqual(a * 1, base)
2580 self.assertEqual((a / 1).__class__, complex)
2581 self.assertEqual(a / 1, base)
2582
2583 class madtuple(tuple):
2584 _rev = None
2585 def rev(self):
2586 if self._rev is not None:
2587 return self._rev
2588 L = list(self)
2589 L.reverse()
2590 self._rev = self.__class__(L)
2591 return self._rev
2592 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2593 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2594 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2595 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2596 for i in range(512):
2597 t = madtuple(range(i))
2598 u = t.rev()
2599 v = u.rev()
2600 self.assertEqual(v, t)
2601 a = madtuple((1,2,3,4,5))
2602 self.assertEqual(tuple(a), (1,2,3,4,5))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002603 self.assertTrue(tuple(a).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002604 self.assertEqual(hash(a), hash((1,2,3,4,5)))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002605 self.assertTrue(a[:].__class__ is tuple)
2606 self.assertTrue((a * 1).__class__ is tuple)
2607 self.assertTrue((a * 0).__class__ is tuple)
2608 self.assertTrue((a + ()).__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002609 a = madtuple(())
2610 self.assertEqual(tuple(a), ())
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002611 self.assertTrue(tuple(a).__class__ is tuple)
2612 self.assertTrue((a + a).__class__ is tuple)
2613 self.assertTrue((a * 0).__class__ is tuple)
2614 self.assertTrue((a * 1).__class__ is tuple)
2615 self.assertTrue((a * 2).__class__ is tuple)
2616 self.assertTrue(a[:].__class__ is tuple)
Georg Brandl48545522008-02-02 10:12:36 +00002617
2618 class madstring(str):
2619 _rev = None
2620 def rev(self):
2621 if self._rev is not None:
2622 return self._rev
2623 L = list(self)
2624 L.reverse()
2625 self._rev = self.__class__("".join(L))
2626 return self._rev
2627 s = madstring("abcdefghijklmnopqrstuvwxyz")
2628 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2629 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2630 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2631 for i in range(256):
2632 s = madstring("".join(map(chr, range(i))))
2633 t = s.rev()
2634 u = t.rev()
2635 self.assertEqual(u, s)
2636 s = madstring("12345")
2637 self.assertEqual(str(s), "12345")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002638 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002639
2640 base = "\x00" * 5
2641 s = madstring(base)
2642 self.assertEqual(s, base)
2643 self.assertEqual(str(s), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002644 self.assertTrue(str(s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002645 self.assertEqual(hash(s), hash(base))
2646 self.assertEqual({s: 1}[base], 1)
2647 self.assertEqual({base: 1}[s], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002648 self.assertTrue((s + "").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002649 self.assertEqual(s + "", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002650 self.assertTrue(("" + s).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002651 self.assertEqual("" + s, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002652 self.assertTrue((s * 0).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002653 self.assertEqual(s * 0, "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002654 self.assertTrue((s * 1).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002655 self.assertEqual(s * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002656 self.assertTrue((s * 2).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002657 self.assertEqual(s * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002658 self.assertTrue(s[:].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002659 self.assertEqual(s[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002660 self.assertTrue(s[0:0].__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002661 self.assertEqual(s[0:0], "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002662 self.assertTrue(s.strip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002663 self.assertEqual(s.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002664 self.assertTrue(s.lstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002665 self.assertEqual(s.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002666 self.assertTrue(s.rstrip().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002667 self.assertEqual(s.rstrip(), base)
2668 identitytab = ''.join([chr(i) for i in range(256)])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002669 self.assertTrue(s.translate(identitytab).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002670 self.assertEqual(s.translate(identitytab), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002671 self.assertTrue(s.translate(identitytab, "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002672 self.assertEqual(s.translate(identitytab, "x"), base)
2673 self.assertEqual(s.translate(identitytab, "\x00"), "")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002674 self.assertTrue(s.replace("x", "x").__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002675 self.assertEqual(s.replace("x", "x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002676 self.assertTrue(s.ljust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002677 self.assertEqual(s.ljust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002678 self.assertTrue(s.rjust(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002679 self.assertEqual(s.rjust(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002680 self.assertTrue(s.center(len(s)).__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002681 self.assertEqual(s.center(len(s)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002682 self.assertTrue(s.lower().__class__ is str)
Georg Brandl48545522008-02-02 10:12:36 +00002683 self.assertEqual(s.lower(), base)
2684
2685 class madunicode(unicode):
2686 _rev = None
2687 def rev(self):
2688 if self._rev is not None:
2689 return self._rev
2690 L = list(self)
2691 L.reverse()
2692 self._rev = self.__class__(u"".join(L))
2693 return self._rev
2694 u = madunicode("ABCDEF")
2695 self.assertEqual(u, u"ABCDEF")
2696 self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
2697 self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
2698 base = u"12345"
2699 u = madunicode(base)
2700 self.assertEqual(unicode(u), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002701 self.assertTrue(unicode(u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002702 self.assertEqual(hash(u), hash(base))
2703 self.assertEqual({u: 1}[base], 1)
2704 self.assertEqual({base: 1}[u], 1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002705 self.assertTrue(u.strip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002706 self.assertEqual(u.strip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002707 self.assertTrue(u.lstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002708 self.assertEqual(u.lstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002709 self.assertTrue(u.rstrip().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002710 self.assertEqual(u.rstrip(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002711 self.assertTrue(u.replace(u"x", u"x").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002712 self.assertEqual(u.replace(u"x", u"x"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002713 self.assertTrue(u.replace(u"xy", u"xy").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002714 self.assertEqual(u.replace(u"xy", u"xy"), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002715 self.assertTrue(u.center(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002716 self.assertEqual(u.center(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002717 self.assertTrue(u.ljust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002718 self.assertEqual(u.ljust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002719 self.assertTrue(u.rjust(len(u)).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002720 self.assertEqual(u.rjust(len(u)), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002721 self.assertTrue(u.lower().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002722 self.assertEqual(u.lower(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002723 self.assertTrue(u.upper().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002724 self.assertEqual(u.upper(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002725 self.assertTrue(u.capitalize().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002726 self.assertEqual(u.capitalize(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002727 self.assertTrue(u.title().__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002728 self.assertEqual(u.title(), base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002729 self.assertTrue((u + u"").__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002730 self.assertEqual(u + u"", base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002731 self.assertTrue((u"" + u).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002732 self.assertEqual(u"" + u, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002733 self.assertTrue((u * 0).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002734 self.assertEqual(u * 0, u"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002735 self.assertTrue((u * 1).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002736 self.assertEqual(u * 1, base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002737 self.assertTrue((u * 2).__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002738 self.assertEqual(u * 2, base + base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002739 self.assertTrue(u[:].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002740 self.assertEqual(u[:], base)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002741 self.assertTrue(u[0:0].__class__ is unicode)
Georg Brandl48545522008-02-02 10:12:36 +00002742 self.assertEqual(u[0:0], u"")
2743
2744 class sublist(list):
2745 pass
2746 a = sublist(range(5))
2747 self.assertEqual(a, range(5))
2748 a.append("hello")
2749 self.assertEqual(a, range(5) + ["hello"])
2750 a[5] = 5
2751 self.assertEqual(a, range(6))
2752 a.extend(range(6, 20))
2753 self.assertEqual(a, range(20))
2754 a[-5:] = []
2755 self.assertEqual(a, range(15))
2756 del a[10:15]
2757 self.assertEqual(len(a), 10)
2758 self.assertEqual(a, range(10))
2759 self.assertEqual(list(a), range(10))
2760 self.assertEqual(a[0], 0)
2761 self.assertEqual(a[9], 9)
2762 self.assertEqual(a[-10], 0)
2763 self.assertEqual(a[-1], 9)
2764 self.assertEqual(a[:5], range(5))
2765
2766 class CountedInput(file):
2767 """Counts lines read by self.readline().
2768
2769 self.lineno is the 0-based ordinal of the last line read, up to
2770 a maximum of one greater than the number of lines in the file.
2771
2772 self.ateof is true if and only if the final "" line has been read,
2773 at which point self.lineno stops incrementing, and further calls
2774 to readline() continue to return "".
2775 """
2776
2777 lineno = 0
2778 ateof = 0
2779 def readline(self):
2780 if self.ateof:
2781 return ""
2782 s = file.readline(self)
2783 # Next line works too.
2784 # s = super(CountedInput, self).readline()
2785 self.lineno += 1
2786 if s == "":
2787 self.ateof = 1
2788 return s
2789
2790 f = file(name=test_support.TESTFN, mode='w')
2791 lines = ['a\n', 'b\n', 'c\n']
2792 try:
2793 f.writelines(lines)
2794 f.close()
2795 f = CountedInput(test_support.TESTFN)
2796 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2797 got = f.readline()
2798 self.assertEqual(expected, got)
2799 self.assertEqual(f.lineno, i)
2800 self.assertEqual(f.ateof, (i > len(lines)))
2801 f.close()
2802 finally:
2803 try:
2804 f.close()
2805 except:
2806 pass
2807 test_support.unlink(test_support.TESTFN)
2808
2809 def test_keywords(self):
2810 # Testing keyword args to basic type constructors ...
2811 self.assertEqual(int(x=1), 1)
2812 self.assertEqual(float(x=2), 2.0)
2813 self.assertEqual(long(x=3), 3L)
2814 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2815 self.assertEqual(str(object=500), '500')
2816 self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
2817 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2818 self.assertEqual(list(sequence=(0, 1, 2)), range(3))
2819 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2820
2821 for constructor in (int, float, long, complex, str, unicode,
2822 tuple, list, file):
2823 try:
2824 constructor(bogus_keyword_arg=1)
2825 except TypeError:
2826 pass
2827 else:
2828 self.fail("expected TypeError from bogus keyword argument to %r"
2829 % constructor)
2830
2831 def test_str_subclass_as_dict_key(self):
2832 # Testing a str subclass used as dict key ..
2833
2834 class cistr(str):
2835 """Sublcass of str that computes __eq__ case-insensitively.
2836
2837 Also computes a hash code of the string in canonical form.
2838 """
2839
2840 def __init__(self, value):
2841 self.canonical = value.lower()
2842 self.hashcode = hash(self.canonical)
2843
2844 def __eq__(self, other):
2845 if not isinstance(other, cistr):
2846 other = cistr(other)
2847 return self.canonical == other.canonical
2848
2849 def __hash__(self):
2850 return self.hashcode
2851
2852 self.assertEqual(cistr('ABC'), 'abc')
2853 self.assertEqual('aBc', cistr('ABC'))
2854 self.assertEqual(str(cistr('ABC')), 'ABC')
2855
2856 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2857 self.assertEqual(d[cistr('one')], 1)
2858 self.assertEqual(d[cistr('tWo')], 2)
2859 self.assertEqual(d[cistr('THrEE')], 3)
Ezio Melottiaa980582010-01-23 23:04:36 +00002860 self.assertIn(cistr('ONe'), d)
Georg Brandl48545522008-02-02 10:12:36 +00002861 self.assertEqual(d.get(cistr('thrEE')), 3)
2862
2863 def test_classic_comparisons(self):
2864 # Testing classic comparisons...
2865 class classic:
2866 pass
2867
2868 for base in (classic, int, object):
2869 class C(base):
2870 def __init__(self, value):
2871 self.value = int(value)
2872 def __cmp__(self, other):
2873 if isinstance(other, C):
2874 return cmp(self.value, other.value)
2875 if isinstance(other, int) or isinstance(other, long):
2876 return cmp(self.value, other)
2877 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002878 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002879
2880 c1 = C(1)
2881 c2 = C(2)
2882 c3 = C(3)
2883 self.assertEqual(c1, 1)
2884 c = {1: c1, 2: c2, 3: c3}
2885 for x in 1, 2, 3:
2886 for y in 1, 2, 3:
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002887 self.assertTrue(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002888 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002889 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002890 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002891 self.assertTrue(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2892 self.assertTrue(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Georg Brandl48545522008-02-02 10:12:36 +00002893
2894 def test_rich_comparisons(self):
2895 # Testing rich comparisons...
2896 class Z(complex):
2897 pass
2898 z = Z(1)
2899 self.assertEqual(z, 1+0j)
2900 self.assertEqual(1+0j, z)
2901 class ZZ(complex):
2902 def __eq__(self, other):
2903 try:
2904 return abs(self - other) <= 1e-6
2905 except:
2906 return NotImplemented
Nick Coghlan48361f52008-08-11 15:45:58 +00002907 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002908 zz = ZZ(1.0000003)
2909 self.assertEqual(zz, 1+0j)
2910 self.assertEqual(1+0j, zz)
2911
2912 class classic:
2913 pass
2914 for base in (classic, int, object, list):
2915 class C(base):
2916 def __init__(self, value):
2917 self.value = int(value)
2918 def __cmp__(self_, other):
2919 self.fail("shouldn't call __cmp__")
Nick Coghlan48361f52008-08-11 15:45:58 +00002920 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00002921 def __eq__(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 __ne__(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 __lt__(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 __le__(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 __gt__(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 def __ge__(self, other):
2952 if isinstance(other, C):
2953 return self.value >= other.value
2954 if isinstance(other, int) or isinstance(other, long):
2955 return self.value >= other
2956 return NotImplemented
2957 c1 = C(1)
2958 c2 = C(2)
2959 c3 = C(3)
2960 self.assertEqual(c1, 1)
2961 c = {1: c1, 2: c2, 3: c3}
2962 for x in 1, 2, 3:
2963 for y in 1, 2, 3:
2964 for op in "<", "<=", "==", "!=", ">", ">=":
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002965 self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002966 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002967 self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002968 "x=%d, y=%d" % (x, y))
Benjamin Peterson5c8da862009-06-30 22:57:08 +00002969 self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
Georg Brandl48545522008-02-02 10:12:36 +00002970 "x=%d, y=%d" % (x, y))
2971
2972 def test_coercions(self):
2973 # Testing coercions...
2974 class I(int): pass
2975 coerce(I(0), 0)
2976 coerce(0, I(0))
2977 class L(long): pass
2978 coerce(L(0), 0)
2979 coerce(L(0), 0L)
2980 coerce(0, L(0))
2981 coerce(0L, L(0))
2982 class F(float): pass
2983 coerce(F(0), 0)
2984 coerce(F(0), 0L)
2985 coerce(F(0), 0.)
2986 coerce(0, F(0))
2987 coerce(0L, F(0))
2988 coerce(0., F(0))
2989 class C(complex): pass
2990 coerce(C(0), 0)
2991 coerce(C(0), 0L)
2992 coerce(C(0), 0.)
2993 coerce(C(0), 0j)
2994 coerce(0, C(0))
2995 coerce(0L, C(0))
2996 coerce(0., C(0))
2997 coerce(0j, C(0))
2998
2999 def test_descrdoc(self):
3000 # Testing descriptor doc strings...
3001 def check(descr, what):
3002 self.assertEqual(descr.__doc__, what)
3003 check(file.closed, "True if the file is closed") # getset descriptor
3004 check(file.name, "file name") # member descriptor
3005
3006 def test_doc_descriptor(self):
3007 # Testing __doc__ descriptor...
3008 # SF bug 542984
3009 class DocDescr(object):
3010 def __get__(self, object, otype):
3011 if object:
3012 object = object.__class__.__name__ + ' instance'
3013 if otype:
3014 otype = otype.__name__
3015 return 'object=%s; type=%s' % (object, otype)
3016 class OldClass:
3017 __doc__ = DocDescr()
3018 class NewClass(object):
3019 __doc__ = DocDescr()
3020 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
3021 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3022 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
3023 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3024
3025 def test_set_class(self):
3026 # Testing __class__ assignment...
3027 class C(object): pass
3028 class D(object): pass
3029 class E(object): pass
3030 class F(D, E): pass
3031 for cls in C, D, E, F:
3032 for cls2 in C, D, E, F:
3033 x = cls()
3034 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003035 self.assertTrue(x.__class__ is cls2)
Georg Brandl48545522008-02-02 10:12:36 +00003036 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003037 self.assertTrue(x.__class__ is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003038 def cant(x, C):
3039 try:
3040 x.__class__ = C
3041 except TypeError:
3042 pass
3043 else:
3044 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
3045 try:
3046 delattr(x, "__class__")
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003047 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003048 pass
3049 else:
3050 self.fail("shouldn't allow del %r.__class__" % x)
3051 cant(C(), list)
3052 cant(list(), C)
3053 cant(C(), 1)
3054 cant(C(), object)
3055 cant(object(), list)
3056 cant(list(), object)
3057 class Int(int): __slots__ = []
3058 cant(2, Int)
3059 cant(Int(), int)
3060 cant(True, int)
3061 cant(2, bool)
3062 o = object()
3063 cant(o, type(1))
3064 cant(o, type(None))
3065 del o
3066 class G(object):
3067 __slots__ = ["a", "b"]
3068 class H(object):
3069 __slots__ = ["b", "a"]
3070 try:
3071 unicode
3072 except NameError:
3073 class I(object):
3074 __slots__ = ["a", "b"]
3075 else:
3076 class I(object):
3077 __slots__ = [unicode("a"), unicode("b")]
3078 class J(object):
3079 __slots__ = ["c", "b"]
3080 class K(object):
3081 __slots__ = ["a", "b", "d"]
3082 class L(H):
3083 __slots__ = ["e"]
3084 class M(I):
3085 __slots__ = ["e"]
3086 class N(J):
3087 __slots__ = ["__weakref__"]
3088 class P(J):
3089 __slots__ = ["__dict__"]
3090 class Q(J):
3091 pass
3092 class R(J):
3093 __slots__ = ["__dict__", "__weakref__"]
3094
3095 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
3096 x = cls()
3097 x.a = 1
3098 x.__class__ = cls2
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003099 self.assertTrue(x.__class__ is cls2,
Georg Brandl48545522008-02-02 10:12:36 +00003100 "assigning %r as __class__ for %r silently failed" % (cls2, x))
3101 self.assertEqual(x.a, 1)
3102 x.__class__ = cls
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003103 self.assertTrue(x.__class__ is cls,
Georg Brandl48545522008-02-02 10:12:36 +00003104 "assigning %r as __class__ for %r silently failed" % (cls, x))
3105 self.assertEqual(x.a, 1)
3106 for cls in G, J, K, L, M, N, P, R, list, Int:
3107 for cls2 in G, J, K, L, M, N, P, R, list, Int:
3108 if cls is cls2:
3109 continue
3110 cant(cls(), cls2)
3111
Benjamin Peterson5083dc52009-04-25 00:41:22 +00003112 # Issue5283: when __class__ changes in __del__, the wrong
3113 # type gets DECREF'd.
3114 class O(object):
3115 pass
3116 class A(object):
3117 def __del__(self):
3118 self.__class__ = O
3119 l = [A() for x in range(100)]
3120 del l
3121
Georg Brandl48545522008-02-02 10:12:36 +00003122 def test_set_dict(self):
3123 # Testing __dict__ assignment...
3124 class C(object): pass
3125 a = C()
3126 a.__dict__ = {'b': 1}
3127 self.assertEqual(a.b, 1)
3128 def cant(x, dict):
3129 try:
3130 x.__dict__ = dict
3131 except (AttributeError, TypeError):
3132 pass
3133 else:
3134 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
3135 cant(a, None)
3136 cant(a, [])
3137 cant(a, 1)
3138 del a.__dict__ # Deleting __dict__ is allowed
3139
3140 class Base(object):
3141 pass
3142 def verify_dict_readonly(x):
3143 """
3144 x has to be an instance of a class inheriting from Base.
3145 """
3146 cant(x, {})
3147 try:
3148 del x.__dict__
3149 except (AttributeError, TypeError):
3150 pass
3151 else:
3152 self.fail("shouldn't allow del %r.__dict__" % x)
3153 dict_descr = Base.__dict__["__dict__"]
3154 try:
3155 dict_descr.__set__(x, {})
3156 except (AttributeError, TypeError):
3157 pass
3158 else:
3159 self.fail("dict_descr allowed access to %r's dict" % x)
3160
3161 # Classes don't allow __dict__ assignment and have readonly dicts
3162 class Meta1(type, Base):
3163 pass
3164 class Meta2(Base, type):
3165 pass
3166 class D(object):
3167 __metaclass__ = Meta1
3168 class E(object):
3169 __metaclass__ = Meta2
3170 for cls in C, D, E:
3171 verify_dict_readonly(cls)
3172 class_dict = cls.__dict__
3173 try:
3174 class_dict["spam"] = "eggs"
3175 except TypeError:
3176 pass
3177 else:
3178 self.fail("%r's __dict__ can be modified" % cls)
3179
3180 # Modules also disallow __dict__ assignment
3181 class Module1(types.ModuleType, Base):
3182 pass
3183 class Module2(Base, types.ModuleType):
3184 pass
3185 for ModuleType in Module1, Module2:
3186 mod = ModuleType("spam")
3187 verify_dict_readonly(mod)
3188 mod.__dict__["spam"] = "eggs"
3189
3190 # Exception's __dict__ can be replaced, but not deleted
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003191 # (at least not any more than regular exception's __dict__ can
3192 # be deleted; on CPython it is not the case, whereas on PyPy they
3193 # can, just like any other new-style instance's __dict__.)
3194 def can_delete_dict(e):
3195 try:
3196 del e.__dict__
3197 except (TypeError, AttributeError):
3198 return False
3199 else:
3200 return True
Georg Brandl48545522008-02-02 10:12:36 +00003201 class Exception1(Exception, Base):
3202 pass
3203 class Exception2(Base, Exception):
3204 pass
3205 for ExceptionType in Exception, Exception1, Exception2:
3206 e = ExceptionType()
3207 e.__dict__ = {"a": 1}
3208 self.assertEqual(e.a, 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003209 self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
Georg Brandl48545522008-02-02 10:12:36 +00003210
3211 def test_pickles(self):
3212 # Testing pickling and copying new-style classes and objects...
3213 import pickle, cPickle
3214
3215 def sorteditems(d):
3216 L = d.items()
3217 L.sort()
3218 return L
3219
3220 global C
3221 class C(object):
3222 def __init__(self, a, b):
3223 super(C, self).__init__()
3224 self.a = a
3225 self.b = b
3226 def __repr__(self):
3227 return "C(%r, %r)" % (self.a, self.b)
3228
3229 global C1
3230 class C1(list):
3231 def __new__(cls, a, b):
3232 return super(C1, cls).__new__(cls)
3233 def __getnewargs__(self):
3234 return (self.a, self.b)
3235 def __init__(self, a, b):
3236 self.a = a
3237 self.b = b
3238 def __repr__(self):
3239 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3240
3241 global C2
3242 class C2(int):
3243 def __new__(cls, a, b, val=0):
3244 return super(C2, cls).__new__(cls, val)
3245 def __getnewargs__(self):
3246 return (self.a, self.b, int(self))
3247 def __init__(self, a, b, val=0):
3248 self.a = a
3249 self.b = b
3250 def __repr__(self):
3251 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3252
3253 global C3
3254 class C3(object):
3255 def __init__(self, foo):
3256 self.foo = foo
3257 def __getstate__(self):
3258 return self.foo
3259 def __setstate__(self, foo):
3260 self.foo = foo
3261
3262 global C4classic, C4
3263 class C4classic: # classic
3264 pass
3265 class C4(C4classic, object): # mixed inheritance
3266 pass
3267
3268 for p in pickle, cPickle:
3269 for bin in 0, 1:
3270 for cls in C, C1, C2:
3271 s = p.dumps(cls, bin)
3272 cls2 = p.loads(s)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003273 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003274
3275 a = C1(1, 2); a.append(42); a.append(24)
3276 b = C2("hello", "world", 42)
3277 s = p.dumps((a, b), bin)
3278 x, y = p.loads(s)
3279 self.assertEqual(x.__class__, a.__class__)
3280 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3281 self.assertEqual(y.__class__, b.__class__)
3282 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3283 self.assertEqual(repr(x), repr(a))
3284 self.assertEqual(repr(y), repr(b))
3285 # Test for __getstate__ and __setstate__ on new style class
3286 u = C3(42)
3287 s = p.dumps(u, bin)
3288 v = p.loads(s)
3289 self.assertEqual(u.__class__, v.__class__)
3290 self.assertEqual(u.foo, v.foo)
3291 # Test for picklability of hybrid class
3292 u = C4()
3293 u.foo = 42
3294 s = p.dumps(u, bin)
3295 v = p.loads(s)
3296 self.assertEqual(u.__class__, v.__class__)
3297 self.assertEqual(u.foo, v.foo)
3298
3299 # Testing copy.deepcopy()
3300 import copy
3301 for cls in C, C1, C2:
3302 cls2 = copy.deepcopy(cls)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003303 self.assertTrue(cls2 is cls)
Georg Brandl48545522008-02-02 10:12:36 +00003304
3305 a = C1(1, 2); a.append(42); a.append(24)
3306 b = C2("hello", "world", 42)
3307 x, y = copy.deepcopy((a, b))
3308 self.assertEqual(x.__class__, a.__class__)
3309 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
3310 self.assertEqual(y.__class__, b.__class__)
3311 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
3312 self.assertEqual(repr(x), repr(a))
3313 self.assertEqual(repr(y), repr(b))
3314
3315 def test_pickle_slots(self):
3316 # Testing pickling of classes with __slots__ ...
3317 import pickle, cPickle
3318 # Pickling of classes with __slots__ but without __getstate__ should fail
3319 global B, C, D, E
3320 class B(object):
3321 pass
3322 for base in [object, B]:
3323 class C(base):
3324 __slots__ = ['a']
3325 class D(C):
3326 pass
3327 try:
3328 pickle.dumps(C())
3329 except TypeError:
3330 pass
3331 else:
3332 self.fail("should fail: pickle C instance - %s" % base)
3333 try:
3334 cPickle.dumps(C())
3335 except TypeError:
3336 pass
3337 else:
3338 self.fail("should fail: cPickle C instance - %s" % base)
3339 try:
3340 pickle.dumps(C())
3341 except TypeError:
3342 pass
3343 else:
3344 self.fail("should fail: pickle D instance - %s" % base)
3345 try:
3346 cPickle.dumps(D())
3347 except TypeError:
3348 pass
3349 else:
3350 self.fail("should fail: cPickle D instance - %s" % base)
3351 # Give C a nice generic __getstate__ and __setstate__
3352 class C(base):
3353 __slots__ = ['a']
3354 def __getstate__(self):
3355 try:
3356 d = self.__dict__.copy()
3357 except AttributeError:
3358 d = {}
3359 for cls in self.__class__.__mro__:
3360 for sn in cls.__dict__.get('__slots__', ()):
3361 try:
3362 d[sn] = getattr(self, sn)
3363 except AttributeError:
3364 pass
3365 return d
3366 def __setstate__(self, d):
3367 for k, v in d.items():
3368 setattr(self, k, v)
3369 class D(C):
3370 pass
3371 # Now it should work
3372 x = C()
3373 y = pickle.loads(pickle.dumps(x))
3374 self.assertEqual(hasattr(y, 'a'), 0)
3375 y = cPickle.loads(cPickle.dumps(x))
3376 self.assertEqual(hasattr(y, 'a'), 0)
3377 x.a = 42
3378 y = pickle.loads(pickle.dumps(x))
3379 self.assertEqual(y.a, 42)
3380 y = cPickle.loads(cPickle.dumps(x))
3381 self.assertEqual(y.a, 42)
3382 x = D()
3383 x.a = 42
3384 x.b = 100
3385 y = pickle.loads(pickle.dumps(x))
3386 self.assertEqual(y.a + y.b, 142)
3387 y = cPickle.loads(cPickle.dumps(x))
3388 self.assertEqual(y.a + y.b, 142)
3389 # A subclass that adds a slot should also work
3390 class E(C):
3391 __slots__ = ['b']
3392 x = E()
3393 x.a = 42
3394 x.b = "foo"
3395 y = pickle.loads(pickle.dumps(x))
3396 self.assertEqual(y.a, x.a)
3397 self.assertEqual(y.b, x.b)
3398 y = cPickle.loads(cPickle.dumps(x))
3399 self.assertEqual(y.a, x.a)
3400 self.assertEqual(y.b, x.b)
3401
3402 def test_binary_operator_override(self):
3403 # Testing overrides of binary operations...
3404 class I(int):
3405 def __repr__(self):
3406 return "I(%r)" % int(self)
3407 def __add__(self, other):
3408 return I(int(self) + int(other))
3409 __radd__ = __add__
3410 def __pow__(self, other, mod=None):
3411 if mod is None:
3412 return I(pow(int(self), int(other)))
3413 else:
3414 return I(pow(int(self), int(other), int(mod)))
3415 def __rpow__(self, other, mod=None):
3416 if mod is None:
3417 return I(pow(int(other), int(self), mod))
3418 else:
3419 return I(pow(int(other), int(self), int(mod)))
3420
3421 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3422 self.assertEqual(repr(I(1) + 2), "I(3)")
3423 self.assertEqual(repr(1 + I(2)), "I(3)")
3424 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3425 self.assertEqual(repr(2 ** I(3)), "I(8)")
3426 self.assertEqual(repr(I(2) ** 3), "I(8)")
3427 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3428 class S(str):
3429 def __eq__(self, other):
3430 return self.lower() == other.lower()
Nick Coghlan48361f52008-08-11 15:45:58 +00003431 __hash__ = None # Silence Py3k warning
Georg Brandl48545522008-02-02 10:12:36 +00003432
3433 def test_subclass_propagation(self):
3434 # Testing propagation of slot functions to subclasses...
3435 class A(object):
3436 pass
3437 class B(A):
3438 pass
3439 class C(A):
3440 pass
3441 class D(B, C):
3442 pass
3443 d = D()
3444 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3445 A.__hash__ = lambda self: 42
3446 self.assertEqual(hash(d), 42)
3447 C.__hash__ = lambda self: 314
3448 self.assertEqual(hash(d), 314)
3449 B.__hash__ = lambda self: 144
3450 self.assertEqual(hash(d), 144)
3451 D.__hash__ = lambda self: 100
3452 self.assertEqual(hash(d), 100)
Nick Coghlan53663a62008-07-15 14:27:37 +00003453 D.__hash__ = None
3454 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003455 del D.__hash__
3456 self.assertEqual(hash(d), 144)
Nick Coghlan53663a62008-07-15 14:27:37 +00003457 B.__hash__ = None
3458 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003459 del B.__hash__
3460 self.assertEqual(hash(d), 314)
Nick Coghlan53663a62008-07-15 14:27:37 +00003461 C.__hash__ = None
3462 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003463 del C.__hash__
3464 self.assertEqual(hash(d), 42)
Nick Coghlan53663a62008-07-15 14:27:37 +00003465 A.__hash__ = None
3466 self.assertRaises(TypeError, hash, d)
Georg Brandl48545522008-02-02 10:12:36 +00003467 del A.__hash__
3468 self.assertEqual(hash(d), orig_hash)
3469 d.foo = 42
3470 d.bar = 42
3471 self.assertEqual(d.foo, 42)
3472 self.assertEqual(d.bar, 42)
3473 def __getattribute__(self, name):
3474 if name == "foo":
3475 return 24
3476 return object.__getattribute__(self, name)
3477 A.__getattribute__ = __getattribute__
3478 self.assertEqual(d.foo, 24)
3479 self.assertEqual(d.bar, 42)
3480 def __getattr__(self, name):
3481 if name in ("spam", "foo", "bar"):
3482 return "hello"
3483 raise AttributeError, name
3484 B.__getattr__ = __getattr__
3485 self.assertEqual(d.spam, "hello")
3486 self.assertEqual(d.foo, 24)
3487 self.assertEqual(d.bar, 42)
3488 del A.__getattribute__
3489 self.assertEqual(d.foo, 42)
3490 del d.foo
3491 self.assertEqual(d.foo, "hello")
3492 self.assertEqual(d.bar, 42)
3493 del B.__getattr__
3494 try:
3495 d.foo
3496 except AttributeError:
3497 pass
3498 else:
3499 self.fail("d.foo should be undefined now")
3500
3501 # Test a nasty bug in recurse_down_subclasses()
Georg Brandl48545522008-02-02 10:12:36 +00003502 class A(object):
3503 pass
3504 class B(A):
3505 pass
3506 del B
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003507 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003508 A.__setitem__ = lambda *a: None # crash
3509
3510 def test_buffer_inheritance(self):
3511 # Testing that buffer interface is inherited ...
3512
3513 import binascii
3514 # SF bug [#470040] ParseTuple t# vs subclasses.
3515
3516 class MyStr(str):
3517 pass
3518 base = 'abc'
3519 m = MyStr(base)
3520 # b2a_hex uses the buffer interface to get its argument's value, via
3521 # PyArg_ParseTuple 't#' code.
3522 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3523
3524 # It's not clear that unicode will continue to support the character
3525 # buffer interface, and this test will fail if that's taken away.
3526 class MyUni(unicode):
3527 pass
3528 base = u'abc'
3529 m = MyUni(base)
3530 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3531
3532 class MyInt(int):
3533 pass
3534 m = MyInt(42)
3535 try:
3536 binascii.b2a_hex(m)
3537 self.fail('subclass of int should not have a buffer interface')
3538 except TypeError:
3539 pass
3540
3541 def test_str_of_str_subclass(self):
3542 # Testing __str__ defined in subclass of str ...
3543 import binascii
3544 import cStringIO
3545
3546 class octetstring(str):
3547 def __str__(self):
3548 return binascii.b2a_hex(self)
3549 def __repr__(self):
3550 return self + " repr"
3551
3552 o = octetstring('A')
3553 self.assertEqual(type(o), octetstring)
3554 self.assertEqual(type(str(o)), str)
3555 self.assertEqual(type(repr(o)), str)
3556 self.assertEqual(ord(o), 0x41)
3557 self.assertEqual(str(o), '41')
3558 self.assertEqual(repr(o), 'A repr')
3559 self.assertEqual(o.__str__(), '41')
3560 self.assertEqual(o.__repr__(), 'A repr')
3561
3562 capture = cStringIO.StringIO()
3563 # Calling str() or not exercises different internal paths.
3564 print >> capture, o
3565 print >> capture, str(o)
3566 self.assertEqual(capture.getvalue(), '41\n41\n')
3567 capture.close()
3568
3569 def test_keyword_arguments(self):
3570 # Testing keyword arguments to __init__, __call__...
3571 def f(a): return a
3572 self.assertEqual(f.__call__(a=42), 42)
3573 a = []
3574 list.__init__(a, sequence=[0, 1, 2])
3575 self.assertEqual(a, [0, 1, 2])
3576
3577 def test_recursive_call(self):
3578 # Testing recursive __call__() by setting to instance of class...
3579 class A(object):
3580 pass
3581
3582 A.__call__ = A()
3583 try:
3584 A()()
3585 except RuntimeError:
3586 pass
3587 else:
3588 self.fail("Recursion limit should have been reached for __call__()")
3589
3590 def test_delete_hook(self):
3591 # Testing __del__ hook...
3592 log = []
3593 class C(object):
3594 def __del__(self):
3595 log.append(1)
3596 c = C()
3597 self.assertEqual(log, [])
3598 del c
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003599 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003600 self.assertEqual(log, [1])
3601
3602 class D(object): pass
3603 d = D()
3604 try: del d[0]
3605 except TypeError: pass
3606 else: self.fail("invalid del() didn't raise TypeError")
3607
3608 def test_hash_inheritance(self):
3609 # Testing hash of mutable subclasses...
3610
3611 class mydict(dict):
3612 pass
3613 d = mydict()
3614 try:
3615 hash(d)
3616 except TypeError:
3617 pass
3618 else:
3619 self.fail("hash() of dict subclass should fail")
3620
3621 class mylist(list):
3622 pass
3623 d = mylist()
3624 try:
3625 hash(d)
3626 except TypeError:
3627 pass
3628 else:
3629 self.fail("hash() of list subclass should fail")
3630
3631 def test_str_operations(self):
3632 try: 'a' + 5
3633 except TypeError: pass
3634 else: self.fail("'' + 5 doesn't raise TypeError")
3635
3636 try: ''.split('')
3637 except ValueError: pass
3638 else: self.fail("''.split('') doesn't raise ValueError")
3639
3640 try: ''.join([0])
3641 except TypeError: pass
3642 else: self.fail("''.join([0]) doesn't raise TypeError")
3643
3644 try: ''.rindex('5')
3645 except ValueError: pass
3646 else: self.fail("''.rindex('5') doesn't raise ValueError")
3647
3648 try: '%(n)s' % None
3649 except TypeError: pass
3650 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3651
3652 try: '%(n' % {}
3653 except ValueError: pass
3654 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3655
3656 try: '%*s' % ('abc')
3657 except TypeError: pass
3658 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3659
3660 try: '%*.*s' % ('abc', 5)
3661 except TypeError: pass
3662 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3663
3664 try: '%s' % (1, 2)
3665 except TypeError: pass
3666 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3667
3668 try: '%' % None
3669 except ValueError: pass
3670 else: self.fail("'%' % None doesn't raise ValueError")
3671
3672 self.assertEqual('534253'.isdigit(), 1)
3673 self.assertEqual('534253x'.isdigit(), 0)
3674 self.assertEqual('%c' % 5, '\x05')
3675 self.assertEqual('%c' % '5', '5')
3676
3677 def test_deepcopy_recursive(self):
3678 # Testing deepcopy of recursive objects...
3679 class Node:
3680 pass
3681 a = Node()
3682 b = Node()
3683 a.b = b
3684 b.a = a
3685 z = deepcopy(a) # This blew up before
3686
3687 def test_unintialized_modules(self):
3688 # Testing uninitialized module objects...
3689 from types import ModuleType as M
3690 m = M.__new__(M)
3691 str(m)
3692 self.assertEqual(hasattr(m, "__name__"), 0)
3693 self.assertEqual(hasattr(m, "__file__"), 0)
3694 self.assertEqual(hasattr(m, "foo"), 0)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003695 self.assertFalse(m.__dict__) # None or {} are both reasonable answers
Georg Brandl48545522008-02-02 10:12:36 +00003696 m.foo = 1
3697 self.assertEqual(m.__dict__, {"foo": 1})
3698
3699 def test_funny_new(self):
3700 # Testing __new__ returning something unexpected...
3701 class C(object):
3702 def __new__(cls, arg):
3703 if isinstance(arg, str): return [1, 2, 3]
3704 elif isinstance(arg, int): return object.__new__(D)
3705 else: return object.__new__(cls)
3706 class D(C):
3707 def __init__(self, arg):
3708 self.foo = arg
3709 self.assertEqual(C("1"), [1, 2, 3])
3710 self.assertEqual(D("1"), [1, 2, 3])
3711 d = D(None)
3712 self.assertEqual(d.foo, None)
3713 d = C(1)
3714 self.assertEqual(isinstance(d, D), True)
3715 self.assertEqual(d.foo, 1)
3716 d = D(1)
3717 self.assertEqual(isinstance(d, D), True)
3718 self.assertEqual(d.foo, 1)
3719
3720 def test_imul_bug(self):
3721 # Testing for __imul__ problems...
3722 # SF bug 544647
3723 class C(object):
3724 def __imul__(self, other):
3725 return (self, other)
3726 x = C()
3727 y = x
3728 y *= 1.0
3729 self.assertEqual(y, (x, 1.0))
3730 y = x
3731 y *= 2
3732 self.assertEqual(y, (x, 2))
3733 y = x
3734 y *= 3L
3735 self.assertEqual(y, (x, 3L))
3736 y = x
3737 y *= 1L<<100
3738 self.assertEqual(y, (x, 1L<<100))
3739 y = x
3740 y *= None
3741 self.assertEqual(y, (x, None))
3742 y = x
3743 y *= "foo"
3744 self.assertEqual(y, (x, "foo"))
3745
3746 def test_copy_setstate(self):
3747 # Testing that copy.*copy() correctly uses __setstate__...
3748 import copy
3749 class C(object):
3750 def __init__(self, foo=None):
3751 self.foo = foo
3752 self.__foo = foo
3753 def setfoo(self, foo=None):
3754 self.foo = foo
3755 def getfoo(self):
3756 return self.__foo
3757 def __getstate__(self):
3758 return [self.foo]
3759 def __setstate__(self_, lst):
3760 self.assertEqual(len(lst), 1)
3761 self_.__foo = self_.foo = lst[0]
3762 a = C(42)
3763 a.setfoo(24)
3764 self.assertEqual(a.foo, 24)
3765 self.assertEqual(a.getfoo(), 42)
3766 b = copy.copy(a)
3767 self.assertEqual(b.foo, 24)
3768 self.assertEqual(b.getfoo(), 24)
3769 b = copy.deepcopy(a)
3770 self.assertEqual(b.foo, 24)
3771 self.assertEqual(b.getfoo(), 24)
3772
3773 def test_slices(self):
3774 # Testing cases with slices and overridden __getitem__ ...
3775
3776 # Strings
3777 self.assertEqual("hello"[:4], "hell")
3778 self.assertEqual("hello"[slice(4)], "hell")
3779 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3780 class S(str):
3781 def __getitem__(self, x):
3782 return str.__getitem__(self, x)
3783 self.assertEqual(S("hello")[:4], "hell")
3784 self.assertEqual(S("hello")[slice(4)], "hell")
3785 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3786 # Tuples
3787 self.assertEqual((1,2,3)[:2], (1,2))
3788 self.assertEqual((1,2,3)[slice(2)], (1,2))
3789 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3790 class T(tuple):
3791 def __getitem__(self, x):
3792 return tuple.__getitem__(self, x)
3793 self.assertEqual(T((1,2,3))[:2], (1,2))
3794 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3795 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3796 # Lists
3797 self.assertEqual([1,2,3][:2], [1,2])
3798 self.assertEqual([1,2,3][slice(2)], [1,2])
3799 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3800 class L(list):
3801 def __getitem__(self, x):
3802 return list.__getitem__(self, x)
3803 self.assertEqual(L([1,2,3])[:2], [1,2])
3804 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3805 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3806 # Now do lists and __setitem__
3807 a = L([1,2,3])
3808 a[slice(1, 3)] = [3,2]
3809 self.assertEqual(a, [1,3,2])
3810 a[slice(0, 2, 1)] = [3,1]
3811 self.assertEqual(a, [3,1,2])
3812 a.__setitem__(slice(1, 3), [2,1])
3813 self.assertEqual(a, [3,2,1])
3814 a.__setitem__(slice(0, 2, 1), [2,3])
3815 self.assertEqual(a, [2,3,1])
3816
3817 def test_subtype_resurrection(self):
3818 # Testing resurrection of new-style instance...
3819
3820 class C(object):
3821 container = []
3822
3823 def __del__(self):
3824 # resurrect the instance
3825 C.container.append(self)
3826
3827 c = C()
3828 c.attr = 42
3829
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003830 # The most interesting thing here is whether this blows up, due to
3831 # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
3832 # bug).
Georg Brandl48545522008-02-02 10:12:36 +00003833 del c
3834
3835 # If that didn't blow up, it's also interesting to see whether clearing
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003836 # the last container slot works: that will attempt to delete c again,
3837 # which will cause c to get appended back to the container again
3838 # "during" the del. (On non-CPython implementations, however, __del__
3839 # is typically not called again.)
3840 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00003841 self.assertEqual(len(C.container), 1)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003842 del C.container[-1]
3843 if test_support.check_impl_detail():
3844 test_support.gc_collect()
3845 self.assertEqual(len(C.container), 1)
3846 self.assertEqual(C.container[-1].attr, 42)
Georg Brandl48545522008-02-02 10:12:36 +00003847
3848 # Make c mortal again, so that the test framework with -l doesn't report
3849 # it as a leak.
3850 del C.__del__
3851
3852 def test_slots_trash(self):
3853 # Testing slot trash...
3854 # Deallocating deeply nested slotted trash caused stack overflows
3855 class trash(object):
3856 __slots__ = ['x']
3857 def __init__(self, x):
3858 self.x = x
3859 o = None
3860 for i in xrange(50000):
3861 o = trash(o)
3862 del o
3863
3864 def test_slots_multiple_inheritance(self):
3865 # SF bug 575229, multiple inheritance w/ slots dumps core
3866 class A(object):
3867 __slots__=()
3868 class B(object):
3869 pass
3870 class C(A,B) :
3871 __slots__=()
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003872 if test_support.check_impl_detail():
3873 self.assertEqual(C.__basicsize__, B.__basicsize__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00003874 self.assertTrue(hasattr(C, '__dict__'))
3875 self.assertTrue(hasattr(C, '__weakref__'))
Georg Brandl48545522008-02-02 10:12:36 +00003876 C().x = 2
3877
3878 def test_rmul(self):
3879 # Testing correct invocation of __rmul__...
3880 # SF patch 592646
3881 class C(object):
3882 def __mul__(self, other):
3883 return "mul"
3884 def __rmul__(self, other):
3885 return "rmul"
3886 a = C()
3887 self.assertEqual(a*2, "mul")
3888 self.assertEqual(a*2.2, "mul")
3889 self.assertEqual(2*a, "rmul")
3890 self.assertEqual(2.2*a, "rmul")
3891
3892 def test_ipow(self):
3893 # Testing correct invocation of __ipow__...
3894 # [SF bug 620179]
3895 class C(object):
3896 def __ipow__(self, other):
3897 pass
3898 a = C()
3899 a **= 2
3900
3901 def test_mutable_bases(self):
3902 # Testing mutable bases...
3903
3904 # stuff that should work:
3905 class C(object):
3906 pass
3907 class C2(object):
3908 def __getattribute__(self, attr):
3909 if attr == 'a':
3910 return 2
3911 else:
3912 return super(C2, self).__getattribute__(attr)
3913 def meth(self):
3914 return 1
3915 class D(C):
3916 pass
3917 class E(D):
3918 pass
3919 d = D()
3920 e = E()
3921 D.__bases__ = (C,)
3922 D.__bases__ = (C2,)
3923 self.assertEqual(d.meth(), 1)
3924 self.assertEqual(e.meth(), 1)
3925 self.assertEqual(d.a, 2)
3926 self.assertEqual(e.a, 2)
3927 self.assertEqual(C2.__subclasses__(), [D])
3928
Georg Brandl48545522008-02-02 10:12:36 +00003929 try:
3930 del D.__bases__
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00003931 except (TypeError, AttributeError):
Georg Brandl48545522008-02-02 10:12:36 +00003932 pass
3933 else:
3934 self.fail("shouldn't be able to delete .__bases__")
3935
3936 try:
3937 D.__bases__ = ()
3938 except TypeError, msg:
3939 if str(msg) == "a new-style class can't have only classic bases":
3940 self.fail("wrong error message for .__bases__ = ()")
3941 else:
3942 self.fail("shouldn't be able to set .__bases__ to ()")
3943
3944 try:
3945 D.__bases__ = (D,)
3946 except TypeError:
3947 pass
3948 else:
3949 # actually, we'll have crashed by here...
3950 self.fail("shouldn't be able to create inheritance cycles")
3951
3952 try:
3953 D.__bases__ = (C, C)
3954 except TypeError:
3955 pass
3956 else:
3957 self.fail("didn't detect repeated base classes")
3958
3959 try:
3960 D.__bases__ = (E,)
3961 except TypeError:
3962 pass
3963 else:
3964 self.fail("shouldn't be able to create inheritance cycles")
3965
3966 # let's throw a classic class into the mix:
3967 class Classic:
3968 def meth2(self):
3969 return 3
3970
3971 D.__bases__ = (C, Classic)
3972
3973 self.assertEqual(d.meth2(), 3)
3974 self.assertEqual(e.meth2(), 3)
3975 try:
3976 d.a
3977 except AttributeError:
3978 pass
3979 else:
3980 self.fail("attribute should have vanished")
3981
3982 try:
3983 D.__bases__ = (Classic,)
3984 except TypeError:
3985 pass
3986 else:
3987 self.fail("new-style class must have a new-style base")
3988
Benjamin Petersond4d400c2009-04-18 20:12:47 +00003989 def test_builtin_bases(self):
3990 # Make sure all the builtin types can have their base queried without
3991 # segfaulting. See issue #5787.
3992 builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
3993 if isinstance(tp, type)]
3994 for tp in builtin_types:
3995 object.__getattribute__(tp, "__bases__")
3996 if tp is not object:
3997 self.assertEqual(len(tp.__bases__), 1, tp)
3998
Benjamin Petersonaccb3d02009-04-18 21:03:10 +00003999 class L(list):
4000 pass
4001
4002 class C(object):
4003 pass
4004
4005 class D(C):
4006 pass
4007
4008 try:
4009 L.__bases__ = (dict,)
4010 except TypeError:
4011 pass
4012 else:
4013 self.fail("shouldn't turn list subclass into dict subclass")
4014
4015 try:
4016 list.__bases__ = (dict,)
4017 except TypeError:
4018 pass
4019 else:
4020 self.fail("shouldn't be able to assign to list.__bases__")
4021
4022 try:
4023 D.__bases__ = (C, list)
4024 except TypeError:
4025 pass
4026 else:
4027 assert 0, "best_base calculation found wanting"
4028
Benjamin Petersond4d400c2009-04-18 20:12:47 +00004029
Georg Brandl48545522008-02-02 10:12:36 +00004030 def test_mutable_bases_with_failing_mro(self):
4031 # Testing mutable bases with failing mro...
4032 class WorkOnce(type):
4033 def __new__(self, name, bases, ns):
4034 self.flag = 0
4035 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
4036 def mro(self):
4037 if self.flag > 0:
4038 raise RuntimeError, "bozo"
4039 else:
4040 self.flag += 1
4041 return type.mro(self)
4042
4043 class WorkAlways(type):
4044 def mro(self):
4045 # this is here to make sure that .mro()s aren't called
4046 # with an exception set (which was possible at one point).
4047 # An error message will be printed in a debug build.
4048 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004049 return type.mro(self)
4050
Georg Brandl48545522008-02-02 10:12:36 +00004051 class C(object):
4052 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004053
Georg Brandl48545522008-02-02 10:12:36 +00004054 class C2(object):
4055 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004056
Georg Brandl48545522008-02-02 10:12:36 +00004057 class D(C):
4058 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004059
Georg Brandl48545522008-02-02 10:12:36 +00004060 class E(D):
4061 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004062
Georg Brandl48545522008-02-02 10:12:36 +00004063 class F(D):
4064 __metaclass__ = WorkOnce
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004065
Georg Brandl48545522008-02-02 10:12:36 +00004066 class G(D):
4067 __metaclass__ = WorkAlways
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004068
Georg Brandl48545522008-02-02 10:12:36 +00004069 # Immediate subclasses have their mro's adjusted in alphabetical
4070 # order, so E's will get adjusted before adjusting F's fails. We
4071 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004072
Georg Brandl48545522008-02-02 10:12:36 +00004073 E_mro_before = E.__mro__
4074 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00004075
Armin Rigofd163f92005-12-29 15:59:19 +00004076 try:
Georg Brandl48545522008-02-02 10:12:36 +00004077 D.__bases__ = (C2,)
4078 except RuntimeError:
4079 self.assertEqual(E.__mro__, E_mro_before)
4080 self.assertEqual(D.__mro__, D_mro_before)
4081 else:
4082 self.fail("exception not propagated")
4083
4084 def test_mutable_bases_catch_mro_conflict(self):
4085 # Testing mutable bases catch mro conflict...
4086 class A(object):
4087 pass
4088
4089 class B(object):
4090 pass
4091
4092 class C(A, B):
4093 pass
4094
4095 class D(A, B):
4096 pass
4097
4098 class E(C, D):
4099 pass
4100
4101 try:
4102 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00004103 except TypeError:
4104 pass
4105 else:
Georg Brandl48545522008-02-02 10:12:36 +00004106 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00004107
Georg Brandl48545522008-02-02 10:12:36 +00004108 def test_mutable_names(self):
4109 # Testing mutable names...
4110 class C(object):
4111 pass
4112
4113 # C.__module__ could be 'test_descr' or '__main__'
4114 mod = C.__module__
4115
4116 C.__name__ = 'D'
4117 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
4118
4119 C.__name__ = 'D.E'
4120 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
4121
4122 def test_subclass_right_op(self):
4123 # Testing correct dispatch of subclass overloading __r<op>__...
4124
4125 # This code tests various cases where right-dispatch of a subclass
4126 # should be preferred over left-dispatch of a base class.
4127
4128 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4129
4130 class B(int):
4131 def __floordiv__(self, other):
4132 return "B.__floordiv__"
4133 def __rfloordiv__(self, other):
4134 return "B.__rfloordiv__"
4135
4136 self.assertEqual(B(1) // 1, "B.__floordiv__")
4137 self.assertEqual(1 // B(1), "B.__rfloordiv__")
4138
4139 # Case 2: subclass of object; this is just the baseline for case 3
4140
4141 class C(object):
4142 def __floordiv__(self, other):
4143 return "C.__floordiv__"
4144 def __rfloordiv__(self, other):
4145 return "C.__rfloordiv__"
4146
4147 self.assertEqual(C() // 1, "C.__floordiv__")
4148 self.assertEqual(1 // C(), "C.__rfloordiv__")
4149
4150 # Case 3: subclass of new-style class; here it gets interesting
4151
4152 class D(C):
4153 def __floordiv__(self, other):
4154 return "D.__floordiv__"
4155 def __rfloordiv__(self, other):
4156 return "D.__rfloordiv__"
4157
4158 self.assertEqual(D() // C(), "D.__floordiv__")
4159 self.assertEqual(C() // D(), "D.__rfloordiv__")
4160
4161 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4162
4163 class E(C):
4164 pass
4165
4166 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
4167
4168 self.assertEqual(E() // 1, "C.__floordiv__")
4169 self.assertEqual(1 // E(), "C.__rfloordiv__")
4170 self.assertEqual(E() // C(), "C.__floordiv__")
4171 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
4172
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004173 @test_support.impl_detail("testing an internal kind of method object")
Georg Brandl48545522008-02-02 10:12:36 +00004174 def test_meth_class_get(self):
4175 # Testing __get__ method of METH_CLASS C methods...
4176 # Full coverage of descrobject.c::classmethod_get()
4177
4178 # Baseline
4179 arg = [1, 2, 3]
4180 res = {1: None, 2: None, 3: None}
4181 self.assertEqual(dict.fromkeys(arg), res)
4182 self.assertEqual({}.fromkeys(arg), res)
4183
4184 # Now get the descriptor
4185 descr = dict.__dict__["fromkeys"]
4186
4187 # More baseline using the descriptor directly
4188 self.assertEqual(descr.__get__(None, dict)(arg), res)
4189 self.assertEqual(descr.__get__({})(arg), res)
4190
4191 # Now check various error cases
4192 try:
4193 descr.__get__(None, None)
4194 except TypeError:
4195 pass
4196 else:
4197 self.fail("shouldn't have allowed descr.__get__(None, None)")
4198 try:
4199 descr.__get__(42)
4200 except TypeError:
4201 pass
4202 else:
4203 self.fail("shouldn't have allowed descr.__get__(42)")
4204 try:
4205 descr.__get__(None, 42)
4206 except TypeError:
4207 pass
4208 else:
4209 self.fail("shouldn't have allowed descr.__get__(None, 42)")
4210 try:
4211 descr.__get__(None, int)
4212 except TypeError:
4213 pass
4214 else:
4215 self.fail("shouldn't have allowed descr.__get__(None, int)")
4216
4217 def test_isinst_isclass(self):
4218 # Testing proxy isinstance() and isclass()...
4219 class Proxy(object):
4220 def __init__(self, obj):
4221 self.__obj = obj
4222 def __getattribute__(self, name):
4223 if name.startswith("_Proxy__"):
4224 return object.__getattribute__(self, name)
4225 else:
4226 return getattr(self.__obj, name)
4227 # Test with a classic class
4228 class C:
4229 pass
4230 a = C()
4231 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004232 self.assertIsInstance(a, C) # Baseline
4233 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004234 # Test with a classic subclass
4235 class D(C):
4236 pass
4237 a = D()
4238 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004239 self.assertIsInstance(a, C) # Baseline
4240 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004241 # Test with a new-style class
4242 class C(object):
4243 pass
4244 a = C()
4245 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004246 self.assertIsInstance(a, C) # Baseline
4247 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004248 # Test with a new-style subclass
4249 class D(C):
4250 pass
4251 a = D()
4252 pa = Proxy(a)
Ezio Melottib0f5adc2010-01-24 16:58:36 +00004253 self.assertIsInstance(a, C) # Baseline
4254 self.assertIsInstance(pa, C) # Test
Georg Brandl48545522008-02-02 10:12:36 +00004255
4256 def test_proxy_super(self):
4257 # Testing super() for a proxy object...
4258 class Proxy(object):
4259 def __init__(self, obj):
4260 self.__obj = obj
4261 def __getattribute__(self, name):
4262 if name.startswith("_Proxy__"):
4263 return object.__getattribute__(self, name)
4264 else:
4265 return getattr(self.__obj, name)
4266
4267 class B(object):
4268 def f(self):
4269 return "B.f"
4270
4271 class C(B):
4272 def f(self):
4273 return super(C, self).f() + "->C.f"
4274
4275 obj = C()
4276 p = Proxy(obj)
4277 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
4278
4279 def test_carloverre(self):
4280 # Testing prohibition of Carlo Verre's hack...
4281 try:
4282 object.__setattr__(str, "foo", 42)
4283 except TypeError:
4284 pass
4285 else:
Ezio Melottic2077b02011-03-16 12:34:31 +02004286 self.fail("Carlo Verre __setattr__ succeeded!")
Georg Brandl48545522008-02-02 10:12:36 +00004287 try:
4288 object.__delattr__(str, "lower")
4289 except TypeError:
4290 pass
4291 else:
4292 self.fail("Carlo Verre __delattr__ succeeded!")
4293
4294 def test_weakref_segfault(self):
4295 # Testing weakref segfault...
4296 # SF 742911
4297 import weakref
4298
4299 class Provoker:
4300 def __init__(self, referrent):
4301 self.ref = weakref.ref(referrent)
4302
4303 def __del__(self):
4304 x = self.ref()
4305
4306 class Oops(object):
4307 pass
4308
4309 o = Oops()
4310 o.whatever = Provoker(o)
4311 del o
4312
4313 def test_wrapper_segfault(self):
4314 # SF 927248: deeply nested wrappers could cause stack overflow
4315 f = lambda:None
4316 for i in xrange(1000000):
4317 f = f.__call__
4318 f = None
4319
4320 def test_file_fault(self):
4321 # Testing sys.stdout is changed in getattr...
Nick Coghlan0447cd62009-10-17 06:33:05 +00004322 test_stdout = sys.stdout
Georg Brandl48545522008-02-02 10:12:36 +00004323 class StdoutGuard:
4324 def __getattr__(self, attr):
4325 sys.stdout = sys.__stdout__
4326 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4327 sys.stdout = StdoutGuard()
4328 try:
4329 print "Oops!"
4330 except RuntimeError:
4331 pass
Nick Coghlan0447cd62009-10-17 06:33:05 +00004332 finally:
4333 sys.stdout = test_stdout
Georg Brandl48545522008-02-02 10:12:36 +00004334
4335 def test_vicious_descriptor_nonsense(self):
4336 # Testing vicious_descriptor_nonsense...
4337
4338 # A potential segfault spotted by Thomas Wouters in mail to
4339 # python-dev 2003-04-17, turned into an example & fixed by Michael
4340 # Hudson just less than four months later...
4341
4342 class Evil(object):
4343 def __hash__(self):
4344 return hash('attr')
4345 def __eq__(self, other):
4346 del C.attr
4347 return 0
4348
4349 class Descr(object):
4350 def __get__(self, ob, type=None):
4351 return 1
4352
4353 class C(object):
4354 attr = Descr()
4355
4356 c = C()
4357 c.__dict__[Evil()] = 0
4358
4359 self.assertEqual(c.attr, 1)
4360 # this makes a crash more likely:
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004361 test_support.gc_collect()
Georg Brandl48545522008-02-02 10:12:36 +00004362 self.assertEqual(hasattr(c, 'attr'), False)
4363
4364 def test_init(self):
4365 # SF 1155938
4366 class Foo(object):
4367 def __init__(self):
4368 return 10
4369 try:
4370 Foo()
4371 except TypeError:
4372 pass
4373 else:
4374 self.fail("did not test __init__() for None return")
4375
4376 def test_method_wrapper(self):
4377 # Testing method-wrapper objects...
4378 # <type 'method-wrapper'> did not support any reflection before 2.5
4379
4380 l = []
4381 self.assertEqual(l.__add__, l.__add__)
4382 self.assertEqual(l.__add__, [].__add__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004383 self.assertTrue(l.__add__ != [5].__add__)
4384 self.assertTrue(l.__add__ != l.__mul__)
4385 self.assertTrue(l.__add__.__name__ == '__add__')
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004386 if hasattr(l.__add__, '__self__'):
4387 # CPython
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004388 self.assertTrue(l.__add__.__self__ is l)
4389 self.assertTrue(l.__add__.__objclass__ is list)
Benjamin Peterson21f6aac2009-03-26 20:17:27 +00004390 else:
4391 # Python implementations where [].__add__ is a normal bound method
Benjamin Peterson5c8da862009-06-30 22:57:08 +00004392 self.assertTrue(l.__add__.im_self is l)
4393 self.assertTrue(l.__add__.im_class is list)
Georg Brandl48545522008-02-02 10:12:36 +00004394 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
4395 try:
4396 hash(l.__add__)
4397 except TypeError:
4398 pass
4399 else:
4400 self.fail("no TypeError from hash([].__add__)")
4401
4402 t = ()
4403 t += (7,)
4404 self.assertEqual(t.__add__, (7,).__add__)
4405 self.assertEqual(hash(t.__add__), hash((7,).__add__))
4406
4407 def test_not_implemented(self):
4408 # Testing NotImplemented...
4409 # all binary methods should be able to return a NotImplemented
Georg Brandl48545522008-02-02 10:12:36 +00004410 import operator
4411
4412 def specialmethod(self, other):
4413 return NotImplemented
4414
4415 def check(expr, x, y):
4416 try:
4417 exec expr in {'x': x, 'y': y, 'operator': operator}
4418 except TypeError:
4419 pass
Armin Rigofd163f92005-12-29 15:59:19 +00004420 else:
Georg Brandl48545522008-02-02 10:12:36 +00004421 self.fail("no TypeError from %r" % (expr,))
Armin Rigofd163f92005-12-29 15:59:19 +00004422
Georg Brandl48545522008-02-02 10:12:36 +00004423 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of
4424 # TypeErrors
4425 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4426 # ValueErrors instead of TypeErrors
4427 for metaclass in [type, types.ClassType]:
4428 for name, expr, iexpr in [
4429 ('__add__', 'x + y', 'x += y'),
4430 ('__sub__', 'x - y', 'x -= y'),
4431 ('__mul__', 'x * y', 'x *= y'),
4432 ('__truediv__', 'operator.truediv(x, y)', None),
4433 ('__floordiv__', 'operator.floordiv(x, y)', None),
4434 ('__div__', 'x / y', 'x /= y'),
4435 ('__mod__', 'x % y', 'x %= y'),
4436 ('__divmod__', 'divmod(x, y)', None),
4437 ('__pow__', 'x ** y', 'x **= y'),
4438 ('__lshift__', 'x << y', 'x <<= y'),
4439 ('__rshift__', 'x >> y', 'x >>= y'),
4440 ('__and__', 'x & y', 'x &= y'),
4441 ('__or__', 'x | y', 'x |= y'),
4442 ('__xor__', 'x ^ y', 'x ^= y'),
4443 ('__coerce__', 'coerce(x, y)', None)]:
4444 if name == '__coerce__':
4445 rname = name
4446 else:
4447 rname = '__r' + name[2:]
4448 A = metaclass('A', (), {name: specialmethod})
4449 B = metaclass('B', (), {rname: specialmethod})
4450 a = A()
4451 b = B()
4452 check(expr, a, a)
4453 check(expr, a, b)
4454 check(expr, b, a)
4455 check(expr, b, b)
4456 check(expr, a, N1)
4457 check(expr, a, N2)
4458 check(expr, N1, b)
4459 check(expr, N2, b)
4460 if iexpr:
4461 check(iexpr, a, a)
4462 check(iexpr, a, b)
4463 check(iexpr, b, a)
4464 check(iexpr, b, b)
4465 check(iexpr, a, N1)
4466 check(iexpr, a, N2)
4467 iname = '__i' + name[2:]
4468 C = metaclass('C', (), {iname: specialmethod})
4469 c = C()
4470 check(iexpr, c, a)
4471 check(iexpr, c, b)
4472 check(iexpr, c, N1)
4473 check(iexpr, c, N2)
Georg Brandl0fca97a2007-03-05 22:28:08 +00004474
Georg Brandl48545522008-02-02 10:12:36 +00004475 def test_assign_slice(self):
4476 # ceval.c's assign_slice used to check for
4477 # tp->tp_as_sequence->sq_slice instead of
4478 # tp->tp_as_sequence->sq_ass_slice
Georg Brandl0fca97a2007-03-05 22:28:08 +00004479
Georg Brandl48545522008-02-02 10:12:36 +00004480 class C(object):
4481 def __setslice__(self, start, stop, value):
4482 self.value = value
Georg Brandl0fca97a2007-03-05 22:28:08 +00004483
Georg Brandl48545522008-02-02 10:12:36 +00004484 c = C()
4485 c[1:2] = 3
4486 self.assertEqual(c.value, 3)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004487
Benjamin Peterson9179dab2010-01-18 23:07:56 +00004488 def test_set_and_no_get(self):
4489 # See
4490 # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
4491 class Descr(object):
4492
4493 def __init__(self, name):
4494 self.name = name
4495
4496 def __set__(self, obj, value):
4497 obj.__dict__[self.name] = value
4498 descr = Descr("a")
4499
4500 class X(object):
4501 a = descr
4502
4503 x = X()
4504 self.assertIs(x.a, descr)
4505 x.a = 42
4506 self.assertEqual(x.a, 42)
4507
Benjamin Peterson42d59472010-02-06 20:14:10 +00004508 # Also check type_getattro for correctness.
4509 class Meta(type):
4510 pass
4511 class X(object):
4512 __metaclass__ = Meta
4513 X.a = 42
4514 Meta.a = Descr("a")
4515 self.assertEqual(X.a, 42)
4516
Benjamin Peterson273c2332008-11-17 22:39:09 +00004517 def test_getattr_hooks(self):
4518 # issue 4230
4519
4520 class Descriptor(object):
4521 counter = 0
4522 def __get__(self, obj, objtype=None):
4523 def getter(name):
4524 self.counter += 1
4525 raise AttributeError(name)
4526 return getter
4527
4528 descr = Descriptor()
4529 class A(object):
4530 __getattribute__ = descr
4531 class B(object):
4532 __getattr__ = descr
4533 class C(object):
4534 __getattribute__ = descr
4535 __getattr__ = descr
4536
4537 self.assertRaises(AttributeError, getattr, A(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004538 self.assertEqual(descr.counter, 1)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004539 self.assertRaises(AttributeError, getattr, B(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004540 self.assertEqual(descr.counter, 2)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004541 self.assertRaises(AttributeError, getattr, C(), "attr")
Ezio Melotti2623a372010-11-21 13:34:58 +00004542 self.assertEqual(descr.counter, 4)
Benjamin Peterson273c2332008-11-17 22:39:09 +00004543
4544 import gc
4545 class EvilGetattribute(object):
4546 # This used to segfault
4547 def __getattr__(self, name):
4548 raise AttributeError(name)
4549 def __getattribute__(self, name):
4550 del EvilGetattribute.__getattr__
4551 for i in range(5):
4552 gc.collect()
4553 raise AttributeError(name)
4554
4555 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4556
Benjamin Peterson9b911ca2011-01-12 15:49:47 +00004557 def test_abstractmethods(self):
4558 # type pretends not to have __abstractmethods__.
4559 self.assertRaises(AttributeError, getattr, type, "__abstractmethods__")
4560 class meta(type):
4561 pass
4562 self.assertRaises(AttributeError, getattr, meta, "__abstractmethods__")
4563 class X(object):
4564 pass
4565 with self.assertRaises(AttributeError):
4566 del X.__abstractmethods__
4567
Victor Stinnere363ec12011-05-01 23:43:37 +02004568 def test_proxy_call(self):
4569 class FakeStr(object):
4570 __class__ = str
4571
4572 fake_str = FakeStr()
4573 # isinstance() reads __class__ on new style classes
4574 self.assertTrue(isinstance(fake_str, str))
4575
4576 # call a method descriptor
4577 with self.assertRaises(TypeError):
4578 str.split(fake_str)
4579
4580 # call a slot wrapper descriptor
4581 with self.assertRaises(TypeError):
4582 str.__add__(fake_str, "abc")
4583
Guido van Rossum9acc3872008-01-23 23:23:43 +00004584
Georg Brandl48545522008-02-02 10:12:36 +00004585class DictProxyTests(unittest.TestCase):
4586 def setUp(self):
4587 class C(object):
4588 def meth(self):
4589 pass
4590 self.C = C
Guido van Rossum9acc3872008-01-23 23:23:43 +00004591
Raymond Hettingerbf7a2662011-06-30 00:44:36 +01004592 def test_repr(self):
4593 self.assertIn('dict_proxy({', repr(vars(self.C)))
4594 self.assertIn("'meth':", repr(vars(self.C)))
4595
Georg Brandl48545522008-02-02 10:12:36 +00004596 def test_iter_keys(self):
4597 # Testing dict-proxy iterkeys...
4598 keys = [ key for key in self.C.__dict__.iterkeys() ]
4599 keys.sort()
Ezio Melotti2623a372010-11-21 13:34:58 +00004600 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
Georg Brandl48545522008-02-02 10:12:36 +00004601 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004602
Georg Brandl48545522008-02-02 10:12:36 +00004603 def test_iter_values(self):
4604 # Testing dict-proxy itervalues...
4605 values = [ values for values in self.C.__dict__.itervalues() ]
4606 self.assertEqual(len(values), 5)
Guido van Rossum9acc3872008-01-23 23:23:43 +00004607
Georg Brandl48545522008-02-02 10:12:36 +00004608 def test_iter_items(self):
4609 # Testing dict-proxy iteritems...
4610 keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
4611 keys.sort()
4612 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4613 '__weakref__', 'meth'])
Guido van Rossum9acc3872008-01-23 23:23:43 +00004614
Georg Brandl48545522008-02-02 10:12:36 +00004615 def test_dict_type_with_metaclass(self):
4616 # Testing type of __dict__ when __metaclass__ set...
4617 class B(object):
4618 pass
4619 class M(type):
4620 pass
4621 class C:
4622 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4623 __metaclass__ = M
4624 self.assertEqual(type(C.__dict__), type(B.__dict__))
Guido van Rossum9acc3872008-01-23 23:23:43 +00004625
Guido van Rossum9acc3872008-01-23 23:23:43 +00004626
Georg Brandl48545522008-02-02 10:12:36 +00004627class PTypesLongInitTest(unittest.TestCase):
4628 # This is in its own TestCase so that it can be run before any other tests.
4629 def test_pytype_long_ready(self):
4630 # Testing SF bug 551412 ...
Guido van Rossum9acc3872008-01-23 23:23:43 +00004631
Georg Brandl48545522008-02-02 10:12:36 +00004632 # This dumps core when SF bug 551412 isn't fixed --
4633 # but only when test_descr.py is run separately.
4634 # (That can't be helped -- as soon as PyType_Ready()
4635 # is called for PyLong_Type, the bug is gone.)
4636 class UserLong(object):
4637 def __pow__(self, *args):
4638 pass
4639 try:
4640 pow(0L, UserLong(), 0L)
4641 except:
4642 pass
Guido van Rossum9acc3872008-01-23 23:23:43 +00004643
Georg Brandl48545522008-02-02 10:12:36 +00004644 # Another segfault only when run early
4645 # (before PyType_Ready(tuple) is called)
4646 type.mro(tuple)
Guido van Rossum37edeab2008-01-24 17:58:05 +00004647
4648
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004649def test_main():
Florent Xicluna6257a7b2010-03-31 22:01:03 +00004650 deprecations = [(r'complex divmod\(\), // and % are deprecated$',
4651 DeprecationWarning)]
4652 if sys.py3kwarning:
4653 deprecations += [
Florent Xicluna07627882010-03-21 01:14:24 +00004654 ("classic (int|long) division", DeprecationWarning),
4655 ("coerce.. not supported", DeprecationWarning),
Florent Xicluna6257a7b2010-03-31 22:01:03 +00004656 (".+__(get|set|del)slice__ has been removed", DeprecationWarning)]
4657 with test_support.check_warnings(*deprecations):
Florent Xicluna07627882010-03-21 01:14:24 +00004658 # Run all local test cases, with PTypesLongInitTest first.
4659 test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
4660 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004661
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004662if __name__ == "__main__":
4663 test_main()