Update for release.
[python/dscho.git] / Lib / test / test_descr.py
blobda4bd033107e2efa61ade9c9b9dd38edd240bb21
1 # Test enhancements related to descriptors and new-style classes
3 from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
4 from copy import deepcopy
5 import warnings
7 warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
9 DeprecationWarning, r'(<string>|%s)$' % __name__)
11 def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
15 def testunop(a, res, expr="len(a)", meth="__len__"):
16 if verbose: print "checking", expr
17 dict = {'a': a}
18 vereq(eval(expr, dict), res)
19 t = type(a)
20 m = getattr(t, meth)
21 while meth not in t.__dict__:
22 t = t.__bases__[0]
23 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
25 bm = getattr(a, meth)
26 vereq(bm(), res)
28 def testbinop(a, b, res, expr="a+b", meth="__add__"):
29 if verbose: print "checking", expr
30 dict = {'a': a, 'b': b}
32 # XXX Hack so this passes before 2.3 when -Qnew is specified.
33 if meth == "__div__" and 1/2 == 0.5:
34 meth = "__truediv__"
36 vereq(eval(expr, dict), res)
37 t = type(a)
38 m = getattr(t, meth)
39 while meth not in t.__dict__:
40 t = t.__bases__[0]
41 vereq(m, t.__dict__[meth])
42 vereq(m(a, b), res)
43 bm = getattr(a, meth)
44 vereq(bm(b), res)
46 def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
47 if verbose: print "checking", expr
48 dict = {'a': a, 'b': b, 'c': c}
49 vereq(eval(expr, dict), res)
50 t = type(a)
51 m = getattr(t, meth)
52 while meth not in t.__dict__:
53 t = t.__bases__[0]
54 vereq(m, t.__dict__[meth])
55 vereq(m(a, b, c), res)
56 bm = getattr(a, meth)
57 vereq(bm(b, c), res)
59 def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
60 if verbose: print "checking", stmt
61 dict = {'a': deepcopy(a), 'b': b}
62 exec stmt in dict
63 vereq(dict['a'], res)
64 t = type(a)
65 m = getattr(t, meth)
66 while meth not in t.__dict__:
67 t = t.__bases__[0]
68 vereq(m, t.__dict__[meth])
69 dict['a'] = deepcopy(a)
70 m(dict['a'], b)
71 vereq(dict['a'], res)
72 dict['a'] = deepcopy(a)
73 bm = getattr(dict['a'], meth)
74 bm(b)
75 vereq(dict['a'], res)
77 def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
78 if verbose: print "checking", stmt
79 dict = {'a': deepcopy(a), 'b': b, 'c': c}
80 exec stmt in dict
81 vereq(dict['a'], res)
82 t = type(a)
83 m = getattr(t, meth)
84 while meth not in t.__dict__:
85 t = t.__bases__[0]
86 vereq(m, t.__dict__[meth])
87 dict['a'] = deepcopy(a)
88 m(dict['a'], b, c)
89 vereq(dict['a'], res)
90 dict['a'] = deepcopy(a)
91 bm = getattr(dict['a'], meth)
92 bm(b, c)
93 vereq(dict['a'], res)
95 def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
96 if verbose: print "checking", stmt
97 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
98 exec stmt in dict
99 vereq(dict['a'], res)
100 t = type(a)
101 while meth not in t.__dict__:
102 t = t.__bases__[0]
103 m = getattr(t, meth)
104 vereq(m, t.__dict__[meth])
105 dict['a'] = deepcopy(a)
106 m(dict['a'], b, c, d)
107 vereq(dict['a'], res)
108 dict['a'] = deepcopy(a)
109 bm = getattr(dict['a'], meth)
110 bm(b, c, d)
111 vereq(dict['a'], res)
113 def class_docstrings():
114 class Classic:
115 "A classic docstring."
116 vereq(Classic.__doc__, "A classic docstring.")
117 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
119 class Classic2:
120 pass
121 verify(Classic2.__doc__ is None)
123 class NewStatic(object):
124 "Another docstring."
125 vereq(NewStatic.__doc__, "Another docstring.")
126 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
128 class NewStatic2(object):
129 pass
130 verify(NewStatic2.__doc__ is None)
132 class NewDynamic(object):
133 "Another docstring."
134 vereq(NewDynamic.__doc__, "Another docstring.")
135 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
137 class NewDynamic2(object):
138 pass
139 verify(NewDynamic2.__doc__ is None)
141 def lists():
142 if verbose: print "Testing list operations..."
143 testbinop([1], [2], [1,2], "a+b", "__add__")
144 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
145 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
146 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
147 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
148 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
149 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
150 testunop([1,2,3], 3, "len(a)", "__len__")
151 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
152 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
153 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
154 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
156 def dicts():
157 if verbose: print "Testing dict operations..."
158 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
159 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
160 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
161 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
162 d = {1:2,3:4}
163 l1 = []
164 for i in d.keys(): l1.append(i)
165 l = []
166 for i in iter(d): l.append(i)
167 vereq(l, l1)
168 l = []
169 for i in d.__iter__(): l.append(i)
170 vereq(l, l1)
171 l = []
172 for i in dict.__iter__(d): l.append(i)
173 vereq(l, l1)
174 d = {1:2, 3:4}
175 testunop(d, 2, "len(a)", "__len__")
176 vereq(eval(repr(d), {}), d)
177 vereq(eval(d.__repr__(), {}), d)
178 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
180 def dict_constructor():
181 if verbose:
182 print "Testing dict constructor ..."
183 d = dict()
184 vereq(d, {})
185 d = dict({})
186 vereq(d, {})
187 d = dict({1: 2, 'a': 'b'})
188 vereq(d, {1: 2, 'a': 'b'})
189 vereq(d, dict(d.items()))
190 vereq(d, dict(d.iteritems()))
191 d = dict({'one':1, 'two':2})
192 vereq(d, dict(one=1, two=2))
193 vereq(d, dict(**d))
194 vereq(d, dict({"one": 1}, two=2))
195 vereq(d, dict([("two", 2)], one=1))
196 vereq(d, dict([("one", 100), ("two", 200)], **d))
197 verify(d is not dict(**d))
198 for badarg in 0, 0L, 0j, "0", [0], (0,):
199 try:
200 dict(badarg)
201 except TypeError:
202 pass
203 except ValueError:
204 if badarg == "0":
205 # It's a sequence, and its elements are also sequences (gotta
206 # love strings <wink>), but they aren't of length 2, so this
207 # one seemed better as a ValueError than a TypeError.
208 pass
209 else:
210 raise TestFailed("no TypeError from dict(%r)" % badarg)
211 else:
212 raise TestFailed("no TypeError from dict(%r)" % badarg)
214 try:
215 dict({}, {})
216 except TypeError:
217 pass
218 else:
219 raise TestFailed("no TypeError from dict({}, {})")
221 class Mapping:
222 # Lacks a .keys() method; will be added later.
223 dict = {1:2, 3:4, 'a':1j}
225 try:
226 dict(Mapping())
227 except TypeError:
228 pass
229 else:
230 raise TestFailed("no TypeError from dict(incomplete mapping)")
232 Mapping.keys = lambda self: self.dict.keys()
233 Mapping.__getitem__ = lambda self, i: self.dict[i]
234 d = dict(Mapping())
235 vereq(d, Mapping.dict)
237 # Init from sequence of iterable objects, each producing a 2-sequence.
238 class AddressBookEntry:
239 def __init__(self, first, last):
240 self.first = first
241 self.last = last
242 def __iter__(self):
243 return iter([self.first, self.last])
245 d = dict([AddressBookEntry('Tim', 'Warsaw'),
246 AddressBookEntry('Barry', 'Peters'),
247 AddressBookEntry('Tim', 'Peters'),
248 AddressBookEntry('Barry', 'Warsaw')])
249 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
251 d = dict(zip(range(4), range(1, 5)))
252 vereq(d, dict([(i, i+1) for i in range(4)]))
254 # Bad sequence lengths.
255 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
256 try:
257 dict(bad)
258 except ValueError:
259 pass
260 else:
261 raise TestFailed("no ValueError from dict(%r)" % bad)
263 def test_dir():
264 if verbose:
265 print "Testing dir() ..."
266 junk = 12
267 vereq(dir(), ['junk'])
268 del junk
270 # Just make sure these don't blow up!
271 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
272 dir(arg)
274 # Try classic classes.
275 class C:
276 Cdata = 1
277 def Cmethod(self): pass
279 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
280 vereq(dir(C), cstuff)
281 verify('im_self' in dir(C.Cmethod))
283 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
284 vereq(dir(c), cstuff)
286 c.cdata = 2
287 c.cmethod = lambda self: 0
288 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
289 verify('im_self' in dir(c.Cmethod))
291 class A(C):
292 Adata = 1
293 def Amethod(self): pass
295 astuff = ['Adata', 'Amethod'] + cstuff
296 vereq(dir(A), astuff)
297 verify('im_self' in dir(A.Amethod))
298 a = A()
299 vereq(dir(a), astuff)
300 verify('im_self' in dir(a.Amethod))
301 a.adata = 42
302 a.amethod = lambda self: 3
303 vereq(dir(a), astuff + ['adata', 'amethod'])
305 # The same, but with new-style classes. Since these have object as a
306 # base class, a lot more gets sucked in.
307 def interesting(strings):
308 return [s for s in strings if not s.startswith('_')]
310 class C(object):
311 Cdata = 1
312 def Cmethod(self): pass
314 cstuff = ['Cdata', 'Cmethod']
315 vereq(interesting(dir(C)), cstuff)
317 c = C()
318 vereq(interesting(dir(c)), cstuff)
319 verify('im_self' in dir(C.Cmethod))
321 c.cdata = 2
322 c.cmethod = lambda self: 0
323 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
324 verify('im_self' in dir(c.Cmethod))
326 class A(C):
327 Adata = 1
328 def Amethod(self): pass
330 astuff = ['Adata', 'Amethod'] + cstuff
331 vereq(interesting(dir(A)), astuff)
332 verify('im_self' in dir(A.Amethod))
333 a = A()
334 vereq(interesting(dir(a)), astuff)
335 a.adata = 42
336 a.amethod = lambda self: 3
337 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
338 verify('im_self' in dir(a.Amethod))
340 # Try a module subclass.
341 import sys
342 class M(type(sys)):
343 pass
344 minstance = M("m")
345 minstance.b = 2
346 minstance.a = 1
347 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
348 vereq(names, ['a', 'b'])
350 class M2(M):
351 def getdict(self):
352 return "Not a dict!"
353 __dict__ = property(getdict)
355 m2instance = M2("m2")
356 m2instance.b = 2
357 m2instance.a = 1
358 vereq(m2instance.__dict__, "Not a dict!")
359 try:
360 dir(m2instance)
361 except TypeError:
362 pass
364 # Two essentially featureless objects, just inheriting stuff from
365 # object.
366 vereq(dir(None), dir(Ellipsis))
368 # Nasty test case for proxied objects
369 class Wrapper(object):
370 def __init__(self, obj):
371 self.__obj = obj
372 def __repr__(self):
373 return "Wrapper(%s)" % repr(self.__obj)
374 def __getitem__(self, key):
375 return Wrapper(self.__obj[key])
376 def __len__(self):
377 return len(self.__obj)
378 def __getattr__(self, name):
379 return Wrapper(getattr(self.__obj, name))
381 class C(object):
382 def __getclass(self):
383 return Wrapper(type(self))
384 __class__ = property(__getclass)
386 dir(C()) # This used to segfault
388 binops = {
389 'add': '+',
390 'sub': '-',
391 'mul': '*',
392 'div': '/',
393 'mod': '%',
394 'divmod': 'divmod',
395 'pow': '**',
396 'lshift': '<<',
397 'rshift': '>>',
398 'and': '&',
399 'xor': '^',
400 'or': '|',
401 'cmp': 'cmp',
402 'lt': '<',
403 'le': '<=',
404 'eq': '==',
405 'ne': '!=',
406 'gt': '>',
407 'ge': '>=',
410 for name, expr in binops.items():
411 if expr.islower():
412 expr = expr + "(a, b)"
413 else:
414 expr = 'a %s b' % expr
415 binops[name] = expr
417 unops = {
418 'pos': '+',
419 'neg': '-',
420 'abs': 'abs',
421 'invert': '~',
422 'int': 'int',
423 'long': 'long',
424 'float': 'float',
425 'oct': 'oct',
426 'hex': 'hex',
429 for name, expr in unops.items():
430 if expr.islower():
431 expr = expr + "(a)"
432 else:
433 expr = '%s a' % expr
434 unops[name] = expr
436 def numops(a, b, skip=[]):
437 dict = {'a': a, 'b': b}
438 for name, expr in binops.items():
439 if name not in skip:
440 name = "__%s__" % name
441 if hasattr(a, name):
442 res = eval(expr, dict)
443 testbinop(a, b, res, expr, name)
444 for name, expr in unops.items():
445 if name not in skip:
446 name = "__%s__" % name
447 if hasattr(a, name):
448 res = eval(expr, dict)
449 testunop(a, res, expr, name)
451 def ints():
452 if verbose: print "Testing int operations..."
453 numops(100, 3)
454 # The following crashes in Python 2.2
455 vereq((1).__nonzero__(), 1)
456 vereq((0).__nonzero__(), 0)
457 # This returns 'NotImplemented' in Python 2.2
458 class C(int):
459 def __add__(self, other):
460 return NotImplemented
461 try:
462 C() + ""
463 except TypeError:
464 pass
465 else:
466 raise TestFailed, "NotImplemented should have caused TypeError"
468 def longs():
469 if verbose: print "Testing long operations..."
470 numops(100L, 3L)
472 def floats():
473 if verbose: print "Testing float operations..."
474 numops(100.0, 3.0)
476 def complexes():
477 if verbose: print "Testing complex operations..."
478 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
479 class Number(complex):
480 __slots__ = ['prec']
481 def __new__(cls, *args, **kwds):
482 result = complex.__new__(cls, *args)
483 result.prec = kwds.get('prec', 12)
484 return result
485 def __repr__(self):
486 prec = self.prec
487 if self.imag == 0.0:
488 return "%.*g" % (prec, self.real)
489 if self.real == 0.0:
490 return "%.*gj" % (prec, self.imag)
491 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
492 __str__ = __repr__
494 a = Number(3.14, prec=6)
495 vereq(`a`, "3.14")
496 vereq(a.prec, 6)
498 a = Number(a, prec=2)
499 vereq(`a`, "3.1")
500 vereq(a.prec, 2)
502 a = Number(234.5)
503 vereq(`a`, "234.5")
504 vereq(a.prec, 12)
506 def spamlists():
507 if verbose: print "Testing spamlist operations..."
508 import copy, xxsubtype as spam
509 def spamlist(l, memo=None):
510 import xxsubtype as spam
511 return spam.spamlist(l)
512 # This is an ugly hack:
513 copy._deepcopy_dispatch[spam.spamlist] = spamlist
515 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
516 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
517 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
518 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
519 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
520 "a[b:c]", "__getslice__")
521 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
522 "a+=b", "__iadd__")
523 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
524 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
525 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
526 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
527 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
528 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
529 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
530 # Test subclassing
531 class C(spam.spamlist):
532 def foo(self): return 1
533 a = C()
534 vereq(a, [])
535 vereq(a.foo(), 1)
536 a.append(100)
537 vereq(a, [100])
538 vereq(a.getstate(), 0)
539 a.setstate(42)
540 vereq(a.getstate(), 42)
542 def spamdicts():
543 if verbose: print "Testing spamdict operations..."
544 import copy, xxsubtype as spam
545 def spamdict(d, memo=None):
546 import xxsubtype as spam
547 sd = spam.spamdict()
548 for k, v in d.items(): sd[k] = v
549 return sd
550 # This is an ugly hack:
551 copy._deepcopy_dispatch[spam.spamdict] = spamdict
553 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
554 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
555 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
556 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
557 d = spamdict({1:2,3:4})
558 l1 = []
559 for i in d.keys(): l1.append(i)
560 l = []
561 for i in iter(d): l.append(i)
562 vereq(l, l1)
563 l = []
564 for i in d.__iter__(): l.append(i)
565 vereq(l, l1)
566 l = []
567 for i in type(spamdict({})).__iter__(d): l.append(i)
568 vereq(l, l1)
569 straightd = {1:2, 3:4}
570 spamd = spamdict(straightd)
571 testunop(spamd, 2, "len(a)", "__len__")
572 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
573 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
574 "a[b]=c", "__setitem__")
575 # Test subclassing
576 class C(spam.spamdict):
577 def foo(self): return 1
578 a = C()
579 vereq(a.items(), [])
580 vereq(a.foo(), 1)
581 a['foo'] = 'bar'
582 vereq(a.items(), [('foo', 'bar')])
583 vereq(a.getstate(), 0)
584 a.setstate(100)
585 vereq(a.getstate(), 100)
587 def pydicts():
588 if verbose: print "Testing Python subclass of dict..."
589 verify(issubclass(dict, dict))
590 verify(isinstance({}, dict))
591 d = dict()
592 vereq(d, {})
593 verify(d.__class__ is dict)
594 verify(isinstance(d, dict))
595 class C(dict):
596 state = -1
597 def __init__(self, *a, **kw):
598 if a:
599 vereq(len(a), 1)
600 self.state = a[0]
601 if kw:
602 for k, v in kw.items(): self[v] = k
603 def __getitem__(self, key):
604 return self.get(key, 0)
605 def __setitem__(self, key, value):
606 verify(isinstance(key, type(0)))
607 dict.__setitem__(self, key, value)
608 def setstate(self, state):
609 self.state = state
610 def getstate(self):
611 return self.state
612 verify(issubclass(C, dict))
613 a1 = C(12)
614 vereq(a1.state, 12)
615 a2 = C(foo=1, bar=2)
616 vereq(a2[1] == 'foo' and a2[2], 'bar')
617 a = C()
618 vereq(a.state, -1)
619 vereq(a.getstate(), -1)
620 a.setstate(0)
621 vereq(a.state, 0)
622 vereq(a.getstate(), 0)
623 a.setstate(10)
624 vereq(a.state, 10)
625 vereq(a.getstate(), 10)
626 vereq(a[42], 0)
627 a[42] = 24
628 vereq(a[42], 24)
629 if verbose: print "pydict stress test ..."
630 N = 50
631 for i in range(N):
632 a[i] = C()
633 for j in range(N):
634 a[i][j] = i*j
635 for i in range(N):
636 for j in range(N):
637 vereq(a[i][j], i*j)
639 def pylists():
640 if verbose: print "Testing Python subclass of list..."
641 class C(list):
642 def __getitem__(self, i):
643 return list.__getitem__(self, i) + 100
644 def __getslice__(self, i, j):
645 return (i, j)
646 a = C()
647 a.extend([0,1,2])
648 vereq(a[0], 100)
649 vereq(a[1], 101)
650 vereq(a[2], 102)
651 vereq(a[100:200], (100,200))
653 def metaclass():
654 if verbose: print "Testing __metaclass__..."
655 class C:
656 __metaclass__ = type
657 def __init__(self):
658 self.__state = 0
659 def getstate(self):
660 return self.__state
661 def setstate(self, state):
662 self.__state = state
663 a = C()
664 vereq(a.getstate(), 0)
665 a.setstate(10)
666 vereq(a.getstate(), 10)
667 class D:
668 class __metaclass__(type):
669 def myself(cls): return cls
670 vereq(D.myself(), D)
671 d = D()
672 verify(d.__class__ is D)
673 class M1(type):
674 def __new__(cls, name, bases, dict):
675 dict['__spam__'] = 1
676 return type.__new__(cls, name, bases, dict)
677 class C:
678 __metaclass__ = M1
679 vereq(C.__spam__, 1)
680 c = C()
681 vereq(c.__spam__, 1)
683 class _instance(object):
684 pass
685 class M2(object):
686 def __new__(cls, name, bases, dict):
687 self = object.__new__(cls)
688 self.name = name
689 self.bases = bases
690 self.dict = dict
691 return self
692 __new__ = staticmethod(__new__)
693 def __call__(self):
694 it = _instance()
695 # Early binding of methods
696 for key in self.dict:
697 if key.startswith("__"):
698 continue
699 setattr(it, key, self.dict[key].__get__(it, self))
700 return it
701 class C:
702 __metaclass__ = M2
703 def spam(self):
704 return 42
705 vereq(C.name, 'C')
706 vereq(C.bases, ())
707 verify('spam' in C.dict)
708 c = C()
709 vereq(c.spam(), 42)
711 # More metaclass examples
713 class autosuper(type):
714 # Automatically add __super to the class
715 # This trick only works for dynamic classes
716 def __new__(metaclass, name, bases, dict):
717 cls = super(autosuper, metaclass).__new__(metaclass,
718 name, bases, dict)
719 # Name mangling for __super removes leading underscores
720 while name[:1] == "_":
721 name = name[1:]
722 if name:
723 name = "_%s__super" % name
724 else:
725 name = "__super"
726 setattr(cls, name, super(cls))
727 return cls
728 class A:
729 __metaclass__ = autosuper
730 def meth(self):
731 return "A"
732 class B(A):
733 def meth(self):
734 return "B" + self.__super.meth()
735 class C(A):
736 def meth(self):
737 return "C" + self.__super.meth()
738 class D(C, B):
739 def meth(self):
740 return "D" + self.__super.meth()
741 vereq(D().meth(), "DCBA")
742 class E(B, C):
743 def meth(self):
744 return "E" + self.__super.meth()
745 vereq(E().meth(), "EBCA")
747 class autoproperty(type):
748 # Automatically create property attributes when methods
749 # named _get_x and/or _set_x are found
750 def __new__(metaclass, name, bases, dict):
751 hits = {}
752 for key, val in dict.iteritems():
753 if key.startswith("_get_"):
754 key = key[5:]
755 get, set = hits.get(key, (None, None))
756 get = val
757 hits[key] = get, set
758 elif key.startswith("_set_"):
759 key = key[5:]
760 get, set = hits.get(key, (None, None))
761 set = val
762 hits[key] = get, set
763 for key, (get, set) in hits.iteritems():
764 dict[key] = property(get, set)
765 return super(autoproperty, metaclass).__new__(metaclass,
766 name, bases, dict)
767 class A:
768 __metaclass__ = autoproperty
769 def _get_x(self):
770 return -self.__x
771 def _set_x(self, x):
772 self.__x = -x
773 a = A()
774 verify(not hasattr(a, "x"))
775 a.x = 12
776 vereq(a.x, 12)
777 vereq(a._A__x, -12)
779 class multimetaclass(autoproperty, autosuper):
780 # Merge of multiple cooperating metaclasses
781 pass
782 class A:
783 __metaclass__ = multimetaclass
784 def _get_x(self):
785 return "A"
786 class B(A):
787 def _get_x(self):
788 return "B" + self.__super._get_x()
789 class C(A):
790 def _get_x(self):
791 return "C" + self.__super._get_x()
792 class D(C, B):
793 def _get_x(self):
794 return "D" + self.__super._get_x()
795 vereq(D().x, "DCBA")
797 # Make sure type(x) doesn't call x.__class__.__init__
798 class T(type):
799 counter = 0
800 def __init__(self, *args):
801 T.counter += 1
802 class C:
803 __metaclass__ = T
804 vereq(T.counter, 1)
805 a = C()
806 vereq(type(a), C)
807 vereq(T.counter, 1)
809 class C(object): pass
810 c = C()
811 try: c()
812 except TypeError: pass
813 else: raise TestFailed, "calling object w/o call method should raise TypeError"
815 def pymods():
816 if verbose: print "Testing Python subclass of module..."
817 log = []
818 import sys
819 MT = type(sys)
820 class MM(MT):
821 def __init__(self, name):
822 MT.__init__(self, name)
823 def __getattribute__(self, name):
824 log.append(("getattr", name))
825 return MT.__getattribute__(self, name)
826 def __setattr__(self, name, value):
827 log.append(("setattr", name, value))
828 MT.__setattr__(self, name, value)
829 def __delattr__(self, name):
830 log.append(("delattr", name))
831 MT.__delattr__(self, name)
832 a = MM("a")
833 a.foo = 12
834 x = a.foo
835 del a.foo
836 vereq(log, [("setattr", "foo", 12),
837 ("getattr", "foo"),
838 ("delattr", "foo")])
840 def multi():
841 if verbose: print "Testing multiple inheritance..."
842 class C(object):
843 def __init__(self):
844 self.__state = 0
845 def getstate(self):
846 return self.__state
847 def setstate(self, state):
848 self.__state = state
849 a = C()
850 vereq(a.getstate(), 0)
851 a.setstate(10)
852 vereq(a.getstate(), 10)
853 class D(dict, C):
854 def __init__(self):
855 type({}).__init__(self)
856 C.__init__(self)
857 d = D()
858 vereq(d.keys(), [])
859 d["hello"] = "world"
860 vereq(d.items(), [("hello", "world")])
861 vereq(d["hello"], "world")
862 vereq(d.getstate(), 0)
863 d.setstate(10)
864 vereq(d.getstate(), 10)
865 vereq(D.__mro__, (D, dict, C, object))
867 # SF bug #442833
868 class Node(object):
869 def __int__(self):
870 return int(self.foo())
871 def foo(self):
872 return "23"
873 class Frag(Node, list):
874 def foo(self):
875 return "42"
876 vereq(Node().__int__(), 23)
877 vereq(int(Node()), 23)
878 vereq(Frag().__int__(), 42)
879 vereq(int(Frag()), 42)
881 # MI mixing classic and new-style classes.
883 class A:
884 x = 1
886 class B(A):
887 pass
889 class C(A):
890 x = 2
892 class D(B, C):
893 pass
894 vereq(D.x, 1)
896 # Classic MRO is preserved for a classic base class.
897 class E(D, object):
898 pass
899 vereq(E.__mro__, (E, D, B, A, C, object))
900 vereq(E.x, 1)
902 # But with a mix of classic bases, their MROs are combined using
903 # new-style MRO.
904 class F(B, C, object):
905 pass
906 vereq(F.__mro__, (F, B, C, A, object))
907 vereq(F.x, 2)
909 # Try something else.
910 class C:
911 def cmethod(self):
912 return "C a"
913 def all_method(self):
914 return "C b"
916 class M1(C, object):
917 def m1method(self):
918 return "M1 a"
919 def all_method(self):
920 return "M1 b"
922 vereq(M1.__mro__, (M1, C, object))
923 m = M1()
924 vereq(m.cmethod(), "C a")
925 vereq(m.m1method(), "M1 a")
926 vereq(m.all_method(), "M1 b")
928 class D(C):
929 def dmethod(self):
930 return "D a"
931 def all_method(self):
932 return "D b"
934 class M2(D, object):
935 def m2method(self):
936 return "M2 a"
937 def all_method(self):
938 return "M2 b"
940 vereq(M2.__mro__, (M2, D, C, object))
941 m = M2()
942 vereq(m.cmethod(), "C a")
943 vereq(m.dmethod(), "D a")
944 vereq(m.m2method(), "M2 a")
945 vereq(m.all_method(), "M2 b")
947 class M3(M1, M2, object):
948 def m3method(self):
949 return "M3 a"
950 def all_method(self):
951 return "M3 b"
952 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
953 m = M3()
954 vereq(m.cmethod(), "C a")
955 vereq(m.dmethod(), "D a")
956 vereq(m.m1method(), "M1 a")
957 vereq(m.m2method(), "M2 a")
958 vereq(m.m3method(), "M3 a")
959 vereq(m.all_method(), "M3 b")
961 class Classic:
962 pass
963 try:
964 class New(Classic):
965 __metaclass__ = type
966 except TypeError:
967 pass
968 else:
969 raise TestFailed, "new class with only classic bases - shouldn't be"
971 def diamond():
972 if verbose: print "Testing multiple inheritance special cases..."
973 class A(object):
974 def spam(self): return "A"
975 vereq(A().spam(), "A")
976 class B(A):
977 def boo(self): return "B"
978 def spam(self): return "B"
979 vereq(B().spam(), "B")
980 vereq(B().boo(), "B")
981 class C(A):
982 def boo(self): return "C"
983 vereq(C().spam(), "A")
984 vereq(C().boo(), "C")
985 class D(B, C): pass
986 vereq(D().spam(), "B")
987 vereq(D().boo(), "B")
988 vereq(D.__mro__, (D, B, C, A, object))
989 class E(C, B): pass
990 vereq(E().spam(), "B")
991 vereq(E().boo(), "C")
992 vereq(E.__mro__, (E, C, B, A, object))
993 # MRO order disagreement
994 try:
995 class F(D, E): pass
996 except TypeError:
997 pass
998 else:
999 raise TestFailed, "expected MRO order disagreement (F)"
1000 try:
1001 class G(E, D): pass
1002 except TypeError:
1003 pass
1004 else:
1005 raise TestFailed, "expected MRO order disagreement (G)"
1008 # see thread python-dev/2002-October/029035.html
1009 def ex5():
1010 if verbose: print "Testing ex5 from C3 switch discussion..."
1011 class A(object): pass
1012 class B(object): pass
1013 class C(object): pass
1014 class X(A): pass
1015 class Y(A): pass
1016 class Z(X,B,Y,C): pass
1017 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1019 # see "A Monotonic Superclass Linearization for Dylan",
1020 # by Kim Barrett et al. (OOPSLA 1996)
1021 def monotonicity():
1022 if verbose: print "Testing MRO monotonicity..."
1023 class Boat(object): pass
1024 class DayBoat(Boat): pass
1025 class WheelBoat(Boat): pass
1026 class EngineLess(DayBoat): pass
1027 class SmallMultihull(DayBoat): pass
1028 class PedalWheelBoat(EngineLess,WheelBoat): pass
1029 class SmallCatamaran(SmallMultihull): pass
1030 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1032 vereq(PedalWheelBoat.__mro__,
1033 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1034 object))
1035 vereq(SmallCatamaran.__mro__,
1036 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1038 vereq(Pedalo.__mro__,
1039 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1040 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1042 # see "A Monotonic Superclass Linearization for Dylan",
1043 # by Kim Barrett et al. (OOPSLA 1996)
1044 def consistency_with_epg():
1045 if verbose: print "Testing consistentcy with EPG..."
1046 class Pane(object): pass
1047 class ScrollingMixin(object): pass
1048 class EditingMixin(object): pass
1049 class ScrollablePane(Pane,ScrollingMixin): pass
1050 class EditablePane(Pane,EditingMixin): pass
1051 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1053 vereq(EditableScrollablePane.__mro__,
1054 (EditableScrollablePane, ScrollablePane, EditablePane,
1055 Pane, ScrollingMixin, EditingMixin, object))
1057 def mro_disagreement():
1058 if verbose: print "Testing error messages for MRO disagreement..."
1059 def raises(exc, expected, callable, *args):
1060 try:
1061 callable(*args)
1062 except exc, msg:
1063 if not str(msg).startswith(expected):
1064 raise TestFailed, "Message %r, expected %r" % (str(msg),
1065 expected)
1066 else:
1067 raise TestFailed, "Expected %s" % exc
1068 class A(object): pass
1069 class B(A): pass
1070 class C(object): pass
1071 # Test some very simple errors
1072 raises(TypeError, "duplicate base class A",
1073 type, "X", (A, A), {})
1074 raises(TypeError, "MRO conflict among bases ",
1075 type, "X", (A, B), {})
1076 raises(TypeError, "MRO conflict among bases ",
1077 type, "X", (A, C, B), {})
1078 # Test a slightly more complex error
1079 class GridLayout(object): pass
1080 class HorizontalGrid(GridLayout): pass
1081 class VerticalGrid(GridLayout): pass
1082 class HVGrid(HorizontalGrid, VerticalGrid): pass
1083 class VHGrid(VerticalGrid, HorizontalGrid): pass
1084 raises(TypeError, "MRO conflict among bases ",
1085 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1087 def objects():
1088 if verbose: print "Testing object class..."
1089 a = object()
1090 vereq(a.__class__, object)
1091 vereq(type(a), object)
1092 b = object()
1093 verify(a is not b)
1094 verify(not hasattr(a, "foo"))
1095 try:
1096 a.foo = 12
1097 except (AttributeError, TypeError):
1098 pass
1099 else:
1100 verify(0, "object() should not allow setting a foo attribute")
1101 verify(not hasattr(object(), "__dict__"))
1103 class Cdict(object):
1104 pass
1105 x = Cdict()
1106 vereq(x.__dict__, {})
1107 x.foo = 1
1108 vereq(x.foo, 1)
1109 vereq(x.__dict__, {'foo': 1})
1111 def slots():
1112 if verbose: print "Testing __slots__..."
1113 class C0(object):
1114 __slots__ = []
1115 x = C0()
1116 verify(not hasattr(x, "__dict__"))
1117 verify(not hasattr(x, "foo"))
1119 class C1(object):
1120 __slots__ = ['a']
1121 x = C1()
1122 verify(not hasattr(x, "__dict__"))
1123 verify(not hasattr(x, "a"))
1124 x.a = 1
1125 vereq(x.a, 1)
1126 x.a = None
1127 veris(x.a, None)
1128 del x.a
1129 verify(not hasattr(x, "a"))
1131 class C3(object):
1132 __slots__ = ['a', 'b', 'c']
1133 x = C3()
1134 verify(not hasattr(x, "__dict__"))
1135 verify(not hasattr(x, 'a'))
1136 verify(not hasattr(x, 'b'))
1137 verify(not hasattr(x, 'c'))
1138 x.a = 1
1139 x.b = 2
1140 x.c = 3
1141 vereq(x.a, 1)
1142 vereq(x.b, 2)
1143 vereq(x.c, 3)
1145 class C4(object):
1146 """Validate name mangling"""
1147 __slots__ = ['__a']
1148 def __init__(self, value):
1149 self.__a = value
1150 def get(self):
1151 return self.__a
1152 x = C4(5)
1153 verify(not hasattr(x, '__dict__'))
1154 verify(not hasattr(x, '__a'))
1155 vereq(x.get(), 5)
1156 try:
1157 x.__a = 6
1158 except AttributeError:
1159 pass
1160 else:
1161 raise TestFailed, "Double underscored names not mangled"
1163 # Make sure slot names are proper identifiers
1164 try:
1165 class C(object):
1166 __slots__ = [None]
1167 except TypeError:
1168 pass
1169 else:
1170 raise TestFailed, "[None] slots not caught"
1171 try:
1172 class C(object):
1173 __slots__ = ["foo bar"]
1174 except TypeError:
1175 pass
1176 else:
1177 raise TestFailed, "['foo bar'] slots not caught"
1178 try:
1179 class C(object):
1180 __slots__ = ["foo\0bar"]
1181 except TypeError:
1182 pass
1183 else:
1184 raise TestFailed, "['foo\\0bar'] slots not caught"
1185 try:
1186 class C(object):
1187 __slots__ = ["1"]
1188 except TypeError:
1189 pass
1190 else:
1191 raise TestFailed, "['1'] slots not caught"
1192 try:
1193 class C(object):
1194 __slots__ = [""]
1195 except TypeError:
1196 pass
1197 else:
1198 raise TestFailed, "[''] slots not caught"
1199 class C(object):
1200 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1202 # Test leaks
1203 class Counted(object):
1204 counter = 0 # counts the number of instances alive
1205 def __init__(self):
1206 Counted.counter += 1
1207 def __del__(self):
1208 Counted.counter -= 1
1209 class C(object):
1210 __slots__ = ['a', 'b', 'c']
1211 x = C()
1212 x.a = Counted()
1213 x.b = Counted()
1214 x.c = Counted()
1215 vereq(Counted.counter, 3)
1216 del x
1217 vereq(Counted.counter, 0)
1218 class D(C):
1219 pass
1220 x = D()
1221 x.a = Counted()
1222 x.z = Counted()
1223 vereq(Counted.counter, 2)
1224 del x
1225 vereq(Counted.counter, 0)
1226 class E(D):
1227 __slots__ = ['e']
1228 x = E()
1229 x.a = Counted()
1230 x.z = Counted()
1231 x.e = Counted()
1232 vereq(Counted.counter, 3)
1233 del x
1234 vereq(Counted.counter, 0)
1236 # Test cyclical leaks [SF bug 519621]
1237 class F(object):
1238 __slots__ = ['a', 'b']
1239 log = []
1240 s = F()
1241 s.a = [Counted(), s]
1242 vereq(Counted.counter, 1)
1243 s = None
1244 import gc
1245 gc.collect()
1246 vereq(Counted.counter, 0)
1248 # Test lookup leaks [SF bug 572567]
1249 import sys,gc
1250 class G(object):
1251 def __cmp__(self, other):
1252 return 0
1253 g = G()
1254 orig_objects = len(gc.get_objects())
1255 for i in xrange(10):
1256 g==g
1257 new_objects = len(gc.get_objects())
1258 vereq(orig_objects, new_objects)
1260 def slotspecials():
1261 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1263 class D(object):
1264 __slots__ = ["__dict__"]
1265 a = D()
1266 verify(hasattr(a, "__dict__"))
1267 verify(not hasattr(a, "__weakref__"))
1268 a.foo = 42
1269 vereq(a.__dict__, {"foo": 42})
1271 class W(object):
1272 __slots__ = ["__weakref__"]
1273 a = W()
1274 verify(hasattr(a, "__weakref__"))
1275 verify(not hasattr(a, "__dict__"))
1276 try:
1277 a.foo = 42
1278 except AttributeError:
1279 pass
1280 else:
1281 raise TestFailed, "shouldn't be allowed to set a.foo"
1283 class C1(W, D):
1284 __slots__ = []
1285 a = C1()
1286 verify(hasattr(a, "__dict__"))
1287 verify(hasattr(a, "__weakref__"))
1288 a.foo = 42
1289 vereq(a.__dict__, {"foo": 42})
1291 class C2(D, W):
1292 __slots__ = []
1293 a = C2()
1294 verify(hasattr(a, "__dict__"))
1295 verify(hasattr(a, "__weakref__"))
1296 a.foo = 42
1297 vereq(a.__dict__, {"foo": 42})
1299 # MRO order disagreement
1301 # class C3(C1, C2):
1302 # __slots__ = []
1304 # class C4(C2, C1):
1305 # __slots__ = []
1307 def dynamics():
1308 if verbose: print "Testing class attribute propagation..."
1309 class D(object):
1310 pass
1311 class E(D):
1312 pass
1313 class F(D):
1314 pass
1315 D.foo = 1
1316 vereq(D.foo, 1)
1317 # Test that dynamic attributes are inherited
1318 vereq(E.foo, 1)
1319 vereq(F.foo, 1)
1320 # Test dynamic instances
1321 class C(object):
1322 pass
1323 a = C()
1324 verify(not hasattr(a, "foobar"))
1325 C.foobar = 2
1326 vereq(a.foobar, 2)
1327 C.method = lambda self: 42
1328 vereq(a.method(), 42)
1329 C.__repr__ = lambda self: "C()"
1330 vereq(repr(a), "C()")
1331 C.__int__ = lambda self: 100
1332 vereq(int(a), 100)
1333 vereq(a.foobar, 2)
1334 verify(not hasattr(a, "spam"))
1335 def mygetattr(self, name):
1336 if name == "spam":
1337 return "spam"
1338 raise AttributeError
1339 C.__getattr__ = mygetattr
1340 vereq(a.spam, "spam")
1341 a.new = 12
1342 vereq(a.new, 12)
1343 def mysetattr(self, name, value):
1344 if name == "spam":
1345 raise AttributeError
1346 return object.__setattr__(self, name, value)
1347 C.__setattr__ = mysetattr
1348 try:
1349 a.spam = "not spam"
1350 except AttributeError:
1351 pass
1352 else:
1353 verify(0, "expected AttributeError")
1354 vereq(a.spam, "spam")
1355 class D(C):
1356 pass
1357 d = D()
1358 d.foo = 1
1359 vereq(d.foo, 1)
1361 # Test handling of int*seq and seq*int
1362 class I(int):
1363 pass
1364 vereq("a"*I(2), "aa")
1365 vereq(I(2)*"a", "aa")
1366 vereq(2*I(3), 6)
1367 vereq(I(3)*2, 6)
1368 vereq(I(3)*I(2), 6)
1370 # Test handling of long*seq and seq*long
1371 class L(long):
1372 pass
1373 vereq("a"*L(2L), "aa")
1374 vereq(L(2L)*"a", "aa")
1375 vereq(2*L(3), 6)
1376 vereq(L(3)*2, 6)
1377 vereq(L(3)*L(2), 6)
1379 # Test comparison of classes with dynamic metaclasses
1380 class dynamicmetaclass(type):
1381 pass
1382 class someclass:
1383 __metaclass__ = dynamicmetaclass
1384 verify(someclass != object)
1386 def errors():
1387 if verbose: print "Testing errors..."
1389 try:
1390 class C(list, dict):
1391 pass
1392 except TypeError:
1393 pass
1394 else:
1395 verify(0, "inheritance from both list and dict should be illegal")
1397 try:
1398 class C(object, None):
1399 pass
1400 except TypeError:
1401 pass
1402 else:
1403 verify(0, "inheritance from non-type should be illegal")
1404 class Classic:
1405 pass
1407 try:
1408 class C(type(len)):
1409 pass
1410 except TypeError:
1411 pass
1412 else:
1413 verify(0, "inheritance from CFunction should be illegal")
1415 try:
1416 class C(object):
1417 __slots__ = 1
1418 except TypeError:
1419 pass
1420 else:
1421 verify(0, "__slots__ = 1 should be illegal")
1423 try:
1424 class C(object):
1425 __slots__ = [1]
1426 except TypeError:
1427 pass
1428 else:
1429 verify(0, "__slots__ = [1] should be illegal")
1431 def classmethods():
1432 if verbose: print "Testing class methods..."
1433 class C(object):
1434 def foo(*a): return a
1435 goo = classmethod(foo)
1436 c = C()
1437 vereq(C.goo(1), (C, 1))
1438 vereq(c.goo(1), (C, 1))
1439 vereq(c.foo(1), (c, 1))
1440 class D(C):
1441 pass
1442 d = D()
1443 vereq(D.goo(1), (D, 1))
1444 vereq(d.goo(1), (D, 1))
1445 vereq(d.foo(1), (d, 1))
1446 vereq(D.foo(d, 1), (d, 1))
1447 # Test for a specific crash (SF bug 528132)
1448 def f(cls, arg): return (cls, arg)
1449 ff = classmethod(f)
1450 vereq(ff.__get__(0, int)(42), (int, 42))
1451 vereq(ff.__get__(0)(42), (int, 42))
1453 # Test super() with classmethods (SF bug 535444)
1454 veris(C.goo.im_self, C)
1455 veris(D.goo.im_self, D)
1456 veris(super(D,D).goo.im_self, D)
1457 veris(super(D,d).goo.im_self, D)
1458 vereq(super(D,D).goo(), (D,))
1459 vereq(super(D,d).goo(), (D,))
1461 def classmethods_in_c():
1462 if verbose: print "Testing C-based class methods..."
1463 import xxsubtype as spam
1464 a = (1, 2, 3)
1465 d = {'abc': 123}
1466 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1467 veris(x, spam.spamlist)
1468 vereq(a, a1)
1469 vereq(d, d1)
1470 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1471 veris(x, spam.spamlist)
1472 vereq(a, a1)
1473 vereq(d, d1)
1475 def staticmethods():
1476 if verbose: print "Testing static methods..."
1477 class C(object):
1478 def foo(*a): return a
1479 goo = staticmethod(foo)
1480 c = C()
1481 vereq(C.goo(1), (1,))
1482 vereq(c.goo(1), (1,))
1483 vereq(c.foo(1), (c, 1,))
1484 class D(C):
1485 pass
1486 d = D()
1487 vereq(D.goo(1), (1,))
1488 vereq(d.goo(1), (1,))
1489 vereq(d.foo(1), (d, 1))
1490 vereq(D.foo(d, 1), (d, 1))
1492 def staticmethods_in_c():
1493 if verbose: print "Testing C-based static methods..."
1494 import xxsubtype as spam
1495 a = (1, 2, 3)
1496 d = {"abc": 123}
1497 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1498 veris(x, None)
1499 vereq(a, a1)
1500 vereq(d, d1)
1501 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1502 veris(x, None)
1503 vereq(a, a1)
1504 vereq(d, d1)
1506 def classic():
1507 if verbose: print "Testing classic classes..."
1508 class C:
1509 def foo(*a): return a
1510 goo = classmethod(foo)
1511 c = C()
1512 vereq(C.goo(1), (C, 1))
1513 vereq(c.goo(1), (C, 1))
1514 vereq(c.foo(1), (c, 1))
1515 class D(C):
1516 pass
1517 d = D()
1518 vereq(D.goo(1), (D, 1))
1519 vereq(d.goo(1), (D, 1))
1520 vereq(d.foo(1), (d, 1))
1521 vereq(D.foo(d, 1), (d, 1))
1522 class E: # *not* subclassing from C
1523 foo = C.foo
1524 vereq(E().foo, C.foo) # i.e., unbound
1525 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
1527 def compattr():
1528 if verbose: print "Testing computed attributes..."
1529 class C(object):
1530 class computed_attribute(object):
1531 def __init__(self, get, set=None, delete=None):
1532 self.__get = get
1533 self.__set = set
1534 self.__delete = delete
1535 def __get__(self, obj, type=None):
1536 return self.__get(obj)
1537 def __set__(self, obj, value):
1538 return self.__set(obj, value)
1539 def __delete__(self, obj):
1540 return self.__delete(obj)
1541 def __init__(self):
1542 self.__x = 0
1543 def __get_x(self):
1544 x = self.__x
1545 self.__x = x+1
1546 return x
1547 def __set_x(self, x):
1548 self.__x = x
1549 def __delete_x(self):
1550 del self.__x
1551 x = computed_attribute(__get_x, __set_x, __delete_x)
1552 a = C()
1553 vereq(a.x, 0)
1554 vereq(a.x, 1)
1555 a.x = 10
1556 vereq(a.x, 10)
1557 vereq(a.x, 11)
1558 del a.x
1559 vereq(hasattr(a, 'x'), 0)
1561 def newslot():
1562 if verbose: print "Testing __new__ slot override..."
1563 class C(list):
1564 def __new__(cls):
1565 self = list.__new__(cls)
1566 self.foo = 1
1567 return self
1568 def __init__(self):
1569 self.foo = self.foo + 2
1570 a = C()
1571 vereq(a.foo, 3)
1572 verify(a.__class__ is C)
1573 class D(C):
1574 pass
1575 b = D()
1576 vereq(b.foo, 3)
1577 verify(b.__class__ is D)
1579 def altmro():
1580 if verbose: print "Testing mro() and overriding it..."
1581 class A(object):
1582 def f(self): return "A"
1583 class B(A):
1584 pass
1585 class C(A):
1586 def f(self): return "C"
1587 class D(B, C):
1588 pass
1589 vereq(D.mro(), [D, B, C, A, object])
1590 vereq(D.__mro__, (D, B, C, A, object))
1591 vereq(D().f(), "C")
1593 class PerverseMetaType(type):
1594 def mro(cls):
1595 L = type.mro(cls)
1596 L.reverse()
1597 return L
1598 class X(D,B,C,A):
1599 __metaclass__ = PerverseMetaType
1600 vereq(X.__mro__, (object, A, C, B, D, X))
1601 vereq(X().f(), "A")
1603 def overloading():
1604 if verbose: print "Testing operator overloading..."
1606 class B(object):
1607 "Intermediate class because object doesn't have a __setattr__"
1609 class C(B):
1611 def __getattr__(self, name):
1612 if name == "foo":
1613 return ("getattr", name)
1614 else:
1615 raise AttributeError
1616 def __setattr__(self, name, value):
1617 if name == "foo":
1618 self.setattr = (name, value)
1619 else:
1620 return B.__setattr__(self, name, value)
1621 def __delattr__(self, name):
1622 if name == "foo":
1623 self.delattr = name
1624 else:
1625 return B.__delattr__(self, name)
1627 def __getitem__(self, key):
1628 return ("getitem", key)
1629 def __setitem__(self, key, value):
1630 self.setitem = (key, value)
1631 def __delitem__(self, key):
1632 self.delitem = key
1634 def __getslice__(self, i, j):
1635 return ("getslice", i, j)
1636 def __setslice__(self, i, j, value):
1637 self.setslice = (i, j, value)
1638 def __delslice__(self, i, j):
1639 self.delslice = (i, j)
1641 a = C()
1642 vereq(a.foo, ("getattr", "foo"))
1643 a.foo = 12
1644 vereq(a.setattr, ("foo", 12))
1645 del a.foo
1646 vereq(a.delattr, "foo")
1648 vereq(a[12], ("getitem", 12))
1649 a[12] = 21
1650 vereq(a.setitem, (12, 21))
1651 del a[12]
1652 vereq(a.delitem, 12)
1654 vereq(a[0:10], ("getslice", 0, 10))
1655 a[0:10] = "foo"
1656 vereq(a.setslice, (0, 10, "foo"))
1657 del a[0:10]
1658 vereq(a.delslice, (0, 10))
1660 def methods():
1661 if verbose: print "Testing methods..."
1662 class C(object):
1663 def __init__(self, x):
1664 self.x = x
1665 def foo(self):
1666 return self.x
1667 c1 = C(1)
1668 vereq(c1.foo(), 1)
1669 class D(C):
1670 boo = C.foo
1671 goo = c1.foo
1672 d2 = D(2)
1673 vereq(d2.foo(), 2)
1674 vereq(d2.boo(), 2)
1675 vereq(d2.goo(), 1)
1676 class E(object):
1677 foo = C.foo
1678 vereq(E().foo, C.foo) # i.e., unbound
1679 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
1681 def specials():
1682 # Test operators like __hash__ for which a built-in default exists
1683 if verbose: print "Testing special operators..."
1684 # Test the default behavior for static classes
1685 class C(object):
1686 def __getitem__(self, i):
1687 if 0 <= i < 10: return i
1688 raise IndexError
1689 c1 = C()
1690 c2 = C()
1691 verify(not not c1)
1692 vereq(hash(c1), id(c1))
1693 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1694 vereq(c1, c1)
1695 verify(c1 != c2)
1696 verify(not c1 != c1)
1697 verify(not c1 == c2)
1698 # Note that the module name appears in str/repr, and that varies
1699 # depending on whether this test is run standalone or from a framework.
1700 verify(str(c1).find('C object at ') >= 0)
1701 vereq(str(c1), repr(c1))
1702 verify(-1 not in c1)
1703 for i in range(10):
1704 verify(i in c1)
1705 verify(10 not in c1)
1706 # Test the default behavior for dynamic classes
1707 class D(object):
1708 def __getitem__(self, i):
1709 if 0 <= i < 10: return i
1710 raise IndexError
1711 d1 = D()
1712 d2 = D()
1713 verify(not not d1)
1714 vereq(hash(d1), id(d1))
1715 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1716 vereq(d1, d1)
1717 verify(d1 != d2)
1718 verify(not d1 != d1)
1719 verify(not d1 == d2)
1720 # Note that the module name appears in str/repr, and that varies
1721 # depending on whether this test is run standalone or from a framework.
1722 verify(str(d1).find('D object at ') >= 0)
1723 vereq(str(d1), repr(d1))
1724 verify(-1 not in d1)
1725 for i in range(10):
1726 verify(i in d1)
1727 verify(10 not in d1)
1728 # Test overridden behavior for static classes
1729 class Proxy(object):
1730 def __init__(self, x):
1731 self.x = x
1732 def __nonzero__(self):
1733 return not not self.x
1734 def __hash__(self):
1735 return hash(self.x)
1736 def __eq__(self, other):
1737 return self.x == other
1738 def __ne__(self, other):
1739 return self.x != other
1740 def __cmp__(self, other):
1741 return cmp(self.x, other.x)
1742 def __str__(self):
1743 return "Proxy:%s" % self.x
1744 def __repr__(self):
1745 return "Proxy(%r)" % self.x
1746 def __contains__(self, value):
1747 return value in self.x
1748 p0 = Proxy(0)
1749 p1 = Proxy(1)
1750 p_1 = Proxy(-1)
1751 verify(not p0)
1752 verify(not not p1)
1753 vereq(hash(p0), hash(0))
1754 vereq(p0, p0)
1755 verify(p0 != p1)
1756 verify(not p0 != p0)
1757 vereq(not p0, p1)
1758 vereq(cmp(p0, p1), -1)
1759 vereq(cmp(p0, p0), 0)
1760 vereq(cmp(p0, p_1), 1)
1761 vereq(str(p0), "Proxy:0")
1762 vereq(repr(p0), "Proxy(0)")
1763 p10 = Proxy(range(10))
1764 verify(-1 not in p10)
1765 for i in range(10):
1766 verify(i in p10)
1767 verify(10 not in p10)
1768 # Test overridden behavior for dynamic classes
1769 class DProxy(object):
1770 def __init__(self, x):
1771 self.x = x
1772 def __nonzero__(self):
1773 return not not self.x
1774 def __hash__(self):
1775 return hash(self.x)
1776 def __eq__(self, other):
1777 return self.x == other
1778 def __ne__(self, other):
1779 return self.x != other
1780 def __cmp__(self, other):
1781 return cmp(self.x, other.x)
1782 def __str__(self):
1783 return "DProxy:%s" % self.x
1784 def __repr__(self):
1785 return "DProxy(%r)" % self.x
1786 def __contains__(self, value):
1787 return value in self.x
1788 p0 = DProxy(0)
1789 p1 = DProxy(1)
1790 p_1 = DProxy(-1)
1791 verify(not p0)
1792 verify(not not p1)
1793 vereq(hash(p0), hash(0))
1794 vereq(p0, p0)
1795 verify(p0 != p1)
1796 verify(not p0 != p0)
1797 vereq(not p0, p1)
1798 vereq(cmp(p0, p1), -1)
1799 vereq(cmp(p0, p0), 0)
1800 vereq(cmp(p0, p_1), 1)
1801 vereq(str(p0), "DProxy:0")
1802 vereq(repr(p0), "DProxy(0)")
1803 p10 = DProxy(range(10))
1804 verify(-1 not in p10)
1805 for i in range(10):
1806 verify(i in p10)
1807 verify(10 not in p10)
1808 # Safety test for __cmp__
1809 def unsafecmp(a, b):
1810 try:
1811 a.__class__.__cmp__(a, b)
1812 except TypeError:
1813 pass
1814 else:
1815 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1816 a.__class__, a, b)
1817 unsafecmp(u"123", "123")
1818 unsafecmp("123", u"123")
1819 unsafecmp(1, 1.0)
1820 unsafecmp(1.0, 1)
1821 unsafecmp(1, 1L)
1822 unsafecmp(1L, 1)
1824 class Letter(str):
1825 def __new__(cls, letter):
1826 if letter == 'EPS':
1827 return str.__new__(cls)
1828 return str.__new__(cls, letter)
1829 def __str__(self):
1830 if not self:
1831 return 'EPS'
1832 return self
1834 # sys.stdout needs to be the original to trigger the recursion bug
1835 import sys
1836 test_stdout = sys.stdout
1837 sys.stdout = get_original_stdout()
1838 try:
1839 # nothing should actually be printed, this should raise an exception
1840 print Letter('w')
1841 except RuntimeError:
1842 pass
1843 else:
1844 raise TestFailed, "expected a RuntimeError for print recursion"
1845 sys.stdout = test_stdout
1847 def weakrefs():
1848 if verbose: print "Testing weak references..."
1849 import weakref
1850 class C(object):
1851 pass
1852 c = C()
1853 r = weakref.ref(c)
1854 verify(r() is c)
1855 del c
1856 verify(r() is None)
1857 del r
1858 class NoWeak(object):
1859 __slots__ = ['foo']
1860 no = NoWeak()
1861 try:
1862 weakref.ref(no)
1863 except TypeError, msg:
1864 verify(str(msg).find("weak reference") >= 0)
1865 else:
1866 verify(0, "weakref.ref(no) should be illegal")
1867 class Weak(object):
1868 __slots__ = ['foo', '__weakref__']
1869 yes = Weak()
1870 r = weakref.ref(yes)
1871 verify(r() is yes)
1872 del yes
1873 verify(r() is None)
1874 del r
1876 def properties():
1877 if verbose: print "Testing property..."
1878 class C(object):
1879 def getx(self):
1880 return self.__x
1881 def setx(self, value):
1882 self.__x = value
1883 def delx(self):
1884 del self.__x
1885 x = property(getx, setx, delx, doc="I'm the x property.")
1886 a = C()
1887 verify(not hasattr(a, "x"))
1888 a.x = 42
1889 vereq(a._C__x, 42)
1890 vereq(a.x, 42)
1891 del a.x
1892 verify(not hasattr(a, "x"))
1893 verify(not hasattr(a, "_C__x"))
1894 C.x.__set__(a, 100)
1895 vereq(C.x.__get__(a), 100)
1896 C.x.__delete__(a)
1897 verify(not hasattr(a, "x"))
1899 raw = C.__dict__['x']
1900 verify(isinstance(raw, property))
1902 attrs = dir(raw)
1903 verify("__doc__" in attrs)
1904 verify("fget" in attrs)
1905 verify("fset" in attrs)
1906 verify("fdel" in attrs)
1908 vereq(raw.__doc__, "I'm the x property.")
1909 verify(raw.fget is C.__dict__['getx'])
1910 verify(raw.fset is C.__dict__['setx'])
1911 verify(raw.fdel is C.__dict__['delx'])
1913 for attr in "__doc__", "fget", "fset", "fdel":
1914 try:
1915 setattr(raw, attr, 42)
1916 except TypeError, msg:
1917 if str(msg).find('readonly') < 0:
1918 raise TestFailed("when setting readonly attr %r on a "
1919 "property, got unexpected TypeError "
1920 "msg %r" % (attr, str(msg)))
1921 else:
1922 raise TestFailed("expected TypeError from trying to set "
1923 "readonly %r attr on a property" % attr)
1925 class D(object):
1926 __getitem__ = property(lambda s: 1/0)
1928 d = D()
1929 try:
1930 for i in d:
1931 str(i)
1932 except ZeroDivisionError:
1933 pass
1934 else:
1935 raise TestFailed, "expected ZeroDivisionError from bad property"
1937 def supers():
1938 if verbose: print "Testing super..."
1940 class A(object):
1941 def meth(self, a):
1942 return "A(%r)" % a
1944 vereq(A().meth(1), "A(1)")
1946 class B(A):
1947 def __init__(self):
1948 self.__super = super(B, self)
1949 def meth(self, a):
1950 return "B(%r)" % a + self.__super.meth(a)
1952 vereq(B().meth(2), "B(2)A(2)")
1954 class C(A):
1955 def meth(self, a):
1956 return "C(%r)" % a + self.__super.meth(a)
1957 C._C__super = super(C)
1959 vereq(C().meth(3), "C(3)A(3)")
1961 class D(C, B):
1962 def meth(self, a):
1963 return "D(%r)" % a + super(D, self).meth(a)
1965 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1967 # Test for subclassing super
1969 class mysuper(super):
1970 def __init__(self, *args):
1971 return super(mysuper, self).__init__(*args)
1973 class E(D):
1974 def meth(self, a):
1975 return "E(%r)" % a + mysuper(E, self).meth(a)
1977 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1979 class F(E):
1980 def meth(self, a):
1981 s = self.__super
1982 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1983 F._F__super = mysuper(F)
1985 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1987 # Make sure certain errors are raised
1989 try:
1990 super(D, 42)
1991 except TypeError:
1992 pass
1993 else:
1994 raise TestFailed, "shouldn't allow super(D, 42)"
1996 try:
1997 super(D, C())
1998 except TypeError:
1999 pass
2000 else:
2001 raise TestFailed, "shouldn't allow super(D, C())"
2003 try:
2004 super(D).__get__(12)
2005 except TypeError:
2006 pass
2007 else:
2008 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2010 try:
2011 super(D).__get__(C())
2012 except TypeError:
2013 pass
2014 else:
2015 raise TestFailed, "shouldn't allow super(D).__get__(C())"
2017 def inherits():
2018 if verbose: print "Testing inheritance from basic types..."
2020 class hexint(int):
2021 def __repr__(self):
2022 return hex(self)
2023 def __add__(self, other):
2024 return hexint(int.__add__(self, other))
2025 # (Note that overriding __radd__ doesn't work,
2026 # because the int type gets first dibs.)
2027 vereq(repr(hexint(7) + 9), "0x10")
2028 vereq(repr(hexint(1000) + 7), "0x3ef")
2029 a = hexint(12345)
2030 vereq(a, 12345)
2031 vereq(int(a), 12345)
2032 verify(int(a).__class__ is int)
2033 vereq(hash(a), hash(12345))
2034 verify((+a).__class__ is int)
2035 verify((a >> 0).__class__ is int)
2036 verify((a << 0).__class__ is int)
2037 verify((hexint(0) << 12).__class__ is int)
2038 verify((hexint(0) >> 12).__class__ is int)
2040 class octlong(long):
2041 __slots__ = []
2042 def __str__(self):
2043 s = oct(self)
2044 if s[-1] == 'L':
2045 s = s[:-1]
2046 return s
2047 def __add__(self, other):
2048 return self.__class__(super(octlong, self).__add__(other))
2049 __radd__ = __add__
2050 vereq(str(octlong(3) + 5), "010")
2051 # (Note that overriding __radd__ here only seems to work
2052 # because the example uses a short int left argument.)
2053 vereq(str(5 + octlong(3000)), "05675")
2054 a = octlong(12345)
2055 vereq(a, 12345L)
2056 vereq(long(a), 12345L)
2057 vereq(hash(a), hash(12345L))
2058 verify(long(a).__class__ is long)
2059 verify((+a).__class__ is long)
2060 verify((-a).__class__ is long)
2061 verify((-octlong(0)).__class__ is long)
2062 verify((a >> 0).__class__ is long)
2063 verify((a << 0).__class__ is long)
2064 verify((a - 0).__class__ is long)
2065 verify((a * 1).__class__ is long)
2066 verify((a ** 1).__class__ is long)
2067 verify((a // 1).__class__ is long)
2068 verify((1 * a).__class__ is long)
2069 verify((a | 0).__class__ is long)
2070 verify((a ^ 0).__class__ is long)
2071 verify((a & -1L).__class__ is long)
2072 verify((octlong(0) << 12).__class__ is long)
2073 verify((octlong(0) >> 12).__class__ is long)
2074 verify(abs(octlong(0)).__class__ is long)
2076 # Because octlong overrides __add__, we can't check the absence of +0
2077 # optimizations using octlong.
2078 class longclone(long):
2079 pass
2080 a = longclone(1)
2081 verify((a + 0).__class__ is long)
2082 verify((0 + a).__class__ is long)
2084 # Check that negative clones don't segfault
2085 a = longclone(-1)
2086 vereq(a.__dict__, {})
2087 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
2089 class precfloat(float):
2090 __slots__ = ['prec']
2091 def __init__(self, value=0.0, prec=12):
2092 self.prec = int(prec)
2093 float.__init__(value)
2094 def __repr__(self):
2095 return "%.*g" % (self.prec, self)
2096 vereq(repr(precfloat(1.1)), "1.1")
2097 a = precfloat(12345)
2098 vereq(a, 12345.0)
2099 vereq(float(a), 12345.0)
2100 verify(float(a).__class__ is float)
2101 vereq(hash(a), hash(12345.0))
2102 verify((+a).__class__ is float)
2104 class madcomplex(complex):
2105 def __repr__(self):
2106 return "%.17gj%+.17g" % (self.imag, self.real)
2107 a = madcomplex(-3, 4)
2108 vereq(repr(a), "4j-3")
2109 base = complex(-3, 4)
2110 veris(base.__class__, complex)
2111 vereq(a, base)
2112 vereq(complex(a), base)
2113 veris(complex(a).__class__, complex)
2114 a = madcomplex(a) # just trying another form of the constructor
2115 vereq(repr(a), "4j-3")
2116 vereq(a, base)
2117 vereq(complex(a), base)
2118 veris(complex(a).__class__, complex)
2119 vereq(hash(a), hash(base))
2120 veris((+a).__class__, complex)
2121 veris((a + 0).__class__, complex)
2122 vereq(a + 0, base)
2123 veris((a - 0).__class__, complex)
2124 vereq(a - 0, base)
2125 veris((a * 1).__class__, complex)
2126 vereq(a * 1, base)
2127 veris((a / 1).__class__, complex)
2128 vereq(a / 1, base)
2130 class madtuple(tuple):
2131 _rev = None
2132 def rev(self):
2133 if self._rev is not None:
2134 return self._rev
2135 L = list(self)
2136 L.reverse()
2137 self._rev = self.__class__(L)
2138 return self._rev
2139 a = madtuple((1,2,3,4,5,6,7,8,9,0))
2140 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2141 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2142 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
2143 for i in range(512):
2144 t = madtuple(range(i))
2145 u = t.rev()
2146 v = u.rev()
2147 vereq(v, t)
2148 a = madtuple((1,2,3,4,5))
2149 vereq(tuple(a), (1,2,3,4,5))
2150 verify(tuple(a).__class__ is tuple)
2151 vereq(hash(a), hash((1,2,3,4,5)))
2152 verify(a[:].__class__ is tuple)
2153 verify((a * 1).__class__ is tuple)
2154 verify((a * 0).__class__ is tuple)
2155 verify((a + ()).__class__ is tuple)
2156 a = madtuple(())
2157 vereq(tuple(a), ())
2158 verify(tuple(a).__class__ is tuple)
2159 verify((a + a).__class__ is tuple)
2160 verify((a * 0).__class__ is tuple)
2161 verify((a * 1).__class__ is tuple)
2162 verify((a * 2).__class__ is tuple)
2163 verify(a[:].__class__ is tuple)
2165 class madstring(str):
2166 _rev = None
2167 def rev(self):
2168 if self._rev is not None:
2169 return self._rev
2170 L = list(self)
2171 L.reverse()
2172 self._rev = self.__class__("".join(L))
2173 return self._rev
2174 s = madstring("abcdefghijklmnopqrstuvwxyz")
2175 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2176 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2177 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
2178 for i in range(256):
2179 s = madstring("".join(map(chr, range(i))))
2180 t = s.rev()
2181 u = t.rev()
2182 vereq(u, s)
2183 s = madstring("12345")
2184 vereq(str(s), "12345")
2185 verify(str(s).__class__ is str)
2187 base = "\x00" * 5
2188 s = madstring(base)
2189 vereq(s, base)
2190 vereq(str(s), base)
2191 verify(str(s).__class__ is str)
2192 vereq(hash(s), hash(base))
2193 vereq({s: 1}[base], 1)
2194 vereq({base: 1}[s], 1)
2195 verify((s + "").__class__ is str)
2196 vereq(s + "", base)
2197 verify(("" + s).__class__ is str)
2198 vereq("" + s, base)
2199 verify((s * 0).__class__ is str)
2200 vereq(s * 0, "")
2201 verify((s * 1).__class__ is str)
2202 vereq(s * 1, base)
2203 verify((s * 2).__class__ is str)
2204 vereq(s * 2, base + base)
2205 verify(s[:].__class__ is str)
2206 vereq(s[:], base)
2207 verify(s[0:0].__class__ is str)
2208 vereq(s[0:0], "")
2209 verify(s.strip().__class__ is str)
2210 vereq(s.strip(), base)
2211 verify(s.lstrip().__class__ is str)
2212 vereq(s.lstrip(), base)
2213 verify(s.rstrip().__class__ is str)
2214 vereq(s.rstrip(), base)
2215 identitytab = ''.join([chr(i) for i in range(256)])
2216 verify(s.translate(identitytab).__class__ is str)
2217 vereq(s.translate(identitytab), base)
2218 verify(s.translate(identitytab, "x").__class__ is str)
2219 vereq(s.translate(identitytab, "x"), base)
2220 vereq(s.translate(identitytab, "\x00"), "")
2221 verify(s.replace("x", "x").__class__ is str)
2222 vereq(s.replace("x", "x"), base)
2223 verify(s.ljust(len(s)).__class__ is str)
2224 vereq(s.ljust(len(s)), base)
2225 verify(s.rjust(len(s)).__class__ is str)
2226 vereq(s.rjust(len(s)), base)
2227 verify(s.center(len(s)).__class__ is str)
2228 vereq(s.center(len(s)), base)
2229 verify(s.lower().__class__ is str)
2230 vereq(s.lower(), base)
2232 s = madstring("x y")
2233 vereq(s, "x y")
2234 verify(intern(s).__class__ is str)
2235 verify(intern(s) is intern("x y"))
2236 vereq(intern(s), "x y")
2238 i = intern("y x")
2239 s = madstring("y x")
2240 vereq(s, i)
2241 verify(intern(s).__class__ is str)
2242 verify(intern(s) is i)
2244 s = madstring(i)
2245 verify(intern(s).__class__ is str)
2246 verify(intern(s) is i)
2248 class madunicode(unicode):
2249 _rev = None
2250 def rev(self):
2251 if self._rev is not None:
2252 return self._rev
2253 L = list(self)
2254 L.reverse()
2255 self._rev = self.__class__(u"".join(L))
2256 return self._rev
2257 u = madunicode("ABCDEF")
2258 vereq(u, u"ABCDEF")
2259 vereq(u.rev(), madunicode(u"FEDCBA"))
2260 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
2261 base = u"12345"
2262 u = madunicode(base)
2263 vereq(unicode(u), base)
2264 verify(unicode(u).__class__ is unicode)
2265 vereq(hash(u), hash(base))
2266 vereq({u: 1}[base], 1)
2267 vereq({base: 1}[u], 1)
2268 verify(u.strip().__class__ is unicode)
2269 vereq(u.strip(), base)
2270 verify(u.lstrip().__class__ is unicode)
2271 vereq(u.lstrip(), base)
2272 verify(u.rstrip().__class__ is unicode)
2273 vereq(u.rstrip(), base)
2274 verify(u.replace(u"x", u"x").__class__ is unicode)
2275 vereq(u.replace(u"x", u"x"), base)
2276 verify(u.replace(u"xy", u"xy").__class__ is unicode)
2277 vereq(u.replace(u"xy", u"xy"), base)
2278 verify(u.center(len(u)).__class__ is unicode)
2279 vereq(u.center(len(u)), base)
2280 verify(u.ljust(len(u)).__class__ is unicode)
2281 vereq(u.ljust(len(u)), base)
2282 verify(u.rjust(len(u)).__class__ is unicode)
2283 vereq(u.rjust(len(u)), base)
2284 verify(u.lower().__class__ is unicode)
2285 vereq(u.lower(), base)
2286 verify(u.upper().__class__ is unicode)
2287 vereq(u.upper(), base)
2288 verify(u.capitalize().__class__ is unicode)
2289 vereq(u.capitalize(), base)
2290 verify(u.title().__class__ is unicode)
2291 vereq(u.title(), base)
2292 verify((u + u"").__class__ is unicode)
2293 vereq(u + u"", base)
2294 verify((u"" + u).__class__ is unicode)
2295 vereq(u"" + u, base)
2296 verify((u * 0).__class__ is unicode)
2297 vereq(u * 0, u"")
2298 verify((u * 1).__class__ is unicode)
2299 vereq(u * 1, base)
2300 verify((u * 2).__class__ is unicode)
2301 vereq(u * 2, base + base)
2302 verify(u[:].__class__ is unicode)
2303 vereq(u[:], base)
2304 verify(u[0:0].__class__ is unicode)
2305 vereq(u[0:0], u"")
2307 class sublist(list):
2308 pass
2309 a = sublist(range(5))
2310 vereq(a, range(5))
2311 a.append("hello")
2312 vereq(a, range(5) + ["hello"])
2313 a[5] = 5
2314 vereq(a, range(6))
2315 a.extend(range(6, 20))
2316 vereq(a, range(20))
2317 a[-5:] = []
2318 vereq(a, range(15))
2319 del a[10:15]
2320 vereq(len(a), 10)
2321 vereq(a, range(10))
2322 vereq(list(a), range(10))
2323 vereq(a[0], 0)
2324 vereq(a[9], 9)
2325 vereq(a[-10], 0)
2326 vereq(a[-1], 9)
2327 vereq(a[:5], range(5))
2329 class CountedInput(file):
2330 """Counts lines read by self.readline().
2332 self.lineno is the 0-based ordinal of the last line read, up to
2333 a maximum of one greater than the number of lines in the file.
2335 self.ateof is true if and only if the final "" line has been read,
2336 at which point self.lineno stops incrementing, and further calls
2337 to readline() continue to return "".
2340 lineno = 0
2341 ateof = 0
2342 def readline(self):
2343 if self.ateof:
2344 return ""
2345 s = file.readline(self)
2346 # Next line works too.
2347 # s = super(CountedInput, self).readline()
2348 self.lineno += 1
2349 if s == "":
2350 self.ateof = 1
2351 return s
2353 f = file(name=TESTFN, mode='w')
2354 lines = ['a\n', 'b\n', 'c\n']
2355 try:
2356 f.writelines(lines)
2357 f.close()
2358 f = CountedInput(TESTFN)
2359 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2360 got = f.readline()
2361 vereq(expected, got)
2362 vereq(f.lineno, i)
2363 vereq(f.ateof, (i > len(lines)))
2364 f.close()
2365 finally:
2366 try:
2367 f.close()
2368 except:
2369 pass
2370 try:
2371 import os
2372 os.unlink(TESTFN)
2373 except:
2374 pass
2376 def keywords():
2377 if verbose:
2378 print "Testing keyword args to basic type constructors ..."
2379 vereq(int(x=1), 1)
2380 vereq(float(x=2), 2.0)
2381 vereq(long(x=3), 3L)
2382 vereq(complex(imag=42, real=666), complex(666, 42))
2383 vereq(str(object=500), '500')
2384 vereq(unicode(string='abc', errors='strict'), u'abc')
2385 vereq(tuple(sequence=range(3)), (0, 1, 2))
2386 vereq(list(sequence=(0, 1, 2)), range(3))
2387 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
2389 for constructor in (int, float, long, complex, str, unicode,
2390 tuple, list, file):
2391 try:
2392 constructor(bogus_keyword_arg=1)
2393 except TypeError:
2394 pass
2395 else:
2396 raise TestFailed("expected TypeError from bogus keyword "
2397 "argument to %r" % constructor)
2399 def restricted():
2400 # XXX This test is disabled because rexec is not deemed safe
2401 return
2402 import rexec
2403 if verbose:
2404 print "Testing interaction with restricted execution ..."
2406 sandbox = rexec.RExec()
2408 code1 = """f = open(%r, 'w')""" % TESTFN
2409 code2 = """f = file(%r, 'w')""" % TESTFN
2410 code3 = """\
2411 f = open(%r)
2412 t = type(f) # a sneaky way to get the file() constructor
2413 f.close()
2414 f = t(%r, 'w') # rexec can't catch this by itself
2415 """ % (TESTFN, TESTFN)
2417 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2418 f.close()
2420 try:
2421 for code in code1, code2, code3:
2422 try:
2423 sandbox.r_exec(code)
2424 except IOError, msg:
2425 if str(msg).find("restricted") >= 0:
2426 outcome = "OK"
2427 else:
2428 outcome = "got an exception, but not an expected one"
2429 else:
2430 outcome = "expected a restricted-execution exception"
2432 if outcome != "OK":
2433 raise TestFailed("%s, in %r" % (outcome, code))
2435 finally:
2436 try:
2437 import os
2438 os.unlink(TESTFN)
2439 except:
2440 pass
2442 def str_subclass_as_dict_key():
2443 if verbose:
2444 print "Testing a str subclass used as dict key .."
2446 class cistr(str):
2447 """Sublcass of str that computes __eq__ case-insensitively.
2449 Also computes a hash code of the string in canonical form.
2452 def __init__(self, value):
2453 self.canonical = value.lower()
2454 self.hashcode = hash(self.canonical)
2456 def __eq__(self, other):
2457 if not isinstance(other, cistr):
2458 other = cistr(other)
2459 return self.canonical == other.canonical
2461 def __hash__(self):
2462 return self.hashcode
2464 vereq(cistr('ABC'), 'abc')
2465 vereq('aBc', cistr('ABC'))
2466 vereq(str(cistr('ABC')), 'ABC')
2468 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
2469 vereq(d[cistr('one')], 1)
2470 vereq(d[cistr('tWo')], 2)
2471 vereq(d[cistr('THrEE')], 3)
2472 verify(cistr('ONe') in d)
2473 vereq(d.get(cistr('thrEE')), 3)
2475 def classic_comparisons():
2476 if verbose: print "Testing classic comparisons..."
2477 class classic:
2478 pass
2479 for base in (classic, int, object):
2480 if verbose: print " (base = %s)" % base
2481 class C(base):
2482 def __init__(self, value):
2483 self.value = int(value)
2484 def __cmp__(self, other):
2485 if isinstance(other, C):
2486 return cmp(self.value, other.value)
2487 if isinstance(other, int) or isinstance(other, long):
2488 return cmp(self.value, other)
2489 return NotImplemented
2490 c1 = C(1)
2491 c2 = C(2)
2492 c3 = C(3)
2493 vereq(c1, 1)
2494 c = {1: c1, 2: c2, 3: c3}
2495 for x in 1, 2, 3:
2496 for y in 1, 2, 3:
2497 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2498 for op in "<", "<=", "==", "!=", ">", ">=":
2499 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2500 "x=%d, y=%d" % (x, y))
2501 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2502 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2504 def rich_comparisons():
2505 if verbose:
2506 print "Testing rich comparisons..."
2507 class Z(complex):
2508 pass
2509 z = Z(1)
2510 vereq(z, 1+0j)
2511 vereq(1+0j, z)
2512 class ZZ(complex):
2513 def __eq__(self, other):
2514 try:
2515 return abs(self - other) <= 1e-6
2516 except:
2517 return NotImplemented
2518 zz = ZZ(1.0000003)
2519 vereq(zz, 1+0j)
2520 vereq(1+0j, zz)
2522 class classic:
2523 pass
2524 for base in (classic, int, object, list):
2525 if verbose: print " (base = %s)" % base
2526 class C(base):
2527 def __init__(self, value):
2528 self.value = int(value)
2529 def __cmp__(self, other):
2530 raise TestFailed, "shouldn't call __cmp__"
2531 def __eq__(self, other):
2532 if isinstance(other, C):
2533 return self.value == other.value
2534 if isinstance(other, int) or isinstance(other, long):
2535 return self.value == other
2536 return NotImplemented
2537 def __ne__(self, other):
2538 if isinstance(other, C):
2539 return self.value != other.value
2540 if isinstance(other, int) or isinstance(other, long):
2541 return self.value != other
2542 return NotImplemented
2543 def __lt__(self, other):
2544 if isinstance(other, C):
2545 return self.value < other.value
2546 if isinstance(other, int) or isinstance(other, long):
2547 return self.value < other
2548 return NotImplemented
2549 def __le__(self, other):
2550 if isinstance(other, C):
2551 return self.value <= other.value
2552 if isinstance(other, int) or isinstance(other, long):
2553 return self.value <= other
2554 return NotImplemented
2555 def __gt__(self, other):
2556 if isinstance(other, C):
2557 return self.value > other.value
2558 if isinstance(other, int) or isinstance(other, long):
2559 return self.value > other
2560 return NotImplemented
2561 def __ge__(self, other):
2562 if isinstance(other, C):
2563 return self.value >= other.value
2564 if isinstance(other, int) or isinstance(other, long):
2565 return self.value >= other
2566 return NotImplemented
2567 c1 = C(1)
2568 c2 = C(2)
2569 c3 = C(3)
2570 vereq(c1, 1)
2571 c = {1: c1, 2: c2, 3: c3}
2572 for x in 1, 2, 3:
2573 for y in 1, 2, 3:
2574 for op in "<", "<=", "==", "!=", ">", ">=":
2575 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2576 "x=%d, y=%d" % (x, y))
2577 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2578 "x=%d, y=%d" % (x, y))
2579 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2580 "x=%d, y=%d" % (x, y))
2582 def coercions():
2583 if verbose: print "Testing coercions..."
2584 class I(int): pass
2585 coerce(I(0), 0)
2586 coerce(0, I(0))
2587 class L(long): pass
2588 coerce(L(0), 0)
2589 coerce(L(0), 0L)
2590 coerce(0, L(0))
2591 coerce(0L, L(0))
2592 class F(float): pass
2593 coerce(F(0), 0)
2594 coerce(F(0), 0L)
2595 coerce(F(0), 0.)
2596 coerce(0, F(0))
2597 coerce(0L, F(0))
2598 coerce(0., F(0))
2599 class C(complex): pass
2600 coerce(C(0), 0)
2601 coerce(C(0), 0L)
2602 coerce(C(0), 0.)
2603 coerce(C(0), 0j)
2604 coerce(0, C(0))
2605 coerce(0L, C(0))
2606 coerce(0., C(0))
2607 coerce(0j, C(0))
2609 def descrdoc():
2610 if verbose: print "Testing descriptor doc strings..."
2611 def check(descr, what):
2612 vereq(descr.__doc__, what)
2613 check(file.closed, "True if the file is closed") # getset descriptor
2614 check(file.name, "file name") # member descriptor
2616 def setclass():
2617 if verbose: print "Testing __class__ assignment..."
2618 class C(object): pass
2619 class D(object): pass
2620 class E(object): pass
2621 class F(D, E): pass
2622 for cls in C, D, E, F:
2623 for cls2 in C, D, E, F:
2624 x = cls()
2625 x.__class__ = cls2
2626 verify(x.__class__ is cls2)
2627 x.__class__ = cls
2628 verify(x.__class__ is cls)
2629 def cant(x, C):
2630 try:
2631 x.__class__ = C
2632 except TypeError:
2633 pass
2634 else:
2635 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2636 try:
2637 delattr(x, "__class__")
2638 except TypeError:
2639 pass
2640 else:
2641 raise TestFailed, "shouldn't allow del %r.__class__" % x
2642 cant(C(), list)
2643 cant(list(), C)
2644 cant(C(), 1)
2645 cant(C(), object)
2646 cant(object(), list)
2647 cant(list(), object)
2648 class Int(int): __slots__ = []
2649 cant(2, Int)
2650 cant(Int(), int)
2651 cant(True, int)
2652 cant(2, bool)
2653 o = object()
2654 cant(o, type(1))
2655 cant(o, type(None))
2656 del o
2658 def setdict():
2659 if verbose: print "Testing __dict__ assignment..."
2660 class C(object): pass
2661 a = C()
2662 a.__dict__ = {'b': 1}
2663 vereq(a.b, 1)
2664 def cant(x, dict):
2665 try:
2666 x.__dict__ = dict
2667 except TypeError:
2668 pass
2669 else:
2670 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2671 cant(a, None)
2672 cant(a, [])
2673 cant(a, 1)
2674 del a.__dict__ # Deleting __dict__ is allowed
2675 # Classes don't allow __dict__ assignment
2676 cant(C, {})
2678 def pickles():
2679 if verbose:
2680 print "Testing pickling and copying new-style classes and objects..."
2681 import pickle, cPickle
2683 def sorteditems(d):
2684 L = d.items()
2685 L.sort()
2686 return L
2688 global C
2689 class C(object):
2690 def __init__(self, a, b):
2691 super(C, self).__init__()
2692 self.a = a
2693 self.b = b
2694 def __repr__(self):
2695 return "C(%r, %r)" % (self.a, self.b)
2697 global C1
2698 class C1(list):
2699 def __new__(cls, a, b):
2700 return super(C1, cls).__new__(cls)
2701 def __init__(self, a, b):
2702 self.a = a
2703 self.b = b
2704 def __repr__(self):
2705 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2707 global C2
2708 class C2(int):
2709 def __new__(cls, a, b, val=0):
2710 return super(C2, cls).__new__(cls, val)
2711 def __init__(self, a, b, val=0):
2712 self.a = a
2713 self.b = b
2714 def __repr__(self):
2715 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2717 global C3
2718 class C3(object):
2719 def __init__(self, foo):
2720 self.foo = foo
2721 def __getstate__(self):
2722 return self.foo
2723 def __setstate__(self, foo):
2724 self.foo = foo
2726 global C4classic, C4
2727 class C4classic: # classic
2728 pass
2729 class C4(C4classic, object): # mixed inheritance
2730 pass
2732 for p in pickle, cPickle:
2733 for bin in 0, 1:
2734 if verbose:
2735 print p.__name__, ["text", "binary"][bin]
2737 for cls in C, C1, C2:
2738 s = p.dumps(cls, bin)
2739 cls2 = p.loads(s)
2740 verify(cls2 is cls)
2742 a = C1(1, 2); a.append(42); a.append(24)
2743 b = C2("hello", "world", 42)
2744 s = p.dumps((a, b), bin)
2745 x, y = p.loads(s)
2746 vereq(x.__class__, a.__class__)
2747 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2748 vereq(y.__class__, b.__class__)
2749 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2750 vereq(`x`, `a`)
2751 vereq(`y`, `b`)
2752 if verbose:
2753 print "a = x =", a
2754 print "b = y =", b
2755 # Test for __getstate__ and __setstate__ on new style class
2756 u = C3(42)
2757 s = p.dumps(u, bin)
2758 v = p.loads(s)
2759 veris(u.__class__, v.__class__)
2760 vereq(u.foo, v.foo)
2761 # Test for picklability of hybrid class
2762 u = C4()
2763 u.foo = 42
2764 s = p.dumps(u, bin)
2765 v = p.loads(s)
2766 veris(u.__class__, v.__class__)
2767 vereq(u.foo, v.foo)
2769 # Testing copy.deepcopy()
2770 if verbose:
2771 print "deepcopy"
2772 import copy
2773 for cls in C, C1, C2:
2774 cls2 = copy.deepcopy(cls)
2775 verify(cls2 is cls)
2777 a = C1(1, 2); a.append(42); a.append(24)
2778 b = C2("hello", "world", 42)
2779 x, y = copy.deepcopy((a, b))
2780 vereq(x.__class__, a.__class__)
2781 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2782 vereq(y.__class__, b.__class__)
2783 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2784 vereq(`x`, `a`)
2785 vereq(`y`, `b`)
2786 if verbose:
2787 print "a = x =", a
2788 print "b = y =", b
2790 def pickleslots():
2791 if verbose: print "Testing pickling of classes with __slots__ ..."
2792 import pickle, cPickle
2793 # Pickling of classes with __slots__ but without __getstate__ should fail
2794 global B, C, D, E
2795 class B(object):
2796 pass
2797 for base in [object, B]:
2798 class C(base):
2799 __slots__ = ['a']
2800 class D(C):
2801 pass
2802 try:
2803 pickle.dumps(C())
2804 except TypeError:
2805 pass
2806 else:
2807 raise TestFailed, "should fail: pickle C instance - %s" % base
2808 try:
2809 cPickle.dumps(C())
2810 except TypeError:
2811 pass
2812 else:
2813 raise TestFailed, "should fail: cPickle C instance - %s" % base
2814 try:
2815 pickle.dumps(C())
2816 except TypeError:
2817 pass
2818 else:
2819 raise TestFailed, "should fail: pickle D instance - %s" % base
2820 try:
2821 cPickle.dumps(D())
2822 except TypeError:
2823 pass
2824 else:
2825 raise TestFailed, "should fail: cPickle D instance - %s" % base
2826 # Give C a __getstate__ and __setstate__
2827 class C(base):
2828 __slots__ = ['a']
2829 def __getstate__(self):
2830 try:
2831 d = self.__dict__.copy()
2832 except AttributeError:
2833 d = {}
2834 try:
2835 d['a'] = self.a
2836 except AttributeError:
2837 pass
2838 return d
2839 def __setstate__(self, d):
2840 for k, v in d.items():
2841 setattr(self, k, v)
2842 class D(C):
2843 pass
2844 # Now it should work
2845 x = C()
2846 y = pickle.loads(pickle.dumps(x))
2847 vereq(hasattr(y, 'a'), 0)
2848 y = cPickle.loads(cPickle.dumps(x))
2849 vereq(hasattr(y, 'a'), 0)
2850 x.a = 42
2851 y = pickle.loads(pickle.dumps(x))
2852 vereq(y.a, 42)
2853 y = cPickle.loads(cPickle.dumps(x))
2854 vereq(y.a, 42)
2855 x = D()
2856 x.a = 42
2857 x.b = 100
2858 y = pickle.loads(pickle.dumps(x))
2859 vereq(y.a + y.b, 142)
2860 y = cPickle.loads(cPickle.dumps(x))
2861 vereq(y.a + y.b, 142)
2862 # But a subclass that adds a slot should not work
2863 class E(C):
2864 __slots__ = ['b']
2865 try:
2866 pickle.dumps(E())
2867 except TypeError:
2868 pass
2869 else:
2870 raise TestFailed, "should fail: pickle E instance - %s" % base
2871 try:
2872 cPickle.dumps(E())
2873 except TypeError:
2874 pass
2875 else:
2876 raise TestFailed, "should fail: cPickle E instance - %s" % base
2878 def copies():
2879 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2880 import copy
2881 class C(object):
2882 pass
2884 a = C()
2885 a.foo = 12
2886 b = copy.copy(a)
2887 vereq(b.__dict__, a.__dict__)
2889 a.bar = [1,2,3]
2890 c = copy.copy(a)
2891 vereq(c.bar, a.bar)
2892 verify(c.bar is a.bar)
2894 d = copy.deepcopy(a)
2895 vereq(d.__dict__, a.__dict__)
2896 a.bar.append(4)
2897 vereq(d.bar, [1,2,3])
2899 def binopoverride():
2900 if verbose: print "Testing overrides of binary operations..."
2901 class I(int):
2902 def __repr__(self):
2903 return "I(%r)" % int(self)
2904 def __add__(self, other):
2905 return I(int(self) + int(other))
2906 __radd__ = __add__
2907 def __pow__(self, other, mod=None):
2908 if mod is None:
2909 return I(pow(int(self), int(other)))
2910 else:
2911 return I(pow(int(self), int(other), int(mod)))
2912 def __rpow__(self, other, mod=None):
2913 if mod is None:
2914 return I(pow(int(other), int(self), mod))
2915 else:
2916 return I(pow(int(other), int(self), int(mod)))
2918 vereq(`I(1) + I(2)`, "I(3)")
2919 vereq(`I(1) + 2`, "I(3)")
2920 vereq(`1 + I(2)`, "I(3)")
2921 vereq(`I(2) ** I(3)`, "I(8)")
2922 vereq(`2 ** I(3)`, "I(8)")
2923 vereq(`I(2) ** 3`, "I(8)")
2924 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2925 class S(str):
2926 def __eq__(self, other):
2927 return self.lower() == other.lower()
2929 def subclasspropagation():
2930 if verbose: print "Testing propagation of slot functions to subclasses..."
2931 class A(object):
2932 pass
2933 class B(A):
2934 pass
2935 class C(A):
2936 pass
2937 class D(B, C):
2938 pass
2939 d = D()
2940 vereq(hash(d), id(d))
2941 A.__hash__ = lambda self: 42
2942 vereq(hash(d), 42)
2943 C.__hash__ = lambda self: 314
2944 vereq(hash(d), 314)
2945 B.__hash__ = lambda self: 144
2946 vereq(hash(d), 144)
2947 D.__hash__ = lambda self: 100
2948 vereq(hash(d), 100)
2949 del D.__hash__
2950 vereq(hash(d), 144)
2951 del B.__hash__
2952 vereq(hash(d), 314)
2953 del C.__hash__
2954 vereq(hash(d), 42)
2955 del A.__hash__
2956 vereq(hash(d), id(d))
2957 d.foo = 42
2958 d.bar = 42
2959 vereq(d.foo, 42)
2960 vereq(d.bar, 42)
2961 def __getattribute__(self, name):
2962 if name == "foo":
2963 return 24
2964 return object.__getattribute__(self, name)
2965 A.__getattribute__ = __getattribute__
2966 vereq(d.foo, 24)
2967 vereq(d.bar, 42)
2968 def __getattr__(self, name):
2969 if name in ("spam", "foo", "bar"):
2970 return "hello"
2971 raise AttributeError, name
2972 B.__getattr__ = __getattr__
2973 vereq(d.spam, "hello")
2974 vereq(d.foo, 24)
2975 vereq(d.bar, 42)
2976 del A.__getattribute__
2977 vereq(d.foo, 42)
2978 del d.foo
2979 vereq(d.foo, "hello")
2980 vereq(d.bar, 42)
2981 del B.__getattr__
2982 try:
2983 d.foo
2984 except AttributeError:
2985 pass
2986 else:
2987 raise TestFailed, "d.foo should be undefined now"
2989 # Test a nasty bug in recurse_down_subclasses()
2990 import gc
2991 class A(object):
2992 pass
2993 class B(A):
2994 pass
2995 del B
2996 gc.collect()
2997 A.__setitem__ = lambda *a: None # crash
2999 def buffer_inherit():
3000 import binascii
3001 # SF bug [#470040] ParseTuple t# vs subclasses.
3002 if verbose:
3003 print "Testing that buffer interface is inherited ..."
3005 class MyStr(str):
3006 pass
3007 base = 'abc'
3008 m = MyStr(base)
3009 # b2a_hex uses the buffer interface to get its argument's value, via
3010 # PyArg_ParseTuple 't#' code.
3011 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3013 # It's not clear that unicode will continue to support the character
3014 # buffer interface, and this test will fail if that's taken away.
3015 class MyUni(unicode):
3016 pass
3017 base = u'abc'
3018 m = MyUni(base)
3019 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3021 class MyInt(int):
3022 pass
3023 m = MyInt(42)
3024 try:
3025 binascii.b2a_hex(m)
3026 raise TestFailed('subclass of int should not have a buffer interface')
3027 except TypeError:
3028 pass
3030 def str_of_str_subclass():
3031 import binascii
3032 import cStringIO
3034 if verbose:
3035 print "Testing __str__ defined in subclass of str ..."
3037 class octetstring(str):
3038 def __str__(self):
3039 return binascii.b2a_hex(self)
3040 def __repr__(self):
3041 return self + " repr"
3043 o = octetstring('A')
3044 vereq(type(o), octetstring)
3045 vereq(type(str(o)), str)
3046 vereq(type(repr(o)), str)
3047 vereq(ord(o), 0x41)
3048 vereq(str(o), '41')
3049 vereq(repr(o), 'A repr')
3050 vereq(o.__str__(), '41')
3051 vereq(o.__repr__(), 'A repr')
3053 capture = cStringIO.StringIO()
3054 # Calling str() or not exercises different internal paths.
3055 print >> capture, o
3056 print >> capture, str(o)
3057 vereq(capture.getvalue(), '41\n41\n')
3058 capture.close()
3060 def kwdargs():
3061 if verbose: print "Testing keyword arguments to __init__, __call__..."
3062 def f(a): return a
3063 vereq(f.__call__(a=42), 42)
3064 a = []
3065 list.__init__(a, sequence=[0, 1, 2])
3066 vereq(a, [0, 1, 2])
3068 def delhook():
3069 if verbose: print "Testing __del__ hook..."
3070 log = []
3071 class C(object):
3072 def __del__(self):
3073 log.append(1)
3074 c = C()
3075 vereq(log, [])
3076 del c
3077 vereq(log, [1])
3079 class D(object): pass
3080 d = D()
3081 try: del d[0]
3082 except TypeError: pass
3083 else: raise TestFailed, "invalid del() didn't raise TypeError"
3085 def hashinherit():
3086 if verbose: print "Testing hash of mutable subclasses..."
3088 class mydict(dict):
3089 pass
3090 d = mydict()
3091 try:
3092 hash(d)
3093 except TypeError:
3094 pass
3095 else:
3096 raise TestFailed, "hash() of dict subclass should fail"
3098 class mylist(list):
3099 pass
3100 d = mylist()
3101 try:
3102 hash(d)
3103 except TypeError:
3104 pass
3105 else:
3106 raise TestFailed, "hash() of list subclass should fail"
3108 def strops():
3109 try: 'a' + 5
3110 except TypeError: pass
3111 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3113 try: ''.split('')
3114 except ValueError: pass
3115 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3117 try: ''.join([0])
3118 except TypeError: pass
3119 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3121 try: ''.rindex('5')
3122 except ValueError: pass
3123 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3125 try: '%(n)s' % None
3126 except TypeError: pass
3127 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3129 try: '%(n' % {}
3130 except ValueError: pass
3131 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3133 try: '%*s' % ('abc')
3134 except TypeError: pass
3135 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3137 try: '%*.*s' % ('abc', 5)
3138 except TypeError: pass
3139 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3141 try: '%s' % (1, 2)
3142 except TypeError: pass
3143 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3145 try: '%' % None
3146 except ValueError: pass
3147 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3149 vereq('534253'.isdigit(), 1)
3150 vereq('534253x'.isdigit(), 0)
3151 vereq('%c' % 5, '\x05')
3152 vereq('%c' % '5', '5')
3154 def deepcopyrecursive():
3155 if verbose: print "Testing deepcopy of recursive objects..."
3156 class Node:
3157 pass
3158 a = Node()
3159 b = Node()
3160 a.b = b
3161 b.a = a
3162 z = deepcopy(a) # This blew up before
3164 def modules():
3165 if verbose: print "Testing uninitialized module objects..."
3166 from types import ModuleType as M
3167 m = M.__new__(M)
3168 str(m)
3169 vereq(hasattr(m, "__name__"), 0)
3170 vereq(hasattr(m, "__file__"), 0)
3171 vereq(hasattr(m, "foo"), 0)
3172 vereq(m.__dict__, None)
3173 m.foo = 1
3174 vereq(m.__dict__, {"foo": 1})
3176 def dictproxyiterkeys():
3177 class C(object):
3178 def meth(self):
3179 pass
3180 if verbose: print "Testing dict-proxy iterkeys..."
3181 keys = [ key for key in C.__dict__.iterkeys() ]
3182 keys.sort()
3183 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3185 def dictproxyitervalues():
3186 class C(object):
3187 def meth(self):
3188 pass
3189 if verbose: print "Testing dict-proxy itervalues..."
3190 values = [ values for values in C.__dict__.itervalues() ]
3191 vereq(len(values), 5)
3193 def dictproxyiteritems():
3194 class C(object):
3195 def meth(self):
3196 pass
3197 if verbose: print "Testing dict-proxy iteritems..."
3198 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3199 keys.sort()
3200 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3202 def funnynew():
3203 if verbose: print "Testing __new__ returning something unexpected..."
3204 class C(object):
3205 def __new__(cls, arg):
3206 if isinstance(arg, str): return [1, 2, 3]
3207 elif isinstance(arg, int): return object.__new__(D)
3208 else: return object.__new__(cls)
3209 class D(C):
3210 def __init__(self, arg):
3211 self.foo = arg
3212 vereq(C("1"), [1, 2, 3])
3213 vereq(D("1"), [1, 2, 3])
3214 d = D(None)
3215 veris(d.foo, None)
3216 d = C(1)
3217 vereq(isinstance(d, D), True)
3218 vereq(d.foo, 1)
3219 d = D(1)
3220 vereq(isinstance(d, D), True)
3221 vereq(d.foo, 1)
3223 def imulbug():
3224 # SF bug 544647
3225 if verbose: print "Testing for __imul__ problems..."
3226 class C(object):
3227 def __imul__(self, other):
3228 return (self, other)
3229 x = C()
3230 y = x
3231 y *= 1.0
3232 vereq(y, (x, 1.0))
3233 y = x
3234 y *= 2
3235 vereq(y, (x, 2))
3236 y = x
3237 y *= 3L
3238 vereq(y, (x, 3L))
3239 y = x
3240 y *= 1L<<100
3241 vereq(y, (x, 1L<<100))
3242 y = x
3243 y *= None
3244 vereq(y, (x, None))
3245 y = x
3246 y *= "foo"
3247 vereq(y, (x, "foo"))
3249 def docdescriptor():
3250 # SF bug 542984
3251 if verbose: print "Testing __doc__ descriptor..."
3252 class DocDescr(object):
3253 def __get__(self, object, otype):
3254 if object:
3255 object = object.__class__.__name__ + ' instance'
3256 if otype:
3257 otype = otype.__name__
3258 return 'object=%s; type=%s' % (object, otype)
3259 class OldClass:
3260 __doc__ = DocDescr()
3261 class NewClass(object):
3262 __doc__ = DocDescr()
3263 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3264 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3265 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3266 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3268 def string_exceptions():
3269 if verbose:
3270 print "Testing string exceptions ..."
3272 # Ensure builtin strings work OK as exceptions.
3273 astring = "An exception string."
3274 try:
3275 raise astring
3276 except astring:
3277 pass
3278 else:
3279 raise TestFailed, "builtin string not usable as exception"
3281 # Ensure string subclass instances do not.
3282 class MyStr(str):
3283 pass
3285 newstring = MyStr("oops -- shouldn't work")
3286 try:
3287 raise newstring
3288 except TypeError:
3289 pass
3290 except:
3291 raise TestFailed, "string subclass allowed as exception"
3293 def copy_setstate():
3294 if verbose:
3295 print "Testing that copy.*copy() correctly uses __setstate__..."
3296 import copy
3297 class C(object):
3298 def __init__(self, foo=None):
3299 self.foo = foo
3300 self.__foo = foo
3301 def setfoo(self, foo=None):
3302 self.foo = foo
3303 def getfoo(self):
3304 return self.__foo
3305 def __getstate__(self):
3306 return [self.foo]
3307 def __setstate__(self, lst):
3308 assert len(lst) == 1
3309 self.__foo = self.foo = lst[0]
3310 a = C(42)
3311 a.setfoo(24)
3312 vereq(a.foo, 24)
3313 vereq(a.getfoo(), 42)
3314 b = copy.copy(a)
3315 vereq(b.foo, 24)
3316 vereq(b.getfoo(), 24)
3317 b = copy.deepcopy(a)
3318 vereq(b.foo, 24)
3319 vereq(b.getfoo(), 24)
3321 def slices():
3322 if verbose:
3323 print "Testing cases with slices and overridden __getitem__ ..."
3324 # Strings
3325 vereq("hello"[:4], "hell")
3326 vereq("hello"[slice(4)], "hell")
3327 vereq(str.__getitem__("hello", slice(4)), "hell")
3328 class S(str):
3329 def __getitem__(self, x):
3330 return str.__getitem__(self, x)
3331 vereq(S("hello")[:4], "hell")
3332 vereq(S("hello")[slice(4)], "hell")
3333 vereq(S("hello").__getitem__(slice(4)), "hell")
3334 # Tuples
3335 vereq((1,2,3)[:2], (1,2))
3336 vereq((1,2,3)[slice(2)], (1,2))
3337 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3338 class T(tuple):
3339 def __getitem__(self, x):
3340 return tuple.__getitem__(self, x)
3341 vereq(T((1,2,3))[:2], (1,2))
3342 vereq(T((1,2,3))[slice(2)], (1,2))
3343 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3344 # Lists
3345 vereq([1,2,3][:2], [1,2])
3346 vereq([1,2,3][slice(2)], [1,2])
3347 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3348 class L(list):
3349 def __getitem__(self, x):
3350 return list.__getitem__(self, x)
3351 vereq(L([1,2,3])[:2], [1,2])
3352 vereq(L([1,2,3])[slice(2)], [1,2])
3353 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3354 # Now do lists and __setitem__
3355 a = L([1,2,3])
3356 a[slice(1, 3)] = [3,2]
3357 vereq(a, [1,3,2])
3358 a[slice(0, 2, 1)] = [3,1]
3359 vereq(a, [3,1,2])
3360 a.__setitem__(slice(1, 3), [2,1])
3361 vereq(a, [3,2,1])
3362 a.__setitem__(slice(0, 2, 1), [2,3])
3363 vereq(a, [2,3,1])
3365 def subtype_resurrection():
3366 if verbose:
3367 print "Testing resurrection of new-style instance..."
3369 class C(object):
3370 container = []
3372 def __del__(self):
3373 # resurrect the instance
3374 C.container.append(self)
3376 c = C()
3377 c.attr = 42
3378 # The most interesting thing here is whether this blows up, due to flawed
3379 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
3380 del c
3382 # If that didn't blow up, it's also interesting to see whether clearing
3383 # the last container slot works: that will attempt to delete c again,
3384 # which will cause c to get appended back to the container again "during"
3385 # the del.
3386 del C.container[-1]
3387 vereq(len(C.container), 1)
3388 vereq(C.container[-1].attr, 42)
3390 # Make c mortal again, so that the test framework with -l doesn't report
3391 # it as a leak.
3392 del C.__del__
3394 def slottrash():
3395 # Deallocating deeply nested slotted trash caused stack overflows
3396 if verbose:
3397 print "Testing slot trash..."
3398 class trash(object):
3399 __slots__ = ['x']
3400 def __init__(self, x):
3401 self.x = x
3402 o = None
3403 for i in xrange(50000):
3404 o = trash(o)
3405 del o
3407 def slotmultipleinheritance():
3408 # SF bug 575229, multiple inheritance w/ slots dumps core
3409 class A(object):
3410 __slots__=()
3411 class B(object):
3412 pass
3413 class C(A,B) :
3414 __slots__=()
3415 vereq(C.__basicsize__, B.__basicsize__)
3416 verify(hasattr(C, '__dict__'))
3417 verify(hasattr(C, '__weakref__'))
3418 C().x = 2
3420 def testrmul():
3421 # SF patch 592646
3422 if verbose:
3423 print "Testing correct invocation of __rmul__..."
3424 class C(object):
3425 def __mul__(self, other):
3426 return "mul"
3427 def __rmul__(self, other):
3428 return "rmul"
3429 a = C()
3430 vereq(a*2, "mul")
3431 vereq(a*2.2, "mul")
3432 vereq(2*a, "rmul")
3433 vereq(2.2*a, "rmul")
3435 def testipow():
3436 # [SF bug 620179]
3437 if verbose:
3438 print "Testing correct invocation of __ipow__..."
3439 class C(object):
3440 def __ipow__(self, other):
3441 pass
3442 a = C()
3443 a **= 2
3445 def do_this_first():
3446 if verbose:
3447 print "Testing SF bug 551412 ..."
3448 # This dumps core when SF bug 551412 isn't fixed --
3449 # but only when test_descr.py is run separately.
3450 # (That can't be helped -- as soon as PyType_Ready()
3451 # is called for PyLong_Type, the bug is gone.)
3452 class UserLong(object):
3453 def __pow__(self, *args):
3454 pass
3455 try:
3456 pow(0L, UserLong(), 0L)
3457 except:
3458 pass
3460 if verbose:
3461 print "Testing SF bug 570483..."
3462 # Another segfault only when run early
3463 # (before PyType_Ready(tuple) is called)
3464 type.mro(tuple)
3466 def test_mutable_bases():
3467 if verbose:
3468 print "Testing mutable bases..."
3469 # stuff that should work:
3470 class C(object):
3471 pass
3472 class C2(object):
3473 def __getattribute__(self, attr):
3474 if attr == 'a':
3475 return 2
3476 else:
3477 return super(C2, self).__getattribute__(attr)
3478 def meth(self):
3479 return 1
3480 class D(C):
3481 pass
3482 class E(D):
3483 pass
3484 d = D()
3485 e = E()
3486 D.__bases__ = (C,)
3487 D.__bases__ = (C2,)
3488 vereq(d.meth(), 1)
3489 vereq(e.meth(), 1)
3490 vereq(d.a, 2)
3491 vereq(e.a, 2)
3492 vereq(C2.__subclasses__(), [D])
3494 # stuff that shouldn't:
3495 class L(list):
3496 pass
3498 try:
3499 L.__bases__ = (dict,)
3500 except TypeError:
3501 pass
3502 else:
3503 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3505 try:
3506 list.__bases__ = (dict,)
3507 except TypeError:
3508 pass
3509 else:
3510 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3512 try:
3513 del D.__bases__
3514 except TypeError:
3515 pass
3516 else:
3517 raise TestFailed, "shouldn't be able to delete .__bases__"
3519 try:
3520 D.__bases__ = ()
3521 except TypeError, msg:
3522 if str(msg) == "a new-style class can't have only classic bases":
3523 raise TestFailed, "wrong error message for .__bases__ = ()"
3524 else:
3525 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3527 try:
3528 D.__bases__ = (D,)
3529 except TypeError:
3530 pass
3531 else:
3532 # actually, we'll have crashed by here...
3533 raise TestFailed, "shouldn't be able to create inheritance cycles"
3535 try:
3536 D.__bases__ = (E,)
3537 except TypeError:
3538 pass
3539 else:
3540 raise TestFailed, "shouldn't be able to create inheritance cycles"
3542 # let's throw a classic class into the mix:
3543 class Classic:
3544 def meth2(self):
3545 return 3
3547 D.__bases__ = (C, Classic)
3549 vereq(d.meth2(), 3)
3550 vereq(e.meth2(), 3)
3551 try:
3553 except AttributeError:
3554 pass
3555 else:
3556 raise TestFailed, "attribute should have vanished"
3558 try:
3559 D.__bases__ = (Classic,)
3560 except TypeError:
3561 pass
3562 else:
3563 raise TestFailed, "new-style class must have a new-style base"
3565 def test_mutable_bases_with_failing_mro():
3566 if verbose:
3567 print "Testing mutable bases with failing mro..."
3568 class WorkOnce(type):
3569 def __new__(self, name, bases, ns):
3570 self.flag = 0
3571 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3572 def mro(self):
3573 if self.flag > 0:
3574 raise RuntimeError, "bozo"
3575 else:
3576 self.flag += 1
3577 return type.mro(self)
3579 class WorkAlways(type):
3580 def mro(self):
3581 # this is here to make sure that .mro()s aren't called
3582 # with an exception set (which was possible at one point).
3583 # An error message will be printed in a debug build.
3584 # What's a good way to test for this?
3585 return type.mro(self)
3587 class C(object):
3588 pass
3590 class C2(object):
3591 pass
3593 class D(C):
3594 pass
3596 class E(D):
3597 pass
3599 class F(D):
3600 __metaclass__ = WorkOnce
3602 class G(D):
3603 __metaclass__ = WorkAlways
3605 # Immediate subclasses have their mro's adjusted in alphabetical
3606 # order, so E's will get adjusted before adjusting F's fails. We
3607 # check here that E's gets restored.
3609 E_mro_before = E.__mro__
3610 D_mro_before = D.__mro__
3612 try:
3613 D.__bases__ = (C2,)
3614 except RuntimeError:
3615 vereq(E.__mro__, E_mro_before)
3616 vereq(D.__mro__, D_mro_before)
3617 else:
3618 raise TestFailed, "exception not propagated"
3620 def test_mutable_bases_catch_mro_conflict():
3621 if verbose:
3622 print "Testing mutable bases catch mro conflict..."
3623 class A(object):
3624 pass
3626 class B(object):
3627 pass
3629 class C(A, B):
3630 pass
3632 class D(A, B):
3633 pass
3635 class E(C, D):
3636 pass
3638 try:
3639 C.__bases__ = (B, A)
3640 except TypeError:
3641 pass
3642 else:
3643 raise TestFailed, "didn't catch MRO conflict"
3645 def mutable_names():
3646 if verbose:
3647 print "Testing mutable names..."
3648 class C(object):
3649 pass
3651 # C.__module__ could be 'test_descr' or '__main__'
3652 mod = C.__module__
3654 C.__name__ = 'D'
3655 vereq((C.__module__, C.__name__), (mod, 'D'))
3657 C.__name__ = 'D.E'
3658 vereq((C.__module__, C.__name__), (mod, 'D.E'))
3660 def subclass_right_op():
3661 if verbose:
3662 print "Testing correct dispatch of subclass overloading __r<op>__..."
3664 # This code tests various cases where right-dispatch of a subclass
3665 # should be preferred over left-dispatch of a base class.
3667 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3669 class B(int):
3670 def __div__(self, other):
3671 return "B.__div__"
3672 def __rdiv__(self, other):
3673 return "B.__rdiv__"
3675 vereq(B(1) / 1, "B.__div__")
3676 vereq(1 / B(1), "B.__rdiv__")
3678 # Case 2: subclass of object; this is just the baseline for case 3
3680 class C(object):
3681 def __div__(self, other):
3682 return "C.__div__"
3683 def __rdiv__(self, other):
3684 return "C.__rdiv__"
3686 vereq(C(1) / 1, "C.__div__")
3687 vereq(1 / C(1), "C.__rdiv__")
3689 # Case 3: subclass of new-style class; here it gets interesting
3691 class D(C):
3692 def __div__(self, other):
3693 return "D.__div__"
3694 def __rdiv__(self, other):
3695 return "D.__rdiv__"
3697 vereq(D(1) / C(1), "D.__div__")
3698 vereq(C(1) / D(1), "D.__rdiv__")
3700 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3702 class E(C):
3703 pass
3705 vereq(E.__rdiv__, C.__rdiv__)
3707 vereq(E(1) / 1, "C.__div__")
3708 vereq(1 / E(1), "C.__rdiv__")
3709 vereq(E(1) / C(1), "C.__div__")
3710 vereq(C(1) / E(1), "C.__div__") # This one would fail
3712 def dict_type_with_metaclass():
3713 if verbose:
3714 print "Testing type of __dict__ when __metaclass__ set..."
3716 class B(object):
3717 pass
3718 class M(type):
3719 pass
3720 class C:
3721 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3722 __metaclass__ = M
3723 veris(type(C.__dict__), type(B.__dict__))
3726 def test_main():
3727 do_this_first()
3728 class_docstrings()
3729 lists()
3730 dicts()
3731 dict_constructor()
3732 test_dir()
3733 ints()
3734 longs()
3735 floats()
3736 complexes()
3737 spamlists()
3738 spamdicts()
3739 pydicts()
3740 pylists()
3741 metaclass()
3742 pymods()
3743 multi()
3744 mro_disagreement()
3745 diamond()
3746 ex5()
3747 monotonicity()
3748 consistency_with_epg()
3749 objects()
3750 slots()
3751 slotspecials()
3752 dynamics()
3753 errors()
3754 classmethods()
3755 classmethods_in_c()
3756 staticmethods()
3757 staticmethods_in_c()
3758 classic()
3759 compattr()
3760 newslot()
3761 altmro()
3762 overloading()
3763 methods()
3764 specials()
3765 weakrefs()
3766 properties()
3767 supers()
3768 inherits()
3769 keywords()
3770 restricted()
3771 str_subclass_as_dict_key()
3772 classic_comparisons()
3773 rich_comparisons()
3774 coercions()
3775 descrdoc()
3776 setclass()
3777 setdict()
3778 pickles()
3779 copies()
3780 binopoverride()
3781 subclasspropagation()
3782 buffer_inherit()
3783 str_of_str_subclass()
3784 kwdargs()
3785 delhook()
3786 hashinherit()
3787 strops()
3788 deepcopyrecursive()
3789 modules()
3790 dictproxyiterkeys()
3791 dictproxyitervalues()
3792 dictproxyiteritems()
3793 pickleslots()
3794 funnynew()
3795 imulbug()
3796 docdescriptor()
3797 string_exceptions()
3798 copy_setstate()
3799 slices()
3800 subtype_resurrection()
3801 slottrash()
3802 slotmultipleinheritance()
3803 testrmul()
3804 testipow()
3805 test_mutable_bases()
3806 test_mutable_bases_with_failing_mro()
3807 test_mutable_bases_catch_mro_conflict()
3808 mutable_names()
3809 subclass_right_op()
3810 dict_type_with_metaclass()
3812 if verbose: print "All OK"
3814 if __name__ == "__main__":
3815 test_main()