blob: 102074038e8dbc4d1b89015cc8c5640e2337affb [file] [log] [blame]
Guido van Rossum360e4b82007-05-14 22:51:27 +00001import types
Georg Brandl479a7e72008-02-05 18:13:15 +00002import unittest
3import warnings
Tim Peters4d9b4662002-04-16 01:59:17 +00004
Georg Brandl479a7e72008-02-05 18:13:15 +00005from copy import deepcopy
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
Guido van Rossum875eeaa2001-10-11 18:33:53 +00007
Tim Peters6d6c1a32001-08-02 04:15:00 +00008
Georg Brandl479a7e72008-02-05 18:13:15 +00009class OperatorsTest(unittest.TestCase):
Tim Peters3caca232001-12-06 06:23:26 +000010
Georg Brandl479a7e72008-02-05 18:13:15 +000011 def __init__(self, *args, **kwargs):
12 unittest.TestCase.__init__(self, *args, **kwargs)
13 self.binops = {
14 'add': '+',
15 'sub': '-',
16 'mul': '*',
17 'div': '/',
18 'divmod': 'divmod',
19 'pow': '**',
20 'lshift': '<<',
21 'rshift': '>>',
22 'and': '&',
23 'xor': '^',
24 'or': '|',
25 'cmp': 'cmp',
26 'lt': '<',
27 'le': '<=',
28 'eq': '==',
29 'ne': '!=',
30 'gt': '>',
31 'ge': '>=',
32 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000033
Georg Brandl479a7e72008-02-05 18:13:15 +000034 for name, expr in list(self.binops.items()):
35 if expr.islower():
36 expr = expr + "(a, b)"
37 else:
38 expr = 'a %s b' % expr
39 self.binops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000040
Georg Brandl479a7e72008-02-05 18:13:15 +000041 self.unops = {
42 'pos': '+',
43 'neg': '-',
44 'abs': 'abs',
45 'invert': '~',
46 'int': 'int',
47 'float': 'float',
48 'oct': 'oct',
49 'hex': 'hex',
50 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000051
Georg Brandl479a7e72008-02-05 18:13:15 +000052 for name, expr in list(self.unops.items()):
53 if expr.islower():
54 expr = expr + "(a)"
55 else:
56 expr = '%s a' % expr
57 self.unops[name] = expr
Tim Peters6d6c1a32001-08-02 04:15:00 +000058
Georg Brandl479a7e72008-02-05 18:13:15 +000059 def unop_test(self, a, res, expr="len(a)", meth="__len__"):
60 d = {'a': a}
61 self.assertEqual(eval(expr, d), res)
62 t = type(a)
63 m = getattr(t, meth)
Tim Peters6d6c1a32001-08-02 04:15:00 +000064
Georg Brandl479a7e72008-02-05 18:13:15 +000065 # Find method in parent class
66 while meth not in t.__dict__:
67 t = t.__bases__[0]
Tim Peters2f93e282001-10-04 05:27:00 +000068
Georg Brandl479a7e72008-02-05 18:13:15 +000069 self.assertEqual(m, t.__dict__[meth])
70 self.assertEqual(m(a), res)
71 bm = getattr(a, meth)
72 self.assertEqual(bm(), res)
Tim Peters2f93e282001-10-04 05:27:00 +000073
Georg Brandl479a7e72008-02-05 18:13:15 +000074 def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
75 d = {'a': a, 'b': b}
Tim Peters2f93e282001-10-04 05:27:00 +000076
Georg Brandl479a7e72008-02-05 18:13:15 +000077 # XXX Hack so this passes before 2.3 when -Qnew is specified.
78 if meth == "__div__" and 1/2 == 0.5:
79 meth = "__truediv__"
Tim Peters2f93e282001-10-04 05:27:00 +000080
Georg Brandl479a7e72008-02-05 18:13:15 +000081 if meth == '__divmod__': pass
Tim Peters2f93e282001-10-04 05:27:00 +000082
Georg Brandl479a7e72008-02-05 18:13:15 +000083 self.assertEqual(eval(expr, d), res)
84 t = type(a)
85 m = getattr(t, meth)
86 while meth not in t.__dict__:
87 t = t.__bases__[0]
88 self.assertEqual(m, t.__dict__[meth])
89 self.assertEqual(m(a, b), res)
90 bm = getattr(a, meth)
91 self.assertEqual(bm(b), res)
Tim Peters2f93e282001-10-04 05:27:00 +000092
Georg Brandl479a7e72008-02-05 18:13:15 +000093 def sliceop_test(self, a, b, c, res, expr="a[b:c]", meth="__getitem__"):
94 d = {'a': a, 'b': b, 'c': c}
95 self.assertEqual(eval(expr, d), res)
96 t = type(a)
97 m = getattr(t, meth)
98 while meth not in t.__dict__:
99 t = t.__bases__[0]
100 self.assertEqual(m, t.__dict__[meth])
101 self.assertEqual(m(a, slice(b, c)), res)
102 bm = getattr(a, meth)
103 self.assertEqual(bm(slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000104
Georg Brandl479a7e72008-02-05 18:13:15 +0000105 def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
106 d = {'a': deepcopy(a), 'b': b}
107 exec(stmt, d)
108 self.assertEqual(d['a'], res)
109 t = type(a)
110 m = getattr(t, meth)
111 while meth not in t.__dict__:
112 t = t.__bases__[0]
113 self.assertEqual(m, t.__dict__[meth])
114 d['a'] = deepcopy(a)
115 m(d['a'], b)
116 self.assertEqual(d['a'], res)
117 d['a'] = deepcopy(a)
118 bm = getattr(d['a'], meth)
119 bm(b)
120 self.assertEqual(d['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000121
Georg Brandl479a7e72008-02-05 18:13:15 +0000122 def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
123 d = {'a': deepcopy(a), 'b': b, 'c': c}
124 exec(stmt, d)
125 self.assertEqual(d['a'], res)
126 t = type(a)
127 m = getattr(t, meth)
128 while meth not in t.__dict__:
129 t = t.__bases__[0]
130 self.assertEqual(m, t.__dict__[meth])
131 d['a'] = deepcopy(a)
132 m(d['a'], b, c)
133 self.assertEqual(d['a'], res)
134 d['a'] = deepcopy(a)
135 bm = getattr(d['a'], meth)
136 bm(b, c)
137 self.assertEqual(d['a'], res)
138
139 def setsliceop_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
140 dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
141 exec(stmt, dictionary)
142 self.assertEqual(dictionary['a'], res)
143 t = type(a)
144 while meth not in t.__dict__:
145 t = t.__bases__[0]
146 m = getattr(t, meth)
147 self.assertEqual(m, t.__dict__[meth])
148 dictionary['a'] = deepcopy(a)
149 m(dictionary['a'], slice(b, c), d)
150 self.assertEqual(dictionary['a'], res)
151 dictionary['a'] = deepcopy(a)
152 bm = getattr(dictionary['a'], meth)
153 bm(slice(b, c), d)
154 self.assertEqual(dictionary['a'], res)
155
156 def test_lists(self):
157 # Testing list operations...
158 # Asserts are within individual test methods
159 self.binop_test([1], [2], [1,2], "a+b", "__add__")
160 self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
161 self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
162 self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
163 self.sliceop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
164 self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
165 self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
166 self.unop_test([1,2,3], 3, "len(a)", "__len__")
167 self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
168 self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
169 self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
170 self.setsliceop_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
171 "__setitem__")
172
173 def test_dicts(self):
174 # Testing dict operations...
175 ## self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
176 self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
177 self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
178 self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
179
180 d = {1:2, 3:4}
181 l1 = []
182 for i in list(d.keys()):
183 l1.append(i)
184 l = []
185 for i in iter(d):
186 l.append(i)
187 self.assertEqual(l, l1)
188 l = []
189 for i in d.__iter__():
190 l.append(i)
191 self.assertEqual(l, l1)
192 l = []
193 for i in dict.__iter__(d):
194 l.append(i)
195 self.assertEqual(l, l1)
196 d = {1:2, 3:4}
197 self.unop_test(d, 2, "len(a)", "__len__")
198 self.assertEqual(eval(repr(d), {}), d)
199 self.assertEqual(eval(d.__repr__(), {}), d)
200 self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
201 "__setitem__")
202
203 # Tests for unary and binary operators
204 def number_operators(self, a, b, skip=[]):
205 dict = {'a': a, 'b': b}
206
207 for name, expr in list(self.binops.items()):
208 if name not in skip:
209 name = "__%s__" % name
210 if hasattr(a, name):
211 res = eval(expr, dict)
212 self.binop_test(a, b, res, expr, name)
213
214 for name, expr in list(self.unops.items()):
215 if name not in skip:
216 name = "__%s__" % name
217 if hasattr(a, name):
218 res = eval(expr, dict)
219 self.unop_test(a, res, expr, name)
220
221 def test_ints(self):
222 # Testing int operations...
223 self.number_operators(100, 3)
224 # The following crashes in Python 2.2
225 self.assertEqual((1).__bool__(), 1)
226 self.assertEqual((0).__bool__(), 0)
227 # This returns 'NotImplemented' in Python 2.2
228 class C(int):
229 def __add__(self, other):
230 return NotImplemented
231 self.assertEqual(C(5), 5)
Tim Peters25786c02001-09-02 08:22:48 +0000232 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000233 C() + ""
Tim Peters25786c02001-09-02 08:22:48 +0000234 except TypeError:
235 pass
236 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000237 self.fail("NotImplemented should have caused TypeError")
Tim Peters25786c02001-09-02 08:22:48 +0000238
Georg Brandl479a7e72008-02-05 18:13:15 +0000239 def test_longs(self):
240 # Testing long operations...
241 self.number_operators(100, 3)
Tim Peters25786c02001-09-02 08:22:48 +0000242
Georg Brandl479a7e72008-02-05 18:13:15 +0000243 def test_floats(self):
244 # Testing float operations...
245 self.number_operators(100.0, 3.0)
Tim Peters25786c02001-09-02 08:22:48 +0000246
Georg Brandl479a7e72008-02-05 18:13:15 +0000247 def test_complexes(self):
248 # Testing complex operations...
249 self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
250 'int', 'long', 'float',
251 'divmod', 'mod'])
Tim Peters25786c02001-09-02 08:22:48 +0000252
Georg Brandl479a7e72008-02-05 18:13:15 +0000253 class Number(complex):
254 __slots__ = ['prec']
255 def __new__(cls, *args, **kwds):
256 result = complex.__new__(cls, *args)
257 result.prec = kwds.get('prec', 12)
258 return result
259 def __repr__(self):
260 prec = self.prec
261 if self.imag == 0.0:
262 return "%.*g" % (prec, self.real)
263 if self.real == 0.0:
264 return "%.*gj" % (prec, self.imag)
265 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
266 __str__ = __repr__
Tim Peters25786c02001-09-02 08:22:48 +0000267
Georg Brandl479a7e72008-02-05 18:13:15 +0000268 a = Number(3.14, prec=6)
269 self.assertEqual(repr(a), "3.14")
270 self.assertEqual(a.prec, 6)
Tim Peters1fc240e2001-10-26 05:06:50 +0000271
Georg Brandl479a7e72008-02-05 18:13:15 +0000272 a = Number(a, prec=2)
273 self.assertEqual(repr(a), "3.1")
274 self.assertEqual(a.prec, 2)
Tim Peters1fc240e2001-10-26 05:06:50 +0000275
Georg Brandl479a7e72008-02-05 18:13:15 +0000276 a = Number(234.5)
277 self.assertEqual(repr(a), "234.5")
278 self.assertEqual(a.prec, 12)
Tim Peters1fc240e2001-10-26 05:06:50 +0000279
Georg Brandl479a7e72008-02-05 18:13:15 +0000280 def test_spam_lists(self):
281 # Testing spamlist operations...
282 import copy, xxsubtype as spam
283
284 def spamlist(l, memo=None):
285 import xxsubtype as spam
286 return spam.spamlist(l)
287
288 # This is an ugly hack:
289 copy._deepcopy_dispatch[spam.spamlist] = spamlist
290
291 self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
292 "__add__")
293 self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
294 self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
295 self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
296 self.sliceop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
297 "__getitem__")
298 self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
299 "__iadd__")
300 self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
301 "__imul__")
302 self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
303 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
304 "__mul__")
305 self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
306 "__rmul__")
307 self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
308 "__setitem__")
309 self.setsliceop_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
310 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
311 # Test subclassing
312 class C(spam.spamlist):
313 def foo(self): return 1
314 a = C()
315 self.assertEqual(a, [])
316 self.assertEqual(a.foo(), 1)
317 a.append(100)
318 self.assertEqual(a, [100])
319 self.assertEqual(a.getstate(), 0)
320 a.setstate(42)
321 self.assertEqual(a.getstate(), 42)
322
323 def test_spam_dicts(self):
324 # Testing spamdict operations...
325 import copy, xxsubtype as spam
326 def spamdict(d, memo=None):
327 import xxsubtype as spam
328 sd = spam.spamdict()
329 for k, v in list(d.items()):
330 sd[k] = v
331 return sd
332 # This is an ugly hack:
333 copy._deepcopy_dispatch[spam.spamdict] = spamdict
334
335 ## self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
336 ## "__cmp__")
337 self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
338 self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
339 self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
340 d = spamdict({1:2,3:4})
341 l1 = []
342 for i in list(d.keys()):
343 l1.append(i)
344 l = []
345 for i in iter(d):
346 l.append(i)
347 self.assertEqual(l, l1)
348 l = []
349 for i in d.__iter__():
350 l.append(i)
351 self.assertEqual(l, l1)
352 l = []
353 for i in type(spamdict({})).__iter__(d):
354 l.append(i)
355 self.assertEqual(l, l1)
356 straightd = {1:2, 3:4}
357 spamd = spamdict(straightd)
358 self.unop_test(spamd, 2, "len(a)", "__len__")
359 self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
360 self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
361 "a[b]=c", "__setitem__")
362 # Test subclassing
363 class C(spam.spamdict):
364 def foo(self): return 1
365 a = C()
366 self.assertEqual(list(a.items()), [])
367 self.assertEqual(a.foo(), 1)
368 a['foo'] = 'bar'
369 self.assertEqual(list(a.items()), [('foo', 'bar')])
370 self.assertEqual(a.getstate(), 0)
371 a.setstate(100)
372 self.assertEqual(a.getstate(), 100)
373
374class ClassPropertiesAndMethods(unittest.TestCase):
375
376 def test_python_dicts(self):
377 # Testing Python subclass of dict...
378 self.assert_(issubclass(dict, dict))
379 self.assert_(isinstance({}, dict))
380 d = dict()
381 self.assertEqual(d, {})
382 self.assert_(d.__class__ is dict)
383 self.assert_(isinstance(d, dict))
384 class C(dict):
385 state = -1
386 def __init__(self_local, *a, **kw):
387 if a:
388 self.assertEqual(len(a), 1)
389 self_local.state = a[0]
390 if kw:
391 for k, v in list(kw.items()):
392 self_local[v] = k
393 def __getitem__(self, key):
394 return self.get(key, 0)
395 def __setitem__(self_local, key, value):
396 self.assert_(isinstance(key, type(0)))
397 dict.__setitem__(self_local, key, value)
398 def setstate(self, state):
399 self.state = state
400 def getstate(self):
401 return self.state
402 self.assert_(issubclass(C, dict))
403 a1 = C(12)
404 self.assertEqual(a1.state, 12)
405 a2 = C(foo=1, bar=2)
406 self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
407 a = C()
408 self.assertEqual(a.state, -1)
409 self.assertEqual(a.getstate(), -1)
410 a.setstate(0)
411 self.assertEqual(a.state, 0)
412 self.assertEqual(a.getstate(), 0)
413 a.setstate(10)
414 self.assertEqual(a.state, 10)
415 self.assertEqual(a.getstate(), 10)
416 self.assertEqual(a[42], 0)
417 a[42] = 24
418 self.assertEqual(a[42], 24)
419 N = 50
420 for i in range(N):
421 a[i] = C()
422 for j in range(N):
423 a[i][j] = i*j
424 for i in range(N):
425 for j in range(N):
426 self.assertEqual(a[i][j], i*j)
427
428 def test_python_lists(self):
429 # Testing Python subclass of list...
430 class C(list):
431 def __getitem__(self, i):
432 if isinstance(i, slice):
433 return i.start, i.stop
434 return list.__getitem__(self, i) + 100
435 a = C()
436 a.extend([0,1,2])
437 self.assertEqual(a[0], 100)
438 self.assertEqual(a[1], 101)
439 self.assertEqual(a[2], 102)
440 self.assertEqual(a[100:200], (100,200))
441
442 def test_metaclass(self):
Georg Brandle81f5ef2008-05-27 20:34:09 +0000443 # Testing metaclasses...
Georg Brandl479a7e72008-02-05 18:13:15 +0000444 class C(metaclass=type):
445 def __init__(self):
446 self.__state = 0
447 def getstate(self):
448 return self.__state
449 def setstate(self, state):
450 self.__state = state
451 a = C()
452 self.assertEqual(a.getstate(), 0)
453 a.setstate(10)
454 self.assertEqual(a.getstate(), 10)
455 class _metaclass(type):
456 def myself(cls): return cls
457 class D(metaclass=_metaclass):
458 pass
459 self.assertEqual(D.myself(), D)
460 d = D()
461 self.assertEqual(d.__class__, D)
462 class M1(type):
463 def __new__(cls, name, bases, dict):
464 dict['__spam__'] = 1
465 return type.__new__(cls, name, bases, dict)
466 class C(metaclass=M1):
467 pass
468 self.assertEqual(C.__spam__, 1)
469 c = C()
470 self.assertEqual(c.__spam__, 1)
471
472 class _instance(object):
473 pass
474 class M2(object):
475 @staticmethod
476 def __new__(cls, name, bases, dict):
477 self = object.__new__(cls)
478 self.name = name
479 self.bases = bases
480 self.dict = dict
481 return self
482 def __call__(self):
483 it = _instance()
484 # Early binding of methods
485 for key in self.dict:
486 if key.startswith("__"):
487 continue
488 setattr(it, key, self.dict[key].__get__(it, self))
489 return it
490 class C(metaclass=M2):
491 def spam(self):
492 return 42
493 self.assertEqual(C.name, 'C')
494 self.assertEqual(C.bases, ())
495 self.assert_('spam' in C.dict)
496 c = C()
497 self.assertEqual(c.spam(), 42)
498
499 # More metaclass examples
500
501 class autosuper(type):
502 # Automatically add __super to the class
503 # This trick only works for dynamic classes
504 def __new__(metaclass, name, bases, dict):
505 cls = super(autosuper, metaclass).__new__(metaclass,
506 name, bases, dict)
507 # Name mangling for __super removes leading underscores
508 while name[:1] == "_":
509 name = name[1:]
510 if name:
511 name = "_%s__super" % name
512 else:
513 name = "__super"
514 setattr(cls, name, super(cls))
515 return cls
516 class A(metaclass=autosuper):
517 def meth(self):
518 return "A"
519 class B(A):
520 def meth(self):
521 return "B" + self.__super.meth()
522 class C(A):
523 def meth(self):
524 return "C" + self.__super.meth()
525 class D(C, B):
526 def meth(self):
527 return "D" + self.__super.meth()
528 self.assertEqual(D().meth(), "DCBA")
529 class E(B, C):
530 def meth(self):
531 return "E" + self.__super.meth()
532 self.assertEqual(E().meth(), "EBCA")
533
534 class autoproperty(type):
535 # Automatically create property attributes when methods
536 # named _get_x and/or _set_x are found
537 def __new__(metaclass, name, bases, dict):
538 hits = {}
539 for key, val in dict.items():
540 if key.startswith("_get_"):
541 key = key[5:]
542 get, set = hits.get(key, (None, None))
543 get = val
544 hits[key] = get, set
545 elif key.startswith("_set_"):
546 key = key[5:]
547 get, set = hits.get(key, (None, None))
548 set = val
549 hits[key] = get, set
550 for key, (get, set) in hits.items():
551 dict[key] = property(get, set)
552 return super(autoproperty, metaclass).__new__(metaclass,
553 name, bases, dict)
554 class A(metaclass=autoproperty):
555 def _get_x(self):
556 return -self.__x
557 def _set_x(self, x):
558 self.__x = -x
559 a = A()
560 self.assert_(not hasattr(a, "x"))
561 a.x = 12
562 self.assertEqual(a.x, 12)
563 self.assertEqual(a._A__x, -12)
564
565 class multimetaclass(autoproperty, autosuper):
566 # Merge of multiple cooperating metaclasses
567 pass
568 class A(metaclass=multimetaclass):
569 def _get_x(self):
570 return "A"
571 class B(A):
572 def _get_x(self):
573 return "B" + self.__super._get_x()
574 class C(A):
575 def _get_x(self):
576 return "C" + self.__super._get_x()
577 class D(C, B):
578 def _get_x(self):
579 return "D" + self.__super._get_x()
580 self.assertEqual(D().x, "DCBA")
581
582 # Make sure type(x) doesn't call x.__class__.__init__
583 class T(type):
584 counter = 0
585 def __init__(self, *args):
586 T.counter += 1
587 class C(metaclass=T):
588 pass
589 self.assertEqual(T.counter, 1)
590 a = C()
591 self.assertEqual(type(a), C)
592 self.assertEqual(T.counter, 1)
593
594 class C(object): pass
595 c = C()
596 try: c()
597 except TypeError: pass
598 else: self.fail("calling object w/o call method should raise "
599 "TypeError")
600
601 # Testing code to find most derived baseclass
602 class A(type):
603 def __new__(*args, **kwargs):
604 return type.__new__(*args, **kwargs)
605
606 class B(object):
607 pass
608
609 class C(object, metaclass=A):
610 pass
611
612 # The most derived metaclass of D is A rather than type.
613 class D(B, C):
614 pass
615
616 def test_module_subclasses(self):
617 # Testing Python subclass of module...
618 log = []
619 import types, sys
620 MT = type(sys)
621 class MM(MT):
622 def __init__(self, name):
623 MT.__init__(self, name)
624 def __getattribute__(self, name):
625 log.append(("getattr", name))
626 return MT.__getattribute__(self, name)
627 def __setattr__(self, name, value):
628 log.append(("setattr", name, value))
629 MT.__setattr__(self, name, value)
630 def __delattr__(self, name):
631 log.append(("delattr", name))
632 MT.__delattr__(self, name)
633 a = MM("a")
634 a.foo = 12
635 x = a.foo
636 del a.foo
637 self.assertEqual(log, [("setattr", "foo", 12),
638 ("getattr", "foo"),
639 ("delattr", "foo")])
640
641 # http://python.org/sf/1174712
Tim Peters1fc240e2001-10-26 05:06:50 +0000642 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000643 class Module(types.ModuleType, str):
644 pass
645 except TypeError:
Tim Peters1fc240e2001-10-26 05:06:50 +0000646 pass
647 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000648 self.fail("inheriting from ModuleType and str at the same time "
649 "should fail")
Tim Peters1fc240e2001-10-26 05:06:50 +0000650
Georg Brandl479a7e72008-02-05 18:13:15 +0000651 def test_multiple_inheritance(self):
652 # Testing multiple inheritance...
653 class C(object):
654 def __init__(self):
655 self.__state = 0
656 def getstate(self):
657 return self.__state
658 def setstate(self, state):
659 self.__state = state
660 a = C()
661 self.assertEqual(a.getstate(), 0)
662 a.setstate(10)
663 self.assertEqual(a.getstate(), 10)
664 class D(dict, C):
665 def __init__(self):
666 type({}).__init__(self)
667 C.__init__(self)
668 d = D()
669 self.assertEqual(list(d.keys()), [])
670 d["hello"] = "world"
671 self.assertEqual(list(d.items()), [("hello", "world")])
672 self.assertEqual(d["hello"], "world")
673 self.assertEqual(d.getstate(), 0)
674 d.setstate(10)
675 self.assertEqual(d.getstate(), 10)
676 self.assertEqual(D.__mro__, (D, dict, C, object))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000677
Georg Brandl479a7e72008-02-05 18:13:15 +0000678 # SF bug #442833
679 class Node(object):
680 def __int__(self):
681 return int(self.foo())
682 def foo(self):
683 return "23"
684 class Frag(Node, list):
685 def foo(self):
686 return "42"
687 self.assertEqual(Node().__int__(), 23)
688 self.assertEqual(int(Node()), 23)
689 self.assertEqual(Frag().__int__(), 42)
690 self.assertEqual(int(Frag()), 42)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000691
Georg Brandl479a7e72008-02-05 18:13:15 +0000692 def test_diamond_inheritence(self):
693 # Testing multiple inheritance special cases...
694 class A(object):
695 def spam(self): return "A"
696 self.assertEqual(A().spam(), "A")
697 class B(A):
698 def boo(self): return "B"
699 def spam(self): return "B"
700 self.assertEqual(B().spam(), "B")
701 self.assertEqual(B().boo(), "B")
702 class C(A):
703 def boo(self): return "C"
704 self.assertEqual(C().spam(), "A")
705 self.assertEqual(C().boo(), "C")
706 class D(B, C): pass
707 self.assertEqual(D().spam(), "B")
708 self.assertEqual(D().boo(), "B")
709 self.assertEqual(D.__mro__, (D, B, C, A, object))
710 class E(C, B): pass
711 self.assertEqual(E().spam(), "B")
712 self.assertEqual(E().boo(), "C")
713 self.assertEqual(E.__mro__, (E, C, B, A, object))
714 # MRO order disagreement
715 try:
716 class F(D, E): pass
717 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000718 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000719 else:
720 self.fail("expected MRO order disagreement (F)")
721 try:
722 class G(E, D): pass
723 except TypeError:
724 pass
725 else:
726 self.fail("expected MRO order disagreement (G)")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000727
Georg Brandl479a7e72008-02-05 18:13:15 +0000728 # see thread python-dev/2002-October/029035.html
729 def test_ex5_from_c3_switch(self):
730 # Testing ex5 from C3 switch discussion...
731 class A(object): pass
732 class B(object): pass
733 class C(object): pass
734 class X(A): pass
735 class Y(A): pass
736 class Z(X,B,Y,C): pass
737 self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000738
Georg Brandl479a7e72008-02-05 18:13:15 +0000739 # see "A Monotonic Superclass Linearization for Dylan",
740 # by Kim Barrett et al. (OOPSLA 1996)
741 def test_monotonicity(self):
742 # Testing MRO monotonicity...
743 class Boat(object): pass
744 class DayBoat(Boat): pass
745 class WheelBoat(Boat): pass
746 class EngineLess(DayBoat): pass
747 class SmallMultihull(DayBoat): pass
748 class PedalWheelBoat(EngineLess,WheelBoat): pass
749 class SmallCatamaran(SmallMultihull): pass
750 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
Guido van Rossume45763a2001-08-10 21:28:46 +0000751
Georg Brandl479a7e72008-02-05 18:13:15 +0000752 self.assertEqual(PedalWheelBoat.__mro__,
753 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
754 self.assertEqual(SmallCatamaran.__mro__,
755 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
756 self.assertEqual(Pedalo.__mro__,
757 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
758 SmallMultihull, DayBoat, WheelBoat, Boat, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000759
Georg Brandl479a7e72008-02-05 18:13:15 +0000760 # see "A Monotonic Superclass Linearization for Dylan",
761 # by Kim Barrett et al. (OOPSLA 1996)
762 def test_consistency_with_epg(self):
763 # Testing consistentcy with EPG...
764 class Pane(object): pass
765 class ScrollingMixin(object): pass
766 class EditingMixin(object): pass
767 class ScrollablePane(Pane,ScrollingMixin): pass
768 class EditablePane(Pane,EditingMixin): pass
769 class EditableScrollablePane(ScrollablePane,EditablePane): pass
Guido van Rossum9a818922002-11-14 19:50:14 +0000770
Georg Brandl479a7e72008-02-05 18:13:15 +0000771 self.assertEqual(EditableScrollablePane.__mro__,
772 (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
773 ScrollingMixin, EditingMixin, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000774
Georg Brandl479a7e72008-02-05 18:13:15 +0000775 def test_mro_disagreement(self):
776 # Testing error messages for MRO disagreement...
777 mro_err_msg = """Cannot create a consistent method resolution
Raymond Hettingerf394df42003-04-06 19:13:41 +0000778order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000779
Georg Brandl479a7e72008-02-05 18:13:15 +0000780 def raises(exc, expected, callable, *args):
Guido van Rossum58da9312007-11-10 23:39:45 +0000781 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000782 callable(*args)
783 except exc as msg:
784 if not str(msg).startswith(expected):
785 self.fail("Message %r, expected %r" % (str(msg), expected))
786 else:
787 self.fail("Expected %s" % exc)
Guido van Rossum58da9312007-11-10 23:39:45 +0000788
Georg Brandl479a7e72008-02-05 18:13:15 +0000789 class A(object): pass
790 class B(A): pass
791 class C(object): pass
Christian Heimes9a371592007-12-28 14:08:13 +0000792
Georg Brandl479a7e72008-02-05 18:13:15 +0000793 # Test some very simple errors
794 raises(TypeError, "duplicate base class A",
795 type, "X", (A, A), {})
796 raises(TypeError, mro_err_msg,
797 type, "X", (A, B), {})
798 raises(TypeError, mro_err_msg,
799 type, "X", (A, C, B), {})
800 # Test a slightly more complex error
801 class GridLayout(object): pass
802 class HorizontalGrid(GridLayout): pass
803 class VerticalGrid(GridLayout): pass
804 class HVGrid(HorizontalGrid, VerticalGrid): pass
805 class VHGrid(VerticalGrid, HorizontalGrid): pass
806 raises(TypeError, mro_err_msg,
807 type, "ConfusedGrid", (HVGrid, VHGrid), {})
Guido van Rossum58da9312007-11-10 23:39:45 +0000808
Georg Brandl479a7e72008-02-05 18:13:15 +0000809 def test_object_class(self):
810 # Testing object class...
811 a = object()
812 self.assertEqual(a.__class__, object)
813 self.assertEqual(type(a), object)
814 b = object()
815 self.assertNotEqual(a, b)
816 self.assertFalse(hasattr(a, "foo"))
Tim Peters808b94e2001-09-13 19:33:07 +0000817 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000818 a.foo = 12
819 except (AttributeError, TypeError):
Tim Peters808b94e2001-09-13 19:33:07 +0000820 pass
821 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000822 self.fail("object() should not allow setting a foo attribute")
823 self.assertFalse(hasattr(object(), "__dict__"))
Tim Peters561f8992001-09-13 19:36:36 +0000824
Georg Brandl479a7e72008-02-05 18:13:15 +0000825 class Cdict(object):
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000826 pass
Georg Brandl479a7e72008-02-05 18:13:15 +0000827 x = Cdict()
828 self.assertEqual(x.__dict__, {})
829 x.foo = 1
830 self.assertEqual(x.foo, 1)
831 self.assertEqual(x.__dict__, {'foo': 1})
Guido van Rossumd8faa362007-04-27 19:54:29 +0000832
Georg Brandl479a7e72008-02-05 18:13:15 +0000833 def test_slots(self):
834 # Testing __slots__...
835 class C0(object):
836 __slots__ = []
837 x = C0()
838 self.assertFalse(hasattr(x, "__dict__"))
839 self.assertFalse(hasattr(x, "foo"))
840
841 class C1(object):
842 __slots__ = ['a']
843 x = C1()
844 self.assertFalse(hasattr(x, "__dict__"))
845 self.assertFalse(hasattr(x, "a"))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000846 x.a = 1
Georg Brandl479a7e72008-02-05 18:13:15 +0000847 self.assertEqual(x.a, 1)
848 x.a = None
849 self.assertEqual(x.a, None)
850 del x.a
851 self.assertFalse(hasattr(x, "a"))
Guido van Rossum5c294fb2001-09-25 03:43:42 +0000852
Georg Brandl479a7e72008-02-05 18:13:15 +0000853 class C3(object):
854 __slots__ = ['a', 'b', 'c']
855 x = C3()
856 self.assertFalse(hasattr(x, "__dict__"))
857 self.assertFalse(hasattr(x, 'a'))
858 self.assertFalse(hasattr(x, 'b'))
859 self.assertFalse(hasattr(x, 'c'))
860 x.a = 1
861 x.b = 2
862 x.c = 3
863 self.assertEqual(x.a, 1)
864 self.assertEqual(x.b, 2)
865 self.assertEqual(x.c, 3)
866
867 class C4(object):
868 """Validate name mangling"""
869 __slots__ = ['__a']
870 def __init__(self, value):
871 self.__a = value
872 def get(self):
873 return self.__a
874 x = C4(5)
875 self.assertFalse(hasattr(x, '__dict__'))
876 self.assertFalse(hasattr(x, '__a'))
877 self.assertEqual(x.get(), 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000878 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000879 x.__a = 6
880 except AttributeError:
Guido van Rossum6661be32001-10-26 04:26:12 +0000881 pass
882 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000883 self.fail("Double underscored names not mangled")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000884
Georg Brandl479a7e72008-02-05 18:13:15 +0000885 # Make sure slot names are proper identifiers
Guido van Rossum360e4b82007-05-14 22:51:27 +0000886 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000887 class C(object):
888 __slots__ = [None]
Guido van Rossum360e4b82007-05-14 22:51:27 +0000889 except TypeError:
890 pass
891 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000892 self.fail("[None] slots not caught")
Guido van Rossum360e4b82007-05-14 22:51:27 +0000893 try:
Georg Brandl479a7e72008-02-05 18:13:15 +0000894 class C(object):
895 __slots__ = ["foo bar"]
896 except TypeError:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000897 pass
898 else:
Georg Brandl479a7e72008-02-05 18:13:15 +0000899 self.fail("['foo bar'] slots not caught")
900 try:
901 class C(object):
902 __slots__ = ["foo\0bar"]
903 except TypeError:
904 pass
905 else:
906 self.fail("['foo\\0bar'] slots not caught")
907 try:
908 class C(object):
909 __slots__ = ["1"]
910 except TypeError:
911 pass
912 else:
913 self.fail("['1'] slots not caught")
914 try:
915 class C(object):
916 __slots__ = [""]
917 except TypeError:
918 pass
919 else:
920 self.fail("[''] slots not caught")
921 class C(object):
922 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
923 # XXX(nnorwitz): was there supposed to be something tested
924 # from the class above?
Guido van Rossum360e4b82007-05-14 22:51:27 +0000925
Georg Brandl479a7e72008-02-05 18:13:15 +0000926 # Test a single string is not expanded as a sequence.
927 class C(object):
928 __slots__ = "abc"
929 c = C()
930 c.abc = 5
931 self.assertEqual(c.abc, 5)
Guido van Rossum6661be32001-10-26 04:26:12 +0000932
Georg Brandl479a7e72008-02-05 18:13:15 +0000933 # Test unicode slot names
934 # Test a single unicode string is not expanded as a sequence.
935 class C(object):
936 __slots__ = "abc"
937 c = C()
938 c.abc = 5
939 self.assertEqual(c.abc, 5)
Guido van Rossum3926a632001-09-25 16:25:58 +0000940
Georg Brandl479a7e72008-02-05 18:13:15 +0000941 # _unicode_to_string used to modify slots in certain circumstances
942 slots = ("foo", "bar")
943 class C(object):
944 __slots__ = slots
945 x = C()
946 x.foo = 5
947 self.assertEqual(x.foo, 5)
948 self.assert_(type(slots[0]) is str)
949 # this used to leak references
950 try:
951 class C(object):
952 __slots__ = [chr(128)]
953 except (TypeError, UnicodeEncodeError):
954 pass
955 else:
956 raise TestFailed("[chr(128)] slots not caught")
Guido van Rossum3926a632001-09-25 16:25:58 +0000957
Georg Brandl479a7e72008-02-05 18:13:15 +0000958 # Test leaks
959 class Counted(object):
960 counter = 0 # counts the number of instances alive
961 def __init__(self):
962 Counted.counter += 1
963 def __del__(self):
964 Counted.counter -= 1
965 class C(object):
966 __slots__ = ['a', 'b', 'c']
967 x = C()
968 x.a = Counted()
969 x.b = Counted()
970 x.c = Counted()
971 self.assertEqual(Counted.counter, 3)
972 del x
973 self.assertEqual(Counted.counter, 0)
974 class D(C):
975 pass
976 x = D()
977 x.a = Counted()
978 x.z = Counted()
979 self.assertEqual(Counted.counter, 2)
980 del x
981 self.assertEqual(Counted.counter, 0)
982 class E(D):
983 __slots__ = ['e']
984 x = E()
985 x.a = Counted()
986 x.z = Counted()
987 x.e = Counted()
988 self.assertEqual(Counted.counter, 3)
989 del x
990 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +0000991
Georg Brandl479a7e72008-02-05 18:13:15 +0000992 # Test cyclical leaks [SF bug 519621]
993 class F(object):
994 __slots__ = ['a', 'b']
995 log = []
996 s = F()
997 s.a = [Counted(), s]
998 self.assertEqual(Counted.counter, 1)
999 s = None
1000 import gc
1001 gc.collect()
1002 self.assertEqual(Counted.counter, 0)
Guido van Rossum3926a632001-09-25 16:25:58 +00001003
Georg Brandl479a7e72008-02-05 18:13:15 +00001004 # Test lookup leaks [SF bug 572567]
1005 import sys,gc
1006 class G(object):
1007 def __cmp__(self, other):
1008 return 0
1009 g = G()
1010 orig_objects = len(gc.get_objects())
1011 for i in range(10):
1012 g==g
1013 new_objects = len(gc.get_objects())
1014 self.assertEqual(orig_objects, new_objects)
1015 class H(object):
1016 __slots__ = ['a', 'b']
1017 def __init__(self):
1018 self.a = 1
1019 self.b = 2
1020 def __del__(self_):
1021 self.assertEqual(self_.a, 1)
1022 self.assertEqual(self_.b, 2)
Benjamin Petersonc1de4cc2008-11-03 21:29:09 +00001023 with support.captured_output('stderr') as s:
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001024 h = H()
Georg Brandl479a7e72008-02-05 18:13:15 +00001025 del h
Benjamin Petersonc0747cf2008-11-03 20:31:38 +00001026 self.assertEqual(s.getvalue(), '')
Guido van Rossum90c45142001-11-24 21:07:01 +00001027
Georg Brandl479a7e72008-02-05 18:13:15 +00001028 def test_slots_special(self):
1029 # Testing __dict__ and __weakref__ in __slots__...
1030 class D(object):
1031 __slots__ = ["__dict__"]
1032 a = D()
1033 self.assert_(hasattr(a, "__dict__"))
1034 self.assertFalse(hasattr(a, "__weakref__"))
1035 a.foo = 42
1036 self.assertEqual(a.__dict__, {"foo": 42})
Guido van Rossum90c45142001-11-24 21:07:01 +00001037
Georg Brandl479a7e72008-02-05 18:13:15 +00001038 class W(object):
1039 __slots__ = ["__weakref__"]
1040 a = W()
1041 self.assert_(hasattr(a, "__weakref__"))
1042 self.assertFalse(hasattr(a, "__dict__"))
1043 try:
1044 a.foo = 42
1045 except AttributeError:
1046 pass
1047 else:
1048 self.fail("shouldn't be allowed to set a.foo")
1049
1050 class C1(W, D):
1051 __slots__ = []
1052 a = C1()
1053 self.assert_(hasattr(a, "__dict__"))
1054 self.assert_(hasattr(a, "__weakref__"))
1055 a.foo = 42
1056 self.assertEqual(a.__dict__, {"foo": 42})
1057
1058 class C2(D, W):
1059 __slots__ = []
1060 a = C2()
1061 self.assert_(hasattr(a, "__dict__"))
1062 self.assert_(hasattr(a, "__weakref__"))
1063 a.foo = 42
1064 self.assertEqual(a.__dict__, {"foo": 42})
1065
Christian Heimesa156e092008-02-16 07:38:31 +00001066 def test_slots_descriptor(self):
1067 # Issue2115: slot descriptors did not correctly check
1068 # the type of the given object
1069 import abc
1070 class MyABC(metaclass=abc.ABCMeta):
1071 __slots__ = "a"
1072
1073 class Unrelated(object):
1074 pass
1075 MyABC.register(Unrelated)
1076
1077 u = Unrelated()
1078 self.assert_(isinstance(u, MyABC))
1079
1080 # This used to crash
1081 self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
1082
Georg Brandl479a7e72008-02-05 18:13:15 +00001083 def test_dynamics(self):
1084 # Testing class attribute propagation...
1085 class D(object):
1086 pass
1087 class E(D):
1088 pass
1089 class F(D):
1090 pass
1091 D.foo = 1
1092 self.assertEqual(D.foo, 1)
1093 # Test that dynamic attributes are inherited
1094 self.assertEqual(E.foo, 1)
1095 self.assertEqual(F.foo, 1)
1096 # Test dynamic instances
1097 class C(object):
1098 pass
1099 a = C()
1100 self.assertFalse(hasattr(a, "foobar"))
1101 C.foobar = 2
1102 self.assertEqual(a.foobar, 2)
1103 C.method = lambda self: 42
1104 self.assertEqual(a.method(), 42)
1105 C.__repr__ = lambda self: "C()"
1106 self.assertEqual(repr(a), "C()")
1107 C.__int__ = lambda self: 100
1108 self.assertEqual(int(a), 100)
1109 self.assertEqual(a.foobar, 2)
1110 self.assertFalse(hasattr(a, "spam"))
1111 def mygetattr(self, name):
1112 if name == "spam":
1113 return "spam"
1114 raise AttributeError
1115 C.__getattr__ = mygetattr
1116 self.assertEqual(a.spam, "spam")
1117 a.new = 12
1118 self.assertEqual(a.new, 12)
1119 def mysetattr(self, name, value):
1120 if name == "spam":
1121 raise AttributeError
1122 return object.__setattr__(self, name, value)
1123 C.__setattr__ = mysetattr
1124 try:
1125 a.spam = "not spam"
1126 except AttributeError:
1127 pass
1128 else:
1129 self.fail("expected AttributeError")
1130 self.assertEqual(a.spam, "spam")
1131 class D(C):
1132 pass
1133 d = D()
1134 d.foo = 1
1135 self.assertEqual(d.foo, 1)
1136
1137 # Test handling of int*seq and seq*int
1138 class I(int):
1139 pass
1140 self.assertEqual("a"*I(2), "aa")
1141 self.assertEqual(I(2)*"a", "aa")
1142 self.assertEqual(2*I(3), 6)
1143 self.assertEqual(I(3)*2, 6)
1144 self.assertEqual(I(3)*I(2), 6)
1145
1146 # Test handling of long*seq and seq*long
1147 class L(int):
1148 pass
1149 self.assertEqual("a"*L(2), "aa")
1150 self.assertEqual(L(2)*"a", "aa")
1151 self.assertEqual(2*L(3), 6)
1152 self.assertEqual(L(3)*2, 6)
1153 self.assertEqual(L(3)*L(2), 6)
1154
1155 # Test comparison of classes with dynamic metaclasses
1156 class dynamicmetaclass(type):
1157 pass
1158 class someclass(metaclass=dynamicmetaclass):
1159 pass
1160 self.assertNotEqual(someclass, object)
1161
1162 def test_errors(self):
1163 # Testing errors...
1164 try:
1165 class C(list, dict):
1166 pass
1167 except TypeError:
1168 pass
1169 else:
1170 self.fail("inheritance from both list and dict should be illegal")
1171
1172 try:
1173 class C(object, None):
1174 pass
1175 except TypeError:
1176 pass
1177 else:
1178 self.fail("inheritance from non-type should be illegal")
1179 class Classic:
1180 pass
1181
1182 try:
1183 class C(type(len)):
1184 pass
1185 except TypeError:
1186 pass
1187 else:
1188 self.fail("inheritance from CFunction should be illegal")
1189
1190 try:
1191 class C(object):
1192 __slots__ = 1
1193 except TypeError:
1194 pass
1195 else:
1196 self.fail("__slots__ = 1 should be illegal")
1197
1198 try:
1199 class C(object):
1200 __slots__ = [1]
1201 except TypeError:
1202 pass
1203 else:
1204 self.fail("__slots__ = [1] should be illegal")
1205
1206 class M1(type):
1207 pass
1208 class M2(type):
1209 pass
1210 class A1(object, metaclass=M1):
1211 pass
1212 class A2(object, metaclass=M2):
1213 pass
1214 try:
1215 class B(A1, A2):
1216 pass
1217 except TypeError:
1218 pass
1219 else:
1220 self.fail("finding the most derived metaclass should have failed")
1221
1222 def test_classmethods(self):
1223 # Testing class methods...
1224 class C(object):
1225 def foo(*a): return a
1226 goo = classmethod(foo)
1227 c = C()
1228 self.assertEqual(C.goo(1), (C, 1))
1229 self.assertEqual(c.goo(1), (C, 1))
1230 self.assertEqual(c.foo(1), (c, 1))
1231 class D(C):
1232 pass
1233 d = D()
1234 self.assertEqual(D.goo(1), (D, 1))
1235 self.assertEqual(d.goo(1), (D, 1))
1236 self.assertEqual(d.foo(1), (d, 1))
1237 self.assertEqual(D.foo(d, 1), (d, 1))
1238 # Test for a specific crash (SF bug 528132)
1239 def f(cls, arg): return (cls, arg)
1240 ff = classmethod(f)
1241 self.assertEqual(ff.__get__(0, int)(42), (int, 42))
1242 self.assertEqual(ff.__get__(0)(42), (int, 42))
1243
1244 # Test super() with classmethods (SF bug 535444)
1245 self.assertEqual(C.goo.__self__, C)
1246 self.assertEqual(D.goo.__self__, D)
1247 self.assertEqual(super(D,D).goo.__self__, D)
1248 self.assertEqual(super(D,d).goo.__self__, D)
1249 self.assertEqual(super(D,D).goo(), (D,))
1250 self.assertEqual(super(D,d).goo(), (D,))
1251
1252 # Verify that argument is checked for callability (SF bug 753451)
1253 try:
1254 classmethod(1).__get__(1)
1255 except TypeError:
1256 pass
1257 else:
1258 self.fail("classmethod should check for callability")
1259
1260 # Verify that classmethod() doesn't allow keyword args
1261 try:
1262 classmethod(f, kw=1)
1263 except TypeError:
1264 pass
1265 else:
1266 self.fail("classmethod shouldn't accept keyword args")
1267
1268 def test_classmethods_in_c(self):
1269 # Testing C-based class methods...
1270 import xxsubtype as spam
1271 a = (1, 2, 3)
1272 d = {'abc': 123}
1273 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1274 self.assertEqual(x, spam.spamlist)
1275 self.assertEqual(a, a1)
1276 self.assertEqual(d, d1)
1277 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1278 self.assertEqual(x, spam.spamlist)
1279 self.assertEqual(a, a1)
1280 self.assertEqual(d, d1)
1281
1282 def test_staticmethods(self):
1283 # Testing static methods...
1284 class C(object):
1285 def foo(*a): return a
1286 goo = staticmethod(foo)
1287 c = C()
1288 self.assertEqual(C.goo(1), (1,))
1289 self.assertEqual(c.goo(1), (1,))
1290 self.assertEqual(c.foo(1), (c, 1,))
1291 class D(C):
1292 pass
1293 d = D()
1294 self.assertEqual(D.goo(1), (1,))
1295 self.assertEqual(d.goo(1), (1,))
1296 self.assertEqual(d.foo(1), (d, 1))
1297 self.assertEqual(D.foo(d, 1), (d, 1))
1298
1299 def test_staticmethods_in_c(self):
1300 # Testing C-based static methods...
1301 import xxsubtype as spam
1302 a = (1, 2, 3)
1303 d = {"abc": 123}
1304 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1305 self.assertEqual(x, None)
1306 self.assertEqual(a, a1)
1307 self.assertEqual(d, d1)
1308 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1309 self.assertEqual(x, None)
1310 self.assertEqual(a, a1)
1311 self.assertEqual(d, d1)
1312
1313 def test_classic(self):
1314 # Testing classic classes...
1315 class C:
1316 def foo(*a): return a
1317 goo = classmethod(foo)
1318 c = C()
1319 self.assertEqual(C.goo(1), (C, 1))
1320 self.assertEqual(c.goo(1), (C, 1))
1321 self.assertEqual(c.foo(1), (c, 1))
1322 class D(C):
1323 pass
1324 d = D()
1325 self.assertEqual(D.goo(1), (D, 1))
1326 self.assertEqual(d.goo(1), (D, 1))
1327 self.assertEqual(d.foo(1), (d, 1))
1328 self.assertEqual(D.foo(d, 1), (d, 1))
1329 class E: # *not* subclassing from C
1330 foo = C.foo
1331 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
1332 self.assert_(repr(C.foo.__get__(C())).startswith("<bound method "))
1333
1334 def test_compattr(self):
1335 # Testing computed attributes...
1336 class C(object):
1337 class computed_attribute(object):
1338 def __init__(self, get, set=None, delete=None):
1339 self.__get = get
1340 self.__set = set
1341 self.__delete = delete
1342 def __get__(self, obj, type=None):
1343 return self.__get(obj)
1344 def __set__(self, obj, value):
1345 return self.__set(obj, value)
1346 def __delete__(self, obj):
1347 return self.__delete(obj)
1348 def __init__(self):
1349 self.__x = 0
1350 def __get_x(self):
1351 x = self.__x
1352 self.__x = x+1
1353 return x
1354 def __set_x(self, x):
1355 self.__x = x
1356 def __delete_x(self):
1357 del self.__x
1358 x = computed_attribute(__get_x, __set_x, __delete_x)
1359 a = C()
1360 self.assertEqual(a.x, 0)
1361 self.assertEqual(a.x, 1)
1362 a.x = 10
1363 self.assertEqual(a.x, 10)
1364 self.assertEqual(a.x, 11)
1365 del a.x
1366 self.assertEqual(hasattr(a, 'x'), 0)
1367
1368 def test_newslots(self):
1369 # Testing __new__ slot override...
1370 class C(list):
1371 def __new__(cls):
1372 self = list.__new__(cls)
1373 self.foo = 1
1374 return self
1375 def __init__(self):
1376 self.foo = self.foo + 2
1377 a = C()
1378 self.assertEqual(a.foo, 3)
1379 self.assertEqual(a.__class__, C)
1380 class D(C):
1381 pass
1382 b = D()
1383 self.assertEqual(b.foo, 3)
1384 self.assertEqual(b.__class__, D)
1385
1386 def test_altmro(self):
1387 # Testing mro() and overriding it...
1388 class A(object):
1389 def f(self): return "A"
1390 class B(A):
1391 pass
1392 class C(A):
1393 def f(self): return "C"
1394 class D(B, C):
1395 pass
1396 self.assertEqual(D.mro(), [D, B, C, A, object])
1397 self.assertEqual(D.__mro__, (D, B, C, A, object))
1398 self.assertEqual(D().f(), "C")
1399
1400 class PerverseMetaType(type):
1401 def mro(cls):
1402 L = type.mro(cls)
1403 L.reverse()
1404 return L
1405 class X(D,B,C,A, metaclass=PerverseMetaType):
1406 pass
1407 self.assertEqual(X.__mro__, (object, A, C, B, D, X))
1408 self.assertEqual(X().f(), "A")
1409
1410 try:
1411 class _metaclass(type):
1412 def mro(self):
1413 return [self, dict, object]
1414 class X(object, metaclass=_metaclass):
1415 pass
1416 except TypeError:
1417 pass
1418 else:
1419 self.fail("devious mro() return not caught")
1420
1421 try:
1422 class _metaclass(type):
1423 def mro(self):
1424 return [1]
1425 class X(object, metaclass=_metaclass):
1426 pass
1427 except TypeError:
1428 pass
1429 else:
1430 self.fail("non-class mro() return not caught")
1431
1432 try:
1433 class _metaclass(type):
1434 def mro(self):
1435 return 1
1436 class X(object, metaclass=_metaclass):
1437 pass
1438 except TypeError:
1439 pass
1440 else:
1441 self.fail("non-sequence mro() return not caught")
1442
1443 def test_overloading(self):
1444 # Testing operator overloading...
1445
1446 class B(object):
1447 "Intermediate class because object doesn't have a __setattr__"
1448
1449 class C(B):
1450 def __getattr__(self, name):
1451 if name == "foo":
1452 return ("getattr", name)
1453 else:
1454 raise AttributeError
1455 def __setattr__(self, name, value):
1456 if name == "foo":
1457 self.setattr = (name, value)
1458 else:
1459 return B.__setattr__(self, name, value)
1460 def __delattr__(self, name):
1461 if name == "foo":
1462 self.delattr = name
1463 else:
1464 return B.__delattr__(self, name)
1465
1466 def __getitem__(self, key):
1467 return ("getitem", key)
1468 def __setitem__(self, key, value):
1469 self.setitem = (key, value)
1470 def __delitem__(self, key):
1471 self.delitem = key
1472
1473 a = C()
1474 self.assertEqual(a.foo, ("getattr", "foo"))
1475 a.foo = 12
1476 self.assertEqual(a.setattr, ("foo", 12))
1477 del a.foo
1478 self.assertEqual(a.delattr, "foo")
1479
1480 self.assertEqual(a[12], ("getitem", 12))
1481 a[12] = 21
1482 self.assertEqual(a.setitem, (12, 21))
1483 del a[12]
1484 self.assertEqual(a.delitem, 12)
1485
1486 self.assertEqual(a[0:10], ("getitem", slice(0, 10)))
1487 a[0:10] = "foo"
1488 self.assertEqual(a.setitem, (slice(0, 10), "foo"))
1489 del a[0:10]
1490 self.assertEqual(a.delitem, (slice(0, 10)))
1491
1492 def test_methods(self):
1493 # Testing methods...
1494 class C(object):
1495 def __init__(self, x):
1496 self.x = x
1497 def foo(self):
1498 return self.x
1499 c1 = C(1)
1500 self.assertEqual(c1.foo(), 1)
1501 class D(C):
1502 boo = C.foo
1503 goo = c1.foo
1504 d2 = D(2)
1505 self.assertEqual(d2.foo(), 2)
1506 self.assertEqual(d2.boo(), 2)
1507 self.assertEqual(d2.goo(), 1)
1508 class E(object):
1509 foo = C.foo
1510 self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound
1511 self.assert_(repr(C.foo.__get__(C(1))).startswith("<bound method "))
1512
1513 def test_specials(self):
1514 # Testing special operators...
1515 # Test operators like __hash__ for which a built-in default exists
1516
1517 # Test the default behavior for static classes
1518 class C(object):
1519 def __getitem__(self, i):
1520 if 0 <= i < 10: return i
1521 raise IndexError
1522 c1 = C()
1523 c2 = C()
1524 self.assert_(not not c1) # What?
1525 self.assertNotEqual(id(c1), id(c2))
1526 hash(c1)
1527 hash(c2)
1528 ## self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
1529 self.assertEqual(c1, c1)
1530 self.assert_(c1 != c2)
1531 self.assert_(not c1 != c1)
1532 self.assert_(not c1 == c2)
1533 # Note that the module name appears in str/repr, and that varies
1534 # depending on whether this test is run standalone or from a framework.
1535 self.assert_(str(c1).find('C object at ') >= 0)
1536 self.assertEqual(str(c1), repr(c1))
1537 self.assert_(-1 not in c1)
1538 for i in range(10):
1539 self.assert_(i in c1)
1540 self.assertFalse(10 in c1)
1541 # Test the default behavior for dynamic classes
1542 class D(object):
1543 def __getitem__(self, i):
1544 if 0 <= i < 10: return i
1545 raise IndexError
1546 d1 = D()
1547 d2 = D()
1548 self.assert_(not not d1)
1549 self.assertNotEqual(id(d1), id(d2))
1550 hash(d1)
1551 hash(d2)
1552 ## self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
1553 self.assertEqual(d1, d1)
1554 self.assertNotEqual(d1, d2)
1555 self.assert_(not d1 != d1)
1556 self.assert_(not d1 == d2)
1557 # Note that the module name appears in str/repr, and that varies
1558 # depending on whether this test is run standalone or from a framework.
1559 self.assert_(str(d1).find('D object at ') >= 0)
1560 self.assertEqual(str(d1), repr(d1))
1561 self.assert_(-1 not in d1)
1562 for i in range(10):
1563 self.assert_(i in d1)
1564 self.assertFalse(10 in d1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001565 # Test overridden behavior
Georg Brandl479a7e72008-02-05 18:13:15 +00001566 class Proxy(object):
1567 def __init__(self, x):
1568 self.x = x
1569 def __bool__(self):
1570 return not not self.x
1571 def __hash__(self):
1572 return hash(self.x)
1573 def __eq__(self, other):
1574 return self.x == other
1575 def __ne__(self, other):
1576 return self.x != other
Benjamin Peterson60192082008-10-16 19:34:46 +00001577 def __ge__(self, other):
1578 return self.x >= other
1579 def __gt__(self, other):
1580 return self.x > other
1581 def __le__(self, other):
1582 return self.x <= other
1583 def __lt__(self, other):
1584 return self.x < other
Georg Brandl479a7e72008-02-05 18:13:15 +00001585 def __str__(self):
1586 return "Proxy:%s" % self.x
1587 def __repr__(self):
1588 return "Proxy(%r)" % self.x
1589 def __contains__(self, value):
1590 return value in self.x
1591 p0 = Proxy(0)
1592 p1 = Proxy(1)
1593 p_1 = Proxy(-1)
1594 self.assertFalse(p0)
1595 self.assert_(not not p1)
1596 self.assertEqual(hash(p0), hash(0))
1597 self.assertEqual(p0, p0)
1598 self.assertNotEqual(p0, p1)
1599 self.assert_(not p0 != p0)
1600 self.assertEqual(not p0, p1)
Benjamin Peterson60192082008-10-16 19:34:46 +00001601 self.assert_(p0 < p1)
1602 self.assert_(p0 <= p1)
1603 self.assert_(p1 > p0)
1604 self.assert_(p1 >= p0)
Georg Brandl479a7e72008-02-05 18:13:15 +00001605 self.assertEqual(str(p0), "Proxy:0")
1606 self.assertEqual(repr(p0), "Proxy(0)")
1607 p10 = Proxy(range(10))
1608 self.assertFalse(-1 in p10)
1609 for i in range(10):
1610 self.assert_(i in p10)
1611 self.assertFalse(10 in p10)
Georg Brandl479a7e72008-02-05 18:13:15 +00001612
1613 ## # Safety test for __cmp__
1614 ## def unsafecmp(a, b):
1615 ## try:
1616 ## a.__class__.__cmp__(a, b)
1617 ## except TypeError:
1618 ## pass
1619 ## else:
1620 ## self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
1621 ## a.__class__, a, b))
1622 ##
1623 ## unsafecmp("123", "123")
1624 ## unsafecmp("123", "123")
1625 ## unsafecmp(1, 1.0)
1626 ## unsafecmp(1.0, 1)
1627 ## unsafecmp(1, 1)
1628 ## unsafecmp(1, 1)
1629
1630 def test_weakrefs(self):
1631 # Testing weak references...
1632 import weakref
1633 class C(object):
1634 pass
1635 c = C()
1636 r = weakref.ref(c)
1637 self.assertEqual(r(), c)
1638 del c
1639 self.assertEqual(r(), None)
1640 del r
1641 class NoWeak(object):
1642 __slots__ = ['foo']
1643 no = NoWeak()
1644 try:
1645 weakref.ref(no)
1646 except TypeError as msg:
1647 self.assert_(str(msg).find("weak reference") >= 0)
1648 else:
1649 self.fail("weakref.ref(no) should be illegal")
1650 class Weak(object):
1651 __slots__ = ['foo', '__weakref__']
1652 yes = Weak()
1653 r = weakref.ref(yes)
1654 self.assertEqual(r(), yes)
1655 del yes
1656 self.assertEqual(r(), None)
1657 del r
1658
1659 def test_properties(self):
1660 # Testing property...
1661 class C(object):
1662 def getx(self):
1663 return self.__x
1664 def setx(self, value):
1665 self.__x = value
1666 def delx(self):
1667 del self.__x
1668 x = property(getx, setx, delx, doc="I'm the x property.")
1669 a = C()
1670 self.assertFalse(hasattr(a, "x"))
1671 a.x = 42
1672 self.assertEqual(a._C__x, 42)
1673 self.assertEqual(a.x, 42)
1674 del a.x
1675 self.assertFalse(hasattr(a, "x"))
1676 self.assertFalse(hasattr(a, "_C__x"))
1677 C.x.__set__(a, 100)
1678 self.assertEqual(C.x.__get__(a), 100)
1679 C.x.__delete__(a)
1680 self.assertFalse(hasattr(a, "x"))
1681
1682 raw = C.__dict__['x']
1683 self.assert_(isinstance(raw, property))
1684
1685 attrs = dir(raw)
1686 self.assert_("__doc__" in attrs)
1687 self.assert_("fget" in attrs)
1688 self.assert_("fset" in attrs)
1689 self.assert_("fdel" in attrs)
1690
1691 self.assertEqual(raw.__doc__, "I'm the x property.")
1692 self.assert_(raw.fget is C.__dict__['getx'])
1693 self.assert_(raw.fset is C.__dict__['setx'])
1694 self.assert_(raw.fdel is C.__dict__['delx'])
1695
1696 for attr in "__doc__", "fget", "fset", "fdel":
1697 try:
1698 setattr(raw, attr, 42)
1699 except AttributeError as msg:
1700 if str(msg).find('readonly') < 0:
1701 self.fail("when setting readonly attr %r on a property, "
1702 "got unexpected AttributeError msg %r" % (attr, str(msg)))
1703 else:
1704 self.fail("expected AttributeError from trying to set readonly %r "
1705 "attr on a property" % attr)
1706
1707 class D(object):
1708 __getitem__ = property(lambda s: 1/0)
1709
1710 d = D()
1711 try:
1712 for i in d:
1713 str(i)
1714 except ZeroDivisionError:
1715 pass
1716 else:
1717 self.fail("expected ZeroDivisionError from bad property")
1718
1719 class E(object):
1720 def getter(self):
1721 "getter method"
1722 return 0
1723 def setter(self_, value):
1724 "setter method"
1725 pass
1726 prop = property(getter)
1727 self.assertEqual(prop.__doc__, "getter method")
1728 prop2 = property(fset=setter)
1729 self.assertEqual(prop2.__doc__, None)
1730
1731 # this segfaulted in 2.5b2
1732 try:
1733 import _testcapi
1734 except ImportError:
1735 pass
1736 else:
1737 class X(object):
1738 p = property(_testcapi.test_with_docstring)
1739
1740 def test_properties_plus(self):
1741 class C(object):
1742 foo = property(doc="hello")
1743 @foo.getter
1744 def foo(self):
1745 return self._foo
1746 @foo.setter
1747 def foo(self, value):
1748 self._foo = abs(value)
1749 @foo.deleter
1750 def foo(self):
1751 del self._foo
1752 c = C()
1753 self.assertEqual(C.foo.__doc__, "hello")
1754 self.assertFalse(hasattr(c, "foo"))
1755 c.foo = -42
1756 self.assert_(hasattr(c, '_foo'))
1757 self.assertEqual(c._foo, 42)
1758 self.assertEqual(c.foo, 42)
1759 del c.foo
1760 self.assertFalse(hasattr(c, '_foo'))
1761 self.assertFalse(hasattr(c, "foo"))
1762
1763 class D(C):
1764 @C.foo.deleter
1765 def foo(self):
1766 try:
1767 del self._foo
1768 except AttributeError:
1769 pass
1770 d = D()
1771 d.foo = 24
1772 self.assertEqual(d.foo, 24)
1773 del d.foo
1774 del d.foo
1775
1776 class E(object):
1777 @property
1778 def foo(self):
1779 return self._foo
1780 @foo.setter
1781 def foo(self, value):
1782 raise RuntimeError
1783 @foo.setter
1784 def foo(self, value):
1785 self._foo = abs(value)
1786 @foo.deleter
1787 def foo(self, value=None):
1788 del self._foo
1789
1790 e = E()
1791 e.foo = -42
1792 self.assertEqual(e.foo, 42)
1793 del e.foo
1794
1795 class F(E):
1796 @E.foo.deleter
1797 def foo(self):
1798 del self._foo
1799 @foo.setter
1800 def foo(self, value):
1801 self._foo = max(0, value)
1802 f = F()
1803 f.foo = -10
1804 self.assertEqual(f.foo, 0)
1805 del f.foo
1806
1807 def test_dict_constructors(self):
1808 # Testing dict constructor ...
1809 d = dict()
1810 self.assertEqual(d, {})
1811 d = dict({})
1812 self.assertEqual(d, {})
1813 d = dict({1: 2, 'a': 'b'})
1814 self.assertEqual(d, {1: 2, 'a': 'b'})
1815 self.assertEqual(d, dict(list(d.items())))
1816 self.assertEqual(d, dict(iter(d.items())))
1817 d = dict({'one':1, 'two':2})
1818 self.assertEqual(d, dict(one=1, two=2))
1819 self.assertEqual(d, dict(**d))
1820 self.assertEqual(d, dict({"one": 1}, two=2))
1821 self.assertEqual(d, dict([("two", 2)], one=1))
1822 self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
1823 self.assertEqual(d, dict(**d))
1824
1825 for badarg in 0, 0, 0j, "0", [0], (0,):
1826 try:
1827 dict(badarg)
1828 except TypeError:
1829 pass
1830 except ValueError:
1831 if badarg == "0":
1832 # It's a sequence, and its elements are also sequences (gotta
1833 # love strings <wink>), but they aren't of length 2, so this
1834 # one seemed better as a ValueError than a TypeError.
1835 pass
1836 else:
1837 self.fail("no TypeError from dict(%r)" % badarg)
1838 else:
1839 self.fail("no TypeError from dict(%r)" % badarg)
1840
1841 try:
1842 dict({}, {})
1843 except TypeError:
1844 pass
1845 else:
1846 self.fail("no TypeError from dict({}, {})")
1847
1848 class Mapping:
1849 # Lacks a .keys() method; will be added later.
1850 dict = {1:2, 3:4, 'a':1j}
1851
1852 try:
1853 dict(Mapping())
1854 except TypeError:
1855 pass
1856 else:
1857 self.fail("no TypeError from dict(incomplete mapping)")
1858
1859 Mapping.keys = lambda self: list(self.dict.keys())
1860 Mapping.__getitem__ = lambda self, i: self.dict[i]
1861 d = dict(Mapping())
1862 self.assertEqual(d, Mapping.dict)
1863
1864 # Init from sequence of iterable objects, each producing a 2-sequence.
1865 class AddressBookEntry:
1866 def __init__(self, first, last):
1867 self.first = first
1868 self.last = last
1869 def __iter__(self):
1870 return iter([self.first, self.last])
1871
1872 d = dict([AddressBookEntry('Tim', 'Warsaw'),
1873 AddressBookEntry('Barry', 'Peters'),
1874 AddressBookEntry('Tim', 'Peters'),
1875 AddressBookEntry('Barry', 'Warsaw')])
1876 self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
1877
1878 d = dict(zip(range(4), range(1, 5)))
1879 self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
1880
1881 # Bad sequence lengths.
1882 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
1883 try:
1884 dict(bad)
1885 except ValueError:
1886 pass
1887 else:
1888 self.fail("no ValueError from dict(%r)" % bad)
1889
1890 def test_dir(self):
1891 # Testing dir() ...
1892 junk = 12
1893 self.assertEqual(dir(), ['junk', 'self'])
1894 del junk
1895
1896 # Just make sure these don't blow up!
1897 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, self.test_dir:
1898 dir(arg)
1899
1900 # Test dir on new-style classes. Since these have object as a
1901 # base class, a lot more gets sucked in.
1902 def interesting(strings):
1903 return [s for s in strings if not s.startswith('_')]
1904
1905 class C(object):
1906 Cdata = 1
1907 def Cmethod(self): pass
1908
1909 cstuff = ['Cdata', 'Cmethod']
1910 self.assertEqual(interesting(dir(C)), cstuff)
1911
1912 c = C()
1913 self.assertEqual(interesting(dir(c)), cstuff)
1914 ## self.assert_('__self__' in dir(C.Cmethod))
1915
1916 c.cdata = 2
1917 c.cmethod = lambda self: 0
1918 self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
1919 ## self.assert_('__self__' in dir(c.Cmethod))
1920
1921 class A(C):
1922 Adata = 1
1923 def Amethod(self): pass
1924
1925 astuff = ['Adata', 'Amethod'] + cstuff
1926 self.assertEqual(interesting(dir(A)), astuff)
1927 ## self.assert_('__self__' in dir(A.Amethod))
1928 a = A()
1929 self.assertEqual(interesting(dir(a)), astuff)
1930 a.adata = 42
1931 a.amethod = lambda self: 3
1932 self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
1933 ## self.assert_('__self__' in dir(a.Amethod))
1934
1935 # Try a module subclass.
1936 import sys
1937 class M(type(sys)):
1938 pass
1939 minstance = M("m")
1940 minstance.b = 2
1941 minstance.a = 1
1942 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
1943 self.assertEqual(names, ['a', 'b'])
1944
1945 class M2(M):
1946 def getdict(self):
1947 return "Not a dict!"
1948 __dict__ = property(getdict)
1949
1950 m2instance = M2("m2")
1951 m2instance.b = 2
1952 m2instance.a = 1
1953 self.assertEqual(m2instance.__dict__, "Not a dict!")
1954 try:
1955 dir(m2instance)
1956 except TypeError:
1957 pass
1958
1959 # Two essentially featureless objects, just inheriting stuff from
1960 # object.
1961 self.assertEqual(dir(None), dir(Ellipsis))
1962
1963 # Nasty test case for proxied objects
1964 class Wrapper(object):
1965 def __init__(self, obj):
1966 self.__obj = obj
1967 def __repr__(self):
1968 return "Wrapper(%s)" % repr(self.__obj)
1969 def __getitem__(self, key):
1970 return Wrapper(self.__obj[key])
1971 def __len__(self):
1972 return len(self.__obj)
1973 def __getattr__(self, name):
1974 return Wrapper(getattr(self.__obj, name))
1975
1976 class C(object):
1977 def __getclass(self):
1978 return Wrapper(type(self))
1979 __class__ = property(__getclass)
1980
1981 dir(C()) # This used to segfault
1982
1983 def test_supers(self):
1984 # Testing super...
1985
1986 class A(object):
1987 def meth(self, a):
1988 return "A(%r)" % a
1989
1990 self.assertEqual(A().meth(1), "A(1)")
1991
1992 class B(A):
1993 def __init__(self):
1994 self.__super = super(B, self)
1995 def meth(self, a):
1996 return "B(%r)" % a + self.__super.meth(a)
1997
1998 self.assertEqual(B().meth(2), "B(2)A(2)")
1999
2000 class C(A):
2001 def meth(self, a):
2002 return "C(%r)" % a + self.__super.meth(a)
2003 C._C__super = super(C)
2004
2005 self.assertEqual(C().meth(3), "C(3)A(3)")
2006
2007 class D(C, B):
2008 def meth(self, a):
2009 return "D(%r)" % a + super(D, self).meth(a)
2010
2011 self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
2012
2013 # Test for subclassing super
2014
2015 class mysuper(super):
2016 def __init__(self, *args):
2017 return super(mysuper, self).__init__(*args)
2018
2019 class E(D):
2020 def meth(self, a):
2021 return "E(%r)" % a + mysuper(E, self).meth(a)
2022
2023 self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2024
2025 class F(E):
2026 def meth(self, a):
2027 s = self.__super # == mysuper(F, self)
2028 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2029 F._F__super = mysuper(F)
2030
2031 self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2032
2033 # Make sure certain errors are raised
2034
2035 try:
2036 super(D, 42)
2037 except TypeError:
2038 pass
2039 else:
2040 self.fail("shouldn't allow super(D, 42)")
2041
2042 try:
2043 super(D, C())
2044 except TypeError:
2045 pass
2046 else:
2047 self.fail("shouldn't allow super(D, C())")
2048
2049 try:
2050 super(D).__get__(12)
2051 except TypeError:
2052 pass
2053 else:
2054 self.fail("shouldn't allow super(D).__get__(12)")
2055
2056 try:
2057 super(D).__get__(C())
2058 except TypeError:
2059 pass
2060 else:
2061 self.fail("shouldn't allow super(D).__get__(C())")
2062
2063 # Make sure data descriptors can be overridden and accessed via super
2064 # (new feature in Python 2.3)
2065
2066 class DDbase(object):
2067 def getx(self): return 42
2068 x = property(getx)
2069
2070 class DDsub(DDbase):
2071 def getx(self): return "hello"
2072 x = property(getx)
2073
2074 dd = DDsub()
2075 self.assertEqual(dd.x, "hello")
2076 self.assertEqual(super(DDsub, dd).x, 42)
2077
2078 # Ensure that super() lookup of descriptor from classmethod
2079 # works (SF ID# 743627)
2080
2081 class Base(object):
2082 aProp = property(lambda self: "foo")
2083
2084 class Sub(Base):
2085 @classmethod
2086 def test(klass):
2087 return super(Sub,klass).aProp
2088
2089 self.assertEqual(Sub.test(), Base.aProp)
2090
2091 # Verify that super() doesn't allow keyword args
2092 try:
2093 super(Base, kw=1)
2094 except TypeError:
2095 pass
2096 else:
2097 self.assertEqual("super shouldn't accept keyword args")
2098
2099 def test_basic_inheritance(self):
2100 # Testing inheritance from basic types...
2101
2102 class hexint(int):
2103 def __repr__(self):
2104 return hex(self)
2105 def __add__(self, other):
2106 return hexint(int.__add__(self, other))
2107 # (Note that overriding __radd__ doesn't work,
2108 # because the int type gets first dibs.)
2109 self.assertEqual(repr(hexint(7) + 9), "0x10")
2110 self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
2111 a = hexint(12345)
2112 self.assertEqual(a, 12345)
2113 self.assertEqual(int(a), 12345)
2114 self.assert_(int(a).__class__ is int)
2115 self.assertEqual(hash(a), hash(12345))
2116 self.assert_((+a).__class__ is int)
2117 self.assert_((a >> 0).__class__ is int)
2118 self.assert_((a << 0).__class__ is int)
2119 self.assert_((hexint(0) << 12).__class__ is int)
2120 self.assert_((hexint(0) >> 12).__class__ is int)
2121
2122 class octlong(int):
2123 __slots__ = []
2124 def __str__(self):
2125 s = oct(self)
2126 if s[-1] == 'L':
2127 s = s[:-1]
2128 return s
2129 def __add__(self, other):
2130 return self.__class__(super(octlong, self).__add__(other))
2131 __radd__ = __add__
2132 self.assertEqual(str(octlong(3) + 5), "0o10")
2133 # (Note that overriding __radd__ here only seems to work
2134 # because the example uses a short int left argument.)
2135 self.assertEqual(str(5 + octlong(3000)), "0o5675")
2136 a = octlong(12345)
2137 self.assertEqual(a, 12345)
2138 self.assertEqual(int(a), 12345)
2139 self.assertEqual(hash(a), hash(12345))
2140 self.assert_(int(a).__class__ is int)
2141 self.assert_((+a).__class__ is int)
2142 self.assert_((-a).__class__ is int)
2143 self.assert_((-octlong(0)).__class__ is int)
2144 self.assert_((a >> 0).__class__ is int)
2145 self.assert_((a << 0).__class__ is int)
2146 self.assert_((a - 0).__class__ is int)
2147 self.assert_((a * 1).__class__ is int)
2148 self.assert_((a ** 1).__class__ is int)
2149 self.assert_((a // 1).__class__ is int)
2150 self.assert_((1 * a).__class__ is int)
2151 self.assert_((a | 0).__class__ is int)
2152 self.assert_((a ^ 0).__class__ is int)
2153 self.assert_((a & -1).__class__ is int)
2154 self.assert_((octlong(0) << 12).__class__ is int)
2155 self.assert_((octlong(0) >> 12).__class__ is int)
2156 self.assert_(abs(octlong(0)).__class__ is int)
2157
2158 # Because octlong overrides __add__, we can't check the absence of +0
2159 # optimizations using octlong.
2160 class longclone(int):
2161 pass
2162 a = longclone(1)
2163 self.assert_((a + 0).__class__ is int)
2164 self.assert_((0 + a).__class__ is int)
2165
2166 # Check that negative clones don't segfault
2167 a = longclone(-1)
2168 self.assertEqual(a.__dict__, {})
2169 self.assertEqual(int(a), -1) # self.assert_ PyNumber_Long() copies the sign bit
2170
2171 class precfloat(float):
2172 __slots__ = ['prec']
2173 def __init__(self, value=0.0, prec=12):
2174 self.prec = int(prec)
2175 def __repr__(self):
2176 return "%.*g" % (self.prec, self)
2177 self.assertEqual(repr(precfloat(1.1)), "1.1")
2178 a = precfloat(12345)
2179 self.assertEqual(a, 12345.0)
2180 self.assertEqual(float(a), 12345.0)
2181 self.assert_(float(a).__class__ is float)
2182 self.assertEqual(hash(a), hash(12345.0))
2183 self.assert_((+a).__class__ is float)
2184
2185 class madcomplex(complex):
2186 def __repr__(self):
2187 return "%.17gj%+.17g" % (self.imag, self.real)
2188 a = madcomplex(-3, 4)
2189 self.assertEqual(repr(a), "4j-3")
2190 base = complex(-3, 4)
2191 self.assertEqual(base.__class__, complex)
2192 self.assertEqual(a, base)
2193 self.assertEqual(complex(a), base)
2194 self.assertEqual(complex(a).__class__, complex)
2195 a = madcomplex(a) # just trying another form of the constructor
2196 self.assertEqual(repr(a), "4j-3")
2197 self.assertEqual(a, base)
2198 self.assertEqual(complex(a), base)
2199 self.assertEqual(complex(a).__class__, complex)
2200 self.assertEqual(hash(a), hash(base))
2201 self.assertEqual((+a).__class__, complex)
2202 self.assertEqual((a + 0).__class__, complex)
2203 self.assertEqual(a + 0, base)
2204 self.assertEqual((a - 0).__class__, complex)
2205 self.assertEqual(a - 0, base)
2206 self.assertEqual((a * 1).__class__, complex)
2207 self.assertEqual(a * 1, base)
2208 self.assertEqual((a / 1).__class__, complex)
2209 self.assertEqual(a / 1, base)
2210
2211 class madtuple(tuple):
2212 _rev = None
2213 def rev(self):
2214 if self._rev is not None:
2215 return self._rev
2216 L = list(self)
2217 L.reverse()
2218 self._rev = self.__class__(L)
2219 return self._rev
2220 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2221 self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
2222 self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2223 self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2224 for i in range(512):
2225 t = madtuple(range(i))
2226 u = t.rev()
2227 v = u.rev()
2228 self.assertEqual(v, t)
2229 a = madtuple((1,2,3,4,5))
2230 self.assertEqual(tuple(a), (1,2,3,4,5))
2231 self.assert_(tuple(a).__class__ is tuple)
2232 self.assertEqual(hash(a), hash((1,2,3,4,5)))
2233 self.assert_(a[:].__class__ is tuple)
2234 self.assert_((a * 1).__class__ is tuple)
2235 self.assert_((a * 0).__class__ is tuple)
2236 self.assert_((a + ()).__class__ is tuple)
2237 a = madtuple(())
2238 self.assertEqual(tuple(a), ())
2239 self.assert_(tuple(a).__class__ is tuple)
2240 self.assert_((a + a).__class__ is tuple)
2241 self.assert_((a * 0).__class__ is tuple)
2242 self.assert_((a * 1).__class__ is tuple)
2243 self.assert_((a * 2).__class__ is tuple)
2244 self.assert_(a[:].__class__ is tuple)
2245
2246 class madstring(str):
2247 _rev = None
2248 def rev(self):
2249 if self._rev is not None:
2250 return self._rev
2251 L = list(self)
2252 L.reverse()
2253 self._rev = self.__class__("".join(L))
2254 return self._rev
2255 s = madstring("abcdefghijklmnopqrstuvwxyz")
2256 self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
2257 self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2258 self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2259 for i in range(256):
2260 s = madstring("".join(map(chr, range(i))))
2261 t = s.rev()
2262 u = t.rev()
2263 self.assertEqual(u, s)
2264 s = madstring("12345")
2265 self.assertEqual(str(s), "12345")
2266 self.assert_(str(s).__class__ is str)
2267
2268 base = "\x00" * 5
2269 s = madstring(base)
2270 self.assertEqual(s, base)
2271 self.assertEqual(str(s), base)
2272 self.assert_(str(s).__class__ is str)
2273 self.assertEqual(hash(s), hash(base))
2274 self.assertEqual({s: 1}[base], 1)
2275 self.assertEqual({base: 1}[s], 1)
2276 self.assert_((s + "").__class__ is str)
2277 self.assertEqual(s + "", base)
2278 self.assert_(("" + s).__class__ is str)
2279 self.assertEqual("" + s, base)
2280 self.assert_((s * 0).__class__ is str)
2281 self.assertEqual(s * 0, "")
2282 self.assert_((s * 1).__class__ is str)
2283 self.assertEqual(s * 1, base)
2284 self.assert_((s * 2).__class__ is str)
2285 self.assertEqual(s * 2, base + base)
2286 self.assert_(s[:].__class__ is str)
2287 self.assertEqual(s[:], base)
2288 self.assert_(s[0:0].__class__ is str)
2289 self.assertEqual(s[0:0], "")
2290 self.assert_(s.strip().__class__ is str)
2291 self.assertEqual(s.strip(), base)
2292 self.assert_(s.lstrip().__class__ is str)
2293 self.assertEqual(s.lstrip(), base)
2294 self.assert_(s.rstrip().__class__ is str)
2295 self.assertEqual(s.rstrip(), base)
2296 identitytab = {}
2297 self.assert_(s.translate(identitytab).__class__ is str)
2298 self.assertEqual(s.translate(identitytab), base)
2299 self.assert_(s.replace("x", "x").__class__ is str)
2300 self.assertEqual(s.replace("x", "x"), base)
2301 self.assert_(s.ljust(len(s)).__class__ is str)
2302 self.assertEqual(s.ljust(len(s)), base)
2303 self.assert_(s.rjust(len(s)).__class__ is str)
2304 self.assertEqual(s.rjust(len(s)), base)
2305 self.assert_(s.center(len(s)).__class__ is str)
2306 self.assertEqual(s.center(len(s)), base)
2307 self.assert_(s.lower().__class__ is str)
2308 self.assertEqual(s.lower(), base)
2309
2310 class madunicode(str):
2311 _rev = None
2312 def rev(self):
2313 if self._rev is not None:
2314 return self._rev
2315 L = list(self)
2316 L.reverse()
2317 self._rev = self.__class__("".join(L))
2318 return self._rev
2319 u = madunicode("ABCDEF")
2320 self.assertEqual(u, "ABCDEF")
2321 self.assertEqual(u.rev(), madunicode("FEDCBA"))
2322 self.assertEqual(u.rev().rev(), madunicode("ABCDEF"))
2323 base = "12345"
2324 u = madunicode(base)
2325 self.assertEqual(str(u), base)
2326 self.assert_(str(u).__class__ is str)
2327 self.assertEqual(hash(u), hash(base))
2328 self.assertEqual({u: 1}[base], 1)
2329 self.assertEqual({base: 1}[u], 1)
2330 self.assert_(u.strip().__class__ is str)
2331 self.assertEqual(u.strip(), base)
2332 self.assert_(u.lstrip().__class__ is str)
2333 self.assertEqual(u.lstrip(), base)
2334 self.assert_(u.rstrip().__class__ is str)
2335 self.assertEqual(u.rstrip(), base)
2336 self.assert_(u.replace("x", "x").__class__ is str)
2337 self.assertEqual(u.replace("x", "x"), base)
2338 self.assert_(u.replace("xy", "xy").__class__ is str)
2339 self.assertEqual(u.replace("xy", "xy"), base)
2340 self.assert_(u.center(len(u)).__class__ is str)
2341 self.assertEqual(u.center(len(u)), base)
2342 self.assert_(u.ljust(len(u)).__class__ is str)
2343 self.assertEqual(u.ljust(len(u)), base)
2344 self.assert_(u.rjust(len(u)).__class__ is str)
2345 self.assertEqual(u.rjust(len(u)), base)
2346 self.assert_(u.lower().__class__ is str)
2347 self.assertEqual(u.lower(), base)
2348 self.assert_(u.upper().__class__ is str)
2349 self.assertEqual(u.upper(), base)
2350 self.assert_(u.capitalize().__class__ is str)
2351 self.assertEqual(u.capitalize(), base)
2352 self.assert_(u.title().__class__ is str)
2353 self.assertEqual(u.title(), base)
2354 self.assert_((u + "").__class__ is str)
2355 self.assertEqual(u + "", base)
2356 self.assert_(("" + u).__class__ is str)
2357 self.assertEqual("" + u, base)
2358 self.assert_((u * 0).__class__ is str)
2359 self.assertEqual(u * 0, "")
2360 self.assert_((u * 1).__class__ is str)
2361 self.assertEqual(u * 1, base)
2362 self.assert_((u * 2).__class__ is str)
2363 self.assertEqual(u * 2, base + base)
2364 self.assert_(u[:].__class__ is str)
2365 self.assertEqual(u[:], base)
2366 self.assert_(u[0:0].__class__ is str)
2367 self.assertEqual(u[0:0], "")
2368
2369 class sublist(list):
2370 pass
2371 a = sublist(range(5))
2372 self.assertEqual(a, list(range(5)))
2373 a.append("hello")
2374 self.assertEqual(a, list(range(5)) + ["hello"])
2375 a[5] = 5
2376 self.assertEqual(a, list(range(6)))
2377 a.extend(range(6, 20))
2378 self.assertEqual(a, list(range(20)))
2379 a[-5:] = []
2380 self.assertEqual(a, list(range(15)))
2381 del a[10:15]
2382 self.assertEqual(len(a), 10)
2383 self.assertEqual(a, list(range(10)))
2384 self.assertEqual(list(a), list(range(10)))
2385 self.assertEqual(a[0], 0)
2386 self.assertEqual(a[9], 9)
2387 self.assertEqual(a[-10], 0)
2388 self.assertEqual(a[-1], 9)
2389 self.assertEqual(a[:5], list(range(5)))
2390
2391 ## class CountedInput(file):
2392 ## """Counts lines read by self.readline().
2393 ##
2394 ## self.lineno is the 0-based ordinal of the last line read, up to
2395 ## a maximum of one greater than the number of lines in the file.
2396 ##
2397 ## self.ateof is true if and only if the final "" line has been read,
2398 ## at which point self.lineno stops incrementing, and further calls
2399 ## to readline() continue to return "".
2400 ## """
2401 ##
2402 ## lineno = 0
2403 ## ateof = 0
2404 ## def readline(self):
2405 ## if self.ateof:
2406 ## return ""
2407 ## s = file.readline(self)
2408 ## # Next line works too.
2409 ## # s = super(CountedInput, self).readline()
2410 ## self.lineno += 1
2411 ## if s == "":
2412 ## self.ateof = 1
2413 ## return s
2414 ##
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002415 ## f = file(name=support.TESTFN, mode='w')
Georg Brandl479a7e72008-02-05 18:13:15 +00002416 ## lines = ['a\n', 'b\n', 'c\n']
2417 ## try:
2418 ## f.writelines(lines)
2419 ## f.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002420 ## f = CountedInput(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002421 ## for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2422 ## got = f.readline()
2423 ## self.assertEqual(expected, got)
2424 ## self.assertEqual(f.lineno, i)
2425 ## self.assertEqual(f.ateof, (i > len(lines)))
2426 ## f.close()
2427 ## finally:
2428 ## try:
2429 ## f.close()
2430 ## except:
2431 ## pass
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002432 ## support.unlink(support.TESTFN)
Georg Brandl479a7e72008-02-05 18:13:15 +00002433
2434 def test_keywords(self):
2435 # Testing keyword args to basic type constructors ...
2436 self.assertEqual(int(x=1), 1)
2437 self.assertEqual(float(x=2), 2.0)
2438 self.assertEqual(int(x=3), 3)
2439 self.assertEqual(complex(imag=42, real=666), complex(666, 42))
2440 self.assertEqual(str(object=500), '500')
2441 self.assertEqual(str(object=b'abc', errors='strict'), 'abc')
2442 self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
2443 self.assertEqual(list(sequence=(0, 1, 2)), list(range(3)))
2444 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2445
2446 for constructor in (int, float, int, complex, str, str,
2447 tuple, list):
2448 try:
2449 constructor(bogus_keyword_arg=1)
2450 except TypeError:
2451 pass
2452 else:
2453 self.fail("expected TypeError from bogus keyword argument to %r"
2454 % constructor)
2455
2456 def test_str_subclass_as_dict_key(self):
2457 # Testing a str subclass used as dict key ..
2458
2459 class cistr(str):
2460 """Sublcass of str that computes __eq__ case-insensitively.
2461
2462 Also computes a hash code of the string in canonical form.
2463 """
2464
2465 def __init__(self, value):
2466 self.canonical = value.lower()
2467 self.hashcode = hash(self.canonical)
2468
2469 def __eq__(self, other):
2470 if not isinstance(other, cistr):
2471 other = cistr(other)
2472 return self.canonical == other.canonical
2473
2474 def __hash__(self):
2475 return self.hashcode
2476
2477 self.assertEqual(cistr('ABC'), 'abc')
2478 self.assertEqual('aBc', cistr('ABC'))
2479 self.assertEqual(str(cistr('ABC')), 'ABC')
2480
2481 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2482 self.assertEqual(d[cistr('one')], 1)
2483 self.assertEqual(d[cistr('tWo')], 2)
2484 self.assertEqual(d[cistr('THrEE')], 3)
2485 self.assert_(cistr('ONe') in d)
2486 self.assertEqual(d.get(cistr('thrEE')), 3)
2487
2488 def test_classic_comparisons(self):
2489 # Testing classic comparisons...
2490 class classic:
2491 pass
2492
2493 for base in (classic, int, object):
2494 class C(base):
2495 def __init__(self, value):
2496 self.value = int(value)
2497 def __eq__(self, other):
2498 if isinstance(other, C):
2499 return self.value == other.value
2500 if isinstance(other, int) or isinstance(other, int):
2501 return self.value == other
2502 return NotImplemented
2503 def __ne__(self, other):
2504 if isinstance(other, C):
2505 return self.value != other.value
2506 if isinstance(other, int) or isinstance(other, int):
2507 return self.value != other
2508 return NotImplemented
2509 def __lt__(self, other):
2510 if isinstance(other, C):
2511 return self.value < other.value
2512 if isinstance(other, int) or isinstance(other, int):
2513 return self.value < other
2514 return NotImplemented
2515 def __le__(self, other):
2516 if isinstance(other, C):
2517 return self.value <= other.value
2518 if isinstance(other, int) or isinstance(other, int):
2519 return self.value <= other
2520 return NotImplemented
2521 def __gt__(self, other):
2522 if isinstance(other, C):
2523 return self.value > other.value
2524 if isinstance(other, int) or isinstance(other, int):
2525 return self.value > other
2526 return NotImplemented
2527 def __ge__(self, other):
2528 if isinstance(other, C):
2529 return self.value >= other.value
2530 if isinstance(other, int) or isinstance(other, int):
2531 return self.value >= other
2532 return NotImplemented
2533
2534 c1 = C(1)
2535 c2 = C(2)
2536 c3 = C(3)
2537 self.assertEqual(c1, 1)
2538 c = {1: c1, 2: c2, 3: c3}
2539 for x in 1, 2, 3:
2540 for y in 1, 2, 3:
2541 ## self.assert_(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2542 for op in "<", "<=", "==", "!=", ">", ">=":
2543 self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2544 "x=%d, y=%d" % (x, y))
2545 ## self.assert_(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2546 ## self.assert_(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2547
2548 def test_rich_comparisons(self):
2549 # Testing rich comparisons...
2550 class Z(complex):
2551 pass
2552 z = Z(1)
2553 self.assertEqual(z, 1+0j)
2554 self.assertEqual(1+0j, z)
2555 class ZZ(complex):
2556 def __eq__(self, other):
2557 try:
2558 return abs(self - other) <= 1e-6
2559 except:
2560 return NotImplemented
2561 zz = ZZ(1.0000003)
2562 self.assertEqual(zz, 1+0j)
2563 self.assertEqual(1+0j, zz)
2564
2565 class classic:
2566 pass
2567 for base in (classic, int, object, list):
2568 class C(base):
2569 def __init__(self, value):
2570 self.value = int(value)
2571 def __cmp__(self_, other):
2572 self.fail("shouldn't call __cmp__")
2573 def __eq__(self, other):
2574 if isinstance(other, C):
2575 return self.value == other.value
2576 if isinstance(other, int) or isinstance(other, int):
2577 return self.value == other
2578 return NotImplemented
2579 def __ne__(self, other):
2580 if isinstance(other, C):
2581 return self.value != other.value
2582 if isinstance(other, int) or isinstance(other, int):
2583 return self.value != other
2584 return NotImplemented
2585 def __lt__(self, other):
2586 if isinstance(other, C):
2587 return self.value < other.value
2588 if isinstance(other, int) or isinstance(other, int):
2589 return self.value < other
2590 return NotImplemented
2591 def __le__(self, other):
2592 if isinstance(other, C):
2593 return self.value <= other.value
2594 if isinstance(other, int) or isinstance(other, int):
2595 return self.value <= other
2596 return NotImplemented
2597 def __gt__(self, other):
2598 if isinstance(other, C):
2599 return self.value > other.value
2600 if isinstance(other, int) or isinstance(other, int):
2601 return self.value > other
2602 return NotImplemented
2603 def __ge__(self, other):
2604 if isinstance(other, C):
2605 return self.value >= other.value
2606 if isinstance(other, int) or isinstance(other, int):
2607 return self.value >= other
2608 return NotImplemented
2609 c1 = C(1)
2610 c2 = C(2)
2611 c3 = C(3)
2612 self.assertEqual(c1, 1)
2613 c = {1: c1, 2: c2, 3: c3}
2614 for x in 1, 2, 3:
2615 for y in 1, 2, 3:
2616 for op in "<", "<=", "==", "!=", ">", ">=":
2617 self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2618 "x=%d, y=%d" % (x, y))
2619 self.assert_(eval("c[x] %s y" % op) == eval("x %s y" % op),
2620 "x=%d, y=%d" % (x, y))
2621 self.assert_(eval("x %s c[y]" % op) == eval("x %s y" % op),
2622 "x=%d, y=%d" % (x, y))
2623
2624 def test_descrdoc(self):
2625 # Testing descriptor doc strings...
2626 from _fileio import _FileIO
2627 def check(descr, what):
2628 self.assertEqual(descr.__doc__, what)
2629 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2630 check(complex.real, "the real part of a complex number") # member descriptor
2631
2632 def test_doc_descriptor(self):
2633 # Testing __doc__ descriptor...
2634 # SF bug 542984
2635 class DocDescr(object):
2636 def __get__(self, object, otype):
2637 if object:
2638 object = object.__class__.__name__ + ' instance'
2639 if otype:
2640 otype = otype.__name__
2641 return 'object=%s; type=%s' % (object, otype)
2642 class OldClass:
2643 __doc__ = DocDescr()
2644 class NewClass(object):
2645 __doc__ = DocDescr()
2646 self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
2647 self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2648 self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
2649 self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2650
2651 def test_set_class(self):
2652 # Testing __class__ assignment...
2653 class C(object): pass
2654 class D(object): pass
2655 class E(object): pass
2656 class F(D, E): pass
2657 for cls in C, D, E, F:
2658 for cls2 in C, D, E, F:
2659 x = cls()
2660 x.__class__ = cls2
2661 self.assert_(x.__class__ is cls2)
2662 x.__class__ = cls
2663 self.assert_(x.__class__ is cls)
2664 def cant(x, C):
2665 try:
2666 x.__class__ = C
2667 except TypeError:
2668 pass
2669 else:
2670 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
2671 try:
2672 delattr(x, "__class__")
2673 except TypeError:
2674 pass
2675 else:
2676 self.fail("shouldn't allow del %r.__class__" % x)
2677 cant(C(), list)
2678 cant(list(), C)
2679 cant(C(), 1)
2680 cant(C(), object)
2681 cant(object(), list)
2682 cant(list(), object)
2683 class Int(int): __slots__ = []
2684 cant(2, Int)
2685 cant(Int(), int)
2686 cant(True, int)
2687 cant(2, bool)
2688 o = object()
2689 cant(o, type(1))
2690 cant(o, type(None))
2691 del o
2692 class G(object):
2693 __slots__ = ["a", "b"]
2694 class H(object):
2695 __slots__ = ["b", "a"]
2696 class I(object):
2697 __slots__ = ["a", "b"]
2698 class J(object):
2699 __slots__ = ["c", "b"]
2700 class K(object):
2701 __slots__ = ["a", "b", "d"]
2702 class L(H):
2703 __slots__ = ["e"]
2704 class M(I):
2705 __slots__ = ["e"]
2706 class N(J):
2707 __slots__ = ["__weakref__"]
2708 class P(J):
2709 __slots__ = ["__dict__"]
2710 class Q(J):
2711 pass
2712 class R(J):
2713 __slots__ = ["__dict__", "__weakref__"]
2714
2715 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2716 x = cls()
2717 x.a = 1
2718 x.__class__ = cls2
2719 self.assert_(x.__class__ is cls2,
2720 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2721 self.assertEqual(x.a, 1)
2722 x.__class__ = cls
2723 self.assert_(x.__class__ is cls,
2724 "assigning %r as __class__ for %r silently failed" % (cls, x))
2725 self.assertEqual(x.a, 1)
2726 for cls in G, J, K, L, M, N, P, R, list, Int:
2727 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2728 if cls is cls2:
2729 continue
2730 cant(cls(), cls2)
2731
2732 def test_set_dict(self):
2733 # Testing __dict__ assignment...
2734 class C(object): pass
2735 a = C()
2736 a.__dict__ = {'b': 1}
2737 self.assertEqual(a.b, 1)
2738 def cant(x, dict):
2739 try:
2740 x.__dict__ = dict
2741 except (AttributeError, TypeError):
2742 pass
2743 else:
2744 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
2745 cant(a, None)
2746 cant(a, [])
2747 cant(a, 1)
2748 del a.__dict__ # Deleting __dict__ is allowed
2749
2750 class Base(object):
2751 pass
2752 def verify_dict_readonly(x):
2753 """
2754 x has to be an instance of a class inheriting from Base.
2755 """
2756 cant(x, {})
2757 try:
2758 del x.__dict__
2759 except (AttributeError, TypeError):
2760 pass
2761 else:
2762 self.fail("shouldn't allow del %r.__dict__" % x)
2763 dict_descr = Base.__dict__["__dict__"]
2764 try:
2765 dict_descr.__set__(x, {})
2766 except (AttributeError, TypeError):
2767 pass
2768 else:
2769 self.fail("dict_descr allowed access to %r's dict" % x)
2770
2771 # Classes don't allow __dict__ assignment and have readonly dicts
2772 class Meta1(type, Base):
2773 pass
2774 class Meta2(Base, type):
2775 pass
2776 class D(object, metaclass=Meta1):
2777 pass
2778 class E(object, metaclass=Meta2):
2779 pass
2780 for cls in C, D, E:
2781 verify_dict_readonly(cls)
2782 class_dict = cls.__dict__
2783 try:
2784 class_dict["spam"] = "eggs"
2785 except TypeError:
2786 pass
2787 else:
2788 self.fail("%r's __dict__ can be modified" % cls)
2789
2790 # Modules also disallow __dict__ assignment
2791 class Module1(types.ModuleType, Base):
2792 pass
2793 class Module2(Base, types.ModuleType):
2794 pass
2795 for ModuleType in Module1, Module2:
2796 mod = ModuleType("spam")
2797 verify_dict_readonly(mod)
2798 mod.__dict__["spam"] = "eggs"
2799
2800 # Exception's __dict__ can be replaced, but not deleted
2801 class Exception1(Exception, Base):
2802 pass
2803 class Exception2(Base, Exception):
2804 pass
2805 for ExceptionType in Exception, Exception1, Exception2:
2806 e = ExceptionType()
2807 e.__dict__ = {"a": 1}
2808 self.assertEqual(e.a, 1)
2809 try:
2810 del e.__dict__
2811 except (TypeError, AttributeError):
2812 pass
2813 else:
2814 self.fail("%r's __dict__ can be deleted" % e)
2815
2816 def test_pickles(self):
2817 # Testing pickling and copying new-style classes and objects...
2818 import pickle
2819
2820 def sorteditems(d):
2821 L = list(d.items())
2822 L.sort()
2823 return L
2824
2825 global C
2826 class C(object):
2827 def __init__(self, a, b):
2828 super(C, self).__init__()
2829 self.a = a
2830 self.b = b
2831 def __repr__(self):
2832 return "C(%r, %r)" % (self.a, self.b)
2833
2834 global C1
2835 class C1(list):
2836 def __new__(cls, a, b):
2837 return super(C1, cls).__new__(cls)
2838 def __getnewargs__(self):
2839 return (self.a, self.b)
2840 def __init__(self, a, b):
2841 self.a = a
2842 self.b = b
2843 def __repr__(self):
2844 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2845
2846 global C2
2847 class C2(int):
2848 def __new__(cls, a, b, val=0):
2849 return super(C2, cls).__new__(cls, val)
2850 def __getnewargs__(self):
2851 return (self.a, self.b, int(self))
2852 def __init__(self, a, b, val=0):
2853 self.a = a
2854 self.b = b
2855 def __repr__(self):
2856 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2857
2858 global C3
2859 class C3(object):
2860 def __init__(self, foo):
2861 self.foo = foo
2862 def __getstate__(self):
2863 return self.foo
2864 def __setstate__(self, foo):
2865 self.foo = foo
2866
2867 global C4classic, C4
2868 class C4classic: # classic
2869 pass
2870 class C4(C4classic, object): # mixed inheritance
2871 pass
2872
Guido van Rossum3926a632001-09-25 16:25:58 +00002873 for bin in 0, 1:
Guido van Rossum3926a632001-09-25 16:25:58 +00002874 for cls in C, C1, C2:
Georg Brandl479a7e72008-02-05 18:13:15 +00002875 s = pickle.dumps(cls, bin)
2876 cls2 = pickle.loads(s)
2877 self.assert_(cls2 is cls)
Guido van Rossum3926a632001-09-25 16:25:58 +00002878
2879 a = C1(1, 2); a.append(42); a.append(24)
2880 b = C2("hello", "world", 42)
Georg Brandl479a7e72008-02-05 18:13:15 +00002881 s = pickle.dumps((a, b), bin)
2882 x, y = pickle.loads(s)
2883 self.assertEqual(x.__class__, a.__class__)
2884 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
2885 self.assertEqual(y.__class__, b.__class__)
2886 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
2887 self.assertEqual(repr(x), repr(a))
2888 self.assertEqual(repr(y), repr(b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002889 # Test for __getstate__ and __setstate__ on new style class
2890 u = C3(42)
Georg Brandl479a7e72008-02-05 18:13:15 +00002891 s = pickle.dumps(u, bin)
2892 v = pickle.loads(s)
2893 self.assertEqual(u.__class__, v.__class__)
2894 self.assertEqual(u.foo, v.foo)
Guido van Rossum90c45142001-11-24 21:07:01 +00002895 # Test for picklability of hybrid class
2896 u = C4()
2897 u.foo = 42
Georg Brandl479a7e72008-02-05 18:13:15 +00002898 s = pickle.dumps(u, bin)
2899 v = pickle.loads(s)
2900 self.assertEqual(u.__class__, v.__class__)
2901 self.assertEqual(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002902
Georg Brandl479a7e72008-02-05 18:13:15 +00002903 # Testing copy.deepcopy()
2904 import copy
2905 for cls in C, C1, C2:
2906 cls2 = copy.deepcopy(cls)
2907 self.assert_(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002908
Georg Brandl479a7e72008-02-05 18:13:15 +00002909 a = C1(1, 2); a.append(42); a.append(24)
2910 b = C2("hello", "world", 42)
2911 x, y = copy.deepcopy((a, b))
2912 self.assertEqual(x.__class__, a.__class__)
2913 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
2914 self.assertEqual(y.__class__, b.__class__)
2915 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
2916 self.assertEqual(repr(x), repr(a))
2917 self.assertEqual(repr(y), repr(b))
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002918
Georg Brandl479a7e72008-02-05 18:13:15 +00002919 def test_pickle_slots(self):
2920 # Testing pickling of classes with __slots__ ...
2921 import pickle
2922 # Pickling of classes with __slots__ but without __getstate__ should fail
2923 # (if using protocol 0 or 1)
2924 global B, C, D, E
2925 class B(object):
Guido van Rossum8c842552002-03-14 23:05:54 +00002926 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00002927 for base in [object, B]:
2928 class C(base):
2929 __slots__ = ['a']
2930 class D(C):
2931 pass
2932 try:
2933 pickle.dumps(C(), 0)
2934 except TypeError:
2935 pass
2936 else:
2937 self.fail("should fail: pickle C instance - %s" % base)
2938 try:
2939 pickle.dumps(C(), 0)
2940 except TypeError:
2941 pass
2942 else:
2943 self.fail("should fail: pickle D instance - %s" % base)
2944 # Give C a nice generic __getstate__ and __setstate__
2945 class C(base):
2946 __slots__ = ['a']
2947 def __getstate__(self):
2948 try:
2949 d = self.__dict__.copy()
2950 except AttributeError:
2951 d = {}
2952 for cls in self.__class__.__mro__:
2953 for sn in cls.__dict__.get('__slots__', ()):
2954 try:
2955 d[sn] = getattr(self, sn)
2956 except AttributeError:
2957 pass
2958 return d
2959 def __setstate__(self, d):
2960 for k, v in list(d.items()):
2961 setattr(self, k, v)
2962 class D(C):
2963 pass
2964 # Now it should work
2965 x = C()
2966 y = pickle.loads(pickle.dumps(x))
2967 self.assertEqual(hasattr(y, 'a'), 0)
2968 x.a = 42
2969 y = pickle.loads(pickle.dumps(x))
2970 self.assertEqual(y.a, 42)
2971 x = D()
2972 x.a = 42
2973 x.b = 100
2974 y = pickle.loads(pickle.dumps(x))
2975 self.assertEqual(y.a + y.b, 142)
2976 # A subclass that adds a slot should also work
2977 class E(C):
2978 __slots__ = ['b']
2979 x = E()
2980 x.a = 42
2981 x.b = "foo"
2982 y = pickle.loads(pickle.dumps(x))
2983 self.assertEqual(y.a, x.a)
2984 self.assertEqual(y.b, x.b)
2985
2986 def test_binary_operator_override(self):
2987 # Testing overrides of binary operations...
2988 class I(int):
2989 def __repr__(self):
2990 return "I(%r)" % int(self)
2991 def __add__(self, other):
2992 return I(int(self) + int(other))
2993 __radd__ = __add__
2994 def __pow__(self, other, mod=None):
2995 if mod is None:
2996 return I(pow(int(self), int(other)))
2997 else:
2998 return I(pow(int(self), int(other), int(mod)))
2999 def __rpow__(self, other, mod=None):
3000 if mod is None:
3001 return I(pow(int(other), int(self), mod))
3002 else:
3003 return I(pow(int(other), int(self), int(mod)))
3004
3005 self.assertEqual(repr(I(1) + I(2)), "I(3)")
3006 self.assertEqual(repr(I(1) + 2), "I(3)")
3007 self.assertEqual(repr(1 + I(2)), "I(3)")
3008 self.assertEqual(repr(I(2) ** I(3)), "I(8)")
3009 self.assertEqual(repr(2 ** I(3)), "I(8)")
3010 self.assertEqual(repr(I(2) ** 3), "I(8)")
3011 self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
3012 class S(str):
3013 def __eq__(self, other):
3014 return self.lower() == other.lower()
3015
3016 def test_subclass_propagation(self):
3017 # Testing propagation of slot functions to subclasses...
3018 class A(object):
3019 pass
3020 class B(A):
3021 pass
3022 class C(A):
3023 pass
3024 class D(B, C):
3025 pass
3026 d = D()
3027 orig_hash = hash(d) # related to id(d) in platform-dependent ways
3028 A.__hash__ = lambda self: 42
3029 self.assertEqual(hash(d), 42)
3030 C.__hash__ = lambda self: 314
3031 self.assertEqual(hash(d), 314)
3032 B.__hash__ = lambda self: 144
3033 self.assertEqual(hash(d), 144)
3034 D.__hash__ = lambda self: 100
3035 self.assertEqual(hash(d), 100)
Nick Coghland1abd252008-07-15 15:46:38 +00003036 D.__hash__ = None
3037 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003038 del D.__hash__
3039 self.assertEqual(hash(d), 144)
Nick Coghland1abd252008-07-15 15:46:38 +00003040 B.__hash__ = None
3041 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003042 del B.__hash__
3043 self.assertEqual(hash(d), 314)
Nick Coghland1abd252008-07-15 15:46:38 +00003044 C.__hash__ = None
3045 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003046 del C.__hash__
3047 self.assertEqual(hash(d), 42)
Nick Coghland1abd252008-07-15 15:46:38 +00003048 A.__hash__ = None
3049 self.assertRaises(TypeError, hash, d)
Georg Brandl479a7e72008-02-05 18:13:15 +00003050 del A.__hash__
3051 self.assertEqual(hash(d), orig_hash)
3052 d.foo = 42
3053 d.bar = 42
3054 self.assertEqual(d.foo, 42)
3055 self.assertEqual(d.bar, 42)
3056 def __getattribute__(self, name):
3057 if name == "foo":
3058 return 24
3059 return object.__getattribute__(self, name)
3060 A.__getattribute__ = __getattribute__
3061 self.assertEqual(d.foo, 24)
3062 self.assertEqual(d.bar, 42)
3063 def __getattr__(self, name):
3064 if name in ("spam", "foo", "bar"):
3065 return "hello"
3066 raise AttributeError(name)
3067 B.__getattr__ = __getattr__
3068 self.assertEqual(d.spam, "hello")
3069 self.assertEqual(d.foo, 24)
3070 self.assertEqual(d.bar, 42)
3071 del A.__getattribute__
3072 self.assertEqual(d.foo, 42)
3073 del d.foo
3074 self.assertEqual(d.foo, "hello")
3075 self.assertEqual(d.bar, 42)
3076 del B.__getattr__
Guido van Rossum8c842552002-03-14 23:05:54 +00003077 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003078 d.foo
3079 except AttributeError:
3080 pass
3081 else:
3082 self.fail("d.foo should be undefined now")
3083
3084 # Test a nasty bug in recurse_down_subclasses()
3085 import gc
3086 class A(object):
3087 pass
3088 class B(A):
3089 pass
3090 del B
3091 gc.collect()
3092 A.__setitem__ = lambda *a: None # crash
3093
3094 def test_buffer_inheritance(self):
3095 # Testing that buffer interface is inherited ...
3096
3097 import binascii
3098 # SF bug [#470040] ParseTuple t# vs subclasses.
3099
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003100 class MyBytes(bytes):
Georg Brandl479a7e72008-02-05 18:13:15 +00003101 pass
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003102 base = b'abc'
3103 m = MyBytes(base)
Georg Brandl479a7e72008-02-05 18:13:15 +00003104 # b2a_hex uses the buffer interface to get its argument's value, via
3105 # PyArg_ParseTuple 't#' code.
3106 self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
3107
Georg Brandl479a7e72008-02-05 18:13:15 +00003108 class MyInt(int):
3109 pass
3110 m = MyInt(42)
3111 try:
3112 binascii.b2a_hex(m)
3113 self.fail('subclass of int should not have a buffer interface')
3114 except TypeError:
3115 pass
3116
3117 def test_str_of_str_subclass(self):
3118 # Testing __str__ defined in subclass of str ...
3119 import binascii
3120 import io
3121
3122 class octetstring(str):
3123 def __str__(self):
Martin v. Löwis15b16a32008-12-02 06:00:15 +00003124 return binascii.b2a_hex(self.encode('ascii')).decode("ascii")
Georg Brandl479a7e72008-02-05 18:13:15 +00003125 def __repr__(self):
3126 return self + " repr"
3127
3128 o = octetstring('A')
3129 self.assertEqual(type(o), octetstring)
3130 self.assertEqual(type(str(o)), str)
3131 self.assertEqual(type(repr(o)), str)
3132 self.assertEqual(ord(o), 0x41)
3133 self.assertEqual(str(o), '41')
3134 self.assertEqual(repr(o), 'A repr')
3135 self.assertEqual(o.__str__(), '41')
3136 self.assertEqual(o.__repr__(), 'A repr')
3137
3138 capture = io.StringIO()
3139 # Calling str() or not exercises different internal paths.
3140 print(o, file=capture)
3141 print(str(o), file=capture)
3142 self.assertEqual(capture.getvalue(), '41\n41\n')
3143 capture.close()
3144
3145 def test_keyword_arguments(self):
3146 # Testing keyword arguments to __init__, __call__...
3147 def f(a): return a
3148 self.assertEqual(f.__call__(a=42), 42)
3149 a = []
3150 list.__init__(a, sequence=[0, 1, 2])
3151 self.assertEqual(a, [0, 1, 2])
3152
3153 def test_recursive_call(self):
3154 # Testing recursive __call__() by setting to instance of class...
3155 class A(object):
3156 pass
3157
3158 A.__call__ = A()
3159 try:
3160 A()()
3161 except RuntimeError:
3162 pass
3163 else:
3164 self.fail("Recursion limit should have been reached for __call__()")
3165
3166 def test_delete_hook(self):
3167 # Testing __del__ hook...
3168 log = []
3169 class C(object):
3170 def __del__(self):
3171 log.append(1)
3172 c = C()
3173 self.assertEqual(log, [])
3174 del c
3175 self.assertEqual(log, [1])
3176
3177 class D(object): pass
3178 d = D()
3179 try: del d[0]
3180 except TypeError: pass
3181 else: self.fail("invalid del() didn't raise TypeError")
3182
3183 def test_hash_inheritance(self):
3184 # Testing hash of mutable subclasses...
3185
3186 class mydict(dict):
3187 pass
3188 d = mydict()
3189 try:
3190 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003191 except TypeError:
3192 pass
3193 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003194 self.fail("hash() of dict subclass should fail")
3195
3196 class mylist(list):
3197 pass
3198 d = mylist()
Guido van Rossum8c842552002-03-14 23:05:54 +00003199 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003200 hash(d)
Guido van Rossum8c842552002-03-14 23:05:54 +00003201 except TypeError:
3202 pass
3203 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003204 self.fail("hash() of list subclass should fail")
3205
3206 def test_str_operations(self):
3207 try: 'a' + 5
3208 except TypeError: pass
3209 else: self.fail("'' + 5 doesn't raise TypeError")
3210
3211 try: ''.split('')
3212 except ValueError: pass
3213 else: self.fail("''.split('') doesn't raise ValueError")
3214
3215 try: ''.join([0])
3216 except TypeError: pass
3217 else: self.fail("''.join([0]) doesn't raise TypeError")
3218
3219 try: ''.rindex('5')
3220 except ValueError: pass
3221 else: self.fail("''.rindex('5') doesn't raise ValueError")
3222
3223 try: '%(n)s' % None
3224 except TypeError: pass
3225 else: self.fail("'%(n)s' % None doesn't raise TypeError")
3226
3227 try: '%(n' % {}
3228 except ValueError: pass
3229 else: self.fail("'%(n' % {} '' doesn't raise ValueError")
3230
3231 try: '%*s' % ('abc')
3232 except TypeError: pass
3233 else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
3234
3235 try: '%*.*s' % ('abc', 5)
3236 except TypeError: pass
3237 else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
3238
3239 try: '%s' % (1, 2)
3240 except TypeError: pass
3241 else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
3242
3243 try: '%' % None
3244 except ValueError: pass
3245 else: self.fail("'%' % None doesn't raise ValueError")
3246
3247 self.assertEqual('534253'.isdigit(), 1)
3248 self.assertEqual('534253x'.isdigit(), 0)
3249 self.assertEqual('%c' % 5, '\x05')
3250 self.assertEqual('%c' % '5', '5')
3251
3252 def test_deepcopy_recursive(self):
3253 # Testing deepcopy of recursive objects...
3254 class Node:
Guido van Rossum8c842552002-03-14 23:05:54 +00003255 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003256 a = Node()
3257 b = Node()
3258 a.b = b
3259 b.a = a
3260 z = deepcopy(a) # This blew up before
3261
3262 def test_unintialized_modules(self):
3263 # Testing uninitialized module objects...
3264 from types import ModuleType as M
3265 m = M.__new__(M)
3266 str(m)
3267 self.assertEqual(hasattr(m, "__name__"), 0)
3268 self.assertEqual(hasattr(m, "__file__"), 0)
3269 self.assertEqual(hasattr(m, "foo"), 0)
3270 self.assertEqual(m.__dict__, None)
3271 m.foo = 1
3272 self.assertEqual(m.__dict__, {"foo": 1})
3273
3274 def test_funny_new(self):
3275 # Testing __new__ returning something unexpected...
3276 class C(object):
3277 def __new__(cls, arg):
3278 if isinstance(arg, str): return [1, 2, 3]
3279 elif isinstance(arg, int): return object.__new__(D)
3280 else: return object.__new__(cls)
3281 class D(C):
3282 def __init__(self, arg):
3283 self.foo = arg
3284 self.assertEqual(C("1"), [1, 2, 3])
3285 self.assertEqual(D("1"), [1, 2, 3])
3286 d = D(None)
3287 self.assertEqual(d.foo, None)
3288 d = C(1)
3289 self.assertEqual(isinstance(d, D), True)
3290 self.assertEqual(d.foo, 1)
3291 d = D(1)
3292 self.assertEqual(isinstance(d, D), True)
3293 self.assertEqual(d.foo, 1)
3294
3295 def test_imul_bug(self):
3296 # Testing for __imul__ problems...
3297 # SF bug 544647
3298 class C(object):
3299 def __imul__(self, other):
3300 return (self, other)
Guido van Rossum8c842552002-03-14 23:05:54 +00003301 x = C()
Georg Brandl479a7e72008-02-05 18:13:15 +00003302 y = x
3303 y *= 1.0
3304 self.assertEqual(y, (x, 1.0))
3305 y = x
3306 y *= 2
3307 self.assertEqual(y, (x, 2))
3308 y = x
3309 y *= 3
3310 self.assertEqual(y, (x, 3))
3311 y = x
3312 y *= 1<<100
3313 self.assertEqual(y, (x, 1<<100))
3314 y = x
3315 y *= None
3316 self.assertEqual(y, (x, None))
3317 y = x
3318 y *= "foo"
3319 self.assertEqual(y, (x, "foo"))
Guido van Rossum8c842552002-03-14 23:05:54 +00003320
Georg Brandl479a7e72008-02-05 18:13:15 +00003321 def test_copy_setstate(self):
3322 # Testing that copy.*copy() correctly uses __setstate__...
3323 import copy
3324 class C(object):
3325 def __init__(self, foo=None):
3326 self.foo = foo
3327 self.__foo = foo
3328 def setfoo(self, foo=None):
3329 self.foo = foo
3330 def getfoo(self):
3331 return self.__foo
3332 def __getstate__(self):
3333 return [self.foo]
3334 def __setstate__(self_, lst):
3335 self.assertEqual(len(lst), 1)
3336 self_.__foo = self_.foo = lst[0]
3337 a = C(42)
3338 a.setfoo(24)
3339 self.assertEqual(a.foo, 24)
3340 self.assertEqual(a.getfoo(), 42)
3341 b = copy.copy(a)
3342 self.assertEqual(b.foo, 24)
3343 self.assertEqual(b.getfoo(), 24)
3344 b = copy.deepcopy(a)
3345 self.assertEqual(b.foo, 24)
3346 self.assertEqual(b.getfoo(), 24)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003347
Georg Brandl479a7e72008-02-05 18:13:15 +00003348 def test_slices(self):
3349 # Testing cases with slices and overridden __getitem__ ...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003350
Georg Brandl479a7e72008-02-05 18:13:15 +00003351 # Strings
3352 self.assertEqual("hello"[:4], "hell")
3353 self.assertEqual("hello"[slice(4)], "hell")
3354 self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
3355 class S(str):
3356 def __getitem__(self, x):
3357 return str.__getitem__(self, x)
3358 self.assertEqual(S("hello")[:4], "hell")
3359 self.assertEqual(S("hello")[slice(4)], "hell")
3360 self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
3361 # Tuples
3362 self.assertEqual((1,2,3)[:2], (1,2))
3363 self.assertEqual((1,2,3)[slice(2)], (1,2))
3364 self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3365 class T(tuple):
3366 def __getitem__(self, x):
3367 return tuple.__getitem__(self, x)
3368 self.assertEqual(T((1,2,3))[:2], (1,2))
3369 self.assertEqual(T((1,2,3))[slice(2)], (1,2))
3370 self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
3371 # Lists
3372 self.assertEqual([1,2,3][:2], [1,2])
3373 self.assertEqual([1,2,3][slice(2)], [1,2])
3374 self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
3375 class L(list):
3376 def __getitem__(self, x):
3377 return list.__getitem__(self, x)
3378 self.assertEqual(L([1,2,3])[:2], [1,2])
3379 self.assertEqual(L([1,2,3])[slice(2)], [1,2])
3380 self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
3381 # Now do lists and __setitem__
3382 a = L([1,2,3])
3383 a[slice(1, 3)] = [3,2]
3384 self.assertEqual(a, [1,3,2])
3385 a[slice(0, 2, 1)] = [3,1]
3386 self.assertEqual(a, [3,1,2])
3387 a.__setitem__(slice(1, 3), [2,1])
3388 self.assertEqual(a, [3,2,1])
3389 a.__setitem__(slice(0, 2, 1), [2,3])
3390 self.assertEqual(a, [2,3,1])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003391
Georg Brandl479a7e72008-02-05 18:13:15 +00003392 def test_subtype_resurrection(self):
3393 # Testing resurrection of new-style instance...
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003394
Georg Brandl479a7e72008-02-05 18:13:15 +00003395 class C(object):
3396 container = []
Tim Peters2f93e282001-10-04 05:27:00 +00003397
Georg Brandl479a7e72008-02-05 18:13:15 +00003398 def __del__(self):
3399 # resurrect the instance
3400 C.container.append(self)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003401
Georg Brandl479a7e72008-02-05 18:13:15 +00003402 c = C()
3403 c.attr = 42
Tim Petersfc57ccb2001-10-12 02:38:24 +00003404
Georg Brandl479a7e72008-02-05 18:13:15 +00003405 # The most interesting thing here is whether this blows up, due to flawed
3406 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
3407 del c
Guido van Rossume7f3e242002-06-14 02:35:45 +00003408
Georg Brandl479a7e72008-02-05 18:13:15 +00003409 # If that didn't blow up, it's also interesting to see whether clearing
3410 # the last container slot works: that will attempt to delete c again,
3411 # which will cause c to get appended back to the container again "during"
3412 # the del.
3413 del C.container[-1]
3414 self.assertEqual(len(C.container), 1)
3415 self.assertEqual(C.container[-1].attr, 42)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003416
Georg Brandl479a7e72008-02-05 18:13:15 +00003417 # Make c mortal again, so that the test framework with -l doesn't report
3418 # it as a leak.
3419 del C.__del__
Tim Petersfc57ccb2001-10-12 02:38:24 +00003420
Georg Brandl479a7e72008-02-05 18:13:15 +00003421 def test_slots_trash(self):
3422 # Testing slot trash...
3423 # Deallocating deeply nested slotted trash caused stack overflows
3424 class trash(object):
3425 __slots__ = ['x']
3426 def __init__(self, x):
3427 self.x = x
3428 o = None
3429 for i in range(50000):
3430 o = trash(o)
3431 del o
Tim Petersfc57ccb2001-10-12 02:38:24 +00003432
Georg Brandl479a7e72008-02-05 18:13:15 +00003433 def test_slots_multiple_inheritance(self):
3434 # SF bug 575229, multiple inheritance w/ slots dumps core
3435 class A(object):
3436 __slots__=()
3437 class B(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003438 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003439 class C(A,B) :
3440 __slots__=()
3441 self.assertEqual(C.__basicsize__, B.__basicsize__)
3442 self.assert_(hasattr(C, '__dict__'))
3443 self.assert_(hasattr(C, '__weakref__'))
3444 C().x = 2
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003445
Georg Brandl479a7e72008-02-05 18:13:15 +00003446 def test_rmul(self):
3447 # Testing correct invocation of __rmul__...
3448 # SF patch 592646
3449 class C(object):
3450 def __mul__(self, other):
3451 return "mul"
3452 def __rmul__(self, other):
3453 return "rmul"
3454 a = C()
3455 self.assertEqual(a*2, "mul")
3456 self.assertEqual(a*2.2, "mul")
3457 self.assertEqual(2*a, "rmul")
3458 self.assertEqual(2.2*a, "rmul")
3459
3460 def test_ipow(self):
3461 # Testing correct invocation of __ipow__...
3462 # [SF bug 620179]
3463 class C(object):
3464 def __ipow__(self, other):
3465 pass
3466 a = C()
3467 a **= 2
3468
3469 def test_mutable_bases(self):
3470 # Testing mutable bases...
3471
3472 # stuff that should work:
3473 class C(object):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003474 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003475 class C2(object):
3476 def __getattribute__(self, attr):
3477 if attr == 'a':
3478 return 2
3479 else:
3480 return super(C2, self).__getattribute__(attr)
3481 def meth(self):
3482 return 1
3483 class D(C):
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003484 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003485 class E(D):
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003486 pass
Georg Brandl479a7e72008-02-05 18:13:15 +00003487 d = D()
3488 e = E()
3489 D.__bases__ = (C,)
3490 D.__bases__ = (C2,)
3491 self.assertEqual(d.meth(), 1)
3492 self.assertEqual(e.meth(), 1)
3493 self.assertEqual(d.a, 2)
3494 self.assertEqual(e.a, 2)
3495 self.assertEqual(C2.__subclasses__(), [D])
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003496
Georg Brandl479a7e72008-02-05 18:13:15 +00003497 # stuff that shouldn't:
3498 class L(list):
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003499 pass
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003500
Georg Brandl479a7e72008-02-05 18:13:15 +00003501 try:
3502 L.__bases__ = (dict,)
3503 except TypeError:
3504 pass
3505 else:
3506 self.fail("shouldn't turn list subclass into dict subclass")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003507
Georg Brandl479a7e72008-02-05 18:13:15 +00003508 try:
3509 list.__bases__ = (dict,)
3510 except TypeError:
3511 pass
3512 else:
3513 self.fail("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003514
Georg Brandl479a7e72008-02-05 18:13:15 +00003515 try:
3516 D.__bases__ = (C2, list)
3517 except TypeError:
3518 pass
3519 else:
3520 assert 0, "best_base calculation found wanting"
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003521
Georg Brandl479a7e72008-02-05 18:13:15 +00003522 try:
3523 del D.__bases__
3524 except TypeError:
3525 pass
3526 else:
3527 self.fail("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003528
Georg Brandl479a7e72008-02-05 18:13:15 +00003529 try:
3530 D.__bases__ = ()
3531 except TypeError as msg:
3532 if str(msg) == "a new-style class can't have only classic bases":
3533 self.fail("wrong error message for .__bases__ = ()")
3534 else:
3535 self.fail("shouldn't be able to set .__bases__ to ()")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003536
Georg Brandl479a7e72008-02-05 18:13:15 +00003537 try:
3538 D.__bases__ = (D,)
3539 except TypeError:
3540 pass
3541 else:
3542 # actually, we'll have crashed by here...
3543 self.fail("shouldn't be able to create inheritance cycles")
Thomas Wouters89f507f2006-12-13 04:49:30 +00003544
Georg Brandl479a7e72008-02-05 18:13:15 +00003545 try:
3546 D.__bases__ = (C, C)
3547 except TypeError:
3548 pass
3549 else:
3550 self.fail("didn't detect repeated base classes")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003551
Georg Brandl479a7e72008-02-05 18:13:15 +00003552 try:
3553 D.__bases__ = (E,)
3554 except TypeError:
3555 pass
3556 else:
3557 self.fail("shouldn't be able to create inheritance cycles")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003558
Georg Brandl479a7e72008-02-05 18:13:15 +00003559 def test_mutable_bases_with_failing_mro(self):
3560 # Testing mutable bases with failing mro...
3561 class WorkOnce(type):
3562 def __new__(self, name, bases, ns):
3563 self.flag = 0
3564 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3565 def mro(self):
3566 if self.flag > 0:
3567 raise RuntimeError("bozo")
3568 else:
3569 self.flag += 1
3570 return type.mro(self)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003571
Georg Brandl479a7e72008-02-05 18:13:15 +00003572 class WorkAlways(type):
3573 def mro(self):
3574 # this is here to make sure that .mro()s aren't called
3575 # with an exception set (which was possible at one point).
3576 # An error message will be printed in a debug build.
3577 # What's a good way to test for this?
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003578 return type.mro(self)
3579
Georg Brandl479a7e72008-02-05 18:13:15 +00003580 class C(object):
3581 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003582
Georg Brandl479a7e72008-02-05 18:13:15 +00003583 class C2(object):
3584 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003585
Georg Brandl479a7e72008-02-05 18:13:15 +00003586 class D(C):
3587 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003588
Georg Brandl479a7e72008-02-05 18:13:15 +00003589 class E(D):
3590 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003591
Georg Brandl479a7e72008-02-05 18:13:15 +00003592 class F(D, metaclass=WorkOnce):
3593 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003594
Georg Brandl479a7e72008-02-05 18:13:15 +00003595 class G(D, metaclass=WorkAlways):
3596 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003597
Georg Brandl479a7e72008-02-05 18:13:15 +00003598 # Immediate subclasses have their mro's adjusted in alphabetical
3599 # order, so E's will get adjusted before adjusting F's fails. We
3600 # check here that E's gets restored.
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003601
Georg Brandl479a7e72008-02-05 18:13:15 +00003602 E_mro_before = E.__mro__
3603 D_mro_before = D.__mro__
Armin Rigofd163f92005-12-29 15:59:19 +00003604
Armin Rigofd163f92005-12-29 15:59:19 +00003605 try:
Georg Brandl479a7e72008-02-05 18:13:15 +00003606 D.__bases__ = (C2,)
3607 except RuntimeError:
3608 self.assertEqual(E.__mro__, E_mro_before)
3609 self.assertEqual(D.__mro__, D_mro_before)
3610 else:
3611 self.fail("exception not propagated")
3612
3613 def test_mutable_bases_catch_mro_conflict(self):
3614 # Testing mutable bases catch mro conflict...
3615 class A(object):
3616 pass
3617
3618 class B(object):
3619 pass
3620
3621 class C(A, B):
3622 pass
3623
3624 class D(A, B):
3625 pass
3626
3627 class E(C, D):
3628 pass
3629
3630 try:
3631 C.__bases__ = (B, A)
Armin Rigofd163f92005-12-29 15:59:19 +00003632 except TypeError:
3633 pass
3634 else:
Georg Brandl479a7e72008-02-05 18:13:15 +00003635 self.fail("didn't catch MRO conflict")
Armin Rigofd163f92005-12-29 15:59:19 +00003636
Georg Brandl479a7e72008-02-05 18:13:15 +00003637 def test_mutable_names(self):
3638 # Testing mutable names...
3639 class C(object):
3640 pass
3641
3642 # C.__module__ could be 'test_descr' or '__main__'
3643 mod = C.__module__
3644
3645 C.__name__ = 'D'
3646 self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
3647
3648 C.__name__ = 'D.E'
3649 self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
3650
3651 def test_subclass_right_op(self):
3652 # Testing correct dispatch of subclass overloading __r<op>__...
3653
3654 # This code tests various cases where right-dispatch of a subclass
3655 # should be preferred over left-dispatch of a base class.
3656
3657 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3658
3659 class B(int):
3660 def __floordiv__(self, other):
3661 return "B.__floordiv__"
3662 def __rfloordiv__(self, other):
3663 return "B.__rfloordiv__"
3664
3665 self.assertEqual(B(1) // 1, "B.__floordiv__")
3666 self.assertEqual(1 // B(1), "B.__rfloordiv__")
3667
3668 # Case 2: subclass of object; this is just the baseline for case 3
3669
3670 class C(object):
3671 def __floordiv__(self, other):
3672 return "C.__floordiv__"
3673 def __rfloordiv__(self, other):
3674 return "C.__rfloordiv__"
3675
3676 self.assertEqual(C() // 1, "C.__floordiv__")
3677 self.assertEqual(1 // C(), "C.__rfloordiv__")
3678
3679 # Case 3: subclass of new-style class; here it gets interesting
3680
3681 class D(C):
3682 def __floordiv__(self, other):
3683 return "D.__floordiv__"
3684 def __rfloordiv__(self, other):
3685 return "D.__rfloordiv__"
3686
3687 self.assertEqual(D() // C(), "D.__floordiv__")
3688 self.assertEqual(C() // D(), "D.__rfloordiv__")
3689
3690 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3691
3692 class E(C):
3693 pass
3694
3695 self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
3696
3697 self.assertEqual(E() // 1, "C.__floordiv__")
3698 self.assertEqual(1 // E(), "C.__rfloordiv__")
3699 self.assertEqual(E() // C(), "C.__floordiv__")
3700 self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
3701
3702 def test_meth_class_get(self):
3703 # Testing __get__ method of METH_CLASS C methods...
3704 # Full coverage of descrobject.c::classmethod_get()
3705
3706 # Baseline
3707 arg = [1, 2, 3]
3708 res = {1: None, 2: None, 3: None}
3709 self.assertEqual(dict.fromkeys(arg), res)
3710 self.assertEqual({}.fromkeys(arg), res)
3711
3712 # Now get the descriptor
3713 descr = dict.__dict__["fromkeys"]
3714
3715 # More baseline using the descriptor directly
3716 self.assertEqual(descr.__get__(None, dict)(arg), res)
3717 self.assertEqual(descr.__get__({})(arg), res)
3718
3719 # Now check various error cases
3720 try:
3721 descr.__get__(None, None)
3722 except TypeError:
3723 pass
3724 else:
3725 self.fail("shouldn't have allowed descr.__get__(None, None)")
3726 try:
3727 descr.__get__(42)
3728 except TypeError:
3729 pass
3730 else:
3731 self.fail("shouldn't have allowed descr.__get__(42)")
3732 try:
3733 descr.__get__(None, 42)
3734 except TypeError:
3735 pass
3736 else:
3737 self.fail("shouldn't have allowed descr.__get__(None, 42)")
3738 try:
3739 descr.__get__(None, int)
3740 except TypeError:
3741 pass
3742 else:
3743 self.fail("shouldn't have allowed descr.__get__(None, int)")
3744
3745 def test_isinst_isclass(self):
3746 # Testing proxy isinstance() and isclass()...
3747 class Proxy(object):
3748 def __init__(self, obj):
3749 self.__obj = obj
3750 def __getattribute__(self, name):
3751 if name.startswith("_Proxy__"):
3752 return object.__getattribute__(self, name)
3753 else:
3754 return getattr(self.__obj, name)
3755 # Test with a classic class
3756 class C:
3757 pass
3758 a = C()
3759 pa = Proxy(a)
3760 self.assert_(isinstance(a, C)) # Baseline
3761 self.assert_(isinstance(pa, C)) # Test
3762 # Test with a classic subclass
3763 class D(C):
3764 pass
3765 a = D()
3766 pa = Proxy(a)
3767 self.assert_(isinstance(a, C)) # Baseline
3768 self.assert_(isinstance(pa, C)) # Test
3769 # Test with a new-style class
3770 class C(object):
3771 pass
3772 a = C()
3773 pa = Proxy(a)
3774 self.assert_(isinstance(a, C)) # Baseline
3775 self.assert_(isinstance(pa, C)) # Test
3776 # Test with a new-style subclass
3777 class D(C):
3778 pass
3779 a = D()
3780 pa = Proxy(a)
3781 self.assert_(isinstance(a, C)) # Baseline
3782 self.assert_(isinstance(pa, C)) # Test
3783
3784 def test_proxy_super(self):
3785 # Testing super() for a proxy object...
3786 class Proxy(object):
3787 def __init__(self, obj):
3788 self.__obj = obj
3789 def __getattribute__(self, name):
3790 if name.startswith("_Proxy__"):
3791 return object.__getattribute__(self, name)
3792 else:
3793 return getattr(self.__obj, name)
3794
3795 class B(object):
3796 def f(self):
3797 return "B.f"
3798
3799 class C(B):
3800 def f(self):
3801 return super(C, self).f() + "->C.f"
3802
3803 obj = C()
3804 p = Proxy(obj)
3805 self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
3806
3807 def test_carloverre(self):
3808 # Testing prohibition of Carlo Verre's hack...
3809 try:
3810 object.__setattr__(str, "foo", 42)
3811 except TypeError:
3812 pass
3813 else:
3814 self.fail("Carlo Verre __setattr__ suceeded!")
3815 try:
3816 object.__delattr__(str, "lower")
3817 except TypeError:
3818 pass
3819 else:
3820 self.fail("Carlo Verre __delattr__ succeeded!")
3821
3822 def test_weakref_segfault(self):
3823 # Testing weakref segfault...
3824 # SF 742911
3825 import weakref
3826
3827 class Provoker:
3828 def __init__(self, referrent):
3829 self.ref = weakref.ref(referrent)
3830
3831 def __del__(self):
3832 x = self.ref()
3833
3834 class Oops(object):
3835 pass
3836
3837 o = Oops()
3838 o.whatever = Provoker(o)
3839 del o
3840
3841 def test_wrapper_segfault(self):
3842 # SF 927248: deeply nested wrappers could cause stack overflow
3843 f = lambda:None
3844 for i in range(1000000):
3845 f = f.__call__
3846 f = None
3847
3848 def test_file_fault(self):
3849 # Testing sys.stdout is changed in getattr...
3850 import sys
3851 class StdoutGuard:
3852 def __getattr__(self, attr):
3853 sys.stdout = sys.__stdout__
3854 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3855 sys.stdout = StdoutGuard()
3856 try:
3857 print("Oops!")
3858 except RuntimeError:
3859 pass
3860
3861 def test_vicious_descriptor_nonsense(self):
3862 # Testing vicious_descriptor_nonsense...
3863
3864 # A potential segfault spotted by Thomas Wouters in mail to
3865 # python-dev 2003-04-17, turned into an example & fixed by Michael
3866 # Hudson just less than four months later...
3867
3868 class Evil(object):
3869 def __hash__(self):
3870 return hash('attr')
3871 def __eq__(self, other):
3872 del C.attr
3873 return 0
3874
3875 class Descr(object):
3876 def __get__(self, ob, type=None):
3877 return 1
3878
3879 class C(object):
3880 attr = Descr()
3881
3882 c = C()
3883 c.__dict__[Evil()] = 0
3884
3885 self.assertEqual(c.attr, 1)
3886 # this makes a crash more likely:
3887 import gc; gc.collect()
3888 self.assertEqual(hasattr(c, 'attr'), False)
3889
3890 def test_init(self):
3891 # SF 1155938
3892 class Foo(object):
3893 def __init__(self):
3894 return 10
3895 try:
3896 Foo()
3897 except TypeError:
3898 pass
3899 else:
3900 self.fail("did not test __init__() for None return")
3901
3902 def test_method_wrapper(self):
3903 # Testing method-wrapper objects...
3904 # <type 'method-wrapper'> did not support any reflection before 2.5
3905
3906 return # XXX should methods really support __eq__?
3907
3908 l = []
3909 self.assertEqual(l.__add__, l.__add__)
3910 self.assertEqual(l.__add__, [].__add__)
3911 self.assert_(l.__add__ != [5].__add__)
3912 self.assert_(l.__add__ != l.__mul__)
3913 self.assert_(l.__add__.__name__ == '__add__')
3914 self.assert_(l.__add__.__self__ is l)
3915 self.assert_(l.__add__.__objclass__ is list)
3916 self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
3917 try:
3918 hash(l.__add__)
3919 except TypeError:
3920 pass
3921 else:
3922 self.fail("no TypeError from hash([].__add__)")
3923
3924 t = ()
3925 t += (7,)
3926 self.assertEqual(t.__add__, (7,).__add__)
3927 self.assertEqual(hash(t.__add__), hash((7,).__add__))
3928
3929 def test_not_implemented(self):
3930 # Testing NotImplemented...
3931 # all binary methods should be able to return a NotImplemented
3932 import sys
3933 import types
3934 import operator
3935
3936 def specialmethod(self, other):
3937 return NotImplemented
3938
3939 def check(expr, x, y):
3940 try:
3941 exec(expr, {'x': x, 'y': y, 'operator': operator})
3942 except TypeError:
3943 pass
3944 else:
3945 self.fail("no TypeError from %r" % (expr,))
3946
3947 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of
3948 # TypeErrors
3949 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
3950 # ValueErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00003951 for name, expr, iexpr in [
3952 ('__add__', 'x + y', 'x += y'),
3953 ('__sub__', 'x - y', 'x -= y'),
3954 ('__mul__', 'x * y', 'x *= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00003955 ('__truediv__', 'operator.truediv(x, y)', None),
3956 ('__floordiv__', 'operator.floordiv(x, y)', None),
3957 ('__div__', 'x / y', 'x /= y'),
Armin Rigofd163f92005-12-29 15:59:19 +00003958 ('__mod__', 'x % y', 'x %= y'),
3959 ('__divmod__', 'divmod(x, y)', None),
3960 ('__pow__', 'x ** y', 'x **= y'),
3961 ('__lshift__', 'x << y', 'x <<= y'),
3962 ('__rshift__', 'x >> y', 'x >>= y'),
3963 ('__and__', 'x & y', 'x &= y'),
3964 ('__or__', 'x | y', 'x |= y'),
Georg Brandl479a7e72008-02-05 18:13:15 +00003965 ('__xor__', 'x ^ y', 'x ^= y')]:
Neal Norwitz4886cc32006-08-21 17:06:07 +00003966 rname = '__r' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00003967 A = type('A', (), {name: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00003968 a = A()
Armin Rigofd163f92005-12-29 15:59:19 +00003969 check(expr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00003970 check(expr, a, N1)
3971 check(expr, a, N2)
Armin Rigofd163f92005-12-29 15:59:19 +00003972 if iexpr:
3973 check(iexpr, a, a)
Armin Rigofd163f92005-12-29 15:59:19 +00003974 check(iexpr, a, N1)
3975 check(iexpr, a, N2)
3976 iname = '__i' + name[2:]
Georg Brandl479a7e72008-02-05 18:13:15 +00003977 C = type('C', (), {iname: specialmethod})
Armin Rigofd163f92005-12-29 15:59:19 +00003978 c = C()
3979 check(iexpr, c, a)
Armin Rigofd163f92005-12-29 15:59:19 +00003980 check(iexpr, c, N1)
3981 check(iexpr, c, N2)
3982
Georg Brandl479a7e72008-02-05 18:13:15 +00003983 def test_assign_slice(self):
3984 # ceval.c's assign_slice used to check for
3985 # tp->tp_as_sequence->sq_slice instead of
3986 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossumd8faa362007-04-27 19:54:29 +00003987
Georg Brandl479a7e72008-02-05 18:13:15 +00003988 class C(object):
3989 def __setitem__(self, idx, value):
3990 self.value = value
Guido van Rossumd8faa362007-04-27 19:54:29 +00003991
Georg Brandl479a7e72008-02-05 18:13:15 +00003992 c = C()
3993 c[1:2] = 3
3994 self.assertEqual(c.value, 3)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003995
Benjamin Peterson9262b842008-11-17 22:45:50 +00003996 def test_getattr_hooks(self):
3997 # issue 4230
3998
3999 class Descriptor(object):
4000 counter = 0
4001 def __get__(self, obj, objtype=None):
4002 def getter(name):
4003 self.counter += 1
4004 raise AttributeError(name)
4005 return getter
4006
4007 descr = Descriptor()
4008 class A(object):
4009 __getattribute__ = descr
4010 class B(object):
4011 __getattr__ = descr
4012 class C(object):
4013 __getattribute__ = descr
4014 __getattr__ = descr
4015
4016 self.assertRaises(AttributeError, getattr, A(), "attr")
4017 self.assertEquals(descr.counter, 1)
4018 self.assertRaises(AttributeError, getattr, B(), "attr")
4019 self.assertEquals(descr.counter, 2)
4020 self.assertRaises(AttributeError, getattr, C(), "attr")
4021 self.assertEquals(descr.counter, 4)
4022
4023 import gc
4024 class EvilGetattribute(object):
4025 # This used to segfault
4026 def __getattr__(self, name):
4027 raise AttributeError(name)
4028 def __getattribute__(self, name):
4029 del EvilGetattribute.__getattr__
4030 for i in range(5):
4031 gc.collect()
4032 raise AttributeError(name)
4033
4034 self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
4035
Christian Heimesbbffeb62008-01-24 09:42:52 +00004036
Georg Brandl479a7e72008-02-05 18:13:15 +00004037class DictProxyTests(unittest.TestCase):
4038 def setUp(self):
4039 class C(object):
4040 def meth(self):
4041 pass
4042 self.C = C
Christian Heimesbbffeb62008-01-24 09:42:52 +00004043
Georg Brandl479a7e72008-02-05 18:13:15 +00004044 def test_iter_keys(self):
4045 # Testing dict-proxy iterkeys...
4046 keys = [ key for key in self.C.__dict__.keys() ]
4047 keys.sort()
4048 self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
4049 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004050
Georg Brandl479a7e72008-02-05 18:13:15 +00004051 def test_iter_values(self):
4052 # Testing dict-proxy itervalues...
4053 values = [ values for values in self.C.__dict__.values() ]
4054 self.assertEqual(len(values), 5)
Christian Heimesbbffeb62008-01-24 09:42:52 +00004055
Georg Brandl479a7e72008-02-05 18:13:15 +00004056 def test_iter_items(self):
4057 # Testing dict-proxy iteritems...
4058 keys = [ key for (key, value) in self.C.__dict__.items() ]
4059 keys.sort()
4060 self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
4061 '__weakref__', 'meth'])
Christian Heimesbbffeb62008-01-24 09:42:52 +00004062
Georg Brandl479a7e72008-02-05 18:13:15 +00004063 def test_dict_type_with_metaclass(self):
4064 # Testing type of __dict__ when metaclass set...
4065 class B(object):
4066 pass
4067 class M(type):
4068 pass
4069 class C(metaclass=M):
4070 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4071 pass
4072 self.assertEqual(type(C.__dict__), type(B.__dict__))
Christian Heimesbbffeb62008-01-24 09:42:52 +00004073
Christian Heimesbbffeb62008-01-24 09:42:52 +00004074
Georg Brandl479a7e72008-02-05 18:13:15 +00004075class PTypesLongInitTest(unittest.TestCase):
4076 # This is in its own TestCase so that it can be run before any other tests.
4077 def test_pytype_long_ready(self):
4078 # Testing SF bug 551412 ...
Christian Heimesbbffeb62008-01-24 09:42:52 +00004079
Georg Brandl479a7e72008-02-05 18:13:15 +00004080 # This dumps core when SF bug 551412 isn't fixed --
4081 # but only when test_descr.py is run separately.
4082 # (That can't be helped -- as soon as PyType_Ready()
4083 # is called for PyLong_Type, the bug is gone.)
4084 class UserLong(object):
4085 def __pow__(self, *args):
4086 pass
4087 try:
4088 pow(0, UserLong(), 0)
4089 except:
4090 pass
Christian Heimesbbffeb62008-01-24 09:42:52 +00004091
Georg Brandl479a7e72008-02-05 18:13:15 +00004092 # Another segfault only when run early
4093 # (before PyType_Ready(tuple) is called)
4094 type.mro(tuple)
Christian Heimes969fe572008-01-25 11:23:10 +00004095
4096
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004097def test_main():
Georg Brandl479a7e72008-02-05 18:13:15 +00004098 # Run all local test cases, with PTypesLongInitTest first.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004099 support.run_unittest(PTypesLongInitTest, OperatorsTest,
Georg Brandl479a7e72008-02-05 18:13:15 +00004100 ClassPropertiesAndMethods, DictProxyTests)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004101
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004102if __name__ == "__main__":
4103 test_main()