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