Home | History | Annotate | Download | only in test
      1 import __builtin__
      2 import gc
      3 import sys
      4 import types
      5 import unittest
      6 import weakref
      7 
      8 from copy import deepcopy
      9 from test import test_support
     10 
     11 
     12 class OperatorsTest(unittest.TestCase):
     13 
     14     def __init__(self, *args, **kwargs):
     15         unittest.TestCase.__init__(self, *args, **kwargs)
     16         self.binops = {
     17             'add': '+',
     18             'sub': '-',
     19             'mul': '*',
     20             'div': '/',
     21             'divmod': 'divmod',
     22             'pow': '**',
     23             'lshift': '<<',
     24             'rshift': '>>',
     25             'and': '&',
     26             'xor': '^',
     27             'or': '|',
     28             'cmp': 'cmp',
     29             'lt': '<',
     30             'le': '<=',
     31             'eq': '==',
     32             'ne': '!=',
     33             'gt': '>',
     34             'ge': '>=',
     35         }
     36 
     37         for name, expr in self.binops.items():
     38             if expr.islower():
     39                 expr = expr + "(a, b)"
     40             else:
     41                 expr = 'a %s b' % expr
     42             self.binops[name] = expr
     43 
     44         self.unops = {
     45             'pos': '+',
     46             'neg': '-',
     47             'abs': 'abs',
     48             'invert': '~',
     49             'int': 'int',
     50             'long': 'long',
     51             'float': 'float',
     52             'oct': 'oct',
     53             'hex': 'hex',
     54         }
     55 
     56         for name, expr in self.unops.items():
     57             if expr.islower():
     58                 expr = expr + "(a)"
     59             else:
     60                 expr = '%s a' % expr
     61             self.unops[name] = expr
     62 
     63     def unop_test(self, a, res, expr="len(a)", meth="__len__"):
     64         d = {'a': a}
     65         self.assertEqual(eval(expr, d), res)
     66         t = type(a)
     67         m = getattr(t, meth)
     68 
     69         # Find method in parent class
     70         while meth not in t.__dict__:
     71             t = t.__bases__[0]
     72         # in some implementations (e.g. PyPy), 'm' can be a regular unbound
     73         # method object; the getattr() below obtains its underlying function.
     74         self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
     75         self.assertEqual(m(a), res)
     76         bm = getattr(a, meth)
     77         self.assertEqual(bm(), res)
     78 
     79     def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
     80         d = {'a': a, 'b': b}
     81 
     82         # XXX Hack so this passes before 2.3 when -Qnew is specified.
     83         if meth == "__div__" and 1/2 == 0.5:
     84             meth = "__truediv__"
     85 
     86         if meth == '__divmod__': pass
     87 
     88         self.assertEqual(eval(expr, d), res)
     89         t = type(a)
     90         m = getattr(t, meth)
     91         while meth not in t.__dict__:
     92             t = t.__bases__[0]
     93         # in some implementations (e.g. PyPy), 'm' can be a regular unbound
     94         # method object; the getattr() below obtains its underlying function.
     95         self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
     96         self.assertEqual(m(a, b), res)
     97         bm = getattr(a, meth)
     98         self.assertEqual(bm(b), res)
     99 
    100     def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"):
    101         d = {'a': a, 'b': b, 'c': c}
    102         self.assertEqual(eval(expr, d), res)
    103         t = type(a)
    104         m = getattr(t, meth)
    105         while meth not in t.__dict__:
    106             t = t.__bases__[0]
    107         # in some implementations (e.g. PyPy), 'm' can be a regular unbound
    108         # method object; the getattr() below obtains its underlying function.
    109         self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
    110         self.assertEqual(m(a, b, c), res)
    111         bm = getattr(a, meth)
    112         self.assertEqual(bm(b, c), res)
    113 
    114     def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
    115         d = {'a': deepcopy(a), 'b': b}
    116         exec stmt in d
    117         self.assertEqual(d['a'], res)
    118         t = type(a)
    119         m = getattr(t, meth)
    120         while meth not in t.__dict__:
    121             t = t.__bases__[0]
    122         # in some implementations (e.g. PyPy), 'm' can be a regular unbound
    123         # method object; the getattr() below obtains its underlying function.
    124         self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
    125         d['a'] = deepcopy(a)
    126         m(d['a'], b)
    127         self.assertEqual(d['a'], res)
    128         d['a'] = deepcopy(a)
    129         bm = getattr(d['a'], meth)
    130         bm(b)
    131         self.assertEqual(d['a'], res)
    132 
    133     def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
    134         d = {'a': deepcopy(a), 'b': b, 'c': c}
    135         exec stmt in d
    136         self.assertEqual(d['a'], res)
    137         t = type(a)
    138         m = getattr(t, meth)
    139         while meth not in t.__dict__:
    140             t = t.__bases__[0]
    141         # in some implementations (e.g. PyPy), 'm' can be a regular unbound
    142         # method object; the getattr() below obtains its underlying function.
    143         self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
    144         d['a'] = deepcopy(a)
    145         m(d['a'], b, c)
    146         self.assertEqual(d['a'], res)
    147         d['a'] = deepcopy(a)
    148         bm = getattr(d['a'], meth)
    149         bm(b, c)
    150         self.assertEqual(d['a'], res)
    151 
    152     def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
    153         dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
    154         exec stmt in dictionary
    155         self.assertEqual(dictionary['a'], res)
    156         t = type(a)
    157         while meth not in t.__dict__:
    158             t = t.__bases__[0]
    159         m = getattr(t, meth)
    160         # in some implementations (e.g. PyPy), 'm' can be a regular unbound
    161         # method object; the getattr() below obtains its underlying function.
    162         self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
    163         dictionary['a'] = deepcopy(a)
    164         m(dictionary['a'], b, c, d)
    165         self.assertEqual(dictionary['a'], res)
    166         dictionary['a'] = deepcopy(a)
    167         bm = getattr(dictionary['a'], meth)
    168         bm(b, c, d)
    169         self.assertEqual(dictionary['a'], res)
    170 
    171     def test_lists(self):
    172         # Testing list operations...
    173         # Asserts are within individual test methods
    174         self.binop_test([1], [2], [1,2], "a+b", "__add__")
    175         self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
    176         self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
    177         self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
    178         self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
    179         self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
    180         self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
    181         self.unop_test([1,2,3], 3, "len(a)", "__len__")
    182         self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
    183         self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
    184         self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
    185         self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
    186                         "__setslice__")
    187 
    188     def test_dicts(self):
    189         # Testing dict operations...
    190         if hasattr(dict, '__cmp__'):   # PyPy has only rich comparison on dicts
    191             self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
    192         else:
    193             self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__")
    194         self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
    195         self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
    196         self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
    197 
    198         d = {1:2, 3:4}
    199         l1 = []
    200         for i in d.keys():
    201             l1.append(i)
    202         l = []
    203         for i in iter(d):
    204             l.append(i)
    205         self.assertEqual(l, l1)
    206         l = []
    207         for i in d.__iter__():
    208             l.append(i)
    209         self.assertEqual(l, l1)
    210         l = []
    211         for i in dict.__iter__(d):
    212             l.append(i)
    213         self.assertEqual(l, l1)
    214         d = {1:2, 3:4}
    215         self.unop_test(d, 2, "len(a)", "__len__")
    216         self.assertEqual(eval(repr(d), {}), d)
    217         self.assertEqual(eval(d.__repr__(), {}), d)
    218         self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
    219                         "__setitem__")
    220 
    221     # Tests for unary and binary operators
    222     def number_operators(self, a, b, skip=[]):
    223         dict = {'a': a, 'b': b}
    224 
    225         for name, expr in self.binops.items():
    226             if name not in skip:
    227                 name = "__%s__" % name
    228                 if hasattr(a, name):
    229                     res = eval(expr, dict)
    230                     self.binop_test(a, b, res, expr, name)
    231 
    232         for name, expr in self.unops.items():
    233             if name not in skip:
    234                 name = "__%s__" % name
    235                 if hasattr(a, name):
    236                     res = eval(expr, dict)
    237                     self.unop_test(a, res, expr, name)
    238 
    239     def test_ints(self):
    240         # Testing int operations...
    241         self.number_operators(100, 3)
    242         # The following crashes in Python 2.2
    243         self.assertEqual((1).__nonzero__(), 1)
    244         self.assertEqual((0).__nonzero__(), 0)
    245         # This returns 'NotImplemented' in Python 2.2
    246         class C(int):
    247             def __add__(self, other):
    248                 return NotImplemented
    249         self.assertEqual(C(5L), 5)
    250         try:
    251             C() + ""
    252         except TypeError:
    253             pass
    254         else:
    255             self.fail("NotImplemented should have caused TypeError")
    256         try:
    257             C(sys.maxint+1)
    258         except OverflowError:
    259             pass
    260         else:
    261             self.fail("should have raised OverflowError")
    262 
    263     def test_longs(self):
    264         # Testing long operations...
    265         self.number_operators(100L, 3L)
    266 
    267     def test_floats(self):
    268         # Testing float operations...
    269         self.number_operators(100.0, 3.0)
    270 
    271     def test_complexes(self):
    272         # Testing complex operations...
    273         self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
    274                                                   'int', 'long', 'float'])
    275 
    276         class Number(complex):
    277             __slots__ = ['prec']
    278             def __new__(cls, *args, **kwds):
    279                 result = complex.__new__(cls, *args)
    280                 result.prec = kwds.get('prec', 12)
    281                 return result
    282             def __repr__(self):
    283                 prec = self.prec
    284                 if self.imag == 0.0:
    285                     return "%.*g" % (prec, self.real)
    286                 if self.real == 0.0:
    287                     return "%.*gj" % (prec, self.imag)
    288                 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
    289             __str__ = __repr__
    290 
    291         a = Number(3.14, prec=6)
    292         self.assertEqual(repr(a), "3.14")
    293         self.assertEqual(a.prec, 6)
    294 
    295         a = Number(a, prec=2)
    296         self.assertEqual(repr(a), "3.1")
    297         self.assertEqual(a.prec, 2)
    298 
    299         a = Number(234.5)
    300         self.assertEqual(repr(a), "234.5")
    301         self.assertEqual(a.prec, 12)
    302 
    303     @test_support.impl_detail("the module 'xxsubtype' is internal")
    304     def test_spam_lists(self):
    305         # Testing spamlist operations...
    306         import copy, xxsubtype as spam
    307 
    308         def spamlist(l, memo=None):
    309             import xxsubtype as spam
    310             return spam.spamlist(l)
    311 
    312         # This is an ugly hack:
    313         copy._deepcopy_dispatch[spam.spamlist] = spamlist
    314 
    315         self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
    316                        "__add__")
    317         self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
    318         self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
    319         self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
    320         self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
    321                         "__getslice__")
    322         self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
    323                        "__iadd__")
    324         self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
    325                        "__imul__")
    326         self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
    327         self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
    328                        "__mul__")
    329         self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
    330                        "__rmul__")
    331         self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
    332                         "__setitem__")
    333         self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
    334                    spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
    335         # Test subclassing
    336         class C(spam.spamlist):
    337             def foo(self): return 1
    338         a = C()
    339         self.assertEqual(a, [])
    340         self.assertEqual(a.foo(), 1)
    341         a.append(100)
    342         self.assertEqual(a, [100])
    343         self.assertEqual(a.getstate(), 0)
    344         a.setstate(42)
    345         self.assertEqual(a.getstate(), 42)
    346 
    347     @test_support.impl_detail("the module 'xxsubtype' is internal")
    348     def test_spam_dicts(self):
    349         # Testing spamdict operations...
    350         import copy, xxsubtype as spam
    351         def spamdict(d, memo=None):
    352             import xxsubtype as spam
    353             sd = spam.spamdict()
    354             for k, v in d.items():
    355                 sd[k] = v
    356             return sd
    357         # This is an ugly hack:
    358         copy._deepcopy_dispatch[spam.spamdict] = spamdict
    359 
    360         self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
    361                        "__cmp__")
    362         self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
    363         self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
    364         self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
    365         d = spamdict({1:2,3:4})
    366         l1 = []
    367         for i in d.keys():
    368             l1.append(i)
    369         l = []
    370         for i in iter(d):
    371             l.append(i)
    372         self.assertEqual(l, l1)
    373         l = []
    374         for i in d.__iter__():
    375             l.append(i)
    376         self.assertEqual(l, l1)
    377         l = []
    378         for i in type(spamdict({})).__iter__(d):
    379             l.append(i)
    380         self.assertEqual(l, l1)
    381         straightd = {1:2, 3:4}
    382         spamd = spamdict(straightd)
    383         self.unop_test(spamd, 2, "len(a)", "__len__")
    384         self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
    385         self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
    386                    "a[b]=c", "__setitem__")
    387         # Test subclassing
    388         class C(spam.spamdict):
    389             def foo(self): return 1
    390         a = C()
    391         self.assertEqual(a.items(), [])
    392         self.assertEqual(a.foo(), 1)
    393         a['foo'] = 'bar'
    394         self.assertEqual(a.items(), [('foo', 'bar')])
    395         self.assertEqual(a.getstate(), 0)
    396         a.setstate(100)
    397         self.assertEqual(a.getstate(), 100)
    398 
    399 class ClassPropertiesAndMethods(unittest.TestCase):
    400 
    401     def assertHasAttr(self, obj, name):
    402         self.assertTrue(hasattr(obj, name),
    403                         '%r has no attribute %r' % (obj, name))
    404 
    405     def assertNotHasAttr(self, obj, name):
    406         self.assertFalse(hasattr(obj, name),
    407                          '%r has unexpected attribute %r' % (obj, name))
    408 
    409     def test_python_dicts(self):
    410         # Testing Python subclass of dict...
    411         self.assertTrue(issubclass(dict, dict))
    412         self.assertIsInstance({}, dict)
    413         d = dict()
    414         self.assertEqual(d, {})
    415         self.assertIs(d.__class__, dict)
    416         self.assertIsInstance(d, dict)
    417         class C(dict):
    418             state = -1
    419             def __init__(self_local, *a, **kw):
    420                 if a:
    421                     self.assertEqual(len(a), 1)
    422                     self_local.state = a[0]
    423                 if kw:
    424                     for k, v in kw.items():
    425                         self_local[v] = k
    426             def __getitem__(self, key):
    427                 return self.get(key, 0)
    428             def __setitem__(self_local, key, value):
    429                 self.assertIsInstance(key, type(0))
    430                 dict.__setitem__(self_local, key, value)
    431             def setstate(self, state):
    432                 self.state = state
    433             def getstate(self):
    434                 return self.state
    435         self.assertTrue(issubclass(C, dict))
    436         a1 = C(12)
    437         self.assertEqual(a1.state, 12)
    438         a2 = C(foo=1, bar=2)
    439         self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
    440         a = C()
    441         self.assertEqual(a.state, -1)
    442         self.assertEqual(a.getstate(), -1)
    443         a.setstate(0)
    444         self.assertEqual(a.state, 0)
    445         self.assertEqual(a.getstate(), 0)
    446         a.setstate(10)
    447         self.assertEqual(a.state, 10)
    448         self.assertEqual(a.getstate(), 10)
    449         self.assertEqual(a[42], 0)
    450         a[42] = 24
    451         self.assertEqual(a[42], 24)
    452         N = 50
    453         for i in range(N):
    454             a[i] = C()
    455             for j in range(N):
    456                 a[i][j] = i*j
    457         for i in range(N):
    458             for j in range(N):
    459                 self.assertEqual(a[i][j], i*j)
    460 
    461     def test_python_lists(self):
    462         # Testing Python subclass of list...
    463         class C(list):
    464             def __getitem__(self, i):
    465                 return list.__getitem__(self, i) + 100
    466             def __getslice__(self, i, j):
    467                 return (i, j)
    468         a = C()
    469         a.extend([0,1,2])
    470         self.assertEqual(a[0], 100)
    471         self.assertEqual(a[1], 101)
    472         self.assertEqual(a[2], 102)
    473         self.assertEqual(a[100:200], (100,200))
    474 
    475     def test_metaclass(self):
    476         # Testing __metaclass__...
    477         class C:
    478             __metaclass__ = type
    479             def __init__(self):
    480                 self.__state = 0
    481             def getstate(self):
    482                 return self.__state
    483             def setstate(self, state):
    484                 self.__state = state
    485         a = C()
    486         self.assertEqual(a.getstate(), 0)
    487         a.setstate(10)
    488         self.assertEqual(a.getstate(), 10)
    489         class D:
    490             class __metaclass__(type):
    491                 def myself(cls): return cls
    492         self.assertEqual(D.myself(), D)
    493         d = D()
    494         self.assertEqual(d.__class__, D)
    495         class M1(type):
    496             def __new__(cls, name, bases, dict):
    497                 dict['__spam__'] = 1
    498                 return type.__new__(cls, name, bases, dict)
    499         class C:
    500             __metaclass__ = M1
    501         self.assertEqual(C.__spam__, 1)
    502         c = C()
    503         self.assertEqual(c.__spam__, 1)
    504 
    505         class _instance(object):
    506             pass
    507         class M2(object):
    508             @staticmethod
    509             def __new__(cls, name, bases, dict):
    510                 self = object.__new__(cls)
    511                 self.name = name
    512                 self.bases = bases
    513                 self.dict = dict
    514                 return self
    515             def __call__(self):
    516                 it = _instance()
    517                 # Early binding of methods
    518                 for key in self.dict:
    519                     if key.startswith("__"):
    520                         continue
    521                     setattr(it, key, self.dict[key].__get__(it, self))
    522                 return it
    523         class C:
    524             __metaclass__ = M2
    525             def spam(self):
    526                 return 42
    527         self.assertEqual(C.name, 'C')
    528         self.assertEqual(C.bases, ())
    529         self.assertIn('spam', C.dict)
    530         c = C()
    531         self.assertEqual(c.spam(), 42)
    532 
    533         # More metaclass examples
    534 
    535         class autosuper(type):
    536             # Automatically add __super to the class
    537             # This trick only works for dynamic classes
    538             def __new__(metaclass, name, bases, dict):
    539                 cls = super(autosuper, metaclass).__new__(metaclass,
    540                                                           name, bases, dict)
    541                 # Name mangling for __super removes leading underscores
    542                 while name[:1] == "_":
    543                     name = name[1:]
    544                 if name:
    545                     name = "_%s__super" % name
    546                 else:
    547                     name = "__super"
    548                 setattr(cls, name, super(cls))
    549                 return cls
    550         class A:
    551             __metaclass__ = autosuper
    552             def meth(self):
    553                 return "A"
    554         class B(A):
    555             def meth(self):
    556                 return "B" + self.__super.meth()
    557         class C(A):
    558             def meth(self):
    559                 return "C" + self.__super.meth()
    560         class D(C, B):
    561             def meth(self):
    562                 return "D" + self.__super.meth()
    563         self.assertEqual(D().meth(), "DCBA")
    564         class E(B, C):
    565             def meth(self):
    566                 return "E" + self.__super.meth()
    567         self.assertEqual(E().meth(), "EBCA")
    568 
    569         class autoproperty(type):
    570             # Automatically create property attributes when methods
    571             # named _get_x and/or _set_x are found
    572             def __new__(metaclass, name, bases, dict):
    573                 hits = {}
    574                 for key, val in dict.iteritems():
    575                     if key.startswith("_get_"):
    576                         key = key[5:]
    577                         get, set = hits.get(key, (None, None))
    578                         get = val
    579                         hits[key] = get, set
    580                     elif key.startswith("_set_"):
    581                         key = key[5:]
    582                         get, set = hits.get(key, (None, None))
    583                         set = val
    584                         hits[key] = get, set
    585                 for key, (get, set) in hits.iteritems():
    586                     dict[key] = property(get, set)
    587                 return super(autoproperty, metaclass).__new__(metaclass,
    588                                                             name, bases, dict)
    589         class A:
    590             __metaclass__ = autoproperty
    591             def _get_x(self):
    592                 return -self.__x
    593             def _set_x(self, x):
    594                 self.__x = -x
    595         a = A()
    596         self.assertNotHasAttr(a, "x")
    597         a.x = 12
    598         self.assertEqual(a.x, 12)
    599         self.assertEqual(a._A__x, -12)
    600 
    601         class multimetaclass(autoproperty, autosuper):
    602             # Merge of multiple cooperating metaclasses
    603             pass
    604         class A:
    605             __metaclass__ = multimetaclass
    606             def _get_x(self):
    607                 return "A"
    608         class B(A):
    609             def _get_x(self):
    610                 return "B" + self.__super._get_x()
    611         class C(A):
    612             def _get_x(self):
    613                 return "C" + self.__super._get_x()
    614         class D(C, B):
    615             def _get_x(self):
    616                 return "D" + self.__super._get_x()
    617         self.assertEqual(D().x, "DCBA")
    618 
    619         # Make sure type(x) doesn't call x.__class__.__init__
    620         class T(type):
    621             counter = 0
    622             def __init__(self, *args):
    623                 T.counter += 1
    624         class C:
    625             __metaclass__ = T
    626         self.assertEqual(T.counter, 1)
    627         a = C()
    628         self.assertEqual(type(a), C)
    629         self.assertEqual(T.counter, 1)
    630 
    631         class C(object): pass
    632         c = C()
    633         try: c()
    634         except TypeError: pass
    635         else: self.fail("calling object w/o call method should raise "
    636                         "TypeError")
    637 
    638         # Testing code to find most derived baseclass
    639         class A(type):
    640             def __new__(*args, **kwargs):
    641                 return type.__new__(*args, **kwargs)
    642 
    643         class B(object):
    644             pass
    645 
    646         class C(object):
    647             __metaclass__ = A
    648 
    649         # The most derived metaclass of D is A rather than type.
    650         class D(B, C):
    651             pass
    652 
    653     def test_module_subclasses(self):
    654         # Testing Python subclass of module...
    655         log = []
    656         MT = type(sys)
    657         class MM(MT):
    658             def __init__(self, name):
    659                 MT.__init__(self, name)
    660             def __getattribute__(self, name):
    661                 log.append(("getattr", name))
    662                 return MT.__getattribute__(self, name)
    663             def __setattr__(self, name, value):
    664                 log.append(("setattr", name, value))
    665                 MT.__setattr__(self, name, value)
    666             def __delattr__(self, name):
    667                 log.append(("delattr", name))
    668                 MT.__delattr__(self, name)
    669         a = MM("a")
    670         a.foo = 12
    671         x = a.foo
    672         del a.foo
    673         self.assertEqual(log, [("setattr", "foo", 12),
    674                                ("getattr", "foo"),
    675                                ("delattr", "foo")])
    676 
    677         # http://python.org/sf/1174712
    678         try:
    679             class Module(types.ModuleType, str):
    680                 pass
    681         except TypeError:
    682             pass
    683         else:
    684             self.fail("inheriting from ModuleType and str at the same time "
    685                       "should fail")
    686 
    687     def test_multiple_inheritance(self):
    688         # Testing multiple inheritance...
    689         class C(object):
    690             def __init__(self):
    691                 self.__state = 0
    692             def getstate(self):
    693                 return self.__state
    694             def setstate(self, state):
    695                 self.__state = state
    696         a = C()
    697         self.assertEqual(a.getstate(), 0)
    698         a.setstate(10)
    699         self.assertEqual(a.getstate(), 10)
    700         class D(dict, C):
    701             def __init__(self):
    702                 type({}).__init__(self)
    703                 C.__init__(self)
    704         d = D()
    705         self.assertEqual(d.keys(), [])
    706         d["hello"] = "world"
    707         self.assertEqual(d.items(), [("hello", "world")])
    708         self.assertEqual(d["hello"], "world")
    709         self.assertEqual(d.getstate(), 0)
    710         d.setstate(10)
    711         self.assertEqual(d.getstate(), 10)
    712         self.assertEqual(D.__mro__, (D, dict, C, object))
    713 
    714         # SF bug #442833
    715         class Node(object):
    716             def __int__(self):
    717                 return int(self.foo())
    718             def foo(self):
    719                 return "23"
    720         class Frag(Node, list):
    721             def foo(self):
    722                 return "42"
    723         self.assertEqual(Node().__int__(), 23)
    724         self.assertEqual(int(Node()), 23)
    725         self.assertEqual(Frag().__int__(), 42)
    726         self.assertEqual(int(Frag()), 42)
    727 
    728         # MI mixing classic and new-style classes.
    729 
    730         class A:
    731             x = 1
    732 
    733         class B(A):
    734             pass
    735 
    736         class C(A):
    737             x = 2
    738 
    739         class D(B, C):
    740             pass
    741         self.assertEqual(D.x, 1)
    742 
    743         # Classic MRO is preserved for a classic base class.
    744         class E(D, object):
    745             pass
    746         self.assertEqual(E.__mro__, (E, D, B, A, C, object))
    747         self.assertEqual(E.x, 1)
    748 
    749         # But with a mix of classic bases, their MROs are combined using
    750         # new-style MRO.
    751         class F(B, C, object):
    752             pass
    753         self.assertEqual(F.__mro__, (F, B, C, A, object))
    754         self.assertEqual(F.x, 2)
    755 
    756         # Try something else.
    757         class C:
    758             def cmethod(self):
    759                 return "C a"
    760             def all_method(self):
    761                 return "C b"
    762 
    763         class M1(C, object):
    764             def m1method(self):
    765                 return "M1 a"
    766             def all_method(self):
    767                 return "M1 b"
    768 
    769         self.assertEqual(M1.__mro__, (M1, C, object))
    770         m = M1()
    771         self.assertEqual(m.cmethod(), "C a")
    772         self.assertEqual(m.m1method(), "M1 a")
    773         self.assertEqual(m.all_method(), "M1 b")
    774 
    775         class D(C):
    776             def dmethod(self):
    777                 return "D a"
    778             def all_method(self):
    779                 return "D b"
    780 
    781         class M2(D, object):
    782             def m2method(self):
    783                 return "M2 a"
    784             def all_method(self):
    785                 return "M2 b"
    786 
    787         self.assertEqual(M2.__mro__, (M2, D, C, object))
    788         m = M2()
    789         self.assertEqual(m.cmethod(), "C a")
    790         self.assertEqual(m.dmethod(), "D a")
    791         self.assertEqual(m.m2method(), "M2 a")
    792         self.assertEqual(m.all_method(), "M2 b")
    793 
    794         class M3(M1, M2, object):
    795             def m3method(self):
    796                 return "M3 a"
    797             def all_method(self):
    798                 return "M3 b"
    799         self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
    800         m = M3()
    801         self.assertEqual(m.cmethod(), "C a")
    802         self.assertEqual(m.dmethod(), "D a")
    803         self.assertEqual(m.m1method(), "M1 a")
    804         self.assertEqual(m.m2method(), "M2 a")
    805         self.assertEqual(m.m3method(), "M3 a")
    806         self.assertEqual(m.all_method(), "M3 b")
    807 
    808         class Classic:
    809             pass
    810         try:
    811             class New(Classic):
    812                 __metaclass__ = type
    813         except TypeError:
    814             pass
    815         else:
    816             self.fail("new class with only classic bases - shouldn't be")
    817 
    818     def test_diamond_inheritance(self):
    819         # Testing multiple inheritance special cases...
    820         class A(object):
    821             def spam(self): return "A"
    822         self.assertEqual(A().spam(), "A")
    823         class B(A):
    824             def boo(self): return "B"
    825             def spam(self): return "B"
    826         self.assertEqual(B().spam(), "B")
    827         self.assertEqual(B().boo(), "B")
    828         class C(A):
    829             def boo(self): return "C"
    830         self.assertEqual(C().spam(), "A")
    831         self.assertEqual(C().boo(), "C")
    832         class D(B, C): pass
    833         self.assertEqual(D().spam(), "B")
    834         self.assertEqual(D().boo(), "B")
    835         self.assertEqual(D.__mro__, (D, B, C, A, object))
    836         class E(C, B): pass
    837         self.assertEqual(E().spam(), "B")
    838         self.assertEqual(E().boo(), "C")
    839         self.assertEqual(E.__mro__, (E, C, B, A, object))
    840         # MRO order disagreement
    841         try:
    842             class F(D, E): pass
    843         except TypeError:
    844             pass
    845         else:
    846             self.fail("expected MRO order disagreement (F)")
    847         try:
    848             class G(E, D): pass
    849         except TypeError:
    850             pass
    851         else:
    852             self.fail("expected MRO order disagreement (G)")
    853 
    854     # see thread python-dev/2002-October/029035.html
    855     def test_ex5_from_c3_switch(self):
    856         # Testing ex5 from C3 switch discussion...
    857         class A(object): pass
    858         class B(object): pass
    859         class C(object): pass
    860         class X(A): pass
    861         class Y(A): pass
    862         class Z(X,B,Y,C): pass
    863         self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
    864 
    865     # see "A Monotonic Superclass Linearization for Dylan",
    866     # by Kim Barrett et al. (OOPSLA 1996)
    867     def test_monotonicity(self):
    868         # Testing MRO monotonicity...
    869         class Boat(object): pass
    870         class DayBoat(Boat): pass
    871         class WheelBoat(Boat): pass
    872         class EngineLess(DayBoat): pass
    873         class SmallMultihull(DayBoat): pass
    874         class PedalWheelBoat(EngineLess,WheelBoat): pass
    875         class SmallCatamaran(SmallMultihull): pass
    876         class Pedalo(PedalWheelBoat,SmallCatamaran): pass
    877 
    878         self.assertEqual(PedalWheelBoat.__mro__,
    879               (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
    880         self.assertEqual(SmallCatamaran.__mro__,
    881               (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
    882         self.assertEqual(Pedalo.__mro__,
    883               (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
    884                SmallMultihull, DayBoat, WheelBoat, Boat, object))
    885 
    886     # see "A Monotonic Superclass Linearization for Dylan",
    887     # by Kim Barrett et al. (OOPSLA 1996)
    888     def test_consistency_with_epg(self):
    889         # Testing consistency with EPG...
    890         class Pane(object): pass
    891         class ScrollingMixin(object): pass
    892         class EditingMixin(object): pass
    893         class ScrollablePane(Pane,ScrollingMixin): pass
    894         class EditablePane(Pane,EditingMixin): pass
    895         class EditableScrollablePane(ScrollablePane,EditablePane): pass
    896 
    897         self.assertEqual(EditableScrollablePane.__mro__,
    898               (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
    899                 ScrollingMixin, EditingMixin, object))
    900 
    901     def test_mro_disagreement(self):
    902         # Testing error messages for MRO disagreement...
    903         mro_err_msg = """Cannot create a consistent method resolution
    904 order (MRO) for bases """
    905 
    906         def raises(exc, expected, callable, *args):
    907             try:
    908                 callable(*args)
    909             except exc, msg:
    910                 # the exact msg is generally considered an impl detail
    911                 if test_support.check_impl_detail():
    912                     if not str(msg).startswith(expected):
    913                         self.fail("Message %r, expected %r" %
    914                                   (str(msg), expected))
    915             else:
    916                 self.fail("Expected %s" % exc)
    917 
    918         class A(object): pass
    919         class B(A): pass
    920         class C(object): pass
    921 
    922         # Test some very simple errors
    923         raises(TypeError, "duplicate base class A",
    924                type, "X", (A, A), {})
    925         raises(TypeError, mro_err_msg,
    926                type, "X", (A, B), {})
    927         raises(TypeError, mro_err_msg,
    928                type, "X", (A, C, B), {})
    929         # Test a slightly more complex error
    930         class GridLayout(object): pass
    931         class HorizontalGrid(GridLayout): pass
    932         class VerticalGrid(GridLayout): pass
    933         class HVGrid(HorizontalGrid, VerticalGrid): pass
    934         class VHGrid(VerticalGrid, HorizontalGrid): pass
    935         raises(TypeError, mro_err_msg,
    936                type, "ConfusedGrid", (HVGrid, VHGrid), {})
    937 
    938     def test_object_class(self):
    939         # Testing object class...
    940         a = object()
    941         self.assertEqual(a.__class__, object)
    942         self.assertEqual(type(a), object)
    943         b = object()
    944         self.assertNotEqual(a, b)
    945         self.assertNotHasAttr(a, "foo")
    946         try:
    947             a.foo = 12
    948         except (AttributeError, TypeError):
    949             pass
    950         else:
    951             self.fail("object() should not allow setting a foo attribute")
    952         self.assertNotHasAttr(object(), "__dict__")
    953 
    954         class Cdict(object):
    955             pass
    956         x = Cdict()
    957         self.assertEqual(x.__dict__, {})
    958         x.foo = 1
    959         self.assertEqual(x.foo, 1)
    960         self.assertEqual(x.__dict__, {'foo': 1})
    961 
    962     def test_slots(self):
    963         # Testing __slots__...
    964         class C0(object):
    965             __slots__ = []
    966         x = C0()
    967         self.assertNotHasAttr(x, "__dict__")
    968         self.assertNotHasAttr(x, "foo")
    969 
    970         class C1(object):
    971             __slots__ = ['a']
    972         x = C1()
    973         self.assertNotHasAttr(x, "__dict__")
    974         self.assertNotHasAttr(x, "a")
    975         x.a = 1
    976         self.assertEqual(x.a, 1)
    977         x.a = None
    978         self.assertEqual(x.a, None)
    979         del x.a
    980         self.assertNotHasAttr(x, "a")
    981 
    982         class C3(object):
    983             __slots__ = ['a', 'b', 'c']
    984         x = C3()
    985         self.assertNotHasAttr(x, "__dict__")
    986         self.assertNotHasAttr(x, 'a')
    987         self.assertNotHasAttr(x, 'b')
    988         self.assertNotHasAttr(x, 'c')
    989         x.a = 1
    990         x.b = 2
    991         x.c = 3
    992         self.assertEqual(x.a, 1)
    993         self.assertEqual(x.b, 2)
    994         self.assertEqual(x.c, 3)
    995 
    996         class C4(object):
    997             """Validate name mangling"""
    998             __slots__ = ['__a']
    999             def __init__(self, value):
   1000                 self.__a = value
   1001             def get(self):
   1002                 return self.__a
   1003         x = C4(5)
   1004         self.assertNotHasAttr(x, '__dict__')
   1005         self.assertNotHasAttr(x, '__a')
   1006         self.assertEqual(x.get(), 5)
   1007         try:
   1008             x.__a = 6
   1009         except AttributeError:
   1010             pass
   1011         else:
   1012             self.fail("Double underscored names not mangled")
   1013 
   1014         # Make sure slot names are proper identifiers
   1015         try:
   1016             class C(object):
   1017                 __slots__ = [None]
   1018         except TypeError:
   1019             pass
   1020         else:
   1021             self.fail("[None] slots not caught")
   1022         try:
   1023             class C(object):
   1024                 __slots__ = ["foo bar"]
   1025         except TypeError:
   1026             pass
   1027         else:
   1028             self.fail("['foo bar'] slots not caught")
   1029         try:
   1030             class C(object):
   1031                 __slots__ = ["foo\0bar"]
   1032         except TypeError:
   1033             pass
   1034         else:
   1035             self.fail("['foo\\0bar'] slots not caught")
   1036         try:
   1037             class C(object):
   1038                 __slots__ = ["1"]
   1039         except TypeError:
   1040             pass
   1041         else:
   1042             self.fail("['1'] slots not caught")
   1043         try:
   1044             class C(object):
   1045                 __slots__ = [""]
   1046         except TypeError:
   1047             pass
   1048         else:
   1049             self.fail("[''] slots not caught")
   1050         class C(object):
   1051             __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
   1052         # XXX(nnorwitz): was there supposed to be something tested
   1053         # from the class above?
   1054 
   1055         # Test a single string is not expanded as a sequence.
   1056         class C(object):
   1057             __slots__ = "abc"
   1058         c = C()
   1059         c.abc = 5
   1060         self.assertEqual(c.abc, 5)
   1061 
   1062     def test_unicode_slots(self):
   1063         # Test unicode slot names
   1064         try:
   1065             unicode
   1066         except NameError:
   1067             self.skipTest('no unicode support')
   1068         else:
   1069             # Test a single unicode string is not expanded as a sequence.
   1070             class C(object):
   1071                 __slots__ = unicode("abc")
   1072             c = C()
   1073             c.abc = 5
   1074             self.assertEqual(c.abc, 5)
   1075 
   1076             # _unicode_to_string used to modify slots in certain circumstances
   1077             slots = (unicode("foo"), unicode("bar"))
   1078             class C(object):
   1079                 __slots__ = slots
   1080             x = C()
   1081             x.foo = 5
   1082             self.assertEqual(x.foo, 5)
   1083             self.assertEqual(type(slots[0]), unicode)
   1084             # this used to leak references
   1085             try:
   1086                 class C(object):
   1087                     __slots__ = [unichr(128)]
   1088             except (TypeError, UnicodeEncodeError):
   1089                 pass
   1090             else:
   1091                 self.fail("[unichr(128)] slots not caught")
   1092 
   1093         # Test leaks
   1094         class Counted(object):
   1095             counter = 0    # counts the number of instances alive
   1096             def __init__(self):
   1097                 Counted.counter += 1
   1098             def __del__(self):
   1099                 Counted.counter -= 1
   1100         class C(object):
   1101             __slots__ = ['a', 'b', 'c']
   1102         x = C()
   1103         x.a = Counted()
   1104         x.b = Counted()
   1105         x.c = Counted()
   1106         self.assertEqual(Counted.counter, 3)
   1107         del x
   1108         test_support.gc_collect()
   1109         self.assertEqual(Counted.counter, 0)
   1110         class D(C):
   1111             pass
   1112         x = D()
   1113         x.a = Counted()
   1114         x.z = Counted()
   1115         self.assertEqual(Counted.counter, 2)
   1116         del x
   1117         test_support.gc_collect()
   1118         self.assertEqual(Counted.counter, 0)
   1119         class E(D):
   1120             __slots__ = ['e']
   1121         x = E()
   1122         x.a = Counted()
   1123         x.z = Counted()
   1124         x.e = Counted()
   1125         self.assertEqual(Counted.counter, 3)
   1126         del x
   1127         test_support.gc_collect()
   1128         self.assertEqual(Counted.counter, 0)
   1129 
   1130         # Test cyclical leaks [SF bug 519621]
   1131         class F(object):
   1132             __slots__ = ['a', 'b']
   1133         s = F()
   1134         s.a = [Counted(), s]
   1135         self.assertEqual(Counted.counter, 1)
   1136         s = None
   1137         test_support.gc_collect()
   1138         self.assertEqual(Counted.counter, 0)
   1139 
   1140         # Test lookup leaks [SF bug 572567]
   1141         if hasattr(gc, 'get_objects'):
   1142             class G(object):
   1143                 def __cmp__(self, other):
   1144                     return 0
   1145                 __hash__ = None # Silence Py3k warning
   1146             g = G()
   1147             orig_objects = len(gc.get_objects())
   1148             for i in xrange(10):
   1149                 g==g
   1150             new_objects = len(gc.get_objects())
   1151             self.assertEqual(orig_objects, new_objects)
   1152 
   1153         class H(object):
   1154             __slots__ = ['a', 'b']
   1155             def __init__(self):
   1156                 self.a = 1
   1157                 self.b = 2
   1158             def __del__(self_):
   1159                 self.assertEqual(self_.a, 1)
   1160                 self.assertEqual(self_.b, 2)
   1161         with test_support.captured_output('stderr') as s:
   1162             h = H()
   1163             del h
   1164         self.assertEqual(s.getvalue(), '')
   1165 
   1166         class X(object):
   1167             __slots__ = "a"
   1168         with self.assertRaises(AttributeError):
   1169             del X().a
   1170 
   1171     def test_slots_special(self):
   1172         # Testing __dict__ and __weakref__ in __slots__...
   1173         class D(object):
   1174             __slots__ = ["__dict__"]
   1175         a = D()
   1176         self.assertHasAttr(a, "__dict__")
   1177         self.assertNotHasAttr(a, "__weakref__")
   1178         a.foo = 42
   1179         self.assertEqual(a.__dict__, {"foo": 42})
   1180 
   1181         class W(object):
   1182             __slots__ = ["__weakref__"]
   1183         a = W()
   1184         self.assertHasAttr(a, "__weakref__")
   1185         self.assertNotHasAttr(a, "__dict__")
   1186         try:
   1187             a.foo = 42
   1188         except AttributeError:
   1189             pass
   1190         else:
   1191             self.fail("shouldn't be allowed to set a.foo")
   1192 
   1193         class C1(W, D):
   1194             __slots__ = []
   1195         a = C1()
   1196         self.assertHasAttr(a, "__dict__")
   1197         self.assertHasAttr(a, "__weakref__")
   1198         a.foo = 42
   1199         self.assertEqual(a.__dict__, {"foo": 42})
   1200 
   1201         class C2(D, W):
   1202             __slots__ = []
   1203         a = C2()
   1204         self.assertHasAttr(a, "__dict__")
   1205         self.assertHasAttr(a, "__weakref__")
   1206         a.foo = 42
   1207         self.assertEqual(a.__dict__, {"foo": 42})
   1208 
   1209     def test_slots_descriptor(self):
   1210         # Issue2115: slot descriptors did not correctly check
   1211         # the type of the given object
   1212         import abc
   1213         class MyABC:
   1214             __metaclass__ = abc.ABCMeta
   1215             __slots__ = "a"
   1216 
   1217         class Unrelated(object):
   1218             pass
   1219         MyABC.register(Unrelated)
   1220 
   1221         u = Unrelated()
   1222         self.assertIsInstance(u, MyABC)
   1223 
   1224         # This used to crash
   1225         self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
   1226 
   1227     def test_metaclass_cmp(self):
   1228         # See bug 7491.
   1229         class M(type):
   1230             def __cmp__(self, other):
   1231                 return -1
   1232         class X(object):
   1233             __metaclass__ = M
   1234         self.assertTrue(X < M)
   1235 
   1236     def test_dynamics(self):
   1237         # Testing class attribute propagation...
   1238         class D(object):
   1239             pass
   1240         class E(D):
   1241             pass
   1242         class F(D):
   1243             pass
   1244         D.foo = 1
   1245         self.assertEqual(D.foo, 1)
   1246         # Test that dynamic attributes are inherited
   1247         self.assertEqual(E.foo, 1)
   1248         self.assertEqual(F.foo, 1)
   1249         # Test dynamic instances
   1250         class C(object):
   1251             pass
   1252         a = C()
   1253         self.assertNotHasAttr(a, "foobar")
   1254         C.foobar = 2
   1255         self.assertEqual(a.foobar, 2)
   1256         C.method = lambda self: 42
   1257         self.assertEqual(a.method(), 42)
   1258         C.__repr__ = lambda self: "C()"
   1259         self.assertEqual(repr(a), "C()")
   1260         C.__int__ = lambda self: 100
   1261         self.assertEqual(int(a), 100)
   1262         self.assertEqual(a.foobar, 2)
   1263         self.assertNotHasAttr(a, "spam")
   1264         def mygetattr(self, name):
   1265             if name == "spam":
   1266                 return "spam"
   1267             raise AttributeError
   1268         C.__getattr__ = mygetattr
   1269         self.assertEqual(a.spam, "spam")
   1270         a.new = 12
   1271         self.assertEqual(a.new, 12)
   1272         def mysetattr(self, name, value):
   1273             if name == "spam":
   1274                 raise AttributeError
   1275             return object.__setattr__(self, name, value)
   1276         C.__setattr__ = mysetattr
   1277         try:
   1278             a.spam = "not spam"
   1279         except AttributeError:
   1280             pass
   1281         else:
   1282             self.fail("expected AttributeError")
   1283         self.assertEqual(a.spam, "spam")
   1284         class D(C):
   1285             pass
   1286         d = D()
   1287         d.foo = 1
   1288         self.assertEqual(d.foo, 1)
   1289 
   1290         # Test handling of int*seq and seq*int
   1291         class I(int):
   1292             pass
   1293         self.assertEqual("a"*I(2), "aa")
   1294         self.assertEqual(I(2)*"a", "aa")
   1295         self.assertEqual(2*I(3), 6)
   1296         self.assertEqual(I(3)*2, 6)
   1297         self.assertEqual(I(3)*I(2), 6)
   1298 
   1299         # Test handling of long*seq and seq*long
   1300         class L(long):
   1301             pass
   1302         self.assertEqual("a"*L(2L), "aa")
   1303         self.assertEqual(L(2L)*"a", "aa")
   1304         self.assertEqual(2*L(3), 6)
   1305         self.assertEqual(L(3)*2, 6)
   1306         self.assertEqual(L(3)*L(2), 6)
   1307 
   1308         # Test comparison of classes with dynamic metaclasses
   1309         class dynamicmetaclass(type):
   1310             pass
   1311         class someclass:
   1312             __metaclass__ = dynamicmetaclass
   1313         self.assertNotEqual(someclass, object)
   1314 
   1315     def test_errors(self):
   1316         # Testing errors...
   1317         try:
   1318             class C(list, dict):
   1319                 pass
   1320         except TypeError:
   1321             pass
   1322         else:
   1323             self.fail("inheritance from both list and dict should be illegal")
   1324 
   1325         try:
   1326             class C(object, None):
   1327                 pass
   1328         except TypeError:
   1329             pass
   1330         else:
   1331             self.fail("inheritance from non-type should be illegal")
   1332         class Classic:
   1333             pass
   1334 
   1335         try:
   1336             class C(type(len)):
   1337                 pass
   1338         except TypeError:
   1339             pass
   1340         else:
   1341             self.fail("inheritance from CFunction should be illegal")
   1342 
   1343         try:
   1344             class C(object):
   1345                 __slots__ = 1
   1346         except TypeError:
   1347             pass
   1348         else:
   1349             self.fail("__slots__ = 1 should be illegal")
   1350 
   1351         try:
   1352             class C(object):
   1353                 __slots__ = [1]
   1354         except TypeError:
   1355             pass
   1356         else:
   1357             self.fail("__slots__ = [1] should be illegal")
   1358 
   1359         class M1(type):
   1360             pass
   1361         class M2(type):
   1362             pass
   1363         class A1(object):
   1364             __metaclass__ = M1
   1365         class A2(object):
   1366             __metaclass__ = M2
   1367         try:
   1368             class B(A1, A2):
   1369                 pass
   1370         except TypeError:
   1371             pass
   1372         else:
   1373             self.fail("finding the most derived metaclass should have failed")
   1374 
   1375     def test_classmethods(self):
   1376         # Testing class methods...
   1377         class C(object):
   1378             def foo(*a): return a
   1379             goo = classmethod(foo)
   1380         c = C()
   1381         self.assertEqual(C.goo(1), (C, 1))
   1382         self.assertEqual(c.goo(1), (C, 1))
   1383         self.assertEqual(c.foo(1), (c, 1))
   1384         class D(C):
   1385             pass
   1386         d = D()
   1387         self.assertEqual(D.goo(1), (D, 1))
   1388         self.assertEqual(d.goo(1), (D, 1))
   1389         self.assertEqual(d.foo(1), (d, 1))
   1390         self.assertEqual(D.foo(d, 1), (d, 1))
   1391         # Test for a specific crash (SF bug 528132)
   1392         def f(cls, arg): return (cls, arg)
   1393         ff = classmethod(f)
   1394         self.assertEqual(ff.__get__(0, int)(42), (int, 42))
   1395         self.assertEqual(ff.__get__(0)(42), (int, 42))
   1396 
   1397         # Test super() with classmethods (SF bug 535444)
   1398         self.assertEqual(C.goo.im_self, C)
   1399         self.assertEqual(D.goo.im_self, D)
   1400         self.assertEqual(super(D,D).goo.im_self, D)
   1401         self.assertEqual(super(D,d).goo.im_self, D)
   1402         self.assertEqual(super(D,D).goo(), (D,))
   1403         self.assertEqual(super(D,d).goo(), (D,))
   1404 
   1405         # Verify that a non-callable will raise
   1406         meth = classmethod(1).__get__(1)
   1407         self.assertRaises(TypeError, meth)
   1408 
   1409         # Verify that classmethod() doesn't allow keyword args
   1410         try:
   1411             classmethod(f, kw=1)
   1412         except TypeError:
   1413             pass
   1414         else:
   1415             self.fail("classmethod shouldn't accept keyword args")
   1416 
   1417     @test_support.impl_detail("the module 'xxsubtype' is internal")
   1418     def test_classmethods_in_c(self):
   1419         # Testing C-based class methods...
   1420         import xxsubtype as spam
   1421         a = (1, 2, 3)
   1422         d = {'abc': 123}
   1423         x, a1, d1 = spam.spamlist.classmeth(*a, **d)
   1424         self.assertEqual(x, spam.spamlist)
   1425         self.assertEqual(a, a1)
   1426         self.assertEqual(d, d1)
   1427         x, a1, d1 = spam.spamlist().classmeth(*a, **d)
   1428         self.assertEqual(x, spam.spamlist)
   1429         self.assertEqual(a, a1)
   1430         self.assertEqual(d, d1)
   1431         spam_cm = spam.spamlist.__dict__['classmeth']
   1432         x2, a2, d2 = spam_cm(spam.spamlist, *a, **d)
   1433         self.assertEqual(x2, spam.spamlist)
   1434         self.assertEqual(a2, a1)
   1435         self.assertEqual(d2, d1)
   1436         class SubSpam(spam.spamlist): pass
   1437         x2, a2, d2 = spam_cm(SubSpam, *a, **d)
   1438         self.assertEqual(x2, SubSpam)
   1439         self.assertEqual(a2, a1)
   1440         self.assertEqual(d2, d1)
   1441         with self.assertRaises(TypeError):
   1442             spam_cm()
   1443         with self.assertRaises(TypeError):
   1444             spam_cm(spam.spamlist())
   1445         with self.assertRaises(TypeError):
   1446             spam_cm(list)
   1447 
   1448     def test_staticmethods(self):
   1449         # Testing static methods...
   1450         class C(object):
   1451             def foo(*a): return a
   1452             goo = staticmethod(foo)
   1453         c = C()
   1454         self.assertEqual(C.goo(1), (1,))
   1455         self.assertEqual(c.goo(1), (1,))
   1456         self.assertEqual(c.foo(1), (c, 1,))
   1457         class D(C):
   1458             pass
   1459         d = D()
   1460         self.assertEqual(D.goo(1), (1,))
   1461         self.assertEqual(d.goo(1), (1,))
   1462         self.assertEqual(d.foo(1), (d, 1))
   1463         self.assertEqual(D.foo(d, 1), (d, 1))
   1464 
   1465     @test_support.impl_detail("the module 'xxsubtype' is internal")
   1466     def test_staticmethods_in_c(self):
   1467         # Testing C-based static methods...
   1468         import xxsubtype as spam
   1469         a = (1, 2, 3)
   1470         d = {"abc": 123}
   1471         x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
   1472         self.assertEqual(x, None)
   1473         self.assertEqual(a, a1)
   1474         self.assertEqual(d, d1)
   1475         x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
   1476         self.assertEqual(x, None)
   1477         self.assertEqual(a, a1)
   1478         self.assertEqual(d, d1)
   1479 
   1480     def test_classic(self):
   1481         # Testing classic classes...
   1482         class C:
   1483             def foo(*a): return a
   1484             goo = classmethod(foo)
   1485         c = C()
   1486         self.assertEqual(C.goo(1), (C, 1))
   1487         self.assertEqual(c.goo(1), (C, 1))
   1488         self.assertEqual(c.foo(1), (c, 1))
   1489         class D(C):
   1490             pass
   1491         d = D()
   1492         self.assertEqual(D.goo(1), (D, 1))
   1493         self.assertEqual(d.goo(1), (D, 1))
   1494         self.assertEqual(d.foo(1), (d, 1))
   1495         self.assertEqual(D.foo(d, 1), (d, 1))
   1496         class E: # *not* subclassing from C
   1497             foo = C.foo
   1498         self.assertEqual(E().foo, C.foo) # i.e., unbound
   1499         self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
   1500 
   1501     def test_compattr(self):
   1502         # Testing computed attributes...
   1503         class C(object):
   1504             class computed_attribute(object):
   1505                 def __init__(self, get, set=None, delete=None):
   1506                     self.__get = get
   1507                     self.__set = set
   1508                     self.__delete = delete
   1509                 def __get__(self, obj, type=None):
   1510                     return self.__get(obj)
   1511                 def __set__(self, obj, value):
   1512                     return self.__set(obj, value)
   1513                 def __delete__(self, obj):
   1514                     return self.__delete(obj)
   1515             def __init__(self):
   1516                 self.__x = 0
   1517             def __get_x(self):
   1518                 x = self.__x
   1519                 self.__x = x+1
   1520                 return x
   1521             def __set_x(self, x):
   1522                 self.__x = x
   1523             def __delete_x(self):
   1524                 del self.__x
   1525             x = computed_attribute(__get_x, __set_x, __delete_x)
   1526         a = C()
   1527         self.assertEqual(a.x, 0)
   1528         self.assertEqual(a.x, 1)
   1529         a.x = 10
   1530         self.assertEqual(a.x, 10)
   1531         self.assertEqual(a.x, 11)
   1532         del a.x
   1533         self.assertNotHasAttr(a, 'x')
   1534 
   1535     def test_newslots(self):
   1536         # Testing __new__ slot override...
   1537         class C(list):
   1538             def __new__(cls):
   1539                 self = list.__new__(cls)
   1540                 self.foo = 1
   1541                 return self
   1542             def __init__(self):
   1543                 self.foo = self.foo + 2
   1544         a = C()
   1545         self.assertEqual(a.foo, 3)
   1546         self.assertEqual(a.__class__, C)
   1547         class D(C):
   1548             pass
   1549         b = D()
   1550         self.assertEqual(b.foo, 3)
   1551         self.assertEqual(b.__class__, D)
   1552 
   1553     def test_altmro(self):
   1554         # Testing mro() and overriding it...
   1555         class A(object):
   1556             def f(self): return "A"
   1557         class B(A):
   1558             pass
   1559         class C(A):
   1560             def f(self): return "C"
   1561         class D(B, C):
   1562             pass
   1563         self.assertEqual(D.mro(), [D, B, C, A, object])
   1564         self.assertEqual(D.__mro__, (D, B, C, A, object))
   1565         self.assertEqual(D().f(), "C")
   1566 
   1567         class PerverseMetaType(type):
   1568             def mro(cls):
   1569                 L = type.mro(cls)
   1570                 L.reverse()
   1571                 return L
   1572         class X(D,B,C,A):
   1573             __metaclass__ = PerverseMetaType
   1574         self.assertEqual(X.__mro__, (object, A, C, B, D, X))
   1575         self.assertEqual(X().f(), "A")
   1576 
   1577         try:
   1578             class X(object):
   1579                 class __metaclass__(type):
   1580                     def mro(self):
   1581                         return [self, dict, object]
   1582             # In CPython, the class creation above already raises
   1583             # TypeError, as a protection against the fact that
   1584             # instances of X would segfault it.  In other Python
   1585             # implementations it would be ok to let the class X
   1586             # be created, but instead get a clean TypeError on the
   1587             # __setitem__ below.
   1588             x = object.__new__(X)
   1589             x[5] = 6
   1590         except TypeError:
   1591             pass
   1592         else:
   1593             self.fail("devious mro() return not caught")
   1594 
   1595         try:
   1596             class X(object):
   1597                 class __metaclass__(type):
   1598                     def mro(self):
   1599                         return [1]
   1600         except TypeError:
   1601             pass
   1602         else:
   1603             self.fail("non-class mro() return not caught")
   1604 
   1605         try:
   1606             class X(object):
   1607                 class __metaclass__(type):
   1608                     def mro(self):
   1609                         return 1
   1610         except TypeError:
   1611             pass
   1612         else:
   1613             self.fail("non-sequence mro() return not caught")
   1614 
   1615     def test_overloading(self):
   1616         # Testing operator overloading...
   1617 
   1618         class B(object):
   1619             "Intermediate class because object doesn't have a __setattr__"
   1620 
   1621         class C(B):
   1622             def __getattr__(self, name):
   1623                 if name == "foo":
   1624                     return ("getattr", name)
   1625                 else:
   1626                     raise AttributeError
   1627             def __setattr__(self, name, value):
   1628                 if name == "foo":
   1629                     self.setattr = (name, value)
   1630                 else:
   1631                     return B.__setattr__(self, name, value)
   1632             def __delattr__(self, name):
   1633                 if name == "foo":
   1634                     self.delattr = name
   1635                 else:
   1636                     return B.__delattr__(self, name)
   1637 
   1638             def __getitem__(self, key):
   1639                 return ("getitem", key)
   1640             def __setitem__(self, key, value):
   1641                 self.setitem = (key, value)
   1642             def __delitem__(self, key):
   1643                 self.delitem = key
   1644 
   1645             def __getslice__(self, i, j):
   1646                 return ("getslice", i, j)
   1647             def __setslice__(self, i, j, value):
   1648                 self.setslice = (i, j, value)
   1649             def __delslice__(self, i, j):
   1650                 self.delslice = (i, j)
   1651 
   1652         a = C()
   1653         self.assertEqual(a.foo, ("getattr", "foo"))
   1654         a.foo = 12
   1655         self.assertEqual(a.setattr, ("foo", 12))
   1656         del a.foo
   1657         self.assertEqual(a.delattr, "foo")
   1658 
   1659         self.assertEqual(a[12], ("getitem", 12))
   1660         a[12] = 21
   1661         self.assertEqual(a.setitem, (12, 21))
   1662         del a[12]
   1663         self.assertEqual(a.delitem, 12)
   1664 
   1665         self.assertEqual(a[0:10], ("getslice", 0, 10))
   1666         a[0:10] = "foo"
   1667         self.assertEqual(a.setslice, (0, 10, "foo"))
   1668         del a[0:10]
   1669         self.assertEqual(a.delslice, (0, 10))
   1670 
   1671     def test_methods(self):
   1672         # Testing methods...
   1673         class C(object):
   1674             def __init__(self, x):
   1675                 self.x = x
   1676             def foo(self):
   1677                 return self.x
   1678         c1 = C(1)
   1679         self.assertEqual(c1.foo(), 1)
   1680         class D(C):
   1681             boo = C.foo
   1682             goo = c1.foo
   1683         d2 = D(2)
   1684         self.assertEqual(d2.foo(), 2)
   1685         self.assertEqual(d2.boo(), 2)
   1686         self.assertEqual(d2.goo(), 1)
   1687         class E(object):
   1688             foo = C.foo
   1689         self.assertEqual(E().foo, C.foo) # i.e., unbound
   1690         self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
   1691 
   1692     def test_special_method_lookup(self):
   1693         # The lookup of special methods bypasses __getattr__ and
   1694         # __getattribute__, but they still can be descriptors.
   1695 
   1696         def run_context(manager):
   1697             with manager:
   1698                 pass
   1699         def iden(self):
   1700             return self
   1701         def hello(self):
   1702             return "hello"
   1703         def empty_seq(self):
   1704             return []
   1705         def zero(self):
   1706             return 0
   1707         def complex_num(self):
   1708             return 1j
   1709         def stop(self):
   1710             raise StopIteration
   1711         def return_true(self, thing=None):
   1712             return True
   1713         def do_isinstance(obj):
   1714             return isinstance(int, obj)
   1715         def do_issubclass(obj):
   1716             return issubclass(int, obj)
   1717         def swallow(*args):
   1718             pass
   1719         def do_dict_missing(checker):
   1720             class DictSub(checker.__class__, dict):
   1721                 pass
   1722             self.assertEqual(DictSub()["hi"], 4)
   1723         def some_number(self_, key):
   1724             self.assertEqual(key, "hi")
   1725             return 4
   1726         def format_impl(self, spec):
   1727             return "hello"
   1728 
   1729         # It would be nice to have every special method tested here, but I'm
   1730         # only listing the ones I can remember outside of typeobject.c, since it
   1731         # does it right.
   1732         specials = [
   1733             ("__unicode__", unicode, hello, set(), {}),
   1734             ("__reversed__", reversed, empty_seq, set(), {}),
   1735             ("__length_hint__", list, zero, set(),
   1736              {"__iter__" : iden, "next" : stop}),
   1737             ("__sizeof__", sys.getsizeof, zero, set(), {}),
   1738             ("__instancecheck__", do_isinstance, return_true, set(), {}),
   1739             ("__missing__", do_dict_missing, some_number,
   1740              set(("__class__",)), {}),
   1741             ("__subclasscheck__", do_issubclass, return_true,
   1742              set(("__bases__",)), {}),
   1743             ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
   1744             ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
   1745             ("__complex__", complex, complex_num, set(), {}),
   1746             ("__format__", format, format_impl, set(), {}),
   1747             ("__dir__", dir, empty_seq, set(), {}),
   1748             ]
   1749 
   1750         class Checker(object):
   1751             def __getattr__(self, attr, test=self):
   1752                 test.fail("__getattr__ called with {0}".format(attr))
   1753             def __getattribute__(self, attr, test=self):
   1754                 if attr not in ok:
   1755                     test.fail("__getattribute__ called with {0}".format(attr))
   1756                 return object.__getattribute__(self, attr)
   1757         class SpecialDescr(object):
   1758             def __init__(self, impl):
   1759                 self.impl = impl
   1760             def __get__(self, obj, owner):
   1761                 record.append(1)
   1762                 return self.impl.__get__(obj, owner)
   1763         class MyException(Exception):
   1764             pass
   1765         class ErrDescr(object):
   1766             def __get__(self, obj, owner):
   1767                 raise MyException
   1768 
   1769         for name, runner, meth_impl, ok, env in specials:
   1770             class X(Checker):
   1771                 pass
   1772             for attr, obj in env.iteritems():
   1773                 setattr(X, attr, obj)
   1774             setattr(X, name, meth_impl)
   1775             runner(X())
   1776 
   1777             record = []
   1778             class X(Checker):
   1779                 pass
   1780             for attr, obj in env.iteritems():
   1781                 setattr(X, attr, obj)
   1782             setattr(X, name, SpecialDescr(meth_impl))
   1783             runner(X())
   1784             self.assertEqual(record, [1], name)
   1785 
   1786             class X(Checker):
   1787                 pass
   1788             for attr, obj in env.iteritems():
   1789                 setattr(X, attr, obj)
   1790             setattr(X, name, ErrDescr())
   1791             try:
   1792                 runner(X())
   1793             except MyException:
   1794                 pass
   1795             else:
   1796                 self.fail("{0!r} didn't raise".format(name))
   1797 
   1798     def test_specials(self):
   1799         # Testing special operators...
   1800         # Test operators like __hash__ for which a built-in default exists
   1801 
   1802         # Test the default behavior for static classes
   1803         class C(object):
   1804             def __getitem__(self, i):
   1805                 if 0 <= i < 10: return i
   1806                 raise IndexError
   1807         c1 = C()
   1808         c2 = C()
   1809         self.assertFalse(not c1)
   1810         self.assertNotEqual(id(c1), id(c2))
   1811         hash(c1)
   1812         hash(c2)
   1813         self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
   1814         self.assertEqual(c1, c1)
   1815         self.assertTrue(c1 != c2)
   1816         self.assertFalse(c1 != c1)
   1817         self.assertFalse(c1 == c2)
   1818         # Note that the module name appears in str/repr, and that varies
   1819         # depending on whether this test is run standalone or from a framework.
   1820         self.assertGreaterEqual(str(c1).find('C object at '), 0)
   1821         self.assertEqual(str(c1), repr(c1))
   1822         self.assertNotIn(-1, c1)
   1823         for i in range(10):
   1824             self.assertIn(i, c1)
   1825         self.assertNotIn(10, c1)
   1826         # Test the default behavior for dynamic classes
   1827         class D(object):
   1828             def __getitem__(self, i):
   1829                 if 0 <= i < 10: return i
   1830                 raise IndexError
   1831         d1 = D()
   1832         d2 = D()
   1833         self.assertFalse(not d1)
   1834         self.assertNotEqual(id(d1), id(d2))
   1835         hash(d1)
   1836         hash(d2)
   1837         self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
   1838         self.assertEqual(d1, d1)
   1839         self.assertNotEqual(d1, d2)
   1840         self.assertFalse(d1 != d1)
   1841         self.assertFalse(d1 == d2)
   1842         # Note that the module name appears in str/repr, and that varies
   1843         # depending on whether this test is run standalone or from a framework.
   1844         self.assertGreaterEqual(str(d1).find('D object at '), 0)
   1845         self.assertEqual(str(d1), repr(d1))
   1846         self.assertNotIn(-1, d1)
   1847         for i in range(10):
   1848             self.assertIn(i, d1)
   1849         self.assertNotIn(10, d1)
   1850         # Test overridden behavior for static classes
   1851         class Proxy(object):
   1852             def __init__(self, x):
   1853                 self.x = x
   1854             def __nonzero__(self):
   1855                 return not not self.x
   1856             def __hash__(self):
   1857                 return hash(self.x)
   1858             def __eq__(self, other):
   1859                 return self.x == other
   1860             def __ne__(self, other):
   1861                 return self.x != other
   1862             def __cmp__(self, other):
   1863                 return cmp(self.x, other.x)
   1864             def __str__(self):
   1865                 return "Proxy:%s" % self.x
   1866             def __repr__(self):
   1867                 return "Proxy(%r)" % self.x
   1868             def __contains__(self, value):
   1869                 return value in self.x
   1870         p0 = Proxy(0)
   1871         p1 = Proxy(1)
   1872         p_1 = Proxy(-1)
   1873         self.assertFalse(p0)
   1874         self.assertFalse(not p1)
   1875         self.assertEqual(hash(p0), hash(0))
   1876         self.assertEqual(p0, p0)
   1877         self.assertNotEqual(p0, p1)
   1878         self.assertFalse(p0 != p0)
   1879         self.assertEqual(not p0, p1)
   1880         self.assertEqual(cmp(p0, p1), -1)
   1881         self.assertEqual(cmp(p0, p0), 0)
   1882         self.assertEqual(cmp(p0, p_1), 1)
   1883         self.assertEqual(str(p0), "Proxy:0")
   1884         self.assertEqual(repr(p0), "Proxy(0)")
   1885         p10 = Proxy(range(10))
   1886         self.assertNotIn(-1, p10)
   1887         for i in range(10):
   1888             self.assertIn(i, p10)
   1889         self.assertNotIn(10, p10)
   1890         # Test overridden behavior for dynamic classes
   1891         class DProxy(object):
   1892             def __init__(self, x):
   1893                 self.x = x
   1894             def __nonzero__(self):
   1895                 return not not self.x
   1896             def __hash__(self):
   1897                 return hash(self.x)
   1898             def __eq__(self, other):
   1899                 return self.x == other
   1900             def __ne__(self, other):
   1901                 return self.x != other
   1902             def __cmp__(self, other):
   1903                 return cmp(self.x, other.x)
   1904             def __str__(self):
   1905                 return "DProxy:%s" % self.x
   1906             def __repr__(self):
   1907                 return "DProxy(%r)" % self.x
   1908             def __contains__(self, value):
   1909                 return value in self.x
   1910         p0 = DProxy(0)
   1911         p1 = DProxy(1)
   1912         p_1 = DProxy(-1)
   1913         self.assertFalse(p0)
   1914         self.assertFalse(not p1)
   1915         self.assertEqual(hash(p0), hash(0))
   1916         self.assertEqual(p0, p0)
   1917         self.assertNotEqual(p0, p1)
   1918         self.assertNotEqual(not p0, p0)
   1919         self.assertEqual(not p0, p1)
   1920         self.assertEqual(cmp(p0, p1), -1)
   1921         self.assertEqual(cmp(p0, p0), 0)
   1922         self.assertEqual(cmp(p0, p_1), 1)
   1923         self.assertEqual(str(p0), "DProxy:0")
   1924         self.assertEqual(repr(p0), "DProxy(0)")
   1925         p10 = DProxy(range(10))
   1926         self.assertNotIn(-1, p10)
   1927         for i in range(10):
   1928             self.assertIn(i, p10)
   1929         self.assertNotIn(10, p10)
   1930 
   1931         # Safety test for __cmp__
   1932         def unsafecmp(a, b):
   1933             if not hasattr(a, '__cmp__'):
   1934                 return   # some types don't have a __cmp__ any more (so the
   1935                          # test doesn't make sense any more), or maybe they
   1936                          # never had a __cmp__ at all, e.g. in PyPy
   1937             try:
   1938                 a.__class__.__cmp__(a, b)
   1939             except TypeError:
   1940                 pass
   1941             else:
   1942                 self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
   1943                     a.__class__, a, b))
   1944 
   1945         unsafecmp(u"123", "123")
   1946         unsafecmp("123", u"123")
   1947         unsafecmp(1, 1.0)
   1948         unsafecmp(1.0, 1)
   1949         unsafecmp(1, 1L)
   1950         unsafecmp(1L, 1)
   1951 
   1952     @test_support.impl_detail("custom logic for printing to real file objects")
   1953     def test_recursions_1(self):
   1954         # Testing recursion checks ...
   1955         class Letter(str):
   1956             def __new__(cls, letter):
   1957                 if letter == 'EPS':
   1958                     return str.__new__(cls)
   1959                 return str.__new__(cls, letter)
   1960             def __str__(self):
   1961                 if not self:
   1962                     return 'EPS'
   1963                 return self
   1964         # sys.stdout needs to be the original to trigger the recursion bug
   1965         test_stdout = sys.stdout
   1966         sys.stdout = test_support.get_original_stdout()
   1967         try:
   1968             # nothing should actually be printed, this should raise an exception
   1969             print Letter('w')
   1970         except RuntimeError:
   1971             pass
   1972         else:
   1973             self.fail("expected a RuntimeError for print recursion")
   1974         finally:
   1975             sys.stdout = test_stdout
   1976 
   1977     def test_recursions_2(self):
   1978         # Bug #1202533.
   1979         class A(object):
   1980             pass
   1981         A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
   1982         try:
   1983             A()*2
   1984         except RuntimeError:
   1985             pass
   1986         else:
   1987             self.fail("expected a RuntimeError")
   1988 
   1989     def test_weakrefs(self):
   1990         # Testing weak references...
   1991         import weakref
   1992         class C(object):
   1993             pass
   1994         c = C()
   1995         r = weakref.ref(c)
   1996         self.assertEqual(r(), c)
   1997         del c
   1998         test_support.gc_collect()
   1999         self.assertEqual(r(), None)
   2000         del r
   2001         class NoWeak(object):
   2002             __slots__ = ['foo']
   2003         no = NoWeak()
   2004         try:
   2005             weakref.ref(no)
   2006         except TypeError, msg:
   2007             self.assertIn("weak reference", str(msg))
   2008         else:
   2009             self.fail("weakref.ref(no) should be illegal")
   2010         class Weak(object):
   2011             __slots__ = ['foo', '__weakref__']
   2012         yes = Weak()
   2013         r = weakref.ref(yes)
   2014         self.assertEqual(r(), yes)
   2015         del yes
   2016         test_support.gc_collect()
   2017         self.assertEqual(r(), None)
   2018         del r
   2019 
   2020     def test_properties(self):
   2021         # Testing property...
   2022         class C(object):
   2023             def getx(self):
   2024                 return self.__x
   2025             def setx(self, value):
   2026                 self.__x = value
   2027             def delx(self):
   2028                 del self.__x
   2029             x = property(getx, setx, delx, doc="I'm the x property.")
   2030         a = C()
   2031         self.assertNotHasAttr(a, "x")
   2032         a.x = 42
   2033         self.assertEqual(a._C__x, 42)
   2034         self.assertEqual(a.x, 42)
   2035         del a.x
   2036         self.assertNotHasAttr(a, "x")
   2037         self.assertNotHasAttr(a, "_C__x")
   2038         C.x.__set__(a, 100)
   2039         self.assertEqual(C.x.__get__(a), 100)
   2040         C.x.__delete__(a)
   2041         self.assertNotHasAttr(a, "x")
   2042 
   2043         raw = C.__dict__['x']
   2044         self.assertIsInstance(raw, property)
   2045 
   2046         attrs = dir(raw)
   2047         self.assertIn("__doc__", attrs)
   2048         self.assertIn("fget", attrs)
   2049         self.assertIn("fset", attrs)
   2050         self.assertIn("fdel", attrs)
   2051 
   2052         self.assertEqual(raw.__doc__, "I'm the x property.")
   2053         self.assertIs(raw.fget, C.__dict__['getx'])
   2054         self.assertIs(raw.fset, C.__dict__['setx'])
   2055         self.assertIs(raw.fdel, C.__dict__['delx'])
   2056 
   2057         for attr in "__doc__", "fget", "fset", "fdel":
   2058             try:
   2059                 setattr(raw, attr, 42)
   2060             except TypeError, msg:
   2061                 if str(msg).find('readonly') < 0:
   2062                     self.fail("when setting readonly attr %r on a property, "
   2063                                      "got unexpected TypeError msg %r" % (attr, str(msg)))
   2064             else:
   2065                 self.fail("expected TypeError from trying to set readonly %r "
   2066                                  "attr on a property" % attr)
   2067 
   2068         class D(object):
   2069             __getitem__ = property(lambda s: 1.0/0.0)
   2070 
   2071         d = D()
   2072         try:
   2073             for i in d:
   2074                 str(i)
   2075         except ZeroDivisionError:
   2076             pass
   2077         else:
   2078             self.fail("expected ZeroDivisionError from bad property")
   2079 
   2080     @unittest.skipIf(sys.flags.optimize >= 2,
   2081                      "Docstrings are omitted with -O2 and above")
   2082     def test_properties_doc_attrib(self):
   2083         class E(object):
   2084             def getter(self):
   2085                 "getter method"
   2086                 return 0
   2087             def setter(self_, value):
   2088                 "setter method"
   2089                 pass
   2090             prop = property(getter)
   2091             self.assertEqual(prop.__doc__, "getter method")
   2092             prop2 = property(fset=setter)
   2093             self.assertEqual(prop2.__doc__, None)
   2094 
   2095     @test_support.cpython_only
   2096     def test_testcapi_no_segfault(self):
   2097         # this segfaulted in 2.5b2
   2098         try:
   2099             import _testcapi
   2100         except ImportError:
   2101             pass
   2102         else:
   2103             class X(object):
   2104                 p = property(_testcapi.test_with_docstring)
   2105 
   2106     def test_properties_plus(self):
   2107         class C(object):
   2108             foo = property(doc="hello")
   2109             @foo.getter
   2110             def foo(self):
   2111                 return self._foo
   2112             @foo.setter
   2113             def foo(self, value):
   2114                 self._foo = abs(value)
   2115             @foo.deleter
   2116             def foo(self):
   2117                 del self._foo
   2118         c = C()
   2119         self.assertEqual(C.foo.__doc__, "hello")
   2120         self.assertNotHasAttr(c, "foo")
   2121         c.foo = -42
   2122         self.assertHasAttr(c, '_foo')
   2123         self.assertEqual(c._foo, 42)
   2124         self.assertEqual(c.foo, 42)
   2125         del c.foo
   2126         self.assertNotHasAttr(c, '_foo')
   2127         self.assertNotHasAttr(c, "foo")
   2128 
   2129         class D(C):
   2130             @C.foo.deleter
   2131             def foo(self):
   2132                 try:
   2133                     del self._foo
   2134                 except AttributeError:
   2135                     pass
   2136         d = D()
   2137         d.foo = 24
   2138         self.assertEqual(d.foo, 24)
   2139         del d.foo
   2140         del d.foo
   2141 
   2142         class E(object):
   2143             @property
   2144             def foo(self):
   2145                 return self._foo
   2146             @foo.setter
   2147             def foo(self, value):
   2148                 raise RuntimeError
   2149             @foo.setter
   2150             def foo(self, value):
   2151                 self._foo = abs(value)
   2152             @foo.deleter
   2153             def foo(self, value=None):
   2154                 del self._foo
   2155 
   2156         e = E()
   2157         e.foo = -42
   2158         self.assertEqual(e.foo, 42)
   2159         del e.foo
   2160 
   2161         class F(E):
   2162             @E.foo.deleter
   2163             def foo(self):
   2164                 del self._foo
   2165             @foo.setter
   2166             def foo(self, value):
   2167                 self._foo = max(0, value)
   2168         f = F()
   2169         f.foo = -10
   2170         self.assertEqual(f.foo, 0)
   2171         del f.foo
   2172 
   2173     def test_dict_constructors(self):
   2174         # Testing dict constructor ...
   2175         d = dict()
   2176         self.assertEqual(d, {})
   2177         d = dict({})
   2178         self.assertEqual(d, {})
   2179         d = dict({1: 2, 'a': 'b'})
   2180         self.assertEqual(d, {1: 2, 'a': 'b'})
   2181         self.assertEqual(d, dict(d.items()))
   2182         self.assertEqual(d, dict(d.iteritems()))
   2183         d = dict({'one':1, 'two':2})
   2184         self.assertEqual(d, dict(one=1, two=2))
   2185         self.assertEqual(d, dict(**d))
   2186         self.assertEqual(d, dict({"one": 1}, two=2))
   2187         self.assertEqual(d, dict([("two", 2)], one=1))
   2188         self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
   2189         self.assertEqual(d, dict(**d))
   2190 
   2191         for badarg in 0, 0L, 0j, "0", [0], (0,):
   2192             try:
   2193                 dict(badarg)
   2194             except TypeError:
   2195                 pass
   2196             except ValueError:
   2197                 if badarg == "0":
   2198                     # It's a sequence, and its elements are also sequences (gotta
   2199                     # love strings <wink>), but they aren't of length 2, so this
   2200                     # one seemed better as a ValueError than a TypeError.
   2201                     pass
   2202                 else:
   2203                     self.fail("no TypeError from dict(%r)" % badarg)
   2204             else:
   2205                 self.fail("no TypeError from dict(%r)" % badarg)
   2206 
   2207         try:
   2208             dict({}, {})
   2209         except TypeError:
   2210             pass
   2211         else:
   2212             self.fail("no TypeError from dict({}, {})")
   2213 
   2214         class Mapping:
   2215             # Lacks a .keys() method; will be added later.
   2216             dict = {1:2, 3:4, 'a':1j}
   2217 
   2218         try:
   2219             dict(Mapping())
   2220         except TypeError:
   2221             pass
   2222         else:
   2223             self.fail("no TypeError from dict(incomplete mapping)")
   2224 
   2225         Mapping.keys = lambda self: self.dict.keys()
   2226         Mapping.__getitem__ = lambda self, i: self.dict[i]
   2227         d = dict(Mapping())
   2228         self.assertEqual(d, Mapping.dict)
   2229 
   2230         # Init from sequence of iterable objects, each producing a 2-sequence.
   2231         class AddressBookEntry:
   2232             def __init__(self, first, last):
   2233                 self.first = first
   2234                 self.last = last
   2235             def __iter__(self):
   2236                 return iter([self.first, self.last])
   2237 
   2238         d = dict([AddressBookEntry('Tim', 'Warsaw'),
   2239                   AddressBookEntry('Barry', 'Peters'),
   2240                   AddressBookEntry('Tim', 'Peters'),
   2241                   AddressBookEntry('Barry', 'Warsaw')])
   2242         self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
   2243 
   2244         d = dict(zip(range(4), range(1, 5)))
   2245         self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
   2246 
   2247         # Bad sequence lengths.
   2248         for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
   2249             try:
   2250                 dict(bad)
   2251             except ValueError:
   2252                 pass
   2253             else:
   2254                 self.fail("no ValueError from dict(%r)" % bad)
   2255 
   2256     def test_dir(self):
   2257         # Testing dir() ...
   2258         junk = 12
   2259         self.assertEqual(dir(), ['junk', 'self'])
   2260         del junk
   2261 
   2262         # Just make sure these don't blow up!
   2263         for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
   2264             dir(arg)
   2265 
   2266         # Try classic classes.
   2267         class C:
   2268             Cdata = 1
   2269             def Cmethod(self): pass
   2270 
   2271         cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
   2272         self.assertEqual(dir(C), cstuff)
   2273         self.assertIn('im_self', dir(C.Cmethod))
   2274 
   2275         c = C()  # c.__doc__ is an odd thing to see here; ditto c.__module__.
   2276         self.assertEqual(dir(c), cstuff)
   2277 
   2278         c.cdata = 2
   2279         c.cmethod = lambda self: 0
   2280         self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
   2281         self.assertIn('im_self', dir(c.Cmethod))
   2282 
   2283         class A(C):
   2284             Adata = 1
   2285             def Amethod(self): pass
   2286 
   2287         astuff = ['Adata', 'Amethod'] + cstuff
   2288         self.assertEqual(dir(A), astuff)
   2289         self.assertIn('im_self', dir(A.Amethod))
   2290         a = A()
   2291         self.assertEqual(dir(a), astuff)
   2292         self.assertIn('im_self', dir(a.Amethod))
   2293         a.adata = 42
   2294         a.amethod = lambda self: 3
   2295         self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
   2296 
   2297         # The same, but with new-style classes.  Since these have object as a
   2298         # base class, a lot more gets sucked in.
   2299         def interesting(strings):
   2300             return [s for s in strings if not s.startswith('_')]
   2301 
   2302         class C(object):
   2303             Cdata = 1
   2304             def Cmethod(self): pass
   2305 
   2306         cstuff = ['Cdata', 'Cmethod']
   2307         self.assertEqual(interesting(dir(C)), cstuff)
   2308 
   2309         c = C()
   2310         self.assertEqual(interesting(dir(c)), cstuff)
   2311         self.assertIn('im_self', dir(C.Cmethod))
   2312 
   2313         c.cdata = 2
   2314         c.cmethod = lambda self: 0
   2315         self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
   2316         self.assertIn('im_self', dir(c.Cmethod))
   2317 
   2318         class A(C):
   2319             Adata = 1
   2320             def Amethod(self): pass
   2321 
   2322         astuff = ['Adata', 'Amethod'] + cstuff
   2323         self.assertEqual(interesting(dir(A)), astuff)
   2324         self.assertIn('im_self', dir(A.Amethod))
   2325         a = A()
   2326         self.assertEqual(interesting(dir(a)), astuff)
   2327         a.adata = 42
   2328         a.amethod = lambda self: 3
   2329         self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
   2330         self.assertIn('im_self', dir(a.Amethod))
   2331 
   2332         # Try a module subclass.
   2333         class M(type(sys)):
   2334             pass
   2335         minstance = M("m")
   2336         minstance.b = 2
   2337         minstance.a = 1
   2338         names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
   2339         self.assertEqual(names, ['a', 'b'])
   2340 
   2341         class M2(M):
   2342             def getdict(self):
   2343                 return "Not a dict!"
   2344             __dict__ = property(getdict)
   2345 
   2346         m2instance = M2("m2")
   2347         m2instance.b = 2
   2348         m2instance.a = 1
   2349         self.assertEqual(m2instance.__dict__, "Not a dict!")
   2350         try:
   2351             dir(m2instance)
   2352         except TypeError:
   2353             pass
   2354 
   2355         # Two essentially featureless objects, just inheriting stuff from
   2356         # object.
   2357         self.assertEqual(dir(NotImplemented), dir(Ellipsis))
   2358         if test_support.check_impl_detail():
   2359             # None differs in PyPy: it has a __nonzero__
   2360             self.assertEqual(dir(None), dir(Ellipsis))
   2361 
   2362         # Nasty test case for proxied objects
   2363         class Wrapper(object):
   2364             def __init__(self, obj):
   2365                 self.__obj = obj
   2366             def __repr__(self):
   2367                 return "Wrapper(%s)" % repr(self.__obj)
   2368             def __getitem__(self, key):
   2369                 return Wrapper(self.__obj[key])
   2370             def __len__(self):
   2371                 return len(self.__obj)
   2372             def __getattr__(self, name):
   2373                 return Wrapper(getattr(self.__obj, name))
   2374 
   2375         class C(object):
   2376             def __getclass(self):
   2377                 return Wrapper(type(self))
   2378             __class__ = property(__getclass)
   2379 
   2380         dir(C()) # This used to segfault
   2381 
   2382     def test_supers(self):
   2383         # Testing super...
   2384 
   2385         class A(object):
   2386             def meth(self, a):
   2387                 return "A(%r)" % a
   2388 
   2389         self.assertEqual(A().meth(1), "A(1)")
   2390 
   2391         class B(A):
   2392             def __init__(self):
   2393                 self.__super = super(B, self)
   2394             def meth(self, a):
   2395                 return "B(%r)" % a + self.__super.meth(a)
   2396 
   2397         self.assertEqual(B().meth(2), "B(2)A(2)")
   2398 
   2399         class C(A):
   2400             def meth(self, a):
   2401                 return "C(%r)" % a + self.__super.meth(a)
   2402         C._C__super = super(C)
   2403 
   2404         self.assertEqual(C().meth(3), "C(3)A(3)")
   2405 
   2406         class D(C, B):
   2407             def meth(self, a):
   2408                 return "D(%r)" % a + super(D, self).meth(a)
   2409 
   2410         self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
   2411 
   2412         # Test for subclassing super
   2413 
   2414         class mysuper(super):
   2415             def __init__(self, *args):
   2416                 return super(mysuper, self).__init__(*args)
   2417 
   2418         class E(D):
   2419             def meth(self, a):
   2420                 return "E(%r)" % a + mysuper(E, self).meth(a)
   2421 
   2422         self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
   2423 
   2424         class F(E):
   2425             def meth(self, a):
   2426                 s = self.__super # == mysuper(F, self)
   2427                 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
   2428         F._F__super = mysuper(F)
   2429 
   2430         self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
   2431 
   2432         # Make sure certain errors are raised
   2433 
   2434         try:
   2435             super(D, 42)
   2436         except TypeError:
   2437             pass
   2438         else:
   2439             self.fail("shouldn't allow super(D, 42)")
   2440 
   2441         try:
   2442             super(D, C())
   2443         except TypeError:
   2444             pass
   2445         else:
   2446             self.fail("shouldn't allow super(D, C())")
   2447 
   2448         try:
   2449             super(D).__get__(12)
   2450         except TypeError:
   2451             pass
   2452         else:
   2453             self.fail("shouldn't allow super(D).__get__(12)")
   2454 
   2455         try:
   2456             super(D).__get__(C())
   2457         except TypeError:
   2458             pass
   2459         else:
   2460             self.fail("shouldn't allow super(D).__get__(C())")
   2461 
   2462         # Make sure data descriptors can be overridden and accessed via super
   2463         # (new feature in Python 2.3)
   2464 
   2465         class DDbase(object):
   2466             def getx(self): return 42
   2467             x = property(getx)
   2468 
   2469         class DDsub(DDbase):
   2470             def getx(self): return "hello"
   2471             x = property(getx)
   2472 
   2473         dd = DDsub()
   2474         self.assertEqual(dd.x, "hello")
   2475         self.assertEqual(super(DDsub, dd).x, 42)
   2476 
   2477         # Ensure that super() lookup of descriptor from classmethod
   2478         # works (SF ID# 743627)
   2479 
   2480         class Base(object):
   2481             aProp = property(lambda self: "foo")
   2482 
   2483         class Sub(Base):
   2484             @classmethod
   2485             def test(klass):
   2486                 return super(Sub,klass).aProp
   2487 
   2488         self.assertEqual(Sub.test(), Base.aProp)
   2489 
   2490         # Verify that super() doesn't allow keyword args
   2491         try:
   2492             super(Base, kw=1)
   2493         except TypeError:
   2494             pass
   2495         else:
   2496             self.assertEqual("super shouldn't accept keyword args")
   2497 
   2498     def test_basic_inheritance(self):
   2499         # Testing inheritance from basic types...
   2500 
   2501         class hexint(int):
   2502             def __repr__(self):
   2503                 return hex(self)
   2504             def __add__(self, other):
   2505                 return hexint(int.__add__(self, other))
   2506             # (Note that overriding __radd__ doesn't work,
   2507             # because the int type gets first dibs.)
   2508         self.assertEqual(repr(hexint(7) + 9), "0x10")
   2509         self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
   2510         a = hexint(12345)
   2511         self.assertEqual(a, 12345)
   2512         self.assertEqual(int(a), 12345)
   2513         self.assertIs(int(a).__class__, int)
   2514         self.assertEqual(hash(a), hash(12345))
   2515         self.assertIs((+a).__class__, int)
   2516         self.assertIs((a >> 0).__class__, int)
   2517         self.assertIs((a << 0).__class__, int)
   2518         self.assertIs((hexint(0) << 12).__class__, int)
   2519         self.assertIs((hexint(0) >> 12).__class__, int)
   2520 
   2521         class octlong(long):
   2522             __slots__ = []
   2523             def __str__(self):
   2524                 s = oct(self)
   2525                 if s[-1] == 'L':
   2526                     s = s[:-1]
   2527                 return s
   2528             def __add__(self, other):
   2529                 return self.__class__(super(octlong, self).__add__(other))
   2530             __radd__ = __add__
   2531         self.assertEqual(str(octlong(3) + 5), "010")
   2532         # (Note that overriding __radd__ here only seems to work
   2533         # because the example uses a short int left argument.)
   2534         self.assertEqual(str(5 + octlong(3000)), "05675")
   2535         a = octlong(12345)
   2536         self.assertEqual(a, 12345L)
   2537         self.assertEqual(long(a), 12345L)
   2538         self.assertEqual(hash(a), hash(12345L))
   2539         self.assertIs(long(a).__class__, long)
   2540         self.assertIs((+a).__class__, long)
   2541         self.assertIs((-a).__class__, long)
   2542         self.assertIs((-octlong(0)).__class__, long)
   2543         self.assertIs((a >> 0).__class__, long)
   2544         self.assertIs((a << 0).__class__, long)
   2545         self.assertIs((a - 0).__class__, long)
   2546         self.assertIs((a * 1).__class__, long)
   2547         self.assertIs((a ** 1).__class__, long)
   2548         self.assertIs((a // 1).__class__, long)
   2549         self.assertIs((1 * a).__class__, long)
   2550         self.assertIs((a | 0).__class__, long)
   2551         self.assertIs((a ^ 0).__class__, long)
   2552         self.assertIs((a & -1L).__class__, long)
   2553         self.assertIs((octlong(0) << 12).__class__, long)
   2554         self.assertIs((octlong(0) >> 12).__class__, long)
   2555         self.assertIs(abs(octlong(0)).__class__, long)
   2556 
   2557         # Because octlong overrides __add__, we can't check the absence of +0
   2558         # optimizations using octlong.
   2559         class longclone(long):
   2560             pass
   2561         a = longclone(1)
   2562         self.assertIs((a + 0).__class__, long)
   2563         self.assertIs((0 + a).__class__, long)
   2564 
   2565         # Check that negative clones don't segfault
   2566         a = longclone(-1)
   2567         self.assertEqual(a.__dict__, {})
   2568         self.assertEqual(long(a), -1)  # self.assertTrue PyNumber_Long() copies the sign bit
   2569 
   2570         class precfloat(float):
   2571             __slots__ = ['prec']
   2572             def __init__(self, value=0.0, prec=12):
   2573                 self.prec = int(prec)
   2574             def __repr__(self):
   2575                 return "%.*g" % (self.prec, self)
   2576         self.assertEqual(repr(precfloat(1.1)), "1.1")
   2577         a = precfloat(12345)
   2578         self.assertEqual(a, 12345.0)
   2579         self.assertEqual(float(a), 12345.0)
   2580         self.assertIs(float(a).__class__, float)
   2581         self.assertEqual(hash(a), hash(12345.0))
   2582         self.assertIs((+a).__class__, float)
   2583 
   2584         class madcomplex(complex):
   2585             def __repr__(self):
   2586                 return "%.17gj%+.17g" % (self.imag, self.real)
   2587         a = madcomplex(-3, 4)
   2588         self.assertEqual(repr(a), "4j-3")
   2589         base = complex(-3, 4)
   2590         self.assertEqual(base.__class__, complex)
   2591         self.assertEqual(a, base)
   2592         self.assertEqual(complex(a), base)
   2593         self.assertEqual(complex(a).__class__, complex)
   2594         a = madcomplex(a)  # just trying another form of the constructor
   2595         self.assertEqual(repr(a), "4j-3")
   2596         self.assertEqual(a, base)
   2597         self.assertEqual(complex(a), base)
   2598         self.assertEqual(complex(a).__class__, complex)
   2599         self.assertEqual(hash(a), hash(base))
   2600         self.assertEqual((+a).__class__, complex)
   2601         self.assertEqual((a + 0).__class__, complex)
   2602         self.assertEqual(a + 0, base)
   2603         self.assertEqual((a - 0).__class__, complex)
   2604         self.assertEqual(a - 0, base)
   2605         self.assertEqual((a * 1).__class__, complex)
   2606         self.assertEqual(a * 1, base)
   2607         self.assertEqual((a / 1).__class__, complex)
   2608         self.assertEqual(a / 1, base)
   2609 
   2610         class madtuple(tuple):
   2611             _rev = None
   2612             def rev(self):
   2613                 if self._rev is not None:
   2614                     return self._rev
   2615                 L = list(self)
   2616                 L.reverse()
   2617                 self._rev = self.__class__(L)
   2618                 return self._rev
   2619         a = madtuple((1,2,3,4,5,6,7,8,9,0))
   2620         self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
   2621         self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
   2622         self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
   2623         for i in range(512):
   2624             t = madtuple(range(i))
   2625             u = t.rev()
   2626             v = u.rev()
   2627             self.assertEqual(v, t)
   2628         a = madtuple((1,2,3,4,5))
   2629         self.assertEqual(tuple(a), (1,2,3,4,5))
   2630         self.assertIs(tuple(a).__class__, tuple)
   2631         self.assertEqual(hash(a), hash((1,2,3,4,5)))
   2632         self.assertIs(a[:].__class__, tuple)
   2633         self.assertIs((a * 1).__class__, tuple)
   2634         self.assertIs((a * 0).__class__, tuple)
   2635         self.assertIs((a + ()).__class__, tuple)
   2636         a = madtuple(())
   2637         self.assertEqual(tuple(a), ())
   2638         self.assertIs(tuple(a).__class__, tuple)
   2639         self.assertIs((a + a).__class__, tuple)
   2640         self.assertIs((a * 0).__class__, tuple)
   2641         self.assertIs((a * 1).__class__, tuple)
   2642         self.assertIs((a * 2).__class__, tuple)
   2643         self.assertIs(a[:].__class__, tuple)
   2644 
   2645         class madstring(str):
   2646             _rev = None
   2647             def rev(self):
   2648                 if self._rev is not None:
   2649                     return self._rev
   2650                 L = list(self)
   2651                 L.reverse()
   2652                 self._rev = self.__class__("".join(L))
   2653                 return self._rev
   2654         s = madstring("abcdefghijklmnopqrstuvwxyz")
   2655         self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
   2656         self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
   2657         self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
   2658         for i in range(256):
   2659             s = madstring("".join(map(chr, range(i))))
   2660             t = s.rev()
   2661             u = t.rev()
   2662             self.assertEqual(u, s)
   2663         s = madstring("12345")
   2664         self.assertEqual(str(s), "12345")
   2665         self.assertIs(str(s).__class__, str)
   2666 
   2667         base = "\x00" * 5
   2668         s = madstring(base)
   2669         self.assertEqual(s, base)
   2670         self.assertEqual(str(s), base)
   2671         self.assertIs(str(s).__class__, str)
   2672         self.assertEqual(hash(s), hash(base))
   2673         self.assertEqual({s: 1}[base], 1)
   2674         self.assertEqual({base: 1}[s], 1)
   2675         self.assertIs((s + "").__class__, str)
   2676         self.assertEqual(s + "", base)
   2677         self.assertIs(("" + s).__class__, str)
   2678         self.assertEqual("" + s, base)
   2679         self.assertIs((s * 0).__class__, str)
   2680         self.assertEqual(s * 0, "")
   2681         self.assertIs((s * 1).__class__, str)
   2682         self.assertEqual(s * 1, base)
   2683         self.assertIs((s * 2).__class__, str)
   2684         self.assertEqual(s * 2, base + base)
   2685         self.assertIs(s[:].__class__, str)
   2686         self.assertEqual(s[:], base)
   2687         self.assertIs(s[0:0].__class__, str)
   2688         self.assertEqual(s[0:0], "")
   2689         self.assertIs(s.strip().__class__, str)
   2690         self.assertEqual(s.strip(), base)
   2691         self.assertIs(s.lstrip().__class__, str)
   2692         self.assertEqual(s.lstrip(), base)
   2693         self.assertIs(s.rstrip().__class__, str)
   2694         self.assertEqual(s.rstrip(), base)
   2695         identitytab = ''.join([chr(i) for i in range(256)])
   2696         self.assertIs(s.translate(identitytab).__class__, str)
   2697         self.assertEqual(s.translate(identitytab), base)
   2698         self.assertIs(s.translate(identitytab, "x").__class__, str)
   2699         self.assertEqual(s.translate(identitytab, "x"), base)
   2700         self.assertEqual(s.translate(identitytab, "\x00"), "")
   2701         self.assertIs(s.replace("x", "x").__class__, str)
   2702         self.assertEqual(s.replace("x", "x"), base)
   2703         self.assertIs(s.ljust(len(s)).__class__, str)
   2704         self.assertEqual(s.ljust(len(s)), base)
   2705         self.assertIs(s.rjust(len(s)).__class__, str)
   2706         self.assertEqual(s.rjust(len(s)), base)
   2707         self.assertIs(s.center(len(s)).__class__, str)
   2708         self.assertEqual(s.center(len(s)), base)
   2709         self.assertIs(s.lower().__class__, str)
   2710         self.assertEqual(s.lower(), base)
   2711 
   2712         class madunicode(unicode):
   2713             _rev = None
   2714             def rev(self):
   2715                 if self._rev is not None:
   2716                     return self._rev
   2717                 L = list(self)
   2718                 L.reverse()
   2719                 self._rev = self.__class__(u"".join(L))
   2720                 return self._rev
   2721         u = madunicode("ABCDEF")
   2722         self.assertEqual(u, u"ABCDEF")
   2723         self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
   2724         self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
   2725         base = u"12345"
   2726         u = madunicode(base)
   2727         self.assertEqual(unicode(u), base)
   2728         self.assertIs(unicode(u).__class__, unicode)
   2729         self.assertEqual(hash(u), hash(base))
   2730         self.assertEqual({u: 1}[base], 1)
   2731         self.assertEqual({base: 1}[u], 1)
   2732         self.assertIs(u.strip().__class__, unicode)
   2733         self.assertEqual(u.strip(), base)
   2734         self.assertIs(u.lstrip().__class__, unicode)
   2735         self.assertEqual(u.lstrip(), base)
   2736         self.assertIs(u.rstrip().__class__, unicode)
   2737         self.assertEqual(u.rstrip(), base)
   2738         self.assertIs(u.replace(u"x", u"x").__class__, unicode)
   2739         self.assertEqual(u.replace(u"x", u"x"), base)
   2740         self.assertIs(u.replace(u"xy", u"xy").__class__, unicode)
   2741         self.assertEqual(u.replace(u"xy", u"xy"), base)
   2742         self.assertIs(u.center(len(u)).__class__, unicode)
   2743         self.assertEqual(u.center(len(u)), base)
   2744         self.assertIs(u.ljust(len(u)).__class__, unicode)
   2745         self.assertEqual(u.ljust(len(u)), base)
   2746         self.assertIs(u.rjust(len(u)).__class__, unicode)
   2747         self.assertEqual(u.rjust(len(u)), base)
   2748         self.assertIs(u.lower().__class__, unicode)
   2749         self.assertEqual(u.lower(), base)
   2750         self.assertIs(u.upper().__class__, unicode)
   2751         self.assertEqual(u.upper(), base)
   2752         self.assertIs(u.capitalize().__class__, unicode)
   2753         self.assertEqual(u.capitalize(), base)
   2754         self.assertIs(u.title().__class__, unicode)
   2755         self.assertEqual(u.title(), base)
   2756         self.assertIs((u + u"").__class__, unicode)
   2757         self.assertEqual(u + u"", base)
   2758         self.assertIs((u"" + u).__class__, unicode)
   2759         self.assertEqual(u"" + u, base)
   2760         self.assertIs((u * 0).__class__, unicode)
   2761         self.assertEqual(u * 0, u"")
   2762         self.assertIs((u * 1).__class__, unicode)
   2763         self.assertEqual(u * 1, base)
   2764         self.assertIs((u * 2).__class__, unicode)
   2765         self.assertEqual(u * 2, base + base)
   2766         self.assertIs(u[:].__class__, unicode)
   2767         self.assertEqual(u[:], base)
   2768         self.assertIs(u[0:0].__class__, unicode)
   2769         self.assertEqual(u[0:0], u"")
   2770 
   2771         class sublist(list):
   2772             pass
   2773         a = sublist(range(5))
   2774         self.assertEqual(a, range(5))
   2775         a.append("hello")
   2776         self.assertEqual(a, range(5) + ["hello"])
   2777         a[5] = 5
   2778         self.assertEqual(a, range(6))
   2779         a.extend(range(6, 20))
   2780         self.assertEqual(a, range(20))
   2781         a[-5:] = []
   2782         self.assertEqual(a, range(15))
   2783         del a[10:15]
   2784         self.assertEqual(len(a), 10)
   2785         self.assertEqual(a, range(10))
   2786         self.assertEqual(list(a), range(10))
   2787         self.assertEqual(a[0], 0)
   2788         self.assertEqual(a[9], 9)
   2789         self.assertEqual(a[-10], 0)
   2790         self.assertEqual(a[-1], 9)
   2791         self.assertEqual(a[:5], range(5))
   2792 
   2793         class CountedInput(file):
   2794             """Counts lines read by self.readline().
   2795 
   2796             self.lineno is the 0-based ordinal of the last line read, up to
   2797             a maximum of one greater than the number of lines in the file.
   2798 
   2799             self.ateof is true if and only if the final "" line has been read,
   2800             at which point self.lineno stops incrementing, and further calls
   2801             to readline() continue to return "".
   2802             """
   2803 
   2804             lineno = 0
   2805             ateof = 0
   2806             def readline(self):
   2807                 if self.ateof:
   2808                     return ""
   2809                 s = file.readline(self)
   2810                 # Next line works too.
   2811                 # s = super(CountedInput, self).readline()
   2812                 self.lineno += 1
   2813                 if s == "":
   2814                     self.ateof = 1
   2815                 return s
   2816 
   2817         f = file(name=test_support.TESTFN, mode='w')
   2818         lines = ['a\n', 'b\n', 'c\n']
   2819         try:
   2820             f.writelines(lines)
   2821             f.close()
   2822             f = CountedInput(test_support.TESTFN)
   2823             for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
   2824                 got = f.readline()
   2825                 self.assertEqual(expected, got)
   2826                 self.assertEqual(f.lineno, i)
   2827                 self.assertEqual(f.ateof, (i > len(lines)))
   2828             f.close()
   2829         finally:
   2830             try:
   2831                 f.close()
   2832             except:
   2833                 pass
   2834             test_support.unlink(test_support.TESTFN)
   2835 
   2836     def test_keywords(self):
   2837         # Testing keyword args to basic type constructors ...
   2838         self.assertEqual(int(x=1), 1)
   2839         self.assertEqual(float(x=2), 2.0)
   2840         self.assertEqual(long(x=3), 3L)
   2841         self.assertEqual(complex(imag=42, real=666), complex(666, 42))
   2842         self.assertEqual(str(object=500), '500')
   2843         self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
   2844         self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
   2845         self.assertEqual(list(sequence=(0, 1, 2)), range(3))
   2846         # note: as of Python 2.3, dict() no longer has an "items" keyword arg
   2847 
   2848         for constructor in (int, float, long, complex, str, unicode,
   2849                             tuple, list, file):
   2850             try:
   2851                 constructor(bogus_keyword_arg=1)
   2852             except TypeError:
   2853                 pass
   2854             else:
   2855                 self.fail("expected TypeError from bogus keyword argument to %r"
   2856                             % constructor)
   2857 
   2858     def test_str_subclass_as_dict_key(self):
   2859         # Testing a str subclass used as dict key ..
   2860 
   2861         class cistr(str):
   2862             """Sublcass of str that computes __eq__ case-insensitively.
   2863 
   2864             Also computes a hash code of the string in canonical form.
   2865             """
   2866 
   2867             def __init__(self, value):
   2868                 self.canonical = value.lower()
   2869                 self.hashcode = hash(self.canonical)
   2870 
   2871             def __eq__(self, other):
   2872                 if not isinstance(other, cistr):
   2873                     other = cistr(other)
   2874                 return self.canonical == other.canonical
   2875 
   2876             def __hash__(self):
   2877                 return self.hashcode
   2878 
   2879         self.assertEqual(cistr('ABC'), 'abc')
   2880         self.assertEqual('aBc', cistr('ABC'))
   2881         self.assertEqual(str(cistr('ABC')), 'ABC')
   2882 
   2883         d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
   2884         self.assertEqual(d[cistr('one')], 1)
   2885         self.assertEqual(d[cistr('tWo')], 2)
   2886         self.assertEqual(d[cistr('THrEE')], 3)
   2887         self.assertIn(cistr('ONe'), d)
   2888         self.assertEqual(d.get(cistr('thrEE')), 3)
   2889 
   2890     def test_classic_comparisons(self):
   2891         # Testing classic comparisons...
   2892         class classic:
   2893             pass
   2894 
   2895         for base in (classic, int, object):
   2896             class C(base):
   2897                 def __init__(self, value):
   2898                     self.value = int(value)
   2899                 def __cmp__(self, other):
   2900                     if isinstance(other, C):
   2901                         return cmp(self.value, other.value)
   2902                     if isinstance(other, int) or isinstance(other, long):
   2903                         return cmp(self.value, other)
   2904                     return NotImplemented
   2905                 __hash__ = None # Silence Py3k warning
   2906 
   2907             c1 = C(1)
   2908             c2 = C(2)
   2909             c3 = C(3)
   2910             self.assertEqual(c1, 1)
   2911             c = {1: c1, 2: c2, 3: c3}
   2912             for x in 1, 2, 3:
   2913                 for y in 1, 2, 3:
   2914                     self.assertEqual(cmp(c[x], c[y]), cmp(x, y),
   2915                                      "x=%d, y=%d" % (x, y))
   2916                     for op in "<", "<=", "==", "!=", ">", ">=":
   2917                         self.assertEqual(eval("c[x] %s c[y]" % op),
   2918                                          eval("x %s y" % op),
   2919                                          "x=%d, y=%d" % (x, y))
   2920                     self.assertEqual(cmp(c[x], y), cmp(x, y),
   2921                                      "x=%d, y=%d" % (x, y))
   2922                     self.assertEqual(cmp(x, c[y]), cmp(x, y),
   2923                                      "x=%d, y=%d" % (x, y))
   2924 
   2925     def test_rich_comparisons(self):
   2926         # Testing rich comparisons...
   2927         class Z(complex):
   2928             pass
   2929         z = Z(1)
   2930         self.assertEqual(z, 1+0j)
   2931         self.assertEqual(1+0j, z)
   2932         class ZZ(complex):
   2933             def __eq__(self, other):
   2934                 try:
   2935                     return abs(self - other) <= 1e-6
   2936                 except:
   2937                     return NotImplemented
   2938             __hash__ = None # Silence Py3k warning
   2939         zz = ZZ(1.0000003)
   2940         self.assertEqual(zz, 1+0j)
   2941         self.assertEqual(1+0j, zz)
   2942 
   2943         class classic:
   2944             pass
   2945         for base in (classic, int, object, list):
   2946             class C(base):
   2947                 def __init__(self, value):
   2948                     self.value = int(value)
   2949                 def __cmp__(self_, other):
   2950                     self.fail("shouldn't call __cmp__")
   2951                 __hash__ = None # Silence Py3k warning
   2952                 def __eq__(self, other):
   2953                     if isinstance(other, C):
   2954                         return self.value == other.value
   2955                     if isinstance(other, int) or isinstance(other, long):
   2956                         return self.value == other
   2957                     return NotImplemented
   2958                 def __ne__(self, other):
   2959                     if isinstance(other, C):
   2960                         return self.value != other.value
   2961                     if isinstance(other, int) or isinstance(other, long):
   2962                         return self.value != other
   2963                     return NotImplemented
   2964                 def __lt__(self, other):
   2965                     if isinstance(other, C):
   2966                         return self.value < other.value
   2967                     if isinstance(other, int) or isinstance(other, long):
   2968                         return self.value < other
   2969                     return NotImplemented
   2970                 def __le__(self, other):
   2971                     if isinstance(other, C):
   2972                         return self.value <= other.value
   2973                     if isinstance(other, int) or isinstance(other, long):
   2974                         return self.value <= other
   2975                     return NotImplemented
   2976                 def __gt__(self, other):
   2977                     if isinstance(other, C):
   2978                         return self.value > other.value
   2979                     if isinstance(other, int) or isinstance(other, long):
   2980                         return self.value > other
   2981                     return NotImplemented
   2982                 def __ge__(self, other):
   2983                     if isinstance(other, C):
   2984                         return self.value >= other.value
   2985                     if isinstance(other, int) or isinstance(other, long):
   2986                         return self.value >= other
   2987                     return NotImplemented
   2988             c1 = C(1)
   2989             c2 = C(2)
   2990             c3 = C(3)
   2991             self.assertEqual(c1, 1)
   2992             c = {1: c1, 2: c2, 3: c3}
   2993             for x in 1, 2, 3:
   2994                 for y in 1, 2, 3:
   2995                     for op in "<", "<=", "==", "!=", ">", ">=":
   2996                         self.assertEqual(eval("c[x] %s c[y]" % op),
   2997                                          eval("x %s y" % op),
   2998                                          "x=%d, y=%d" % (x, y))
   2999                         self.assertEqual(eval("c[x] %s y" % op),
   3000                                          eval("x %s y" % op),
   3001                                          "x=%d, y=%d" % (x, y))
   3002                         self.assertEqual(eval("x %s c[y]" % op),
   3003                                          eval("x %s y" % op),
   3004                                          "x=%d, y=%d" % (x, y))
   3005 
   3006     def test_coercions(self):
   3007         # Testing coercions...
   3008         class I(int): pass
   3009         coerce(I(0), 0)
   3010         coerce(0, I(0))
   3011         class L(long): pass
   3012         coerce(L(0), 0)
   3013         coerce(L(0), 0L)
   3014         coerce(0, L(0))
   3015         coerce(0L, L(0))
   3016         class F(float): pass
   3017         coerce(F(0), 0)
   3018         coerce(F(0), 0L)
   3019         coerce(F(0), 0.)
   3020         coerce(0, F(0))
   3021         coerce(0L, F(0))
   3022         coerce(0., F(0))
   3023         class C(complex): pass
   3024         coerce(C(0), 0)
   3025         coerce(C(0), 0L)
   3026         coerce(C(0), 0.)
   3027         coerce(C(0), 0j)
   3028         coerce(0, C(0))
   3029         coerce(0L, C(0))
   3030         coerce(0., C(0))
   3031         coerce(0j, C(0))
   3032 
   3033     def test_descrdoc(self):
   3034         # Testing descriptor doc strings...
   3035         def check(descr, what):
   3036             self.assertEqual(descr.__doc__, what)
   3037         check(file.closed, "True if the file is closed") # getset descriptor
   3038         check(file.name, "file name") # member descriptor
   3039 
   3040     def test_doc_descriptor(self):
   3041         # Testing __doc__ descriptor...
   3042         # SF bug 542984
   3043         class DocDescr(object):
   3044             def __get__(self, object, otype):
   3045                 if object:
   3046                     object = object.__class__.__name__ + ' instance'
   3047                 if otype:
   3048                     otype = otype.__name__
   3049                 return 'object=%s; type=%s' % (object, otype)
   3050         class OldClass:
   3051             __doc__ = DocDescr()
   3052         class NewClass(object):
   3053             __doc__ = DocDescr()
   3054         self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
   3055         self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
   3056         self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
   3057         self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
   3058 
   3059     def test_set_class(self):
   3060         # Testing __class__ assignment...
   3061         class C(object): pass
   3062         class D(object): pass
   3063         class E(object): pass
   3064         class F(D, E): pass
   3065         for cls in C, D, E, F:
   3066             for cls2 in C, D, E, F:
   3067                 x = cls()
   3068                 x.__class__ = cls2
   3069                 self.assertIs(x.__class__, cls2)
   3070                 x.__class__ = cls
   3071                 self.assertIs(x.__class__, cls)
   3072         def cant(x, C):
   3073             try:
   3074                 x.__class__ = C
   3075             except TypeError:
   3076                 pass
   3077             else:
   3078                 self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
   3079             try:
   3080                 delattr(x, "__class__")
   3081             except (TypeError, AttributeError):
   3082                 pass
   3083             else:
   3084                 self.fail("shouldn't allow del %r.__class__" % x)
   3085         cant(C(), list)
   3086         cant(list(), C)
   3087         cant(C(), 1)
   3088         cant(C(), object)
   3089         cant(object(), list)
   3090         cant(list(), object)
   3091         class Int(int): __slots__ = []
   3092         cant(2, Int)
   3093         cant(Int(), int)
   3094         cant(True, int)
   3095         cant(2, bool)
   3096         o = object()
   3097         cant(o, type(1))
   3098         cant(o, type(None))
   3099         del o
   3100         class G(object):
   3101             __slots__ = ["a", "b"]
   3102         class H(object):
   3103             __slots__ = ["b", "a"]
   3104         try:
   3105             unicode
   3106         except NameError:
   3107             class I(object):
   3108                 __slots__ = ["a", "b"]
   3109         else:
   3110             class I(object):
   3111                 __slots__ = [unicode("a"), unicode("b")]
   3112         class J(object):
   3113             __slots__ = ["c", "b"]
   3114         class K(object):
   3115             __slots__ = ["a", "b", "d"]
   3116         class L(H):
   3117             __slots__ = ["e"]
   3118         class M(I):
   3119             __slots__ = ["e"]
   3120         class N(J):
   3121             __slots__ = ["__weakref__"]
   3122         class P(J):
   3123             __slots__ = ["__dict__"]
   3124         class Q(J):
   3125             pass
   3126         class R(J):
   3127             __slots__ = ["__dict__", "__weakref__"]
   3128 
   3129         for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
   3130             x = cls()
   3131             x.a = 1
   3132             x.__class__ = cls2
   3133             self.assertIs(x.__class__, cls2,
   3134                    "assigning %r as __class__ for %r silently failed" % (cls2, x))
   3135             self.assertEqual(x.a, 1)
   3136             x.__class__ = cls
   3137             self.assertIs(x.__class__, cls,
   3138                    "assigning %r as __class__ for %r silently failed" % (cls, x))
   3139             self.assertEqual(x.a, 1)
   3140         for cls in G, J, K, L, M, N, P, R, list, Int:
   3141             for cls2 in G, J, K, L, M, N, P, R, list, Int:
   3142                 if cls is cls2:
   3143                     continue
   3144                 cant(cls(), cls2)
   3145 
   3146         # Issue5283: when __class__ changes in __del__, the wrong
   3147         # type gets DECREF'd.
   3148         class O(object):
   3149             pass
   3150         class A(object):
   3151             def __del__(self):
   3152                 self.__class__ = O
   3153         l = [A() for x in range(100)]
   3154         del l
   3155 
   3156     def test_set_dict(self):
   3157         # Testing __dict__ assignment...
   3158         class C(object): pass
   3159         a = C()
   3160         a.__dict__ = {'b': 1}
   3161         self.assertEqual(a.b, 1)
   3162         def cant(x, dict):
   3163             try:
   3164                 x.__dict__ = dict
   3165             except (AttributeError, TypeError):
   3166                 pass
   3167             else:
   3168                 self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
   3169         cant(a, None)
   3170         cant(a, [])
   3171         cant(a, 1)
   3172         del a.__dict__ # Deleting __dict__ is allowed
   3173 
   3174         class Base(object):
   3175             pass
   3176         def verify_dict_readonly(x):
   3177             """
   3178             x has to be an instance of a class inheriting from Base.
   3179             """
   3180             cant(x, {})
   3181             try:
   3182                 del x.__dict__
   3183             except (AttributeError, TypeError):
   3184                 pass
   3185             else:
   3186                 self.fail("shouldn't allow del %r.__dict__" % x)
   3187             dict_descr = Base.__dict__["__dict__"]
   3188             try:
   3189                 dict_descr.__set__(x, {})
   3190             except (AttributeError, TypeError):
   3191                 pass
   3192             else:
   3193                 self.fail("dict_descr allowed access to %r's dict" % x)
   3194 
   3195         # Classes don't allow __dict__ assignment and have readonly dicts
   3196         class Meta1(type, Base):
   3197             pass
   3198         class Meta2(Base, type):
   3199             pass
   3200         class D(object):
   3201             __metaclass__ = Meta1
   3202         class E(object):
   3203             __metaclass__ = Meta2
   3204         for cls in C, D, E:
   3205             verify_dict_readonly(cls)
   3206             class_dict = cls.__dict__
   3207             try:
   3208                 class_dict["spam"] = "eggs"
   3209             except TypeError:
   3210                 pass
   3211             else:
   3212                 self.fail("%r's __dict__ can be modified" % cls)
   3213 
   3214         # Modules also disallow __dict__ assignment
   3215         class Module1(types.ModuleType, Base):
   3216             pass
   3217         class Module2(Base, types.ModuleType):
   3218             pass
   3219         for ModuleType in Module1, Module2:
   3220             mod = ModuleType("spam")
   3221             verify_dict_readonly(mod)
   3222             mod.__dict__["spam"] = "eggs"
   3223 
   3224         # Exception's __dict__ can be replaced, but not deleted
   3225         # (at least not any more than regular exception's __dict__ can
   3226         # be deleted; on CPython it is not the case, whereas on PyPy they
   3227         # can, just like any other new-style instance's __dict__.)
   3228         def can_delete_dict(e):
   3229             try:
   3230                 del e.__dict__
   3231             except (TypeError, AttributeError):
   3232                 return False
   3233             else:
   3234                 return True
   3235         class Exception1(Exception, Base):
   3236             pass
   3237         class Exception2(Base, Exception):
   3238             pass
   3239         for ExceptionType in Exception, Exception1, Exception2:
   3240             e = ExceptionType()
   3241             e.__dict__ = {"a": 1}
   3242             self.assertEqual(e.a, 1)
   3243             self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
   3244 
   3245     def test_pickles(self):
   3246         # Testing pickling and copying new-style classes and objects...
   3247         import pickle, cPickle
   3248 
   3249         def sorteditems(d):
   3250             L = d.items()
   3251             L.sort()
   3252             return L
   3253 
   3254         global C
   3255         class C(object):
   3256             def __init__(self, a, b):
   3257                 super(C, self).__init__()
   3258                 self.a = a
   3259                 self.b = b
   3260             def __repr__(self):
   3261                 return "C(%r, %r)" % (self.a, self.b)
   3262 
   3263         global C1
   3264         class C1(list):
   3265             def __new__(cls, a, b):
   3266                 return super(C1, cls).__new__(cls)
   3267             def __getnewargs__(self):
   3268                 return (self.a, self.b)
   3269             def __init__(self, a, b):
   3270                 self.a = a
   3271                 self.b = b
   3272             def __repr__(self):
   3273                 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
   3274 
   3275         global C2
   3276         class C2(int):
   3277             def __new__(cls, a, b, val=0):
   3278                 return super(C2, cls).__new__(cls, val)
   3279             def __getnewargs__(self):
   3280                 return (self.a, self.b, int(self))
   3281             def __init__(self, a, b, val=0):
   3282                 self.a = a
   3283                 self.b = b
   3284             def __repr__(self):
   3285                 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
   3286 
   3287         global C3
   3288         class C3(object):
   3289             def __init__(self, foo):
   3290                 self.foo = foo
   3291             def __getstate__(self):
   3292                 return self.foo
   3293             def __setstate__(self, foo):
   3294                 self.foo = foo
   3295 
   3296         global C4classic, C4
   3297         class C4classic: # classic
   3298             pass
   3299         class C4(C4classic, object): # mixed inheritance
   3300             pass
   3301 
   3302         for p in pickle, cPickle:
   3303             for bin in range(p.HIGHEST_PROTOCOL + 1):
   3304                 for cls in C, C1, C2:
   3305                     s = p.dumps(cls, bin)
   3306                     cls2 = p.loads(s)
   3307                     self.assertIs(cls2, cls)
   3308 
   3309                 a = C1(1, 2); a.append(42); a.append(24)
   3310                 b = C2("hello", "world", 42)
   3311                 s = p.dumps((a, b), bin)
   3312                 x, y = p.loads(s)
   3313                 self.assertEqual(x.__class__, a.__class__)
   3314                 self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
   3315                 self.assertEqual(y.__class__, b.__class__)
   3316                 self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
   3317                 self.assertEqual(repr(x), repr(a))
   3318                 self.assertEqual(repr(y), repr(b))
   3319                 # Test for __getstate__ and __setstate__ on new style class
   3320                 u = C3(42)
   3321                 s = p.dumps(u, bin)
   3322                 v = p.loads(s)
   3323                 self.assertEqual(u.__class__, v.__class__)
   3324                 self.assertEqual(u.foo, v.foo)
   3325                 # Test for picklability of hybrid class
   3326                 u = C4()
   3327                 u.foo = 42
   3328                 s = p.dumps(u, bin)
   3329                 v = p.loads(s)
   3330                 self.assertEqual(u.__class__, v.__class__)
   3331                 self.assertEqual(u.foo, v.foo)
   3332 
   3333         # Testing copy.deepcopy()
   3334         import copy
   3335         for cls in C, C1, C2:
   3336             cls2 = copy.deepcopy(cls)
   3337             self.assertIs(cls2, cls)
   3338 
   3339         a = C1(1, 2); a.append(42); a.append(24)
   3340         b = C2("hello", "world", 42)
   3341         x, y = copy.deepcopy((a, b))
   3342         self.assertEqual(x.__class__, a.__class__)
   3343         self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
   3344         self.assertEqual(y.__class__, b.__class__)
   3345         self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
   3346         self.assertEqual(repr(x), repr(a))
   3347         self.assertEqual(repr(y), repr(b))
   3348 
   3349     def test_pickle_slots(self):
   3350         # Testing pickling of classes with __slots__ ...
   3351         import pickle, cPickle
   3352         # Pickling of classes with __slots__ but without __getstate__ should fail
   3353         global B, C, D, E
   3354         class B(object):
   3355             pass
   3356         for base in [object, B]:
   3357             class C(base):
   3358                 __slots__ = ['a']
   3359             class D(C):
   3360                 pass
   3361             for proto in range(2):
   3362                 try:
   3363                     pickle.dumps(C(), proto)
   3364                 except TypeError:
   3365                     pass
   3366                 else:
   3367                     self.fail("should fail: pickle C instance - %s" % base)
   3368                 try:
   3369                     cPickle.dumps(C(), proto)
   3370                 except TypeError:
   3371                     pass
   3372                 else:
   3373                     self.fail("should fail: cPickle C instance - %s" % base)
   3374                 try:
   3375                     pickle.dumps(C(), proto)
   3376                 except TypeError:
   3377                     pass
   3378                 else:
   3379                     self.fail("should fail: pickle D instance - %s" % base)
   3380                 try:
   3381                     cPickle.dumps(D(), proto)
   3382                 except TypeError:
   3383                     pass
   3384                 else:
   3385                     self.fail("should fail: cPickle D instance - %s" % base)
   3386             # Give C a nice generic __getstate__ and __setstate__
   3387             class C(base):
   3388                 __slots__ = ['a']
   3389                 def __getstate__(self):
   3390                     try:
   3391                         d = self.__dict__.copy()
   3392                     except AttributeError:
   3393                         d = {}
   3394                     for cls in self.__class__.__mro__:
   3395                         for sn in cls.__dict__.get('__slots__', ()):
   3396                             try:
   3397                                 d[sn] = getattr(self, sn)
   3398                             except AttributeError:
   3399                                 pass
   3400                     return d
   3401                 def __setstate__(self, d):
   3402                     for k, v in d.items():
   3403                         setattr(self, k, v)
   3404             class D(C):
   3405                 pass
   3406             # Now it should work
   3407             x = C()
   3408             for proto in range(pickle.HIGHEST_PROTOCOL + 1):
   3409                 y = pickle.loads(pickle.dumps(x, proto))
   3410                 self.assertNotHasAttr(y, 'a')
   3411                 y = cPickle.loads(cPickle.dumps(x, proto))
   3412                 self.assertNotHasAttr(y, 'a')
   3413             x.a = 42
   3414             for proto in range(pickle.HIGHEST_PROTOCOL + 1):
   3415                 y = pickle.loads(pickle.dumps(x, proto))
   3416                 self.assertEqual(y.a, 42)
   3417                 y = cPickle.loads(cPickle.dumps(x, proto))
   3418                 self.assertEqual(y.a, 42)
   3419             x = D()
   3420             x.a = 42
   3421             x.b = 100
   3422             for proto in range(pickle.HIGHEST_PROTOCOL + 1):
   3423                 y = pickle.loads(pickle.dumps(x, proto))
   3424                 self.assertEqual(y.a + y.b, 142)
   3425                 y = cPickle.loads(cPickle.dumps(x, proto))
   3426                 self.assertEqual(y.a + y.b, 142)
   3427             # A subclass that adds a slot should also work
   3428             class E(C):
   3429                 __slots__ = ['b']
   3430             x = E()
   3431             x.a = 42
   3432             x.b = "foo"
   3433             for proto in range(pickle.HIGHEST_PROTOCOL + 1):
   3434                 y = pickle.loads(pickle.dumps(x, proto))
   3435                 self.assertEqual(y.a, x.a)
   3436                 self.assertEqual(y.b, x.b)
   3437                 y = cPickle.loads(cPickle.dumps(x, proto))
   3438                 self.assertEqual(y.a, x.a)
   3439                 self.assertEqual(y.b, x.b)
   3440 
   3441     def test_binary_operator_override(self):
   3442         # Testing overrides of binary operations...
   3443         class I(int):
   3444             def __repr__(self):
   3445                 return "I(%r)" % int(self)
   3446             def __add__(self, other):
   3447                 return I(int(self) + int(other))
   3448             __radd__ = __add__
   3449             def __pow__(self, other, mod=None):
   3450                 if mod is None:
   3451                     return I(pow(int(self), int(other)))
   3452                 else:
   3453                     return I(pow(int(self), int(other), int(mod)))
   3454             def __rpow__(self, other, mod=None):
   3455                 if mod is None:
   3456                     return I(pow(int(other), int(self), mod))
   3457                 else:
   3458                     return I(pow(int(other), int(self), int(mod)))
   3459 
   3460         self.assertEqual(repr(I(1) + I(2)), "I(3)")
   3461         self.assertEqual(repr(I(1) + 2), "I(3)")
   3462         self.assertEqual(repr(1 + I(2)), "I(3)")
   3463         self.assertEqual(repr(I(2) ** I(3)), "I(8)")
   3464         self.assertEqual(repr(2 ** I(3)), "I(8)")
   3465         self.assertEqual(repr(I(2) ** 3), "I(8)")
   3466         self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
   3467         class S(str):
   3468             def __eq__(self, other):
   3469                 return self.lower() == other.lower()
   3470             __hash__ = None # Silence Py3k warning
   3471 
   3472     def test_subclass_propagation(self):
   3473         # Testing propagation of slot functions to subclasses...
   3474         class A(object):
   3475             pass
   3476         class B(A):
   3477             pass
   3478         class C(A):
   3479             pass
   3480         class D(B, C):
   3481             pass
   3482         d = D()
   3483         orig_hash = hash(d) # related to id(d) in platform-dependent ways
   3484         A.__hash__ = lambda self: 42
   3485         self.assertEqual(hash(d), 42)
   3486         C.__hash__ = lambda self: 314
   3487         self.assertEqual(hash(d), 314)
   3488         B.__hash__ = lambda self: 144
   3489         self.assertEqual(hash(d), 144)
   3490         D.__hash__ = lambda self: 100
   3491         self.assertEqual(hash(d), 100)
   3492         D.__hash__ = None
   3493         self.assertRaises(TypeError, hash, d)
   3494         del D.__hash__
   3495         self.assertEqual(hash(d), 144)
   3496         B.__hash__ = None
   3497         self.assertRaises(TypeError, hash, d)
   3498         del B.__hash__
   3499         self.assertEqual(hash(d), 314)
   3500         C.__hash__ = None
   3501         self.assertRaises(TypeError, hash, d)
   3502         del C.__hash__
   3503         self.assertEqual(hash(d), 42)
   3504         A.__hash__ = None
   3505         self.assertRaises(TypeError, hash, d)
   3506         del A.__hash__
   3507         self.assertEqual(hash(d), orig_hash)
   3508         d.foo = 42
   3509         d.bar = 42
   3510         self.assertEqual(d.foo, 42)
   3511         self.assertEqual(d.bar, 42)
   3512         def __getattribute__(self, name):
   3513             if name == "foo":
   3514                 return 24
   3515             return object.__getattribute__(self, name)
   3516         A.__getattribute__ = __getattribute__
   3517         self.assertEqual(d.foo, 24)
   3518         self.assertEqual(d.bar, 42)
   3519         def __getattr__(self, name):
   3520             if name in ("spam", "foo", "bar"):
   3521                 return "hello"
   3522             raise AttributeError, name
   3523         B.__getattr__ = __getattr__
   3524         self.assertEqual(d.spam, "hello")
   3525         self.assertEqual(d.foo, 24)
   3526         self.assertEqual(d.bar, 42)
   3527         del A.__getattribute__
   3528         self.assertEqual(d.foo, 42)
   3529         del d.foo
   3530         self.assertEqual(d.foo, "hello")
   3531         self.assertEqual(d.bar, 42)
   3532         del B.__getattr__
   3533         try:
   3534             d.foo
   3535         except AttributeError:
   3536             pass
   3537         else:
   3538             self.fail("d.foo should be undefined now")
   3539 
   3540         # Test a nasty bug in recurse_down_subclasses()
   3541         class A(object):
   3542             pass
   3543         class B(A):
   3544             pass
   3545         del B
   3546         test_support.gc_collect()
   3547         A.__setitem__ = lambda *a: None # crash
   3548 
   3549     def test_buffer_inheritance(self):
   3550         # Testing that buffer interface is inherited ...
   3551 
   3552         import binascii
   3553         # SF bug [#470040] ParseTuple t# vs subclasses.
   3554 
   3555         class MyStr(str):
   3556             pass
   3557         base = 'abc'
   3558         m = MyStr(base)
   3559         # b2a_hex uses the buffer interface to get its argument's value, via
   3560         # PyArg_ParseTuple 't#' code.
   3561         self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
   3562 
   3563         # It's not clear that unicode will continue to support the character
   3564         # buffer interface, and this test will fail if that's taken away.
   3565         class MyUni(unicode):
   3566             pass
   3567         base = u'abc'
   3568         m = MyUni(base)
   3569         self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
   3570 
   3571         class MyInt(int):
   3572             pass
   3573         m = MyInt(42)
   3574         try:
   3575             binascii.b2a_hex(m)
   3576             self.fail('subclass of int should not have a buffer interface')
   3577         except TypeError:
   3578             pass
   3579 
   3580     def test_str_of_str_subclass(self):
   3581         # Testing __str__ defined in subclass of str ...
   3582         import binascii
   3583         import cStringIO
   3584 
   3585         class octetstring(str):
   3586             def __str__(self):
   3587                 return binascii.b2a_hex(self)
   3588             def __repr__(self):
   3589                 return self + " repr"
   3590 
   3591         o = octetstring('A')
   3592         self.assertEqual(type(o), octetstring)
   3593         self.assertEqual(type(str(o)), str)
   3594         self.assertEqual(type(repr(o)), str)
   3595         self.assertEqual(ord(o), 0x41)
   3596         self.assertEqual(str(o), '41')
   3597         self.assertEqual(repr(o), 'A repr')
   3598         self.assertEqual(o.__str__(), '41')
   3599         self.assertEqual(o.__repr__(), 'A repr')
   3600 
   3601         capture = cStringIO.StringIO()
   3602         # Calling str() or not exercises different internal paths.
   3603         print >> capture, o
   3604         print >> capture, str(o)
   3605         self.assertEqual(capture.getvalue(), '41\n41\n')
   3606         capture.close()
   3607 
   3608     def test_keyword_arguments(self):
   3609         # Testing keyword arguments to __init__, __call__...
   3610         def f(a): return a
   3611         self.assertEqual(f.__call__(a=42), 42)
   3612         a = []
   3613         list.__init__(a, sequence=[0, 1, 2])
   3614         self.assertEqual(a, [0, 1, 2])
   3615 
   3616     def test_recursive_call(self):
   3617         # Testing recursive __call__() by setting to instance of class...
   3618         class A(object):
   3619             pass
   3620 
   3621         A.__call__ = A()
   3622         try:
   3623             A()()
   3624         except RuntimeError:
   3625             pass
   3626         else:
   3627             self.fail("Recursion limit should have been reached for __call__()")
   3628 
   3629     def test_delete_hook(self):
   3630         # Testing __del__ hook...
   3631         log = []
   3632         class C(object):
   3633             def __del__(self):
   3634                 log.append(1)
   3635         c = C()
   3636         self.assertEqual(log, [])
   3637         del c
   3638         test_support.gc_collect()
   3639         self.assertEqual(log, [1])
   3640 
   3641         class D(object): pass
   3642         d = D()
   3643         try: del d[0]
   3644         except TypeError: pass
   3645         else: self.fail("invalid del() didn't raise TypeError")
   3646 
   3647     def test_hash_inheritance(self):
   3648         # Testing hash of mutable subclasses...
   3649 
   3650         class mydict(dict):
   3651             pass
   3652         d = mydict()
   3653         try:
   3654             hash(d)
   3655         except TypeError:
   3656             pass
   3657         else:
   3658             self.fail("hash() of dict subclass should fail")
   3659 
   3660         class mylist(list):
   3661             pass
   3662         d = mylist()
   3663         try:
   3664             hash(d)
   3665         except TypeError:
   3666             pass
   3667         else:
   3668             self.fail("hash() of list subclass should fail")
   3669 
   3670     def test_str_operations(self):
   3671         try: 'a' + 5
   3672         except TypeError: pass
   3673         else: self.fail("'' + 5 doesn't raise TypeError")
   3674 
   3675         try: ''.split('')
   3676         except ValueError: pass
   3677         else: self.fail("''.split('') doesn't raise ValueError")
   3678 
   3679         try: ''.join([0])
   3680         except TypeError: pass
   3681         else: self.fail("''.join([0]) doesn't raise TypeError")
   3682 
   3683         try: ''.rindex('5')
   3684         except ValueError: pass
   3685         else: self.fail("''.rindex('5') doesn't raise ValueError")
   3686 
   3687         try: '%(n)s' % None
   3688         except TypeError: pass
   3689         else: self.fail("'%(n)s' % None doesn't raise TypeError")
   3690 
   3691         try: '%(n' % {}
   3692         except ValueError: pass
   3693         else: self.fail("'%(n' % {} '' doesn't raise ValueError")
   3694 
   3695         try: '%*s' % ('abc')
   3696         except TypeError: pass
   3697         else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
   3698 
   3699         try: '%*.*s' % ('abc', 5)
   3700         except TypeError: pass
   3701         else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
   3702 
   3703         try: '%s' % (1, 2)
   3704         except TypeError: pass
   3705         else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
   3706 
   3707         try: '%' % None
   3708         except ValueError: pass
   3709         else: self.fail("'%' % None doesn't raise ValueError")
   3710 
   3711         self.assertEqual('534253'.isdigit(), 1)
   3712         self.assertEqual('534253x'.isdigit(), 0)
   3713         self.assertEqual('%c' % 5, '\x05')
   3714         self.assertEqual('%c' % '5', '5')
   3715 
   3716     def test_deepcopy_recursive(self):
   3717         # Testing deepcopy of recursive objects...
   3718         class Node:
   3719             pass
   3720         a = Node()
   3721         b = Node()
   3722         a.b = b
   3723         b.a = a
   3724         z = deepcopy(a) # This blew up before
   3725 
   3726     def test_uninitialized_modules(self):
   3727         # Testing uninitialized module objects...
   3728         from types import ModuleType as M
   3729         m = M.__new__(M)
   3730         str(m)
   3731         self.assertNotHasAttr(m, "__name__")
   3732         self.assertNotHasAttr(m, "__file__")
   3733         self.assertNotHasAttr(m, "foo")
   3734         self.assertFalse(m.__dict__)   # None or {} are both reasonable answers
   3735         m.foo = 1
   3736         self.assertEqual(m.__dict__, {"foo": 1})
   3737 
   3738     def test_funny_new(self):
   3739         # Testing __new__ returning something unexpected...
   3740         class C(object):
   3741             def __new__(cls, arg):
   3742                 if isinstance(arg, str): return [1, 2, 3]
   3743                 elif isinstance(arg, int): return object.__new__(D)
   3744                 else: return object.__new__(cls)
   3745         class D(C):
   3746             def __init__(self, arg):
   3747                 self.foo = arg
   3748         self.assertEqual(C("1"), [1, 2, 3])
   3749         self.assertEqual(D("1"), [1, 2, 3])
   3750         d = D(None)
   3751         self.assertEqual(d.foo, None)
   3752         d = C(1)
   3753         self.assertEqual(isinstance(d, D), True)
   3754         self.assertEqual(d.foo, 1)
   3755         d = D(1)
   3756         self.assertEqual(isinstance(d, D), True)
   3757         self.assertEqual(d.foo, 1)
   3758 
   3759     def test_imul_bug(self):
   3760         # Testing for __imul__ problems...
   3761         # SF bug 544647
   3762         class C(object):
   3763             def __imul__(self, other):
   3764                 return (self, other)
   3765         x = C()
   3766         y = x
   3767         y *= 1.0
   3768         self.assertEqual(y, (x, 1.0))
   3769         y = x
   3770         y *= 2
   3771         self.assertEqual(y, (x, 2))
   3772         y = x
   3773         y *= 3L
   3774         self.assertEqual(y, (x, 3L))
   3775         y = x
   3776         y *= 1L<<100
   3777         self.assertEqual(y, (x, 1L<<100))
   3778         y = x
   3779         y *= None
   3780         self.assertEqual(y, (x, None))
   3781         y = x
   3782         y *= "foo"
   3783         self.assertEqual(y, (x, "foo"))
   3784 
   3785     def test_copy_setstate(self):
   3786         # Testing that copy.*copy() correctly uses __setstate__...
   3787         import copy
   3788         class C(object):
   3789             def __init__(self, foo=None):
   3790                 self.foo = foo
   3791                 self.__foo = foo
   3792             def setfoo(self, foo=None):
   3793                 self.foo = foo
   3794             def getfoo(self):
   3795                 return self.__foo
   3796             def __getstate__(self):
   3797                 return [self.foo]
   3798             def __setstate__(self_, lst):
   3799                 self.assertEqual(len(lst), 1)
   3800                 self_.__foo = self_.foo = lst[0]
   3801         a = C(42)
   3802         a.setfoo(24)
   3803         self.assertEqual(a.foo, 24)
   3804         self.assertEqual(a.getfoo(), 42)
   3805         b = copy.copy(a)
   3806         self.assertEqual(b.foo, 24)
   3807         self.assertEqual(b.getfoo(), 24)
   3808         b = copy.deepcopy(a)
   3809         self.assertEqual(b.foo, 24)
   3810         self.assertEqual(b.getfoo(), 24)
   3811 
   3812     def test_slices(self):
   3813         # Testing cases with slices and overridden __getitem__ ...
   3814 
   3815         # Strings
   3816         self.assertEqual("hello"[:4], "hell")
   3817         self.assertEqual("hello"[slice(4)], "hell")
   3818         self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
   3819         class S(str):
   3820             def __getitem__(self, x):
   3821                 return str.__getitem__(self, x)
   3822         self.assertEqual(S("hello")[:4], "hell")
   3823         self.assertEqual(S("hello")[slice(4)], "hell")
   3824         self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
   3825         # Tuples
   3826         self.assertEqual((1,2,3)[:2], (1,2))
   3827         self.assertEqual((1,2,3)[slice(2)], (1,2))
   3828         self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
   3829         class T(tuple):
   3830             def __getitem__(self, x):
   3831                 return tuple.__getitem__(self, x)
   3832         self.assertEqual(T((1,2,3))[:2], (1,2))
   3833         self.assertEqual(T((1,2,3))[slice(2)], (1,2))
   3834         self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
   3835         # Lists
   3836         self.assertEqual([1,2,3][:2], [1,2])
   3837         self.assertEqual([1,2,3][slice(2)], [1,2])
   3838         self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
   3839         class L(list):
   3840             def __getitem__(self, x):
   3841                 return list.__getitem__(self, x)
   3842         self.assertEqual(L([1,2,3])[:2], [1,2])
   3843         self.assertEqual(L([1,2,3])[slice(2)], [1,2])
   3844         self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
   3845         # Now do lists and __setitem__
   3846         a = L([1,2,3])
   3847         a[slice(1, 3)] = [3,2]
   3848         self.assertEqual(a, [1,3,2])
   3849         a[slice(0, 2, 1)] = [3,1]
   3850         self.assertEqual(a, [3,1,2])
   3851         a.__setitem__(slice(1, 3), [2,1])
   3852         self.assertEqual(a, [3,2,1])
   3853         a.__setitem__(slice(0, 2, 1), [2,3])
   3854         self.assertEqual(a, [2,3,1])
   3855 
   3856     def test_subtype_resurrection(self):
   3857         # Testing resurrection of new-style instance...
   3858 
   3859         class C(object):
   3860             container = []
   3861 
   3862             def __del__(self):
   3863                 # resurrect the instance
   3864                 C.container.append(self)
   3865 
   3866         c = C()
   3867         c.attr = 42
   3868 
   3869         # The most interesting thing here is whether this blows up, due to
   3870         # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
   3871         # bug).
   3872         del c
   3873 
   3874         # If that didn't blow up, it's also interesting to see whether clearing
   3875         # the last container slot works: that will attempt to delete c again,
   3876         # which will cause c to get appended back to the container again
   3877         # "during" the del.  (On non-CPython implementations, however, __del__
   3878         # is typically not called again.)
   3879         test_support.gc_collect()
   3880         self.assertEqual(len(C.container), 1)
   3881         del C.container[-1]
   3882         if test_support.check_impl_detail():
   3883             test_support.gc_collect()
   3884             self.assertEqual(len(C.container), 1)
   3885             self.assertEqual(C.container[-1].attr, 42)
   3886 
   3887         # Make c mortal again, so that the test framework with -l doesn't report
   3888         # it as a leak.
   3889         del C.__del__
   3890 
   3891     def test_slots_trash(self):
   3892         # Testing slot trash...
   3893         # Deallocating deeply nested slotted trash caused stack overflows
   3894         class trash(object):
   3895             __slots__ = ['x']
   3896             def __init__(self, x):
   3897                 self.x = x
   3898         o = None
   3899         for i in xrange(50000):
   3900             o = trash(o)
   3901         del o
   3902 
   3903     def test_slots_multiple_inheritance(self):
   3904         # SF bug 575229, multiple inheritance w/ slots dumps core
   3905         class A(object):
   3906             __slots__=()
   3907         class B(object):
   3908             pass
   3909         class C(A,B) :
   3910             __slots__=()
   3911         if test_support.check_impl_detail():
   3912             self.assertEqual(C.__basicsize__, B.__basicsize__)
   3913         self.assertHasAttr(C, '__dict__')
   3914         self.assertHasAttr(C, '__weakref__')
   3915         C().x = 2
   3916 
   3917     def test_rmul(self):
   3918         # Testing correct invocation of __rmul__...
   3919         # SF patch 592646
   3920         class C(object):
   3921             def __mul__(self, other):
   3922                 return "mul"
   3923             def __rmul__(self, other):
   3924                 return "rmul"
   3925         a = C()
   3926         self.assertEqual(a*2, "mul")
   3927         self.assertEqual(a*2.2, "mul")
   3928         self.assertEqual(2*a, "rmul")
   3929         self.assertEqual(2.2*a, "rmul")
   3930 
   3931     def test_ipow(self):
   3932         # Testing correct invocation of __ipow__...
   3933         # [SF bug 620179]
   3934         class C(object):
   3935             def __ipow__(self, other):
   3936                 pass
   3937         a = C()
   3938         a **= 2
   3939 
   3940     def test_mutable_bases(self):
   3941         # Testing mutable bases...
   3942 
   3943         # stuff that should work:
   3944         class C(object):
   3945             pass
   3946         class C2(object):
   3947             def __getattribute__(self, attr):
   3948                 if attr == 'a':
   3949                     return 2
   3950                 else:
   3951                     return super(C2, self).__getattribute__(attr)
   3952             def meth(self):
   3953                 return 1
   3954         class D(C):
   3955             pass
   3956         class E(D):
   3957             pass
   3958         d = D()
   3959         e = E()
   3960         D.__bases__ = (C,)
   3961         D.__bases__ = (C2,)
   3962         self.assertEqual(d.meth(), 1)
   3963         self.assertEqual(e.meth(), 1)
   3964         self.assertEqual(d.a, 2)
   3965         self.assertEqual(e.a, 2)
   3966         self.assertEqual(C2.__subclasses__(), [D])
   3967 
   3968         try:
   3969             del D.__bases__
   3970         except (TypeError, AttributeError):
   3971             pass
   3972         else:
   3973             self.fail("shouldn't be able to delete .__bases__")
   3974 
   3975         try:
   3976             D.__bases__ = ()
   3977         except TypeError, msg:
   3978             if str(msg) == "a new-style class can't have only classic bases":
   3979                 self.fail("wrong error message for .__bases__ = ()")
   3980         else:
   3981             self.fail("shouldn't be able to set .__bases__ to ()")
   3982 
   3983         try:
   3984             D.__bases__ = (D,)
   3985         except TypeError:
   3986             pass
   3987         else:
   3988             # actually, we'll have crashed by here...
   3989             self.fail("shouldn't be able to create inheritance cycles")
   3990 
   3991         try:
   3992             D.__bases__ = (C, C)
   3993         except TypeError:
   3994             pass
   3995         else:
   3996             self.fail("didn't detect repeated base classes")
   3997 
   3998         try:
   3999             D.__bases__ = (E,)
   4000         except TypeError:
   4001             pass
   4002         else:
   4003             self.fail("shouldn't be able to create inheritance cycles")
   4004 
   4005         # let's throw a classic class into the mix:
   4006         class Classic:
   4007             def meth2(self):
   4008                 return 3
   4009 
   4010         D.__bases__ = (C, Classic)
   4011 
   4012         self.assertEqual(d.meth2(), 3)
   4013         self.assertEqual(e.meth2(), 3)
   4014         try:
   4015             d.a
   4016         except AttributeError:
   4017             pass
   4018         else:
   4019             self.fail("attribute should have vanished")
   4020 
   4021         try:
   4022             D.__bases__ = (Classic,)
   4023         except TypeError:
   4024             pass
   4025         else:
   4026             self.fail("new-style class must have a new-style base")
   4027 
   4028     def test_builtin_bases(self):
   4029         # Make sure all the builtin types can have their base queried without
   4030         # segfaulting. See issue #5787.
   4031         builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
   4032                          if isinstance(tp, type)]
   4033         for tp in builtin_types:
   4034             object.__getattribute__(tp, "__bases__")
   4035             if tp is not object:
   4036                 self.assertEqual(len(tp.__bases__), 1, tp)
   4037 
   4038         class L(list):
   4039             pass
   4040 
   4041         class C(object):
   4042             pass
   4043 
   4044         class D(C):
   4045             pass
   4046 
   4047         try:
   4048             L.__bases__ = (dict,)
   4049         except TypeError:
   4050             pass
   4051         else:
   4052             self.fail("shouldn't turn list subclass into dict subclass")
   4053 
   4054         try:
   4055             list.__bases__ = (dict,)
   4056         except TypeError:
   4057             pass
   4058         else:
   4059             self.fail("shouldn't be able to assign to list.__bases__")
   4060 
   4061         try:
   4062             D.__bases__ = (C, list)
   4063         except TypeError:
   4064             pass
   4065         else:
   4066             assert 0, "best_base calculation found wanting"
   4067 
   4068     def test_unsubclassable_types(self):
   4069         with self.assertRaises(TypeError):
   4070             class X(types.NoneType):
   4071                 pass
   4072         with self.assertRaises(TypeError):
   4073             class X(object, types.NoneType):
   4074                 pass
   4075         with self.assertRaises(TypeError):
   4076             class X(types.NoneType, object):
   4077                 pass
   4078         class O(object):
   4079             pass
   4080         with self.assertRaises(TypeError):
   4081             class X(O, types.NoneType):
   4082                 pass
   4083         with self.assertRaises(TypeError):
   4084             class X(types.NoneType, O):
   4085                 pass
   4086 
   4087         class X(object):
   4088             pass
   4089         with self.assertRaises(TypeError):
   4090             X.__bases__ = types.NoneType,
   4091         with self.assertRaises(TypeError):
   4092             X.__bases__ = object, types.NoneType
   4093         with self.assertRaises(TypeError):
   4094             X.__bases__ = types.NoneType, object
   4095         with self.assertRaises(TypeError):
   4096             X.__bases__ = O, types.NoneType
   4097         with self.assertRaises(TypeError):
   4098             X.__bases__ = types.NoneType, O
   4099 
   4100     def test_mutable_bases_with_failing_mro(self):
   4101         # Testing mutable bases with failing mro...
   4102         class WorkOnce(type):
   4103             def __new__(self, name, bases, ns):
   4104                 self.flag = 0
   4105                 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
   4106             def mro(self):
   4107                 if self.flag > 0:
   4108                     raise RuntimeError, "bozo"
   4109                 else:
   4110                     self.flag += 1
   4111                     return type.mro(self)
   4112 
   4113         class WorkAlways(type):
   4114             def mro(self):
   4115                 # this is here to make sure that .mro()s aren't called
   4116                 # with an exception set (which was possible at one point).
   4117                 # An error message will be printed in a debug build.
   4118                 # What's a good way to test for this?
   4119                 return type.mro(self)
   4120 
   4121         class C(object):
   4122             pass
   4123 
   4124         class C2(object):
   4125             pass
   4126 
   4127         class D(C):
   4128             pass
   4129 
   4130         class E(D):
   4131             pass
   4132 
   4133         class F(D):
   4134             __metaclass__ = WorkOnce
   4135 
   4136         class G(D):
   4137             __metaclass__ = WorkAlways
   4138 
   4139         # Immediate subclasses have their mro's adjusted in alphabetical
   4140         # order, so E's will get adjusted before adjusting F's fails.  We
   4141         # check here that E's gets restored.
   4142 
   4143         E_mro_before = E.__mro__
   4144         D_mro_before = D.__mro__
   4145 
   4146         try:
   4147             D.__bases__ = (C2,)
   4148         except RuntimeError:
   4149             self.assertEqual(E.__mro__, E_mro_before)
   4150             self.assertEqual(D.__mro__, D_mro_before)
   4151         else:
   4152             self.fail("exception not propagated")
   4153 
   4154     def test_mutable_bases_catch_mro_conflict(self):
   4155         # Testing mutable bases catch mro conflict...
   4156         class A(object):
   4157             pass
   4158 
   4159         class B(object):
   4160             pass
   4161 
   4162         class C(A, B):
   4163             pass
   4164 
   4165         class D(A, B):
   4166             pass
   4167 
   4168         class E(C, D):
   4169             pass
   4170 
   4171         try:
   4172             C.__bases__ = (B, A)
   4173         except TypeError:
   4174             pass
   4175         else:
   4176             self.fail("didn't catch MRO conflict")
   4177 
   4178     def test_mutable_names(self):
   4179         # Testing mutable names...
   4180         class C(object):
   4181             pass
   4182 
   4183         # C.__module__ could be 'test_descr' or '__main__'
   4184         mod = C.__module__
   4185 
   4186         C.__name__ = 'D'
   4187         self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
   4188 
   4189         C.__name__ = 'D.E'
   4190         self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
   4191 
   4192     def test_evil_type_name(self):
   4193         # A badly placed Py_DECREF in type_set_name led to arbitrary code
   4194         # execution while the type structure was not in a sane state, and a
   4195         # possible segmentation fault as a result.  See bug #16447.
   4196         class Nasty(str):
   4197             def __del__(self):
   4198                 C.__name__ = "other"
   4199 
   4200         class C(object):
   4201             pass
   4202 
   4203         C.__name__ = Nasty("abc")
   4204         C.__name__ = "normal"
   4205 
   4206     def test_subclass_right_op(self):
   4207         # Testing correct dispatch of subclass overloading __r<op>__...
   4208 
   4209         # This code tests various cases where right-dispatch of a subclass
   4210         # should be preferred over left-dispatch of a base class.
   4211 
   4212         # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
   4213 
   4214         class B(int):
   4215             def __floordiv__(self, other):
   4216                 return "B.__floordiv__"
   4217             def __rfloordiv__(self, other):
   4218                 return "B.__rfloordiv__"
   4219 
   4220         self.assertEqual(B(1) // 1, "B.__floordiv__")
   4221         self.assertEqual(1 // B(1), "B.__rfloordiv__")
   4222 
   4223         # Case 2: subclass of object; this is just the baseline for case 3
   4224 
   4225         class C(object):
   4226             def __floordiv__(self, other):
   4227                 return "C.__floordiv__"
   4228             def __rfloordiv__(self, other):
   4229                 return "C.__rfloordiv__"
   4230 
   4231         self.assertEqual(C() // 1, "C.__floordiv__")
   4232         self.assertEqual(1 // C(), "C.__rfloordiv__")
   4233 
   4234         # Case 3: subclass of new-style class; here it gets interesting
   4235 
   4236         class D(C):
   4237             def __floordiv__(self, other):
   4238                 return "D.__floordiv__"
   4239             def __rfloordiv__(self, other):
   4240                 return "D.__rfloordiv__"
   4241 
   4242         self.assertEqual(D() // C(), "D.__floordiv__")
   4243         self.assertEqual(C() // D(), "D.__rfloordiv__")
   4244 
   4245         # Case 4: this didn't work right in 2.2.2 and 2.3a1
   4246 
   4247         class E(C):
   4248             pass
   4249 
   4250         self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
   4251 
   4252         self.assertEqual(E() // 1, "C.__floordiv__")
   4253         self.assertEqual(1 // E(), "C.__rfloordiv__")
   4254         self.assertEqual(E() // C(), "C.__floordiv__")
   4255         self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
   4256 
   4257     @test_support.impl_detail("testing an internal kind of method object")
   4258     def test_meth_class_get(self):
   4259         # Testing __get__ method of METH_CLASS C methods...
   4260         # Full coverage of descrobject.c::classmethod_get()
   4261 
   4262         # Baseline
   4263         arg = [1, 2, 3]
   4264         res = {1: None, 2: None, 3: None}
   4265         self.assertEqual(dict.fromkeys(arg), res)
   4266         self.assertEqual({}.fromkeys(arg), res)
   4267 
   4268         # Now get the descriptor
   4269         descr = dict.__dict__["fromkeys"]
   4270 
   4271         # More baseline using the descriptor directly
   4272         self.assertEqual(descr.__get__(None, dict)(arg), res)
   4273         self.assertEqual(descr.__get__({})(arg), res)
   4274 
   4275         # Now check various error cases
   4276         try:
   4277             descr.__get__(None, None)
   4278         except TypeError:
   4279             pass
   4280         else:
   4281             self.fail("shouldn't have allowed descr.__get__(None, None)")
   4282         try:
   4283             descr.__get__(42)
   4284         except TypeError:
   4285             pass
   4286         else:
   4287             self.fail("shouldn't have allowed descr.__get__(42)")
   4288         try:
   4289             descr.__get__(None, 42)
   4290         except TypeError:
   4291             pass
   4292         else:
   4293             self.fail("shouldn't have allowed descr.__get__(None, 42)")
   4294         try:
   4295             descr.__get__(None, int)
   4296         except TypeError:
   4297             pass
   4298         else:
   4299             self.fail("shouldn't have allowed descr.__get__(None, int)")
   4300 
   4301     def test_isinst_isclass(self):
   4302         # Testing proxy isinstance() and isclass()...
   4303         class Proxy(object):
   4304             def __init__(self, obj):
   4305                 self.__obj = obj
   4306             def __getattribute__(self, name):
   4307                 if name.startswith("_Proxy__"):
   4308                     return object.__getattribute__(self, name)
   4309                 else:
   4310                     return getattr(self.__obj, name)
   4311         # Test with a classic class
   4312         class C:
   4313             pass
   4314         a = C()
   4315         pa = Proxy(a)
   4316         self.assertIsInstance(a, C)  # Baseline
   4317         self.assertIsInstance(pa, C) # Test
   4318         # Test with a classic subclass
   4319         class D(C):
   4320             pass
   4321         a = D()
   4322         pa = Proxy(a)
   4323         self.assertIsInstance(a, C)  # Baseline
   4324         self.assertIsInstance(pa, C) # Test
   4325         # Test with a new-style class
   4326         class C(object):
   4327             pass
   4328         a = C()
   4329         pa = Proxy(a)
   4330         self.assertIsInstance(a, C)  # Baseline
   4331         self.assertIsInstance(pa, C) # Test
   4332         # Test with a new-style subclass
   4333         class D(C):
   4334             pass
   4335         a = D()
   4336         pa = Proxy(a)
   4337         self.assertIsInstance(a, C)  # Baseline
   4338         self.assertIsInstance(pa, C) # Test
   4339 
   4340     def test_proxy_super(self):
   4341         # Testing super() for a proxy object...
   4342         class Proxy(object):
   4343             def __init__(self, obj):
   4344                 self.__obj = obj
   4345             def __getattribute__(self, name):
   4346                 if name.startswith("_Proxy__"):
   4347                     return object.__getattribute__(self, name)
   4348                 else:
   4349                     return getattr(self.__obj, name)
   4350 
   4351         class B(object):
   4352             def f(self):
   4353                 return "B.f"
   4354 
   4355         class C(B):
   4356             def f(self):
   4357                 return super(C, self).f() + "->C.f"
   4358 
   4359         obj = C()
   4360         p = Proxy(obj)
   4361         self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
   4362 
   4363     def test_carloverre(self):
   4364         # Testing prohibition of Carlo Verre's hack...
   4365         try:
   4366             object.__setattr__(str, "foo", 42)
   4367         except TypeError:
   4368             pass
   4369         else:
   4370             self.fail("Carlo Verre __setattr__ succeeded!")
   4371         try:
   4372             object.__delattr__(str, "lower")
   4373         except TypeError:
   4374             pass
   4375         else:
   4376             self.fail("Carlo Verre __delattr__ succeeded!")
   4377 
   4378     def test_weakref_segfault(self):
   4379         # Testing weakref segfault...
   4380         # SF 742911
   4381         import weakref
   4382 
   4383         class Provoker:
   4384             def __init__(self, referrent):
   4385                 self.ref = weakref.ref(referrent)
   4386 
   4387             def __del__(self):
   4388                 x = self.ref()
   4389 
   4390         class Oops(object):
   4391             pass
   4392 
   4393         o = Oops()
   4394         o.whatever = Provoker(o)
   4395         del o
   4396 
   4397     def test_wrapper_segfault(self):
   4398         # SF 927248: deeply nested wrappers could cause stack overflow
   4399         f = lambda:None
   4400         for i in xrange(1000000):
   4401             f = f.__call__
   4402         f = None
   4403 
   4404     def test_file_fault(self):
   4405         # Testing sys.stdout is changed in getattr...
   4406         test_stdout = sys.stdout
   4407         class StdoutGuard:
   4408             def __getattr__(self, attr):
   4409                 sys.stdout = sys.__stdout__
   4410                 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
   4411         sys.stdout = StdoutGuard()
   4412         try:
   4413             print "Oops!"
   4414         except RuntimeError:
   4415             pass
   4416         finally:
   4417             sys.stdout = test_stdout
   4418 
   4419     def test_vicious_descriptor_nonsense(self):
   4420         # Testing vicious_descriptor_nonsense...
   4421 
   4422         # A potential segfault spotted by Thomas Wouters in mail to
   4423         # python-dev 2003-04-17, turned into an example & fixed by Michael
   4424         # Hudson just less than four months later...
   4425 
   4426         class Evil(object):
   4427             def __hash__(self):
   4428                 return hash('attr')
   4429             def __eq__(self, other):
   4430                 del C.attr
   4431                 return 0
   4432 
   4433         class Descr(object):
   4434             def __get__(self, ob, type=None):
   4435                 return 1
   4436 
   4437         class C(object):
   4438             attr = Descr()
   4439 
   4440         c = C()
   4441         c.__dict__[Evil()] = 0
   4442 
   4443         self.assertEqual(c.attr, 1)
   4444         # this makes a crash more likely:
   4445         test_support.gc_collect()
   4446         self.assertNotHasAttr(c, 'attr')
   4447 
   4448     def test_init(self):
   4449         # SF 1155938
   4450         class Foo(object):
   4451             def __init__(self):
   4452                 return 10
   4453         try:
   4454             Foo()
   4455         except TypeError:
   4456             pass
   4457         else:
   4458             self.fail("did not test __init__() for None return")
   4459 
   4460     def test_method_wrapper(self):
   4461         # Testing method-wrapper objects...
   4462         # <type 'method-wrapper'> did not support any reflection before 2.5
   4463 
   4464         l = []
   4465         self.assertEqual(l.__add__, l.__add__)
   4466         self.assertEqual(l.__add__, [].__add__)
   4467         self.assertNotEqual(l.__add__, [5].__add__)
   4468         self.assertNotEqual(l.__add__, l.__mul__)
   4469         self.assertEqual(l.__add__.__name__, '__add__')
   4470         if hasattr(l.__add__, '__self__'):
   4471             # CPython
   4472             self.assertIs(l.__add__.__self__, l)
   4473             self.assertIs(l.__add__.__objclass__, list)
   4474         else:
   4475             # Python implementations where [].__add__ is a normal bound method
   4476             self.assertIs(l.__add__.im_self, l)
   4477             self.assertIs(l.__add__.im_class, list)
   4478         self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
   4479         try:
   4480             hash(l.__add__)
   4481         except TypeError:
   4482             pass
   4483         else:
   4484             self.fail("no TypeError from hash([].__add__)")
   4485 
   4486         t = ()
   4487         t += (7,)
   4488         self.assertEqual(t.__add__, (7,).__add__)
   4489         self.assertEqual(hash(t.__add__), hash((7,).__add__))
   4490 
   4491     def test_not_implemented(self):
   4492         # Testing NotImplemented...
   4493         # all binary methods should be able to return a NotImplemented
   4494         import operator
   4495 
   4496         def specialmethod(self, other):
   4497             return NotImplemented
   4498 
   4499         def check(expr, x, y):
   4500             try:
   4501                 exec expr in {'x': x, 'y': y, 'operator': operator}
   4502             except TypeError:
   4503                 pass
   4504             else:
   4505                 self.fail("no TypeError from %r" % (expr,))
   4506 
   4507         N1 = sys.maxint + 1L    # might trigger OverflowErrors instead of
   4508                                 # TypeErrors
   4509         N2 = sys.maxint         # if sizeof(int) < sizeof(long), might trigger
   4510                                 #   ValueErrors instead of TypeErrors
   4511         for metaclass in [type, types.ClassType]:
   4512             for name, expr, iexpr in [
   4513                     ('__add__',      'x + y',                   'x += y'),
   4514                     ('__sub__',      'x - y',                   'x -= y'),
   4515                     ('__mul__',      'x * y',                   'x *= y'),
   4516                     ('__truediv__',  'operator.truediv(x, y)',  None),
   4517                     ('__floordiv__', 'operator.floordiv(x, y)', None),
   4518                     ('__div__',      'x / y',                   'x /= y'),
   4519                     ('__mod__',      'x % y',                   'x %= y'),
   4520                     ('__divmod__',   'divmod(x, y)',            None),
   4521                     ('__pow__',      'x ** y',                  'x **= y'),
   4522                     ('__lshift__',   'x << y',                  'x <<= y'),
   4523                     ('__rshift__',   'x >> y',                  'x >>= y'),
   4524                     ('__and__',      'x & y',                   'x &= y'),
   4525                     ('__or__',       'x | y',                   'x |= y'),
   4526                     ('__xor__',      'x ^ y',                   'x ^= y'),
   4527                     ('__coerce__',   'coerce(x, y)',            None)]:
   4528                 if name == '__coerce__':
   4529                     rname = name
   4530                 else:
   4531                     rname = '__r' + name[2:]
   4532                 A = metaclass('A', (), {name: specialmethod})
   4533                 B = metaclass('B', (), {rname: specialmethod})
   4534                 a = A()
   4535                 b = B()
   4536                 check(expr, a, a)
   4537                 check(expr, a, b)
   4538                 check(expr, b, a)
   4539                 check(expr, b, b)
   4540                 check(expr, a, N1)
   4541                 check(expr, a, N2)
   4542                 check(expr, N1, b)
   4543                 check(expr, N2, b)
   4544                 if iexpr:
   4545                     check(iexpr, a, a)
   4546                     check(iexpr, a, b)
   4547                     check(iexpr, b, a)
   4548                     check(iexpr, b, b)
   4549                     check(iexpr, a, N1)
   4550                     check(iexpr, a, N2)
   4551                     iname = '__i' + name[2:]
   4552                     C = metaclass('C', (), {iname: specialmethod})
   4553                     c = C()
   4554                     check(iexpr, c, a)
   4555                     check(iexpr, c, b)
   4556                     check(iexpr, c, N1)
   4557                     check(iexpr, c, N2)
   4558 
   4559     def test_assign_slice(self):
   4560         # ceval.c's assign_slice used to check for
   4561         # tp->tp_as_sequence->sq_slice instead of
   4562         # tp->tp_as_sequence->sq_ass_slice
   4563 
   4564         class C(object):
   4565             def __setslice__(self, start, stop, value):
   4566                 self.value = value
   4567 
   4568         c = C()
   4569         c[1:2] = 3
   4570         self.assertEqual(c.value, 3)
   4571 
   4572     def test_set_and_no_get(self):
   4573         # See
   4574         # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
   4575         class Descr(object):
   4576 
   4577             def __init__(self, name):
   4578                 self.name = name
   4579 
   4580             def __set__(self, obj, value):
   4581                 obj.__dict__[self.name] = value
   4582         descr = Descr("a")
   4583 
   4584         class X(object):
   4585             a = descr
   4586 
   4587         x = X()
   4588         self.assertIs(x.a, descr)
   4589         x.a = 42
   4590         self.assertEqual(x.a, 42)
   4591 
   4592         # Also check type_getattro for correctness.
   4593         class Meta(type):
   4594             pass
   4595         class X(object):
   4596             __metaclass__ = Meta
   4597         X.a = 42
   4598         Meta.a = Descr("a")
   4599         self.assertEqual(X.a, 42)
   4600 
   4601     def test_getattr_hooks(self):
   4602         # issue 4230
   4603 
   4604         class Descriptor(object):
   4605             counter = 0
   4606             def __get__(self, obj, objtype=None):
   4607                 def getter(name):
   4608                     self.counter += 1
   4609                     raise AttributeError(name)
   4610                 return getter
   4611 
   4612         descr = Descriptor()
   4613         class A(object):
   4614             __getattribute__ = descr
   4615         class B(object):
   4616             __getattr__ = descr
   4617         class C(object):
   4618             __getattribute__ = descr
   4619             __getattr__ = descr
   4620 
   4621         self.assertRaises(AttributeError, getattr, A(), "attr")
   4622         self.assertEqual(descr.counter, 1)
   4623         self.assertRaises(AttributeError, getattr, B(), "attr")
   4624         self.assertEqual(descr.counter, 2)
   4625         self.assertRaises(AttributeError, getattr, C(), "attr")
   4626         self.assertEqual(descr.counter, 4)
   4627 
   4628         class EvilGetattribute(object):
   4629             # This used to segfault
   4630             def __getattr__(self, name):
   4631                 raise AttributeError(name)
   4632             def __getattribute__(self, name):
   4633                 del EvilGetattribute.__getattr__
   4634                 for i in range(5):
   4635                     gc.collect()
   4636                 raise AttributeError(name)
   4637 
   4638         self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
   4639 
   4640     def test_type___getattribute__(self):
   4641         self.assertRaises(TypeError, type.__getattribute__, list, type)
   4642 
   4643     def test_abstractmethods(self):
   4644         # type pretends not to have __abstractmethods__.
   4645         self.assertRaises(AttributeError, getattr, type, "__abstractmethods__")
   4646         class meta(type):
   4647             pass
   4648         self.assertRaises(AttributeError, getattr, meta, "__abstractmethods__")
   4649         class X(object):
   4650             pass
   4651         with self.assertRaises(AttributeError):
   4652             del X.__abstractmethods__
   4653 
   4654     def test_proxy_call(self):
   4655         class FakeStr(object):
   4656             __class__ = str
   4657 
   4658         fake_str = FakeStr()
   4659         # isinstance() reads __class__ on new style classes
   4660         self.assertIsInstance(fake_str, str)
   4661 
   4662         # call a method descriptor
   4663         with self.assertRaises(TypeError):
   4664             str.split(fake_str)
   4665 
   4666         # call a slot wrapper descriptor
   4667         with self.assertRaises(TypeError):
   4668             str.__add__(fake_str, "abc")
   4669 
   4670     def test_repr_as_str(self):
   4671         # Issue #11603: crash or infinite loop when rebinding __str__ as
   4672         # __repr__.
   4673         class Foo(object):
   4674             pass
   4675         Foo.__repr__ = Foo.__str__
   4676         foo = Foo()
   4677         self.assertRaises(RuntimeError, str, foo)
   4678         self.assertRaises(RuntimeError, repr, foo)
   4679 
   4680     def test_mixing_slot_wrappers(self):
   4681         class X(dict):
   4682             __setattr__ = dict.__setitem__
   4683         x = X()
   4684         x.y = 42
   4685         self.assertEqual(x["y"], 42)
   4686 
   4687     def test_cycle_through_dict(self):
   4688         # See bug #1469629
   4689         class X(dict):
   4690             def __init__(self):
   4691                 dict.__init__(self)
   4692                 self.__dict__ = self
   4693         x = X()
   4694         x.attr = 42
   4695         wr = weakref.ref(x)
   4696         del x
   4697         test_support.gc_collect()
   4698         self.assertIsNone(wr())
   4699         for o in gc.get_objects():
   4700             self.assertIsNot(type(o), X)
   4701 
   4702 
   4703 class DictProxyTests(unittest.TestCase):
   4704     def setUp(self):
   4705         class C(object):
   4706             def meth(self):
   4707                 pass
   4708         self.C = C
   4709 
   4710     def test_repr(self):
   4711         self.assertIn('dict_proxy({', repr(vars(self.C)))
   4712         self.assertIn("'meth':", repr(vars(self.C)))
   4713 
   4714     def test_iter_keys(self):
   4715         # Testing dict-proxy iterkeys...
   4716         keys = [ key for key in self.C.__dict__.iterkeys() ]
   4717         keys.sort()
   4718         self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
   4719             '__weakref__', 'meth'])
   4720 
   4721     def test_iter_values(self):
   4722         # Testing dict-proxy itervalues...
   4723         values = [ values for values in self.C.__dict__.itervalues() ]
   4724         self.assertEqual(len(values), 5)
   4725 
   4726     def test_iter_items(self):
   4727         # Testing dict-proxy iteritems...
   4728         keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
   4729         keys.sort()
   4730         self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
   4731             '__weakref__', 'meth'])
   4732 
   4733     def test_dict_type_with_metaclass(self):
   4734         # Testing type of __dict__ when __metaclass__ set...
   4735         class B(object):
   4736             pass
   4737         class M(type):
   4738             pass
   4739         class C:
   4740             # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
   4741             __metaclass__ = M
   4742         self.assertEqual(type(C.__dict__), type(B.__dict__))
   4743 
   4744 
   4745 class PTypesLongInitTest(unittest.TestCase):
   4746     # This is in its own TestCase so that it can be run before any other tests.
   4747     def test_pytype_long_ready(self):
   4748         # Testing SF bug 551412 ...
   4749 
   4750         # This dumps core when SF bug 551412 isn't fixed --
   4751         # but only when test_descr.py is run separately.
   4752         # (That can't be helped -- as soon as PyType_Ready()
   4753         # is called for PyLong_Type, the bug is gone.)
   4754         class UserLong(object):
   4755             def __pow__(self, *args):
   4756                 pass
   4757         try:
   4758             pow(0L, UserLong(), 0L)
   4759         except:
   4760             pass
   4761 
   4762         # Another segfault only when run early
   4763         # (before PyType_Ready(tuple) is called)
   4764         type.mro(tuple)
   4765 
   4766 
   4767 class PicklingTests(unittest.TestCase):
   4768 
   4769     def test_issue24097(self):
   4770         # Slot name is freed inside __getattr__ and is later used.
   4771         class S(str):  # Not interned
   4772             pass
   4773         class A(object):
   4774             __slotnames__ = [S('spam')]
   4775             def __getattr__(self, attr):
   4776                 if attr == 'spam':
   4777                     A.__slotnames__[:] = [S('spam')]
   4778                     return 42
   4779                 else:
   4780                     raise AttributeError
   4781 
   4782         import copy_reg
   4783         expected = (copy_reg.__newobj__, (A,), ({}, {'spam': 42}), None, None)
   4784         self.assertEqual(A().__reduce__(2), expected)
   4785 
   4786 
   4787 def test_main():
   4788     deprecations = [(r'complex divmod\(\), // and % are deprecated$',
   4789                      DeprecationWarning)]
   4790     if sys.py3kwarning:
   4791         deprecations += [
   4792             ("classic (int|long) division", DeprecationWarning),
   4793             ("coerce.. not supported", DeprecationWarning),
   4794             (".+__(get|set|del)slice__ has been removed", DeprecationWarning)]
   4795     with test_support.check_warnings(*deprecations):
   4796         # Run all local test cases, with PTypesLongInitTest first.
   4797         test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
   4798                                   ClassPropertiesAndMethods, DictProxyTests,
   4799                                   PicklingTests)
   4800 
   4801 if __name__ == "__main__":
   4802     test_main()
   4803